joe-3.1jupp31.tgz (die zweite Klappe…)
[alioth/jupp.git] / i18n.c
diff --git a/i18n.c b/i18n.c
index 2eb5d28..10b486e 100644 (file)
--- a/i18n.c
+++ b/i18n.c
@@ -1,12 +1,13 @@
 #if 0
 .if "0" == "1"
 #endif
-/* $MirOS: contrib/code/jupp/i18n.c,v 1.16 2017/01/11 00:34:03 tg Exp $ */
+/* $MirOS: contrib/code/jupp/i18n.c,v 1.23 2017/08/07 21:38:49 tg Exp $ */
 /*
  *     UNICODE/ISO-10646 functions for JOE
  *     Copyright
  *             (C) 1992 Joseph H. Allen
- *     Copyright © 2014 Thorsten Glaser
+ *     Copyright © 2014, 2017
+ *             mirabilos <m@mirbsd.org>
  *
  *     This file is part of JOE (Joe's Own Editor)
  *
@@ -25,7 +26,7 @@
 #include "utf8.h"
 #include "i18n.h"
 
-/* From: X11/xc/programs/xterm/wcwidth.c,v 1.9 */
+/* From: X11/xc/programs/xterm/wcwidth.c,v 1.10 */
 
 struct mb_ucsrange {
        unsigned int beg;
@@ -36,8 +37,8 @@ static size_t mb_ucsbsearch(const struct mb_ucsrange arr[], size_t elems,
     unsigned int val);
 
 /*
- * Generated from the Unicode Character Database, Version 9.0.0, by
- * MirOS: contrib/code/Snippets/eawparse,v 1.3 2014/11/16 12:16:24 tg Exp $
+ * Generated from the Unicode Character Database, Version 10.0.0, by
+ * MirOS: contrib/code/Snippets/eawparse,v 1.10 2017/07/12 22:47:26 tg Exp $
  */
 
 static const struct mb_ucsrange mb_ucs_combining[] = {
@@ -93,6 +94,7 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x0AC7, 0x0AC8 },
        { 0x0ACD, 0x0ACD },
        { 0x0AE2, 0x0AE3 },
+       { 0x0AFA, 0x0AFF },
        { 0x0B01, 0x0B01 },
        { 0x0B3C, 0x0B3C },
        { 0x0B3F, 0x0B3F },
@@ -115,7 +117,8 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x0CC6, 0x0CC6 },
        { 0x0CCC, 0x0CCD },
        { 0x0CE2, 0x0CE3 },
-       { 0x0D01, 0x0D01 },
+       { 0x0D00, 0x0D01 },
+       { 0x0D3B, 0x0D3C },
        { 0x0D41, 0x0D44 },
        { 0x0D4D, 0x0D4D },
        { 0x0D62, 0x0D63 },
@@ -200,7 +203,7 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x1CED, 0x1CED },
        { 0x1CF4, 0x1CF4 },
        { 0x1CF8, 0x1CF9 },
-       { 0x1DC0, 0x1DF5 },
+       { 0x1DC0, 0x1DF9 },
        { 0x1DFB, 0x1DFF },
        { 0x200B, 0x200F },
        { 0x202A, 0x202E },
@@ -304,6 +307,15 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x1171D, 0x1171F },
        { 0x11722, 0x11725 },
        { 0x11727, 0x1172B },
+       { 0x11A01, 0x11A06 },
+       { 0x11A09, 0x11A0A },
+       { 0x11A33, 0x11A38 },
+       { 0x11A3B, 0x11A3E },
+       { 0x11A47, 0x11A47 },
+       { 0x11A51, 0x11A56 },
+       { 0x11A59, 0x11A5B },
+       { 0x11A8A, 0x11A96 },
+       { 0x11A98, 0x11A99 },
        { 0x11C30, 0x11C36 },
        { 0x11C38, 0x11C3D },
        { 0x11C3F, 0x11C3F },
@@ -311,6 +323,11 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x11CAA, 0x11CB0 },
        { 0x11CB2, 0x11CB3 },
        { 0x11CB5, 0x11CB6 },
+       { 0x11D31, 0x11D36 },
+       { 0x11D3A, 0x11D3A },
+       { 0x11D3C, 0x11D3D },
+       { 0x11D3F, 0x11D45 },
+       { 0x11D47, 0x11D47 },
        { 0x16AF0, 0x16AF4 },
        { 0x16B30, 0x16B36 },
        { 0x16F8F, 0x16F92 },
