Update.
authorUlrich Drepper <drepper@redhat.com>
Sun, 8 Mar 1998 15:26:29 +0000 (15:26 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 8 Mar 1998 15:26:29 +0000 (15:26 +0000)
1998-03-08 14:58  Ulrich Drepper  <drepper@cygnus.com>

* Makeconfig (nisobjdir): Set to path to nis directory.
(rpath-link): Add nisobjdir.
Patch by Sven Verdoolaege <skimo@kotnet.org>.

* elf/Makefile: Pretty print.
* elf/dl-lookup.c: Include unistd.h.
* elf/dl-runtime.c: Likewise.

* localedata/Makefile (test-srcs): Add tst-rpmatch.
(distribute): Add tst-rpmatch.sh.
(tests): Add tst-rpmatch to dependency list and run tst-rpmatch.sh.

New tests for rpmatch function by
Jochen Hein <jochen.hein@delphi.central.de>.
* localedata/tst-rpmatch.c: New file.
* localedata/tst-rpmatch.sh: New file.

* localedata/locales/de_DE: Correct yesexpr and noexpr.
* localedata/locales/de_AT: Likewise.

* posix/getopt.c: Update contact address.
* posix/getopt1.c: Pretty print.

* sysdeps/generic/libc-start.c: Do most of the initialization now
here instead of in start.S.
* sysdeps/unix/sysv/linux/libc-start.c: Likewise.
* sysdeps/i386/elf/start.S: Remove most of the initialization code.

* sysdeps/unix/sysv/linux/i386/profil-counter.h: No need for
profil_counter to be public.

1998-03-08 13:06  Tim Waugh  <tim@cyberelk.demon.co.uk>

* posix/wordexp.c (parse_arith): Now works for negative numbers too.
(parse_param): Coded parameter length expansion (${#var}).
(parse_param): Handling for "=", "+", "-", and the ":" versions added.
(parse_param): Cleaned up (fixed) error handling.

* posix/wordexp-test.c: IFS now includes non-whitespace character
(comma).  Added more tests.

20 files changed:
ChangeLog
Makeconfig
elf/Makefile
elf/dl-lookup.c
elf/dl-runtime.c
localedata/ChangeLog
localedata/Makefile
localedata/locales/de_AT
localedata/locales/de_DE
localedata/locales/ru_RU
localedata/tst-rpmatch.c [new file with mode: 0644]
localedata/tst-rpmatch.sh [new file with mode: 0755]
posix/getopt.c
posix/getopt1.c
posix/wordexp-test.c
posix/wordexp.c
sysdeps/generic/libc-start.c
sysdeps/i386/elf/start.S
sysdeps/unix/sysv/linux/i386/profil-counter.h
sysdeps/unix/sysv/linux/libc-start.c

index 22afadd..6e0a0b1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,46 @@
+1998-03-08 14:58  Ulrich Drepper  <drepper@cygnus.com>
+
+       * Makeconfig (nisobjdir): Set to path to nis directory.
+       (rpath-link): Add nisobjdir.
+       Patch by Sven Verdoolaege <skimo@kotnet.org>.
+
+       * elf/Makefile: Pretty print.
+       * elf/dl-lookup.c: Include unistd.h.
+       * elf/dl-runtime.c: Likewise.
+
+       * localedata/Makefile (test-srcs): Add tst-rpmatch.
+       (distribute): Add tst-rpmatch.sh.
+       (tests): Add tst-rpmatch to dependency list and run tst-rpmatch.sh.
+
+       New tests for rpmatch function by
+       Jochen Hein <jochen.hein@delphi.central.de>.
+       * localedata/tst-rpmatch.c: New file.
+       * localedata/tst-rpmatch.sh: New file.
+
+       * localedata/locales/de_DE: Correct yesexpr and noexpr.
+       * localedata/locales/de_AT: Likewise.
+
+       * posix/getopt.c: Update contact address.
+       * posix/getopt1.c: Pretty print.
+
+       * sysdeps/generic/libc-start.c: Do most of the initialization now
+       here instead of in start.S.
+       * sysdeps/unix/sysv/linux/libc-start.c: Likewise.
+       * sysdeps/i386/elf/start.S: Remove most of the initialization code.
+
+       * sysdeps/unix/sysv/linux/i386/profil-counter.h: No need for
+       profil_counter to be public.
+
+1998-03-08 13:06  Tim Waugh  <tim@cyberelk.demon.co.uk>
+
+       * posix/wordexp.c (parse_arith): Now works for negative numbers too.
+       (parse_param): Coded parameter length expansion (${#var}).
+       (parse_param): Handling for "=", "+", "-", and the ":" versions added.
+       (parse_param): Cleaned up (fixed) error handling.
+
+       * posix/wordexp-test.c: IFS now includes non-whitespace character
+       (comma).  Added more tests.
+
 1998-03-07  Ulrich Drepper  <drepper@cygnus.com>
 
        * elf/link.h: Fix typos.
index b4634cc..394baa9 100644 (file)
@@ -414,10 +414,11 @@ else
 default-rpath = $(libdir)
 endif
 # This is how to find at build-time things that will be installed there.
-rpath-link = $(common-objdir):$(mathobjdir):$(elfobjdir):$(nssobjdir):$(dbobjdir)
+rpath-link = $(common-objdir):$(mathobjdir):$(elfobjdir):$(nssobjdir):$(nisobjdir):$(dbobjdir)
 mathobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)math)
 elfobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)elf)
 nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
+nisobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nis)
 dbobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)db2)
 else
 link-libc = $(common-objpfx)libc.a $(gnulib) $(common-objpfx)libc.a
index 19c5ef8..45494de 100644 (file)
@@ -1,5 +1,3 @@
-# Makefile for elf subdirectory of GNU C Library.
-
 # Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
 # This file is part of the GNU C Library.
 
@@ -18,6 +16,8 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 # Boston, MA 02111-1307, USA.
 
+# Makefile for elf subdirectory of GNU C Library.
+
 subdir         := elf
 
 headers                = elf.h bits/elfclass.h bits/dlfcn.h link.h dlfcn.h
index 19e6f05..c0f9731 100644 (file)
    Boston, MA 02111-1307, USA.  */
 
 #include <alloca.h>
-#include <stddef.h>
 #include <link.h>
 #include <assert.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "dl-hash.h"
 #include <dl-machine.h>
