diff options
author | Roland McGrath <roland@gnu.org> | 2002-09-02 07:09:08 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-09-02 07:09:08 +0000 |
commit | cf684340ce723e2ec50e8f82d8c10947360518d2 (patch) | |
tree | 123ff19d7fbfabf234aee0e62a0753eba16827ea /include/ctype.h | |
parent | 4032add80a847ddff3dff9d85163fc119013b9e2 (diff) | |
download | glibc-cf684340ce723e2ec50e8f82d8c10947360518d2.zip glibc-cf684340ce723e2ec50e8f82d8c10947360518d2.tar.gz glibc-cf684340ce723e2ec50e8f82d8c10947360518d2.tar.bz2 |
* 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 'include/ctype.h')
-rw-r--r-- | include/ctype.h | 77 |
1 files changed, 48 insertions, 29 deletions
diff --git a/include/ctype.h b/include/ctype.h index b58306d..ca3c3dd 100644 --- a/include/ctype.h +++ b/include/ctype.h @@ -2,39 +2,58 @@ extern int __isctype (int __c, int __mask); -# 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 +/* 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 <bits/libc-tsd.h> + +# 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 <ctype/ctype.h> #endif /* ctype.h */ |