Hi,
here's an updated version.
1) en_US.UTF-8.src updates from FreeBSD
2) wcwidth() changed to use the same code as iswprint()
* maybe just use iswprint() itself?
3) _RUNETYPE_SW0 changed to be !0 (and match FreeBSD). 0 value is used in
mklocale to perform additional checks required for MAPLOWER and
MAPUPPER, but not SWIDTHx.
--- share/locale/ctype/en_US.UTF-8.src Wed Jan 5 12:37:22 2011
+++ share/locale/ctype/en_US.UTF-8.src Wed Jan 5 09:47:56 2011
@@ -491,9 +491,9 @@
* U+0300 - U+036F : Combining Diacritical Marks
*/
-GRAPH 0x0300 - 0x034f 0x0360 - 0x036f
-PRINT 0x0300 - 0x034f 0x0360 - 0x036f
-SWIDTH1 0x0300 - 0x034f 0x0360 - 0x036f
+GRAPH 0x0300 - 0x034e 0x0350 - 0x036f
+PRINT 0x0300 - 0x034e 0x0350 - 0x036f
+SWIDTH0 0x0300 - 0x034e 0x0350 - 0x036f
MAPUPPER < 0x0345 0x0399 >
@@ -583,7 +583,7 @@
LOWER 0x04c8 0x04ca 0x04cc 0x04ce 0x04d1 0x04d3 0x04d5
LOWER 0x04d7 0x04d9 0x04db 0x04dd 0x04df 0x04e1 0x04e3
LOWER 0x04e5 0x04e7 0x04e9 0x04eb 0x04ed 0x04ef 0x04f1
-LOWER 0x04f3 0x04f5 0x04f9
+LOWER 0x04f3 0x04f5 0x04f7 0x04f9
PUNCT 0x0482
UPPER 0x0400 - 0x042f 0x0460 0x0462 0x0464 0x0466 0x0468
UPPER 0x046a 0x046c 0x046e 0x0470 0x0472 0x0474 0x0476
@@ -595,9 +595,10 @@
UPPER 0x04c5 0x04c7 0x04c9 0x04cb 0x04cd 0x04d0 0x04d2
UPPER 0x04d4 0x04d6 0x04d8 0x04da 0x04dc 0x04de 0x04e0
UPPER 0x04e2 0x04e4 0x04e6 0x04e8 0x04ea 0x04ec 0x04ee
-UPPER 0x04f0 0x04f2 0x04f4 0x04f8
-PRINT 0x0400 - 0x0486 0x0488 - 0x04ce 0x04d0 - 0x04f5 0x04f8 0x04f9
-SWIDTH1 0x0400 - 0x0486 0x0488 - 0x04ce 0x04d0 - 0x04f5 0x04f8 0x04f9
+UPPER 0x04f0 0x04f2 0x04f4 0x04f6 0x04f8
+PRINT 0x0400 - 0x0486 0x0488 - 0x04ce 0x04d0 - 0x04f9
+SWIDTH0 0x0483 - 0x0486 0x0488 - 0x0489
+SWIDTH1 0x0400 - 0x0482 0x048a - 0x04ce 0x04d0 - 0x04f9
MAPUPPER < 0x0430 - 0x044f : 0x0410 >
MAPUPPER < 0x0450 - 0x045f : 0x0400 >
@@ -671,6 +672,7 @@
MAPUPPER < 0x04f1 0x04f0 >
MAPUPPER < 0x04f3 0x04f2 >
MAPUPPER < 0x04f5 0x04f4 >
+MAPUPPER < 0x04f7 0x04f6 >
MAPUPPER < 0x04f9 0x04f8 >
MAPLOWER < 0x0400 - 0x040f : 0x0450 >
MAPLOWER < 0x0410 - 0x042f : 0x0430 >
@@ -744,6 +746,7 @@
MAPLOWER < 0x04f0 0x04f1 >
MAPLOWER < 0x04f2 0x04f3 >
MAPLOWER < 0x04f4 0x04f5 >
+MAPLOWER < 0x04f6 0x04f7 >
MAPLOWER < 0x04f8 0x04f9 >
@@ -1052,7 +1055,8 @@
GRAPH 0x0e01 - 0x0e3a 0x0e3f - 0x0e5b
PUNCT 0x0e3f 0x0e4f 0x0e5a 0x0e5b
PRINT 0x0e01 - 0x0e3a 0x0e3f - 0x0e5b
-SWIDTH1 0x0e01 - 0x0e3a 0x0e3f - 0x0e5b
+SWIDTH0 0x0e31 0x0e34 - 0x0e3a 0x0e47 - 0x0e4e
+SWIDTH1 0x0e01 - 0x0e30 0x0e32 - 0x0e33 0x0e3f - 0x0e46 0x0e4f - 0x0e5b
TODIGIT < 0x0e50 - 0x0e59 : 0x0000 >
@@ -1283,7 +1287,15 @@
TODIGIT < 0x1810 - 0x1819 : 0x0000 >
+/*
+ * U+1DC0 - U+1DFF : Combining Diacritical Marks Supplement
+ */
+GRAPH 0x1DC0 - 0x1DC3
+PRINT 0x1DC0 - 0x1DC3
+SWIDTH0 0x1DC0 - 0x1DC3
+
+
/*
* U+1E00 - U+1EFF : Latin Extended Additional
*/
@@ -1672,7 +1684,8 @@
BLANK 0x2000 - 0x200b 0x202f 0x205f
PRINT 0x2000 - 0x200b 0x2010 - 0x2029 0x202f - 0x2052 0x2057
PRINT 0x205f
-SWIDTH1 0x2000 - 0x200b 0x2010 - 0x2029 0x202f - 0x2052 0x2057
+SWIDTH1 0x2000 - 0x200a 0x2010 - 0x2029 0x202f - 0x2052 0x2057
+SWIDTH0 0x200b - 0x200d
SWIDTH1 0x205f
@@ -1707,9 +1720,9 @@
* U+20D0 - U+20FF : Combining Diacritical Marks for Symbols
*/
-GRAPH 0x20d0 - 0x20ea
-PRINT 0x20d0 - 0x20ea
-SWIDTH1 0x20d0 - 0x20ea
+GRAPH 0x20d0 - 0x20eb
+PRINT 0x20d0 - 0x20eb
+SWIDTH0 0x20d0 - 0x20eb
/*
@@ -1987,7 +2000,8 @@
PUNCT 0x309b 0x309c
PRINT 0x3041 - 0x3096 0x3099 - 0x309f
PHONOGRAM 0x3041 - 0x3096 0x309f
-SWIDTH2 0x3041 - 0x3096 0x3099 - 0x309f
+SWIDTH0 0x3099 - 0x309a
+SWIDTH2 0x3041 - 0x3096 0x309b - 0x309f
/*
@@ -2211,7 +2225,7 @@
GRAPH 0xfe20 - 0xfe23
PRINT 0xfe20 - 0xfe23
-SWIDTH1 0xfe20 - 0xfe23
+SWIDTH0 0xfe20 - 0xfe23
/*
@@ -2333,8 +2347,13 @@
GRAPH 0x1d100 - 0x1d126 0x1d12a - 0x1d172 0x1d17b - 0x1d1dd
PUNCT 0x1d100 - 0x1d126 0x1d12a - 0x1d164 0x1d16a - 0x1d16c
PUNCT 0x1d183 0x1d184 0x1d18c - 0x1d1a9 0x1d1ae - 0x1d1dd
-PRINT 0x1d100 - 0x1d126 0x1d12a - 0x1d172 0x1d17b - 0x1d1dd
-SWIDTH1 0x1d100 - 0x1d126 0x1d12a - 0x1d172 0x1d17b - 0x1d1dd
+PRINT 0x1d100 - 0x1d126 0x1d12a - 0x1d158 0x1d15a - 0x1d172
+PRINT 0x1d17b - 0x1d1dd
+SWIDTH0 0x1d165 - 0x1d169 0x1d16d - 0x1d172 0x1d17b - 0x1d182
+SWIDTH0 0x1d185 - 0x1d18b 0x1d1aa - 0x1d1ad
+SWIDTH1 0x1d100 - 0x1d126 0x1d12a - 0x1d158 0x1d15a - 0x1d164
+SWIDTH1 0x1d16a - 0x1d16c 0x1d183 0x1d184 0x1d18c - 0x1d1a9
+SWIDTH1 0x1d1ae - 0x1d1dd
/*
--- lib/libc/locale/iswctype.c.orig Tue Jan 4 23:12:23 2011
+++ lib/libc/locale/iswctype.c Wed Jan 5 10:02:36 2011
@@ -170,7 +170,9 @@
int
wcwidth(wchar_t c)
{
- return (((unsigned)__runetype_w(c) & _CTYPE_SWM) >> _CTYPE_SWS);
+ if (__isctype_w((c), _CTYPE_R))
+ return (((unsigned)__runetype_w(c) & _CTYPE_SWM) >> _CTYPE_SWS);
+ return -1;
}
wctrans_t
--- lib/libc/locale/runetype.h.orig Wed Nov 24 17:38:51 2010
+++ lib/libc/locale/runetype.h Wed Jan 5 13:52:27 2011
@@ -71,7 +71,7 @@
#define _RUNETYPE_Q 0x00200000U /* Phonogram */
#define _RUNETYPE_SWM 0xc0000000U/* Mask to get screen width data */
#define _RUNETYPE_SWS 30 /* Bits to shift to get width */
-#define _RUNETYPE_SW0 0x00000000U /* 0 width character */
+#define _RUNETYPE_SW0 0x20000000U /* 0 width character */
#define _RUNETYPE_SW1 0x40000000U /* 1 width character */
#define _RUNETYPE_SW2 0x80000000U /* 2 width character */
#define _RUNETYPE_SW3 0xc0000000U /* 3 width character */