github.com/varialus/godfly@v0.0.0-20130904042352-1934f9f095ab/src/lib9/utf/runetypebody-6.2.0.h (about)

     1  /* generated automatically by mkrunetype.c from UnicodeData-6.2.0.txt */
     2  
     3  static Rune __isspacer[] = {
     4  	0x0009, 0x000d,
     5  	0x0020, 0x0020,
     6  	0x0085, 0x0085,
     7  	0x00a0, 0x00a0,
     8  	0x1680, 0x1680,
     9  	0x180e, 0x180e,
    10  	0x2000, 0x200a,
    11  	0x2028, 0x2029,
    12  	0x202f, 0x202f,
    13  	0x205f, 0x205f,
    14  	0x3000, 0x3000,
    15  	0xfeff, 0xfeff,
    16  };
    17  
    18  int
    19  isspacerune(Rune c)
    20  {
    21  	Rune *p;
    22  
    23  	p = rbsearch(c, __isspacer, nelem(__isspacer)/2, 2);
    24  	if(p && c >= p[0] && c <= p[1])
    25  		return 1;
    26  	return 0;
    27  }
    28  
    29  static Rune __isdigitr[] = {
    30  	0x0030, 0x0039,
    31  	0x0660, 0x0669,
    32  	0x06f0, 0x06f9,
    33  	0x07c0, 0x07c9,
    34  	0x0966, 0x096f,
    35  	0x09e6, 0x09ef,
    36  	0x0a66, 0x0a6f,
    37  	0x0ae6, 0x0aef,
    38  	0x0b66, 0x0b6f,
    39  	0x0be6, 0x0bef,
    40  	0x0c66, 0x0c6f,
    41  	0x0ce6, 0x0cef,
    42  	0x0d66, 0x0d6f,
    43  	0x0e50, 0x0e59,
    44  	0x0ed0, 0x0ed9,
    45  	0x0f20, 0x0f29,
    46  	0x1040, 0x1049,
    47  	0x1090, 0x1099,
    48  	0x17e0, 0x17e9,
    49  	0x1810, 0x1819,
    50  	0x1946, 0x194f,
    51  	0x19d0, 0x19d9,
    52  	0x1a80, 0x1a89,
    53  	0x1a90, 0x1a99,
    54  	0x1b50, 0x1b59,
    55  	0x1bb0, 0x1bb9,
    56  	0x1c40, 0x1c49,
    57  	0x1c50, 0x1c59,
    58  	0xa620, 0xa629,
    59  	0xa8d0, 0xa8d9,
    60  	0xa900, 0xa909,
    61  	0xa9d0, 0xa9d9,
    62  	0xaa50, 0xaa59,
    63  	0xabf0, 0xabf9,
    64  	0xff10, 0xff19,
    65  	0x104a0, 0x104a9,
    66  	0x11066, 0x1106f,
    67  	0x110f0, 0x110f9,
    68  	0x11136, 0x1113f,
    69  	0x111d0, 0x111d9,
    70  	0x116c0, 0x116c9,
    71  	0x1d7ce, 0x1d7ff,
    72  };
    73  
    74  int
    75  isdigitrune(Rune c)
    76  {
    77  	Rune *p;
    78  
    79  	p = rbsearch(c, __isdigitr, nelem(__isdigitr)/2, 2);
    80  	if(p && c >= p[0] && c <= p[1])
    81  		return 1;
    82  	return 0;
    83  }
    84  
    85  static Rune __isalphar[] = {
    86  	0x0041, 0x005a,
    87  	0x0061, 0x007a,
    88  	0x00c0, 0x00d6,
    89  	0x00d8, 0x00f6,
    90  	0x00f8, 0x02c1,
    91  	0x02c6, 0x02d1,
    92  	0x02e0, 0x02e4,
    93  	0x0370, 0x0374,
    94  	0x0376, 0x0377,
    95  	0x037a, 0x037d,
    96  	0x0388, 0x038a,
    97  	0x038e, 0x03a1,
    98  	0x03a3, 0x03f5,
    99  	0x03f7, 0x0481,
   100  	0x048a, 0x0527,
   101  	0x0531, 0x0556,
   102  	0x0561, 0x0587,
   103  	0x05d0, 0x05ea,
   104  	0x05f0, 0x05f2,
   105  	0x0620, 0x064a,
   106  	0x066e, 0x066f,
   107  	0x0671, 0x06d3,
   108  	0x06e5, 0x06e6,
   109  	0x06ee, 0x06ef,
   110  	0x06fa, 0x06fc,
   111  	0x0712, 0x072f,
   112  	0x074d, 0x07a5,
   113  	0x07ca, 0x07ea,
   114  	0x07f4, 0x07f5,
   115  	0x0800, 0x0815,
   116  	0x0840, 0x0858,
   117  	0x08a2, 0x08ac,
   118  	0x0904, 0x0939,
   119  	0x0958, 0x0961,
   120  	0x0971, 0x0977,
   121  	0x0979, 0x097f,
   122  	0x0985, 0x098c,
   123  	0x098f, 0x0990,
   124  	0x0993, 0x09a8,
   125  	0x09aa, 0x09b0,
   126  	0x09b6, 0x09b9,
   127  	0x09dc, 0x09dd,
   128  	0x09df, 0x09e1,
   129  	0x09f0, 0x09f1,
   130  	0x0a05, 0x0a0a,
   131  	0x0a0f, 0x0a10,
   132  	0x0a13, 0x0a28,
   133  	0x0a2a, 0x0a30,
   134  	0x0a32, 0x0a33,
   135  	0x0a35, 0x0a36,
   136  	0x0a38, 0x0a39,
   137  	0x0a59, 0x0a5c,
   138  	0x0a72, 0x0a74,
   139  	0x0a85, 0x0a8d,
   140  	0x0a8f, 0x0a91,
   141  	0x0a93, 0x0aa8,
   142  	0x0aaa, 0x0ab0,
   143  	0x0ab2, 0x0ab3,
   144  	0x0ab5, 0x0ab9,
   145  	0x0ae0, 0x0ae1,
   146  	0x0b05, 0x0b0c,
   147  	0x0b0f, 0x0b10,
   148  	0x0b13, 0x0b28,
   149  	0x0b2a, 0x0b30,
   150  	0x0b32, 0x0b33,
   151  	0x0b35, 0x0b39,
   152  	0x0b5c, 0x0b5d,
   153  	0x0b5f, 0x0b61,
   154  	0x0b85, 0x0b8a,
   155  	0x0b8e, 0x0b90,
   156  	0x0b92, 0x0b95,
   157  	0x0b99, 0x0b9a,
   158  	0x0b9e, 0x0b9f,
   159  	0x0ba3, 0x0ba4,
   160  	0x0ba8, 0x0baa,
   161  	0x0bae, 0x0bb9,
   162  	0x0c05, 0x0c0c,
   163  	0x0c0e, 0x0c10,
   164  	0x0c12, 0x0c28,
   165  	0x0c2a, 0x0c33,
   166  	0x0c35, 0x0c39,
   167  	0x0c58, 0x0c59,
   168  	0x0c60, 0x0c61,
   169  	0x0c85, 0x0c8c,
   170  	0x0c8e, 0x0c90,
   171  	0x0c92, 0x0ca8,
   172  	0x0caa, 0x0cb3,
   173  	0x0cb5, 0x0cb9,
   174  	0x0ce0, 0x0ce1,
   175  	0x0cf1, 0x0cf2,
   176  	0x0d05, 0x0d0c,
   177  	0x0d0e, 0x0d10,
   178  	0x0d12, 0x0d3a,
   179  	0x0d60, 0x0d61,
   180  	0x0d7a, 0x0d7f,
   181  	0x0d85, 0x0d96,
   182  	0x0d9a, 0x0db1,
   183  	0x0db3, 0x0dbb,
   184  	0x0dc0, 0x0dc6,
   185  	0x0e01, 0x0e30,
   186  	0x0e32, 0x0e33,
   187  	0x0e40, 0x0e46,
   188  	0x0e81, 0x0e82,
   189  	0x0e87, 0x0e88,
   190  	0x0e94, 0x0e97,
   191  	0x0e99, 0x0e9f,
   192  	0x0ea1, 0x0ea3,
   193  	0x0eaa, 0x0eab,
   194  	0x0ead, 0x0eb0,
   195  	0x0eb2, 0x0eb3,
   196  	0x0ec0, 0x0ec4,
   197  	0x0edc, 0x0edf,
   198  	0x0f40, 0x0f47,
   199  	0x0f49, 0x0f6c,
   200  	0x0f88, 0x0f8c,
   201  	0x1000, 0x102a,
   202  	0x1050, 0x1055,
   203  	0x105a, 0x105d,
   204  	0x1065, 0x1066,
   205  	0x106e, 0x1070,
   206  	0x1075, 0x1081,
   207  	0x10a0, 0x10c5,
   208  	0x10d0, 0x10fa,
   209  	0x10fc, 0x1248,
   210  	0x124a, 0x124d,
   211  	0x1250, 0x1256,
   212  	0x125a, 0x125d,
   213  	0x1260, 0x1288,
   214  	0x128a, 0x128d,
   215  	0x1290, 0x12b0,
   216  	0x12b2, 0x12b5,
   217  	0x12b8, 0x12be,
   218  	0x12c2, 0x12c5,
   219  	0x12c8, 0x12d6,
   220  	0x12d8, 0x1310,
   221  	0x1312, 0x1315,
   222  	0x1318, 0x135a,
   223  	0x1380, 0x138f,
   224  	0x13a0, 0x13f4,
   225  	0x1401, 0x166c,
   226  	0x166f, 0x167f,
   227  	0x1681, 0x169a,
   228  	0x16a0, 0x16ea,
   229  	0x1700, 0x170c,
   230  	0x170e, 0x1711,
   231  	0x1720, 0x1731,
   232  	0x1740, 0x1751,
   233  	0x1760, 0x176c,
   234  	0x176e, 0x1770,
   235  	0x1780, 0x17b3,
   236  	0x1820, 0x1877,
   237  	0x1880, 0x18a8,
   238  	0x18b0, 0x18f5,
   239  	0x1900, 0x191c,
   240  	0x1950, 0x196d,
   241  	0x1970, 0x1974,
   242  	0x1980, 0x19ab,
   243  	0x19c1, 0x19c7,
   244  	0x1a00, 0x1a16,
   245  	0x1a20, 0x1a54,
   246  	0x1b05, 0x1b33,
   247  	0x1b45, 0x1b4b,
   248  	0x1b83, 0x1ba0,
   249  	0x1bae, 0x1baf,
   250  	0x1bba, 0x1be5,
   251  	0x1c00, 0x1c23,
   252  	0x1c4d, 0x1c4f,
   253  	0x1c5a, 0x1c7d,
   254  	0x1ce9, 0x1cec,
   255  	0x1cee, 0x1cf1,
   256  	0x1cf5, 0x1cf6,
   257  	0x1d00, 0x1dbf,
   258  	0x1e00, 0x1f15,
   259  	0x1f18, 0x1f1d,
   260  	0x1f20, 0x1f45,
   261  	0x1f48, 0x1f4d,
   262  	0x1f50, 0x1f57,
   263  	0x1f5f, 0x1f7d,
   264  	0x1f80, 0x1fb4,
   265  	0x1fb6, 0x1fbc,
   266  	0x1fc2, 0x1fc4,
   267  	0x1fc6, 0x1fcc,
   268  	0x1fd0, 0x1fd3,
   269  	0x1fd6, 0x1fdb,
   270  	0x1fe0, 0x1fec,
   271  	0x1ff2, 0x1ff4,
   272  	0x1ff6, 0x1ffc,
   273  	0x2090, 0x209c,
   274  	0x210a, 0x2113,
   275  	0x2119, 0x211d,
   276  	0x212a, 0x212d,
   277  	0x212f, 0x2139,
   278  	0x213c, 0x213f,
   279  	0x2145, 0x2149,
   280  	0x2183, 0x2184,
   281  	0x2c00, 0x2c2e,
   282  	0x2c30, 0x2c5e,
   283  	0x2c60, 0x2ce4,
   284  	0x2ceb, 0x2cee,
   285  	0x2cf2, 0x2cf3,
   286  	0x2d00, 0x2d25,
   287  	0x2d30, 0x2d67,
   288  	0x2d80, 0x2d96,
   289  	0x2da0, 0x2da6,
   290  	0x2da8, 0x2dae,
   291  	0x2db0, 0x2db6,
   292  	0x2db8, 0x2dbe,
   293  	0x2dc0, 0x2dc6,
   294  	0x2dc8, 0x2dce,
   295  	0x2dd0, 0x2dd6,
   296  	0x2dd8, 0x2dde,
   297  	0x3005, 0x3006,
   298  	0x3031, 0x3035,
   299  	0x303b, 0x303c,
   300  	0x3041, 0x3096,
   301  	0x309d, 0x309f,
   302  	0x30a1, 0x30fa,
   303  	0x30fc, 0x30ff,
   304  	0x3105, 0x312d,
   305  	0x3131, 0x318e,
   306  	0x31a0, 0x31ba,
   307  	0x31f0, 0x31ff,
   308  	0x3400, 0x4db5,
   309  	0x4e00, 0x9fcc,
   310  	0xa000, 0xa48c,
   311  	0xa4d0, 0xa4fd,
   312  	0xa500, 0xa60c,
   313  	0xa610, 0xa61f,
   314  	0xa62a, 0xa62b,
   315  	0xa640, 0xa66e,
   316  	0xa67f, 0xa697,
   317  	0xa6a0, 0xa6e5,
   318  	0xa717, 0xa71f,
   319  	0xa722, 0xa788,
   320  	0xa78b, 0xa78e,
   321  	0xa790, 0xa793,
   322  	0xa7a0, 0xa7aa,
   323  	0xa7f8, 0xa801,
   324  	0xa803, 0xa805,
   325  	0xa807, 0xa80a,
   326  	0xa80c, 0xa822,
   327  	0xa840, 0xa873,
   328  	0xa882, 0xa8b3,
   329  	0xa8f2, 0xa8f7,
   330  	0xa90a, 0xa925,
   331  	0xa930, 0xa946,
   332  	0xa960, 0xa97c,
   333  	0xa984, 0xa9b2,
   334  	0xaa00, 0xaa28,
   335  	0xaa40, 0xaa42,
   336  	0xaa44, 0xaa4b,
   337  	0xaa60, 0xaa76,
   338  	0xaa80, 0xaaaf,
   339  	0xaab5, 0xaab6,
   340  	0xaab9, 0xaabd,
   341  	0xaadb, 0xaadd,
   342  	0xaae0, 0xaaea,
   343  	0xaaf2, 0xaaf4,
   344  	0xab01, 0xab06,
   345  	0xab09, 0xab0e,
   346  	0xab11, 0xab16,
   347  	0xab20, 0xab26,
   348  	0xab28, 0xab2e,
   349  	0xabc0, 0xabe2,
   350  	0xac00, 0xd7a3,
   351  	0xd7b0, 0xd7c6,
   352  	0xd7cb, 0xd7fb,
   353  	0xf900, 0xfa6d,
   354  	0xfa70, 0xfad9,
   355  	0xfb00, 0xfb06,
   356  	0xfb13, 0xfb17,
   357  	0xfb1f, 0xfb28,
   358  	0xfb2a, 0xfb36,
   359  	0xfb38, 0xfb3c,
   360  	0xfb40, 0xfb41,
   361  	0xfb43, 0xfb44,
   362  	0xfb46, 0xfbb1,
   363  	0xfbd3, 0xfd3d,
   364  	0xfd50, 0xfd8f,
   365  	0xfd92, 0xfdc7,
   366  	0xfdf0, 0xfdfb,
   367  	0xfe70, 0xfe74,
   368  	0xfe76, 0xfefc,
   369  	0xff21, 0xff3a,
   370  	0xff41, 0xff5a,
   371  	0xff66, 0xffbe,
   372  	0xffc2, 0xffc7,
   373  	0xffca, 0xffcf,
   374  	0xffd2, 0xffd7,
   375  	0xffda, 0xffdc,
   376  	0x10000, 0x1000b,
   377  	0x1000d, 0x10026,
   378  	0x10028, 0x1003a,
   379  	0x1003c, 0x1003d,
   380  	0x1003f, 0x1004d,
   381  	0x10050, 0x1005d,
   382  	0x10080, 0x100fa,
   383  	0x10280, 0x1029c,
   384  	0x102a0, 0x102d0,
   385  	0x10300, 0x1031e,
   386  	0x10330, 0x10340,
   387  	0x10342, 0x10349,
   388  	0x10380, 0x1039d,
   389  	0x103a0, 0x103c3,
   390  	0x103c8, 0x103cf,
   391  	0x10400, 0x1049d,
   392  	0x10800, 0x10805,
   393  	0x1080a, 0x10835,
   394  	0x10837, 0x10838,
   395  	0x1083f, 0x10855,
   396  	0x10900, 0x10915,
   397  	0x10920, 0x10939,
   398  	0x10980, 0x109b7,
   399  	0x109be, 0x109bf,
   400  	0x10a10, 0x10a13,
   401  	0x10a15, 0x10a17,
   402  	0x10a19, 0x10a33,
   403  	0x10a60, 0x10a7c,
   404  	0x10b00, 0x10b35,
   405  	0x10b40, 0x10b55,
   406  	0x10b60, 0x10b72,
   407  	0x10c00, 0x10c48,
   408  	0x11003, 0x11037,
   409  	0x11083, 0x110af,
   410  	0x110d0, 0x110e8,
   411  	0x11103, 0x11126,
   412  	0x11183, 0x111b2,
   413  	0x111c1, 0x111c4,
   414  	0x11680, 0x116aa,
   415  	0x12000, 0x1236e,
   416  	0x13000, 0x1342e,
   417  	0x16800, 0x16a38,
   418  	0x16f00, 0x16f44,
   419  	0x16f93, 0x16f9f,
   420  	0x1b000, 0x1b001,
   421  	0x1d400, 0x1d454,
   422  	0x1d456, 0x1d49c,
   423  	0x1d49e, 0x1d49f,
   424  	0x1d4a5, 0x1d4a6,
   425  	0x1d4a9, 0x1d4ac,
   426  	0x1d4ae, 0x1d4b9,
   427  	0x1d4bd, 0x1d4c3,
   428  	0x1d4c5, 0x1d505,
   429  	0x1d507, 0x1d50a,
   430  	0x1d50d, 0x1d514,
   431  	0x1d516, 0x1d51c,
   432  	0x1d51e, 0x1d539,
   433  	0x1d53b, 0x1d53e,
   434  	0x1d540, 0x1d544,
   435  	0x1d54a, 0x1d550,
   436  	0x1d552, 0x1d6a5,
   437  	0x1d6a8, 0x1d6c0,
   438  	0x1d6c2, 0x1d6da,
   439  	0x1d6dc, 0x1d6fa,
   440  	0x1d6fc, 0x1d714,
   441  	0x1d716, 0x1d734,
   442  	0x1d736, 0x1d74e,
   443  	0x1d750, 0x1d76e,
   444  	0x1d770, 0x1d788,
   445  	0x1d78a, 0x1d7a8,
   446  	0x1d7aa, 0x1d7c2,
   447  	0x1d7c4, 0x1d7cb,
   448  	0x1ee00, 0x1ee03,
   449  	0x1ee05, 0x1ee1f,
   450  	0x1ee21, 0x1ee22,
   451  	0x1ee29, 0x1ee32,
   452  	0x1ee34, 0x1ee37,
   453  	0x1ee4d, 0x1ee4f,
   454  	0x1ee51, 0x1ee52,
   455  	0x1ee61, 0x1ee62,
   456  	0x1ee67, 0x1ee6a,
   457  	0x1ee6c, 0x1ee72,
   458  	0x1ee74, 0x1ee77,
   459  	0x1ee79, 0x1ee7c,
   460  	0x1ee80, 0x1ee89,
   461  	0x1ee8b, 0x1ee9b,
   462  	0x1eea1, 0x1eea3,
   463  	0x1eea5, 0x1eea9,
   464  	0x1eeab, 0x1eebb,
   465  	0x20000, 0x2a6d6,
   466  	0x2a700, 0x2b734,
   467  	0x2b740, 0x2b81d,
   468  	0x2f800, 0x2fa1d,
   469  };
   470  
   471  static Rune __isalphas[] = {
   472  	0x00aa,
   473  	0x00b5,
   474  	0x00ba,
   475  	0x02ec,
   476  	0x02ee,
   477  	0x0386,
   478  	0x038c,
   479  	0x0559,
   480  	0x06d5,
   481  	0x06ff,
   482  	0x0710,
   483  	0x07b1,
   484  	0x07fa,
   485  	0x081a,
   486  	0x0824,
   487  	0x0828,
   488  	0x08a0,
   489  	0x093d,
   490  	0x0950,
   491  	0x09b2,
   492  	0x09bd,
   493  	0x09ce,
   494  	0x0a5e,
   495  	0x0abd,
   496  	0x0ad0,
   497  	0x0b3d,
   498  	0x0b71,
   499  	0x0b83,
   500  	0x0b9c,
   501  	0x0bd0,
   502  	0x0c3d,
   503  	0x0cbd,
   504  	0x0cde,
   505  	0x0d3d,
   506  	0x0d4e,
   507  	0x0dbd,
   508  	0x0e84,
   509  	0x0e8a,
   510  	0x0e8d,
   511  	0x0ea5,
   512  	0x0ea7,
   513  	0x0ebd,
   514  	0x0ec6,
   515  	0x0f00,
   516  	0x103f,
   517  	0x1061,
   518  	0x108e,
   519  	0x10c7,
   520  	0x10cd,
   521  	0x1258,
   522  	0x12c0,
   523  	0x17d7,
   524  	0x17dc,
   525  	0x18aa,
   526  	0x1aa7,
   527  	0x1f59,
   528  	0x1f5b,
   529  	0x1f5d,
   530  	0x1fbe,
   531  	0x2071,
   532  	0x207f,
   533  	0x2102,
   534  	0x2107,
   535  	0x2115,
   536  	0x2124,
   537  	0x2126,
   538  	0x2128,
   539  	0x214e,
   540  	0x2d27,
   541  	0x2d2d,
   542  	0x2d6f,
   543  	0x2e2f,
   544  	0xa8fb,
   545  	0xa9cf,
   546  	0xaa7a,
   547  	0xaab1,
   548  	0xaac0,
   549  	0xaac2,
   550  	0xfb1d,
   551  	0xfb3e,
   552  	0x10808,
   553  	0x1083c,
   554  	0x10a00,
   555  	0x16f50,
   556  	0x1d4a2,
   557  	0x1d4bb,
   558  	0x1d546,
   559  	0x1ee24,
   560  	0x1ee27,
   561  	0x1ee39,
   562  	0x1ee3b,
   563  	0x1ee42,
   564  	0x1ee47,
   565  	0x1ee49,
   566  	0x1ee4b,
   567  	0x1ee54,
   568  	0x1ee57,
   569  	0x1ee59,
   570  	0x1ee5b,
   571  	0x1ee5d,
   572  	0x1ee5f,
   573  	0x1ee64,
   574  	0x1ee7e,
   575  };
   576  
   577  int
   578  isalpharune(Rune c)
   579  {
   580  	Rune *p;
   581  
   582  	p = rbsearch(c, __isalphar, nelem(__isalphar)/2, 2);
   583  	if(p && c >= p[0] && c <= p[1])
   584  		return 1;
   585  	p = rbsearch(c, __isalphas, nelem(__isalphas), 1);
   586  	if(p && c == p[0])
   587  		return 1;
   588  	return 0;
   589  }
   590  
   591  static Rune __isupperr[] = {
   592  	0x0041, 0x005a,
   593  	0x00c0, 0x00d6,
   594  	0x00d8, 0x00de,
   595  	0x0178, 0x0179,
   596  	0x0181, 0x0182,
   597  	0x0186, 0x0187,
   598  	0x0189, 0x018b,
   599  	0x018e, 0x0191,
   600  	0x0193, 0x0194,
   601  	0x0196, 0x0198,
   602  	0x019c, 0x019d,
   603  	0x019f, 0x01a0,
   604  	0x01a6, 0x01a7,
   605  	0x01ae, 0x01af,
   606  	0x01b1, 0x01b3,
   607  	0x01b7, 0x01b8,
   608  	0x01f6, 0x01f8,
   609  	0x023a, 0x023b,
   610  	0x023d, 0x023e,
   611  	0x0243, 0x0246,
   612  	0x0388, 0x038a,
   613  	0x038e, 0x038f,
   614  	0x0391, 0x03a1,
   615  	0x03a3, 0x03ab,
   616  	0x03d2, 0x03d4,
   617  	0x03f9, 0x03fa,
   618  	0x03fd, 0x042f,
   619  	0x04c0, 0x04c1,
   620  	0x0531, 0x0556,
   621  	0x10a0, 0x10c5,
   622  	0x1f08, 0x1f0f,
   623  	0x1f18, 0x1f1d,
   624  	0x1f28, 0x1f2f,
   625  	0x1f38, 0x1f3f,
   626  	0x1f48, 0x1f4d,
   627  	0x1f68, 0x1f6f,
   628  	0x1f88, 0x1f8f,
   629  	0x1f98, 0x1f9f,
   630  	0x1fa8, 0x1faf,
   631  	0x1fb8, 0x1fbc,
   632  	0x1fc8, 0x1fcc,
   633  	0x1fd8, 0x1fdb,
   634  	0x1fe8, 0x1fec,
   635  	0x1ff8, 0x1ffc,
   636  	0x210b, 0x210d,
   637  	0x2110, 0x2112,
   638  	0x2119, 0x211d,
   639  	0x212a, 0x212d,
   640  	0x2130, 0x2133,
   641  	0x213e, 0x213f,
   642  	0x2160, 0x216f,
   643  	0x24b6, 0x24cf,
   644  	0x2c00, 0x2c2e,
   645  	0x2c62, 0x2c64,
   646  	0x2c6d, 0x2c70,
   647  	0x2c7e, 0x2c80,
   648  	0xa77d, 0xa77e,
   649  	0xff21, 0xff3a,
   650  	0x10400, 0x10427,
   651  	0x1d400, 0x1d419,
   652  	0x1d434, 0x1d44d,
   653  	0x1d468, 0x1d481,
   654  	0x1d49e, 0x1d49f,
   655  	0x1d4a5, 0x1d4a6,
   656  	0x1d4a9, 0x1d4ac,
   657  	0x1d4ae, 0x1d4b5,
   658  	0x1d4d0, 0x1d4e9,
   659  	0x1d504, 0x1d505,
   660  	0x1d507, 0x1d50a,
   661  	0x1d50d, 0x1d514,
   662  	0x1d516, 0x1d51c,
   663  	0x1d538, 0x1d539,
   664  	0x1d53b, 0x1d53e,
   665  	0x1d540, 0x1d544,
   666  	0x1d54a, 0x1d550,
   667  	0x1d56c, 0x1d585,
   668  	0x1d5a0, 0x1d5b9,
   669  	0x1d5d4, 0x1d5ed,
   670  	0x1d608, 0x1d621,
   671  	0x1d63c, 0x1d655,
   672  	0x1d670, 0x1d689,
   673  	0x1d6a8, 0x1d6c0,
   674  	0x1d6e2, 0x1d6fa,
   675  	0x1d71c, 0x1d734,
   676  	0x1d756, 0x1d76e,
   677  	0x1d790, 0x1d7a8,
   678  };
   679  
   680  static Rune __isupperp[] = {
   681  	0x0100, 0x0136,
   682  	0x0139, 0x0147,
   683  	0x014a, 0x0176,
   684  	0x017b, 0x017d,
   685  	0x01a2, 0x01a4,
   686  	0x01cd, 0x01db,
   687  	0x01de, 0x01ee,
   688  	0x01fa, 0x0232,
   689  	0x0248, 0x024e,
   690  	0x0370, 0x0372,
   691  	0x03d8, 0x03ee,
   692  	0x0460, 0x0480,
   693  	0x048a, 0x04be,
   694  	0x04c3, 0x04cd,
   695  	0x04d0, 0x0526,
   696  	0x1e00, 0x1e94,
   697  	0x1e9e, 0x1efe,
   698  	0x1f59, 0x1f5f,
   699  	0x2124, 0x2128,
   700  	0x2c67, 0x2c6b,
   701  	0x2c82, 0x2ce2,
   702  	0x2ceb, 0x2ced,
   703  	0xa640, 0xa66c,
   704  	0xa680, 0xa696,
   705  	0xa722, 0xa72e,
   706  	0xa732, 0xa76e,
   707  	0xa779, 0xa77b,
   708  	0xa780, 0xa786,
   709  	0xa78b, 0xa78d,
   710  	0xa790, 0xa792,
   711  	0xa7a0, 0xa7aa,
   712  };
   713  
   714  static Rune __isuppers[] = {
   715  	0x0184,
   716  	0x01a9,
   717  	0x01ac,
   718  	0x01b5,
   719  	0x01bc,
   720  	0x01c4,
   721  	0x01c7,
   722  	0x01ca,
   723  	0x01f1,
   724  	0x01f4,
   725  	0x0241,
   726  	0x0376,
   727  	0x0386,
   728  	0x038c,
   729  	0x03cf,
   730  	0x03f4,
   731  	0x03f7,
   732  	0x10c7,
   733  	0x10cd,
   734  	0x2102,
   735  	0x2107,
   736  	0x2115,
   737  	0x2145,
   738  	0x2183,
   739  	0x2c60,
   740  	0x2c72,
   741  	0x2c75,
   742  	0x2cf2,
   743  	0x1d49c,
   744  	0x1d4a2,
   745  	0x1d546,
   746  	0x1d7ca,
   747  };
   748  
   749  int
   750  isupperrune(Rune c)
   751  {
   752  	Rune *p;
   753  
   754  	p = rbsearch(c, __isupperr, nelem(__isupperr)/2, 2);
   755  	if(p && c >= p[0] && c <= p[1])
   756  		return 1;
   757  	p = rbsearch(c, __isupperp, nelem(__isupperp)/2, 2);
   758  	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
   759  		return 1;
   760  	p = rbsearch(c, __isuppers, nelem(__isuppers), 1);
   761  	if(p && c == p[0])
   762  		return 1;
   763  	return 0;
   764  }
   765  
   766  static Rune __islowerr[] = {
   767  	0x0061, 0x007a,
   768  	0x00df, 0x00f6,
   769  	0x00f8, 0x00ff,
   770  	0x0137, 0x0138,
   771  	0x0148, 0x0149,
   772  	0x017e, 0x0180,
   773  	0x018c, 0x018d,
   774  	0x0199, 0x019b,
   775  	0x01aa, 0x01ab,
   776  	0x01b9, 0x01ba,
   777  	0x01bd, 0x01bf,
   778  	0x01dc, 0x01dd,
   779  	0x01ef, 0x01f0,
   780  	0x0233, 0x0239,
   781  	0x023f, 0x0240,
   782  	0x024f, 0x0293,
   783  	0x0295, 0x02af,
   784  	0x037b, 0x037d,
   785  	0x03ac, 0x03ce,
   786  	0x03d0, 0x03d1,
   787  	0x03d5, 0x03d7,
   788  	0x03ef, 0x03f3,
   789  	0x03fb, 0x03fc,
   790  	0x0430, 0x045f,
   791  	0x04ce, 0x04cf,
   792  	0x0561, 0x0587,
   793  	0x1d00, 0x1d2b,
   794  	0x1d6b, 0x1d77,
   795  	0x1d79, 0x1d9a,
   796  	0x1e95, 0x1e9d,
   797  	0x1eff, 0x1f07,
   798  	0x1f10, 0x1f15,
   799  	0x1f20, 0x1f27,
   800  	0x1f30, 0x1f37,
   801  	0x1f40, 0x1f45,
   802  	0x1f50, 0x1f57,
   803  	0x1f60, 0x1f67,
   804  	0x1f70, 0x1f7d,
   805  	0x1f80, 0x1f87,
   806  	0x1f90, 0x1f97,
   807  	0x1fa0, 0x1fa7,
   808  	0x1fb0, 0x1fb4,
   809  	0x1fb6, 0x1fb7,
   810  	0x1fc2, 0x1fc4,
   811  	0x1fc6, 0x1fc7,
   812  	0x1fd0, 0x1fd3,
   813  	0x1fd6, 0x1fd7,
   814  	0x1fe0, 0x1fe7,
   815  	0x1ff2, 0x1ff4,
   816  	0x1ff6, 0x1ff7,
   817  	0x210e, 0x210f,
   818  	0x213c, 0x213d,
   819  	0x2146, 0x2149,
   820  	0x2170, 0x217f,
   821  	0x24d0, 0x24e9,
   822  	0x2c30, 0x2c5e,
   823  	0x2c65, 0x2c66,
   824  	0x2c73, 0x2c74,
   825  	0x2c76, 0x2c7b,
   826  	0x2ce3, 0x2ce4,
   827  	0x2d00, 0x2d25,
   828  	0xa72f, 0xa731,
   829  	0xa771, 0xa778,
   830  	0xfb00, 0xfb06,
   831  	0xfb13, 0xfb17,
   832  	0xff41, 0xff5a,
   833  	0x10428, 0x1044f,
   834  	0x1d41a, 0x1d433,
   835  	0x1d44e, 0x1d454,
   836  	0x1d456, 0x1d467,
   837  	0x1d482, 0x1d49b,
   838  	0x1d4b6, 0x1d4b9,
   839  	0x1d4bd, 0x1d4c3,
   840  	0x1d4c5, 0x1d4cf,
   841  	0x1d4ea, 0x1d503,
   842  	0x1d51e, 0x1d537,
   843  	0x1d552, 0x1d56b,
   844  	0x1d586, 0x1d59f,
   845  	0x1d5ba, 0x1d5d3,
   846  	0x1d5ee, 0x1d607,
   847  	0x1d622, 0x1d63b,
   848  	0x1d656, 0x1d66f,
   849  	0x1d68a, 0x1d6a5,
   850  	0x1d6c2, 0x1d6da,
   851  	0x1d6dc, 0x1d6e1,
   852  	0x1d6fc, 0x1d714,
   853  	0x1d716, 0x1d71b,
   854  	0x1d736, 0x1d74e,
   855  	0x1d750, 0x1d755,
   856  	0x1d770, 0x1d788,
   857  	0x1d78a, 0x1d78f,
   858  	0x1d7aa, 0x1d7c2,
   859  	0x1d7c4, 0x1d7c9,
   860  };
   861  
   862  static Rune __islowerp[] = {
   863  	0x0101, 0x0135,
   864  	0x013a, 0x0146,
   865  	0x014b, 0x0177,
   866  	0x017a, 0x017c,
   867  	0x0183, 0x0185,
   868  	0x01a1, 0x01a5,
   869  	0x01b4, 0x01b6,
   870  	0x01cc, 0x01da,
   871  	0x01df, 0x01ed,
   872  	0x01f3, 0x01f5,
   873  	0x01f9, 0x0231,
   874  	0x0247, 0x024d,
   875  	0x0371, 0x0373,
   876  	0x03d9, 0x03ed,
   877  	0x0461, 0x0481,
   878  	0x048b, 0x04bf,
   879  	0x04c2, 0x04cc,
   880  	0x04d1, 0x0527,
   881  	0x1e01, 0x1e93,
   882  	0x1e9f, 0x1efd,
   883  	0x2c68, 0x2c6c,
   884  	0x2c81, 0x2ce1,
   885  	0x2cec, 0x2cee,
   886  	0xa641, 0xa66d,
   887  	0xa681, 0xa697,
   888  	0xa723, 0xa72d,
   889  	0xa733, 0xa76f,
   890  	0xa77a, 0xa77c,
   891  	0xa77f, 0xa787,
   892  	0xa78c, 0xa78e,
   893  	0xa791, 0xa793,
   894  	0xa7a1, 0xa7a9,
   895  };
   896  
   897  static Rune __islowers[] = {
   898  	0x00b5,
   899  	0x0188,
   900  	0x0192,
   901  	0x0195,
   902  	0x019e,
   903  	0x01a8,
   904  	0x01ad,
   905  	0x01b0,
   906  	0x01c6,
   907  	0x01c9,
   908  	0x023c,
   909  	0x0242,
   910  	0x0377,
   911  	0x0390,
   912  	0x03f5,
   913  	0x03f8,
   914  	0x1fbe,
   915  	0x210a,
   916  	0x2113,
   917  	0x212f,
   918  	0x2134,
   919  	0x2139,
   920  	0x214e,
   921  	0x2184,
   922  	0x2c61,
   923  	0x2c71,
   924  	0x2cf3,
   925  	0x2d27,
   926  	0x2d2d,
   927  	0xa7fa,
   928  	0x1d4bb,
   929  	0x1d7cb,
   930  };
   931  
   932  int
   933  islowerrune(Rune c)
   934  {
   935  	Rune *p;
   936  
   937  	p = rbsearch(c, __islowerr, nelem(__islowerr)/2, 2);
   938  	if(p && c >= p[0] && c <= p[1])
   939  		return 1;
   940  	p = rbsearch(c, __islowerp, nelem(__islowerp)/2, 2);
   941  	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
   942  		return 1;
   943  	p = rbsearch(c, __islowers, nelem(__islowers), 1);
   944  	if(p && c == p[0])
   945  		return 1;
   946  	return 0;
   947  }
   948  
   949  static Rune __istitler[] = {
   950  	0x0041, 0x005a,
   951  	0x00c0, 0x00d6,
   952  	0x00d8, 0x00de,
   953  	0x0178, 0x0179,
   954  	0x0181, 0x0182,
   955  	0x0186, 0x0187,
   956  	0x0189, 0x018b,
   957  	0x018e, 0x0191,
   958  	0x0193, 0x0194,
   959  	0x0196, 0x0198,
   960  	0x019c, 0x019d,
   961  	0x019f, 0x01a0,
   962  	0x01a6, 0x01a7,
   963  	0x01ae, 0x01af,
   964  	0x01b1, 0x01b3,
   965  	0x01b7, 0x01b8,
   966  	0x01f6, 0x01f8,
   967  	0x023a, 0x023b,
   968  	0x023d, 0x023e,
   969  	0x0243, 0x0246,
   970  	0x0388, 0x038a,
   971  	0x038e, 0x038f,
   972  	0x0391, 0x03a1,
   973  	0x03a3, 0x03ab,
   974  	0x03f9, 0x03fa,
   975  	0x03fd, 0x042f,
   976  	0x04c0, 0x04c1,
   977  	0x0531, 0x0556,
   978  	0x10a0, 0x10c5,
   979  	0x1f08, 0x1f0f,
   980  	0x1f18, 0x1f1d,
   981  	0x1f28, 0x1f2f,
   982  	0x1f38, 0x1f3f,
   983  	0x1f48, 0x1f4d,
   984  	0x1f68, 0x1f6f,
   985  	0x1f88, 0x1f8f,
   986  	0x1f98, 0x1f9f,
   987  	0x1fa8, 0x1faf,
   988  	0x1fb8, 0x1fbc,
   989  	0x1fc8, 0x1fcc,
   990  	0x1fd8, 0x1fdb,
   991  	0x1fe8, 0x1fec,
   992  	0x1ff8, 0x1ffc,
   993  	0x2160, 0x216f,
   994  	0x24b6, 0x24cf,
   995  	0x2c00, 0x2c2e,
   996  	0x2c62, 0x2c64,
   997  	0x2c6d, 0x2c70,
   998  	0x2c7e, 0x2c80,
   999  	0xa77d, 0xa77e,
  1000  	0xff21, 0xff3a,
  1001  	0x10400, 0x10427,
  1002  };
  1003  
  1004  static Rune __istitlep[] = {
  1005  	0x0100, 0x012e,
  1006  	0x0132, 0x0136,
  1007  	0x0139, 0x0147,
  1008  	0x014a, 0x0176,
  1009  	0x017b, 0x017d,
  1010  	0x01a2, 0x01a4,
  1011  	0x01cb, 0x01db,
  1012  	0x01de, 0x01ee,
  1013  	0x01f2, 0x01f4,
  1014  	0x01fa, 0x0232,
  1015  	0x0248, 0x024e,
  1016  	0x0370, 0x0372,
  1017  	0x03d8, 0x03ee,
  1018  	0x0460, 0x0480,
  1019  	0x048a, 0x04be,
  1020  	0x04c3, 0x04cd,
  1021  	0x04d0, 0x0526,
  1022  	0x1e00, 0x1e94,
  1023  	0x1ea0, 0x1efe,
  1024  	0x1f59, 0x1f5f,
  1025  	0x2c67, 0x2c6b,
  1026  	0x2c82, 0x2ce2,
  1027  	0x2ceb, 0x2ced,
  1028  	0xa640, 0xa66c,
  1029  	0xa680, 0xa696,
  1030  	0xa722, 0xa72e,
  1031  	0xa732, 0xa76e,
  1032  	0xa779, 0xa77b,
  1033  	0xa780, 0xa786,
  1034  	0xa78b, 0xa78d,
  1035  	0xa790, 0xa792,
  1036  	0xa7a0, 0xa7aa,
  1037  };
  1038  
  1039  static Rune __istitles[] = {
  1040  	0x0184,
  1041  	0x01a9,
  1042  	0x01ac,
  1043  	0x01b5,
  1044  	0x01bc,
  1045  	0x01c5,
  1046  	0x01c8,
  1047  	0x0241,
  1048  	0x0376,
  1049  	0x0386,
  1050  	0x038c,
  1051  	0x03cf,
  1052  	0x03f7,
  1053  	0x10c7,
  1054  	0x10cd,
  1055  	0x2132,
  1056  	0x2183,
  1057  	0x2c60,
  1058  	0x2c72,
  1059  	0x2c75,
  1060  	0x2cf2,
  1061  };
  1062  
  1063  int
  1064  istitlerune(Rune c)
  1065  {
  1066  	Rune *p;
  1067  
  1068  	p = rbsearch(c, __istitler, nelem(__istitler)/2, 2);
  1069  	if(p && c >= p[0] && c <= p[1])
  1070  		return 1;
  1071  	p = rbsearch(c, __istitlep, nelem(__istitlep)/2, 2);
  1072  	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
  1073  		return 1;
  1074  	p = rbsearch(c, __istitles, nelem(__istitles), 1);
  1075  	if(p && c == p[0])
  1076  		return 1;
  1077  	return 0;
  1078  }
  1079  
  1080  static Rune __toupperr[] = {
  1081  	0x0061, 0x007a, 1048544,
  1082  	0x00e0, 0x00f6, 1048544,
  1083  	0x00f8, 0x00fe, 1048544,
  1084  	0x023f, 0x0240, 1059391,
  1085  	0x0256, 0x0257, 1048371,
  1086  	0x028a, 0x028b, 1048359,
  1087  	0x037b, 0x037d, 1048706,
  1088  	0x03ad, 0x03af, 1048539,
  1089  	0x03b1, 0x03c1, 1048544,
  1090  	0x03c3, 0x03cb, 1048544,
  1091  	0x03cd, 0x03ce, 1048513,
  1092  	0x0430, 0x044f, 1048544,
  1093  	0x0450, 0x045f, 1048496,
  1094  	0x0561, 0x0586, 1048528,
  1095  	0x1f00, 0x1f07, 1048584,
  1096  	0x1f10, 0x1f15, 1048584,
  1097  	0x1f20, 0x1f27, 1048584,
  1098  	0x1f30, 0x1f37, 1048584,
  1099  	0x1f40, 0x1f45, 1048584,
  1100  	0x1f60, 0x1f67, 1048584,
  1101  	0x1f70, 0x1f71, 1048650,
  1102  	0x1f72, 0x1f75, 1048662,
  1103  	0x1f76, 0x1f77, 1048676,
  1104  	0x1f78, 0x1f79, 1048704,
  1105  	0x1f7a, 0x1f7b, 1048688,
  1106  	0x1f7c, 0x1f7d, 1048702,
  1107  	0x1f80, 0x1f87, 1048584,
  1108  	0x1f90, 0x1f97, 1048584,
  1109  	0x1fa0, 0x1fa7, 1048584,
  1110  	0x1fb0, 0x1fb1, 1048584,
  1111  	0x1fd0, 0x1fd1, 1048584,
  1112  	0x1fe0, 0x1fe1, 1048584,
  1113  	0x2170, 0x217f, 1048560,
  1114  	0x24d0, 0x24e9, 1048550,
  1115  	0x2c30, 0x2c5e, 1048528,
  1116  	0x2d00, 0x2d25, 1041312,
  1117  	0xff41, 0xff5a, 1048544,
  1118  	0x10428, 0x1044f, 1048536,
  1119  };
  1120  
  1121  static Rune __toupperp[] = {
  1122  	0x0101, 0x012f, 1048575,
  1123  	0x0133, 0x0137, 1048575,
  1124  	0x013a, 0x0148, 1048575,
  1125  	0x014b, 0x0177, 1048575,
  1126  	0x017a, 0x017e, 1048575,
  1127  	0x0183, 0x0185, 1048575,
  1128  	0x01a1, 0x01a5, 1048575,
  1129  	0x01b4, 0x01b6, 1048575,
  1130  	0x01ce, 0x01dc, 1048575,
  1131  	0x01df, 0x01ef, 1048575,
  1132  	0x01f9, 0x021f, 1048575,
  1133  	0x0223, 0x0233, 1048575,
  1134  	0x0247, 0x024f, 1048575,
  1135  	0x0371, 0x0373, 1048575,
  1136  	0x03d9, 0x03ef, 1048575,
  1137  	0x0461, 0x0481, 1048575,
  1138  	0x048b, 0x04bf, 1048575,
  1139  	0x04c2, 0x04ce, 1048575,
  1140  	0x04d1, 0x0527, 1048575,
  1141  	0x1e01, 0x1e95, 1048575,
  1142  	0x1ea1, 0x1eff, 1048575,
  1143  	0x1f51, 0x1f57, 1048584,
  1144  	0x2c68, 0x2c6c, 1048575,
  1145  	0x2c81, 0x2ce3, 1048575,
  1146  	0x2cec, 0x2cee, 1048575,
  1147  	0xa641, 0xa66d, 1048575,
  1148  	0xa681, 0xa697, 1048575,
  1149  	0xa723, 0xa72f, 1048575,
  1150  	0xa733, 0xa76f, 1048575,
  1151  	0xa77a, 0xa77c, 1048575,
  1152  	0xa77f, 0xa787, 1048575,
  1153  	0xa791, 0xa793, 1048575,
  1154  	0xa7a1, 0xa7a9, 1048575,
  1155  };
  1156  
  1157  static Rune __touppers[] = {
  1158  	0x00b5, 1049319,
  1159  	0x00ff, 1048697,
  1160  	0x0131, 1048344,
  1161  	0x017f, 1048276,
  1162  	0x0180, 1048771,
  1163  	0x0188, 1048575,
  1164  	0x018c, 1048575,
  1165  	0x0192, 1048575,
  1166  	0x0195, 1048673,
  1167  	0x0199, 1048575,
  1168  	0x019a, 1048739,
  1169  	0x019e, 1048706,
  1170  	0x01a8, 1048575,
  1171  	0x01ad, 1048575,
  1172  	0x01b0, 1048575,
  1173  	0x01b9, 1048575,
  1174  	0x01bd, 1048575,
  1175  	0x01bf, 1048632,
  1176  	0x01c5, 1048575,
  1177  	0x01c6, 1048574,
  1178  	0x01c8, 1048575,
  1179  	0x01c9, 1048574,
  1180  	0x01cb, 1048575,
  1181  	0x01cc, 1048574,
  1182  	0x01dd, 1048497,
  1183  	0x01f2, 1048575,
  1184  	0x01f3, 1048574,
  1185  	0x01f5, 1048575,
  1186  	0x023c, 1048575,
  1187  	0x0242, 1048575,
  1188  	0x0250, 1059359,
  1189  	0x0251, 1059356,
  1190  	0x0252, 1059358,
  1191  	0x0253, 1048366,
  1192  	0x0254, 1048370,
  1193  	0x0259, 1048374,
  1194  	0x025b, 1048373,
  1195  	0x0260, 1048371,
  1196  	0x0263, 1048369,
  1197  	0x0265, 1090856,
  1198  	0x0266, 1090884,
  1199  	0x0268, 1048367,
  1200  	0x0269, 1048365,
  1201  	0x026b, 1059319,
  1202  	0x026f, 1048365,
  1203  	0x0271, 1059325,
  1204  	0x0272, 1048363,
  1205  	0x0275, 1048362,
  1206  	0x027d, 1059303,
  1207  	0x0280, 1048358,
  1208  	0x0283, 1048358,
  1209  	0x0288, 1048358,
  1210  	0x0289, 1048507,
  1211  	0x028c, 1048505,
  1212  	0x0292, 1048357,
  1213  	0x0345, 1048660,
  1214  	0x0377, 1048575,
  1215  	0x03ac, 1048538,
  1216  	0x03c2, 1048545,
  1217  	0x03cc, 1048512,
  1218  	0x03d0, 1048514,
  1219  	0x03d1, 1048519,
  1220  	0x03d5, 1048529,
  1221  	0x03d6, 1048522,
  1222  	0x03d7, 1048568,
  1223  	0x03f0, 1048490,
  1224  	0x03f1, 1048496,
  1225  	0x03f2, 1048583,
  1226  	0x03f5, 1048480,
  1227  	0x03f8, 1048575,
  1228  	0x03fb, 1048575,
  1229  	0x04cf, 1048561,
  1230  	0x1d79, 1083908,
  1231  	0x1d7d, 1052390,
  1232  	0x1e9b, 1048517,
  1233  	0x1fb3, 1048585,
  1234  	0x1fbe, 1041371,
  1235  	0x1fc3, 1048585,
  1236  	0x1fe5, 1048583,
  1237  	0x1ff3, 1048585,
  1238  	0x214e, 1048548,
  1239  	0x2184, 1048575,
  1240  	0x2c61, 1048575,
  1241  	0x2c65, 1037781,
  1242  	0x2c66, 1037784,
  1243  	0x2c73, 1048575,
  1244  	0x2c76, 1048575,
  1245  	0x2cf3, 1048575,
  1246  	0x2d27, 1041312,
  1247  	0x2d2d, 1041312,
  1248  	0xa78c, 1048575,
  1249  };
  1250  
  1251  Rune
  1252  toupperrune(Rune c)
  1253  {
  1254  	Rune *p;
  1255  
  1256  	p = rbsearch(c, __toupperr, nelem(__toupperr)/3, 3);
  1257  	if(p && c >= p[0] && c <= p[1])
  1258  		return c + p[2] - 1048576;
  1259  	p = rbsearch(c, __toupperp, nelem(__toupperp)/3, 3);
  1260  	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
  1261  		return c + p[2] - 1048576;
  1262  	p = rbsearch(c, __touppers, nelem(__touppers)/2, 2);
  1263  	if(p && c == p[0])
  1264  		return c + p[1] - 1048576;
  1265  	return c;
  1266  }
  1267  
  1268  static Rune __tolowerr[] = {
  1269  	0x0041, 0x005a, 1048608,
  1270  	0x00c0, 0x00d6, 1048608,
  1271  	0x00d8, 0x00de, 1048608,
  1272  	0x0189, 0x018a, 1048781,
  1273  	0x01b1, 0x01b2, 1048793,
  1274  	0x0388, 0x038a, 1048613,
  1275  	0x038e, 0x038f, 1048639,
  1276  	0x0391, 0x03a1, 1048608,
  1277  	0x03a3, 0x03ab, 1048608,
  1278  	0x03fd, 0x03ff, 1048446,
  1279  	0x0400, 0x040f, 1048656,
  1280  	0x0410, 0x042f, 1048608,
  1281  	0x0531, 0x0556, 1048624,
  1282  	0x10a0, 0x10c5, 1055840,
  1283  	0x1f08, 0x1f0f, 1048568,
  1284  	0x1f18, 0x1f1d, 1048568,
  1285  	0x1f28, 0x1f2f, 1048568,
  1286  	0x1f38, 0x1f3f, 1048568,
  1287  	0x1f48, 0x1f4d, 1048568,
  1288  	0x1f68, 0x1f6f, 1048568,
  1289  	0x1f88, 0x1f8f, 1048568,
  1290  	0x1f98, 0x1f9f, 1048568,
  1291  	0x1fa8, 0x1faf, 1048568,
  1292  	0x1fb8, 0x1fb9, 1048568,
  1293  	0x1fba, 0x1fbb, 1048502,
  1294  	0x1fc8, 0x1fcb, 1048490,
  1295  	0x1fd8, 0x1fd9, 1048568,
  1296  	0x1fda, 0x1fdb, 1048476,
  1297  	0x1fe8, 0x1fe9, 1048568,
  1298  	0x1fea, 0x1feb, 1048464,
  1299  	0x1ff8, 0x1ff9, 1048448,
  1300  	0x1ffa, 0x1ffb, 1048450,
  1301  	0x2160, 0x216f, 1048592,
  1302  	0x24b6, 0x24cf, 1048602,
  1303  	0x2c00, 0x2c2e, 1048624,
  1304  	0x2c7e, 0x2c7f, 1037761,
  1305  	0xff21, 0xff3a, 1048608,
  1306  	0x10400, 0x10427, 1048616,
  1307  };
  1308  
  1309  static Rune __tolowerp[] = {
  1310  	0x0100, 0x012e, 1048577,
  1311  	0x0132, 0x0136, 1048577,
  1312  	0x0139, 0x0147, 1048577,
  1313  	0x014a, 0x0176, 1048577,
  1314  	0x017b, 0x017d, 1048577,
  1315  	0x01a2, 0x01a4, 1048577,
  1316  	0x01b3, 0x01b5, 1048577,
  1317  	0x01cd, 0x01db, 1048577,
  1318  	0x01de, 0x01ee, 1048577,
  1319  	0x01f8, 0x021e, 1048577,
  1320  	0x0222, 0x0232, 1048577,
  1321  	0x0248, 0x024e, 1048577,
  1322  	0x0370, 0x0372, 1048577,
  1323  	0x03d8, 0x03ee, 1048577,
  1324  	0x0460, 0x0480, 1048577,
  1325  	0x048a, 0x04be, 1048577,
  1326  	0x04c3, 0x04cd, 1048577,
  1327  	0x04d0, 0x0526, 1048577,
  1328  	0x1e00, 0x1e94, 1048577,
  1329  	0x1ea0, 0x1efe, 1048577,
  1330  	0x1f59, 0x1f5f, 1048568,
  1331  	0x2c67, 0x2c6b, 1048577,
  1332  	0x2c80, 0x2ce2, 1048577,
  1333  	0x2ceb, 0x2ced, 1048577,
  1334  	0xa640, 0xa66c, 1048577,
  1335  	0xa680, 0xa696, 1048577,
  1336  	0xa722, 0xa72e, 1048577,
  1337  	0xa732, 0xa76e, 1048577,
  1338  	0xa779, 0xa77b, 1048577,
  1339  	0xa780, 0xa786, 1048577,
  1340  	0xa790, 0xa792, 1048577,
  1341  	0xa7a0, 0xa7a8, 1048577,
  1342  };
  1343  
  1344  static Rune __tolowers[] = {
  1345  	0x0130, 1048377,
  1346  	0x0178, 1048455,
  1347  	0x0179, 1048577,
  1348  	0x0181, 1048786,
  1349  	0x0182, 1048577,
  1350  	0x0184, 1048577,
  1351  	0x0186, 1048782,
  1352  	0x0187, 1048577,
  1353  	0x018b, 1048577,
  1354  	0x018e, 1048655,
  1355  	0x018f, 1048778,
  1356  	0x0190, 1048779,
  1357  	0x0191, 1048577,
  1358  	0x0193, 1048781,
  1359  	0x0194, 1048783,
  1360  	0x0196, 1048787,
  1361  	0x0197, 1048785,
  1362  	0x0198, 1048577,
  1363  	0x019c, 1048787,
  1364  	0x019d, 1048789,
  1365  	0x019f, 1048790,
  1366  	0x01a0, 1048577,
  1367  	0x01a6, 1048794,
  1368  	0x01a7, 1048577,
  1369  	0x01a9, 1048794,
  1370  	0x01ac, 1048577,
  1371  	0x01ae, 1048794,
  1372  	0x01af, 1048577,
  1373  	0x01b7, 1048795,
  1374  	0x01b8, 1048577,
  1375  	0x01bc, 1048577,
  1376  	0x01c4, 1048578,
  1377  	0x01c5, 1048577,
  1378  	0x01c7, 1048578,
  1379  	0x01c8, 1048577,
  1380  	0x01ca, 1048578,
  1381  	0x01cb, 1048577,
  1382  	0x01f1, 1048578,
  1383  	0x01f2, 1048577,
  1384  	0x01f4, 1048577,
  1385  	0x01f6, 1048479,
  1386  	0x01f7, 1048520,
  1387  	0x0220, 1048446,
  1388  	0x023a, 1059371,
  1389  	0x023b, 1048577,
  1390  	0x023d, 1048413,
  1391  	0x023e, 1059368,
  1392  	0x0241, 1048577,
  1393  	0x0243, 1048381,
  1394  	0x0244, 1048645,
  1395  	0x0245, 1048647,
  1396  	0x0246, 1048577,
  1397  	0x0376, 1048577,
  1398  	0x0386, 1048614,
  1399  	0x038c, 1048640,
  1400  	0x03cf, 1048584,
  1401  	0x03f4, 1048516,
  1402  	0x03f7, 1048577,
  1403  	0x03f9, 1048569,
  1404  	0x03fa, 1048577,
  1405  	0x04c0, 1048591,
  1406  	0x04c1, 1048577,
  1407  	0x10c7, 1055840,
  1408  	0x10cd, 1055840,
  1409  	0x1e9e, 1040961,
  1410  	0x1fbc, 1048567,
  1411  	0x1fcc, 1048567,
  1412  	0x1fec, 1048569,
  1413  	0x1ffc, 1048567,
  1414  	0x2126, 1041059,
  1415  	0x212a, 1040193,
  1416  	0x212b, 1040314,
  1417  	0x2132, 1048604,
  1418  	0x2183, 1048577,
  1419  	0x2c60, 1048577,
  1420  	0x2c62, 1037833,
  1421  	0x2c63, 1044762,
  1422  	0x2c64, 1037849,
  1423  	0x2c6d, 1037796,
  1424  	0x2c6e, 1037827,
  1425  	0x2c6f, 1037793,
  1426  	0x2c70, 1037794,
  1427  	0x2c72, 1048577,
  1428  	0x2c75, 1048577,
  1429  	0x2cf2, 1048577,
  1430  	0xa77d, 1013244,
  1431  	0xa77e, 1048577,
  1432  	0xa78b, 1048577,
  1433  	0xa78d, 1006296,
  1434  	0xa7aa, 1006268,
  1435  };
  1436  
  1437  Rune
  1438  tolowerrune(Rune c)
  1439  {
  1440  	Rune *p;
  1441  
  1442  	p = rbsearch(c, __tolowerr, nelem(__tolowerr)/3, 3);
  1443  	if(p && c >= p[0] && c <= p[1])
  1444  		return c + p[2] - 1048576;
  1445  	p = rbsearch(c, __tolowerp, nelem(__tolowerp)/3, 3);
  1446  	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
  1447  		return c + p[2] - 1048576;
  1448  	p = rbsearch(c, __tolowers, nelem(__tolowers)/2, 2);
  1449  	if(p && c == p[0])
  1450  		return c + p[1] - 1048576;
  1451  	return c;
  1452  }
  1453  
  1454  static Rune __totitler[] = {
  1455  	0x0061, 0x007a, 1048544,
  1456  	0x00e0, 0x00f6, 1048544,
  1457  	0x00f8, 0x00fe, 1048544,
  1458  	0x023f, 0x0240, 1059391,
  1459  	0x0256, 0x0257, 1048371,
  1460  	0x028a, 0x028b, 1048359,
  1461  	0x037b, 0x037d, 1048706,
  1462  	0x03ad, 0x03af, 1048539,
  1463  	0x03b1, 0x03c1, 1048544,
  1464  	0x03c3, 0x03cb, 1048544,
  1465  	0x03cd, 0x03ce, 1048513,
  1466  	0x0430, 0x044f, 1048544,
  1467  	0x0450, 0x045f, 1048496,
  1468  	0x0561, 0x0586, 1048528,
  1469  	0x1f00, 0x1f07, 1048584,
  1470  	0x1f10, 0x1f15, 1048584,
  1471  	0x1f20, 0x1f27, 1048584,
  1472  	0x1f30, 0x1f37, 1048584,
  1473  	0x1f40, 0x1f45, 1048584,
  1474  	0x1f60, 0x1f67, 1048584,
  1475  	0x1f70, 0x1f71, 1048650,
  1476  	0x1f72, 0x1f75, 1048662,
  1477  	0x1f76, 0x1f77, 1048676,
  1478  	0x1f78, 0x1f79, 1048704,
  1479  	0x1f7a, 0x1f7b, 1048688,
  1480  	0x1f7c, 0x1f7d, 1048702,
  1481  	0x1f80, 0x1f87, 1048584,
  1482  	0x1f90, 0x1f97, 1048584,
  1483  	0x1fa0, 0x1fa7, 1048584,
  1484  	0x1fb0, 0x1fb1, 1048584,
  1485  	0x1fd0, 0x1fd1, 1048584,
  1486  	0x1fe0, 0x1fe1, 1048584,
  1487  	0x2170, 0x217f, 1048560,
  1488  	0x24d0, 0x24e9, 1048550,
  1489  	0x2c30, 0x2c5e, 1048528,
  1490  	0x2d00, 0x2d25, 1041312,
  1491  	0xff41, 0xff5a, 1048544,
  1492  	0x10428, 0x1044f, 1048536,
  1493  };
  1494  
  1495  static Rune __totitlep[] = {
  1496  	0x0101, 0x012f, 1048575,
  1497  	0x0133, 0x0137, 1048575,
  1498  	0x013a, 0x0148, 1048575,
  1499  	0x014b, 0x0177, 1048575,
  1500  	0x017a, 0x017e, 1048575,
  1501  	0x0183, 0x0185, 1048575,
  1502  	0x01a1, 0x01a5, 1048575,
  1503  	0x01b4, 0x01b6, 1048575,
  1504  	0x01cc, 0x01dc, 1048575,
  1505  	0x01df, 0x01ef, 1048575,
  1506  	0x01f3, 0x01f5, 1048575,
  1507  	0x01f9, 0x021f, 1048575,
  1508  	0x0223, 0x0233, 1048575,
  1509  	0x0247, 0x024f, 1048575,
  1510  	0x0371, 0x0373, 1048575,
  1511  	0x03d9, 0x03ef, 1048575,
  1512  	0x0461, 0x0481, 1048575,
  1513  	0x048b, 0x04bf, 1048575,
  1514  	0x04c2, 0x04ce, 1048575,
  1515  	0x04d1, 0x0527, 1048575,
  1516  	0x1e01, 0x1e95, 1048575,
  1517  	0x1ea1, 0x1eff, 1048575,
  1518  	0x1f51, 0x1f57, 1048584,
  1519  	0x2c68, 0x2c6c, 1048575,
  1520  	0x2c81, 0x2ce3, 1048575,
  1521  	0x2cec, 0x2cee, 1048575,
  1522  	0xa641, 0xa66d, 1048575,
  1523  	0xa681, 0xa697, 1048575,
  1524  	0xa723, 0xa72f, 1048575,
  1525  	0xa733, 0xa76f, 1048575,
  1526  	0xa77a, 0xa77c, 1048575,
  1527  	0xa77f, 0xa787, 1048575,
  1528  	0xa791, 0xa793, 1048575,
  1529  	0xa7a1, 0xa7a9, 1048575,
  1530  };
  1531  
  1532  static Rune __totitles[] = {
  1533  	0x00b5, 1049319,
  1534  	0x00ff, 1048697,
  1535  	0x0131, 1048344,
  1536  	0x017f, 1048276,
  1537  	0x0180, 1048771,
  1538  	0x0188, 1048575,
  1539  	0x018c, 1048575,
  1540  	0x0192, 1048575,
  1541  	0x0195, 1048673,
  1542  	0x0199, 1048575,
  1543  	0x019a, 1048739,
  1544  	0x019e, 1048706,
  1545  	0x01a8, 1048575,
  1546  	0x01ad, 1048575,
  1547  	0x01b0, 1048575,
  1548  	0x01b9, 1048575,
  1549  	0x01bd, 1048575,
  1550  	0x01bf, 1048632,
  1551  	0x01c4, 1048577,
  1552  	0x01c6, 1048575,
  1553  	0x01c7, 1048577,
  1554  	0x01c9, 1048575,
  1555  	0x01ca, 1048577,
  1556  	0x01dd, 1048497,
  1557  	0x01f1, 1048577,
  1558  	0x023c, 1048575,
  1559  	0x0242, 1048575,
  1560  	0x0250, 1059359,
  1561  	0x0251, 1059356,
  1562  	0x0252, 1059358,
  1563  	0x0253, 1048366,
  1564  	0x0254, 1048370,
  1565  	0x0259, 1048374,
  1566  	0x025b, 1048373,
  1567  	0x0260, 1048371,
  1568  	0x0263, 1048369,
  1569  	0x0265, 1090856,
  1570  	0x0266, 1090884,
  1571  	0x0268, 1048367,
  1572  	0x0269, 1048365,
  1573  	0x026b, 1059319,
  1574  	0x026f, 1048365,
  1575  	0x0271, 1059325,
  1576  	0x0272, 1048363,
  1577  	0x0275, 1048362,
  1578  	0x027d, 1059303,
  1579  	0x0280, 1048358,
  1580  	0x0283, 1048358,
  1581  	0x0288, 1048358,
  1582  	0x0289, 1048507,
  1583  	0x028c, 1048505,
  1584  	0x0292, 1048357,
  1585  	0x0345, 1048660,
  1586  	0x0377, 1048575,
  1587  	0x03ac, 1048538,
  1588  	0x03c2, 1048545,
  1589  	0x03cc, 1048512,
  1590  	0x03d0, 1048514,
  1591  	0x03d1, 1048519,
  1592  	0x03d5, 1048529,
  1593  	0x03d6, 1048522,
  1594  	0x03d7, 1048568,
  1595  	0x03f0, 1048490,
  1596  	0x03f1, 1048496,
  1597  	0x03f2, 1048583,
  1598  	0x03f5, 1048480,
  1599  	0x03f8, 1048575,
  1600  	0x03fb, 1048575,
  1601  	0x04cf, 1048561,
  1602  	0x1d79, 1083908,
  1603  	0x1d7d, 1052390,
  1604  	0x1e9b, 1048517,
  1605  	0x1fb3, 1048585,
  1606  	0x1fbe, 1041371,
  1607  	0x1fc3, 1048585,
  1608  	0x1fe5, 1048583,
  1609  	0x1ff3, 1048585,
  1610  	0x214e, 1048548,
  1611  	0x2184, 1048575,
  1612  	0x2c61, 1048575,
  1613  	0x2c65, 1037781,
  1614  	0x2c66, 1037784,
  1615  	0x2c73, 1048575,
  1616  	0x2c76, 1048575,
  1617  	0x2cf3, 1048575,
  1618  	0x2d27, 1041312,
  1619  	0x2d2d, 1041312,
  1620  	0xa78c, 1048575,
  1621  };
  1622  
  1623  Rune
  1624  totitlerune(Rune c)
  1625  {
  1626  	Rune *p;
  1627  
  1628  	p = rbsearch(c, __totitler, nelem(__totitler)/3, 3);
  1629  	if(p && c >= p[0] && c <= p[1])
  1630  		return c + p[2] - 1048576;
  1631  	p = rbsearch(c, __totitlep, nelem(__totitlep)/3, 3);
  1632  	if(p && c >= p[0] && c <= p[1] && !((c - p[0]) & 1))
  1633  		return c + p[2] - 1048576;
  1634  	p = rbsearch(c, __totitles, nelem(__totitles)/2, 2);
  1635  	if(p && c == p[0])
  1636  		return c + p[1] - 1048576;
  1637  	return c;
  1638  }
  1639