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. --- include/ctype.h | 77 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 29 deletions(-) (limited to 'include/ctype.h') diff --git a/include/ctype.h b/include/ctype.h index b58306dd28..ca3c3dd856 100644 --- a/include/ctype.h +++ b/include/ctype.h @@ -2,39 +2,58 @@ extern int __isctype (int __c, int __mask); -# 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 +/* These accessors are used by the optimized macros to find the + thread-local cache of ctype information from the current thread's + locale. For inside libc, define them as inlines 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" -# ifndef __NO_CTYPE -# undef __isctype -# define __isctype(c, type) \ - (((uint16_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_CLASS) + 128) \ - [(int) (c)] & (uint16_t) type) - -# undef tolower -# define tolower(c) \ - __tobody (c, tolower, \ - (uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOLOWER) + 128, \ - (c)) -# undef _tolower -# define _tolower(c) tolower (c) -# undef toupper -# define toupper(c) \ - __tobody (c, toupper, \ - (uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOUPPER) + 128, \ - (c)) -# undef _toupper -# define _toupper(c) toupper (c) - -# endif /* Not __NO_CTYPE. */ -# endif /* _LIBC_REENTRANT. */ +# include + +# ifndef CTYPE_EXTERN_INLINE /* Used by ctype/ctype-info.c, which see. */ +# define CTYPE_EXTERN_INLINE extern inline +# endif + +__libc_tsd_define (extern, CTYPE_B) +__libc_tsd_define (extern, CTYPE_TOUPPER) +__libc_tsd_define (extern, CTYPE_TOLOWER) + +CTYPE_EXTERN_INLINE const uint16_t ** __attribute__ ((const)) +__ctype_b_loc (void) +{ + const uint16_t **tablep = + (const uint16_t **) __libc_tsd_address (CTYPE_B); + if (__builtin_expect (*tablep == NULL, 0)) + *tablep = (const uint16_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_CLASS) + 128; + return tablep; +} + +CTYPE_EXTERN_INLINE const int32_t ** __attribute__ ((const)) +__ctype_toupper_loc (void) +{ + const int32_t **tablep = + (const int32_t **) __libc_tsd_address (CTYPE_TOUPPER); + if (__builtin_expect (*tablep == NULL, 0)) + *tablep = ((int32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOUPPER) + 128); + return tablep; +} + +CTYPE_EXTERN_INLINE const int32_t ** __attribute__ ((const)) +__ctype_tolower_loc (void) +{ + const int32_t **tablep = + (const int32_t **) __libc_tsd_address (CTYPE_TOLOWER); + if (__builtin_expect (*tablep == NULL, 0)) + *tablep = ((int32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOLOWER) + 128); + return tablep; +} + +# endif /* Not NOT_IN_libc. */ + +# include #endif /* ctype.h */ -- cgit v1.2.3