summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog59
-rw-r--r--Makerules8
-rw-r--r--ctype/ctype-extn.c5
-rw-r--r--ctype/ctype-info.c48
-rw-r--r--ctype/ctype.c7
-rw-r--r--ctype/ctype.h63
-rw-r--r--include/ctype.h46
-rw-r--r--include/getopt.h1
-rw-r--r--intl/localealias.c3
-rw-r--r--locale/Makefile17
-rw-r--r--locale/findlocale.c47
-rw-r--r--locale/lc-ctype.c54
-rw-r--r--locale/loadarchive.c9
-rw-r--r--localedata/ChangeLog4
-rw-r--r--localedata/tst-ctype.c6
-rw-r--r--nss/nss_files/files-XXX.c4
-rw-r--r--nss/nss_files/files-alias.c6
-rw-r--r--posix/tst-getconf.sh19
-rw-r--r--resolv/res_init.c4
-rw-r--r--sunrpc/Makefile6
-rw-r--r--sysdeps/generic/libc-tls.c2
-rw-r--r--wcsmbs/wcwidth.h3
-rw-r--r--wctype/wcfuncs.c28
-rw-r--r--wctype/wctype.h76
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  <roland@redhat.com>
+
+	* 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 <features.h> before <posix/getopt.h>.
+
+	* 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  <roland@redhat.com>
 
+	* 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 <ctype.h>
 
+#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 <shlib-compat.h>
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3)
+
 #include <ctype.h>
 #include <locale/localeinfo.h>
 
@@ -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 <ctype/ctype.h>
+#ifndef _CTYPE_H
+
+# include <ctype/ctype.h>
+
+# 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 <features.h>		/* Get __GNU_LIBRARY__ defined now.  */
 #include <posix/getopt.h>
 
 # 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 <sys/types.h>
 
 #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 <shlib-compat.h>
+#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  <roland@redhat.com>
+
+	* tst-ctype.c (main): Use nl_langinfo instead of __ctype_b global.
+
 2002-08-28  Roland McGrath  <roland@redhat.com>
 
 	* 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 <drepper@gnu.org>, 2000.
 
@@ -19,6 +19,7 @@
 
 #include <ctype.h>
 #include <locale.h>
+#include <langinfo.h>
 #include <stdio.h>
 #include <string.h>
 
@@ -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 <drepper@cygnus.com>, 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 <wchar.h>
 #include <wctype.h>
 #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.  */