1 /*
2 The contents of this file are subject to the Mozilla Public License
3 Version 1.0 (the "License"); you may not use this file except in
4 compliance with the License. You may obtain a copy of the License at
5 http://www.mozilla.org/MPL/
6 
7 Software distributed under the License is distributed on an "AS IS"
8 basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
9 License for the specific language governing rights and limitations
10 under the License.
11 
12 The Original Code is expat.
13 
14 The Initial Developer of the Original Code is James Clark.
15 Portions created by James Clark are Copyright (C) 1998
16 James Clark. All Rights Reserved.
17 
18 Contributor(s):
19 $Id: gennmtab.c,v 1.3 2002/10/13 22:03:37 torcs Exp $
20 */
21 
22 #include <string.h>
23 #include <stdio.h>
24 #include <stddef.h>
25 
26 struct range {
27   int start;
28   int end;
29 };
30 
31 struct range nmstrt[] = {
32   { '_' },
33   { ':' },
34   /* BaseChar */
35   { 0x0041, 0x005a },
36   { 0x0061, 0x007a },
37   { 0x00c0, 0x00d6 },
38   { 0x00d8, 0x00f6 },
39   { 0x00f8, 0x00ff },
40   { 0x0100, 0x0131 },
41   { 0x0134, 0x013e },
42   { 0x0141, 0x0148 },
43   { 0x014a, 0x017e },
44   { 0x0180, 0x01c3 },
45   { 0x01cd, 0x01f0 },
46   { 0x01f4, 0x01f5 },
47   { 0x01fa, 0x0217 },
48   { 0x0250, 0x02a8 },
49   { 0x02bb, 0x02c1 },
50   { 0x0386 },
51   { 0x0388, 0x038a },
52   { 0x038c },
53   { 0x038e, 0x03a1 },
54   { 0x03a3, 0x03ce },
55   { 0x03d0, 0x03d6 },
56   { 0x03da },
57   { 0x03dc },
58   { 0x03de },
59   { 0x03e0 },
60   { 0x03e2, 0x03f3 },
61   { 0x0401, 0x040c },
62   { 0x040e, 0x044f },
63   { 0x0451, 0x045c },
64   { 0x045e, 0x0481 },
65   { 0x0490, 0x04c4 },
66   { 0x04c7, 0x04c8 },
67   { 0x04cb, 0x04cc },
68   { 0x04d0, 0x04eb },
69   { 0x04ee, 0x04f5 },
70   { 0x04f8, 0x04f9 },
71   { 0x0531, 0x0556 },
72   { 0x0559 },
73   { 0x0561, 0x0586 },
74   { 0x05d0, 0x05ea },
75   { 0x05f0, 0x05f2 },
76   { 0x0621, 0x063a },
77   { 0x0641, 0x064a },
78   { 0x0671, 0x06b7 },
79   { 0x06ba, 0x06be },
80   { 0x06c0, 0x06ce },
81   { 0x06d0, 0x06d3 },
82   { 0x06d5 },
83   { 0x06e5, 0x06e6 },
84   { 0x0905, 0x0939 },
85   { 0x093d },
86   { 0x0958, 0x0961 },
87   { 0x0985, 0x098c },
88   { 0x098f, 0x0990 },
89   { 0x0993, 0x09a8 },
90   { 0x09aa, 0x09b0 },
91   { 0x09b2 },
92   { 0x09b6, 0x09b9 },
93   { 0x09dc, 0x09dd },
94   { 0x09df, 0x09e1 },
95   { 0x09f0, 0x09f1 },
96   { 0x0a05, 0x0a0a },
97   { 0x0a0f, 0x0a10 },
98   { 0x0a13, 0x0a28 },
99   { 0x0a2a, 0x0a30 },
100   { 0x0a32, 0x0a33 },
101   { 0x0a35, 0x0a36 },
102   { 0x0a38, 0x0a39 },
103   { 0x0a59, 0x0a5c },
104   { 0x0a5e },
105   { 0x0a72, 0x0a74 },
106   { 0x0a85, 0x0a8b },
107   { 0x0a8d },
108   { 0x0a8f, 0x0a91 },
109   { 0x0a93, 0x0aa8 },
110   { 0x0aaa, 0x0ab0 },
111   { 0x0ab2, 0x0ab3 },
112   { 0x0ab5, 0x0ab9 },
113   { 0x0abd },
114   { 0x0ae0 },
115   { 0x0b05, 0x0b0c },
116   { 0x0b0f, 0x0b10 },
117   { 0x0b13, 0x0b28 },
118   { 0x0b2a, 0x0b30 },
119   { 0x0b32, 0x0b33 },
120   { 0x0b36, 0x0b39 },
121   { 0x0b3d },
122   { 0x0b5c, 0x0b5d },
123   { 0x0b5f, 0x0b61 },
124   { 0x0b85, 0x0b8a },
125   { 0x0b8e, 0x0b90 },
126   { 0x0b92, 0x0b95 },
127   { 0x0b99, 0x0b9a },
128   { 0x0b9c },
129   { 0x0b9e, 0x0b9f },
130   { 0x0ba3, 0x0ba4 },
131   { 0x0ba8, 0x0baa },
132   { 0x0bae, 0x0bb5 },
133   { 0x0bb7, 0x0bb9 },
134   { 0x0c05, 0x0c0c },
135   { 0x0c0e, 0x0c10 },
136   { 0x0c12, 0x0c28 },
137   { 0x0c2a, 0x0c33 },
138   { 0x0c35, 0x0c39 },
139   { 0x0c60, 0x0c61 },
140   { 0x0c85, 0x0c8c },
141   { 0x0c8e, 0x0c90 },
142   { 0x0c92, 0x0ca8 },
143   { 0x0caa, 0x0cb3 },
144   { 0x0cb5, 0x0cb9 },
145   { 0x0cde },
146   { 0x0ce0, 0x0ce1 },
147   { 0x0d05, 0x0d0c },
148   { 0x0d0e, 0x0d10 },
149   { 0x0d12, 0x0d28 },
150   { 0x0d2a, 0x0d39 },
151   { 0x0d60, 0x0d61 },
152   { 0x0e01, 0x0e2e },
153   { 0x0e30 },
154   { 0x0e32, 0x0e33 },
155   { 0x0e40, 0x0e45 },
156   { 0x0e81, 0x0e82 },
157   { 0x0e84 },
158   { 0x0e87, 0x0e88 },
159   { 0x0e8a },
160   { 0x0e8d },
161   { 0x0e94, 0x0e97 },
162   { 0x0e99, 0x0e9f },
163   { 0x0ea1, 0x0ea3 },
164   { 0x0ea5 },
165   { 0x0ea7 },
166   { 0x0eaa, 0x0eab },
167   { 0x0ead, 0x0eae },
168   { 0x0eb0 },
169   { 0x0eb2, 0x0eb3 },
170   { 0x0ebd },
171   { 0x0ec0, 0x0ec4 },
172   { 0x0f40, 0x0f47 },
173   { 0x0f49, 0x0f69 },
174   { 0x10a0, 0x10c5 },
175   { 0x10d0, 0x10f6 },
176   { 0x1100 },
177   { 0x1102, 0x1103 },
178   { 0x1105, 0x1107 },
179   { 0x1109 },
180   { 0x110b, 0x110c },
181   { 0x110e, 0x1112 },
182   { 0x113c },
183   { 0x113e },
184   { 0x1140 },
185   { 0x114c },
186   { 0x114e },
187   { 0x1150 },
188   { 0x1154, 0x1155 },
189   { 0x1159 },
190   { 0x115f, 0x1161 },
191   { 0x1163 },
192   { 0x1165 },
193   { 0x1167 },
194   { 0x1169 },
195   { 0x116d, 0x116e },
196   { 0x1172, 0x1173 },
197   { 0x1175 },
198   { 0x119e },
199   { 0x11a8 },
200   { 0x11ab },
201   { 0x11ae, 0x11af },
202   { 0x11b7, 0x11b8 },
203   { 0x11ba },
204   { 0x11bc, 0x11c2 },
205   { 0x11eb },
206   { 0x11f0 },
207   { 0x11f9 },
208   { 0x1e00, 0x1e9b },
209   { 0x1ea0, 0x1ef9 },
210   { 0x1f00, 0x1f15 },
211   { 0x1f18, 0x1f1d },
212   { 0x1f20, 0x1f45 },
213   { 0x1f48, 0x1f4d },
214   { 0x1f50, 0x1f57 },
215   { 0x1f59 },
216   { 0x1f5b },
217   { 0x1f5d },
218   { 0x1f5f, 0x1f7d },
219   { 0x1f80, 0x1fb4 },
220   { 0x1fb6, 0x1fbc },
221   { 0x1fbe },
222   { 0x1fc2, 0x1fc4 },
223   { 0x1fc6, 0x1fcc },
224   { 0x1fd0, 0x1fd3 },
225   { 0x1fd6, 0x1fdb },
226   { 0x1fe0, 0x1fec },
227   { 0x1ff2, 0x1ff4 },
228   { 0x1ff6, 0x1ffc },
229   { 0x2126 },
230   { 0x212a, 0x212b },
231   { 0x212e },
232   { 0x2180, 0x2182 },
233   { 0x3041, 0x3094 },
234   { 0x30a1, 0x30fa },
235   { 0x3105, 0x312c },
236   { 0xac00, 0xd7a3 },
237   /* Ideographic */
238   { 0x4e00, 0x9fa5 },
239   { 0x3007 },
240   { 0x3021, 0x3029 },
241 };
242 
243 /* name chars that are not name start chars */
244 struct range name[] = {
245   { '.' },
246   { '-' },
247   /* CombiningChar */
248   { 0x0300, 0x0345 },
249   { 0x0360, 0x0361 },
250   { 0x0483, 0x0486 },
251   { 0x0591, 0x05a1 },
252   { 0x05a3, 0x05b9 },
253   { 0x05bb, 0x05bd },
254   { 0x05bf },
255   { 0x05c1, 0x05c2 },
256   { 0x05c4 },
257   { 0x064b, 0x0652 },
258   { 0x0670 },
259   { 0x06d6, 0x06dc },
260   { 0x06dd, 0x06df },
261   { 0x06e0, 0x06e4 },
262   { 0x06e7, 0x06e8 },
263   { 0x06ea, 0x06ed },
264   { 0x0901, 0x0903 },
265   { 0x093c },
266   { 0x093e, 0x094c },
267   { 0x094d },
268   { 0x0951, 0x0954 },
269   { 0x0962, 0x0963 },
270   { 0x0981, 0x0983 },
271   { 0x09bc },
272   { 0x09be },
273   { 0x09bf },
274   { 0x09c0, 0x09c4 },
275   { 0x09c7, 0x09c8 },
276   { 0x09cb, 0x09cd },
277   { 0x09d7 },
278   { 0x09e2, 0x09e3 },
279   { 0x0a02 },
280   { 0x0a3c },
281   { 0x0a3e },
282   { 0x0a3f },
283   { 0x0a40, 0x0a42 },
284   { 0x0a47, 0x0a48 },
285   { 0x0a4b, 0x0a4d },
286   { 0x0a70, 0x0a71 },
287   { 0x0a81, 0x0a83 },
288   { 0x0abc },
289   { 0x0abe, 0x0ac5 },
290   { 0x0ac7, 0x0ac9 },
291   { 0x0acb, 0x0acd },
292   { 0x0b01, 0x0b03 },
293   { 0x0b3c },
294   { 0x0b3e, 0x0b43 },
295   { 0x0b47, 0x0b48 },
296   { 0x0b4b, 0x0b4d },
297   { 0x0b56, 0x0b57 },
298   { 0x0b82, 0x0b83 },
299   { 0x0bbe, 0x0bc2 },
300   { 0x0bc6, 0x0bc8 },
301   { 0x0bca, 0x0bcd },
302   { 0x0bd7 },
303   { 0x0c01, 0x0c03 },
304   { 0x0c3e, 0x0c44 },
305   { 0x0c46, 0x0c48 },
306   { 0x0c4a, 0x0c4d },
307   { 0x0c55, 0x0c56 },
308   { 0x0c82, 0x0c83 },
309   { 0x0cbe, 0x0cc4 },
310   { 0x0cc6, 0x0cc8 },
311   { 0x0cca, 0x0ccd },
312   { 0x0cd5, 0x0cd6 },
313   { 0x0d02, 0x0d03 },
314   { 0x0d3e, 0x0d43 },
315   { 0x0d46, 0x0d48 },
316   { 0x0d4a, 0x0d4d },
317   { 0x0d57 },
318   { 0x0e31 },
319   { 0x0e34, 0x0e3a },
320   { 0x0e47, 0x0e4e },
321   { 0x0eb1 },
322   { 0x0eb4, 0x0eb9 },
323   { 0x0ebb, 0x0ebc },
324   { 0x0ec8, 0x0ecd },
325   { 0x0f18, 0x0f19 },
326   { 0x0f35 },
327   { 0x0f37 },
328   { 0x0f39 },
329   { 0x0f3e },
330   { 0x0f3f },
331   { 0x0f71, 0x0f84 },
332   { 0x0f86, 0x0f8b },
333   { 0x0f90, 0x0f95 },
334   { 0x0f97 },
335   { 0x0f99, 0x0fad },
336   { 0x0fb1, 0x0fb7 },
337   { 0x0fb9 },
338   { 0x20d0, 0x20dc },
339   { 0x20e1 },
340   { 0x302a, 0x302f },
341   { 0x3099 },
342   { 0x309a },
343   /* Digit */
344   { 0x0030, 0x0039 },
345   { 0x0660, 0x0669 },
346   { 0x06f0, 0x06f9 },
347   { 0x0966, 0x096f },
348   { 0x09e6, 0x09ef },
349   { 0x0a66, 0x0a6f },
350   { 0x0ae6, 0x0aef },
351   { 0x0b66, 0x0b6f },
352   { 0x0be7, 0x0bef },
353   { 0x0c66, 0x0c6f },
354   { 0x0ce6, 0x0cef },
355   { 0x0d66, 0x0d6f },
356   { 0x0e50, 0x0e59 },
357   { 0x0ed0, 0x0ed9 },
358   { 0x0f20, 0x0f29 },
359   /* Extender */
360   { 0xb7 },
361   { 0x02d0 },
362   { 0x02d1 },
363   { 0x0387 },
364   { 0x0640 },
365   { 0x0e46 },
366   { 0x0ec6 },
367   { 0x3005 },
368   { 0x3031, 0x3035 },
369   { 0x309d, 0x309e },
370   { 0x30fc, 0x30fe },
371 };
372 
setTab(char * tab,struct range * ranges,size_t nRanges)373 void setTab(char *tab, struct range *ranges, size_t nRanges)
374 {
375   size_t i;
376   int j;
377   for (i = 0; i < nRanges; i++) {
378     if (ranges[i].end) {
379       for (j = ranges[i].start; j <= ranges[i].end; j++)
380 	tab[j] = 1;
381     }
382     else
383       tab[ranges[i].start] = 1;
384   }
385 }
386 
printTabs(char * tab)387 void printTabs(char *tab)
388 {
389   int nBitmaps = 2;
390   int i, j, k;
391   unsigned char pageIndex[512];
392 
393   printf(
394 "static const unsigned namingBitmap[] = {\n\
395 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n\
396 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n\
397 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\n\
398 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\n");
399   for (i = 0; i < 512; i++) {
400     int kind = tab[i*256];
401     for (j = 1; j < 256; j++)
402       if (tab[i*256 +j] != kind) {
403 	kind = -1;
404 	break;
405       }
406     if (i >= 256 &&  memcmp(tab + (i - 256)*256, tab + i*256, 256) == 0)
407       pageIndex[i] = pageIndex[i - 256];
408     else if (kind == -1) {
409       pageIndex[i] = nBitmaps++;
410       for (j = 0; j < 8; j++) {
411 	unsigned val = 0;
412 	for (k = 0; k < 32; k++) {
413 	  if (tab[i*256 + j*32 +k])
414 	    val |= (1 << k);
415 	}
416 	printf("0x%08X,", val);
417 	putchar((((j + 1) & 3) == 0) ? '\n' : ' ');
418       }
419     }
420     else
421       pageIndex[i] = kind;
422   }
423   printf("};\n");
424   printf("static const unsigned char nmstrtPages[] = {\n");
425   for (i = 0; i < 512; i++) {
426     if (i == 256)
427       printf("};\nstatic const unsigned char namePages[] = {\n");
428     printf("0x%02X,", pageIndex[i]);
429     putchar((((i + 1) & 7) == 0) ? '\n' : ' ');
430   }
431   printf("};\n");
432 }
433 
main()434 int main()
435 {
436   char tab[2*65536];
437   memset(tab, 0, 65536);
438   setTab(tab, nmstrt, sizeof(nmstrt)/sizeof(nmstrt[0]));
439   memcpy(tab + 65536, tab, 65536);
440   setTab(tab + 65536, name, sizeof(name)/sizeof(name[0]));
441   printTabs(tab);
442   return 0;
443 }
444