fiss

Friedel's Initialization and Service Supervision
Log | Files | Refs | LICENSE

runetype.c (30503B)


      1 /*
      2  * The authors of this software are Rob Pike and Ken Thompson.
      3  *              Copyright (c) 2002 by Lucent Technologies.
      4  * Permission to use, copy, modify, and distribute this software for any
      5  * purpose without fee is hereby granted, provided that this entire notice
      6  * is included in all copies of any software which is or includes a copy
      7  * or modification of this software and in all copies of the supporting
      8  * documentation for such software.
      9  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
     10  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
     11  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
     12  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
     13  */
     14 #include "plan9.h"
     15 #include "utf.h"
     16 
     17 #include <stdarg.h>
     18 #include <string.h>
     19 
     20 /*
     21  * alpha ranges -
     22  *	only covers ranges not in lower||upper
     23  */
     24 static Rune __alpha2[] = {
     25 	0x00d8, 0x00f6, /* Ø - ö */
     26 	0x00f8, 0x01f5, /* ø - ǵ */
     27 	0x0250, 0x02a8, /* ɐ - ʨ */
     28 	0x038e, 0x03a1, /* Ύ - Ρ */
     29 	0x03a3, 0x03ce, /* Σ - ώ */
     30 	0x03d0, 0x03d6, /* ϐ - ϖ */
     31 	0x03e2, 0x03f3, /* Ϣ - ϳ */
     32 	0x0490, 0x04c4, /* Ґ - ӄ */
     33 	0x0561, 0x0587, /* ա - և */
     34 	0x05d0, 0x05ea, /* א - ת */
     35 	0x05f0, 0x05f2, /* װ - ײ */
     36 	0x0621, 0x063a, /* ء - غ */
     37 	0x0640, 0x064a, /* ـ - ي */
     38 	0x0671, 0x06b7, /* ٱ - ڷ */
     39 	0x06ba, 0x06be, /* ں - ھ */
     40 	0x06c0, 0x06ce, /* ۀ - ێ */
     41 	0x06d0, 0x06d3, /* ې - ۓ */
     42 	0x0905, 0x0939, /* अ - ह */
     43 	0x0958, 0x0961, /* क़ - ॡ */
     44 	0x0985, 0x098c, /* অ - ঌ */
     45 	0x098f, 0x0990, /* এ - ঐ */
     46 	0x0993, 0x09a8, /* ও - ন */
     47 	0x09aa, 0x09b0, /* প - র */
     48 	0x09b6, 0x09b9, /* শ - হ */
     49 	0x09dc, 0x09dd, /* ড় - ঢ় */
     50 	0x09df, 0x09e1, /* য় - ৡ */
     51 	0x09f0, 0x09f1, /* ৰ - ৱ */
     52 	0x0a05, 0x0a0a, /* ਅ - ਊ */
     53 	0x0a0f, 0x0a10, /* ਏ - ਐ */
     54 	0x0a13, 0x0a28, /* ਓ - ਨ */
     55 	0x0a2a, 0x0a30, /* ਪ - ਰ */
     56 	0x0a32, 0x0a33, /* ਲ - ਲ਼ */
     57 	0x0a35, 0x0a36, /* ਵ - ਸ਼ */
     58 	0x0a38, 0x0a39, /* ਸ - ਹ */
     59 	0x0a59, 0x0a5c, /* ਖ਼ - ੜ */
     60 	0x0a85, 0x0a8b, /* અ - ઋ */
     61 	0x0a8f, 0x0a91, /* એ - ઑ */
     62 	0x0a93, 0x0aa8, /* ઓ - ન */
     63 	0x0aaa, 0x0ab0, /* પ - ર */
     64 	0x0ab2, 0x0ab3, /* લ - ળ */
     65 	0x0ab5, 0x0ab9, /* વ - હ */
     66 	0x0b05, 0x0b0c, /* ଅ - ଌ */
     67 	0x0b0f, 0x0b10, /* ଏ - ଐ */
     68 	0x0b13, 0x0b28, /* ଓ - ନ */
     69 	0x0b2a, 0x0b30, /* ପ - ର */
     70 	0x0b32, 0x0b33, /* ଲ - ଳ */
     71 	0x0b36, 0x0b39, /* ଶ - ହ */
     72 	0x0b5c, 0x0b5d, /* ଡ଼ - ଢ଼ */
     73 	0x0b5f, 0x0b61, /* ୟ - ୡ */
     74 	0x0b85, 0x0b8a, /* அ - ஊ */
     75 	0x0b8e, 0x0b90, /* எ - ஐ */
     76 	0x0b92, 0x0b95, /* ஒ - க */
     77 	0x0b99, 0x0b9a, /* ங - ச */
     78 	0x0b9e, 0x0b9f, /* ஞ - ட */
     79 	0x0ba3, 0x0ba4, /* ண - த */
     80 	0x0ba8, 0x0baa, /* ந - ப */
     81 	0x0bae, 0x0bb5, /* ம - வ */
     82 	0x0bb7, 0x0bb9, /* ஷ - ஹ */
     83 	0x0c05, 0x0c0c, /* అ - ఌ */
     84 	0x0c0e, 0x0c10, /* ఎ - ఐ */
     85 	0x0c12, 0x0c28, /* ఒ - న */
     86 	0x0c2a, 0x0c33, /* ప - ళ */
     87 	0x0c35, 0x0c39, /* వ - హ */
     88 	0x0c60, 0x0c61, /* ౠ - ౡ */
     89 	0x0c85, 0x0c8c, /* ಅ - ಌ */
     90 	0x0c8e, 0x0c90, /* ಎ - ಐ */
     91 	0x0c92, 0x0ca8, /* ಒ - ನ */
     92 	0x0caa, 0x0cb3, /* ಪ - ಳ */
     93 	0x0cb5, 0x0cb9, /* ವ - ಹ */
     94 	0x0ce0, 0x0ce1, /* ೠ - ೡ */
     95 	0x0d05, 0x0d0c, /* അ - ഌ */
     96 	0x0d0e, 0x0d10, /* എ - ഐ */
     97 	0x0d12, 0x0d28, /* ഒ - ന */
     98 	0x0d2a, 0x0d39, /* പ - ഹ */
     99 	0x0d60, 0x0d61, /* ൠ - ൡ */
    100 	0x0e01, 0x0e30, /* ก - ะ */
    101 	0x0e32, 0x0e33, /* า - ำ */
    102 	0x0e40, 0x0e46, /* เ - ๆ */
    103 	0x0e5a, 0x0e5b, /* ๚ - ๛ */
    104 	0x0e81, 0x0e82, /* ກ - ຂ */
    105 	0x0e87, 0x0e88, /* ງ - ຈ */
    106 	0x0e94, 0x0e97, /* ດ - ທ */
    107 	0x0e99, 0x0e9f, /* ນ - ຟ */
    108 	0x0ea1, 0x0ea3, /* ມ - ຣ */
    109 	0x0eaa, 0x0eab, /* ສ - ຫ */
    110 	0x0ead, 0x0eae, /* ອ - ຮ */
    111 	0x0eb2, 0x0eb3, /* າ - ຳ */
    112 	0x0ec0, 0x0ec4, /* ເ - ໄ */
    113 	0x0edc, 0x0edd, /* ໜ - ໝ */
    114 	0x0f18, 0x0f19, /* ༘ - ༙ */
    115 	0x0f40, 0x0f47, /* ཀ - ཇ */
    116 	0x0f49, 0x0f69, /* ཉ - ཀྵ */
    117 	0x10d0, 0x10f6, /* ა - ჶ */
    118 	0x1100, 0x1159, /* ᄀ - ᅙ */
    119 	0x115f, 0x11a2, /* ᅟ - ᆢ */
    120 	0x11a8, 0x11f9, /* ᆨ - ᇹ */
    121 	0x1e00, 0x1e9b, /* Ḁ - ẛ */
    122 	0x1f50, 0x1f57, /* ὐ - ὗ */
    123 	0x1f80, 0x1fb4, /* ᾀ - ᾴ */
    124 	0x1fb6, 0x1fbc, /* ᾶ - ᾼ */
    125 	0x1fc2, 0x1fc4, /* ῂ - ῄ */
    126 	0x1fc6, 0x1fcc, /* ῆ - ῌ */
    127 	0x1fd0, 0x1fd3, /* ῐ - ΐ */
    128 	0x1fd6, 0x1fdb, /* ῖ - Ί */
    129 	0x1fe0, 0x1fec, /* ῠ - Ῥ */
    130 	0x1ff2, 0x1ff4, /* ῲ - ῴ */
    131 	0x1ff6, 0x1ffc, /* ῶ - ῼ */
    132 	0x210a, 0x2113, /* ℊ - ℓ */
    133 	0x2115, 0x211d, /* ℕ - ℝ */
    134 	0x2120, 0x2122, /* ℠ - ™ */
    135 	0x212a, 0x2131, /* K - ℱ */
    136 	0x2133, 0x2138, /* ℳ - ℸ */
    137 	0x3041, 0x3094, /* ぁ - ゔ */
    138 	0x30a1, 0x30fa, /* ァ - ヺ */
    139 	0x3105, 0x312c, /* ㄅ - ㄬ */
    140 	0x3131, 0x318e, /* ㄱ - ㆎ */
    141 	0x3192, 0x319f, /* ㆒ - ㆟ */
    142 	0x3260, 0x327b, /* ㉠ - ㉻ */
    143 	0x328a, 0x32b0, /* ㊊ - ㊰ */
    144 	0x32d0, 0x32fe, /* ㋐ - ㋾ */
    145 	0x3300, 0x3357, /* ㌀ - ㍗ */
    146 	0x3371, 0x3376, /* ㍱ - ㍶ */
    147 	0x337b, 0x3394, /* ㍻ - ㎔ */
    148 	0x3399, 0x339e, /* ㎙ - ㎞ */
    149 	0x33a9, 0x33ad, /* ㎩ - ㎭ */
    150 	0x33b0, 0x33c1, /* ㎰ - ㏁ */
    151 	0x33c3, 0x33c5, /* ㏃ - ㏅ */
    152 	0x33c7, 0x33d7, /* ㏇ - ㏗ */
    153 	0x33d9, 0x33dd, /* ㏙ - ㏝ */
    154 	0x4e00, 0x9fff, /* 一 - 鿿 */
    155 	0xac00, 0xd7a3, /* 가 - 힣 */
    156 	0xf900, 0xfb06, /* 豈 - st */
    157 	0xfb13, 0xfb17, /* ﬓ - ﬗ */
    158 	0xfb1f, 0xfb28, /* ײַ - ﬨ */
    159 	0xfb2a, 0xfb36, /* שׁ - זּ */
    160 	0xfb38, 0xfb3c, /* טּ - לּ */
    161 	0xfb40, 0xfb41, /* נּ - סּ */
    162 	0xfb43, 0xfb44, /* ףּ - פּ */
    163 	0xfb46, 0xfbb1, /* צּ - ﮱ */
    164 	0xfbd3, 0xfd3d, /* ﯓ - ﴽ */
    165 	0xfd50, 0xfd8f, /* ﵐ - ﶏ */
    166 	0xfd92, 0xfdc7, /* ﶒ - ﷇ */
    167 	0xfdf0, 0xfdf9, /* ﷰ - ﷹ */
    168 	0xfe70, 0xfe72, /* ﹰ - ﹲ */
    169 	0xfe76, 0xfefc, /* ﹶ - ﻼ */
    170 	0xff66, 0xff6f, /* ヲ - ッ */
    171 	0xff71, 0xff9d, /* ア - ン */
    172 	0xffa0, 0xffbe, /* ᅠ - ᄒ */
    173 	0xffc2, 0xffc7, /* ᅡ - ᅦ */
    174 	0xffca, 0xffcf, /* ᅧ - ᅬ */
    175 	0xffd2, 0xffd7, /* ᅭ - ᅲ */
    176 	0xffda, 0xffdc, /* ᅳ - ᅵ */
    177 };
    178 
    179 /*
    180  * alpha singlets -
    181  *	only covers ranges not in lower||upper
    182  */
    183 static Rune __alpha1[] = {
    184 	0x00aa, /* ª */
    185 	0x00b5, /* µ */
    186 	0x00ba, /* º */
    187 	0x03da, /* Ϛ */
    188 	0x03dc, /* Ϝ */
    189 	0x03de, /* Ϟ */
    190 	0x03e0, /* Ϡ */
    191 	0x06d5, /* ە */
    192 	0x09b2, /* ল */
    193 	0x0a5e, /* ਫ਼ */
    194 	0x0a8d, /* ઍ */
    195 	0x0ae0, /* ૠ */
    196 	0x0b9c, /* ஜ */
    197 	0x0cde, /* ೞ */
    198 	0x0e4f, /* ๏ */
    199 	0x0e84, /* ຄ */
    200 	0x0e8a, /* ຊ */
    201 	0x0e8d, /* ຍ */
    202 	0x0ea5, /* ລ */
    203 	0x0ea7, /* ວ */
    204 	0x0eb0, /* ະ */
    205 	0x0ebd, /* ຽ */
    206 	0x1fbe, /* ι */
    207 	0x207f, /* ⁿ */
    208 	0x20a8, /* ₨ */
    209 	0x2102, /* ℂ */
    210 	0x2107, /* ℇ */
    211 	0x2124, /* ℤ */
    212 	0x2126, /* Ω */
    213 	0x2128, /* ℨ */
    214 	0xfb3e, /* מּ */
    215 	0xfe74, /* ﹴ */
    216 };
    217 
    218 /*
    219  * space ranges
    220  */
    221 static Rune __space2[] = {
    222 	0x0009, 0x000a, /* tab and newline */
    223 	0x0020, 0x0020, /* space */
    224 	0x00a0, 0x00a0, /*   */
    225 	0x2000, 0x200b, /*   - ​ */
    226 	0x2028, 0x2029, /* 
 - 
 */
    227 	0x3000, 0x3000, /*   */
    228 	0xfeff, 0xfeff, /*  */
    229 };
    230 
    231 /*
    232  * lower case ranges
    233  *	3rd col is conversion excess 500
    234  */
    235 static Rune __toupper2[] = {
    236 	0x0061, 0x007a, 468, /* a-z A-Z */
    237 	0x00e0, 0x00f6, 468, /* à-ö À-Ö */
    238 	0x00f8, 0x00fe, 468, /* ø-þ Ø-Þ */
    239 	0x0256, 0x0257, 295, /* ɖ-ɗ Ɖ-Ɗ */
    240 	0x0258, 0x0259, 298, /* ɘ-ə Ǝ-Ə */
    241 	0x028a, 0x028b, 283, /* ʊ-ʋ Ʊ-Ʋ */
    242 	0x03ad, 0x03af, 463, /* έ-ί Έ-Ί */
    243 	0x03b1, 0x03c1, 468, /* α-ρ Α-Ρ */
    244 	0x03c3, 0x03cb, 468, /* σ-ϋ Σ-Ϋ */
    245 	0x03cd, 0x03ce, 437, /* ύ-ώ Ύ-Ώ */
    246 	0x0430, 0x044f, 468, /* а-я А-Я */
    247 	0x0451, 0x045c, 420, /* ё-ќ Ё-Ќ */
    248 	0x045e, 0x045f, 420, /* ў-џ Ў-Џ */
    249 	0x0561, 0x0586, 452, /* ա-ֆ Ա-Ֆ */
    250 	0x1f00, 0x1f07, 508, /* ἀ-ἇ Ἀ-Ἇ */
    251 	0x1f10, 0x1f15, 508, /* ἐ-ἕ Ἐ-Ἕ */
    252 	0x1f20, 0x1f27, 508, /* ἠ-ἧ Ἠ-Ἧ */
    253 	0x1f30, 0x1f37, 508, /* ἰ-ἷ Ἰ-Ἷ */
    254 	0x1f40, 0x1f45, 508, /* ὀ-ὅ Ὀ-Ὅ */
    255 	0x1f60, 0x1f67, 508, /* ὠ-ὧ Ὠ-Ὧ */
    256 	0x1f70, 0x1f71, 574, /* ὰ-ά Ὰ-Ά */
    257 	0x1f72, 0x1f75, 586, /* ὲ-ή Ὲ-Ή */
    258 	0x1f76, 0x1f77, 600, /* ὶ-ί Ὶ-Ί */
    259 	0x1f78, 0x1f79, 628, /* ὸ-ό Ὸ-Ό */
    260 	0x1f7a, 0x1f7b, 612, /* ὺ-ύ Ὺ-Ύ */
    261 	0x1f7c, 0x1f7d, 626, /* ὼ-ώ Ὼ-Ώ */
    262 	0x1f80, 0x1f87, 508, /* ᾀ-ᾇ ᾈ-ᾏ */
    263 	0x1f90, 0x1f97, 508, /* ᾐ-ᾗ ᾘ-ᾟ */
    264 	0x1fa0, 0x1fa7, 508, /* ᾠ-ᾧ ᾨ-ᾯ */
    265 	0x1fb0, 0x1fb1, 508, /* ᾰ-ᾱ Ᾰ-Ᾱ */
    266 	0x1fd0, 0x1fd1, 508, /* ῐ-ῑ Ῐ-Ῑ */
    267 	0x1fe0, 0x1fe1, 508, /* ῠ-ῡ Ῠ-Ῡ */
    268 	0x2170, 0x217f, 484, /* ⅰ-ⅿ Ⅰ-Ⅿ */
    269 	0x24d0, 0x24e9, 474, /* ⓐ-ⓩ Ⓐ-Ⓩ */
    270 	0xff41, 0xff5a, 468, /* a-z A-Z */
    271 };
    272 
    273 /*
    274  * lower case singlets
    275  *	2nd col is conversion excess 500
    276  */
    277 static Rune __toupper1[] = {
    278 	0x00ff, 621, /* ÿ Ÿ */
    279 	0x0101, 499, /* ā Ā */
    280 	0x0103, 499, /* ă Ă */
    281 	0x0105, 499, /* ą Ą */
    282 	0x0107, 499, /* ć Ć */
    283 	0x0109, 499, /* ĉ Ĉ */
    284 	0x010b, 499, /* ċ Ċ */
    285 	0x010d, 499, /* č Č */
    286 	0x010f, 499, /* ď Ď */
    287 	0x0111, 499, /* đ Đ */
    288 	0x0113, 499, /* ē Ē */
    289 	0x0115, 499, /* ĕ Ĕ */
    290 	0x0117, 499, /* ė Ė */
    291 	0x0119, 499, /* ę Ę */
    292 	0x011b, 499, /* ě Ě */
    293 	0x011d, 499, /* ĝ Ĝ */
    294 	0x011f, 499, /* ğ Ğ */
    295 	0x0121, 499, /* ġ Ġ */
    296 	0x0123, 499, /* ģ Ģ */
    297 	0x0125, 499, /* ĥ Ĥ */
    298 	0x0127, 499, /* ħ Ħ */
    299 	0x0129, 499, /* ĩ Ĩ */
    300 	0x012b, 499, /* ī Ī */
    301 	0x012d, 499, /* ĭ Ĭ */
    302 	0x012f, 499, /* į Į */
    303 	0x0131, 268, /* ı I */
    304 	0x0133, 499, /* ij IJ */
    305 	0x0135, 499, /* ĵ Ĵ */
    306 	0x0137, 499, /* ķ Ķ */
    307 	0x013a, 499, /* ĺ Ĺ */
    308 	0x013c, 499, /* ļ Ļ */
    309 	0x013e, 499, /* ľ Ľ */
    310 	0x0140, 499, /* ŀ Ŀ */
    311 	0x0142, 499, /* ł Ł */
    312 	0x0144, 499, /* ń Ń */
    313 	0x0146, 499, /* ņ Ņ */
    314 	0x0148, 499, /* ň Ň */
    315 	0x014b, 499, /* ŋ Ŋ */
    316 	0x014d, 499, /* ō Ō */
    317 	0x014f, 499, /* ŏ Ŏ */
    318 	0x0151, 499, /* ő Ő */
    319 	0x0153, 499, /* œ Œ */
    320 	0x0155, 499, /* ŕ Ŕ */
    321 	0x0157, 499, /* ŗ Ŗ */
    322 	0x0159, 499, /* ř Ř */
    323 	0x015b, 499, /* ś Ś */
    324 	0x015d, 499, /* ŝ Ŝ */
    325 	0x015f, 499, /* ş Ş */
    326 	0x0161, 499, /* š Š */
    327 	0x0163, 499, /* ţ Ţ */
    328 	0x0165, 499, /* ť Ť */
    329 	0x0167, 499, /* ŧ Ŧ */
    330 	0x0169, 499, /* ũ Ũ */
    331 	0x016b, 499, /* ū Ū */
    332 	0x016d, 499, /* ŭ Ŭ */
    333 	0x016f, 499, /* ů Ů */
    334 	0x0171, 499, /* ű Ű */
    335 	0x0173, 499, /* ų Ų */
    336 	0x0175, 499, /* ŵ Ŵ */
    337 	0x0177, 499, /* ŷ Ŷ */
    338 	0x017a, 499, /* ź Ź */
    339 	0x017c, 499, /* ż Ż */
    340 	0x017e, 499, /* ž Ž */
    341 	0x017f, 200, /* ſ S */
    342 	0x0183, 499, /* ƃ Ƃ */
    343 	0x0185, 499, /* ƅ Ƅ */
    344 	0x0188, 499, /* ƈ Ƈ */
    345 	0x018c, 499, /* ƌ Ƌ */
    346 	0x0192, 499, /* ƒ Ƒ */
    347 	0x0199, 499, /* ƙ Ƙ */
    348 	0x01a1, 499, /* ơ Ơ */
    349 	0x01a3, 499, /* ƣ Ƣ */
    350 	0x01a5, 499, /* ƥ Ƥ */
    351 	0x01a8, 499, /* ƨ Ƨ */
    352 	0x01ad, 499, /* ƭ Ƭ */
    353 	0x01b0, 499, /* ư Ư */
    354 	0x01b4, 499, /* ƴ Ƴ */
    355 	0x01b6, 499, /* ƶ Ƶ */
    356 	0x01b9, 499, /* ƹ Ƹ */
    357 	0x01bd, 499, /* ƽ Ƽ */
    358 	0x01c5, 499, /* Dž DŽ */
    359 	0x01c6, 498, /* dž DŽ */
    360 	0x01c8, 499, /* Lj LJ */
    361 	0x01c9, 498, /* lj LJ */
    362 	0x01cb, 499, /* Nj NJ */
    363 	0x01cc, 498, /* nj NJ */
    364 	0x01ce, 499, /* ǎ Ǎ */
    365 	0x01d0, 499, /* ǐ Ǐ */
    366 	0x01d2, 499, /* ǒ Ǒ */
    367 	0x01d4, 499, /* ǔ Ǔ */
    368 	0x01d6, 499, /* ǖ Ǖ */
    369 	0x01d8, 499, /* ǘ Ǘ */
    370 	0x01da, 499, /* ǚ Ǚ */
    371 	0x01dc, 499, /* ǜ Ǜ */
    372 	0x01df, 499, /* ǟ Ǟ */
    373 	0x01e1, 499, /* ǡ Ǡ */
    374 	0x01e3, 499, /* ǣ Ǣ */
    375 	0x01e5, 499, /* ǥ Ǥ */
    376 	0x01e7, 499, /* ǧ Ǧ */
    377 	0x01e9, 499, /* ǩ Ǩ */
    378 	0x01eb, 499, /* ǫ Ǫ */
    379 	0x01ed, 499, /* ǭ Ǭ */
    380 	0x01ef, 499, /* ǯ Ǯ */
    381 	0x01f2, 499, /* Dz DZ */
    382 	0x01f3, 498, /* dz DZ */
    383 	0x01f5, 499, /* ǵ Ǵ */
    384 	0x01fb, 499, /* ǻ Ǻ */
    385 	0x01fd, 499, /* ǽ Ǽ */
    386 	0x01ff, 499, /* ǿ Ǿ */
    387 	0x0201, 499, /* ȁ Ȁ */
    388 	0x0203, 499, /* ȃ Ȃ */
    389 	0x0205, 499, /* ȅ Ȅ */
    390 	0x0207, 499, /* ȇ Ȇ */
    391 	0x0209, 499, /* ȉ Ȉ */
    392 	0x020b, 499, /* ȋ Ȋ */
    393 	0x020d, 499, /* ȍ Ȍ */
    394 	0x020f, 499, /* ȏ Ȏ */
    395 	0x0211, 499, /* ȑ Ȑ */
    396 	0x0213, 499, /* ȓ Ȓ */
    397 	0x0215, 499, /* ȕ Ȕ */
    398 	0x0217, 499, /* ȗ Ȗ */
    399 	0x0253, 290, /* ɓ Ɓ */
    400 	0x0254, 294, /* ɔ Ɔ */
    401 	0x025b, 297, /* ɛ Ɛ */
    402 	0x0260, 295, /* ɠ Ɠ */
    403 	0x0263, 293, /* ɣ Ɣ */
    404 	0x0268, 291, /* ɨ Ɨ */
    405 	0x0269, 289, /* ɩ Ɩ */
    406 	0x026f, 289, /* ɯ Ɯ */
    407 	0x0272, 287, /* ɲ Ɲ */
    408 	0x0283, 282, /* ʃ Ʃ */
    409 	0x0288, 282, /* ʈ Ʈ */
    410 	0x0292, 281, /* ʒ Ʒ */
    411 	0x03ac, 462, /* ά Ά */
    412 	0x03cc, 436, /* ό Ό */
    413 	0x03d0, 438, /* ϐ Β */
    414 	0x03d1, 443, /* ϑ Θ */
    415 	0x03d5, 453, /* ϕ Φ */
    416 	0x03d6, 446, /* ϖ Π */
    417 	0x03e3, 499, /* ϣ Ϣ */
    418 	0x03e5, 499, /* ϥ Ϥ */
    419 	0x03e7, 499, /* ϧ Ϧ */
    420 	0x03e9, 499, /* ϩ Ϩ */
    421 	0x03eb, 499, /* ϫ Ϫ */
    422 	0x03ed, 499, /* ϭ Ϭ */
    423 	0x03ef, 499, /* ϯ Ϯ */
    424 	0x03f0, 414, /* ϰ Κ */
    425 	0x03f1, 420, /* ϱ Ρ */
    426 	0x0461, 499, /* ѡ Ѡ */
    427 	0x0463, 499, /* ѣ Ѣ */
    428 	0x0465, 499, /* ѥ Ѥ */
    429 	0x0467, 499, /* ѧ Ѧ */
    430 	0x0469, 499, /* ѩ Ѩ */
    431 	0x046b, 499, /* ѫ Ѫ */
    432 	0x046d, 499, /* ѭ Ѭ */
    433 	0x046f, 499, /* ѯ Ѯ */
    434 	0x0471, 499, /* ѱ Ѱ */
    435 	0x0473, 499, /* ѳ Ѳ */
    436 	0x0475, 499, /* ѵ Ѵ */
    437 	0x0477, 499, /* ѷ Ѷ */
    438 	0x0479, 499, /* ѹ Ѹ */
    439 	0x047b, 499, /* ѻ Ѻ */
    440 	0x047d, 499, /* ѽ Ѽ */
    441 	0x047f, 499, /* ѿ Ѿ */
    442 	0x0481, 499, /* ҁ Ҁ */
    443 	0x0491, 499, /* ґ Ґ */
    444 	0x0493, 499, /* ғ Ғ */
    445 	0x0495, 499, /* ҕ Ҕ */
    446 	0x0497, 499, /* җ Җ */
    447 	0x0499, 499, /* ҙ Ҙ */
    448 	0x049b, 499, /* қ Қ */
    449 	0x049d, 499, /* ҝ Ҝ */
    450 	0x049f, 499, /* ҟ Ҟ */
    451 	0x04a1, 499, /* ҡ Ҡ */
    452 	0x04a3, 499, /* ң Ң */
    453 	0x04a5, 499, /* ҥ Ҥ */
    454 	0x04a7, 499, /* ҧ Ҧ */
    455 	0x04a9, 499, /* ҩ Ҩ */
    456 	0x04ab, 499, /* ҫ Ҫ */
    457 	0x04ad, 499, /* ҭ Ҭ */
    458 	0x04af, 499, /* ү Ү */
    459 	0x04b1, 499, /* ұ Ұ */
    460 	0x04b3, 499, /* ҳ Ҳ */
    461 	0x04b5, 499, /* ҵ Ҵ */
    462 	0x04b7, 499, /* ҷ Ҷ */
    463 	0x04b9, 499, /* ҹ Ҹ */
    464 	0x04bb, 499, /* һ Һ */
    465 	0x04bd, 499, /* ҽ Ҽ */
    466 	0x04bf, 499, /* ҿ Ҿ */
    467 	0x04c2, 499, /* ӂ Ӂ */
    468 	0x04c4, 499, /* ӄ Ӄ */
    469 	0x04c8, 499, /* ӈ Ӈ */
    470 	0x04cc, 499, /* ӌ Ӌ */
    471 	0x04d1, 499, /* ӑ Ӑ */
    472 	0x04d3, 499, /* ӓ Ӓ */
    473 	0x04d5, 499, /* ӕ Ӕ */
    474 	0x04d7, 499, /* ӗ Ӗ */
    475 	0x04d9, 499, /* ә Ә */
    476 	0x04db, 499, /* ӛ Ӛ */
    477 	0x04dd, 499, /* ӝ Ӝ */
    478 	0x04df, 499, /* ӟ Ӟ */
    479 	0x04e1, 499, /* ӡ Ӡ */
    480 	0x04e3, 499, /* ӣ Ӣ */
    481 	0x04e5, 499, /* ӥ Ӥ */
    482 	0x04e7, 499, /* ӧ Ӧ */
    483 	0x04e9, 499, /* ө Ө */
    484 	0x04eb, 499, /* ӫ Ӫ */
    485 	0x04ef, 499, /* ӯ Ӯ */
    486 	0x04f1, 499, /* ӱ Ӱ */
    487 	0x04f3, 499, /* ӳ Ӳ */
    488 	0x04f5, 499, /* ӵ Ӵ */
    489 	0x04f9, 499, /* ӹ Ӹ */
    490 	0x1e01, 499, /* ḁ Ḁ */
    491 	0x1e03, 499, /* ḃ Ḃ */
    492 	0x1e05, 499, /* ḅ Ḅ */
    493 	0x1e07, 499, /* ḇ Ḇ */
    494 	0x1e09, 499, /* ḉ Ḉ */
    495 	0x1e0b, 499, /* ḋ Ḋ */
    496 	0x1e0d, 499, /* ḍ Ḍ */
    497 	0x1e0f, 499, /* ḏ Ḏ */
    498 	0x1e11, 499, /* ḑ Ḑ */
    499 	0x1e13, 499, /* ḓ Ḓ */
    500 	0x1e15, 499, /* ḕ Ḕ */
    501 	0x1e17, 499, /* ḗ Ḗ */
    502 	0x1e19, 499, /* ḙ Ḙ */
    503 	0x1e1b, 499, /* ḛ Ḛ */
    504 	0x1e1d, 499, /* ḝ Ḝ */
    505 	0x1e1f, 499, /* ḟ Ḟ */
    506 	0x1e21, 499, /* ḡ Ḡ */
    507 	0x1e23, 499, /* ḣ Ḣ */
    508 	0x1e25, 499, /* ḥ Ḥ */
    509 	0x1e27, 499, /* ḧ Ḧ */
    510 	0x1e29, 499, /* ḩ Ḩ */
    511 	0x1e2b, 499, /* ḫ Ḫ */
    512 	0x1e2d, 499, /* ḭ Ḭ */
    513 	0x1e2f, 499, /* ḯ Ḯ */
    514 	0x1e31, 499, /* ḱ Ḱ */
    515 	0x1e33, 499, /* ḳ Ḳ */
    516 	0x1e35, 499, /* ḵ Ḵ */
    517 	0x1e37, 499, /* ḷ Ḷ */
    518 	0x1e39, 499, /* ḹ Ḹ */
    519 	0x1e3b, 499, /* ḻ Ḻ */
    520 	0x1e3d, 499, /* ḽ Ḽ */
    521 	0x1e3f, 499, /* ḿ Ḿ */
    522 	0x1e41, 499, /* ṁ Ṁ */
    523 	0x1e43, 499, /* ṃ Ṃ */
    524 	0x1e45, 499, /* ṅ Ṅ */
    525 	0x1e47, 499, /* ṇ Ṇ */
    526 	0x1e49, 499, /* ṉ Ṉ */
    527 	0x1e4b, 499, /* ṋ Ṋ */
    528 	0x1e4d, 499, /* ṍ Ṍ */
    529 	0x1e4f, 499, /* ṏ Ṏ */
    530 	0x1e51, 499, /* ṑ Ṑ */
    531 	0x1e53, 499, /* ṓ Ṓ */
    532 	0x1e55, 499, /* ṕ Ṕ */
    533 	0x1e57, 499, /* ṗ Ṗ */
    534 	0x1e59, 499, /* ṙ Ṙ */
    535 	0x1e5b, 499, /* ṛ Ṛ */
    536 	0x1e5d, 499, /* ṝ Ṝ */
    537 	0x1e5f, 499, /* ṟ Ṟ */
    538 	0x1e61, 499, /* ṡ Ṡ */
    539 	0x1e63, 499, /* ṣ Ṣ */
    540 	0x1e65, 499, /* ṥ Ṥ */
    541 	0x1e67, 499, /* ṧ Ṧ */
    542 	0x1e69, 499, /* ṩ Ṩ */
    543 	0x1e6b, 499, /* ṫ Ṫ */
    544 	0x1e6d, 499, /* ṭ Ṭ */
    545 	0x1e6f, 499, /* ṯ Ṯ */
    546 	0x1e71, 499, /* ṱ Ṱ */
    547 	0x1e73, 499, /* ṳ Ṳ */
    548 	0x1e75, 499, /* ṵ Ṵ */
    549 	0x1e77, 499, /* ṷ Ṷ */
    550 	0x1e79, 499, /* ṹ Ṹ */
    551 	0x1e7b, 499, /* ṻ Ṻ */
    552 	0x1e7d, 499, /* ṽ Ṽ */
    553 	0x1e7f, 499, /* ṿ Ṿ */
    554 	0x1e81, 499, /* ẁ Ẁ */
    555 	0x1e83, 499, /* ẃ Ẃ */
    556 	0x1e85, 499, /* ẅ Ẅ */
    557 	0x1e87, 499, /* ẇ Ẇ */
    558 	0x1e89, 499, /* ẉ Ẉ */
    559 	0x1e8b, 499, /* ẋ Ẋ */
    560 	0x1e8d, 499, /* ẍ Ẍ */
    561 	0x1e8f, 499, /* ẏ Ẏ */
    562 	0x1e91, 499, /* ẑ Ẑ */
    563 	0x1e93, 499, /* ẓ Ẓ */
    564 	0x1e95, 499, /* ẕ Ẕ */
    565 	0x1ea1, 499, /* ạ Ạ */
    566 	0x1ea3, 499, /* ả Ả */
    567 	0x1ea5, 499, /* ấ Ấ */
    568 	0x1ea7, 499, /* ầ Ầ */
    569 	0x1ea9, 499, /* ẩ Ẩ */
    570 	0x1eab, 499, /* ẫ Ẫ */
    571 	0x1ead, 499, /* ậ Ậ */
    572 	0x1eaf, 499, /* ắ Ắ */
    573 	0x1eb1, 499, /* ằ Ằ */
    574 	0x1eb3, 499, /* ẳ Ẳ */
    575 	0x1eb5, 499, /* ẵ Ẵ */
    576 	0x1eb7, 499, /* ặ Ặ */
    577 	0x1eb9, 499, /* ẹ Ẹ */
    578 	0x1ebb, 499, /* ẻ Ẻ */
    579 	0x1ebd, 499, /* ẽ Ẽ */
    580 	0x1ebf, 499, /* ế Ế */
    581 	0x1ec1, 499, /* ề Ề */
    582 	0x1ec3, 499, /* ể Ể */
    583 	0x1ec5, 499, /* ễ Ễ */
    584 	0x1ec7, 499, /* ệ Ệ */
    585 	0x1ec9, 499, /* ỉ Ỉ */
    586 	0x1ecb, 499, /* ị Ị */
    587 	0x1ecd, 499, /* ọ Ọ */
    588 	0x1ecf, 499, /* ỏ Ỏ */
    589 	0x1ed1, 499, /* ố Ố */
    590 	0x1ed3, 499, /* ồ Ồ */
    591 	0x1ed5, 499, /* ổ Ổ */
    592 	0x1ed7, 499, /* ỗ Ỗ */
    593 	0x1ed9, 499, /* ộ Ộ */
    594 	0x1edb, 499, /* ớ Ớ */
    595 	0x1edd, 499, /* ờ Ờ */
    596 	0x1edf, 499, /* ở Ở */
    597 	0x1ee1, 499, /* ỡ Ỡ */
    598 	0x1ee3, 499, /* ợ Ợ */
    599 	0x1ee5, 499, /* ụ Ụ */
    600 	0x1ee7, 499, /* ủ Ủ */
    601 	0x1ee9, 499, /* ứ Ứ */
    602 	0x1eeb, 499, /* ừ Ừ */
    603 	0x1eed, 499, /* ử Ử */
    604 	0x1eef, 499, /* ữ Ữ */
    605 	0x1ef1, 499, /* ự Ự */
    606 	0x1ef3, 499, /* ỳ Ỳ */
    607 	0x1ef5, 499, /* ỵ Ỵ */
    608 	0x1ef7, 499, /* ỷ Ỷ */
    609 	0x1ef9, 499, /* ỹ Ỹ */
    610 	0x1f51, 508, /* ὑ Ὑ */
    611 	0x1f53, 508, /* ὓ Ὓ */
    612 	0x1f55, 508, /* ὕ Ὕ */
    613 	0x1f57, 508, /* ὗ Ὗ */
    614 	0x1fb3, 509, /* ᾳ ᾼ */
    615 	0x1fc3, 509, /* ῃ ῌ */
    616 	0x1fe5, 507, /* ῥ Ῥ */
    617 	0x1ff3, 509, /* ῳ ῼ */
    618 };
    619 
    620 /*
    621  * upper case ranges
    622  *	3rd col is conversion excess 500
    623  */
    624 static Rune __tolower2[] = {
    625 	0x0041, 0x005a, 532, /* A-Z a-z */
    626 	0x00c0, 0x00d6, 532, /* À-Ö à-ö */
    627 	0x00d8, 0x00de, 532, /* Ø-Þ ø-þ */
    628 	0x0189, 0x018a, 705, /* Ɖ-Ɗ ɖ-ɗ */
    629 	0x018e, 0x018f, 702, /* Ǝ-Ə ɘ-ə */
    630 	0x01b1, 0x01b2, 717, /* Ʊ-Ʋ ʊ-ʋ */
    631 	0x0388, 0x038a, 537, /* Έ-Ί έ-ί */
    632 	0x038e, 0x038f, 563, /* Ύ-Ώ ύ-ώ */
    633 	0x0391, 0x03a1, 532, /* Α-Ρ α-ρ */
    634 	0x03a3, 0x03ab, 532, /* Σ-Ϋ σ-ϋ */
    635 	0x0401, 0x040c, 580, /* Ё-Ќ ё-ќ */
    636 	0x040e, 0x040f, 580, /* Ў-Џ ў-џ */
    637 	0x0410, 0x042f, 532, /* А-Я а-я */
    638 	0x0531, 0x0556, 548, /* Ա-Ֆ ա-ֆ */
    639 	0x10a0, 0x10c5, 548, /* Ⴀ-Ⴥ ა-ჵ */
    640 	0x1f08, 0x1f0f, 492, /* Ἀ-Ἇ ἀ-ἇ */
    641 	0x1f18, 0x1f1d, 492, /* Ἐ-Ἕ ἐ-ἕ */
    642 	0x1f28, 0x1f2f, 492, /* Ἠ-Ἧ ἠ-ἧ */
    643 	0x1f38, 0x1f3f, 492, /* Ἰ-Ἷ ἰ-ἷ */
    644 	0x1f48, 0x1f4d, 492, /* Ὀ-Ὅ ὀ-ὅ */
    645 	0x1f68, 0x1f6f, 492, /* Ὠ-Ὧ ὠ-ὧ */
    646 	0x1f88, 0x1f8f, 492, /* ᾈ-ᾏ ᾀ-ᾇ */
    647 	0x1f98, 0x1f9f, 492, /* ᾘ-ᾟ ᾐ-ᾗ */
    648 	0x1fa8, 0x1faf, 492, /* ᾨ-ᾯ ᾠ-ᾧ */
    649 	0x1fb8, 0x1fb9, 492, /* Ᾰ-Ᾱ ᾰ-ᾱ */
    650 	0x1fba, 0x1fbb, 426, /* Ὰ-Ά ὰ-ά */
    651 	0x1fc8, 0x1fcb, 414, /* Ὲ-Ή ὲ-ή */
    652 	0x1fd8, 0x1fd9, 492, /* Ῐ-Ῑ ῐ-ῑ */
    653 	0x1fda, 0x1fdb, 400, /* Ὶ-Ί ὶ-ί */
    654 	0x1fe8, 0x1fe9, 492, /* Ῠ-Ῡ ῠ-ῡ */
    655 	0x1fea, 0x1feb, 388, /* Ὺ-Ύ ὺ-ύ */
    656 	0x1ff8, 0x1ff9, 372, /* Ὸ-Ό ὸ-ό */
    657 	0x1ffa, 0x1ffb, 374, /* Ὼ-Ώ ὼ-ώ */
    658 	0x2160, 0x216f, 516, /* Ⅰ-Ⅿ ⅰ-ⅿ */
    659 	0x24b6, 0x24cf, 526, /* Ⓐ-Ⓩ ⓐ-ⓩ */
    660 	0xff21, 0xff3a, 532, /* A-Z a-z */
    661 };
    662 
    663 /*
    664  * upper case singlets
    665  *	2nd col is conversion excess 500
    666  */
    667 static Rune __tolower1[] = {
    668 	0x0100, 501, /* Ā ā */
    669 	0x0102, 501, /* Ă ă */
    670 	0x0104, 501, /* Ą ą */
    671 	0x0106, 501, /* Ć ć */
    672 	0x0108, 501, /* Ĉ ĉ */
    673 	0x010a, 501, /* Ċ ċ */
    674 	0x010c, 501, /* Č č */
    675 	0x010e, 501, /* Ď ď */
    676 	0x0110, 501, /* Đ đ */
    677 	0x0112, 501, /* Ē ē */
    678 	0x0114, 501, /* Ĕ ĕ */
    679 	0x0116, 501, /* Ė ė */
    680 	0x0118, 501, /* Ę ę */
    681 	0x011a, 501, /* Ě ě */
    682 	0x011c, 501, /* Ĝ ĝ */
    683 	0x011e, 501, /* Ğ ğ */
    684 	0x0120, 501, /* Ġ ġ */
    685 	0x0122, 501, /* Ģ ģ */
    686 	0x0124, 501, /* Ĥ ĥ */
    687 	0x0126, 501, /* Ħ ħ */
    688 	0x0128, 501, /* Ĩ ĩ */
    689 	0x012a, 501, /* Ī ī */
    690 	0x012c, 501, /* Ĭ ĭ */
    691 	0x012e, 501, /* Į į */
    692 	0x0130, 301, /* İ i */
    693 	0x0132, 501, /* IJ ij */
    694 	0x0134, 501, /* Ĵ ĵ */
    695 	0x0136, 501, /* Ķ ķ */
    696 	0x0139, 501, /* Ĺ ĺ */
    697 	0x013b, 501, /* Ļ ļ */
    698 	0x013d, 501, /* Ľ ľ */
    699 	0x013f, 501, /* Ŀ ŀ */
    700 	0x0141, 501, /* Ł ł */
    701 	0x0143, 501, /* Ń ń */
    702 	0x0145, 501, /* Ņ ņ */
    703 	0x0147, 501, /* Ň ň */
    704 	0x014a, 501, /* Ŋ ŋ */
    705 	0x014c, 501, /* Ō ō */
    706 	0x014e, 501, /* Ŏ ŏ */
    707 	0x0150, 501, /* Ő ő */
    708 	0x0152, 501, /* Œ œ */
    709 	0x0154, 501, /* Ŕ ŕ */
    710 	0x0156, 501, /* Ŗ ŗ */
    711 	0x0158, 501, /* Ř ř */
    712 	0x015a, 501, /* Ś ś */
    713 	0x015c, 501, /* Ŝ ŝ */
    714 	0x015e, 501, /* Ş ş */
    715 	0x0160, 501, /* Š š */
    716 	0x0162, 501, /* Ţ ţ */
    717 	0x0164, 501, /* Ť ť */
    718 	0x0166, 501, /* Ŧ ŧ */
    719 	0x0168, 501, /* Ũ ũ */
    720 	0x016a, 501, /* Ū ū */
    721 	0x016c, 501, /* Ŭ ŭ */
    722 	0x016e, 501, /* Ů ů */
    723 	0x0170, 501, /* Ű ű */
    724 	0x0172, 501, /* Ų ų */
    725 	0x0174, 501, /* Ŵ ŵ */
    726 	0x0176, 501, /* Ŷ ŷ */
    727 	0x0178, 379, /* Ÿ ÿ */
    728 	0x0179, 501, /* Ź ź */
    729 	0x017b, 501, /* Ż ż */
    730 	0x017d, 501, /* Ž ž */
    731 	0x0181, 710, /* Ɓ ɓ */
    732 	0x0182, 501, /* Ƃ ƃ */
    733 	0x0184, 501, /* Ƅ ƅ */
    734 	0x0186, 706, /* Ɔ ɔ */
    735 	0x0187, 501, /* Ƈ ƈ */
    736 	0x018b, 501, /* Ƌ ƌ */
    737 	0x0190, 703, /* Ɛ ɛ */
    738 	0x0191, 501, /* Ƒ ƒ */
    739 	0x0193, 705, /* Ɠ ɠ */
    740 	0x0194, 707, /* Ɣ ɣ */
    741 	0x0196, 711, /* Ɩ ɩ */
    742 	0x0197, 709, /* Ɨ ɨ */
    743 	0x0198, 501, /* Ƙ ƙ */
    744 	0x019c, 711, /* Ɯ ɯ */
    745 	0x019d, 713, /* Ɲ ɲ */
    746 	0x01a0, 501, /* Ơ ơ */
    747 	0x01a2, 501, /* Ƣ ƣ */
    748 	0x01a4, 501, /* Ƥ ƥ */
    749 	0x01a7, 501, /* Ƨ ƨ */
    750 	0x01a9, 718, /* Ʃ ʃ */
    751 	0x01ac, 501, /* Ƭ ƭ */
    752 	0x01ae, 718, /* Ʈ ʈ */
    753 	0x01af, 501, /* Ư ư */
    754 	0x01b3, 501, /* Ƴ ƴ */
    755 	0x01b5, 501, /* Ƶ ƶ */
    756 	0x01b7, 719, /* Ʒ ʒ */
    757 	0x01b8, 501, /* Ƹ ƹ */
    758 	0x01bc, 501, /* Ƽ ƽ */
    759 	0x01c4, 502, /* DŽ dž */
    760 	0x01c5, 501, /* Dž dž */
    761 	0x01c7, 502, /* LJ lj */
    762 	0x01c8, 501, /* Lj lj */
    763 	0x01ca, 502, /* NJ nj */
    764 	0x01cb, 501, /* Nj nj */
    765 	0x01cd, 501, /* Ǎ ǎ */
    766 	0x01cf, 501, /* Ǐ ǐ */
    767 	0x01d1, 501, /* Ǒ ǒ */
    768 	0x01d3, 501, /* Ǔ ǔ */
    769 	0x01d5, 501, /* Ǖ ǖ */
    770 	0x01d7, 501, /* Ǘ ǘ */
    771 	0x01d9, 501, /* Ǚ ǚ */
    772 	0x01db, 501, /* Ǜ ǜ */
    773 	0x01de, 501, /* Ǟ ǟ */
    774 	0x01e0, 501, /* Ǡ ǡ */
    775 	0x01e2, 501, /* Ǣ ǣ */
    776 	0x01e4, 501, /* Ǥ ǥ */
    777 	0x01e6, 501, /* Ǧ ǧ */
    778 	0x01e8, 501, /* Ǩ ǩ */
    779 	0x01ea, 501, /* Ǫ ǫ */
    780 	0x01ec, 501, /* Ǭ ǭ */
    781 	0x01ee, 501, /* Ǯ ǯ */
    782 	0x01f1, 502, /* DZ dz */
    783 	0x01f2, 501, /* Dz dz */
    784 	0x01f4, 501, /* Ǵ ǵ */
    785 	0x01fa, 501, /* Ǻ ǻ */
    786 	0x01fc, 501, /* Ǽ ǽ */
    787 	0x01fe, 501, /* Ǿ ǿ */
    788 	0x0200, 501, /* Ȁ ȁ */
    789 	0x0202, 501, /* Ȃ ȃ */
    790 	0x0204, 501, /* Ȅ ȅ */
    791 	0x0206, 501, /* Ȇ ȇ */
    792 	0x0208, 501, /* Ȉ ȉ */
    793 	0x020a, 501, /* Ȋ ȋ */
    794 	0x020c, 501, /* Ȍ ȍ */
    795 	0x020e, 501, /* Ȏ ȏ */
    796 	0x0210, 501, /* Ȑ ȑ */
    797 	0x0212, 501, /* Ȓ ȓ */
    798 	0x0214, 501, /* Ȕ ȕ */
    799 	0x0216, 501, /* Ȗ ȗ */
    800 	0x0386, 538, /* Ά ά */
    801 	0x038c, 564, /* Ό ό */
    802 	0x03e2, 501, /* Ϣ ϣ */
    803 	0x03e4, 501, /* Ϥ ϥ */
    804 	0x03e6, 501, /* Ϧ ϧ */
    805 	0x03e8, 501, /* Ϩ ϩ */
    806 	0x03ea, 501, /* Ϫ ϫ */
    807 	0x03ec, 501, /* Ϭ ϭ */
    808 	0x03ee, 501, /* Ϯ ϯ */
    809 	0x0460, 501, /* Ѡ ѡ */
    810 	0x0462, 501, /* Ѣ ѣ */
    811 	0x0464, 501, /* Ѥ ѥ */
    812 	0x0466, 501, /* Ѧ ѧ */
    813 	0x0468, 501, /* Ѩ ѩ */
    814 	0x046a, 501, /* Ѫ ѫ */
    815 	0x046c, 501, /* Ѭ ѭ */
    816 	0x046e, 501, /* Ѯ ѯ */
    817 	0x0470, 501, /* Ѱ ѱ */
    818 	0x0472, 501, /* Ѳ ѳ */
    819 	0x0474, 501, /* Ѵ ѵ */
    820 	0x0476, 501, /* Ѷ ѷ */
    821 	0x0478, 501, /* Ѹ ѹ */
    822 	0x047a, 501, /* Ѻ ѻ */
    823 	0x047c, 501, /* Ѽ ѽ */
    824 	0x047e, 501, /* Ѿ ѿ */
    825 	0x0480, 501, /* Ҁ ҁ */
    826 	0x0490, 501, /* Ґ ґ */
    827 	0x0492, 501, /* Ғ ғ */
    828 	0x0494, 501, /* Ҕ ҕ */
    829 	0x0496, 501, /* Җ җ */
    830 	0x0498, 501, /* Ҙ ҙ */
    831 	0x049a, 501, /* Қ қ */
    832 	0x049c, 501, /* Ҝ ҝ */
    833 	0x049e, 501, /* Ҟ ҟ */
    834 	0x04a0, 501, /* Ҡ ҡ */
    835 	0x04a2, 501, /* Ң ң */
    836 	0x04a4, 501, /* Ҥ ҥ */
    837 	0x04a6, 501, /* Ҧ ҧ */
    838 	0x04a8, 501, /* Ҩ ҩ */
    839 	0x04aa, 501, /* Ҫ ҫ */
    840 	0x04ac, 501, /* Ҭ ҭ */
    841 	0x04ae, 501, /* Ү ү */
    842 	0x04b0, 501, /* Ұ ұ */
    843 	0x04b2, 501, /* Ҳ ҳ */
    844 	0x04b4, 501, /* Ҵ ҵ */
    845 	0x04b6, 501, /* Ҷ ҷ */
    846 	0x04b8, 501, /* Ҹ ҹ */
    847 	0x04ba, 501, /* Һ һ */
    848 	0x04bc, 501, /* Ҽ ҽ */
    849 	0x04be, 501, /* Ҿ ҿ */
    850 	0x04c1, 501, /* Ӂ ӂ */
    851 	0x04c3, 501, /* Ӄ ӄ */
    852 	0x04c7, 501, /* Ӈ ӈ */
    853 	0x04cb, 501, /* Ӌ ӌ */
    854 	0x04d0, 501, /* Ӑ ӑ */
    855 	0x04d2, 501, /* Ӓ ӓ */
    856 	0x04d4, 501, /* Ӕ ӕ */
    857 	0x04d6, 501, /* Ӗ ӗ */
    858 	0x04d8, 501, /* Ә ә */
    859 	0x04da, 501, /* Ӛ ӛ */
    860 	0x04dc, 501, /* Ӝ ӝ */
    861 	0x04de, 501, /* Ӟ ӟ */
    862 	0x04e0, 501, /* Ӡ ӡ */
    863 	0x04e2, 501, /* Ӣ ӣ */
    864 	0x04e4, 501, /* Ӥ ӥ */
    865 	0x04e6, 501, /* Ӧ ӧ */
    866 	0x04e8, 501, /* Ө ө */
    867 	0x04ea, 501, /* Ӫ ӫ */
    868 	0x04ee, 501, /* Ӯ ӯ */
    869 	0x04f0, 501, /* Ӱ ӱ */
    870 	0x04f2, 501, /* Ӳ ӳ */
    871 	0x04f4, 501, /* Ӵ ӵ */
    872 	0x04f8, 501, /* Ӹ ӹ */
    873 	0x1e00, 501, /* Ḁ ḁ */
    874 	0x1e02, 501, /* Ḃ ḃ */
    875 	0x1e04, 501, /* Ḅ ḅ */
    876 	0x1e06, 501, /* Ḇ ḇ */
    877 	0x1e08, 501, /* Ḉ ḉ */
    878 	0x1e0a, 501, /* Ḋ ḋ */
    879 	0x1e0c, 501, /* Ḍ ḍ */
    880 	0x1e0e, 501, /* Ḏ ḏ */
    881 	0x1e10, 501, /* Ḑ ḑ */
    882 	0x1e12, 501, /* Ḓ ḓ */
    883 	0x1e14, 501, /* Ḕ ḕ */
    884 	0x1e16, 501, /* Ḗ ḗ */
    885 	0x1e18, 501, /* Ḙ ḙ */
    886 	0x1e1a, 501, /* Ḛ ḛ */
    887 	0x1e1c, 501, /* Ḝ ḝ */
    888 	0x1e1e, 501, /* Ḟ ḟ */
    889 	0x1e20, 501, /* Ḡ ḡ */
    890 	0x1e22, 501, /* Ḣ ḣ */
    891 	0x1e24, 501, /* Ḥ ḥ */
    892 	0x1e26, 501, /* Ḧ ḧ */
    893 	0x1e28, 501, /* Ḩ ḩ */
    894 	0x1e2a, 501, /* Ḫ ḫ */
    895 	0x1e2c, 501, /* Ḭ ḭ */
    896 	0x1e2e, 501, /* Ḯ ḯ */
    897 	0x1e30, 501, /* Ḱ ḱ */
    898 	0x1e32, 501, /* Ḳ ḳ */
    899 	0x1e34, 501, /* Ḵ ḵ */
    900 	0x1e36, 501, /* Ḷ ḷ */
    901 	0x1e38, 501, /* Ḹ ḹ */
    902 	0x1e3a, 501, /* Ḻ ḻ */
    903 	0x1e3c, 501, /* Ḽ ḽ */
    904 	0x1e3e, 501, /* Ḿ ḿ */
    905 	0x1e40, 501, /* Ṁ ṁ */
    906 	0x1e42, 501, /* Ṃ ṃ */
    907 	0x1e44, 501, /* Ṅ ṅ */
    908 	0x1e46, 501, /* Ṇ ṇ */
    909 	0x1e48, 501, /* Ṉ ṉ */
    910 	0x1e4a, 501, /* Ṋ ṋ */
    911 	0x1e4c, 501, /* Ṍ ṍ */
    912 	0x1e4e, 501, /* Ṏ ṏ */
    913 	0x1e50, 501, /* Ṑ ṑ */
    914 	0x1e52, 501, /* Ṓ ṓ */
    915 	0x1e54, 501, /* Ṕ ṕ */
    916 	0x1e56, 501, /* Ṗ ṗ */
    917 	0x1e58, 501, /* Ṙ ṙ */
    918 	0x1e5a, 501, /* Ṛ ṛ */
    919 	0x1e5c, 501, /* Ṝ ṝ */
    920 	0x1e5e, 501, /* Ṟ ṟ */
    921 	0x1e60, 501, /* Ṡ ṡ */
    922 	0x1e62, 501, /* Ṣ ṣ */
    923 	0x1e64, 501, /* Ṥ ṥ */
    924 	0x1e66, 501, /* Ṧ ṧ */
    925 	0x1e68, 501, /* Ṩ ṩ */
    926 	0x1e6a, 501, /* Ṫ ṫ */
    927 	0x1e6c, 501, /* Ṭ ṭ */
    928 	0x1e6e, 501, /* Ṯ ṯ */
    929 	0x1e70, 501, /* Ṱ ṱ */
    930 	0x1e72, 501, /* Ṳ ṳ */
    931 	0x1e74, 501, /* Ṵ ṵ */
    932 	0x1e76, 501, /* Ṷ ṷ */
    933 	0x1e78, 501, /* Ṹ ṹ */
    934 	0x1e7a, 501, /* Ṻ ṻ */
    935 	0x1e7c, 501, /* Ṽ ṽ */
    936 	0x1e7e, 501, /* Ṿ ṿ */
    937 	0x1e80, 501, /* Ẁ ẁ */
    938 	0x1e82, 501, /* Ẃ ẃ */
    939 	0x1e84, 501, /* Ẅ ẅ */
    940 	0x1e86, 501, /* Ẇ ẇ */
    941 	0x1e88, 501, /* Ẉ ẉ */
    942 	0x1e8a, 501, /* Ẋ ẋ */
    943 	0x1e8c, 501, /* Ẍ ẍ */
    944 	0x1e8e, 501, /* Ẏ ẏ */
    945 	0x1e90, 501, /* Ẑ ẑ */
    946 	0x1e92, 501, /* Ẓ ẓ */
    947 	0x1e94, 501, /* Ẕ ẕ */
    948 	0x1ea0, 501, /* Ạ ạ */
    949 	0x1ea2, 501, /* Ả ả */
    950 	0x1ea4, 501, /* Ấ ấ */
    951 	0x1ea6, 501, /* Ầ ầ */
    952 	0x1ea8, 501, /* Ẩ ẩ */
    953 	0x1eaa, 501, /* Ẫ ẫ */
    954 	0x1eac, 501, /* Ậ ậ */
    955 	0x1eae, 501, /* Ắ ắ */
    956 	0x1eb0, 501, /* Ằ ằ */
    957 	0x1eb2, 501, /* Ẳ ẳ */
    958 	0x1eb4, 501, /* Ẵ ẵ */
    959 	0x1eb6, 501, /* Ặ ặ */
    960 	0x1eb8, 501, /* Ẹ ẹ */
    961 	0x1eba, 501, /* Ẻ ẻ */
    962 	0x1ebc, 501, /* Ẽ ẽ */
    963 	0x1ebe, 501, /* Ế ế */
    964 	0x1ec0, 501, /* Ề ề */
    965 	0x1ec2, 501, /* Ể ể */
    966 	0x1ec4, 501, /* Ễ ễ */
    967 	0x1ec6, 501, /* Ệ ệ */
    968 	0x1ec8, 501, /* Ỉ ỉ */
    969 	0x1eca, 501, /* Ị ị */
    970 	0x1ecc, 501, /* Ọ ọ */
    971 	0x1ece, 501, /* Ỏ ỏ */
    972 	0x1ed0, 501, /* Ố ố */
    973 	0x1ed2, 501, /* Ồ ồ */
    974 	0x1ed4, 501, /* Ổ ổ */
    975 	0x1ed6, 501, /* Ỗ ỗ */
    976 	0x1ed8, 501, /* Ộ ộ */
    977 	0x1eda, 501, /* Ớ ớ */
    978 	0x1edc, 501, /* Ờ ờ */
    979 	0x1ede, 501, /* Ở ở */
    980 	0x1ee0, 501, /* Ỡ ỡ */
    981 	0x1ee2, 501, /* Ợ ợ */
    982 	0x1ee4, 501, /* Ụ ụ */
    983 	0x1ee6, 501, /* Ủ ủ */
    984 	0x1ee8, 501, /* Ứ ứ */
    985 	0x1eea, 501, /* Ừ ừ */
    986 	0x1eec, 501, /* Ử ử */
    987 	0x1eee, 501, /* Ữ ữ */
    988 	0x1ef0, 501, /* Ự ự */
    989 	0x1ef2, 501, /* Ỳ ỳ */
    990 	0x1ef4, 501, /* Ỵ ỵ */
    991 	0x1ef6, 501, /* Ỷ ỷ */
    992 	0x1ef8, 501, /* Ỹ ỹ */
    993 	0x1f59, 492, /* Ὑ ὑ */
    994 	0x1f5b, 492, /* Ὓ ὓ */
    995 	0x1f5d, 492, /* Ὕ ὕ */
    996 	0x1f5f, 492, /* Ὗ ὗ */
    997 	0x1fbc, 491, /* ᾼ ᾳ */
    998 	0x1fcc, 491, /* ῌ ῃ */
    999 	0x1fec, 493, /* Ῥ ῥ */
   1000 	0x1ffc, 491, /* ῼ ῳ */
   1001 };
   1002 
   1003 /*
   1004  * title characters are those between
   1005  * upper and lower case. ie DZ Dz dz
   1006  */
   1007 static Rune __totitle1[] = {
   1008 	0x01c4, 501, /* DŽ Dž */
   1009 	0x01c6, 499, /* dž Dž */
   1010 	0x01c7, 501, /* LJ Lj */
   1011 	0x01c9, 499, /* lj Lj */
   1012 	0x01ca, 501, /* NJ Nj */
   1013 	0x01cc, 499, /* nj Nj */
   1014 	0x01f1, 501, /* DZ Dz */
   1015 	0x01f3, 499, /* dz Dz */
   1016 };
   1017 
   1018 static Rune*
   1019 bsearch(Rune c, Rune* t, int n, int ne) {
   1020 	Rune* p;
   1021 	int   m;
   1022 
   1023 	while (n > 1) {
   1024 		m = n / 2;
   1025 		p = t + m * ne;
   1026 		if (c >= p[0]) {
   1027 			t = p;
   1028 			n = n - m;
   1029 		} else
   1030 			n = m;
   1031 	}
   1032 	if (n && c >= t[0])
   1033 		return t;
   1034 	return 0;
   1035 }
   1036 
   1037 Rune tolowerrune(Rune c) {
   1038 	Rune* p;
   1039 
   1040 	p = bsearch(c, __tolower2, nelem(__tolower2) / 3, 3);
   1041 	if (p && c >= p[0] && c <= p[1])
   1042 		return c + p[2] - 500;
   1043 	p = bsearch(c, __tolower1, nelem(__tolower1) / 2, 2);
   1044 	if (p && c == p[0])
   1045 		return c + p[1] - 500;
   1046 	return c;
   1047 }
   1048 
   1049 Rune toupperrune(Rune c) {
   1050 	Rune* p;
   1051 
   1052 	p = bsearch(c, __toupper2, nelem(__toupper2) / 3, 3);
   1053 	if (p && c >= p[0] && c <= p[1])
   1054 		return c + p[2] - 500;
   1055 	p = bsearch(c, __toupper1, nelem(__toupper1) / 2, 2);
   1056 	if (p && c == p[0])
   1057 		return c + p[1] - 500;
   1058 	return c;
   1059 }
   1060 
   1061 Rune totitlerune(Rune c) {
   1062 	Rune* p;
   1063 
   1064 	p = bsearch(c, __totitle1, nelem(__totitle1) / 2, 2);
   1065 	if (p && c == p[0])
   1066 		return c + p[1] - 500;
   1067 	return c;
   1068 }
   1069 
   1070 int islowerrune(Rune c) {
   1071 	Rune* p;
   1072 
   1073 	p = bsearch(c, __toupper2, nelem(__toupper2) / 3, 3);
   1074 	if (p && c >= p[0] && c <= p[1])
   1075 		return 1;
   1076 	p = bsearch(c, __toupper1, nelem(__toupper1) / 2, 2);
   1077 	if (p && c == p[0])
   1078 		return 1;
   1079 	return 0;
   1080 }
   1081 
   1082 int isupperrune(Rune c) {
   1083 	Rune* p;
   1084 
   1085 	p = bsearch(c, __tolower2, nelem(__tolower2) / 3, 3);
   1086 	if (p && c >= p[0] && c <= p[1])
   1087 		return 1;
   1088 	p = bsearch(c, __tolower1, nelem(__tolower1) / 2, 2);
   1089 	if (p && c == p[0])
   1090 		return 1;
   1091 	return 0;
   1092 }
   1093 
   1094 int isalpharune(Rune c) {
   1095 	Rune* p;
   1096 
   1097 	if (isupperrune(c) || islowerrune(c))
   1098 		return 1;
   1099 	p = bsearch(c, __alpha2, nelem(__alpha2) / 2, 2);
   1100 	if (p && c >= p[0] && c <= p[1])
   1101 		return 1;
   1102 	p = bsearch(c, __alpha1, nelem(__alpha1), 1);
   1103 	if (p && c == p[0])
   1104 		return 1;
   1105 	return 0;
   1106 }
   1107 
   1108 int istitlerune(Rune c) {
   1109 	return isupperrune(c) && islowerrune(c);
   1110 }
   1111 
   1112 int isspacerune(Rune c) {
   1113 	Rune* p;
   1114 
   1115 	p = bsearch(c, __space2, nelem(__space2) / 2, 2);
   1116 	if (p && c >= p[0] && c <= p[1])
   1117 		return 1;
   1118 	return 0;
   1119 }