@@ -375,19 +392,22 @@ static const struct mb_ucsrange mb_ucs_fullwidth[] = {
        { 0x2B1B, 0x2B1C },
        { 0x2B50, 0x2B50 },
        { 0x2B55, 0x2B55 },
-       { 0x2E80, 0x303E },
-       { 0x3040, 0xA4CF },
+       { 0x2E80, 0x3029 },
+       { 0x302E, 0x303E },
+       { 0x3040, 0x3098 },
+       { 0x309B, 0xA4CF },
        { 0xA960, 0xA97F },
        { 0xAC00, 0xD7A3 },
        { 0xF900, 0xFAFF },
        { 0xFE10, 0xFE19 },
        { 0xFE30, 0xFE6F },
-       { 0xFF00, 0xFF60 },
+       { 0xFF01, 0xFF60 },
        { 0xFFE0, 0xFFE6 },
-       { 0x16FE0, 0x16FE0 },
+       { 0x16FE0, 0x16FE1 },
        { 0x17000, 0x187EC },
        { 0x18800, 0x18AF2 },
-       { 0x1B000, 0x1B001 },
+       { 0x1B000, 0x1B11E },
+       { 0x1B170, 0x1B2FB },
        { 0x1F004, 0x1F004 },
        { 0x1F0CF, 0x1F0CF },
        { 0x1F18E, 0x1F18E },
@@ -396,6 +416,7 @@ static const struct mb_ucsrange mb_ucs_fullwidth[] = {
        { 0x1F210, 0x1F23B },
        { 0x1F240, 0x1F248 },
        { 0x1F250, 0x1F251 },
+       { 0x1F260, 0x1F265 },
        { 0x1F300, 0x1F320 },
        { 0x1F32D, 0x1F335 },
        { 0x1F337, 0x1F37C },
@@ -418,15 +439,13 @@ static const struct mb_ucsrange mb_ucs_fullwidth[] = {
        { 0x1F6CC, 0x1F6CC },
        { 0x1F6D0, 0x1F6D2 },
        { 0x1F6EB, 0x1F6EC },
-       { 0x1F6F4, 0x1F6F6 },
-       { 0x1F910, 0x1F91E },
-       { 0x1F920, 0x1F927 },
-       { 0x1F930, 0x1F930 },
-       { 0x1F933, 0x1F93E },
-       { 0x1F940, 0x1F94B },
-       { 0x1F950, 0x1F95E },
-       { 0x1F980, 0x1F991 },
+       { 0x1F6F4, 0x1F6F8 },
+       { 0x1F910, 0x1F93E },
+       { 0x1F940, 0x1F94C },
+       { 0x1F950, 0x1F96B },
+       { 0x1F980, 0x1F997 },
        { 0x1F9C0, 0x1F9C0 },
+       { 0x1F9D0, 0x1F9E6 },
        { 0x20000, 0x2FFFD },
        { 0x30000, 0x3FFFD }
 };
@@ -458,16 +477,36 @@ mb_ucsbsearch(const struct mb_ucsrange arr[], size_t elems, unsigned int val)
 
 /*XXX possibly more */
 static const struct mb_ucsrange joe_ctrlchars[] = {
+       { 0x0080, 0x009F },
        { 0x200B, 0x200F },
        { 0x2028, 0x202E },
        { 0x2060, 0x2063 },
        { 0x2066, 0x206F },
+       { 0xD800, 0xDFFF },
        { 0xFDD0, 0xFDEF },
        { 0xFEFF, 0xFEFF },
-       { 0xFFF9, 0xFFFB },
-       { 0xFFFE, 0xFFFF }
+       { 0xFFF9, 0xFFFB }
 };
 
+/* returns column width of control character, 0 for regular */
+unsigned char unictrlbuf[11];
+int unictrl(unsigned int ucs)
+{
+       *unictrlbuf = 0;
+
+       /* ASCII control characters use one screen column */
+       if (ucs < 32 || ucs == 0x7F)
+               return (1);
+
+       /* not a control or noncharacter? */
+       if (mb_ucsbsearch(joe_ctrlchars, NELEM(joe_ctrlchars),
+           ucs) == (size_t)-1 && (ucs & 0xFFFE) != 0xFFFE && ucs <= 0x10FFFF)
+               return (0);
+
+       return (joe_snprintf_1((char *)unictrlbuf, sizeof(unictrlbuf),
+           "<%X>", ucs));
+}
+
 int joe_wcwidth(int wide, unsigned int ucs)
 {
 #ifndef TEST
@@ -502,8 +541,9 @@ int joe_wcwidth(int wide, unsigned int ucs)
 
 /* MAKE_ISW functions... */
 
-/* From: contrib/hosted/tg/jupptables,v 1.1 2013/11/30 23:58:29 tg Exp $ */
+/* From: contrib/hosted/tg/jupptables,v 1.4 2017/07/08 14:53:45 tg Exp $ */
 
+#ifdef TEST_I18N
 static const struct mb_ucsrange data_wctype_upper[] = {
        { 0x0041, 0x005A },
        { 0x00C0, 0x00D6 },
@@ -1710,8 +1750,8 @@ static const struct mb_ucsrange data_wctype_lower[] = {
 };
 
 MAKE_ISW(lower)
+#endif
 
-/* plus U+005F (UNDERSCORE) */
 static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x0041, 0x005A },
        { 0x005F, 0x005F },
@@ -1763,6 +1803,7 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x0824, 0x0824 },
        { 0x0828, 0x0828 },
        { 0x0840, 0x0858 },
+       { 0x0860, 0x086A },
        { 0x08A0, 0x08B4 },
        { 0x08B6, 0x08BD },
        { 0x0904, 0x0939 },
@@ -1781,6 +1822,7 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x09DC, 0x09DD },
        { 0x09DF, 0x09E1 },
        { 0x09F0, 0x09F1 },
+       { 0x09FC, 0x09FC },
        { 0x0A05, 0x0A0A },
        { 0x0A0F, 0x0A10 },
        { 0x0A13, 0x0A28 },
@@ -2013,12 +2055,12 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x309D, 0x309F },
        { 0x30A1, 0x30FA },
        { 0x30FC, 0x30FF },
