From 31c9f6f21147b3a9f25ca8beda029a64af5305f1 Mon Sep 17 00:00:00 2001 From: John Marino Date: Tue, 1 Sep 2015 13:39:38 +0200 Subject: [PATCH] libc: Redefine "number" ctype - no longer alias of "digit" FreeBSD extended ctypes to include numbers (e.g. isnumber()) but never actually implemented it. The isnumber() function was equivalent to the isdigit() function in every case. Now that DragonFly's ctype source files have number definitions, the number ctype can finally be implemented. It's given a new flag _CTYPE_N. The isalnum() and iswalnum() functions have been changed to use this flag rather than the _CTYPE_D digit flag. While isalnum(), isnumber(), and their wide equivalents now return different values in locale cases, the ishexnumber() and iswhexnumber() functions are unchanged. They are still aliases for isxdigit() and iswxdigit(). Also change ctype.h for isdigit and isxdigit to use sbistype like the other functions. The "isnumber()" will not work until a full world build is made. The reason is that localedef is modified, but it's a bootstrap tool, so the earlier version that does not support number ctype is still used in a quickworld build. --- include/ctype.h | 9 +++++---- include/wctype.h | 6 +++--- include/xlocale/_ctype.h | 4 ++-- lib/libc/locale/isctype.c | 4 ++-- lib/libc/locale/iswctype.c | 4 ++-- lib/libc/locale/table.c | 20 ++++++++++---------- lib/libc/locale/wctype.c | 4 +++- usr.bin/localedef/ctype.c | 2 +- 8 files changed, 28 insertions(+), 25 deletions(-) diff --git a/include/ctype.h b/include/ctype.h index 71e4a86283..965459fb16 100644 --- a/include/ctype.h +++ b/include/ctype.h @@ -58,6 +58,7 @@ #define _CTYPE_I 0x00080000L /* Ideogram */ #define _CTYPE_T 0x00100000L /* Special */ #define _CTYPE_Q 0x00200000L /* Phonogram */ +#define _CTYPE_N 0x00400000L /* Number (superset of digit) */ #define _CTYPE_SW0 0x20000000L /* 0 width character */ #define _CTYPE_SW1 0x40000000L /* 1 width character */ #define _CTYPE_SW2 0x80000000L /* 2 width character */ @@ -223,17 +224,17 @@ int isspecial(int); __END_DECLS #ifndef __cplusplus -#define isalnum(c) __sbistype((c), _CTYPE_A|_CTYPE_D) +#define isalnum(c) __sbistype((c), _CTYPE_A|_CTYPE_N) #define isalpha(c) __sbistype((c), _CTYPE_A) #define iscntrl(c) __sbistype((c), _CTYPE_C) -#define isdigit(c) __isctype((c), _CTYPE_D) /* ANSI -- locale independent */ +#define isdigit(c) __sbistype((c), _CTYPE_D) #define isgraph(c) __sbistype((c), _CTYPE_G) #define islower(c) __sbistype((c), _CTYPE_L) #define isprint(c) __sbistype((c), _CTYPE_R) #define ispunct(c) __sbistype((c), _CTYPE_P) #define isspace(c) __sbistype((c), _CTYPE_S) #define isupper(c) __sbistype((c), _CTYPE_U) -#define isxdigit(c) __isctype((c), _CTYPE_X) /* ANSI -- locale independent */ +#define isxdigit(c) __sbistype((c), _CTYPE_X) #define tolower(c) __sbtolower(c) #define toupper(c) __sbtoupper(c) #endif /* !__cplusplus */ @@ -264,7 +265,7 @@ __END_DECLS #define digittoint(c) __sbmaskrune((c), 0xFF) #define ishexnumber(c) __sbistype((c), _CTYPE_X) #define isideogram(c) __sbistype((c), _CTYPE_I) -#define isnumber(c) __sbistype((c), _CTYPE_D) +#define isnumber(c) __sbistype((c), _CTYPE_N) #define isphonogram(c) __sbistype((c), _CTYPE_Q) #define isrune(c) __sbistype((c), 0xFFFFFF00L) #define isspecial(c) __sbistype((c), _CTYPE_T) diff --git a/include/wctype.h b/include/wctype.h index aaffd76a33..6e87bcb2f1 100644 --- a/include/wctype.h +++ b/include/wctype.h @@ -95,7 +95,7 @@ wint_t nextwctype(wint_t, wctype_t); __END_DECLS #ifndef __cplusplus -#define iswalnum(wc) __istype((wc), _CTYPE_A|_CTYPE_D) +#define iswalnum(wc) __istype((wc), _CTYPE_A|_CTYPE_N) #define iswalpha(wc) __istype((wc), _CTYPE_A) #define iswblank(wc) __istype((wc), _CTYPE_B) #define iswcntrl(wc) __istype((wc), _CTYPE_C) @@ -113,9 +113,9 @@ __END_DECLS #if __BSD_VISIBLE #define iswascii(wc) (((wc) & ~0x7F) == 0) -#define iswhexnumber(wc) __istype((wc), _CTYPE_X) +#define iswhexnumber(wc) __istype((wc), _CTYPE_X) /* alias of iswxdigit */ #define iswideogram(wc) __istype((wc), _CTYPE_I) -#define iswnumber(wc) __istype((wc), _CTYPE_D) +#define iswnumber(wc) __istype((wc), _CTYPE_N) #define iswphonogram(wc) __istype((wc), _CTYPE_Q) #define iswrune(wc) __istype((wc), 0xFFFFFF00L) #define iswspecial(wc) __istype((wc), _CTYPE_T) diff --git a/include/xlocale/_ctype.h b/include/xlocale/_ctype.h index 3d4857eb49..8970ece2de 100644 --- a/include/xlocale/_ctype.h +++ b/include/xlocale/_ctype.h @@ -119,7 +119,7 @@ __sbistype_l(__ct_rune_t __c, unsigned long __f, locale_t __loc) { return __sbistype_l(__c, __cat, __l); } #endif -XLOCALE_ISCTYPE(alnum, _CTYPE_A|_CTYPE_D) +XLOCALE_ISCTYPE(alnum, _CTYPE_A|_CTYPE_N) XLOCALE_ISCTYPE(alpha, _CTYPE_A) XLOCALE_ISCTYPE(blank, _CTYPE_B) XLOCALE_ISCTYPE(cntrl, _CTYPE_C) @@ -128,7 +128,7 @@ XLOCALE_ISCTYPE(graph, _CTYPE_G) XLOCALE_ISCTYPE(hexnumber, _CTYPE_X) XLOCALE_ISCTYPE(ideogram, _CTYPE_I) XLOCALE_ISCTYPE(lower, _CTYPE_L) -XLOCALE_ISCTYPE(number, _CTYPE_D) +XLOCALE_ISCTYPE(number, _CTYPE_N) XLOCALE_ISCTYPE(phonogram, _CTYPE_Q) XLOCALE_ISCTYPE(print, _CTYPE_R) XLOCALE_ISCTYPE(punct, _CTYPE_P) diff --git a/lib/libc/locale/isctype.c b/lib/libc/locale/isctype.c index d314d2cea2..7551fd7b70 100644 --- a/lib/libc/locale/isctype.c +++ b/lib/libc/locale/isctype.c @@ -52,7 +52,7 @@ digittoint(int c) int isalnum(int c) { - return (__sbistype(c, _CTYPE_A|_CTYPE_D)); + return (__sbistype(c, _CTYPE_A|_CTYPE_N)); } #undef isalpha @@ -122,7 +122,7 @@ islower(int c) int isnumber(int c) { - return (__sbistype(c, _CTYPE_D)); + return (__sbistype(c, _CTYPE_N)); } #undef isphonogram diff --git a/lib/libc/locale/iswctype.c b/lib/libc/locale/iswctype.c index 3077522c90..8b1c1eff4d 100644 --- a/lib/libc/locale/iswctype.c +++ b/lib/libc/locale/iswctype.c @@ -44,7 +44,7 @@ int iswalnum(wint_t wc) { - return (__istype(wc, _CTYPE_A|_CTYPE_D)); + return (__istype(wc, _CTYPE_A|_CTYPE_N)); } #undef iswalpha @@ -114,7 +114,7 @@ iswlower(wint_t wc) int iswnumber(wint_t wc) { - return (__istype(wc, _CTYPE_D)); + return (__istype(wc, _CTYPE_N)); } #undef iswphonogram diff --git a/lib/libc/locale/table.c b/lib/libc/locale/table.c index 151a1b900c..a261602a8c 100644 --- a/lib/libc/locale/table.c +++ b/lib/libc/locale/table.c @@ -99,16 +99,16 @@ const _RuneLocale _DefaultRuneLocale = { _CTYPE_P|_CTYPE_R|_CTYPE_G, _CTYPE_P|_CTYPE_R|_CTYPE_G, _CTYPE_P|_CTYPE_R|_CTYPE_G, - /*30*/ _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|0, - _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|1, - _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|2, - _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|3, - _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|4, - _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|5, - _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|6, - _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|7, - /*38*/ _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|8, - _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|9, + /*30*/ _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|0, + _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|1, + _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|2, + _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|3, + _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|4, + _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|5, + _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|6, + _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|7, + /*38*/ _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|8, + _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|9, _CTYPE_P|_CTYPE_R|_CTYPE_G, _CTYPE_P|_CTYPE_R|_CTYPE_G, _CTYPE_P|_CTYPE_R|_CTYPE_G, diff --git a/lib/libc/locale/wctype.c b/lib/libc/locale/wctype.c index ccdb33fa16..81bec2ffff 100644 --- a/lib/libc/locale/wctype.c +++ b/lib/libc/locale/wctype.c @@ -73,9 +73,10 @@ wctype_l(const char *property, locale_t locale) "ideogram\0" /* BSD extension */ "special\0" /* BSD extension */ "phonogram\0" /* BSD extension */ + "number\0" /* BSD extension */ "rune\0"; /* BSD extension */ static const wctype_t propmasks[] = { - _CTYPE_A|_CTYPE_D, + _CTYPE_A|_CTYPE_N, _CTYPE_A, _CTYPE_B, _CTYPE_C, @@ -90,6 +91,7 @@ wctype_l(const char *property, locale_t locale) _CTYPE_I, _CTYPE_T, _CTYPE_Q, + _CTYPE_N, 0xFFFFFF00L }; size_t len1, len2; diff --git a/usr.bin/localedef/ctype.c b/usr.bin/localedef/ctype.c index 803a5f3345..20396c7176 100644 --- a/usr.bin/localedef/ctype.c +++ b/usr.bin/localedef/ctype.c @@ -62,7 +62,7 @@ #define _E1 _CTYPE_Q #define _E2 _CTYPE_I #define _E3 0 -#define _E4 0 +#define _E4 _CTYPE_N #define _E5 _CTYPE_T static avl_tree_t ctypes; -- 2.41.0