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