about summary refs log tree commit diff
path: root/locale
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2002-09-01 12:39:40 +0000
committerRoland McGrath <roland@gnu.org>2002-09-01 12:39:40 +0000
commit0f283ffc5e8822a367c4703abd584348ff139810 (patch)
treeea4e3a9a5c4dca2c51fb8cb08995de41b2bf998e /locale
parent0ba454fccb56eb5890ad692949323af6ad64189c (diff)
downloadglibc-0f283ffc5e8822a367c4703abd584348ff139810.tar.gz
glibc-0f283ffc5e8822a367c4703abd584348ff139810.tar.xz
glibc-0f283ffc5e8822a367c4703abd584348ff139810.zip
* 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.

	* posix/tst-getconf.sh: If no third arg, work with static linking.
Diffstat (limited to 'locale')
-rw-r--r--locale/Makefile17
-rw-r--r--locale/findlocale.c47
-rw-r--r--locale/lc-ctype.c54
-rw-r--r--locale/loadarchive.c9
4 files changed, 57 insertions, 70 deletions
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;
 	  }
       }