]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 11 Jun 2003 23:22:36 +0000 (23:22 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 11 Jun 2003 23:22:36 +0000 (23:22 +0000)
2003-06-11  Ulrich Drepper  <drepper@redhat.com>

* time/tzfile.c: Add a couple of __builtin_expect.

Remove warnings gcc 3.3 shows.
* argp/argp-help.c (hol_entry_short_iterate): Don't inline.
* elf/dl-load.c (fillin_rpath): Likewise.
(add_path): Likewise.
* elf/dl-version.c (find_needed): Always inline.
* elf/do-lookup.c (FCT): Don't inline.
* iconv/Makefile: Extend vpath to intl subdir.
(iconvconfig-modules): Add hash-string.
* iconv/gconv_charset.h (strip): Don't inline.
(upstr): Always inline.
Move __gconv_compare_alias prototype to...
* iconv/gconv_int.h: ...here.
* iconv/gconv_db.c: Don't include gconv_charset.h.
* iconv/gconv_conf.c (add_alias): Don't inline.
(insert_module): Likewise.
* iconv/gconv_simple.c (internal_ucs4_loop): Always inline.
(internal_ucs4_loop_unaligned): Likewise.
(internal_ucs4_loop_single): Likewise.
(ucs4_internal_loop): Likewise.
(ucs4_internal_loop_unaligned): Likewise.
(ucs4_internal_loop_single): Likewise.
(internal_ucs4le_loop): Always inline.
(internal_ucs4le_loop_unaligned): Likewise.
(internal_ucs4le_loop_single): Likewise.
(ucs4le_internal_loop): Likewise.
(ucs4le_internal_loop_unaligned): Likewise.
(ucs4le_internal_loop_single): Likewise.
* iconv/loop.c: Always inline the defined functions.
* iconvdata/cns11642.h: Likewise.
* iconvdata/cns11642l1.h: Likewise.
* iconvdata/euc-kr.c: Likewise.
* iconvdata/gb2312.h: Likewise.
* iconvdata/jis0201.h: Likewise.
* iconvdata/jis0208.h: Likewise.
* iconvdata/jis0212.h: Likewise.
* iconvdata/jisx0213.h: Likewise.
* iconvdata/ksc5601.h: Likewise.
* iconvdata/utf-7.c (base64): Don't inline.
* include/libc-symbols.h (symbol_set_first_element): Add cast
(symbol_set_end_p): Likewise.
* include/set-hooks (RUN_HOOK): Likewise.
* inet/Makefile (aux): Add ifreq.
* intl/Makefile (aux): Add some entries from routines.  Add
hash-string.
* intl/hash-string.c: New file.
* intl/hash-string.h: Remove hash_string definition.  Declare
__hash_string.
* iconv/gconv_cache.c (find_module_idx): Adjust hash_string caller.
* iconv/iconvconfig.c (new_name): Likewise.
* intl/dcigettext.c (_nl_find_msg): Likewise.
* intl/loadmsgcat.c (_nl_load_domain): Likewise.
* io/ftw.c (open_dir_stream): Always inline.
(process_entry): Don't inline.
* locale/findlocale.c: Include gconv_int.h.
* locale/setlocale.c (new_composite_name): Don't inline.
* locale/weight.h (findidx): Always inline.
* locale/weightwc.h (findidx): Likewise.
* locale/programs/linereader.c (lr_ignore_rest): Define here.
* locale/programs/linereader.h (lr_ignore_rest): Don't define here,
just declare it.
(lr_getc): Always inline.
(lr_ungetc): Likewise.
* nss/nss_files/files-parse.c (parse_list): Likewise.
* stdio-common/Makefile (aux): Add printf-parsemb and
printf-parsewc.
* stdio-common/_itoa.h (_itoa_word): Always inline.
(_fitoa_word, _fitoa): Don't define here, only declare.
* stdio-common/_itoa.c (_iftoa_word): Add here.
(_fitoa): Likewise.
* stdio-common/_itowa.h (_itowa_word): Always inline.
* stdio-common/printf-parse.h (read_int): Don't inline.
(find_spec): Don't define.
Declare __find_specmb and __find_specwc.
(parse_one_spec): Don't define.
Declare __parse_one_specmb and __parse_one_specwc.
* stdio-common/printf-parsemb.c: New file.
* stdio-common/printf-parsewc.c: New file.
* stdio-common/vfprintf.c: Update calls to find_spec and
parse_one_spec for new names.
* stdio-common/printf-prs.c: Likewise.  Define DONT_NEED_READ_INT.
* stdlib/Makefile (aux): Add grouping and groupingwc.
* stdlib/grouping.c: New file.
* stdlib/groupingwc.c: New file.
* stdlib/grouping.h (correctly_grouped_prefix): Don't define here.
Just prototype.
* stdlib/rpmatch.c (try): Don't inline.
* stdlib/strtod.c (round_and_return): Don't line.
(str_to_mpn): Likewise.
(__mpn_lshift_1): Always inline.  Optimize only for constant count.
Adjust for name change of correctly_grouped_prefix.
* sysdeps/generic/strtol.c: Adjust for name change of
correctly_grouped_prefix.
* string/strxfrm.c (utf8_encode): Don't inline.
* sysdeps/generic/dl-cache.c: Define _dl_cache_libcmp.
* sysdeps/generic/dl-cache.h: Just declare _dl_cache_libcmp.
* sysdeps/generic/ifreq.c: New file.
* sysdeps/unix/sysv/linux/ifreq.c: New file.
* sysdeps/generic/ifreq.h (__ifreq): Only declare here.
* sysdeps/unix/sysv/linux/ifreq.h: Likewise.
* sysdeps/generic/ldsodefs.h (_dl_name_match_p): Always inline.
* sysdeps/generic/unwind-dw2-fde.c (start_fde_sort): Don't inline.
(fde_split): Likewise.
(fde_merge): Likewise.
(end_fde_sort): Likewise.
(init_object): Likewise.
(binary_search_unencoded_fdes): Likewise.
(binary_search_single_encoding_fdes): Likewise.
(binary_search_mixed_encoding_fdes): Likewise.
* sysdeps/generic/wordexp.c (w_addchar): Don't inline.
* sysdeps/i386/dl-machine.c (elf_machine_runtime_setup): Always inline.
* sysdeps/posix/sprofil.c (profil_count): Don't inline.
* sysdeps/unix/sysv/linux/Makefile [subdir=io] (sysdep_routines):
Add xstatconv.
* sysdeps/unix/sysv/linux/xstatconv.h: New file.
* sysdeps/unix/sysv/linux/xstatconv.c: Don't inline the function.
Export them.  Prepend __ to name.
* sysdeps/unix/sysv/linux/Dist: Add xstatconv.h.
* sysdeps/unix/sysv/linux/fxstat.c: Adjust for name change of
conversion functions.
* sysdeps/unix/sysv/linux/fxstat64.c: Likewise.
* sysdeps/unix/sysv/linux/lxstat.c: Likewise.
* sysdeps/unix/sysv/linux/lxstat64.c: Likewise.
* sysdeps/unix/sysv/linux/xstat.c: Likewise.
* sysdeps/unix/sysv/linux/xstat64.c: Likewise.
* sysdeps/unix/sysv/linux/i386/fxstat.c: Likewise.
* sysdeps/unix/sysv/linux/i386/lxstat.c: Likewise.
* sysdeps/unix/sysv/linux/i386/xstat.c: Likewise.
* sysdeps/unix/sysv/linux/pathconf.c (__statfs_link_max,
__statfs_filesize_max, __statfs_symlinks): Define here.  __ prepended
to name.  Change callers.
* sysdeps/unix/sysv/linux/pathconf.h (__statfs_link_max,
__statfs_filesize_max, __statfs_symlinks): Don't define here, just
declare.
* sysdeps/unix/sysv/linux/fpathconf.c: Change all callers.
* time/tzfile.c (decode): Always inline.
* wcsmbs/wcsnrtombs.c: Change type of inbuf to unsigned char*.
Remove cast in tomb function call.
* wcsmbs/wcsrtombs.c Likewise.
* wcsmbs/wcstob.c: Introduce new temp variable to take pointer in
tomb function call.

53 files changed:
ChangeLog
linuxthreads/ChangeLog
linuxthreads/sysdeps/powerpc/pspinlock.c
nss/nss_files/files-parse.c
stdio-common/Makefile
stdio-common/_itoa.c
stdio-common/_itoa.h
stdio-common/_itowa.h
stdio-common/printf-parse.h
stdio-common/printf-parsemb.c [new file with mode: 0644]
stdio-common/printf-parsewc.c [new file with mode: 0644]
stdio-common/printf-prs.c
stdio-common/vfprintf.c
stdlib/Makefile
stdlib/grouping.c [new file with mode: 0644]
stdlib/grouping.h
stdlib/groupingwc.c [new file with mode: 0644]
stdlib/rpmatch.c
stdlib/strtod.c
string/strxfrm.c
sysdeps/generic/dl-cache.c
sysdeps/generic/dl-cache.h
sysdeps/generic/ifreq.c [new file with mode: 0644]
sysdeps/generic/ifreq.h
sysdeps/generic/ldsodefs.h
sysdeps/generic/strtol.c
sysdeps/generic/unwind-dw2-fde.c
sysdeps/generic/wordexp.c
sysdeps/i386/dl-machine.h
sysdeps/posix/sprofil.c
sysdeps/unix/sysv/linux/Dist
sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/alpha/xstatconv.c
sysdeps/unix/sysv/linux/fpathconf.c
sysdeps/unix/sysv/linux/fxstat.c
sysdeps/unix/sysv/linux/fxstat64.c
sysdeps/unix/sysv/linux/i386/fxstat.c
sysdeps/unix/sysv/linux/i386/lxstat.c
sysdeps/unix/sysv/linux/i386/xstat.c
sysdeps/unix/sysv/linux/ifreq.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/ifreq.h
sysdeps/unix/sysv/linux/lxstat.c
sysdeps/unix/sysv/linux/lxstat64.c
sysdeps/unix/sysv/linux/pathconf.c
sysdeps/unix/sysv/linux/pathconf.h
sysdeps/unix/sysv/linux/xstat.c
sysdeps/unix/sysv/linux/xstat64.c
sysdeps/unix/sysv/linux/xstatconv.c
sysdeps/unix/sysv/linux/xstatconv.h [new file with mode: 0644]
time/tzfile.c
wcsmbs/wcsnrtombs.c
wcsmbs/wcsrtombs.c
wcsmbs/wctob.c

index dac7a28d36cde71b3d444a1f14b643fc119f18b7..521ffeeab7416fbd189c2d0df91efa5694602024 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,148 @@
+2003-06-11  Ulrich Drepper  <drepper@redhat.com>
+
+       * time/tzfile.c: Add a couple of __builtin_expect.
+
+       Remove warnings gcc 3.3 shows.
+       * argp/argp-help.c (hol_entry_short_iterate): Don't inline.
+       * elf/dl-load.c (fillin_rpath): Likewise.
+       (add_path): Likewise.
+       * elf/dl-version.c (find_needed): Always inline.
+       * elf/do-lookup.c (FCT): Don't inline.
+       * iconv/Makefile: Extend vpath to intl subdir.
+       (iconvconfig-modules): Add hash-string.
+       * iconv/gconv_charset.h (strip): Don't inline.
+       (upstr): Always inline.
+       Move __gconv_compare_alias prototype to...
+       * iconv/gconv_int.h: ...here.
+       * iconv/gconv_db.c: Don't include gconv_charset.h.
+       * iconv/gconv_conf.c (add_alias): Don't inline.
+       (insert_module): Likewise.
+       * iconv/gconv_simple.c (internal_ucs4_loop): Always inline.
+       (internal_ucs4_loop_unaligned): Likewise.
+       (internal_ucs4_loop_single): Likewise.
+       (ucs4_internal_loop): Likewise.
+       (ucs4_internal_loop_unaligned): Likewise.
+       (ucs4_internal_loop_single): Likewise.
+       (internal_ucs4le_loop): Always inline.
+       (internal_ucs4le_loop_unaligned): Likewise.
+       (internal_ucs4le_loop_single): Likewise.
+       (ucs4le_internal_loop): Likewise.
+       (ucs4le_internal_loop_unaligned): Likewise.
+       (ucs4le_internal_loop_single): Likewise.
+       * iconv/loop.c: Always inline the defined functions.
+       * iconvdata/cns11642.h: Likewise.
+       * iconvdata/cns11642l1.h: Likewise.
+       * iconvdata/euc-kr.c: Likewise.
+       * iconvdata/gb2312.h: Likewise.
+       * iconvdata/jis0201.h: Likewise.
+       * iconvdata/jis0208.h: Likewise.
+       * iconvdata/jis0212.h: Likewise.
+       * iconvdata/jisx0213.h: Likewise.
+       * iconvdata/ksc5601.h: Likewise.
+       * iconvdata/utf-7.c (base64): Don't inline.
+       * include/libc-symbols.h (symbol_set_first_element): Add cast
+       (symbol_set_end_p): Likewise.
+       * include/set-hooks (RUN_HOOK): Likewise.
+       * inet/Makefile (aux): Add ifreq.
+       * intl/Makefile (aux): Add some entries from routines.  Add
+       hash-string.
+       * intl/hash-string.c: New file.
+       * intl/hash-string.h: Remove hash_string definition.  Declare
+       __hash_string.
+       * iconv/gconv_cache.c (find_module_idx): Adjust hash_string caller.
+       * iconv/iconvconfig.c (new_name): Likewise.
+       * intl/dcigettext.c (_nl_find_msg): Likewise.
+       * intl/loadmsgcat.c (_nl_load_domain): Likewise.
+       * io/ftw.c (open_dir_stream): Always inline.
+       (process_entry): Don't inline.
+       * locale/findlocale.c: Include gconv_int.h.
+       * locale/setlocale.c (new_composite_name): Don't inline.
+       * locale/weight.h (findidx): Always inline.
+       * locale/weightwc.h (findidx): Likewise.
+       * locale/programs/linereader.c (lr_ignore_rest): Define here.
+       * locale/programs/linereader.h (lr_ignore_rest): Don't define here,
+       just declare it.
+       (lr_getc): Always inline.
+       (lr_ungetc): Likewise.
+       * nss/nss_files/files-parse.c (parse_list): Likewise.
+       * stdio-common/Makefile (aux): Add printf-parsemb and
+       printf-parsewc.
+       * stdio-common/_itoa.h (_itoa_word): Always inline.
+       (_fitoa_word, _fitoa): Don't define here, only declare.
+       * stdio-common/_itoa.c (_iftoa_word): Add here.
+       (_fitoa): Likewise.
+       * stdio-common/_itowa.h (_itowa_word): Always inline.
+       * stdio-common/printf-parse.h (read_int): Don't inline.
+       (find_spec): Don't define.
+       Declare __find_specmb and __find_specwc.
+       (parse_one_spec): Don't define.
+       Declare __parse_one_specmb and __parse_one_specwc.
+       * stdio-common/printf-parsemb.c: New file.
+       * stdio-common/printf-parsewc.c: New file.
+       * stdio-common/vfprintf.c: Update calls to find_spec and
+       parse_one_spec for new names.
+       * stdio-common/printf-prs.c: Likewise.  Define DONT_NEED_READ_INT.
+       * stdlib/Makefile (aux): Add grouping and groupingwc.
+       * stdlib/grouping.c: New file.
+       * stdlib/groupingwc.c: New file.
+       * stdlib/grouping.h (correctly_grouped_prefix): Don't define here.
+       Just prototype.
+       * stdlib/rpmatch.c (try): Don't inline.
+       * stdlib/strtod.c (round_and_return): Don't line.
+       (str_to_mpn): Likewise.
+       (__mpn_lshift_1): Always inline.  Optimize only for constant count.
+       Adjust for name change of correctly_grouped_prefix.
+       * sysdeps/generic/strtol.c: Adjust for name change of
+       correctly_grouped_prefix.
+       * string/strxfrm.c (utf8_encode): Don't inline.
+       * sysdeps/generic/dl-cache.c: Define _dl_cache_libcmp.
+       * sysdeps/generic/dl-cache.h: Just declare _dl_cache_libcmp.
+       * sysdeps/generic/ifreq.c: New file.
+       * sysdeps/unix/sysv/linux/ifreq.c: New file.
+       * sysdeps/generic/ifreq.h (__ifreq): Only declare here.
+       * sysdeps/unix/sysv/linux/ifreq.h: Likewise.
+       * sysdeps/generic/ldsodefs.h (_dl_name_match_p): Always inline.
+       * sysdeps/generic/unwind-dw2-fde.c (start_fde_sort): Don't inline.
+       (fde_split): Likewise.
+       (fde_merge): Likewise.
+       (end_fde_sort): Likewise.
+       (init_object): Likewise.
+       (binary_search_unencoded_fdes): Likewise.
+       (binary_search_single_encoding_fdes): Likewise.
+       (binary_search_mixed_encoding_fdes): Likewise.
+       * sysdeps/generic/wordexp.c (w_addchar): Don't inline.
+       * sysdeps/i386/dl-machine.c (elf_machine_runtime_setup): Always inline.
+       * sysdeps/posix/sprofil.c (profil_count): Don't inline.
+       * sysdeps/unix/sysv/linux/Makefile [subdir=io] (sysdep_routines):
+       Add xstatconv.
+       * sysdeps/unix/sysv/linux/xstatconv.h: New file.
+       * sysdeps/unix/sysv/linux/xstatconv.c: Don't inline the function.
+       Export them.  Prepend __ to name.
+       * sysdeps/unix/sysv/linux/Dist: Add xstatconv.h.
+       * sysdeps/unix/sysv/linux/fxstat.c: Adjust for name change of
+       conversion functions.
+       * sysdeps/unix/sysv/linux/fxstat64.c: Likewise.
+       * sysdeps/unix/sysv/linux/lxstat.c: Likewise.
+       * sysdeps/unix/sysv/linux/lxstat64.c: Likewise.
+       * sysdeps/unix/sysv/linux/xstat.c: Likewise.
+       * sysdeps/unix/sysv/linux/xstat64.c: Likewise.
+       * sysdeps/unix/sysv/linux/i386/fxstat.c: Likewise.
+       * sysdeps/unix/sysv/linux/i386/lxstat.c: Likewise.
+       * sysdeps/unix/sysv/linux/i386/xstat.c: Likewise.
+       * sysdeps/unix/sysv/linux/pathconf.c (__statfs_link_max,
+       __statfs_filesize_max, __statfs_symlinks): Define here.  __ prepended
+       to name.  Change callers.
+       * sysdeps/unix/sysv/linux/pathconf.h (__statfs_link_max,
+       __statfs_filesize_max, __statfs_symlinks): Don't define here, just
+       declare.
+       * sysdeps/unix/sysv/linux/fpathconf.c: Change all callers.
+       * time/tzfile.c (decode): Always inline.
+       * wcsmbs/wcsnrtombs.c: Change type of inbuf to unsigned char*.
+       Remove cast in tomb function call.
+       * wcsmbs/wcsrtombs.c Likewise.
+       * wcsmbs/wcstob.c: Introduce new temp variable to take pointer in
+       tomb function call.
+
 2003-06-10  Ulrich Drepper  <drepper@redhat.com>
 
        * po/zh_CN.po: Update from translation team.
index be8bf8ca4515324610ba1ad6a6f88225996560f3..20f387b3e843333b977314e82305c02ce22b9bd2 100644 (file)
@@ -1,3 +1,8 @@
+2003-06-11  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/powerpc/pspinlock.c (__pthread_spin_init): Fix
+       initializer [PR libc/5052].
+
 2003-06-09  Andreas Schwab  <schwab@suse.de>
 
        * Makefile: Move inclusion of ../Rules down after extra-objs is
index 15db1413ef91a72a6ec74978dc9b72cb1f4b644c..15fd545c14482c5f6cc5a7314eb311e4da07257b 100644 (file)
@@ -1,5 +1,5 @@
 /* POSIX spinlock implementation.  PowerPC version.
-   Copyright (C) 2000 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2003 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
@@ -55,7 +55,7 @@ __pthread_spin_init (pthread_spinlock_t *lock, int pshared)
   /* We can ignore the `pshared' parameter.  Since we are busy-waiting
      all processes which can access the memory location `lock' points
      to can use the spinlock.  */
-  *lock = 1;
+  *lock = 0;
   return 0;
 }
 weak_alias (__pthread_spin_init, pthread_spin_init)
