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.
This commit is contained in:
Ulrich Drepper 1998-03-08 15:26:29 +00:00
parent a78de796b7
commit 3db52d94e2
20 changed files with 523 additions and 165 deletions

View file

@ -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.

View 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

View 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

View file

@ -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>

View 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.

View 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.

View 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

View 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

View 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

View 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=>";/

37
localedata/tst-rpmatch.c Normal file
View file

@ -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);
}

64
localedata/tst-rpmatch.sh Executable file
View file

@ -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

View 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 *

View 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

View 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;

View 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';
}

View file

@ -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));
}

View 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

View 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);

View file

@ -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));
}