From cf684340ce723e2ec50e8f82d8c10947360518d2 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Mon, 2 Sep 2002 07:09:08 +0000 Subject: * 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. --- ctype/Versions | 3 +++ ctype/ctype-info.c | 56 ++++++++++++++++++++++++------------------------------ ctype/ctype.h | 28 +++++++++++++++++---------- 3 files changed, 46 insertions(+), 41 deletions(-) (limited to 'ctype') 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 #include +__libc_tsd_define (, CTYPE_B) +__libc_tsd_define (, CTYPE_TOLOWER) +__libc_tsd_define (, CTYPE_TOUPPER) + + +#include +#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 ) + 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. */ -- cgit 1.4.1