-       { 0x3105, 0x312D },
+       { 0x3105, 0x312E },
        { 0x3131, 0x318E },
        { 0x31A0, 0x31BA },
        { 0x31F0, 0x31FF },
        { 0x3400, 0x4DB5 },
-       { 0x4E00, 0x9FD5 },
+       { 0x4E00, 0x9FEA },
        { 0xA000, 0xA48C },
        { 0xA4D0, 0xA4FD },
        { 0xA500, 0xA60C },
@@ -2108,7 +2150,7 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x10280, 0x1029C },
        { 0x102A0, 0x102D0 },
        { 0x10300, 0x1031F },
-       { 0x10330, 0x10340 },
+       { 0x1032D, 0x10340 },
        { 0x10342, 0x10349 },
        { 0x10350, 0x10375 },
        { 0x10380, 0x1039D },
@@ -2191,11 +2233,21 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x11700, 0x11719 },
        { 0x118A0, 0x118DF },
        { 0x118FF, 0x118FF },
+       { 0x11A00, 0x11A00 },
+       { 0x11A0B, 0x11A32 },
+       { 0x11A3A, 0x11A3A },
+       { 0x11A50, 0x11A50 },
+       { 0x11A5C, 0x11A83 },
+       { 0x11A86, 0x11A89 },
        { 0x11AC0, 0x11AF8 },
        { 0x11C00, 0x11C08 },
        { 0x11C0A, 0x11C2E },
        { 0x11C40, 0x11C40 },
        { 0x11C72, 0x11C8F },
+       { 0x11D00, 0x11D06 },
+       { 0x11D08, 0x11D09 },
+       { 0x11D0B, 0x11D30 },
+       { 0x11D46, 0x11D46 },
        { 0x12000, 0x12399 },
        { 0x12480, 0x12543 },
        { 0x13000, 0x1342E },
@@ -2210,10 +2262,11 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x16F00, 0x16F44 },
        { 0x16F50, 0x16F50 },
        { 0x16F93, 0x16F9F },
-       { 0x16FE0, 0x16FE0 },
+       { 0x16FE0, 0x16FE1 },
        { 0x17000, 0x187EC },
        { 0x18800, 0x18AF2 },
-       { 0x1B000, 0x1B001 },
+       { 0x1B000, 0x1B11E },
+       { 0x1B170, 0x1B2FB },
        { 0x1BC00, 0x1BC6A },
        { 0x1BC70, 0x1BC7C },
        { 0x1BC80, 0x1BC88 },
@@ -2287,6 +2340,7 @@ static const struct mb_ucsrange data_wctype_alpha[] = {
        { 0x2A700, 0x2B734 },
        { 0x2B740, 0x2B81D },
        { 0x2B820, 0x2CEA1 },
+       { 0x2CEB0, 0x2EBE0 },
        { 0x2F800, 0x2FA1D }
 };
 
@@ -2302,12 +2356,6 @@ int joe_iswdigit(struct charmap *foo, int c)
        return ((c >= 0x30 && c <= 0x39) ? 1 : 0);
 }
 
-/*
- * plus ;WS;
- *  except U+2007 (<noBreak> FIGURE SPACE)
- * plus U+200B (ZERO WIDTH SPACE)
- * plus U+2029 (PARAGRAPH SEPARATOR)
- */
 static const struct mb_ucsrange data_wctype_space[] = {
        { 0x0009, 0x000D },
        { 0x0020, 0x0020 },
@@ -2321,10 +2369,7 @@ static const struct mb_ucsrange data_wctype_space[] = {
 
 MAKE_ISW(space)
 
-/*
- * plus U+2028 (LINE SEPARATOR)
- * plus U+2029 (PARAGRAPH SEPARATOR)
- */
+#ifdef TEST_I18N
 static const struct mb_ucsrange data_wctype_cntrl[] = {
        { 0x0000, 0x001F },
        { 0x007F, 0x009F },
@@ -2332,6 +2377,7 @@ static const struct mb_ucsrange data_wctype_cntrl[] = {
 };
 
 MAKE_ISW(cntrl)
+#endif
 
 static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x0021, 0x002F },
@@ -2399,6 +2445,7 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x09E2, 0x09E3 },
        { 0x09E6, 0x09EF },
        { 0x09F2, 0x09FB },
+       { 0x09FD, 0x09FD },
        { 0x0A01, 0x0A03 },
        { 0x0A3C, 0x0A3C },
        { 0x0A3E, 0x0A42 },
@@ -2414,6 +2461,7 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x0ACB, 0x0ACD },
        { 0x0AE2, 0x0AE3 },
        { 0x0AE6, 0x0AF1 },