index 739ee541aa46ca9cf4b8c84e833b6b1bc04b0449..1800d364ce93d37cfa940928e43f53048fb1e1e2 100644 (file)
@@ -1,5 +1,5 @@
 /* Common code for file-based database parsers in nss_files module.
-   Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1996-2000, 2003 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
@@ -171,6 +171,7 @@ nss_files_parse_hidden_def (parse_line)
 }
 
 static inline char **
+__attribute ((always_inline))
 parse_list (char *line, struct parser_data *data, size_t datalen, int *errnop)
 {
   char *eol, **list, **p;
index 1c34605f65b495125eec283b521da9fc705df759..f5ef19085028e74ea3a9b462f70bf57417a0895f 100644 (file)
@@ -40,7 +40,7 @@ install-others = $(inst_includedir)/bits/stdio_lim.h
 
 include ../Makeconfig
 
-aux    := errlist siglist
+aux    := errlist siglist printf-parsemb printf-parsewc
 distribute := _itoa.h _itowa.h _i18n_number.h \
              printf-parse.h stdio_lim.h.in tst-unbputc.sh tst-printf.sh
 
index 7bc6c081154763668842183bb7fc8519bcea6ad5..e39d88df7f77cda3efd832fe5fc2d20c945e0bc1 100644 (file)
@@ -424,3 +424,23 @@ _itoa (value, buflim, base, upper_case)
 
   return buflim;
 }
+
+char *
+_fitoa_word (unsigned long value, char *buf, unsigned int base, int upper_case)
+{
+  char tmpbuf[sizeof (value) * 4];           /* Worst case length: base 2.  */
+  char *cp = _itoa_word (value, tmpbuf + sizeof (value) * 4, base, upper_case);
+  while (cp < tmpbuf + sizeof (value) * 4)
+    *buf++ = *cp++;
+  return buf;
+}
+
+char *
+_fitoa (unsigned long long value, char *buf, unsigned int base, int upper_case)
+{
+  char tmpbuf[sizeof (value) * 4];           /* Worst case length: base 2.  */
+  char *cp = _itoa (value, tmpbuf + sizeof (value) * 4, base, upper_case);
+  while (cp < tmpbuf + sizeof (value) * 4)
+    *buf++ = *cp++;
+  return buf;
+}
index 6249adca91c26bf08c057a25826310159b5f21f2..77f5b0c02694820e1f57a5e7bf98b40bfe5856d0 100644 (file)
@@ -1,5 +1,5 @@
 /* Internal function for converting integers to ASCII.
-   Copyright (C) 1994, 95, 96, 97, 98, 99, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1994,95,96,97,98,99,2002,2003 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
@@ -34,7 +34,7 @@ extern const char _itoa_upper_digits_internal[] attribute_hidden;
 extern const char _itoa_lower_digits[];
 extern const char _itoa_lower_digits_internal[] attribute_hidden;
 
-static inline char * __attribute__ ((unused))
+static inline char * __attribute__ ((unused, always_inline))
 _itoa_word (unsigned long value, char *buflim,
            unsigned int base, int upper_case)
 {
@@ -69,24 +69,11 @@ _itoa_word (unsigned long value, char *buflim,
 }
 #undef SPECIAL
 
-static inline char * __attribute__ ((unused))
-_fitoa_word (unsigned long value, char *buf, unsigned int base, int upper_case)
-{
-  char tmpbuf[sizeof (value) * 4];             /* Worst case length: base 2.  */
-  char *cp = _itoa_word (value, tmpbuf + sizeof (value) * 4, base, upper_case);
-  while (cp < tmpbuf + sizeof (value) * 4)
-    *buf++ = *cp++;
-  return buf;
-}
-
-static inline char * __attribute__ ((unused))
-_fitoa (unsigned long long value, char *buf, unsigned int base, int upper_case)
-{
-  char tmpbuf[sizeof (value) * 4];             /* Worst case length: base 2.  */
-  char *cp = _itoa (value, tmpbuf + sizeof (value) * 4, base, upper_case);
-  while (cp < tmpbuf + sizeof (value) * 4)
-    *buf++ = *cp++;
-  return buf;
-}
+/* Similar to the _itoa functions, but output starts at buf and pointer
+   after the last written character is returned.  */
+extern char *_fitoa_word (unsigned long value, char *buf, unsigned int base,
+                         int upper_case) attribute_hidden;
+extern char *_fitoa (unsigned long long value, char *buf, unsigned int base,
+                    int upper_case) attribute_hidden;
 
 #endif /* itoa.h */
index d3a5447304292f320daa82dd7a96078f682b2ce9..009458b4be09fc5e9b14fcb48364c5617dc34627 100644 (file)
@@ -1,5 +1,5 @@
 /* Internal function for converting integers to ASCII.
-   Copyright (C) 1994, 95, 96, 97, 98, 99, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1994,95,96,97,98,99,2002,2003 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
@@ -31,7 +31,7 @@ extern wchar_t *_itowa (unsigned long long int value, wchar_t *buflim,
                        unsigned int base, int upper_case);
 
 static inline wchar_t *
-__attribute__ ((unused))
+__attribute__ ((unused, always_inline))
 _itowa_word (unsigned long value, wchar_t *buflim,
             unsigned int base, int upper_case)
 {
index ed0dc8bbc88ec535daf6de329d4dde26915daac6..aa49c7a642272af38836d1358cd51cf307503594 100644 (file)
@@ -1,5 +1,5 @@
 /* Internal header for parsing printf format strings.
-   Copyright (C) 1995-1999, 2000, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1995-1999, 2000, 2002, 2003 Free Software Foundation, Inc.
    This file is part of th GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <ctype.h>
-#include <limits.h>
 #include <printf.h>
 #include <stdint.h>
 #include <stddef.h>
-#include <string.h>
-
-#define NDEBUG 1
-#include <assert.h>
 
 
 struct printf_spec
@@ -66,9 +60,10 @@ union printf_arg
   };
 
 
+#ifndef DONT_NEED_READ_INT
 /* Read a simple integer from a string and update the string pointer.
    It is assumed that the first character is a digit.  */
-static inline unsigned int
+static unsigned int
 read_int (const UCHAR_T * *pstr)
 {
   unsigned int retval = **pstr - L_('0');
@@ -81,35 +76,7 @@ read_int (const UCHAR_T * *pstr)
 
   return retval;
 }
-
-
-
-/* Find the next spec in FORMAT, or the end of the string.  Returns
-   a pointer into FORMAT, to a '%' or a '\0'.  */
-static inline const UCHAR_T *
-#ifdef COMPILE_WPRINTF
-find_spec (const UCHAR_T *format)
-#else
-find_spec (const UCHAR_T *format, mbstate_t *ps)
-#endif
-{
-#ifdef COMPILE_WPRINTF
-  return (const UCHAR_T *) __wcschrnul ((const CHAR_T *) format, L'%');
-#else
-  while (*format != L_('\0') && *format != L_('%'))
-    {
-      int len;
-
-      /* Remove any hints of a wrong encoding.  */
-      ps->__count = 0;
-      if (! isascii (*format) && (len = __mbrlen (format, MB_CUR_MAX, ps)) > 0)
-       format += len;
-      else
-       ++format;
-    }
-  return format;
 #endif
-}
 
 
 /* These are defined in reg-printf.c.  */
@@ -117,334 +84,25 @@ extern printf_arginfo_function **__printf_arginfo_table attribute_hidden;
 extern printf_function **__printf_function_table attribute_hidden;
 
 
+/* Find the next spec in FORMAT, or the end of the string.  Returns
+   a pointer into FORMAT, to a '%' or a '\0'.  */
+extern const unsigned char *__find_specmb (const UCHAR_T *format,
+                                          mbstate_t *ps) attribute_hidden;
+
+extern const unsigned int *__find_specwc (const UCHAR_T *format)
+     attribute_hidden;
+
+
 /* FORMAT must point to a '%' at the beginning of a spec.  Fills in *SPEC
    with the parsed details.  POSN is the number of arguments already
    consumed.  At most MAXTYPES - POSN types are filled in TYPES.  Return
    the number of args consumed by this spec; *MAX_REF_ARG is updated so it
    remains the highest argument index used.  */
