Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
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
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
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
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
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
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
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
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
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