Ajla 0.1.5
[ajla.git] / scripts / charset / widechar_width.h
blob5f9416ba8a2fd11b973a61f71e902f157c2740bd
1 /**
2 * widechar_width.h for Unicode 15.0.0
3 * See https://github.com/ridiculousfish/widecharwidth/
5 * SHA1 file hashes:
6 * (
7 * the hashes for generate.py and the template are git object hashes,
8 * use `git log --all --find-object=<hash>` in the widecharwidth repository
9 * to see which commit they correspond to,
10 * or run `git hash-object` on the file to compare.
11 * The other hashes are simple `sha1sum` style hashes.
12 * )
14 * generate.py: 1d24de5a7caf6e8cc4e5a688ea83db972efe4538
15 * template.js: 1249763c5b7c1e308aeb4ca64f1e15bce1fab9b3
16 * UnicodeData.txt: 3e1900295af0978ad6be3153de4c97d55198ab4b
17 * EastAsianWidth.txt: 2637ce61d024cb25c768023fa4d7594b53474919
18 * emoji-data.txt: 7754a51be6ebe38f906e4fe948720e0f3b78bfd7
21 #ifndef WIDECHAR_WIDTH_H
22 #define WIDECHAR_WIDTH_H
24 #include <algorithm>
25 #include <iterator>
26 #include <cstddef>
27 #include <cstdint>
29 namespace {
31 /* Special width values */
32 enum {
33 widechar_nonprint = -1, // The character is not printable.
34 widechar_combining = -2, // The character is a zero-width combiner.
35 widechar_ambiguous = -3, // The character is East-Asian ambiguous width.
36 widechar_private_use = -4, // The character is for private use.
37 widechar_unassigned = -5, // The character is unassigned.
38 widechar_widened_in_9 = -6, // Width is 1 in Unicode 8, 2 in Unicode 9+.
39 widechar_non_character = -7 // The character is a noncharacter.
42 /* An inclusive range of characters. */
43 struct widechar_range {
44 uint32_t lo;
45 uint32_t hi;
48 /* Simple ASCII characters - used a lot, so we check them first. */
49 static const struct widechar_range widechar_ascii_table[] = {
50 {0x00020, 0x0007E}
53 /* Private usage range. */
54 static const struct widechar_range widechar_private_table[] = {
55 {0x0E000, 0x0F8FF},
56 {0xF0000, 0xFFFFD},
57 {0x100000, 0x10FFFD}
60 /* Nonprinting characters. */
61 static const struct widechar_range widechar_nonprint_table[] = {
62 {0x00000, 0x0001F},
63 {0x0007F, 0x0009F},
64 {0x000AD, 0x000AD},
65 {0x00600, 0x00605},
66 {0x0061C, 0x0061C},
67 {0x006DD, 0x006DD},
68 {0x0070F, 0x0070F},
69 {0x00890, 0x00891},
70 {0x008E2, 0x008E2},
71 {0x0180E, 0x0180E},
72 {0x0200B, 0x0200F},
73 {0x02028, 0x0202E},
74 {0x02060, 0x02064},
75 {0x02066, 0x0206F},
76 {0x0D800, 0x0DFFF},
77 {0x0FEFF, 0x0FEFF},
78 {0x0FFF9, 0x0FFFB},
79 {0x110BD, 0x110BD},
80 {0x110CD, 0x110CD},
81 {0x13430, 0x1343F},
82 {0x1BCA0, 0x1BCA3},
83 {0x1D173, 0x1D17A},
84 {0xE0001, 0xE0001},
85 {0xE0020, 0xE007F}
88 /* Width 0 combining marks. */
89 static const struct widechar_range widechar_combining_table[] = {
90 {0x00300, 0x0036F},
91 {0x00483, 0x00489},
92 {0x00591, 0x005BD},
93 {0x005BF, 0x005BF},
94 {0x005C1, 0x005C2},
95 {0x005C4, 0x005C5},
96 {0x005C7, 0x005C7},
97 {0x00610, 0x0061A},
98 {0x0064B, 0x0065F},
99 {0x00670, 0x00670},
100 {0x006D6, 0x006DC},
101 {0x006DF, 0x006E4},
102 {0x006E7, 0x006E8},
103 {0x006EA, 0x006ED},
104 {0x00711, 0x00711},
105 {0x00730, 0x0074A},
106 {0x007A6, 0x007B0},
107 {0x007EB, 0x007F3},
108 {0x007FD, 0x007FD},
109 {0x00816, 0x00819},
110 {0x0081B, 0x00823},
111 {0x00825, 0x00827},
112 {0x00829, 0x0082D},
113 {0x00859, 0x0085B},
114 {0x00898, 0x0089F},
115 {0x008CA, 0x008E1},
116 {0x008E3, 0x00903},
117 {0x0093A, 0x0093C},
118 {0x0093E, 0x0094F},
119 {0x00951, 0x00957},
120 {0x00962, 0x00963},
121 {0x00981, 0x00983},
122 {0x009BC, 0x009BC},
123 {0x009BE, 0x009C4},
124 {0x009C7, 0x009C8},
125 {0x009CB, 0x009CD},
126 {0x009D7, 0x009D7},
127 {0x009E2, 0x009E3},
128 {0x009FE, 0x009FE},
129 {0x00A01, 0x00A03},
130 {0x00A3C, 0x00A3C},
131 {0x00A3E, 0x00A42},
132 {0x00A47, 0x00A48},
133 {0x00A4B, 0x00A4D},
134 {0x00A51, 0x00A51},
135 {0x00A70, 0x00A71},
136 {0x00A75, 0x00A75},
137 {0x00A81, 0x00A83},
138 {0x00ABC, 0x00ABC},
139 {0x00ABE, 0x00AC5},
140 {0x00AC7, 0x00AC9},
141 {0x00ACB, 0x00ACD},
142 {0x00AE2, 0x00AE3},
143 {0x00AFA, 0x00AFF},
144 {0x00B01, 0x00B03},
145 {0x00B3C, 0x00B3C},
146 {0x00B3E, 0x00B44},
147 {0x00B47, 0x00B48},
148 {0x00B4B, 0x00B4D},
149 {0x00B55, 0x00B57},
150 {0x00B62, 0x00B63},
151 {0x00B82, 0x00B82},
152 {0x00BBE, 0x00BC2},
153 {0x00BC6, 0x00BC8},
154 {0x00BCA, 0x00BCD},
155 {0x00BD7, 0x00BD7},
156 {0x00C00, 0x00C04},
157 {0x00C3C, 0x00C3C},
158 {0x00C3E, 0x00C44},
159 {0x00C46, 0x00C48},
160 {0x00C4A, 0x00C4D},
161 {0x00C55, 0x00C56},
162 {0x00C62, 0x00C63},
163 {0x00C81, 0x00C83},
164 {0x00CBC, 0x00CBC},
165 {0x00CBE, 0x00CC4},
166 {0x00CC6, 0x00CC8},
167 {0x00CCA, 0x00CCD},
168 {0x00CD5, 0x00CD6},
169 {0x00CE2, 0x00CE3},
170 {0x00CF3, 0x00CF3},
171 {0x00D00, 0x00D03},
172 {0x00D3B, 0x00D3C},
173 {0x00D3E, 0x00D44},
174 {0x00D46, 0x00D48},
175 {0x00D4A, 0x00D4D},
176 {0x00D57, 0x00D57},
177 {0x00D62, 0x00D63},
178 {0x00D81, 0x00D83},
179 {0x00DCA, 0x00DCA},
180 {0x00DCF, 0x00DD4},
181 {0x00DD6, 0x00DD6},
182 {0x00DD8, 0x00DDF},
183 {0x00DF2, 0x00DF3},
184 {0x00E31, 0x00E31},
185 {0x00E34, 0x00E3A},
186 {0x00E47, 0x00E4E},
187 {0x00EB1, 0x00EB1},
188 {0x00EB4, 0x00EBC},
189 {0x00EC8, 0x00ECE},
190 {0x00F18, 0x00F19},
191 {0x00F35, 0x00F35},
192 {0x00F37, 0x00F37},
193 {0x00F39, 0x00F39},
194 {0x00F3E, 0x00F3F},
195 {0x00F71, 0x00F84},
196 {0x00F86, 0x00F87},
197 {0x00F8D, 0x00F97},
198 {0x00F99, 0x00FBC},
199 {0x00FC6, 0x00FC6},
200 {0x0102B, 0x0103E},
201 {0x01056, 0x01059},
202 {0x0105E, 0x01060},
203 {0x01062, 0x01064},
204 {0x01067, 0x0106D},
205 {0x01071, 0x01074},
206 {0x01082, 0x0108D},
207 {0x0108F, 0x0108F},
208 {0x0109A, 0x0109D},
209 {0x0135D, 0x0135F},
210 {0x01712, 0x01715},
211 {0x01732, 0x01734},
212 {0x01752, 0x01753},
213 {0x01772, 0x01773},
214 {0x017B4, 0x017D3},
215 {0x017DD, 0x017DD},
216 {0x0180B, 0x0180D},
217 {0x0180F, 0x0180F},
218 {0x01885, 0x01886},
219 {0x018A9, 0x018A9},
220 {0x01920, 0x0192B},
221 {0x01930, 0x0193B},
222 {0x01A17, 0x01A1B},
223 {0x01A55, 0x01A5E},
224 {0x01A60, 0x01A7C},
225 {0x01A7F, 0x01A7F},
226 {0x01AB0, 0x01ACE},
227 {0x01B00, 0x01B04},
228 {0x01B34, 0x01B44},
229 {0x01B6B, 0x01B73},
230 {0x01B80, 0x01B82},
231 {0x01BA1, 0x01BAD},
232 {0x01BE6, 0x01BF3},
233 {0x01C24, 0x01C37},
234 {0x01CD0, 0x01CD2},
235 {0x01CD4, 0x01CE8},
236 {0x01CED, 0x01CED},
237 {0x01CF4, 0x01CF4},
238 {0x01CF7, 0x01CF9},
239 {0x01DC0, 0x01DFF},
240 {0x020D0, 0x020F0},
241 {0x02CEF, 0x02CF1},
242 {0x02D7F, 0x02D7F},
243 {0x02DE0, 0x02DFF},
244 {0x0302A, 0x0302F},
245 {0x03099, 0x0309A},
246 {0x0A66F, 0x0A672},
247 {0x0A674, 0x0A67D},
248 {0x0A69E, 0x0A69F},
249 {0x0A6F0, 0x0A6F1},
250 {0x0A802, 0x0A802},
251 {0x0A806, 0x0A806},
252 {0x0A80B, 0x0A80B},
253 {0x0A823, 0x0A827},
254 {0x0A82C, 0x0A82C},
255 {0x0A880, 0x0A881},
256 {0x0A8B4, 0x0A8C5},
257 {0x0A8E0, 0x0A8F1},
258 {0x0A8FF, 0x0A8FF},
259 {0x0A926, 0x0A92D},
260 {0x0A947, 0x0A953},
261 {0x0A980, 0x0A983},
262 {0x0A9B3, 0x0A9C0},
263 {0x0A9E5, 0x0A9E5},
264 {0x0AA29, 0x0AA36},
265 {0x0AA43, 0x0AA43},
266 {0x0AA4C, 0x0AA4D},
267 {0x0AA7B, 0x0AA7D},
268 {0x0AAB0, 0x0AAB0},
269 {0x0AAB2, 0x0AAB4},
270 {0x0AAB7, 0x0AAB8},
271 {0x0AABE, 0x0AABF},
272 {0x0AAC1, 0x0AAC1},
273 {0x0AAEB, 0x0AAEF},
274 {0x0AAF5, 0x0AAF6},
275 {0x0ABE3, 0x0ABEA},
276 {0x0ABEC, 0x0ABED},
277 {0x0FB1E, 0x0FB1E},
278 {0x0FE00, 0x0FE0F},
279 {0x0FE20, 0x0FE2F},
280 {0x101FD, 0x101FD},
281 {0x102E0, 0x102E0},
282 {0x10376, 0x1037A},
283 {0x10A01, 0x10A03},
284 {0x10A05, 0x10A06},
285 {0x10A0C, 0x10A0F},
286 {0x10A38, 0x10A3A},
287 {0x10A3F, 0x10A3F},
288 {0x10AE5, 0x10AE6},
289 {0x10D24, 0x10D27},
290 {0x10EAB, 0x10EAC},
291 {0x10EFD, 0x10EFF},
292 {0x10F46, 0x10F50},
293 {0x10F82, 0x10F85},
294 {0x11000, 0x11002},
295 {0x11038, 0x11046},
296 {0x11070, 0x11070},
297 {0x11073, 0x11074},
298 {0x1107F, 0x11082},
299 {0x110B0, 0x110BA},
300 {0x110C2, 0x110C2},
301 {0x11100, 0x11102},
302 {0x11127, 0x11134},
303 {0x11145, 0x11146},
304 {0x11173, 0x11173},
305 {0x11180, 0x11182},
306 {0x111B3, 0x111C0},
307 {0x111C9, 0x111CC},
308 {0x111CE, 0x111CF},
309 {0x1122C, 0x11237},
310 {0x1123E, 0x1123E},
311 {0x11241, 0x11241},
312 {0x112DF, 0x112EA},
313 {0x11300, 0x11303},
314 {0x1133B, 0x1133C},
315 {0x1133E, 0x11344},
316 {0x11347, 0x11348},
317 {0x1134B, 0x1134D},
318 {0x11357, 0x11357},
319 {0x11362, 0x11363},
320 {0x11366, 0x1136C},
321 {0x11370, 0x11374},
322 {0x11435, 0x11446},
323 {0x1145E, 0x1145E},
324 {0x114B0, 0x114C3},
325 {0x115AF, 0x115B5},
326 {0x115B8, 0x115C0},
327 {0x115DC, 0x115DD},
328 {0x11630, 0x11640},
329 {0x116AB, 0x116B7},
330 {0x1171D, 0x1172B},
331 {0x1182C, 0x1183A},
332 {0x11930, 0x11935},
333 {0x11937, 0x11938},
334 {0x1193B, 0x1193E},
335 {0x11940, 0x11940},
336 {0x11942, 0x11943},
337 {0x119D1, 0x119D7},
338 {0x119DA, 0x119E0},
339 {0x119E4, 0x119E4},
340 {0x11A01, 0x11A0A},
341 {0x11A33, 0x11A39},
342 {0x11A3B, 0x11A3E},
343 {0x11A47, 0x11A47},
344 {0x11A51, 0x11A5B},
345 {0x11A8A, 0x11A99},
346 {0x11C2F, 0x11C36},
347 {0x11C38, 0x11C3F},
348 {0x11C92, 0x11CA7},
349 {0x11CA9, 0x11CB6},
350 {0x11D31, 0x11D36},
351 {0x11D3A, 0x11D3A},
352 {0x11D3C, 0x11D3D},
353 {0x11D3F, 0x11D45},
354 {0x11D47, 0x11D47},
355 {0x11D8A, 0x11D8E},
356 {0x11D90, 0x11D91},
357 {0x11D93, 0x11D97},
358 {0x11EF3, 0x11EF6},
359 {0x11F00, 0x11F01},
360 {0x11F03, 0x11F03},
361 {0x11F34, 0x11F3A},
362 {0x11F3E, 0x11F42},
363 {0x13440, 0x13440},
364 {0x13447, 0x13455},
365 {0x16AF0, 0x16AF4},
366 {0x16B30, 0x16B36},
367 {0x16F4F, 0x16F4F},
368 {0x16F51, 0x16F87},
369 {0x16F8F, 0x16F92},
370 {0x16FE4, 0x16FE4},
371 {0x16FF0, 0x16FF1},
372 {0x1BC9D, 0x1BC9E},
373 {0x1CF00, 0x1CF2D},
374 {0x1CF30, 0x1CF46},
375 {0x1D165, 0x1D169},
376 {0x1D16D, 0x1D172},
377 {0x1D17B, 0x1D182},
378 {0x1D185, 0x1D18B},
379 {0x1D1AA, 0x1D1AD},
380 {0x1D242, 0x1D244},
381 {0x1DA00, 0x1DA36},
382 {0x1DA3B, 0x1DA6C},
383 {0x1DA75, 0x1DA75},
384 {0x1DA84, 0x1DA84},
385 {0x1DA9B, 0x1DA9F},
386 {0x1DAA1, 0x1DAAF},
387 {0x1E000, 0x1E006},
388 {0x1E008, 0x1E018},
389 {0x1E01B, 0x1E021},
390 {0x1E023, 0x1E024},
391 {0x1E026, 0x1E02A},
392 {0x1E08F, 0x1E08F},
393 {0x1E130, 0x1E136},
394 {0x1E2AE, 0x1E2AE},
395 {0x1E2EC, 0x1E2EF},
396 {0x1E4EC, 0x1E4EF},
397 {0x1E8D0, 0x1E8D6},
398 {0x1E944, 0x1E94A},
399 {0xE0100, 0xE01EF}
402 /* Width 0 combining letters. */
403 static const struct widechar_range widechar_combiningletters_table[] = {
404 {0x01160, 0x011FF},
405 {0x0D7B0, 0x0D7FF}
408 /* Width 2 characters. */
409 static const struct widechar_range widechar_doublewide_table[] = {
410 {0x01100, 0x0115F},
411 {0x02329, 0x0232A},
412 {0x02E80, 0x02E99},
413 {0x02E9B, 0x02EF3},
414 {0x02F00, 0x02FD5},
415 {0x02FF0, 0x02FFB},
416 {0x03000, 0x0303E},
417 {0x03041, 0x03096},
418 {0x03099, 0x030FF},
419 {0x03105, 0x0312F},
420 {0x03131, 0x0318E},
421 {0x03190, 0x031E3},
422 {0x031F0, 0x0321E},
423 {0x03220, 0x03247},
424 {0x03250, 0x04DBF},
425 {0x04E00, 0x0A48C},
426 {0x0A490, 0x0A4C6},
427 {0x0A960, 0x0A97C},
428 {0x0AC00, 0x0D7A3},
429 {0x0F900, 0x0FAFF},
430 {0x0FE10, 0x0FE19},
431 {0x0FE30, 0x0FE52},
432 {0x0FE54, 0x0FE66},
433 {0x0FE68, 0x0FE6B},
434 {0x0FF01, 0x0FF60},
435 {0x0FFE0, 0x0FFE6},
436 {0x16FE0, 0x16FE4},
437 {0x16FF0, 0x16FF1},
438 {0x17000, 0x187F7},
439 {0x18800, 0x18CD5},
440 {0x18D00, 0x18D08},
441 {0x1AFF0, 0x1AFF3},
442 {0x1AFF5, 0x1AFFB},
443 {0x1AFFD, 0x1AFFE},
444 {0x1B000, 0x1B122},
445 {0x1B132, 0x1B132},
446 {0x1B150, 0x1B152},
447 {0x1B155, 0x1B155},
448 {0x1B164, 0x1B167},
449 {0x1B170, 0x1B2FB},
450 {0x1F200, 0x1F200},
451 {0x1F202, 0x1F202},
452 {0x1F210, 0x1F219},
453 {0x1F21B, 0x1F22E},
454 {0x1F230, 0x1F231},
455 {0x1F237, 0x1F237},
456 {0x1F23B, 0x1F23B},
457 {0x1F240, 0x1F248},
458 {0x1F260, 0x1F265},
459 {0x1F57A, 0x1F57A},
460 {0x1F5A4, 0x1F5A4},
461 {0x1F6D1, 0x1F6D2},
462 {0x1F6D5, 0x1F6D7},
463 {0x1F6DC, 0x1F6DF},
464 {0x1F6F4, 0x1F6FC},
465 {0x1F7E0, 0x1F7EB},
466 {0x1F7F0, 0x1F7F0},
467 {0x1F90C, 0x1F90F},
468 {0x1F919, 0x1F93A},
469 {0x1F93C, 0x1F945},
470 {0x1F947, 0x1F97F},
471 {0x1F985, 0x1F9BF},
472 {0x1F9C1, 0x1F9FF},
473 {0x1FA70, 0x1FA7C},
474 {0x1FA80, 0x1FA88},
475 {0x1FA90, 0x1FABD},
476 {0x1FABF, 0x1FAC5},
477 {0x1FACE, 0x1FADB},
478 {0x1FAE0, 0x1FAE8},
479 {0x1FAF0, 0x1FAF8},
480 {0x20000, 0x2FFFD},
481 {0x30000, 0x3FFFD}
484 /* Ambiguous-width characters. */
485 static const struct widechar_range widechar_ambiguous_table[] = {
486 {0x000A1, 0x000A1},
487 {0x000A4, 0x000A4},
488 {0x000A7, 0x000A8},
489 {0x000AA, 0x000AA},
490 {0x000AD, 0x000AE},
491 {0x000B0, 0x000B4},
492 {0x000B6, 0x000BA},
493 {0x000BC, 0x000BF},
494 {0x000C6, 0x000C6},
495 {0x000D0, 0x000D0},
496 {0x000D7, 0x000D8},
497 {0x000DE, 0x000E1},
498 {0x000E6, 0x000E6},
499 {0x000E8, 0x000EA},
500 {0x000EC, 0x000ED},
501 {0x000F0, 0x000F0},
502 {0x000F2, 0x000F3},
503 {0x000F7, 0x000FA},
504 {0x000FC, 0x000FC},
505 {0x000FE, 0x000FE},
506 {0x00101, 0x00101},
507 {0x00111, 0x00111},
508 {0x00113, 0x00113},
509 {0x0011B, 0x0011B},
510 {0x00126, 0x00127},
511 {0x0012B, 0x0012B},
512 {0x00131, 0x00133},
513 {0x00138, 0x00138},
514 {0x0013F, 0x00142},
515 {0x00144, 0x00144},
516 {0x00148, 0x0014B},
517 {0x0014D, 0x0014D},
518 {0x00152, 0x00153},
519 {0x00166, 0x00167},
520 {0x0016B, 0x0016B},
521 {0x001CE, 0x001CE},
522 {0x001D0, 0x001D0},
523 {0x001D2, 0x001D2},
524 {0x001D4, 0x001D4},
525 {0x001D6, 0x001D6},
526 {0x001D8, 0x001D8},
527 {0x001DA, 0x001DA},
528 {0x001DC, 0x001DC},
529 {0x00251, 0x00251},
530 {0x00261, 0x00261},
531 {0x002C4, 0x002C4},
532 {0x002C7, 0x002C7},
533 {0x002C9, 0x002CB},
534 {0x002CD, 0x002CD},
535 {0x002D0, 0x002D0},
536 {0x002D8, 0x002DB},
537 {0x002DD, 0x002DD},
538 {0x002DF, 0x002DF},
539 {0x00300, 0x0036F},
540 {0x00391, 0x003A1},
541 {0x003A3, 0x003A9},
542 {0x003B1, 0x003C1},
543 {0x003C3, 0x003C9},
544 {0x00401, 0x00401},
545 {0x00410, 0x0044F},
546 {0x00451, 0x00451},
547 {0x02010, 0x02010},
548 {0x02013, 0x02016},
549 {0x02018, 0x02019},
550 {0x0201C, 0x0201D},
551 {0x02020, 0x02022},
552 {0x02024, 0x02027},
553 {0x02030, 0x02030},
554 {0x02032, 0x02033},
555 {0x02035, 0x02035},
556 {0x0203B, 0x0203B},
557 {0x0203E, 0x0203E},
558 {0x02074, 0x02074},
559 {0x0207F, 0x0207F},
560 {0x02081, 0x02084},
561 {0x020AC, 0x020AC},
562 {0x02103, 0x02103},
563 {0x02105, 0x02105},
564 {0x02109, 0x02109},
565 {0x02113, 0x02113},
566 {0x02116, 0x02116},
567 {0x02121, 0x02122},
568 {0x02126, 0x02126},
569 {0x0212B, 0x0212B},
570 {0x02153, 0x02154},
571 {0x0215B, 0x0215E},
572 {0x02160, 0x0216B},
573 {0x02170, 0x02179},
574 {0x02189, 0x02189},
575 {0x02190, 0x02199},
576 {0x021B8, 0x021B9},
577 {0x021D2, 0x021D2},
578 {0x021D4, 0x021D4},
579 {0x021E7, 0x021E7},
580 {0x02200, 0x02200},
581 {0x02202, 0x02203},
582 {0x02207, 0x02208},
583 {0x0220B, 0x0220B},
584 {0x0220F, 0x0220F},
585 {0x02211, 0x02211},
586 {0x02215, 0x02215},
587 {0x0221A, 0x0221A},
588 {0x0221D, 0x02220},
589 {0x02223, 0x02223},
590 {0x02225, 0x02225},
591 {0x02227, 0x0222C},
592 {0x0222E, 0x0222E},
593 {0x02234, 0x02237},
594 {0x0223C, 0x0223D},
595 {0x02248, 0x02248},
596 {0x0224C, 0x0224C},
597 {0x02252, 0x02252},
598 {0x02260, 0x02261},
599 {0x02264, 0x02267},
600 {0x0226A, 0x0226B},
601 {0x0226E, 0x0226F},
602 {0x02282, 0x02283},
603 {0x02286, 0x02287},
604 {0x02295, 0x02295},
605 {0x02299, 0x02299},
606 {0x022A5, 0x022A5},
607 {0x022BF, 0x022BF},
608 {0x02312, 0x02312},
609 {0x02460, 0x024E9},
610 {0x024EB, 0x0254B},
611 {0x02550, 0x02573},
612 {0x02580, 0x0258F},
613 {0x02592, 0x02595},
614 {0x025A0, 0x025A1},
615 {0x025A3, 0x025A9},
616 {0x025B2, 0x025B3},
617 {0x025B6, 0x025B7},
618 {0x025BC, 0x025BD},
619 {0x025C0, 0x025C1},
620 {0x025C6, 0x025C8},
621 {0x025CB, 0x025CB},
622 {0x025CE, 0x025D1},
623 {0x025E2, 0x025E5},
624 {0x025EF, 0x025EF},
625 {0x02605, 0x02606},
626 {0x02609, 0x02609},
627 {0x0260E, 0x0260F},
628 {0x0261C, 0x0261C},
629 {0x0261E, 0x0261E},
630 {0x02640, 0x02640},
631 {0x02642, 0x02642},
632 {0x02660, 0x02661},
633 {0x02663, 0x02665},
634 {0x02667, 0x0266A},
635 {0x0266C, 0x0266D},
636 {0x0266F, 0x0266F},
637 {0x0269E, 0x0269F},
638 {0x026BF, 0x026BF},
639 {0x026C6, 0x026CD},
640 {0x026CF, 0x026D3},
641 {0x026D5, 0x026E1},
642 {0x026E3, 0x026E3},
643 {0x026E8, 0x026E9},
644 {0x026EB, 0x026F1},
645 {0x026F4, 0x026F4},
646 {0x026F6, 0x026F9},
647 {0x026FB, 0x026FC},
648 {0x026FE, 0x026FF},
649 {0x0273D, 0x0273D},
650 {0x02776, 0x0277F},
651 {0x02B56, 0x02B59},
652 {0x03248, 0x0324F},
653 {0x0E000, 0x0F8FF},
654 {0x0FE00, 0x0FE0F},
655 {0x0FFFD, 0x0FFFD},
656 {0x1F100, 0x1F10A},
657 {0x1F110, 0x1F12D},
658 {0x1F130, 0x1F169},
659 {0x1F170, 0x1F18D},
660 {0x1F18F, 0x1F190},
661 {0x1F19B, 0x1F1AC},
662 {0xE0100, 0xE01EF},
663 {0xF0000, 0xFFFFD},
664 {0x100000, 0x10FFFD}
667 /* Unassigned characters. */
668 static const struct widechar_range widechar_unassigned_table[] = {
669 {0x00378, 0x00379},
670 {0x00380, 0x00383},
671 {0x0038B, 0x0038B},
672 {0x0038D, 0x0038D},
673 {0x003A2, 0x003A2},
674 {0x00530, 0x00530},
675 {0x00557, 0x00558},
676 {0x0058B, 0x0058C},
677 {0x00590, 0x00590},
678 {0x005C8, 0x005CF},
679 {0x005EB, 0x005EE},
680 {0x005F5, 0x005FF},
681 {0x0070E, 0x0070E},
682 {0x0074B, 0x0074C},
683 {0x007B2, 0x007BF},
684 {0x007FB, 0x007FC},
685 {0x0082E, 0x0082F},
686 {0x0083F, 0x0083F},
687 {0x0085C, 0x0085D},
688 {0x0085F, 0x0085F},
689 {0x0086B, 0x0086F},
690 {0x0088F, 0x0088F},
691 {0x00892, 0x00897},
692 {0x00984, 0x00984},
693 {0x0098D, 0x0098E},
694 {0x00991, 0x00992},
695 {0x009A9, 0x009A9},
696 {0x009B1, 0x009B1},
697 {0x009B3, 0x009B5},
698 {0x009BA, 0x009BB},
699 {0x009C5, 0x009C6},
700 {0x009C9, 0x009CA},
701 {0x009CF, 0x009D6},
702 {0x009D8, 0x009DB},
703 {0x009DE, 0x009DE},
704 {0x009E4, 0x009E5},
705 {0x009FF, 0x00A00},
706 {0x00A04, 0x00A04},
707 {0x00A0B, 0x00A0E},
708 {0x00A11, 0x00A12},
709 {0x00A29, 0x00A29},
710 {0x00A31, 0x00A31},
711 {0x00A34, 0x00A34},
712 {0x00A37, 0x00A37},
713 {0x00A3A, 0x00A3B},
714 {0x00A3D, 0x00A3D},
715 {0x00A43, 0x00A46},
716 {0x00A49, 0x00A4A},
717 {0x00A4E, 0x00A50},
718 {0x00A52, 0x00A58},
719 {0x00A5D, 0x00A5D},
720 {0x00A5F, 0x00A65},
721 {0x00A77, 0x00A80},
722 {0x00A84, 0x00A84},
723 {0x00A8E, 0x00A8E},
724 {0x00A92, 0x00A92},
725 {0x00AA9, 0x00AA9},
726 {0x00AB1, 0x00AB1},
727 {0x00AB4, 0x00AB4},
728 {0x00ABA, 0x00ABB},
729 {0x00AC6, 0x00AC6},
730 {0x00ACA, 0x00ACA},
731 {0x00ACE, 0x00ACF},
732 {0x00AD1, 0x00ADF},
733 {0x00AE4, 0x00AE5},
734 {0x00AF2, 0x00AF8},
735 {0x00B00, 0x00B00},
736 {0x00B04, 0x00B04},
737 {0x00B0D, 0x00B0E},
738 {0x00B11, 0x00B12},
739 {0x00B29, 0x00B29},
740 {0x00B31, 0x00B31},
741 {0x00B34, 0x00B34},
742 {0x00B3A, 0x00B3B},
743 {0x00B45, 0x00B46},
744 {0x00B49, 0x00B4A},
745 {0x00B4E, 0x00B54},
746 {0x00B58, 0x00B5B},
747 {0x00B5E, 0x00B5E},
748 {0x00B64, 0x00B65},
749 {0x00B78, 0x00B81},
750 {0x00B84, 0x00B84},
751 {0x00B8B, 0x00B8D},
752 {0x00B91, 0x00B91},
753 {0x00B96, 0x00B98},
754 {0x00B9B, 0x00B9B},
755 {0x00B9D, 0x00B9D},
756 {0x00BA0, 0x00BA2},
757 {0x00BA5, 0x00BA7},
758 {0x00BAB, 0x00BAD},
759 {0x00BBA, 0x00BBD},
760 {0x00BC3, 0x00BC5},
761 {0x00BC9, 0x00BC9},
762 {0x00BCE, 0x00BCF},
763 {0x00BD1, 0x00BD6},
764 {0x00BD8, 0x00BE5},
765 {0x00BFB, 0x00BFF},
766 {0x00C0D, 0x00C0D},
767 {0x00C11, 0x00C11},
768 {0x00C29, 0x00C29},
769 {0x00C3A, 0x00C3B},
770 {0x00C45, 0x00C45},
771 {0x00C49, 0x00C49},
772 {0x00C4E, 0x00C54},
773 {0x00C57, 0x00C57},
774 {0x00C5B, 0x00C5C},
775 {0x00C5E, 0x00C5F},
776 {0x00C64, 0x00C65},
777 {0x00C70, 0x00C76},
778 {0x00C8D, 0x00C8D},
779 {0x00C91, 0x00C91},
780 {0x00CA9, 0x00CA9},
781 {0x00CB4, 0x00CB4},
782 {0x00CBA, 0x00CBB},
783 {0x00CC5, 0x00CC5},
784 {0x00CC9, 0x00CC9},
785 {0x00CCE, 0x00CD4},
786 {0x00CD7, 0x00CDC},
787 {0x00CDF, 0x00CDF},
788 {0x00CE4, 0x00CE5},
789 {0x00CF0, 0x00CF0},
790 {0x00CF4, 0x00CFF},
791 {0x00D0D, 0x00D0D},
792 {0x00D11, 0x00D11},
793 {0x00D45, 0x00D45},
794 {0x00D49, 0x00D49},
795 {0x00D50, 0x00D53},
796 {0x00D64, 0x00D65},
797 {0x00D80, 0x00D80},
798 {0x00D84, 0x00D84},
799 {0x00D97, 0x00D99},
800 {0x00DB2, 0x00DB2},
801 {0x00DBC, 0x00DBC},
802 {0x00DBE, 0x00DBF},
803 {0x00DC7, 0x00DC9},
804 {0x00DCB, 0x00DCE},
805 {0x00DD5, 0x00DD5},
806 {0x00DD7, 0x00DD7},
807 {0x00DE0, 0x00DE5},
808 {0x00DF0, 0x00DF1},
809 {0x00DF5, 0x00E00},
810 {0x00E3B, 0x00E3E},
811 {0x00E5C, 0x00E80},
812 {0x00E83, 0x00E83},
813 {0x00E85, 0x00E85},
814 {0x00E8B, 0x00E8B},
815 {0x00EA4, 0x00EA4},
816 {0x00EA6, 0x00EA6},
817 {0x00EBE, 0x00EBF},
818 {0x00EC5, 0x00EC5},
819 {0x00EC7, 0x00EC7},
820 {0x00ECF, 0x00ECF},
821 {0x00EDA, 0x00EDB},
822 {0x00EE0, 0x00EFF},
823 {0x00F48, 0x00F48},
824 {0x00F6D, 0x00F70},
825 {0x00F98, 0x00F98},
826 {0x00FBD, 0x00FBD},
827 {0x00FCD, 0x00FCD},
828 {0x00FDB, 0x00FFF},
829 {0x010C6, 0x010C6},
830 {0x010C8, 0x010CC},
831 {0x010CE, 0x010CF},
832 {0x01249, 0x01249},
833 {0x0124E, 0x0124F},
834 {0x01257, 0x01257},
835 {0x01259, 0x01259},
836 {0x0125E, 0x0125F},
837 {0x01289, 0x01289},
838 {0x0128E, 0x0128F},
839 {0x012B1, 0x012B1},
840 {0x012B6, 0x012B7},
841 {0x012BF, 0x012BF},
842 {0x012C1, 0x012C1},
843 {0x012C6, 0x012C7},
844 {0x012D7, 0x012D7},
845 {0x01311, 0x01311},
846 {0x01316, 0x01317},
847 {0x0135B, 0x0135C},
848 {0x0137D, 0x0137F},
849 {0x0139A, 0x0139F},
850 {0x013F6, 0x013F7},
851 {0x013FE, 0x013FF},
852 {0x0169D, 0x0169F},
853 {0x016F9, 0x016FF},
854 {0x01716, 0x0171E},
855 {0x01737, 0x0173F},
856 {0x01754, 0x0175F},
857 {0x0176D, 0x0176D},
858 {0x01771, 0x01771},
859 {0x01774, 0x0177F},
860 {0x017DE, 0x017DF},
861 {0x017EA, 0x017EF},
862 {0x017FA, 0x017FF},
863 {0x0181A, 0x0181F},
864 {0x01879, 0x0187F},
865 {0x018AB, 0x018AF},
866 {0x018F6, 0x018FF},
867 {0x0191F, 0x0191F},
868 {0x0192C, 0x0192F},
869 {0x0193C, 0x0193F},
870 {0x01941, 0x01943},
871 {0x0196E, 0x0196F},
872 {0x01975, 0x0197F},
873 {0x019AC, 0x019AF},
874 {0x019CA, 0x019CF},
875 {0x019DB, 0x019DD},
876 {0x01A1C, 0x01A1D},
877 {0x01A5F, 0x01A5F},
878 {0x01A7D, 0x01A7E},
879 {0x01A8A, 0x01A8F},
880 {0x01A9A, 0x01A9F},
881 {0x01AAE, 0x01AAF},
882 {0x01ACF, 0x01AFF},
883 {0x01B4D, 0x01B4F},
884 {0x01B7F, 0x01B7F},
885 {0x01BF4, 0x01BFB},
886 {0x01C38, 0x01C3A},
887 {0x01C4A, 0x01C4C},
888 {0x01C89, 0x01C8F},
889 {0x01CBB, 0x01CBC},
890 {0x01CC8, 0x01CCF},
891 {0x01CFB, 0x01CFF},
892 {0x01F16, 0x01F17},
893 {0x01F1E, 0x01F1F},
894 {0x01F46, 0x01F47},
895 {0x01F4E, 0x01F4F},
896 {0x01F58, 0x01F58},
897 {0x01F5A, 0x01F5A},
898 {0x01F5C, 0x01F5C},
899 {0x01F5E, 0x01F5E},
900 {0x01F7E, 0x01F7F},
901 {0x01FB5, 0x01FB5},
902 {0x01FC5, 0x01FC5},
903 {0x01FD4, 0x01FD5},
904 {0x01FDC, 0x01FDC},
905 {0x01FF0, 0x01FF1},
906 {0x01FF5, 0x01FF5},
907 {0x01FFF, 0x01FFF},
908 {0x02065, 0x02065},
909 {0x02072, 0x02073},
910 {0x0208F, 0x0208F},
911 {0x0209D, 0x0209F},
912 {0x020C1, 0x020CF},
913 {0x020F1, 0x020FF},
914 {0x0218C, 0x0218F},
915 {0x02427, 0x0243F},
916 {0x0244B, 0x0245F},
917 {0x02B74, 0x02B75},
918 {0x02B96, 0x02B96},
919 {0x02CF4, 0x02CF8},
920 {0x02D26, 0x02D26},
921 {0x02D28, 0x02D2C},
922 {0x02D2E, 0x02D2F},
923 {0x02D68, 0x02D6E},
924 {0x02D71, 0x02D7E},
925 {0x02D97, 0x02D9F},
926 {0x02DA7, 0x02DA7},
927 {0x02DAF, 0x02DAF},
928 {0x02DB7, 0x02DB7},
929 {0x02DBF, 0x02DBF},
930 {0x02DC7, 0x02DC7},
931 {0x02DCF, 0x02DCF},
932 {0x02DD7, 0x02DD7},
933 {0x02DDF, 0x02DDF},
934 {0x02E5E, 0x02E7F},
935 {0x02E9A, 0x02E9A},
936 {0x02EF4, 0x02EFF},
937 {0x02FD6, 0x02FEF},
938 {0x02FFC, 0x02FFF},
939 {0x03040, 0x03040},
940 {0x03097, 0x03098},
941 {0x03100, 0x03104},
942 {0x03130, 0x03130},
943 {0x0318F, 0x0318F},
944 {0x031E4, 0x031EF},
945 {0x0321F, 0x0321F},
946 {0x03401, 0x04DBE},
947 {0x04E01, 0x09FFE},
948 {0x0A48D, 0x0A48F},
949 {0x0A4C7, 0x0A4CF},
950 {0x0A62C, 0x0A63F},
951 {0x0A6F8, 0x0A6FF},
952 {0x0A7CB, 0x0A7CF},
953 {0x0A7D2, 0x0A7D2},
954 {0x0A7D4, 0x0A7D4},
955 {0x0A7DA, 0x0A7F1},
956 {0x0A82D, 0x0A82F},
957 {0x0A83A, 0x0A83F},
958 {0x0A878, 0x0A87F},
959 {0x0A8C6, 0x0A8CD},
960 {0x0A8DA, 0x0A8DF},
961 {0x0A954, 0x0A95E},
962 {0x0A97D, 0x0A97F},
963 {0x0A9CE, 0x0A9CE},
964 {0x0A9DA, 0x0A9DD},
965 {0x0A9FF, 0x0A9FF},
966 {0x0AA37, 0x0AA3F},
967 {0x0AA4E, 0x0AA4F},
968 {0x0AA5A, 0x0AA5B},
969 {0x0AAC3, 0x0AADA},
970 {0x0AAF7, 0x0AB00},
971 {0x0AB07, 0x0AB08},
972 {0x0AB0F, 0x0AB10},
973 {0x0AB17, 0x0AB1F},
974 {0x0AB27, 0x0AB27},
975 {0x0AB2F, 0x0AB2F},
976 {0x0AB6C, 0x0AB6F},
977 {0x0ABEE, 0x0ABEF},
978 {0x0ABFA, 0x0ABFF},
979 {0x0AC01, 0x0D7A2},
980 {0x0D7A4, 0x0D7AF},
981 {0x0D7C7, 0x0D7CA},
982 {0x0D7FC, 0x0D7FF},
983 {0x0FA6E, 0x0FA6F},
984 {0x0FADA, 0x0FAFF},
985 {0x0FB07, 0x0FB12},
986 {0x0FB18, 0x0FB1C},
987 {0x0FB37, 0x0FB37},
988 {0x0FB3D, 0x0FB3D},
989 {0x0FB3F, 0x0FB3F},
990 {0x0FB42, 0x0FB42},
991 {0x0FB45, 0x0FB45},
992 {0x0FBC3, 0x0FBD2},
993 {0x0FD90, 0x0FD91},
994 {0x0FDC8, 0x0FDCE},
995 {0x0FE1A, 0x0FE1F},
996 {0x0FE53, 0x0FE53},
997 {0x0FE67, 0x0FE67},
998 {0x0FE6C, 0x0FE6F},
999 {0x0FE75, 0x0FE75},
1000 {0x0FEFD, 0x0FEFE},
1001 {0x0FF00, 0x0FF00},
1002 {0x0FFBF, 0x0FFC1},
1003 {0x0FFC8, 0x0FFC9},
1004 {0x0FFD0, 0x0FFD1},
1005 {0x0FFD8, 0x0FFD9},
1006 {0x0FFDD, 0x0FFDF},
1007 {0x0FFE7, 0x0FFE7},
1008 {0x0FFEF, 0x0FFF8},
1009 {0x1000C, 0x1000C},
1010 {0x10027, 0x10027},
1011 {0x1003B, 0x1003B},
1012 {0x1003E, 0x1003E},
1013 {0x1004E, 0x1004F},
1014 {0x1005E, 0x1007F},
1015 {0x100FB, 0x100FF},
1016 {0x10103, 0x10106},
1017 {0x10134, 0x10136},
1018 {0x1018F, 0x1018F},
1019 {0x1019D, 0x1019F},
1020 {0x101A1, 0x101CF},
1021 {0x101FE, 0x1027F},
1022 {0x1029D, 0x1029F},
1023 {0x102D1, 0x102DF},
1024 {0x102FC, 0x102FF},
1025 {0x10324, 0x1032C},
1026 {0x1034B, 0x1034F},
1027 {0x1037B, 0x1037F},
1028 {0x1039E, 0x1039E},
1029 {0x103C4, 0x103C7},
1030 {0x103D6, 0x103FF},
1031 {0x1049E, 0x1049F},
1032 {0x104AA, 0x104AF},
1033 {0x104D4, 0x104D7},
1034 {0x104FC, 0x104FF},
1035 {0x10528, 0x1052F},
1036 {0x10564, 0x1056E},
1037 {0x1057B, 0x1057B},
1038 {0x1058B, 0x1058B},
1039 {0x10593, 0x10593},
1040 {0x10596, 0x10596},
1041 {0x105A2, 0x105A2},
1042 {0x105B2, 0x105B2},
1043 {0x105BA, 0x105BA},
1044 {0x105BD, 0x105FF},
1045 {0x10737, 0x1073F},
1046 {0x10756, 0x1075F},
1047 {0x10768, 0x1077F},
1048 {0x10786, 0x10786},
1049 {0x107B1, 0x107B1},
1050 {0x107BB, 0x107FF},
1051 {0x10806, 0x10807},
1052 {0x10809, 0x10809},
1053 {0x10836, 0x10836},
1054 {0x10839, 0x1083B},
1055 {0x1083D, 0x1083E},
1056 {0x10856, 0x10856},
1057 {0x1089F, 0x108A6},
1058 {0x108B0, 0x108DF},
1059 {0x108F3, 0x108F3},
1060 {0x108F6, 0x108FA},
1061 {0x1091C, 0x1091E},
1062 {0x1093A, 0x1093E},
1063 {0x10940, 0x1097F},
1064 {0x109B8, 0x109BB},
1065 {0x109D0, 0x109D1},
1066 {0x10A04, 0x10A04},
1067 {0x10A07, 0x10A0B},
1068 {0x10A14, 0x10A14},
1069 {0x10A18, 0x10A18},
1070 {0x10A36, 0x10A37},
1071 {0x10A3B, 0x10A3E},
1072 {0x10A49, 0x10A4F},
1073 {0x10A59, 0x10A5F},
1074 {0x10AA0, 0x10ABF},
1075 {0x10AE7, 0x10AEA},
1076 {0x10AF7, 0x10AFF},
1077 {0x10B36, 0x10B38},
1078 {0x10B56, 0x10B57},
1079 {0x10B73, 0x10B77},
1080 {0x10B92, 0x10B98},
1081 {0x10B9D, 0x10BA8},
1082 {0x10BB0, 0x10BFF},
1083 {0x10C49, 0x10C7F},
1084 {0x10CB3, 0x10CBF},
1085 {0x10CF3, 0x10CF9},
1086 {0x10D28, 0x10D2F},
1087 {0x10D3A, 0x10E5F},
1088 {0x10E7F, 0x10E7F},
1089 {0x10EAA, 0x10EAA},
1090 {0x10EAE, 0x10EAF},
1091 {0x10EB2, 0x10EFC},
1092 {0x10F28, 0x10F2F},
1093 {0x10F5A, 0x10F6F},
1094 {0x10F8A, 0x10FAF},
1095 {0x10FCC, 0x10FDF},
1096 {0x10FF7, 0x10FFF},
1097 {0x1104E, 0x11051},
1098 {0x11076, 0x1107E},
1099 {0x110C3, 0x110CC},
1100 {0x110CE, 0x110CF},
1101 {0x110E9, 0x110EF},
1102 {0x110FA, 0x110FF},
1103 {0x11135, 0x11135},
1104 {0x11148, 0x1114F},
1105 {0x11177, 0x1117F},
1106 {0x111E0, 0x111E0},
1107 {0x111F5, 0x111FF},
1108 {0x11212, 0x11212},
1109 {0x11242, 0x1127F},
1110 {0x11287, 0x11287},
1111 {0x11289, 0x11289},
1112 {0x1128E, 0x1128E},
1113 {0x1129E, 0x1129E},
1114 {0x112AA, 0x112AF},
1115 {0x112EB, 0x112EF},
1116 {0x112FA, 0x112FF},
1117 {0x11304, 0x11304},
1118 {0x1130D, 0x1130E},
1119 {0x11311, 0x11312},
1120 {0x11329, 0x11329},
1121 {0x11331, 0x11331},
1122 {0x11334, 0x11334},
1123 {0x1133A, 0x1133A},
1124 {0x11345, 0x11346},
1125 {0x11349, 0x1134A},
1126 {0x1134E, 0x1134F},
1127 {0x11351, 0x11356},
1128 {0x11358, 0x1135C},
1129 {0x11364, 0x11365},
1130 {0x1136D, 0x1136F},
1131 {0x11375, 0x113FF},
1132 {0x1145C, 0x1145C},
1133 {0x11462, 0x1147F},
1134 {0x114C8, 0x114CF},
1135 {0x114DA, 0x1157F},
1136 {0x115B6, 0x115B7},
1137 {0x115DE, 0x115FF},
1138 {0x11645, 0x1164F},
1139 {0x1165A, 0x1165F},
1140 {0x1166D, 0x1167F},
1141 {0x116BA, 0x116BF},
1142 {0x116CA, 0x116FF},
1143 {0x1171B, 0x1171C},
1144 {0x1172C, 0x1172F},
1145 {0x11747, 0x117FF},
1146 {0x1183C, 0x1189F},
1147 {0x118F3, 0x118FE},
1148 {0x11907, 0x11908},
1149 {0x1190A, 0x1190B},
1150 {0x11914, 0x11914},
1151 {0x11917, 0x11917},
1152 {0x11936, 0x11936},
1153 {0x11939, 0x1193A},
1154 {0x11947, 0x1194F},
1155 {0x1195A, 0x1199F},
1156 {0x119A8, 0x119A9},
1157 {0x119D8, 0x119D9},
1158 {0x119E5, 0x119FF},
1159 {0x11A48, 0x11A4F},
1160 {0x11AA3, 0x11AAF},
1161 {0x11AF9, 0x11AFF},
1162 {0x11B0A, 0x11BFF},
1163 {0x11C09, 0x11C09},
1164 {0x11C37, 0x11C37},
1165 {0x11C46, 0x11C4F},
1166 {0x11C6D, 0x11C6F},
1167 {0x11C90, 0x11C91},
1168 {0x11CA8, 0x11CA8},
1169 {0x11CB7, 0x11CFF},
1170 {0x11D07, 0x11D07},
1171 {0x11D0A, 0x11D0A},
1172 {0x11D37, 0x11D39},
1173 {0x11D3B, 0x11D3B},
1174 {0x11D3E, 0x11D3E},
1175 {0x11D48, 0x11D4F},
1176 {0x11D5A, 0x11D5F},
1177 {0x11D66, 0x11D66},
1178 {0x11D69, 0x11D69},
1179 {0x11D8F, 0x11D8F},
1180 {0x11D92, 0x11D92},
1181 {0x11D99, 0x11D9F},
1182 {0x11DAA, 0x11EDF},
1183 {0x11EF9, 0x11EFF},
1184 {0x11F11, 0x11F11},
1185 {0x11F3B, 0x11F3D},
1186 {0x11F5A, 0x11FAF},
1187 {0x11FB1, 0x11FBF},
1188 {0x11FF2, 0x11FFE},
1189 {0x1239A, 0x123FF},
1190 {0x1246F, 0x1246F},
1191 {0x12475, 0x1247F},
1192 {0x12544, 0x12F8F},
1193 {0x12FF3, 0x12FFF},
1194 {0x13456, 0x143FF},
1195 {0x14647, 0x167FF},
1196 {0x16A39, 0x16A3F},
1197 {0x16A5F, 0x16A5F},
1198 {0x16A6A, 0x16A6D},
1199 {0x16ABF, 0x16ABF},
1200 {0x16ACA, 0x16ACF},
1201 {0x16AEE, 0x16AEF},
1202 {0x16AF6, 0x16AFF},
1203 {0x16B46, 0x16B4F},
1204 {0x16B5A, 0x16B5A},
1205 {0x16B62, 0x16B62},
1206 {0x16B78, 0x16B7C},
1207 {0x16B90, 0x16E3F},
1208 {0x16E9B, 0x16EFF},
1209 {0x16F4B, 0x16F4E},
1210 {0x16F88, 0x16F8E},
1211 {0x16FA0, 0x16FDF},
1212 {0x16FE5, 0x16FEF},
1213 {0x16FF2, 0x16FFF},
1214 {0x17001, 0x187F6},
1215 {0x187F8, 0x187FF},
1216 {0x18CD6, 0x18CFF},
1217 {0x18D01, 0x18D07},
1218 {0x18D09, 0x1AFEF},
1219 {0x1AFF4, 0x1AFF4},
1220 {0x1AFFC, 0x1AFFC},
1221 {0x1AFFF, 0x1AFFF},
1222 {0x1B123, 0x1B131},
1223 {0x1B133, 0x1B14F},
1224 {0x1B153, 0x1B154},
1225 {0x1B156, 0x1B163},
1226 {0x1B168, 0x1B16F},
1227 {0x1B2FC, 0x1BBFF},
1228 {0x1BC6B, 0x1BC6F},
1229 {0x1BC7D, 0x1BC7F},
1230 {0x1BC89, 0x1BC8F},
1231 {0x1BC9A, 0x1BC9B},
1232 {0x1BCA4, 0x1CEFF},
1233 {0x1CF2E, 0x1CF2F},
1234 {0x1CF47, 0x1CF4F},
1235 {0x1CFC4, 0x1CFFF},
1236 {0x1D0F6, 0x1D0FF},
1237 {0x1D127, 0x1D128},
1238 {0x1D1EB, 0x1D1FF},
1239 {0x1D246, 0x1D2BF},
1240 {0x1D2D4, 0x1D2DF},
1241 {0x1D2F4, 0x1D2FF},
1242 {0x1D357, 0x1D35F},
1243 {0x1D379, 0x1D3FF},
1244 {0x1D455, 0x1D455},
1245 {0x1D49D, 0x1D49D},
1246 {0x1D4A0, 0x1D4A1},
1247 {0x1D4A3, 0x1D4A4},
1248 {0x1D4A7, 0x1D4A8},
1249 {0x1D4AD, 0x1D4AD},
1250 {0x1D4BA, 0x1D4BA},
1251 {0x1D4BC, 0x1D4BC},
1252 {0x1D4C4, 0x1D4C4},
1253 {0x1D506, 0x1D506},
1254 {0x1D50B, 0x1D50C},
1255 {0x1D515, 0x1D515},
1256 {0x1D51D, 0x1D51D},
1257 {0x1D53A, 0x1D53A},
1258 {0x1D53F, 0x1D53F},
1259 {0x1D545, 0x1D545},
1260 {0x1D547, 0x1D549},
1261 {0x1D551, 0x1D551},
1262 {0x1D6A6, 0x1D6A7},
1263 {0x1D7CC, 0x1D7CD},
1264 {0x1DA8C, 0x1DA9A},
1265 {0x1DAA0, 0x1DAA0},
1266 {0x1DAB0, 0x1DEFF},
1267 {0x1DF1F, 0x1DF24},
1268 {0x1DF2B, 0x1DFFF},
1269 {0x1E007, 0x1E007},
1270 {0x1E019, 0x1E01A},
1271 {0x1E022, 0x1E022},
1272 {0x1E025, 0x1E025},
1273 {0x1E02B, 0x1E02F},
1274 {0x1E06E, 0x1E08E},
1275 {0x1E090, 0x1E0FF},
1276 {0x1E12D, 0x1E12F},
1277 {0x1E13E, 0x1E13F},
1278 {0x1E14A, 0x1E14D},
1279 {0x1E150, 0x1E28F},
1280 {0x1E2AF, 0x1E2BF},
1281 {0x1E2FA, 0x1E2FE},
1282 {0x1E300, 0x1E4CF},
1283 {0x1E4FA, 0x1E7DF},
1284 {0x1E7E7, 0x1E7E7},
1285 {0x1E7EC, 0x1E7EC},
1286 {0x1E7EF, 0x1E7EF},
1287 {0x1E7FF, 0x1E7FF},
1288 {0x1E8C5, 0x1E8C6},
1289 {0x1E8D7, 0x1E8FF},
1290 {0x1E94C, 0x1E94F},
1291 {0x1E95A, 0x1E95D},
1292 {0x1E960, 0x1EC70},
1293 {0x1ECB5, 0x1ED00},
1294 {0x1ED3E, 0x1EDFF},
1295 {0x1EE04, 0x1EE04},
1296 {0x1EE20, 0x1EE20},
1297 {0x1EE23, 0x1EE23},
1298 {0x1EE25, 0x1EE26},
1299 {0x1EE28, 0x1EE28},
1300 {0x1EE33, 0x1EE33},
1301 {0x1EE38, 0x1EE38},
1302 {0x1EE3A, 0x1EE3A},
1303 {0x1EE3C, 0x1EE41},
1304 {0x1EE43, 0x1EE46},
1305 {0x1EE48, 0x1EE48},
1306 {0x1EE4A, 0x1EE4A},
1307 {0x1EE4C, 0x1EE4C},
1308 {0x1EE50, 0x1EE50},
1309 {0x1EE53, 0x1EE53},
1310 {0x1EE55, 0x1EE56},
1311 {0x1EE58, 0x1EE58},
1312 {0x1EE5A, 0x1EE5A},
1313 {0x1EE5C, 0x1EE5C},
1314 {0x1EE5E, 0x1EE5E},
1315 {0x1EE60, 0x1EE60},
1316 {0x1EE63, 0x1EE63},
1317 {0x1EE65, 0x1EE66},
1318 {0x1EE6B, 0x1EE6B},
1319 {0x1EE73, 0x1EE73},
1320 {0x1EE78, 0x1EE78},
1321 {0x1EE7D, 0x1EE7D},
1322 {0x1EE7F, 0x1EE7F},
1323 {0x1EE8A, 0x1EE8A},
1324 {0x1EE9C, 0x1EEA0},
1325 {0x1EEA4, 0x1EEA4},
1326 {0x1EEAA, 0x1EEAA},
1327 {0x1EEBC, 0x1EEEF},
1328 {0x1EEF2, 0x1EFFF},
1329 {0x1F02C, 0x1F02F},
1330 {0x1F094, 0x1F09F},
1331 {0x1F0AF, 0x1F0B0},
1332 {0x1F0C0, 0x1F0C0},
1333 {0x1F0D0, 0x1F0D0},
1334 {0x1F0F6, 0x1F0FF},
1335 {0x1F1AE, 0x1F1E5},
1336 {0x1F203, 0x1F20F},
1337 {0x1F23C, 0x1F23F},
1338 {0x1F249, 0x1F24F},
1339 {0x1F252, 0x1F25F},
1340 {0x1F266, 0x1F2FF},
1341 {0x1F6D8, 0x1F6DB},
1342 {0x1F6ED, 0x1F6EF},
1343 {0x1F6FD, 0x1F6FF},
1344 {0x1F777, 0x1F77A},
1345 {0x1F7DA, 0x1F7DF},
1346 {0x1F7EC, 0x1F7EF},
1347 {0x1F7F1, 0x1F7FF},
1348 {0x1F80C, 0x1F80F},
1349 {0x1F848, 0x1F84F},
1350 {0x1F85A, 0x1F85F},
1351 {0x1F888, 0x1F88F},
1352 {0x1F8AE, 0x1F8AF},
1353 {0x1F8B2, 0x1F8FF},
1354 {0x1FA54, 0x1FA5F},
1355 {0x1FA6E, 0x1FA6F},
1356 {0x1FA7D, 0x1FA7F},
1357 {0x1FA89, 0x1FA8F},
1358 {0x1FABE, 0x1FABE},
1359 {0x1FAC6, 0x1FACD},
1360 {0x1FADC, 0x1FADF},
1361 {0x1FAE9, 0x1FAEF},
1362 {0x1FAF9, 0x1FAFF},
1363 {0x1FB93, 0x1FB93},
1364 {0x1FBCB, 0x1FBEF},
1365 {0x1FBFA, 0x1FFFD},
1366 {0x20001, 0x2A6DE},
1367 {0x2A6E0, 0x2A6FF},
1368 {0x2A701, 0x2B738},
1369 {0x2B73A, 0x2B73F},
1370 {0x2B741, 0x2B81C},
1371 {0x2B81E, 0x2B81F},
1372 {0x2B821, 0x2CEA0},
1373 {0x2CEA2, 0x2CEAF},
1374 {0x2CEB1, 0x2EBDF},
1375 {0x2EBE1, 0x2F7FF},
1376 {0x2FA1E, 0x2FFFD},
1377 {0x30001, 0x31349},
1378 {0x3134B, 0x3134F},
1379 {0x31351, 0x323AE},
1380 {0x323B0, 0x3FFFD},
1381 {0x40000, 0x4FFFD},
1382 {0x50000, 0x5FFFD},
1383 {0x60000, 0x6FFFD},
1384 {0x70000, 0x7FFFD},
1385 {0x80000, 0x8FFFD},
1386 {0x90000, 0x9FFFD},
1387 {0xA0000, 0xAFFFD},
1388 {0xB0000, 0xBFFFD},
1389 {0xC0000, 0xCFFFD},
1390 {0xD0000, 0xDFFFD},
1391 {0xE0000, 0xE0000},
1392 {0xE0002, 0xE001F},
1393 {0xE0080, 0xE00FF},
1394 {0xE01F0, 0xEFFFD}
1397 /* Non-characters. */
1398 static const struct widechar_range widechar_nonchar_table[] = {
1399 {0x0FDD0, 0x0FDEF},
1400 {0x0FFFE, 0x0FFFF},
1401 {0x1FFFE, 0x1FFFF},
1402 {0x2FFFE, 0x2FFFF},
1403 {0x3FFFE, 0x3FFFF},
1404 {0x4FFFE, 0x4FFFF},
1405 {0x5FFFE, 0x5FFFF},
1406 {0x6FFFE, 0x6FFFF},
1407 {0x7FFFE, 0x7FFFF},
1408 {0x8FFFE, 0x8FFFF},
1409 {0x9FFFE, 0x9FFFF},
1410 {0xAFFFE, 0xAFFFF},
1411 {0xBFFFE, 0xBFFFF},
1412 {0xCFFFE, 0xCFFFF},
1413 {0xDFFFE, 0xDFFFF},
1414 {0xEFFFE, 0xEFFFF},
1415 {0xFFFFE, 0xFFFFF},
1416 {0x10FFFE, 0x10FFFF}
1419 /* Characters that were widened from width 1 to 2 in Unicode 9. */
1420 static const struct widechar_range widechar_widened_table[] = {
1421 {0x0231A, 0x0231B},
1422 {0x023E9, 0x023EC},
1423 {0x023F0, 0x023F0},
1424 {0x023F3, 0x023F3},
1425 {0x025FD, 0x025FE},
1426 {0x02614, 0x02615},
1427 {0x02648, 0x02653},
1428 {0x0267F, 0x0267F},
1429 {0x02693, 0x02693},
1430 {0x026A1, 0x026A1},
1431 {0x026AA, 0x026AB},
1432 {0x026BD, 0x026BE},
1433 {0x026C4, 0x026C5},
1434 {0x026CE, 0x026CE},
1435 {0x026D4, 0x026D4},
1436 {0x026EA, 0x026EA},
1437 {0x026F2, 0x026F3},
1438 {0x026F5, 0x026F5},
1439 {0x026FA, 0x026FA},
1440 {0x026FD, 0x026FD},
1441 {0x02705, 0x02705},
1442 {0x0270A, 0x0270B},
1443 {0x02728, 0x02728},
1444 {0x0274C, 0x0274C},
1445 {0x0274E, 0x0274E},
1446 {0x02753, 0x02755},
1447 {0x02757, 0x02757},
1448 {0x02795, 0x02797},
1449 {0x027B0, 0x027B0},
1450 {0x027BF, 0x027BF},
1451 {0x02B1B, 0x02B1C},
1452 {0x02B50, 0x02B50},
1453 {0x02B55, 0x02B55},
1454 {0x1F004, 0x1F004},
1455 {0x1F0CF, 0x1F0CF},
1456 {0x1F18E, 0x1F18E},
1457 {0x1F191, 0x1F19A},
1458 {0x1F201, 0x1F201},
1459 {0x1F21A, 0x1F21A},
1460 {0x1F22F, 0x1F22F},
1461 {0x1F232, 0x1F236},
1462 {0x1F238, 0x1F23A},
1463 {0x1F250, 0x1F251},
1464 {0x1F300, 0x1F320},
1465 {0x1F32D, 0x1F335},
1466 {0x1F337, 0x1F37C},
1467 {0x1F37E, 0x1F393},
1468 {0x1F3A0, 0x1F3CA},
1469 {0x1F3CF, 0x1F3D3},
1470 {0x1F3E0, 0x1F3F0},
1471 {0x1F3F4, 0x1F3F4},
1472 {0x1F3F8, 0x1F43E},
1473 {0x1F440, 0x1F440},
1474 {0x1F442, 0x1F4FC},
1475 {0x1F4FF, 0x1F53D},
1476 {0x1F54B, 0x1F54E},
1477 {0x1F550, 0x1F567},
1478 {0x1F595, 0x1F596},
1479 {0x1F5FB, 0x1F64F},
1480 {0x1F680, 0x1F6C5},
1481 {0x1F6CC, 0x1F6CC},
1482 {0x1F6D0, 0x1F6D0},
1483 {0x1F6EB, 0x1F6EC},
1484 {0x1F910, 0x1F918},
1485 {0x1F980, 0x1F984},
1486 {0x1F9C0, 0x1F9C0}
1489 template<typename Collection>
1490 bool widechar_in_table(const Collection &arr, uint32_t c) {
1491 auto where = std::lower_bound(std::begin(arr), std::end(arr), c,
1492 [](widechar_range p, uint32_t c) { return p.hi < c; });
1493 return where != std::end(arr) && where->lo <= c;
1496 /* Return the width of character c, or a special negative value. */
1497 int widechar_wcwidth(uint32_t c) {
1498 if (widechar_in_table(widechar_ascii_table, c))
1499 return 1;
1500 if (widechar_in_table(widechar_private_table, c))
1501 return widechar_private_use;
1502 if (widechar_in_table(widechar_nonprint_table, c))
1503 return widechar_nonprint;
1504 if (widechar_in_table(widechar_nonchar_table, c))
1505 return widechar_non_character;
1506 if (widechar_in_table(widechar_combining_table, c))
1507 return widechar_combining;
1508 if (widechar_in_table(widechar_combiningletters_table, c))
1509 return widechar_combining;
1510 if (widechar_in_table(widechar_doublewide_table, c))
1511 return 2;
1512 if (widechar_in_table(widechar_ambiguous_table, c))
1513 return widechar_ambiguous;
1514 if (widechar_in_table(widechar_unassigned_table, c))
1515 return widechar_unassigned;
1516 if (widechar_in_table(widechar_widened_table, c))
1517 return widechar_widened_in_9;
1518 return 1;
1521 } // namespace
1522 #endif // WIDECHAR_WIDTH_H