+       { 0x0AFA, 0x0AFF },
        { 0x0B01, 0x0B03 },
        { 0x0B3C, 0x0B3C },
        { 0x0B3E, 0x0B44 },
@@ -2445,7 +2493,8 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x0CD5, 0x0CD6 },
        { 0x0CE2, 0x0CE3 },
        { 0x0CE6, 0x0CEF },
-       { 0x0D01, 0x0D03 },
+       { 0x0D00, 0x0D03 },
+       { 0x0D3B, 0x0D3C },
        { 0x0D3E, 0x0D44 },
        { 0x0D46, 0x0D48 },
        { 0x0D4A, 0x0D4D },
@@ -2536,8 +2585,8 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x1CD0, 0x1CE8 },
        { 0x1CED, 0x1CED },
        { 0x1CF2, 0x1CF4 },
-       { 0x1CF8, 0x1CF9 },
-       { 0x1DC0, 0x1DF5 },
+       { 0x1CF7, 0x1CF9 },
+       { 0x1DC0, 0x1DF9 },
        { 0x1DFB, 0x1DFF },
        { 0x1FBD, 0x1FBD },
        { 0x1FBF, 0x1FC1 },
@@ -2549,7 +2598,7 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x2066, 0x2070 },
        { 0x2074, 0x207E },
        { 0x2080, 0x208E },
-       { 0x20A0, 0x20BE },
+       { 0x20A0, 0x20BF },
        { 0x20D0, 0x20F0 },
        { 0x2100, 0x2101 },
        { 0x2103, 0x2106 },
@@ -2567,15 +2616,14 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x214F, 0x215F },
        { 0x2180, 0x2182 },
        { 0x2185, 0x218B },
-       { 0x2190, 0x23FE },
-       { 0x2400, 0x2426 },
+       { 0x2190, 0x2426 },
        { 0x2440, 0x244A },
        { 0x2460, 0x24B5 },
        { 0x24EA, 0x2B73 },
        { 0x2B76, 0x2B95 },
        { 0x2B98, 0x2BB9 },
        { 0x2BBD, 0x2BC8 },
-       { 0x2BCA, 0x2BD1 },
+       { 0x2BCA, 0x2BD2 },
        { 0x2BEC, 0x2BEF },
        { 0x2CE5, 0x2CEA },
        { 0x2CEF, 0x2CF1 },
@@ -2583,7 +2631,7 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x2D70, 0x2D70 },
        { 0x2D7F, 0x2D7F },
        { 0x2DE0, 0x2E2E },
-       { 0x2E30, 0x2E44 },
+       { 0x2E30, 0x2E49 },
        { 0x2E80, 0x2E99 },
        { 0x2E9B, 0x2EF3 },
        { 0x2F00, 0x2FD5 },
@@ -2759,6 +2807,12 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x1171D, 0x1172B },
        { 0x11730, 0x1173F },
        { 0x118E0, 0x118F2 },
+       { 0x11A01, 0x11A0A },
+       { 0x11A33, 0x11A39 },
+       { 0x11A3B, 0x11A47 },
+       { 0x11A51, 0x11A5B },
+       { 0x11A8A, 0x11A9C },
+       { 0x11A9E, 0x11AA2 },
        { 0x11C2F, 0x11C36 },
        { 0x11C38, 0x11C3F },
        { 0x11C41, 0x11C45 },
@@ -2766,6 +2820,12 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x11C70, 0x11C71 },
        { 0x11C92, 0x11CA7 },
        { 0x11CA9, 0x11CB6 },
+       { 0x11D31, 0x11D36 },
+       { 0x11D3A, 0x11D3A },
+       { 0x11D3C, 0x11D3D },
+       { 0x11D3F, 0x11D45 },
+       { 0x11D47, 0x11D47 },
+       { 0x11D50, 0x11D59 },
        { 0x12400, 0x1246E },
        { 0x12470, 0x12474 },
        { 0x16A60, 0x16A69 },
@@ -2821,9 +2881,10 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x1F210, 0x1F23B },
        { 0x1F240, 0x1F248 },
        { 0x1F250, 0x1F251 },
-       { 0x1F300, 0x1F6D2 },
+       { 0x1F260, 0x1F265 },
+       { 0x1F300, 0x1F6D4 },
        { 0x1F6E0, 0x1F6EC },
-       { 0x1F6F0, 0x1F6F6 },
+       { 0x1F6F0, 0x1F6F8 },
        { 0x1F700, 0x1F773 },
        { 0x1F780, 0x1F7D4 },
        { 0x1F800, 0x1F80B },