-static inline size_t
-#ifdef COMPILE_WPRINTF
-parse_one_spec (const UCHAR_T *format, size_t posn, struct printf_spec *spec,
-               size_t *max_ref_arg)
-#else
-parse_one_spec (const UCHAR_T *format, size_t posn, struct printf_spec *spec,
-               size_t *max_ref_arg, mbstate_t *ps)
-#endif
-{
-  unsigned int n;
-  size_t nargs = 0;
-
-  /* Skip the '%'.  */
-  ++format;
-
-  /* Clear information structure.  */
-  spec->data_arg = -1;
-  spec->info.alt = 0;
-  spec->info.space = 0;
-  spec->info.left = 0;
-  spec->info.showsign = 0;
-  spec->info.group = 0;
-  spec->info.i18n = 0;
-  spec->info.pad = ' ';
-  spec->info.wide = sizeof (UCHAR_T) > 1;
-
-  /* Test for positional argument.  */
-  if (ISDIGIT (*format))
-    {
-      const UCHAR_T *begin = format;
-
-      n = read_int (&format);
-
-      if (n > 0 && *format == L_('$'))
-       /* Is positional parameter.  */
-       {
-         ++format;             /* Skip the '$'.  */
-         spec->data_arg = n - 1;
-         *max_ref_arg = MAX (*max_ref_arg, n);
-       }
-      else
-       /* Oops; that was actually the width and/or 0 padding flag.
-          Step back and read it again.  */
-       format = begin;
-    }
-
-  /* Check for spec modifiers.  */
-  do
-    {
-      switch (*format)
-       {
-       case L_(' '):
-         /* Output a space in place of a sign, when there is no sign.  */
-         spec->info.space = 1;
-         continue;
-       case L_('+'):
-         /* Always output + or - for numbers.  */
-         spec->info.showsign = 1;
-         continue;
-       case L_('-'):
-         /* Left-justify things.  */
-         spec->info.left = 1;
-         continue;
-       case L_('#'):
-         /* Use the "alternate form":
-            Hex has 0x or 0X, FP always has a decimal point.  */
-         spec->info.alt = 1;
-         continue;
-       case L_('0'):
-         /* Pad with 0s.  */
-         spec->info.pad = '0';
-         continue;
-       case L_('\''):
-         /* Show grouping in numbers if the locale information
-            indicates any.  */
-         spec->info.group = 1;
-         continue;
-       case L_('I'):
-         /* Use the internationalized form of the output.  Currently
-            means to use the `outdigits' of the current locale.  */
-         spec->info.i18n = 1;
-         continue;
-       default:
-         break;
-       }
-      break;
-    }
-  while (*++format);
-
-  if (spec->info.left)
-    spec->info.pad = ' ';
-
-  /* Get the field width.  */
-  spec->width_arg = -1;
-  spec->info.width = 0;
-  if (*format == L_('*'))
-    {
-      /* The field width is given in an argument.
-        A negative field width indicates left justification.  */
-      const UCHAR_T *begin = ++format;
-
-      if (ISDIGIT (*format))
-       {
-         /* The width argument might be found in a positional parameter.  */
-         n = read_int (&format);
-
-         if (n > 0 && *format == L_('$'))
-           {
-             spec->width_arg = n - 1;
-             *max_ref_arg = MAX (*max_ref_arg, n);
-             ++format;         /* Skip '$'.  */
-           }
-       }
-
-      if (spec->width_arg < 0)
-       {
-         /* Not in a positional parameter.  Consume one argument.  */
-         spec->width_arg = posn++;
-         ++nargs;
-         format = begin;       /* Step back and reread.  */
-       }
-    }
-  else if (ISDIGIT (*format))
-    /* Constant width specification.  */
-    spec->info.width = read_int (&format);
-
-  /* Get the precision.  */
-  spec->prec_arg = -1;
-  /* -1 means none given; 0 means explicit 0.  */
-  spec->info.prec = -1;
-  if (*format == L_('.'))
-    {
-      ++format;
-      if (*format == L_('*'))
-       {
-         /* The precision is given in an argument.  */
-         const UCHAR_T *begin = ++format;
-
-         if (ISDIGIT (*format))
-           {
-             n = read_int (&format);
-
-             if (n > 0 && *format == L_('$'))
-               {
-                 spec->prec_arg = n - 1;
-                 *max_ref_arg = MAX (*max_ref_arg, n);
-                 ++format;
-               }
-           }
-
-         if (spec->prec_arg < 0)
-           {
-             /* Not in a positional parameter.  */
-             spec->prec_arg = posn++;
-             ++nargs;
-             format = begin;
-           }
-       }
-      else if (ISDIGIT (*format))
-       spec->info.prec = read_int (&format);
-      else
-       /* "%.?" is treated like "%.0?".  */
-       spec->info.prec = 0;
-    }
-
-  /* Check for type modifiers.  */
-  spec->info.is_long_double = 0;
-  spec->info.is_short = 0;
-  spec->info.is_long = 0;
-  spec->info.is_char = 0;
-
-  switch (*format++)
-    {
-    case L_('h'):
-      /* ints are short ints or chars.  */
-      if (*format != L_('h'))
-       spec->info.is_short = 1;
-      else
-       {
-         ++format;
-         spec->info.is_char = 1;
-       }
-      break;
-    case L_('l'):
-      /* ints are long ints.  */
-      spec->info.is_long = 1;
-      if (*format != L_('l'))
-       break;
-      ++format;
-      /* FALLTHROUGH */
-    case L_('L'):
-      /* doubles are long doubles, and ints are long long ints.  */
-    case L_('q'):
-      /* 4.4 uses this for long long.  */
-      spec->info.is_long_double = 1;
-      break;
-    case L_('z'):
-    case L_('Z'):
-      /* ints are size_ts.  */
-      assert (sizeof (size_t) <= sizeof (unsigned long long int));
-#if LONG_MAX != LONG_LONG_MAX
-      spec->info.is_long_double = sizeof (size_t) > sizeof (unsigned long int);
-#endif
-      spec->info.is_long = sizeof (size_t) > sizeof (unsigned int);
-      break;
-    case L_('t'):
-      assert (sizeof (ptrdiff_t) <= sizeof (long long int));
-#if LONG_MAX != LONG_LONG_MAX
-      spec->info.is_long_double = (sizeof (ptrdiff_t) > sizeof (long int));
-#endif
-      spec->info.is_long = sizeof (ptrdiff_t) > sizeof (int);
-      break;
-    case L_('j'):
-      assert (sizeof (uintmax_t) <= sizeof (unsigned long long int));
-#if LONG_MAX != LONG_LONG_MAX
-      spec->info.is_long_double = (sizeof (uintmax_t)
-                                  > sizeof (unsigned long int));
-#endif
-      spec->info.is_long = sizeof (uintmax_t) > sizeof (unsigned int);
-      break;
-    default:
-      /* Not a recognized modifier.  Backup.  */
-      --format;
-      break;
-    }
-
-  /* Get the format specification.  */
-  spec->info.spec = (wchar_t) *format++;
-  if (__builtin_expect (__printf_function_table != NULL, 0)
-      && spec->info.spec <= UCHAR_MAX
-      && __printf_arginfo_table[spec->info.spec] != NULL)
-    /* We don't try to get the types for all arguments if the format
-       uses more than one.  The normal case is covered though.  */
-    spec->ndata_args = (*__printf_arginfo_table[spec->info.spec])
-      (&spec->info, 1, &spec->data_arg_type);
-  else
-    {
-      /* Find the data argument types of a built-in spec.  */
-      spec->ndata_args = 1;
-
-      switch (spec->info.spec)
-       {
-       case L'i':
-       case L'd':
-       case L'u':
-       case L'o':
-       case L'X':
-       case L'x':
-#if LONG_MAX != LONG_LONG_MAX
-         if (spec->info.is_long_double)
-           spec->data_arg_type = PA_INT|PA_FLAG_LONG_LONG;
-         else
-#endif
-           if (spec->info.is_long)
-             spec->data_arg_type = PA_INT|PA_FLAG_LONG;
-           else if (spec->info.is_short)
-             spec->data_arg_type = PA_INT|PA_FLAG_SHORT;
-           else if (spec->info.is_char)
-             spec->data_arg_type = PA_CHAR;
-           else
-             spec->data_arg_type = PA_INT;
-         break;
-       case L'e':
-       case L'E':
-       case L'f':
-       case L'F':
-       case L'g':
-       case L'G':
-       case L'a':
-       case L'A':
-         if (spec->info.is_long_double)
-           spec->data_arg_type = PA_DOUBLE|PA_FLAG_LONG_DOUBLE;
-         else
-           spec->data_arg_type = PA_DOUBLE;
-         break;
-       case L'c':
-         spec->data_arg_type = PA_CHAR;
-         break;
-       case L'C':
-         spec->data_arg_type = PA_WCHAR;
-         break;
-       case L's':
-         spec->data_arg_type = PA_STRING;
-         break;
-       case L'S':
-         spec->data_arg_type = PA_WSTRING;
-         break;
-       case L'p':
-         spec->data_arg_type = PA_POINTER;
-         break;
-       case L'n':
-         spec->data_arg_type = PA_INT|PA_FLAG_PTR;
-         break;
-
-       case L'm':
-       default:
-         /* An unknown spec will consume no args.  */
-         spec->ndata_args = 0;
-         break;
-       }
-    }
-
-  if (spec->data_arg == -1 && spec->ndata_args > 0)
-    {
-      /* There are args consumed, but no positional spec.  Use the
-        next sequential arg position.  */
-      spec->data_arg = posn;
-      nargs += spec->ndata_args;
-    }
-
-  if (spec->info.spec == L'\0')
-    /* Format ended before this spec was complete.  */
-    spec->end_of_fmt = spec->next_fmt = format - 1;
-  else
-    {
-      /* Find the next format spec.  */
-      spec->end_of_fmt = format;
-#ifdef COMPILE_WPRINTF
-      spec->next_fmt = find_spec (format);
-#else
-      spec->next_fmt = find_spec (format, ps);
-#endif
-    }
-
-  return nargs;
-}
+extern size_t __parse_one_specmb (const unsigned char *format, size_t posn,
+                                 struct printf_spec *spec,
+                                 size_t *max_ref_arg, mbstate_t *ps)
+     attribute_hidden;
+
+extern size_t __parse_one_specwc (const unsigned int *format, size_t posn,
+                                 struct printf_spec *spec,
+                                 size_t *max_ref_arg) attribute_hidden;
diff --git a/stdio-common/printf-parsemb.c b/stdio-common/printf-parsemb.c
new file mode 100644 (file)
index 0000000..0d01d56
--- /dev/null
@@ -0,0 +1,407 @@
+/* Internal header for parsing printf format strings.
+   Copyright (C) 1995-1999, 2000, 2002, 2003 Free Software Foundation, Inc.
+   This file is part of th GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <ctype.h>
+#include <limits.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#ifndef COMPILE_WPRINTF
+# define CHAR_T                char
+# define UCHAR_T       unsigned char
+# define INT_T         int
+# define L_(Str)       Str
+# define ISDIGIT(Ch)   isdigit (Ch)
+#else
+# define CHAR_T                wchar_t
+# define UCHAR_T       unsigned int
+# define INT_T         wint_t
+# define L_(Str)       L##Str
+# define ISDIGIT(Ch)   iswdigit (Ch)
+#endif
+
+#include "printf-parse.h"
+
+#define NDEBUG 1
+#include <assert.h>
+
+
+
+/* Find the next spec in FORMAT, or the end of the string.  Returns
+   a pointer into FORMAT, to a '%' or a '\0'.  */
+const UCHAR_T *
+#ifdef COMPILE_WPRINTF
+__find_specwc (const UCHAR_T *format)
+#else
+__find_specmb (const UCHAR_T *format, mbstate_t *ps)
+#endif
+{
+#ifdef COMPILE_WPRINTF
+  return (const UCHAR_T *) __wcschrnul ((const CHAR_T *) format, L'%');
+#else
+  while (*format != L_('\0') && *format != L_('%'))
+    {
+      int len;
+
+      /* Remove any hints of a wrong encoding.  */
+      ps->__count = 0;
+      if (! isascii (*format) && (len = __mbrlen (format, MB_CUR_MAX, ps)) > 0)
+       format += len;
+      else
+       ++format;
+    }
+  return format;
+#endif
+}
+
+
+/* FORMAT must point to a '%' at the beginning of a spec.  Fills in *SPEC
+   with the parsed details.  POSN is the number of arguments already
+   consumed.  At most MAXTYPES - POSN types are filled in TYPES.  Return
+   the number of args consumed by this spec; *MAX_REF_ARG is updated so it
+   remains the highest argument index used.  */
+size_t
+attribute_hidden
+#ifdef COMPILE_WPRINTF
+__parse_one_specwc (const UCHAR_T *format, size_t posn,
+                   struct printf_spec *spec, size_t *max_ref_arg)
+#else
+__parse_one_specmb (const UCHAR_T *format, size_t posn,
+                   struct printf_spec *spec, size_t *max_ref_arg,
+                   mbstate_t *ps)
+#endif
+{
+  unsigned int n;
+  size_t nargs = 0;
+
+  /* Skip the '%'.  */
+  ++format;
+
+  /* Clear information structure.  */
+  spec->data_arg = -1;
+  spec->info.alt = 0;
+  spec->info.space = 0;
+  spec->info.left = 0;
+  spec->info.showsign = 0;
+  spec->info.group = 0;
+  spec->info.i18n = 0;
+  spec->info.pad = ' ';
+  spec->info.wide = sizeof (UCHAR_T) > 1;
+
+  /* Test for positional argument.  */
+  if (ISDIGIT (*format))
+    {
+      const UCHAR_T *begin = format;
+
+      n = read_int (&format);
+
+      if (n > 0 && *format == L_('$'))
+       /* Is positional parameter.  */
+       {
+         ++format;             /* Skip the '$'.  */
+         spec->data_arg = n - 1;
+         *max_ref_arg = MAX (*max_ref_arg, n);
+       }
+      else
+       /* Oops; that was actually the width and/or 0 padding flag.
+          Step back and read it again.  */
+       format = begin;
+    }
+
+  /* Check for spec modifiers.  */
+  do
+    {
+      switch (*format)
+       {
+       case L_(' '):
+         /* Output a space in place of a sign, when there is no sign.  */
+         spec->info.space = 1;
+         continue;
+       case L_('+'):
+         /* Always output + or - for numbers.  */
+         spec->info.showsign = 1;
+         continue;
+       case L_('-'):
+         /* Left-justify things.  */
+         spec->info.left = 1;
+         continue;
+       case L_('#'):
+         /* Use the "alternate form":
+            Hex has 0x or 0X, FP always has a decimal point.  */
+         spec->info.alt = 1;
+         continue;
+       case L_('0'):
+         /* Pad with 0s.  */
+         spec->info.pad = '0';
+         continue;
+       case L_('\''):
+         /* Show grouping in numbers if the locale information
+            indicates any.  */
+         spec->info.group = 1;
+         continue;
+       case L_('I'):
+         /* Use the internationalized form of the output.  Currently
+            means to use the `outdigits' of the current locale.  */
+         spec->info.i18n = 1;
+         continue;
+       default:
+         break;
+       }
+      break;
+    }
+  while (*++format);
+
+  if (spec->info.left)
+    spec->info.pad = ' ';
+
+  /* Get the field width.  */
+  spec->width_arg = -1;
+  spec->info.width = 0;
+  if (*format == L_('*'))
+    {
+      /* The field width is given in an argument.
+        A negative field width indicates left justification.  */
+      const UCHAR_T *begin = ++format;
+
+      if (ISDIGIT (*format))
+       {
+         /* The width argument might be found in a positional parameter.  */
+         n = read_int (&format);
+
+         if (n > 0 && *format == L_('$'))
+           {
+             spec->width_arg = n - 1;
+             *max_ref_arg = MAX (*max_ref_arg, n);
+             ++format;         /* Skip '$'.  */
+           }
+       }
+
+      if (spec->width_arg < 0)
+       {
+         /* Not in a positional parameter.  Consume one argument.  */
+         spec->width_arg = posn++;
+         ++nargs;
+         format = begin;       /* Step back and reread.  */
+       }
+    }
+  else if (ISDIGIT (*format))
+    /* Constant width specification.  */
+    spec->info.width = read_int (&format);
+
+  /* Get the precision.  */
+  spec->prec_arg = -1;
+  /* -1 means none given; 0 means explicit 0.  */
+  spec->info.prec = -1;
+  if (*format == L_('.'))
+    {
+      ++format;
+      if (*format == L_('*'))
+       {
+         /* The precision is given in an argument.  */
+         const UCHAR_T *begin = ++format;
+
+         if (ISDIGIT (*format))
+           {
+             n = read_int (&format);
+
+             if (n > 0 && *format == L_('$'))
+               {
+                 spec->prec_arg = n - 1;
+                 *max_ref_arg = MAX (*max_ref_arg, n);
+                 ++format;
+               }
+           }
+
+         if (spec->prec_arg < 0)
+           {
+             /* Not in a positional parameter.  */
+             spec->prec_arg = posn++;
+             ++nargs;
+             format = begin;
+           }
+       }
+      else if (ISDIGIT (*format))
+       spec->info.prec = read_int (&format);
+      else
+       /* "%.?" is treated like "%.0?".  */
+       spec->info.prec = 0;
+    }
+
+  /* Check for type modifiers.  */
+  spec->info.is_long_double = 0;
+  spec->info.is_short = 0;
+  spec->info.is_long = 0;
+  spec->info.is_char = 0;
+
+  switch (*format++)
+    {
+    case L_('h'):
+      /* ints are short ints or chars.  */
+      if (*format != L_('h'))
+       spec->info.is_short = 1;
+      else
+       {
+         ++format;
+         spec->info.is_char = 1;
+       }
+      break;
+    case L_('l'):
+      /* ints are long ints.  */
+      spec->info.is_long = 1;
+      if (*format != L_('l'))
+       break;
+      ++format;
+      /* FALLTHROUGH */
+    case L_('L'):
+      /* doubles are long doubles, and ints are long long ints.  */
+    case L_('q'):
+      /* 4.4 uses this for long long.  */
+      spec->info.is_long_double = 1;
+      break;
+    case L_('z'):
+    case L_('Z'):
+      /* ints are size_ts.  */
+      assert (sizeof (size_t) <= sizeof (unsigned long long int));
+#if LONG_MAX != LONG_LONG_MAX
+      spec->info.is_long_double = sizeof (size_t) > sizeof (unsigned long int);
+#endif
+      spec->info.is_long = sizeof (size_t) > sizeof (unsigned int);
+      break;
+    case L_('t'):
+      assert (sizeof (ptrdiff_t) <= sizeof (long long int));
+#if LONG_MAX != LONG_LONG_MAX
+      spec->info.is_long_double = (sizeof (ptrdiff_t) > sizeof (long int));
+#endif
+      spec->info.is_long = sizeof (ptrdiff_t) > sizeof (int);
+      break;
+    case L_('j'):
+      assert (sizeof (uintmax_t) <= sizeof (unsigned long long int));
+#if LONG_MAX != LONG_LONG_MAX
+      spec->info.is_long_double = (sizeof (uintmax_t)
+                                  > sizeof (unsigned long int));
+#endif
+      spec->info.is_long = sizeof (uintmax_t) > sizeof (unsigned int);
+      break;
+    default:
+      /* Not a recognized modifier.  Backup.  */
+      --format;
+      break;
+    }
+
+  /* Get the format specification.  */
+  spec->info.spec = (wchar_t) *format++;
+  if (__builtin_expect (__printf_function_table != NULL, 0)
+      && spec->info.spec <= UCHAR_MAX
+      && __printf_arginfo_table[spec->info.spec] != NULL)
+    /* We don't try to get the types for all arguments if the format
+       uses more than one.  The normal case is covered though.  */
+    spec->ndata_args = (*__printf_arginfo_table[spec->info.spec])
+      (&spec->info, 1, &spec->data_arg_type);
+  else
+    {
+      /* Find the data argument types of a built-in spec.  */
+      spec->ndata_args = 1;
+
+      switch (spec->info.spec)
+       {
+       case L'i':
+       case L'd':
+       case L'u':
+       case L'o':
+       case L'X':
+       case L'x':
+#if LONG_MAX != LONG_LONG_MAX
+         if (spec->info.is_long_double)
+           spec->data_arg_type = PA_INT|PA_FLAG_LONG_LONG;
+         else
+#endif
+           if (spec->info.is_long)
+             spec->data_arg_type = PA_INT|PA_FLAG_LONG;
+           else if (spec->info.is_short)
+             spec->data_arg_type = PA_INT|PA_FLAG_SHORT;
+           else if (spec->info.is_char)
+             spec->data_arg_type = PA_CHAR;
+           else
+             spec->data_arg_type = PA_INT;
+         break;
+       case L'e':
+       case L'E':
+       case L'f':
+       case L'F':
+       case L'g':
+       case L'G':
+       case L'a':
+       case L'A':
+         if (spec->info.is_long_double)
+           spec->data_arg_type = PA_DOUBLE|PA_FLAG_LONG_DOUBLE;
+         else
+           spec->data_arg_type = PA_DOUBLE;
+         break;
+       case L'c':
+         spec->data_arg_type = PA_CHAR;
+         break;
+       case L'C':
+         spec->data_arg_type = PA_WCHAR;
+         break;
+       case L's':
+         spec->data_arg_type = PA_STRING;
+         break;
+       case L'S':
+         spec->data_arg_type = PA_WSTRING;
+         break;
+       case L'p':
+         spec->data_arg_type = PA_POINTER;
+         break;
+       case L'n':
+         spec->data_arg_type = PA_INT|PA_FLAG_PTR;
+         break;
+
+       case L'm':
+       default:
+         /* An unknown spec will consume no args.  */
+         spec->ndata_args = 0;
+         break;
+       }
+    }
+
+  if (spec->data_arg == -1 && spec->ndata_args > 0)
+    {
+      /* There are args consumed, but no positional spec.  Use the
+        next sequential arg position.  */
+      spec->data_arg = posn;
+      nargs += spec->ndata_args;
+    }
+
+  if (spec->info.spec == L'\0')
+    /* Format ended before this spec was complete.  */
+    spec->end_of_fmt = spec->next_fmt = format - 1;
+  else
+    {
+      /* Find the next format spec.  */
+      spec->end_of_fmt = format;
+#ifdef COMPILE_WPRINTF
+      spec->next_fmt = __find_specwc (format);
+#else
+      spec->next_fmt = __find_specmb (format, ps);
+#endif
+    }
+
+  return nargs;
+}
diff --git a/stdio-common/printf-parsewc.c b/stdio-common/printf-parsewc.c
new file mode 100644 (file)
index 0000000..3de67d8
--- /dev/null
@@ -0,0 +1,2 @@
+#define COMPILE_WPRINTF        1
+#include "printf-parsemb.c"
index ecbb47d41ca7810951de8f7ea42a8d9cb64717a2..7aef42d819e3d4fb738cf71c27229ff595652d89 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991,92,95,96,99,2000,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,95,96,99,2000,2002,2003 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
@@ -70,6 +70,7 @@ ssize_t __wprintf_pad __P ((FILE *, wchar_t pad, size_t n));
 # endif
 #endif
 
