summaryrefslogtreecommitdiffstats
path: root/lib/libc/locale/isctype.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2007-10-13 16:28:22 +0000
committerache <ache@FreeBSD.org>2007-10-13 16:28:22 +0000
commita5038f060de9f1cc50cf532f78541dfd901f10b8 (patch)
tree364de71872fe91708dda5fd7ffeb957967a6f749 /lib/libc/locale/isctype.c
parent5b067f00c53dea274158508c1867eedfa02afea8 (diff)
downloadFreeBSD-src-a5038f060de9f1cc50cf532f78541dfd901f10b8.zip
FreeBSD-src-a5038f060de9f1cc50cf532f78541dfd901f10b8.tar.gz
The problem is: currently our single byte ctype(3) functions are broken
for wide characters locales in the argument range >= 0x80 - they may return false positives. Example 1: for UTF-8 locale we currently have: iswspace(0xA0)==1 and isspace(0xA0)==1 (because iswspace() and isspace() are the same code) but must have iswspace(0xA0)==1 and isspace(0xA0)==0 (because there is no such character and all others in the range 0x80..0xff for the UTF-8 locale, it keeps ASCII only in the single byte range because our internal wchar_t representation for UTF-8 is UCS-4). Example 2: for all wide character locales isalpha(arg) when arg > 0xFF may return false positives (must be 0). (because iswalpha() and isalpha() are the same code) This change address this issue separating single byte and wide ctype and also fix iswascii() (currently iswascii() is broken for arguments > 0xFF). This change is 100% binary compatible with old binaries. Reviewied by: i18n@
Diffstat (limited to 'lib/libc/locale/isctype.c')
-rw-r--r--lib/libc/locale/isctype.c38
1 files changed, 19 insertions, 19 deletions
diff --git a/lib/libc/locale/isctype.c b/lib/libc/locale/isctype.c
index 13ac6c2..be1b091 100644
--- a/lib/libc/locale/isctype.c
+++ b/lib/libc/locale/isctype.c
@@ -48,7 +48,7 @@ int
digittoint(c)
int c;
{
- return (__maskrune(c, 0xFF));
+ return (__sbmaskrune(c, 0xFF));
}
#undef isalnum
@@ -56,7 +56,7 @@ int
isalnum(c)
int c;
{
- return (__istype(c, _CTYPE_A|_CTYPE_D));
+ return (__sbistype(c, _CTYPE_A|_CTYPE_D));
}
#undef isalpha
@@ -64,7 +64,7 @@ int
isalpha(c)
int c;
{
- return (__istype(c, _CTYPE_A));
+ return (__sbistype(c, _CTYPE_A));
}
#undef isascii
@@ -80,7 +80,7 @@ int
isblank(c)
int c;
{
- return (__istype(c, _CTYPE_B));
+ return (__sbistype(c, _CTYPE_B));
}
#undef iscntrl
@@ -88,7 +88,7 @@ int
iscntrl(c)
int c;
{
- return (__istype(c, _CTYPE_C));
+ return (__sbistype(c, _CTYPE_C));
}
#undef isdigit
@@ -104,7 +104,7 @@ int
isgraph(c)
int c;
{
- return (__istype(c, _CTYPE_G));
+ return (__sbistype(c, _CTYPE_G));
}
#undef ishexnumber
@@ -112,7 +112,7 @@ int
ishexnumber(c)
int c;
{
- return (__istype(c, _CTYPE_X));
+ return (__sbistype(c, _CTYPE_X));
}
#undef isideogram
@@ -120,7 +120,7 @@ int
isideogram(c)
int c;
{
- return (__istype(c, _CTYPE_I));
+ return (__sbistype(c, _CTYPE_I));
}
#undef islower
@@ -128,7 +128,7 @@ int
islower(c)
int c;
{
- return (__istype(c, _CTYPE_L));
+ return (__sbistype(c, _CTYPE_L));
}
#undef isnumber
@@ -136,7 +136,7 @@ int
isnumber(c)
int c;
{
- return (__istype(c, _CTYPE_D));
+ return (__sbistype(c, _CTYPE_D));
}
#undef isphonogram
@@ -144,7 +144,7 @@ int
isphonogram(c)
int c;
{
- return (__istype(c, _CTYPE_Q));
+ return (__sbistype(c, _CTYPE_Q));
}
#undef isprint
@@ -152,7 +152,7 @@ int
isprint(c)
int c;
{
- return (__istype(c, _CTYPE_R));
+ return (__sbistype(c, _CTYPE_R));
}
#undef ispunct
@@ -160,7 +160,7 @@ int
ispunct(c)
int c;
{
- return (__istype(c, _CTYPE_P));
+ return (__sbistype(c, _CTYPE_P));
}
#undef isrune
@@ -168,7 +168,7 @@ int
isrune(c)
int c;
{
- return (__istype(c, 0xFFFFFF00L));
+ return (__sbistype(c, 0xFFFFFF00L));
}
#undef isspace
@@ -176,7 +176,7 @@ int
isspace(c)
int c;
{
- return (__istype(c, _CTYPE_S));
+ return (__sbistype(c, _CTYPE_S));
}
#undef isspecial
@@ -184,7 +184,7 @@ int
isspecial(c)
int c;
{
- return (__istype(c, _CTYPE_T));
+ return (__sbistype(c, _CTYPE_T));
}
#undef isupper
@@ -192,7 +192,7 @@ int
isupper(c)
int c;
{
- return (__istype(c, _CTYPE_U));
+ return (__sbistype(c, _CTYPE_U));
}
#undef isxdigit
@@ -216,7 +216,7 @@ int
tolower(c)
int c;
{
- return (__tolower(c));
+ return (__sbtolower(c));
}
#undef toupper
@@ -224,6 +224,6 @@ int
toupper(c)
int c;
{
- return (__toupper(c));
+ return (__sbtoupper(c));
}
OpenPOWER on IntegriCloud