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