+#define DONT_NEED_READ_INT
 #include "printf-parse.h"
 
 
@@ -88,10 +89,10 @@ parse_printf_format (fmt, n, argtypes)
   max_ref_arg = 0;
 
   /* Search for format specifications.  */
-  for (fmt = find_spec (fmt, &mbstate); *fmt != '\0'; fmt = spec.next_fmt)
+  for (fmt = __find_specmb (fmt, &mbstate); *fmt != '\0'; fmt = spec.next_fmt)
     {
       /* Parse this spec.  */
-      nargs += parse_one_spec (fmt, nargs, &spec, &max_ref_arg, &mbstate);
+      nargs += __parse_one_specmb (fmt, nargs, &spec, &max_ref_arg, &mbstate);
 
       /* If the width is determined by an argument this is an int.  */
       if (spec.width_arg != -1 && (size_t) spec.width_arg < n)
index 63440f4b7697751b2bc8c16273dd6395f5d391af..16f280ed4f0e85388e7876a58475bd6ef5474285 100644 (file)
@@ -1294,13 +1294,13 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
 
 #ifdef COMPILE_WPRINTF
   /* Find the first format specifier.  */
-  f = lead_str_end = find_spec ((const UCHAR_T *) format);
+  f = lead_str_end = __find_specwc ((const UCHAR_T *) format);
 #else
   /* Put state for processing format string in initial state.  */
   memset (&mbstate, '\0', sizeof (mbstate_t));
 
   /* Find the first format specifier.  */
-  f = lead_str_end = find_spec (format, &mbstate);
+  f = lead_str_end = __find_specmb (format, &mbstate);
 #endif
 
   /* Lock stream.  */
@@ -1596,9 +1596,9 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
 
       /* Look for next format specifier.  */
 #ifdef COMPILE_WPRINTF
-      f = find_spec ((end_of_spec = ++f));
+      f = __find_specwc ((end_of_spec = ++f));
 #else
-      f = find_spec ((end_of_spec = ++f), &mbstate);
+      f = __find_specmb ((end_of_spec = ++f), &mbstate);
 #endif
 
       /* Write the following constant string.  */
@@ -1677,10 +1677,10 @@ do_positional:
 
        /* Parse the format specifier.  */
 #ifdef COMPILE_WPRINTF
-       nargs += parse_one_spec (f, nargs, &specs[nspecs], &max_ref_arg);
+       nargs += __parse_one_specwc (f, nargs, &specs[nspecs], &max_ref_arg);
 #else
-       nargs += parse_one_spec (f, nargs, &specs[nspecs], &max_ref_arg,
-                                &mbstate);
+       nargs += __parse_one_specmb (f, nargs, &specs[nspecs], &max_ref_arg,
+                                    &mbstate);
 #endif
       }
 
index 4d471c911b36475c7836c8fe0dd0bc4e406c6372..7a155031d3d9afc94cac01ccc4c11d205369c7e2 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 1991-1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+# Copyright (C) 1991-2002, 2003 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
@@ -49,6 +49,7 @@ routines      :=                                                            \
        rpmatch strfmon strfmon_l getsubopt xpg_basename fmtmsg               \
        strtoimax strtoumax wcstoimax wcstoumax                               \
        getcontext setcontext makecontext swapcontext
+aux =  grouping groupingwc
 
 # These routines will be omitted from the libc shared object.
 # Instead the static object files will be included in a special archive
@@ -73,7 +74,7 @@ mpn-headers = longlong.h gmp.h gmp-impl.h gmp-mparam.h asm-syntax.h
 routines := $(strip $(routines) $(mpn-routines))       \
            dbl2mpn ldbl2mpn                            \
            mpn2flt mpn2dbl mpn2ldbl
-aux := fpioconst mp_clz_tab
+aux += fpioconst mp_clz_tab
 distribute := $(distribute) $(mpn-headers) gen-mpn-copy fpioconst.h
 
 generated += isomac isomac.out