@@ -2831,14 +2892,13 @@ static const struct mb_ucsrange data_wctype_punct[] = {
        { 0x1F850, 0x1F859 },
        { 0x1F860, 0x1F887 },
        { 0x1F890, 0x1F8AD },
-       { 0x1F910, 0x1F91E },
-       { 0x1F920, 0x1F927 },
-       { 0x1F930, 0x1F930 },
-       { 0x1F933, 0x1F93E },
-       { 0x1F940, 0x1F94B },
-       { 0x1F950, 0x1F95E },
-       { 0x1F980, 0x1F991 },
+       { 0x1F900, 0x1F90B },
+       { 0x1F910, 0x1F93E },
+       { 0x1F940, 0x1F94C },
+       { 0x1F950, 0x1F96B },
+       { 0x1F980, 0x1F997 },
        { 0x1F9C0, 0x1F9C0 },
+       { 0x1F9D0, 0x1F9E6 },
        { 0xE0001, 0xE0001 },
        { 0xE0020, 0xE007F },
        { 0xE0100, 0xE01EF },
@@ -2848,6 +2908,7 @@ static const struct mb_ucsrange data_wctype_punct[] = {
 
 MAKE_ISW(punct)
 
+#ifdef TEST_I18N
 static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x0021, 0x007E },
        { 0x00A0, 0x0377 },
@@ -2873,6 +2934,7 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x0830, 0x083E },
        { 0x0840, 0x085B },
        { 0x085E, 0x085E },
+       { 0x0860, 0x086A },
        { 0x08A0, 0x08B4 },
        { 0x08B6, 0x08BD },
        { 0x08D4, 0x0983 },
@@ -2888,7 +2950,7 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x09D7, 0x09D7 },
        { 0x09DC, 0x09DD },
        { 0x09DF, 0x09E3 },
-       { 0x09E6, 0x09FB },
+       { 0x09E6, 0x09FD },
        { 0x0A01, 0x0A03 },
        { 0x0A05, 0x0A0A },
        { 0x0A0F, 0x0A10 },
@@ -2918,7 +2980,7 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x0AD0, 0x0AD0 },
        { 0x0AE0, 0x0AE3 },
        { 0x0AE6, 0x0AF1 },
-       { 0x0AF9, 0x0AF9 },
+       { 0x0AF9, 0x0AFF },
        { 0x0B01, 0x0B03 },
        { 0x0B05, 0x0B0C },
        { 0x0B0F, 0x0B10 },
@@ -2975,11 +3037,10 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x0CE0, 0x0CE3 },
        { 0x0CE6, 0x0CEF },
        { 0x0CF1, 0x0CF2 },
-       { 0x0D01, 0x0D03 },
+       { 0x0D00, 0x0D03 },
        { 0x0D05, 0x0D0C },
        { 0x0D0E, 0x0D10 },
-       { 0x0D12, 0x0D3A },
-       { 0x0D3D, 0x0D44 },
+       { 0x0D12, 0x0D44 },
        { 0x0D46, 0x0D48 },
        { 0x0D4A, 0x0D4F },
        { 0x0D54, 0x0D63 },
@@ -3085,9 +3146,8 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x1C3B, 0x1C49 },
        { 0x1C4D, 0x1C88 },
        { 0x1CC0, 0x1CC7 },
-       { 0x1CD0, 0x1CF6 },
-       { 0x1CF8, 0x1CF9 },
-       { 0x1D00, 0x1DF5 },
+       { 0x1CD0, 0x1CF9 },
+       { 0x1D00, 0x1DF9 },
        { 0x1DFB, 0x1F15 },
        { 0x1F18, 0x1F1D },
        { 0x1F20, 0x1F45 },
@@ -3108,17 +3168,16 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x2066, 0x2071 },
        { 0x2074, 0x208E },
        { 0x2090, 0x209C },
-       { 0x20A0, 0x20BE },
+       { 0x20A0, 0x20BF },
        { 0x20D0, 0x20F0 },
        { 0x2100, 0x218B },
-       { 0x2190, 0x23FE },
-       { 0x2400, 0x2426 },
+       { 0x2190, 0x2426 },
        { 0x2440, 0x244A },
        { 0x2460, 0x2B73 },
        { 0x2B76, 0x2B95 },
        { 0x2B98, 0x2BB9 },
        { 0x2BBD, 0x2BC8 },
-       { 0x2BCA, 0x2BD1 },
+       { 0x2BCA, 0x2BD2 },
        { 0x2BEC, 0x2BEF },
        { 0x2C00, 0x2C2E },
        { 0x2C30, 0x2C5E },
@@ -3137,7 +3196,7 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x2DC8, 0x2DCE },
        { 0x2DD0, 0x2DD6 },
        { 0x2DD8, 0x2DDE },
-       { 0x2DE0, 0x2E44 },
+       { 0x2DE0, 0x2E49 },
        { 0x2E80, 0x2E99 },
        { 0x2E9B, 0x2EF3 },
        { 0x2F00, 0x2FD5 },
@@ -3145,14 +3204,14 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x3000, 0x303F },
        { 0x3041, 0x3096 },
        { 0x3099, 0x30FF },
-       { 0x3105, 0x312D },
+       { 0x3105, 0x312E },
        { 0x3131, 0x318E },
        { 0x3190, 0x31BA },
        { 0x31C0, 0x31E3 },
        { 0x31F0, 0x321E },
        { 0x3220, 0x32FE },
        { 0x3300, 0x4DB5 },
