diff options
-rw-r--r-- | ChangeLog | 43 | ||||
-rw-r--r-- | Makeconfig | 3 | ||||
-rw-r--r-- | elf/Makefile | 4 | ||||
-rw-r--r-- | elf/dl-lookup.c | 2 | ||||
-rw-r--r-- | elf/dl-runtime.c | 2 | ||||
-rw-r--r-- | localedata/ChangeLog | 5 | ||||
-rw-r--r-- | localedata/Makefile | 8 | ||||
-rw-r--r-- | localedata/locales/de_AT | 4 | ||||
-rw-r--r-- | localedata/locales/de_DE | 4 | ||||
-rw-r--r-- | localedata/locales/ru_RU | 78 | ||||
-rw-r--r-- | localedata/tst-rpmatch.c | 37 | ||||
-rwxr-xr-x | localedata/tst-rpmatch.sh | 64 | ||||
-rw-r--r-- | posix/getopt.c | 14 | ||||
-rw-r--r-- | posix/getopt1.c | 7 | ||||
-rw-r--r-- | posix/wordexp-test.c | 49 | ||||
-rw-r--r-- | posix/wordexp.c | 252 | ||||
-rw-r--r-- | sysdeps/generic/libc-start.c | 24 | ||||
-rw-r--r-- | sysdeps/i386/elf/start.S | 51 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/profil-counter.h | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/libc-start.c | 33 |
20 files changed, 523 insertions, 165 deletions
diff --git a/ChangeLog b/ChangeLog index 22afadd53c..6e0a0b17d7 100644 --- 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. diff --git a/Makeconfig b/Makeconfig index b4634cc507..394baa96fb 100644 --- a/Makeconfig +++ b/Makeconfig @@ -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 diff --git a/elf/Makefile b/elf/Makefile index 19c5ef8c8f..45494de4a8 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -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 diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index 19e6f05ef0..c0f9731ce9 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -18,10 +18,10 @@ 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> diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c index 99927a933c..b01338a304 100644 --- a/elf/dl-runtime.c +++ b/elf/dl-runtime.c @@ -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. diff --git a/localedata/ChangeLog b/localedata/ChangeLog index ed255649de..e968fe07b9 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -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. diff --git a/localedata/Makefile b/localedata/Makefile index 4e26d15374..d62a6a346c 100644 --- a/localedata/Makefile +++ b/localedata/Makefile @@ -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 diff --git a/localedata/locales/de_AT b/localedata/locales/de_AT index 2c75d68694..a4642179d4 100644 --- a/localedata/locales/de_AT +++ b/localedata/locales/de_AT @@ -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 diff --git a/localedata/locales/de_DE b/localedata/locales/de_DE index 6308ff3b5d..b13f52f5c9 100644 --- a/localedata/locales/de_DE +++ b/localedata/locales/de_DE @@ -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 diff --git a/localedata/locales/ru_RU b/localedata/locales/ru_RU index 9da6982624..d898f63eec 100644 --- a/localedata/locales/ru_RU +++ b/localedata/locales/ru_RU @@ -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 index 0000000000..f79930408e --- /dev/null +++ b/localedata/tst-rpmatch.c @@ -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 index 0000000000..7718b54aaf --- /dev/null +++ b/localedata/tst-rpmatch.sh @@ -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 diff --git a/posix/getopt.c b/posix/getopt.c index 3199925828..7afe6c4a96 100644 --- a/posix/getopt.c +++ b/posix/getopt.c @@ -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 * diff --git a/posix/getopt1.c b/posix/getopt1.c index 4aa8de6f67..3d264f2db4 100644 --- a/posix/getopt1.c +++ b/posix/getopt1.c @@ -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 diff --git a/posix/wordexp-test.c b/posix/wordexp-test.c index 604e685607..75cfe5f360 100644 --- a/posix/wordexp-test.c +++ b/posix/wordexp-test.c @@ -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; diff --git a/posix/wordexp.c b/posix/wordexp.c index abd55a512c..3bc22b5717 100644 --- a/posix/wordexp.c +++ b/posix/wordexp.c @@ -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), ¶m_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'; } diff --git a/sysdeps/generic/libc-start.c b/sysdeps/generic/libc-start.c index 12419887a1..d6fd3d3581 100644 --- a/sysdeps/generic/libc-start.c +++ b/sysdeps/generic/libc-start.c @@ -16,9 +16,29 @@ 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)); } diff --git a/sysdeps/i386/elf/start.S b/sysdeps/i386/elf/start.S index e8ed2043ff..95f74ed647 100644 --- a/sysdeps/i386/elf/start.S +++ b/sysdeps/i386/elf/start.S @@ -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 diff --git a/sysdeps/unix/sysv/linux/i386/profil-counter.h b/sysdeps/unix/sysv/linux/i386/profil-counter.h index 615371ac35..a24ea19654 100644 --- a/sysdeps/unix/sysv/linux/i386/profil-counter.h +++ b/sysdeps/unix/sysv/linux/i386/profil-counter.h @@ -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); diff --git a/sysdeps/unix/sysv/linux/libc-start.c b/sysdeps/unix/sysv/linux/libc-start.c index f142195fbc..e9d21a638b 100644 --- a/sysdeps/unix/sysv/linux/libc-start.c +++ b/sysdeps/unix/sysv/linux/libc-start.c @@ -17,15 +17,44 @@ 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)); } |