+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.
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
-# 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.
# 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
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>
Boston, MA 02111-1307, USA. */
#include <link.h>
-#include <stddef.h>
+#include <unistd.h>
/* The global scope we will use for symbol lookups.
+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.
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))))
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
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
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
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
% 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
% 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
<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
<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
<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
<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
<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
<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
<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
<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
<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
<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
<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
<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
<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
<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
<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
<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
<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
<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
<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
<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
<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
"<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=>";/
--- /dev/null
+/* 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);
+}
--- /dev/null
+#! /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
/* 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
#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
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
#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 *);
`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
/* 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 *
/* 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
#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
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
#include <stdlib.h>
#include <wordexp.h>
+#define IFS ", \n\t"
+
struct test_case_struct
{
int retval;
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, } },
};
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;
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. */
}
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;
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 */
{
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;
}
static int
+internal_function
parse_squote (char **word, size_t *word_length, size_t *max_length,
const char *words, size_t *offset)
{
/* 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;
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)
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;
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)
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;
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;
++(*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;
}
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)
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;
}
}
}
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)
enum remove_pattern_enum remove = RP_NONE;
int colon_seen = 0;
int depth = 0;
+ int substitute_length = 0;
int error;
for (; words[*offset]; ++(*offset))
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 */
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;
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;
if (!*env)
goto syntax;
+ if (substitute_length)
+ goto syntax;
+
if (action != '\0' || remove != RP_NONE)
{
pattern = w_addchar (pattern, &pat_length, &pat_maxlen,
switch (remove)
{
case RP_SHORT_LEFT:
- for (p = value; p <= end; p++)
+ for (p = value; p <= end; ++p)
{
c = *p;
*p = '\0';
break;
case RP_LONG_LEFT:
- for (p = end; p >= value; p--)
+ for (p = end; p >= value; --p)
{
c = *p;
*p = '\0';
break;
case RP_SHORT_RIGHT:
- for (p = end; p >= value; p--)
+ for (p = end; p >= value; --p)
{
if (fnmatch (pattern, p, 0) != FNM_NOMATCH)
{
break;
case RP_LONG_RIGHT:
- for (p = value; p <= end; p++)
+ for (p = value; p <= end; ++p)
{
if (fnmatch (pattern, p, 0) != FNM_NOMATCH)
{
case '?':
if (value && *value)
+ /* Substitute parameter */
break;
if (!colon_seen && value)
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!");
}
}
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 */
if (!seen_nonws_ifs && *field_begin == 0)
/* Nothing but whitespace */
- return 0;
+ break;
/* Search for the end of the field */
field_end = field_begin;
*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)
*whch++ = *ifsch;
}
- ifsch++;
+ ++ifsch;
}
*whch = '\0';
}
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));
}
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
/* 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
#include <signal.h>
-void
+static void
profil_counter (int signo, struct sigcontext sc)
{
profil_count ((void *) sc.eip);
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));
}