-       { 0x4DC0, 0x9FD5 },
+       { 0x4DC0, 0x9FEA },
        { 0xA000, 0xA48C },
        { 0xA490, 0xA4C6 },
        { 0xA4D0, 0xA62B },
@@ -3232,7 +3291,7 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x102A0, 0x102D0 },
        { 0x102E0, 0x102FB },
        { 0x10300, 0x10323 },
-       { 0x10330, 0x1034A },
+       { 0x1032D, 0x1034A },
        { 0x10350, 0x1037A },
        { 0x10380, 0x1039D },
        { 0x1039F, 0x103C3 },
@@ -3336,6 +3395,10 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x11730, 0x1173F },
        { 0x118A0, 0x118F2 },
        { 0x118FF, 0x118FF },
+       { 0x11A00, 0x11A47 },
+       { 0x11A50, 0x11A83 },
+       { 0x11A86, 0x11A9C },
+       { 0x11A9E, 0x11AA2 },
        { 0x11AC0, 0x11AF8 },
        { 0x11C00, 0x11C08 },
        { 0x11C0A, 0x11C36 },
@@ -3344,6 +3407,13 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x11C70, 0x11C8F },
        { 0x11C92, 0x11CA7 },
        { 0x11CA9, 0x11CB6 },
+       { 0x11D00, 0x11D06 },
+       { 0x11D08, 0x11D09 },
+       { 0x11D0B, 0x11D36 },
+       { 0x11D3A, 0x11D3A },
+       { 0x11D3C, 0x11D3D },
+       { 0x11D3F, 0x11D47 },
+       { 0x11D50, 0x11D59 },
        { 0x12000, 0x12399 },
        { 0x12400, 0x1246E },
        { 0x12470, 0x12474 },
@@ -3364,10 +3434,11 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x16F00, 0x16F44 },
        { 0x16F50, 0x16F7E },
        { 0x16F8F, 0x16F9F },
-       { 0x16FE0, 0x16FE0 },
+       { 0x16FE0, 0x16FE1 },
        { 0x17000, 0x187EC },
        { 0x18800, 0x18AF2 },
-       { 0x1B000, 0x1B001 },
+       { 0x1B000, 0x1B11E },
+       { 0x1B170, 0x1B2FB },
        { 0x1BC00, 0x1BC6A },
        { 0x1BC70, 0x1BC7C },
        { 0x1BC80, 0x1BC88 },
@@ -3460,9 +3531,10 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x1F210, 0x1F23B },
        { 0x1F240, 0x1F248 },
        { 0x1F250, 0x1F251 },
-       { 0x1F300, 0x1F6D2 },
+       { 0x1F260, 0x1F265 },
+       { 0x1F300, 0x1F6D4 },
        { 0x1F6E0, 0x1F6EC },
-       { 0x1F6F0, 0x1F6F6 },
+       { 0x1F6F0, 0x1F6F8 },
        { 0x1F700, 0x1F773 },
        { 0x1F780, 0x1F7D4 },
        { 0x1F800, 0x1F80B },
@@ -3470,18 +3542,18 @@ static const struct mb_ucsrange data_wctype_graph[] = {
        { 0x1F850, 0x1F859 },
        { 0x1F860, 0x1F887 },
        { 0x1F890, 0x1F8AD },
-       { 0x1F910, 0x1F91E },
-       { 0x1F920, 0x1F927 },
-       { 0x1F930, 0x1F930 },
-       { 0x1F933, 0x1F93E },
-       { 0x1F940, 0x1F94B },
-       { 0x1F950, 0x1F95E },
-       { 0x1F980, 0x1F991 },
+       { 0x1F900, 0x1F90B },
+       { 0x1F910, 0x1F93E },
+       { 0x1F940, 0x1F94C },
+       { 0x1F950, 0x1F96B },
+       { 0x1F980, 0x1F997 },
        { 0x1F9C0, 0x1F9C0 },
+       { 0x1F9D0, 0x1F9E6 },
        { 0x20000, 0x2A6D6 },
        { 0x2A700, 0x2B734 },
        { 0x2B740, 0x2B81D },
        { 0x2B820, 0x2CEA1 },
+       { 0x2CEB0, 0x2EBE0 },
        { 0x2F800, 0x2FA1D },
        { 0xE0001, 0xE0001 },
        { 0xE0020, 0xE007F },
@@ -3491,6 +3563,7 @@ static const struct mb_ucsrange data_wctype_graph[] = {
 };
 
 MAKE_ISW(graph)
+#endif
 
 static const struct mb_ucsrange data_wctype_print[] = {
        { 0x0020, 0x007E },
@@ -3517,6 +3590,7 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x0830, 0x083E },
        { 0x0840, 0x085B },
        { 0x085E, 0x085E },
+       { 0x0860, 0x086A },
        { 0x08A0, 0x08B4 },
        { 0x08B6, 0x08BD },
        { 0x08D4, 0x0983 },
@@ -3532,7 +3606,7 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x09D7, 0x09D7 },
        { 0x09DC, 0x09DD },
        { 0x09DF, 0x09E3 },
