From cf578c75a521e1f35a9f07ca04c0cd678209c79f Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sat, 27 Dec 2008 10:19:19 +0000 Subject: ctype: remove some trivial macros from ctype.h; remove __tolower and __toupper (they existed only in SOME configs!); remove usages of _tolower (some of them clearly buggy) from uclibc code; add a few more -U options to unifdef pass over installed headers; document it on docs/wchar_and_locale.txt text data bss dec hex filename - 514963 2727 15396 533086 8225e lib/libuClibc-0.9.30-svn.so + 514888 2727 15396 533011 82213 lib/libuClibc-0.9.30-svn.so --- docs/wchar_and_locale.txt | 79 +++++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 40 deletions(-) (limited to 'docs') diff --git a/docs/wchar_and_locale.txt b/docs/wchar_and_locale.txt index 67605e0bc..976c9aaad 100644 --- a/docs/wchar_and_locale.txt +++ b/docs/wchar_and_locale.txt @@ -72,43 +72,42 @@ __WCHAR_REPLACEMENT_CHAR Actual ctype macros are a bloody mess! -ctype.h -... -... -#define __isctype(c, type) \ - ((__UCLIBC_CTYPE_B)[(int) (c)] & (__ctype_mask_t) type) - -#define __isascii(c) (((c) & ~0x7f) == 0) /* If C is a 7 bit value. */ -#define __toascii(c) ((c) & 0x7f) /* Mask off high bits. */ -#define __isdigit_char(C) (((unsigned char)((C) - '0')) <= 9) -#define __isdigit_int(C) (((unsigned int)((C) - '0')) <= 9) - -# define isalnum(c) __isctype((c), _ISalnum) -# define isalpha(c) __isctype((c), _ISalpha) - -# if __GNUC__ >= 2 && defined __OPTIMIZE__ && !defined __cplusplus -# define tolower(c) __tobody (c, tolower, __UCLIBC_CTYPE_TOLOWER, (c)) -# define toupper(c) __tobody (c, toupper, __UCLIBC_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) (__UCLIBC_CTYPE_TOLOWER)[(int) (c)]) -# define _toupper(c) ((int) (__UCLIBC_CTYPE_TOUPPER)[(int) (c)]) -# endif -... -... - -bits/uClibc_ctype.h -... -... -#define __tolower(c) __body(tolower,c) -#define __toupper(c) __body(toupper,c) - -#define _toupper(c) ((c) ^ 0x20) -#define _tolower(c) ((c) | 0x20) -... -... - -WTF?! We have (at least) TWO DIFFERENT _tolower's? +__C_isspace(c), __C_tolower(c) et al + Defined in bits/uClibc_ctype.h. Non-locale-aware, unsafe + wrt multiple-evaluation, macros. Return unsigned int. + +__isspace(c), __tolower(c) et al + Defined in bits/uClibc_ctype.h. Non-locale-aware, + but safe wrt multiple-evaluation, macros. Return int. + +__isdigit_char, __isdigit_int + Visible only to uclibc code. ((unsigned char/int)((c) - '0') <= 9). + +_tolower(c), _toupper(c) + Even more unsafe versions (they just do | 0x20 or ^ 0x20). Sheesh. + They are mandated by POSIX so we must have them defined, + but I removed all uses in uclibc code. Half of them were buggy. + +isspace(c), tolower(c) et al + Declared as int isXXXX(int c) in bits/uClibc_ctype.h. Then, + if not C++ compile, defined as macros to __usXXXX(c) + +bits/uClibc_ctype.h is included by ctype.h only if !__UCLIBC_HAS_CTYPE_TABLES__. + +Otherwise, ctype.h declares int isXXXX(int c) functions, +then defines macros for isXXXX(c), __isXXX(c), toXXXX(c). +Surprisingly, there are no __toXXXX(c), but if __USE_EXTERN_INLINES, +there are inlines (yes, not macros!) for toXXXX(c) functions, +so those may have both inlines and macros!). +It also defines "unsafe" _toXXXX macros. + +All in all, __isXXXX(c) and __toXXXXX(c) seem to be useless, +they are full equivalents to non-underscored versions. +Remove? + +Macro-ization of isXXX(c) for __UCLIBC_HAS_XLOCALE__ case is problematic: +it is done by indexing: __UCLIBC_CTYPE_B[c], and in __UCLIBC_HAS_XLOCALE__ +case __UCLIBC_CTYPE_B is doing a __ctype_b_loc() call! We do not save +function call! Thus, why not have dedicated optimized functions +for each isXXXX() instead? Looking deeper, __ctype_b_loc() may have +another lever of function calls inside! What a mess... -- cgit v1.2.3