index 99927a9..b01338a 100644 (file)
@@ -18,7 +18,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <link.h>
-#include <stddef.h>
+#include <unistd.h>
 
 
 /* The global scope we will use for symbol lookups.
index ed25564..e968fe0 100644 (file)
@@ -1,3 +1,8 @@
+1998-03-08  Ulrich Drepper  <drepper@cygnus.com>
+
+       * locales/ru_RU: Correct inconsistencies in mon data.
+       Patch by Alexander V. Lukyanov <lav@alpha.netis.ru>.
+
 1997-10-09 04:56  Ulrich Drepper  <drepper@cygnus.com>
 
        * locales/is_IS: Update from Debian version.
index 4e26d15..d62a6a3 100644 (file)
@@ -30,7 +30,7 @@ charmaps := $(filter-out $(addprefix charmaps/, CVS RCS %~), \
 locales := $(filter-out $(addprefix locales/, CVS RCS %~), \
                                    $(wildcard locales/*))
 
-test-srcs := collate-test xfrm-test tst-fmon
+test-srcs := collate-test xfrm-test tst-fmon tst-rpmatch
 test-input := de_DE.ISO-8859-1 da_DK.ISO-8859-1 fr_CA,2.13.ISO-8859-1
 test-output := $(foreach s, .out .xout, \
                         $(addsuffix $s, $(basename $(test-input))))
@@ -43,7 +43,7 @@ ld-test-srcs := $(addprefix tests/,$(addsuffix .cm,$(ld-test-names)) \
 
 distribute := CHECKSUMS tst-fmon.sh tst-fmon.data ChangeLog sort-test.sh \
              README mnemonic.ds fr_CA,2.13.in de_DE.in da_DK.in         \
-             $(charmaps) $(locales) $(ld-test-srcs)
+             $(charmaps) $(locales) $(ld-test-srcs) tst-rpmatch.sh
 
 # Get $(inst_i18ndir) defined.
 include ../Makeconfig
@@ -59,8 +59,10 @@ $(inst_i18ndir)/locales/%: locales/%; $(do-install)
 
 
 ifeq (no,$(cross-compiling))
-tests: $(objpfx)collate-test $(objpfx)xfrm-test $(objpfx)tst-fmon
+tests: $(objpfx)collate-test $(objpfx)xfrm-test $(objpfx)tst-fmon \
+       $(objpfx)tst-rpmatch
        $(SHELL) -e sort-test.sh $(common-objpfx) $(test-input)
        $(SHELL) -e tst-fmon.sh $(common-objpfx) tst-fmon.data
        $(SHELL) -e tst-locale.sh $(common-objpfx)
+       $(SHELL) -e tst-rpmatch.sh $(common-objpfx)
 endif
index 2c75d68..a464217 100644 (file)
@@ -27,8 +27,8 @@ copy "en_DK"
 END LC_COLLATE
 
 LC_MESSAGES
-yesexpr "<<(><j><J><y><Y><)/>><.><*>"
-noexpr  "<<(><n><N><)/>><.><*>"
+yesexpr "<'/>><<(><j><J><y><Y><)/>><.><*>"
+noexpr  "<'/>><<(><n><N><)/>><.><*>"
 END LC_MESSAGES
 
 LC_MONETARY
index 6308ff3..b13f52f 100644 (file)
@@ -2138,8 +2138,8 @@ copy "en_DK"
 END LC_CTYPE
 
 LC_MESSAGES
-yesexpr "<<(><j><J><y><Y><)/>><.><*>"
-noexpr  "<<(><n><N><)/>><.><*>"
+yesexpr "<'/>><<(><j><J><y><Y><)/>><.><*>"
+noexpr  "<'/>><<(><n><N><)/>><.><*>"
 END LC_MESSAGES
 
 LC_MONETARY
index 9da6982..d898f63 100644 (file)
@@ -38,7 +38,7 @@ LC_COLLATE
 %     members of equivalence classes
 %  3. A distinction is made with regards
 %     to case as noted below.
-%  4. Special characters are ignored 
+%  4. Special characters are ignored
 %     when comparing letters, but then
 %     they are considered
 %  5. The alphabets are sorted in order
@@ -66,10 +66,10 @@ collating-symbol <SMALL>
 % and Spanish <C><h> being treated
 % as one letter.
 
-% The <a8> ...... <z8> collating 
+% The <a8> ...... <z8> collating
 % symbols have defined weights as
 % the last character in a group of
-% Latin letters. They are used 
+% Latin letters. They are used
 % to specify deltas by locales using
 % a locale as the default ordering
 % and by "replace-after" statements
@@ -992,7 +992,7 @@ UNDEFINED   IGNORE;IGNORE;IGNORE
 <a->   <A>;<MACRON>;<SMALL>;IGNORE
 <A7>   <A>;<MACRON+DOT>;<CAPITAL>;IGNORE
 <a7>   <A>;<MACRON+DOT>;<SMALL>;IGNORE
-<a8>   
+<a8>
 <AE>   "<A><E>";"<AE><AE>";"<CAPITAL><CAPITAL>";IGNORE
 <ae>   "<A><E>";"<AE><AE>";"<SMALL><SMALL>";IGNORE
 <AE'>  "<A><E>";"<AE'><AE'>";"<CAPITAL><CAPITAL>";IGNORE
@@ -1007,7 +1007,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <b-.>  <B>;<DOT-BELOW>;<SMALL>;IGNORE
 <B_>   <B>;<LINE-BELOW>;<CAPITAL>;IGNORE
 <b_>   <B>;<LINE-BELOW>;<SMALL>;IGNORE
-<b8>   
+<b8>
 <C>    <C>;<NONE>;<CAPITAL>;IGNORE
 <c>    <C>;<NONE>;<SMALL>;IGNORE
 <C'>   <C>;<ACUTE>;<CAPITAL>;IGNORE
@@ -1024,7 +1024,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <c,>   <C>;<CEDILLA>;<SMALL>;IGNORE
 <C,'>  <C>;<CEDILLA+ACUTE>;<CAPITAL>;IGNORE
 <c,'>  <C>;<CEDILLA+ACUTE>;<SMALL>;IGNORE
-<c8>   
+<c8>
 <D>    <D>;<NONE>;<CAPITAL>;IGNORE
 <d>    <D>;<NONE>;<SMALL>;IGNORE
 <D<>   <D>;<CARON>;<CAPITAL>;IGNORE
@@ -1041,7 +1041,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <d-/>> <D>;<MACRON+CIRCUMFLEX>;<SMALL>;IGNORE
 <D_>   <D>;<LINE-BELOW>;<CAPITAL>;IGNORE
 <d_>   <D>;<LINE-BELOW>;<SMALL>;IGNORE
-<d8>   
+<d8>
 <E>    <E>;<NONE>;<CAPITAL>;IGNORE
 <e>    <E>;<NONE>;<SMALL>;IGNORE
 <E'>   <E>;<ACUTE>;<CAPITAL>;IGNORE
@@ -1092,14 +1092,14 @@ UNDEFINED       IGNORE;IGNORE;IGNORE
 <e-!>  <E>;<MACRON+GRAVE>;<SMALL>;IGNORE
 <E-/>> <E>;<MACRON+CIRCUMFLEX>;<CAPITAL>;IGNORE
 <e-/>> <E>;<MACRON+CIRCUMFLEX>;<SMALL>;IGNORE
-<e8>   
+<e8>
 <F>    <F>;<NONE>;<CAPITAL>;IGNORE
 <f>    <F>;<NONE>;<SMALL>;IGNORE
 <F2>   <F>;<HOOK>;<CAPITAL>;IGNORE
 <f2>   <F>;<HOOK>;<SMALL>;IGNORE
 <F.>   <F>;<DOT>;<CAPITAL>;IGNORE
 <f.>   <F>;<DOT>;<SMALL>;IGNORE
-<f8>   
+<f8>
 <ff>   "<F><F>";"<NONE><NONE>";"<ff><ff>";IGNORE
 <fi>   "<F><I>";"<NONE><NONE>";"<fi><fi>";IGNORE
 <fl>   "<F><L>";"<NONE><NONE>";"<fl><fl>";IGNORE
@@ -1124,7 +1124,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <g,>   <G>;<CEDILLA>;<SMALL>;IGNORE
 <G->   <G>;<MACRON>;<CAPITAL>;IGNORE
 <g->   <G>;<MACRON>;<SMALL>;IGNORE
-<g8>   
+<g8>
 <H>    <H>;<NONE>;<CAPITAL>;IGNORE
 <h>    <H>;<NONE>;<SMALL>;IGNORE
 <H-(>  <H>;<BREVE-BELOW>;<CAPITAL>;IGNORE
@@ -1141,7 +1141,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <h//>  <H>;<STROKE>;<SMALL>;IGNORE
 <H,>   <H>;<CEDILLA>;<CAPITAL>;IGNORE
 <h,>   <H>;<CEDILLA>;<SMALL>;IGNORE
-<h8>   
+<h8>
 <I>    <I>;<NONE>;<CAPITAL>;IGNORE
 <i>    <I>;<NONE>;<SMALL>;IGNORE
 <I'>   <I>;<ACUTE>;<CAPITAL>;IGNORE
@@ -1176,14 +1176,14 @@ UNDEFINED       IGNORE;IGNORE;IGNORE
 <i;>   <I>;<OGONEK>;<SMALL>;IGNORE
 <I->   <I>;<MACRON>;<CAPITAL>;IGNORE
 <i->   <I>;<MACRON>;<SMALL>;IGNORE
-<i8>   
+<i8>
 <IJ>   "<I><J>";"<IJ><IJ>";"<CAPITAL><CAPITAL>";IGNORE
 <ij>   "<I><J>";"<IJ><IJ>";"<SMALL><SMALL>";IGNORE
 <J>    <J>;<NONE>;<CAPITAL>;IGNORE
 <j>    <J>;<NONE>;<SMALL>;IGNORE
 <J/>>  <J>;<CIRCUMFLEX>;<CAPITAL>;IGNORE
 <j/>>  <J>;<CIRCUMFLEX>;<SMALL>;IGNORE
-<j8>   
+<j8>
 <K>    <K>;<NONE>;<CAPITAL>;IGNORE
 <k>    <K>;<NONE>;<SMALL>;IGNORE
 <K'>   <K>;<ACUTE>;<CAPITAL>;IGNORE
@@ -1198,7 +1198,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <k,>   <K>;<CEDILLA>;<SMALL>;IGNORE
 <K_>   <K>;<LINE-BELOW>;<CAPITAL>;IGNORE
 <k_>   <K>;<LINE-BELOW>;<SMALL>;IGNORE
-<k8>   
+<k8>
 <kk>   <K>;<kk>;<SMALL>;IGNORE
 <L>    <L>;<NONE>;<CAPITAL>;IGNORE
 <l>    <L>;<NONE>;<SMALL>;IGNORE
@@ -1220,7 +1220,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <l-/>> <L>;<MACRON+CIRCUMFLEX>;<SMALL>;IGNORE
 <L_>   <L>;<LINE-BELOW>;<CAPITAL>;IGNORE
 <l_>   <L>;<LINE-BELOW>;<SMALL>;IGNORE
-<l8>   
+<l8>
 <M>    <M>;<NONE>;<CAPITAL>;IGNORE
 <m>    <M>;<NONE>;<SMALL>;IGNORE
 <M'>   <M>;<ACUTE>;<CAPITAL>;IGNORE
@@ -1229,7 +1229,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <m.>   <M>;<DOT>;<SMALL>;IGNORE
 <M-.>  <M>;<DOT-BELOW>;<CAPITAL>;IGNORE
 <m-.>  <M>;<DOT-BELOW>;<SMALL>;IGNORE
-<m8>   
+<m8>
 <N>    <N>;<NONE>;<CAPITAL>;IGNORE
 <n>    <N>;<NONE>;<SMALL>;IGNORE
 <N'>   <N>;<ACUTE>;<CAPITAL>;IGNORE
@@ -1249,7 +1249,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <N_>   <N>;<LINE-BELOW>;<CAPITAL>;IGNORE
 <n_>   <N>;<LINE-BELOW>;<SMALL>;IGNORE
 <'n>   <N>;<PRECEDED-BY-APOSTROPHE>;<SMALL>;IGNORE
-<n8>   
+<n8>
 <NG>   "<N><G>";"<NG><NG>";"<CAPITAL><CAPITAL>";IGNORE
 <ng>   "<N><G>";"<NG><NG>";"<SMALL><SMALL>";IGNORE
 <O>    <O>;<NONE>;<CAPITAL>;IGNORE
@@ -1319,7 +1319,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <o9?>  <O>;<HORN+TILDE>;<SMALL>;IGNORE
 <O9-.> <O>;<HORN+DOT-BELOW>;<CAPITAL>;IGNORE
 <o9-.> <O>;<HORN+DOT-BELOW>;<SMALL>;IGNORE
-<o8>   
+<o8>
 <OE>   "<O><E>";"<OE><OE>";"<CAPITAL><CAPITAL>";IGNORE
 <oe>   "<O><E>";"<OE><OE>";"<SMALL><SMALL>";IGNORE
 <P>    <P>;<NONE>;<CAPITAL>;IGNORE
@@ -1328,10 +1328,10 @@ UNDEFINED       IGNORE;IGNORE;IGNORE
 <p'>   <P>;<ACUTE>;<SMALL>;IGNORE
 <P.>   <P>;<DOT>;<CAPITAL>;IGNORE
 <p.>   <P>;<DOT>;<SMALL>;IGNORE
-<p8>   
+<p8>
 <Q>    <Q>;<NONE>;<CAPITAL>;IGNORE
 <q>    <Q>;<NONE>;<SMALL>;IGNORE
-<q8>   
+<q8>
 <R>    <R>;<NONE>;<CAPITAL>;IGNORE
 <r>    <R>;<NONE>;<SMALL>;IGNORE
 <R'>   <R>;<ACUTE>;<CAPITAL>;IGNORE
@@ -1352,7 +1352,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <r--.> <R>;<MACRON+DOT-BELOW>;<SMALL>;IGNORE
 <R_>   <R>;<LINE-BELOW>;<CAPITAL>;IGNORE
 <r_>   <R>;<LINE-BELOW>;<SMALL>;IGNORE
-<r8>   
+<r8>
 <S>    <S>;<NONE>;<CAPITAL>;IGNORE
 <s>    <S>;<NONE>;<SMALL>;IGNORE
 <st>   "<S><T>";"<NONE><NONE>";"<st><st>";IGNORE
@@ -1374,7 +1374,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <s.-.> <S>;<DOT+DOT-BELOW>;<SMALL>;IGNORE
 <S,>   <S>;<CEDILLA>;<CAPITAL>;IGNORE
 <s,>   <S>;<CEDILLA>;<SMALL>;IGNORE
-<s8>   
+<s8>
 <s1>   <S>;<s1>;<SMALL>;IGNORE
 <ss>   "<S><S>";"<NONE><NONE>";"<SMALL><ss>";IGNORE
 <T>    <T>;<NONE>;<CAPITAL>;IGNORE
@@ -1393,7 +1393,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <t-/>> <T>;<MACRON+CIRCUMFLEX>;<SMALL>;IGNORE
 <T_>   <T>;<LINE-BELOW>;<CAPITAL>;IGNORE
 <t_>   <T>;<LINE-BELOW>;<SMALL>;IGNORE
-<t8>   
+<t8>
 <TH>   "<T><H>";"<TH><TH>";"<CAPITAL><CAPITAL>";IGNORE
 <th>   "<T><H>";"<TH><TH>";"<SMALL><SMALL>";IGNORE
 <U>    <U>;<NONE>;<CAPITAL>;IGNORE
@@ -1458,14 +1458,14 @@ UNDEFINED       IGNORE;IGNORE;IGNORE
 <u9?>  <U>;<HORN+TILDE>;<SMALL>;IGNORE
 <U9-.> <U>;<HORN+DOT-BELOW>;<CAPITAL>;IGNORE
 <u9-.> <U>;<HORN+DOT-BELOW>;<SMALL>;IGNORE
-<u8>   
+<u8>
 <V>    <V>;<NONE>;<CAPITAL>;IGNORE
 <v>    <V>;<NONE>;<SMALL>;IGNORE
 <V?>   <V>;<TILDE>;<CAPITAL>;IGNORE
 <v?>   <V>;<TILDE>;<SMALL>;IGNORE
 <V-.>  <V>;<DOT-BELOW>;<CAPITAL>;IGNORE
 <v-.>  <V>;<DOT-BELOW>;<SMALL>;IGNORE
-<v8>   
+<v8>
 <W>    <W>;<NONE>;<CAPITAL>;IGNORE
 <w>    <W>;<NONE>;<SMALL>;IGNORE
 <W'>   <W>;<ACUTE>;<CAPITAL>;IGNORE
@@ -1480,14 +1480,14 @@ UNDEFINED       IGNORE;IGNORE;IGNORE
 <w.>   <W>;<DOT>;<SMALL>;IGNORE
 <W-.>  <W>;<DOT-BELOW>;<CAPITAL>;IGNORE
 <w-.>  <W>;<DOT-BELOW>;<SMALL>;IGNORE
-<w8>   
+<w8>
 <X>    <X>;<NONE>;<CAPITAL>;IGNORE
 <x>    <X>;<NONE>;<SMALL>;IGNORE
 <X:>   <X>;<DIAERESIS>;<CAPITAL>;IGNORE
 <x:>   <X>;<DIAERESIS>;<SMALL>;IGNORE
 <X.>   <X>;<DOT>;<CAPITAL>;IGNORE
 <x.>   <X>;<DOT>;<SMALL>;IGNORE
-<x8>   
+<x8>
 <Y>    <Y>;<NONE>;<CAPITAL>;IGNORE
 <y>    <Y>;<NONE>;<SMALL>;IGNORE
 <Y'>   <Y>;<ACUTE>;<CAPITAL>;IGNORE
@@ -1506,7 +1506,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <y.>   <Y>;<DOT>;<SMALL>;IGNORE
 <Y-.>  <Y>;<DOT-BELOW>;<CAPITAL>;IGNORE
 <y-.>  <Y>;<DOT-BELOW>;<SMALL>;IGNORE
-<y8>   
+<y8>
 <Z>    <Z>;<NONE>;<CAPITAL>;IGNORE
 <z>    <Z>;<NONE>;<SMALL>;IGNORE
 <Z'>   <Z>;<ACUTE>;<CAPITAL>;IGNORE
@@ -1523,7 +1523,7 @@ UNDEFINED IGNORE;IGNORE;IGNORE
 <z//>  <Z>;<STROKE>;<SMALL>;IGNORE
 <Z_>   <Z>;<LINE-BELOW>;<CAPITAL>;IGNORE
 <z_>   <Z>;<LINE-BELOW>;<SMALL>;IGNORE
-<z8>   
+<z8>
 <A*>   <A*>;<CAPITAL>;<GREEK>;IGNORE
 <A%>   <A*>;<CAPITAL>;<TONOS>;IGNORE
 <a*>   <A*>;<SMALL>;<GREEK>;IGNORE
@@ -2134,18 +2134,18 @@ abday   "<V=><s=><k=>";/
         "<C%><t=><v=>";/
         "<P=><t=><n=>";/
         "<S=><u=><b=>"
-mon     "<JA><n=><v=><a=><r=><ja>";/
-        "<F=><e=><v=><r=><a=><l=><ja>";/
+mon     "<JA><n=><v=><a=><r=><%'>";/
+       "<F=><e=><v=><r=><a=><l=><%'>";/
         "<M=><a=><r=><t=>";/
-        "<A=><p=><r=><e=><l=><ja>";/
+        "<A=><p=><r=><e=><l=><%'>";/
         "<M=><a=><j=>";/
-        "<I=><ju><n=><ja>";/
-        "<I=><ju><l=><ja>";/
-        "<A=><v=><g=><u=><s=><t=><a=>";/
-        "<S=><e=><n=><t=><ja><b=><r=><ja>";/
-        "<O=><k=><t=><ja><b=><r=><ja>";/
-        "<N=><o=><ja><b=><r=><ja>";/
-        "<D=><e=><k=><a=><b=><r=><ja>"
+        "<I=><ju><n=><%'>";/
+        "<I=><ju><l=><%'>";/
+        "<A=><v=><g=><u=><s=><t=>";/
+        "<S=><e=><n=><t=><ja><b=><r=><%'>";/
+        "<O=><k=><t=><ja><b=><r=><%'>";/
+        "<N=><o=><ja><b=><r=><%'>";/
+        "<D=><e=><k=><a=><b=><r=><%'>"
 abmon   "<JA><n=><v=>";/
         "<F=><e=><v=>";/
         "<M=><a=><r=>";/
diff --git a/localedata/tst-rpmatch.c b/localedata/tst-rpmatch.c
new file mode 100644 (file)
index 0000000..f799304
--- /dev/null
@@ -0,0 +1,37 @@
+/* Test program for
+   Copyright (C) 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Jochen Hein <jochen.hein@delphi.central.de>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main (int argc, char* argv[])
+{
+  setlocale (LC_ALL, argv[1]);
+
+  if (rpmatch (argv[2]) != atol (argv[3]))
+    {
+      fprintf (stderr,"Failed: Locale %s, String %s, Exp: %s, got %d\n",
+              argv[1], argv[2], argv[3], rpmatch (argv[2]));
+      exit (EXIT_FAILURE);
+    }
+  exit (EXIT_SUCCESS);
+}
diff --git a/localedata/tst-rpmatch.sh b/localedata/tst-rpmatch.sh
new file mode 100755 (executable)
index 0000000..7718b54
--- /dev/null
@@ -0,0 +1,64 @@
+#! /bin/sh -f
+#
+# Copyright (C) 1998 Free Software Foundation, Inc.
+# This file is part of the GNU C Library and contains tests for
+# the rpmatch(3)-implementation.
+# contributed by Jochen Hein <jochen.hein@delphi.central.de>
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+common_objpfx=$1
+IFS="§"
+rc=0
+while read locale string result dummy; do
+    if [ "$locale" != "#" ]; then
+       LOCPATH=${common_objpfx}localedata \
+       ${common_objpfx}elf/ld.so --library-path $common_objpfx \
+       ${common_objpfx}localedata/tst-rpmatch $locale $string $result \
+       || exit 1
+    fi
+done <<EOF
+#§ These are the tests for rpmatch in glibc.  Each line contains one test,
+#§ comments start with #§ in the first column.  The fields are seperated
+#§ by paragraph signs and contain: the locale, the string, the expected
+#§ return value of rpmatch(3).  If the test fails, test-rpmatch prints
+#§ all these informations
+C§Yes§1
+C§yes§1
+C§YES§1
+C§YeS§1
+C§YEs§1
+C§yEs§1
+C§yES§1
+C§yeS§1
+C§No§0
+C§no§0
+#§ Uh, that's nonsense
+C§nonsens§0
+C§Error§-1
+de_DE§Yes§1
+de_DE§Ja§1
+de_DE§Jammerschade§1
+de_DE§dejavu§-1
+de_DE§Nein§0
+de_DE§Fehler§-1
+de_DE§jein§1
+EOF
+
+rc=$?
+if [ $rc -eq 1 ]; then
+    echo "Errors"
+fi
+exit $rc
index 3199925..7afe6c4 100644 (file)
@@ -1,9 +1,9 @@
 /* Getopt for GNU.
    NOTE: getopt is now part of the C library, so if you don't know what
-   "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
+   "Keep this file name-space clean" means, talk to drepper@gnu.org
    before changing it!
 
-   Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97
+   Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98
        Free Software Foundation, Inc.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -31,7 +31,7 @@
 #include <config.h>
 #endif
 
-#if !defined (__STDC__) || !__STDC__
+#if !defined __STDC__ || !__STDC__
 /* This is a separate conditional since some stdc systems
    reject `defined (const)'.  */
 #ifndef const
