root/trunk/src/unialpha.c

Revision 428, 8.4 kB (checked in by walter, 2 years ago)

remove tabs, any trailing spaces

  • Property svn:eol-style set to native
Line 
1 // Copyright (c) 2003 by Digital Mars
2 // All Rights Reserved
3 // written by Walter Bright
4 // http://www.digitalmars.com
5 // License for redistribution is by either the Artistic License
6 // in artistic.txt, or the GNU General Public License in gnu.txt.
7 // See the included readme.txt for details.
8
9 #include <assert.h>
10
11 /*******************************
12  * Return !=0 if unicode alpha.
13  * Use table from C99 Appendix D.
14  */
15
16 int isUniAlpha(unsigned u)
17 {
18     static unsigned short table[][2] =
19     {
20         { 0x00AA, 0x00AA },
21         { 0x00B5, 0x00B5 },
22         { 0x00B7, 0x00B7 },
23         { 0x00BA, 0x00BA },
24         { 0x00C0, 0x00D6 },
25         { 0x00D8, 0x00F6 },
26         { 0x00F8, 0x01F5 },
27         { 0x01FA, 0x0217 },
28         { 0x0250, 0x02A8 },
29         { 0x02B0, 0x02B8 },
30         { 0x02BB, 0x02BB },
31         { 0x02BD, 0x02C1 },
32         { 0x02D0, 0x02D1 },
33         { 0x02E0, 0x02E4 },
34         { 0x037A, 0x037A },
35         { 0x0386, 0x0386 },
36         { 0x0388, 0x038A },
37         { 0x038C, 0x038C },
38         { 0x038E, 0x03A1 },
39         { 0x03A3, 0x03CE },
40         { 0x03D0, 0x03D6 },
41         { 0x03DA, 0x03DA },
42         { 0x03DC, 0x03DC },
43         { 0x03DE, 0x03DE },
44         { 0x03E0, 0x03E0 },
45         { 0x03E2, 0x03F3 },
46         { 0x0401, 0x040C },
47         { 0x040E, 0x044F },
48         { 0x0451, 0x045C },
49         { 0x045E, 0x0481 },
50         { 0x0490, 0x04C4 },
51         { 0x04C7, 0x04C8 },
52         { 0x04CB, 0x04CC },
53         { 0x04D0, 0x04EB },
54         { 0x04EE, 0x04F5 },
55         { 0x04F8, 0x04F9 },
56         { 0x0531, 0x0556 },
57         { 0x0559, 0x0559 },
58         { 0x0561, 0x0587 },
59         { 0x05B0, 0x05B9 },
60         { 0x05BB, 0x05BD },
61         { 0x05BF, 0x05BF },
62         { 0x05C1, 0x05C2 },
63         { 0x05D0, 0x05EA },
64         { 0x05F0, 0x05F2 },
65         { 0x0621, 0x063A },
66         { 0x0640, 0x0652 },
67         { 0x0660, 0x0669 },
68         { 0x0670, 0x06B7 },
69         { 0x06BA, 0x06BE },
70         { 0x06C0, 0x06CE },
71         { 0x06D0, 0x06DC },
72         { 0x06E5, 0x06E8 },
73         { 0x06EA, 0x06ED },
74         { 0x06F0, 0x06F9 },
75         { 0x0901, 0x0903 },
76         { 0x0905, 0x0939 },
77         { 0x093D, 0x093D },
78         { 0x093E, 0x094D },
79         { 0x0950, 0x0952 },
80         { 0x0958, 0x0963 },
81         { 0x0966, 0x096F },
82         { 0x0981, 0x0983 },
83         { 0x0985, 0x098C },
84         { 0x098F, 0x0990 },
85         { 0x0993, 0x09A8 },
86         { 0x09AA, 0x09B0 },
87         { 0x09B2, 0x09B2 },
88         { 0x09B6, 0x09B9 },
89         { 0x09BE, 0x09C4 },
90         { 0x09C7, 0x09C8 },
91         { 0x09CB, 0x09CD },
92         { 0x09DC, 0x09DD },
93         { 0x09DF, 0x09E3 },
94         { 0x09E6, 0x09EF },
95         { 0x09F0, 0x09F1 },
96         { 0x0A02, 0x0A02 },
97         { 0x0A05, 0x0A0A },
98         { 0x0A0F, 0x0A10 },
99         { 0x0A13, 0x0A28 },
100         { 0x0A2A, 0x0A30 },
101         { 0x0A32, 0x0A33 },
102         { 0x0A35, 0x0A36 },
103         { 0x0A38, 0x0A39 },
104         { 0x0A3E, 0x0A42 },
105         { 0x0A47, 0x0A48 },
106         { 0x0A4B, 0x0A4D },
107         { 0x0A59, 0x0A5C },
108         { 0x0A5E, 0x0A5E },
109         { 0x0A66, 0x0A6F },
110         { 0x0A74, 0x0A74 },
111         { 0x0A81, 0x0A83 },
112         { 0x0A85, 0x0A8B },
113         { 0x0A8D, 0x0A8D },
114         { 0x0A8F, 0x0A91 },
115         { 0x0A93, 0x0AA8 },
116         { 0x0AAA, 0x0AB0 },
117         { 0x0AB2, 0x0AB3 },
118         { 0x0AB5, 0x0AB9 },
119         { 0x0ABD, 0x0AC5 },
120         { 0x0AC7, 0x0AC9 },
121         { 0x0ACB, 0x0ACD },
122         { 0x0AD0, 0x0AD0 },
123         { 0x0AE0, 0x0AE0 },
124         { 0x0AE6, 0x0AEF },
125         { 0x0B01, 0x0B03 },
126         { 0x0B05, 0x0B0C },
127         { 0x0B0F, 0x0B10 },
128         { 0x0B13, 0x0B28 },
129         { 0x0B2A, 0x0B30 },
130         { 0x0B32, 0x0B33 },
131         { 0x0B36, 0x0B39 },
132         { 0x0B3D, 0x0B3D },
133         { 0x0B3E, 0x0B43 },
134         { 0x0B47, 0x0B48 },
135         { 0x0B4B, 0x0B4D },
136         { 0x0B5C, 0x0B5D },
137         { 0x0B5F, 0x0B61 },
138         { 0x0B66, 0x0B6F },
139         { 0x0B82, 0x0B83 },
140         { 0x0B85, 0x0B8A },
141         { 0x0B8E, 0x0B90 },
142         { 0x0B92, 0x0B95 },
143         { 0x0B99, 0x0B9A },
144         { 0x0B9C, 0x0B9C },
145         { 0x0B9E, 0x0B9F },
146         { 0x0BA3, 0x0BA4 },
147         { 0x0BA8, 0x0BAA },
148         { 0x0BAE, 0x0BB5 },
149         { 0x0BB7, 0x0BB9 },
150         { 0x0BBE, 0x0BC2 },
151         { 0x0BC6, 0x0BC8 },
152         { 0x0BCA, 0x0BCD },
153         { 0x0BE7, 0x0BEF },
154         { 0x0C01, 0x0C03 },
155         { 0x0C05, 0x0C0C },
156         { 0x0C0E, 0x0C10 },
157         { 0x0C12, 0x0C28 },
158         { 0x0C2A, 0x0C33 },
159         { 0x0C35, 0x0C39 },
160         { 0x0C3E, 0x0C44 },
161         { 0x0C46, 0x0C48 },
162         { 0x0C4A, 0x0C4D },
163         { 0x0C60, 0x0C61 },
164         { 0x0C66, 0x0C6F },
165         { 0x0C82, 0x0C83 },
166         { 0x0C85, 0x0C8C },
167         { 0x0C8E, 0x0C90 },
168         { 0x0C92, 0x0CA8 },
169         { 0x0CAA, 0x0CB3 },
170         { 0x0CB5, 0x0CB9 },
171         { 0x0CBE, 0x0CC4 },
172         { 0x0CC6, 0x0CC8 },
173         { 0x0CCA, 0x0CCD },
174         { 0x0CDE, 0x0CDE },
175         { 0x0CE0, 0x0CE1 },
176         { 0x0CE6, 0x0CEF },
177         { 0x0D02, 0x0D03 },
178         { 0x0D05, 0x0D0C },
179         { 0x0D0E, 0x0D10 },
180         { 0x0D12, 0x0D28 },
181         { 0x0D2A, 0x0D39 },
182         { 0x0D3E, 0x0D43 },
183         { 0x0D46, 0x0D48 },
184         { 0x0D4A, 0x0D4D },
185         { 0x0D60, 0x0D61 },
186         { 0x0D66, 0x0D6F },
187         { 0x0E01, 0x0E3A },
188         { 0x0E40, 0x0E5B },
189 //      { 0x0E50, 0x0E59 },
190         { 0x0E81, 0x0E82 },
191         { 0x0E84, 0x0E84 },
192         { 0x0E87, 0x0E88 },
193         { 0x0E8A, 0x0E8A },
194         { 0x0E8D, 0x0E8D },
195         { 0x0E94, 0x0E97 },
196         { 0x0E99, 0x0E9F },
197         { 0x0EA1, 0x0EA3 },
198         { 0x0EA5, 0x0EA5 },
199         { 0x0EA7, 0x0EA7 },
200         { 0x0EAA, 0x0EAB },
201         { 0x0EAD, 0x0EAE },
202         { 0x0EB0, 0x0EB9 },
203         { 0x0EBB, 0x0EBD },
204         { 0x0EC0, 0x0EC4 },
205         { 0x0EC6, 0x0EC6 },
206         { 0x0EC8, 0x0ECD },
207         { 0x0ED0, 0x0ED9 },
208         { 0x0EDC, 0x0EDD },
209         { 0x0F00, 0x0F00 },
210         { 0x0F18, 0x0F19 },
211         { 0x0F20, 0x0F33 },
212         { 0x0F35, 0x0F35 },
213         { 0x0F37, 0x0F37 },
214         { 0x0F39, 0x0F39 },
215         { 0x0F3E, 0x0F47 },
216         { 0x0F49, 0x0F69 },
217         { 0x0F71, 0x0F84 },
218         { 0x0F86, 0x0F8B },
219         { 0x0F90, 0x0F95 },
220         { 0x0F97, 0x0F97 },
221         { 0x0F99, 0x0FAD },
222         { 0x0FB1, 0x0FB7 },
223         { 0x0FB9, 0x0FB9 },
224         { 0x10A0, 0x10C5 },
225         { 0x10D0, 0x10F6 },
226         { 0x1E00, 0x1E9B },
227         { 0x1EA0, 0x1EF9 },
228         { 0x1F00, 0x1F15 },
229         { 0x1F18, 0x1F1D },
230         { 0x1F20, 0x1F45 },
231         { 0x1F48, 0x1F4D },
232         { 0x1F50, 0x1F57 },
233         { 0x1F59, 0x1F59 },
234         { 0x1F5B, 0x1F5B },
235         { 0x1F5D, 0x1F5D },
236         { 0x1F5F, 0x1F7D },
237         { 0x1F80, 0x1FB4 },
238         { 0x1FB6, 0x1FBC },
239         { 0x1FBE, 0x1FBE },
240         { 0x1FC2, 0x1FC4 },
241         { 0x1FC6, 0x1FCC },
242         { 0x1FD0, 0x1FD3 },
243         { 0x1FD6, 0x1FDB },
244         { 0x1FE0, 0x1FEC },
245         { 0x1FF2, 0x1FF4 },
246         { 0x1FF6, 0x1FFC },
247         { 0x203F, 0x2040 },
248         { 0x207F, 0x207F },
249         { 0x2102, 0x2102 },
250         { 0x2107, 0x2107 },
251         { 0x210A, 0x2113 },
252         { 0x2115, 0x2115 },
253         { 0x2118, 0x211D },
254         { 0x2124, 0x2124 },
255         { 0x2126, 0x2126 },
256         { 0x2128, 0x2128 },
257         { 0x212A, 0x2131 },
258         { 0x2133, 0x2138 },
259         { 0x2160, 0x2182 },
260         { 0x3005, 0x3007 },
261         { 0x3021, 0x3029 },
262         { 0x3041, 0x3093 },
263         { 0x309B, 0x309C },
264         { 0x30A1, 0x30F6 },
265         { 0x30FB, 0x30FC },
266         { 0x3105, 0x312C },
267         { 0x4E00, 0x9FA5 },
268         { 0xAC00, 0xD7A3 },
269     };
270
271 #ifdef DEBUG
272     for (int i = 0; i < sizeof(table) / sizeof(table[0]); i++)
273     {
274         //printf("%x\n", table[i][0]);
275         assert(table[i][0] <= table[i][1]);
276         if (i < sizeof(table) / sizeof(table[0]) - 1)
277             assert(table[i][1] < table[i + 1][0]);
278     }
279 #endif
280
281     if (u > 0xD7A3)
282         goto Lisnot;
283
284     // Binary search
285     int mid;
286     int low;
287     int high;
288
289     low = 0;
290     high = sizeof(table) / sizeof(table[0]) - 1;
291     while (low <= high)
292     {
293         mid = (low + high) >> 1;
294         if (u < table[mid][0])
295             high = mid - 1;
296         else if (u > table[mid][1])
297             low = mid + 1;
298         else
299             goto Lis;
300     }
301
302 Lisnot:
303 #ifdef DEBUG
304     for (int i = 0; i < sizeof(table) / sizeof(table[0]); i++)
305     {
306         assert(u < table[i][0] || u > table[i][1]);
307     }
308 #endif
309     return 0;
310
311 Lis:
312 #ifdef DEBUG
313     for (int i = 0; i < sizeof(table) / sizeof(table[0]); i++)
314     {
315         if (u >= table[i][0] && u <= table[i][1])
316             return 1;
317     }
318     assert(0);          // should have been in table
319 #endif
320     return 1;
321 }
Note: See TracBrowser for help on using the browser.