diff options
author | ache <ache@FreeBSD.org> | 2007-10-13 16:28:22 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 2007-10-13 16:28:22 +0000 |
commit | a5038f060de9f1cc50cf532f78541dfd901f10b8 (patch) | |
tree | 364de71872fe91708dda5fd7ffeb957967a6f749 /lib/libc/locale/utf8.c | |
parent | 5b067f00c53dea274158508c1867eedfa02afea8 (diff) | |
download | FreeBSD-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/utf8.c')
-rw-r--r-- | lib/libc/locale/utf8.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/lib/libc/locale/utf8.c b/lib/libc/locale/utf8.c index e467fc0..086a1e4 100644 --- a/lib/libc/locale/utf8.c +++ b/lib/libc/locale/utf8.c @@ -35,6 +35,8 @@ __FBSDID("$FreeBSD$"); #include <wchar.h> #include "mblocal.h" +extern int __mb_sb_limit; + static size_t _UTF8_mbrtowc(wchar_t * __restrict, const char * __restrict, size_t, mbstate_t * __restrict); static int _UTF8_mbsinit(const mbstate_t *); @@ -63,6 +65,7 @@ _UTF8_init(_RuneLocale *rl) __wcsnrtombs = _UTF8_wcsnrtombs; _CurrentRuneLocale = rl; __mb_cur_max = 6; + __mb_sb_limit = 128; return (0); } |