summaryrefslogtreecommitdiff
path: root/test/regex
diff options
context:
space:
mode:
Diffstat (limited to 'test/regex')
-rw-r--r--test/regex/LICENSE72
-rw-r--r--test/regex/Makefile8
-rw-r--r--test/regex/Makefile.in6
-rw-r--r--test/regex/basic.dat216
-rw-r--r--test/regex/categorize.dat62
-rw-r--r--test/regex/forcedassoc.dat30
-rw-r--r--test/regex/interpretation.dat93
-rw-r--r--test/regex/leftassoc.dat16
-rw-r--r--test/regex/nullsubexpr.dat73
-rw-r--r--test/regex/repetition.dat79
-rw-r--r--test/regex/rightassoc.dat16
-rw-r--r--test/regex/testregex.c2145
-rw-r--r--test/regex/tst-regex2.c250
-rw-r--r--test/regex/tst-regex2.dat2176
-rw-r--r--test/regex/tst-regexloc.c53
15 files changed, 5295 insertions, 0 deletions
diff --git a/test/regex/LICENSE b/test/regex/LICENSE
new file mode 100644
index 0000000..2e5acb9
--- /dev/null
+++ b/test/regex/LICENSE
@@ -0,0 +1,72 @@
+From gsf@research.att.com Wed Mar 1 20:30:54 2006
+Return-Path: <gsf@research.att.com>
+X-Original-To: mps@bridge.intra
+Delivered-To: mps@bridge.intra
+Received: from localhost (localhost [127.0.0.1])
+ by localhost (Postfix) with ESMTP id B8C814E4F
+ for <mps@bridge.intra>; Wed, 1 Mar 2006 20:30:53 +0100 (CET)
+Received: from mail.bridge.intra ([127.0.0.1])
+ by localhost (lnx.bridge.intra [127.0.0.1]) (amavisd-new, port 10024)
+ with LMTP id 05987-03 for <mps@bridge.intra>;
+ Wed, 1 Mar 2006 20:30:42 +0100 (CET)
+Received: from pop.gmx.net (localhost [127.0.0.1])
+ by mail.bridge.intra (Postfix) with ESMTP id C8C73794D
+ for <mps@bridge.intra>; Wed, 1 Mar 2006 20:30:38 +0100 (CET)
+X-Flags: 0000
+Delivered-To: GMX delivery to ps.m@gmx.net
+Received: (qmail invoked by alias); 01 Mar 2006 19:23:46 -0000
+Received: from mail-red.research.att.com (EHLO mail-white.research.att.com) [192.20.225.110]
+ by mx0.gmx.net (mx085) with SMTP; 01 Mar 2006 20:23:46 +0100
+Received: from raptor.research.att.com (raptor.research.att.com [135.207.23.32])
+ by mail-blue.research.att.com (Postfix) with ESMTP id B7929147CBB
+ for <ps.m@gmx.net>; Wed, 1 Mar 2006 14:23:45 -0500 (EST)
+Received: (from gsf@localhost)
+ by raptor.research.att.com (SGI-8.9.3p2/8.8.7) id OAA86112
+ for ps.m@gmx.net; Wed, 1 Mar 2006 14:23:45 -0500 (EST)
+Date: Wed, 1 Mar 2006 14:23:45 -0500 (EST)
+From: Glenn Fowler <gsf@research.att.com>
+Message-Id: <200603011923.OAA86112@raptor.research.att.com>
+Organization: AT&T Research
+X-Mailer: mailx (AT&T/BSD) 9.9 2005-04-21
+Mime-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+References: <Pine.LNX.4.44.0603012011250.6386-100000@lnx.bridge.intra>
+To: mps@bridge.intra
+Subject: Re: testregex licensing question
+X-GMX-Antivirus: -1 (not scanned, may not use virus scanner)
+X-GMX-Antispam: 0 (Mail was not recognized as spam)
+X-GMX-UID: lJF3ZO9DeSEkJ2TcbHQhaXN1IGRvb0Ca
+X-Virus-Scanned: by amavisd-new at localhost
+Status: RO
+X-Status:
+X-Keywords:
+X-UID: 44736
+
+
+you may include it directly
+retain the testregex.c header comment
+it uses a very free license to maximize distribution
+you can copy that .c comment to any test data files you use
+using # comment style to be complete
+
+let me know how it works with your libc
+also pass on any new tests you cook up
+
+On Wed, 1 Mar 2006 20:15:02 +0100 (CET) Peter S. Mazinger wrote:
+> Hello Glenn!
+
+> I would want to add testregex.c and the related *.dat files to the uClibc
+> testsuite. uClibc is licensed under LGPL v2.1. I haven't found any
+> licensing related info on testregex.
+
+> Is it allowed to use the code there, or should I accomodate the testsuite
+> to download the needed files from the original site each time it is ran?
+
+> Thanks, Peter
+
+> --
+> Peter S. Mazinger <ps dot m at gmx dot net> ID: 0xA5F059F2
+> Key fingerprint = 92A4 31E1 56BC 3D5A 2D08 BB6E C389 975E A5F0 59F2
+
+
diff --git a/test/regex/Makefile b/test/regex/Makefile
new file mode 100644
index 0000000..eea0c49
--- /dev/null
+++ b/test/regex/Makefile
@@ -0,0 +1,8 @@
+# uClibc regex tests
+# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+
+top_builddir=../../
+top_srcdir=../../
+include ../Rules.mak
+-include Makefile.in
+include ../Test.mak
diff --git a/test/regex/Makefile.in b/test/regex/Makefile.in
new file mode 100644
index 0000000..59d0c06
--- /dev/null
+++ b/test/regex/Makefile.in
@@ -0,0 +1,6 @@
+# slowsdown embedded test runs extremely and always some
+# some tests are failing
+# for lm32 triggers gcc ICE with gcc 5.3.0
+# ifeq ($(TARGET_lm32),y)
+TESTS_DISABLED := testregex
+# endif
diff --git a/test/regex/basic.dat b/test/regex/basic.dat
new file mode 100644
index 0000000..5c50f37
--- /dev/null
+++ b/test/regex/basic.dat
@@ -0,0 +1,216 @@
+NOTE all standard compliant implementations should pass these : 2002-05-31
+
+BE abracadabra$ abracadabracadabra (7,18)
+BE a...b abababbb (2,7)
+BE XXXXXX ..XXXXXX (2,8)
+E \) () (1,2)
+BE a] a]a (0,2)
+B } } (0,1)
+E \} } (0,1)
+BE \] ] (0,1)
+B ] ] (0,1)
+E ] ] (0,1)
+B { { (0,1)
+B } } (0,1)
+BE ^a ax (0,1)
+BE \^a a^a (1,3)
+BE a\^ a^ (0,2)
+BE a$ aa (1,2)
+BE a\$ a$ (0,2)
+BE ^$ NULL (0,0)
+E $^ NULL (0,0)
+E a($) aa (1,2)(2,2)
+E a*(^a) aa (0,1)(0,1)
+E (..)*(...)* a (0,0)
+E (..)*(...)* abcd (0,4)(2,4)
+E (ab|a)(bc|c) abc (0,3)(0,2)(2,3)
+E (ab)c|abc abc (0,3)(0,2)
+E a{0}b ab (1,2)
+E (a*)(b?)(b+)b{3} aaabbbbbbb (0,10)(0,3)(3,4)(4,7)
+E (a*)(b{0,1})(b{1,})b{3} aaabbbbbbb (0,10)(0,3)(3,4)(4,7)
+E a{9876543210} NULL BADBR
+E ((a|a)|a) a (0,1)(0,1)(0,1)
+E (a*)(a|aa) aaaa (0,4)(0,3)(3,4)
+E a*(a.|aa) aaaa (0,4)(2,4)
+E a(b)|c(d)|a(e)f aef (0,3)(?,?)(?,?)(1,2)
+E (a|b)?.* b (0,1)(0,1)
+E (a|b)c|a(b|c) ac (0,2)(0,1)
+E (a|b)c|a(b|c) ab (0,2)(?,?)(1,2)
+E (a|b)*c|(a|ab)*c abc (0,3)(1,2)
+E (a|b)*c|(a|ab)*c xc (1,2)
+E (.a|.b).*|.*(.a|.b) xa (0,2)(0,2)
+E a?(ab|ba)ab abab (0,4)(0,2)
+E a?(ac{0}b|ba)ab abab (0,4)(0,2)
+E ab|abab abbabab (0,2)
+E aba|bab|bba baaabbbaba (5,8)
+E aba|bab baaabbbaba (6,9)
+E (aa|aaa)*|(a|aaaaa) aa (0,2)(0,2)
+E (a.|.a.)*|(a|.a...) aa (0,2)(0,2)
+E ab|a xabc (1,3)
+E ab|a xxabc (2,4)
+Ei (Ab|cD)* aBcD (0,4)(2,4)
+BE [^-] --a (2,3)
+BE [a-]* --a (0,3)
+BE [a-m-]* --amoma-- (0,4)
+E :::1:::0:|:::1:1:0: :::0:::1:::1:::0: (8,17)
+E :::1:::0:|:::1:1:1: :::0:::1:::1:::0: (8,17)
+{E [[:upper:]] A (0,1) [[<element>]] not supported
+E [[:lower:]]+ `az{ (1,3)
+E [[:upper:]]+ @AZ[ (1,3)
+BE [[-]] [[-]] (2,4)
+BE [[.NIL.]] NULL ECOLLATE
+BE [[=aleph=]] NULL ECOLLATE
+}
+BE$ \n \n (0,1)
+BEn$ \n \n (0,1)
+BE$ [^a] \n (0,1)
+BE$ \na \na (0,2)
+E (a)(b)(c) abc (0,3)(0,1)(1,2)(2,3)
+BE xxx xxx (0,3)
+E1 (^|[ (,;])((([Ff]eb[^ ]* *|0*2/|\* */?)0*[6-7]))([^0-9]|$) feb 6, (0,6)
+E1 (^|[ (,;])((([Ff]eb[^ ]* *|0*2/|\* */?)0*[6-7]))([^0-9]|$) 2/7 (0,3)
+E1 (^|[ (,;])((([Ff]eb[^ ]* *|0*2/|\* */?)0*[6-7]))([^0-9]|$) feb 1,Feb 6 (5,11)
+E3 ((((((((((((((((((((((((((((((x)))))))))))))))))))))))))))))) x (0,1)(0,1)(0,1)
+E3 ((((((((((((((((((((((((((((((x))))))))))))))))))))))))))))))* xx (0,2)(1,2)(1,2)
+E a?(ab|ba)* ababababababababababababababababababababababababababababababababababababababababa (0,81)(79,81)
+E abaa|abbaa|abbbaa|abbbbaa ababbabbbabbbabbbbabbbbaa (18,25)
+E abaa|abbaa|abbbaa|abbbbaa ababbabbbabbbabbbbabaa (18,22)
+E aaac|aabc|abac|abbc|baac|babc|bbac|bbbc baaabbbabac (7,11)
+BE$ .* \x01\xff (0,2)
+E aaaa|bbbb|cccc|ddddd|eeeeee|fffffff|gggg|hhhh|iiiii|jjjjj|kkkkk|llll XaaaXbbbXcccXdddXeeeXfffXgggXhhhXiiiXjjjXkkkXlllXcbaXaaaa (53,57)
+L aaaa\nbbbb\ncccc\nddddd\neeeeee\nfffffff\ngggg\nhhhh\niiiii\njjjjj\nkkkkk\nllll XaaaXbbbXcccXdddXeeeXfffXgggXhhhXiiiXjjjXkkkXlllXcbaXaaaa NOMATCH
+E a*a*a*a*a*b aaaaaaaaab (0,10)
+BE ^ NULL (0,0)
+BE $ NULL (0,0)
+BE ^$ NULL (0,0)
+BE ^a$ a (0,1)
+BE abc abc (0,3)
+BE abc xabcy (1,4)
+BE abc ababc (2,5)
+BE ab*c abc (0,3)
+BE ab*bc abc (0,3)
+BE ab*bc abbc (0,4)
+BE ab*bc abbbbc (0,6)
+E ab+bc abbc (0,4)
+E ab+bc abbbbc (0,6)
+E ab?bc abbc (0,4)
+E ab?bc abc (0,3)
+E ab?c abc (0,3)
+BE ^abc$ abc (0,3)
+BE ^abc abcc (0,3)
+BE abc$ aabc (1,4)
+BE ^ abc (0,0)
+BE $ abc (3,3)
+BE a.c abc (0,3)
+BE a.c axc (0,3)
+BE a.*c axyzc (0,5)
+BE a[bc]d abd (0,3)
+BE a[b-d]e ace (0,3)
+BE a[b-d] aac (1,3)
+BE a[-b] a- (0,2)
+BE a[b-] a- (0,2)
+BE a] a] (0,2)
+BE a[]]b a]b (0,3)
+BE a[^bc]d aed (0,3)
+BE a[^-b]c adc (0,3)
+BE a[^]b]c adc (0,3)
+E ab|cd abc (0,2)
+E ab|cd abcd (0,2)
+E a\(b a(b (0,3)
+E a\(*b ab (0,2)
+E a\(*b a((b (0,4)
+E ((a)) abc (0,1)(0,1)(0,1)
+E (a)b(c) abc (0,3)(0,1)(2,3)
+E a+b+c aabbabc (4,7)
+E a* aaa (0,3)
+E (a*)* - (0,0)(0,0)
+E (a*)+ - (0,0)(0,0)
+E (a*|b)* - (0,0)(0,0)
+E (a+|b)* ab (0,2)(1,2)
+E (a+|b)+ ab (0,2)(1,2)
+E (a+|b)? ab (0,1)(0,1)
+BE [^ab]* cde (0,3)
+E (^)* - (0,0)(0,0)
+BE a* NULL (0,0)
+E ([abc])*d abbbcd (0,6)(4,5)
+E ([abc])*bcd abcd (0,4)(0,1)
+E a|b|c|d|e e (0,1)
+E (a|b|c|d|e)f ef (0,2)(0,1)
+E ((a*|b))* - (0,0)(0,0)(0,0)
+BE abcd*efg abcdefg (0,7)
+BE ab* xabyabbbz (1,3)
+BE ab* xayabbbz (1,2)
+E (ab|cd)e abcde (2,5)(2,4)
+BE [abhgefdc]ij hij (0,3)
+E (a|b)c*d abcd (1,4)(1,2)
+E (ab|ab*)bc abc (0,3)(0,1)
+E a([bc]*)c* abc (0,3)(1,3)
+E a([bc]*)(c*d) abcd (0,4)(1,3)(3,4)
+E a([bc]+)(c*d) abcd (0,4)(1,3)(3,4)
+E a([bc]*)(c+d) abcd (0,4)(1,2)(2,4)
+E a[bcd]*dcdcde adcdcde (0,7)
+E (ab|a)b*c abc (0,3)(0,2)
+E ((a)(b)c)(d) abcd (0,4)(0,3)(0,1)(1,2)(3,4)
+BE [A-Za-z_][A-Za-z0-9_]* alpha (0,5)
+E ^a(bc+|b[eh])g|.h$ abh (1,3)
+E (bc+d$|ef*g.|h?i(j|k)) effgz (0,5)(0,5)
+E (bc+d$|ef*g.|h?i(j|k)) ij (0,2)(0,2)(1,2)
+E (bc+d$|ef*g.|h?i(j|k)) reffgz (1,6)(1,6)
+E (((((((((a))))))))) a (0,1)(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)(0,1)
+BE multiple words multiple words yeah (0,14)
+E (.*)c(.*) abcde (0,5)(0,2)(3,5)
+BE abcd abcd (0,4)
+E a(bc)d abcd (0,4)(1,3)
+E a[-]?c ac (0,3)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Qaddafi (0,15)(?,?)(10,12)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Mo'ammar Gadhafi (0,16)(?,?)(11,13)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Kaddafi (0,15)(?,?)(10,12)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Qadhafi (0,15)(?,?)(10,12)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Gadafi (0,14)(?,?)(10,11)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Mu'ammar Qadafi (0,15)(?,?)(11,12)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Moamar Gaddafi (0,14)(?,?)(9,11)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Mu'ammar Qadhdhafi (0,18)(?,?)(13,15)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Khaddafi (0,16)(?,?)(11,13)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Ghaddafy (0,16)(?,?)(11,13)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Ghadafi (0,15)(?,?)(11,12)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Ghaddafi (0,16)(?,?)(11,13)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muamar Kaddafi (0,14)(?,?)(9,11)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Quathafi (0,16)(?,?)(11,13)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Muammar Gheddafi (0,16)(?,?)(11,13)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Moammar Khadafy (0,15)(?,?)(11,12)
+E M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] Moammar Qudhafi (0,15)(?,?)(10,12)
+E a+(b|c)*d+ aabcdd (0,6)(3,4)
+E ^.+$ vivi (0,4)
+E ^(.+)$ vivi (0,4)(0,4)
+E ^([^!.]+).att.com!(.+)$ gryphon.att.com!eby (0,19)(0,7)(16,19)
+E ^([^!]+!)?([^!]+)$ bas (0,3)(?,?)(0,3)
+E ^([^!]+!)?([^!]+)$ bar!bas (0,7)(0,4)(4,7)
+E ^([^!]+!)?([^!]+)$ foo!bas (0,7)(0,4)(4,7)
+E ^.+!([^!]+!)([^!]+)$ foo!bar!bas (0,11)(4,8)(8,11)
+E ((foo)|(bar))!bas bar!bas (0,7)(0,3)(?,?)(0,3)
+E ((foo)|(bar))!bas foo!bar!bas (4,11)(4,7)(?,?)(4,7)
+E ((foo)|(bar))!bas foo!bas (0,7)(0,3)(0,3)
+E ((foo)|bar)!bas bar!bas (0,7)(0,3)
+E ((foo)|bar)!bas foo!bar!bas (4,11)(4,7)
+E ((foo)|bar)!bas foo!bas (0,7)(0,3)(0,3)
+E (foo|(bar))!bas bar!bas (0,7)(0,3)(0,3)
+E (foo|(bar))!bas foo!bar!bas (4,11)(4,7)(4,7)
+E (foo|(bar))!bas foo!bas (0,7)(0,3)
+E (foo|bar)!bas bar!bas (0,7)(0,3)
+E (foo|bar)!bas foo!bar!bas (4,11)(4,7)
+E (foo|bar)!bas foo!bas (0,7)(0,3)
+E ^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$ foo!bar!bas (0,11)(0,11)(?,?)(?,?)(4,8)(8,11)
+E ^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$ bas (0,3)(?,?)(0,3)
+E ^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$ bar!bas (0,7)(0,4)(4,7)
+E ^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$ foo!bar!bas (0,11)(?,?)(?,?)(4,8)(8,11)
+E ^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$ foo!bas (0,7)(0,4)(4,7)
+E ^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$ bas (0,3)(0,3)(?,?)(0,3)
+E ^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$ bar!bas (0,7)(0,7)(0,4)(4,7)
+E ^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$ foo!bar!bas (0,11)(0,11)(?,?)(?,?)(4,8)(8,11)
+E ^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$ foo!bas (0,7)(0,7)(0,4)(4,7)
+E .*(/XXX).* /XXX (0,4)(0,4)
+E .*(\\XXX).* \XXX (0,4)(0,4)
+E \\XXX \XXX (0,4)
+E .*(/000).* /000 (0,4)(0,4)
+E .*(\\000).* \000 (0,4)(0,4)
+E \\000 \000 (0,4)
diff --git a/test/regex/categorize.dat b/test/regex/categorize.dat
new file mode 100644
index 0000000..d348512
--- /dev/null
+++ b/test/regex/categorize.dat
@@ -0,0 +1,62 @@
+NOTE regex implementation categorization 2004-05-31
+
+?E aa* xaxaax (1,2) POSITION=leftmost
+; POSITION=bug
+
+?E (a*)(ab)*(b*) abc (0,2)(0,1)(?,?)(1,2) ASSOCIATIVITY=right
+|E (a*)(ab)*(b*) abc (0,2)(0,0)(0,2)(2,2) ASSOCIATIVITY=left
+; ASSOCIATIVITY=bug
+
+?E ((a*)(ab)*)((b*)(a*)) aba (0,3)(0,2)(0,0)(0,2)(2,3)(2,2)(2,3) SUBEXPRESSION=precedence
+|E ((a*)(ab)*)((b*)(a*)) aba (0,3)(0,1)(0,1)(?,?)(1,3)(1,2)(2,3) SUBEXPRESSION=grouping
+; SUBEXPRESSION=bug
+
+?E (...?.?)* xxxxxx (0,6)(4,6) REPEAT_LONGEST=first
+|E (...?.?)* xxxxxx (0,6)(2,6) REPEAT_LONGEST=last
+|E (...?.?)* xxxxxx OK REPEAT_LONGEST=unknown
+; REPEAT_LONGEST=bug
+
+?E (a|ab)(bc|c) abcabc (0,3)(0,2)(2,3) EXPECTED
+|E (a|ab)(bc|c) abcabc (0,3)(0,1)(1,3) BUG=alternation-order
+; BUG=alternation-order-UNKNOWN
+
+?E (aba|a*b)(aba|a*b) ababa (0,5)(0,2)(2,5) EXPECTED
+|E (aba|a*b)(aba|a*b) ababa (0,4)(0,3)(3,4) BUG=first-match
+; BUG=unknown-match
+
+?B a\(b\)*\1 a NOMATCH EXPECTED
+|B a\(b\)*\1 a (0,1) BUG=nomatch-match
+|B a\(b\)*\1 abab (0,2)(1,2) # BUG=repeat-any
+; BUG=nomatch-match-UNKNOWN
+
+?E (a*){2} xxxxx (0,0)(0,0) EXPECTED
+|E (a*){2} xxxxx (5,5)(5,5) BUG=range-null
+; BUG=range-null-UNKNOWN
+
+?B a\(b\)*\1 abab NOMATCH EXPECTED
+|B a\(b\)*\1 abab (0,1) # BUG=nomatch-match
+|B a\(b\)*\1 abab (0,2)(1,2) BUG=repeat-any
+; BUG=repeat-any-UNKNOWN
+
+?E (a*)* a (0,1)(0,1) EXPECTED
+|E (a*)* ax (0,1)(0,1) BUG=repeat-null-unknown
+|E (a*)* a (0,1)(1,1) BUG=repeat-null
+; BUG=repeat-null-UNKNOWN
+
+?E (aba|a*b)* ababa (0,5)(2,5) EXPECTED
+|E (aba|a*b)* ababa (0,5)(3,4) BUG=repeat-short
+|E (aba|a*b)* ababa (0,4)(3,4) # LENGTH=first
+; BUG=repeat-short-UNKNOWN
+
+?E (a(b)?)+ aba (0,3)(2,3) EXPECTED
+|E (a(b)?)+ aba (0,3)(2,3)(1,2) BUG=repeat-artifact
+; BUG=repeat-artifact-UNKNOWN
+
+?B \(a\(b\)*\)*\2 abab NOMATCH EXPECTED
+|B \(a\(b\)*\)*\2 abab (0,4)(2,3)(1,2) BUG=repeat-artifact-nomatch
+; BUG=repeat-artifact-nomatch-UNKNOWN
+
+?E (a?)((ab)?)(b?)a?(ab)?b? abab (0,4)(0,1)(1,1)(?,?)(1,2)(2,4) BUG=subexpression-first
+|E .*(.*) ab (0,2)(2,2) EXPECTED
+|E .*(.*) ab (0,2)(0,2) BUG=subexpression-first
+; BUG=subexpression-first-UNKNOWN
diff --git a/test/regex/forcedassoc.dat b/test/regex/forcedassoc.dat
new file mode 100644
index 0000000..39f3111
--- /dev/null
+++ b/test/regex/forcedassoc.dat
@@ -0,0 +1,30 @@
+NOTE left-assoc:pass-all right-assoc:pass-all : 2002-04-29
+
+E (a|ab)(c|bcd) abcd (0,4)(0,1)(1,4)
+E (a|ab)(bcd|c) abcd (0,4)(0,1)(1,4)
+E (ab|a)(c|bcd) abcd (0,4)(0,1)(1,4)
+E (ab|a)(bcd|c) abcd (0,4)(0,1)(1,4)
+E ((a|ab)(c|bcd))(d*) abcd (0,4)(0,4)(0,1)(1,4)(4,4)
+E ((a|ab)(bcd|c))(d*) abcd (0,4)(0,4)(0,1)(1,4)(4,4)
+E ((ab|a)(c|bcd))(d*) abcd (0,4)(0,4)(0,1)(1,4)(4,4)
+E ((ab|a)(bcd|c))(d*) abcd (0,4)(0,4)(0,1)(1,4)(4,4)
+E (a|ab)((c|bcd)(d*)) abcd (0,4)(0,2)(2,4)(2,3)(3,4)
+E (a|ab)((bcd|c)(d*)) abcd (0,4)(0,2)(2,4)(2,3)(3,4)
+E (ab|a)((c|bcd)(d*)) abcd (0,4)(0,2)(2,4)(2,3)(3,4)
+E (ab|a)((bcd|c)(d*)) abcd (0,4)(0,2)(2,4)(2,3)(3,4)
+E (a*)(b|abc) abc (0,3)(0,0)(0,3)
+E (a*)(abc|b) abc (0,3)(0,0)(0,3)
+E ((a*)(b|abc))(c*) abc (0,3)(0,3)(0,0)(0,3)(3,3)
+E ((a*)(abc|b))(c*) abc (0,3)(0,3)(0,0)(0,3)(3,3)
+E (a*)((b|abc)(c*)) abc (0,3)(0,1)(1,3)(1,2)(2,3)
+E (a*)((abc|b)(c*)) abc (0,3)(0,1)(1,3)(1,2)(2,3)
+E (a*)(b|abc) abc (0,3)(0,0)(0,3)
+E (a*)(abc|b) abc (0,3)(0,0)(0,3)
+E ((a*)(b|abc))(c*) abc (0,3)(0,3)(0,0)(0,3)(3,3)
+E ((a*)(abc|b))(c*) abc (0,3)(0,3)(0,0)(0,3)(3,3)
+E (a*)((b|abc)(c*)) abc (0,3)(0,1)(1,3)(1,2)(2,3)
+E (a*)((abc|b)(c*)) abc (0,3)(0,1)(1,3)(1,2)(2,3)
+E (a|ab) ab (0,2)(0,2)
+E (ab|a) ab (0,2)(0,2)
+E (a|ab)(b*) ab (0,2)(0,2)(2,2)
+E (ab|a)(b*) ab (0,2)(0,2)(2,2)
diff --git a/test/regex/interpretation.dat b/test/regex/interpretation.dat
new file mode 100644
index 0000000..72e186e
--- /dev/null
+++ b/test/regex/interpretation.dat
@@ -0,0 +1,93 @@
+:RE#01:E a+ xaax (1,3)
+:RE#02:B .\(a*\). xaax (0,4)(1,3)
+:RE#03:E (a?)((ab)?) ab (0,2)(0,0)(0,2)(0,2)
+:RE#04:E (a?)((ab)?)(b?) ab (0,2)(0,1)(1,1)(?,?)(1,2)
+:RE#05:E ((a?)((ab)?))(b?) ab (0,2)(0,2)(0,0)(0,2)(0,2)(2,2)
+:RE#06:E (a?)(((ab)?)(b?)) ab (0,2)(0,1)(1,2)(1,1)(?,?)(1,2)
+:RE#07:E (.?) x (0,1)(0,1)
+:RE#08:E (.?){1} x (0,1)(0,1)
+:RE#09:E (.?)(.?) x (0,1)(0,1)(1,1)
+:RE#10:E (.?){2} x (0,1)(1,1)
+:RE#11:E (.?)* x (0,1)(0,1)
+:RE#12:E (.?.?) xxx (0,2)(0,2)
+:RE#13:E (.?.?){1} xxx (0,2)(0,2)
+:RE#14:E (.?.?)(.?.?) xxx (0,3)(0,2)(2,3)
+:RE#15:E (.?.?){2} xxx (0,3)(2,3)
+:RE#16:E (.?.?)(.?.?)(.?.?) xxx (0,3)(0,2)(2,3)(3,3)
+:RE#17:E (.?.?){3} xxx (0,3)(3,3)
+:RE#18:E (.?.?)* xxx (0,3)(2,3)
+:RE#19:E a?((ab)?)(b?) ab (0,2)(1,1)(?,?)(1,2)
+:RE#20:E (a?)((ab)?)b? ab (0,2)(0,1)(1,1)(?,?)
+:RE#21:E a?((ab)?)b? ab (0,2)(1,1)(?,?)
+:RE#22:E (a*){2} xxxxx (0,0)(0,0)
+:RE#23:E (ab?)(b?a) aba (0,3)(0,2)(2,3)
+:RE#24:E (a|ab)(ba|a) aba (0,3)(0,2)(2,3)
+:RE#25:E (a|ab|ba) aba (0,2)(0,2)
+:RE#26:E (a|ab|ba)(a|ab|ba) aba (0,3)(0,2)(2,3)
+:RE#27:E (a|ab|ba)* aba (0,3)(2,3)
+:RE#28:E (aba|a*b) ababa (0,3)(0,3)
+:RE#29:E (aba|a*b)(aba|a*b) ababa (0,5)(0,2)(2,5)
+:RE#30:E (aba|a*b)* ababa (0,5)(2,5)
+:RE#31:E (aba|ab|a) ababa (0,3)(0,3)
+:RE#32:E (aba|ab|a)(aba|ab|a) ababa (0,5)(0,2)(2,5)
+:RE#33:E (aba|ab|a)* ababa (0,5)(2,5)
+:RE#34:E (a(b)?) aba (0,2)(0,2)(1,2)
+:RE#35:E (a(b)?)(a(b)?) aba (0,3)(0,2)(1,2)(2,3)(?,?)
+:RE#36:E (a(b)?)+ aba (0,3)(2,3)(?,?)
+:RE#37:E (.*)(.*) xx (0,2)(0,2)(2,2)
+:RE#38:E .*(.*) xx (0,2)(2,2)
+:RE#39:E (a.*z|b.*y) azbazby (0,5)(0,5)
+:RE#40:E (a.*z|b.*y)(a.*z|b.*y) azbazby (0,7)(0,5)(5,7)
+:RE#41:E (a.*z|b.*y)* azbazby (0,7)(5,7)
+:RE#42:E (.|..)(.*) ab (0,2)(0,2)(2,2)
+:RE#43:E ((..)*(...)*) xxx (0,3)(0,3)(?,?)(0,3)
+:RE#44:E ((..)*(...)*)((..)*(...)*) xxx (0,3)(0,3)(?,?)(0,3)(3,3)(?,?)
+:RE#45:E ((..)*(...)*)* xxx (0,3)(0,3)(?,?)(0,3)
+:RE#46:B \(a\{0,1\}\)*b\1 ab (0,2)(1,1)
+:RE#47:B \(a*\)*b\1 ab (0,2)(1,1)
+:RE#48:B \(a*\)b\1* ab (0,2)(0,1)
+:RE#49:B \(a*\)*b\1* ab (0,2)(1,1)
+:RE#50:B \(a\{0,1\}\)*b\(\1\) ab (0,2)(1,1)(2,2)
+:RE#51:B \(a*\)*b\(\1\) ab (0,2)(1,1)(2,2)
+:RE#52:B \(a*\)b\(\1\)* ab (0,2)(0,1)(?,?)
+:RE#53:B \(a*\)*b\(\1\)* ab (0,2)(1,1)(2,2)
+:RE#54:B \(a\{0,1\}\)*b\1 aba (0,3)(0,1)
+:RE#55:B \(a*\)*b\1 aba (0,3)(0,1)
+:RE#56:B \(a*\)b\1* aba (0,3)(0,1)
+:RE#57:B \(a*\)*b\1* aba (0,3)(0,1)
+:RE#58:B \(a*\)*b\(\1\)* aba (0,3)(0,1)(2,3)
+:RE#59:B \(a\{0,1\}\)*b\1 abaa (0,3)(0,1)
+:RE#60:B \(a*\)*b\1 abaa (0,3)(0,1)
+:RE#61:B \(a*\)b\1* abaa (0,4)(0,1)
+:RE#62:B \(a*\)*b\1* abaa (0,4)(0,1)
+:RE#63:B \(a*\)*b\(\1\)* abaa (0,4)(0,1)(3,4)
+:RE#64:B \(a\{0,1\}\)*b\1 aab (0,3)(2,2)
+:RE#65:B \(a*\)*b\1 aab (0,3)(2,2)
+:RE#66:B \(a*\)b\1* aab (0,3)(0,2)
+:RE#67:B \(a*\)*b\1* aab (0,3)(2,2)
+:RE#68:B \(a*\)*b\(\1\)* aab (0,3)(2,2)(3,3)
+:RE#69:B \(a\{0,1\}\)*b\1 aaba (0,4)(1,2)
+:RE#70:B \(a*\)*b\1 aaba (0,4)(1,2)
+:RE#71:B \(a*\)b\1* aaba (0,3)(0,2)
+:RE#72:B \(a*\)*b\1* aaba (0,4)(1,2)
+:RE#73:B \(a*\)*b\(\1\)* aaba (0,4)(1,2)(3,4)
+:RE#74:B \(a\{0,1\}\)*b\1 aabaa (0,4)(1,2)
+:RE#75:B \(a*\)*b\1 aabaa (0,5)(0,2)
+:RE#76:B \(a*\)b\1* aabaa (0,5)(0,2)
+:RE#77:B \(a*\)*b\1* aabaa (0,5)(0,2)
+:RE#78:B \(a*\)*b\(\1\)* aabaa (0,5)(0,2)(3,5)
+:RE#79:B \(x\)*a\1 a NOMATCH
+:RE#80:B \(x\)*a\1* a (0,1)(?,?)
+:RE#81:B \(x\)*a\(\1\) a NOMATCH
+:RE#82:B \(x\)*a\(\1\)* a (0,1)(?,?)(?,?)
+:RE#83:E (aa(b(b))?)+ aabbaa (0,6)(4,6)(?,?)(?,?)
+:RE#84:E (a(b)?)+ aba (0,3)(2,3)(?,?)
+:RE#85:E ([ab]+)([bc]+)([cd]*) abcd (0,4)(0,2)(2,3)(3,4)
+:RE#86:B \([ab]*\)\([bc]*\)\([cd]*\)\1 abcdaa (0,5)(0,1)(1,3)(3,4)
+:RE#87:B \([ab]*\)\([bc]*\)\([cd]*\)\1 abcdab (0,6)(0,2)(2,3)(3,4)
+:RE#88:B \([ab]*\)\([bc]*\)\([cd]*\)\1* abcdaa (0,6)(0,1)(1,3)(3,4)
+:RE#89:B \([ab]*\)\([bc]*\)\([cd]*\)\1* abcdab (0,6)(0,2)(2,3)(3,4)
+:RE#90:E ^(A([^B]*))?(B(.*))? Aa (0,2)(0,2)(1,2)
+:RE#91:E ^(A([^B]*))?(B(.*))? Bb (0,2)(?,?)(?,?)(0,2)(1,2)
+:RE#92:B .*\([AB]\).*\1 ABA (0,3)(0,1)
+:RE#93:B$ [^A]*A \nA (0,2)
diff --git a/test/regex/leftassoc.dat b/test/regex/leftassoc.dat
new file mode 100644
index 0000000..9c068c6
--- /dev/null
+++ b/test/regex/leftassoc.dat
@@ -0,0 +1,16 @@
+NOTE left-assoc:pass-all right-assoc:pass-none : 2002-04-29
+
+E (a|ab)(c|bcd)(d*) abcd (0,4)(0,1)(1,4)(4,4)
+E (a|ab)(bcd|c)(d*) abcd (0,4)(0,1)(1,4)(4,4)
+E (ab|a)(c|bcd)(d*) abcd (0,4)(0,1)(1,4)(4,4)
+E (ab|a)(bcd|c)(d*) abcd (0,4)(0,1)(1,4)(4,4)
+
+E (a*)(b|abc)(c*) abc (0,3)(0,0)(0,3)(3,3)
+E (a*)(abc|b)(c*) abc (0,3)(0,0)(0,3)(3,3)
+E (a*)(b|abc)(c*) abc (0,3)(0,0)(0,3)(3,3)
+E (a*)(abc|b)(c*) abc (0,3)(0,0)(0,3)(3,3)
+
+E (a|ab)(c|bcd)(d|.*) abcd (0,4)(0,1)(1,4)(4,4)
+E (a|ab)(bcd|c)(d|.*) abcd (0,4)(0,1)(1,4)(4,4)
+E (ab|a)(c|bcd)(d|.*) abcd (0,4)(0,1)(1,4)(4,4)
+E (ab|a)(bcd|c)(d|.*) abcd (0,4)(0,1)(1,4)(4,4)
diff --git a/test/regex/nullsubexpr.dat b/test/regex/nullsubexpr.dat
new file mode 100644
index 0000000..c73d8f0
--- /dev/null
+++ b/test/regex/nullsubexpr.dat
@@ -0,0 +1,73 @@
+NOTE null subexpression matches : 2002-06-06
+
+E (a*)* a (0,1)(0,1)
+E SAME x (0,0)(0,0)
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaax (0,6)(0,6)
+E (a*)+ a (0,1)(0,1)
+E SAME x (0,0)(0,0)
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaax (0,6)(0,6)
+E (a+)* a (0,1)(0,1)
+E SAME x (0,0)
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaax (0,6)(0,6)
+E (a+)+ a (0,1)(0,1)
+E SAME x NOMATCH
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaax (0,6)(0,6)
+
+E ([a]*)* a (0,1)(0,1)
+E SAME x (0,0)(0,0)
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaax (0,6)(0,6)
+E ([a]*)+ a (0,1)(0,1)
+E SAME x (0,0)(0,0)
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaax (0,6)(0,6)
+E ([^b]*)* a (0,1)(0,1)
+E SAME b (0,0)(0,0)
+E SAME aaaaaa (0,6)(0,6)
+E SAME aaaaaab (0,6)(0,6)
+E ([ab]*)* a (0,1)(0,1)
+E SAME aaaaaa (0,6)(0,6)
+E SAME ababab (0,6)(0,6)
+E SAME bababa (0,6)(0,6)
+E SAME b (0,1)(0,1)
+E SAME bbbbbb (0,6)(0,6)
+E SAME aaaabcde (0,5)(0,5)
+E ([^a]*)* b (0,1)(0,1)
+E SAME bbbbbb (0,6)(0,6)
+E SAME aaaaaa (0,0)(0,0)
+E ([^ab]*)* ccccxx (0,6)(0,6)
+E SAME ababab (0,0)(0,0)
+
+E ((z)+|a)* zabcde (0,2)(1,2)
+
+{E a+? aaaaaa (0,1) no *? +? mimimal match ops
+E (a) aaa (0,1)(0,1)
+E (a*?) aaa (0,0)(0,0)
+E (a)*? aaa (0,0)
+E (a*?)*? aaa (0,0)
+}
+
+B \(a*\)*\(x\) x (0,1)(0,0)(0,1)
+B \(a*\)*\(x\) ax (0,2)(0,1)(1,2)
+B \(a*\)*\(x\) axa (0,2)(0,1)(1,2)
+B \(a*\)*\(x\)\(\1\) x (0,1)(0,0)(0,1)(1,1)
+B \(a*\)*\(x\)\(\1\) ax (0,2)(1,1)(1,2)(2,2)
+B \(a*\)*\(x\)\(\1\) axa (0,3)(0,1)(1,2)(2,3)
+B \(a*\)*\(x\)\(\1\)\(x\) axax (0,4)(0,1)(1,2)(2,3)(3,4)
+B \(a*\)*\(x\)\(\1\)\(x\) axxa (0,3)(1,1)(1,2)(2,2)(2,3)
+
+E (a*)*(x) x (0,1)(0,0)(0,1)
+E (a*)*(x) ax (0,2)(0,1)(1,2)
+E (a*)*(x) axa (0,2)(0,1)(1,2)
+
+E (a*)+(x) x (0,1)(0,0)(0,1)
+E (a*)+(x) ax (0,2)(0,1)(1,2)
+E (a*)+(x) axa (0,2)(0,1)(1,2)
+
+E (a*){2}(x) x (0,1)(0,0)(0,1)
+E (a*){2}(x) ax (0,2)(1,1)(1,2)
+E (a*){2}(x) axa (0,2)(1,1)(1,2)
diff --git a/test/regex/repetition.dat b/test/regex/repetition.dat
new file mode 100644
index 0000000..b54a2c6
--- /dev/null
+++ b/test/regex/repetition.dat
@@ -0,0 +1,79 @@
+NOTE implicit vs. explicit repetitions : 2002-08-01
+#
+# Glenn Fowler <gsf@research.att.com>
+# conforming matches (column 4) must match one of the following BREs
+# NOMATCH
+# (0,.)\((\(.\),\(.\))(?,?)(\2,\3)\)*
+# (0,.)\((\(.\),\(.\))(\2,\3)(?,?)\)*
+# i.e., each 3-tuple has two identical elements and one (?,?)
+#
+
+E ((..)|(.)) NULL NOMATCH
+E ((..)|(.))((..)|(.)) NULL NOMATCH
+E ((..)|(.))((..)|(.))((..)|(.)) NULL NOMATCH
+
+E ((..)|(.)){1} NULL NOMATCH
+E ((..)|(.)){2} NULL NOMATCH
+E ((..)|(.)){3} NULL NOMATCH
+
+E ((..)|(.))* NULL (0,0)
+
+E ((..)|(.)) a (0,1)(0,1)(?,?)(0,1)
+E ((..)|(.))((..)|(.)) a NOMATCH
+E ((..)|(.))((..)|(.))((..)|(.)) a NOMATCH
+
+E ((..)|(.)){1} a (0,1)(0,1)(?,?)(0,1)
+E ((..)|(.)){2} a NOMATCH
+E ((..)|(.)){3} a NOMATCH
+
+E ((..)|(.))* a (0,1)(0,1)(?,?)(0,1)
+
+E ((..)|(.)) aa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.))((..)|(.)) aa (0,2)(0,1)(?,?)(0,1)(1,2)(?,?)(1,2)
+E ((..)|(.))((..)|(.))((..)|(.)) aa NOMATCH
+
+E ((..)|(.)){1} aa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.)){2} aa (0,2)(1,2)(?,?)(1,2)
+E ((..)|(.)){3} aa NOMATCH
+
+E ((..)|(.))* aa (0,2)(0,2)(0,2)(?,?)
+
+E ((..)|(.)) aaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.))((..)|(.)) aaa (0,3)(0,2)(0,2)(?,?)(2,3)(?,?)(2,3)
+E ((..)|(.))((..)|(.))((..)|(.)) aaa (0,3)(0,1)(?,?)(0,1)(1,2)(?,?)(1,2)(2,3)(?,?)(2,3)
+
+E ((..)|(.)){1} aaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.)){2} aaa (0,3)(2,3)(?,?)(2,3)
+E ((..)|(.)){3} aaa (0,3)(2,3)(?,?)(2,3)
+
+E ((..)|(.))* aaa (0,3)(2,3)(?,?)(2,3)
+
+E ((..)|(.)) aaaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.))((..)|(.)) aaaa (0,4)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)
+E ((..)|(.))((..)|(.))((..)|(.)) aaaa (0,4)(0,2)(0,2)(?,?)(2,3)(?,?)(2,3)(3,4)(?,?)(3,4)
+
+E ((..)|(.)){1} aaaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.)){2} aaaa (0,4)(2,4)(2,4)(?,?)
+E ((..)|(.)){3} aaaa (0,4)(3,4)(?,?)(3,4)
+
+E ((..)|(.))* aaaa (0,4)(2,4)(2,4)(?,?)
+
+E ((..)|(.)) aaaaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.))((..)|(.)) aaaaa (0,4)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)
+E ((..)|(.))((..)|(.))((..)|(.)) aaaaa (0,5)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)(4,5)(?,?)(4,5)
+
+E ((..)|(.)){1} aaaaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.)){2} aaaaa (0,4)(2,4)(2,4)(?,?)
+E ((..)|(.)){3} aaaaa (0,5)(4,5)(?,?)(4,5)
+
+E ((..)|(.))* aaaaa (0,5)(4,5)(?,?)(4,5)
+
+E ((..)|(.)) aaaaaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.))((..)|(.)) aaaaaa (0,4)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)
+E ((..)|(.))((..)|(.))((..)|(.)) aaaaaa (0,6)(0,2)(0,2)(?,?)(2,4)(2,4)(?,?)(4,6)(4,6)(?,?)
+
+E ((..)|(.)){1} aaaaaa (0,2)(0,2)(0,2)(?,?)
+E ((..)|(.)){2} aaaaaa (0,4)(2,4)(2,4)(?,?)
+E ((..)|(.)){3} aaaaaa (0,6)(4,6)(4,6)(?,?)
+
+E ((..)|(.))* aaaaaa (0,6)(4,6)(4,6)(?,?)
diff --git a/test/regex/rightassoc.dat b/test/regex/rightassoc.dat
new file mode 100644
index 0000000..ed7f28e
--- /dev/null
+++ b/test/regex/rightassoc.dat
@@ -0,0 +1,16 @@
+NOTE left-assoc:pass-none right-assoc:pass-all : 2002-04-29
+
+E (a|ab)(c|bcd)(d*) abcd (0,4)(0,2)(2,3)(3,4)
+E (a|ab)(bcd|c)(d*) abcd (0,4)(0,2)(2,3)(3,4)
+E (ab|a)(c|bcd)(d*) abcd (0,4)(0,2)(2,3)(3,4)
+E (ab|a)(bcd|c)(d*) abcd (0,4)(0,2)(2,3)(3,4)
+
+E (a*)(b|abc)(c*) abc (0,3)(0,1)(1,2)(2,3)
+E (a*)(abc|b)(c*) abc (0,3)(0,1)(1,2)(2,3)
+E (a*)(b|abc)(c*) abc (0,3)(0,1)(1,2)(2,3)
+E (a*)(abc|b)(c*) abc (0,3)(0,1)(1,2)(2,3)
+
+E (a|ab)(c|bcd)(d|.*) abcd (0,4)(0,2)(2,3)(3,4)
+E (a|ab)(bcd|c)(d|.*) abcd (0,4)(0,2)(2,3)(3,4)
+E (ab|a)(c|bcd)(d|.*) abcd (0,4)(0,2)(2,3)(3,4)
+E (ab|a)(bcd|c)(d|.*) abcd (0,4)(0,2)(2,3)(3,4)
diff --git a/test/regex/testregex.c b/test/regex/testregex.c
new file mode 100644
index 0000000..d18761d
--- /dev/null
+++ b/test/regex/testregex.c
@@ -0,0 +1,2145 @@
+/*
+ * regex(3) test harness
+ *
+ * build: cc -o testregex testregex.c
+ * help: testregex --man
+ * note: REG_* features are detected by #ifdef; if REG_* are enums
+ * then supply #define REG_foo REG_foo for each enum REG_foo
+ *
+ * Glenn Fowler <gsf@research.att.com>
+ * AT&T Labs Research
+ *
+ * PLEASE: publish your tests so everyone can benefit
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of THIS SOFTWARE FILE (the "Software"), to deal in the Software
+ * without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following disclaimer:
+ *
+ * THIS SOFTWARE IS PROVIDED BY AT&T ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL AT&T BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+static const char id[] = "\n@(#)$Id: testregex (AT&T Research) 2005-05-20 $\0\n";
+
+#if _PACKAGE_ast
+#include <ast.h>
+#else
+#include <sys/types.h>
+#endif
+
+#include <stdio.h>
+#include <regex.h>
+#include <ctype.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef __STDC__
+#include <stdlib.h>
+#include <locale.h>
+#endif
+
+#if !_PACKAGE_ast
+#undef REG_DISCIPLINE
+#endif
+
+#ifndef REG_DELIMITED
+#undef _REG_subcomp
+#endif
+
+#define TEST_ARE 0x00000001
+#define TEST_BRE 0x00000002
+#define TEST_ERE 0x00000004
+#define TEST_KRE 0x00000008
+#define TEST_LRE 0x00000010
+#define TEST_SRE 0x00000020
+
+#define TEST_EXPAND 0x00000040
+#define TEST_LENIENT 0x00000080
+
+#define TEST_QUERY 0x00000100
+#define TEST_SUB 0x00000200
+#define TEST_UNSPECIFIED 0x00000400
+#define TEST_VERIFY 0x00000800
+#define TEST_AND 0x00001000
+#define TEST_OR 0x00002000
+
+#define TEST_DELIMIT 0x00010000
+#define TEST_OK 0x00020000
+#define TEST_SAME 0x00040000
+
+#define TEST_ACTUAL 0x00100000
+#define TEST_BASELINE 0x00200000
+#define TEST_FAIL 0x00400000
+#define TEST_PASS 0x00800000
+#define TEST_SUMMARY 0x01000000
+
+#define TEST_IGNORE_ERROR 0x02000000
+#define TEST_IGNORE_OVER 0x04000000
+#define TEST_IGNORE_POSITION 0x08000000
+
+#define TEST_CATCH 0x10000000
+#define TEST_VERBOSE 0x20000000
+
+#define TEST_GLOBAL (TEST_ACTUAL|TEST_AND|TEST_BASELINE|TEST_CATCH|TEST_FAIL|TEST_IGNORE_ERROR|TEST_IGNORE_OVER|TEST_IGNORE_POSITION|TEST_OR|TEST_PASS|TEST_SUMMARY|TEST_VERBOSE)
+
+#ifdef REG_DISCIPLINE
+
+
+#include <stk.h>
+
+typedef struct Disc_s
+{
+ regdisc_t disc;
+ int ordinal;
+ Sfio_t* sp;
+} Disc_t;
+
+static void*
+compf(const regex_t* re, const char* xstr, size_t xlen, regdisc_t* disc)
+{
+ Disc_t* dp = (Disc_t*)disc;
+
+ return (void*)++dp->ordinal;
+}
+
+static int
+execf(const regex_t* re, void* data, const char* xstr, size_t xlen, const char* sstr, size_t slen, char** snxt, regdisc_t* disc)
+{
+ Disc_t* dp = (Disc_t*)disc;
+
+ sfprintf(dp->sp, "{%-.*s}(%d:%d)", xlen, xstr, (int)data, slen);
+ return atoi(xstr);
+}
+
+static void*
+resizef(void* handle, void* data, size_t size)
+{
+ if (!size)
+ return 0;
+ return stkalloc((Sfio_t*)handle, size);
+}
+
+#endif
+
+#ifndef NiL
+#ifdef __STDC__
+#define NiL 0
+#else
+#define NiL (char*)0
+#endif
+#endif
+
+#define H(x) do{if(html)fprintf(stderr,x);}while(0)
+#define T(x) fprintf(stderr,x)
+
+static void
+help(int html)
+{
+H("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n");
+H("<HTML>\n");
+H("<HEAD>\n");
+H("<TITLE>testregex man document</TITLE>\n");
+H("</HEAD>\n");
+H("<BODY bgcolor=white>\n");
+H("<PRE>\n");
+T("NAME\n");
+T(" testregex - regex(3) test harness\n");
+T("\n");
+T("SYNOPSIS\n");
+T(" testregex [ options ]\n");
+T("\n");
+T("DESCRIPTION\n");
+T(" testregex reads regex(3) test specifications, one per line, from the\n");
+T(" standard input and writes one output line for each failed test. A\n");
+T(" summary line is written after all tests are done. Each successful\n");
+T(" test is run again with REG_NOSUB. Unsupported features are noted\n");
+T(" before the first test, and tests requiring these features are\n");
+T(" silently ignored.\n");
+T("\n");
+T("OPTIONS\n");
+T(" -c catch signals and non-terminating calls\n");
+T(" -e ignore error return mismatches\n");
+T(" -h list help on standard error\n");
+T(" -n do not repeat successful tests with regnexec()\n");
+T(" -o ignore match[] overrun errors\n");
+T(" -p ignore negative position mismatches\n");
+T(" -s use stack instead of malloc\n");
+T(" -x do not repeat successful tests with REG_NOSUB\n");
+T(" -v list each test line\n");
+T(" -A list failed test lines with actual answers\n");
+T(" -B list all test lines with actual answers\n");
+T(" -F list failed test lines\n");
+T(" -P list passed test lines\n");
+T(" -S output one summary line\n");
+T("\n");
+T("INPUT FORMAT\n");
+T(" Input lines may be blank, a comment beginning with #, or a test\n");
+T(" specification. A specification is five fields separated by one\n");
+T(" or more tabs. NULL denotes the empty string and NIL denotes the\n");
+T(" 0 pointer.\n");
+T("\n");
+T(" Field 1: the regex(3) flags to apply, one character per REG_feature\n");
+T(" flag. The test is skipped if REG_feature is not supported by the\n");
+T(" implementation. If the first character is not [BEASKL] then the\n");
+T(" specification is a global control line. One or more of [BEASKL] may be\n");
+T(" specified; the test will be repeated for each mode.\n");
+T("\n");
+T(" B basic BRE (grep, ed, sed)\n");
+T(" E REG_EXTENDED ERE (egrep)\n");
+T(" A REG_AUGMENTED ARE (egrep with negation)\n");
+T(" S REG_SHELL SRE (sh glob)\n");
+T(" K REG_SHELL|REG_AUGMENTED KRE (ksh glob)\n");
+T(" L REG_LITERAL LRE (fgrep)\n");
+T("\n");
+T(" a REG_LEFT|REG_RIGHT implicit ^...$\n");
+T(" b REG_NOTBOL lhs does not match ^\n");
+T(" c REG_COMMENT ignore space and #...\\n\n");
+T(" d REG_SHELL_DOT explicit leading . match\n");
+T(" e REG_NOTEOL rhs does not match $\n");
+T(" f REG_MULTIPLE multiple \\n separated patterns\n");
+T(" g FNM_LEADING_DIR testfnmatch only -- match until /\n");
+T(" h REG_MULTIREF multiple digit backref\n");
+T(" i REG_ICASE ignore case\n");
+T(" j REG_SPAN . matches \\n\n");
+T(" k REG_ESCAPE \\ to ecape [...] delimiter\n");
+T(" l REG_LEFT implicit ^...\n");
+T(" m REG_MINIMAL minimal match\n");
+T(" n REG_NEWLINE explicit \\n match\n");
+T(" o REG_ENCLOSED (|&) magic inside [@|&](...)\n");
+T(" p REG_SHELL_PATH explicit / match\n");
+T(" q REG_DELIMITED delimited pattern\n");
+T(" r REG_RIGHT implicit ...$\n");
+T(" s REG_SHELL_ESCAPED \\ not special\n");
+T(" t REG_MUSTDELIM all delimiters must be specified\n");
+T(" u standard unspecified behavior -- errors not counted\n");
+T(" w REG_NOSUB no subexpression match array\n");
+T(" x REG_LENIENT let some errors slide\n");
+T(" y REG_LEFT regexec() implicit ^...\n");
+T(" z REG_NULL NULL subexpressions ok\n");
+T(" $ expand C \\c escapes in fields 2 and 3\n");
+T(" / field 2 is a regsubcomp() expression\n");
+T("\n");
+T(" Field 1 control lines:\n");
+T("\n");
+T(" C set LC_COLLATE and LC_CTYPE to locale in field 2\n");
+T("\n");
+T(" ?test ... output field 5 if passed and != EXPECTED, silent otherwise\n");
+T(" &test ... output field 5 if current and previous passed\n");
+T(" |test ... output field 5 if current passed and previous failed\n");
+T(" ; ... output field 2 if previous failed\n");
+T(" {test ... skip if failed until }\n");
+T(" } end of skip\n");
+T("\n");
+T(" : comment comment copied as output NOTE\n");
+T(" :comment:test :comment: ignored\n");
+T(" N[OTE] comment comment copied as output NOTE\n");
+T(" T[EST] comment comment\n");
+T("\n");
+T(" number use number for nmatch (20 by default)\n");
+T("\n");
+T(" Field 2: the regular expression pattern; SAME uses the pattern from\n");
+T(" the previous specification.\n");
+T("\n");
+T(" Field 3: the string to match.\n");
+T("\n");
+T(" Field 4: the test outcome. This is either one of the posix error\n");
+T(" codes (with REG_ omitted) or the match array, a list of (m,n)\n");
+T(" entries with m and n being first and last+1 positions in the\n");
+T(" field 3 string, or NULL if REG_NOSUB is in effect and success\n");
+T(" is expected. BADPAT is acceptable in place of any regcomp(3)\n");
+T(" error code. The match[] array is initialized to (-2,-2) before\n");
+T(" each test. All array elements from 0 to nmatch-1 must be specified\n");
+T(" in the outcome. Unspecified endpoints (offset -1) are denoted by ?.\n");
+T(" Unset endpoints (offset -2) are denoted by X. {x}(o:n) denotes a\n");
+T(" matched (?{...}) expression, where x is the text enclosed by {...},\n");
+T(" o is the expression ordinal counting from 1, and n is the length of\n");
+T(" the unmatched portion of the subject string. If x starts with a\n");
+T(" number then that is the return value of re_execf(), otherwise 0 is\n");
+T(" returned.\n");
+T("\n");
+T(" Field 5: optional comment appended to the report.\n");
+T("\n");
+T("CAVEAT\n");
+T(" If a regex implementation misbehaves with memory then all bets are off.\n");
+T("\n");
+T("CONTRIBUTORS\n");
+T(" Glenn Fowler gsf@research.att.com (ksh strmatch, regex extensions)\n");
+T(" David Korn dgk@research.att.com (ksh glob matcher)\n");
+T(" Doug McIlroy mcilroy@dartmouth.edu (ast regex/testre in C++)\n");
+T(" Tom Lord lord@regexps.com (rx tests)\n");
+T(" Henry Spencer henry@zoo.toronto.edu (original public regex)\n");
+T(" Andrew Hume andrew@research.att.com (gre tests)\n");
+T(" John Maddock John_Maddock@compuserve.com (regex++ tests)\n");
+T(" Philip Hazel ph10@cam.ac.uk (pcre tests)\n");
+T(" Ville Laurikari vl@iki.fi (libtre tests)\n");
+H("</PRE>\n");
+H("</BODY>\n");
+H("</HTML>\n");
+}
+
+#ifndef elementsof
+#define elementsof(x) (sizeof(x)/sizeof(x[0]))
+#endif
+
+#ifndef streq
+#define streq(a,b) (*(a)==*(b)&&!strcmp(a,b))
+#endif
+
+#define HUNG 5
+#define NOTEST (~0)
+
+#ifndef REG_TEST_DEFAULT
+#define REG_TEST_DEFAULT 0
+#endif
+
+#ifndef REG_EXEC_DEFAULT
+#define REG_EXEC_DEFAULT 0
+#endif
+
+static const char* unsupported[] =
+{
+ "BASIC",
+#ifndef REG_EXTENDED
+ "EXTENDED",
+#endif
+#ifndef REG_AUGMENTED
+ "AUGMENTED",
+#endif
+#ifndef REG_SHELL
+ "SHELL",
+#endif
+
+#ifndef REG_COMMENT
+ "COMMENT",
+#endif
+#ifndef REG_DELIMITED
+ "DELIMITED",
+#endif
+#ifndef REG_DISCIPLINE
+ "DISCIPLINE",
+#endif
+#ifndef REG_ESCAPE
+ "ESCAPE",
+#endif
+#ifndef REG_ICASE
+ "ICASE",
+#endif
+#ifndef REG_LEFT
+ "LEFT",
+#endif
+#ifndef REG_LENIENT
+ "LENIENT",
+#endif
+#ifndef REG_LITERAL
+ "LITERAL",
+#endif
+#ifndef REG_MINIMAL
+ "MINIMAL",
+#endif
+#ifndef REG_MULTIPLE
+ "MULTIPLE",
+#endif
+#ifndef REG_MULTIREF
+ "MULTIREF",
+#endif
+#ifndef REG_MUSTDELIM
+ "MUSTDELIM",
+#endif
+#ifndef REG_NEWLINE
+ "NEWLINE",
+#endif
+#ifndef REG_NOTBOL
+ "NOTBOL",
+#endif
+#ifndef REG_NOTEOL
+ "NOTEOL",
+#endif
+#ifndef REG_NULL
+ "NULL",
+#endif
+#ifndef REG_RIGHT
+ "RIGHT",
+#endif
+#ifndef REG_SHELL_DOT
+ "SHELL_DOT",
+#endif
+#ifndef REG_SHELL_ESCAPED
+ "SHELL_ESCAPED",
+#endif
+#ifndef REG_SHELL_GROUP
+ "SHELL_GROUP",
+#endif
+#ifndef REG_SHELL_PATH
+ "SHELL_PATH",
+#endif
+#ifndef REG_SPAN
+ "SPAN",
+#endif
+#if REG_NOSUB & REG_TEST_DEFAULT
+ "SUBMATCH",
+#endif
+#if !_REG_nexec
+ "regnexec",
+#endif
+#if !_REG_subcomp
+ "regsubcomp",
+#endif
+ 0
+};
+
+#ifndef REG_COMMENT
+#define REG_COMMENT NOTEST
+#endif
+#ifndef REG_DELIMITED
+#define REG_DELIMITED NOTEST
+#endif
+#ifndef REG_ESCAPE
+#define REG_ESCAPE NOTEST
+#endif
+#ifndef REG_ICASE
+#define REG_ICASE NOTEST
+#endif
+#ifndef REG_LEFT
+#define REG_LEFT NOTEST
+#endif
+#ifndef REG_LENIENT
+#define REG_LENIENT 0
+#endif
+#ifndef REG_MINIMAL
+#define REG_MINIMAL NOTEST
+#endif
+#ifndef REG_MULTIPLE
+#define REG_MULTIPLE NOTEST
+#endif
+#ifndef REG_MULTIREF
+#define REG_MULTIREF NOTEST
+#endif
+#ifndef REG_MUSTDELIM
+#define REG_MUSTDELIM NOTEST
+#endif
+#ifndef REG_NEWLINE
+#define REG_NEWLINE NOTEST
+#endif
+#ifndef REG_NOTBOL
+#define REG_NOTBOL NOTEST
+#endif
+#ifndef REG_NOTEOL
+#define REG_NOTEOL NOTEST
+#endif
+#ifndef REG_NULL
+#define REG_NULL NOTEST
+#endif
+#ifndef REG_RIGHT
+#define REG_RIGHT NOTEST
+#endif
+#ifndef REG_SHELL_DOT
+#define REG_SHELL_DOT NOTEST
+#endif
+#ifndef REG_SHELL_ESCAPED
+#define REG_SHELL_ESCAPED NOTEST
+#endif
+#ifndef REG_SHELL_GROUP
+#define REG_SHELL_GROUP NOTEST
+#endif
+#ifndef REG_SHELL_PATH
+#define REG_SHELL_PATH NOTEST
+#endif
+#ifndef REG_SPAN
+#define REG_SPAN NOTEST
+#endif
+
+#define REG_UNKNOWN (-1)
+
+#ifndef REG_ENEWLINE
+#define REG_ENEWLINE (REG_UNKNOWN-1)
+#endif
+#ifndef REG_ENULL
+#ifndef REG_EMPTY
+#define REG_ENULL (REG_UNKNOWN-2)
+#else
+#define REG_ENULL REG_EMPTY
+#endif
+#endif
+#ifndef REG_ECOUNT
+#define REG_ECOUNT (REG_UNKNOWN-3)
+#endif
+#ifndef REG_BADESC
+#define REG_BADESC (REG_UNKNOWN-4)
+#endif
+#ifndef REG_EMEM
+#define REG_EMEM (REG_UNKNOWN-5)
+#endif
+#ifndef REG_EHUNG
+#define REG_EHUNG (REG_UNKNOWN-6)
+#endif
+#ifndef REG_EBUS
+#define REG_EBUS (REG_UNKNOWN-7)
+#endif
+#ifndef REG_EFAULT
+#define REG_EFAULT (REG_UNKNOWN-8)
+#endif
+#ifndef REG_EFLAGS
+#define REG_EFLAGS (REG_UNKNOWN-9)
+#endif
+#ifndef REG_EDELIM
+#define REG_EDELIM (REG_UNKNOWN-9)
+#endif
+
+static const struct { int code; char* name; } codes[] =
+{
+ {REG_UNKNOWN, "UNKNOWN"},
+ {REG_NOMATCH, "NOMATCH"},
+ {REG_BADPAT, "BADPAT"},
+ {REG_ECOLLATE, "ECOLLATE"},
+ {REG_ECTYPE, "ECTYPE"},
+ {REG_EESCAPE, "EESCAPE"},
+ {REG_ESUBREG, "ESUBREG"},
+ {REG_EBRACK, "EBRACK"},
+ {REG_EPAREN, "EPAREN"},
+ {REG_EBRACE, "EBRACE"},
+ {REG_BADBR, "BADBR"},
+ {REG_ERANGE, "ERANGE"},
+ {REG_ESPACE, "ESPACE"},
+ {REG_BADRPT, "BADRPT"},
+ {REG_ENEWLINE, "ENEWLINE"},
+ {REG_ENULL, "ENULL"},
+ {REG_ECOUNT, "ECOUNT"},
+ {REG_BADESC, "BADESC"},
+ {REG_EMEM, "EMEM"},
+ {REG_EHUNG, "EHUNG"},
+ {REG_EBUS, "EBUS"},
+ {REG_EFAULT, "EFAULT"},
+ {REG_EFLAGS, "EFLAGS"},
+ {REG_EDELIM, "EDELIM"},
+};
+
+static struct
+{
+ regmatch_t NOMATCH;
+ int errors;
+ int extracted;
+ int ignored;
+ int lineno;
+ int passed;
+ int signals;
+ int unspecified;
+ int verify;
+ int warnings;
+ char* file;
+ char* stack;
+ char* which;
+ jmp_buf gotcha;
+#ifdef REG_DISCIPLINE
+ Disc_t disc;
+#endif
+} state;
+
+static void
+quote(char* s, int len, unsigned long test)
+{
+ unsigned char* u = (unsigned char*)s;
+ unsigned char* e;
+ int c;
+
+ if (!u)
+ printf("NIL");
+ else if (!*u && len <= 1)
+ printf("NULL");
+ else if (test & TEST_EXPAND)
+ {
+ if (len < 0)
+ len = strlen((char*)u);
+ e = u + len;
+ if (test & TEST_DELIMIT)
+ printf("\"");
+ while (u < e)
+ switch (c = *u++)
+ {
+ case '\\':
+ printf("\\\\");
+ break;
+ case '"':
+ if (test & TEST_DELIMIT)
+ printf("\\\"");
+ else
+ printf("\"");
+ break;
+ case '\a':
+ printf("\\a");
+ break;
+ case '\b':
+ printf("\\b");
+ break;
+ case 033:
+ printf("\\e");
+ break;
+ case '\f':
+ printf("\\f");
+ break;
+ case '\n':
+ printf("\\n");
+ break;
+ case '\r':
+ printf("\\r");
+ break;
+ case '\t':
+ printf("\\t");
+ break;
+ case '\v':
+ printf("\\v");
+ break;
+ default:
+ if (!iscntrl(c) && isprint(c))
+ putchar(c);
+ else
+ printf("\\x%02x", c);
+ break;
+ }
+ if (test & TEST_DELIMIT)
+ printf("\"");
+ }
+ else
+ printf("%s", s);
+}
+
+static void
+report(char* comment, char* fun, char* re, char* s, int len, char* msg, int flags, unsigned long test)
+{
+ if (state.file)
+ printf("%s:", state.file);
+ printf("%d:", state.lineno);
+ if (re)
+ {
+ printf(" ");
+ quote(re, -1, test|TEST_DELIMIT);
+ if (s)
+ {
+ printf(" versus ");
+ quote(s, len, test|TEST_DELIMIT);
+ }
+ }
+ if (test & TEST_UNSPECIFIED)
+ {
+ state.unspecified++;
+ printf(" unspecified behavior");
+ }
+ else
+ state.errors++;
+ if (state.which)
+ printf(" %s", state.which);
+ if (flags & REG_NOSUB)
+ printf(" NOSUB");
+ if (fun)
+ printf(" %s", fun);
+ if (comment[strlen(comment)-1] == '\n')
+ printf(" %s", comment);
+ else
+ {
+ printf(" %s: ", comment);
+ if (msg)
+ printf("%s: ", msg);
+ }
+}
+
+static void
+error(regex_t* preg, int code)
+{
+ char* msg;
+ char buf[256];
+
+ switch (code)
+ {
+ case REG_EBUS:
+ msg = "bus error";
+ break;
+ case REG_EFAULT:
+ msg = "memory fault";
+ break;
+ case REG_EHUNG:
+ msg = "did not terminate";
+ break;
+ default:
+ regerror(code, preg, msg = buf, sizeof buf);
+ break;
+ }
+ printf("%s\n", msg);
+}
+
+static void
+bad(char* comment, char* re, char* s, int len, unsigned long test)
+{
+ printf("bad test case ");
+ report(comment, NiL, re, s, len, NiL, 0, test);
+ exit(1);
+}
+
+static int
+escape(char* s)
+{
+ char* b;
+ char* t;
+ char* q;
+ char* e;
+ int c;
+
+ for (b = t = s; (*t = *s); s++, t++)
+ if (*s == '\\')
+ switch (*++s)
+ {
+ case '\\':
+ break;
+ case 'a':
+ *t = '\a';
+ break;
+ case 'b':
+ *t = '\b';
+ break;
+ case 'c':
+ if ((*t = *++s))
+ *t &= 037;
+ else
+ s--;
+ break;
+ case 'e':
+ case 'E':
+ *t = 033;
+ break;
+ case 'f':
+ *t = '\f';
+ break;
+ case 'n':
+ *t = '\n';
+ break;
+ case 'r':
+ *t = '\r';
+ break;
+ case 's':
+ *t = ' ';
+ break;
+ case 't':
+ *t = '\t';
+ break;
+ case 'v':
+ *t = '\v';
+ break;
+ case 'u':
+ case 'x':
+ c = 0;
+ q = c == 'u' ? (s + 5) : (char*)0;
+ e = s + 1;
+ while (!e || !q || s < q)
+ {
+ switch (*++s)
+ {
+ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+ c = (c << 4) + *s - 'a' + 10;
+ continue;
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ c = (c << 4) + *s - 'A' + 10;
+ continue;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ c = (c << 4) + *s - '0';
+ continue;
+ case '{':
+ case '[':
+ if (s != e)
+ {
+ s--;
+ break;
+ }
+ e = 0;
+ continue;
+ case '}':
+ case ']':
+ if (e)
+ s--;
+ break;
+ default:
+ s--;
+ break;
+ }
+ break;
+ }
+ *t = c;
+ break;
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ c = *s - '0';
+ q = s + 2;
+ while (s < q)
+ {
+ switch (*++s)
+ {
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ c = (c << 3) + *s - '0';
+ break;
+ default:
+ q = --s;
+ break;
+ }
+ }
+ *t = c;
+ break;
+ default:
+ *(s + 1) = 0;
+ bad("invalid C \\ escape\n", s - 1, NiL, 0, 0);
+ }
+ return t - b;
+}
+
+static void
+matchoffprint(int off)
+{
+ switch (off)
+ {
+ case -2:
+ printf("X");
+ break;
+ case -1:
+ printf("?");
+ break;
+ default:
+ printf("%d", off);
+ break;
+ }
+}
+
+static void
+matchprint(regmatch_t* match, int nmatch, int nsub, char* ans, unsigned long test)
+{
+ int i;
+
+ for (; nmatch > nsub + 1; nmatch--)
+ if ((match[nmatch-1].rm_so != -1 || match[nmatch-1].rm_eo != -1) && (!(test & TEST_IGNORE_POSITION) || (match[nmatch-1].rm_so >= 0 && match[nmatch-1].rm_eo >= 0)))
+ break;
+ for (i = 0; i < nmatch; i++)
+ {
+ printf("(");
+ matchoffprint(match[i].rm_so);
+ printf(",");
+ matchoffprint(match[i].rm_eo);
+ printf(")");
+ }
+ if (!(test & (TEST_ACTUAL|TEST_BASELINE)))
+ {
+ if (ans)
+ printf(" expected: %s", ans);
+ printf("\n");
+ }
+}
+
+static int
+matchcheck(regmatch_t* match, int nmatch, int nsub, char* ans, char* re, char* s, int len, int flags, unsigned long test)
+{
+ char* p;
+ int i;
+ int m;
+ int n;
+
+ if (streq(ans, "OK"))
+ return test & (TEST_BASELINE|TEST_PASS|TEST_VERIFY);
+ for (i = 0, p = ans; i < nmatch && *p; i++)
+ {
+ if (*p == '{')
+ {
+#ifdef REG_DISCIPLINE
+ char* x;
+
+ x = sfstruse(state.disc.sp);
+ if (strcmp(p, x))
+ {
+ if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ return 0;
+ report("callout failed", NiL, re, s, len, NiL, flags, test);
+ quote(p, -1, test);
+ printf(" expected, ");
+ quote(x, -1, test);
+ printf(" returned\n");
+ }
+#endif
+ break;
+ }
+ if (*p++ != '(')
+ bad("improper answer\n", re, s, -1, test);
+ if (*p == '?')
+ {
+ m = -1;
+ p++;
+ }
+ else
+ m = strtol(p, &p, 10);
+ if (*p++ != ',')
+ bad("improper answer\n", re, s, -1, test);
+ if (*p == '?')
+ {
+ n = -1;
+ p++;
+ }
+ else
+ n = strtol(p, &p, 10);
+ if (*p++ != ')')
+ bad("improper answer\n", re, s, -1, test);
+ if (m!=match[i].rm_so || n!=match[i].rm_eo)
+ {
+ if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY)))
+ {
+ report("failed: match was", NiL, re, s, len, NiL, flags, test);
+ matchprint(match, nmatch, nsub, ans, test);
+ }
+ return 0;
+ }
+ }
+ for (; i < nmatch; i++)
+ {
+ if (match[i].rm_so!=-1 || match[i].rm_eo!=-1)
+ {
+ if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_VERIFY)))
+ {
+ if ((test & TEST_IGNORE_POSITION) && (match[i].rm_so<0 || match[i].rm_eo<0))
+ {
+ state.ignored++;
+ return 0;
+ }
+ if (!(test & TEST_SUMMARY))
+ {
+ report("failed: match was", NiL, re, s, len, NiL, flags, test);
+ matchprint(match, nmatch, nsub, ans, test);
+ }
+ }
+ return 0;
+ }
+ }
+ if (!(test & TEST_IGNORE_OVER) && match[nmatch].rm_so != state.NOMATCH.rm_so)
+ {
+ if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY)))
+ {
+ report("failed: overran match array", NiL, re, s, len, NiL, flags, test);
+ matchprint(match, nmatch + 1, nsub, NiL, test);
+ }
+ return 0;
+ }
+ return 1;
+}
+
+static void
+sigunblock(int s)
+{
+#ifdef SIG_SETMASK
+ int op;
+ sigset_t mask;
+
+ sigemptyset(&mask);
+ if (s)
+ {
+ sigaddset(&mask, s);
+ op = SIG_UNBLOCK;
+ }
+ else op = SIG_SETMASK;
+ sigprocmask(op, &mask, NiL);
+#else
+#ifdef sigmask
+ sigsetmask(s ? (sigsetmask(0L) & ~sigmask(s)) : 0L);
+#endif
+#endif
+}
+
+static void
+gotcha(int sig)
+{
+ int ret;
+
+ signal(sig, gotcha);
+ alarm(0);
+ state.signals++;
+ switch (sig)
+ {
+ case SIGALRM:
+ ret = REG_EHUNG;
+ break;
+ case SIGBUS:
+ ret = REG_EBUS;
+ break;
+ default:
+ ret = REG_EFAULT;
+ break;
+ }
+ sigunblock(sig);
+ longjmp(state.gotcha, ret);
+}
+
+static char*
+my_getline(FILE* fp)
+{
+ static char buf[32 * 1024];
+
+ register char* s = buf;
+ register char* e = &buf[sizeof(buf)];
+ register char* b;
+
+ for (;;)
+ {
+ if (!(b = fgets(s, e - s, fp)))
+ return 0;
+ state.lineno++;
+ s += strlen(s);
+ if (s == b || *--s != '\n' || s == b || *(s - 1) != '\\')
+ {
+ *s = 0;
+ break;
+ }
+ s--;
+ }
+ return buf;
+}
+
+static unsigned long
+note(unsigned long level, char* msg, unsigned long skip, unsigned long test)
+{
+ if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_SUMMARY)) && !skip)
+ {
+ printf("NOTE\t");
+ if (msg)
+ printf("%s: ", msg);
+ printf("skipping lines %d", state.lineno);
+ }
+ return skip | level;
+}
+
+#define TABS(n) &ts[7-((n)&7)]
+
+static char ts[] = "\t\t\t\t\t\t\t";
+
+static unsigned long
+extract(int* tabs, char* spec, char* re, char* s, char* ans, char* msg, char* accept, regmatch_t* match, int nmatch, int nsub, unsigned long skip, unsigned long level, unsigned long test)
+{
+ if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_OK|TEST_PASS|TEST_SUMMARY))
+ {
+ state.extracted = 1;
+ if (test & TEST_OK)
+ {
+ state.passed++;
+ if ((test & TEST_VERIFY) && !(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_SUMMARY)))
+ {
+ if (msg && strcmp(msg, "EXPECTED"))
+ printf("NOTE\t%s\n", msg);
+ return skip;
+ }
+ test &= ~(TEST_PASS|TEST_QUERY);
+ }
+ if (test & (TEST_QUERY|TEST_VERIFY))
+ {
+ if (test & TEST_BASELINE)
+ test &= ~(TEST_BASELINE|TEST_PASS);
+ else
+ test |= TEST_PASS;
+ skip |= level;
+ }
+ if (!(test & TEST_OK))
+ {
+ if (test & TEST_UNSPECIFIED)
+ state.unspecified++;
+ else
+ state.errors++;
+ }
+ if (test & (TEST_PASS|TEST_SUMMARY))
+ return skip;
+ test &= ~TEST_DELIMIT;
+ printf("%s%s", spec, TABS(*tabs++));
+ if ((test & (TEST_BASELINE|TEST_SAME)) == (TEST_BASELINE|TEST_SAME))
+ printf("SAME");
+ else
+ quote(re, -1, test);
+ printf("%s", TABS(*tabs++));
+ quote(s, -1, test);
+ printf("%s", TABS(*tabs++));
+ if (!(test & (TEST_ACTUAL|TEST_BASELINE)) || (!accept && !match))
+ printf("%s", ans);
+ else if (accept)
+ printf("%s", accept);
+ else
+ matchprint(match, nmatch, nsub, NiL, test);
+ if (msg)
+ printf("%s%s", TABS(*tabs++), msg);
+ putchar('\n');
+ }
+ else if (test & TEST_QUERY)
+ skip = note(level, msg, skip, test);
+ else if (test & TEST_VERIFY)
+ state.extracted = 1;
+ return skip;
+}
+
+static int
+catchfree(regex_t* preg, int flags, int* tabs, char* spec, char* re, char* s, char* ans, char* msg, char* accept, regmatch_t* match, int nmatch, int nsub, unsigned long skip, unsigned long level, unsigned long test)
+{
+ int eret;
+
+ if (!(test & TEST_CATCH))
+ {
+ regfree(preg);
+ eret = 0;
+ }
+ else if (!(eret = setjmp(state.gotcha)))
+ {
+ alarm(HUNG);
+ regfree(preg);
+ alarm(0);
+ }
+ else if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ extract(tabs, spec, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test);
+ else
+ {
+ report("failed", "regfree", re, NiL, -1, msg, flags, test);
+ error(preg, eret);
+ }
+ return eret;
+}
+
+int
+old_main(int unused_param_argc, char** argv)
+{
+ int flags;
+ int cflags;
+ int eflags;
+ int nmatch;
+ int nexec;
+ int nstr;
+ int cret;
+ int eret;
+ int nsub;
+ int i;
+ int j;
+ int expected;
+ int got;
+ int locale;
+ int subunitlen = 0;
+ int testno;
+ unsigned long level;
+ unsigned long skip;
+ char* p;
+ char* line;
+ char* spec;
+ char* re;
+ char* s;
+ char* ans;
+ char* msg;
+ char* fun;
+ char* ppat = NULL;
+ char* subunit = NULL;
+ char* version;
+ char* field[6];
+ char* delim[6];
+ FILE* fp;
+ int tabs[6];
+ char unit[64];
+ regmatch_t match[100];
+ regex_t preg;
+
+ static char pat[32 * 1024];
+
+ int nonosub = REG_NOSUB == 0;
+ int nonexec = 0;
+
+ unsigned long test = 0;
+
+ static char* filter[] = { "-", 0 };
+
+ state.NOMATCH.rm_so = state.NOMATCH.rm_eo = -2;
+ p = unit;
+ version = (char*)id + 10;
+ while (p < &unit[sizeof(unit)-1] && (*p = *version++) && !isspace(*p))
+ p++;
+ *p = 0;
+ while ((p = *++argv) && *p == '-')
+ for (;;)
+ {
+ switch (*++p)
+ {
+ case 0:
+ break;
+ case 'c':
+ test |= TEST_CATCH;
+ continue;
+ case 'e':
+ test |= TEST_IGNORE_ERROR;
+ continue;
+ case 'h':
+ case '?':
+ help(0);
+ return 2;
+ case '-':
+ help(p[1] == 'h');
+ return 2;
+ case 'n':
+ nonexec = 1;
+ continue;
+ case 'o':
+ test |= TEST_IGNORE_OVER;
+ continue;
+ case 'p':
+ test |= TEST_IGNORE_POSITION;
+ continue;
+ case 's':
+#ifdef REG_DISCIPLINE
+ if (!(state.stack = stkalloc(stkstd, 0)))
+ fprintf(stderr, "%s: out of space [stack]", unit);
+ state.disc.disc.re_resizef = resizef;
+ state.disc.disc.re_resizehandle = (void*)stkstd;
+#endif
+ continue;
+ case 'x':
+ nonosub = 1;
+ continue;
+ case 'v':
+ test |= TEST_VERBOSE;
+ continue;
+ case 'A':
+ test |= TEST_ACTUAL;
+ continue;
+ case 'B':
+ test |= TEST_BASELINE;
+ continue;
+ case 'F':
+ test |= TEST_FAIL;
+ continue;
+ case 'P':
+ test |= TEST_PASS;
+ continue;
+ case 'S':
+ test |= TEST_SUMMARY;
+ continue;
+ default:
+ fprintf(stderr, "%s: %c: invalid option\n", unit, *p);
+ return 2;
+ }
+ break;
+ }
+ if (!*argv)
+ argv = filter;
+ locale = 0;
+ while ((state.file = *argv++))
+ {
+ if (streq(state.file, "-") || streq(state.file, "/dev/stdin") || streq(state.file, "/dev/fd/0"))
+ {
+ state.file = 0;
+ fp = stdin;
+ }
+ else if (!(fp = fopen(state.file, "r")))
+ {
+ fprintf(stderr, "%s: %s: cannot read\n", unit, state.file);
+ return 2;
+ }
+ testno = state.errors = state.ignored = state.lineno = state.passed =
+ state.signals = state.unspecified = state.warnings = 0;
+ skip = 0;
+ level = 1;
+ if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_SUMMARY)))
+ {
+ printf("TEST\t%s ", unit);
+ if ((s = state.file))
+ {
+ subunit = p = 0;
+ for (;;)
+ {
+ switch (*s++)
+ {
+ case 0:
+ break;
+ case '/':
+ subunit = s;
+ continue;
+ case '.':
+ p = s - 1;
+ continue;
+ default:
+ continue;
+ }
+ break;
+ }
+ if (!subunit)
+ subunit = state.file;
+ if (p < subunit)
+ p = s - 1;
+ subunitlen = p - subunit;
+ printf("%-.*s ", subunitlen, subunit);
+ }
+ else
+ subunit = 0;
+ for (s = version; *s && (*s != ' ' || *(s + 1) != '$'); s++)
+ putchar(*s);
+ if (test & TEST_CATCH)
+ printf(", catch");
+ if (test & TEST_IGNORE_ERROR)
+ printf(", ignore error code mismatches");
+ if (test & TEST_IGNORE_POSITION)
+ printf(", ignore negative position mismatches");
+#ifdef REG_DISCIPLINE
+ if (state.stack)
+ printf(", stack");
+#endif
+ if (test & TEST_VERBOSE)
+ printf(", verbose");
+ printf("\n");
+#ifdef REG_VERSIONID
+ if (regerror(REG_VERSIONID, NiL, pat, sizeof(pat)) > 0)
+ s = pat;
+ else
+#endif
+#ifdef REG_TEST_VERSION
+ s = REG_TEST_VERSION;
+#else
+ s = "regex";
+#endif
+ printf("NOTE\t%s\n", s);
+ if (elementsof(unsupported) > 1)
+ {
+#if (REG_TEST_DEFAULT & (REG_AUGMENTED|REG_EXTENDED|REG_SHELL)) || !defined(REG_EXTENDED)
+ i = 0;
+#else
+ i = REG_EXTENDED != 0;
+#endif
+ for (got = 0; i < elementsof(unsupported) - 1; i++)
+ {
+ if (!got)
+ {
+ got = 1;
+ printf("NOTE\tunsupported: %s", unsupported[i]);
+ }
+ else
+ printf(",%s", unsupported[i]);
+ }
+ if (got)
+ printf("\n");
+ }
+ }
+#ifdef REG_DISCIPLINE
+ state.disc.disc.re_version = REG_VERSION;
+ state.disc.disc.re_compf = compf;
+ state.disc.disc.re_execf = execf;
+ if (!(state.disc.sp = sfstropen()))
+ bad("out of space [discipline string stream]\n", NiL, NiL, 0, 0);
+ preg.re_disc = &state.disc.disc;
+#endif
+ if (test & TEST_CATCH)
+ {
+ signal(SIGALRM, gotcha);
+ signal(SIGBUS, gotcha);
+ signal(SIGSEGV, gotcha);
+ }
+ while ((p = my_getline(fp)))
+ {
+
+ /* parse: */
+
+ line = p;
+ if (*p == ':' && !isspace(*(p + 1)))
+ {
+ while (*++p && *p != ':');
+ if (!*p++)
+ {
+ if (test & TEST_BASELINE)
+ printf("%s\n", line);
+ continue;
+ }
+ }
+ while (isspace(*p))
+ p++;
+ if (*p == 0 || *p == '#' || *p == 'T')
+ {
+ if (test & TEST_BASELINE)
+ printf("%s\n", line);
+ continue;
+ }
+ if (*p == ':' || *p == 'N')
+ {
+ if (test & TEST_BASELINE)
+ printf("%s\n", line);
+ else if (!(test & (TEST_ACTUAL|TEST_FAIL|TEST_PASS|TEST_SUMMARY)))
+ {
+ while (*++p && !isspace(*p));
+ while (isspace(*p))
+ p++;
+ printf("NOTE %s\n", p);
+ }
+ continue;
+ }
+ j = 0;
+ i = 0;
+ field[i++] = p;
+ for (;;)
+ {
+ switch (*p++)
+ {
+ case 0:
+ p--;
+ j = 0;
+ goto checkfield;
+ case '\t':
+ *(delim[i] = p - 1) = 0;
+ j = 1;
+ checkfield:
+ s = field[i - 1];
+ if (streq(s, "NIL"))
+ field[i - 1] = 0;
+ else if (streq(s, "NULL"))
+ *s = 0;
+ while (*p == '\t')
+ {
+ p++;
+ j++;
+ }
+ tabs[i - 1] = j;
+ if (!*p)
+ break;
+ if (i >= elementsof(field))
+ bad("too many fields\n", NiL, NiL, 0, 0);
+ field[i++] = p;
+ /*FALLTHROUGH*/
+ default:
+ continue;
+ }
+ break;
+ }
+ if (!(spec = field[0]))
+ bad("NIL spec\n", NiL, NiL, 0, 0);
+
+ /* interpret: */
+
+ cflags = REG_TEST_DEFAULT;
+ eflags = REG_EXEC_DEFAULT;
+ test &= TEST_GLOBAL;
+ state.extracted = 0;
+ nmatch = 20;
+ nsub = -1;
+ for (p = spec; *p; p++)
+ {
+ if (isdigit(*p))
+ {
+ nmatch = strtol(p, &p, 10);
+ if (nmatch >= elementsof(match))
+ bad("nmatch must be < 100\n", NiL, NiL, 0, 0);
+ p--;
+ continue;
+ }
+ switch (*p)
+ {
+ case 'A':
+ test |= TEST_ARE;
+ continue;
+ case 'B':
+ test |= TEST_BRE;
+ continue;
+ case 'C':
+ if (!(test & TEST_QUERY) && !(skip & level))
+ bad("locale must be nested\n", NiL, NiL, 0, 0);
+ test &= ~TEST_QUERY;
+ if (locale)
+ bad("locale nesting not supported\n", NiL, NiL, 0, 0);
+ if (i != 2)
+ bad("locale field expected\n", NiL, NiL, 0, 0);
+ if (!(skip & level))
+ {
+#if defined(LC_COLLATE) && defined(LC_CTYPE)
+ s = field[1];
+ if (!s || streq(s, "POSIX"))
+ s = "C";
+ if (!(ans = setlocale(LC_COLLATE, s)) || streq(ans, "C") || streq(ans, "POSIX") || !(ans = setlocale(LC_CTYPE, s)) || streq(ans, "C") || streq(ans, "POSIX"))
+ skip = note(level, s, skip, test);
+ else
+ {
+ if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_SUMMARY)))
+ printf("NOTE \"%s\" locale\n", s);
+ locale = level;
+ }
+#else
+ skip = note(level, skip, test, "locales not supported");
+#endif
+ }
+ cflags = NOTEST;
+ continue;
+ case 'E':
+ test |= TEST_ERE;
+ continue;
+ case 'K':
+ test |= TEST_KRE;
+ continue;
+ case 'L':
+ test |= TEST_LRE;
+ continue;
+ case 'S':
+ test |= TEST_SRE;
+ continue;
+
+ case 'a':
+ cflags |= REG_LEFT|REG_RIGHT;
+ continue;
+ case 'b':
+ eflags |= REG_NOTBOL;
+ continue;
+ case 'c':
+ cflags |= REG_COMMENT;
+ continue;
+ case 'd':
+ cflags |= REG_SHELL_DOT;
+ continue;
+ case 'e':
+ eflags |= REG_NOTEOL;
+ continue;
+ case 'f':
+ cflags |= REG_MULTIPLE;
+ continue;
+ case 'g':
+ cflags |= NOTEST;
+ continue;
+ case 'h':
+ cflags |= REG_MULTIREF;
+ continue;
+ case 'i':
+ cflags |= REG_ICASE;
+ continue;
+ case 'j':
+ cflags |= REG_SPAN;
+ continue;
+ case 'k':
+ cflags |= REG_ESCAPE;
+ continue;
+ case 'l':
+ cflags |= REG_LEFT;
+ continue;
+ case 'm':
+ cflags |= REG_MINIMAL;
+ continue;
+ case 'n':
+ cflags |= REG_NEWLINE;
+ continue;
+ case 'o':
+ cflags |= REG_SHELL_GROUP;
+ continue;
+ case 'p':
+ cflags |= REG_SHELL_PATH;
+ continue;
+ case 'q':
+ cflags |= REG_DELIMITED;
+ continue;
+ case 'r':
+ cflags |= REG_RIGHT;
+ continue;
+ case 's':
+ cflags |= REG_SHELL_ESCAPED;
+ continue;
+ case 't':
+ cflags |= REG_MUSTDELIM;
+ continue;
+ case 'u':
+ test |= TEST_UNSPECIFIED;
+ continue;
+ case 'w':
+ cflags |= REG_NOSUB;
+ continue;
+ case 'x':
+ if (REG_LENIENT)
+ cflags |= REG_LENIENT;
+ else
+ test |= TEST_LENIENT;
+ continue;
+ case 'y':
+ eflags |= REG_LEFT;
+ continue;
+ case 'z':
+ cflags |= REG_NULL;
+ continue;
+
+ case '$':
+ test |= TEST_EXPAND;
+ continue;
+
+ case '/':
+ test |= TEST_SUB;
+ continue;
+
+ case '?':
+ test |= TEST_VERIFY;
+ test &= ~(TEST_AND|TEST_OR);
+ state.verify = state.passed;
+ continue;
+ case '&':
+ test |= TEST_VERIFY|TEST_AND;
+ test &= ~TEST_OR;
+ continue;
+ case '|':
+ test |= TEST_VERIFY|TEST_OR;
+ test &= ~TEST_AND;
+ continue;
+ case ';':
+ test |= TEST_OR;
+ test &= ~TEST_AND;
+ continue;
+
+ case '{':
+ level <<= 1;
+ if (skip & (level >> 1))
+ {
+ skip |= level;
+ cflags = NOTEST;
+ }
+ else
+ {
+ skip &= ~level;
+ test |= TEST_QUERY;
+ }
+ continue;
+ case '}':
+ if (level == 1)
+ bad("invalid {...} nesting\n", NiL, NiL, 0, 0);
+ if ((skip & level) && !(skip & (level>>1)))
+ {
+ if (!(test & (TEST_BASELINE|TEST_SUMMARY)))
+ {
+ if (test & (TEST_ACTUAL|TEST_FAIL))
+ printf("}\n");
+ else if (!(test & TEST_PASS))
+ printf("-%d\n", state.lineno);
+ }
+ }
+#if defined(LC_COLLATE) && defined(LC_CTYPE)
+ else if (locale & level)
+ {
+ locale = 0;
+ if (!(skip & level))
+ {
+ s = "C";
+ setlocale(LC_COLLATE, s);
+ setlocale(LC_CTYPE, s);
+ if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_SUMMARY)))
+ printf("NOTE \"%s\" locale\n", s);
+ else if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_PASS))
+ printf("}\n");
+ }
+ else if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL))
+ printf("}\n");
+ }
+#endif
+ level >>= 1;
+ cflags = NOTEST;
+ continue;
+
+ default:
+ bad("bad spec\n", spec, NiL, 0, test);
+ break;
+
+ }
+ break;
+ }
+ if ((cflags|eflags) == NOTEST || ((skip & level) && (test & TEST_BASELINE)))
+ {
+ if (test & TEST_BASELINE)
+ {
+ while (i > 1)
+ *delim[--i] = '\t';
+ printf("%s\n", line);
+ }
+ continue;
+ }
+ if (test & TEST_OR)
+ {
+ if (!(test & TEST_VERIFY))
+ {
+ test &= ~TEST_OR;
+ if (state.passed == state.verify && i > 1)
+ printf("NOTE\t%s\n", field[1]);
+ continue;
+ }
+ else if (state.passed > state.verify)
+ continue;
+ }
+ else if (test & TEST_AND)
+ {
+ if (state.passed == state.verify)
+ continue;
+ state.passed = state.verify;
+ }
+ if (i < 4)
+ bad("too few fields\n", NiL, NiL, 0, test);
+ while (i < elementsof(field))
+ field[i++] = 0;
+ if ((re = field[1]))
+ {
+ if (streq(re, "SAME"))
+ {
+ re = ppat;
+ test |= TEST_SAME;
+ }
+ else
+ {
+ if (test & TEST_EXPAND)
+ escape(re);
+ strcpy(ppat = pat, re);
+ }
+ }
+ else
+ ppat = 0;
+ nstr = -1;
+ if ((s = field[2]) && (test & TEST_EXPAND))
+ {
+ nstr = escape(s);
+#if _REG_nexec
+ if (nstr != strlen(s))
+ nexec = nstr;
+#endif
+ }
+ if (!(ans = field[3]))
+ bad("NIL answer\n", NiL, NiL, 0, test);
+ msg = field[4];
+ fflush(stdout);
+ if (test & TEST_SUB)
+#if _REG_subcomp
+ cflags |= REG_DELIMITED;
+#else
+ continue;
+#endif
+
+ compile:
+
+ if (state.extracted || (skip & level))
+ continue;
+#if !(REG_TEST_DEFAULT & (REG_AUGMENTED|REG_EXTENDED|REG_SHELL))
+#ifdef REG_EXTENDED
+ if (REG_EXTENDED != 0 && (test & TEST_BRE))
+#else
+ if (test & TEST_BRE)
+#endif
+ {
+ test &= ~TEST_BRE;
+ flags = cflags;
+ state.which = "BRE";
+ }
+ else
+#endif
+#ifdef REG_EXTENDED
+ if (test & TEST_ERE)
+ {
+ test &= ~TEST_ERE;
+ flags = cflags | REG_EXTENDED;
+ state.which = "ERE";
+ }
+ else
+#endif
+#ifdef REG_AUGMENTED
+ if (test & TEST_ARE)
+ {
+ test &= ~TEST_ARE;
+ flags = cflags | REG_AUGMENTED;
+ state.which = "ARE";
+ }
+ else
+#endif
+#ifdef REG_LITERAL
+ if (test & TEST_LRE)
+ {
+ test &= ~TEST_LRE;
+ flags = cflags | REG_LITERAL;
+ state.which = "LRE";
+ }
+ else
+#endif
+#ifdef REG_SHELL
+ if (test & TEST_SRE)
+ {
+ test &= ~TEST_SRE;
+ flags = cflags | REG_SHELL;
+ state.which = "SRE";
+ }
+ else
+#ifdef REG_AUGMENTED
+ if (test & TEST_KRE)
+ {
+ test &= ~TEST_KRE;
+ flags = cflags | REG_SHELL | REG_AUGMENTED;
+ state.which = "KRE";
+ }
+ else
+#endif
+#endif
+ {
+ if (test & (TEST_BASELINE|TEST_PASS|TEST_VERIFY))
+ extract(tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test|TEST_OK);
+ continue;
+ }
+ if ((test & (TEST_QUERY|TEST_VERBOSE|TEST_VERIFY)) == TEST_VERBOSE)
+ {
+ printf("test %-3d %s ", state.lineno, state.which);
+ quote(re, -1, test|TEST_DELIMIT);
+ printf(" ");
+ quote(s, nstr, test|TEST_DELIMIT);
+ printf("\n");
+ }
+
+ nosub:
+ fun = "regcomp";
+#if _REG_nexec
+ if (nstr >= 0 && nstr != strlen(s))
+ nexec = nstr;
+
+ else
+#endif
+ nexec = -1;
+ if (state.extracted || (skip & level))
+ continue;
+ if (!(test & TEST_QUERY))
+ testno++;
+#ifdef REG_DISCIPLINE
+ if (state.stack)
+ stkset(stkstd, state.stack, 0);
+ flags |= REG_DISCIPLINE;
+ state.disc.ordinal = 0;
+ sfstrseek(state.disc.sp, 0, SEEK_SET);
+#endif
+ if (!(test & TEST_CATCH))
+ cret = regcomp(&preg, re, flags);
+ else if (!(cret = setjmp(state.gotcha)))
+ {
+ alarm(HUNG);
+ cret = regcomp(&preg, re, flags);
+ alarm(0);
+ }
+#if _REG_subcomp
+ if (!cret && (test & TEST_SUB))
+ {
+ fun = "regsubcomp";
+ p = re + preg.re_npat;
+ if (!(test & TEST_CATCH))
+ cret = regsubcomp(&preg, p, NiL, 0, 0);
+ else if (!(cret = setjmp(state.gotcha)))
+ {
+ alarm(HUNG);
+ cret = regsubcomp(&preg, p, NiL, 0, 0);
+ alarm(0);
+ }
+ if (!cret && *(p += preg.re_npat) && !(preg.re_sub->re_flags & REG_SUB_LAST))
+ {
+ if (catchfree(&preg, flags, tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test))
+ continue;
+ cret = REG_EFLAGS;
+ }
+ }
+#endif
+ if (!cret)
+ {
+ if (!(flags & REG_NOSUB) && nsub < 0 && *ans == '(')
+ {
+ for (p = ans; *p; p++)
+ if (*p == '(')
+ nsub++;
+ else if (*p == '{')
+ nsub--;
+ if (nsub >= 0)
+ {
+ if (test & TEST_IGNORE_OVER)
+ {
+ if (nmatch > nsub)
+ nmatch = nsub + 1;
+ }
+ else if (nsub != preg.re_nsub)
+ {
+ if (nsub > preg.re_nsub)
+ {
+ if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ skip = extract(tabs, line, re, s, ans, msg, "OK", NiL, 0, 0, skip, level, test|TEST_DELIMIT);
+ else
+ {
+ report("re_nsub incorrect", fun, re, NiL, -1, msg, flags, test);
+ printf("at least %d expected, %zd returned\n", nsub, preg.re_nsub);
+ state.errors++;
+ }
+ }
+ else
+ nsub = preg.re_nsub;
+ }
+ }
+ }
+ if (!(test & TEST_SUB) && *ans && *ans != '(' && !streq(ans, "OK") && !streq(ans, "NOMATCH"))
+ {
+ if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ skip = extract(tabs, line, re, s, ans, msg, "OK", NiL, 0, 0, skip, level, test|TEST_DELIMIT);
+ else if (!(test & TEST_LENIENT))
+ {
+ report("failed", fun, re, NiL, -1, msg, flags, test);
+ printf("%s expected, OK returned\n", ans);
+ }
+ catchfree(&preg, flags, tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test);
+ continue;
+ }
+ }
+ else
+ {
+ if (test & TEST_LENIENT)
+ /* we'll let it go this time */;
+ else if (!*ans || ans[0]=='(' || (cret == REG_BADPAT && streq(ans, "NOMATCH")))
+ {
+ got = 0;
+ for (i = 1; i < elementsof(codes); i++)
+ if (cret==codes[i].code)
+ got = i;
+ if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ skip = extract(tabs, line, re, s, ans, msg, codes[got].name, NiL, 0, 0, skip, level, test|TEST_DELIMIT);
+ else
+ {
+ report("failed", fun, re, NiL, -1, msg, flags, test);
+ printf("%s returned: ", codes[got].name);
+ error(&preg, cret);
+ }
+ }
+ else
+ {
+ expected = got = 0;
+ for (i = 1; i < elementsof(codes); i++)
+ {
+ if (streq(ans, codes[i].name))
+ expected = i;
+ if (cret==codes[i].code)
+ got = i;
+ }
+ if (!expected)
+ {
+ if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ skip = extract(tabs, line, re, s, ans, msg, codes[got].name, NiL, 0, 0, skip, level, test|TEST_DELIMIT);
+ else
+ {
+ report("failed: invalid error code", NiL, re, NiL, -1, msg, flags, test);
+ printf("%s expected, %s returned\n", ans, codes[got].name);
+ }
+ }
+ else if (cret != codes[expected].code && cret != REG_BADPAT)
+ {
+ if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ skip = extract(tabs, line, re, s, ans, msg, codes[got].name, NiL, 0, 0, skip, level, test|TEST_DELIMIT);
+ else if (test & TEST_IGNORE_ERROR)
+ state.ignored++;
+ else
+ {
+ report("should fail and did", fun, re, NiL, -1, msg, flags, test);
+ printf("%s expected, %s returned: ", ans, codes[got].name);
+ state.errors--;
+ state.warnings++;
+ error(&preg, cret);
+ }
+ }
+ }
+ goto compile;
+ }
+
+#if _REG_nexec
+ execute:
+ if (nexec >= 0)
+ fun = "regnexec";
+ else
+#endif
+ fun = "regexec";
+
+ for (i = 0; i < elementsof(match); i++)
+ match[i] = state.NOMATCH;
+
+#if _REG_nexec
+ if (nexec >= 0)
+ {
+ eret = regnexec(&preg, s, nexec, nmatch, match, eflags);
+ s[nexec] = 0;
+ }
+ else
+#endif
+ {
+ if (!(test & TEST_CATCH))
+ eret = regexec(&preg, s, nmatch, match, eflags);
+ else if (!(eret = setjmp(state.gotcha)))
+ {
+ alarm(HUNG);
+ eret = regexec(&preg, s, nmatch, match, eflags);
+ alarm(0);
+ }
+ }
+#if _REG_subcomp
+ if ((test & TEST_SUB) && !eret)
+ {
+ fun = "regsubexec";
+ if (!(test & TEST_CATCH))
+ eret = regsubexec(&preg, s, nmatch, match);
+ else if (!(eret = setjmp(state.gotcha)))
+ {
+ alarm(HUNG);
+ eret = regsubexec(&preg, s, nmatch, match);
+ alarm(0);
+ }
+ }
+#endif
+ if (flags & REG_NOSUB)
+ {
+ if (eret)
+ {
+ if (eret != REG_NOMATCH || !streq(ans, "NOMATCH"))
+ {
+ if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ skip = extract(tabs, line, re, s, ans, msg, "NOMATCH", NiL, 0, 0, skip, level, test|TEST_DELIMIT);
+ else
+ {
+ report("REG_NOSUB failed", fun, re, s, nstr, msg, flags, test);
+ error(&preg, eret);
+ }
+ }
+ }
+ else if (streq(ans, "NOMATCH"))
+ {
+ if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ skip = extract(tabs, line, re, s, ans, msg, NiL, match, nmatch, nsub, skip, level, test|TEST_DELIMIT);
+ else
+ {
+ report("should fail and didn't", fun, re, s, nstr, msg, flags, test);
+ error(&preg, eret);
+ }
+ }
+ }
+ else if (eret)
+ {
+ if (eret != REG_NOMATCH || !streq(ans, "NOMATCH"))
+ {
+ if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ skip = extract(tabs, line, re, s, ans, msg, "NOMATCH", NiL, 0, nsub, skip, level, test|TEST_DELIMIT);
+ else
+ {
+ report("failed", fun, re, s, nstr, msg, flags, test);
+ if (eret != REG_NOMATCH)
+ error(&preg, eret);
+ else if (*ans)
+ printf("expected: %s\n", ans);
+ else
+ printf("\n");
+ }
+ }
+ }
+ else if (streq(ans, "NOMATCH"))
+ {
+ if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ skip = extract(tabs, line, re, s, ans, msg, NiL, match, nmatch, nsub, skip, level, test|TEST_DELIMIT);
+ else
+ {
+ report("should fail and didn't", fun, re, s, nstr, msg, flags, test);
+ matchprint(match, nmatch, nsub, NiL, test);
+ }
+ }
+#if _REG_subcomp
+ else if (test & TEST_SUB)
+ {
+ p = preg.re_sub->re_buf;
+ if (strcmp(p, ans))
+ {
+ report("failed", fun, re, s, nstr, msg, flags, test);
+ quote(ans, -1, test|TEST_DELIMIT);
+ printf(" expected, ");
+ quote(p, -1, test|TEST_DELIMIT);
+ printf(" returned\n");
+ }
+ }
+#endif
+ else if (!*ans)
+ {
+ if (match[0].rm_so != state.NOMATCH.rm_so)
+ {
+ if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ skip = extract(tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test);
+ else
+ {
+ report("failed: no match but match array assigned", NiL, re, s, nstr, msg, flags, test);
+ matchprint(match, nmatch, nsub, NiL, test);
+ }
+ }
+ }
+ else if (matchcheck(match, nmatch, nsub, ans, re, s, nstr, flags, test))
+ {
+#if _REG_nexec
+ if (nexec < 0 && !nonexec)
+ {
+ nexec = nstr >= 0 ? nstr : strlen(s);
+ s[nexec] = '\n';
+ testno++;
+ goto execute;
+ }
+#endif
+ if (!(test & (TEST_SUB|TEST_VERIFY)) && !nonosub)
+ {
+ if (catchfree(&preg, flags, tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test))
+ continue;
+ flags |= REG_NOSUB;
+ goto nosub;
+ }
+ if (test & (TEST_BASELINE|TEST_PASS|TEST_VERIFY))
+ skip = extract(tabs, line, re, s, ans, msg, NiL, match, nmatch, nsub, skip, level, test|TEST_OK);
+ }
+ else if (test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS|TEST_QUERY|TEST_SUMMARY|TEST_VERIFY))
+ skip = extract(tabs, line, re, s, ans, msg, NiL, match, nmatch, nsub, skip, level, test|TEST_DELIMIT);
+ if (catchfree(&preg, flags, tabs, line, re, s, ans, msg, NiL, NiL, 0, 0, skip, level, test))
+ continue;
+ goto compile;
+ }
+ if (test & TEST_SUMMARY)
+ printf("tests=%-4d errors=%-4d warnings=%-2d ignored=%-2d unspecified=%-2d signals=%d\n", testno, state.errors, state.warnings, state.ignored, state.unspecified, state.signals);
+ else if (!(test & (TEST_ACTUAL|TEST_BASELINE|TEST_FAIL|TEST_PASS)))
+ {
+ printf("TEST\t%s", unit);
+ if (subunit)
+ printf(" %-.*s", subunitlen, subunit);
+ printf(", %d test%s", testno, testno == 1 ? "" : "s");
+ if (state.ignored)
+ printf(", %d ignored mismatch%s", state.ignored, state.ignored == 1 ? "" : "es");
+ if (state.warnings)
+ printf(", %d warning%s", state.warnings, state.warnings == 1 ? "" : "s");
+ if (state.unspecified)
+ printf(", %d unspecified difference%s", state.unspecified, state.unspecified == 1 ? "" : "s");
+ if (state.signals)
+ printf(", %d signal%s", state.signals, state.signals == 1 ? "" : "s");
+ printf(", %d error%s\n", state.errors, state.errors == 1 ? "" : "s");
+ }
+ if (fp != stdin)
+ fclose(fp);
+ }
+ return state.errors;
+}
+
+int main(int argc, char **argv)
+{
+ static char *param[][4] = {
+ { NULL, "basic.dat" , NULL },
+ { NULL, "categorize.dat" , NULL },
+ { NULL, "forcedassoc.dat" , NULL },
+ { NULL, "-c", "interpretation.dat", NULL },
+ { NULL, "leftassoc.dat" , NULL },
+ { NULL, "-c", "nullsubexpr.dat" , NULL },
+ { NULL, "repetition.dat" , NULL },
+ { NULL, "rightassoc.dat" , NULL },
+ };
+ int r, i;
+
+ if (argv[1])
+ return old_main(argc, argv);
+
+ r = 0;
+ for (i = 0; i < sizeof(param) / sizeof(param[0]); i++) {
+ param[i][0] = argv[0];
+ printf("Testing %s\n", param[i][1][0] != '-' ? param[i][1] : param[i][2]);
+ r |= old_main(3 /* not used */, param[i]);
+ }
+ return r;
+}
diff --git a/test/regex/tst-regex2.c b/test/regex/tst-regex2.c
new file mode 100644
index 0000000..bb47d64
--- /dev/null
+++ b/test/regex/tst-regex2.c
@@ -0,0 +1,250 @@
+#define _GNU_SOURCE 1
+
+#include <fcntl.h>
+#include <locale.h>
+#include <regex.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+#include <errno.h>
+
+static int
+do_test(void)
+{
+ static const char *pat[] = {
+ ".?.?.?.?.?.?.?Log\\.13",
+ "(.?)(.?)(.?)(.?)(.?)(.?)(.?)Log\\.13",
+ "((((((((((.?))))))))))((((((((((.?))))))))))((((((((((.?))))))))))"
+ "((((((((((.?))))))))))((((((((((.?))))))))))((((((((((.?))))))))))"
+ "((((((((((.?))))))))))Log\\.13"
+ };
+ char *buf, *string;
+ const char *fname = "tst-regex2.dat";
+ struct stat st;
+ unsigned len;
+ int testno;
+ int exitcode = 0;
+
+ int fd = open(fname, O_RDONLY);
+ if (fd < 0) {
+ printf("Couldn't open %s: %s\n", fname, strerror(errno));
+ return 1;
+ }
+ if (fstat(fd, &st) < 0) {
+ printf("Couldn't fstat %s: %s\n", fname, strerror(errno));
+ return 1;
+ }
+ len = st.st_size;
+ string = buf = malloc(len + 1);
+ if (buf == NULL) {
+ printf("Couldn't allocate %u bytes\n", len + 1);
+ return 1;
+ }
+ if (read(fd, buf, st.st_size) != (ssize_t) st.st_size) {
+ printf("Couldn't read %s\n", fname);
+ return 1;
+ }
+
+ close(fd);
+ buf[len] = '\0';
+
+#if defined __UCLIBC_HAS_XLOCALE__ || !defined __UCLIBC__
+ setlocale(LC_ALL, "de_DE.UTF-8");
+#endif
+
+ for (testno = 0; testno < 2; ++testno) {
+ int i;
+ for (i = 0; i < sizeof(pat) / sizeof(pat[0]); ++i) {
+ struct timeval start, stop;
+ regex_t rbuf;
+ int err;
+
+ printf("test %d pattern %d '%s'\n", testno, i, pat[i]);
+ gettimeofday(&start, NULL);
+
+ err = regcomp(&rbuf, pat[i],
+ REG_EXTENDED | (testno ? REG_NOSUB : 0));
+ if (err != 0) {
+ char errstr[300];
+ regerror(err, &rbuf, errstr, sizeof(errstr));
+ puts(errstr);
+ exitcode = 1;
+ goto contin1;
+ }
+
+ regmatch_t pmatch[71];
+ err = regexec(&rbuf, string, 71, pmatch, 0);
+ if (err == REG_NOMATCH) {
+ puts("regexec failed");
+ exitcode = 1;
+ goto contin1;
+ }
+
+ if (testno == 0) {
+ if (pmatch[0].rm_eo != pmatch[0].rm_so + 13
+ || pmatch[0].rm_eo > len
+ || pmatch[0].rm_so < len - 100
+ || strncmp(string + pmatch[0].rm_so,
+ " ChangeLog.13 for earlier changes",
+ sizeof " ChangeLog.13 for earlier changes" - 1
+ ) != 0
+ ) {
+ puts("regexec without REG_NOSUB did not find the correct match");
+ exitcode = 1;
+ goto contin1;
+ }
+
+ if (i > 0) {
+ int j, k, l;
+ for (j = 0, l = 1; j < 7; ++j) {
+ for (k = 0; k < (i == 1 ? 1 : 10); ++k, ++l) {
+ if (pmatch[l].rm_so != pmatch[0].rm_so + j
+ || pmatch[l].rm_eo != pmatch[l].rm_so + 1
+ ) {
+ printf("pmatch[%d] incorrect\n", l);
+ exitcode = 1;
+ goto contin1;
+ }
+ }
+ }
+ }
+ }
+
+ gettimeofday(&stop, NULL);
+ stop.tv_sec -= start.tv_sec;
+ if (stop.tv_usec < start.tv_usec) {
+ stop.tv_sec--;
+ stop.tv_usec += 1000000;
+ }
+ stop.tv_usec -= start.tv_usec;
+ printf(" %lu.%06lus\n", (unsigned long) stop.tv_sec,
+ (unsigned long) stop.tv_usec);
+ contin1:
+ regfree(&rbuf);
+ }
+ }
+
+ for (testno = 2; testno < 4; ++testno) {
+ int i;
+ for (i = 0; i < sizeof(pat) / sizeof(pat[0]); ++i) {
+ struct timeval start, stop;
+ struct re_pattern_buffer rpbuf;
+ struct re_registers regs;
+ const char *s;
+ int match;
+
+ printf("test %d pattern %d '%s'\n", testno, i, pat[i]);
+ gettimeofday(&start, NULL);
+
+ re_set_syntax(RE_SYNTAX_POSIX_EGREP
+ | (testno == 3 ? RE_NO_SUB : 0));
+ memset(&rpbuf, 0, sizeof(rpbuf));
+ s = re_compile_pattern(pat[i], strlen(pat[i]), &rpbuf);
+ if (s != NULL) {
+ printf("%s\n", s);
+ exitcode = 1;
+ goto contin2;
+ }
+
+ memset(&regs, 0, sizeof(regs));
+ match = re_search(&rpbuf, string, len, 0, len, &regs);
+ if (match < 0) {
+ printf("re_search failed (err:%d)\n", match);
+ exitcode = 1;
+ goto contin2;
+ }
+ if (match + 13 > len) {
+ printf("re_search: match+13 > len (%d > %d)\n", match + 13, len);
+ exitcode = 1;
+ goto contin2;
+ }
+ if (match < len - 100) {
+ printf("re_search: match < len-100 (%d < %d)\n", match, len - 100);
+ exitcode = 1;
+ goto contin2;
+ }
+ if (strncmp(string + match, " ChangeLog.13 for earlier changes",
+ sizeof(" ChangeLog.13 for earlier changes") - 1
+ ) != 0
+ ) {
+ printf("re_search did not find the correct match"
+ "(found '%s' instead)\n", string + match);
+ exitcode = 1;
+ goto contin2;
+ }
+
+ if (testno == 2) {
+ int expected = 72;
+ if (i == 0)
+ expected = 2;
+ if (i == 1)
+ expected = 9;
+ if (regs.num_regs != expected) {
+ printf("incorrect num_regs %d, expected %d\n", regs.num_regs, expected);
+ exitcode = 1;
+ goto contin2;
+ }
+ if (regs.start[0] != match || regs.end[0] != match + 13) {
+ printf("incorrect regs.{start,end}[0] = { %d, %d },"
+ " expected { %d, %d }\n",
+ regs.start[0], regs.end[0],
+ match, match + 13
+ );
+ exitcode = 1;
+ goto contin2;
+ }
+ if (regs.start[regs.num_regs - 1] != -1
+ || regs.end[regs.num_regs - 1] != -1
+ ) {
+ printf("incorrect regs.{start,end}[num_regs - 1] = { %d, %d },"
+ " expected { -1, -1 }\n",
+ regs.start[regs.num_regs - 1], regs.end[regs.num_regs - 1]
+ );
+ exitcode = 1;
+ goto contin2;
+ }
+
+ if (i > 0) {
+ int j, k, l;
+ for (j = 0, l = 1; j < 7; ++j) {
+ for (k = 0; k < (i == 1 ? 1 : 10); ++k, ++l) {
+ if (regs.start[l] != match + j
+ || regs.end[l] != match + j + 1
+ ) {
+ printf("incorrect regs.{start,end}[%d] = { %d, %d },"
+ " expected { %d, %d }\n",
+ l,
+ regs.start[l], regs.end[l],
+ match + j, match + j + 1
+ );
+ exitcode = 1;
+ goto contin2;
+ }
+ }
+ }
+ }
+ }
+
+ gettimeofday(&stop, NULL);
+ stop.tv_sec -= start.tv_sec;
+ if (stop.tv_usec < start.tv_usec) {
+ stop.tv_sec--;
+ stop.tv_usec += 1000000;
+ }
+ stop.tv_usec -= start.tv_usec;
+ printf(" %lu.%06lus\n", (unsigned long) stop.tv_sec,
+ (unsigned long) stop.tv_usec);
+ contin2:
+ regfree(&rpbuf);
+ }
+ }
+ return exitcode;
+}
+
+#define TIMEOUT 100
+#define TEST_FUNCTION do_test()
+#include "../test-skeleton.c"
diff --git a/test/regex/tst-regex2.dat b/test/regex/tst-regex2.dat
new file mode 100644
index 0000000..ace9f3b
--- /dev/null
+++ b/test/regex/tst-regex2.dat
@@ -0,0 +1,2176 @@
+2002-11-19 Ulrich Drepper <drepper@redhat.com>
+
+ * intl/localealias.c (read_alias_file): Use only about 400 bytes
+ of stack space instead of 16k.
+
+2002-11-18 Wolfram Gloger <wg@malloc.de>
+
+ * malloc/arena.c
+ (ptmalloc_lock_all, ptmalloc_unlock_all, ptmalloc_unlock_all2): Do
+ nothing if not initialized. Bug report from Marcus Brinkmann
+ <Marcus.Brinkmann@ruhr-uni-bochum.de>.
+
+2002-11-19 Roland McGrath <roland@redhat.com>
+
+ * posix/Versions (libc: GLIBC_2.3.2): Add sched_getaffinity and
+ sched_setaffinity.
+
+ * configure.in (libc_cv_gcc_dwarf2_unwind_info check): Use libraries
+ `-lgcc -lgcc_eh -lgcc', not just `-lgcc -lgcc_eh' in link commands for
+ test leading to libc_cv_gcc_dwarf2_unwind_info=no_registry_needed.
+ * configure: Regenerated.
+
+2002-11-19 Ulrich Drepper <drepper@redhat.com>
+
+ * include/dlfcn.h: __libc_dlopen is now a macro calling
+ __libc_dlopen_mode with the extra parameter RTLD_LAZY.
+ (__libc_dlopen_mode): New prototype.
+ * elf/dl-libc.c (__libc_dlopen_mode): Renamed from __libc_dlopen. Add
+ new parameter. Store new parameter in mode field of structure passed
+ to do_dlopen.
+ (struct do_dlopen_args): Add new field mode.
+ (do_dlopen): Pass mode from parameter structure to _dl_open.
+
+2002-11-11 Randolf Chung <tausq@debian.org>
+
+ * sysdeps/unix/sysv/linux/hppa/bits/fcntl.h [__USE_FILE_OFFSET64]
+ (F_GETLK, F_SETLK, F_SETLKW): Define to F_*64 versions.
+ * sysdeps/unix/sysv/linux/hppa/fcntl.c: New file.
+
+ * sysdeps/hppa/fpu/libm-test-ulps: New file (generated).
+
+ * sysdeps/hppa/Makefile (CFLAGS-rtld.c): New variable.
+ Set -mdisable-fpregs for this file.
+
+2002-11-11 Carlos O'Donell <carlos@baldric.uwo.ca>
+
+ * sysdeps/unix/sysv/linux/configure.in:
+ Make 2.4.19 minimum linux kernel for hppa, and add unwind symbols
+ from gcc-3.0 era for backwards compatibility.
+ * sysdeps/unix/sysv/linux/configure: Regenerate.
+
+ * sysdeps/unix/sysv/linux/hppa/sys/ucontext.h:
+ Define mcontext_t as a sigcontext.
+
+2002-11-18 Roland McGrath <roland@redhat.com>
+
+ * dlfcn/dlerror.c (fini): New function, __attribute__ ((destructor)).
+ Free memory in `last_result' if it was used.
+
+ * resolv/nss_dns/dns-network.c (getanswer_r): In BYNAME case, search
+ all aliases for one that matches the "<dotted-quad>.IN-ADDR.ARPA" form.
+ Do the parsing inline instead of copying strings and calling
+ inet_network, and properly skip all alias names not matching the form.
+
+ * manual/pattern.texi (Variable Substitution): Fix # and ## examples.
+
+2002-11-17 Ulrich Drepper <drepper@redhat.com>
+
+ * manual/pattern.texi (Wordexp Example): Fix sample code.
+
+ * sysdeps/unix/sysv/linux/i386/clone.S: Initialize word in the
+ childs stack which will be loaded into the %esi register.
+
+2002-11-14 Paul Eggert <eggert@twinsun.com>
+
+ * resolv/nss_dns/dns-network.c (getanswer_r): Check for buffer
+ overflow when skipping the question part and when unpacking aliases.
+
+2002-11-15 Roland McGrath <roland@redhat.com>
+
+ * math/Makefile (libm-calls): Remove s_copysign, s_isinf, s_isnan,
+ s_finite, s_modf, s_scalbn, s_frexp, m_ldexp, s_signbit.
+ Instead add $(calls:s_%=m_%) to get m_* versions of them all.
+
+2002-11-15 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/i386/dl-machine.h (elf_machine_rela): Handle R_386_COPY.
+ * sysdeps/arm/dl-machine.h (elf_machine_rela): Handle R_ARM_COPY.
+
+2002-11-15 Roland McGrath <roland@redhat.com>
+
+ * math/Makefile (libm-calls): Change s_ldexp to m_ldexp.
+ * Makerules ($(+sysdir_pfx)sysd-rules): Emit pattern rules for m_%.[Sc]
+ from sysdeps/.../s_%.[Sc] with commands $(+make-include-of-dep).
+ (+make-include-of-dep): New canned sequence.
+
+ * stdlib/canonicalize.c (__realpath): Check for malloc failure.
+ From Dmitry V. Levin <ldv@altlinux.org>.
+
+2002-11-14 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/generic/errno.c (__libc_errno): Remove alias.
+ * inet/herrno.c (__libc_h_errno): Likewise.
+ * resolv/res_libc.c (__libc_res): Likewise.
+ [USE___THREAD]: Use this in place of [USE_TLS && HAVE___THREAD].
+ (__res_state) [! USE___THREAD]: Don't define as weak.
+ * csu/Versions: Revert last change.
+ * resolv/Versions: Revert last change.
+
+ * Makerules ($(common-objpfx)%.make): New pattern rule.
+ * tls.make.c: New file.
+ * Makefile (distribute): Add it.
+
+ * sysdeps/generic/errno.c [! USE___THREAD]
+ [HAVE_ELF && SHARED && DO_VERSIONING] (errno, _errno): Declare these
+ with compat_symbol so they are not link-time visible.
+ [! USE___THREAD] (__libc_errno): New alias for errno.
+ * csu/Versions [!(USE_TLS && HAVE___THREAD)] (libc: GLIBC_PRIVATE):
+ Add __libc_errno here.
+ * inet/herrno.c [USE___THREAD]: Use this conditional
+ in place of [USE_TLS && HAVE___THREAD].
+ [! USE___THREAD] [HAVE_ELF && SHARED && DO_VERSIONING]
+ (h_errno, _h_errno): Declare these with compat_symbol so they are not
+ link-time visible.
+ [! USE___THREAD] (__libc_h_errno): New alias for h_errno.
+ * resolv/res_libc.c [! USE___THREAD]
+ [HAVE_ELF && SHARED && DO_VERSIONING] (_res): Likewise.
+ (_res): Use __attribute__ ((section (".bss"))) so we can have an alias.
+ (__libc_res): Define as alias for _res.
+ * resolv/Versions [!(USE_TLS && HAVE___THREAD)] (libc: GLIBC_PRIVATE):
+ Add __libc_h_errno and __libc_res here.
+
+2002-11-14 Jakub Jelinek <jakub@redhat.com>
+
+ * csu/Versions (errno): Move STT_TLS symbol to GLIBC_PRIVATE for now.
+ * resolv/Versions (h_errno, _res): Likewise.
+
+2002-11-14 Roland McGrath <roland@redhat.com>
+
+ * Makerules (%.dynsym): Remove $(objpfx) from target and dep.
+ (%.symlist): Likewise.
+
+2002-11-13 Roland McGrath <roland@redhat.com>
+
+ * scripts/abilist.awk: New file.
+ * Makefile (distribute): Add it.
+ * Makerules ($(objpfx)%.dynsym, $(objpfx)%.symlist): New rules.
+ (tests): Depend on .symlist file for each $(install-lib.so-versioned).
+ [$(subdir) = elf] (tests): Depend on libc.symlist.
+ (generated, common-generated): Add those files.
+
+ * aclocal.m4 (LIBC_PROG_BINUTILS): Check for objdump, set OBJDUMP.
+ * configure: Regenerated.
+ * config.make.in (OBJDUMP): New variable, substituted by configure.
+
+ * malloc/mcheck.c (struct hdr): New members `block' and `magic2'.
+ (mallochook, reallochook): Set them up.
+ (checkhdr): Check HDR->magic2 value.
+ (freehook): Reset HDR->magic2.
+ (memalignhook): New static function.
+ (old_memalign_hook): New static variable.
+ (mcheck, reallochook): Set __memalign_hook to memalignhook.
+
+ * sysdeps/generic/dl-tls.c (_dl_allocate_tls_storage): Zero the space
+ for the new TCB.
+
+2002-11-13 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/x86_64/sigaction.c: Check for visibility
+ attribute.
+ * sysdeps/unix/sysv/linux/i386/sigaction.c: Likewise.
+
+2002-11-11 Paul Eggert <eggert@twinsun.com>
+
+ * manual/crypt.texi (Cryptographic Functions): Mention that
+ the MD5 one-way algorithm is compatible with BSD's.
+
+2002-11-11 Isamu Hasegawa <isamu@yamato.ibm.com>
+
+ * posix/regex_internal.c (re_string_skip_chars): Also return the last
+ wide character.
+ (re_string_reconstruct): Calculate the context by itself when the
+ offset points out of the valid range.
+ (re_string_context_at): Use wide character when MB_CUR_MAX > 1.
+ * posix/regex_internal.h (WIDE_NEWLINE_CHAR): New macro.
+ (IS_WIDE_WORD_CHAR): New macro.
+ (IS_WIDE_NEWLINE): New macro.
+
+2002-11-12 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/x86_64/strchr.S: Don't use one register for two
+ purposes, this fixes a bug noticed by test-strchr.c.
+
+ * sysdeps/x86_64/strcat.S: Fix algorithm to align source pointer
+ correctly.
+
+2002-11-12 Roland McGrath <roland@redhat.com>
+
+ * libio/libioP.h [_LIBC && !SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)]
+ (_G_IO_NO_BACKWARD_COMPAT): Define it.
+
+ * sysdeps/ia64/dl-fptr.c [_LIBC_REENTRANT]: Include <ia64intrin.h>
+ instead of <pt-machine.h>.
+ [_LIBC_REENTRANT] (lock, unlock): Use __sync_lock_* macros instead of
+ testandset.
+ From Ian Wienand <ianw@gelato.unsw.edu.au>.
+
+2002-11-10 Roland McGrath <roland@redhat.com>
+
+ * libio/bug-wfflush.c (do_test): Call rewind instead of fsetpos.
+ Call fputs instead of fwprintf (simpler to follow in debugger).
+
+ * crypt/md5-crypt.c: Doc fix.
+
+ * sysdeps/unix/make-syscalls.sh: Insert $(make-target-directory) at
+ the beginning of generated target commands.
+
+ * csu/Makefile ($(objpfx)crti.o, $(objpfx)crtn.o): Add explicit
+ dependencies for these in case implicit rule search skipped the
+ nonexistent source directory.
+ * sysdeps/gnu/Makefile ($(objpfx)errlist.d): Give this rule all the
+ files with $(object-suffixes) as targets too.
+ * Makerules [no_deps && objpfx] (before-compile): Add $(objpfx).
+ and a target for it using $(make-target-directory).
+
+ * Rules (before-compile): Add $(common-objpfx)bits/stdio-lim.h.
+
+2002-11-10 Roland McGrath <roland@frob.com>
+
+ * sysdeps/unix/sysv/linux/bits/pthreadtypes.h: Moved to ...
+ * sysdeps/generic/bits/pthreadtypes.h: ... here.
+
+ * sysdeps/mach/hurd/fcntl.c (__libc_fcntl): Treat a struct flock with
+ l_start == 0 and l_len == 1 as we do l_len == 0.
+
+2002-11-10 Ulrich Drepper <drepper@redhat.com>
+
+ * po/da.po: Update from translation team.
+
+2002-11-10 Roland McGrath <roland@redhat.com>
+
+ * config.make.in (includedir): New variable, substituted by configure.
+ Reported missing by Jocelyn Fournier <joc@presence-pc.com>.
+ * Makeconfig (includedir): Use $(prefix), not $(exec_prefix).
+
+2002-11-10 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/x86_64/sys/ucontext.h (enum): Add
+ REG_OLDMASK and REG_CR2 to synch with kernel header.
+ (NGREG): Increase.
+
+ * nss/getXXent.c (GETFUNC_NAME): Use union type to avoid strict
+ aliasing problem.
+ * nss/getXXbyYY_r.c (INTERNAL): Likewise.
+ * nss/getnssent_r.c (__nss_getent_r): Likewise.
+ (__nss_setent): Likewise.
+ (__nss_getent_r): Likewise.
+ * inet/getnetgrent_r.c (innetgr): Likewise.
+ (__internal_setnetgrent_reuse): Likewise.
+ (internal_getnetgrent_r): Likewise.
+ * inet/ether_hton.c (ether_hostton): Likewise.
+ * inet/ether_ntoh.c (ether_ntohost): Likewise.
+ * sunrpc/netname.c (netname2user): Likewise.
+ * sunrpc/publickey.c (getpublickey): Likewise.
+ (getsecretkey): Likewise.
+
+2002-11-09 Marcus Brinkmann <marcus@gnu.org>
+
+ * sysdeps/mach/hurd/i386/ioperm.c (ioperm): Correct off by one
+ error in range calculation.
+
+2002-10-09 Jakub Jelinek <jakub@redhat.com>
+
+ * string/test-strspn.c (do_test): Ensure zero termination.
+ * string/test-strpbrk.c (do_test): Likewise.
+ * string/test-strncmp.c (stupid_strncmp): Use strnlen, not strlen.
+ * string/test-strncpy.c (stupid_strncpy): Likewise.
+ * string/test-stpncpy.c (stupid_stpncpy): Likewise.
+
+2002-10-08 Roland McGrath <roland@redhat.com>
+
+ * string/test-string.h (test_init): Fill BUF1 and BUF2 with
+ nonzero characters.
+
+2002-09-22 H.J. Lu <hjl@gnu.org>
+
+ * sysdeps/unix/sysv/linux/mmap64.c (MMAP2_PAGE_SHIFT): Renamed
+ from PAGE_SHIFT. Define if not defined. Check MMAP2_PAGE_SHIFT
+ only if __NR_mmap2 is defined.
+
+ * sysdeps/unix/sysv/linux/powerpc/mmap64.c: Moved to ...
+ * sysdeps/unix/sysv/linux/mmap64.c: ... here.
+ * sysdeps/unix/sysv/linux/hppa/mmap64.c: File removed.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/mmap64.c: FIle removed,
+
+2002-11-08 Jakub Jelinek <jakub@redhat.com>
+
+ * posix/bug-regex13.c (tests): Add new test.
+
+ * string/test-strchr.c (stupid_strchr): New function.
+ (do_random_tests): Make sure the string is zero terminated.
+ * string/test-strpbrk.c (stupid_strpbrk): New function.
+ (do_random_tests): Make sure the string is zero terminated.
+ * string/test-strcmp.c (stupid_strcmp): New function.
+ (do_random_tests): Make sure the strings are zero terminated.
+ * string/test-strspn.c (stupid_strspn): New function.
+ (simple_strspn): Rename rej argument to acc.
+ (do_random_tests): Make sure the string is zero terminated.
+ * string/test-strcspn.c (stupid_strcspn): New function.
+ * string/test-strncpy.c (stupid_strncpy): New function.
+ * string/test-stpncpy.c (stupid_stpncpy): New function.
+ * string/test-strncmp.c (stupid_strncmp): New function.
+ (do_random_tests): Make sure the strings are zero terminated.
+ * string/test-string.h (impl_t): Change test into long.
+ (IMPL): Add __attribute__((aligned (sizeof (void *)))).
+
+2002-11-08 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/ia64/elf/configure.in: Add TLS check.
+ From Ian Wienand <ianw@cse.unsw.edu.au>.
+ * sysdeps/ia64/elf/configure: Regenerated.
+
+2002-11-07 Roland McGrath <roland@redhat.com>
+
+ * libio/fileops.c (_IO_new_file_overflow): Use INTUSE(_IO_do_write) in
+ place of _IO_new_do_write.
+ [_LIBC] (_IO_do_write): Define as macro for _IO_new_do_write and
+ #undef before versioned_symbol use.
+
+2002-11-07 Richard Henderson <rth@redhat.com>
+
+ * configure.in (ASM_ALPHA_NG_SYMBOL_PREFIX): Remove test.
+ * configure: Regenerated.
+ * config.h.in (ASM_ALPHA_NG_SYMBOL_PREFIX): Remove #undef.
+ * sysdeps/alpha/dl-machine.h (TRAMPOLINE_TEMPLATE): Use !samegp.
+ (RTLD_START): Likewise. Access _dl_skip_args, _rtld_local, and
+ _dl_fini via gp-relative relocations.
+ * sysdeps/alpha/fpu/e_sqrt.c: Use !samegp.
+
+ * elf/tls-macros.h: Add alpha versions.
+ * sysdeps/alpha/dl-machine.h (elf_machine_rela): Handle TLS relocs.
+ * sysdeps/unix/alpha/sysdep.S: Support USE___THREAD.
+ * sysdeps/unix/alpha/sysdep.h: Likewise. Add SYSCALL_ERROR_HANDLER.
+ * sysdeps/unix/sysv/linux/alpha/brk.S: Use it.
+ * sysdeps/unix/sysv/linux/alpha/clone.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/getitimer.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/getrusage.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/gettimeofday.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/rt_sigaction.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/select.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/setitimer.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/settimeofday.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/sigsuspend.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/syscall.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/utimes.S: Likewise.
+ * sysdeps/unix/sysv/linux/alpha/wait4.S: Likewise.
+
+ * sysdeps/unix/sysv/linux/alpha/sysdep.h: Re-include protect.
+ Kill argument registers across the inline syscall.
+
+ * sysdeps/unix/sysv/linux/alpha/clone.S: Add user_tid and tls args.
+
+ * linuxthreads/sysdeps/alpha/tls.h: New file.
+ * sysdeps/alpha/dl-tls.h: New file.
+
+2002-10-29 David Mosberger <davidm@hpl.hp.com>
+
+ * sysdeps/ia64/elf/initfini.c [HAVE_INITFINI_ARRAY]
+ (gmon_initializer): New function.
+ (.init prologue): If HAVE_INITFINI_ARRAY is true, don't call
+ __gmon_start__ here. Call it from gmon_initializer() instead.
+
+2002-03-12 H.J. Lu <hjl@gnu.org>
+
+ * elf/Makefile [$(have-initfini-array) = yes] (tests): Add tst-array1,
+ tst-array2, and tst-array3.
+ [$(have-initfini-array) = yes] (tests-static): Add tst-array3.
+ [$(have-initfini-array) = yes] (modules-names): Add tst-array2dep.
+ ($(objpfx)tst-array1.out): New target.
+ ($(objpfx)tst-array2): Likewise.
+ ($(objpfx)tst-array2.out): Likewise.
+ ($(objpfx)tst-array3.out): Likewise.
+ * elf/tst-array1.c: New file.
+ * elf/tst-array1.exp: Likewise.
+ * elf/tst-array2.c: Likewise.
+ * elf/tst-array2dep.c: Likewise.
+ * elf/tst-array2.exp: Likewise.
+ * elf/tst-array3.c: Likewise.
+
+2002-10-28 David Mosberger <davidm@hpl.hp.com>
+
+ * elf/dl-fini.c (_dl_fini): Invoke fini_array in _reverse_ order.
+ Don't add L->l_addr to array entry values.
+
+2002-11-07 Jakub Jelinek <jakub@redhat.com>
+
+ * string/test-string.h: New file.
+ * string/test-strlen.c: New file.
+ * string/test-string.h: New file.
+ * string/test-strcmp.c: New file.
+ * string/test-strchr.c: New file.
+ * string/test-strrchr.c: New file.
+ * string/test-strcpy.c: New file.
+ * string/test-stpcpy.c: New file.
+ * string/test-strncpy.c: New file.
+ * string/test-stpncpy.c: New file.
+ * string/test-strpbrk.c: New file.
+ * string/test-strcspn.c: New file.
+ * string/test-strspn.c: New file.
+ * string/test-strcat.c: New file.
+ * string/test-strncmp.c: New file.
+ * string/test-memchr.c: New file.
+ * string/test-memcmp.c: New file.
+ * string/test-memset.c: New file.
+ * string/test-memcpy.c: New file.
+ * string/test-mempcpy.c: New file.
+ * string/test-memmove.c: New file.
+ * string/Makefile (strop-tests): New variable.
+ (tests): Add strop-tests.
+ (distribute): Add test-string.h.
+
+2002-11-06 Ulrich Drepper <drepper@redhat.com>
+
+ * posix/regcomp.c: Use tabs instead of spaces.
+ * posix/regexec.c: Likewise.
+ * posix/regex_internal.h: Likewise.
+
+ * posix/regcomp.c (re_compile_fastmap_iter): Use __wcrtomb not wctomb.
+
+2002-11-06 Jakub Jelinek <jakub@redhat.com>
+
+ * posix/regcomp.c (re_compile_pattern): Don't set regs_allocated
+ here.
+ (regcomp): Don't set can_be_null here.
+ (re_comp): Clear whole re_comp_buf with the exception of fastmap.
+ (re_compile_internal): Clear can_be_null, set regs_allocated.
+
+ * posix/regcomp.c (re_set_fastmap): New function.
+ (re_compile_fastmap_iter): Use it. Remove redundant type ==
+ COMPLEX_BRACKET check.
+ * posix/regexec.c (re_search_internal): Optimize searching with
+ fastmap. Call re_string_reconstruct even if match_first is
+ smaller than raw_mbs_idx.
+
+2002-11-06 Isamu Hasegawa <isamu@yamato.ibm.com>
+
+ * posix/regcomp (free_dfa_content): Use free_state.
+ * posix/regex_internal.c (re_string_realloc_buffers): Don't edit
+ pointers in case that realloc failed.
+ (re_node_set_merge): Likewise.
+ (register_state): Likewise.
+ (create_newstate_common): Invoke memory release functions in case of
+ error conditions.
+ (create_ci_newstate): Likewise.
+ (create_cd_newstate): Likewise.
+ (free_state): New function.
+ * posix/regexec.c (re_search_internal): Invoke memory release
+ functions in case of error conditions.
+ (sift_states_backward): Likewise.
+ (merge_state_array): Likewise.
+ (add_epsilon_src_nodes): Likewise.
+ (sub_epsilon_src_nodes): Likewise.
+ (search_subexp): Likewise.
+ (sift_states_bkref): Likewise.
+ (transit_state_sb): Likewise.
+ (transit_state_mb): Likewise.
+ (transit_state_bkref_loop): Likewise.
+ (group_nodes_into_DFAstates): Likewise.
+ (push_fail_stack): Don't edit pointers in case that realloc failed.
+ (extend_buffers): Likewise.
+ (match_ctx_add_entry): Likewise.
+
+2002-11-06 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/unix/sysv/linux/mips/configure.in: File removed.
+ * sysdeps/unix/sysv/linux/mips/configure: Likewise.
+
+ * configure.in: Add checks on as and ld for binutils 2.13 or later.
+ * configure: Regenerated.
+
+2002-11-06 Ulrich Drepper <drepper@redhat.com>
+
+ * posix/regcomp.c (regcomp): __re_compile_fastmap can never fail.
+ If re_compile_internal failed free fastmap buffer.
+ (free_dfa_content): Broken out of regfree function. Frees all dfa
+ related data.
+ (regfree): Add free_dfa_content.
+ (re_compile_internal): If any of the called functions fails free
+ all dfa related memory.
+
+2002-11-05 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/sys/sysctl.h: Add ugly hacks to prevent
+ warnings from the kernel headers.
+
+2002-11-05 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/unix/mips/sysdep.h [! __PIC__] (PSEUDO): Add nop after jump.
+ From Johannes Stezenbach <js@convergence.de>.
+
+ * sysdeps/unix/sysv/linux/mips/Versions (libc: GLIBC_2.0): Change
+ #errlist-compat magic comment to give 123 as size.
+ (libc: GLIBC_2.1): Remove this set, moving #errlist-compat magic to ...
+ (libc: GLIBC_2.2): ... here.
+ (libc: GLIBC_2.3): Likewise.
+
+2002-11-05 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/dl-fini.c (_dl_fini): Correct the increment of l_opencount
+ which happens at the beginning so that we can unload modules in
+ __libc_freeres.
+
+2002-11-06 Kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+ * sysdeps/sh/bits/setjmp.h (JB_SIZE): Define only
+ under [__USE_MISC || _ASM].
+
+ * elf/elf.h: Remove the obsolete SH TLS relocations.
+
+2002-11-05 Ulrich Drepper <drepper@redhat.com>
+
+ * posix/regcomp.c (regcomp): Initialize preg->can_be_null to zero.
+
+2002-11-05 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h: Handle
+ __NR_pread64 and __NR_pwrite64.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/pread.c: Remove __NR_pread64
+ and __NR_pwrite64.
+ Revert change to use INLINE_SYSCALL.
+ * sysdeps/unix/sysv/linux/powerpc/pread64.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/pwrite.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/pwrite64.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/ftruncate64.c: Revert change to use
+ INLINE_SYSCALL.
+ * sysdeps/unix/sysv/linux/powerpc/truncate64.c: Likewise.
+
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h (INLINE_SYSCALL):
+ Update clobber list and add a comment about the syscall ABI.
+
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list (s_pread64,
+ s_pwrite64, s_ftruncate, s_truncate): Re-add.
+
+2002-11-05 Jakub Jelinek <jakub@redhat.com>
+
+ * iconv/gconv_dl.c (free_mem): Clear loaded.
+ * locale/loadarchive.c (_nl_archive_subfreeres): Call locale_data's
+ cleanup if any.
+
+2002-11-05 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/fexecve.c: Include <stdio.h>.
+
+ * libio/ioseekoff.c: Remove INTDEF. Define _IO_seekoff_unlocked. Same
+ as old code without locking. _IO_seekoff calls this function after
+ locking the stream.
+ * libio/ioseekpos.c: Likewise for _IO_seekpos.
+ * libio/libioP.h: Replace _IO_seekoff_internal and _IO_seekpos_internal
+ prototypes with _IO_seekoff_unlocked and _IO_seekpos_unlocked
+ prototypes.
+ * libio/iolibio.h (_IO_fseek): Call _IO_seekoff_unlocked instead
+ of _IO_seekoff_internal.
+ (_IO_rewind): Likewise.
+ * libio/ioftell.c: Likewise.
+ * libio/ftello.c: Likewise.
+ * libio/ftello64.c: Likewise.
+ * libio/iofgetpos.c: Likewise.
+ * libio/iofgetpos64.c: Likewise.
+ * libio/oldiofgetpos.c: Likewise.
+ * libio/oldiofgetpos64.c: Likewise.
+ * libio/iofsetpos.c: Call _IO_seekpos_unlocked instead of
+ _IO_seekpos_internal.
+ * libio/iofsetpos64.c: Likewise.
+ * libio/oldiofsetpos.c: Likewise.
+ * libio/oldiofsetpos64.c: Likewise.
+
+2002-11-04 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/unix/sysv/linux/powerpc/chown.c: Use INLINE_SYSCALL macro.
+ * sysdeps/unix/sysv/linux/powerpc/ftruncate64.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/ioctl.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/pread.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/pread64.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/pwrite.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/pwrite64.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/tcgetattr.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/tcsetattr.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/truncate64.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list (s_ioctl,
+ s_chown, s_ftruncate64, s_mmap2, s_pread64, s_pwrite64, s_truncate64,
+ sys_fstat, sys_lstat, sys_mknod, sys_readv, sys_stat, sys_writev):
+ Remove these, no longer used.
+
+2002-11-04 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list (s_ipc,
+ s_llseek, s_readahead, s_execve, s_fcntl, s_fcntl64, s_fstat64,
+ s_getcwd, s_getdents, s_getdents64, s_getpmsg, s_getpriority,
+ s_getrlimit, s_lstat64, s_poll, s_ptrace, s_putpmsg, s_reboot,
+ s_setrlimit, s_sigaction, s_sigpending, s_sigprocmask, s_sigsuspend,
+ s_stat64, s_sysctl, s_ugetrlimit, s_ustat, s_vfork): Remove now unused
+ syscall stubs.
+
+ * sysdeps/unix/sysv/linux/pwrite.c: Fix typo.
+ * sysdeps/unix/sysv/linux/pwrite64.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/pread.c: Handle both __NR_pread64
+ and __NR_pread.
+ * sysdeps/unix/sysv/linux/powerpc/pread64.c: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/pwrite.c: Handle both __NR_pwrite64
+ and __NR_pwrite.
+ * sysdeps/unix/sysv/linux/powerpc/pwrite64.c: Likewise.
+
+2002-11-03 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/generic/ldsodefs.h (struct rtld_global): New member
+ `_dl_tls_static_used'.
+ * sysdeps/generic/libc-tls.c (_dl_tls_static_used): New variable.
+ (__libc_setup_tls): Initialize it. Let the initial value of
+ _dl_tls_static_size indicate some surplus space in the computed value.
+ * elf/dl-open.c (_dl_tls_static_size): New variable.
+ * sysdeps/generic/dl-tls.c (_dl_determine_tlsoffset): Initialize
+ _dl_tls_static_used. Add some surplus space into _dl_tls_static_size.
+ * elf/dl-reloc.c [USE_TLS] (allocate_static_tls): New function.
+ (CHECK_STATIC_TLS): Use it.
+ * elf/dl-close.c (_dl_close): Adjust _dl_tls_static_used when the
+ closed objects occupied a trailing contiguous chunk of static TLS area.
+
+2002-10-18 Bruno Haible <bruno@clisp.org>
+
+ * charmaps/ISO_5428: Use Greek characters introduced in Unicode 3.0.
+
+2002-11-04 Ulrich Drepper <drepper@redhat.com>
+
+ * libio/wfileops.c (_IO_wfile_seekoff): Don't modify _offset and
+ _wide_data->_IO_read_end if adjustment can be made in the current
+ buffer.
+
+ * sysdeps/unix/sysv/linux/fexecve.c: New file.
+
+ * libio/bug-wfflush.c (do_test): Using fseek is not allowed when
+ wide oriented streams are used.
+
+ * nss/getXXent_r.c (ENDFUNC_NAME): Don't do anything if the
+ service hasn't been used [PR libc/4744].
+
+ * include/features.h: Use __STDC_VERSION__ not __STDC_VERSION.
+ Reported by Miloslav Trmac <mitr@volny.cz> [PR libc/4766].
+
+ * manual/examples/dir.c: Don't include <stddef.h>.
+ * manual/examples/select.c: Include <errno.h> for TEMP_FAILURE_RETRY.
+ Reported by Frédéric Delanoy <delanoy_f@yahoo.com>.
+
+2002-11-02 H.J. Lu <hjl@gnu.org>
+
+ * stdio-common/reg-printf.c: Include <stddef.h>.
+
+2002-11-03 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/generic/libc-tls.c: Define _dl_tls_static_used.
+
+ * po/ca.po: Update from translation team.
+ * po/es.po: Likewise.
+
+ * sysdeps/generic/segfault.c (catch_segfault): If HAVE_PROC_SELF
+ is defined write out memory map.
+ * sysdeps/unix/sysv/linux/segfault.c: New file.
+
+2002-11-02 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/unix/sysv/linux/getdents.c (__GETDENTS): Use union type for
+ pointers that can alias.
+ Reported by Daniel Jacobowitz <drow@mvista.com>.
+
+ * sysdeps/unix/bsd/bsd4.4/freebsd/bits/typesizes.h: New file.
+
+2002-11-02 Roland McGrath <roland@redhat.com>
+
+ * manual/filesys.texi (Reading/Closing Directory): Rewrite readdir_r
+ description to be clearer and to say that *RESULT is set to ENTRY.
+
+2002-10-30 Jakub Jelinek <jakub@redhat.com>
+
+ * posix/regexec.c (build_trtable): Alloca or malloc dests_node and
+ dests_ch arrays together. Alloca or malloc dest_states,
+ dest_states_word and dest_states_nl arrays together. Free memory on
+ error exit.
+
+2002-10-29 Daniel Jacobowitz <drow@mvista.com>
+
+ * crypt/crypt_util.c (__init_des_r): Initialize current_salt
+ and current_saltbits.
+
+2002-11-02 Roland McGrath <roland@redhat.com>
+
+ * stdio-common/reg-printf.c: Include <stdlib.h>.
+
+2002-11-02 H.J. Lu <hjl@gnu.org>
+
+ * sysdeps/unix/sysv/linux/mips/syscalls.list (s_execve): Set
+ caller to EXTRA instead of execve.
+
+2002-11-01 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/generic/errno-loc.c [! USE___THREAD]: Use this conditional
+ in place of [!(USE_TLS && HAVE___THREAD)].
+ (__errno_location) [! USE___THREAD]: Define as strong, not weak.
+
+2002-10-31 Roger Sayle <roger@eyesopen.com>
+
+ * sysdeps/i386/soft-fp/sfp-machine.h (_FP_NANFRAC_Q, _FP_NANSIGN_Q):
+ New macros.
+ * sysdeps/x86_64/soft-fp/sfp-machine.h: Likewise.
+
+ * soft-fp/soft-fp.h: Allow sfp-machine.h to define FP_RND_NEAREST
+ without defining FP_ROUNDMODE.
+
+2002-10-29 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/gnu/siglist.c (PTR_SIZE_STR): Remove.
+ (__old_sys_siglist, __old_sys_sigabbrev): Use strong_alias and
+ declare_symbol.
+ * sysdeps/mach/hurd/siglist.h (OLD_SIGLIST_SIZE_STR): Remove.
+ (OLD_SIGLIST_SIZE): Define.
+ * sysdeps/unix/sysv/linux/siglist.h (OLD_SIGLIST_SIZE_STR): Remove.
+ (OLD_SIGLIST_SIZE): Define.
+ * sysdeps/unix/sysv/linux/arm/siglist.c: Remove.
+
+2002-11-01 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/ia64/strncpy.S: Fix recovery code.
+
+2002-10-30 Jakub Jelinek <jakub@redhat.com>
+
+ * include/libc-symbols.h (__libc_freeres_fn_section, libc_freeres_fn):
+ New macros.
+ * elf/dl-close.c (free_mem): Use libc_freeres_fn macro, remove
+ text_set_element.
+ * elf/dl-libc.c (free_mem): Likewise.
+ * iconv/gconv_conf.c (free_mem): Likewise.
+ * iconv/gconv_db.c (free_mem): Likewise.
+ * iconv/gconv_dl.c (free_mem): Likewise.
+ * iconv/gconv_cache.c (free_mem): Likewise.
+ * intl/finddomain.c (free_mem): Likewise.
+ * intl/dcigettext.c (free_mem): Likewise.
+ * locale/setlocale.c (free_mem): Likewise.
+ * misc/fstab.c (fstab_free): Likewise.
+ * nss/nsswitch.c (free_mem): Likewise.
+ * posix/regcomp.c (free_mem): Likewise.
+ * resolv/gai_misc.c (free_res): Likewise.
+ * stdlib/fmtmsg.c (free_mem): Likewise.
+ * sunrpc/clnt_perr.c (free_mem): Likewise.
+ * sysdeps/generic/setenv.c (free_mem): Likewise.
+ * sysdeps/unix/sysv/linux/shm_open.c (freeit): Likewise.
+ * sysdeps/pthread/aio_misc.c (free_res): Likewise.
+ * time/tzset.c (free_mem): Likewise.
+ * malloc/mtrace.c (release_libc_mem): Add __libc_freeres_fn_section.
+ * locale/loadarchive.c (_nl_archive_subfreeres): Likewise.
+ * malloc/set-freeres.c (__libc_freeres): Likewise.
+
+ * login/getutent.c: Include stdlib.h instead of stddef.h.
+ (buffer): Change into pointer to utmp, add libc_freeres_ptr.
+ (__getutent): Allocate buffer the first time it is run.
+ * login/getutid.c: Include stdlib.h instead of stddef.h.
+ (buffer): Change into pointer to utmp, add libc_freeres_ptr.
+ (__getutid): Allocate buffer the first time it is run.
+ * login/getutline.c: Include stdlib.h instead of stddef.h.
+ (buffer): Change into pointer to utmp, add libc_freeres_ptr.
+ (__getutline): Allocate buffer the first time it is run.
+ * malloc/mtrace.c (malloc_trace_buffer): Change into char *.
+ (mtrace): Allocate malloc_trace_buffer.
+ * resolv/nsap_addr.c (inet_nsap_ntoa): Decrease size of tmpbuf.
+ * resolv/ns_print.c (ns_sprintrrf): Decrease size of t.
+ * string/strerror.c: Include libintl.h and errno.h.
+ (buf): New variable.
+ (strerror): Only allocate buffer if actually needed (unknown error).
+ * time/tzfile.c (transitions): Add libc_freeres_ptr.
+ (freeres): Remove.
+
+2002-10-25 Jakub Jelinek <jakub@redhat.com>
+
+ * include/libc-symbols.h (libc_freeres_ptr): New macro.
+ * malloc/set-freeres.c (__libc_freeres_ptrs): Define using
+ symbol_set_define.
+ (__libc_freeres): Free all pointers in that section.
+ * Makerules (build-shlib): Add $(LDSEDCMD-$(@F:lib%.so=%).so) to sed
+ commands when creating .lds script.
+ (LDSEDCMD-c.so): New variable.
+ * inet/rcmd.c (ahostbuf): Change into char *. Add libc_freeres_ptr.
+ (rcmd_af): Use strdup to allocate ahostbuf.
+ * inet/rexec.c (ahostbuf): Change into char *. Add libc_freeres_ptr.
+ (rexec_af): Use strdup to allocate ahostbuf.
+ * stdio-common/reg-printf.c (printf_funcs): Remove.
+ (__printf_arginfo_table): Change into printf_arginfo_function **.
+ Add libc_freeres_ptr.
+ (__register_printf_function): Allocate __printf_arginfo_table
+ and __printf_function_table the first time it is called.
+ * stdio-common/printf-parse.h (__printf_arginfo_table): Change into
+ printf_arginfo_function **.
+ (parse_one_spec): Add __builtin_expect.
+ * grp/fgetgrent.c (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * inet/getnetgrent.c (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * intl/localealias.c (libc_freeres_ptr): Define if !_LIBC.
+ (string_space, map): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * misc/efgcvt.c (FCVT_BUFPTR): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * misc/mntent.c (getmntent_buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * crypt/md5-crypt.c (libc_freeres_ptr): Define if !_LIBC.
+ (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove for _LIBC.
+ * nss/getXXbyYY.c (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * nss/getXXent.c (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * pwd/fgetpwent.c (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * resolv/res_hconf.c (ifaddrs): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * shadow/fgetspent.c (buffer): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * sysdeps/posix/ttyname.c (getttyname_name): Add libc_freeres_ptr.
+ (free_mem): Remove.
+ * sysdeps/unix/sysv/linux/getsysstats.c (mount_proc): Add
+ libc_freeres_ptr.
+ (free_mem): Remove.
+ * sysdeps/unix/sysv/linux/ttyname.c (getttyname_name, ttyname_buf): Add
+ libc_freeres_ptr.
+ (free_mem): Remove.
+
+2002-10-30 Jakub Jelinek <jakub@redhat.com>
+
+ * malloc/obstack.c [_LIBC] (obstack_free): Change into strong_alias
+ instead of duplicating the whole function in libc.
+
+2002-10-31 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/i386/bits/byteswap.h [__GNUC__ < 2] (__bswap_32):
+ Renamed from __bswap_16 (typo fix). Reported by <dens@stl.sarov.ru>.
+
+2002-10-30 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/Makefile (syscall-%.h): Add -D for each
+ 32bit-predefine when creating .new32 list and -U for each
+ 32bit-predefine when creating .new64 list.
+ * sysdeps/unix/sysv/linux/x86_64/Makefile (32bit-predefine): New.
+
+2002-10-29 Andreas Schwab <schwab@suse.de>
+
+ * sysdeps/generic/allocrtsig.c: Include <testrtsig.h>, not
+ "testrtsig.h". Reported by Daniel Jacobowitz <dan@debian.org>.
+
+2002-10-25 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/unix/sysv/linux/configure.in: Fix typo in last change.
+ * sysdeps/unix/sysv/linux/configure: Regenerated.
+
+ * sysdeps/generic/ldsodefs.h: Remove [! SHARED] conditional from
+ _dl_starting_up decl.
+
+2002-10-20 H.J. Lu <hjl@gnu.org>
+
+ * sysdeps/unix/sysv/linux/configure.in: Don't check
+ /lib/modules/`uname -r`/build/include for kernel headers if
+ cross compiling.
+ * sysdeps/unix/sysv/linux/configure: Regenerated.
+
+2002-10-25 Roland McGrath <roland@redhat.com>
+
+ * math/math.h (M_LOG2El): Correct the value.
+ From Stephen L Moshier <steve@moshier.net>.
+
+ * sysdeps/unix/sysv/linux/init-first.c (init): Remove [! SHARED]
+ conditional from __libc_multiple_libcs access. Remove kludge for weak
+ symbol access with old compilers we no longer support.
+ * sysdeps/unix/sysv/aix/init-first.c (init): Likewise.
+ * sysdeps/generic/libc-start.c (__libc_start_main): Likewise.
+
+2002-10-25 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/posix/sigvec.c [SA_RESETHAND]: Disable wrapper hacks and
+ implement SV_RESETHAND by translating it to SA_RESETHAND.
+
+2002-10-23 Alexandre Oliva <aoliva@redhat.com>
+
+ * elf/dl-reloc.c (_dl_reloc_bad_use): Print the full 32-bit relocation
+ type on ELF64 platforms.
+
+2002-10-24 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/elf.h (R_X86_64_GOTTPOFF): Renamed from r_x86_64_GOTTPOFF.
+
+ * elf/elf.h: Define ELF_NOTE_OS_FREEBSD and NT_TASKSTRUCT.
+
+2002-10-24 Jakub Jelinek <jakub@redhat.com>
+
+ * elf/dl-misc.c: Include <sysdep.h>.
+ (_dl_debug_vdprintf): Only take dl_load_lock if not _dl_starting_up.
+
+ * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h (INTERNAL_SYSCALL,
+ INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros.
+ (INLINE_SYSCALL): Use that.
+ * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h (INTERNAL_SYSCALL,
+ INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros.
+ (INLINE_SYSCALL): Use that.
+ * sysdeps/unix/sysv/linux/x86_64/sysdep.h (INTERNAL_SYSCALL,
+ INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros.
+ (INLINE_SYSCALL): Use that.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Include
+ dl-sysdep.h.
+ (SYSCALL_ERROR_HANDLER): Define RTLD_PRIVATE_ERRNO variant.
+ (__INTERNAL_SYSCALL_STRING): Define.
+ * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Include
+ dl-sysdep.h.
+ (SYSCALL_ERROR_HANDLER): Define RTLD_PRIVATE_ERRNO variant.
+ (__INTERNAL_SYSCALL_STRING): Define.
+ * sysdeps/unix/sysv/linux/sparc/sysdep.h (INLINE_SYSCALL): Pass
+ __SYSCALL_STRING to inline_syscall*.
+ (INTERNAL_SYSCALL, INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO):
+ New macros.
+ (inline_syscall0, inline_syscall1, inline_syscall2, inline_syscall3,
+ inline_syscall4, inline_syscall5, inline_syscall6): Add string
+ argument.
+
+2002-10-24 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/generic/ldsodefs.h (_dl_starting_up): Declare it here.
+ * sysdeps/unix/sysv/linux/init-first.c: Not here.
+ * sysdeps/powerpc/elf/libc-start.c: Or here.
+ * sysdeps/unix/sysv/aix/libc-start.c: Or here.
+ * sysdeps/unix/sysv/aix/start-libc.c: Or here.
+ * sysdeps/unix/sysv/aix/init-first.c: Or here.
+ * sysdeps/generic/libc-start.c: Or here.
+ * sysdeps/unix/sysv/linux/init-first.c (init): Protect _dl_starting_up
+ access with [! SHARED].
+ * sysdeps/unix/sysv/aix/init-first.c (init): Likewise.
+
+ * libio/bug-wfflush.c: New file.
+ * libio/Makefile (tests): Add bug-wfflush.
+
+2002-10-23 Roland McGrath <roland@redhat.com>
+
+ * stdio-common/tst-fphex.c: New file.
+ * stdio-common/Makefile (tests): Add tst-fphex.
+ * sysdeps/generic/printf_fphex.c (__printf_fphex): Fix initialization
+ of WNUMEND. Fix counting of decimal point in WIDTH. Print '0' pad
+ chars always before the value digits.
+ Reported by James Antill <james.antill@redhat.com>.
+
+2002-10-24 Jakub Jelinek <jakub@redhat.com>
+
+ * posix/regcomp.c (re_comp): Call __regfree on re_comp_buf.
+ (free_mem): New function.
+ * posix/Makefile (tests): Add bug-regex14. Add bug-regex14-mem
+ if not cross compiling.
+ (generated): Add bug-regex14-mem and bug-regex14.mtrace.
+ (bug-regex14-ENV): Set.
+ (bug-regex14-mem): New target.
+ * posix/bug-regex14.c: New file.
+
+2002-10-23 Roland McGrath <roland@redhat.com>
+
+ * elf/Makefile ($(objpfx)librtld.map): Use temporary file for output
+ target, so we don't touch it when the link fails.
+
+ * libio/ftello.c (ftello): Use _IO_off64_t for type of POS.
+ Check for the result overflowing off_t and fail with EOVERFLOW.
+ * libio/ioftell.c (_IO_ftell): Likewise.
+ * libio/iofgetpos.c (_IO_new_fgetpos): Likewise.
+
+ * login/logwtmp.c (logwtmp): If sizeof ut_tv != sizeof struct timeval,
+ use a temporary timeval on the stack for gettimeofday and copy it.
+ * login/logout.c (logout): Likewise.
+ Reported by Steven Munroe <sjmunroe@us.ibm.com>.
+
+ * sysdeps/unix/sysv/linux/bits/statfs.h (struct statfs):
+ Use __SWORD_TYPE instead of int for member types.
+ (struct statfs64): Likewise.
+ * sysdeps/unix/sysv/linux/alpha/bits/statfs.h: New file.
+ * sysdeps/unix/sysv/linux/s390/bits/statfs.h: New file.
+ * sysdeps/unix/sysv/linux/ia64/bits/statfs.h: File removed.
+ * sysdeps/unix/sysv/linux/sparc/bits/statfs.h: File removed.
+ * sysdeps/unix/sysv/linux/x86_64/bits/statfs.h: File removed.
+
+ * sysdeps/unix/sysv/linux/sparc/bits/statvfs.h: Moved to ...
+ * sysdeps/unix/sysv/linux/bits/statvfs.h: ... here.
+ (ST_NODIRATIME): Restore fixed value of 2048.
+ * sysdeps/unix/sysv/linux/alpha/bits/statvfs.h: File removed.
+ * sysdeps/unix/sysv/linux/ia64/bits/statvfs.h: File removed.
+
+ Rearranged <bits/types.h> definitions to reduce duplication.
+ * sysdeps/generic/bits/types.h: Rewritten, using macros from
+ <bits/wordsize.h> and new header <bits/typesizes.h>.
+ * posix/Makefile (headers): Add bits/typesizes.h here.
+ * sysdeps/generic/bits/typesizes.h: New file.
+ * sysdeps/unix/sysv/linux/alpha/bits/typesizes.h: New file.
+ * sysdeps/unix/sysv/linux/sparc/bits/typesizes.h: New file.
+ * sysdeps/mach/hurd/bits/typesizes.h: New file.
+ * sysdeps/unix/sysv/linux/alpha/bits/types.h: File removed.
+ * sysdeps/unix/sysv/linux/bits/types.h: File removed.
+ * sysdeps/unix/sysv/linux/ia64/bits/types.h: File removed.
+ * sysdeps/unix/sysv/linux/mips/bits/types.h: File removed.
+ * sysdeps/unix/sysv/linux/s390/bits/types.h: File removed.
+ * sysdeps/unix/sysv/linux/sparc/bits/types.h: File removed.
+ * sysdeps/unix/sysv/linux/x86_64/bits/types.h: File removed.
+ * posix/sys/types.h [__USE_POSIX199506 || __USE_UNIX98]: Include
+ <bits/pthreadtypes.h> here, not in <bits/types.h>.
+ * signal/signal.h: Likewise.
+
+ * streams/stropts.h: Include <bits/xtitypes.h>.
+ * streams/Makefile (headers): Add bits/xtitypes.h here.
+ * sysdeps/generic/bits/xtitypes.h: New file.
+ * sysdeps/s390/bits/xtitypes.h: New file.
+ * sysdeps/ia64/bits/xtitypes.h: New file.
+ * sysdeps/x86_64/bits/xtitypes.h: New file.
+
+ * sysvipc/Makefile (headers): Add bits/ipctypes.h here.
+ * sysdeps/generic/bits/ipctypes.h: New file.
+ * sysdeps/mips/bits/ipctypes.h: New file.
+ * sysdeps/gnu/bits/shm.h: Include <bits/ipctypes.h>.
+ * sysdeps/gnu/bits/msq.h: Likewise.
+ * sysvipc/sys/ipc.h: Likewise.
+
+2002-10-22 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/dl-load.c (struct filebuf): For buf element to have the
+ alignment of ElfXX_Ehdr since this is what will be stored in it.
+
+2002-10-22 Jakub Jelinek <jakub@redhat.com>
+
+ * locale/programs/locarchive.c (add_alias): Change locrec_offset arg
+ into pointer to locrec_offset.
+ (add_locale_to_archive): Adjust callers. Free normalized_name right
+ before returning, not immediately after add_locale, pass it to
+ add_alias if not NULL instead of name. Rename second normalized_name
+ occurence to nnormalized_codeset_name.
+
+ * locale/programs/locarchive.c (enlarge_archive): Make sure
+ string_size is always a multiple of 4.
+ Reported by Andreas Schwab <schwab@suse.de>.
+
+2002-10-21 Andreas Schwab <schwab@suse.de>
+
+ * sysdeps/unix/sysv/linux/ia64/syscalls.list (s_execve): Set
+ caller to EXTRA instead of execve, since the latter has a
+ higher-priority implementation in linuxthreads.
+
+2002-10-21 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/generic/libc-tls.c (__libc_setup_tls): Initialize the static
+ slotinfo list's len member to the proper size, not just 1.
+ Initialize static_map.l_tls_initimage.
+
+ * elf/dl-open.c (dl_open_worker): Fix loop searching for
+ dtv_slotinfo_list element containing new modules' l_tls_modid.
+
+ * elf/tst-tls9.c, elf/tst-tls9-static.c: New files.
+ * elf/tst-tlsmod5.c, elf/tst-tlsmod6.c: New files.
+ * elf/Makefile (tests): Add tst-tls9.
+ (tests-static): Add tst-tls9-static.
+ (tst-tls9-static-ENV): New variable.
+ ($(objpfx)tst-tls9-static, $(objpfx)tst-tls9-static.out): New targets.
+
+ * elf/dl-close.c (remove_slotinfo): Remove an assert; the number of
+ modids used by partially loaded modules being closed can't be known.
+
+2002-10-21 Isamu Hasegawa <isamu@yamato.ibm.com>
+
+ * posix/Makefile: Add a test case for the bug reported by Aharon
+ Robbins <arnold@skeeve.com>.
+ * posix/bug-regex13.c: New file.
+ * posix/regcomp.c (peek_token_bracket): Skip the byte already read.
+
+2002-10-21 Ulrich Drepper <drepper@redhat.com>
+
+ * csu/gmon-start.c: Pretty printing.
+
+2002-10-19 Art Haas <ahaas@neosoft.com>
+
+ * configure.in: Replace AC_CONFIG_HEADER with AC_CONFIG_HEADERS,
+ add AC_HELP_STRING to all AC_ARG_WITH and AC_ARG_ENABLE macros,
+ add autoconf quotes to the AC_CONFIG_AUX_DIR macro.
+ * configure: Regenerated.
+
+2002-10-19 Roland McGrath <roland@redhat.com>
+
+ * configure.in: Call AC_CONFIG_SUBDIRS with empty argument
+ and then set $subdirs directly, because the new Autoconf breaks
+ compatibility in every way imaginable and insists on whining
+ about usage that worked since the dawn of time.
+ * configure: Regenerated.
+
+ * configure: Regenerated (using Autoconf 2.54).
+ * sysdeps/alpha/elf/configure: Likewise.
+ * sysdeps/generic/configure: Likewise.
+ * sysdeps/i386/elf/configure: Likewise.
+ * sysdeps/ia64/elf/configure: Likewise.
+ * sysdeps/mach/hurd/configure: Likewise.
+ * sysdeps/mach/configure: Likewise.
+ * sysdeps/unix/configure: Likewise.
+ * sysdeps/unix/common/configure: Likewise.
+ * sysdeps/unix/sysv/aix/configure: Likewise.
+ * sysdeps/unix/sysv/linux/configure: Likewise.
+ * sysdeps/unix/sysv/linux/mips/configure: Likewise.
+ * sysdeps/x86_64/elf/configure: Likewise.
+
+ * config.make.in: Nix completely-soft nonsense.
+ * configure.in: Likewise. Under --without-fp, use nofpu subdirectory
+ of machine directories instead of fpu subdirectory.
+ * sysdeps/powerpc/soft-fp/Makefile: Remove cruft added in last change.
+ * sysdeps/powerpc/nofpu/Makefile: Put it in this new file instead.
+ * sysdeps/powerpc/soft-fp/sim-full.c: Moved to ...
+ * sysdeps/powerpc/nofpu/sim-full.c: ... here.
+ * sysdeps/powerpc/soft-fp/fraiseexcpt.c: Moved to ...
+ * sysdeps/powerpc/nofpu/fraiseexcpt.c: ... here.
+ * sysdeps/powerpc/soft-fp/fegetexcept.c: Moved to ...
+ * sysdeps/powerpc/nofpu/fegetexcept.c: ... here.
+ * sysdeps/powerpc/soft-fp/fclrexcpt.c: Moved to ...
+ * sysdeps/powerpc/nofpu/fclrexcpt.c: ... here.
+ * sysdeps/powerpc/soft-fp/ftestexcept.c: Moved to ...
+ * sysdeps/powerpc/nofpu/ftestexcept.c: ... here.
+ * sysdeps/powerpc/soft-fp/fgetexcptflg.c: Moved to ...
+ * sysdeps/powerpc/nofpu/fgetexcptflg.c: ... here.
+ * sysdeps/powerpc/soft-fp/fsetexcptflg.c: Moved to ...
+ * sysdeps/powerpc/nofpu/fsetexcptflg.c: ... here.
+ * sysdeps/powerpc/soft-fp/fedisblxcpt.c: Moved to ...
+ * sysdeps/powerpc/nofpu/fedisblxcpt.c: ... here.
+ * sysdeps/powerpc/soft-fp/feenablxcpt.c: Moved to ...
+ * sysdeps/powerpc/nofpu/feenablxcpt.c: ... here.
+ * sysdeps/powerpc/soft-fp/fegetenv.c: Moved to ...
+ * sysdeps/powerpc/nofpu/fegetenv.c: ... here.
+ * sysdeps/powerpc/soft-fp/fesetenv.c: Moved to ...
+ * sysdeps/powerpc/nofpu/fesetenv.c: ... here.
+ * sysdeps/powerpc/soft-fp/fegetround.c: Moved to ...
+ * sysdeps/powerpc/nofpu/fegetround.c: ... here.
+ * sysdeps/powerpc/soft-fp/fesetround.c: Moved to ...
+ * sysdeps/powerpc/nofpu/fesetround.c: ... here.
+ * sysdeps/powerpc/soft-fp/feupdateenv.c: Moved to ...
+ * sysdeps/powerpc/nofpu/feupdateenv.c: ... here.
+ * sysdeps/powerpc/soft-fp/feholdexcpt.c: Moved to ...
+ * sysdeps/powerpc/nofpu/feholdexcpt.c: ... here.
+ * sysdeps/powerpc/soft-fp/fenv_const.c: Moved to ...
+ * sysdeps/powerpc/nofpu/fenv_const.c: ... here.
+ * sysdeps/powerpc/soft-fp/libm-test-ulps: Moved to ...
+ * sysdeps/powerpc/nofpu/libm-test-ulps: ... here.
+ * sysdeps/powerpc/soft-fp/soft-supp.h: Moved to ...
+ * sysdeps/powerpc/nofpu/soft-supp.h: ... here.
+ * sysdeps/powerpc/soft-fp/Versions (libc: GLIBC_2.3.2): Moved to ...
+ * sysdeps/powerpc/nofpu/Versions: ... here, new file.
+
+2002-10-19 Bruno Haible <bruno@clisp.org>
+
+ * sysdeps/unix/bsd/bsd4.4/freebsd/sys/sysmacros.h: New file.
+
+2002-10-18 Roland McGrath <roland@redhat.com>
+
+ * io/Makefile (routines): Add lchmod.
+ * io/sys/stat.h [__USE_BSD] (lchmod): Declare it.
+ * sysdeps/generic/lchmod.c: New file.
+ * sysdeps/mach/hurd/lchmod.c: New file.
+ * io/Versions (libc: GLIBC_2.3.2): New set, add lchmod.
+
+2002-10-18 Art Haas <ahaas@neosoft.com>
+
+ * configure.in: Remove remaining AC_FD_CC macros, and replace
+ AC_FD_MSG with AS_MESSAGE_FD.
+
+2002-10-18 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/powerpc/powerpc32/dl-machine.c (__process_machine_rela): Fix
+ typos: VALUE -> FINALADDR.
+
+ * sysdeps/unix/alpha/sysdep.h (INLINE_SYSCALL, INLINE_SYSCALL1)
+ (inline_syscall_clobbers, inline_syscall0, inline_syscall1)
+ (inline_syscall2, inline_syscall3, inline_syscall4, inline_syscall5)
+ (inline_syscall6): Move these macros ...
+ * sysdeps/unix/sysv/linux/alpha/sysdep.h: ... to here.
+
+ * configure.in (libc_link_dests, libc_link_sources): Remove these
+ variables and the AC_LINK_FILES call.
+
+ * sysdeps/powerpc/soft-fp/Versions (libc: GLIBC_2.3.2): Fix last
+ change to put new symbols here instead of in GLIBC_2.2.
+ * sysdeps/powerpc/Subdirs: Move this file ...
+ * sysdeps/powerpc/soft-fp/Subdirs: ... here.
+
+2002-10-07 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/generic/bits/time.h: Replaced with contents of the
+ sysdeps/unix/sysv/linux/i386/bits/time.h file. All the following
+ files were identical except for the absence of CLOCK_THREAD_CPUTIME_ID
+ and CLOCK_PROCESS_CPUTIME_ID in .../linux/bits/time.h; adding these
+ macros is ok even for architectures that don't now implement them.
+ * sysdeps/mach/hurd/bits/time.h: File removed.
+ * sysdeps/unix/sysv/linux/bits/time.h: File removed.
+ * sysdeps/unix/sysv/linux/i386/bits/time.h: File removed.
+ * sysdeps/unix/sysv/linux/ia64/bits/time.h: File removed.
+ * sysdeps/unix/sysv/linux/sparc/bits/time.h: File removed.
+ * sysdeps/unix/sysv/linux/x86_64/bits/time.h: File removed.
+
+2002-10-18 Jeff Bailey <jbailey@gnu.org>
+
+ * configure.in: Replace obsolete AC_OUTPUT syntax with
+ AC_CONFIG_FILES, AC_CONFIG_COMMANDS, and new-type AC_OUTPUT trio.
+
+ * aclocal.m4 (GLIBC_PROVIDES): Add AC_PROVIDEs for
+ _AS_PATH_SEPARATOR_PREPARE and _AS_TEST_PREPARE.
+
+ * configure.in: Replace AC_FD_CC with AS_MESSAGE_LOG_FD.
+ * sysdeps/alpha/elf/configure.in: Likewise.
+ * sysdeps/i386/elf/configure.in: Likewise.
+ * sysdeps/mach/hurd/configure.in: Likewise.
+ * sysdeps/x86_64/elf/configure.in: Likewise.
+
+ * configure.in: Use AC_CONFIG_SRCDIR and new AC_INIT syntax.
+
+ * sysdeps/alpha/elf/configure.in: Remove unneeded sinclude statement.
+ * sysdeps/generic/configure.in: Likewise.
+ * sysdeps/i386/elf/configure.in: Likewise.
+ * sysdeps/ia64/elf/configure.in: Likewise.
+ * sysdeps/mach/configure.in: Likewise.
+ * sysdeps/mach/hurd/configure.in: Likewise.
+ * sysdeps/unix/configure.in: Likewise.
+ * sysdeps/unix/common/configure.in: Likewise.
+ * sysdeps/unix/sysv/aix/configure.in: Likewise.
+ * sysdeps/unix/sysv/linux/configure.in: Likewise.
+ * sysdeps/unix/sysv/linux/mips/configure.in: Likewise.
+ * sysdeps/x86_64/elf/configure.in: Likewise.
+
+ * aclocal.m4: Use just the bits from AS_INIT that are needed for the
+ GLIBC_PROVIDES. Use plain comment instead of HEADER-COMMENT so
+ that it's obvious when extra autoconf machinery is being dragged in.
+
+2002-10-18 Roland McGrath <roland@redhat.com>
+
+ * configure.in: Remove bogus echo included in
+ 2002-10-08 Aldy Hernandez <aldyh@redhat.com> change.
+ * configure: Regenerated.
+
+2002-10-18 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/pathconf.h (statfs_link_max): Add inline.
+ (statfs_filesize_max): New function.
+ * sysdeps/unix/sysv/linux/linux_fsinfo.h (JFFS_SUPER_MAGIC,
+ JFFS2_SUPER_MAGIC, JFS_SUPER_MAGIC, NTFS_SUPER_MAGIC,
+ ROMFS_SUPER_MAGIC, UDF_SUPER_MAGIC): Define.
+ * sysdeps/unix/sysv/linux/fpathconf.c (__fpathconf): Use
+ statfs_filesize_max.
+ * sysdeps/unix/sysv/linux/pathconf.c (__pathconf): Likewise.
+ * sysdeps/unix/sysv/linux/alpha/fpathconf.c: Removed.
+ * sysdeps/unix/sysv/linux/alpha/pathconf.c: Removed.
+
+2002-10-17 Roland McGrath <roland@redhat.com>
+
+ * configure.in (MIG): Just AC_SUBST it here.
+ * configure: Regenerated.
+ * sysdeps/mach/configure.in (MIG): Do the AC_CHECK_TOOL here.
+ Adding final - argument to all AC_CHECK_HEADER uses for .defs files.
+ * sysdeps/mach/configure: Regenerated.
+
+ * aclocal.m4 (GLIBC_PROVIDES): Add AC_PROVIDE([_AS_TR_SH_PREPARE])
+ and AC_PROVIDE([_AS_CR_PREPARE]).
+
+ * aclocal.m4 (GLIBC_PROVIDES): Add AC_PROVIDE([_AS_ECHO_N_PREPARE]).
+ Remove AC_LANG(C) call, instead just define([_AC_LANG], [C]).
+
+ * elf/dl-support.c: Move _dl_tls_* variables to ...
+ * sysdeps/generic/libc-tls.c: ... here.
+
+ * elf/dl-close.c (remove_slotinfo): Take new argument. If false,
+ allow IDX to be one past the current last slotinfo entry.
+ (_dl_close): Pass IMAP->l_init_called for that parameter.
+
+2002-10-07 Andreas Schwab <schwab@suse.de>
+
+ * aclocal.m4: Fix for autoconf 2.53.
+ * configure.in: Likewise. Require autoconf 2.53.
+
+2002-10-08 Richard Henderson <rth@redhat.com>
+
+ * soft-fp/op-4.h: Handle carry correctly in
+ __FP_FRAC_ADD_3, __FP_FRAC_ADD_4, __FP_FRAC_SUB_3,
+ __FP_FRAC_SUB_4, __FP_FRAC_DEC_3, __FP_FRAC_DEC_4.
+ * soft-fp/op-common.h: New macros _FP_DIV_MEAT_N_loop.
+
+2002-10-08 Aldy Hernandez <aldyh@redhat.com>
+
+ * configure.in: Compute completely-soft.
+ * config.make.in: Make completely-soft available to sub-makes.
+ * sysdeps/powerpc/soft-fp/Makefile: Add gcc-single-routines and
+ gcc-double-routines. Add sim-full.c. Add fenv_const and
+ fe_nomask to libm-support.
+ * sysdeps/powerpc/soft-fp/sim-full.c: New file.
+ * sysdeps/powerpc/soft-fp/fraiseexcpt.c: New file.
+ * sysdeps/powerpc/soft-fp/fegetexcept.c: New file.
+ * sysdeps/powerpc/soft-fp/fclrexcpt.c: New file.
+ * sysdeps/powerpc/soft-fp/ftestexcept.c: New file.
+ * sysdeps/powerpc/soft-fp/fgetexcptflg.c: New file.
+ * sysdeps/powerpc/soft-fp/fsetexcptflg.c: New file.
+ * sysdeps/powerpc/soft-fp/fedisblxcpt.c: New file.
+ * sysdeps/powerpc/soft-fp/feenablxcpt.c: New file.
+ * sysdeps/powerpc/soft-fp/fegetenv.c: New file.
+ * sysdeps/powerpc/soft-fp/fesetenv.c: New file.
+ * sysdeps/powerpc/soft-fp/fegetround.c: New file.
+ * sysdeps/powerpc/soft-fp/fesetround.c: New file.
+ * sysdeps/powerpc/soft-fp/feupdateenv.c: New file.
+ * sysdeps/powerpc/soft-fp/feholdexcpt.c: New file.
+ * sysdeps/powerpc/soft-fp/fenv_const.c: New file.
+ * sysdeps/powerpc/soft-fp/libm-test-ulps: New file.
+ * sysdeps/powerpc/soft-fp/soft-supp.h: New file.
+ * sysdeps/powerpc/soft-fp/Versions: Add libgcc soft-float
+ symbols. Add __sim_disabled_exceptions, __sim_exceptions,
+ __sim_round_mode.
+ * sysdeps/powerpc/soft-float/Dist: Add sim-full.c, fenv_const.c.
+ * sysdeps/powerpc/soft-float/sfp-machine.h: Define
+ FP_HANDLE_EXCEPTIONS.
+ Define FP_ROUNDMODE.
+ Redefine FP_* macros to correspond to the FE_* bit positions.
+ Define FP_DIV_MEAT_S to _FP_DIV_MEAT_1_loop.
+ Define externs for __sim_exceptions, __sim_disabled_exceptions,
+ __sim_round_mode, __simulate_exceptions.
+ * sysdeps/powerpc/fpu/bits/fenv.h: Move file from here...
+ * sysdeps/powerpc/bits/fenv.h: ...to here.
+
+2002-10-06 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/powerpc/powerpc32/dl-machine.c (__process_machine_rela):
+ Store R_PPC_UADDR32 and R_PPC_UADDR16 one byte at a time.
+ Use __builtin_expect for R_PPC_ADDR24 overflow check. Fix
+ R_PPC_ADDR16, R_PPC_UADDR16 and R_PPC_ADDR14* overflow check, use
+ __builtin_expect.
+
+2002-10-15 Jakub Jelinek <jakub@redhat.com>
+
+ * include/resolv.h (__libc_res_nquery, __libc_res_nsearch,
+ __libc_res_nsend): New prototypes.
+ * resolv/res_query.c (QUERYSIZE): Define.
+ (__libc_res_nquery): Renamed from res_nquery. Added answerp
+ argument. Allocate only QUERYSIZE bytes first, if res_nmkquery
+ fails use MAXPACKET buffer. Call __libc_res_nsend instead of
+ res_nsend, pass answerp.
+ (res_nquery): Changed into wrapper around __libc_res_nquery.
+ (__libc_res_nsearch): Renamed from res_nsearch. Added answerp
+ argument. Call __libc_res_nquerydomain and __libc_res_nquery
+ instead of the non-__libc_ variants, pass them answerp.
+ (res_nsearch): Changed into wrapper around __libc_res_nsearch.
+ (__libc_res_nquerydomain): Renamed from res_nquerydomain.
+ Added answerp argument. Call __libc_res_nquery instead of
+ res_nquery, pass answerp.
+ (res_nquerydomain): Changed into wrapper around
+ __libc_res_nquerydomain.
+ * resolv/res_send.c: Include sys/ioctl.h.
+ (MAXPACKET): Define.
+ (send_vc): Change arguments. Reallocate answer buffer if it is
+ too small.
+ (send_dg): Likewise.
+ (__libc_res_nsend): Renamed from res_nsend. Added ansp argument.
+ Reallocate answer buffer if it is too small and hooks are in use.
+ Adjust calls to send_vc and send_dg.
+ (res_nsend): Changed into wrapper around __libc_res_nsend.
+ * resolv/nss_dns/dns-host.c (_nss_dns_gethostbyname2_r): Allocate
+ just 1K answer buffer on the stack, use __libc_res_nsearch instead
+ of res_nsearch.
+ (_nss_dns_gethostbyaddr_r): Similarly with __libc_res_nquery.
+ * resolv/nss_dns/dns-network.c (_nss_dns_getnetbyaddr_r): Likewise.
+ (_nss_dns_getnetbyname_r): Similarly with __libc_res_nsearch.
+ * resolv/gethnamaddr.c (gethostbyname2): Likewise.
+ (gethostbyaddr): Similarly with __libc_res_nquery.
+ * resolv/Versions (libresolv): Export __libc_res_nquery and
+ __libc_res_nsearch at GLIBC_PRIVATE.
+
+2002-10-17 Roland McGrath <roland@redhat.com>
+
+ * configure.in: Grok --without-__thread and disable HAVE___THREAD.
+ * configure: Regenerated.
+
+ * sysdeps/x86_64/dl-machine.h (elf_machine_rela): Do CHECK_STATIC_TLS
+ before performing the reloc, not after.
+ * sysdeps/i386/dl-machine.h (elf_machine_rel): Likewise.
+
+2002-10-17 Ulrich Drepper <drepper@redhat.com>
+
+ * locale/programs/locale.c (write_locales): Use 'm' flag in fopen call.
+ * locale/programs/linereader.c (lr_open): Likewise.
+ * locale/programs/charmap-dir.c (charmap_open): Likewise.
+ * locale/programs/locarchive.c (add_locale_to_archive): Likewise.
+
+2002-10-17 Isamu Hasegawa <isamu@yamato.ibm.com>
+
+ * posix/bug-regex11.c: Add a test case for the bug reported by
+ Paolo Bonzini <bonzini@gnu.org>.
+ * posix/regexec.c (sift_states_bkref): Use correct destination of
+ the back reference.
+
+2002-10-17 Roland McGrath <roland@redhat.com>
+
+ * elf/dl-load.c (_dl_map_object_from_fd): Don't check DF_STATIC_TLS.
+ * elf/dl-reloc.c (_dl_relocate_object: CHECK_STATIC_TLS): New macro
+ to signal error if an IE-model TLS reloc resolved to a dlopen'd module.
+ * sysdeps/i386/dl-machine.h (elf_machine_rel, elf_machine_rela):
+ Call it after performing TPOFF relocs.
+ * sysdeps/x86_64/dl-machine.h (elf_machine_rela): Likewise.
+ * sysdeps/sh/dl-machine.h (elf_machine_rela): Likewise.
+ * elf/dl-conflict.c (CHECK_STATIC_TLS): New macro (no-op).
+
+ * elf/dl-close.c (remove_slotinfo): Change asserts so as not to crash
+ when closing a partially-initialized object.
+
+ * elf/dl-load.c (_dl_map_object_from_fd) [! USE_TLS]: Call lose
+ instead of _dl_fatal_printf when we see PT_TLS.
+
+ * Makeconfig (CPPFLAGS): Fix last change to use $(libof-$(<F))
+ instead of $(libof-$<).
+
+2002-10-16 Roland McGrath <roland@redhat.com>
+
+ * cppflags-iterator.mk (CPPFLAGS-$(cpp-src)): Variable removed.
+ instead of += to append, to be sure $(lib) gets expanded at defn time.
+ (libof-$(cpp-src)): New variable, define this instead.
+ * extra-lib.mk (cpp-srcs-left): Reduce duplication in include setup.
+ (lib): Don't use override.
+ (CPPFLAGS-$(lib)): New variable, put -D's here.
+ * Makeconfig (CPPFLAGS): Use basename fn for CPPFLAGS-basename.
+ Also add $(CPPFLAGS-LIB) before the file-specific flags, for each
+ LIB found by $(libof-*) for basename, target, or source.
+ * Makerules (CPPFLAGS-nonlib): New variable.
+ * nscd/Makefile (lib): Set to nonlib when using cppflags-iterator.mk.
+ * locale/Makefile (lib): Likewise.
+ * sunrpc/Makefile (lib): Likewise.
+
+ * sysdeps/unix/sysv/linux/fpathconf.c (LINUX_LINK_MAX): Move macro ...
+ * sysdeps/unix/sysv/linux/linux_fsinfo.h (LINUX_LINK_MAX): ... here.
+ * sysdeps/unix/sysv/linux/pathconf.h: New file.
+ (statfs_link_max): New function, guts from fpathconf.c.
+ * sysdeps/unix/sysv/linux/fpathconf.c: Rewritten using that.
+ * sysdeps/unix/sysv/linux/pathconf.c (__pathconf): Likewise.
+ * sysdeps/unix/sysv/linux/alpha/pathconf.c (__pathconf): Rewritten
+ to use the linux/pathconf.c code by #include rather than duplication.
+ * sysdeps/unix/sysv/linux/alpha/fpathconf.c (__pathconf): Likewise.
+
+2002-10-16 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/x86_64/sysdep.h (SYSCALL_ERROR_HANDLER):
+ Use __libc_errno only for libc itself.
+
+2002-10-16 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/x86_64/_mcount.S: Fix off-by-1 error in argument access.
+
+2002-10-16 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/i386/sysdep.h (SYSCALL_ERROR_HANDLER):
+ Use __libc_errno only for libc itself.
+
+2002-10-15 Roland McGrath <roland@redhat.com>
+ Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/Makefile
+ ($(objpfx)syscall-%.h $(objpfx)syscall-%.d): Take code from
+ sparc/Makefile to produce a bi-arch file as needed.
+ That's now parameterized by the variable $(64bit-predefine).
+ Use LC_ALL=C for `comm' commands in that rule.
+ No longer conditional on [$(no_syscall_list_h)].
+ * sysdeps/unix/sysv/linux/sparc/Makefile: Remove replacement rules.
+ (64bit-predefine): New variable.
+ * sysdeps/unix/sysv/linux/x86_64/Makefile: Likewise.
+ * sysdeps/unix/sysv/linux/s390/Makefile: New file.
+ * sysdeps/unix/sysv/linux/powerpc/Makefile
+ (64bit-predefine): New variable.
+
+2002-10-15 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/unix/sysv/linux/Makefile
+ ($(objpfx)syscall-%.h $(objpfx)syscall-%.d)
+
+ * login/utmp-private.h: Declare __libc_utmp_lock.
+ * sysdeps/unix/getlogin_r.c (getlogin_r): Take __libc_utmp_lock once
+ and call __libc_utmp_jump_table functions directly, instead of using
+ __setutent et al.
+
+ * sysdeps/unix/sysv/linux/configure.in: Use case instead of if.
+ * sysdeps/unix/sysv/linux/configure: Regenerated.
+
+ * sysdeps/gnu/bits/utmp.h: Include <bits/wordsize.h>.
+ (struct lastlog) [__WORDSIZE == 64 && __WORDSIZE_COMPAT32]:
+ Use int32_t for ll_time.
+ (struct utmp) [__WORDSIZE == 64 && __WORDSIZE_COMPAT32]:
+ Use int32_t instead of long int for ut_session.
+ Use an anonymous struct with 32-bit fields for ut_tv.
+ * sysdeps/gnu/bits/utmpx.h: Include <bits/wordsize.h>.
+ (struct utmpx) [__WORDSIZE == 64 && __WORDSIZE_COMPAT32]: Do the same
+ here as in utmp.h for `struct utmp'.
+ * sysdeps/unix/sysv/linux/powerpc/bits/utmp.h: File removed.
+ * sysdeps/unix/sysv/linux/powerpc/bits/utmpx.h: File removed.
+ * sysdeps/unix/sysv/linux/sparc/bits/utmp.h: File removed.
+ * sysdeps/unix/sysv/linux/sparc/bits/utmpx.h: File removed.
+ * sysdeps/unix/sysv/linux/x86_64/bits/utmp.h: File removed.
+ * sysdeps/unix/sysv/linux/x86_64/bits/utmpx.h: File removed.
+
+ * sysdeps/unix/sysv/linux/bits/resource.h: Replaced with the contents
+ of the sysdeps/unix/sysv/linux/i386/bits/resource.h file.
+ All the following files were identical or equivalent to it.
+ * sysdeps/unix/sysv/linux/i386/bits/resource.h: File removed.
+ * sysdeps/unix/sysv/linux/arm/bits/resource.h: File removed.
+ * sysdeps/unix/sysv/linux/cris/bits/resource.h: File removed.
+ * sysdeps/unix/sysv/linux/hppa/bits/resource.h: File removed.
+ * sysdeps/unix/sysv/linux/ia64/bits/resource.h: File removed.
+ * sysdeps/unix/sysv/linux/m68k/bits/resource.h: File removed.
+ * sysdeps/unix/sysv/linux/powerpc/bits/resource.h: File removed.
+ * sysdeps/unix/sysv/linux/s390/bits/resource.h: File removed.
+ * sysdeps/unix/sysv/linux/sh/bits/resource.h: File removed.
+ * sysdeps/unix/sysv/linux/x86_64/bits/resource.h: File removed.
+
+ * sysdeps/unix/sysv/linux/bits/socket.h (struct msghdr): Use size_t
+ instead of int for msg_iovlen, instead of socklen_t for msg_controllen.
+ Other than the previously incorrect sign of msg_iovlen, this is a
+ no-op on 32-bit platforms. On 64-bit platforms it makes this header
+ match their layouts as well, so the following are now identical to it.
+ * sysdeps/unix/sysv/linux/s390/bits/socket.h: File removed.
+ * sysdeps/unix/sysv/linux/sparc/bits/socket.h: File removed.
+ * sysdeps/unix/sysv/linux/x86_64/bits/socket.h: File removed.
+ * sysdeps/unix/sysv/linux/ia64/bits/socket.h: File removed.
+ * sysdeps/unix/sysv/linux/alpha/bits/socket.h: File removed.
+
+2002-10-15 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_VFORK_SYSCALL):
+ Define for 2.4+ kernels.
+
+ * sysdeps/unix/sysv/linux/i386/vfork.S: Optimize for kernels which
+ are known to have the vfork syscall. Don't confuse the CPUs
+ branch prediction unit by jumping to the return address.
+
+ * sysdeps/unix/sysv/linux/alpha/fpathconf.c (__fpathconf): Add
+ support for reiserfs and xfs.
+
+ * sysdeps/unix/sysv/linux/fpathconf.c (__fpathconf): Add case for
+ XFS link count.
+ * sysdeps/unix/sysv/linux/linux_fsinfo.h: Define XFS_SUPER_MAGIC
+ and XFS_LINK_MAX.
+ Patch by Eric Sandeen <sandeen@sgi.com> [PR libc/4706].
+
+2002-10-16 Jakub Jelinek <jakub@redhat.com>
+
+ * include/libc-symbols.h (attribute_tls_model_ie): Define.
+ * include/errno.h (errno): Define to __libc_errno in libc.so.
+ Add attribute_tls_model_ie.
+ * include/netdb.h (h_errno): Define to __libc_h_errno in libc.so.
+ Add attribute_tls_model_ie.
+ * include/resolv.h (_res): Define to __libc_res in libc.so. Add
+ attribute_tls_model_ie.
+ * inet/herrno.c (__libc_h_errno): Add hidden alias to h_errno.
+ (h_errno): Define.
+ * resolv/res_libc.c (__libc_res): Add hidden alias to _res.
+ (_res): Define.
+ * sysdeps/generic/bits/libc-tsd.h (__libc_tsd_define): Add
+ attribute_tls_model_ie.
+ * sysdeps/generic/errno-loc.c (errno): Only undefine if not using
+ __thread.
+ * sysdeps/generic/errno.c (__libc_errno): Add hidden alias to errno.
+ * sysdeps/unix/sysv/linux/i386/sysdep.h (SYSCALL_ERROR_HANDLER): Use
+ __libc_errno in USE___THREAD case.
+ * sysdeps/unix/sysv/linux/x86_64/sysdep.h (SYSCALL_ERROR_HANDLER):
+ Likewise.
+ * configure.in (HAVE_TLS_MODEL_ATTRIBUTE): Check for
+ __attribute__((tls_model (""))).
+ * configure: Rebuilt.
+ * config.h.in (HAVE_TLS_MODEL_ATTRIBUTE): Add.
+
+2002-10-15 Ulrich Drepper <drepper@redhat.com>
+
+ * timezone/asia: Update from tzdata2002d.
+ * timezone/australasia: Likewise.
+ * timezone/iso3166.tab: Likewise.
+ * timezone/southamerica: Likewise.
+ * timezone/zone-tab: Likewise.
+
+2002-10-15 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/generic/dl-tls.c (_dl_deallocate_tls) [TLS_TCB_AT_TP]:
+ Adjust TCB pointer before calling free, so we get the whole block.
+
+2002-10-14 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/unix/sysv/linux/x86_64/sigaction.c
+ [HAVE_HIDDEN && !HAVE_BROKEN_VISIBILITY_ATTRIBUTE]: Declare restore_rt
+ extern using attribute_hidden instead of static, avoids warning.
+
+2002-10-09 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/configure.in: Use */lib64 for s390x too.
+ * sysdeps/unix/sysv/linux/configure: Rebuilt.
+
+2002-10-14 Ulrich Drepper <drepper@redhat.com>
+
+ * po/sv.po: Update from translation team.
+
+2002-10-12 H.J. Lu <hjl@gnu.org>
+
+ * sunrpc/thrsvc.c (PROCQUIT): New.
+ (struct rpc_arg): New.
+ (dispatch): Call exit (0) if request->rq_proc == PROCQUIT.
+ (test_one_call): Take struct rpc_arg * instead of CLIENT *c.
+ (thread_wrapper): Modified for struct rpc_arg * and call PROCQUIT.
+ (main): Modified for struct rpc_arg *.
+
+2002-10-14 Ulrich Drepper <drepper@redhat.com>
+
+ * dirent/scandir.c: Rearrange code a bit to reduce binary size.
+
+2002-10-14 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/x86_64/sysdep.h: Include tls.h.
+ (SYSCALL_ERROR_HANDLER): Use RTLD_PRIVATE_ERRNO sequence
+ in ld.so even if __thread is supported.
+
+2002-10-13 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/arm/profil-counter.h (profil_counter):
+ Add hack to prevent the compiler from clobbering the signal context.
+ * sysdeps/unix/sysv/linux/sh/profil-counter.h (profil_counter):
+ Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/profil-counter.h (profil_counter):
+ Likewise.
+
+2002-10-14 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/mips/fpu/libm-test-ulps: Regenerated by
+ Guido Guenther <agx@sigxcpu.org>.
+
+2002-10-14 Ulrich Drepper <drepper@redhat.com>
+
+ * po/sk.po: Update from translation team.
+
+2002-09-26 Roland McGrath <roland@redhat.com>
+
+ * elf/dl-load.c (_dl_dst_count, _dl_dst_substitute): Handle $LIB
+ dynamic string tag.
+ * elf/Makefile ($(objpfx)trusted-dirs.st): Make the output define
+ DL_DST_LIB based on $(slibdir).
+
+2002-10-13 Roland McGrath <roland@frob.com>
+
+ * elf/rtld-Rules ($(objpfx)rtld-libc.a): Use $(verbose) in ar command.
+
+ * sysdeps/mach/hurd/getresuid.c: New file.
+ * sysdeps/mach/hurd/getresgid.c: New file.
+ * sysdeps/mach/hurd/setresuid.c: New file.
+ * sysdeps/mach/hurd/setresgid.c: New file.
+
+ * posix/unistd.h [__USE_GNU] (getresuid, getresgid, setresuid,
+ setresgid): Declare them.
+ * NEWS: Mention it.
+ * include/unistd.h
+ (__getresuid, __getresgid, __setresuid, __setresgid): Declare them,
+ add libc_hidden_proto.
+ * posix/Versions (libc: GLIBC_2.3.2): New set. Add
+ getresuid, getresgid, setresuid, setresgid here.
+ * Versions.def (libc): Define GLIBC_2.3.2 set.
+ * sysdeps/generic/getresuid.c (__getresuid): Fix argument types.
+ Add libc_hidden_def.
+ * sysdeps/generic/getresgid.c (__getresgid): Likewise.
+ * sysdeps/generic/setresgid.c: New file.
+ * sysdeps/generic/setresuid.c: New file.
+ * sysdeps/unix/sysv/linux/Makefile [$(subdir) = misc]
+ (sysdep_routines): Don't add getresuid and getresgid here.
+ * sysdeps/unix/sysv/linux/arm/Makefile [$(subdir) = misc]
+ (sysdep_routines): Don't add setresuid and setresgid here.
+ * sysdeps/unix/sysv/linux/cris/Makefile: Likewise.
+ * sysdeps/unix/sysv/linux/sh/Makefile: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-32/Makefile: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-64/Makefile: Likewise.
+ * sysdeps/unix/sysv/linux/i386/Makefile: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/Makefile: Likewise.
+ * posix/Makefile (routines): Add them all here instead.
+ * sysdeps/unix/sysv/linux/i386/getresuid.c (getresuid): Renamed to
+ __getresuid. Add libc_hidden_def for that, and weak alias to old name.
+ * sysdeps/unix/sysv/linux/i386/getresgid.c (getresgid): Renamed to
+ __getresgid. Add libc_hidden_def for that, and weak alias to old name.
+ * sysdeps/unix/sysv/linux/i386/setresuid.c: Add libc_hidden_def.
+ [! __NR_setresuid]: Include generic file.
+ * sysdeps/unix/sysv/linux/i386/setresgid.c (setresgid): Renamed to
+ __setresgid. Add libc_hidden_def for that, and weak alias to old name.
+ [! __NR_setresuid]: Include generic file.
+ * sysdeps/unix/sysv/linux/syscalls.list (setresuid, setresgid):
+ Caller is - now, not EXTRA.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list
+ (setresuid, setresgid, getresuid, getresgid): Likewise.
+ * sysdeps/unix/sysv/linux/syscalls.list (getresuid, getresgid):
+ Add these calls here.
+ * sysdeps/unix/sysv/linux/alpha/syscalls.list: Remove them here.
+ * sysdeps/unix/sysv/linux/hppa/syscalls.list: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list: Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/syscalls.list: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/syscalls.list: Likewise.
+ * sysdeps/unix/sysv/linux/mips/syscalls.list: Likewise.
+ * sysdeps/unix/sysv/linux/ia64/syscalls.list: Likewise.
+
+ * sysdeps/unix/sysv/linux/Makefile [$(subdir) = misc]
+ (sysdep_routines): Add setfsuid and setfsgid here.
+ * sysdeps/unix/sysv/linux/arm/Makefile: Not here.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/Makefile: Likewise.
+ * sysdeps/unix/sysv/linux/cris/Makefile: Likewise.
+ * sysdeps/unix/sysv/linux/sh/Makefile: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-32/Makefile: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-64/Makefile: Likewise.
+ * sysdeps/unix/sysv/linux/i386/Makefile: Likewise.
+ * sysdeps/unix/sysv/linux/m68k/Makefile: Likewise.
+
+ * hurd/errno.c: Renamed to ...
+ * hurd/errno-loc.c: ... this.
+ * hurd/Makefile (routines): errno -> errno-loc
+
+2002-10-13 Ulrich Drepper <drepper@redhat.com>
+
+ * po/de.po: Update from translation team.
+
+ * MakeTAGS: Add -E flag to xgettext runs.
+
+2002-10-12 Ulrich Drepper <drepper@redhat.com>
+
+ * po/fr.po: Update from translation team.
+
+ * sysdeps/posix/system.c: Remove support for old and buggy SCO systems.
+ Optimize a bit for use in glibc.
+
+2002-10-12 Roland McGrath <roland@redhat.com>
+
+ * stdio-common/tst-rndseek.c (TIMEOUT): Increase to 10 seconds.
+ Some machines are slow. Guido Guenther <agx@sigxcpu.org> has one.
+
+2002-10-12 Ulrich Drepper <drepper@redhat.com>
+
+ * po/sv.po: Update from translation team.
+
+2002-10-11 Isamu Hasegawa <isamu@yamato.ibm.com>
+
+ * posix/regcomp.c (re_compile_fastmap_iter): Remove the handling
+ OP_CONTEXT_NODE.
+ (regfree): Likewise.
+ (create_initial_state): Likewise.
+ (analyze): Remove the substitutions which became useless.
+ (calc_first): Likewise.
+ (calc_epsdest): Use edests of OP_BACK_REF in case that it has
+ epsilon destination.
+ (duplicate_node_closure): New function.
+ (duplicate_node): Remove the handling OP_CONTEXT_NODE.
+ (calc_inveclosure): Likewise.
+ (calc_eclosure): Likewise.
+ (calc_eclosure_iter): Invoke duplicate_node_closure instead of
+ direct invocation of duplicate_node.
+ (parse): Don't use comma operator in the return to avoid compiler
+ warning.
+ (parse_reg_exp): Likewise.
+ (parse_branch): Likewise.
+ (parse_expression): Likewise.
+ (parse_sub_exp): Likewise.
+ (parse_dup_op): Likewise.
+ * posix/regex_internal.c (re_dfa_add_node): Remove the substitutions
+ which became useless.
+ (create_ci_newstate): Remove the handling OP_CONTEXT_NODE.
+ (create_cd_newstate): Likewise.
+ * posix/regex_internal.h (re_token_type_t): Remove the obsolete type.
+ (re_token_t): Likewise.
+ (re_dfa_t): Likewise.
+ (re_node_set_remove): New macro.
+ * posix/regexec.c (check_matching): Remove the handling
+ OP_CONTEXT_NODE.
+ (check_halt_node_context): Likewise.
+ (proceed_next_node): Likewise.
+ (pop_fail_stack): Fix the memory leak.
+ (set_regs): Likewise.
+ (free_fail_stack_return): New function.
+ (sift_states_backward): Fix the memory leak. Remove the handling
+ OP_CONTEXT_NODE.
+ (update_cur_sifted_state): Append some if clause to avoid redundant
+ call.
+ (sub_epsilon_src_nodes): Use IS_EPSILON_NODE since it might be a
+ back reference.
+ (check_dst_limits): Remove the handling OP_CONTEXT_NODE.
+ (check_subexp_limits): Likewise.
+ (search_subexp): Likewise.
+ (sift_states_bkref): Likewise.
+ (transit_state_mb): Likewise.
+ (transit_state_bkref_loop): Likewise.
+ (transit_state_bkref_loop): Likewise.
+ (group_nodes_into_DFAstates): Likewise.
+ (check_node_accept): Likewise.
+ (sift_ctx_init): Add initializing.
+
+2002-10-12 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/i386/sysdep.h (INLINE_SYSCALL): Use
+ __builtin_expect.
+
+2002-10-11 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/dl-load.c (_dl_map_object_from_fd): Remove unnecessarily
+ duplicated variable c.
+
+ * sysdeps/unix/sysv/linux/sigwait.c (__sigwait): Use INTERNAL_SYSCALL
+ if possible.
+
+ * sysdeps/unix/sysv/linux/i386/sysdep.h
+ (INTERNAL_SYSCALL_ERROR_P): New define.
+ (INTERNAL_SYSCALL_ERRNO): Likewise.
+
+ * sysdeps/unix/sysv/linux/i386/profil-counter.h (profil_counter):
+ Add hack to prevent the compiler from clobbering the signal context.
+
+2002-10-11 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/unix/sysv/linux/x86_64/sysdep.h (SYSCALL_ERROR_HANDLER):
+ Fix typos.
+
+ * sysdeps/generic/dl-lookupcfg.h: Include <tls.h>.
+ * sysdeps/sh/dl-lookupcfg.h: File removed.
+ * sysdeps/i386/dl-lookupcfg.h: File removed.
+
+ * sysdeps/unix/sysv/linux/x86_64/sysdep.h (SYSCALL_ERROR_HANDLER): Add
+ missing labels and ; from last change.
+
+ * stdio-common/tst-sscanf.c (val_double): Append .0 to large whole
+ number literals, so they are doubles instead of ints.
+
+2002-10-09 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/generic/bits/libc-tsd.h [USE___THREAD]: Conditional
+ changed from [USE_TLS && HAVE___THREAD].
+
+ * sysdeps/i386/dl-machine.h (elf_machine_type_class, elf_machine_rel):
+ Disable TLS relocs if [RTLD_BOOTSTRAP && !USE___THREAD].
+ * sysdeps/x86_64/dl-machine.h
+ (elf_machine_type_class, elf_machine_rela): Likewise.
+ * sysdeps/sh/dl-machine.h (elf_machine_type_class, elf_machine_rela):
+ Likewise.
+
+ * include/link.h (struct link_map): Remove member l_tls_tp_initialized.
+ * elf/rtld.c (_dl_start_final, dl_main): Don't use it.
+ (_dl_start): Conditionalize PT_TLS check on [USE___THREAD].
+
+ * sysdeps/i386/dl-tls.h (__TLS_GET_ADDR): Use ___tls_get_addr_internal
+ instead of ___tls_get_addr.
+ (___tls_get_addr_internal): Add attribute_hidden to decl.
+
+ * sysdeps/generic/ldsodefs.h (struct rtld_global): New variable
+ _dl_error_catch_tsd.
+ * elf/rtld.c (startup_error_tsd): New function.
+ (dl_main): Point _dl_error_catch_tsd at that.
+ * elf/dl-error.c: Don't use libc-tsd.h for DL_ERROR,
+ use new function pointer instead.
+ * elf/dl-tsd.c: New file.
+ * elf/Makefile (routines): Add it.
+
+2002-10-07 Roland McGrath <roland@redhat.com>
+
+ * elf/dl-misc.c (_dl_debug_vdprintf): Use INTERNAL_SYSCALL macro for
+ writev if it's available. Otherwise if [RTLD_PRIVATE_ERRNO] then
+ take _dl_load_lock around calling __writev.
+
+ * sysdeps/unix/sysv/linux/i386/sysdep.h (INTERNAL_SYSCALL): New macro.
+ (INLINE_SYSCALL): Use that.
+
+ * sysdeps/generic/dl-sysdep.h: New file.
+ * sysdeps/mach/hurd/dl-sysdep.h: New file.
+ * sysdeps/generic/ldsodefs.h: Include <dl-sysdep.h>.
+ * include/errno.h [IS_IN_rtld]: Include <dl-sysdep.h> to define ...
+ [RTLD_PRIVATE_ERRNO]: Use a hidden global variable for errno and
+ access it directly.
+ * elf/dl-minimal.c (__errno_location): Removed.
+ * sysdeps/unix/i386/sysdep.S (__syscall_errno) [RTLD_PRIVATE_ERRNO]:
+ Use GOTOFF access for errno.
+ * sysdeps/unix/sysv/linux/i386/sysdep.h
+ [RTLD_PRIVATE_ERRNO] (SYSCALL_ERROR_HANDLER): Likewise.
+
+ * sysdeps/unix/x86_64/sysdep.S (__syscall_errno) [RTLD_PRIVATE_ERRNO]:
+ Use PC-relative access for errno.
+ * sysdeps/unix/sysv/linux/x86_64/sysdep.h
+ [RTLD_PRIVATE_ERRNO] (SYSCALL_ERROR_HANDLER): Likewise.
+
+ * include/tls.h: New file.
+ (USE___THREAD): New macro.
+ Define to 1 under [USE_TLS && HAVE___THREAD] and only when compiling
+ libc or libpthread.
+ * sysdeps/unix/sysv/linux/i386/sysdep.h [USE___THREAD]: Conditional
+ changed from [USE_TLS && HAVE___THREAD].
+ * sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise.
+ * sysdeps/unix/i386/sysdep.S: Likewise.
+ * sysdeps/unix/x86_64/sysdep.S: Likewise.
+ * include/errno.h: Likewise.
+ * include/netdb.h: Likewise.
+ * include/resolv.h: Likewise.
+
+ * sysdeps/generic/errno.c: New file.
+ * csu/Makefile (aux): New variable, list errno.
+ * sysdeps/unix/sysv/linux/i386/sysdep.S (errno, _errno): Remove defns.
+ * sysdeps/unix/sysv/linux/m68k/sysdep.S: Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/sysdep.S: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S: Likewise.
+ * sysdeps/unix/sysv/linux/arm/sysdep.S: Likewise.
+ * sysdeps/unix/sysv/linux/cris/sysdep.S: Likewise.
+ * sysdeps/unix/sysv/linux/hppa/sysdep.c: Likewise.
+ * sysdeps/unix/sysv/linux/ia64/sysdep.S: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/sysdep.c: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sysdep.S: Likewise.
+ * sysdeps/unix/sysv/linux/sh/sysdep.S: Likewise.
+ * sysdeps/unix/alpha/sysdep.S: Likewise.
+ * sysdeps/generic/start.c: Likewise.
+ * sysdeps/unix/start.c: Likewise.
+ * sysdeps/unix/arm/start.c: Likewise.
+ * sysdeps/unix/bsd/ultrix4/mips/start.S: Likewise.
+ * sysdeps/unix/sparc/start.c: Likewise.
+ * sysdeps/unix/sysv/irix4/start.c: Likewise.
+ * sysdeps/unix/sysv/linux/mips/sysdep.S: File removed.
+
+ * manual/search.texi (Tree Search Function, Hash Search Function):
+ Mention search.h clearly.
+
+2002-10-05 Roland McGrath <roland@redhat.com>
+
+ * elf/dl-fxstat64.c: File removed.
+ * elf/dl-xstat64.c: File removed.
+ * elf/Makefile (rtld-routines): Remove them.
+ * sysdeps/unix/sysv/linux/xstat64.c: Remove RTLD_STAT64 conditionals.
+ Instead, use strong_alias instead of versioned_symbol in the
+ !SHLIB_COMPAT case.
+ * sysdeps/unix/sysv/linux/fxstat64.c: Likewise.
+ * sysdeps/unix/sysv/linux/lxstat64.c: Likewise.
+
+ * include/shlib-compat.h
+ (SHLIB_COMPAT): Require that IS_IN_##lib be defined nonzero.
+ [! NOT_IN_libc] (IS_IN_libc): Define it.
+ * cppflags-iterator.mk (CPPFLAGS-$(cpp-src)): Use -Dx=1 not just -Dx.
+ * elf/Makefile (CPPFLAGS-.os): Likewise.
+
+ * sunrpc/rpc_main.c (main): Don't declare with noreturn attribute.
+ Return the status instead of calling exit.
+
+ * Makeconfig (CFLAGS): Prepend -std=gnu99.
+ * Makerules (+make-deps): Use $(CFLAGS) only for .c sources.
+ Remove superfluous rm command, whose @ plus make bugs hid
+ all these commands from the make output.
+
+ * include/stubs-prologue.h: New file. Give #error under #ifdef _LIBC.
+ * Makefile ($(inst_includedir)/gnu/stubs.h): Depend on it.
+ Use that file's contents instead of literal echo's for the prologue.
+ * include/features.h: Include <gnu/stubs.h> unconditionally.
+ * include/gnu/stubs.h: New file.
+
+2002-09-30 Roland McGrath <roland@redhat.com>
+
+ * elf/rtld-Rules: New file.
+ * elf/Makefile ($(objpfx)librtld.map, $(objpfx)librtld.mk,
+ $(objpfx)rtld-libc.a): New targets.
+ (generated): Add them.
+ (reloc-link): Remove -o $@ from the variable.
+ ($(objpfx)dl-allobjs.os): Add -o $@ after $(reloc-link).
+ (distribute): Add rtld-Rules.
+ (CPPFLAGS-.os): Define this instead of CFLAGS-.os.
+ * Makerules ($(+sysdir_pfx)sysd-rules): Emit rules for rtld-% targets.
+ (common-mostlyclean, common-clean): Clean up rtld-* files.
+ * sysdeps/unix/make-syscalls.sh: Add rtld-*.os target name to rules.
+
+2003-05-20 Jakub Jelinek <jakub@redhat.com>
+
+ * elf/dynamic-link.h (elf_get_dynamic_info): Add temp argument.
+ If temp != NULL, copy dynamic entries which need relocation to temp
+ array before relocating.
+ (DL_RO_DYN_TEMP_CNT): Define.
+ * elf/dl-load.c (_dl_map_object_from_fd): Adjust caller.
+ * elf/rtld.c (_dl_start): Likewise.
+ (dl_main): Likewise. Add dyn_temp static variable.
+
+2002-10-11 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/generic/dl-tls.c (__tls_get_addr): After freeing block in
+ now-unused dtv slot, reset the slot to TLS_DTV_UNALLOCATED.
+
+ * elf/tls-macros.h [__x86_64__] (TLS_GD): Fix the sequence with the
+ proper set of no-op insn prefixes.
+
+ * elf/tst-tls8.c (do_test): Use %zd format for l_tls_modid members.
+
+2002-10-11 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/execve.c: Don't try calling
+ __pthread_kill_other_threads_np.
+
+ * sysdeps/generic/pselect.c: Avoid unnecessary sigprocmask calls.
+
+2002-10-08 Roland McGrath <roland@redhat.com>
+
+ * locale/newlocale.c (__newlocale): If setting all categories to "C",
+ just return &_nl_C_locobj instead of copying it.
+ * locale/freelocale.c (__freelocale): Check for &_nl_C_locobj.
+ * locale/duplocale.c (__duplocale): Likewise.
+
+2002-10-07 Roland McGrath <roland@frob.com>
+
+ * config.h.in (HAVE_I386_SET_GDT): New #undef.
+ * sysdeps/mach/configure.in: Define it with new check for i386_set_gdt.
+ * sysdeps/mach/configure: Regenerated.
+
+2002-10-06 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h (INLINE_SYSCALL):
+ Add all necessary register outputs for syscall-clobbered registers.
+
+2002-10-02 David Mosberger <davidm@hpl.hp.com>
+
+ * sysdeps/ia64/bzero.S: Rewritten by Sverre Jarp to tune for
+ Itanium 2 (and Itanium).
+ Fix unwind directives and make it fit in 80 columns.
+ * sysdeps/ia64/memset.S: Likewise.
+ * sysdeps/ia64/memcpy.S: Likewise.
+ Move jump table to .rodata section.
+
+2002-10-03 Roland McGrath <roland@frob.com>
+
+ * sysdeps/mach/hurd/i386/init-first.c (_hurd_stack_setup): Add
+ clobbers to asm.
+
+2002-10-10 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/x86_64/_mcount.S: Restore correct registers.
+
+2002-10-10 Ulrich Drepper <drepper@redhat.com>
+
+ * posix/Versions (libc) [GLIBC_PRIVATE]: Add __pselect.
+
+2002-10-09 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/generic/ldsodefs.h: Remove attribute_hidden from
+ _dl_allocate_tls_init. Add rtld_hidden_proto.
+ * sysdeps/generic/dl-tls.c (_dl_allocate_tls_init): Add
+ rtld_hidden_def.
+ * elf/Versions (ld) [GLIBC_PRIVATE]: Add _dl_allocate_tls_init.
+
+ * version.h (VERSION): Bump to 2.3.1.
+
+ * Make-dist: Add back one of the tar invocations removed before.
+
+ * stdlib/Makefile (distribute): Add allocalim.h.
+
+ * sysdeps/generic/bits/libc-tsd.h [!(USE_TLS && HAVE___THREAD)]
+ (__libc_tsd_address): Use correct variable name.
+ Patch by Stefan Jones <stefan.jones@multigig.com>.
+
+ * sysdeps/unix/sysv/linux/ia64/getcontext.S: Add missing ;;.
+ Reported by edwardsg@sgi.com [PR libc/4678].
+
+ * Versions.def (libc): Add GLIBC_2.3.1.
+ (libpthread): Add GLIBC_2.3.1.
+
+ * include/signal.h: Add libc_hidden_proto for __sigwait, __sigwaitinfo,
+ and __sigtimedwait.
+ * signal/Versions: Add __sigtimedwait, __sigwait, and __sigwaitinfo.
+ * sysdeps/unix/sysv/linux/sigtimedwait.c (__sigtimedwait): Add
+ libc_hidden_def.
+ * sysdeps/unix/sysv/linux/sigwait.c (__sigwait): Likewise.
+ * sysdeps/unix/sysv/linux/sigwaitinfo.c (__sigwaitinfo): Likewise.
+
+ * include/sys/msg.h: Declare __libc_msgrcv and __libc_msgsnd.
+ * sysdeps/unix/sysv/linux/msgrcv.c (__msgrcv): Rename to __libc_msgrcv
+ and make old name an alias.
+ * sysdeps/unix/sysv/linux/msgsnd.c (__msgsnd): Rename to __libc_msgsnd
+ and make old name an alias.
+ * sysvipc/Versions (libc) [GLIBC_PRIVATE]: Add __libc_msgrcv and
+ __libc_msgsnd.
+
+ * include/sys/uio.h: Declare __libc_readv and __libc_writev.
+ * misc/Versions (libc) [GLIBC_PRIVATE]: Add __libc_readv and
+ __libc_writev.
+ * sysdeps/generic/readv.c (__readv): Rename to __libc_readv and make
+ old name an alias.
+ * sysdeps/posix/readv.c: Likewise
+ * sysdeps/unix/sysv/aix/readv.c: Likewise.
+ * sysdeps/unix/sysv/linux/readv.c: Likewise.
+ * sysdeps/generic/writev.c (__writev): Rename to __libc_writev and make
+ old name an alias.
+ * sysdeps/posix/writev.c: Likewise
+ * sysdeps/unix/sysv/aix/writev.c: Likewise.
+ * sysdeps/unix/sysv/linux/writev.c: Likewise.
+
+ * include/sys/wait.h: Declare __waitid.
+ * posix/Versions (libc) [GLIBC_PRIVATE]: Add __waitid.
+ * sysdeps/generic/waitid.c (waitid): Rename to __waitid and make old
+ name an alias.
+ * sysdeps/posix/waitid.c: Likewise.
+ * sysdeps/unix/sysv/aix/waitid.c: Likewise.
+
+ * sysdeps/unix/sysv/linux/syscalls.list: Add creat syscall.
+
+2002-10-07 Jakub Jelinek <jakub@redhat.com>
+
+ * include/alloca.h (__libc_use_alloca, __libc_alloca_cutoff): New
+ prototypes.
+ (__MAX_ALLOCA_CUTOFF): Define.
+ Include allocalim.h.
+ * resolv/nss_dns/dns-host.c (_nss_dns_gethostbyname2_r,
+ _nss_dns_gethostbyaddr_r): Use alloca or malloc to allocate
+ host_buffer depending on __libc_use_alloca.
+ * resolv/nss_dns/dns-network.c (_nss_dns_getnetbyname_r,
+ _nss_dns_getnetbyaddr_r): Use alloca or malloc to allocate
+ net_buffer depending on __libc_use_alloca.
+ * resolv/res_query.c (res_nquery): Use alloca or malloc to allocate
+ buf depending on __libc_use_alloca.
+ * resolv/gethnamaddr.c (gethostbyname2, gethostbyaddr): Likewise.
+ * stdio-common/vfprintf.c (vfprintf): Use __libc_use_alloca
+ instead of hardcoded constants.
+ Pass proper size argument to alloca and compute end for wide char
+ version.
+ * stdio-common/printf_fp.c (__printf_fp): Use __libc_use_alloca
+ instead of hardcoded constants.
+ * string/strcoll.c (strcoll): Likewise.
+ * string/strxfrm.c (strxfrm): Likewise.
+ * sysdeps/posix/readv.c (__readv): Likewise.
+ * sysdeps/posix/writev.c (__writev): Likewise.
+ * sysdeps/generic/allocalim.h: New file.
+
+2002-10-08 Roland McGrath <roland@redhat.com>
+
+ * configure.in (aux_missing warning): Change "too old" to
+ "incompatible versions", since for autoconf it's "too new" right now.
+ * configure: Regenerated.
+
+ * configure.in (AUTOCONF): New check to set it. Set to "no" if the
+ one found doesn't work on our configure.in.
+ * configure: Regenerated.
+ * config.make.in (AUTOCONF): New substituted variable.
+ * Makefile (autoconf-it-cvs): New canned sequence, broken out of ...
+ (autoconf-it): ... here, use that instead of defining conditionally.
+ Use $(AUTOCONF) instead of literal autoconf.
+ [$(AUTOCONF) != no] (configure, %/configure): Protect these rules
+ with this condition.
+ * Make-dist (autoconf-it, configure, %/configure): Copy those changes.
+
+2002-10-08 Ulrich Drepper <drepper@redhat.com>
+
+ * Make-dist (dist): Cleanup a bit. We are not interested in the
+ 14 char filename limit anymore. Remove intermediate files and
+ symlinks.
+
+2002-10-05 Ulrich Drepper <drepper@redhat.com>
+
+ * po/sk.po: Update from translation team.
+ * po/tr.po: Likewise.
+ * po/gl.po: Likewise.
+
+2002-10-05 Kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+ * elf/tls-macros.h: Fix SH version of macros so as to match ABI syntax.
+
+2002-10-03 Ulrich Drepper <drepper@redhat.com>
+
+ * version.h (RELEASE): Change to stable.
+
+2002-10-03 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/_exit.c (__syscall_exit,
+ __syscall_exit_group): New prototypes.
+
+2002-10-03 Ulrich Drepper <drepper@redhat.com>
+
+ * glibc 2.3 released.
+
+
+See ChangeLog.13 for earlier changes.
diff --git a/test/regex/tst-regexloc.c b/test/regex/tst-regexloc.c
new file mode 100644
index 0000000..d862678
--- /dev/null
+++ b/test/regex/tst-regexloc.c
@@ -0,0 +1,53 @@
+/* Copyright (C) 2001 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sys/types.h>
+#include <regex.h>
+#include <locale.h>
+#include <stdio.h>
+
+int
+main (int argc, char *argv[])
+{
+/* If uclibc has extended locale, or if it's a host build
+ * (assuming host libc always has locale): */
+#if defined __UCLIBC_HAS_XLOCALE__ || !defined __UCLIBC__
+ regex_t re;
+ regmatch_t mat[1];
+ int exitcode = 1;
+
+ if (setlocale (LC_ALL, "de_DE.ISO-8859-1") == NULL)
+ puts ("cannot set locale");
+ else if (regcomp (&re, "[a-f]*", 0) != REG_NOERROR)
+ puts ("cannot compile expression \"[a-f]*\"");
+ else if (regexec (&re, "abcdefCDEF", 1, mat, 0) == REG_NOMATCH)
+ puts ("no match");
+ else
+ {
+ exitcode = mat[0].rm_so != 0 || mat[0].rm_eo != 6;
+ printf ("match from %d to %d - %s\n",
+ mat[0].rm_so, mat[0].rm_eo,
+ exitcode ? "WRONG!" : "ok"
+ );
+ }
+
+ return exitcode;
+#else
+ puts("Test requires locale; skipping");
+ return 0;
+#endif
+}