summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog222
-rw-r--r--Makefile12
-rw-r--r--catgets/gencat.c11
-rw-r--r--db/makedb.c13
-rw-r--r--elf/ldd.bash.in46
-rw-r--r--elf/ldd.sh.in41
-rw-r--r--elf/rtld.c4
-rw-r--r--features.h19
-rw-r--r--glibcbug.in2
-rw-r--r--isomac.c320
-rw-r--r--libio/clearerr.c6
-rw-r--r--libio/feof.c8
-rw-r--r--libio/ferror.c5
-rw-r--r--libio/fileno.c1
-rw-r--r--libio/fputc.c2
-rw-r--r--libio/getc.c6
-rw-r--r--libio/getchar.c6
-rw-r--r--libio/iofflush.c4
-rw-r--r--libio/putc.c34
-rw-r--r--libio/putchar.c34
-rw-r--r--libio/stdio.h740
-rw-r--r--locale/C-time.c3
-rw-r--r--locale/programs/locale.c10
-rw-r--r--locale/programs/localedef.c7
-rw-r--r--malloc/malloc.c162
-rw-r--r--malloc/malloc.h7
-rw-r--r--malloc/thread-m.h36
-rw-r--r--manual/stdio-fp.c28
-rw-r--r--manual/stdio.texi55
-rw-r--r--math/math.h11
-rw-r--r--misc/error.c13
-rw-r--r--misc/sys/cdefs.h7
-rwxr-xr-xrellns-sh8
-rw-r--r--stdio-common/Makefile2
-rw-r--r--stdio-common/printf_fp.c10
-rw-r--r--stdio-common/printf_fphex.c440
-rw-r--r--stdio-common/tstscanf.c10
-rw-r--r--stdio-common/vfprintf.c86
-rw-r--r--stdio-common/vfscanf.c4
-rw-r--r--stdio/stdio.h69
-rw-r--r--stdlib/Makefile2
-rw-r--r--stdlib/stdlib.h155
-rw-r--r--stdlib/strtod.c52
-rw-r--r--stdlib/strtof.c2
-rw-r--r--stdlib/strtol.c16
-rw-r--r--stdlib/strtold.c2
-rw-r--r--stdlib/strtoll.c (renamed from stdlib/strtoq.c)2
-rw-r--r--stdlib/strtoull.c (renamed from stdlib/strtouq.c)2
-rw-r--r--stdlib/tst-strtol.c4
-rw-r--r--string/string.h22
-rw-r--r--sysdeps/ieee754/huge_val.h40
-rw-r--r--sysdeps/libm-ieee754/s_cbrtl.c2
-rw-r--r--sysdeps/posix/gai_strerror.c2
-rw-r--r--sysdeps/unix/syscalls.list2
-rw-r--r--sysdeps/unix/sysv/linux/accept.S1
-rw-r--r--sysdeps/unix/sysv/linux/bind.S1
-rw-r--r--sysdeps/unix/sysv/linux/connect.S1
-rw-r--r--sysdeps/unix/sysv/linux/getpeername.S1
-rw-r--r--sysdeps/unix/sysv/linux/getsockname.S1
-rw-r--r--sysdeps/unix/sysv/linux/getsockopt.S1
-rw-r--r--sysdeps/unix/sysv/linux/i386/socket.S34
-rw-r--r--sysdeps/unix/sysv/linux/listen.S1
-rw-r--r--sysdeps/unix/sysv/linux/recv.S1
-rw-r--r--sysdeps/unix/sysv/linux/recvfrom.S1
-rw-r--r--sysdeps/unix/sysv/linux/recvmsg.S1
-rw-r--r--sysdeps/unix/sysv/linux/send.S1
-rw-r--r--sysdeps/unix/sysv/linux/sendmsg.S1
-rw-r--r--sysdeps/unix/sysv/linux/sendto.S1
-rw-r--r--sysdeps/unix/sysv/linux/setsockopt.S1
-rw-r--r--sysdeps/unix/sysv/linux/shutdown.S1
-rw-r--r--sysdeps/unix/sysv/linux/socketpair.S1
-rw-r--r--sysdeps/unix/sysv/linux/timebits.h6
-rw-r--r--time/time.h5
-rw-r--r--wcsmbs/Makefile9
-rw-r--r--wcsmbs/wchar.h236
-rw-r--r--wcsmbs/wcscasecmp.c56
-rw-r--r--wcsmbs/wcsncase.c55
-rw-r--r--wcsmbs/wcstof.c2
-rw-r--r--wcsmbs/wcstold.c2
-rw-r--r--wcsmbs/wcstoll.c (renamed from wcsmbs/wcstoq.c)2
-rw-r--r--wcsmbs/wcstoull.c (renamed from wcsmbs/wcstouq.c)2
81 files changed, 2560 insertions, 674 deletions
diff --git a/ChangeLog b/ChangeLog
index 58f22b6917..c6bc83d747 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,168 @@
-Fri Feb 21 00:22:28 1997 Miles Bader <miles@gnu.ai.mit.edu>
+1997-02-24 23:05 Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>
+
+ * malloc/malloc.c (malloc_get_state): New function.
+ Saves global malloc state to an opaque data structure which
+ is dynamically allocated in the heap.
+ * malloc/malloc.c (malloc_set_state): New function.
+ Restore previously obtained state.
+ * malloc/malloc.h: Add declaration of malloc_get_state()
+ and malloc_set_state().
+
+1997-02-24 23:27 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/libm-ieee754/s_cbrtl.c: Shift B1_EXP value to right
+ position.
+
+1997-02-24 17:38 Ulrich Drepper <drepper@cygnus.com>
+
+ * misc/error.c: Make error and error_at_line weak aliases of
+ __error and __error_at_line respectively.
+ Suggested by David Mosberger-Tang <davidm@AZStarNet.COM>.
+
+ * sysdeps/unix/sysv/linux/i386/socket.S: Update copyright.
+
+1997-02-22 11:30 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * elf/ldd.bash.in: Run the program directly, not as argument
+ to the dynamic linker, if it contains an interpreter segment.
+ * elf/ldd.sh.in: Likewise.
+
+ * elf/rtld.c (dl_main): In verify mode check whether the dynamic
+ object contains an interpreter segment and exit with 2 if not.
+
+1997-02-23 01:23 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * Makefile (distribute): Remove nsswitch.h, netgroup.h, mcheck.h
+ and xlocale.h. Make-dist adds them automagically.
+
+1997-02-22 12:25 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * locale/C-time.c (_nl_C_LC_TIME): Add missing entry for
+ time-era-num-entries.
+
+1997-02-06 13:49 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * rellns-sh: No need to check for existance of first parameter.
+
+1997-02-24 15:20 Jonathan T. Agnew <jtagnew@amherst.edu>
+
+ * glibcbug.in: Don't mention destination on MAIL_AGENT command line
+ to avoid duplicate mail.
+
+1997-02-24 03:51 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile (distribute): Add isomac.c.
+ (tests): Run isomac test.
+
+ * features.h (__USE_ISOC9X): New macro.
+
+ * catgets/catgets.c: Don't use global variable `optind'. Instead
+ use result computed by argp_parse.
+ * db/makedb: Likewise.
+ * locale/programs/locale.c: Likewise.
+ * locale/programs/localedef.c: Likewise.
+
+ * libio/stdio.h: Rewrite. Make it more readable and add comments.
+
+ * libio/clearerr.c: Remove clearerr_locked alias.
+ * libio/feof.c: Remove feof_locked alias.
+ * libio/ferror.c: Remove feof_locked alias.
+ * libio/fileno.c: Remove fileno_locked alias.
+ * libio/fputc.c: Remove fputc_locked alias.
+ * libio/getc.c: Remove getc_locked alias.
+ * libio/getchar.c: Remove getchar_locked alias.
+ * libio/iofflush.c: Remove fflush_locked alias.
+ * libio/putc.c: Remove putc_locked alias.
+ * libio/putc.c: Remove putchar_locked alias.
+
+ * stdio-common/printf_fp.c: When number is inifinity print INF
+ or inf depending on case of specifier. Same for NaN where NAN
+ or nan is printed. Specified in ISO C 9X.
+
+ * misc/sys/cdefs.h (__restrict): Define to empty string for now.
+ * stdio/stdio.h: Add __restrict to prototypes where necessary.
+ * libio/stdio.h: Likewise.
+ * stdlib/stdlib.h: Likewise.
+ * string/string.h: Likewise.
+ * time/time.h: Likewise.
+ * wcsmbs/wchar.h: Likewise.
+
+ * stdlib/strtod.c: Change to recognize INF, INFINITY, NAN, and
+ NAN(...).
+
+ * sysdeps/ieee754/huge_val.h: Define HUGE_VALF and HUGE_VALL instead
+ of HUGE_VALf and HUGE_VALL.
+ * stdlib/strtof.c (FLOAT_HUGE_VAL): Use standard name HUGE_VALF
+ instead of HUGE_VALf.
+ * wcsmbs/wcstof.c: Likewise.
+ * stdlib/strtold.c (FLOAT_HUGE_VAL): Use standard name HUGE_VALL
+ instead of HUGE_VALl.
+ * wcsmbs/wcstold.c: Likewise.
+
+ * sysdeps/posix/gai_strerror.c: Use size_t for counter variable to
+ avoid warning.
+
+ * wcsmbs/Makefile (routines): Add wcscasecmp and wcsncase.
+ * wcsmbs/wchar.h: Add prototypes for wcscasecmp and wcsncase.
+ * wcsmbs/wcscasecmp.c: New file.
+ * wcsmbs/wcsncase.c: New file.
+
+ * stdlib/strtol.c: Define wide character quad word functions as
+ wcstoll and wcstoull and normal versions as strtoll and strtoull.
+ * wcsmbs/wchar.h: Add prototypes for wcstoll and wcstoull.
+ * wcsmbs/wcstoq: Renamed to wcstoll.c.
+ * wcsmbs/wcstouq: Renamed to wcstoull.c.
+ * wcsmbs/wcstoll.c: Renamed from wcstoq.c. Make wcstoq a weak
+ alias of wcstoll.
+ * wcsmbs/wcstoull.c: Renamed from wcstouq.c. Make wcstouq a weak
+ alias of wcstoull.
+ * wcsmbs/Makefile (routines): Replace wcstoq and wcstouq by
+ wcstoll and wcstoull respectively.
+ * stdlib/strtoq.c: Rename to strtoll.c.
+ * stdlib/strtouq.c: Rename to strtoull.c.
+ * stdlib/strtoll.c: Renamed from strtoq.c. Make strtoq a weak
+ alias of strtoll.
+ * stdlib/strtoll.c: Renamed from strtouq.c. Make strtouq a weak
+ alias of strtoull.
+ * stdlib/Makefile (routines): Replace strtoq and strtouq by
+ strtoll and strtoull respectively.
+ * stdio-common/vfscanf.c: Don't use __strtoq_internal and
+ __strtouq_internal but instead __strtoll_internal and
+ __strtoull_internal respectively.
+ * stdlib/stdlib.h (strtoq): Use __internal_strtoll in inline version.
+ (strtouq): Similar with __internal_strtoull.
+ * wcsmbs/wchar.h (wcstoq): Use __internal_wcstoll in inline version.
+ (wcstouq): Similar with __internal_wcstoull.
+
+1997-02-23 04:38 Ulrich Drepper <drepper@cygnus.com>
+
+ * stdlib/strtol.c (STRTOL): It is not illegal to parse a minus
+ sign in the strtouXX functions. The results gets simply negated.
+ * stdio-common/tstscanf.c: Add testcase for above case.
+ * stdlib/tst-strtol.c: Correct tests.
+
+ * manual/stdio-fp.c: New file. Generate output for example program
+ in stdio.texi.
+
+ * stdio-common/Makefile (routines): Add printf_fphex.
+ * stdio-common/vfprintf.c: Add handling of %a and %A specifier.
+ * stdio-common/printf_fphex.c: New file. Implement %a and %A
+ specifier.
+
+1997-02-22 03:01 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/unix/sysv/linux/timebits.h (CLK_TCK): Don't defined if
+ __STRICT_ANSI__.
+
+ * math/math.h: Prevent definition of struct exception when using
+ C++.
+
+1997-02-22 01:45 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/unix/syscalls.list: Dup takes only one argument.
+ Reported by Greg McGary.
+
+1997-02-21 00:22 Miles Bader <miles@gnu.ai.mit.edu>
* sysdeps/mach/hurd/readlink.c (__readlink): Use io_read rather
than file_get_translator.
@@ -6,12 +170,12 @@ Fri Feb 21 00:22:28 1997 Miles Bader <miles@gnu.ai.mit.edu>
* sysdeps/mach/hurd/defs.c, sysdeps/stub/defs.c, sysdeps/posix/defs.c
(_cleanup): Use __fcloseall instead of fclose with a NULL stream.
-Thu Feb 20 01:28:39 1997 Miles Bader <miles@gnu.ai.mit.edu>
+1997-02-20 01:28 Miles Bader <miles@gnu.ai.mit.edu>
* hurd/fchroot.c (fchroot): Reparent DIR to make it a real root.
* sysdeps/mach/hurd/chroot.c (chroot): Likewise.
-Wed Feb 19 13:56:04 1997 Miles Bader <miles@gnu.ai.mit.edu>
+1997-02-19 13:56 Miles Bader <miles@gnu.ai.mit.edu>
* sysdeps/mach/hurd/accept.c (accept): Don't segv if ADDR_LEN == 0
but ADDR also == 0.
@@ -20,7 +184,7 @@ Wed Feb 19 13:56:04 1997 Miles Bader <miles@gnu.ai.mit.edu>
now instead of a weak extern, as some old programs expect it to be
defined by ld.so.
-Tue Feb 18 15:39:08 1997 Miles Bader <miles@gnu.ai.mit.edu>
+1997-02-18 15:39 Miles Bader <miles@gnu.ai.mit.edu>
* hurd/hurdfault.c (_hurdsig_fault_preempter): New weak alias.
@@ -30,7 +194,7 @@ Tue Feb 18 15:39:08 1997 Miles Bader <miles@gnu.ai.mit.edu>
* malloc/thread-m.h (mutex_trylock): Invert sense of return value.
-Mon Feb 17 10:58:14 1997 Miles Bader <miles@gnu.ai.mit.edu>
+1997-02-17 10:58 Miles Bader <miles@gnu.ai.mit.edu>
* malloc/thread-m.h (mutex_trylock): Define to be __mutex_trylock,
not __mutex_try_lock.
@@ -40,24 +204,26 @@ Mon Feb 17 10:58:14 1997 Miles Bader <miles@gnu.ai.mit.edu>
* hurd/hurdinit.c (__libc_argv): Remove extern.
(__libc_argc): New variable.
-Sat Feb 15 10:23:32 1997 Miles Bader <miles@gnu.ai.mit.edu>
+1997-02-15 10:23 Miles Bader <miles@gnu.ai.mit.edu>
* hurd/hurd/threadvar.h (enum __hurd_threadvar_index): Add
_HURD_THREADVAR_MALLOC.
* malloc/thread-m.h
[_LIBC && !PTHREAD_MUTEX_INITIALIZER && MUTEX_INITIALIZER]
- (__x_mutex_lock, __x_mutex_unlock): Functions removed.
- (mutex_lock, mutex_unlock): Defined in terms of __mutex_*.
- (tsd_key_create, tsd_setspecific, tsd_setspecific): Change to
- hurd-specific definitions, using __hurd_threadvar_location.
+ (mutex_lock, mutex_unlock, mutex_trylock): Defined in terms of
+ __mutex_*.
+ (mutex_t): Type removed & replaced by new macro.
+ (tsd_key_t): Typedef to int instead of pthread_key_t.
+ (tsd_key_create, tsd_setspecific, tsd_getspecific): New macros.
+ (__pthread_initialize): New macro, work around assumption of pthreads.
(tsd_keys_alloced): New static variable.
<hurd/threadvar.h>: New include.
-
+
* hurd/report-wait.c (_hurd_itimer_thread): Make a weak extern.
(_S_msg_report_wait): Check to see if _hurd_itimer_thread is
defined before using it.
- * sysdeps/mach/hurd/i386/init-first.c (__libc_argv, __libc_argc):
+ * sysdeps/mach/hurd/i386/init-first.c (__libc_argv, __libc_argc):
Make extern.
* hurd/hurdinit.c (__libc_argv): Make extern.
@@ -76,13 +242,13 @@ Sat Feb 15 10:23:32 1997 Miles Bader <miles@gnu.ai.mit.edu>
(__hurd_threadvar_max, __hurd_threadvar_stack_offset,
__hurd_threadvar_stack_mask): Variables removed.
* sysdeps/mach/hurd/dl-sysdep.c (__hurd_sigthread_stack_base,
- __hurd_sigthread_stack_end, __hurd_sigthread_stack_variables,
- __hurd_threadvar_max, __hurd_threadvar_stack_offset,
- __hurd_threadvar_stack_mask): Variables removed.
+ __hurd_sigthread_stack_end, __hurd_sigthread_stack_variables,
+ __hurd_threadvar_max, __hurd_threadvar_stack_offset,
+ __hurd_threadvar_stack_mask): Variables removed.
-Fri Feb 14 14:07:19 1997 Miles Bader <miles@gnu.ai.mit.edu>
+1997-02-14 14:07 Miles Bader <miles@gnu.ai.mit.edu>
- * hurd/hurd.h (_hurd_pids_changed_stamp, _hurd_pids_changed_sync):
+ * hurd/hurd.h (_hurd_pids_changed_stamp, _hurd_pids_changed_sync):
Declare extern.
* malloc/thread-m.h
@@ -103,6 +269,26 @@ Fri Feb 14 14:07:19 1997 Miles Bader <miles@gnu.ai.mit.edu>
* locale/weight.h (collate_rules): It's an u_int32_t array.
(get_weight): Compute initial SLOT value correctly.
+1997-02-24 17:06 Geoffrey Keating <geoffk@discus.anu.edu.au>
+
+ * sysdeps/unix/sysv/linux/accept.S (NARGS): Describe number of
+ arguments taken, for sysdeps/unix/sysv/linux/powerpc/socket.S.
+ * sysdeps/unix/sysv/linux/bind.S: Likewise.
+ * sysdeps/unix/sysv/linux/connect.S: Likewise.
+ * sysdeps/unix/sysv/linux/getpeername.S: Likewise.
+ * sysdeps/unix/sysv/linux/getsockname.S: Likewise.
+ * sysdeps/unix/sysv/linux/getsockopt.S: Likewise.
+ * sysdeps/unix/sysv/linux/listen.S: Likewise.
+ * sysdeps/unix/sysv/linux/recv.S: Likewise.
+ * sysdeps/unix/sysv/linux/recvfrom.S: Likewise.
+ * sysdeps/unix/sysv/linux/recvmsg.S: Likewise.
+ * sysdeps/unix/sysv/linux/send.S: Likewise.
+ * sysdeps/unix/sysv/linux/sendmsg.S: Likewise.
+ * sysdeps/unix/sysv/linux/sendto.S: Likewise.
+ * sysdeps/unix/sysv/linux/setsockopt.S: Likewise.
+ * sysdeps/unix/sysv/linux/shutdown.S: Likewise.
+ * sysdeps/unix/sysv/linux/socketpair.S: Likewise.
+
1997-02-22 00:17 Ulrich Drepper <drepper@cygnus.com>
* catgets/gencat.c: Change to use argp.
@@ -436,7 +622,7 @@ Fri Feb 14 14:07:19 1997 Miles Bader <miles@gnu.ai.mit.edu>
trying to resolv name as numeric IPv6 address.
* nss/digits_dots.c: Likewise.
-Sat Feb 15 04:51:08 1997 Ulrich Drepper <drepper@cygnus.com>
+1997-02-15 04:51 Ulrich Drepper <drepper@cygnus.com>
* locale/setlocale.c (setlocale): Don't try to be clever about
unused locales. When the existence of the locale files isn't
diff --git a/Makefile b/Makefile
index 2d3762a00f..02e87d0ce7 100644
--- a/Makefile
+++ b/Makefile
@@ -277,19 +277,25 @@ parent_echo-distinfo:
$(addprefix +nodist+,$(generated))
+# Run a test on the header files we use.
+tests: $(objpfx)isomac
+ $(objpfx)isomac $(CC) '$(+sysdep-includes)' >$(common-objpfx)isomac.out
+
+$(objpfx)isomac: isomac.c
+ $(native-compile)
+
# Make the distribution tarfile.
distribute := README INSTALL FAQ NOTES NEWS PROJECTS \
COPYING.LIB COPYING ChangeLog ChangeLog.[0-9] \
Makefile Makeconfig Makerules Rules Make-dist MakeTAGS \
- extra-lib.mk o-iterator.mk \
+ extra-lib.mk o-iterator.mk isomac.c \
ansidecl.h mkinstalldirs move-if-change install-sh \
configure configure.in aclocal.m4 config.sub config.guess\
config.h.in config.make.in config-name.in Makefile.in \
autolock.sh rellns-sh munch-tmpl.c munch.awk interp.c \
sysdep.h set-hooks.h libc-symbols.h version.h shlib-versions \
- rpm/Makefile rpm/template rpm/rpmrc nsswitch.h netgroup.h \
- mcheck.h glibcbug.in xlocale.h
+ rpm/Makefile rpm/template rpm/rpmrc glibcbug.in
distribute := $(strip $(distribute))
generated := $(generated) stubs.h version-info.h
diff --git a/catgets/gencat.c b/catgets/gencat.c
index 9f1e762f53..bee101eb74 100644
--- a/catgets/gencat.c
+++ b/catgets/gencat.c
@@ -152,6 +152,7 @@ int
main (int argc, char *argv[])
{
struct catalog *result;
+ int remaining;
/* Set program name for messages. */
error_print_progname = error_print;
@@ -166,18 +167,18 @@ main (int argc, char *argv[])
result = NULL;
/* Parse and process arguments. */
- argp_parse (&argp, argc, argv, 0, 0, NULL);
+ argp_parse (&argp, argc, argv, 0, &remaining, NULL);
/* Determine output file. */
if (output_name == NULL)
- output_name = optind < argc ? argv[optind++] : "-";
+ output_name = remaining < argc ? argv[remaining++] : "-";
/* Process all input files. */
setlocale (LC_CTYPE, "C");
- if (optind < argc)
+ if (remaining < argc)
do
- result = read_input_file (result, argv[optind]);
- while (++optind < argc);
+ result = read_input_file (result, argv[remaining]);
+ while (++remaining < argc);
else
result = read_input_file (NULL, "-");
diff --git a/db/makedb.c b/db/makedb.c
index 9f84ea39fc..32029fbbc6 100644
--- a/db/makedb.c
+++ b/db/makedb.c
@@ -99,6 +99,7 @@ main (argc, argv)
FILE *input_file;
DB *db_file;
int status;
+ int remaining;
/* Set locale via LC_ALL. */
setlocale (LC_ALL, "");
@@ -110,27 +111,27 @@ main (argc, argv)
input_name = NULL;
/* Parse and process arguments. */
- argp_parse (&argp, argc, argv, 0, 0, NULL);
+ argp_parse (&argp, argc, argv, 0, &remaining, NULL);
/* Determine file names. */
if (do_undo || output_name != NULL)
{
- if (optind + 1 != argc)
+ if (remaining + 1 != argc)
{
wrong_arguments:
error (0, 0, gettext ("wrong number of arguments"));
argp_help (&argp, stdout, ARGP_HELP_SEE,
program_invocation_short_name);
}
- input_name = argv[optind];
+ input_name = argv[remaining];
}
else
{
- if (optind + 2 != argc)
+ if (remaining + 2 != argc)
goto wrong_arguments;
- input_name = argv[optind++];
- output_name = argv[optind];
+ input_name = argv[remaining++];
+ output_name = argv[remaining];
}
/* Special handling if we are asked to print the database. */
diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in
index dd4fc6ab96..48d5c90fd5 100644
--- a/elf/ldd.bash.in
+++ b/elf/ldd.bash.in
@@ -69,6 +69,7 @@ Report bugs using the \`glibcbug' script to <bugs@gnu.ai.mit.edu>."
esac
done
+add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
case $# in
0)
echo >&2 $"ldd: missing file arguments"
@@ -86,20 +87,29 @@ case $# in
elif test -r "$file"; then
test -x "$file" ||
echo $"ldd: warning: you do not have execution permission for" "\`$file'"
- if ${RTLD} --verify "$file"; then
- LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now \
- exec ${RTLD} ${RELOCS} "$file" || exit 1
- else
- echo $" not a dynamic executable"
- exit 1
- fi
+ ${RTLD} --verify "$file"
+ case $? in
+ 0)
+ eval $add_env exec '"$file"' || exit 1
+ ;;
+ 1)
+ echo $" not a dynamic executable"
+ exit 1
+ ;;
+ 2)
+ eval $add_env exec \${RTLD} '"$file"' || exit 1
+ ;;
+ *)
+ echo $"ldd: ${RTLD} exited with unknown exit code ($?)" >&2
+ exit 1
+ ;;
+ esac
else
echo $"ldd: error: you do not have read permission for" "\`$file'"
exit 1
fi
exit ;;
*)
- set -e # Bail out immediately if ${RTLD} loses on any argument.
result=0
for file; do
echo "${file}:"
@@ -113,13 +123,23 @@ case $# in
elif test -r "$file"; then
test -x "$file" || echo $"\
ldd: warning: you do not have execution permission for" "\`$file'"
- if ${RTLD} --verify "$file"; then
- LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now \
- ${RTLD} ${RELOCS} "$file" || result=1
- else
+ ${RTLD} --verify "$file"
+ case $? in
+ 0)
+ eval $add_env '"$file"' || result=1
+ ;;
+ 1)
echo $" not a dynamic executable"
result=1
- fi
+ ;;
+ 2)
+ eval $add_env ${RTLD} '"$file"' || result=1
+ ;;
+ *)
+ echo $"ldd: ${RTLD} exited with unknown exit code ($?)" >&2
+ exit 1
+ ;;
+ esac
else
echo $"ldd: error: you do not have read permission for" "\`$file'"
result=1
diff --git a/elf/ldd.sh.in b/elf/ldd.sh.in
index 0f3ed2e729..d5dd54a536 100644
--- a/elf/ldd.sh.in
+++ b/elf/ldd.sh.in
@@ -66,6 +66,7 @@ Try \`ldd --help' for more information."
esac
done
+add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
case $# in
0)
echo >&2 "\
@@ -85,13 +86,23 @@ Try \`ldd --help' for more information."
if test -r "$file"; then
test -x "$file" ||
echo "ldd: warning: you do not have execution permission for \`$file'"
- if ${RTLD} --verify "$file"; then
- LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now \
- exec ${RTLD} "$file" || exit 1
- else
+ ${RTLD} --verify "$file"
+ case $? in
+ 0)
+ eval $add_env exec '"$file"' || exit 1
+ ;;
+ 1)
echo ' not a dynamic executable'
exit 1
- fi
+ ;;
+ 2)
+ eval $add_env exec \${RTLD} '"$file"' || exit 1
+ ;;
+ *)
+ echo "ldd: ${RTLD} exited with unknown exit code ($?)" >&2
+ exit 1
+ ;;
+ esac
else
echo "ldd: error: you do not have read permission for \`$file'"
exit 1
@@ -114,13 +125,23 @@ Try \`ldd --help' for more information."
if test -r "$file"; then
test -x "$file" || echo "\
ldd: warning: you do not have execution permission for \`$file'"
- if ${RTLD} --verify "$file"; then
- LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now \
- ${RTLD} "$file" || result=1
- else
+ ${RTLD} --verify "$file"
+ case $? in
+ 0)
+ eval $add_env '"$file"' || result=1
+ ;;
+ 1)
echo ' not a dynamic executable'
result=1
- fi
+ ;;
+ 2)
+ eval $add_env ${RTLD} '"$file"' || result=1
+ ;;
+ *)
+ echo "ldd: ${RTLD} exited with unknown exit code ($?)" >&2
+ exit 1
+ ;;
+ esac
else
echo "ldd: error: you do not have read permission for \`$file'"
result=1
diff --git a/elf/rtld.c b/elf/rtld.c
index 26cacef894..eb7b3bec2a 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -155,6 +155,7 @@ dl_main (const ElfW(Phdr) *phdr,
const char *preloadlist;
size_t file_size;
char *file;
+ int has_interp = 0;
mode = getenv ("LD_TRACE_LOADED_OBJECTS") != NULL ? trace : normal;
@@ -299,6 +300,7 @@ of this helper program; chances are you did not intend to run this program.\n",
_dl_rtld_libname.name = (const char *) l->l_addr + ph->p_vaddr;
_dl_rtld_libname.next = NULL;
_dl_rtld_map.l_libname = &_dl_rtld_libname;
+ has_interp = 1;
break;
}
if (! _dl_rtld_map.l_libname && _dl_rtld_map.l_name)
@@ -315,7 +317,7 @@ of this helper program; chances are you did not intend to run this program.\n",
if (mode == verify)
/* We were called just to verify that this is a dynamic executable
using us as the program interpreter. */
- _exit (l->l_ld == NULL ? EXIT_FAILURE : EXIT_SUCCESS);
+ _exit (l->l_ld == NULL ? 1 : has_interp ? 0 : 2);
/* Extract the contents of the dynamic section for easy access. */
elf_get_dynamic_info (l->l_ld, l->l_info);
diff --git a/features.h b/features.h
index 9baaa053fa..a14179b6a3 100644
--- a/features.h
+++ b/features.h
@@ -24,6 +24,7 @@
to specify the desired environment:
__STRICT_ANSI__ ISO Standard C.
+ _ISOC9X_SOURCE Extensions to ISO C 89 from ISO C 9x.
_POSIX_SOURCE IEEE Std 1003.1.
_POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;
if >=199309L, add IEEE Std 1003.1b-1993
@@ -44,6 +45,7 @@
These are defined by this file and are used by the
header files to decide what to declare or define:
+ __USE_ISOC9X Define ISO C 9X things.
__USE_POSIX Define IEEE Std 1003.1 things.
__USE_POSIX2 Define IEEE Std 1003.2 things.
__USE_POSIX199309 Define IEEE Std 1003.1b things.
@@ -69,6 +71,7 @@
/* Undefine everything, so we get a clean slate. */
+#undef __USE_ISOC9X
#undef __USE_POSIX
#undef __USE_POSIX2
#undef __USE_POSIX199309
@@ -102,6 +105,8 @@
/* If _GNU_SOURCE was defined by the user, turn on all the other features. */
#ifdef _GNU_SOURCE
+#undef _ISOC9X_SOURCE
+#define _ISOC9X_SOURCE 1
#undef _POSIX_SOURCE
#define _POSIX_SOURCE 1
#undef _POSIX_C_SOURCE
@@ -118,14 +123,20 @@
/* If nothing (other than _GNU_SOURCE) is defined,
define _BSD_SOURCE and _SVID_SOURCE. */
-#if (!defined __STRICT_ANSI__ && !defined _POSIX_SOURCE && \
- !defined _POSIX_C_SOURCE && !defined _XOPEN_SOURCE && \
- !defined _XOPEN_SOURCE_EXTENDED && !defined _BSD_SOURCE && \
- !defined _SVID_SOURCE)
+#if (!defined __STRICT_ANSI__ && !defined _ISOC9X_SOURCE && \
+ !defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE && \
+ !defined _XOPEN_SOURCE && !defined _XOPEN_SOURCE_EXTENDED && \
+ !defined _BSD_SOURCE && !defined _SVID_SOURCE)
#define _BSD_SOURCE 1
#define _SVID_SOURCE 1
#endif
+/* This is to enable the ISO C 9x extension. It will go away as soon
+ as this standard is officially released. */
+#ifdef _ISOC9X_SOURCE
+#define __USE_ISOC9X 1
+#endif
+
/* If none of the ANSI/POSIX macros are defined, use POSIX.1 and POSIX.2
(and IEEE Std 1003.1b-1993 unless _XOPEN_SOURCE is defined). */
#if (!defined __STRICT_ANSI__ && !defined _POSIX_SOURCE && \
diff --git a/glibcbug.in b/glibcbug.in
index 28087892a5..0d46b325ab 100644
--- a/glibcbug.in
+++ b/glibcbug.in
@@ -232,7 +232,7 @@ sed -e "
/^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;;
" $TEMP > $TEMP.x
-if $MAIL_AGENT $BUGGLIBC < $TEMP.x; then
+if $MAIL_AGENT < $TEMP.x; then
echo "$COMMAND: problem report sent"
xs=0; exit
else
diff --git a/isomac.c b/isomac.c
new file mode 100644
index 0000000000..fc6de89558
--- /dev/null
+++ b/isomac.c
@@ -0,0 +1,320 @@
+/* Check system header files for ISO 9899:1990 (ISO C) compliance.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jens Schweikhardt <schweikh@noc.dfn.de>, 1996.
+
+ 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. */
+
+/* This is a simple minded program that tries to find illegal macro
+ definitions in system header files. Illegal macro definitions are
+ those not from the implementation namespace (i.e. not starting with
+ an underscore) or not matching any identifier mandated by The
+ Standard. Some common macro names are considered okay, e.g. all those
+ beginning with E (which may be defined in <errno.h>) or ending in
+ _MAX. See the arrays prefix[] and suffix[] below for details.
+
+ In a compliant implementation no other macros can be defined, because
+ you could write strictly conforming programs that may fail to compile
+ due to syntax errors: suppose <stdio.h> defines PIPE_BUF, then the
+ conforming
+
+ #include <assert.h>
+ #include <stdio.h> <- or where the bogus macro is defined
+ #include <string.h>
+ #define STR(x) #x
+ #define XSTR(x) STR(x)
+ int main (void)
+ {
+ int PIPE_BUF = 0;
+ assert (strcmp ("PIPE_BUF", XSTR (PIPE_BUF)) == 0);
+ return 0;
+ }
+
+ is expected to compile and meet the assertion. If it does not, your
+ compiler compiles some other language than Standard C.
+
+ REQUIREMENTS:
+ This program calls gcc to get the list of defined macros. If you
+ don't have gcc you're probably out of luck unless your compiler or
+ preprocessor has something similar to gcc's -dM option. Tune
+ PRINT_MACROS in this case. This program assumes headers are found
+ under /usr/include and that there is a writable /tmp directory.
+ Tune SYSTEM_INCLUDE and TMPFILE if your system differs.
+ #define BROKEN_SYSTEM if system(NULL) bombs -- one more violation
+ of ISO C, by the way.
+
+ OUTPUT:
+ Each header file name is printed, followed by illegal macro names
+ and their definition. For the above example, you would see
+ ...
+ /usr/include/stdio.h
+ #define PIPE_BUF 5120
+ ...
+ If your implementation does not yet incorporate Amendment 1 you
+ will see messages about iso646.h, wctype.h and wchar.h not being
+ found. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define TMPFILE "/tmp/macros"
+#define HEADER_MAX 256
+
+/* ISO C header names including Amendment 1 (without ".h" suffix). */
+static char *header[] =
+{
+ "assert", "ctype", "errno", "float", "iso646", "limits", "locale",
+ "math", "setjmp", "signal", "stdarg", "stddef", "stdio", "stdlib",
+ "string", "time", "wchar", "wctype"
+};
+
+/* Macros with these prefixes are considered okay. */
+static char *prefix[] =
+{
+ "_", "E", "is", "str", "mem", "SIG", "FLT_", "DBL_", "LDBL_",
+ "LC_", "wmem", "wcs"
+};
+
+/* Macros with these suffixes are considered okay. Will not work for
+ parametrized macros with arguments. */
+static char *suffix[] =
+{
+ "_MAX", "_MIN"
+};
+
+/* These macros are considered okay. In fact, these are just more prefixes. */
+static char *macros[] =
+{
+ "BUFSIZ", "CHAR_BIT", "CHAR_MAX", "CHAR_MIN", "CLOCKS_PER_SEC",
+ "DBL_DIG", "DBL_EPSILON", "DBL_MANT_DIG", "DBL_MAX",
+ "DBL_MAX_10_EXP", "DBL_MAX_EXP", "DBL_MIN", "DBL_MIN_10_EXP",
+ "DBL_MIN_EXP", "EDOM", "EILSEQ", "EOF", "ERANGE", "EXIT_FAILURE",
+ "EXIT_SUCCESS", "FILENAME_MAX", "FLT_DIG", "FLT_EPSILON",
+ "FLT_MANT_DIG", "FLT_MAX", "FLT_MAX_10_EXP", "FLT_MAX_EXP",
+ "FLT_MIN", "FLT_MIN_10_EXP", "FLT_MIN_EXP", "FLT_RADIX",
+ "FLT_ROUNDS", "FOPEN_MAX", "HUGE_VAL", "INT_MAX", "INT_MIN",
+ "LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_MONETARY", "LC_NUMERIC",
+ "LC_TIME", "LDBL_DIG", "LDBL_EPSILON", "LDBL_MANT_DIG", "LDBL_MAX",
+ "LDBL_MAX_10_EXP", "LDBL_MAX_EXP", "LDBL_MIN", "LDBL_MIN_10_EXP",
+ "LDBL_MIN_EXP", "LONG_MAX", "LONG_MIN", "L_tmpnam", "MB_CUR_MAX",
+ "MB_LEN_MAX", "NDEBUG", "NULL", "RAND_MAX", "SCHAR_MAX",
+ "SCHAR_MIN", "SEEK_CUR", "SEEK_END", "SEEK_SET", "SHRT_MAX",
+ "SHRT_MIN", "SIGABRT", "SIGFPE", "SIGILL", "SIGINT", "SIGSEGV",
+ "SIGTERM", "SIG_DFL", "SIG_ERR", "SIG_IGN", "TMP_MAX", "UCHAR_MAX",
+ "UINT_MAX", "ULONG_MAX", "USHRT_MAX", "WCHAR_MAX", "WCHAR_MIN",
+ "WEOF", "_IOFBF", "_IOLBF", "_IONBF", "abort", "abs", "acos",
+ "acosf", "acosl", "and", "and_eq", "asctime", "asin", "asinf",
+ "asinl", "assert", "atan", "atan2", "atan2f", "atan2l", "atanf",
+ "atanl", "atexit", "atof", "atoi", "atol", "bitand", "bitor",
+ "bsearch", "btowc", "calloc", "ceil", "ceilf", "ceill", "clearerr",
+ "clock", "clock_t", "compl", "cos", "cosf", "cosh", "coshf",
+ "coshl", "cosl", "ctime", "difftime", "div", "div_t", "errno",
+ "exit", "exp", "expf", "expl", "fabs", "fabsf", "fabsl", "fclose",
+ "feof", "ferror", "fflush", "fgetc", "fgetpos", "fgets", "fgetwc",
+ "fgetws", "floor", "floorf", "floorl", "fmod", "fmodf", "fmodl",
+ "fopen", "fprintf", "fputc", "fputs", "fputwc", "fputws", "fread",
+ "free", "freopen", "frexp", "frexpf", "frexpl", "fscanf", "fseek",
+ "fsetpos", "ftell", "fwide", "fwprintf", "fwrite", "fwscanf",
+ "getc", "getchar", "getenv", "gets", "getwc", "getwchar", "gmtime",
+ "isalnum", "isalpha", "iscntrl", "isdigit", "isgraph", "islower",
+ "isprint", "ispunct", "isspace", "isupper", "iswalnum", "iswalpha",
+ "iswcntrl", "iswctype", "iswdigit", "iswgraph", "iswlower",
+ "iswprint", "iswpunct", "iswspace", "iswupper", "iswxdigit",
+ "isxdigit", "labs", "ldexp", "ldexpf", "ldexpl", "ldiv", "ldiv_t",
+ "localeconv", "localtime", "log", "log10", "log10f", "log10l",
+ "logf", "logl", "longjmp", "malloc", "mblen", "mbrlen", "mbrtowc",
+ "mbsinit", "mbsrtowcs", "mbstate_t", "mbstowcs", "mbtowc", "memchr",
+ "memcmp", "memcpy", "memmove", "memset", "mktime", "modf", "modff",
+ "modfl", "not", "not_eq", "offsetof", "or", "or_eq", "perror",
+ "pow", "powf", "powl", "printf", "ptrdiff_t", "putc", "putchar",
+ "puts", "putwc", "putwchar", "qsort", "raise", "rand", "realloc",
+ "remove", "rename", "rewind", "scanf", "setbuf", "setjmp",
+ "setlocale", "setvbuf", "sig_atomic_t", "signal", "sin", "sinf",
+ "sinh", "sinhf", "sinhl", "sinl", "size_t", "sprintf", "sqrt",
+ "sqrtf", "sqrtl", "srand", "sscanf", "stderr", "stdin", "stdout",
+ "strcat", "strchr", "strcmp", "strcoll", "strcpy", "strcspn",
+ "strerror", "strftime", "strlen", "strncat", "strncmp", "strncpy",
+ "strpbrk", "strrchr", "strspn", "strstr", "strtod", "strtok",
+ "strtol", "strtoul", "strxfrm", "swprintf", "swscanf", "system",
+ "tan", "tanf", "tanh", "tanhf", "tanhl", "tanl", "time", "time_t",
+ "tmpfile", "tmpnam", "tolower", "toupper", "towctrans", "towlower",
+ "towupper", "ungetc", "ungetwc", "va_arg", "va_end", "va_start",
+ "vfprintf", "vfwprintf", "vprintf", "vsprintf", "vswprintf",
+ "vwprintf", "wchar_t", "wcrtomb", "wcscat", "wcschr", "wcscmp",
+ "wcscoll", "wcscpy", "wcscspn", "wcsftime", "wcslen", "wcsncat",
+ "wcsncmp", "wcsncpy", "wcspbrk", "wcsrchr", "wcsrtombs", "wcsspn",
+ "wcsstr", "wcstod", "wcstok", "wcstol", "wcstombs", "wcstoul",
+ "wcsxfrm", "wctob", "wctomb", "wctrans", "wctrans_t", "wctype",
+ "wctype_t", "wint_t", "wmemchr", "wmemcmp", "wmemcpy", "wmemmove",
+ "wmemset", "wprintf", "wscanf", "xor", "xor_eq"
+};
+
+#define NUMBER_OF_HEADERS (sizeof header / sizeof *header)
+#define NUMBER_OF_PREFIXES (sizeof prefix / sizeof *prefix)
+#define NUMBER_OF_SUFFIXES (sizeof suffix / sizeof *suffix)
+#define NUMBER_OF_MACROS (sizeof macros / sizeof *macros)
+
+/* The compiler we use (given on the command line). */
+char *CC;
+/* The -I parameters for CC to find all headers. */
+char *INC;
+
+static int check_header (const char *);
+
+int
+main (int argc, char *argv[])
+{
+ int h;
+ int result = 0;
+
+ CC = argc > 1 ? argv[1] : "gcc";
+ INC = argc > 2 ? argv[2] : "";
+
+ if (system (NULL) == 0)
+ {
+ puts ("Sorry, no command processor.");
+ return EXIT_FAILURE;
+ }
+
+ for (h = 0; h < NUMBER_OF_HEADERS; ++h)
+ {
+ char file_name[HEADER_MAX];
+ sprintf (file_name, "%s.h", header[h]);
+ result |= check_header (file_name);
+ }
+
+
+#if 0
+ /* The test suite should return errors but for now this is not
+ practical. Give a warning and ask the user to correct the bugs. */
+ return result;
+#else
+ if (result)
+ fputs ("\
+##########################################################################\n\
+# The test suite found some problems with your system (see the generated #\n\
+# isomac.out file). These are all violations of the ISO C rules and #\n\
+# should be corrected. If the problem is in the libc, report it using #\n\
+# the glibcbug script to <bugs@gnu.ai.mit.edu>. If it is a problem with #\n\
+# your compiler, contact the compiler manufacturer. #\n\
+##########################################################################\n",
+ stderr);
+
+ return 0;
+#endif
+}
+
+static int
+check_header (const char *file_name)
+{
+ char line[BUFSIZ], *command;
+ FILE *input;
+ int result = 0;
+ static const char fmt[] = "\
+echo \"#include <%s>\" |\
+%s -E -dM -ansi -pedantic %s -D_LIBC -I. -I `%s --print-prog-name=include` -\
+> %s";
+
+ command = malloc (sizeof fmt + strlen (file_name) + 2 * strlen (CC)
+ + strlen (INC) + strlen (TMPFILE));
+
+ if (command == NULL)
+ {
+ puts ("No more memory.");
+ exit (1);
+ }
+
+ puts (file_name);
+ sprintf (command, fmt, file_name, CC, INC, CC, TMPFILE);
+
+ if (system (command))
+ {
+ puts ("system() returned nonzero");
+ result = 1;
+ }
+ free (command);
+ input = fopen (TMPFILE, "r");
+
+ if (input == NULL)
+ {
+ printf ("Could not read %s: ", TMPFILE);
+ perror (NULL);
+ return 1;
+ }
+
+ while (fgets (line, sizeof line, input) != NULL)
+ {
+ int i, okay = 0;
+ size_t endmac;
+ if (strlen (line) < 9 || line[7] != ' ')
+ { /* "#define A" */
+ printf ("Malformed input, expected '#define MACRO'\ngot '%s'\n",
+ line);
+ result = 1;
+ continue;
+ }
+ for (i = 0; i < NUMBER_OF_PREFIXES; ++i)
+ {
+ if (!strncmp (line+8, prefix[i], strlen (prefix[i]))) {
+ ++okay;
+ break;
+ }
+ }
+ if (okay)
+ continue;
+ for (i = 0; i < NUMBER_OF_MACROS; ++i)
+ {
+ if (!strncmp (line+8, macros[i], strlen (macros[i])))
+ {
+ ++okay;
+ break;
+ }
+ }
+ if (okay)
+ continue;
+ /* Find next char after the macro identifier; this can be either
+ a space or an open parenthesis. */
+ endmac = strcspn (line + 8, " (");
+ if (line[8+endmac] == '\0')
+ {
+ printf ("malformed input, expected '#define MACRO VALUE'\n"
+ "got '%s'\n", line);
+ result = 1;
+ continue;
+ }
+ for (i = 0; i < NUMBER_OF_SUFFIXES; ++i)
+ {
+ size_t len = strlen (suffix[i]);
+ if (!strncmp (line + 8 + endmac - len, suffix[i], len))
+ {
+ ++okay;
+ break;
+ }
+ }
+ if (!okay)
+ {
+ fputs (line, stdout);
+ result = 2;
+ }
+ }
+ fclose (input);
+ remove (TMPFILE);
+
+ return result;
+}
+
+/* EOF */
diff --git a/libio/clearerr.c b/libio/clearerr.c
index 7c7fb93dc0..4776250ff8 100644
--- a/libio/clearerr.c
+++ b/libio/clearerr.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997 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
@@ -28,7 +28,3 @@ clearerr (fp)
_IO_clearerr (fp);
_IO_funlockfile (fp);
}
-
-#ifdef _IO_MTSAFE_IO
-weak_alias (clearerr, clearerr_locked)
-#endif
diff --git a/libio/feof.c b/libio/feof.c
index 34ca1da161..23674704d6 100644
--- a/libio/feof.c
+++ b/libio/feof.c
@@ -36,11 +36,3 @@ _IO_feof (fp)
return result;
}
weak_alias (_IO_feof, feof)
-
-#ifdef _IO_MTSAFE_IO
-/* The feof implementation for libio does not require locking because
- it only accesses once a single variable and this is already atomic
- (at least at thread level). */
-
-weak_alias (_IO_feof, feof_locked)
-#endif
diff --git a/libio/ferror.c b/libio/ferror.c
index 4f75092149..b9ed64587c 100644
--- a/libio/ferror.c
+++ b/libio/ferror.c
@@ -36,8 +36,3 @@ _IO_ferror (fp)
return result;
}
weak_alias (_IO_ferror, ferror)
-
-#ifdef _IO_MTSAFE_IO
-
-weak_alias (ferror, ferror_locked)
-#endif
diff --git a/libio/fileno.c b/libio/fileno.c
index 08e657b970..269ecb875a 100644
--- a/libio/fileno.c
+++ b/libio/fileno.c
@@ -43,5 +43,4 @@ fileno (fp)
(at least at thread level). */
weak_alias (fileno, fileno_unlocked)
-weak_alias (fileno, fileno_locked)
#endif
diff --git a/libio/fputc.c b/libio/fputc.c
index 89359dc46d..e1f10f1b20 100644
--- a/libio/fputc.c
+++ b/libio/fputc.c
@@ -38,5 +38,3 @@ fputc (c, fp)
_IO_cleanup_region_end (1);
return result;
}
-
-weak_alias (fputc, fputc_locked)
diff --git a/libio/getc.c b/libio/getc.c
index eede63984f..d3e89fcc27 100644
--- a/libio/getc.c
+++ b/libio/getc.c
@@ -41,9 +41,3 @@ _IO_getc (fp)
}
#undef getc
weak_alias (_IO_getc, getc)
-
-#ifdef _IO_MTSAFE_IO
-# undef getc_locked
-
-weak_alias (getc, getc_locked)
-#endif
diff --git a/libio/getchar.c b/libio/getchar.c
index aa675591ad..25eb2b10ae 100644
--- a/libio/getchar.c
+++ b/libio/getchar.c
@@ -37,9 +37,3 @@ getchar ()
_IO_cleanup_region_end (1);
return result;
}
-
-#ifdef _IO_MTSAFE_IO
-# undef getchar_locked
-
-weak_alias (getchar, getchar_locked)
-#endif
diff --git a/libio/iofflush.c b/libio/iofflush.c
index af69486164..96cb49b2dc 100644
--- a/libio/iofflush.c
+++ b/libio/iofflush.c
@@ -44,7 +44,3 @@ _IO_fflush (fp)
}
weak_alias (_IO_fflush, fflush)
-
-#ifdef _IO_MTSAFE_IO
-weak_alias (_IO_fflush, fflush_locked)
-#endif
diff --git a/libio/putc.c b/libio/putc.c
index 5aa3b68137..6d84f24995 100644
--- a/libio/putc.c
+++ b/libio/putc.c
@@ -1,20 +1,20 @@
-/* Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU 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 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.
+ 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., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+ 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 "libioP.h"
#include "stdio.h"
@@ -36,9 +36,3 @@ _IO_putc (c, fp)
}
#undef putc
weak_alias (_IO_putc, putc)
-
-#ifdef _IO_MTSAFE_IO
-# undef putc_locked
-
-weak_alias (putc, putc_locked)
-#endif
diff --git a/libio/putchar.c b/libio/putchar.c
index 7822a31a1a..b8a41ebf76 100644
--- a/libio/putchar.c
+++ b/libio/putchar.c
@@ -1,20 +1,20 @@
-/* Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU 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 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.
+ 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., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+ 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 "libioP.h"
#include "stdio.h"
@@ -33,9 +33,3 @@ putchar (c)
__libc_cleanup_region_end (1);
return result;
}
-
-#ifdef _IO_MTSAFE_IO
-# undef putchar_locked
-
-weak_alias (putchar, putchar_locked)
-#endif
diff --git a/libio/stdio.h b/libio/stdio.h
index 88e9c6a985..0ed711a8cb 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -1,209 +1,191 @@
-/* This is part of the iostream/stdio library, providing -*- C -*- I/O.
- Define ANSI C stdio on top of C++ iostreams.
+/* Define ISO C stdio on top of C++ iostreams.
Copyright (C) 1991, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
-This 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 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.
-This 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 this library; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
+ 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. */
/*
* ISO C Standard: 4.9 INPUT/OUTPUT <stdio.h>
*/
#ifndef _STDIO_H
-#define _STDIO_H
+
+#if !defined __need_FILE
+#define _STDIO_H 1
+#include <features.h>
+
+__BEGIN_DECLS
+
+#define __need_size_t
+#define __need_NULL
+#include <stddef.h>
+
+#include <gnu/types.h>
+#endif /* Don't need FILE. */
+#undef __need_FILE
+
+
+#ifndef __FILE_defined
+
+/* The opaque type of streams. */
+typedef struct _IO_FILE FILE;
+
+#define __FILE_defined 1
+#endif /* FILE not defined. */
+
+
+#ifdef _STDIO_H
#define _STDIO_USES_IOSTREAM
#include <libio.h>
-#ifndef NULL
-#ifdef __cplusplus
-#define NULL 0
-#else
-#define NULL (void*)0
-#endif
-#endif
+/* The type of the second argument to `fgetpos' and `fsetpos'. */
+typedef _G_fpos_t fpos_t;
-#ifndef EOF
-#define EOF (-1)
-#endif
+
+/* Generate a unique file name (and possibly open it with mode "w+b"). */
+extern char *__stdio_gen_tempname __P ((char *__buf, size_t __bufsize,
+ __const char *__dir,
+ __const char *__pfx,
+ int __dir_search,
+ size_t *__lenptr,
+ FILE **__streamptr));
+
+
+/* Print out MESSAGE on the error output and abort. */
+extern void __libc_fatal __P ((__const char *__message))
+ __attribute__ ((__noreturn__));
+
+
+/* The possibilities for the third argument to `setvbuf'. */
+#define _IOFBF 0 /* Fully buffered. */
+#define _IOLBF 1 /* Line buffered. */
+#define _IONBF 2 /* No buffering. */
+
+
+/* Default buffer size. */
#ifndef BUFSIZ
#define BUFSIZ _IO_BUFSIZ
#endif
-#define _IOFBF 0 /* Fully buffered. */
-#define _IOLBF 1 /* Line buffered. */
-#define _IONBF 2 /* No buffering. */
-
-#define SEEK_SET 0
-#define SEEK_CUR 1
-#define SEEK_END 2
-
- /* define size_t. Crud in case <sys/types.h> has defined it. */
-#if !defined(_SIZE_T) && !defined(_T_SIZE_) && !defined(_T_SIZE)
-#if !defined(__SIZE_T) && !defined(_SIZE_T_) && !defined(___int_size_t_h)
-#if !defined(_GCC_SIZE_T) && !defined(_SIZET_)
-#define _SIZE_T
-#define _T_SIZE_
-#define _T_SIZE
-#define __SIZE_T
-#define _SIZE_T_
-#define ___int_size_t_h
-#define _GCC_SIZE_T
-#define _SIZET_
-typedef _IO_size_t size_t;
-#endif
-#endif
+
+/* End of file character.
+ Some things throughout the library rely on this being -1. */
+#ifndef EOF
+#define EOF (-1)
#endif
-typedef struct _IO_FILE FILE;
-typedef _IO_fpos_t fpos_t;
-#include <stdio_lim.h>
+/* The possibilities for the third argument to `fseek'.
+ These values should not be changed. */
+#define SEEK_SET 0 /* Seek from beginning of file. */
+#define SEEK_CUR 1 /* Seek from current position. */
+#define SEEK_END 2 /* Seek from end of file. */
+
#ifdef __USE_SVID
/* Default path prefix for `tempnam' and `tmpnam'. */
#define P_tmpdir "/tmp"
#endif
-/* For use by debuggers. These are linked in if printf or fprintf are used. */
-extern FILE *stdin, *stdout, *stderr; /* TODO */
+/* Get the values:
+ L_tmpnam How long an array of chars must be to be passed to `tmpnam'.
+ TMP_MAX The minimum number of unique filenames generated by tmpnam
+ (and tempnam when it uses tmpnam's name space),
+ or tempnam (the two are separate).
+ L_ctermid How long an array to pass to `ctermid'.
+ L_cuserid How long an array to pass to `cuserid'.
+ FOPEN_MAX Minimum number of files that can be open at once.
+ FILENAME_MAX Maximum length of a filename. */
+#include <stdio_lim.h>
+
+
+/* Standard streams. */
+extern FILE *stdin, *stdout, *stderr;
+/* Refer to the real names by default. */
#define stdin _IO_stdin
#define stdout _IO_stdout
#define stderr _IO_stderr
-#ifdef __cplusplus
-extern "C" {
-#endif
-#ifndef __P
-#if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus)
-#define __P(args) args
-#else
-#define __P(args) ()
-#endif
-#endif /*!__P*/
-
-extern void clearerr __P ((FILE*));
-extern int fclose __P ((FILE*));
-extern int feof __P ((FILE*));
-extern int ferror __P ((FILE*));
-extern int fflush __P ((FILE*));
-extern int fgetc __P ((FILE *));
-extern int fgetpos __P ((FILE* fp, fpos_t *pos));
-extern char* fgets __P ((char*, int, FILE*));
-extern FILE* fopen __P ((__const char*, __const char*));
-extern FILE* fopencookie __P ((void *cookie, __const char *mode,
- _IO_cookie_io_functions_t io_functions));
-extern int fprintf __P ((FILE*, __const char* format, ...));
-extern int fputc __P ((int, FILE*));
-extern int fputs __P ((__const char *str, FILE *fp));
-extern size_t fread __P ((void*, size_t, size_t, FILE*));
-extern FILE* freopen __P ((__const char*, __const char*, FILE*));
-extern int fscanf __P ((FILE *fp, __const char* format, ...));
-extern int fseek __P ((FILE* fp, long int offset, int whence));
-extern int fsetpos __P ((FILE* fp, __const fpos_t *pos));
-extern long int ftell __P ((FILE* fp));
-extern size_t fwrite __P ((__const void*, size_t, size_t, FILE*));
-extern int getc __P ((FILE *));
-extern int getchar __P ((void));
-extern char* gets __P ((char*));
-extern void perror __P ((__const char *));
-extern int printf __P ((__const char* format, ...));
-extern int putc __P ((int, FILE *));
-extern int putchar __P ((int));
-extern int puts __P ((__const char *str));
-extern int remove __P ((__const char*));
-extern int rename __P ((__const char* _old, __const char* _new));
-extern void rewind __P ((FILE*));
-extern int scanf __P ((__const char* format, ...));
-extern void setbuf __P ((FILE*, char*));
-extern void setlinebuf __P ((FILE*));
-extern void setbuffer __P ((FILE*, char*, int));
-extern int setvbuf __P ((FILE*, char*, int mode, size_t size));
-extern int sprintf __P ((char*, __const char* format, ...));
-extern int sscanf __P ((__const char* string, __const char* format, ...));
-extern FILE* tmpfile __P ((void));
-extern char* tmpnam __P ((char*));
-#ifdef __USE_MISC
-extern char* tmpnam_r __P ((char*));
+/* Remove file FILENAME. */
+extern int remove __P ((__const char *__filename));
+/* Rename file OLD to NEW. */
+extern int rename __P ((__const char *__old, __const char *__new));
+
+
+/* Create a temporary file and open it read/write. */
+extern FILE *tmpfile __P ((void));
+/* Generate a temporary filename. */
+extern char *tmpnam __P ((char *__s));
+
+#ifdef __USE_MISC
+/* This is the reentrant variant of `tmpnam'. The only difference is
+ that it does not allow S to be NULL. */
+extern char *tmpnam_r __P ((char *__s));
#endif
-#if defined(__USE_SVID) || defined(__USE_XOPEN)
+
+
+#if defined __USE_SVID || defined __USE_XOPEN
+/* Generate a unique temporary filename using up to five characters of PFX
+ if it is not NULL. The directory to put this file in is searched for
+ as follows: First the environment variable "TMPDIR" is checked.
+ If it contains the name of a writable directory, that directory is used.
+ If not and if DIR is not NULL, that value is checked. If that fails,
+ P_tmpdir is tried and finally "/tmp". The storage for the filename
+ is allocated by `malloc'. */
extern char *tempnam __P ((__const char *__dir, __const char *__pfx));
#endif
-extern char *__stdio_gen_tempname __P ((char *__buf, size_t bufsize,
- __const char *dir, __const char *pfx,
- int dir_search, size_t *lenptr,
- FILE **streamptr));
-extern int ungetc __P ((int c, FILE* fp));
-extern int vfprintf __P ((FILE *fp, char __const *fmt0, _G_va_list));
-extern int vprintf __P ((char __const *fmt, _G_va_list));
-extern int vsprintf __P ((char* string, __const char* format, _G_va_list));
-extern void __libc_fatal __P ((__const char *__message))
- __attribute__ ((__noreturn__));
-#ifndef __STRICT_ANSI__
-extern int dprintf __P ((int, __const char *, ...));
-extern int vdprintf __P ((int, __const char *, _G_va_list));
-extern int vfscanf __P ((FILE*, __const char *, _G_va_list));
-extern int __vfscanf __P ((FILE*, __const char *, _G_va_list));
-extern int vscanf __P ((__const char *, _G_va_list));
-extern int vsscanf __P ((__const char *, __const char *, _G_va_list));
-extern int __vsscanf __P ((__const char *, __const char *, _G_va_list));
+
+/* Close STREAM. */
+extern int fclose __P ((FILE *__stream));
+/* Flush STREAM, or all streams if STREAM is NULL. */
+extern int fflush __P ((FILE *__stream));
+
+#ifdef __USE_MISC
+/* Faster versions when locking is not required. */
+extern int fclose_unlocked __P ((FILE *__stream));
+extern int fflush_unlocked __P ((FILE *__stream));
#endif
#ifdef __USE_GNU
+/* Close all streams. */
extern int __fcloseall __P ((void));
extern int fcloseall __P ((void));
-
-struct obstack;
-extern int obstack_vprintf __P ((struct obstack *__obstack,
- __const char *__fmt, _G_va_list));
-extern int obstack_printf __P ((struct obstack *__obstack, __const char *__fmt,
- ...));
#endif
-#if !defined(__STRICT_ANSI__) || defined(_POSIX_SOURCE)
-extern FILE *fdopen __P ((int, __const char *));
-extern int fileno __P ((FILE*));
-extern FILE* popen __P ((__const char*, __const char*));
-extern int pclose __P ((FILE*));
-
-#define L_ctermid 9
-#define L_cuserid 9
-/* Return the name of the controlling terminal. */
-extern char *ctermid __P ((char *__buf));
+/* Open a file and create a new stream for it. */
+extern FILE *fopen __P ((__const char *__filename, __const char *__modes));
+/* Open a file, replacing an existing stream with it. */
+extern FILE *freopen __P ((__const char *__restrict __filename,
+ __const char *__restrict __modes,
+ FILE *__restrict __stream));
-/* Get character login name of the user. */
-extern char *cuserid __P ((char * __buf));
+#ifdef __USE_POSIX
+/* Create a new stream that refers to an existing system file descriptor. */
+extern FILE *fdopen __P ((int __fd, __const char *__modes));
#endif
-#ifdef __USE_GNU
-extern _IO_ssize_t getdelim __P ((char **, size_t *, int, FILE*));
-extern _IO_ssize_t getline __P ((char **, size_t *, FILE *));
-extern _IO_ssize_t __getline __P ((char **, size_t *, FILE *));
-
-extern int snprintf __P ((char *, size_t, __const char *, ...));
-extern int __snprintf __P ((char *, size_t, __const char *, ...));
-extern int vsnprintf __P ((char *, size_t, __const char *, _G_va_list));
-extern int __vsnprintf __P ((char *, size_t, __const char *, _G_va_list));
-
-extern int asprintf __P ((char **, const char *, ...));
-extern int vasprintf __P ((char **, const char *, _G_va_list));
+#ifdef __USE_GNU
+/* Create a new stream that refers to the given magic cookie,
+ and uses the given functions for input and output. */
+extern FILE *fopencookie __P ((void *__magic_cookie, __const char *__modes,
+ _IO_cookie_io_functions_t __io_funcs));
/* Open a stream that writes into a malloc'd buffer that is expanded as
necessary. *BUFLOC and *SIZELOC are updated with the buffer's location
@@ -211,77 +193,409 @@ extern int vasprintf __P ((char **, const char *, _G_va_list));
extern FILE *open_memstream __P ((char **__bufloc, size_t *__sizeloc));
#endif
-extern int __underflow __P ((struct _IO_FILE*));
-extern int __overflow __P ((struct _IO_FILE*, int));
-#ifdef __USE_BSD
-extern int sys_nerr;
-extern const char *const sys_errlist[];
-#endif
-#ifdef __USE_GNU
-extern int _sys_nerr;
-extern const char *const _sys_errlist[];
+/* If BUF is NULL, make STREAM unbuffered.
+ Else make it use buffer BUF, of size BUFSIZ. */
+extern void setbuf __P ((FILE *__restrict __stream, char *__restrict __buf));
+/* Make STREAM use buffering mode MODE.
+ If BUF is not NULL, use N bytes of it for buffering;
+ else allocate an internal buffer N bytes long. */
+extern int setvbuf __P ((FILE *__restrict __stream, char *__restrict __buf,
+ int __modes, size_t __n));
+
+#ifdef __USE_BSD
+/* If BUF is NULL, make STREAM unbuffered.
+ Else make it use SIZE bytes of BUF for buffering. */
+extern void setbuffer __P ((FILE *__stream, char *__buf, size_t __size));
+
+/* Make STREAM line-buffered. */
+extern void setlinebuf __P ((FILE *__stream));
#endif
-/* Handle locking of streams. */
-#ifdef __USE_MISC
-extern void clearerr_locked __P ((FILE *));
-extern void clearerr_unlocked __P ((FILE *));
-extern int feof_locked __P ((FILE *));
-extern int feof_unlocked __P ((FILE *));
-extern int ferror_locked __P ((FILE*));
-extern int ferror_unlocked __P ((FILE*));
-extern int fileno_locked __P ((FILE *));
-extern int fileno_unlocked __P ((FILE *));
-extern int fclose_unlocked __P ((FILE *));
-extern int fflush_locked __P ((FILE *));
-extern int fflush_unlocked __P ((FILE *));
-extern size_t fread_unlocked __P ((void *, size_t, size_t, FILE *));
-extern size_t fwrite_unlocked __P ((const void *, size_t, size_t, FILE *));
-
-extern int fputc_locked __P ((int, FILE*));
-extern int fputc_unlocked __P ((int, FILE*));
-extern int getc_locked __P ((FILE *));
-extern int getchar_locked __P ((void));
-extern int putc_locked __P ((int, FILE *));
-extern int putchar_locked __P ((int));
-
-# ifndef _LIBC
-# define getc_locked(fp) _IO_getc (fp)
-# define getchar_locked() _IO_getc (stdin)
-# define putchar_locked(c) _IO_putc (c, stdout)
-# endif
+
+/* Write formatted output to STREAM. */
+extern int fprintf __P ((FILE *__restrict __stream,
+ __const char *__restrict __format, ...));
+/* Write formatted output to stdout. */
+extern int printf __P ((__const char *__restrict __format, ...));
+/* Write formatted output to S. */
+extern int sprintf __P ((char *__restrict __s,
+ __const char *__restrict __format, ...));
+
+/* Write formatted output to S from argument list ARG. */
+extern int vfprintf __P ((FILE *__restrict __s,
+ __const char *__restrict __format,
+ _G_va_list __arg));
+/* Write formatted output to stdout from argument list ARG. */
+extern int vprintf __P ((__const char *__restrict __format,
+ _G_va_list __arg));
+/* Write formatted output to S from argument list ARG. */
+extern int vsprintf __P ((char *__restrict __s,
+ __const char *__restrict __format,
+ _G_va_list __arg));
+
+#ifdef __OPTIMIZE__
+extern __inline int
+vprintf (const char *__restrict __fmt, _G_va_list __arg)
+{
+ return vfprintf (stdout, __fmt, __arg);
+}
+#endif /* Optimizing. */
+
+#ifdef __USE_GNU
+/* Maximum chars of output to write in MAXLEN. */
+extern int __snprintf __P ((char *__s, size_t __maxlen,
+ __const char *__format, ...));
+extern int snprintf __P ((char *__s, size_t __maxlen,
+ __const char *__format, ...));
+
+extern int __vsnprintf __P ((char *__s, size_t __maxlen,
+ __const char *__format, _G_va_list __arg));
+extern int vsnprintf __P ((char *__s, size_t __maxlen,
+ __const char *__format, _G_va_list __arg));
+
+/* Write formatted output to a string dynamically allocated with `malloc'.
+ Store the address of the string in *PTR. */
+extern int vasprintf __P ((char **__ptr, __const char *__f,
+ _G_va_list __arg));
+extern int asprintf __P ((char **__ptr, __const char *__fmt, ...));
+
+/* Write formatted output to a file descriptor. */
+extern int vdprintf __P ((int __fd, __const char *__fmt, _G_va_list __arg));
+extern int dprintf __P ((int __fd, __const char *__fmt, ...));
#endif
+
+/* Read formatted input from STREAM. */
+extern int fscanf __P ((FILE *__restrict __stream,
+ __const char *__restrict __format, ...));
+/* Read formatted input from stdin. */
+extern int scanf __P ((__const char *__restrict __format, ...));
+/* Read formatted input from S. */
+extern int sscanf __P ((__const char *__restrict __s,
+ __const char *__restrict __format, ...));
+
+#ifdef __USE_GNU
+/* Read formatted input from S into argument list ARG. */
+extern int __vfscanf __P ((FILE *__s, __const char *__format,
+ _G_va_list __arg));
+extern int vfscanf __P ((FILE *__s, __const char *__format,
+ _G_va_list __arg));
+
+/* Read formatted input from stdin into argument list ARG. */
+extern int __vscanf __P ((__const char *__format, _G_va_list __arg));
+extern int vscanf __P ((__const char *__format, _G_va_list __arg));
+
+/* Read formatted input from S into argument list ARG. */
+extern int __vsscanf __P ((__const char *__s, __const char *__format,
+ _G_va_list __arg));
+extern int vsscanf __P ((__const char *__s, __const char *__format,
+ _G_va_list __arg));
+
+
+#ifdef __OPTIMIZE__
+extern __inline int
+vfscanf (FILE *__s, const char *__fmt, _G_va_list __arg)
+{
+ return __vfscanf (__s, __fmt, __arg);
+}
+extern __inline int
+vscanf (const char *__fmt, _G_va_list __arg)
+{
+ return __vfscanf (stdin, __fmt, __arg);
+}
+extern __inline int
+vsscanf (const char *__s, const char *__fmt, _G_va_list __arg)
+{
+ return __vsscanf (__s, __fmt, __arg);
+}
+#endif /* Optimizing. */
+#endif /* Use GNU. */
+
+
+/* Read a character from STREAM. */
+extern int fgetc __P ((FILE *__stream));
+extern int getc __P ((FILE *__stream));
+
+/* Read a character from stdin. */
+extern int getchar __P ((void));
+
+/* The C standard explicitly says this is a macro, so we always do the
+ optimization for it. */
+#define getc(_fp) _IO_getc (_fp)
+
+#ifdef __OPTIMIZE__
+extern __inline int
+getchar (void)
+{
+ return _IO_getc (stdin);
+}
+#endif /* Optimizing. */
+
#if defined __USE_POSIX || defined __USE_MISC
/* These are defined in POSIX.1:1996. */
-extern void flockfile __P ((FILE *));
-extern void funlockfile __P ((FILE *));
-extern int ftrylockfile __P ((FILE *));
-
-extern int getc_unlocked __P ((FILE *));
+extern int getc_unlocked __P ((FILE *__stream));
extern int getchar_unlocked __P ((void));
-extern int putc_unlocked __P ((int, FILE *));
-extern int putchar_unlocked __P ((int));
-
-# ifndef _LIBC
-# define getc_unlocked(fp) _IO_getc_unlocked (fp)
-# define getchar_unlocked() _IO_getc_unlocked (stdin)
-# define putc_unlocked(c, fp) _IO_putc_unlocked ((c), (fp))
-# define putchar_unlocked(c) _IO_putc_unlocked ((c), stdout)
-# endif
-#endif /* POSIX || misc */
-#define getc(_fp) _IO_getc (_fp)
+#ifdef __OPTIMIZE__
+extern __inline int
+getc_unlocked (FILE *__fp)
+{
+ return _IO_getc_unlocked (__fp);
+}
+
+extern __inline int
+getchar_unlocked (void)
+{
+ return _IO_getc_unlocked (stdin);
+}
+#endif /* Optimizing. */
+#endif /* Use POSIX or MISC. */
+
+
+/* Write a character to STREAM. */
+extern int fputc __P ((int __c, FILE *__stream));
+extern int putc __P ((int __c, FILE *__stream));
+
+/* Write a character to stdout. */
+extern int putchar __P ((int __c));
+
+/* The C standard explicitly says this can be a macro,
+ so we always do the optimization for it. */
#define putc(_ch, _fp) _IO_putc (_ch, _fp)
-#define putchar(_ch) _IO_putc (_ch, stdout)
-#define getchar() _IO_getc (stdin)
+#ifdef __OPTIMIZE__
+extern __inline int
+putchar (int __c)
+{
+ return _IO_putc (__c, stdout);
+}
+#endif
-#ifdef __cplusplus
+#ifdef __USE_MISC
+/* Faster version when locking is not necessary. */
+extern int fputc_unlocked __P ((int __c, FILE *__stream));
+
+#ifdef __OPTIMIZE__
+extern __inline int
+fputc_unlocked (int __c, FILE *__stream)
+{
+ return _IO_putc_unlocked (__c, __stream);
}
+#endif /* Optimizing. */
+#endif /* Use MISC. */
+
+#if defined __USE_POSIX || defined __USE_MISC
+/* These are defined in POSIX.1:1996. */
+extern int putc_unlocked __P ((int __c, FILE *__stream));
+extern int putchar_unlocked __P ((int __c));
+
+#ifdef __OPTIMIZE__
+extern __inline int
+putc_unlocked (int __c, FILE *__stream)
+{
+ return _IO_putc_unlocked (__c, __stream);
+}
+
+extern __inline int
+putchar_unlocked (int __c)
+{
+ return _IO_putc_unlocked (__c, stdout);
+}
+#endif /* Optimizing. */
+#endif /* Use POSIX or MISc. */
+
+
+#if defined __USE_SVID || defined __USE_MISC
+/* Get a word (int) from STREAM. */
+extern int getw __P ((FILE *__stream));
+
+/* Write a word (int) to STREAM. */
+extern int putw __P ((int __w, FILE *__stream));
#endif
+/* Get a newline-terminated string of finite length from STREAM. */
+extern char *fgets __P ((char *__restrict __s, int __n,
+ FILE *__restrict __stream));
+
+/* Get a newline-terminated string from stdin, removing the newline.
+ DO NOT USE THIS FUNCTION!! There is no limit on how much it will read. */
+extern char *gets __P ((char *__s));
+
+
+#ifdef __USE_GNU
+/* Read up to (and including) a DELIMITER from STREAM into *LINEPTR
+ (and null-terminate it). *LINEPTR is a pointer returned from malloc (or
+ NULL), pointing to *N characters of space. It is realloc'd as
+ necessary. Returns the number of characters read (not including the
+ null terminator), or -1 on error or EOF. */
+_IO_ssize_t __getdelim __P ((char **__lineptr, size_t *__n,
+ int __delimiter, FILE *__stream));
+_IO_ssize_t getdelim __P ((char **__lineptr, size_t *__n,
+ int __delimiter, FILE *__stream));
+
+/* Like `getdelim', but reads up to a newline. */
+_IO_ssize_t __getline __P ((char **__lineptr, size_t *__n, FILE *__stream));
+_IO_ssize_t getline __P ((char **__lineptr, size_t *__n, FILE *__stream));
+
+#ifdef __OPTIMIZE__
+extern __inline _IO_ssize_t
+getline (char **__lineptr, size_t *__n, FILE *__stream)
+{
+ return __getdelim (__lineptr, __n, '\n', __stream);
+}
+#endif /* Optimizing. */
+#endif
+
+
+/* Write a string to STREAM. */
+extern int fputs __P ((__const char *__restrict __s,
+ FILE *__restrict __stream));
+/* Write a string, followed by a newline, to stdout. */
+extern int puts __P ((__const char *__s));
+
+
+/* Push a character back onto the input buffer of STREAM. */
+extern int ungetc __P ((int __c, FILE *__stream));
+
+
+/* Read chunks of generic data from STREAM. */
+extern size_t fread __P ((void *__restrict __ptr, size_t __size,
+ size_t __n, FILE *__restrict __stream));
+/* Write chunks of generic data to STREAM. */
+extern size_t fwrite __P ((__const void *__restrict __ptr, size_t __size,
+ size_t __n, FILE *__restrict __s));
+
+#ifdef __USE_MISC
+/* Faster versions when locking is not necessary. */
+extern size_t fread_unlocked __P ((void *__restrict __ptr, size_t __size,
+ size_t __n, FILE *__restrict __stream));
+extern size_t fwrite_unlocked __P ((__const void *__restrict __ptr,
+ size_t __size, size_t __n,
+ FILE *__restrict __stream));
+#endif
+
+
+/* Seek to a certain position on STREAM. */
+extern int fseek __P ((FILE *__stream, long int __off, int __whence));
+/* Return the current position of STREAM. */
+extern long int ftell __P ((FILE *__stream));
+/* Rewind to the beginning of STREAM. */
+extern void rewind __P ((FILE *__stream));
+
+/* Get STREAM's position. */
+extern int fgetpos __P ((FILE *__restrict __stream,
+ fpos_t *__restrict __pos));
+/* Set STREAM's position. */
+extern int fsetpos __P ((FILE *__stream, __const fpos_t *__pos));
+
+
+/* Clear the error and EOF indicators for STREAM. */
+extern void clearerr __P ((FILE *__stream));
+/* Return the EOF indicator for STREAM. */
+extern int feof __P ((FILE *__stream));
+/* Return the error indicator for STREAM. */
+extern int ferror __P ((FILE *__stream));
+
+#ifdef __USE_MISC
+/* Faster versions when locking is not required. */
+extern void clearerr_unlocked __P ((FILE *__stream));
+extern int feof_unlocked __P ((FILE *__stream));
+extern int ferror_unlocked __P ((FILE *__stream));
+
+#ifdef __OPTIMIZE__
+extern __inline int
+feof_unlocked (FILE *__stream)
+{
+ return _IO_feof_unlocked (__stream);
+}
+
+extern __inline int
+ferror_unlocked (FILE *__stream)
+{
+ return _IO_ferror_unlocked (__stream);
+}
+#endif /* Optimizing. */
+#endif
+
+
+/* Print a message describing the meaning of the value of errno. */
+extern void perror __P ((__const char *__s));
+
+/* These variables normally should not be used directly. The `strftime'
+ function provides all the needed functionality. */
+#ifdef __USE_BSD
+extern int sys_nerr;
+extern __const char *__const sys_errlist[];
+#endif
+#ifdef __USE_GNU
+extern int _sys_nerr;
+extern __const char *__const _sys_errlist[];
+#endif
+
+
+#ifdef __USE_POSIX
+/* Return the system file descriptor for STREAM. */
+extern int fileno __P ((FILE *__stream));
+#endif /* Use POSIX. */
+
+#ifdef __USE_MISC
+/* Faster version when locking is not required. */
+extern int fileno_unlocked __P ((FILE *__stream));
+#endif
+
+
+#if (defined __USE_POSIX2 || defined __USE_SVID || defined __USE_BSD || \
+ defined __USE_MISC)
+/* Create a new stream connected to a pipe running the given command. */
+extern FILE *popen __P ((__const char *__command, __const char *__modes));
+
+/* Close a stream opened by popen and return the status of its child. */
+extern int pclose __P ((FILE *__stream));
+#endif
+
+
+#ifdef __USE_POSIX
+/* Return the name of the controlling terminal. */
+extern char *ctermid __P ((char *__s));
+#endif /* Use POSIX. */
+
+
+#ifdef __USE_XOPEN
+/* Return the name of the current user. */
+extern char *cuserid __P ((char *__s));
+#endif /* Use X/Open. */
+
+
+#ifdef __USE_GNU
+struct obstack; /* See <obstack.h>. */
+
+/* Write formatted output to an obstack. */
+extern int obstack_printf __P ((struct obstack *__obstack,
+ __const char *__format, ...));
+extern int obstack_vprintf __P ((struct obstack *__obstack,
+ __const char *__format,
+ _G_va_list __args));
+#endif /* Use GNU. */
+
+
+#if defined __USE_POSIX || defined __USE_MISC
+/* These are defined in POSIX.1:1996. */
+
+/* Acquire ownership of STREAM. */
+extern void flockfile __P ((FILE *__stream));
+
+/* Try to acquire ownership of STREAM but do not block if it is not
+ possible. */
+extern int ftrylockfile __P ((FILE *__stream));
+
+/* Relinquish the ownership granted for STREAM. */
+extern void funlockfile __P ((FILE *__stream));
+#endif /* POSIX || misc */
+
+__END_DECLS
+
+#endif /* <stdio.h> included. */
#endif /* !_STDIO_H */
diff --git a/locale/C-time.c b/locale/C-time.c
index 70ee89a192..095d097e2b 100644
--- a/locale/C-time.c
+++ b/locale/C-time.c
@@ -27,7 +27,7 @@ const struct locale_data _nl_C_LC_TIME =
_nl_C_name,
NULL, 0, 0, /* no file mapped */
MAX_USAGE_COUNT,
- 53,
+ 54,
{
{ string: "Sun" },
{ string: "Mon" },
@@ -80,6 +80,7 @@ const struct locale_data _nl_C_LC_TIME =
{ string: "" },
{ string: "" },
{ word: 0 },
+ { word: 0 },
{ string: "" },
{ string: "" },
}
diff --git a/locale/programs/locale.c b/locale/programs/locale.c
index e2157311c1..7b0aaaa60f 100644
--- a/locale/programs/locale.c
+++ b/locale/programs/locale.c
@@ -166,6 +166,8 @@ static void show_info (const char *name);
int
main (int argc, char *argv[])
{
+ int remaining;
+
/* Set initial values for global variables. */
show_category_name = 0;
show_keyword_name = 0;
@@ -179,7 +181,7 @@ main (int argc, char *argv[])
textdomain (PACKAGE);
/* Parse and process arguments. */
- argp_parse (&argp, argc, argv, 0, 0, NULL);
+ argp_parse (&argp, argc, argv, 0, &remaining, NULL);
/* `-a' requests the names of all available locales. */
if (do_all != 0)
@@ -203,15 +205,15 @@ main (int argc, char *argv[])
/* If no real argument is given we have to print the contents of the
current locale definition variables. These are LANG and the LC_*. */
- if (optind == argc && show_keyword_name == 0 && show_category_name == 0)
+ if (remaining == argc && show_keyword_name == 0 && show_category_name == 0)
{
show_locale_vars ();
exit (EXIT_SUCCESS);
}
/* Process all given names. */
- while (optind < argc)
- show_info (argv[optind++]);
+ while (remaining < argc)
+ show_info (argv[remaining++]);
exit (EXIT_SUCCESS);
}
diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c
index 656377f9df..e8f0d3bc54 100644
--- a/locale/programs/localedef.c
+++ b/locale/programs/localedef.c
@@ -148,6 +148,7 @@ main (int argc, char *argv[])
struct charset_t *charset;
struct localedef_t *localedef;
struct copy_def_list_t *act_add_locdef;
+ int remaining;
/* Set initial values for global variables. */
copy_list = NULL;
@@ -163,7 +164,7 @@ main (int argc, char *argv[])
textdomain (_libc_intl_domainname);
/* Parse and process arguments. */
- argp_parse (&argp, argc, argv, 0, 0, NULL);
+ argp_parse (&argp, argc, argv, 0, &remaining, NULL);
/* XXX POSIX is violated since for unknown option a exit value > 3
must be used. */
@@ -172,7 +173,7 @@ main (int argc, char *argv[])
character map. */
verbose |= posix_conformance;
- if (argc - optind != 1)
+ if (argc - remaining != 1)
{
/* We need exactly one non-option parameter. */
argp_help (&argp, stdout, ARGP_HELP_SEE,
@@ -185,7 +186,7 @@ main (int argc, char *argv[])
/* The parameter describes the output path of the constructed files.
If the described files cannot be written return a NULL pointer. */
- output_path = construct_output_path (argv[optind]);
+ output_path = construct_output_path (argv[remaining]);
cannot_write_why = errno;
/* Now that the parameters are processed we have to reset the local
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 0380527f64..6b4fc72b20 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -19,7 +19,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-/* V2.6.4-pt2 Sat Dec 14 1996
+/* V2.6.4-pt3 Thu Feb 20 1997
This work is mainly derived from malloc-2.6.4 by Doug Lea
<dl@cs.oswego.edu>, which is available from:
@@ -874,6 +874,8 @@ extern Void_t* sbrk();
#define mALLOC_STATs __malloc_stats
#define mALLOC_USABLE_SIZe __malloc_usable_size
#define mALLOC_TRIm __malloc_trim
+#define mALLOC_GET_STATe __malloc_get_state
+#define mALLOC_SET_STATe __malloc_set_state
#else
@@ -889,6 +891,8 @@ extern Void_t* sbrk();
#define mALLOC_STATs malloc_stats
#define mALLOC_USABLE_SIZe malloc_usable_size
#define mALLOC_TRIm malloc_trim
+#define mALLOC_GET_STATe malloc_get_state
+#define mALLOC_SET_STATe malloc_set_state
#endif
@@ -912,7 +916,11 @@ size_t mALLOC_USABLE_SIZe(Void_t*);
void mALLOC_STATs(void);
int mALLOPt(int, int);
struct mallinfo mALLINFo(void);
-#else
+Void_t* mALLOC_GET_STATe(void);
+int mALLOC_SET_STATe(Void_t*);
+
+#else /* !__STD_C */
+
#ifndef _LIBC
void ptmalloc_init();
#endif
@@ -929,7 +937,10 @@ size_t mALLOC_USABLE_SIZe();
void mALLOC_STATs();
int mALLOPt();
struct mallinfo mALLINFo();
-#endif
+Void_t* mALLOC_GET_STATe();
+int mALLOC_SET_STATe();
+
+#endif /* __STD_C */
#ifdef __cplusplus
@@ -3775,6 +3786,144 @@ int mALLOPt(param_number, value) int param_number; int value;
+/* Get/set state: malloc_get_state() records the current state of all
+ malloc variables (_except_ for the actual heap contents and `hook'
+ function pointers) in a system dependent, opaque data structure.
+ This data structure is dynamically allocated and can be free()d
+ after use. malloc_set_state() restores the state of all malloc
+ variables to the previously obtained state. This is especially
+ useful when using this malloc as part of a shared library, and when
+ the heap contents are saved/restored via some other method. The
+ primary example for this is GNU Emacs with its `dumping' procedure.
+ `Hook' function pointers are never saved or restored by these
+ functions. */
+
+#define MALLOC_STATE_MAGIC 0x444c4541l
+#define MALLOC_STATE_VERSION (0*0x100l + 0l) /* major*0x100 + minor */
+
+struct malloc_state {
+ long magic;
+ long version;
+ mbinptr av[NAV * 2 + 2];
+ char* sbrk_base;
+ int sbrked_mem_bytes;
+ unsigned long trim_threshold;
+ unsigned long top_pad;
+ unsigned int n_mmaps_max;
+ unsigned long mmap_threshold;
+ int check_action;
+ unsigned long max_sbrked_mem;
+ unsigned long max_total_mem;
+ unsigned int n_mmaps;
+ unsigned int max_n_mmaps;
+ unsigned long mmapped_mem;
+ unsigned long max_mmapped_mem;
+};
+
+Void_t*
+mALLOC_GET_STATe()
+{
+ mchunkptr victim;
+ struct malloc_state* ms;
+ int i;
+ mbinptr b;
+
+ ptmalloc_init();
+ (void)mutex_lock(&main_arena.mutex);
+ victim = chunk_alloc(&main_arena, request2size(sizeof(*ms)));
+ if(!victim) {
+ (void)mutex_unlock(&main_arena.mutex);
+ return 0;
+ }
+ ms = (struct malloc_state*)chunk2mem(victim);
+ ms->magic = MALLOC_STATE_MAGIC;
+ ms->version = MALLOC_STATE_VERSION;
+ ms->av[0] = main_arena.av[0];
+ ms->av[1] = main_arena.av[1];
+ for(i=0; i<NAV; i++) {
+ b = bin_at(&main_arena, i);
+ if(first(b) == b)
+ ms->av[2*i+2] = ms->av[2*i+3] = 0; /* empty bin (or initial top) */
+ else {
+ ms->av[2*i+2] = first(b);
+ ms->av[2*i+3] = last(b);
+ }
+ }
+ ms->sbrk_base = sbrk_base;
+ ms->sbrked_mem_bytes = sbrked_mem;
+ ms->trim_threshold = trim_threshold;
+ ms->top_pad = top_pad;
+ ms->n_mmaps_max = n_mmaps_max;
+ ms->mmap_threshold = mmap_threshold;
+ ms->check_action = check_action;
+ ms->max_sbrked_mem = max_sbrked_mem;
+#ifdef NO_THREADS
+ ms->max_total_mem = max_total_mem;
+#else
+ ms->max_total_mem = 0;
+#endif
+ ms->n_mmaps = n_mmaps;
+ ms->max_n_mmaps = max_n_mmaps;
+ ms->mmapped_mem = mmapped_mem;
+ ms->max_mmapped_mem = max_mmapped_mem;
+ (void)mutex_unlock(&main_arena.mutex);
+ return (Void_t*)ms;
+}
+
+int
+#if __STD_C
+mALLOC_SET_STATe(Void_t* msptr)
+#else
+mALLOC_SET_STATe(msptr) Void_t* msptr;
+#endif
+{
+ struct malloc_state* ms = (struct malloc_state*)msptr;
+ int i;
+ mbinptr b;
+
+ ptmalloc_init();
+ if(ms->magic != MALLOC_STATE_MAGIC) return -1;
+ /* Must fail if the major version is too high. */
+ if((ms->version & ~0xffl) > (MALLOC_STATE_VERSION & ~0xffl)) return -2;
+ (void)mutex_lock(&main_arena.mutex);
+ main_arena.av[0] = ms->av[0];
+ main_arena.av[1] = ms->av[1];
+ for(i=0; i<NAV; i++) {
+ b = bin_at(&main_arena, i);
+ if(ms->av[2*i+2] == 0)
+ first(b) = last(b) = b;
+ else {
+ first(b) = ms->av[2*i+2];
+ last(b) = ms->av[2*i+3];
+ if(i > 0) {
+ /* Make sure the links to the `av'-bins in the heap are correct. */
+ first(b)->bk = b;
+ last(b)->fd = b;
+ }
+ }
+ }
+ sbrk_base = ms->sbrk_base;
+ sbrked_mem = ms->sbrked_mem_bytes;
+ trim_threshold = ms->trim_threshold;
+ top_pad = ms->top_pad;
+ n_mmaps_max = ms->n_mmaps_max;
+ mmap_threshold = ms->mmap_threshold;
+ check_action = ms->check_action;
+ max_sbrked_mem = ms->max_sbrked_mem;
+#ifdef NO_THREADS
+ max_total_mem = ms->max_total_mem;
+#endif
+ n_mmaps = ms->n_mmaps;
+ max_n_mmaps = ms->max_n_mmaps;
+ mmapped_mem = ms->mmapped_mem;
+ max_mmapped_mem = ms->max_mmapped_mem;
+ /* add version-dependent code here */
+ (void)mutex_unlock(&main_arena.mutex);
+ return 0;
+}
+
+
+
#if defined(_LIBC) || defined(MALLOC_HOOKS)
/* A simple, standard set of debugging hooks. Overhead is `only' one
@@ -4048,12 +4197,19 @@ weak_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt)
weak_alias (__malloc_stats, malloc_stats)
weak_alias (__malloc_usable_size, malloc_usable_size)
weak_alias (__malloc_trim, malloc_trim)
+weak_alias (__malloc_get_state, malloc_get_state)
+weak_alias (__malloc_set_state, malloc_set_state)
#endif
/*
History:
+ V2.6.4-pt3 Thu Feb 20 1997 Wolfram Gloger (wmglo@dent.med.uni-muenchen.de)
+ * Added malloc_get/set_state() (mainly for use in GNU emacs),
+ using interface from Marcus Daniels
+ * All parameters are now adjustable via environment variables
+
V2.6.4-pt2 Sat Dec 14 1996 Wolfram Gloger (wmglo@dent.med.uni-muenchen.de)
* Added debugging hooks
* Fixed possible deadlock in realloc() when out of memory
diff --git a/malloc/malloc.h b/malloc/malloc.h
index b27d06252c..53b9d1b206 100644
--- a/malloc/malloc.h
+++ b/malloc/malloc.h
@@ -171,6 +171,13 @@ extern size_t malloc_usable_size __MALLOC_P ((__malloc_ptr_t __ptr));
/* Prints brief summary statistics on stderr. */
extern void malloc_stats __MALLOC_P ((void));
+/* Record the state of all malloc variables in an opaque data structure. */
+extern __malloc_ptr_t malloc_get_state __MALLOC_P ((void));
+
+/* Restore the state of all malloc variables from data obtained with
+ malloc_get_state(). */
+extern int malloc_set_state __MALLOC_P ((__malloc_ptr_t __ptr));
+
#if defined(__GLIBC__) || defined(MALLOC_HOOKS)
/* Hooks for debugging versions. */
diff --git a/malloc/thread-m.h b/malloc/thread-m.h
index 10da26ba32..8307f256ff 100644
--- a/malloc/thread-m.h
+++ b/malloc/thread-m.h
@@ -1,6 +1,6 @@
/* Basic platform-independent macro definitions for mutexes and
thread-specific data.
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>, 1996.
@@ -66,19 +66,37 @@ static Void_t *malloc_key_data;
(__pthread_mutex_unlock != NULL ? __pthread_mutex_unlock (m) : 0)
#elif defined(MUTEX_INITIALIZER)
+/* Assume hurd, with cthreads */
-typedef thread_t thread_id;
+/* Cthreads `mutex_t' is a pointer to a mutex, and malloc wants just the
+ mutex itself. */
+#undef mutex_t
+#define mutex_t struct mutex
-/* mutex */
-typedef mutex_t mutex_t;
+#undef mutex_lock
+#define mutex_lock(m) (__mutex_lock(m), 0)
+
+#undef mutex_unlock
+#define mutex_unlock(m) (__mutex_unlock(m), 0)
+
+#define mutex_trylock(m) (!__mutex_trylock(m))
+
+#include <hurd/threadvar.h>
/* thread specific data */
-typedef pthread_key_t tsd_key_t;
+typedef int tsd_key_t;
+
+static int tsd_keys_alloced = 0;
+
+#define tsd_key_create(key, destr) \
+ (assert (tsd_keys_alloced == 0), tsd_keys_alloced++)
+#define tsd_setspecific(key, data) \
+ (*__hurd_threadvar_location (_HURD_THREADVAR_MALLOC) = (unsigned long)(data))
+#define tsd_getspecific(key, vptr) \
+ ((vptr) = (void *)*__hurd_threadvar_location (_HURD_THREADVAR_MALLOC))
-#define mutex_init(m) __mutex_init (m)
-#define mutex_lock(m) __mutex_lock (m)
-#define mutex_trylock(m) __mutex_trylock (m)
-#define mutex_unlock(m) __mutex_unlock (m)
+/* No we're *not* using pthreads. */
+#define __pthread_initialize ((void (*)(void))0)
#else
diff --git a/manual/stdio-fp.c b/manual/stdio-fp.c
new file mode 100644
index 0000000000..db9480782d
--- /dev/null
+++ b/manual/stdio-fp.c
@@ -0,0 +1,28 @@
+/* This program is to generate one of the examples in stdio.texi. */
+
+#include <stdio.h>
+
+
+static void
+print (double v)
+{
+ printf ("|%13.4a|%13.4f|%13.4e|%13.4g|\n", v, v, v, v);
+}
+
+
+int
+main (void)
+{
+ print (0.0);
+ print (0.5);
+ print (1.0);
+ print (-1.0);
+ print (100.0);
+ print (1000.0);
+ print (10000.0);
+ print (12345.0);
+ print (100000.0);
+ print (123456.0);
+
+ return 0;
+}
diff --git a/manual/stdio.texi b/manual/stdio.texi
index e922fd17d8..04c635b054 100644
--- a/manual/stdio.texi
+++ b/manual/stdio.texi
@@ -1007,6 +1007,12 @@ whichever is more appropriate for its magnitude. @samp{%g} uses
lower-case letters and @samp{%G} uses upper-case. @xref{Floating-Point
Conversions}, for details.
+@item @samp{%a}, @samp{%A}
+Print a floating-point number in a hexadecimal fractional notation which
+the exponent to base 2 represented in decimal digits. @samp{%a} uses
+lower-case letters and @samp{%A} uses upper-case. @xref{Floating-Point
+Conversions}, for details.
+
@item @samp{%c}
Print a single character. @xref{Other Output Conversions}.
@@ -1194,6 +1200,34 @@ than -4 or greater than or equal to the precision; otherwise they use the
of the result and a decimal-point character appears only if it is
followed by a digit.
+The @samp{%a} and @samp{%A} conversions are meant for representing
+floating-point number exactly in textual form so that they can be
+exchanged as texts between different programs and/or machines. The
+numbers are represented is the form
+@w{[@code{-}]@code{0x}@var{h}@code{.}@var{hhh}@code{p}[@code{+}|@code{-}]@var{dd}}.
+At the left of the decimal-point character exactly one digit is print.
+This character is only @code{0} is the number is denormalized.
+Otherwise the value is unspecifed; it is implemention dependent how many
+bits are used. The number of hexadecimal digits on the right side of
+the decimal-point character is equal to the precision. If the precision
+is zero it is determined to be large enough to provide an exact
+representation of the number (or it is large enough to distinguish two
+adjacent values if the @code{FLT_RADIX} is not a power of 2,
+@pxref{Floating Point Parameters}) For the @samp{%a} conversion
+lower-case characters are used to represent the hexadecimal number and
+the prefix and exponent sign are printed as @code{0x} and @code{p}
+respectively. Otherwise upper-case characters are used and @code{0X}
+and @code{P} are used for the representation of prefix and exponent
+string. The exponent to the base of two is printed as a decimal number
+using at least one digit but at most as many digits as necessary to
+represent the value exactly.
+
+If the value to be printed represents infinity or a NaN, the output is
+@w{[@code{-}]@code{inf}} or @code{nan} respectively if the conversion
+specifier is @samp{%a}, @samp{%e}, @samp{%f}, or @samp{%g} and it is
+@w{[@code{-}]@code{INF}} or @code{NAN} respectively if the conversion is
+@samp{%A}, @samp{%E}, or @samp{%G}.
+
The following flags can be used to modify the behavior:
@comment We use @asis instead of @samp so we can have ` ' as an item.
@@ -1255,21 +1289,22 @@ floating-point conversions. All of the numbers were printed using
this template string:
@smallexample
-"|%12.4f|%12.4e|%12.4g|\n"
+"|%13.4a|%13.4f|%13.4e|%13.4g|\n"
@end smallexample
Here is the output:
@smallexample
-| 0.0000| 0.0000e+00| 0|
-| 1.0000| 1.0000e+00| 1|
-| -1.0000| -1.0000e+00| -1|
-| 100.0000| 1.0000e+02| 100|
-| 1000.0000| 1.0000e+03| 1000|
-| 10000.0000| 1.0000e+04| 1e+04|
-| 12345.0000| 1.2345e+04| 1.234e+04|
-| 100000.0000| 1.0000e+05| 1e+05|
-| 123456.0000| 1.2346e+05| 1.234e+05|
+| 0x0.0000p+0| 0.0000| 0.0000e+00| 0|
+| 0x1.0000p-1| 0.5000| 5.0000e-01| 0.5|
+| 0x1.0000p+0| 1.0000| 1.0000e+00| 1|
+| -0x1.0000p+0| -1.0000| -1.0000e+00| -1|
+| 0x1.9000p+6| 100.0000| 1.0000e+02| 100|
+| 0x1.f400p+9| 1000.0000| 1.0000e+03| 1000|
+| 0x1.3880p+13| 10000.0000| 1.0000e+04| 1e+04|
+| 0x1.81c8p+13| 12345.0000| 1.2345e+04| 1.234e+04|
+| 0x1.86a0p+16| 100000.0000| 1.0000e+05| 1e+05|
+| 0x1.e240p+16| 123456.0000| 1.2346e+05| 1.235e+05|
@end smallexample
Notice how the @samp{%g} conversion drops trailing zeros.
diff --git a/math/math.h b/math/math.h
index b713163f76..eb8a4f202d 100644
--- a/math/math.h
+++ b/math/math.h
@@ -1,5 +1,5 @@
/* Declarations for math functions.
- Copyright (C) 1991, 92, 93, 95, 96 Free Software Foundation, Inc.
+ Copyright (C) 1991, 92, 93, 95, 96, 97 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
@@ -99,9 +99,12 @@ extern _LIB_VERSION_TYPE _LIB_VERSION;
#endif
-#ifdef __USE_SVID
+#if defined __USE_SVID && !defined __cplusplus
/* In SVID error handling, `matherr' is called with this description
- of the exceptional condition. */
+ of the exceptional condition.
+
+ We have a problem when using C++ since `exception' is reserved in
+ C++. */
struct exception
{
int type;
@@ -128,7 +131,7 @@ extern int matherr __P ((struct exception *));
#define HUGE FLT_MAX
#include <float.h> /* Defines FLT_MAX. */
-#endif
+#endif /* SVID && !C++ */
#ifdef __USE_BSD
diff --git a/misc/error.c b/misc/error.c
index 2a7df0210d..f49e4a7983 100644
--- a/misc/error.c
+++ b/misc/error.c
@@ -71,6 +71,11 @@ unsigned int error_message_count;
#define program_name program_invocation_name
#include <errno.h>
+/* In GNU libc we want do not want to use the common name `error' directly.
+ Instead make it a weak alias. */
+#define error __error
+#define error_at_line __error_at_line
+
#else
/* The calling program should define program_name and set it to the
@@ -230,3 +235,11 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist)
if (status)
exit (status);
}
+
+#ifdef _LIBC
+/* Make the weak alias. */
+#undef error
+#undef error_at_line
+weak_alias (__error, error)
+weak_alias (__error_at_line, error_at_line)
+#endif
diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
index e90dd0f220..f9dcce4c8d 100644
--- a/misc/sys/cdefs.h
+++ b/misc/sys/cdefs.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 93, 94, 95, 96, 97 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
@@ -102,4 +102,9 @@
#define __attribute__(xyz) /* Ignore. */
#endif
+
+/* For now no version of gcc knows the `restrict' keyword. Define it
+ for now unconditionally to the empty string. */
+#define __restrict
+
#endif /* sys/cdefs.h */
diff --git a/rellns-sh b/rellns-sh
index 61f18c4146..abe758a997 100755
--- a/rellns-sh
+++ b/rellns-sh
@@ -1,6 +1,6 @@
#! /bin/sh
# rellns-sh - Simplified ln program to generate relative symbolic link.
-# Copyright (C) 1996 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
# Written by Ulrich Drepper <drepper@cygnus.com>, October 1996
#
# This program is free software; you can redistribute it and/or modify
@@ -22,12 +22,6 @@ if test $# -ne 2; then
exit 1
fi
-# We only handle the case where SOURCE is the name of an existing file
-if test ! -f $1; then
- echo "rellns: $1 must name an existing file" >&2
- exit 1
-fi
-
case $1 in
/*)
# Make both paths absolute.
diff --git a/stdio-common/Makefile b/stdio-common/Makefile
index 814374b8ae..d1d922ed36 100644
--- a/stdio-common/Makefile
+++ b/stdio-common/Makefile
@@ -25,7 +25,7 @@ headers := stdio_lim.h printf.h
routines := \
ctermid cuserid \
- vfprintf vprintf printf_fp reg-printf printf-prs _itoa \
+ vfprintf vprintf printf_fp reg-printf printf-prs _itoa printf_fphex \
fprintf printf snprintf sprintf asprintf dprintf \
vfscanf \
fscanf scanf sscanf \
diff --git a/stdio-common/printf_fp.c b/stdio-common/printf_fp.c
index dede144b8d..8cff7a4d66 100644
--- a/stdio-common/printf_fp.c
+++ b/stdio-common/printf_fp.c
@@ -1,5 +1,5 @@
/* Floating point output for `printf'.
- Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
@@ -291,12 +291,12 @@ __printf_fp (FILE *fp,
/* Check for special values: not a number or infinity. */
if (__isnanl (fpnum.ldbl))
{
- special = "NaN";
+ special = isupper (info->spec) ? "NAN" : "nan";
is_neg = 0;
}
else if (__isinfl (fpnum.ldbl))
{
- special = "Inf";
+ special = isupper (info->spec) ? "INF" : "inf";
is_neg = fpnum.ldbl < 0;
}
else
@@ -316,12 +316,12 @@ __printf_fp (FILE *fp,
/* Check for special values: not a number or infinity. */
if (__isnan (fpnum.dbl))
{
- special = "NaN";
+ special = isupper (info->spec) ? "NAN" : "nan";
is_neg = 0;
}
else if (__isinf (fpnum.dbl))
{
- special = "Inf";
+ special = isupper (info->spec) ? "INF" : "inf";
is_neg = fpnum.dbl < 0;
}
else
diff --git a/stdio-common/printf_fphex.c b/stdio-common/printf_fphex.c
new file mode 100644
index 0000000000..d442b56099
--- /dev/null
+++ b/stdio-common/printf_fphex.c
@@ -0,0 +1,440 @@
+/* Print floating point number in hexadecimal notation according to
+ ISO C 9X.
+ Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ 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 <ctype.h>
+#include <ieee754.h>
+#include <math.h>
+#include <printf.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "_itoa.h"
+#include "../locale/localeinfo.h"
+
+/* #define NDEBUG 1*/ /* Undefine this for debugging assertions. */
+#include <assert.h>
+
+/* This defines make it possible to use the same code for GNU C library and
+ the GNU I/O library. */
+#ifdef USE_IN_LIBIO
+# include <libioP.h>
+# define PUT(f, s, n) _IO_sputn (f, s, n)
+# define PAD(f, c, n) _IO_padn (f, c, n)
+/* We use this file GNU C library and GNU I/O library. So make
+ names equal. */
+# undef putc
+# define putc(c, f) _IO_putc_unlocked (c, f)
+# define size_t _IO_size_t
+# define FILE _IO_FILE
+#else /* ! USE_IN_LIBIO */
+# define PUT(f, s, n) fwrite (s, 1, n, f)
+# define PAD(f, c, n) __printf_pad (f, c, n)
+ssize_t __printf_pad __P ((FILE *, char pad, int n)); /* In vfprintf.c. */
+#endif /* USE_IN_LIBIO */
+
+/* Macros for doing the actual output. */
+
+#define outchar(ch) \
+ do \
+ { \
+ register const int outc = (ch); \
+ if (putc (outc, fp) == EOF) \
+ return -1; \
+ ++done; \
+ } while (0)
+
+#define PRINT(ptr, len) \
+ do \
+ { \
+ int outlen = (len); \
+ const char *cp = (ptr); \
+ while (outlen-- > 0) \
+ outchar (*cp++); \
+ } while (0)
+
+#define PADN(ch, len) \
+ do \
+ { \
+ if (PAD (fp, ch, len) != len) \
+ return -1; \
+ done += len; \
+ } \
+ while (0)
+
+
+int
+__printf_fphex (FILE *fp,
+ const struct printf_info *info,
+ const void *const *args)
+{
+ /* The floating-point value to output. */
+ union
+ {
+ union ieee754_double dbl;
+ union ieee854_long_double ldbl;
+ }
+ fpnum;
+
+ /* Locale-dependent representation of decimal point. */
+ wchar_t decimal;
+
+ /* "NaN" or "Inf" for the special cases. */
+ const char *special = NULL;
+
+ /* Buffer for the generated number string for the mantissa. The
+ maximal size for the mantissa is 64 bits. */
+ char numbuf[16];
+ char *numstr;
+ char *numend;
+ int negative;
+
+ /* The maximal exponent of two in decimal notation has 5 digits. */
+ char expbuf[5];
+ char *expstr;
+ int expnegative;
+ int exponent;
+
+ /* Non-zero is mantissa is zero. */
+ int zero_mantissa;
+
+ /* The leading digit before the decimal point. */
+ char leading;
+
+ /* Precision. */
+ int precision = info->prec;
+
+ /* Width. */
+ int width = info->width;
+
+ /* Number of characters written. */
+ int done = 0;
+
+
+ /* Figure out the decimal point character. */
+ if (info->extra == 0)
+ {
+ if (mbtowc (&decimal, _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT),
+ strlen (_NL_CURRENT (LC_NUMERIC, DECIMAL_POINT))) <= 0)
+ decimal = (wchar_t) *_NL_CURRENT (LC_NUMERIC, DECIMAL_POINT);
+ }
+ else
+ {
+ if (mbtowc (&decimal, _NL_CURRENT (LC_MONETARY, MON_DECIMAL_POINT),
+ strlen (_NL_CURRENT (LC_MONETARY, MON_DECIMAL_POINT))) <= 0)
+ decimal = (wchar_t) *_NL_CURRENT (LC_MONETARY, MON_DECIMAL_POINT);
+ }
+ /* Give default value. */
+ if (decimal == L'\0')
+ decimal = L'.';
+
+
+ /* Fetch the argument value. */
+ if (info->is_long_double && sizeof (long double) > sizeof (double))
+ {
+ fpnum.ldbl.d = *(const long double *) args[0];
+
+ /* Check for special values: not a number or infinity. */
+ if (__isnanl (fpnum.ldbl.d))
+ {
+ special = isupper (info->spec) ? "NAN" : "nan";
+ negative = 0;
+ }
+ else
+ {
+ if (__isinfl (fpnum.ldbl.d))
+ special = isupper (info->spec) ? "INF" : "inf";
+
+ negative = fpnum.ldbl.d < 0;
+ }
+ }
+ else
+ {
+ fpnum.dbl.d = *(const double *) args[0];
+
+ /* Check for special values: not a number or infinity. */
+ if (__isnan (fpnum.dbl.d))
+ {
+ special = isupper (info->spec) ? "NAN" : "nan";
+ negative = 0;
+ }
+ else
+ {
+ if (__isinf (fpnum.dbl.d))
+ special = isupper (info->spec) ? "INF" : "inf";
+
+ negative = fpnum.dbl.d < 0;
+ }
+ }
+
+ if (special)
+ {
+ int width = info->prec > info->width ? info->prec : info->width;
+
+ if (negative || info->showsign || info->space)
+ --width;
+ width -= 3;
+
+ if (!info->left && width > 0)
+ PADN (' ', width);
+
+ if (negative)
+ outchar ('-');
+ else if (info->showsign)
+ outchar ('+');
+ else if (info->space)
+ outchar (' ');
+
+ PRINT (special, 3);
+
+ if (info->left && width > 0)
+ PADN (' ', width);
+
+ return done;
+ }
+
+ /* We are handling here only 64 and 80 bit IEEE foating point
+ numbers. */
+ if (info->is_long_double == 0 || sizeof (double) == sizeof (long double))
+ {
+ /* We have 52 bits of mantissa plus one implicit digit. Since
+ 52 bits are representable without rest using hexadecimal
+ digits we use only the implicit digits for the number before
+ the decimal point. */
+ if (sizeof (unsigned long int) > 6)
+ {
+ unsigned long int num;
+
+ num = (((unsigned long int) fpnum.dbl.ieee.mantissa0) << 32
+ | fpnum.dbl.ieee.mantissa1);
+
+ zero_mantissa = num == 0;
+
+ numstr = _itoa_word (num, numbuf + sizeof numbuf, 16,
+ info->spec == 'A');
+ }
+ else
+ {
+ unsigned long long int num;
+
+ num = (((unsigned long long int) fpnum.dbl.ieee.mantissa0) << 32
+ | fpnum.dbl.ieee.mantissa1);
+
+ zero_mantissa = num == 0;
+
+ numstr = _itoa (num, numbuf + sizeof numbuf, 16, info->spec == 'A');
+ }
+
+ /* Fill with zeroes. */
+ while (numstr > numbuf + (sizeof numbuf - 13)) /* 52 ÷ 4 = 13 */
+ *--numstr = '0';
+
+ leading = fpnum.dbl.ieee.exponent == 0 ? '0' : '1';
+
+ exponent = fpnum.dbl.ieee.exponent;
+
+ if (exponent != 0 && exponent < IEEE754_DOUBLE_BIAS)
+ {
+ expnegative = 1;
+ exponent = abs (exponent - IEEE754_DOUBLE_BIAS);
+ }
+ else
+ {
+ expnegative = 0;
+ if (exponent != 0)
+ exponent -= IEEE754_DOUBLE_BIAS;
+ }
+ }
+ else
+ {
+ /* The "strange" 80 bit format on ix86 and m68k has an explicit
+ leading digit in the 64 bit mantissa. */
+ assert (sizeof (long double) == 12);
+
+ if (sizeof (unsigned long int) > 6)
+ {
+ unsigned long int num;
+
+ num = (((unsigned long int) fpnum.dbl.ieee.mantissa0) << 32
+ | fpnum.dbl.ieee.mantissa1);
+
+ zero_mantissa = num == 0;
+
+ numstr = _itoa_word (num, numbuf + sizeof numbuf, 16,
+ info->spec == 'A');
+ }
+ else
+ {
+ unsigned long long int num;
+
+ num = (((unsigned long long int) fpnum.ldbl.ieee.mantissa0) << 32
+ | fpnum.ldbl.ieee.mantissa1);
+
+ zero_mantissa = num == 0;
+
+ numstr = _itoa (num, numbuf + sizeof numbuf, 16, info->spec == 'A');
+ }
+
+ /* We use a full nibble for the leading digit. */
+ leading = *numstr++;
+
+ /* Fill with zeroes. */
+ while (numstr > numbuf + (sizeof numbuf - 15)) /* 60 ÷ 4 = 15 */
+ *--numstr = '0';
+
+ /* We have 3 bits from the mantissa in the leading nibble. */
+ exponent = fpnum.ldbl.ieee.exponent - 3;
+
+ if (exponent != 0 && exponent < IEEE854_LONG_DOUBLE_BIAS)
+ {
+ expnegative = 1;
+ exponent = abs (exponent - IEEE854_LONG_DOUBLE_BIAS);
+ }
+ else
+ {
+ expnegative = 0;
+ if (exponent != 0)
+ exponent -= IEEE854_LONG_DOUBLE_BIAS;
+ }
+ }
+
+ /* Look for trailing zeroes. */
+ if (! zero_mantissa)
+ {
+ numend = numbuf + sizeof numbuf;
+ while (numend[-1] == '0')
+ --numend;
+
+ if (precision == -1)
+ precision = numend - numstr;
+ else if (precision < numend - numstr
+ && (numstr[precision] > 5
+ || (numstr[precision] == 5
+ && (precision + 1 < numend - numstr
+ /* Round to even. */
+ || (precision > 0
+ && ((numstr[precision - 1] & 1)
+ ^ (isdigit (numstr[precision - 1]) == 0)))
+ || (precision == 0
+ && ((leading & 1)
+ ^ (isdigit (leading) == 0)))))))
+ {
+ /* Round up. */
+ int cnt = precision;
+ while (--cnt >= 0)
+ {
+ char ch = numstr[cnt];
+ /* We assume that the digits and the letters are ordered
+ like in ASCII. This is true for the rest of GNU, too. */
+ if (ch == '9')
+ {
+ numstr[cnt] = info->spec; /* This is tricky,
+ think about it! */
+ break;
+ }
+ else if (tolower (ch) < 'f')
+ {
+ ++numstr[cnt];
+ break;
+ }
+ else
+ numstr[cnt] = '0';
+ }
+ if (cnt < 0)
+ {
+ /* The mantissa so far was fff...f Now increment the
+ leading digit. Here it is again possible that we
+ get an overflow. */
+ if (leading == '9')
+ leading = info->spec;
+ else if (tolower (leading) < 'f')
+ ++leading;
+ else
+ {
+ leading = 1;
+ if (expnegative)
+ {
+ exponent += 4;
+ if (exponent >= 0)
+ expnegative = 0;
+ }
+ else
+ exponent += 4;
+ }
+ }
+ }
+ }
+ else
+ numend = numstr;
+
+ /* Now we can compute the exponent string. */
+ expstr = _itoa_word (exponent, expbuf + sizeof expbuf, 10, 0);
+
+ /* Now we have all information to compute the size. */
+ width -= ((negative || info->showsign || info->space)
+ /* Sign. */
+ + 2 + 1 + 1 + precision + 1 + 1
+ /* 0x h . hhh P ExpoSign. */
+ + ((expbuf + sizeof expbuf) - expstr));
+ /* Exponent. */
+
+ /* A special case if when the mantissa is zero and the `#' is not
+ given. In this case we must not print the decimal point. */
+ if (zero_mantissa && precision == 0 && !info->alt)
+ ++width; /* This nihilates the +1 for the decimal-point
+ character in the following equation. */
+
+ if (!info->left && width > 0)
+ PADN (' ', width);
+
+ if (negative)
+ outchar ('-');
+ else if (info->showsign)
+ outchar ('+');
+ else if (info->space)
+ outchar (' ');
+
+ outchar ('0');
+ outchar (info->spec == 'A' ? 'X' : 'x');
+ outchar (leading);
+
+ if (!zero_mantissa || precision != 0 || info->alt)
+ outchar (decimal);
+
+ if (!zero_mantissa || precision != 0)
+ {
+ PRINT (numstr, MIN (numend - numstr, precision));
+ if (precision > numend - numstr)
+ PADN ('0', precision - (numend - numstr));
+ }
+
+ if (info->left && info->pad == '0' && width > 0)
+ PADN ('0', width);
+
+ outchar (info->spec == 'A' ? 'P' : 'p');
+
+ outchar (expnegative ? '-' : '+');
+
+ PRINT (expstr, (expbuf + sizeof expbuf) - expstr);
+
+ if (info->left && info->pad != '0' && width > 0)
+ PADN (info->pad, width);
+
+ return done;
+}
diff --git a/stdio-common/tstscanf.c b/stdio-common/tstscanf.c
index d76d95b1b7..85be441b5b 100644
--- a/stdio-common/tstscanf.c
+++ b/stdio-common/tstscanf.c
@@ -140,5 +140,15 @@ main (int argc, char **argv)
if (out != stdout)
pclose (out);
+ fputs ("Test 3:\n", out);
+ {
+ int res, val, n;
+
+ res = sscanf ("-242", "%3o%n", &val, &n);
+ printf ("res = %d, val = %d, n = %d\n", res, val, n);
+ if (res != 1 || val != -20 || n != 3)
+ return 1;
+ }
+
exit(EXIT_SUCCESS);
}
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
index eda0d7bd8e..c206c2f0ac 100644
--- a/stdio-common/vfprintf.c
+++ b/stdio-common/vfprintf.c
@@ -238,7 +238,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
/* '4' */ 8, /* '5' */ 8, /* '6' */ 8, /* '7' */ 8,
/* '8' */ 8, /* '9' */ 8, 0, 0,
0, 0, 0, 0,
- 0, 0, 0, /* 'C' */ 25,
+ 0, /* 'A' */ 26, 0, /* 'C' */ 25,
0, /* 'E' */ 19, 0, /* 'G' */ 19,
0, 0, 0, 0,
/* 'L' */ 12, 0, 0, 0,
@@ -246,7 +246,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
0, 0, 0, 0,
/* 'X' */ 18, 0, /* 'Z' */ 13, 0,
0, 0, 0, 0,
- 0, 0, 0, /* 'c' */ 20,
+ 0, /* 'a' */ 26, 0, /* 'c' */ 20,
/* 'd' */ 15, /* 'e' */ 19, /* 'f' */ 19, /* 'g' */ 19,
/* 'h' */ 10, /* 'i' */ 15, 0, 0,
/* 'l' */ 11, /* 'm' */ 24, /* 'n' */ 23, /* 'o' */ 17,
@@ -270,7 +270,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
#define STEP0_3_TABLE \
/* Step 0: at the beginning. */ \
- static const void *step0_jumps[26] = \
+ static const void *step0_jumps[27] = \
{ \
REF (form_unknown), \
REF (flag_space), /* for ' ' */ \
@@ -297,10 +297,11 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
REF (form_pointer), /* for 'p' */ \
REF (form_number), /* for 'n' */ \
REF (form_strerror), /* for 'm' */ \
- REF (form_wcharacter) /* for 'C' */ \
+ REF (form_wcharacter), /* for 'C' */ \
+ REF (form_floathex) /* for 'A', 'a' */ \
}; \
/* Step 1: after processing width. */ \
- static const void *step1_jumps[26] = \
+ static const void *step1_jumps[27] = \
{ \
REF (form_unknown), \
REF (form_unknown), /* for ' ' */ \
@@ -327,10 +328,11 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
REF (form_pointer), /* for 'p' */ \
REF (form_number), /* for 'n' */ \
REF (form_strerror), /* for 'm' */ \
- REF (form_wcharacter) /* for 'C' */ \
+ REF (form_wcharacter), /* for 'C' */ \
+ REF (form_floathex) /* for 'A', 'a' */ \
}; \
/* Step 2: after processing precision. */ \
- static const void *step2_jumps[26] = \
+ static const void *step2_jumps[27] = \
{ \
REF (form_unknown), \
REF (form_unknown), /* for ' ' */ \
@@ -357,10 +359,11 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
REF (form_pointer), /* for 'p' */ \
REF (form_number), /* for 'n' */ \
REF (form_strerror), /* for 'm' */ \
- REF (form_wcharacter) /* for 'C' */ \
+ REF (form_wcharacter), /* for 'C' */ \
+ REF (form_floathex) /* for 'A', 'a' */ \
}; \
/* Step 3: after processing first 'l' modifier. */ \
- static const void *step3_jumps[26] = \
+ static const void *step3_jumps[27] = \
{ \
REF (form_unknown), \
REF (form_unknown), /* for ' ' */ \
@@ -387,12 +390,13 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
REF (form_pointer), /* for 'p' */ \
REF (form_number), /* for 'n' */ \
REF (form_strerror), /* for 'm' */ \
- REF (form_wcharacter) /* for 'C' */ \
+ REF (form_wcharacter), /* for 'C' */ \
+ REF (form_floathex) /* for 'A', 'a' */ \
}
#define STEP4_TABLE \
/* Step 4: processing format specifier. */ \
- static const void *step4_jumps[26] = \
+ static const void *step4_jumps[27] = \
{ \
REF (form_unknown), \
REF (form_unknown), /* for ' ' */ \
@@ -419,7 +423,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
REF (form_pointer), /* for 'p' */ \
REF (form_number), /* for 'n' */ \
REF (form_strerror), /* for 'm' */ \
- REF (form_wcharacter) /* for 'C' */ \
+ REF (form_wcharacter), /* for 'C' */ \
+ REF (form_floathex) /* for 'A', 'a' */ \
}
@@ -702,6 +707,53 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
} \
break; \
\
+ LABEL (form_floathex): \
+ { \
+ /* FLoating point number printed as hexadecimal number. */ \
+ extern int __printf_fphex __P ((FILE *, const struct printf_info *, \
+ const void **const)); \
+ const void *ptr; \
+ int function_done; \
+ \
+ if (fspec == NULL) \
+ { \
+ struct printf_info info = { prec: prec, \
+ width: width, \
+ spec: spec, \
+ is_long_double: is_long_double, \
+ is_short: is_short, \
+ is_long: is_long, \
+ alt: alt, \
+ space: space, \
+ left: left, \
+ showsign: showsign, \
+ group: group, \
+ pad: pad, \
+ extra: 0 }; \
+ \
+ if (is_long_double) \
+ the_arg.pa_long_double = va_arg (ap, long double); \
+ else \
+ the_arg.pa_double = va_arg (ap, double); \
+ ptr = (const void *) &the_arg; \
+ \
+ function_done = __printf_fphex (s, &info, &ptr); \
+ } \
+ else \
+ { \
+ ptr = (const void *) &args_value[fspec->data_arg]; \
+ \
+ function_done = __printf_fphex (s, &fspec->info, &ptr); \
+ } \
+ \
+ if (function_done < 0) \
+ /* Error in print handler. */ \
+ return -1; \
+ \
+ done += function_done; \
+ } \
+ break; \
+ \
LABEL (form_character): \
/* Character. */ \
if (is_long) \
@@ -881,7 +933,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
done = 0;
grouping = (const char *) -1;
#ifdef __va_copy
- /* This macro will be available soon in gcc's <stdarg.h>. Me need it
+ /* This macro will be available soon in gcc's <stdarg.h>. We need it
since on some systems `va_list' is not an integral type. */
__va_copy (ap_save, ap);
#else
@@ -1405,16 +1457,16 @@ printf_unknown (FILE *s, const struct printf_info *info,
if (info->width != 0)
{
w = _itoa_word (info->width, workend + 1, 10, 0);
- while (++w <= workend)
- outchar (*w);
+ while (w <= workend)
+ outchar (*w++);
}
if (info->prec != -1)
{
outchar ('.');
w = _itoa_word (info->prec, workend + 1, 10, 0);
- while (++w <= workend)
- outchar (*w);
+ while (w <= workend)
+ outchar (*w++);
}
if (info->spec != '\0')
diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c
index f201c46775..8653088751 100644
--- a/stdio-common/vfscanf.c
+++ b/stdio-common/vfscanf.c
@@ -841,9 +841,9 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
if (flags & LONGDBL)
{
if (number_signed)
- num.q = __strtoq_internal (wp, &tw, base, flags & GROUP);
+ num.q = __strtoll_internal (wp, &tw, base, flags & GROUP);
else
- num.uq = __strtouq_internal (wp, &tw, base, flags & GROUP);
+ num.uq = __strtoull_internal (wp, &tw, base, flags & GROUP);
}
else
{
diff --git a/stdio/stdio.h b/stdio/stdio.h
index bd2ffa8eb5..b2d064483b 100644
--- a/stdio/stdio.h
+++ b/stdio/stdio.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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
@@ -307,7 +307,7 @@ extern char *tmpnam_r __P ((char *__s));
#endif
-#if defined(__USE_SVID) || defined(__USE_XOPEN)
+#if defined __USE_SVID || defined __USE_XOPEN
/* Generate a unique temporary filename using up to five characters of PFX
if it is not NULL. The directory to put this file in is searched for
as follows: First the environment variable "TMPDIR" is checked.
@@ -339,8 +339,9 @@ extern int fcloseall __P ((void));
/* Open a file and create a new stream for it. */
extern FILE *fopen __P ((__const char *__filename, __const char *__modes));
/* Open a file, replacing an existing stream with it. */
-extern FILE *freopen __P ((__const char *__filename,
- __const char *__modes, FILE *__stream));
+extern FILE *freopen __P ((__const char *__restrict __filename,
+ __const char *__rstrict __modes,
+ FILE *__restrict __stream));
/* Return a new, zeroed, stream.
You must set its cookie and io_mode.
@@ -376,11 +377,11 @@ extern FILE *open_memstream __P ((char **__bufloc, size_t *__sizeloc));
/* If BUF is NULL, make STREAM unbuffered.
Else make it use buffer BUF, of size BUFSIZ. */
-extern void setbuf __P ((FILE *__stream, char *__buf));
+extern void setbuf __P ((FILE *__restrict __stream, char *__restrict __buf));
/* Make STREAM use buffering mode MODE.
If BUF is not NULL, use N bytes of it for buffering;
else allocate an internal buffer N bytes long. */
-extern int setvbuf __P ((FILE *__stream, char *__buf,
+extern int setvbuf __P ((FILE *__restrict __stream, char *__restrict __buf,
int __modes, size_t __n));
#ifdef __USE_BSD
@@ -394,24 +395,29 @@ extern void setlinebuf __P ((FILE *__stream));
/* Write formatted output to STREAM. */
-extern int fprintf __P ((FILE *__stream, __const char *__format, ...));
+extern int fprintf __P ((FILE *__restrict __stream,
+ __const char *__restrict __format, ...));
/* Write formatted output to stdout. */
-extern int printf __P ((__const char *__format, ...));
+extern int printf __P ((__const char *__restrict __format, ...));
/* Write formatted output to S. */
-extern int sprintf __P ((char *__s, __const char *__format, ...));
+extern int sprintf __P ((char *__restrict __s,
+ __const char *__restrict __format, ...));
/* Write formatted output to S from argument list ARG. */
-extern int vfprintf __P ((FILE *__s, __const char *__format,
+extern int vfprintf __P ((FILE *__restrict __s,
+ __const char *__restrict __format,
__gnuc_va_list __arg));
/* Write formatted output to stdout from argument list ARG. */
-extern int vprintf __P ((__const char *__format, __gnuc_va_list __arg));
+extern int vprintf __P ((__const char *__restrict __format,
+ __gnuc_va_list __arg));
/* Write formatted output to S from argument list ARG. */
-extern int vsprintf __P ((char *__s, __const char *__format,
+extern int vsprintf __P ((char *__restrict __s,
+ __const char *__restrict __format,
__gnuc_va_list __arg));
#ifdef __OPTIMIZE__
extern __inline int
-vprintf (const char *__fmt, __gnuc_va_list __arg)
+vprintf (const char *__restrict __fmt, __gnuc_va_list __arg)
{
return vfprintf (stdout, __fmt, __arg);
}
@@ -443,11 +449,13 @@ extern int dprintf __P ((int __fd, __const char *__fmt, ...));
/* Read formatted input from STREAM. */
-extern int fscanf __P ((FILE *__stream, __const char *__format, ...));
+extern int fscanf __P ((FILE *__restrict __stream,
+ __const char *__restrict __format, ...));
/* Read formatted input from stdin. */
-extern int scanf __P ((__const char *__format, ...));
+extern int scanf __P ((__const char *__restrict __format, ...));
/* Read formatted input from S. */
-extern int sscanf __P ((__const char *__s, __const char *__format, ...));
+extern int sscanf __P ((__const char *__restrict __s,
+ __const char *__restrict __format, ...));
#ifdef __USE_GNU
/* Read formatted input from S into argument list ARG. */
@@ -556,7 +564,8 @@ extern int putw __P ((int __w, FILE *__stream));
/* Get a newline-terminated string of finite length from STREAM. */
-extern char *fgets __P ((char *__s, int __n, FILE *__stream));
+extern char *fgets __P ((char *__restrict __s, int __n,
+ FILE *__restrict __stream));
/* Get a newline-terminated string from stdin, removing the newline.
DO NOT USE THIS FUNCTION!! There is no limit on how much it will read. */
@@ -582,27 +591,17 @@ ssize_t getline __P ((char **__lineptr, size_t *__n, FILE *__stream));
#ifdef __OPTIMIZE__
extern __inline ssize_t
-__getline (char **__lineptr, size_t *__n, FILE *__stream)
-{
- return __getdelim (__lineptr, __n, '\n', __stream);
-}
-
-extern __inline ssize_t
-getdelim (char **__lineptr, size_t *__n, int __delimiter, FILE *__stream)
-{
- return __getdelim (__lineptr, __n, __delimiter, __stream);
-}
-extern __inline ssize_t
getline (char **__lineptr, size_t *__n, FILE *__stream)
{
- return __getline (__lineptr, __n, __stream);
+ return __getdelim (__lineptr, __n, '\n', __stream);
}
#endif /* Optimizing. */
#endif
/* Write a string to STREAM. */
-extern int fputs __P ((__const char *__s, FILE *__stream));
+extern int fputs __P ((__const char *__restrict __s,
+ FILE *__restrict __stream));
/* Write a string, followed by a newline, to stdout. */
extern int puts __P ((__const char *__s));
@@ -612,11 +611,11 @@ extern int ungetc __P ((int __c, FILE *__stream));
/* Read chunks of generic data from STREAM. */
-extern size_t fread __P ((__ptr_t __ptr, size_t __size,
- size_t __n, FILE *__stream));
+extern size_t fread __P ((__ptr_t __restrict __ptr, size_t __size,
+ size_t __n, FILE *__restrict __stream));
/* Write chunks of generic data to STREAM. */
-extern size_t fwrite __P ((__const __ptr_t __ptr, size_t __size,
- size_t __n, FILE *__s));
+extern size_t fwrite __P ((__const __ptr_t __restrict __ptr, size_t __size,
+ size_t __n, FILE *__restrict __s));
/* Seek to a certain position on STREAM. */
@@ -627,7 +626,7 @@ extern long int ftell __P ((FILE *__stream));
extern void rewind __P ((FILE *__stream));
/* Get STREAM's position. */
-extern int fgetpos __P ((FILE *__stream, fpos_t *__pos));
+extern int fgetpos __P ((FILE *__restrict __stream, fpos_t *__restrict __pos));
/* Set STREAM's position. */
extern int fsetpos __P ((FILE *__stream, __const fpos_t *__pos));
diff --git a/stdlib/Makefile b/stdlib/Makefile
index b2641e4ba8..af80c0b3d8 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -38,7 +38,7 @@ routines := \
drand48_r erand48_r lrand48_r nrand48_r mrand48_r jrand48_r \
srand48_r seed48_r lcong48_r \
drand48-iter \
- strtol strtoul strtoq strtouq \
+ strtol strtoul strtoll strtoull \
strtof strtod strtold \
system canonicalize \
a64l l64a \
diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h
index 758241ee43..aaabbc8edc 100644
--- a/stdlib/stdlib.h
+++ b/stdlib/stdlib.h
@@ -79,108 +79,129 @@ extern int atoi __P ((__const char *__nptr));
/* Convert a string to a long integer. */
extern long int atol __P ((__const char *__nptr));
-#if defined (__GNUC__) && defined (__USE_MISC)
+#if defined __USE_ISOC9X || (defined __GNUC__ && defined __USE_MISC)
/* These functions will part of the standard C library in ISO C 9X. */
extern long long int atoll __P ((__const char *__nptr));
#endif
/* Convert a string to a floating-point number. */
-extern double strtod __P ((__const char *__nptr, char **__endptr));
+extern double strtod __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr));
#ifdef __USE_GNU
/* Likewise for `float' and `long double' sizes of floating-point numbers. */
-extern float strtof __P ((__const char *__nptr, char **__endptr));
-extern __long_double_t strtold __P ((__const char *__nptr, char **__endptr));
+extern float strtof __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr));
+
+extern __long_double_t strtold __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr));
#endif
/* Convert a string to a long integer. */
-extern long int strtol __P ((__const char *__nptr, char **__endptr,
- int __base));
+extern long int strtol __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr, int __base));
/* Convert a string to an unsigned long integer. */
-extern unsigned long int strtoul __P ((__const char *__nptr,
- char **__endptr, int __base));
+extern unsigned long int strtoul __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr,
+ int __base));
-#if defined (__GNUC__) && defined (__USE_BSD)
+#if defined __GNUC__ && defined __USE_BSD
/* Convert a string to a quadword integer. */
-extern long long int strtoq __P ((__const char *__nptr, char **__endptr,
- int __base));
+extern long long int strtoq __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr, int __base));
/* Convert a string to an unsigned quadword integer. */
-extern unsigned long long int strtouq __P ((__const char *__nptr,
- char **__endptr, int __base));
+extern unsigned long long int strtouq __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr,
+ int __base));
#endif /* GCC and use BSD. */
-#if defined (__GNUC__) && defined (__USE_MISC)
+#if defined __USE_ISOC9X || (defined __GNUC__ && defined __USE_MISC)
/* These functions will part of the standard C library in ISO C 9X. */
/* Convert a string to a quadword integer. */
-extern long long int strtoll __P ((__const char *__nptr, char **__endptr,
- int __base));
+extern long long int strtoll __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr, int __base));
/* Convert a string to an unsigned quadword integer. */
-extern unsigned long long int strtoull __P ((__const char *__nptr,
- char **__endptr, int __base));
-#endif /* GCC and use MISC. */
+extern unsigned long long int strtoull __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr,
+ int __base));
+#endif /* ISO C 9X or GCC and use MISC. */
/* The internal entry points for `strtoX' take an extra flag argument
saying whether or not to parse locale-dependent number grouping. */
-extern double __strtod_internal __P ((__const char *__nptr,
- char **__endptr, int __group));
-extern float __strtof_internal __P ((__const char *__nptr, char **__endptr,
- int __group));
-extern __long_double_t __strtold_internal __P ((__const char *__nptr,
- char **__endptr, int __group));
-extern long int __strtol_internal __P ((__const char *__nptr, char **__endptr,
+extern double __strtod_internal __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr,
+ int __group));
+extern float __strtof_internal __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr, int __group));
+extern __long_double_t __strtold_internal __P ((__const char *
+ __restrict __nptr,
+ char **__restrict __endptr,
+ int __group));
+extern long int __strtol_internal __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr,
int __base, int __group));
-extern unsigned long int __strtoul_internal __P ((__const char *__nptr,
- char **__endptr, int __base,
- int __group));
+extern unsigned long int __strtoul_internal __P ((__const char *
+ __restrict __nptr,
+ char **__restrict __endptr,
+ int __base, int __group));
#ifdef __GNUC__
-extern long long int __strtoq_internal __P ((__const char *__nptr,
- char **__endptr, int __base,
- int __group));
-extern unsigned long long int __strtouq_internal __P ((__const char *__nptr,
- char **__endptr,
- int __base,
- int __group));
+extern long long int __strtoll_internal __P ((__const char *__restrict __nptr,
+ char **__restrict __endptr,
+ int __base, int __group));
+extern unsigned long long int __strtoull_internal __P ((__const char *
+ __restrict __nptr,
+ char **
+ __restrict __endptr,
+ int __base,
+ int __group));
#endif /* GCC */
#if defined (__OPTIMIZE__) && __GNUC__ >= 2
/* Define inline functions which call the internal entry points. */
-extern __inline double strtod (__const char *__nptr, char **__endptr)
+extern __inline double strtod (__const char *__restrict __nptr,
+ char **__restrict __endptr)
{ return __strtod_internal (__nptr, __endptr, 0); }
-extern __inline long int strtol (__const char *__nptr,
- char **__endptr, int __base)
+extern __inline long int strtol (__const char *__restrict __nptr,
+ char **__restrict __endptr, int __base)
{ return __strtol_internal (__nptr, __endptr, __base, 0); }
-extern __inline unsigned long int strtoul (__const char *__nptr,
- char **__endptr, int __base)
+extern __inline unsigned long int strtoul (__const char *__restrict __nptr,
+ char **__restrict __endptr,
+ int __base)
{ return __strtoul_internal (__nptr, __endptr, __base, 0); }
#ifdef __USE_GNU
-extern __inline float strtof (__const char *__nptr, char **__endptr)
+extern __inline float strtof (__const char *__restrict __nptr,
+ char **__restrict __endptr)
{ return __strtof_internal (__nptr, __endptr, 0); }
-extern __inline __long_double_t strtold (__const char *__nptr, char **__endptr)
+extern __inline __long_double_t strtold (__const char *__restrict __nptr,
+ char **__restrict __endptr)
{ return __strtold_internal (__nptr, __endptr, 0); }
#endif
#ifdef __USE_BSD
-extern __inline long long int strtoq (__const char *__nptr, char **__endptr,
- int __base)
-{ return __strtoq_internal (__nptr, __endptr, __base, 0); }
-extern __inline unsigned long long int strtouq (__const char *__nptr,
- char **__endptr, int __base)
-{ return __strtouq_internal (__nptr, __endptr, __base, 0); }
+extern __inline long long int strtoq (__const char *__restrict __nptr,
+ char **__restrict __endptr, int __base)
+{ return __strtoll_internal (__nptr, __endptr, __base, 0); }
+extern __inline unsigned long long int strtouq (__const char *__restrict __nptr,
+ char **__restrict __endptr,
+ int __base)
+{ return __strtoull_internal (__nptr, __endptr, __base, 0); }
#endif
-#ifdef __USE_MISC
-extern __inline long long int strtoll (__const char *__nptr, char **__endptr,
- int __base)
-{ return __strtoq_internal (__nptr, __endptr, __base, 0); }
-extern __inline unsigned long long int strtoull (__const char *__nptr,
- char **__endptr, int __base)
-{ return __strtouq_internal (__nptr, __endptr, __base, 0); }
+#if defined __USE_MISC || defined __USE_ISOC9X
+extern __inline long long int strtoll (__const char *__restrict __nptr,
+ char **__restrict __endptr, int __base)
+{ return __strtoll_internal (__nptr, __endptr, __base, 0); }
+extern __inline unsigned long long int strtoull (__const char *
+ __restrict __nptr,
+ char **__restrict __endptr,
+ int __base)
+{ return __strtoull_internal (__nptr, __endptr, __base, 0); }
#endif
extern __inline double atof (__const char *__nptr)
@@ -483,8 +504,9 @@ extern void qsort __P ((__ptr_t __base, size_t __nmemb, size_t __size,
/* Return the absolute value of X. */
extern int abs __P ((int __x)) __attribute__ ((__const__));
extern long int labs __P ((long int __x)) __attribute__ ((__const__));
-#ifdef __USE_GNU
-extern long long int llabs __P ((long long int __x)) __attribute__ ((__const__));
+#if defined __USE_ISOC9X
+extern long long int llabs __P ((long long int __x))
+ __attribute__ ((__const__));
#endif
@@ -492,9 +514,11 @@ extern long long int llabs __P ((long long int __x)) __attribute__ ((__const__))
of the value of NUMER over DENOM. */
/* GCC may have built-ins for these someday. */
extern div_t div __P ((int __numer, int __denom)) __attribute__ ((__const__));
-extern ldiv_t ldiv __P ((long int __numer, long int __denom)) __attribute__ ((__const__));
-#ifdef __USE_GNU
-extern lldiv_t lldiv __P ((long long int __numer, long long int __denom)) __attribute__ ((__const__));
+extern ldiv_t ldiv __P ((long int __numer, long int __denom))
+ __attribute__ ((__const__));
+#ifdef __USE_ISOC9X
+extern lldiv_t lldiv __P ((long long int __numer, long long int __denom))
+ __attribute__ ((__const__));
#endif
@@ -548,7 +572,8 @@ extern int qfcvt_r __P ((__long_double_t __value, int __ndigit, int *__decpt,
extern int mblen __P ((__const char *__s, size_t __n));
/* Return the length of the given multibyte character,
putting its `wchar_t' representation in *PWC. */
-extern int mbtowc __P ((wchar_t *__pwc, __const char *__s, size_t __n));
+extern int mbtowc __P ((wchar_t *__restrict __pwc,
+ __const char *__restrict __s, size_t __n));
/* Put the multibyte character represented
by WCHAR in S, returning its length. */
extern int wctomb __P ((char *__s, wchar_t __wchar));
@@ -560,9 +585,11 @@ extern __inline int mblen (__const char *__s, size_t __n)
/* Convert a multibyte string to a wide char string. */
-extern size_t mbstowcs __P ((wchar_t *__pwcs, __const char *__s, size_t __n));
+extern size_t mbstowcs __P ((wchar_t *__restrict __pwcs,
+ __const char *__restrict __s, size_t __n));
/* Convert a wide char string to multibyte string. */
-extern size_t wcstombs __P ((char *__s, __const wchar_t *__pwcs, size_t __n));
+extern size_t wcstombs __P ((char *__restrict __s,
+ __const wchar_t *__restrict __pwcs, size_t __n));
#ifdef __USE_SVID
diff --git a/stdlib/strtod.c b/stdlib/strtod.c
index e5951f01a4..ed24c08f2b 100644
--- a/stdlib/strtod.c
+++ b/stdlib/strtod.c
@@ -41,18 +41,21 @@
# define L_(Ch) L##Ch
# define ISSPACE(Ch) iswspace (Ch)
# define TOLOWER(Ch) towlower (Ch)
+# define STRNCASECMP(S1, S2, N) __wcsncasecmp ((S1), (S2), (N))
#else
# define STRING_TYPE char
# define CHAR_TYPE char
# define L_(Ch) Ch
# define ISSPACE(Ch) isspace (Ch)
# define TOLOWER(Ch) tolower (Ch)
+# define STRNCASECMP(S1, S2, N) __strncasecmp ((S1), (S2), (N))
#endif
/* End of configuration part. */
#include <ctype.h>
#include <errno.h>
#include <float.h>
+#include <ieee754.h>
#include "../locale/localeinfo.h"
#include <math.h>
#include <stdlib.h>
@@ -433,7 +436,54 @@ INTERNAL (STRTOF) (nptr, endptr, group)
No character is used even if a sign was found. */
if ((c < L_('0') || c > L_('9'))
&& ((wint_t) c != decimal || cp[1] < L_('0') || cp[1] > L_('9')))
- RETURN (0.0, nptr);
+ {
+ int matched = 0;
+ /* Check for `INF' or `INFINITY'. */
+ if (TOLOWER (c) == L_('i') && ((STRNCASECMP (cp, L_("nf"), 2) == 0
+ && (matched = 2))
+ || (STRNCASECMP (cp, L_("nfinity"), 7)
+ == 0
+ && (matched = 7))))
+ {
+ /* Return +/- inifity. */
+ if (endptr != NULL)
+ *endptr = (STRING_TYPE *) (cp + matched);
+
+ return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL;
+ }
+
+ if (TOLOWER (c) == L_('n') && STRNCASECMP (cp, L_("an"), 2) == 0)
+ {
+ /* Return NaN. */
+ if (endptr != NULL)
+ {
+ cp += 2;
+
+ /* Match `(n-char-sequence-digit)'. */
+ if (*cp == L_('('))
+ {
+ const STRING_TYPE *startp = cp;
+ do
+ ++cp;
+ while ((*cp >= '0' && *cp <= '9')
+ || (TOLOWER (*cp) >= 'a' && TOLOWER (*cp) <= 'z')
+ || *cp == L_('_'));
+
+ if (*cp != L_(')'))
+ /* The closing brace is missing. Only match the NAN
+ part. */
+ cp = startp;
+ }
+
+ *endptr = (STRING_TYPE *) cp;
+ }
+
+ return NAN;
+ }
+
+ /* It is really a text we do not recognize. */
+ RETURN (0.0, nptr);
+ }
/* Record the start of the digits, in case we will check their grouping. */
start_of_digits = startp = cp;
diff --git a/stdlib/strtof.c b/stdlib/strtof.c
index 1d1c41f46a..8692a3ac8f 100644
--- a/stdlib/strtof.c
+++ b/stdlib/strtof.c
@@ -5,6 +5,6 @@
#define FLT FLT
#define STRTOF strtof
#define MPN2FLOAT __mpn_construct_float
-#define FLOAT_HUGE_VAL HUGE_VALf
+#define FLOAT_HUGE_VAL HUGE_VALF
#include "strtod.c"
diff --git a/stdlib/strtol.c b/stdlib/strtol.c
index 396e2ecd74..6ec096daf6 100644
--- a/stdlib/strtol.c
+++ b/stdlib/strtol.c
@@ -1,4 +1,4 @@
-/* strtol - Convert string representation of a number into an integer value.
+/* Convert string representation of a number into an integer value.
Copyright (C) 1991, 92, 94, 95, 96, 97 Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -54,7 +54,7 @@ extern int errno;
# include "../locale/localeinfo.h"
#endif
-/* Nonzero if we are defining `strtoul' or `strtouq', operating on
+/* Nonzero if we are defining `strtoul' or `strtoull', operating on
unsigned integers. */
#ifndef UNSIGNED
# define UNSIGNED 0
@@ -67,13 +67,13 @@ extern int errno;
#if UNSIGNED
# ifdef USE_WIDE_CHAR
# ifdef QUAD
-# define strtol wcstouq
+# define strtol wcstoull
# else
# define strtol wcstoul
# endif
# else
# ifdef QUAD
-# define strtol strtouq
+# define strtol strtoull
# else
# define strtol strtoul
# endif
@@ -81,18 +81,18 @@ extern int errno;
#else
# ifdef USE_WIDE_CHAR
# ifdef QUAD
-# define strtol wcstoq
+# define strtol wcstoll
# else
# define strtol wcstol
# endif
# else
# ifdef QUAD
-# define strtol strtoq
+# define strtol strtoll
# endif
# endif
#endif
-/* If QUAD is defined, we are defining `strtoq' or `strtouq',
+/* If QUAD is defined, we are defining `strtoll' or `strtoull',
operating on `long long int's. */
#ifdef QUAD
# define LONG long long
@@ -312,8 +312,6 @@ INTERNAL (strtol) (nptr, endptr, base, group)
? -((unsigned LONG int) (LONG_MIN + 1)) + 1
: (unsigned LONG int) LONG_MAX))
overflow = 1;
-#else
- overflow |= negative;
#endif
if (overflow)
diff --git a/stdlib/strtold.c b/stdlib/strtold.c
index ec2b49b279..9d80543377 100644
--- a/stdlib/strtold.c
+++ b/stdlib/strtold.c
@@ -5,6 +5,6 @@
#define FLT LDBL
#define STRTOF strtold
#define MPN2FLOAT __mpn_construct_long_double
-#define FLOAT_HUGE_VAL HUGE_VALl
+#define FLOAT_HUGE_VAL HUGE_VALL
#include "strtod.c"
diff --git a/stdlib/strtoq.c b/stdlib/strtoll.c
index 259611c3a2..e9487addc7 100644
--- a/stdlib/strtoq.c
+++ b/stdlib/strtoll.c
@@ -21,4 +21,4 @@
#include <strtol.c>
-weak_alias (strtoq, strtoll)
+weak_alias (strtoll, strtoq)
diff --git a/stdlib/strtouq.c b/stdlib/strtoull.c
index 68f293610a..419d28964f 100644
--- a/stdlib/strtouq.c
+++ b/stdlib/strtoull.c
@@ -21,4 +21,4 @@
#include <strtoul.c>
-weak_alias (strtouq, strtoull)
+weak_alias (strtoull, strtouq)
diff --git a/stdlib/tst-strtol.c b/stdlib/tst-strtol.c
index 1d398b4558..e351e97ceb 100644
--- a/stdlib/tst-strtol.c
+++ b/stdlib/tst-strtol.c
@@ -38,7 +38,7 @@ static const struct ltest tests[] =
{ "0xffffffffg", 0xffffffff, 0, 'g', 0 },
{ "0xf1f2f3f4f5", 0xffffffff, 0, 0, ERANGE },
{ "-0x123456789", 0xffffffff, 0, 0, ERANGE },
- { "-0xfedcba98", 0xffffffff, 0, 0, ERANGE },
+ { "-0xfedcba98", 0x01234568, 0, 0, 0 },
{ NULL, 0, 0, 0, 0 },
#else
/* assume 64 bit long... */
@@ -66,7 +66,7 @@ static const struct ltest tests[] =
{ "0xffffffffffffffffg", 0xffffffffffffffff, 0, 'g', 0 },
{ "0xf1f2f3f4f5f6f7f8f9", 0xffffffffffffffff, 0, 0, ERANGE },
{ "-0x123456789abcdef01", 0xffffffffffffffff, 0, 0, ERANGE },
- { "-0xfedcba987654321", 0xffffffffffffffff, 0, 0, ERANGE },
+ { "-0xfedcba987654321", 0x0123456789abcdf, 0, 0, 0 },
{ NULL, 0, 0, 0, 0 },
#endif
};
diff --git a/string/string.h b/string/string.h
index 865007ff99..462992dbf3 100644
--- a/string/string.h
+++ b/string/string.h
@@ -34,8 +34,8 @@ __BEGIN_DECLS
/* Copy N bytes of SRC to DEST. */
-extern __ptr_t memcpy __P ((__ptr_t __dest, __const __ptr_t __src,
- size_t __n));
+extern __ptr_t memcpy __P ((__ptr_t __restrict __dest,
+ __const __ptr_t __restrict __src, size_t __n));
/* Copy N bytes of SRC to DEST, guaranteeing
correct behavior for overlapping strings. */
extern __ptr_t memmove __P ((__ptr_t __dest, __const __ptr_t __src,
@@ -64,14 +64,18 @@ extern __ptr_t memchr __P ((__const __ptr_t __s, int __c, size_t __n));
/* Copy SRC to DEST. */
-extern char *strcpy __P ((char *__dest, __const char *__src));
+extern char *strcpy __P ((char *__restrict __dest,
+ __const char *__restrict __src));
/* Copy no more than N characters of SRC to DEST. */
-extern char *strncpy __P ((char *__dest, __const char *__src, size_t __n));
+extern char *strncpy __P ((char *__restrict __dest,
+ __const char *__restrict __src, size_t __n));
/* Append SRC onto DEST. */
-extern char *strcat __P ((char *__dest, __const char *__src));
+extern char *strcat __P ((char *__restrict __dest,
+ __const char *__restrict __src));
/* Append no more than N characters from SRC onto DEST. */
-extern char *strncat __P ((char *__dest, __const char *__src, size_t __n));
+extern char *strncat __P ((char *__restrict __dest,
+ __const char *__restrict __src, size_t __n));
/* Compare S1 and S2. */
extern int strcmp __P ((__const char *__s1, __const char *__s2));
@@ -81,7 +85,8 @@ extern int strncmp __P ((__const char *__s1, __const char *__s2, size_t __n));
/* Compare the collated forms of S1 and S2. */
extern int strcoll __P ((__const char *__s1, __const char *__s2));
/* Put a transformation of SRC into no more than N bytes of DEST. */
-extern size_t strxfrm __P ((char *__dest, __const char *__src, size_t __n));
+extern size_t strxfrm __P ((char *__restrict __dest,
+ __const char *__restrict __src, size_t __n));
#ifdef __USE_GNU
/* The following functions are equivalent to the both above but they
@@ -150,7 +155,8 @@ extern char *strpbrk __P ((__const char *__s, __const char *__accept));
/* Find the first occurrence of NEEDLE in HAYSTACK. */
extern char *strstr __P ((__const char *__haystack, __const char *__needle));
/* Divide S into tokens separated by characters in DELIM. */
-extern char *strtok __P ((char *__s, __const char *__delim));
+extern char *strtok __P ((char *__restrict __s,
+ __const char *__restrict __delim));
#if defined __USE_POSIX || defined __USE_MISC
/* Divide S into tokens separated by characters in DELIM. Information
diff --git a/sysdeps/ieee754/huge_val.h b/sysdeps/ieee754/huge_val.h
index 63a8aad9f5..4f8b0a9574 100644
--- a/sysdeps/ieee754/huge_val.h
+++ b/sysdeps/ieee754/huge_val.h
@@ -1,6 +1,6 @@
-/* `HUGE_VAL' constant for IEEE 754 machines (where it is infinity).
+/* `HUGE_VAL' constants for IEEE 754 machines (where it is infinity).
Used by <stdlib.h> and <math.h> functions for overflow.
- Copyright (C) 1992, 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1992, 1995, 1996, 1997 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
@@ -44,43 +44,49 @@ static __huge_val_t __huge_val = { __HUGE_VAL_bytes };
#endif /* GCC. */
-/* GNU extensions: (float) HUGE_VALf and (long double) HUGE_VALl. */
+/* ISO C 9X extensions: (float) HUGE_VALF and (long double) HUGE_VALL. */
-#ifdef __USE_GNU
+#ifdef __USE_ISOC9X
#if __BYTE_ORDER == __BIG_ENDIAN
-#define __HUGE_VALf_bytes { 0x7f, 0x80, 0, 0 }
+#define __HUGE_VALF_bytes { 0x7f, 0x80, 0, 0 }
#endif
#if __BYTE_ORDER == __LITTLE_ENDIAN
-#define __HUGE_VALf_bytes { 0, 0, 0x80, 0x7f }
+#define __HUGE_VALF_bytes { 0, 0, 0x80, 0x7f }
#endif
#define __huge_valf_t union { unsigned char __c[4]; float __f; }
#ifdef __GNUC__
-#define HUGE_VALf (__extension__ \
- ((__huge_valf_t) { __c: __HUGE_VALf_bytes }).__f)
+#define HUGE_VALF (__extension__ \
+ ((__huge_valf_t) { __c: __HUGE_VALF_bytes }).__f)
#else /* Not GCC. */
-static __huge_valf_t __huge_valf = { __HUGE_VALf_bytes };
-#define HUGE_VALf (__huge_valf.__f)
+static __huge_valf_t __huge_valf = { __HUGE_VALF_bytes };
+#define HUGE_VALF (__huge_valf.__f)
#endif /* GCC. */
+
#if __BYTE_ORDER == __BIG_ENDIAN
-#define __HUGE_VALl_bytes { 0x7f, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+#define __HUGE_VALL_bytes { 0x7f, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
#endif
#if __BYTE_ORDER == __LITTLE_ENDIAN
-#define __HUGE_VALl_bytes { 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0x7f, 0, 0 }
+#define __HUGE_VALL_bytes { 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0x7f, 0, 0 }
#endif
#define __huge_vall_t union { unsigned char __c[12]; long double __ld; }
#ifdef __GNUC__
-#define HUGE_VALl (__extension__ \
- ((__huge_vall_t) { __c: __HUGE_VALl_bytes }).__ld)
+#define HUGE_VALL (__extension__ \
+ ((__huge_vall_t) { __c: __HUGE_VALL_bytes }).__ld)
#else /* Not GCC. */
-static __huge_vall_t __huge_vall = { __HUGE_VALl_bytes };
-#define HUGE_VALl (__huge_vall.__ld)
+static __huge_vall_t __huge_vall = { __HUGE_VALL_bytes };
+#define HUGE_VALL (__huge_vall.__ld)
#endif /* GCC. */
-#endif /* __USE_GNU. */
+
+/* Expression representing positive infinity. Here it is the same as
+ HUGE_VALF. */
+#define INFINITY HUGE_VALF
+
+#endif /* __USE_ISOC9X. */
#endif /* huge_val.h */
diff --git a/sysdeps/libm-ieee754/s_cbrtl.c b/sysdeps/libm-ieee754/s_cbrtl.c
index 9f45faa00c..21e7727728 100644
--- a/sysdeps/libm-ieee754/s_cbrtl.c
+++ b/sysdeps/libm-ieee754/s_cbrtl.c
@@ -90,7 +90,7 @@ G = 3.57142857142857150787e-01L; /* 5/14 */
{
u_int64_t xxl = ((u_int64_t) se) << 32 | x0;
xxl /= 3;
- xxl += B1_EXP << 16 | B1_MANT;
+ xxl += ((u_int64_t) B1_EXP) << 32 | B1_MANT;
SET_LDOUBLE_MSW(t,xxl&0xffffffffu);
xxl >>= 32;
SET_LDOUBLE_EXP(t,xxl);
diff --git a/sysdeps/posix/gai_strerror.c b/sysdeps/posix/gai_strerror.c
index b89a1f6889..f5b33cb8db 100644
--- a/sysdeps/posix/gai_strerror.c
+++ b/sysdeps/posix/gai_strerror.c
@@ -43,7 +43,7 @@ values[] =
char *
gai_strerror (int code)
{
- int i;
+ size_t i;
for (i = 0; i < sizeof (values) / sizeof (values[0]); ++i)
if (values[i].code == code)
return (char *) values[i].msg;
diff --git a/sysdeps/unix/syscalls.list b/sysdeps/unix/syscalls.list
index fba1245730..9a2325c35c 100644
--- a/sysdeps/unix/syscalls.list
+++ b/sysdeps/unix/syscalls.list
@@ -7,7 +7,7 @@ chmod - chmod 2 __chmod chmod
chown - chown 3 __chown chown
chroot - chroot 1 chroot
close - close 1 __libc_close __close close
-dup - dup 2 __dup dup
+dup - dup 1 __dup dup
dup2 - dup2 2 __dup2 dup2
fchdir - fchdir 1 fchdir
fcntl - fcntl 3 __libc_fcntl __fcntl fcntl
diff --git a/sysdeps/unix/sysv/linux/accept.S b/sysdeps/unix/sysv/linux/accept.S
index 5936a0185b..014684c708 100644
--- a/sysdeps/unix/sysv/linux/accept.S
+++ b/sysdeps/unix/sysv/linux/accept.S
@@ -1,2 +1,3 @@
#define socket accept
+#define NARGS 3
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/bind.S b/sysdeps/unix/sysv/linux/bind.S
index fc82b65a2f..61fb5ebff8 100644
--- a/sysdeps/unix/sysv/linux/bind.S
+++ b/sysdeps/unix/sysv/linux/bind.S
@@ -1,2 +1,3 @@
#define socket bind
+#define NARGS 3
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/connect.S b/sysdeps/unix/sysv/linux/connect.S
index 3433043d8c..93aad35d85 100644
--- a/sysdeps/unix/sysv/linux/connect.S
+++ b/sysdeps/unix/sysv/linux/connect.S
@@ -1,2 +1,3 @@
#define socket connect
+#define NARGS 3
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/getpeername.S b/sysdeps/unix/sysv/linux/getpeername.S
index 8429fcdf76..a6d8e86d4e 100644
--- a/sysdeps/unix/sysv/linux/getpeername.S
+++ b/sysdeps/unix/sysv/linux/getpeername.S
@@ -1,2 +1,3 @@
#define socket getpeername
+#define NARGS 3
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/getsockname.S b/sysdeps/unix/sysv/linux/getsockname.S
index 6782707f88..c138be9da5 100644
--- a/sysdeps/unix/sysv/linux/getsockname.S
+++ b/sysdeps/unix/sysv/linux/getsockname.S
@@ -1,2 +1,3 @@
#define socket getsockname
+#define NARGS 3
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/getsockopt.S b/sysdeps/unix/sysv/linux/getsockopt.S
index 6ce92a6330..6f982082ae 100644
--- a/sysdeps/unix/sysv/linux/getsockopt.S
+++ b/sysdeps/unix/sysv/linux/getsockopt.S
@@ -1,2 +1,3 @@
#define socket getsockopt
+#define NARGS 5
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/i386/socket.S b/sysdeps/unix/sysv/linux/i386/socket.S
index 78e8b03cce..441c143156 100644
--- a/sysdeps/unix/sysv/linux/i386/socket.S
+++ b/sysdeps/unix/sysv/linux/i386/socket.S
@@ -1,20 +1,20 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU 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., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU 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 <sysdep.h>
#include <sys/socketcall.h>
diff --git a/sysdeps/unix/sysv/linux/listen.S b/sysdeps/unix/sysv/linux/listen.S
index d2cbec60a0..4c7e435196 100644
--- a/sysdeps/unix/sysv/linux/listen.S
+++ b/sysdeps/unix/sysv/linux/listen.S
@@ -1,2 +1,3 @@
#define socket listen
+#define NARGS 2
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/recv.S b/sysdeps/unix/sysv/linux/recv.S
index f1081cc431..ae17ba3fd3 100644
--- a/sysdeps/unix/sysv/linux/recv.S
+++ b/sysdeps/unix/sysv/linux/recv.S
@@ -1,2 +1,3 @@
#define socket recv
+#define NARGS 4
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/recvfrom.S b/sysdeps/unix/sysv/linux/recvfrom.S
index febaa9ef55..ed03d3c44b 100644
--- a/sysdeps/unix/sysv/linux/recvfrom.S
+++ b/sysdeps/unix/sysv/linux/recvfrom.S
@@ -1,2 +1,3 @@
#define socket recvfrom
+#define NARGS 6
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/recvmsg.S b/sysdeps/unix/sysv/linux/recvmsg.S
index ffadd30195..bb897d2b63 100644
--- a/sysdeps/unix/sysv/linux/recvmsg.S
+++ b/sysdeps/unix/sysv/linux/recvmsg.S
@@ -1,2 +1,3 @@
#define socket recvmsg
+#define NARGS 3
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/send.S b/sysdeps/unix/sysv/linux/send.S
index 52293c6524..596135e690 100644
--- a/sysdeps/unix/sysv/linux/send.S
+++ b/sysdeps/unix/sysv/linux/send.S
@@ -1,2 +1,3 @@
#define socket send
+#define NARGS 4
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/sendmsg.S b/sysdeps/unix/sysv/linux/sendmsg.S
index 65f2c3eb98..f0aabb7023 100644
--- a/sysdeps/unix/sysv/linux/sendmsg.S
+++ b/sysdeps/unix/sysv/linux/sendmsg.S
@@ -1,2 +1,3 @@
#define socket sendmsg
+#define NARGS 3
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/sendto.S b/sysdeps/unix/sysv/linux/sendto.S
index aa637ce9c9..3464d46e52 100644
--- a/sysdeps/unix/sysv/linux/sendto.S
+++ b/sysdeps/unix/sysv/linux/sendto.S
@@ -1,2 +1,3 @@
#define socket sendto
+#define NARGS 6
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/setsockopt.S b/sysdeps/unix/sysv/linux/setsockopt.S
index 33d57179ca..01b2799ae8 100644
--- a/sysdeps/unix/sysv/linux/setsockopt.S
+++ b/sysdeps/unix/sysv/linux/setsockopt.S
@@ -1,2 +1,3 @@
#define socket setsockopt
+#define NARGS 5
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/shutdown.S b/sysdeps/unix/sysv/linux/shutdown.S
index 6cc95d50f9..e2462d0eca 100644
--- a/sysdeps/unix/sysv/linux/shutdown.S
+++ b/sysdeps/unix/sysv/linux/shutdown.S
@@ -1,2 +1,3 @@
#define socket shutdown
+#define NARGS 2
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/socketpair.S b/sysdeps/unix/sysv/linux/socketpair.S
index da71c57dea..c954ad1a4b 100644
--- a/sysdeps/unix/sysv/linux/socketpair.S
+++ b/sysdeps/unix/sysv/linux/socketpair.S
@@ -1,2 +1,3 @@
#define socket socketpair
+#define NARGS 4
#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/timebits.h b/sysdeps/unix/sysv/linux/timebits.h
index f2f73a48d4..de30a6f348 100644
--- a/sysdeps/unix/sysv/linux/timebits.h
+++ b/sysdeps/unix/sysv/linux/timebits.h
@@ -1,5 +1,5 @@
/* System-dependent timing definitions. Linux version.
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997 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
@@ -43,8 +43,10 @@ struct timeval
XSI-conformant systems. */
# define CLOCKS_PER_SEC 1000000
+# ifndef __STRICT_ANSI__
/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK
presents the real value for clock ticks per second for the system. */
-# define CLK_TCK 100
+# define CLK_TCK 100
+# endif
#endif /* timebits.h */
diff --git a/time/time.h b/time/time.h
index 8c1aeaace6..5cd8975d44 100644
--- a/time/time.h
+++ b/time/time.h
@@ -152,8 +152,9 @@ extern time_t __mktime_internal __P ((struct tm *__tp,
/* Format TP into S according to FORMAT.
Write no more than MAXSIZE characters and return the number
of characters written, or 0 if it would exceed MAXSIZE. */
-extern size_t strftime __P ((char *__s, size_t __maxsize,
- __const char *__format, __const struct tm *__tp));
+extern size_t strftime __P ((char *__restrict __s, size_t __maxsize,
+ __const char *__restrict __format,
+ __const struct tm *__restrict __tp));
#ifdef __USE_XOPEN
/* Parse S according to FORMAT and store binary time information in TP.
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
index 929798da42..76f0fd03b9 100644
--- a/wcsmbs/Makefile
+++ b/wcsmbs/Makefile
@@ -30,10 +30,11 @@ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
btowc wctob mbsinit \
mbrlen mbrtowc wcrtomb mbsrtowcs wcsrtombs \
mbsnrtowcs wcsnrtombs \
- wcstol wcstoul wcstoq wcstouq wcstod wcstold wcstof \
+ wcstol wcstoul wcstoll wcstoull wcstod wcstold wcstof \
wcscoll wcsxfrm \
wcwidth wcswidth \
- wcscoll_l wcsxfrm_l
+ wcscoll_l wcsxfrm_l \
+ wcscasecmp wcsncase
include ../Rules
@@ -42,8 +43,8 @@ CFLAGS-wcswidth.c = -I../wctype
CFLAGS-wcstol.c = -I../stdlib
CFLAGS-wcstoul.c = -I../stdlib
-CFLAGS-wcstoq.c = -I../stdlib
-CFLAGS-wcstouq.c = -I../stdlib
+CFLAGS-wcstoll.c = -I../stdlib
+CFLAGS-wcstoull.c = -I../stdlib
CFLAGS-wcstod.c = -I../stdlib
CFLAGS-wcstold.c = -I../stdlib
CFLAGS-wcstof.c = -I../stdlib
diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
index 597a03d735..5247a866d3 100644
--- a/wcsmbs/wchar.h
+++ b/wcsmbs/wchar.h
@@ -64,16 +64,18 @@ typedef struct
/* Copy SRC to DEST. */
-extern wchar_t *wcscpy __P ((wchar_t *__dest, __const wchar_t *__src));
+extern wchar_t *wcscpy __P ((wchar_t *__restrict __dest,
+ __const wchar_t *__restrict __src));
/* Copy no more than N wide-characters of SRC to DEST. */
-extern wchar_t *wcsncpy __P ((wchar_t *__dest, __const wchar_t *__src,
- size_t __n));
+extern wchar_t *wcsncpy __P ((wchar_t *__restrict __dest,
+ __const wchar_t *__restrict __src, size_t __n));
/* Append SRC onto DEST. */
-extern wchar_t *wcscat __P ((wchar_t *__dest, __const wchar_t *__src));
+extern wchar_t *wcscat __P ((wchar_t *__restrict __dest,
+ __const wchar_t *__restrict __src));
/* Append no more than N wide-characters of SRC onto DEST. */
-extern wchar_t *wcsncat __P ((wchar_t *__dest, __const wchar_t *__src,
- size_t __n));
+extern wchar_t *wcsncat __P ((wchar_t *__restrict __dest,
+ __const wchar_t *__restrict __src, size_t __n));
/* Compare S1 and S2. */
extern int wcscmp __P ((__const wchar_t *__s1, __const wchar_t *__s2));
@@ -81,13 +83,26 @@ extern int wcscmp __P ((__const wchar_t *__s1, __const wchar_t *__s2));
extern int wcsncmp __P ((__const wchar_t *__s1, __const wchar_t *__s2,
size_t __n));
+#ifdef __USE_GNU
+/* Compare S1 and S2, ignoring case. */
+extern int __wcscasecmp __P ((__const wchar_t *__s1, __const wchar_t *__s2));
+extern int wcscasecmp __P ((__const wchar_t *__s1, __const wchar_t *__s2));
+
+/* Compare no more than N chars of S1 and S2, ignoring case. */
+extern int __wcsncasecmp __P ((__const wchar_t *__s1, __const wchar_t *__s2,
+ size_t __n));
+extern int wcsncasecmp __P ((__const wchar_t *__s1, __const wchar_t *__s2,
+ size_t __n));
+#endif
+
/* Compare S1 and S2, both interpreted as appropriate to the
LC_COLLATE category of the current locale. */
extern int wcscoll __P ((__const wchar_t *__s1, __const wchar_t *__s2));
/* Transform S2 into array pointed to by S1 such that if wcscmp is
applied to two transformed strings the result is the as applying
`wcscoll' to the original strings. */
-extern size_t wcsxfrm __P ((wchar_t *__s1, __const wchar_t *__s2, size_t __n));
+extern size_t wcsxfrm __P ((wchar_t *__restrict __s1,
+ __const wchar_t *__restrict __s2, size_t __n));
#ifdef __USE_GNU
/* Similar to the two functions above but take the information from
@@ -97,12 +112,12 @@ extern size_t wcsxfrm __P ((wchar_t *__s1, __const wchar_t *__s2, size_t __n));
/* Compare S1 and S2, both interpreted as appropriate to the
LC_COLLATE category of the given locale. */
extern int __wcscoll_l __P ((__const wchar_t *__s1, __const wchar_t *__s2,
- __locale_t loc));
+ __locale_t __loc));
/* Transform S2 into array pointed to by S1 such that if wcscmp is
applied to two transformed strings the result is the as applying
`wcscoll' to the original strings. */
extern size_t __wcsxfrm_l __P ((wchar_t *__s1, __const wchar_t *__s2,
- size_t __n, __locale_t loc));
+ size_t __n, __locale_t __loc));
#endif
/* Duplicate S, returning an identical malloc'd string. */
@@ -127,8 +142,9 @@ extern wchar_t *wcspbrk __P ((__const wchar_t *__wcs,
extern wchar_t *wcsstr __P ((__const wchar_t *__haystack,
__const wchar_t *__needle));
/* Divide WCS into tokens separated by characters in DELIM. */
-extern wchar_t *wcstok __P ((wchar_t *__s, __const wchar_t *__delim,
- wchar_t **ptr));
+extern wchar_t *wcstok __P ((wchar_t *__restrict __s,
+ __const wchar_t *__restrict __delim,
+ wchar_t **__restrict __ptr));
/* Return the number of wide-characters in S. */
extern size_t wcslen __P ((__const wchar_t *__s));
@@ -138,12 +154,12 @@ extern size_t wcslen __P ((__const wchar_t *__s));
extern wchar_t *wmemchr __P ((__const wchar_t *__s, wchar_t __c, size_t __n));
/* Compare N bytes of S1 and S2. */
-extern int wmemcmp __P ((__const wchar_t *__s1, __const wchar_t *__s2,
- size_t __n));
+extern int wmemcmp __P ((__const wchar_t *__restrict __s1,
+ __const wchar_t *__restrict __s2, size_t __n));
/* Copy N bytes of SRC to DEST. */
-extern wchar_t *wmemcpy __P ((wchar_t *__s1, __const wchar_t *__s2,
- size_t __n));
+extern wchar_t *wmemcpy __P ((wchar_t *__restrict __s1,
+ __const wchar_t *__restrict __s2, size_t __n));
/* Copy N bytes of SRC to DEST, guaranteeing
correct behavior for overlapping strings. */
@@ -168,55 +184,73 @@ extern int mbsinit __P ((__const mbstate_t *__ps));
/* Write wide character representation of multibyte character pointed
to by S to PWC. */
-extern size_t __mbrtowc __P ((wchar_t *__pwc, __const char *__s, size_t __n,
- mbstate_t *__p));
-extern size_t mbrtowc __P ((wchar_t *__pwc, __const char *__s, size_t __n,
+extern size_t __mbrtowc __P ((wchar_t *__restrict __pwc,
+ __const char *__restrict __s, size_t __n,
+ mbstate_t *__restrict __p));
+extern size_t mbrtowc __P ((wchar_t *__restrict __pwc,
+ __const char *__restrict __s, size_t __n,
mbstate_t *__p));
/* Write multibyte representation of wide character WC to S. */
-extern size_t __wcrtomb __P ((char *__s, wchar_t __wc, mbstate_t *__ps));
-extern size_t wcrtomb __P ((char *__s, wchar_t __wc, mbstate_t *__ps));
+extern size_t __wcrtomb __P ((char *__restrict __s, wchar_t __wc,
+ mbstate_t *__restrict __ps));
+extern size_t wcrtomb __P ((char *__restrict __s, wchar_t __wc,
+ mbstate_t *__restrict __ps));
/* Return number of bytes in multibyte character pointed to by S. */
-extern size_t __mbrlen __P ((__const char *__s, size_t __n, mbstate_t *__ps));
-extern size_t mbrlen __P ((__const char *__s, size_t __n, mbstate_t *__ps));
+extern size_t __mbrlen __P ((__const char *__restrict __s, size_t __n,
+ mbstate_t *__restrict __ps));
+extern size_t mbrlen __P ((__const char *__restrict __s, size_t __n,
+ mbstate_t *__restrict __ps));
#if defined (__OPTIMIZE__) \
&& (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7))
/* Define inline function as optimization. */
-extern __inline size_t mbrlen (__const char *s, size_t n, mbstate_t *ps)
-{ return ps != NULL ? __mbrtowc (NULL, s, n, ps) : __mbrlen (s, n, NULL); }
+extern __inline size_t mbrlen (__const char *__restrict __s, size_t __n,
+ mbstate_t *__restrict __ps)
+{ return (__ps != NULL
+ ? __mbrtowc (NULL, __s, __n, __ps) : __mbrlen (__s, __n, NULL)); }
#endif
/* Write wide character representation of multibyte character string
SRC to DST. */
-extern size_t __mbsrtowcs __P ((wchar_t *__dst, __const char **__src,
- size_t __len, mbstate_t *__ps));
-extern size_t mbsrtowcs __P ((wchar_t *__dst, __const char **__src,
- size_t __len, mbstate_t *__ps));
+extern size_t __mbsrtowcs __P ((wchar_t *__restrict __dst,
+ __const char **__restrict __src,
+ size_t __len, mbstate_t *__restrict __ps));
+extern size_t mbsrtowcs __P ((wchar_t *__restrict __dst,
+ __const char **__restrict __src,
+ size_t __len, mbstate_t *__restrict __ps));
/* Write multibyte character representation of wide character string
SRC to DST. */
-extern size_t __wcsrtombs __P ((char *__dst, __const wchar_t **__src,
- size_t __len, mbstate_t *__ps));
-extern size_t wcsrtombs __P ((char *__dst, __const wchar_t **__src,
- size_t __len, mbstate_t *__ps));
+extern size_t __wcsrtombs __P ((char *__restrict __dst,
+ __const wchar_t **__restrict __src,
+ size_t __len, mbstate_t *__restrict __ps));
+extern size_t wcsrtombs __P ((char *__restrict __dst,
+ __const wchar_t **__restrict __src,
+ size_t __len, mbstate_t *__restrict __ps));
#ifdef __USE_GNU
/* Write wide character representation of at most NMC bytes of the
multibyte character string SRC to DST. */
-extern size_t __mbsnrtowcs __P ((wchar_t *__dst, __const char **__src,
- size_t __nmc, size_t __len, mbstate_t *__ps));
-extern size_t mbsnrtowcs __P ((wchar_t *__dst, __const char **__src,
- size_t __nmc, size_t __len, mbstate_t *__ps));
+extern size_t __mbsnrtowcs __P ((wchar_t *__restrict __dst,
+ __const char **__restrict __src, size_t __nmc,
+ size_t __len, mbstate_t *__restrict __ps));
+extern size_t mbsnrtowcs __P ((wchar_t *__restrict __dst,
+ __const char **__restrict __src, size_t __nmc,
+ size_t __len, mbstate_t *__restrict __ps));
/* Write multibyte character representation of at most NWC characters
from the wide character string SRC to DST. */
-extern size_t __wcsnrtombs __P ((char *__dst, __const wchar_t **__src,
- size_t __nwc, size_t __len, mbstate_t *__ps));
-extern size_t wcsnrtombs __P ((char *__dst, __const wchar_t **__src,
- size_t __nwc, size_t __len, mbstate_t *__ps));
+extern size_t __wcsnrtombs __P ((char *__restrict __dst,
+ __const wchar_t **__restrict __src,
+ size_t __nwc, size_t __len,
+ mbstate_t *__restrict __ps));
+extern size_t wcsnrtombs __P ((char *__restrict __dst,
+ __const wchar_t **__restrict __src,
+ size_t __nwc, size_t __len,
+ mbstate_t *__restrict __ps));
/* The following functions are extensions found in X/Open CAE. */
@@ -232,92 +266,124 @@ extern int wcswidth __P ((__const wchar_t *__s, size_t __n));
/* Convert initial portion of the wide string NPTR to `double'
representation. */
-extern double wcstod __P ((__const wchar_t *__nptr, wchar_t **__endptr));
+extern double wcstod __P ((__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr));
#ifdef __USE_GNU
/* Likewise for `float' and `long double' sizes of floating-point numbers. */
-extern float wcstof __P ((__const wchar_t *__nptr, wchar_t **__endptr));
-extern __long_double_t wcstold __P ((__const wchar_t *__nptr,
- wchar_t **__endptr));
+extern float wcstof __P ((__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr));
+extern __long_double_t wcstold __P ((__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr));
#endif /* GNU */
/* Convert initial portion of wide string NPTR to `long int'
representation. */
-extern long int wcstol __P ((__const wchar_t *__nptr, wchar_t **__endptr,
- int __base));
+extern long int wcstol __P ((__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr, int __base));
/* Convert initial portion of wide string NPTR to `unsigned long int'
representation. */
-extern unsigned long int wcstoul __P ((__const wchar_t *__nptr,
- wchar_t **__endptr, int __base));
+extern unsigned long int wcstoul __P ((__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __base));
-#if defined (__GNUC__) && defined (__USE_GNU)
+#if defined __GNUC__ && defined __USE_GNU
/* Convert initial portion of wide string NPTR to `long int'
representation. */
-extern long long int wcstoq __P ((__const wchar_t *__nptr, wchar_t **__endptr,
- int __base));
+extern long long int wcstoq __P ((__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr, int __base));
/* Convert initial portion of wide string NPTR to `unsigned long long int'
representation. */
-extern unsigned long long int wcstouq __P ((__const wchar_t *__nptr,
- wchar_t **__endptr, int __base));
+extern unsigned long long int wcstouq __P ((__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __base));
#endif /* GCC and use GNU. */
+#if defined __USE_ISOC9X || (defined __GNUC__ && defined __USE_GNU)
+/* Convert initial portion of wide string NPTR to `long int'
+ representation. */
+extern long long int wcstoll __P ((__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr, int __base));
+
+/* Convert initial portion of wide string NPTR to `unsigned long long int'
+ representation. */
+extern unsigned long long int wcstoull __P ((__const wchar_t *
+ __restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __base));
+#endif /* ISO C 9X or GCC and GNU. */
+
/* The internal entry points for `wcstoX' take an extra flag argument
saying whether or not to parse locale-dependent number grouping. */
-extern double __wcstod_internal __P ((__const wchar_t *__nptr,
- wchar_t **__endptr, int __group));
-extern float __wcstof_internal __P ((__const wchar_t *__nptr,
- wchar_t **__endptr, int __group));
-extern __long_double_t __wcstold_internal __P ((__const wchar_t *__nptr,
- wchar_t **__endptr,
+extern double __wcstod_internal __P ((__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __group));
+extern float __wcstof_internal __P ((__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __group));
+extern __long_double_t __wcstold_internal __P ((__const wchar_t *
+ __restrict __nptr,
+ wchar_t **__restrict __endptr,
int __group));
-extern long int __wcstol_internal __P ((__const wchar_t *__nptr,
- wchar_t **__endptr, int __base,
- int __group));
-extern unsigned long int __wcstoul_internal __P ((__const wchar_t *__nptr,
- wchar_t **__endptr,
+extern long int __wcstol_internal __P ((__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __base, int __group));
+extern unsigned long int __wcstoul_internal __P ((__const wchar_t *
+ __restrict __nptr,
+ wchar_t **
+ __restrict __endptr,
int __base, int __group));
#if defined __GNUC__ && defined __USE_GNU
-extern long long int __wcstoq_internal __P ((__const wchar_t *__nptr,
- wchar_t **__endptr, int __base,
- int __group));
-extern unsigned long long int __wcstouq_internal __P ((__const wchar_t *__nptr,
- wchar_t **__endptr,
- int __base,
- int __group));
+extern long long int __wcstoll_internal __P ((__const wchar_t *
+ __restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __base, int __group));
+extern unsigned long long int __wcstoull_internal __P ((__const wchar_t *
+ __restrict __nptr,
+ wchar_t **
+ __restrict __endptr,
+ int __base,
+ int __group));
#endif /* GCC and use GNU. */
#if defined (__OPTIMIZE__) && __GNUC__ >= 2
/* Define inline functions which call the internal entry points. */
-extern __inline double wcstod (__const wchar_t *__nptr, wchar_t **__endptr)
+extern __inline double wcstod (__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr)
{ return __wcstod_internal (__nptr, __endptr, 0); }
-extern __inline long int wcstol (__const wchar_t *__nptr,
- wchar_t **__endptr, int __base)
+extern __inline long int wcstol (__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr, int __base)
{ return __wcstol_internal (__nptr, __endptr, __base, 0); }
-extern __inline unsigned long int wcstoul (__const wchar_t *__nptr,
- wchar_t **__endptr, int __base)
+extern __inline unsigned long int wcstoul (__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __base)
{ return __wcstoul_internal (__nptr, __endptr, __base, 0); }
#ifdef __USE_GNU
-extern __inline float wcstof (__const wchar_t *__nptr, wchar_t **__endptr)
+extern __inline float wcstof (__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr)
{ return __wcstof_internal (__nptr, __endptr, 0); }
-extern __inline __long_double_t wcstold (__const wchar_t *__nptr,
- wchar_t **__endptr)
+extern __inline __long_double_t wcstold (__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr)
{ return __wcstold_internal (__nptr, __endptr, 0); }
-extern __inline long long int wcstoq (__const wchar_t *__nptr,
- wchar_t **__endptr, int __base)
-{ return __wcstoq_internal (__nptr, __endptr, __base, 0); }
-extern __inline unsigned long long int wcstouq (__const wchar_t *__nptr,
- wchar_t **__endptr, int __base)
-{ return __wcstouq_internal (__nptr, __endptr, __base, 0); }
+extern __inline long long int wcstoq (__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __base)
+{ return __wcstoll_internal (__nptr, __endptr, __base, 0); }
+extern __inline unsigned long long int wcstouq (__const wchar_t *
+ __restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __base)
+{ return __wcstoull_internal (__nptr, __endptr, __base, 0); }
#endif /* Use GNU. */
#endif /* Optimizing GCC >=2. */
diff --git a/wcsmbs/wcscasecmp.c b/wcsmbs/wcscasecmp.c
new file mode 100644
index 0000000000..74908229a0
--- /dev/null
+++ b/wcsmbs/wcscasecmp.c
@@ -0,0 +1,56 @@
+/* Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU 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. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <wctype.h>
+#include <wchar.h>
+
+#ifndef weak_alias
+# define __wcscasecmp wcscasecmp
+#endif
+
+/* Compare S1 and S2, ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less than,
+ equal to or greater than S2. */
+int
+__wcscasecmp (s1, s2)
+ const wchar_t *s1;
+ const wchar_t *s2;
+{
+ wint_t c1, c2;
+
+ if (s1 == s2)
+ return 0;
+
+ do
+ {
+ c1 = towlower (*s1++);
+ c2 = towlower (*s2++);
+ if (c1 == '\0')
+ break;
+ }
+ while (c1 == c2);
+
+ return c1 - c2;
+}
+#ifdef weak_alias
+weak_alias (__wcscasecmp, wcscasecmp)
+#endif
diff --git a/wcsmbs/wcsncase.c b/wcsmbs/wcsncase.c
new file mode 100644
index 0000000000..c5b10c57a4
--- /dev/null
+++ b/wcsmbs/wcsncase.c
@@ -0,0 +1,55 @@
+/* Compare at most N wide characters of two strings without taking care
+ for the case.
+ Copyright (C) 1992, 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU 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 <wchar.h>
+#include <wctype.h>
+
+#ifndef weak_alias
+# define __wcsncasecmp wcsncasecmp
+#endif
+
+/* Compare no more than N wide characters of S1 and S2,
+ ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less
+ than, equal to or greater than S2. */
+int
+__wcsncasecmp (s1, s2, n)
+ const wchar_t *s1;
+ const wchar_t *s2;
+ size_t n;
+{
+ wint_t c1, c2;
+
+ if (s1 == s2 || n == 0)
+ return 0;
+
+ do
+ {
+ c1 = (wint_t) towlower (*s1++);
+ c2 = (wint_t) towlower (*s2++);
+ if (c1 == L'\0' || c1 != c2)
+ return c1 - c2;
+ } while (--n > 0);
+
+ return c1 - c2;
+}
+#ifdef weak_alias
+weak_alias (__wcsncasecmp, wcsncasecmp)
+#endif
diff --git a/wcsmbs/wcstof.c b/wcsmbs/wcstof.c
index 01a8950ed4..7d91cf33d6 100644
--- a/wcsmbs/wcstof.c
+++ b/wcsmbs/wcstof.c
@@ -25,7 +25,7 @@
#define FLT LDBL
#define STRTOF wcstof
#define MPN2FLOAT __mpn_construct_float
-#define FLOAT_HUGE_VAL HUGE_VALf
+#define FLOAT_HUGE_VAL HUGE_VALF
#define USE_WIDE_CHAR 1
#include "../stdlib/strtod.c"
diff --git a/wcsmbs/wcstold.c b/wcsmbs/wcstold.c
index 1da8062b80..4cb68af1f8 100644
--- a/wcsmbs/wcstold.c
+++ b/wcsmbs/wcstold.c
@@ -25,7 +25,7 @@
#define FLT LDBL
#define STRTOF wcstold
#define MPN2FLOAT __mpn_construct_long_double
-#define FLOAT_HUGE_VAL HUGE_VALl
+#define FLOAT_HUGE_VAL HUGE_VALL
#define USE_WIDE_CHAR 1
#include "../stdlib/strtod.c"
diff --git a/wcsmbs/wcstoq.c b/wcsmbs/wcstoll.c
index a765ca6985..b3e9ac0093 100644
--- a/wcsmbs/wcstoq.c
+++ b/wcsmbs/wcstoll.c
@@ -21,3 +21,5 @@
#define QUAD 1
#include "wcstol.c"
+
+weak_alias (wcstoll, wcstoq)
diff --git a/wcsmbs/wcstouq.c b/wcsmbs/wcstoull.c
index 49a5daa4db..a33d3aed6b 100644
--- a/wcsmbs/wcstouq.c
+++ b/wcsmbs/wcstoull.c
@@ -21,3 +21,5 @@
#define QUAD 1
#include "wcstoul.c"
+
+weak_alias (wcstoull, wcstouq)