-       { 0x09E6, 0x09FB },
+       { 0x09E6, 0x09FD },
        { 0x0A01, 0x0A03 },
        { 0x0A05, 0x0A0A },
        { 0x0A0F, 0x0A10 },
@@ -3562,7 +3636,7 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x0AD0, 0x0AD0 },
        { 0x0AE0, 0x0AE3 },
        { 0x0AE6, 0x0AF1 },
-       { 0x0AF9, 0x0AF9 },
+       { 0x0AF9, 0x0AFF },
        { 0x0B01, 0x0B03 },
        { 0x0B05, 0x0B0C },
        { 0x0B0F, 0x0B10 },
@@ -3619,11 +3693,10 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x0CE0, 0x0CE3 },
        { 0x0CE6, 0x0CEF },
        { 0x0CF1, 0x0CF2 },
-       { 0x0D01, 0x0D03 },
+       { 0x0D00, 0x0D03 },
        { 0x0D05, 0x0D0C },
        { 0x0D0E, 0x0D10 },
-       { 0x0D12, 0x0D3A },
-       { 0x0D3D, 0x0D44 },
+       { 0x0D12, 0x0D44 },
        { 0x0D46, 0x0D48 },
        { 0x0D4A, 0x0D4F },
        { 0x0D54, 0x0D63 },
@@ -3729,9 +3802,8 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x1C3B, 0x1C49 },
        { 0x1C4D, 0x1C88 },
        { 0x1CC0, 0x1CC7 },
-       { 0x1CD0, 0x1CF6 },
-       { 0x1CF8, 0x1CF9 },
-       { 0x1D00, 0x1DF5 },
+       { 0x1CD0, 0x1CF9 },
+       { 0x1D00, 0x1DF9 },
        { 0x1DFB, 0x1F15 },
        { 0x1F18, 0x1F1D },
        { 0x1F20, 0x1F45 },
@@ -3758,17 +3830,16 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x2066, 0x2071 },
        { 0x2074, 0x208E },
        { 0x2090, 0x209C },
-       { 0x20A0, 0x20BE },
+       { 0x20A0, 0x20BF },
        { 0x20D0, 0x20F0 },
        { 0x2100, 0x218B },
-       { 0x2190, 0x23FE },
-       { 0x2400, 0x2426 },
+       { 0x2190, 0x2426 },
        { 0x2440, 0x244A },
        { 0x2460, 0x2B73 },
        { 0x2B76, 0x2B95 },
        { 0x2B98, 0x2BB9 },
        { 0x2BBD, 0x2BC8 },
-       { 0x2BCA, 0x2BD1 },
+       { 0x2BCA, 0x2BD2 },
        { 0x2BEC, 0x2BEF },
        { 0x2C00, 0x2C2E },
        { 0x2C30, 0x2C5E },
@@ -3787,7 +3858,7 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x2DC8, 0x2DCE },
        { 0x2DD0, 0x2DD6 },
        { 0x2DD8, 0x2DDE },
-       { 0x2DE0, 0x2E44 },
+       { 0x2DE0, 0x2E49 },
        { 0x2E80, 0x2E99 },
        { 0x2E9B, 0x2EF3 },
        { 0x2F00, 0x2FD5 },
@@ -3795,14 +3866,14 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x3000, 0x303F },
        { 0x3041, 0x3096 },
        { 0x3099, 0x30FF },
-       { 0x3105, 0x312D },
+       { 0x3105, 0x312E },
        { 0x3131, 0x318E },
        { 0x3190, 0x31BA },
        { 0x31C0, 0x31E3 },
        { 0x31F0, 0x321E },
        { 0x3220, 0x32FE },
        { 0x3300, 0x4DB5 },
-       { 0x4DC0, 0x9FD5 },
+       { 0x4DC0, 0x9FEA },
        { 0xA000, 0xA48C },
        { 0xA490, 0xA4C6 },
        { 0xA4D0, 0xA62B },
@@ -3882,7 +3953,7 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x102A0, 0x102D0 },
        { 0x102E0, 0x102FB },
        { 0x10300, 0x10323 },
-       { 0x10330, 0x1034A },
+       { 0x1032D, 0x1034A },
        { 0x10350, 0x1037A },
        { 0x10380, 0x1039D },
        { 0x1039F, 0x103C3 },
@@ -3986,6 +4057,10 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x11730, 0x1173F },
        { 0x118A0, 0x118F2 },
        { 0x118FF, 0x118FF },
+       { 0x11A00, 0x11A47 },
+       { 0x11A50, 0x11A83 },
+       { 0x11A86, 0x11A9C },
+       { 0x11A9E, 0x11AA2 },
        { 0x11AC0, 0x11AF8 },
        { 0x11C00, 0x11C08 },
        { 0x11C0A, 0x11C36 },
@@ -3994,6 +4069,13 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x11C70, 0x11C8F },
        { 0x11C92, 0x11CA7 },
        { 0x11CA9, 0x11CB6 },