diff --git a/stdlib/grouping.c b/stdlib/grouping.c
new file mode 100644 (file)
index 0000000..4e01dc3
--- /dev/null
@@ -0,0 +1,202 @@
+/* Internal header for proving correct grouping in strings of numbers.
+   Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <limits.h>
+#include <stddef.h>
+#include <string.h>
+
+#ifndef MAX
+#define MAX(a,b)       ({ typeof(a) _a = (a); typeof(b) _b = (b); \
+                          _a > _b ? _a : _b; })
+#endif
+
+#ifdef USE_WIDE_CHAR
+# include <wctype.h>
+# define L_(Ch) L##Ch
+# define UCHAR_TYPE wint_t
+# define STRING_TYPE wchar_t
+#else
+# define L_(Ch) Ch
+# define UCHAR_TYPE unsigned char
+# define STRING_TYPE char
+#endif
+
+#include "grouping.h"
+
+/* Find the maximum prefix of the string between BEGIN and END which
+   satisfies the grouping rules.  It is assumed that at least one digit
+   follows BEGIN directly.  */
+
+const STRING_TYPE *
+#ifdef USE_WIDE_CHAR
+__correctly_grouped_prefixwc (const STRING_TYPE *begin, const STRING_TYPE *end,
+                             wchar_t thousands,
+#else
+__correctly_grouped_prefixmb (const STRING_TYPE *begin, const STRING_TYPE *end,
+                             const char *thousands,
+#endif
+                             const char *grouping)
+{
+#ifndef USE_WIDE_CHAR
+  size_t thousands_len;
+  int cnt;
+#endif
+
+  if (grouping == NULL)
+    return end;
+
+#ifndef USE_WIDE_CHAR
+  thousands_len = strlen (thousands);
+#endif
+
+  while (end > begin)
+    {
+      const STRING_TYPE *cp = end - 1;
+      const char *gp = grouping;
+
+      /* Check first group.  */
+      while (cp >= begin)
+       {
+#ifdef USE_WIDE_CHAR
+         if (*cp == thousands)
+           break;
+#else
+         if (cp[thousands_len - 1] == *thousands)
+           {
+             for (cnt = 1; thousands[cnt] != '\0'; ++cnt)
+               if (thousands[cnt] != cp[thousands_len - 1 - cnt])
+                 break;
+             if (thousands[cnt] == '\0')
+               break;
+           }
+#endif
+         --cp;
+       }
+
+      /* We allow the representation to contain no grouping at all even if
+        the locale specifies we can have grouping.  */
+      if (cp < begin)
+       return end;
+
+      if (end - cp == (int) *gp + 1)
+       {
+         /* This group matches the specification.  */
+
+         const STRING_TYPE *new_end;
+
+         if (cp < begin)
+           /* There is just one complete group.  We are done.  */
+           return end;
+
+         /* CP points to a thousands separator character.  The preceding
+            remainder of the string from BEGIN to NEW_END is the part we
+            will consider if there is a grouping error in this trailing
+            portion from CP to END.  */
+         new_end = cp - 1;
+
+         /* Loop while the grouping is correct.  */
+         while (1)
+           {
+             /* Get the next grouping rule.  */
+             ++gp;
+             if (*gp == 0)
+               /* If end is reached use last rule.  */
+               --gp;
+
+             /* Skip the thousands separator.  */
+             --cp;
+
+             if (*gp == CHAR_MAX
+#if CHAR_MIN < 0
+                 || *gp < 0
+#endif
+                 )
+               {
+                 /* No more thousands separators are allowed to follow.  */
+                 while (cp >= begin)
+                   {
+#ifdef USE_WIDE_CHAR
+                     if (*cp == thousands)
+                       break;
+#else
+                     for (cnt = 0; thousands[cnt] != '\0'; ++cnt)
+                       if (thousands[cnt] != cp[thousands_len - cnt - 1])
+                         break;
+                     if (thousands[cnt] == '\0')
+                       break;
+#endif
+                     --cp;
+                   }
+
+                 if (cp < begin)
+                   /* OK, only digits followed.  */
+                   return end;
+               }
+             else
+               {
+                 /* Check the next group.  */
+                 const STRING_TYPE *group_end = cp;
+
+                 while (cp >= begin)
+                   {
+#ifdef USE_WIDE_CHAR
+                     if (*cp == thousands)
+                       break;
+#else
+                     for (cnt = 0; thousands[cnt] != '\0'; ++cnt)
+                       if (thousands[cnt] != cp[thousands_len - cnt - 1])
+                         break;
+                     if (thousands[cnt] == '\0')
+                       break;
+#endif
+                     --cp;
+                   }
+
+                 if (cp < begin && group_end - cp <= (int) *gp)
+                   /* Final group is correct.  */
+                   return end;
+
+                 if (cp < begin || group_end - cp != (int) *gp)
+                   /* Incorrect group.  Punt.  */
+                   break;
+               }
+           }
+
+         /* The trailing portion of the string starting at NEW_END
+            contains a grouping error.  So we will look for a correctly
+            grouped number in the preceding portion instead.  */
+         end = new_end;
+       }
+      else
+       {
+         /* Even the first group was wrong; determine maximum shift.  */
+         if (end - cp > (int) *gp + 1)
+           end = cp + (int) *gp + 1;
+         else if (cp < begin)
+           /* This number does not fill the first group, but is correct.  */
+           return end;
+         else
+           /* CP points to a thousands separator character.  */
+           end = cp;
+       }
+    }
+
+  return MAX (begin, end);
+}
index 830304d2f17b73788c7437ed02804e09dfabed06..c0f8d47fba05087458aff5797c58566c97dc8bad 100644 (file)
@@ -1,5 +1,5 @@
 /* Internal header for proving correct grouping in strings of numbers.
-   Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
 
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <limits.h>
-
-#ifndef MAX
-#define MAX(a,b)       ({ typeof(a) _a = (a); typeof(b) _b = (b); \
-                          _a > _b ? _a : _b; })
-#endif
-
 /* Find the maximum prefix of the string between BEGIN and END which
    satisfies the grouping rules.  It is assumed that at least one digit
    follows BEGIN directly.  */
-
-static inline const STRING_TYPE *
-correctly_grouped_prefix (const STRING_TYPE *begin, const STRING_TYPE *end,
-#ifdef USE_WIDE_CHAR
-                         wchar_t thousands,
-#else
-                         const char *thousands,
-#endif
-                         const char *grouping)
-{
-#ifndef USE_WIDE_CHAR
-  size_t thousands_len;
-  int cnt;
-#endif
-
-  if (grouping == NULL)
-    return end;
-
-#ifndef USE_WIDE_CHAR
-  thousands_len = strlen (thousands);
-#endif
-
-  while (end > begin)
-    {
-      const STRING_TYPE *cp = end - 1;
-      const char *gp = grouping;
-
-      /* Check first group.  */
-      while (cp >= begin)
-       {
-#ifdef USE_WIDE_CHAR
-         if (*cp == thousands)
-           break;
-#else
-         if (cp[thousands_len - 1] == *thousands)
-           {
-             for (cnt = 1; thousands[cnt] != '\0'; ++cnt)
-               if (thousands[cnt] != cp[thousands_len - 1 - cnt])
-                 break;
-             if (thousands[cnt] == '\0')
-               break;
-           }
-#endif
-         --cp;
-       }
-
-      /* We allow the representation to contain no grouping at all even if
-        the locale specifies we can have grouping.  */
-      if (cp < begin)
-       return end;
-
-      if (end - cp == (int) *gp + 1)
-       {
-         /* This group matches the specification.  */
-
-         const STRING_TYPE *new_end;
-
-         if (cp < begin)
-           /* There is just one complete group.  We are done.  */
-           return end;
-
-         /* CP points to a thousands separator character.  The preceding
-            remainder of the string from BEGIN to NEW_END is the part we
-            will consider if there is a grouping error in this trailing
-            portion from CP to END.  */
-         new_end = cp - 1;
-
-         /* Loop while the grouping is correct.  */
-         while (1)
-           {
-             /* Get the next grouping rule.  */
-             ++gp;
-             if (*gp == 0)
-               /* If end is reached use last rule.  */
-               --gp;
-
-             /* Skip the thousands separator.  */
-             --cp;
-
-             if (*gp == CHAR_MAX
-#if CHAR_MIN < 0
-                 || *gp < 0
-#endif
-                 )
-               {
-                 /* No more thousands separators are allowed to follow.  */
-                 while (cp >= begin)
-                   {
-#ifdef USE_WIDE_CHAR
-                     if (*cp == thousands)
-                       break;
-#else
-                     for (cnt = 0; thousands[cnt] != '\0'; ++cnt)
-                       if (thousands[cnt] != cp[thousands_len - cnt - 1])
-                         break;
-                     if (thousands[cnt] == '\0')
-                       break;
-#endif
-                     --cp;
-                   }
-
-                 if (cp < begin)
-                   /* OK, only digits followed.  */
-                   return end;
-               }
-             else
-               {
-                 /* Check the next group.  */
-                 const STRING_TYPE *group_end = cp;
-
-                 while (cp >= begin)
-                   {
-#ifdef USE_WIDE_CHAR
-                     if (*cp == thousands)
-                       break;
-#else
-                     for (cnt = 0; thousands[cnt] != '\0'; ++cnt)
-                       if (thousands[cnt] != cp[thousands_len - cnt - 1])
-                         break;
-                     if (thousands[cnt] == '\0')
-                       break;
-#endif
-                     --cp;
-                   }
-
-                 if (cp < begin && group_end - cp <= (int) *gp)
-                   /* Final group is correct.  */
-                   return end;
-
-                 if (cp < begin || group_end - cp != (int) *gp)
-                   /* Incorrect group.  Punt.  */
-                   break;
-               }
-           }
-
-         /* The trailing portion of the string starting at NEW_END
-            contains a grouping error.  So we will look for a correctly
-            grouped number in the preceding portion instead.  */
-         end = new_end;
-       }
-      else
-       {
-         /* Even the first group was wrong; determine maximum shift.  */
-         if (end - cp > (int) *gp + 1)
-           end = cp + (int) *gp + 1;
-         else if (cp < begin)
-           /* This number does not fill the first group, but is correct.  */
-           return end;
-         else
-           /* CP points to a thousands separator character.  */
-           end = cp;
-       }
-    }
-
-  return MAX (begin, end);
-}
+extern const wchar_t *__correctly_grouped_prefixwc (const wchar_t *begin,
+                                                   const wchar_t *end,
+                                                   wchar_t thousands,
+                                                   const char *grouping)
+     attribute_hidden;
+
+extern const char *__correctly_grouped_prefixmb (const char *begin,
+                                                const char *end,
+                                                const char *thousands,
+                                                const char *grouping)
+     attribute_hidden;
diff --git a/stdlib/groupingwc.c b/stdlib/groupingwc.c
new file mode 100644 (file)
index 0000000..cd9675e
--- /dev/null
@@ -0,0 +1,2 @@
+#define USE_WIDE_CHAR  1
+#include "grouping.c"
index f3cc520f8b18aba13f34d475087a19a5abc44b48..7714c2f497e5d4b142f15802c7d115b347b83666 100644 (file)
@@ -1,7 +1,7 @@
 /* Determine whether string value is affirmation or negative response
    according to current locale's data.
    This file is part of the GNU C Library.
-   Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 2000, 2003 Free Software Foundation, Inc.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -29,11 +29,11 @@ rpmatch (response)
 {
   /* Match against one of the response patterns, compiling the pattern
      first if necessary.  */
-  auto inline int try (const int tag, const int match, const int nomatch,
-                      const char **lastp, regex_t *re);
+  auto int try (const int tag, const int match, const int nomatch,
+               const char **lastp, regex_t *re);
 
-  inline int try (const int tag, const int match, const int nomatch,
-                 const char **lastp, regex_t *re)
+  int try (const int tag, const int match, const int nomatch,
+          const char **lastp, regex_t *re)
     {
       const char *pattern = nl_langinfo (tag);
       if (pattern != *lastp)
index 8d773ecb3d23ca010463e3833a287ee8b83ba32c..63d7a4d5bbb785e4dd0a2762570cbc2a72ae0d55 100644 (file)
@@ -207,7 +207,7 @@ static const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1] =
 
 /* Return a floating point number of the needed type according to the given
    multi-precision number after possible rounding.  */
-static inline FLOAT
+static FLOAT
 round_and_return (mp_limb_t *retval, int exponent, int negative,
                  mp_limb_t round_limb, mp_size_t round_bit, int more_bits)
 {
@@ -302,7 +302,7 @@ round_and_return (mp_limb_t *retval, int exponent, int negative,
    character od the string that is not part of the integer as the function
    value.  If the EXPONENT is small enough to be taken as an additional
    factor for the resulting number (see code) multiply by it.  */
-static inline const STRING_TYPE *
+static const STRING_TYPE *
 str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize,
            int *exponent
 #ifndef USE_WIDE_CHAR
@@ -401,10 +401,11 @@ str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize,
    Tege doesn't like this function so I have to write it here myself. :)
    --drepper */
 static inline void
+__attribute ((always_inline))
 __mpn_lshift_1 (mp_limb_t *ptr, mp_size_t size, unsigned int count,
                mp_limb_t limb)
 {
-  if (count == BITS_PER_MP_LIMB)
+  if (__builtin_constant_p (count) && count == BITS_PER_MP_LIMB)
     {
       /* Optimize the case of shifting by exactly a word:
         just copy words, with no actual bit-shifting.  */
@@ -692,7 +693,13 @@ INTERNAL (STRTOF) (nptr, endptr, group LOCALE_PARAM)
                         || (CHAR_TYPE) TOLOWER (c) != L_('p')))
       && (base != 16 && (CHAR_TYPE) TOLOWER (c) != L_('e')))
     {
-      tp = correctly_grouped_prefix (start_of_digits, cp, thousands, grouping);
+#ifdef USE_WIDE_CHAR
+      tp = __correctly_grouped_prefixwc (start_of_digits, cp, thousands,
+                                        grouping);
+#else
+      tp = __correctly_grouped_prefixmb (start_of_digits, cp, thousands,
+                                        grouping);
+#endif
       /* If TP is at the start of the digits, there was no correctly
         grouped prefix of the string; so no number found.  */
       RETURN (0.0, tp == start_of_digits ? (base == 16 ? cp - 1 : nptr) : tp);
@@ -733,7 +740,13 @@ INTERNAL (STRTOF) (nptr, endptr, group LOCALE_PARAM)
   if (grouping && dig_no > 0)
     {
       /* Check the grouping of the digits.  */
-      tp = correctly_grouped_prefix (start_of_digits, cp, thousands, grouping);
+#ifdef USE_WIDE_CHAR
+      tp = __correctly_grouped_prefixwc (start_of_digits, cp, thousands,
+                                        grouping);
+#else
+      tp = __correctly_grouped_prefixmb (start_of_digits, cp, thousands,
+                                        grouping);
+#endif
       if (cp != tp)
         {
          /* Less than the entire string was correctly grouped.  */
index 9db57829d9522d956c363a14cdf72971925d5b00..549d68cc1c4735730e22f75fd27b31c2e4843e62 100644 (file)
@@ -51,7 +51,7 @@
 #ifndef WIDE_CHAR_VERSION
 
 /* We need UTF-8 encoding of numbers.  */
-static inline int
+static int
 utf8_encode (char *buf, int val)
 {
   int retval;
index bf2e98c5432350e2b394875ded69ed67e23cf60e..b17c18baf914e6ab55f443f59158cb967829a7a9 100644 (file)
@@ -1,5 +1,5 @@
 /* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
-   Copyright (C) 1996,1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc.
+   Copyright (C) 1996-2002, 2003 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
@@ -133,6 +133,45 @@ do                                                                       \
 while (0)
 
 
+int
+internal_function
+_dl_cache_libcmp (const char *p1, const char *p2)
+{
+  while (*p1 != '\0')
+    {
+      if (*p1 >= '0' && *p1 <= '9')
+        {
+          if (*p2 >= '0' && *p2 <= '9')
+            {
+             /* Must compare this numerically.  */
+             int val1;
+             int val2;
+
+             val1 = *p1++ - '0';
+             val2 = *p2++ - '0';
+             while (*p1 >= '0' && *p1 <= '9')
+               val1 = val1 * 10 + *p1++ - '0';
+             while (*p2 >= '0' && *p2 <= '9')
+               val2 = val2 * 10 + *p2++ - '0';
+             if (val1 != val2)
+               return val1 - val2;
+           }
+         else
+            return 1;
+        }
+      else if (*p2 >= '0' && *p2 <= '9')
+        return -1;
+      else if (*p1 != *p2)
+        return *p1 - *p2;
+      else
+       {
+         ++p1;
+         ++p2;
+       }
+    }
+  return *p1 - *p2;
+}
+
 
 /* Look up NAME in ld.so.cache and return the file name stored there,
    or null if none is found.  */
index 93bf0be6f454629013afa8f190c29c081db09cee..946e5a97136b0c96b1e8ffea65a9c0d482d02a21 100644 (file)
@@ -1,5 +1,5 @@
 /* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
-   Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000, 2002, 2003 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
@@ -97,41 +97,5 @@ struct cache_file_new
 (((addr) + __alignof__ (struct cache_file_new) -1)     \
  & (~(__alignof__ (struct cache_file_new) - 1)))
 
-static inline int
-__attribute__ ((__unused__))
-_dl_cache_libcmp (const char *p1, const char *p2)
-{
-  while (*p1 != '\0')
-    {
-      if (*p1 >= '0' && *p1 <= '9')
-        {
-          if (*p2 >= '0' && *p2 <= '9')
-            {
-             /* Must compare this numerically.  */
-             int val1;
-             int val2;
-
-             val1 = *p1++ - '0';
-             val2 = *p2++ - '0';
-             while (*p1 >= '0' && *p1 <= '9')
-               val1 = val1 * 10 + *p1++ - '0';
-             while (*p2 >= '0' && *p2 <= '9')
-               val2 = val2 * 10 + *p2++ - '0';
-             if (val1 != val2)
-               return val1 - val2;
-           }
-         else
-            return 1;
-        }
-      else if (*p2 >= '0' && *p2 <= '9')
-        return -1;
-      else if (*p1 != *p2)
-        return *p1 - *p2;
-      else
-       {
-         ++p1;
-         ++p2;
-       }
-    }
-  return *p1 - *p2;
-}
+extern int _dl_cache_libcmp (const char *p1, const char *p2)
+     internal_function;
diff --git a/sysdeps/generic/ifreq.c b/sysdeps/generic/ifreq.c
new file mode 100644 (file)
index 0000000..be7c03c
--- /dev/null
@@ -0,0 +1,80 @@
+/* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Andreas Jaeger <aj@suse.de>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include "ifreq.h"
+
+
+void
+__ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
+{
+  int fd = sockfd;
+  struct ifconf ifc;
+  int rq_len;
+  int nifs;
+# define RQ_IFS        4
+
+  if (fd < 0)
+    fd = __opensock ();
+  if (fd < 0)
+    {
+      *num_ifs = 0;
+      *ifreqs = NULL;
+      return;
+    }
+
+  ifc.ifc_buf = NULL;
+  rq_len = RQ_IFS * sizeof (struct ifreq) / 2; /* Doubled in the loop.  */
+  do
+    {
+      ifc.ifc_len = rq_len *= 2;
+      ifc.ifc_buf = realloc (ifc.ifc_buf, ifc.ifc_len);
+      if (ifc.ifc_buf == NULL || __ioctl (fd, SIOCGIFCONF, &ifc) < 0)
+       {
+         if (ifc.ifc_buf)
+           free (ifc.ifc_buf);
+
+         if (fd != sockfd)
+           __close (fd);
+         *num_ifs = 0;
+         *ifreqs = NULL;
+         return;
+       }
+    }
+  while (rq_len < sizeof (struct ifreq) + ifc.ifc_len);
+
+  if (fd != sockfd)
+    __close (fd);
+
+#ifdef _HAVE_SA_LEN
+  struct ifreq *ifr = ifreqs;
+  nifs = 0;
+  while ((char *) ifr < ifc.ifc_buf + ifc.ifc_len)
+    {
+      ++nifs;
+      ifr = __if_nextreq (ifr);
+      if (ifr == NULL)
+       break;
+    }
+#else
+  nifs = ifc.ifc_len / sizeof (struct ifreq);
+#endif
+
+  *num_ifs = nifs;
+  *ifreqs = realloc (ifc.ifc_buf, nifs * sizeof (struct ifreq));
+}
index 4871c8d1d8a5adcf7ac72964cb61b41cc043452b..6e01fb463e18f08ed5e43b3e2ee409b0b293b5aa 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Andreas Jaeger <aj@suse.de>.
 
