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