+       { 0x11D00, 0x11D06 },
+       { 0x11D08, 0x11D09 },
+       { 0x11D0B, 0x11D36 },
+       { 0x11D3A, 0x11D3A },
+       { 0x11D3C, 0x11D3D },
+       { 0x11D3F, 0x11D47 },
+       { 0x11D50, 0x11D59 },
        { 0x12000, 0x12399 },
        { 0x12400, 0x1246E },
        { 0x12470, 0x12474 },
@@ -4014,10 +4096,11 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x16F00, 0x16F44 },
        { 0x16F50, 0x16F7E },
        { 0x16F8F, 0x16F9F },
-       { 0x16FE0, 0x16FE0 },
+       { 0x16FE0, 0x16FE1 },
        { 0x17000, 0x187EC },
        { 0x18800, 0x18AF2 },
-       { 0x1B000, 0x1B001 },
+       { 0x1B000, 0x1B11E },
+       { 0x1B170, 0x1B2FB },
        { 0x1BC00, 0x1BC6A },
        { 0x1BC70, 0x1BC7C },
        { 0x1BC80, 0x1BC88 },
@@ -4110,9 +4193,10 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x1F210, 0x1F23B },
        { 0x1F240, 0x1F248 },
        { 0x1F250, 0x1F251 },
-       { 0x1F300, 0x1F6D2 },
+       { 0x1F260, 0x1F265 },
+       { 0x1F300, 0x1F6D4 },
        { 0x1F6E0, 0x1F6EC },
-       { 0x1F6F0, 0x1F6F6 },
+       { 0x1F6F0, 0x1F6F8 },
        { 0x1F700, 0x1F773 },
        { 0x1F780, 0x1F7D4 },
        { 0x1F800, 0x1F80B },
@@ -4120,18 +4204,18 @@ static const struct mb_ucsrange data_wctype_print[] = {
        { 0x1F850, 0x1F859 },
        { 0x1F860, 0x1F887 },
        { 0x1F890, 0x1F8AD },
-       { 0x1F910, 0x1F91E },
-       { 0x1F920, 0x1F927 },
-       { 0x1F930, 0x1F930 },
-       { 0x1F933, 0x1F93E },
-       { 0x1F940, 0x1F94B },
-       { 0x1F950, 0x1F95E },
-       { 0x1F980, 0x1F991 },
+       { 0x1F900, 0x1F90B },
+       { 0x1F910, 0x1F93E },
+       { 0x1F940, 0x1F94C },
+       { 0x1F950, 0x1F96B },
+       { 0x1F980, 0x1F997 },
        { 0x1F9C0, 0x1F9C0 },
+       { 0x1F9D0, 0x1F9E6 },
        { 0x20000, 0x2A6D6 },
        { 0x2A700, 0x2B734 },
        { 0x2B740, 0x2B81D },
        { 0x2B820, 0x2CEA1 },
+       { 0x2CEB0, 0x2EBE0 },
        { 0x2F800, 0x2FA1D },
        { 0xE0001, 0xE0001 },
        { 0xE0020, 0xE007F },
@@ -4142,6 +4226,7 @@ static const struct mb_ucsrange data_wctype_print[] = {
 
 MAKE_ISW(print)
 
+#ifdef TEST_I18N
 static const struct mb_ucsrange data_wctype_xdigit[] = {
        { 0x0030, 0x0039 },
        { 0x0041, 0x0046 },
@@ -4150,13 +4235,6 @@ static const struct mb_ucsrange data_wctype_xdigit[] = {
 
 MAKE_ISW(xdigit)
 
-/*
- * plus ;Zs;
- *  except U+00A0 (<noBreak> NON-BREAKING SPACE)
- *  except U+2007 (<noBreak> FIGURE SPACE)
- *  except U+202F (<noBreak> NARROW NO-BREAK SPACE)
- * plus U+200B (ZERO WIDTH SPACE)
- */
 static const struct mb_ucsrange data_wctype_blank[] = {
        { 0x0009, 0x0009 },
        { 0x0020, 0x0020 },
@@ -4168,6 +4246,7 @@ static const struct mb_ucsrange data_wctype_blank[] = {
 };
 
 MAKE_ISW(blank)
+#endif
 
 /* Conversion functions */
 
@@ -6848,27 +6927,6 @@ main(int argc,char *argv[])
 }
 #endif
 
-/* Return true if c is a control character which should not be displayed */
-int unictrl(unsigned int ucs)
-{
-       /* C0 Control characters are one column wide in JOE */
-       if (ucs < 32 || ucs == 0x7F)
-               return (1);
-
-       /* C1 control characters... */
-       if (ucs >= 0x80 && ucs < 0xA0)
-               return (4);
-
-       /* More control characters... */
-       if (mb_ucsbsearch(joe_ctrlchars, NELEM(joe_ctrlchars), ucs) != (size_t)-1)
-               return (6);
-
-       if ((ucs & 0xFFFE) == 0xFFFE)
-               return (ucs > 0xFFFFF ? 8 : 7);
-
-       return (0);
-}
-
 #if 0
 .endif