@@ -34,64 +34,7 @@ __if_nextreq (struct ifreq *ifr)
   return ifr + 1;
 }
 
-static inline void
-__ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
-{
-  int fd = sockfd;
-  struct ifconf ifc;
-  int rq_len;
-  int nifs;
-# define RQ_IFS        4
-
-  if (fd < 0)
-    fd = __opensock ();
-  if (fd < 0)
-    {
-      *num_ifs = 0;
-      *ifreqs = NULL;
-      return;
-    }
-
-  ifc.ifc_buf = NULL;
-  rq_len = RQ_IFS * sizeof (struct ifreq) / 2; /* Doubled in the loop.  */
-  do
-    {
-      ifc.ifc_len = rq_len *= 2;
-      ifc.ifc_buf = realloc (ifc.ifc_buf, ifc.ifc_len);
-      if (ifc.ifc_buf == NULL || __ioctl (fd, SIOCGIFCONF, &ifc) < 0)
-       {
-         if (ifc.ifc_buf)
-           free (ifc.ifc_buf);
-
-         if (fd != sockfd)
-           __close (fd);
-         *num_ifs = 0;
-         *ifreqs = NULL;
-         return;
-       }
-    }
-  while (rq_len < sizeof (struct ifreq) + ifc.ifc_len);
-
-  if (fd != sockfd)
-    __close (fd);
-
-#ifdef _HAVE_SA_LEN
-  struct ifreq *ifr = ifreqs;
-  nifs = 0;
-  while ((char *) ifr < ifc.ifc_buf + ifc.ifc_len)
-    {
-      ++nifs;
-      ifr = __if_nextreq (ifr);
-      if (ifr == NULL)
-       break;
-    }
-#else
-  nifs = ifc.ifc_len / sizeof (struct ifreq);
-#endif
-
-  *num_ifs = nifs;
-  *ifreqs = realloc (ifc.ifc_buf, nifs * sizeof (struct ifreq));
-}
+extern void __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd);
 
 
 static inline void
index 4b75f4672e98c8ce24fe47ba78007d644dbd890f..2a3cf2bd093667e0b83cd20b45311b9f38af2b3b 100644 (file)
@@ -173,7 +173,7 @@ struct libname_list
 
 /* Test whether given NAME matches any of the names of the given object.  */
 static __inline int
-__attribute__ ((unused))
+__attribute__ ((unused, always_inline))
 _dl_name_match_p (const char *__name, struct link_map *__map)
 {
   int __found = strcmp (__name, __map->l_name) == 0;
index 1b267753d99436fc7a473be75666c214404cdd39..953c6c4a90c9b4ea636e4c2b33dd019e2d6dcaf7 100644 (file)
@@ -1,5 +1,5 @@
 /* Convert string representation of a number into an integer value.
-   Copyright (C) 1991,92,94,95,96,97,98,99,2000,01,02
+   Copyright (C) 1991,92,94,95,96,97,98,99,2000,2001,2002,2003
        Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -374,7 +374,11 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
                    || (int) (TOUPPER (c) - L_('A') + 10) >= base))
              break;
 
-         end = correctly_grouped_prefix (s, end, thousands, grouping);
+# ifdef USE_WIDE_CHAR
+         end = __correctly_grouped_prefixwc (s, end, thousands, grouping);
+# else
+         end = __correctly_grouped_prefixmb (s, end, thousands, grouping);
+# endif
        }
     }
   else
index 64c0846ccbb4d4f1f3d3d16ba8b307d7421fdb11..024ffd01c5b70e0a9ff411c0f9619855f3319e97 100644 (file)
@@ -1,5 +1,6 @@
 /* Subroutines needed for unwinding stack frames for exception handling.  */
-/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
+   Free Software Foundation, Inc.
    Contributed by Jason Merrill <jason@cygnus.com>.
 
 This file is part of GCC.
@@ -423,7 +424,7 @@ struct fde_accumulator
   struct fde_vector *erratic;
 };
 