@@ -50,7 +50,7 @@
    it is simpler to just do this in the source for each such file.  */
 
 #define GETOPT_INTERFACE_VERSION 2
-#if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
 #include <gnu-versions.h>
 #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
 #define ELIDE_CODE
@@ -222,7 +222,7 @@ my_index (str, chr)
 #ifdef __GNUC__
 /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
    That was relevant to code that was here before.  */
-#if !defined (__STDC__) || !__STDC__
+#if !defined __STDC__ || !__STDC__
 /* gcc with -traditional declares the built-in strlen to return int,
    and has done so at least since version 2.4.5. -- rms.  */
 extern int strlen (const char *);
@@ -289,7 +289,7 @@ text_set_element (__libc_subinit, store_args_and_env);
    `first_nonopt' and `last_nonopt' are relocated so that they describe
    the new indices of the non-options in ARGV after they are moved.  */
 
-#if defined (__STDC__) && __STDC__
+#if defined __STDC__ && __STDC__
 static void exchange (char **);
 #endif
 
@@ -375,7 +375,7 @@ exchange (argv)
 
 /* Initialize the internal data when the first call is made.  */
 
-#if defined (__STDC__) && __STDC__
+#if defined __STDC__ && __STDC__
 static const char *_getopt_initialize (int, char *const *, const char *);
 #endif
 static const char *
