5 * UNICODE/ISO-10646 functions for JOE
7 * (C) 1992 Joseph H. Allen
8 * Copyright © 2014, 2017
9 * mirabilos <m@mirbsd.org>
11 * This file is part of JOE (Joe's Own Editor)
13 * This is basically the "i18n" file in C
15 * There really should be a program to convert from i18n to c, but this
16 * was very easy to do with just the text editor.
22 __RCSID("$MirOS: contrib/code/jupp/i18n.c,v 1.32 2017/12/07 01:00:31 tg Exp $");
27 /* From: X11/xc/programs/xterm/wcwidth.c,v 1.10 */
34 static size_t mb_ucsbsearch(const struct mb_ucsrange arr[], size_t elems,
38 * Generated from the Unicode Character Database, Version 10.0.0, by
39 * MirOS: contrib/code/Snippets/eawparse,v 1.12 2017/09/06 16:05:45 tg Exp $
42 static const struct mb_ucsrange mb_ucs_combining[] = {
253 { 0x101FD, 0x101FD },
254 { 0x102E0, 0x102E0 },
255 { 0x10376, 0x1037A },
256 { 0x10A01, 0x10A03 },
257 { 0x10A05, 0x10A06 },
258 { 0x10A0C, 0x10A0F },
259 { 0x10A38, 0x10A3A },
260 { 0x10A3F, 0x10A3F },
261 { 0x10AE5, 0x10AE6 },
262 { 0x11001, 0x11001 },
263 { 0x11038, 0x11046 },
264 { 0x1107F, 0x11081 },
265 { 0x110B3, 0x110B6 },
266 { 0x110B9, 0x110BA },
267 { 0x11100, 0x11102 },
268 { 0x11127, 0x1112B },
269 { 0x1112D, 0x11134 },
270 { 0x11173, 0x11173 },
271 { 0x11180, 0x11181 },
272 { 0x111B6, 0x111BE },
273 { 0x111CA, 0x111CC },
274 { 0x1122F, 0x11231 },
275 { 0x11234, 0x11234 },
276 { 0x11236, 0x11237 },
277 { 0x1123E, 0x1123E },
278 { 0x112DF, 0x112DF },
279 { 0x112E3, 0x112EA },
280 { 0x11300, 0x11301 },
281 { 0x1133C, 0x1133C },
282 { 0x11340, 0x11340 },
283 { 0x11366, 0x1136C },
284 { 0x11370, 0x11374 },
285 { 0x11438, 0x1143F },
286 { 0x11442, 0x11444 },
287 { 0x11446, 0x11446 },
288 { 0x114B3, 0x114B8 },
289 { 0x114BA, 0x114BA },
290 { 0x114BF, 0x114C0 },
291 { 0x114C2, 0x114C3 },
292 { 0x115B2, 0x115B5 },
293 { 0x115BC, 0x115BD },
294 { 0x115BF, 0x115C0 },
295 { 0x115DC, 0x115DD },
296 { 0x11633, 0x1163A },
297 { 0x1163D, 0x1163D },
298 { 0x1163F, 0x11640 },
299 { 0x116AB, 0x116AB },
300 { 0x116AD, 0x116AD },
301 { 0x116B0, 0x116B5 },
302 { 0x116B7, 0x116B7 },
303 { 0x1171D, 0x1171F },
304 { 0x11722, 0x11725 },
305 { 0x11727, 0x1172B },
306 { 0x11A01, 0x11A06 },
307 { 0x11A09, 0x11A0A },
308 { 0x11A33, 0x11A38 },
309 { 0x11A3B, 0x11A3E },
310 { 0x11A47, 0x11A47 },
311 { 0x11A51, 0x11A56 },
312 { 0x11A59, 0x11A5B },
313 { 0x11A8A, 0x11A96 },
314 { 0x11A98, 0x11A99 },
315 { 0x11C30, 0x11C36 },
316 { 0x11C38, 0x11C3D },
317 { 0x11C3F, 0x11C3F },
318 { 0x11C92, 0x11CA7 },
319 { 0x11CAA, 0x11CB0 },
320 { 0x11CB2, 0x11CB3 },
321 { 0x11CB5, 0x11CB6 },
322 { 0x11D31, 0x11D36 },
323 { 0x11D3A, 0x11D3A },
324 { 0x11D3C, 0x11D3D },
325 { 0x11D3F, 0x11D45 },
326 { 0x11D47, 0x11D47 },
327 { 0x16AF0, 0x16AF4 },
328 { 0x16B30, 0x16B36 },
329 { 0x16F8F, 0x16F92 },
330 { 0x1BC9D, 0x1BC9E },
331 { 0x1BCA0, 0x1BCA3 },
332 { 0x1D167, 0x1D169 },
333 { 0x1D173, 0x1D182 },
334 { 0x1D185, 0x1D18B },
335 { 0x1D1AA, 0x1D1AD },
336 { 0x1D242, 0x1D244 },
337 { 0x1DA00, 0x1DA36 },
338 { 0x1DA3B, 0x1DA6C },
339 { 0x1DA75, 0x1DA75 },
340 { 0x1DA84, 0x1DA84 },
341 { 0x1DA9B, 0x1DA9F },
342 { 0x1DAA1, 0x1DAAF },
343 { 0x1E000, 0x1E006 },
344 { 0x1E008, 0x1E018 },
345 { 0x1E01B, 0x1E021 },
346 { 0x1E023, 0x1E024 },
347 { 0x1E026, 0x1E02A },
348 { 0x1E8D0, 0x1E8D6 },
349 { 0x1E944, 0x1E94A },
350 { 0xE0001, 0xE0001 },
351 { 0xE0020, 0xE007F },
355 static const struct mb_ucsrange mb_ucs_fullwidth[] = {
402 { 0x16FE0, 0x16FE1 },
403 { 0x17000, 0x187EC },
404 { 0x18800, 0x18AF2 },
405 { 0x1B000, 0x1B11E },
406 { 0x1B170, 0x1B2FB },
407 { 0x1F004, 0x1F004 },
408 { 0x1F0CF, 0x1F0CF },
409 { 0x1F18E, 0x1F18E },
410 { 0x1F191, 0x1F19A },
411 { 0x1F200, 0x1F202 },
412 { 0x1F210, 0x1F23B },
413 { 0x1F240, 0x1F248 },
414 { 0x1F250, 0x1F251 },
415 { 0x1F260, 0x1F265 },
416 { 0x1F300, 0x1F320 },
417 { 0x1F32D, 0x1F335 },
418 { 0x1F337, 0x1F37C },
419 { 0x1F37E, 0x1F393 },
420 { 0x1F3A0, 0x1F3CA },
421 { 0x1F3CF, 0x1F3D3 },
422 { 0x1F3E0, 0x1F3F0 },
423 { 0x1F3F4, 0x1F3F4 },
424 { 0x1F3F8, 0x1F43E },
425 { 0x1F440, 0x1F440 },
426 { 0x1F442, 0x1F4FC },
427 { 0x1F4FF, 0x1F53D },
428 { 0x1F54B, 0x1F54E },
429 { 0x1F550, 0x1F567 },
430 { 0x1F57A, 0x1F57A },
431 { 0x1F595, 0x1F596 },
432 { 0x1F5A4, 0x1F5A4 },
433 { 0x1F5FB, 0x1F64F },
434 { 0x1F680, 0x1F6C5 },
435 { 0x1F6CC, 0x1F6CC },
436 { 0x1F6D0, 0x1F6D2 },
437 { 0x1F6EB, 0x1F6EC },
438 { 0x1F6F4, 0x1F6F8 },
439 { 0x1F910, 0x1F93E },
440 { 0x1F940, 0x1F94C },
441 { 0x1F950, 0x1F96B },
442 { 0x1F980, 0x1F997 },
443 { 0x1F9C0, 0x1F9C0 },
444 { 0x1F9D0, 0x1F9E6 },
445 { 0x20000, 0x2FFFD },
449 /* simple binary search in ranges, with bounds optimisation */
451 mb_ucsbsearch(const struct mb_ucsrange arr[], size_t elems, unsigned int val)
453 size_t min = 0, mid, max = elems;
455 if (val < arr[min].beg || val > arr[max - 1].end)
459 mid = (min + max) / 2;
461 if (val < arr[mid].beg)
463 else if (val > arr[mid].end)
471 /* Modified for JOE: returns printed width of control and other non-printable
474 /*XXX possibly more */
475 static const struct mb_ucsrange joe_ctrlchars[] = {
487 /* returns column width of control character, 0 for regular */
488 unsigned char unictrlbuf[11];
489 int unictrl(unsigned int ucs)
493 /* ASCII control characters use one screen column */
494 if (ucs < 32 || ucs == 0x7F)
497 /* not a control or noncharacter? */
498 if (mb_ucsbsearch(joe_ctrlchars, NELEM(joe_ctrlchars),
499 ucs) == (size_t)-1 && (ucs & 0xFFFE) != 0xFFFE && ucs <= 0x10FFFF)
502 return (joe_snprintf_1((char *)unictrlbuf, sizeof(unictrlbuf),
506 int joe_wcwidth(int wide, unsigned int ucs)
509 /* If terminal is not UTF-8 or file is not UTF-8: width is 1 */
511 if (!locale_map->type || !wide)
515 if ((wide = unictrl(ucs)))
518 /* combining characters use 0 screen columns */
519 if (mb_ucsbsearch(mb_ucs_combining, NELEM(mb_ucs_combining), ucs) != (size_t)-1)
522 /* all others use 1 or 2 screen columns */
523 if (mb_ucsbsearch(mb_ucs_fullwidth, NELEM(mb_ucs_fullwidth), ucs) != (size_t)-1)
528 /* Macro for generating joe_iswXXX functions */
530 #define MAKE_ISW(what) \
531 int joe_isw##what(struct charmap *foo, int c) \
533 return ((mb_ucsbsearch(data_wctype_##what, \
534 NELEM(data_wctype_##what), \
535 c) != (size_t)-1) ? 1 : 0); \
538 /* MAKE_ISW functions... */
540 /* From: contrib/hosted/tg/jupptables,v 1.4 2017/07/08 14:53:45 tg Exp $ */
543 static const struct mb_ucsrange data_wctype_upper[] = {
1129 { 0x10400, 0x10427 },
1130 { 0x104B0, 0x104D3 },
1131 { 0x10C80, 0x10CB2 },
1132 { 0x118A0, 0x118BF },
1133 { 0x1E900, 0x1E921 }
1138 static const struct mb_ucsrange data_wctype_lower[] = {
1741 { 0x10428, 0x1044F },
1742 { 0x104D8, 0x104FB },
1743 { 0x10CC0, 0x10CF2 },
1744 { 0x118C0, 0x118DF },
1745 { 0x1E922, 0x1E943 }
1751 static const struct mb_ucsrange data_wctype_alpha[] = {
2139 { 0x10000, 0x1000B },
2140 { 0x1000D, 0x10026 },
2141 { 0x10028, 0x1003A },
2142 { 0x1003C, 0x1003D },
2143 { 0x1003F, 0x1004D },
2144 { 0x10050, 0x1005D },
2145 { 0x10080, 0x100FA },
2146 { 0x10280, 0x1029C },
2147 { 0x102A0, 0x102D0 },
2148 { 0x10300, 0x1031F },
2149 { 0x1032D, 0x10340 },
2150 { 0x10342, 0x10349 },
2151 { 0x10350, 0x10375 },
2152 { 0x10380, 0x1039D },
2153 { 0x103A0, 0x103C3 },
2154 { 0x103C8, 0x103CF },
2155 { 0x10400, 0x1049D },
2156 { 0x104B0, 0x104D3 },
2157 { 0x104D8, 0x104FB },
2158 { 0x10500, 0x10527 },
2159 { 0x10530, 0x10563 },
2160 { 0x10600, 0x10736 },
2161 { 0x10740, 0x10755 },
2162 { 0x10760, 0x10767 },
2163 { 0x10800, 0x10805 },
2164 { 0x10808, 0x10808 },
2165 { 0x1080A, 0x10835 },
2166 { 0x10837, 0x10838 },
2167 { 0x1083C, 0x1083C },
2168 { 0x1083F, 0x10855 },
2169 { 0x10860, 0x10876 },
2170 { 0x10880, 0x1089E },
2171 { 0x108E0, 0x108F2 },
2172 { 0x108F4, 0x108F5 },
2173 { 0x10900, 0x10915 },
2174 { 0x10920, 0x10939 },
2175 { 0x10980, 0x109B7 },
2176 { 0x109BE, 0x109BF },
2177 { 0x10A00, 0x10A00 },
2178 { 0x10A10, 0x10A13 },
2179 { 0x10A15, 0x10A17 },
2180 { 0x10A19, 0x10A33 },
2181 { 0x10A60, 0x10A7C },
2182 { 0x10A80, 0x10A9C },
2183 { 0x10AC0, 0x10AC7 },
2184 { 0x10AC9, 0x10AE4 },
2185 { 0x10B00, 0x10B35 },
2186 { 0x10B40, 0x10B55 },
2187 { 0x10B60, 0x10B72 },
2188 { 0x10B80, 0x10B91 },
2189 { 0x10C00, 0x10C48 },
2190 { 0x10C80, 0x10CB2 },
2191 { 0x10CC0, 0x10CF2 },
2192 { 0x11003, 0x11037 },
2193 { 0x11083, 0x110AF },
2194 { 0x110D0, 0x110E8 },
2195 { 0x11103, 0x11126 },
2196 { 0x11150, 0x11172 },
2197 { 0x11176, 0x11176 },
2198 { 0x11183, 0x111B2 },
2199 { 0x111C1, 0x111C4 },
2200 { 0x111DA, 0x111DA },
2201 { 0x111DC, 0x111DC },
2202 { 0x11200, 0x11211 },
2203 { 0x11213, 0x1122B },
2204 { 0x11280, 0x11286 },
2205 { 0x11288, 0x11288 },
2206 { 0x1128A, 0x1128D },
2207 { 0x1128F, 0x1129D },
2208 { 0x1129F, 0x112A8 },
2209 { 0x112B0, 0x112DE },
2210 { 0x11305, 0x1130C },
2211 { 0x1130F, 0x11310 },
2212 { 0x11313, 0x11328 },
2213 { 0x1132A, 0x11330 },
2214 { 0x11332, 0x11333 },
2215 { 0x11335, 0x11339 },
2216 { 0x1133D, 0x1133D },
2217 { 0x11350, 0x11350 },
2218 { 0x1135D, 0x11361 },
2219 { 0x11400, 0x11434 },
2220 { 0x11447, 0x1144A },
2221 { 0x11480, 0x114AF },
2222 { 0x114C4, 0x114C5 },
2223 { 0x114C7, 0x114C7 },
2224 { 0x11580, 0x115AE },
2225 { 0x115D8, 0x115DB },
2226 { 0x11600, 0x1162F },
2227 { 0x11644, 0x11644 },
2228 { 0x11680, 0x116AA },
2229 { 0x11700, 0x11719 },
2230 { 0x118A0, 0x118DF },
2231 { 0x118FF, 0x118FF },
2232 { 0x11A00, 0x11A00 },
2233 { 0x11A0B, 0x11A32 },
2234 { 0x11A3A, 0x11A3A },
2235 { 0x11A50, 0x11A50 },
2236 { 0x11A5C, 0x11A83 },
2237 { 0x11A86, 0x11A89 },
2238 { 0x11AC0, 0x11AF8 },
2239 { 0x11C00, 0x11C08 },
2240 { 0x11C0A, 0x11C2E },
2241 { 0x11C40, 0x11C40 },
2242 { 0x11C72, 0x11C8F },
2243 { 0x11D00, 0x11D06 },
2244 { 0x11D08, 0x11D09 },
2245 { 0x11D0B, 0x11D30 },
2246 { 0x11D46, 0x11D46 },
2247 { 0x12000, 0x12399 },
2248 { 0x12480, 0x12543 },
2249 { 0x13000, 0x1342E },
2250 { 0x14400, 0x14646 },
2251 { 0x16800, 0x16A38 },
2252 { 0x16A40, 0x16A5E },
2253 { 0x16AD0, 0x16AED },
2254 { 0x16B00, 0x16B2F },
2255 { 0x16B40, 0x16B43 },
2256 { 0x16B63, 0x16B77 },
2257 { 0x16B7D, 0x16B8F },
2258 { 0x16F00, 0x16F44 },
2259 { 0x16F50, 0x16F50 },
2260 { 0x16F93, 0x16F9F },
2261 { 0x16FE0, 0x16FE1 },
2262 { 0x17000, 0x187EC },
2263 { 0x18800, 0x18AF2 },
2264 { 0x1B000, 0x1B11E },
2265 { 0x1B170, 0x1B2FB },
2266 { 0x1BC00, 0x1BC6A },
2267 { 0x1BC70, 0x1BC7C },
2268 { 0x1BC80, 0x1BC88 },
2269 { 0x1BC90, 0x1BC99 },
2270 { 0x1D400, 0x1D454 },
2271 { 0x1D456, 0x1D49C },
2272 { 0x1D49E, 0x1D49F },
2273 { 0x1D4A2, 0x1D4A2 },
2274 { 0x1D4A5, 0x1D4A6 },
2275 { 0x1D4A9, 0x1D4AC },
2276 { 0x1D4AE, 0x1D4B9 },
2277 { 0x1D4BB, 0x1D4BB },
2278 { 0x1D4BD, 0x1D4C3 },
2279 { 0x1D4C5, 0x1D505 },
2280 { 0x1D507, 0x1D50A },
2281 { 0x1D50D, 0x1D514 },
2282 { 0x1D516, 0x1D51C },
2283 { 0x1D51E, 0x1D539 },
2284 { 0x1D53B, 0x1D53E },
2285 { 0x1D540, 0x1D544 },
2286 { 0x1D546, 0x1D546 },
2287 { 0x1D54A, 0x1D550 },
2288 { 0x1D552, 0x1D6A5 },
2289 { 0x1D6A8, 0x1D6C0 },
2290 { 0x1D6C2, 0x1D6DA },
2291 { 0x1D6DC, 0x1D6FA },
2292 { 0x1D6FC, 0x1D714 },
2293 { 0x1D716, 0x1D734 },
2294 { 0x1D736, 0x1D74E },
2295 { 0x1D750, 0x1D76E },
2296 { 0x1D770, 0x1D788 },
2297 { 0x1D78A, 0x1D7A8 },
2298 { 0x1D7AA, 0x1D7C2 },
2299 { 0x1D7C4, 0x1D7CB },
2300 { 0x1E800, 0x1E8C4 },
2301 { 0x1E900, 0x1E943 },
2302 { 0x1EE00, 0x1EE03 },
2303 { 0x1EE05, 0x1EE1F },
2304 { 0x1EE21, 0x1EE22 },
2305 { 0x1EE24, 0x1EE24 },
2306 { 0x1EE27, 0x1EE27 },
2307 { 0x1EE29, 0x1EE32 },
2308 { 0x1EE34, 0x1EE37 },
2309 { 0x1EE39, 0x1EE39 },
2310 { 0x1EE3B, 0x1EE3B },
2311 { 0x1EE42, 0x1EE42 },
2312 { 0x1EE47, 0x1EE47 },
2313 { 0x1EE49, 0x1EE49 },
2314 { 0x1EE4B, 0x1EE4B },
2315 { 0x1EE4D, 0x1EE4F },
2316 { 0x1EE51, 0x1EE52 },
2317 { 0x1EE54, 0x1EE54 },
2318 { 0x1EE57, 0x1EE57 },
2319 { 0x1EE59, 0x1EE59 },
2320 { 0x1EE5B, 0x1EE5B },
2321 { 0x1EE5D, 0x1EE5D },
2322 { 0x1EE5F, 0x1EE5F },
2323 { 0x1EE61, 0x1EE62 },
2324 { 0x1EE64, 0x1EE64 },
2325 { 0x1EE67, 0x1EE6A },
2326 { 0x1EE6C, 0x1EE72 },
2327 { 0x1EE74, 0x1EE77 },
2328 { 0x1EE79, 0x1EE7C },
2329 { 0x1EE7E, 0x1EE7E },
2330 { 0x1EE80, 0x1EE89 },
2331 { 0x1EE8B, 0x1EE9B },
2332 { 0x1EEA1, 0x1EEA3 },
2333 { 0x1EEA5, 0x1EEA9 },
2334 { 0x1EEAB, 0x1EEBB },
2335 { 0x20000, 0x2A6D6 },
2336 { 0x2A700, 0x2B734 },
2337 { 0x2B740, 0x2B81D },
2338 { 0x2B820, 0x2CEA1 },
2339 { 0x2CEB0, 0x2EBE0 },
2340 { 0x2F800, 0x2FA1D }
2345 int joe_iswalnum(struct charmap *foo, int c)
2347 return ((c >= 0x30 && c <= 0x39) ? 1 : joe_iswalpha(foo, c));
2350 int joe_iswdigit(struct charmap *foo, int c)
2352 return ((c >= 0x30 && c <= 0x39) ? 1 : 0);
2355 static const struct mb_ucsrange data_wctype_space[] = {
2369 static const struct mb_ucsrange data_wctype_cntrl[] = {
2378 static const struct mb_ucsrange data_wctype_punct[] = {
2715 { 0x10100, 0x10102 },
2716 { 0x10107, 0x10133 },
2717 { 0x10137, 0x1018E },
2718 { 0x10190, 0x1019B },
2719 { 0x101A0, 0x101A0 },
2720 { 0x101D0, 0x101FD },
2721 { 0x102E0, 0x102FB },
2722 { 0x10320, 0x10323 },
2723 { 0x10341, 0x10341 },
2724 { 0x1034A, 0x1034A },
2725 { 0x10376, 0x1037A },
2726 { 0x1039F, 0x1039F },
2727 { 0x103D0, 0x103D5 },
2728 { 0x104A0, 0x104A9 },
2729 { 0x1056F, 0x1056F },
2730 { 0x10857, 0x1085F },
2731 { 0x10877, 0x1087F },
2732 { 0x108A7, 0x108AF },
2733 { 0x108FB, 0x108FF },
2734 { 0x10916, 0x1091B },
2735 { 0x1091F, 0x1091F },
2736 { 0x1093F, 0x1093F },
2737 { 0x109BC, 0x109BD },
2738 { 0x109C0, 0x109CF },
2739 { 0x109D2, 0x109FF },
2740 { 0x10A01, 0x10A03 },
2741 { 0x10A05, 0x10A06 },
2742 { 0x10A0C, 0x10A0F },
2743 { 0x10A38, 0x10A3A },
2744 { 0x10A3F, 0x10A47 },
2745 { 0x10A50, 0x10A58 },
2746 { 0x10A7D, 0x10A7F },
2747 { 0x10A9D, 0x10A9F },
2748 { 0x10AC8, 0x10AC8 },
2749 { 0x10AE5, 0x10AE6 },
2750 { 0x10AEB, 0x10AF6 },
2751 { 0x10B39, 0x10B3F },
2752 { 0x10B58, 0x10B5F },
2753 { 0x10B78, 0x10B7F },
2754 { 0x10B99, 0x10B9C },
2755 { 0x10BA9, 0x10BAF },
2756 { 0x10CFA, 0x10CFF },
2757 { 0x10E60, 0x10E7E },
2758 { 0x11000, 0x11002 },
2759 { 0x11038, 0x1104D },
2760 { 0x11052, 0x1106F },
2761 { 0x1107F, 0x11082 },
2762 { 0x110B0, 0x110C1 },
2763 { 0x110F0, 0x110F9 },
2764 { 0x11100, 0x11102 },
2765 { 0x11127, 0x11134 },
2766 { 0x11136, 0x11143 },
2767 { 0x11173, 0x11175 },
2768 { 0x11180, 0x11182 },
2769 { 0x111B3, 0x111C0 },
2770 { 0x111C5, 0x111CD },
2771 { 0x111D0, 0x111D9 },
2772 { 0x111DB, 0x111DB },
2773 { 0x111DD, 0x111DF },
2774 { 0x111E1, 0x111F4 },
2775 { 0x1122C, 0x1123E },
2776 { 0x112A9, 0x112A9 },
2777 { 0x112DF, 0x112EA },
2778 { 0x112F0, 0x112F9 },
2779 { 0x11300, 0x11303 },
2780 { 0x1133C, 0x1133C },
2781 { 0x1133E, 0x11344 },
2782 { 0x11347, 0x11348 },
2783 { 0x1134B, 0x1134D },
2784 { 0x11357, 0x11357 },
2785 { 0x11362, 0x11363 },
2786 { 0x11366, 0x1136C },
2787 { 0x11370, 0x11374 },
2788 { 0x11435, 0x11446 },
2789 { 0x1144B, 0x11459 },
2790 { 0x1145B, 0x1145B },
2791 { 0x1145D, 0x1145D },
2792 { 0x114B0, 0x114C3 },
2793 { 0x114C6, 0x114C6 },
2794 { 0x114D0, 0x114D9 },
2795 { 0x115AF, 0x115B5 },
2796 { 0x115B8, 0x115D7 },
2797 { 0x115DC, 0x115DD },
2798 { 0x11630, 0x11643 },
2799 { 0x11650, 0x11659 },
2800 { 0x11660, 0x1166C },
2801 { 0x116AB, 0x116B7 },
2802 { 0x116C0, 0x116C9 },
2803 { 0x1171D, 0x1172B },
2804 { 0x11730, 0x1173F },
2805 { 0x118E0, 0x118F2 },
2806 { 0x11A01, 0x11A0A },
2807 { 0x11A33, 0x11A39 },
2808 { 0x11A3B, 0x11A47 },
2809 { 0x11A51, 0x11A5B },
2810 { 0x11A8A, 0x11A9C },
2811 { 0x11A9E, 0x11AA2 },
2812 { 0x11C2F, 0x11C36 },
2813 { 0x11C38, 0x11C3F },
2814 { 0x11C41, 0x11C45 },
2815 { 0x11C50, 0x11C6C },
2816 { 0x11C70, 0x11C71 },
2817 { 0x11C92, 0x11CA7 },
2818 { 0x11CA9, 0x11CB6 },
2819 { 0x11D31, 0x11D36 },
2820 { 0x11D3A, 0x11D3A },
2821 { 0x11D3C, 0x11D3D },
2822 { 0x11D3F, 0x11D45 },
2823 { 0x11D47, 0x11D47 },
2824 { 0x11D50, 0x11D59 },
2825 { 0x12400, 0x1246E },
2826 { 0x12470, 0x12474 },
2827 { 0x16A60, 0x16A69 },
2828 { 0x16A6E, 0x16A6F },
2829 { 0x16AF0, 0x16AF5 },
2830 { 0x16B30, 0x16B3F },
2831 { 0x16B44, 0x16B45 },
2832 { 0x16B50, 0x16B59 },
2833 { 0x16B5B, 0x16B61 },
2834 { 0x16F51, 0x16F7E },
2835 { 0x16F8F, 0x16F92 },
2836 { 0x1BC9C, 0x1BCA3 },
2837 { 0x1D000, 0x1D0F5 },
2838 { 0x1D100, 0x1D126 },
2839 { 0x1D129, 0x1D1E8 },
2840 { 0x1D200, 0x1D245 },
2841 { 0x1D300, 0x1D356 },
2842 { 0x1D360, 0x1D371 },
2843 { 0x1D6C1, 0x1D6C1 },
2844 { 0x1D6DB, 0x1D6DB },
2845 { 0x1D6FB, 0x1D6FB },
2846 { 0x1D715, 0x1D715 },
2847 { 0x1D735, 0x1D735 },
2848 { 0x1D74F, 0x1D74F },
2849 { 0x1D76F, 0x1D76F },
2850 { 0x1D789, 0x1D789 },
2851 { 0x1D7A9, 0x1D7A9 },
2852 { 0x1D7C3, 0x1D7C3 },
2853 { 0x1D7CE, 0x1DA8B },
2854 { 0x1DA9B, 0x1DA9F },
2855 { 0x1DAA1, 0x1DAAF },
2856 { 0x1E000, 0x1E006 },
2857 { 0x1E008, 0x1E018 },
2858 { 0x1E01B, 0x1E021 },
2859 { 0x1E023, 0x1E024 },
2860 { 0x1E026, 0x1E02A },
2861 { 0x1E8C7, 0x1E8D6 },
2862 { 0x1E944, 0x1E94A },
2863 { 0x1E950, 0x1E959 },
2864 { 0x1E95E, 0x1E95F },
2865 { 0x1EEF0, 0x1EEF1 },
2866 { 0x1F000, 0x1F02B },
2867 { 0x1F030, 0x1F093 },
2868 { 0x1F0A0, 0x1F0AE },
2869 { 0x1F0B1, 0x1F0BF },
2870 { 0x1F0C1, 0x1F0CF },
2871 { 0x1F0D1, 0x1F0F5 },
2872 { 0x1F100, 0x1F10C },
2873 { 0x1F110, 0x1F12E },
2874 { 0x1F130, 0x1F16B },
2875 { 0x1F170, 0x1F1AC },
2876 { 0x1F1E6, 0x1F202 },
2877 { 0x1F210, 0x1F23B },
2878 { 0x1F240, 0x1F248 },
2879 { 0x1F250, 0x1F251 },
2880 { 0x1F260, 0x1F265 },
2881 { 0x1F300, 0x1F6D4 },
2882 { 0x1F6E0, 0x1F6EC },
2883 { 0x1F6F0, 0x1F6F8 },
2884 { 0x1F700, 0x1F773 },
2885 { 0x1F780, 0x1F7D4 },
2886 { 0x1F800, 0x1F80B },
2887 { 0x1F810, 0x1F847 },
2888 { 0x1F850, 0x1F859 },
2889 { 0x1F860, 0x1F887 },
2890 { 0x1F890, 0x1F8AD },
2891 { 0x1F900, 0x1F90B },
2892 { 0x1F910, 0x1F93E },
2893 { 0x1F940, 0x1F94C },
2894 { 0x1F950, 0x1F96B },
2895 { 0x1F980, 0x1F997 },
2896 { 0x1F9C0, 0x1F9C0 },
2897 { 0x1F9D0, 0x1F9E6 },
2898 { 0xE0001, 0xE0001 },
2899 { 0xE0020, 0xE007F },
2900 { 0xE0100, 0xE01EF },
2901 { 0xF0000, 0xFFFFD },
2902 { 0x100000, 0x10FFFD }
2908 static const struct mb_ucsrange data_wctype_graph[] = {
3273 { 0x10000, 0x1000B },
3274 { 0x1000D, 0x10026 },
3275 { 0x10028, 0x1003A },
3276 { 0x1003C, 0x1003D },
3277 { 0x1003F, 0x1004D },
3278 { 0x10050, 0x1005D },
3279 { 0x10080, 0x100FA },
3280 { 0x10100, 0x10102 },
3281 { 0x10107, 0x10133 },
3282 { 0x10137, 0x1018E },
3283 { 0x10190, 0x1019B },
3284 { 0x101A0, 0x101A0 },
3285 { 0x101D0, 0x101FD },
3286 { 0x10280, 0x1029C },
3287 { 0x102A0, 0x102D0 },
3288 { 0x102E0, 0x102FB },
3289 { 0x10300, 0x10323 },
3290 { 0x1032D, 0x1034A },
3291 { 0x10350, 0x1037A },
3292 { 0x10380, 0x1039D },
3293 { 0x1039F, 0x103C3 },
3294 { 0x103C8, 0x103D5 },
3295 { 0x10400, 0x1049D },
3296 { 0x104A0, 0x104A9 },
3297 { 0x104B0, 0x104D3 },
3298 { 0x104D8, 0x104FB },
3299 { 0x10500, 0x10527 },
3300 { 0x10530, 0x10563 },
3301 { 0x1056F, 0x1056F },
3302 { 0x10600, 0x10736 },
3303 { 0x10740, 0x10755 },
3304 { 0x10760, 0x10767 },
3305 { 0x10800, 0x10805 },
3306 { 0x10808, 0x10808 },
3307 { 0x1080A, 0x10835 },
3308 { 0x10837, 0x10838 },
3309 { 0x1083C, 0x1083C },
3310 { 0x1083F, 0x10855 },
3311 { 0x10857, 0x1089E },
3312 { 0x108A7, 0x108AF },
3313 { 0x108E0, 0x108F2 },
3314 { 0x108F4, 0x108F5 },
3315 { 0x108FB, 0x1091B },
3316 { 0x1091F, 0x10939 },
3317 { 0x1093F, 0x1093F },
3318 { 0x10980, 0x109B7 },
3319 { 0x109BC, 0x109CF },
3320 { 0x109D2, 0x10A03 },
3321 { 0x10A05, 0x10A06 },
3322 { 0x10A0C, 0x10A13 },
3323 { 0x10A15, 0x10A17 },
3324 { 0x10A19, 0x10A33 },
3325 { 0x10A38, 0x10A3A },
3326 { 0x10A3F, 0x10A47 },
3327 { 0x10A50, 0x10A58 },
3328 { 0x10A60, 0x10A9F },
3329 { 0x10AC0, 0x10AE6 },
3330 { 0x10AEB, 0x10AF6 },
3331 { 0x10B00, 0x10B35 },
3332 { 0x10B39, 0x10B55 },
3333 { 0x10B58, 0x10B72 },
3334 { 0x10B78, 0x10B91 },
3335 { 0x10B99, 0x10B9C },
3336 { 0x10BA9, 0x10BAF },
3337 { 0x10C00, 0x10C48 },
3338 { 0x10C80, 0x10CB2 },
3339 { 0x10CC0, 0x10CF2 },
3340 { 0x10CFA, 0x10CFF },
3341 { 0x10E60, 0x10E7E },
3342 { 0x11000, 0x1104D },
3343 { 0x11052, 0x1106F },
3344 { 0x1107F, 0x110C1 },
3345 { 0x110D0, 0x110E8 },
3346 { 0x110F0, 0x110F9 },
3347 { 0x11100, 0x11134 },
3348 { 0x11136, 0x11143 },
3349 { 0x11150, 0x11176 },
3350 { 0x11180, 0x111CD },
3351 { 0x111D0, 0x111DF },