comparison lphobos/std/uni.d @ 86:fd32135dca3e trunk

[svn r90] Major updates to the gen directory. Redesigned the 'elem' struct. Much more... !!! Lots of bugfixes. Added support for special foreach on strings. Added std.array, std.utf, std.ctype and std.uni to phobos. Changed all the .c files in the gen dir to .cpp (it *is* C++ after all)
author lindquist
date Sat, 03 Nov 2007 14:44:58 +0100
parents
children
comparison
equal deleted inserted replaced
85:f869c636a113 86:fd32135dca3e
1
2 // Written in the D programming language.
3
4 /*
5 * Placed into the Public Domain.
6 * Digital Mars, www.digitalmars.com
7 * Written by Walter Bright
8 */
9
10 /**
11 * Simple Unicode character classification functions.
12 * For ASCII classification, see $(LINK2 std_ctype.html, std.ctype).
13 * Macros:
14 * WIKI=Phobos/StdUni
15 * References:
16 * $(LINK2 http://www.digitalmars.com/d/ascii-table.html, ASCII Table),
17 * $(LINK2 http://en.wikipedia.org/wiki/Unicode, Wikipedia),
18 * $(LINK2 http://www.unicode.org, The Unicode Consortium)
19 * Trademarks:
20 * Unicode(tm) is a trademark of Unicode, Inc.
21 */
22
23
24 module std.uni;
25
26 /**
27 * Returns !=0 if c is a Unicode lower case character.
28 */
29 int isUniLower(dchar c)
30 {
31 if (c <= 0x7F)
32 return (c >= 'a' && c <= 'z');
33
34 return isUniAlpha(c) && c == toUniLower(c);
35 }
36
37 /**
38 * Returns !=0 if c is a Unicode upper case character.
39 */
40 int isUniUpper(dchar c)
41 {
42 if (c <= 0x7F)
43 return (c >= 'A' && c <= 'Z');
44
45 return isUniAlpha(c) && c == toUniUpper(c);
46 }
47
48 /**
49 * If c is a Unicode upper case character, return the lower case
50 * equivalent, otherwise return c.
51 */
52 dchar toUniLower(dchar c)
53 {
54 if (c >= 'A' && c <= 'Z')
55 {
56 c += 32;
57 }
58 else if (c >= 0x00C0)
59 {
60 if ((c >= 0x00C0 && c <= 0x00D6) || (c >= 0x00D8 && c<=0x00DE))
61 {
62 c += 32;
63 }
64 else if ((c >= 0x0100 && c < 0x0138) || (c > 0x0149 && c < 0x0178))
65 {
66 if (c == 0x0130)
67 c = 0x0069;
68 else if ((c & 1) == 0)
69 c += 1;
70 }
71 else if (c == 0x0178)
72 {
73 c = 0x00FF;
74 }
75 else if ((c >= 0x0139 && c < 0x0149) || (c > 0x0178 && c < 0x017F))
76 {
77 if (c & 1)
78 c += 1;
79 }
80 else if (c >= 0x0200 && c <= 0x0217)
81 {
82 if ((c & 1) == 0)
83 c += 1;
84 }
85 else if ((c >= 0x0401 && c <= 0x040C) || (c>= 0x040E && c <= 0x040F))
86 {
87 c += 80;
88 }
89 else if (c >= 0x0410 && c <= 0x042F)
90 {
91 c += 32;
92 }
93 else if (c >= 0x0460 && c <= 0x047F)
94 {
95 if ((c & 1) == 0)
96 c += 1;
97 }
98 else if (c >= 0x0531 && c <= 0x0556)
99 {
100 c += 48;
101 }
102 else if (c >= 0x10A0 && c <= 0x10C5)
103 {
104 c += 48;
105 }
106 else if (c >= 0xFF21 && c <= 0xFF3A)
107 {
108 c += 32;
109 }
110 }
111 return c;
112 }
113
114 /**
115 * If c is a Unicode lower case character, return the upper case
116 * equivalent, otherwise return c.
117 */
118 dchar toUniUpper(dchar c)
119 {
120 if (c >= 'a' && c <= 'z')
121 {
122 c -= 32;
123 }
124 else if (c >= 0x00E0)
125 {
126 if ((c >= 0x00E0 && c <= 0x00F6) || (c >= 0x00F8 && c <= 0x00FE))
127 {
128 c -= 32;
129 }
130 else if (c == 0x00FF)
131 {
132 c = 0x0178;
133 }
134 else if ((c >= 0x0100 && c < 0x0138) || (c > 0x0149 && c < 0x0178))
135 {
136 if (c == 0x0131)
137 c = 0x0049;
138 else if (c & 1)
139 c -= 1;
140 }
141 else if ((c >= 0x0139 && c < 0x0149) || (c > 0x0178 && c < 0x017F))
142 {
143 if ((c & 1) == 0)
144 c = c-1;
145 }
146 else if (c == 0x017F)
147 {
148 c = 0x0053;
149 }
150 else if (c >= 0x0200 && c <= 0x0217)
151 {
152 if (c & 1)
153 c = c-1;
154 }
155 else if (c >= 0x0430 && c<= 0x044F)
156 {
157 c -= 32;
158 }
159 else if ((c >= 0x0451 && c <= 0x045C) || (c >=0x045E && c<= 0x045F))
160 {
161 c -= 80;
162 }
163 else if (c >= 0x0460 && c <= 0x047F)
164 {
165 if (c & 1)
166 c -= 1;
167 }
168 else if (c >= 0x0561 && c < 0x0587)
169 {
170 c -= 48;
171 }
172 else if (c >= 0xFF41 && c <= 0xFF5A)
173 {
174 c -= 32;
175 }
176 }
177 return c;
178 }
179
180
181 /*******************************
182 * Return !=0 if u is a Unicode alpha character.
183 * (general Unicode category: Lu, Ll, Lt, Lm and Lo)
184 *
185 * Standards: Unicode 5.0.0
186 */
187
188 int isUniAlpha(dchar u)
189 {
190 static dchar table[][2] =
191 [
192 [ 'A', 'Z' ],
193 [ 'a', 'z' ],
194 [ 0x00AA, 0x00AA ],
195 [ 0x00B5, 0x00B5 ],
196 [ 0x00BA, 0x00BA ],
197 [ 0x00C0, 0x00D6 ],
198 [ 0x00D8, 0x00F6 ],
199 [ 0x00F8, 0x02C1 ],
200 [ 0x02C6, 0x02D1 ],
201 [ 0x02E0, 0x02E4 ],
202 [ 0x02EE, 0x02EE ],
203 [ 0x037A, 0x037D ],
204 [ 0x0386, 0x0386 ],
205 [ 0x0388, 0x038A ],
206 [ 0x038C, 0x038C ],
207 [ 0x038E, 0x03A1 ],
208 [ 0x03A3, 0x03CE ],
209 [ 0x03D0, 0x03F5 ],
210 [ 0x03F7, 0x0481 ],
211 [ 0x048A, 0x0513 ],
212 [ 0x0531, 0x0556 ],
213 [ 0x0559, 0x0559 ],
214 [ 0x0561, 0x0587 ],
215 [ 0x05D0, 0x05EA ],
216 [ 0x05F0, 0x05F2 ],
217 [ 0x0621, 0x063A ],
218 [ 0x0640, 0x064A ],
219 [ 0x066E, 0x066F ],
220 [ 0x0671, 0x06D3 ],
221 [ 0x06D5, 0x06D5 ],
222 [ 0x06E5, 0x06E6 ],
223 [ 0x06EE, 0x06EF ],
224 [ 0x06FA, 0x06FC ],
225 [ 0x06FF, 0x06FF ],
226 [ 0x0710, 0x0710 ],
227 [ 0x0712, 0x072F ],
228 [ 0x074D, 0x076D ],
229 [ 0x0780, 0x07A5 ],
230 [ 0x07B1, 0x07B1 ],
231 [ 0x07CA, 0x07EA ],
232 [ 0x07F4, 0x07F5 ],
233 [ 0x07FA, 0x07FA ],
234 [ 0x0904, 0x0939 ],
235 [ 0x093D, 0x093D ],
236 [ 0x0950, 0x0950 ],
237 [ 0x0958, 0x0961 ],
238 [ 0x097B, 0x097F ],
239 [ 0x0985, 0x098C ],
240 [ 0x098F, 0x0990 ],
241 [ 0x0993, 0x09A8 ],
242 [ 0x09AA, 0x09B0 ],
243 [ 0x09B2, 0x09B2 ],
244 [ 0x09B6, 0x09B9 ],
245 [ 0x09BD, 0x09BD ],
246 [ 0x09CE, 0x09CE ],
247 [ 0x09DC, 0x09DD ],
248 [ 0x09DF, 0x09E1 ],
249 [ 0x09F0, 0x09F1 ],
250 [ 0x0A05, 0x0A0A ],
251 [ 0x0A0F, 0x0A10 ],
252 [ 0x0A13, 0x0A28 ],
253 [ 0x0A2A, 0x0A30 ],
254 [ 0x0A32, 0x0A33 ],
255 [ 0x0A35, 0x0A36 ],
256 [ 0x0A38, 0x0A39 ],
257 [ 0x0A59, 0x0A5C ],
258 [ 0x0A5E, 0x0A5E ],
259 [ 0x0A72, 0x0A74 ],
260 [ 0x0A85, 0x0A8D ],
261 [ 0x0A8F, 0x0A91 ],
262 [ 0x0A93, 0x0AA8 ],
263 [ 0x0AAA, 0x0AB0 ],
264 [ 0x0AB2, 0x0AB3 ],
265 [ 0x0AB5, 0x0AB9 ],
266 [ 0x0ABD, 0x0ABD ],
267 [ 0x0AD0, 0x0AD0 ],
268 [ 0x0AE0, 0x0AE1 ],
269 [ 0x0B05, 0x0B0C ],
270 [ 0x0B0F, 0x0B10 ],
271 [ 0x0B13, 0x0B28 ],
272 [ 0x0B2A, 0x0B30 ],
273 [ 0x0B32, 0x0B33 ],
274 [ 0x0B35, 0x0B39 ],
275 [ 0x0B3D, 0x0B3D ],
276 [ 0x0B5C, 0x0B5D ],
277 [ 0x0B5F, 0x0B61 ],
278 [ 0x0B71, 0x0B71 ],
279 [ 0x0B83, 0x0B83 ],
280 [ 0x0B85, 0x0B8A ],
281 [ 0x0B8E, 0x0B90 ],
282 [ 0x0B92, 0x0B95 ],
283 [ 0x0B99, 0x0B9A ],
284 [ 0x0B9C, 0x0B9C ],
285 [ 0x0B9E, 0x0B9F ],
286 [ 0x0BA3, 0x0BA4 ],
287 [ 0x0BA8, 0x0BAA ],
288 [ 0x0BAE, 0x0BB9 ],
289 [ 0x0C05, 0x0C0C ],
290 [ 0x0C0E, 0x0C10 ],
291 [ 0x0C12, 0x0C28 ],
292 [ 0x0C2A, 0x0C33 ],
293 [ 0x0C35, 0x0C39 ],
294 [ 0x0C60, 0x0C61 ],
295 [ 0x0C85, 0x0C8C ],
296 [ 0x0C8E, 0x0C90 ],
297 [ 0x0C92, 0x0CA8 ],
298 [ 0x0CAA, 0x0CB3 ],
299 [ 0x0CB5, 0x0CB9 ],
300 [ 0x0CBD, 0x0CBD ],
301 [ 0x0CDE, 0x0CDE ],
302 [ 0x0CE0, 0x0CE1 ],
303 [ 0x0D05, 0x0D0C ],
304 [ 0x0D0E, 0x0D10 ],
305 [ 0x0D12, 0x0D28 ],
306 [ 0x0D2A, 0x0D39 ],
307 [ 0x0D60, 0x0D61 ],
308 [ 0x0D85, 0x0D96 ],
309 [ 0x0D9A, 0x0DB1 ],
310 [ 0x0DB3, 0x0DBB ],
311 [ 0x0DBD, 0x0DBD ],
312 [ 0x0DC0, 0x0DC6 ],
313 [ 0x0E01, 0x0E30 ],
314 [ 0x0E32, 0x0E33 ],
315 [ 0x0E40, 0x0E46 ],
316 [ 0x0E81, 0x0E82 ],
317 [ 0x0E84, 0x0E84 ],
318 [ 0x0E87, 0x0E88 ],
319 [ 0x0E8A, 0x0E8A ],
320 [ 0x0E8D, 0x0E8D ],
321 [ 0x0E94, 0x0E97 ],
322 [ 0x0E99, 0x0E9F ],
323 [ 0x0EA1, 0x0EA3 ],
324 [ 0x0EA5, 0x0EA5 ],
325 [ 0x0EA7, 0x0EA7 ],
326 [ 0x0EAA, 0x0EAB ],
327 [ 0x0EAD, 0x0EB0 ],
328 [ 0x0EB2, 0x0EB3 ],
329 [ 0x0EBD, 0x0EBD ],
330 [ 0x0EC0, 0x0EC4 ],
331 [ 0x0EC6, 0x0EC6 ],
332 [ 0x0EDC, 0x0EDD ],
333 [ 0x0F00, 0x0F00 ],
334 [ 0x0F40, 0x0F47 ],
335 [ 0x0F49, 0x0F6A ],
336 [ 0x0F88, 0x0F8B ],
337 [ 0x1000, 0x1021 ],
338 [ 0x1023, 0x1027 ],
339 [ 0x1029, 0x102A ],
340 [ 0x1050, 0x1055 ],
341 [ 0x10A0, 0x10C5 ],
342 [ 0x10D0, 0x10FA ],
343 [ 0x10FC, 0x10FC ],
344 [ 0x1100, 0x1159 ],
345 [ 0x115F, 0x11A2 ],
346 [ 0x11A8, 0x11F9 ],
347 [ 0x1200, 0x1248 ],
348 [ 0x124A, 0x124D ],
349 [ 0x1250, 0x1256 ],
350 [ 0x1258, 0x1258 ],
351 [ 0x125A, 0x125D ],
352 [ 0x1260, 0x1288 ],
353 [ 0x128A, 0x128D ],
354 [ 0x1290, 0x12B0 ],
355 [ 0x12B2, 0x12B5 ],
356 [ 0x12B8, 0x12BE ],
357 [ 0x12C0, 0x12C0 ],
358 [ 0x12C2, 0x12C5 ],
359 [ 0x12C8, 0x12D6 ],
360 [ 0x12D8, 0x1310 ],
361 [ 0x1312, 0x1315 ],
362 [ 0x1318, 0x135A ],
363 [ 0x1380, 0x138F ],
364 [ 0x13A0, 0x13F4 ],
365 [ 0x1401, 0x166C ],
366 [ 0x166F, 0x1676 ],
367 [ 0x1681, 0x169A ],
368 [ 0x16A0, 0x16EA ],
369 [ 0x1700, 0x170C ],
370 [ 0x170E, 0x1711 ],
371 [ 0x1720, 0x1731 ],
372 [ 0x1740, 0x1751 ],
373 [ 0x1760, 0x176C ],
374 [ 0x176E, 0x1770 ],
375 [ 0x1780, 0x17B3 ],
376 [ 0x17D7, 0x17D7 ],
377 [ 0x17DC, 0x17DC ],
378 [ 0x1820, 0x1877 ],
379 [ 0x1880, 0x18A8 ],
380 [ 0x1900, 0x191C ],
381 [ 0x1950, 0x196D ],
382 [ 0x1970, 0x1974 ],
383 [ 0x1980, 0x19A9 ],
384 [ 0x19C1, 0x19C7 ],
385 [ 0x1A00, 0x1A16 ],
386 [ 0x1B05, 0x1B33 ],
387 [ 0x1B45, 0x1B4B ],
388 [ 0x1D00, 0x1DBF ],
389 [ 0x1E00, 0x1E9B ],
390 [ 0x1EA0, 0x1EF9 ],
391 [ 0x1F00, 0x1F15 ],
392 [ 0x1F18, 0x1F1D ],
393 [ 0x1F20, 0x1F45 ],
394 [ 0x1F48, 0x1F4D ],
395 [ 0x1F50, 0x1F57 ],
396 [ 0x1F59, 0x1F59 ],
397 [ 0x1F5B, 0x1F5B ],
398 [ 0x1F5D, 0x1F5D ],
399 [ 0x1F5F, 0x1F7D ],
400 [ 0x1F80, 0x1FB4 ],
401 [ 0x1FB6, 0x1FBC ],
402 [ 0x1FBE, 0x1FBE ],
403 [ 0x1FC2, 0x1FC4 ],
404 [ 0x1FC6, 0x1FCC ],
405 [ 0x1FD0, 0x1FD3 ],
406 [ 0x1FD6, 0x1FDB ],
407 [ 0x1FE0, 0x1FEC ],
408 [ 0x1FF2, 0x1FF4 ],
409 [ 0x1FF6, 0x1FFC ],
410 [ 0x2071, 0x2071 ],
411 [ 0x207F, 0x207F ],
412 [ 0x2090, 0x2094 ],
413 [ 0x2102, 0x2102 ],
414 [ 0x2107, 0x2107 ],
415 [ 0x210A, 0x2113 ],
416 [ 0x2115, 0x2115 ],
417 [ 0x2119, 0x211D ],
418 [ 0x2124, 0x2124 ],
419 [ 0x2126, 0x2126 ],
420 [ 0x2128, 0x2128 ],
421 [ 0x212A, 0x212D ],
422 [ 0x212F, 0x2139 ],
423 [ 0x213C, 0x213F ],
424 [ 0x2145, 0x2149 ],
425 [ 0x214E, 0x214E ],
426 [ 0x2183, 0x2184 ],
427 [ 0x2C00, 0x2C2E ],
428 [ 0x2C30, 0x2C5E ],
429 [ 0x2C60, 0x2C6C ],
430 [ 0x2C74, 0x2C77 ],
431 [ 0x2C80, 0x2CE4 ],
432 [ 0x2D00, 0x2D25 ],
433 [ 0x2D30, 0x2D65 ],
434 [ 0x2D6F, 0x2D6F ],
435 [ 0x2D80, 0x2D96 ],
436 [ 0x2DA0, 0x2DA6 ],
437 [ 0x2DA8, 0x2DAE ],
438 [ 0x2DB0, 0x2DB6 ],
439 [ 0x2DB8, 0x2DBE ],
440 [ 0x2DC0, 0x2DC6 ],
441 [ 0x2DC8, 0x2DCE ],
442 [ 0x2DD0, 0x2DD6 ],
443 [ 0x2DD8, 0x2DDE ],
444 [ 0x3005, 0x3006 ],
445 [ 0x3031, 0x3035 ],
446 [ 0x303B, 0x303C ],
447 [ 0x3041, 0x3096 ],
448 [ 0x309D, 0x309F ],
449 [ 0x30A1, 0x30FA ],
450 [ 0x30FC, 0x30FF ],
451 [ 0x3105, 0x312C ],
452 [ 0x3131, 0x318E ],
453 [ 0x31A0, 0x31B7 ],
454 [ 0x31F0, 0x31FF ],
455 [ 0x3400, 0x4DB5 ],
456 [ 0x4E00, 0x9FBB ],
457 [ 0xA000, 0xA48C ],
458 [ 0xA717, 0xA71A ],
459 [ 0xA800, 0xA801 ],
460 [ 0xA803, 0xA805 ],
461 [ 0xA807, 0xA80A ],
462 [ 0xA80C, 0xA822 ],
463 [ 0xA840, 0xA873 ],
464 [ 0xAC00, 0xD7A3 ],
465 [ 0xF900, 0xFA2D ],
466 [ 0xFA30, 0xFA6A ],
467 [ 0xFA70, 0xFAD9 ],
468 [ 0xFB00, 0xFB06 ],
469 [ 0xFB13, 0xFB17 ],
470 [ 0xFB1D, 0xFB1D ],
471 [ 0xFB1F, 0xFB28 ],
472 [ 0xFB2A, 0xFB36 ],
473 [ 0xFB38, 0xFB3C ],
474 [ 0xFB3E, 0xFB3E ],
475 [ 0xFB40, 0xFB41 ],
476 [ 0xFB43, 0xFB44 ],
477 [ 0xFB46, 0xFBB1 ],
478 [ 0xFBD3, 0xFD3D ],
479 [ 0xFD50, 0xFD8F ],
480 [ 0xFD92, 0xFDC7 ],
481 [ 0xFDF0, 0xFDFB ],
482 [ 0xFE70, 0xFE74 ],
483 [ 0xFE76, 0xFEFC ],
484 [ 0xFF21, 0xFF3A ],
485 [ 0xFF41, 0xFF5A ],
486 [ 0xFF66, 0xFFBE ],
487 [ 0xFFC2, 0xFFC7 ],
488 [ 0xFFCA, 0xFFCF ],
489 [ 0xFFD2, 0xFFD7 ],
490 [ 0xFFDA, 0xFFDC ],
491 [ 0x10000, 0x1000B ],
492 [ 0x1000D, 0x10026 ],
493 [ 0x10028, 0x1003A ],
494 [ 0x1003C, 0x1003D ],
495 [ 0x1003F, 0x1004D ],
496 [ 0x10050, 0x1005D ],
497 [ 0x10080, 0x100FA ],
498 [ 0x10300, 0x1031E ],
499 [ 0x10330, 0x10340 ],
500 [ 0x10342, 0x10349 ],
501 [ 0x10380, 0x1039D ],
502 [ 0x103A0, 0x103C3 ],
503 [ 0x103C8, 0x103CF ],
504 [ 0x10400, 0x1049D ],
505 [ 0x10800, 0x10805 ],
506 [ 0x10808, 0x10808 ],
507 [ 0x1080A, 0x10835 ],
508 [ 0x10837, 0x10838 ],
509 [ 0x1083C, 0x1083C ],
510 [ 0x1083F, 0x1083F ],
511 [ 0x10900, 0x10915 ],
512 [ 0x10A00, 0x10A00 ],
513 [ 0x10A10, 0x10A13 ],
514 [ 0x10A15, 0x10A17 ],
515 [ 0x10A19, 0x10A33 ],
516 [ 0x12000, 0x1236E ],
517 [ 0x1D400, 0x1D454 ],
518 [ 0x1D456, 0x1D49C ],
519 [ 0x1D49E, 0x1D49F ],
520 [ 0x1D4A2, 0x1D4A2 ],
521 [ 0x1D4A5, 0x1D4A6 ],
522 [ 0x1D4A9, 0x1D4AC ],
523 [ 0x1D4AE, 0x1D4B9 ],
524 [ 0x1D4BB, 0x1D4BB ],
525 [ 0x1D4BD, 0x1D4C3 ],
526 [ 0x1D4C5, 0x1D505 ],
527 [ 0x1D507, 0x1D50A ],
528 [ 0x1D50D, 0x1D514 ],
529 [ 0x1D516, 0x1D51C ],
530 [ 0x1D51E, 0x1D539 ],
531 [ 0x1D53B, 0x1D53E ],
532 [ 0x1D540, 0x1D544 ],
533 [ 0x1D546, 0x1D546 ],
534 [ 0x1D54A, 0x1D550 ],
535 [ 0x1D552, 0x1D6A5 ],
536 [ 0x1D6A8, 0x1D6C0 ],
537 [ 0x1D6C2, 0x1D6DA ],
538 [ 0x1D6DC, 0x1D6FA ],
539 [ 0x1D6FC, 0x1D714 ],
540 [ 0x1D716, 0x1D734 ],
541 [ 0x1D736, 0x1D74E ],
542 [ 0x1D750, 0x1D76E ],
543 [ 0x1D770, 0x1D788 ],
544 [ 0x1D78A, 0x1D7A8 ],
545 [ 0x1D7AA, 0x1D7C2 ],
546 [ 0x1D7C4, 0x1D7CB ],
547 [ 0x20000, 0x2A6D6 ],
548 [ 0x2F800, 0x2FA1D ],
549 ];
550
551 debug
552 {
553 for (int i = 0; i < table.length; i++)
554 {
555 assert(table[i][0] <= table[i][1]);
556 if (i < table.length - 1)
557 {
558 if (table[i][1] >= table[i + 1][0])
559 printf("table[%d][1] = x%x, table[%d][0] = x%x\n", i, table[i][1], i + 1, table[i + 1][0]);
560 assert(table[i][1] < table[i + 1][0]);
561 }
562 }
563 }
564
565 if (u < 0xAA)
566 {
567 if (u < 'A')
568 goto Lisnot;
569 if (u <= 'Z')
570 goto Lis;
571 if (u < 'a')
572 goto Lisnot;
573 if (u <= 'z')
574 goto Lis;
575 goto Lisnot;
576 }
577
578 // Binary search
579 uint mid;
580 uint low;
581 uint high;
582
583 low = 0;
584 high = table.length - 1;
585 while (cast(int)low <= cast(int)high)
586 {
587 mid = (low + high) >> 1;
588 if (u < table[mid][0])
589 high = mid - 1;
590 else if (u > table[mid][1])
591 low = mid + 1;
592 else
593 goto Lis;
594 }
595
596 Lisnot:
597 debug
598 {
599 for (int i = 0; i < table.length; i++)
600 {
601 assert(u < table[i][0] || u > table[i][1]);
602 }
603 }
604 return 0;
605
606 Lis:
607 debug
608 {
609 for (int i = 0; i < table.length; i++)
610 {
611 if (u >= table[i][0] && u <= table[i][1])
612 return 1;
613 }
614 assert(0); // should have been in table
615 }
616 return 1;
617 }
618
619 unittest
620 {
621 for (uint i = 0; i < 0x80; i++)
622 {
623 if (i >= 'A' && i <= 'Z')
624 assert(isUniAlpha(i));
625 else if (i >= 'a' && i <= 'z')
626 assert(isUniAlpha(i));
627 else
628 assert(!isUniAlpha(i));
629 }
630 }