index 4aa8de6..3d264f2 100644 (file)
@@ -1,5 +1,6 @@
 /* getopt_long and getopt_long_only entry points for GNU getopt.
-   Copyright (C) 1987,88,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
+   Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
+     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
@@ -23,7 +24,7 @@
 
 #include "getopt.h"
 
-#if !defined (__STDC__) || !__STDC__
+#if !defined __STDC__ || !__STDC__
 /* This is a separate conditional since some stdc systems
    reject `defined (const)'.  */
 #ifndef const
@@ -42,7 +43,7 @@
    it is simpler to just do this in the source for each such file.  */
 
 #define GETOPT_INTERFACE_VERSION 2
-#if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
 #include <gnu-versions.h>
 #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
 #define ELIDE_CODE
index 604e685..75cfe5f 100644 (file)
@@ -21,6 +21,8 @@
 #include <stdlib.h>
 #include <wordexp.h>
 
+#define IFS ", \n\t"
+
 struct test_case_struct
 {
   int retval;
@@ -31,12 +33,57 @@ struct test_case_struct
   const char *wordv[10];
 } test_case[] =
   {
+    /* Simple word-splitting */
     { 0, NULL, "one", 0, 1, { "one", } },
     { 0, NULL, "one two", 0, 2, { "one", "two", } },
     { 0, NULL, "one two three", 0, 3, { "one", "two", "three", } },
+
+    /* Simple parameter expansion */
     { 0, "foo", "${var}", 0, 1, { "foo", } },
     { 0, "foo", "$var", 0, 1, { "foo", } },
+
+    /* Simple quote removal */
     { 0, NULL, "\"quoted\"", 0, 1, { "quoted", } },
+    { 0, "foo", "\"$var\"\"$var\"", 0, 1, { "foofoo", } },
+    { 0, NULL, "'singly-quoted'", 0, 1, { "singly-quoted", } },
+
+    /* Simple command substitution */
+    { 0, NULL, "$(echo hello)", 0, 1, { "hello", } },
+    { 0, NULL, "$( (echo hello) )", 0, 1, { "hello", } },
+
+    /* Simple arithmetic expansion */
+    { 0, NULL, "$((1 + 1))", 0, 1, { "2", } },
+    { 0, NULL, "$((2-3))", 0, 1, { "-1", } },
+    { 0, NULL, "$((-1))", 0, 1, { "-1", } },
+
+    /* Field splitting */
+    { 0, NULL, " \tfoo\t\tbar ", 0, 2, { "foo", "bar", } },
+    { 0, NULL, "  red  , white blue", 0, 3, { "red", "white", "blue", } },
+
+    /* Advanced parameter expansion */
+    { 0, NULL, "${var:-bar}", 0, 1, { "bar", } },
+    { 0, NULL, "${var-bar}", 0, 1, { "bar", } },
+    { 0, "", "${var:-bar}", 0, 1, { "bar", } },
+    { 0, "foo", "${var:-bar}", 0, 1, { "foo", } },
+    { 0, "", "${var-bar}", 0, 0, { NULL, } },
+    { 0, NULL, "${var:=bar}", 0, 1, { "bar", } },
+    { 0, NULL, "${var=bar}", 0, 1, { "bar", } },
+    { 0, "", "${var:=bar}", 0, 1, { "bar", } },
+    { 0, "foo", "${var:=bar}", 0, 1, { "foo", } },
+    { 0, "", "${var=bar}", 0, 0, { NULL, } },
+    { 0, "foo", "${var:?bar}", 0, 1, { "foo", } },
+    { 0, NULL, "${var:+bar}", 0, 0, { NULL, } },
+    { 0, NULL, "${var+bar}", 0, 0, { NULL, } },
+    { 0, "", "${var:+bar}", 0, 0, { NULL, } },
+    { 0, "foo", "${var:+bar}", 0, 1, { "bar", } },
+    { 0, "", "${var+bar}", 0, 1, { "bar", } },
+    { 0, "12345", "${#var}", 0, 1, { "5", } },
+
+    { 0, "banana", "${var%na*}", 0, 1, { "bana", } },
+    { 0, "banana", "${var%%na*}", 0, 1, { "ba", } },
+    { 0, "borabora-island", "${var#*bora}", 0, 1, { "bora-island", } },
+    { 0, "borabora-island", "${var##*bora}", 0, 1, {"-island", } },
+
     { -1, NULL, NULL, 0, 0, { NULL, } },
   };
 
