about summary refs log tree commit diff
path: root/ctype
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2002-09-02 07:09:08 +0000
committerRoland McGrath <roland@gnu.org>2002-09-02 07:09:08 +0000
commitcf684340ce723e2ec50e8f82d8c10947360518d2 (patch)
tree123ff19d7fbfabf234aee0e62a0753eba16827ea /ctype
parent4032add80a847ddff3dff9d85163fc119013b9e2 (diff)
downloadglibc-cf684340ce723e2ec50e8f82d8c10947360518d2.tar.gz
glibc-cf684340ce723e2ec50e8f82d8c10947360518d2.tar.xz
glibc-cf684340ce723e2ec50e8f82d8c10947360518d2.zip
* ctype/ctype.h (__ctype_b, __ctype_toupper, __ctype_tolower):
	Variable declarations removed.
	(__ctype_b_loc, __ctype_toupper_loc, __ctype_tolower_loc): Declare
	these functions to replace them.
	(__isctype, tolower, toupper, _tolower, _toupper): Use those accessor
	functions plus an indirection rather than the old global variables.
	* include/ctype.h (__isctype, tolower, _tolower, toupper, _toupper):
	Macros removed.
	(__ctype_b_loc, __ctype_toupper_loc, __ctype_tolower_loc): New extern
	inline functions.
	* ctype/ctype-info.c: Revert last reversion back the other way.
	Define tsd vars CTYPE_B, CTYPE_TOLOWER, CTYPE_TOUPPER.
	Define real function versions of include/ctype.h inlines here.
	* ctype/Versions (libc: GLIBC_2.3): Add __ctype_b_loc,
	__ctype_tolower_loc, __ctype_toupper_loc.
	* locale/lc-ctype.c: Revert last reversion back the other way.
	(_nl_postload_ctype): If current thread uses the global locale,
	update its tsd vars.
	* locale/uselocale.c (__uselocale): Update tsd vars from new locale.
	* hurd/hurd/threadvar.h (enum __hurd_threadvar_index): Add CTYPE_B,
	CTYPE_TOLOWER, CTYPE_TOUPPER.

	* sysdeps/generic/bits/libc-tsd.h (__libc_tsd_address): New macro.
	* sysdeps/mach/hurd/bits/libc-tsd.h (__libc_tsd_address): Renamed
	from __libc_tsd_threadvar_location.
	(__libc_tsd_set, __libc_tsd_get): Update uses.
Diffstat (limited to 'ctype')
-rw-r--r--ctype/Versions3
-rw-r--r--ctype/ctype-info.c56
-rw-r--r--ctype/ctype.h28
3 files changed, 46 insertions, 41 deletions
diff --git a/ctype/Versions b/ctype/Versions
index f77b5be5b3..8cf0338b39 100644
--- a/ctype/Versions
+++ b/ctype/Versions
@@ -17,5 +17,8 @@ libc {
   }
   GLIBC_2.3 {
     isctype; __isctype;
+
+    # functions used by optimized macros in ctype.h
+    __ctype_b_loc; __ctype_tolower_loc; __ctype_toupper_loc;
   }
 }
diff --git a/ctype/ctype-info.c b/ctype/ctype-info.c
index d29edb7171..30c6d55444 100644
--- a/ctype/ctype-info.c
+++ b/ctype/ctype-info.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991,92,95,96,97,99,2000,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991,92,95,96,97,99,2000,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
@@ -16,9 +16,18 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#define CTYPE_EXTERN_INLINE /* Define real functions for accessors.  */
 #include <ctype.h>
 #include <locale/localeinfo.h>
 
+__libc_tsd_define (, CTYPE_B)
+__libc_tsd_define (, CTYPE_TOLOWER)
+__libc_tsd_define (, CTYPE_TOUPPER)
+
+
+#include <shlib-compat.h>
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3)
+
 /* Defined in locale/C-ctype.c.  */
 extern const char _nl_C_LC_CTYPE_class[] attribute_hidden;
 extern const char _nl_C_LC_CTYPE_class32[] attribute_hidden;
@@ -36,36 +45,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.h b/ctype/ctype.h
index 28aec6bc41..c7290ed731 100644
--- a/ctype/ctype.h
+++ b/ctype/ctype.h
@@ -65,6 +65,11 @@ enum
 /* These are defined in ctype-info.c.
    The declarations here must match those in localeinfo.h.
 
+   In the thread-specific locale model (see `uselocale' in <locale.h>)
+   we cannot use global variables for these as was done in the past.
+   Instead, the following accessor functions return the address of
+   each variable, which is local to the current thread if multithreaded.
+
    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
@@ -73,12 +78,15 @@ enum
    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.  */
+extern __const unsigned short int **__ctype_b_loc (void)
+     __attribute__ ((__const));
+extern __const __int32_t **__ctype_tolower_loc (void)
+     __attribute__ ((__const));
+extern __const __int32_t **__ctype_toupper_loc (void)
+     __attribute__ ((__const));
 
 #define __isctype(c, type) \
-  (__ctype_b[(int) (c)] & (unsigned short int) type)
+  ((*__ctype_b_loc ())[(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.  */
@@ -182,27 +190,27 @@ __exctype (_tolower);
 extern __inline int
 tolower (int __c) __THROW
 {
-  return __c >= -128 && __c < 256 ? __ctype_tolower[__c] : __c;
+  return __c >= -128 && __c < 256 ? (*__ctype_tolower_loc ())[__c] : __c;
 }
 
 extern __inline int
 toupper (int __c) __THROW
 {
-  return __c >= -128 && __c < 256 ? __ctype_toupper[__c] : __c;
+  return __c >= -128 && __c < 256 ? (*__ctype_toupper_loc ())[__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))
+#  define tolower(c)	__tobody (c, tolower, *__ctype_tolower_loc (), (c))
+#  define toupper(c)	__tobody (c, toupper, *__ctype_toupper_loc (), (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)])
+#  define _tolower(c)	((int) (*__ctype_tolower_loc ())[(int) (c)])
+#  define _toupper(c)	((int) (*__ctype_toupper_loc ())[(int) (c)])
 # endif
 
 #endif /* Not __NO_CTYPE.  */