From 0f283ffc5e8822a367c4703abd584348ff139810 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sun, 1 Sep 2002 12:39:40 +0000 Subject: * sysdeps/generic/libc-tls.c (__pthread_initialize_minimal): Pass TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN instead of 0, 1. * include/getopt.h: Include before . * locale/findlocale.c (_nl_remove_locale): Don't search in _nl_locale_file_list if DATA->alloc is ld_archive. Use _nl_unload_locale to do the rest of the work. * locale/loadarchive.c (_nl_load_locale_from_archive): Set usage_count of new structure to UNDELETABLE. * wctype/wctype.h (iswalnum, iswalpha, iswcntrl, iswdigit, iswlower, iswgraph, iswprint, iswpunct, iswspace, iswupper, iswxdigit, iswblank, towlower, towupper): Macros removed. * ctype/ctype.h (__tobody): Put parens around macro argument. (__isctype): Macro removed. (__ctype_b, __ctype_tolower, __ctype_toupper): Decls removed. (isalnum, isalpha, iscntrl, isdigit, islower, isgraph, isprint, ispunct, isspace, isupper, isxdigit, isblank, _tolower, _toupper, tolower, toupper): Macros and inlines removed. * include/ctype.h [! NOT_IN_libc] (isalnum, isalpha, iscntrl, isdigit, islower, isgraph, isprint, ispunct, isspace, isupper, isxdigit, isblank, _tolower, _toupper, tolower, toupper): Define here instead, using _NL_CURRENT. * ctype/ctype.c (__ctype_tolower, __ctype_toupper): Define as macros using _NL_CURRENT. * ctype/ctype-extn.c (__ctype_tolower, __ctype_toupper): Likewise. * ctype/ctype-info.c (__ctype_b, __ctype_tolower, __ctype_toupper): Renamed these to __ctype_old_*. Define old names only for SHLIB_COMPAT. (__ctype32_b, __ctype32_tolower, __ctype32_toupper): Likewise. (__ctype32_wctrans, __ctype32_wctrans, __ctype32_width): Removed. * locale/lc-ctype.c (_nl_postload_ctype): Use renamed variables, conditional on SHLIB_COMPAT. Don't set removed variables at all. * wctype/wcfuncs.c: Use _NL_CURRENT instead of those globals. * wcsmbs/wcwidth.h (internal_wcwidth): Likewise. * resolv/res_init.c [RESOLVSORT] (sort_mask): Renamed sort_mask_chars. (ISSORTMASK): Update use. * intl/localealias.c [__GNUC__]: #undef alloca before #define. * nss/nss_files/files-XXX.c (last_use): Rename `none' to `nouse'. (_nss_files_getENTNAME_r): Likewise. * nss/nss_files/files-alias.c (last_use, _nss_files_getaliasent_r): Likewise. * Makerules (all-nonlib): Renamed from all-tests. Include $(others) here too. * locale/Makefile (CPPFLAGS-locale, CPPFLAGS-localedef, CPPFLAGS-ld-ctype, CPPFLAGS-ld-time, CPPFLAGS-ld-numeric, CPPFLAGS-ld-monetary, CPPFLAGS-ld-collate, CPPFLAGS-ld-identification, CPPFLAGS-charmap, CPPFLAGS-locarchive, CPPFLAGS-linereader, CPPFLAGS-charmap-dir): Variables removed. Instead, catch all the program modules via cppflags-iterator.mk. * sunrpc/Makefile (CPPFLAGS-rpc_main): Variable removed. Instead, catch all rpcgen-objs via cppflags-iterator.mk. * posix/tst-getconf.sh: If no third arg, work with static linking. --- ChangeLog | 59 +++++++++++++++++++++++++++++++++++ Makerules | 8 ++--- ctype/ctype-extn.c | 5 +++ ctype/ctype-info.c | 48 +++++++++++----------------- ctype/ctype.c | 7 ++++- ctype/ctype.h | 63 ++----------------------------------- include/ctype.h | 46 ++++++++++++++++++++++++++- include/getopt.h | 1 + intl/localealias.c | 3 +- locale/Makefile | 17 +++------- locale/findlocale.c | 47 +++++++++------------------- locale/lc-ctype.c | 54 ++++++++++++++++---------------- locale/loadarchive.c | 9 ++++++ localedata/ChangeLog | 4 +++ localedata/tst-ctype.c | 6 +++- nss/nss_files/files-XXX.c | 4 +-- nss/nss_files/files-alias.c | 6 ++-- posix/tst-getconf.sh | 19 +++++++++--- resolv/res_init.c | 4 +-- sunrpc/Makefile | 6 +++- sysdeps/generic/libc-tls.c | 2 +- wcsmbs/wcwidth.h | 3 +- wctype/wcfuncs.c | 28 +++++++++-------- wctype/wctype.h | 76 --------------------------------------------- 24 files changed, 253 insertions(+), 272 deletions(-) diff --git a/ChangeLog b/ChangeLog index f531f07aba..a167137d40 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,64 @@ +2002-09-01 Roland McGrath + + * sysdeps/generic/libc-tls.c (__pthread_initialize_minimal): Pass + TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN instead of 0, 1. + + * include/getopt.h: Include before . + + * locale/findlocale.c (_nl_remove_locale): Don't search in + _nl_locale_file_list if DATA->alloc is ld_archive. + Use _nl_unload_locale to do the rest of the work. + + * locale/loadarchive.c (_nl_load_locale_from_archive): Set usage_count + of new structure to UNDELETABLE. + + * wctype/wctype.h (iswalnum, iswalpha, iswcntrl, iswdigit, iswlower, + iswgraph, iswprint, iswpunct, iswspace, iswupper, iswxdigit, iswblank, + towlower, towupper): Macros removed. + * ctype/ctype.h (__tobody): Put parens around macro argument. + (__isctype): Macro removed. + (__ctype_b, __ctype_tolower, __ctype_toupper): Decls removed. + (isalnum, isalpha, iscntrl, isdigit, islower, isgraph, isprint, + ispunct, isspace, isupper, isxdigit, isblank, _tolower, _toupper, + tolower, toupper): Macros and inlines removed. + * include/ctype.h [! NOT_IN_libc] + (isalnum, isalpha, iscntrl, isdigit, islower, isgraph, isprint, + ispunct, isspace, isupper, isxdigit, isblank, _tolower, _toupper, + tolower, toupper): Define here instead, using _NL_CURRENT. + * ctype/ctype.c (__ctype_tolower, __ctype_toupper): Define as macros + using _NL_CURRENT. + * ctype/ctype-extn.c (__ctype_tolower, __ctype_toupper): Likewise. + * ctype/ctype-info.c (__ctype_b, __ctype_tolower, __ctype_toupper): + Renamed these to __ctype_old_*. Define old names only for SHLIB_COMPAT. + (__ctype32_b, __ctype32_tolower, __ctype32_toupper): Likewise. + (__ctype32_wctrans, __ctype32_wctrans, __ctype32_width): Removed. + * locale/lc-ctype.c (_nl_postload_ctype): Use renamed variables, + conditional on SHLIB_COMPAT. Don't set removed variables at all. + * wctype/wcfuncs.c: Use _NL_CURRENT instead of those globals. + * wcsmbs/wcwidth.h (internal_wcwidth): Likewise. + * resolv/res_init.c [RESOLVSORT] (sort_mask): Renamed sort_mask_chars. + (ISSORTMASK): Update use. + * intl/localealias.c [__GNUC__]: #undef alloca before #define. + * nss/nss_files/files-XXX.c (last_use): Rename `none' to `nouse'. + (_nss_files_getENTNAME_r): Likewise. + * nss/nss_files/files-alias.c (last_use, _nss_files_getaliasent_r): + Likewise. + + * Makerules (all-nonlib): Renamed from all-tests. + Include $(others) here too. + * locale/Makefile (CPPFLAGS-locale, CPPFLAGS-localedef, + CPPFLAGS-ld-ctype, CPPFLAGS-ld-time, CPPFLAGS-ld-numeric, + CPPFLAGS-ld-monetary, CPPFLAGS-ld-collate, CPPFLAGS-ld-identification, + CPPFLAGS-charmap, CPPFLAGS-locarchive, CPPFLAGS-linereader, + CPPFLAGS-charmap-dir): Variables removed. Instead, catch all + the program modules via cppflags-iterator.mk. + * sunrpc/Makefile (CPPFLAGS-rpc_main): Variable removed. + Instead, catch all rpcgen-objs via cppflags-iterator.mk. + 2002-08-31 Roland McGrath + * posix/tst-getconf.sh: If no third arg, work with static linking. + * locale/categories.def (LC_TIME): No more _nl_postload_time. * locale/setlocale.c (_nl_category_postload): Use weak refs only under diff --git a/Makerules b/Makerules index 6d05287b0d..59fcdaecef 100644 --- a/Makerules +++ b/Makerules @@ -1040,11 +1040,11 @@ check: tests .PHONY: xcheck xcheck: xtests -all-tests = $(strip $(tests) $(xtests) $(test-srcs)) -ifneq (,$(all-tests)) -cpp-srcs-left = $(all-tests:=.c) +all-nonlib = $(strip $(tests) $(xtests) $(test-srcs) $(others)) +ifneq (,$(all-nonlib)) +cpp-srcs-left = $(all-nonlib:=.c) lib := tests -include $(patsubst %,$(..)cppflags-iterator.mk,$(all-tests)) +include $(patsubst %,$(..)cppflags-iterator.mk,$(all-nonlib)) endif .PHONY: TAGS diff --git a/ctype/ctype-extn.c b/ctype/ctype-extn.c index 4bab5a0298..b54080d7ac 100644 --- a/ctype/ctype-extn.c +++ b/ctype/ctype-extn.c @@ -19,6 +19,11 @@ #define __NO_CTYPE #include +#define __ctype_tolower \ + ((uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOLOWER) + 128) +#define __ctype_toupper \ + ((uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOUPPER) + 128) + /* Real function versions of the non-ANSI ctype functions. isblank is now in ISO C99 but we leave it here. */ diff --git a/ctype/ctype-info.c b/ctype/ctype-info.c index d29edb7171..033d1b70cb 100644 --- a/ctype/ctype-info.c +++ b/ctype/ctype-info.c @@ -16,6 +16,9 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3) + #include #include @@ -36,36 +39,21 @@ extern const char _nl_C_LC_CTYPE_class_blank[] attribute_hidden; extern const char _nl_C_LC_CTYPE_class_cntrl[] attribute_hidden; extern const char _nl_C_LC_CTYPE_class_punct[] attribute_hidden; extern const char _nl_C_LC_CTYPE_class_alnum[] attribute_hidden; -extern const char _nl_C_LC_CTYPE_map_toupper[] attribute_hidden; -extern const char _nl_C_LC_CTYPE_map_tolower[] attribute_hidden; -extern const char _nl_C_LC_CTYPE_width[] attribute_hidden; #define b(t,x,o) (((const t *) _nl_C_LC_CTYPE_##x) + o) -const unsigned short int *__ctype_b = b (unsigned short int, class, 128); -const __uint32_t *__ctype32_b = b (__uint32_t, class32, 0); -const __int32_t *__ctype_tolower = b (__int32_t, tolower, 128); -const __int32_t *__ctype_toupper = b (__int32_t, toupper, 128); -const __uint32_t *__ctype32_tolower = b (__uint32_t, tolower, 128); -const __uint32_t *__ctype32_toupper = b (__uint32_t, toupper, 128); -const char *__ctype32_wctype[12] attribute_hidden = -{ - b(char, class_upper, 32), - b(char, class_lower, 32), - b(char, class_alpha, 32), - b(char, class_digit, 32), - b(char, class_xdigit, 32), - b(char, class_space, 32), - b(char, class_print, 32), - b(char, class_graph, 32), - b(char, class_blank, 32), - b(char, class_cntrl, 32), - b(char, class_punct, 32), - b(char, class_alnum, 32) -}; -const char *__ctype32_wctrans[2] attribute_hidden = -{ - b(char, map_toupper, 0), - b(char, map_tolower, 0) -}; -const char *__ctype32_width attribute_hidden = b (char, width, 0); +const unsigned short int *__ctype_old_b = b (unsigned short int, class, 128); +const __uint32_t *__ctype32_old_b = b (__uint32_t, class32, 0); +const __int32_t *__ctype_old_tolower = b (__int32_t, tolower, 128); +const __int32_t *__ctype_old_toupper = b (__int32_t, toupper, 128); +const __uint32_t *__ctype32_old_tolower = b (__uint32_t, tolower, 128); +const __uint32_t *__ctype32_old_toupper = b (__uint32_t, toupper, 128); + +compat_symbol (libc, __ctype_old_b, __ctype_b, GLIBC_2_0); +compat_symbol (libc, __ctype_old_tolower, __ctype_tolower, GLIBC_2_0); +compat_symbol (libc, __ctype_old_toupper, __ctype_toupper, GLIBC_2_0); +compat_symbol (libc, __ctype32_old_b, __ctype32_b, GLIBC_2_0); +compat_symbol (libc, __ctype32_old_tolower, __ctype32_tolower, GLIBC_2_2); +compat_symbol (libc, __ctype32_old_toupper, __ctype32_toupper, GLIBC_2_2); + +#endif diff --git a/ctype/ctype.c b/ctype/ctype.c index 4bcbd30ef7..4d5b0d2307 100644 --- a/ctype/ctype.c +++ b/ctype/ctype.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1997, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1991,92,97,99,2002 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 @@ -36,6 +36,11 @@ func (isspace, _ISspace) func (isupper, _ISupper) func (isxdigit, _ISxdigit) +#define __ctype_tolower \ + ((uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOLOWER) + 128) +#define __ctype_toupper \ + ((uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOUPPER) + 128) + int tolower (int c) { diff --git a/ctype/ctype.h b/ctype/ctype.h index 47fba836ca..9469907b27 100644 --- a/ctype/ctype.h +++ b/ctype/ctype.h @@ -62,31 +62,13 @@ enum }; #endif /* ! _ISbit */ -/* These are defined in ctype-info.c. - The declarations here must match those in localeinfo.h. - - These point into arrays of 384, so they can be indexed by any `unsigned - char' value [0,255]; by EOF (-1); or by any `signed char' value - [-128,-1). ISO C requires that the ctype functions work for `unsigned - char' values and for EOF; we also support negative `signed char' values - for broken old programs. The case conversion arrays are of `int's - rather than `unsigned char's because tolower (EOF) must be EOF, which - doesn't fit into an `unsigned char'. But today more important is that - the arrays are also used for multi-byte character sets. */ -extern __const unsigned short int *__ctype_b; /* Characteristics. */ -extern __const __int32_t *__ctype_tolower; /* Case conversions. */ -extern __const __int32_t *__ctype_toupper; /* Case conversions. */ - -#define __isctype(c, type) \ - (__ctype_b[(int) (c)] & (unsigned short int) type) - #define __isascii(c) (((c) & ~0x7f) == 0) /* If C is a 7 bit value. */ #define __toascii(c) ((c) & 0x7f) /* Mask off high bits. */ #define __exctype(name) extern int name (int) __THROW - __BEGIN_NAMESPACE_STD + /* The following names are all functions: int isCHARACTERISTIC(int c); which return nonzero iff C has CHARACTERISTIC. @@ -147,59 +129,20 @@ __exctype (_tolower); if (__builtin_constant_p (c)) \ { \ int __c = (c); \ - __res = __c < -128 || __c > 255 ? __c : a[__c]; \ + __res = __c < -128 || __c > 255 ? __c : (a)[__c]; \ } \ else \ __res = f args; \ } \ else \ - __res = a[(int) (c)]; \ + __res = (a)[(int) (c)]; \ __res; })) #if !defined __NO_CTYPE && !defined __cplusplus -# define isalnum(c) __isctype((c), _ISalnum) -# define isalpha(c) __isctype((c), _ISalpha) -# define iscntrl(c) __isctype((c), _IScntrl) -# define isdigit(c) __isctype((c), _ISdigit) -# define islower(c) __isctype((c), _ISlower) -# define isgraph(c) __isctype((c), _ISgraph) -# define isprint(c) __isctype((c), _ISprint) -# define ispunct(c) __isctype((c), _ISpunct) -# define isspace(c) __isctype((c), _ISspace) -# define isupper(c) __isctype((c), _ISupper) -# define isxdigit(c) __isctype((c), _ISxdigit) - -# ifdef __USE_ISOC99 -# define isblank(c) __isctype((c), _ISblank) -# endif - -# ifdef __USE_EXTERN_INLINES -extern __inline int -tolower (int __c) __THROW -{ - return __c >= -128 && __c < 256 ? __ctype_tolower[__c] : __c; -} - -extern __inline int -toupper (int __c) __THROW -{ - return __c >= -128 && __c < 256 ? __ctype_toupper[__c] : __c; -} -# endif - -# if __GNUC__ >= 2 && defined __OPTIMIZE__ && !defined __cplusplus -# define tolower(c) __tobody (c, tolower, __ctype_tolower, (c)) -# define toupper(c) __tobody (c, toupper, __ctype_toupper, (c)) -# endif /* Optimizing gcc */ - # if defined __USE_SVID || defined __USE_MISC || defined __USE_XOPEN # define isascii(c) __isascii (c) # define toascii(c) __toascii (c) - -# define _tolower(c) ((int) __ctype_tolower[(int) (c)]) -# define _toupper(c) ((int) __ctype_toupper[(int) (c)]) # endif - #endif /* Not __NO_CTYPE. */ diff --git a/include/ctype.h b/include/ctype.h index 7b51e1f5eb..3100853ab4 100644 --- a/include/ctype.h +++ b/include/ctype.h @@ -1 +1,45 @@ -#include +#ifndef _CTYPE_H + +# include + +# ifndef NOT_IN_libc + +/* The optimized macros are not defined for users because they can't see + the thread-local locale state. For inside libc, define them using the + _NL_CURRENT accessors. We don't use _NL_CURRENT_LOCALE->__ctype_b here + because we want to cause a link-time ref to _nl_current_LC_CTYPE under + NL_CURRENT_INDIRECT. */ + +# include "../locale/localeinfo.h" +# define __isctype(c, type) \ + (((uint16_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_CLASS) + 128) \ + [(int) (c)] & (uint16_t) type) +# ifndef __NO_CTYPE +# define isalnum(c) __isctype((c), _ISalnum) +# define isalpha(c) __isctype((c), _ISalpha) +# define iscntrl(c) __isctype((c), _IScntrl) +# define isdigit(c) __isctype((c), _ISdigit) +# define islower(c) __isctype((c), _ISlower) +# define isgraph(c) __isctype((c), _ISgraph) +# define isprint(c) __isctype((c), _ISprint) +# define ispunct(c) __isctype((c), _ISpunct) +# define isspace(c) __isctype((c), _ISspace) +# define isupper(c) __isctype((c), _ISupper) +# define isxdigit(c) __isctype((c), _ISxdigit) +# define isblank(c) __isctype((c), _ISblank) + +# define tolower(c) \ + __tobody (c, tolower, \ + (uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOLOWER) + 128, \ + (c)) +# define _tolower(c) tolower (c) +# define toupper(c) \ + __tobody (c, toupper, \ + (uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOUPPER) + 128, \ + (c)) +# define _toupper(c) toupper (c) + +# endif /* Not __NO_CTYPE. */ +# endif /* _LIBC_REENTRANT. */ + +#endif /* ctype.h */ diff --git a/include/getopt.h b/include/getopt.h index 70e790b396..7bef4ba4bb 100644 --- a/include/getopt.h +++ b/include/getopt.h @@ -1,5 +1,6 @@ #ifndef _GETOPT_H +#include /* Get __GNU_LIBRARY__ defined now. */ #include # ifdef _GETOPT_H diff --git a/intl/localealias.c b/intl/localealias.c index 2226897f58..0afe98134b 100644 --- a/intl/localealias.c +++ b/intl/localealias.c @@ -1,5 +1,5 @@ /* Handle aliases for locale names. - Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1995-1999, 2000,01,02 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 @@ -36,6 +36,7 @@ #include #ifdef __GNUC__ +# undef alloca # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else diff --git a/locale/Makefile b/locale/Makefile index 27bd893c4a..ec47bde054 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -101,18 +101,11 @@ CFLAGS-charmap.c = -Wno-write-strings -Wno-char-subscripts CFLAGS-locfile.c = -Wno-write-strings -Wno-char-subscripts CFLAGS-charmap-dir.c = -Wno-write-strings -CPPFLAGS-locale = -DNOT_IN_libc -CPPFLAGS-localedef = -DNOT_IN_libc -CPPFLAGS-ld-ctype = -DNOT_IN_libc -CPPFLAGS-ld-time = -DNOT_IN_libc -CPPFLAGS-ld-numeric = -DNOT_IN_libc -CPPFLAGS-ld-monetary = -DNOT_IN_libc -CPPFLAGS-ld-collate = -DNOT_IN_libc -CPPFLAGS-ld-identification = -DNOT_IN_libc -CPPFLAGS-charmap = -DNOT_IN_libc -CPPFLAGS-locarchive = -DNOT_IN_libc -CPPFLAGS-linereader = -DNOT_IN_libc -CPPFLAGS-charmap-dir = -DNOT_IN_libc +# This makes sure -DNOT_IN_libc is passed for all these modules. +cpp-srcs-left := $(addsuffix .c,$(localedef-modules) $(localedef-aux) \ + $(locale-modules) $(lib-modules)) +lib := locale_programs +include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) # Depend on libc.so so a DT_NEEDED is generated in the shared objects. # This ensures they will load libc.so for needed symbols if loaded by diff --git a/locale/findlocale.c b/locale/findlocale.c index 6ecfdc2324..9c9b85347f 100644 --- a/locale/findlocale.c +++ b/locale/findlocale.c @@ -270,40 +270,23 @@ _nl_remove_locale (int locale, struct locale_data *data) { if (--data->usage_count == 0) { - /* First search the entry in the list of loaded files. */ - struct loaded_l10nfile *ptr = _nl_locale_file_list[locale]; - - /* Search for the entry. It must be in the list. Otherwise it - is a bug and we crash badly. */ - while ((struct locale_data *) ptr->data != data) - ptr = ptr->next; - - /* Mark the data as not available anymore. So when the data has - to be used again it is reloaded. */ - ptr->decided = 0; - ptr->data = NULL; - - /* Free the name. */ - free ((char *) data->name); - -#ifdef _POSIX_MAPPED_FILES - /* Really delete the data. First delete the real data. */ - if (__builtin_expect (data->alloc == ld_mapped, 1)) + if (data->alloc != ld_archive) { - /* Try to unmap the area. If this fails we mark the area as - permanent. */ - if (__munmap ((caddr_t) data->filedata, data->filesize) != 0) - { - data->usage_count = UNDELETABLE; - return; - } + /* First search the entry in the list of loaded files. */ + struct loaded_l10nfile *ptr = _nl_locale_file_list[locale]; + + /* Search for the entry. It must be in the list. Otherwise it + is a bug and we crash badly. */ + while ((struct locale_data *) ptr->data != data) + ptr = ptr->next; + + /* Mark the data as not available anymore. So when the data has + to be used again it is reloaded. */ + ptr->decided = 0; + ptr->data = NULL; } - else -#endif /* _POSIX_MAPPED_FILES */ - /* The memory was malloced. */ - free ((void *) data->filedata); - /* Now free the structure itself. */ - free (data); + /* This does the real work. */ + _nl_unload_locale (data); } } diff --git a/locale/lc-ctype.c b/locale/lc-ctype.c index 59ff7019aa..69414020b8 100644 --- a/locale/lc-ctype.c +++ b/locale/lc-ctype.c @@ -34,7 +34,8 @@ _NL_CURRENT_DEFINE (LC_CTYPE); void _nl_postload_ctype (void) { - const struct locale_data *data = _NL_CURRENT_DATA (LC_CTYPE); +#include +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3) #define paste(a,b) paste1(a,b) #define paste1(a,b) a##b @@ -42,29 +43,30 @@ _nl_postload_ctype (void) #define current(type,x,offset) \ ((const type *) _NL_CURRENT (LC_CTYPE, paste(_NL_CTYPE_,x)) + offset) - extern const uint32_t *__ctype32_b; - extern const uint32_t *__ctype32_toupper; - extern const uint32_t *__ctype32_tolower; - extern const char *__ctype32_wctype[12] attribute_hidden; - extern const char *__ctype32_wctrans[2] attribute_hidden; - extern const char *__ctype32_width attribute_hidden; - - size_t offset, cnt; - - __ctype_b = current (uint16_t, CLASS, 128); - __ctype_toupper = current (uint32_t, TOUPPER, 128); - __ctype_tolower = current (uint32_t, TOLOWER, 128); - __ctype32_b = current (uint32_t, CLASS32, 0); - __ctype32_toupper = current (uint32_t, TOUPPER32, 0); - __ctype32_tolower = current (uint32_t, TOLOWER32, 0); - - offset = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_CLASS_OFFSET); - for (cnt = 0; cnt < 12; cnt++) - __ctype32_wctype[cnt] = data->values[offset + cnt].string; - - offset = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_OFFSET); - for (cnt = 0; cnt < 2; cnt++) - __ctype32_wctrans[cnt] = data->values[offset + cnt].string; - - __ctype32_width = current (char, WIDTH, 0); +/* These are defined in ctype-info.c. + The declarations here must match those in localeinfo.h. + + These point into arrays of 384, so they can be indexed by any `unsigned + char' value [0,255]; by EOF (-1); or by any `signed char' value + [-128,-1). ISO C requires that the ctype functions work for `unsigned + char' values and for EOF; we also support negative `signed char' values + for broken old programs. The case conversion arrays are of `int's + rather than `unsigned char's because tolower (EOF) must be EOF, which + doesn't fit into an `unsigned char'. But today more important is that + the arrays are also used for multi-byte character sets. */ + extern __const unsigned short int *__ctype_old_b; /* Characteristics. */ + extern __const __int32_t *__ctype_old_tolower; /* Case conversions. */ + extern __const __int32_t *__ctype_old_toupper; /* Case conversions. */ + + extern const uint32_t *__ctype32_old_b; + extern const uint32_t *__ctype32_old_toupper; + extern const uint32_t *__ctype32_old_tolower; + + __ctype_old_b = current (uint16_t, CLASS, 128); + __ctype_old_toupper = current (uint32_t, TOUPPER, 128); + __ctype_old_tolower = current (uint32_t, TOLOWER, 128); + __ctype32_old_b = current (uint32_t, CLASS32, 0); + __ctype32_old_toupper = current (uint32_t, TOUPPER32, 0); + __ctype32_old_tolower = current (uint32_t, TOLOWER32, 0); +#endif } diff --git a/locale/loadarchive.c b/locale/loadarchive.c index e8235c9a4d..aa19dbd5f8 100644 --- a/locale/loadarchive.c +++ b/locale/loadarchive.c @@ -477,6 +477,15 @@ _nl_load_locale_from_archive (int category, const char **namep) /* _nl_intern_locale_data leaves us these fields to initialize. */ lia->data[cnt]->alloc = ld_archive; lia->data[cnt]->name = lia->name; + + /* We do this instead of bumping the count each time we return + this data because the mappings stay around forever anyway + and we might as well hold on to a little more memory and not + have to rebuild it on the next lookup of the same thing. + If we were to maintain the usage_count normally and let the + structures be freed, we would have to remove the elements + from archloaded too. */ + lia->data[cnt]->usage_count = UNDELETABLE; } } diff --git a/localedata/ChangeLog b/localedata/ChangeLog index ad0be111fb..f9d40bd137 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -1,3 +1,7 @@ +2002-09-01 Roland McGrath + + * tst-ctype.c (main): Use nl_langinfo instead of __ctype_b global. + 2002-08-28 Roland McGrath * tst-xlocale1.c (main): Remove __ from function names. diff --git a/localedata/tst-ctype.c b/localedata/tst-ctype.c index 470b1ce4d1..b6f615ced6 100644 --- a/localedata/tst-ctype.c +++ b/localedata/tst-ctype.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 Free Software Foundation, Inc. +/* Copyright (C) 2000,02 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2000. @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -72,12 +73,15 @@ main (void) char *resline = NULL; size_t reslinelen = 0; int n; + const unsigned short int *__ctype_b; setlocale (LC_ALL, ""); printf ("Testing the ctype data of the `%s' locale\n", setlocale (LC_CTYPE, NULL)); + __ctype_b = ((const unsigned short *) nl_langinfo (_NL_CTYPE_CLASS)) + 128; + #if 0 /* Just for debugging. */ diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c index b6b8cf8d34..fd000bfd9a 100644 --- a/nss/nss_files/files-XXX.c +++ b/nss/nss_files/files-XXX.c @@ -63,7 +63,7 @@ __libc_lock_define_initialized (static, lock) static FILE *stream; static fpos_t position; -static enum { none, getent, getby } last_use; +static enum { nouse, getent, getby } last_use; static int keep_stream; /* Open database file if not already opened. */ @@ -265,7 +265,7 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer, fgetpos (stream, &position); else /* We must make sure we reposition the stream the next call. */ - last_use = none; + last_use = nouse; } } diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c index a2ef511901..8ee54f121f 100644 --- a/nss/nss_files/files-alias.c +++ b/nss/nss_files/files-alias.c @@ -1,5 +1,5 @@ /* Mail alias file parser in nss_files module. - Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1996,97,98,99,2002 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -36,7 +36,7 @@ __libc_lock_define_initialized (static, lock) static FILE *stream; static fpos_t position; -static enum { none, getent, getby } last_use; +static enum { nouse, getent, getby } last_use; static enum nss_status @@ -408,7 +408,7 @@ _nss_files_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen, if (status == NSS_STATUS_SUCCESS) fgetpos (stream, &position); else - last_use = none; + last_use = nouse; } } diff --git a/posix/tst-getconf.sh b/posix/tst-getconf.sh index 6b5c433b8a..9630ebf4ef 100644 --- a/posix/tst-getconf.sh +++ b/posix/tst-getconf.sh @@ -2,7 +2,18 @@ common_objpfx=$1; shift elf_objpfx=$1; shift -rtld_installed_name=$1; shift +if [ $# -eq 0 ]; then + # Static case. + runit() { + "$@" + } +else + rtld_installed_name=$1; shift + runit() { + ${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} "$@" + } +fi + logfile=$common_objpfx/posix/tst-getconf.out # Since we use `sort' we must make sure to use the same locale everywhere. @@ -15,8 +26,7 @@ rm -f $logfile result=0 while read name; do echo -n "getconf $name: " >> $logfile - ${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \ - ${common_objpfx}posix/getconf "$name" 2>> $logfile >> $logfile + runit ${common_objpfx}posix/getconf "$name" 2>> $logfile >> $logfile if test $? -ne 0; then echo "*** $name FAILED" >> $logfile result=1 @@ -194,8 +204,7 @@ EOF while read name; do echo -n "getconf $name /: " >> $logfile - ${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \ - ${common_objpfx}posix/getconf "$name" / 2>> $logfile >> $logfile + runit ${common_objpfx}posix/getconf "$name" / 2>> $logfile >> $logfile if test $? -ne 0; then echo "*** $name FAILED" >> $logfile result=1 diff --git a/resolv/res_init.c b/resolv/res_init.c index ef1fcb476c..764e571029 100644 --- a/resolv/res_init.c +++ b/resolv/res_init.c @@ -95,8 +95,8 @@ static void res_setoptions (res_state, const char *, const char *) internal_function; #ifdef RESOLVSORT -static const char sort_mask[] = "/&"; -#define ISSORTMASK(ch) (strchr(sort_mask, ch) != NULL) +static const char sort_mask_chars[] = "/&"; +#define ISSORTMASK(ch) (strchr(sort_mask_chars, ch) != NULL) static u_int32_t net_mask __P((struct in_addr)); #endif diff --git a/sunrpc/Makefile b/sunrpc/Makefile index f2c31c73a0..f80b190d14 100644 --- a/sunrpc/Makefile +++ b/sunrpc/Makefile @@ -122,7 +122,6 @@ ifeq (yes,$(have_doors)) CPPFLAGS-key_call.c += -DHAVE_DOORS=1 endif CPPFLAGS += -D_RPC_THREAD_SAFE_ -CPPFLAGS-rpc_main += -DNOT_IN_libc include ../Rules @@ -131,6 +130,11 @@ $(objpfx)rpcgen: $(addprefix $(objpfx),$(rpcgen-objs)) \ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) $(+link) +# This makes sure -DNOT_IN_libc is passed for all these modules. +cpp-srcs-left := $(rpcgen-objs:.o=.c) +lib := rpcgen +include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) + # Tell rpcgen where to find the C preprocessor. rpcgen-cmd = CPP='$(CC) -E -x c-header' $(built-program-cmd) -Y ../scripts diff --git a/sysdeps/generic/libc-tls.c b/sysdeps/generic/libc-tls.c index 2bbdf2e0a0..3fc89c15b4 100644 --- a/sysdeps/generic/libc-tls.c +++ b/sysdeps/generic/libc-tls.c @@ -176,6 +176,6 @@ void __attribute__ ((weak)) __pthread_initialize_minimal (void) { - __libc_setup_tls (0, 1); + __libc_setup_tls (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN); } #endif diff --git a/wcsmbs/wcwidth.h b/wcsmbs/wcwidth.h index e32f02d6e2..c24dee9126 100644 --- a/wcsmbs/wcwidth.h +++ b/wcsmbs/wcwidth.h @@ -21,6 +21,7 @@ #include #include #include "../wctype/wchar-lookup.h" +#include "../locale/localeinfo.h" /* Table containing width information. */ extern const char *__ctype32_width attribute_hidden; @@ -33,7 +34,7 @@ internal_wcwidth (wchar_t wc) /* The tables have been prepared in such a way that 1. wc == L'\0' yields res = 0, 2. !iswprint (wc) implies res = '\xff'. */ - res = wcwidth_table_lookup (__ctype32_width, wc); + res = wcwidth_table_lookup (_NL_CURRENT (LC_CTYPE, _NL_CTYPE_WIDTH), wc); return res == (unsigned char) '\xff' ? -1 : (int) res; } diff --git a/wctype/wcfuncs.c b/wctype/wcfuncs.c index 2595f50da7..a3aed3104e 100644 --- a/wctype/wcfuncs.c +++ b/wctype/wcfuncs.c @@ -21,19 +21,17 @@ #include "wchar-lookup.h" -/* These are not exported. */ -extern const char *__ctype32_wctype[12] attribute_hidden; -extern const char *__ctype32_wctrans[2] attribute_hidden; - /* Provide real-function versions of all the wctype macros. */ -#define func(name, type) \ - extern int __##name (wint_t __wc); \ - int \ - __##name (wint_t wc) \ - { \ - return wctype_table_lookup (__ctype32_wctype[type], wc); \ - } \ +#define func(name, type) \ + extern int __##name (wint_t __wc); \ + int \ + __##name (wint_t wc) \ + { \ + size_t i = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_CLASS_OFFSET) + type; \ + const char *desc = _NL_CURRENT (LC_CTYPE, i); \ + return wctype_table_lookup (desc, wc); \ + } \ weak_alias (__##name, name) #undef iswalnum @@ -71,7 +69,9 @@ wint_t towlower (wc) wint_t wc; { - return wctrans_table_lookup (__ctype32_wctrans[__TOW_tolower], wc); + size_t i = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_OFFSET) + __TOW_tolower; + const char *desc = _NL_CURRENT (LC_CTYPE, i); + return wctrans_table_lookup (desc, wc); } libc_hidden_def (towlower) @@ -80,6 +80,8 @@ wint_t towupper (wc) wint_t wc; { - return wctrans_table_lookup (__ctype32_wctrans[__TOW_toupper], wc); + size_t i = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_OFFSET) + __TOW_toupper; + const char *desc = _NL_CURRENT (LC_CTYPE, i); + return wctrans_table_lookup (desc, wc); } libc_hidden_def (towupper) diff --git a/wctype/wctype.h b/wctype/wctype.h index 0cd1603c3f..f5519aa4eb 100644 --- a/wctype/wctype.h +++ b/wctype/wctype.h @@ -190,64 +190,6 @@ extern wctype_t wctype (__const char *__property) __THROW; extern int iswctype (wint_t __wc, wctype_t __desc) __THROW; __END_NAMESPACE_C99 -#if __GNUC__ >= 2 && defined __OPTIMIZE__ && !defined __cplusplus -/* The tables are always organized in a way which allows direct access - for single byte characters. */ -extern unsigned int *__ctype32_b; - -# define iswalnum(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwalnum) : iswalnum (wc))) -# define iswalpha(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwalpha) : iswalpha (wc))) -# define iswcntrl(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwcntrl) : iswcntrl (wc))) -# define iswdigit(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwdigit) : iswdigit (wc))) -# define iswlower(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwlower) : iswlower (wc))) -# define iswgraph(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwgraph) : iswgraph (wc))) -# define iswprint(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwprint) : iswprint (wc))) -# define iswpunct(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwpunct) : iswpunct (wc))) -# define iswspace(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwspace) : iswspace (wc))) -# define iswupper(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwupper) : iswupper (wc))) -# define iswxdigit(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwxdigit) : iswxdigit (wc))) - -# ifdef __USE_ISOC99 -# define iswblank(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwblank) : iswblank (wc))) -# endif - -#endif /* gcc && optimizing */ /* * Wide-character case-mapping functions: 7.15.3.1. @@ -270,24 +212,6 @@ extern wint_t towlower (wint_t __wc) __THROW; extern wint_t towupper (wint_t __wc) __THROW; __END_NAMESPACE_C99 -#if __GNUC__ >= 2 && defined __OPTIMIZE__ && !defined __cplusplus -/* The tables are always organized in a way which allows direct access - for single byte characters. */ -extern const wint_t *__ctype32_tolower; -extern const wint_t *__ctype32_toupper; - -# define towlower(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (wint_t) __ctype32_tolower[(wint_t) (wc)] : towlower (wc))) - -# define towupper(wc) \ - (__extension__ \ - (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff' \ - ? (wint_t) __ctype32_toupper[(wint_t) (wc)] : towupper (wc))) - -#endif /* gcc && optimizing */ - __END_DECLS #endif /* need iswxxx. */ -- cgit 1.4.1