@@ -49,7 +96,7 @@ main (int argc, char * argv[])
   int test;
   int fail = 0;
 
-  setenv ("IFS", " \t\n", 1);
+  setenv ("IFS", IFS, 1);
   for (test = 0; test_case[test].retval != -1; test++)
     if (testit (&test_case[test]))
       ++fail;
index abd55a5..3bc22b5 100644 (file)
@@ -59,7 +59,7 @@ static int parse_backtick (char **word, size_t *word_length,
                           size_t *offset, int flags, wordexp_t *pwordexp,
                           const char *ifs, const char *ifs_white)
      internal_function;
-static int eval_expr (char *expr, int *result) internal_function;
+static int eval_expr (char *expr, long int *result) internal_function;
 
 /* The w_*() functions manipulate word lists. */
 
@@ -93,16 +93,12 @@ w_addchar (char *buffer, size_t *actlen, size_t *maxlen, char ch)
 }
 
 static char *
-w_addstr (char *buffer, size_t *actlen, size_t *maxlen, const char *str)
-     /* (lengths exclude trailing zero) */
+internal_function
+w_addmem (char *buffer, size_t *actlen, size_t *maxlen, const char *str,
+         size_t len)
 {
   /* Add a string to the buffer, allocating room for it if needed.
    */
-  size_t len;
-
-  assert (str != NULL); /* w_addstr only called from this file */
-  len = strlen (str);
-
   if (*actlen + len > *maxlen)
     {
       char *old_buffer = buffer;
@@ -123,7 +119,24 @@ w_addstr (char *buffer, size_t *actlen, size_t *maxlen, const char *str)
   return buffer;
 }
 
+
+static char *
+internal_function
+w_addstr (char *buffer, size_t *actlen, size_t *maxlen, const char *str)
+     /* (lengths exclude trailing zero) */
+{
+  /* Add a string to the buffer, allocating room for it if needed.
+   */
+  size_t len;
+
+  assert (str != NULL); /* w_addstr only called from this file */
+  len = strlen (str);
+
+  return w_addmem (buffer, actlen, maxlen, str, len);
+}
+
 static int
+internal_function
 w_addword (wordexp_t *pwordexp, char *word)
 {
   /* Add a word to the wordlist */
@@ -229,8 +242,8 @@ parse_tilde (char **word, size_t *word_length, size_t *max_length,
     {
       if (!((*word)[*word_length - 1] == '=' && wordc == 0))
        {
-         if (!((*word)[*word_length - 1] == ':' &&
-               strchr (*word, '=') && wordc == 0))
+         if (!((*word)[*word_length - 1] == ':'
+               && strchr (*word, '=') && wordc == 0))
            {
              *word = w_addchar (*word, word_length, max_length, '~');
              return *word ? 0 : WRDE_NOSPACE;
@@ -422,6 +435,7 @@ no_space:
 }
 
 static int
+internal_function
 parse_squote (char **word, size_t *word_length, size_t *max_length,
              const char *words, size_t *offset)
 {
@@ -444,7 +458,7 @@ parse_squote (char **word, size_t *word_length, size_t *max_length,
 /* Functions to evaluate an arithmetic expression */
 static int
 internal_function
-eval_expr_val (char **expr, int *result)
+eval_expr_val (char **expr, long int *result)
 {
   int sgn = +1;
   char *digit;
@@ -495,12 +509,12 @@ eval_expr_val (char **expr, int *result)
 
 static int
 internal_function
-eval_expr_multdiv (char **expr, int *result)
+eval_expr_multdiv (char **expr, long int *result)
 {
-  int arg;
+  long int arg;
 
   /* Read a Value */
-  if (eval_expr_val (expr, result))
+  if (eval_expr_val (expr, result) != 0)
     return WRDE_SYNTAX;
 
   while (**expr)
@@ -510,16 +524,16 @@ eval_expr_multdiv (char **expr, int *result)
 
       if (**expr == '*')
        {
-         (*expr)++;
-         if ((eval_expr_val (expr, &arg)) != 0)
+         ++(*expr);
+         if (eval_expr_val (expr, &arg) != 0)
            return WRDE_SYNTAX;
 
          *result *= arg;
        }
       else if (**expr == '/')
        {
-         (*expr)++;
-         if ((eval_expr_val (expr, &arg)) != 0)
+         ++(*expr);
+         if (eval_expr_val (expr, &arg) != 0)
            return WRDE_SYNTAX;
 
          *result /= arg;
@@ -532,12 +546,12 @@ eval_expr_multdiv (char **expr, int *result)
 
 static int
 internal_function
-eval_expr (char *expr, int *result)
+eval_expr (char *expr, long int *result)
 {
-  int arg;
+  long int arg;
 
   /* Read a Multdiv */
-  if ((eval_expr_multdiv (&expr, result)) != 0)
+  if (eval_expr_multdiv (&expr, result) != 0)
     return WRDE_SYNTAX;
 
   while (*expr)
@@ -547,16 +561,16 @@ eval_expr (char *expr, int *result)
 
       if (*expr == '+')
        {
-         expr++;
-         if ((eval_expr_multdiv (&expr, &arg)) != 0)
+         ++expr;
+         if (eval_expr_multdiv (&expr, &arg) != 0)
            return WRDE_SYNTAX;
 
          *result += arg;
        }
       else if (*expr == '-')
        {
-         expr++;
-         if ((eval_expr_multdiv (&expr, &arg)) != 0)
+         ++expr;
+         if (eval_expr_multdiv (&expr, &arg) != 0)
            return WRDE_SYNTAX;
 
          *result -= arg;
@@ -628,7 +642,8 @@ parse_arith (char **word, size_t *word_length, size_t *max_length,
          if (--paren_depth == 0)
            {
              char result[21];  /* 21 = ceil(log10(2^64)) + 1 */
-             int numresult = 0;
+             long int numresult = 0;
+             long long int convertme;
 
              if (bracket || words[1 + *offset] != ')')
                return WRDE_SYNTAX;
@@ -636,13 +651,25 @@ parse_arith (char **word, size_t *word_length, size_t *max_length,
              ++(*offset);
 
              /* Go - evaluate. */
-             if (*expr &&
-                 eval_expr (expr, &numresult) != 0)
+             if (*expr && eval_expr (expr, &numresult) != 0)
                return WRDE_SYNTAX;
 
+             if (numresult < 0)
+               {
+                 convertme = -numresult;
+                 *word = w_addchar (*word, word_length, max_length, '-');
+                 if (!*word)
+                   {
+                     free (expr);
+                     return WRDE_NOSPACE;
+                   }
+               }
+             else
+               convertme = numresult;
+
              result[20] = '\0';
              *word = w_addstr (*word, word_length, max_length,
-                               _itoa_word (numresult, &result[20], 10, 0));
+                               _itoa (convertme, &result[20], 10, 0));
              free (expr);
              return *word ? 0 : WRDE_NOSPACE;
            }
@@ -656,7 +683,7 @@ parse_arith (char **word, size_t *word_length, size_t *max_length,
          if (bracket && paren_depth == 1)
            {
              char result[21];  /* 21 = ceil(log10(2^64)) + 1 */
-             int numresult = 0;
+             long int numresult = 0;
 
              /* Go - evaluate. */
              if (*expr && eval_expr (expr, &numresult) != 0)
@@ -758,14 +785,11 @@ exec_comm (char *comm, char **word, size_t *word_length, size_t *max_length,
                break;
            }
 
-         for (i = 0; i < buflen; ++i)
+         *word = w_addmem (*word, word_length, max_length, buffer, buflen);
+         if (*word == NULL)
            {
-             *word = w_addchar (*word, word_length, max_length, buffer[i]);
-             if (*word == NULL)
-               {
-                 close (fildes[0]);
-                 return WRDE_NOSPACE;
-               }
+             close (fildes[0]);
+             return WRDE_NOSPACE;
            }
        }
 
@@ -874,6 +898,7 @@ exec_comm (char *comm, char **word, size_t *word_length, size_t *max_length,
 }
 
 static int
+internal_function
 parse_comm (char **word, size_t *word_length, size_t *max_length,
            const char *words, size_t *offset, int flags, wordexp_t *pwordexp,
            const char *ifs, const char *ifs_white)
@@ -949,6 +974,7 @@ parse_param (char **word, size_t *word_length, size_t *max_length,
   enum remove_pattern_enum remove = RP_NONE;
   int colon_seen = 0;
   int depth = 0;
+  int substitute_length = 0;
   int error;
 
   for (; words[*offset]; ++(*offset))
@@ -997,11 +1023,7 @@ parse_param (char **word, size_t *word_length, size_t *max_length,
          goto envsubst;
 
        case '#':
-         /* At the start?  (ie. 'string length') */
-         if (*offset == start + 1)
-           /* FIXME: This isn't written yet! */
-           break;
-
+         /* '#' only has special meaning inside braces */
          if (words[start] != '{')
            {
              /* Evaluate */
@@ -1010,8 +1032,16 @@ parse_param (char **word, size_t *word_length, size_t *max_length,
              goto envsubst;
            }
 
-         /* Separating variable name from prefix pattern? */
+         /* At the start? (i.e. 'string length') */
+         if (*offset == start + 1)
+           {
+             substitute_length = 1;
+             break;
+           }
+         else if (substitute_length)
+           goto syntax;
 
+         /* Separating variable name from prefix pattern? */
          if (remove == RP_NONE)
            {
              remove = RP_SHORT_LEFT;
@@ -1069,8 +1099,8 @@ parse_param (char **word, size_t *word_length, size_t *max_length,
              break;
            }
 
-         if ((words[1 + *offset] == '-') || (words[1 + *offset] == '=') ||
-             (words[1 + *offset] == '?') || (words[1 + *offset] == '+'))
+         if ((words[1 + *offset] == '-') || (words[1 + *offset] == '=')
+             || (words[1 + *offset] == '?') || (words[1 + *offset] == '+'))
            {
              colon_seen = 1;
              break;
@@ -1085,6 +1115,9 @@ parse_param (char **word, size_t *word_length, size_t *max_length,
          if (!*env)
            goto syntax;
 
+         if (substitute_length)
+           goto syntax;
+
          if (action != '\0' || remove != RP_NONE)
            {
              pattern = w_addchar (pattern, &pat_length, &pat_maxlen,
@@ -1184,7 +1217,7 @@ envsubst:
            switch (remove)
              {
              case RP_SHORT_LEFT:
-               for (p = value; p <= end; p++)
+               for (p = value; p <= end; ++p)
                  {
                    c = *p;
                    *p = '\0';
@@ -1200,7 +1233,7 @@ envsubst:
                break;
 
              case RP_LONG_LEFT:
-               for (p = end; p >= value; p--)
+               for (p = end; p >= value; --p)
                  {
                    c = *p;
                    *p = '\0';
@@ -1216,7 +1249,7 @@ envsubst:
                break;
 
              case RP_SHORT_RIGHT:
-               for (p = end; p >= value; p--)
+               for (p = end; p >= value; --p)
                  {
                    if (fnmatch (pattern, p, 0) != FNM_NOMATCH)
                      {
@@ -1228,7 +1261,7 @@ envsubst:
                break;
 
              case RP_LONG_RIGHT:
-               for (p = value; p <= end; p++)
+               for (p = value; p <= end; ++p)
                  {
                    if (fnmatch (pattern, p, 0) != FNM_NOMATCH)
                      {
@@ -1248,6 +1281,7 @@ envsubst:
 
        case '?':
          if (value && *value)
+           /* Substitute parameter */
            break;
 
          if (!colon_seen && value)
@@ -1292,8 +1326,94 @@ envsubst:
          free (pattern);
          return WRDE_BADVAL;
 
+       case '-':
+         if (value && *value)
+           /* Substitute parameter */
+           break;
+
+         if (!colon_seen && value)
+           {
+             /* Substitute NULL */
+             free (env);
+             free (pattern);
+             return 0;
+           }
+
+       subst_word:
+         {
+           /* Substitute word */
+           wordexp_t we;
+           char *expand_me = pattern;
+           int i;
+
+           if (pwordexp == NULL)
+             {
+               /* No field-splitting is allowed, so imagine
+                  quotes around the word.  */
+               expand_me = alloca (strlen (pattern) + 2);
+               sprintf (expand_me, "\"%s\"", pattern);
+             }
+
+           error = wordexp (expand_me, &we, flags);
+           if (error)
+             {
+               free (env);
+               free (pattern);
+               return error;
+             }
+
+           /* Fingers crossed that the quotes worked.. */
+           assert (pwordexp || we.we_wordc == 1);
+
+           /* Substitute */
+           for (i = 0; i < we.we_wordc; i++)
+             if (w_addword (pwordexp, __strdup(we.we_wordv[i]))
+                 == WRDE_NOSPACE)
+               break;
+
+           if (action == '=')
+             /* Also assign */
+             setenv (env, we.we_wordv[0], 1); /* need to strdup? */
+
+           wordfree (&we);
+
+           if (i < we.we_wordc)
+             /* Ran out of space */
+             goto no_space;
+
+           return 0;
+         }
+
+       case '+':
+         if (value && *value)
+           goto subst_word;
+
+         if (!colon_seen && value)
+           goto subst_word;
+
+         /* Substitute NULL */
+         free (env);
+         free (pattern);
+         return 0;
+
+       case '=':
+         if (value && *value)
+           /* Substitute parameter */
+           break;
+
+         if (!colon_seen && value)
+           {
+             /* Substitute NULL */
+             free (env);
+             free (pattern);
+             return 0;
+           }
+
+         /* This checks for '=' so it knows to assign */
+         goto subst_word;
+
        default:
-         printf ("warning: parameter substitution does not yet support \"%s%c\"\n", colon_seen?":":"", action);
+         assert (! "Unrecognised action!");
        }
     }
 
@@ -1309,9 +1429,22 @@ envsubst:
       return 0;
     }
 
+  if (substitute_length)
+    {
+      char param_length[21];
+      param_length[20] = '\0';
+      *word = w_addstr (*word, word_length, max_length,
+                       _itoa_word (strlen (value), &param_length[20], 10, 0));
+      return *word ? 0 : WRDE_NOSPACE;
+    }
+
+
   if (pwordexp == NULL)
-    /* Quoted - no field split */
-    *word = w_addstr (*word, word_length, max_length, value);
+    {
+      /* Quoted - no field split */
+      *word = w_addstr (*word, word_length, max_length, value);
+      return *word ? 0 : WRDE_NOSPACE;
+    }
   else
     {
       /* Need to field-split */
@@ -1331,7 +1464,7 @@ envsubst:
 
          if (!seen_nonws_ifs && *field_begin == 0)
            /* Nothing but whitespace */
-           return 0;
+           break;
 
          /* Search for the end of the field */
          field_end = field_begin;
@@ -1358,22 +1491,23 @@ envsubst:
          *field_end = 0;
          field = __strdup (field_begin);
          if (field == NULL)
-           goto no_space;
+           return WRDE_NOSPACE;
 
          /* Tag the field onto the word list */
          if (w_addword (pwordexp, field) == WRDE_NOSPACE)
-           return WRDE_NOSPACE;
+           {
+             free (field);
+             return WRDE_NOSPACE;
+           }
 
          *word = NULL;
          *word_length = *max_length = 0;
 
          field_begin = next_field;
        } while (seen_nonws_ifs || (field_begin && *field_begin));
-
-      return 0;
     }
 
-  return *word ? 0 : WRDE_NOSPACE;
+  return 0;
 
 no_space:
   if (env)
@@ -1658,7 +1792,7 @@ wordexp (const char *words, wordexp_t *pwordexp, int flags)
                *whch++ = *ifsch;
            }
 
-         ifsch++;
+         ++ifsch;
        }
       *whch = '\0';
     }
index 1241988..d6fd3d3 100644 (file)
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <stdlib.h>
+#include <unistd.h>
+
 int
 __libc_start_main (int (*main) (int, char **, char **), int argc,
-                  char **argv, char **envp)
+                  char **argv, void (*init) (void), void (*fini) (void),
+                  void (*rtld_fini) (void))
 {
-  return (*main) (argc, argv, envp);
+  /* Register the destructor of the dynamic linker if there is any.  */
+  if (rtld_fini != NULL)
+    atexit (rtld_fini);
+
+  /* Call the initializer of the libc.  */
+  __libc_init_first ();
+
+  /* Set the global _environ variable correctly.  */
+  __environ = &argv[argc + 1];
+
+  /* Call the initializer of the program.  */
+  (*init) ();
+
+  /* Register the destructor of the program.  */
+  atexit (fini);
+
+  exit ((*main) (argc, argv, envp));
 }
index e8ed204..95f74ed 100644 (file)
@@ -43,57 +43,32 @@ _start:
           the outermost frame obviously.  */
        xorl %ebp, %ebp
 
-       /* %edx contains the address of the shared library termination
-          function, which we will register with `atexit' to be called by
-          `exit'.  I suspect that on some systems, and when statically
-          linked, this will not be set by anything to any function
-          pointer; hopefully it will be zero so we don't try to call
-          random pointers.  */
-       testl %edx,%edx
-       jz .Lnofini
-       pushl %edx
-       call atexit
-       popl %eax               /* Pop value to unused register to remove
-                                  argument from stack.  */
-.Lnofini:
-
-       /* Do essential libc initialization.  In statically linked
-          programs under the GNU Hurd, this is what sets up the
-          arguments on the stack for the code below.  */
-       call __libc_init_first
-
-       /* Extract the arguments and environment as encoded on the stack
-          and set up the arguments for `main': argc, argv, envp.  */
+       /* Extract the arguments as encoded on the stack and set up
+          the arguments for `main': argc, argv.  envp will be determined
+          later in __libc_start_main.  */
        popl %esi               /* Pop the argument count.  */
-       leal 4(%esp,%esi,4), %eax /* envp = &argv[argc + 1] */
-       movl %eax, _environ     /* Store it in the global variable.  */
-       movl %esp, %edx         /* argv starts just at the current stack top.*/
+       movl %esp, %ecx         /* argv starts just at the current stack top.*/
 
        /* Before pushing the arguments align the stack to a double word
           boundary to avoid penalties from misaligned accesses.  Thanks
           to Edward Seidl <seidl@janed.com> for pointing this out.  */
        andl $0xfffffff8, %esp
-       pushl %eax              /* Push garbage because we allocate
-                                  twelve more bytes.  */
+       pushl %edx              /* Push address of the shared library
+                                  termination function.  */
 
-       pushl %eax              /* Push third argument: envp.  */
-       pushl %edx              /* Push second argument: argv.  */
+       /* Push address of our own entry points to .fini and .init.  */
+       pushl $_fini
+       pushl $_init
+
+       pushl %ecx              /* Push second argument: argv.  */
        pushl %esi              /* Push first argument: argc.  */
 
-       /* Call `_init', which is the entry point to our own `.init'
-          section; and register with `atexit' to have `exit' call
-          `_fini', which is the entry point to our own `.fini' section.  */
-       call _init
-       pushl $_fini
-       call atexit
-       popl %eax
+       pushl $main
 
        /* Call the user's main function, and exit with its value.
           But let the libc call main.    */
-       movl $main, %eax
-       pushl %eax
        call __libc_start_main
-       call exit
+
        hlt                     /* Crash if somehow `exit' does return.  */
 
 /* To fulfill the System V/i386 ABI we need this symbol.  Yuck, it's so
index 615371a..a24ea19 100644 (file)
@@ -1,5 +1,5 @@
 /* Low-level statistical profiling support function.  Linux/i386 version.
-   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998 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
@@ -19,7 +19,7 @@
 
 #include <signal.h>
 
-void
+static void
 profil_counter (int signo, struct sigcontext sc)
 {
   profil_count ((void *) sc.eip);
index f142195..e9d21a6 100644 (file)
    Boston, MA 02111-1307, USA.  */
 
 #include <link.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+extern void __libc_init_first (void);
 
 int
 __libc_start_main (int (*main) (int, char **, char **), int argc,
-                  char **argv, char **envp)
+                  char **argv, void (*init) (void), void (*fini) (void),
+                  void (*rtld_fini) (void))
 {
+  /* Register the destructor of the dynamic linker if there is any.  */
+  if (rtld_fini != NULL)
+    atexit (rtld_fini);
+
+  /* Call the initializer of the libc.  */
+#ifdef PIC
+  if (_dl_debug_impcalls)
+    _dl_debug_message ("\tinitialize libc\n\n", NULL);
+#endif
+  __libc_init_first ();
+
+  /* Set the global _environ variable correctly.  */
+  __environ = &argv[argc + 1];
+
+  /* Call the initializer of the program.  */
+#ifdef PIC
+  if (_dl_debug_impcalls)
+    _dl_debug_message ("\tinitialize program: ", argv[0], "\n\n", NULL);
+#endif
+  (*init) ();
+
+  /* Register the destructor of the program.  */
+  atexit (fini);
+
 #ifdef PIC
   if (_dl_debug_impcalls)
     _dl_debug_message ("\ttransferring control: ", argv[0], "\n\n", NULL);
 #endif
 
-  return (*main) (argc, argv, envp);
+  exit ((*main) (argc, argv, __environ));
 }