From 1ad544a2ade2d8adcebc20de065bfafd7cd507a5 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Mon, 22 Dec 2008 13:51:28 +0000 Subject: UCLIBC_CTYPE_HEADER define is removed, as it always equal to "include/bits/uClibc_ctype.h" __CTYPE_unclassified and other similar __CTYPE_xxxx constants are moved to separate include file, bits/uClibc_charclass.h Duplicate declaration of these constants is removed from libc/misc/wctype/_wctype.c Ugly re-inclusion trick in extra/locale/gen_wctype.c deleted Large ifdefed-out chunk in extra/locale/gen_wctype.c removed Move __CTYPE_isalnum() etc macros from uClibc_ctype.h to their single user, extra/locale/gen_wctype.c (can be simplified further) Overall, no code changes (verified with objdump) --- extra/locale/Makefile.in | 3 +- extra/locale/gen_wc8bit.c | 2 +- extra/locale/gen_wctype.c | 78 +++++++++++------------------------------------ 3 files changed, 19 insertions(+), 64 deletions(-) (limited to 'extra') diff --git a/extra/locale/Makefile.in b/extra/locale/Makefile.in index b4801b04b..66e14fba9 100644 --- a/extra/locale/Makefile.in +++ b/extra/locale/Makefile.in @@ -15,8 +15,7 @@ LOCALE_DATA_FILENAME := uClibc-locale-20081111-$(ARCH_NATIVE_BIT)-$(if $(ARCH_LI BUILD_CFLAGS-locale-common := \ -D__UCLIBC_GEN_LOCALE \ - -I$(top_builddir) \ - -DUCLIBC_CTYPE_HEADER='"include/bits/uClibc_ctype.h"' + -I$(top_builddir) BUILD_CFLAGS-gen_wc8bit := $(BUILD_CFLAGS-locale-common) -DCTYPE_PACKED=1 BUILD_CFLAGS-gen_wctype := $(BUILD_CFLAGS-locale-common) diff --git a/extra/locale/gen_wc8bit.c b/extra/locale/gen_wc8bit.c index 2fdcb6881..418a1ac9d 100644 --- a/extra/locale/gen_wc8bit.c +++ b/extra/locale/gen_wc8bit.c @@ -18,7 +18,7 @@ #ifndef _WCTYPE_H #define _WCTYPE_H #endif -#include UCLIBC_CTYPE_HEADER +#include "include/bits/uClibc_ctype.h" /* #define CTYPE_PACKED */ diff --git a/extra/locale/gen_wctype.c b/extra/locale/gen_wctype.c index a0542e609..978dbe836 100644 --- a/extra/locale/gen_wctype.c +++ b/extra/locale/gen_wctype.c @@ -14,13 +14,7 @@ #include #include -#ifndef _CTYPE_H -#define _CTYPE_H -#endif -#ifndef _WCTYPE_H -#define _WCTYPE_H -#endif -#include UCLIBC_CTYPE_HEADER +#include "include/bits/uClibc_charclass.h" /* 0x9 : space blank */ /* 0xa : space */ @@ -62,7 +56,6 @@ /* typecount[15] = 0 empty_slot */ - /* Set to #if 0 to restrict wchars to 16 bits. */ #if 1 #define RANGE 0x2ffffUL @@ -72,59 +65,22 @@ #define RANGE 0xffffUL /* Restrict for 16-bit wchar_t... */ #endif -#if 0 -/* Classification codes. */ - -static const char *typename[] = { - "C_unclassified", - "C_alpha_nonupper_nonlower", - "C_alpha_lower", - "C_alpha_upper_lower", - "C_alpha_upper", - "C_digit", - "C_punct", - "C_graph", - "C_print_space_nonblank", - "C_print_space_blank", - "C_space_nonblank_noncntrl", - "C_space_blank_noncntrl", - "C_cntrl_space_nonblank", - "C_cntrl_space_blank", - "C_cntrl_nonspace", - "empty_slot" -}; -#endif - -#if 0 -/* Taking advantage of the C99 mutual-exclusion guarantees for the various - * (w)ctype classes, including the descriptions of printing and control - * (w)chars, we can place each in one of the following mutually-exlusive - * subsets. Since there are less than 16, we can store the data for - * each (w)chars in a nibble. In contrast, glibc uses an unsigned int - * per (w)char, with one bit flag for each is* type. While this allows - * a simple '&' operation to determine the type vs. a range test and a - * little special handling for the "blank" and "xdigit" types in my - * approach, it also uses 8 times the space for the tables on the typical - * 32-bit archs we supported.*/ -enum { - __CTYPE_unclassified = 0, - __CTYPE_alpha_nonupper_nonlower, - __CTYPE_alpha_lower, - __CTYPE_alpha_upper_lower, - __CTYPE_alpha_upper, - __CTYPE_digit, - __CTYPE_punct, - __CTYPE_graph, - __CTYPE_print_space_nonblank, - __CTYPE_print_space_blank, - __CTYPE_space_nonblank_noncntrl, - __CTYPE_space_blank_noncntrl, - __CTYPE_cntrl_space_nonblank, - __CTYPE_cntrl_space_blank, - __CTYPE_cntrl_nonspace, -}; -#endif - +/* Some macros that test for various (w)ctype classes when passed one of the + * designator values enumerated above. */ +#define __CTYPE_isalnum(D) ((unsigned int)(D-1) <= (__CTYPE_digit-1)) +#define __CTYPE_isalpha(D) ((unsigned int)(D-1) <= (__CTYPE_alpha_upper-1)) +#define __CTYPE_isblank(D) \ + ((((unsigned int)(D - __CTYPE_print_space_nonblank)) <= 5) && (D & 1)) +#define __CTYPE_iscntrl(D) (((unsigned int)(D - __CTYPE_cntrl_space_nonblank)) <= 2) +#define __CTYPE_isdigit(D) (D == __CTYPE_digit) +#define __CTYPE_isgraph(D) ((unsigned int)(D-1) <= (__CTYPE_graph-1)) +#define __CTYPE_islower(D) (((unsigned int)(D - __CTYPE_alpha_lower)) <= 1) +#define __CTYPE_isprint(D) ((unsigned int)(D-1) <= (__CTYPE_print_space_blank-1)) +#define __CTYPE_ispunct(D) (D == __CTYPE_punct) +#define __CTYPE_isspace(D) (((unsigned int)(D - __CTYPE_print_space_nonblank)) <= 5) +#define __CTYPE_isupper(D) (((unsigned int)(D - __CTYPE_alpha_upper_lower)) <= 1) +/* #define __CTYPE_isxdigit(D) -- isxdigit is untestable this way. + * But that's ok as isxdigit() (and isdigit() too) are locale-invariant. */ #define __CTYPE_isxdigit(D,X) \ (__CTYPE_isdigit(D) || (((unsigned int)(((X)|0x20) - 'a')) <= 5)) -- cgit v1.2.3