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