summaryrefslogtreecommitdiff
path: root/extra/locale
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-12-22 13:51:28 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-12-22 13:51:28 +0000
commit1ad544a2ade2d8adcebc20de065bfafd7cd507a5 (patch)
tree0372195a1a66e369609fd7c58f65989bb7a269ea /extra/locale
parent01b8804866ae879c1657f0eed3816755aaf6e243 (diff)
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)
Diffstat (limited to 'extra/locale')
-rw-r--r--extra/locale/Makefile.in3
-rw-r--r--extra/locale/gen_wc8bit.c2
-rw-r--r--extra/locale/gen_wctype.c78
3 files changed, 19 insertions, 64 deletions
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 <wchar.h>
#include <ctype.h>
-#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))