From d20fec5d65b16c42b391d1e95df73b3a8366fe16 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sun, 1 Sep 2002 20:30:19 +0000 Subject: [PATCH] Update. * ctype/ctype.h: Undo the patch before the last one. Put back the macro definitions for the standard functions to access the classification and mapping arrays. * include/ctype.h: Partly revert last patch. Move the macro definitions for the exported functions back to the public header. #undef all the macros defined here before redefining. * ctype/ctype-info.c: Revert last patch. * locale/lc-ctype.c: Revert last patch. --- ChangeLog | 9 ++++++++ ctype/ctype-info.c | 48 +++++++++++++++++++++++--------------- ctype/ctype.h | 57 ++++++++++++++++++++++++++++++++++++++++++++++ include/ctype.h | 25 ++++++++------------ locale/lc-ctype.c | 48 +++++++++++++++++++------------------- 5 files changed, 128 insertions(+), 59 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3c59bf7321..8e78415417 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2002-09-01 Ulrich Drepper + * ctype/ctype.h: Undo the patch before the last one. Put back the + macro definitions for the standard functions to access the + classification and mapping arrays. + * include/ctype.h: Partly revert last patch. Move the macro + definitions for the exported functions back to the public header. + #undef all the macros defined here before redefining. + * ctype/ctype-info.c: Revert last patch. + * locale/lc-ctype.c: Revert last patch. + * ctype/Makefile (routines): Add isctype. * ctype/Versions (libc): Export isctype and __isctype for GLIBC_2.3. * ctype/ctype.h: Add declaration of isctype. diff --git a/ctype/ctype-info.c b/ctype/ctype-info.c index 033d1b70cb..d29edb7171 100644 --- a/ctype/ctype-info.c +++ b/ctype/ctype-info.c @@ -16,9 +16,6 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include -#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3) - #include #include @@ -39,21 +36,36 @@ 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_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 +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); diff --git a/ctype/ctype.h b/ctype/ctype.h index 64f5e4b7a0..28aec6bc41 100644 --- a/ctype/ctype.h +++ b/ctype/ctype.h @@ -62,6 +62,24 @@ enum }; #endif /* ! _ISbit */ +/* 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_b; /* Characteristics. */ +extern __const __int32_t *__ctype_tolower; /* Case conversions. */ +extern __const __int32_t *__ctype_toupper; /* Case conversions. */ + +#define __isctype(c, type) \ + (__ctype_b[(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. */ @@ -144,10 +162,49 @@ __exctype (_tolower); __res; })) #if !defined __NO_CTYPE && !defined __cplusplus +# define isalnum(c) __isctype((c), _ISalnum) +# define isalpha(c) __isctype((c), _ISalpha) +# define iscntrl(c) __isctype((c), _IScntrl) +# define isdigit(c) __isctype((c), _ISdigit) +# define islower(c) __isctype((c), _ISlower) +# define isgraph(c) __isctype((c), _ISgraph) +# define isprint(c) __isctype((c), _ISprint) +# define ispunct(c) __isctype((c), _ISpunct) +# define isspace(c) __isctype((c), _ISspace) +# define isupper(c) __isctype((c), _ISupper) +# define isxdigit(c) __isctype((c), _ISxdigit) + +# ifdef __USE_ISOC99 +# define isblank(c) __isctype((c), _ISblank) +# endif + +# ifdef __USE_EXTERN_INLINES +extern __inline int +tolower (int __c) __THROW +{ + return __c >= -128 && __c < 256 ? __ctype_tolower[__c] : __c; +} + +extern __inline int +toupper (int __c) __THROW +{ + return __c >= -128 && __c < 256 ? __ctype_toupper[__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)) +# 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)]) # endif + #endif /* Not __NO_CTYPE. */ diff --git a/include/ctype.h b/include/ctype.h index 812424aff9..b58306dd28 100644 --- a/include/ctype.h +++ b/include/ctype.h @@ -1,9 +1,9 @@ #ifndef _CTYPE_H -# include - 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 @@ -13,32 +13,25 @@ extern int __isctype (int __c, int __mask); NL_CURRENT_INDIRECT. */ # include "../locale/localeinfo.h" -# define __isctype(c, type) \ +# ifndef __NO_CTYPE +# undef __isctype +# define __isctype(c, type) \ (((uint16_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_CLASS) + 128) \ [(int) (c)] & (uint16_t) type) -# ifndef __NO_CTYPE -# define isalnum(c) __isctype((c), _ISalnum) -# define isalpha(c) __isctype((c), _ISalpha) -# define iscntrl(c) __isctype((c), _IScntrl) -# define isdigit(c) __isctype((c), _ISdigit) -# define islower(c) __isctype((c), _ISlower) -# define isgraph(c) __isctype((c), _ISgraph) -# define isprint(c) __isctype((c), _ISprint) -# define ispunct(c) __isctype((c), _ISpunct) -# define isspace(c) __isctype((c), _ISspace) -# define isupper(c) __isctype((c), _ISupper) -# define isxdigit(c) __isctype((c), _ISxdigit) -# define isblank(c) __isctype((c), _ISblank) +# 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. */ diff --git a/locale/lc-ctype.c b/locale/lc-ctype.c index 69414020b8..59ff7019aa 100644 --- a/locale/lc-ctype.c +++ b/locale/lc-ctype.c @@ -34,8 +34,7 @@ _NL_CURRENT_DEFINE (LC_CTYPE); void _nl_postload_ctype (void) { -#include -#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3) + const struct locale_data *data = _NL_CURRENT_DATA (LC_CTYPE); #define paste(a,b) paste1(a,b) #define paste1(a,b) a##b @@ -43,30 +42,29 @@ _nl_postload_ctype (void) #define current(type,x,offset) \ ((const type *) _NL_CURRENT (LC_CTYPE, paste(_NL_CTYPE_,x)) + offset) -/* These are defined in ctype-info.c. - The declarations here must match those in localeinfo.h. + 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; - 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. */ + size_t offset, cnt; - extern const uint32_t *__ctype32_old_b; - extern const uint32_t *__ctype32_old_toupper; - extern const uint32_t *__ctype32_old_tolower; + __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); - __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 + 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); }