-static inline int
+static int
 start_fde_sort (struct fde_accumulator *accu, size_t count)
 {
   size_t size;
@@ -461,7 +462,7 @@ fde_insert (struct fde_accumulator *accu, fde *this_fde)
    chain to determine what should be placed in the ERRATIC array, and
    what is the linear sequence.  This overlay is safe from aliasing.  */
 
-static inline void
+static void
 fde_split (struct object *ob, fde_compare_t fde_compare,
           struct fde_vector *linear, struct fde_vector *erratic)
 {
@@ -571,7 +572,7 @@ frame_heapsort (struct object *ob, fde_compare_t fde_compare,
 }
 
 /* Merge V1 and V2, both sorted, and put the result into V1.  */
-static inline void
+static void
 fde_merge (struct object *ob, fde_compare_t fde_compare,
           struct fde_vector *v1, struct fde_vector *v2)
 {
@@ -598,7 +599,7 @@ fde_merge (struct object *ob, fde_compare_t fde_compare,
     }
 }
 
-static inline void
+static void
 end_fde_sort (struct object *ob, struct fde_accumulator *accu, size_t count)
 {
   fde_compare_t fde_compare;
@@ -753,7 +754,7 @@ add_fdes (struct object *ob, struct fde_accumulator *accu, fde *this_fde)
    be faster.  We can be called multiple times, should we have failed to
    allocate a sorted fde array on a previous occasion.  */
 
-static inline void
+static void
 init_object (struct object* ob)
 {
   struct fde_accumulator accu;
@@ -876,7 +877,7 @@ linear_search_fdes (struct object *ob, fde *this_fde, void *pc)
 /* Binary search for an FDE containing the given PC.  Here are three
    implementations of increasing complexity.  */
 
-static inline fde *
+static fde *
 binary_search_unencoded_fdes (struct object *ob, void *pc)
 {
   struct fde_vector *vec = ob->u.sort;
@@ -903,7 +904,7 @@ binary_search_unencoded_fdes (struct object *ob, void *pc)
   return NULL;
 }
 
-static inline fde *
+static fde *
 binary_search_single_encoding_fdes (struct object *ob, void *pc)
 {
   struct fde_vector *vec = ob->u.sort;
@@ -933,7 +934,7 @@ binary_search_single_encoding_fdes (struct object *ob, void *pc)
   return NULL;
 }
 
-static inline fde *
+static fde *
 binary_search_mixed_encoding_fdes (struct object *ob, void *pc)
 {
   struct fde_vector *vec = ob->u.sort;
index 09f4e942d5032f25a5fa9d0516a89e89d00400dd..bb870c967d7d894cf853b5762f7b792a5345092c 100644 (file)
@@ -1,5 +1,5 @@
 /* POSIX.2 wordexp implementation.
-   Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc.
+   Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Tim Waugh <tim@cyberelk.demon.co.uk>.
 
@@ -89,19 +89,18 @@ w_newword (size_t *actlen, size_t *maxlen)
   return NULL;
 }
 
-static inline char *
+static char *
 w_addchar (char *buffer, size_t *actlen, size_t *maxlen, char ch)
      /* (lengths exclude trailing zero) */
 {
-  /* Add a character to the buffer, allocating room for it if needed.
-   */
+  /* Add a character to the buffer, allocating room for it if needed.  */
 
   if (*actlen == *maxlen)
     {
       char *old_buffer = buffer;
       assert (buffer == NULL || *maxlen != 0);
       *maxlen += W_CHUNK;
-      buffer = realloc (buffer, 1 + *maxlen);
+      buffer = (char *) realloc (buffer, 1 + *maxlen);
 
       if (buffer == NULL)
        free (old_buffer);
index 095098376da5b8fcf5baa8aed51ee4ffcd0670ab..b0c3c7f94c5e612bf1d85d618a9859ad12113745 100644 (file)
@@ -95,7 +95,7 @@ elf_machine_load_address (void)
 /* Set up the loaded object described by L so its unrelocated PLT
    entries will jump to the on-demand fixup code in dl-runtime.c.  */
 
-static inline int __attribute__ ((unused))
+static inline int __attribute__ ((unused, always_inline))
 elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
 {
   Elf32_Addr *got;
index afb6d2f84e7ea14e49f8c84734b998bd53e2cb12..84c797297adcd4d64d6132a756916532d09e7849 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001,02 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
    Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
    This file is part of the GNU C Library.
 
@@ -104,7 +104,7 @@ index_to_pc (unsigned long int n, size_t offset, unsigned int scale,
   return pc;
 }
 
-static inline void
+static void
 profil_count (void *pcp, int prof_uint)
 {
   struct region *region, *r = prof_info.last;
index f9f6a1a5f8c1c6b553b9785168e34824e4578758..1cd482c1ff1f03f2b4f32c3ab53c5d3f43bb7422 100644 (file)
@@ -78,6 +78,7 @@ sys/ultrasound.h
 sys/user.h
 sys/vt.h
 xstatconv.c
+xstatconv.h
 getdents64.c
 umount.S
 umount2.S
index 90671e404e2f9b5b4e29513e97bc0fa75fee545b..1085fe0d8130333509838027657ebb5c6b4567b0 100644 (file)
@@ -133,6 +133,10 @@ ifeq ($(subdir),nis)
 CFLAGS-ypclnt.c = -DUSE_BINDINGDIR=1
 endif
 
+ifeq ($(subdir),io)
+sysdep_routines += xstatconv
+endif
+
 ifeq ($(subdir),elf)
 sysdep-rtld-routines += dl-brk dl-sbrk
 
index 31fe7a52ec2cb5934afa65b8a586a01e2c018638..1084049dbe64f55e1d83105bb555c4aa153c9bf8 100644 (file)
@@ -1,5 +1,5 @@
 /* Convert between the kernel's `struct stat' format, and libc's.
-   Copyright (C) 1997 Free Software Foundation, Inc.
+   Copyright (C) 1997, 2003 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
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <errno.h>
 #include <string.h>
+#include <sys/stat.h>
 
+#include <xstatconv.h>
 
-static inline int
-xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
+
+int
+__xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
 {
   switch (vers)
     {
index 9eca7175cc885b89cdd09964f6c730aaa793c543..c1cdb1b8996e0bea0e30714b20bcbf58762d6335 100644 (file)
@@ -37,13 +37,13 @@ __fpathconf (fd, name)
   switch (name)
     {
     case _PC_LINK_MAX:
-      return statfs_link_max (__fstatfs (fd, &fsbuf), &fsbuf);
+      return __statfs_link_max (__fstatfs (fd, &fsbuf), &fsbuf);
 
     case _PC_FILESIZEBITS:
-      return statfs_filesize_max (__fstatfs (fd, &fsbuf), &fsbuf);
+      return __statfs_filesize_max (__fstatfs (fd, &fsbuf), &fsbuf);
 
     case _PC_2_SYMLINKS:
-      return statfs_symlinks (__fstatfs (fd, &fsbuf), &fsbuf);
+      return __statfs_symlinks (__fstatfs (fd, &fsbuf), &fsbuf);
 
     default:
       return posix_fpathconf (fd, name);
index b19450598dda040f868f3bc27a25735c199cb44a..6acafa261b277d3c5f6f416a6d35264fcbd5594a 100644 (file)
@@ -1,5 +1,5 @@
 /* fxstat using old-style Unix fstat system call.
-   Copyright (C) 1991,1995-1998,2000,2002 Free Software Foundation, Inc.
+   Copyright (C) 1991,1995-1998,2000,2002,2003 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
@@ -31,7 +31,7 @@
 #include <sys/syscall.h>
 #include <bp-checks.h>
 
-#include <xstatconv.c>
+#include <xstatconv.h>
 
 extern int __syscall_fstat (int, struct kernel_stat *__unbounded);
 
@@ -51,7 +51,7 @@ __fxstat (int vers, int fd, struct stat *buf)
 
   result = INLINE_SYSCALL (fstat, 2, fd, __ptrvalue (&kbuf));
   if (result == 0)
-    result = xstat_conv (vers, &kbuf, buf);
+    result = __xstat_conv (vers, &kbuf, buf);
 
   return result;
 #endif
index f5e16050b6aaf5cfb9355372e36ebff70e1d9154..27e8ac27118ee7c252891d13f42446fc05391fdb 100644 (file)
@@ -1,5 +1,5 @@
 /* fxstat64 using old-style Unix fstat system call.
-   Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc.
+   Copyright (C) 1997-2002, 2003 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
@@ -29,7 +29,7 @@
 #include "kernel-features.h"
 
 #if __ASSUME_STAT64_SYSCALL == 0
-# include <xstatconv.c>
+# include <xstatconv.h>
 #endif
 
 extern int __syscall_fstat (int, struct kernel_stat *__unbounded);
@@ -78,7 +78,7 @@ ___fxstat64 (int vers, int fd, struct stat64 *buf)
 # endif
   result = INLINE_SYSCALL (fstat, 2, fd, __ptrvalue (&kbuf));
   if (result == 0)
-    result = xstat64_conv (vers, &kbuf, buf);
+    result = __xstat64_conv (vers, &kbuf, buf);
 
   return result;
 #endif
index 86dbd711759e153f08ff6442b44e57445a4601a9..13a3bc77b7add48dc5b70572df20431ee5c7952f 100644 (file)
@@ -1,5 +1,5 @@
 /* fxstat using old-style Unix fstat system call.
-   Copyright (C) 1991,95,96,97,98,2000,2002 Free Software Foundation, Inc.
+   Copyright (C) 1991,1995-1998,2000,2002,2003 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
@@ -32,7 +32,7 @@
 
 #include "kernel-features.h"
 
-#include <xstatconv.c>
+#include <xstatconv.h>
 
 extern int __syscall_fstat (int, struct kernel_stat *__unbounded);
 
@@ -62,7 +62,7 @@ __fxstat (int vers, int fd, struct stat *buf)
 
     result = INLINE_SYSCALL (fstat64, 2, fd, __ptrvalue (&buf64));
     if (result == 0)
-      result = xstat32_conv (vers, &buf64, buf);
+      result = __xstat32_conv (vers, &buf64, buf);
     return result;
   }
 #else
@@ -77,7 +77,7 @@ __fxstat (int vers, int fd, struct stat *buf)
       result = INLINE_SYSCALL (fstat64, 2, fd, __ptrvalue (&buf64));
 
       if (result == 0)
-       result = xstat32_conv (vers, &buf64, buf);
+       result = __xstat32_conv (vers, &buf64, buf);
 
       if (result != -1 || errno != ENOSYS)
        return result;
@@ -88,7 +88,7 @@ __fxstat (int vers, int fd, struct stat *buf)
 
   result = INLINE_SYSCALL (fstat, 2, fd, __ptrvalue (&kbuf));
   if (result == 0)
-    result = xstat_conv (vers, &kbuf, buf);
+    result = __xstat_conv (vers, &kbuf, buf);
 
   return result;
 #endif  /* __ASSUME_STAT64_SYSCALL  */
index 0da6312fa4952d5ef5fcbce80035ddd03d3b3143..adf55dc5e8aa5111c475463d96a672fdf559a007 100644 (file)
@@ -1,5 +1,5 @@
 /* lxstat using old-style Unix lstat system call.
-   Copyright (C) 1991,95,96,97,98,2000,2002 Free Software Foundation, Inc.
+   Copyright (C) 1991,95,96,97,98,2000,2002,2003 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
@@ -32,7 +32,7 @@
 
 #include "kernel-features.h"
 
-#include <xstatconv.c>
+#include <xstatconv.h>
 
 extern int __syscall_lstat (const char *__unbounded,
                            struct kernel_stat *__unbounded);
@@ -65,7 +65,7 @@ __lxstat (int vers, const char *name, struct stat *buf)
 
     result = INLINE_SYSCALL (lstat64, 2, CHECK_STRING (name), __ptrvalue (&buf64));
     if (result == 0)
-      result = xstat32_conv (vers, &buf64, buf);
+      result = __xstat32_conv (vers, &buf64, buf);
     return result;
   }
 #else
@@ -79,7 +79,7 @@ __lxstat (int vers, const char *name, struct stat *buf)
       result = INLINE_SYSCALL (lstat64, 2, CHECK_STRING (name), __ptrvalue (&buf64));
 
       if (result == 0)
-       result = xstat32_conv (vers, &buf64, buf);
+       result = __xstat32_conv (vers, &buf64, buf);
 
       if (result != -1 || errno != ENOSYS)
        return result;
@@ -90,7 +90,7 @@ __lxstat (int vers, const char *name, struct stat *buf)
 
   result = INLINE_SYSCALL (lstat, 2, CHECK_STRING (name), __ptrvalue (&kbuf));
   if (result == 0)
-    result = xstat_conv (vers, &kbuf, buf);
+    result = __xstat_conv (vers, &kbuf, buf);
 
   return result;
 #endif
index cc383ec2fb9b56e459fa3c47e39ec5db252f1faf..5442fc42b65ad1541f0b24bba9aea11274fea9c4 100644 (file)
@@ -1,5 +1,5 @@
 /* xstat using old-style Unix stat system call.
-   Copyright (C) 1991,95,96,97,98,2000,2002 Free Software Foundation, Inc.
+   Copyright (C) 1991,95,96,97,98,2000,2002,2003 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
@@ -32,7 +32,7 @@
 
 #include "kernel-features.h"
 
-#include <xstatconv.c>
+#include <xstatconv.h>
 
 extern int __syscall_stat (const char *__unbounded,
                           struct kernel_stat *__unbounded);
@@ -65,7 +65,7 @@ __xstat (int vers, const char *name, struct stat *buf)
 
     result = INLINE_SYSCALL (stat64, 2, CHECK_STRING (name), __ptrvalue (&buf64));
     if (result == 0)
-      result = xstat32_conv (vers, &buf64, buf);
+      result = __xstat32_conv (vers, &buf64, buf);
     return result;
   }
 #else
@@ -79,7 +79,7 @@ __xstat (int vers, const char *name, struct stat *buf)
       result = INLINE_SYSCALL (stat64, 2, CHECK_STRING (name), __ptrvalue (&buf64));
 
       if (result == 0)
-       result = xstat32_conv (vers, &buf64, buf);
+       result = __xstat32_conv (vers, &buf64, buf);
 
       if (result != -1 || errno != ENOSYS)
        return result;
@@ -89,7 +89,7 @@ __xstat (int vers, const char *name, struct stat *buf)
 # endif
   result = INLINE_SYSCALL (stat, 2, CHECK_STRING (name), __ptrvalue (&kbuf));
   if (result == 0)
-    result = xstat_conv (vers, &kbuf, buf);
+    result = __xstat_conv (vers, &kbuf, buf);
 
   return result;
 #endif  /* __ASSUME_STAT64_SYSCALL  */
diff --git a/sysdeps/unix/sysv/linux/ifreq.c b/sysdeps/unix/sysv/linux/ifreq.c
new file mode 100644 (file)
index 0000000..ad408df
--- /dev/null
@@ -0,0 +1,93 @@
+/* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Andreas Jaeger <aj@suse.de>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include "ifreq.h"
+
+
+void
+__ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
+{
+  int fd = sockfd;
+  struct ifconf ifc;
+  int rq_len;
+  int nifs;
+# define RQ_IFS        4
+
+  if (fd < 0)
+    fd = __opensock ();
+  if (fd < 0)
+    {
+      *num_ifs = 0;
+      *ifreqs = NULL;
+      return;
+    }
+
+  ifc.ifc_buf = NULL;
+
+  /* We may be able to get the needed buffer size directly, rather than
+     guessing.  */
+  if (! old_siocgifconf)
+    {
+      ifc.ifc_buf = NULL;
+      ifc.ifc_len = 0;
+      if (__ioctl (fd, SIOCGIFCONF, &ifc) < 0 || ifc.ifc_len == 0)
+       {
+# if __ASSUME_SIOCGIFNAME == 0
+         old_siocgifconf = 1;
+# endif
+         rq_len = RQ_IFS * sizeof (struct ifreq);
+       }
+      else
+       rq_len = ifc.ifc_len;
+    }
+  else
+    rq_len = RQ_IFS * sizeof (struct ifreq);
+
+  /* Read all the interfaces out of the kernel.  */
+  while (1)
+    {
+      ifc.ifc_len = rq_len;
+      ifc.ifc_buf = realloc (ifc.ifc_buf, ifc.ifc_len);
+      if (ifc.ifc_buf == NULL || __ioctl (fd, SIOCGIFCONF, &ifc) < 0)
+       {
+         if (ifc.ifc_buf)
+           free (ifc.ifc_buf);
+
+         if (fd != sockfd)
+           __close (fd);
+
+         *num_ifs = 0;
+         *ifreqs = NULL;
+         return;
+       }
+
+      if (!old_siocgifconf || ifc.ifc_len < rq_len)
+       break;
+
+      rq_len *= 2;
+    }
+
+  nifs = ifc.ifc_len / sizeof (struct ifreq);
+
+  if (fd != sockfd)
+    __close (fd);
+
+  *num_ifs = nifs;
+  *ifreqs = realloc (ifc.ifc_buf, nifs * sizeof (struct ifreq));
+}
index f498e5c32a253e82702ff3bb63246b24e335b5b1..9e4f6622e9d61401e6cfddef754a0d067d5c75a0 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Andreas Jaeger <aj@suse.de>.
 
@@ -33,77 +33,7 @@ static int old_siocgifconf;
 #endif
 
 
-static inline void
-__ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
-{
-  int fd = sockfd;
-  struct ifconf ifc;
-  int rq_len;
-  int nifs;
-# define RQ_IFS        4
-
-  if (fd < 0)
-    fd = __opensock ();
-  if (fd < 0)
-    {
-      *num_ifs = 0;
-      *ifreqs = NULL;
-      return;
-    }
-
-  ifc.ifc_buf = NULL;
-
-  /* We may be able to get the needed buffer size directly, rather than
-     guessing.  */
-  if (! old_siocgifconf)
-    {
-      ifc.ifc_buf = NULL;
-      ifc.ifc_len = 0;
-      if (__ioctl (fd, SIOCGIFCONF, &ifc) < 0 || ifc.ifc_len == 0)
-       {
-# if __ASSUME_SIOCGIFNAME == 0
-         old_siocgifconf = 1;
-# endif
-         rq_len = RQ_IFS * sizeof (struct ifreq);
-       }
-      else
-       rq_len = ifc.ifc_len;
-    }
-  else
-    rq_len = RQ_IFS * sizeof (struct ifreq);
-
-  /* Read all the interfaces out of the kernel.  */
-  while (1)
-    {
-      ifc.ifc_len = rq_len;
-      ifc.ifc_buf = realloc (ifc.ifc_buf, ifc.ifc_len);
-      if (ifc.ifc_buf == NULL || __ioctl (fd, SIOCGIFCONF, &ifc) < 0)
-       {
-         if (ifc.ifc_buf)
-           free (ifc.ifc_buf);
-
-         if (fd != sockfd)
-           __close (fd);
-
-         *num_ifs = 0;
-         *ifreqs = NULL;
-         return;
-       }
-
-      if (!old_siocgifconf || ifc.ifc_len < rq_len)
-       break;
-
-      rq_len *= 2;
-    }
-
-  nifs = ifc.ifc_len / sizeof (struct ifreq);
-
-  if (fd != sockfd)
-    __close (fd);
-
-  *num_ifs = nifs;
-  *ifreqs = realloc (ifc.ifc_buf, nifs * sizeof (struct ifreq));
-}
+extern void __ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd);
 
 static inline struct ifreq *
 __if_nextreq (struct ifreq *ifr)
index ece1a85f30a519a9aa8cf9cec7aa213286305b82..156850330e6d1b23138d6262103d7bc58a178fd5 100644 (file)
@@ -1,5 +1,5 @@
 /* lxstat using old-style Unix lstat system call.
-   Copyright (C) 1991,1995-1998,2000,2002 Free Software Foundation, Inc.
+   Copyright (C) 1991,1995-1998,2000,2002,2003 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
@@ -30,7 +30,7 @@
 #include <sys/syscall.h>
 #include <bp-checks.h>
 
-#include <xstatconv.c>
+#include <xstatconv.h>
 
 extern int __syscall_lstat (const char *__unbounded,
                            struct kernel_stat *__unbounded);
@@ -52,7 +52,7 @@ __lxstat (int vers, const char *name, struct stat *buf)
 
   result = INLINE_SYSCALL (lstat, 2, CHECK_STRING (name), __ptrvalue (&kbuf));
   if (result == 0)
-    result = xstat_conv (vers, &kbuf, buf);
+    result = __xstat_conv (vers, &kbuf, buf);
 
   return result;
 #endif
index e7f488848c509cfb5dfe79d0cd95ab73feb1e18c..58ff6fff613a14248d55169fa86117b58e4420f4 100644 (file)
@@ -1,5 +1,5 @@
 /* lxstat64 using old-style Unix lstat system call.
-   Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc.
+   Copyright (C) 1997-2002,2003 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
@@ -29,7 +29,7 @@
 #include "kernel-features.h"
 
 #if __ASSUME_STAT64_SYSCALL == 0
-# include <xstatconv.c>
+# include <xstatconv.h>
 #endif
 
 extern int __syscall_lstat (const char *__unbounded,
@@ -79,7 +79,7 @@ ___lxstat64 (int vers, const char *name, struct stat64 *buf)
 # endif
   result = INLINE_SYSCALL (lstat, 2, CHECK_STRING (name), __ptrvalue (&kbuf));
   if (result == 0)
-    result = xstat64_conv (vers, &kbuf, buf);
+    result = __xstat64_conv (vers, &kbuf, buf);
 
   return result;
 #endif
index b4886158f3cc162e981b4fc8d756b783856d0ff0..d4159753a6262f85d2a18ac9d45bdebee27b5cd0 100644 (file)
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <unistd.h>
+#include <errno.h>
 #include "pathconf.h"
+#include "linux_fsinfo.h"
 
 static long int posix_pathconf (const char *file, int name);
 
@@ -35,15 +38,143 @@ __pathconf (const char *file, int name)
   switch (name)
     {
     case _PC_LINK_MAX:
-      return statfs_link_max (__statfs (file, &fsbuf), &fsbuf);
+      return __statfs_link_max (__statfs (file, &fsbuf), &fsbuf);
 
     case _PC_FILESIZEBITS:
-      return statfs_filesize_max (__statfs (file, &fsbuf), &fsbuf);
+      return __statfs_filesize_max (__statfs (file, &fsbuf), &fsbuf);
 
     case _PC_2_SYMLINKS:
-      return statfs_symlinks (__statfs (file, &fsbuf), &fsbuf);
+      return __statfs_symlinks (__statfs (file, &fsbuf), &fsbuf);
 
     default:
       return posix_pathconf (file, name);
     }
 }
+
+
+/* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */
+long int
+__statfs_link_max (int result, const struct statfs *fsbuf)
+{
+  if (result < 0)
+    {
+      if (errno == ENOSYS)
+       /* Not possible, return the default value.  */
+       return LINUX_LINK_MAX;
+
+      /* Some error occured.  */
+      return -1;
+    }
+
+  switch (fsbuf->f_type)
+    {
+    case EXT2_SUPER_MAGIC:
+      return EXT2_LINK_MAX;
+
+    case MINIX_SUPER_MAGIC:
+    case MINIX_SUPER_MAGIC2:
+      return MINIX_LINK_MAX;
+
+    case MINIX2_SUPER_MAGIC:
+    case MINIX2_SUPER_MAGIC2:
+      return MINIX2_LINK_MAX;
+
+    case XENIX_SUPER_MAGIC:
+      return XENIX_LINK_MAX;
+
+    case SYSV4_SUPER_MAGIC:
+    case SYSV2_SUPER_MAGIC:
+      return SYSV_LINK_MAX;
+
+    case COH_SUPER_MAGIC:
+      return COH_LINK_MAX;
+
+    case UFS_MAGIC:
+    case UFS_CIGAM:
+      return UFS_LINK_MAX;
+
+    case REISERFS_SUPER_MAGIC:
+      return REISERFS_LINK_MAX;
+
+    case XFS_SUPER_MAGIC:
+      return XFS_LINK_MAX;
+
+    default:
+      return LINUX_LINK_MAX;
+    }
+}
+
+
+/* Used like: return statfs_filesize_max (__statfs (name, &buf), &buf); */
+long int
+__statfs_filesize_max (int result, const struct statfs *fsbuf)
+{
+  if (result < 0)
+    {
+      if (errno == ENOSYS)
+       /* Not possible, return the default value.  */
+       return 32;
+
+      /* Some error occured.  */
+      return -1;
+    }
+
+  switch (fsbuf->f_type)
+    {
+    case EXT2_SUPER_MAGIC:
+    case UFS_MAGIC:
+    case UFS_CIGAM:
+    case REISERFS_SUPER_MAGIC:
+    case XFS_SUPER_MAGIC:
+    case SMB_SUPER_MAGIC:
+    case NTFS_SUPER_MAGIC:
+    case UDF_SUPER_MAGIC:
+    case JFS_SUPER_MAGIC:
+      return 64;
+
+    case MSDOS_SUPER_MAGIC:
+    case JFFS_SUPER_MAGIC:
+    case JFFS2_SUPER_MAGIC:
+    case NCP_SUPER_MAGIC:
+    case ROMFS_SUPER_MAGIC:
+      return 32;
+
+    default:
+      return 32;
+    }
+}
+
+
+/* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */
+long int
+__statfs_symlinks (int result, const struct statfs *fsbuf)
+{
+  if (result < 0)
+    {
+      if (errno == ENOSYS)
+       /* Not possible, return the default value.  */
+       return 1;
+
+      /* Some error occured.  */
+      return -1;
+    }
+
+  switch (fsbuf->f_type)
+    {
+    case ADFS_SUPER_MAGIC:
+    case BFS_MAGIC:
+    case CRAMFS_MAGIC:
+    case DEVPTS_SUPER_MAGIC:
+    case EFS_SUPER_MAGIC:
+    case EFS_MAGIC:
+    case MSDOS_SUPER_MAGIC:
+    case NTFS_SUPER_MAGIC:
+    case QNX4_SUPER_MAGIC:
+    case ROMFS_SUPER_MAGIC:
+      /* No symlink support.  */
+      return 0;
+
+    default:
+      return 1;
+    }
+}
index 80ec8fa4e050142a7d1ea482ec63267c24be5539..20e23685ebf775930bca6f66454ddb40732d83d4 100644 (file)
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <unistd.h>
 #include <errno.h>
+#include <unistd.h>
 #include <sys/statfs.h>
-#include "linux_fsinfo.h"
 
 
 /* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */
-static inline long int
-statfs_link_max (int result, const struct statfs *fsbuf)
-{
-  if (result < 0)
-    {
-      if (errno == ENOSYS)
-       /* Not possible, return the default value.  */
-       return LINUX_LINK_MAX;
-
-      /* Some error occured.  */
-      return -1;
-    }
-
-  switch (fsbuf->f_type)
-    {
-    case EXT2_SUPER_MAGIC:
-      return EXT2_LINK_MAX;
-
-    case MINIX_SUPER_MAGIC:
-    case MINIX_SUPER_MAGIC2:
-      return MINIX_LINK_MAX;
-
-    case MINIX2_SUPER_MAGIC:
-    case MINIX2_SUPER_MAGIC2:
-      return MINIX2_LINK_MAX;
-
-    case XENIX_SUPER_MAGIC:
-      return XENIX_LINK_MAX;
-
-    case SYSV4_SUPER_MAGIC:
-    case SYSV2_SUPER_MAGIC:
-      return SYSV_LINK_MAX;
-
-    case COH_SUPER_MAGIC:
-      return COH_LINK_MAX;
-
-    case UFS_MAGIC:
-    case UFS_CIGAM:
-      return UFS_LINK_MAX;
-
-    case REISERFS_SUPER_MAGIC:
-      return REISERFS_LINK_MAX;
-
-    case XFS_SUPER_MAGIC:
-      return XFS_LINK_MAX;
-
-    default:
-      return LINUX_LINK_MAX;
-    }
-}
+extern long int __statfs_link_max (int result, const struct statfs *fsbuf);
 
 
 /* Used like: return statfs_filesize_max (__statfs (name, &buf), &buf); */
-static inline long int
-statfs_filesize_max (int result, const struct statfs *fsbuf)
-{
-  if (result < 0)
-    {
-      if (errno == ENOSYS)
-       /* Not possible, return the default value.  */
-       return 32;
-
-      /* Some error occured.  */
-      return -1;
-    }
-
-  switch (fsbuf->f_type)
-    {
-    case EXT2_SUPER_MAGIC:
-    case UFS_MAGIC:
-    case UFS_CIGAM:
-    case REISERFS_SUPER_MAGIC:
-    case XFS_SUPER_MAGIC:
-    case SMB_SUPER_MAGIC:
-    case NTFS_SUPER_MAGIC:
-    case UDF_SUPER_MAGIC:
-    case JFS_SUPER_MAGIC:
-      return 64;
-
-    case MSDOS_SUPER_MAGIC:
-    case JFFS_SUPER_MAGIC:
-    case JFFS2_SUPER_MAGIC:
-    case NCP_SUPER_MAGIC:
-    case ROMFS_SUPER_MAGIC:
-      return 32;
-
-    default:
-      return 32;
-    }
-}
+extern long int __statfs_filesize_max (int result, const struct statfs *fsbuf);
 
 
 /* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */
-static inline long int
-statfs_symlinks (int result, const struct statfs *fsbuf)
-{
-  if (result < 0)
-    {
-      if (errno == ENOSYS)
-       /* Not possible, return the default value.  */
-       return 1;
-
-      /* Some error occured.  */
-      return -1;
-    }
-
-  switch (fsbuf->f_type)
-    {
-    case ADFS_SUPER_MAGIC:
-    case BFS_MAGIC:
-    case CRAMFS_MAGIC:
-    case DEVPTS_SUPER_MAGIC:
-    case EFS_SUPER_MAGIC:
-    case EFS_MAGIC:
-    case MSDOS_SUPER_MAGIC:
-    case NTFS_SUPER_MAGIC:
-    case QNX4_SUPER_MAGIC:
-    case ROMFS_SUPER_MAGIC:
-      /* No symlink support.  */
-      return 0;
-
-    default:
-      return 1;
-    }
-}
+extern long int __statfs_symlinks (int result, const struct statfs *fsbuf);
index 05e170d17c0a7f138a739e30493914160c24e3bb..de6a57d7ac0dde7937e4380dd1b0a00a85216c2a 100644 (file)
@@ -1,6 +1,5 @@
 /* xstat using old-style Unix stat system call.
-   Copyright (C) 1991, 1995, 1996, 1997, 1998, 2000, 2002
-   Free Software Foundation, Inc.
+   Copyright (C) 1991,1995-1998,2000,2002,2003 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
@@ -31,7 +30,7 @@
 #include <sys/syscall.h>
 #include <bp-checks.h>
 
-#include <xstatconv.c>
+#include <xstatconv.h>
 
 extern int __syscall_stat (const char *__unbounded,
                           struct kernel_stat *__unbounded);
@@ -54,7 +53,7 @@ __xstat (int vers, const char *name, struct stat *buf)
   result = INLINE_SYSCALL (stat, 2, CHECK_STRING (name),
                           __ptrvalue (&kbuf));
   if (result == 0)
-    result = xstat_conv (vers, &kbuf, buf);
+    result = __xstat_conv (vers, &kbuf, buf);
 
   return result;
 #endif
index 7835fc20501f88fb1d51c62a3720bef0a5e66771..803aeb310469d1d6e35c1b1338743654a29fc1dd 100644 (file)
@@ -1,5 +1,5 @@
 /* xstat64 using old-style Unix stat system call.
-   Copyright (C) 1991,95,96,97,98,99,2000,01,02 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1995-2002, 2003 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
@@ -29,7 +29,7 @@
 #include "kernel-features.h"
 
 #if __ASSUME_STAT64_SYSCALL == 0
-# include <xstatconv.c>
+# include <xstatconv.h>
 #endif
 
 extern int __syscall_stat (const char *__unbounded,
@@ -82,7 +82,7 @@ ___xstat64 (int vers, const char *name, struct stat64 *buf)
 
   result = INLINE_SYSCALL (stat, 2, CHECK_STRING (name), __ptrvalue (&kbuf));
   if (result == 0)
-    result = xstat64_conv (vers, &kbuf, buf);
+    result = __xstat64_conv (vers, &kbuf, buf);
 
   return result;
 #endif
index 6253292e934d89092a06c6d4b61c4a58bd95375c..4e4defb4895ee9a98c4e4d028f4664627b57584b 100644 (file)
@@ -1,5 +1,5 @@
 /* Convert between the kernel's `struct stat' format, and libc's.
-   Copyright (C) 1991,1995,1996,1997,2000,2002 Free Software Foundation, Inc.
+   Copyright (C) 1991,1995-1997,2000,2002,2003 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
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <errno.h>
+#include <sys/stat.h>
+#include <kernel_stat.h>
+
 #ifdef STAT_IS_KERNEL_STAT
 
 /* Dummy.  */
@@ -27,8 +31,9 @@ struct kernel_stat;
 #include <string.h>
 
 
-static inline int
-xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
+#ifndef __ASSUME_STAT64_SYSCALL
+int
+__xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
 {
   switch (vers)
     {
@@ -97,9 +102,10 @@ xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
 
   return 0;
 }
+#endif
 
-static inline int
-xstat64_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
+int
+__xstat64_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
 {
 #ifdef XSTAT_IS_XSTAT64
   return xstat_conv (vers, kbuf, ubuf);
@@ -172,8 +178,8 @@ xstat64_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
 #endif
 }
 
-static inline int
-xstat32_conv (int vers, struct stat64 *kbuf, struct stat *buf)
+int
+__xstat32_conv (int vers, struct stat64 *kbuf, struct stat *buf)
 {
   switch (vers)
     {
diff --git a/sysdeps/unix/sysv/linux/xstatconv.h b/sysdeps/unix/sysv/linux/xstatconv.h
new file mode 100644 (file)
index 0000000..cb5cda0
--- /dev/null
@@ -0,0 +1,25 @@
+/* Convert between the kernel's `struct stat' format, and libc's.
+   Copyright (C) 1991,1995-1997,2000,2002,2003 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 Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include "kernel-features.h"
+
+
+extern int __xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf);
+extern int __xstat64_conv (int vers, struct kernel_stat *kbuf, void *ubuf);
+extern int __xstat32_conv (int vers, struct stat64 *kbuf, struct stat *buf);
index 39b3c2f21180898421213fd590807a8e06a459e9..2d1775b05b90c13b09523a6c47b34ae6e0d0aa58 100644 (file)
@@ -64,6 +64,7 @@ static struct leap *leaps;
 
 /* Decode the four bytes at PTR as a signed integer in network byte order.  */
 static inline int
+__attribute ((always_inline))
 decode (const void *ptr)
 {
   if ((BYTE_ORDER == BIG_ENDIAN) && sizeof (int) == 4)
@@ -154,7 +155,8 @@ __tzfile_read (const char *file, size_t extra, char **extrap)
   /* No threads reading this stream.  */
   __fsetlocking (f, FSETLOCKING_BYCALLER);
 
-  if (fread_unlocked ((void *) &tzhead, sizeof (tzhead), 1, f) != 1)
+  if (__builtin_expect (fread_unlocked ((void *) &tzhead, sizeof (tzhead),
+                                       1, f) != 1, 0))
     goto lose;
 
   num_transitions = (size_t) decode (tzhead.tzh_timecnt);
@@ -193,23 +195,24 @@ __tzfile_read (const char *file, size_t extra, char **extrap)
 
   if (sizeof (time_t) == 4)
     {
-      if (fread_unlocked (transitions, 1, (4 + 1) * num_transitions, f)
-         != (4 + 1) * num_transitions)
+      if (__builtin_expect (fread_unlocked (transitions, 1,
+                                           (4 + 1) * num_transitions, f)
+                           != (4 + 1) * num_transitions, 0))
        goto lose;
     }
   else
     {
-      if (fread_unlocked (transitions, 4, num_transitions, f)
-         != num_transitions
-         || fread_unlocked (type_idxs, 1, num_transitions, f)
-         != num_transitions)
+      if (__builtin_expect (fread_unlocked (transitions, 4, num_transitions, f)
+                           != num_transitions, 0)
+         || __builtin_expect (fread_unlocked (type_idxs, 1, num_transitions,
+                                              f) != num_transitions, 0))
        goto lose;
     }
 
   /* Check for bogus indices in the data file, so we can hereafter
      safely use type_idxs[T] as indices into `types' and never crash.  */
   for (i = 0; i < num_transitions; ++i)
-    if (type_idxs[i] >= num_types)
+    if (__builtin_expect (type_idxs[i] >= num_types, 0))
       goto lose;
 
   if (BYTE_ORDER != BIG_ENDIAN || sizeof (time_t) != 4)
@@ -227,29 +230,33 @@ __tzfile_read (const char *file, size_t extra, char **extrap)
     {
       unsigned char x[4];
       int c;
-      if (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x))
+      if (__builtin_expect (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x),
+                           0))
        goto lose;
       c = getc_unlocked (f);
-      if ((unsigned int) c > 1u)
+      if (__builtin_expect ((unsigned int) c > 1u, 0))
        goto lose;
       types[i].isdst = c;
       c = getc_unlocked (f);
-      if ((size_t) c > chars) /* Bogus index in data file.  */
+      if (__builtin_expect ((size_t) c > chars, 0))
+       /* Bogus index in data file.  */
        goto lose;
       types[i].idx = c;
       types[i].offset = (long int) decode (x);
     }
 
-  if (fread_unlocked (zone_names, 1, chars, f) != chars)
+  if (__builtin_expect (fread_unlocked (zone_names, 1, chars, f) != chars, 0))
     goto lose;
 
   for (i = 0; i < num_leaps; ++i)
     {
       unsigned char x[4];
-      if (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x))
+      if (__builtin_expect (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x),
+                           0))
        goto lose;
       leaps[i].transition = (time_t) decode (x);
-      if (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x))
+      if (__builtin_expect (fread_unlocked (x, 1, sizeof (x), f) != sizeof (x),
+                           0))
        goto lose;
       leaps[i].change = (long int) decode (x);
     }
@@ -257,7 +264,7 @@ __tzfile_read (const char *file, size_t extra, char **extrap)
   for (i = 0; i < num_isstd; ++i)
     {
       int c = getc_unlocked (f);
-      if (c == EOF)
+      if (__builtin_expect (c == EOF, 0))
        goto lose;
       types[i].isstd = c != 0;
     }
@@ -267,7 +274,7 @@ __tzfile_read (const char *file, size_t extra, char **extrap)
   for (i = 0; i < num_isgmt; ++i)
     {
       int c = getc_unlocked (f);
-      if (c == EOF)
+      if (__builtin_expect (c == EOF, 0))
        goto lose;
       types[i].isgmt = c != 0;
     }
index bb2ca1d08b88f46a3e1a7681befaf625f028ba5e..0ff26d667198bdf6d7212cb8afa23999f35e0312 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996,1997,1998,1999,2000,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2000, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
 
@@ -72,7 +72,7 @@ __wcsnrtombs (dst, src, nwc, len, ps)
   if (dst == NULL)
     {
       unsigned char buf[256];          /* Just an arbitrary value.  */
-      const wchar_t *inbuf = *src;
+      const unsigned char *inbuf = (const unsigned char *) *src;
       size_t dummy;
 
       result = 0;
@@ -83,7 +83,7 @@ __wcsnrtombs (dst, src, nwc, len, ps)
          data.__outbuf = buf;
 
          status = DL_CALL_FCT (tomb->__fct,
-                               (tomb, &data, (const unsigned char **) &inbuf,
+                               (tomb, &data, &inbuf,
                                 (const unsigned char *) srcend, NULL,
                                 &dummy, 0, 1));
 
index dda115dfd3c351ab8cfd05e6fb8b59e7748b15ca..8b444ed8a228507d751dda8c2008023aa8f936ca 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996,1997,1998,1999,2000,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2000, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
 
@@ -66,7 +66,7 @@ __wcsrtombs (dst, src, len, ps)
       mbstate_t temp_state;
       unsigned char buf[256];          /* Just an arbitrary value.  */
       const wchar_t *srcend = *src + __wcslen (*src) + 1;
-      const wchar_t *inbuf = *src;
+      const unsigned char *inbuf = (const unsigned char *) *src;
       size_t dummy;
 
       temp_state = *data.__statep;
@@ -80,7 +80,7 @@ __wcsrtombs (dst, src, len, ps)
          data.__outbuf = buf;
 
          status = DL_CALL_FCT (tomb->__fct,
-                               (tomb, &data, (const unsigned char **) &inbuf,
+                               (tomb, &data, &inbuf,
                                 (const unsigned char *) srcend, NULL,
                                 &dummy, 0, 1));
 
index d053b9a28fffca2717e5b7c3028b3ff07852314d..b85ba6dd8ff51a6178887f45450cbafeba23de97 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996,1997,1998,1999,2000,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2000, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
 
@@ -58,11 +58,10 @@ wctob (c)
   /* Create the input string.  */
   inbuf[0] = c;
 
+  const unsigned char *argptr = (const unsigned char *) inptr;
   status = DL_CALL_FCT (fcts->tomb->__fct,
-                       (fcts->tomb, &data,
-                        (const unsigned char **) &inptr,
-                        (const unsigned char *) &inbuf[1],
-                        NULL, &dummy, 0, 1));
+                       (fcts->tomb, &data, &argptr,
+                        argptr + sizeof (inbuf[0]), NULL, &dummy, 0, 1));
 
   /* The conversion failed or the output is too long.  */
   if ((status != __GCONV_OK && status != __GCONV_FULL_OUTPUT