source: trunk/src/xml_chars.py @ 826

Last change on this file since 826 was 826, checked in by cameron, 9 years ago

Use unsigned char consistently for name character bitmaps.

File size: 16.3 KB
Line 
1#    xml_chars.py
2#    Copyright (c) 2008, Robert D. Cameron.
3#    Licensed to the public under the Open Software License 3.0.
4#    Licensed to International Characters, Inc., under the Academic
5#    Free License 3.0.
6
7#    Characters legal in XML names for both XML 1.0 and XML 1.1.
8#    See http://www.w3.org/TR/ and http://www.w3.org/TR/xml11/
9
10import re
11
12BaseChar = ['#x0041-#x005A', '#x0061-#x007A', '#x00C0-#x00D6',
13                '#x00D8-#x00F6', '#x00F8-#x00FF', '#x0100-#x0131', '#x0134-#x013E',
14                '#x0141-#x0148', '#x014A-#x017E', '#x0180-#x01C3', '#x01CD-#x01F0',
15                '#x01F4-#x01F5', '#x01FA-#x0217', '#x0250-#x02A8', '#x02BB-#x02C1',
16                '#x0386', '#x0388-#x038A', '#x038C', '#x038E-#x03A1',
17                '#x03A3-#x03CE', '#x03D0-#x03D6', '#x03DA', '#x03DC',
18                '#x03DE', '#x03E0', '#x03E2-#x03F3', '#x0401-#x040C',
19                '#x040E-#x044F', '#x0451-#x045C', '#x045E-#x0481', '#x0490-#x04C4',
20                '#x04C7-#x04C8', '#x04CB-#x04CC', '#x04D0-#x04EB', '#x04EE-#x04F5',
21                '#x04F8-#x04F9', '#x0531-#x0556', '#x0559', '#x0561-#x0586',
22                '#x05D0-#x05EA', '#x05F0-#x05F2', '#x0621-#x063A', '#x0641-#x064A',
23                '#x0671-#x06B7', '#x06BA-#x06BE', '#x06C0-#x06CE', '#x06D0-#x06D3',
24                '#x06D5', '#x06E5-#x06E6', '#x0905-#x0939', '#x093D',
25                '#x0958-#x0961', '#x0985-#x098C', '#x098F-#x0990', '#x0993-#x09A8',
26                '#x09AA-#x09B0', '#x09B2', '#x09B6-#x09B9', '#x09DC-#x09DD',
27                '#x09DF-#x09E1', '#x09F0-#x09F1', '#x0A05-#x0A0A', '#x0A0F-#x0A10',
28                '#x0A13-#x0A28', '#x0A2A-#x0A30', '#x0A32-#x0A33', '#x0A35-#x0A36',
29                '#x0A38-#x0A39', '#x0A59-#x0A5C', '#x0A5E', '#x0A72-#x0A74',
30                '#x0A85-#x0A8B', '#x0A8D', '#x0A8F-#x0A91', '#x0A93-#x0AA8',
31                '#x0AAA-#x0AB0', '#x0AB2-#x0AB3', '#x0AB5-#x0AB9', '#x0ABD',
32                '#x0AE0', '#x0B05-#x0B0C', '#x0B0F-#x0B10', '#x0B13-#x0B28',
33                '#x0B2A-#x0B30', '#x0B32-#x0B33', '#x0B36-#x0B39', '#x0B3D',
34                '#x0B5C-#x0B5D', '#x0B5F-#x0B61', '#x0B85-#x0B8A', '#x0B8E-#x0B90',
35                '#x0B92-#x0B95', '#x0B99-#x0B9A', '#x0B9C', '#x0B9E-#x0B9F',
36                '#x0BA3-#x0BA4', '#x0BA8-#x0BAA', '#x0BAE-#x0BB5', '#x0BB7-#x0BB9',
37                '#x0C05-#x0C0C', '#x0C0E-#x0C10', '#x0C12-#x0C28', '#x0C2A-#x0C33',
38                '#x0C35-#x0C39', '#x0C60-#x0C61', '#x0C85-#x0C8C', '#x0C8E-#x0C90',
39                '#x0C92-#x0CA8', '#x0CAA-#x0CB3', '#x0CB5-#x0CB9', '#x0CDE',
40                '#x0CE0-#x0CE1', '#x0D05-#x0D0C', '#x0D0E-#x0D10', '#x0D12-#x0D28',
41                '#x0D2A-#x0D39', '#x0D60-#x0D61', '#x0E01-#x0E2E', '#x0E30',
42                '#x0E32-#x0E33', '#x0E40-#x0E45', '#x0E81-#x0E82', '#x0E84',
43                '#x0E87-#x0E88', '#x0E8A', '#x0E8D', '#x0E94-#x0E97',
44                '#x0E99-#x0E9F', '#x0EA1-#x0EA3', '#x0EA5', '#x0EA7',
45                '#x0EAA-#x0EAB', '#x0EAD-#x0EAE', '#x0EB0', '#x0EB2-#x0EB3',
46                '#x0EBD', '#x0EC0-#x0EC4', '#x0F40-#x0F47', '#x0F49-#x0F69',
47                '#x10A0-#x10C5', '#x10D0-#x10F6', '#x1100', '#x1102-#x1103',
48                '#x1105-#x1107', '#x1109', '#x110B-#x110C', '#x110E-#x1112',
49                '#x113C', '#x113E', '#x1140', '#x114C', '#x114E', '#x1150',
50                '#x1154-#x1155', '#x1159', '#x115F-#x1161', '#x1163',
51                '#x1165', '#x1167', '#x1169', '#x116D-#x116E', '#x1172-#x1173',
52                '#x1175', '#x119E', '#x11A8', '#x11AB', '#x11AE-#x11AF',
53                '#x11B7-#x11B8', '#x11BA', '#x11BC-#x11C2', '#x11EB',
54                '#x11F0', '#x11F9', '#x1E00-#x1E9B', '#x1EA0-#x1EF9',
55                '#x1F00-#x1F15', '#x1F18-#x1F1D', '#x1F20-#x1F45', '#x1F48-#x1F4D',
56                '#x1F50-#x1F57', '#x1F59', '#x1F5B', '#x1F5D', '#x1F5F-#x1F7D',
57                '#x1F80-#x1FB4', '#x1FB6-#x1FBC', '#x1FBE', '#x1FC2-#x1FC4',
58                '#x1FC6-#x1FCC', '#x1FD0-#x1FD3', '#x1FD6-#x1FDB', '#x1FE0-#x1FEC',
59                '#x1FF2-#x1FF4', '#x1FF6-#x1FFC', '#x2126', '#x212A-#x212B',
60                '#x212E', '#x2180-#x2182', '#x3041-#x3094', '#x30A1-#x30FA',
61                '#x3105-#x312C', '#xAC00-#xD7A3']
62
63Ideographic = ['#x4E00-#x9FA5', '#x3007', '#x3021-#x3029']
64
65CombiningCh = ['#x0300-#x0345', '#x0360-#x0361', '#x0483-#x0486',
66                '#x0591-#x05A1', '#x05A3-#x05B9', '#x05BB-#x05BD', '#x05BF',
67                '#x05C1-#x05C2', '#x05C4', '#x064B-#x0652', '#x0670',
68                '#x06D6-#x06DC', '#x06DD-#x06DF', '#x06E0-#x06E4', '#x06E7-#x06E8',
69                '#x06EA-#x06ED', '#x0901-#x0903', '#x093C', '#x093E-#x094C',
70                '#x094D', '#x0951-#x0954', '#x0962-#x0963', '#x0981-#x0983',
71                '#x09BC', '#x09BE', '#x09BF', '#x09C0-#x09C4', '#x09C7-#x09C8',
72                '#x09CB-#x09CD', '#x09D7', '#x09E2-#x09E3', '#x0A02',
73                '#x0A3C', '#x0A3E', '#x0A3F', '#x0A40-#x0A42', '#x0A47-#x0A48',
74                '#x0A4B-#x0A4D', '#x0A70-#x0A71', '#x0A81-#x0A83', '#x0ABC',
75                '#x0ABE-#x0AC5', '#x0AC7-#x0AC9', '#x0ACB-#x0ACD', '#x0B01-#x0B03',
76                '#x0B3C', '#x0B3E-#x0B43', '#x0B47-#x0B48', '#x0B4B-#x0B4D',
77                '#x0B56-#x0B57', '#x0B82-#x0B83', '#x0BBE-#x0BC2', '#x0BC6-#x0BC8',
78                '#x0BCA-#x0BCD', '#x0BD7', '#x0C01-#x0C03', '#x0C3E-#x0C44',
79                '#x0C46-#x0C48', '#x0C4A-#x0C4D', '#x0C55-#x0C56', '#x0C82-#x0C83',
80                '#x0CBE-#x0CC4', '#x0CC6-#x0CC8', '#x0CCA-#x0CCD', '#x0CD5-#x0CD6',
81                '#x0D02-#x0D03', '#x0D3E-#x0D43', '#x0D46-#x0D48', '#x0D4A-#x0D4D',
82                '#x0D57', '#x0E31', '#x0E34-#x0E3A', '#x0E47-#x0E4E',
83                '#x0EB1', '#x0EB4-#x0EB9', '#x0EBB-#x0EBC', '#x0EC8-#x0ECD',
84                '#x0F18-#x0F19', '#x0F35', '#x0F37', '#x0F39', '#x0F3E',
85                '#x0F3F', '#x0F71-#x0F84', '#x0F86-#x0F8B', '#x0F90-#x0F95',
86                '#x0F97', '#x0F99-#x0FAD', '#x0FB1-#x0FB7', '#x0FB9',
87                '#x20D0-#x20DC', '#x20E1', '#x302A-#x302F', '#x3099',
88                '#x309A']
89
90Digit = ['#x0030-#x0039', '#x0660-#x0669', '#x06F0-#x06F9',
91                '#x0966-#x096F', '#x09E6-#x09EF', '#x0A66-#x0A6F', '#x0AE6-#x0AEF',
92                '#x0B66-#x0B6F', '#x0BE7-#x0BEF', '#x0C66-#x0C6F', '#x0CE6-#x0CEF',
93                '#x0D66-#x0D6F', '#x0E50-#x0E59', '#x0ED0-#x0ED9', '#x0F20-#x0F29']
94
95Extender = ['#x00B7', '#x02D0', '#x02D1', '#x0387', '#x0640',
96                '#x0E46', '#x0EC6', '#x3005', '#x3031-#x3035', '#x309D-#x309E',
97                '#x30FC-#x30FE']
98
99NameStrt = ['#x003A', '#x005F'] + BaseChar + Ideographic
100NameChar = NameStrt + ['#x002D', '#x002E'] + Digit + Extender + CombiningCh
101
102XML11_NameStrt = ['#x003A', '#x005F', '#x0041-#x005A', '#x0061-#x007A', '#x00C0-#x00D6',
103                        '#x00D8-#x00F6', '#x00F8-#x02FF', '#x0370-#x037D', '#x037F-#x1FFF', '#x200C-#x200D',
104                        '#x2070-#x218F', '#x2C00-#x2FEF', '#x3001-#xD7FF', '#xF900-#xFDCF', '#xFDF0-#xFFFD', '#x10000-#xEFFFF']
105                       
106XML11_NameChar = XML11_NameStrt + ['#x002D', '#x002E', '#x0030-#x0039', '#x00B7', '#x0300-#x036F', '#x203F-#x2040']
107
108range_pattern = re.compile("#x([0-9A-Fa-f]+)-#x([0-9A-Fa-f]+)")
109def range_from_rangespec(s):
110        m = range_pattern.match(s)
111        if m != None:
112                return (int(m.group(1), 16), int(m.group(2), 16))
113        else:   
114                val = int(s[2:], 16)
115                return (val, val)
116       
117def charclass_ranges(CharClass):
118        return [range_from_rangespec(s) for s in CharClass]
119
120def charclass_map(CharClass):
121        map = {}
122        for s in CharClass:
123                r = range_from_rangespec(s)
124                for c in range(r[0], r[1]+1):
125                        map[c] = 1
126        return map
127
128
129def charclass_bitstring(map, lo_limit, hi_limit):
130        bits = ''
131        for x in range(lo_limit, hi_limit+1):
132                if map.has_key(x): bits += '1'
133                else: bits += '0'
134        return bits
135
136
137def bitstring2hexstring(bitstr):
138        h = ""
139        for q in range(0, len(bitstr)/4):
140                l = 4*q
141                if bitstr[l:l+4] == "0000": h += '0'
142                elif bitstr[l:l+4] == "0001": h += '1'
143                elif bitstr[l:l+4] == "0010": h += '2'
144                elif bitstr[l:l+4] == "0011": h += '3'
145                elif bitstr[l:l+4] == "0100": h += '4'
146                elif bitstr[l:l+4] == "0101": h += '5'
147                elif bitstr[l:l+4] == "0110": h += '6'
148                elif bitstr[l:l+4] == "0111": h += '7'
149                elif bitstr[l:l+4] == "1000": h += '8'
150                elif bitstr[l:l+4] == "1001": h += '9'
151                elif bitstr[l:l+4] == "1010": h += 'A'
152                elif bitstr[l:l+4] == "1011": h += 'B'
153                elif bitstr[l:l+4] == "1100": h += 'C'
154                elif bitstr[l:l+4] == "1101": h += 'D'
155                elif bitstr[l:l+4] == "1110": h += 'E'
156                elif bitstr[l:l+4] == "1111": h += 'F'
157        return h
158               
159def make_C_bit_map(name, map, lo_codepoint, hi_codepoint):
160        c_str = "unsigned char " + name + "[] = {\n    "
161        codepoint = lo_codepoint
162        groups_on_line = 0
163        while (codepoint <= hi_codepoint):
164                bits = charclass_bitstring(map, codepoint, codepoint+7)
165                c_str += "0x" + bitstring2hexstring(bits)
166                groups_on_line += 1
167                codepoint += 8
168                if (codepoint <= hi_codepoint):
169                        if (groups_on_line < 8): c_str += ', '
170                        else:
171                                c_str += ',\n    '
172                                groups_on_line = 0
173        c_str += "};\n\n"
174        return c_str
175       
176namechars_header = r"""/* namechars.h - Bitset maps for name characters.
177    Copyright (c) 2008, 2010 Robert D. Cameron.
178    Licensed to the public under the Open Software License 3.0.
179    Licensed to International Characters, Inc., under the Academic
180    Free License 3.0.
181   
182    This is a generated file using xml_chars.py.  Do not edit.
183   
184    The XML10 maps apply to XML 1.0 4th edition and prior.
185    The XML11 maps apply to XML 1.1 and the proposed XML 1.0 5th edition.
186
187*/
188#ifndef NAMECHARS_H
189#define NAMECHARS_H
190"""
191
192namechars_inlines = r"""
193
194static inline bool bit_test(const unsigned char bit_Map[], const int codepoint) {
195        return (bit_Map[codepoint>>3] >> (7 - (codepoint & 7))) & 1;
196}
197
198/*  Is a given codepoint a legal NameStart character in XML 1.0 up to 4th edition? */
199static inline bool is_XML10_NameStrt_codepoint(const int codepoint) {
200        switch (codepoint >> 12) {
201                case 0: return bit_test(NameStrt_XML10_0000_11FF, codepoint);
202                case 1: if (codepoint <= 0x11FF)
203                                return bit_test(NameStrt_XML10_0000_11FF, codepoint);
204                        else if (codepoint < 0x1E00) return false;
205                        else return bit_test(NameStrt_XML10_1E00_1FFF, codepoint & 0x1FF);
206                case 2: if (codepoint > 0x2182) return false;
207                        else return bit_test(NameStrt_XML10_2000_21FF, codepoint & 0x1FF);
208                case 3: if (codepoint > 0x312C) return false;
209                        else return bit_test(NameStrt_XML10_3000_31FF, codepoint & 0x1FF);
210                case 4: return codepoint >= 0x4E00;
211                case 5: case 6: case 7: case 8: return true;
212                case 9: return codepoint <= 0x9FA5;
213                case 0xA: return codepoint >= 0xAC00;
214                case 0xB: case 0xC: return true;
215                case 0xD: return codepoint <= 0xD7A3;
216                default: return false;
217        }
218}
219
220/*  Is a given codepoint a legal Name character in XML 1.0 up to 4th edition? */
221static inline bool is_XML10_NameChar_codepoint(const int codepoint) {
222        switch (codepoint >> 12) {
223                case 0: return bit_test(NameChar_XML10_0000_11FF, codepoint);
224                case 1: if (codepoint <= 0x11FF)
225                                return bit_test(NameChar_XML10_0000_11FF, codepoint);
226                        else if (codepoint < 0x1E00) return false;
227                        else return bit_test(NameStrt_XML10_1E00_1FFF, codepoint & 0x1FF);
228                case 2: if (codepoint > 0x2182) return false;
229                        else return bit_test(NameChar_XML10_2000_21FF, codepoint & 0x1FF);
230                case 3: if (codepoint > 0x312C) return false;
231                        else return bit_test(NameChar_XML10_3000_31FF, codepoint & 0x1FF);
232                case 4: return codepoint >= 0x4E00;
233                case 5: case 6: case 7: case 8: return true;
234                case 9: return codepoint <= 0x9FA5;
235                case 0xA:       return codepoint >= 0xAC00;
236                case 0xB: case 0xC: return true;
237                case 0xD: return codepoint <= 0xD7A3;
238                default: return false;
239        }
240}
241
242/*  Is a given codepoint a legal NameStart character in XML 1.0 5e or XML 1.1? */
243static inline bool is_XML11_NameStrt_codepoint(const int codepoint) {
244        if (likely(codepoint) <= 0x03FF) return bit_test(NameStrt_XML11_0000_03FF, codepoint);
245        else switch (codepoint >> 12) {
246                case 0: case 1: return true;
247                case 2: if (codepoint >= 0x2070)
248                                if (codepoint <= 0x218F) return true;
249                                else return (codepoint >= 0x2C00) & (codepoint <= 0x2FEF);
250                        else return (codepoint >= 0x200C) & (codepoint <= 0x200D);
251                case 3: return codepoint >= 0x3001;
252                case 4: case 5: case 6: case 7: case 8: case 9: case 0xA: case 0xB: case 0xC: return true;
253                case 0xD: return codepoint <= 0xD7FF;
254                case 0xE: return false;
255                case 0xF: if (codepoint <= 0xFDCF) return codepoint >= 0xF900;
256                          else return (codepoint >= 0xFDF0) & (codepoint <= 0xFFFD);
257                default: return codepoint <= 0xEFFFF;
258        }
259}
260
261/*  Is a given codepoint a legal Name character in XML 1.0 5e or XML 1.1? */
262static inline bool is_XML11_NameChar_codepoint(const int codepoint) {
263        if (likely(codepoint) <= 0x03FF) return bit_test(NameChar_XML11_0000_03FF, codepoint);
264        else switch (codepoint >> 12) {
265                case 0: case 1: return true;
266                case 2: if (codepoint >= 0x2070)
267                                if (codepoint <= 0x218F) return true;
268                                else return (codepoint >= 0x2C00) & (codepoint <= 0x2FEF);
269                        else if (codepoint <= 0x200D) return codepoint >= 0x200C;
270                        else return (codepoint == 0x203F) | (codepoint == 0x2040);
271                case 3: return codepoint >= 0x3001;
272                case 4: case 5: case 6: case 7: case 8: case 9: case 0xA: case 0xB: case 0xC: return true;
273                case 0xD: return codepoint <= 0xD7FF;
274                case 0xE: return false;
275                case 0xF: if (codepoint <= 0xFDCF) return codepoint >= 0xF900;
276                          else return (codepoint >= 0xFDF0) & (codepoint <= 0xFFFD);
277                default: return codepoint <= 0xEFFFF;
278        }
279}
280
281/*  Return the number of UTF-8 bytes comprising a legal NameStart character,
282    0 if the byte array does not begin with a valid character. 
283    Use XML 1.0 rules up to 4th edition */
284
285static inline int XML_10_UTF8_NameStrt_bytes (const unsigned char bytes[]) {
286        if (bytes[0] <= 0x7F) {
287                if (bit_test(NameStrt_XML10_0000_11FF, (int) bytes[0])) return 1;
288                else return 0;
289        }
290        else if (bytes[0] <= 0xDF) {
291                int codepoint = ((bytes[0] & 0x3F) << 6) | (bytes[1] & 0x3F);
292                if (bit_test(NameStrt_XML10_0000_11FF, codepoint)) return 2;
293                else return 0;
294        }
295        else if (bytes[0] <= 0xEF) {
296                int codepoint = ((bytes[0] & 0x0F) << 12)| ((bytes[1] & 0x3F) << 6) | (bytes[2] & 0x3F);
297                return is_XML10_NameStrt_codepoint(codepoint) ? 3 : 0;
298        }
299        else return 0;
300}
301
302/*  Return the number of UTF-8 bytes comprising a legal Name character,
303    0 if the byte array does not begin with a valid character. 
304    Use XML 1.0 rules up to 4th edition */
305
306static inline int XML_10_UTF8_NameChar_bytes (const unsigned char bytes[]) {
307        if (bytes[0] <= 0x7F) {
308                if (bit_test(NameChar_XML10_0000_11FF, (int) bytes[0])) return 1;
309                else return 0;
310        }
311        else if (bytes[0] <= 0xDF) {
312                int codepoint = ((bytes[0] & 0x3F) << 6) | (bytes[1] & 0x3F);
313                if (bit_test(NameChar_XML10_0000_11FF, codepoint)) return 2;
314                else return 0;
315        }
316        else if (bytes[0] <= 0xEF) {
317                int codepoint = ((bytes[0] & 0x0F) << 12)| ((bytes[1] & 0x3F) << 6) | (bytes[2] & 0x3F);
318                return is_XML10_NameChar_codepoint(codepoint) ? 3 : 0;
319        }
320        else return 0;
321}
322
323/*  Return the number of UTF-8 bytes comprising a legal NameStart character,
324    0 if the byte array does not begin with a valid character. 
325    Use rules for XML 5th edition/XML 1.1. */
326
327static inline int XML_11_UTF8_NameStrt_bytes (const unsigned char bytes[]) {
328        if (bytes[0] <= 0x7F) {
329                if (bit_test(NameStrt_XML11_0000_03FF, (int) bytes[0])) return 1;
330                else return 0;
331        }
332        else if (bytes[0] <= 0xDF) {
333                int codepoint = ((bytes[0] & 0x3F) << 6) | (bytes[1] & 0x3F);
334                return is_XML11_NameStrt_codepoint(codepoint) ? 2 : 0;
335        }
336        else if (bytes[0] <= 0xEF) {
337                int codepoint = ((bytes[0] & 0x0F) << 12)| ((bytes[1] & 0x3F) << 6) | (bytes[2] & 0x3F);
338                return is_XML11_NameStrt_codepoint(codepoint) ? 3 : 0;
339        }
340        else {
341                int codepoint = ((bytes[0] & 0x0F) << 18)| ((bytes[1] & 0x3F) << 12) |
342                                ((bytes[2] & 0x3F) << 6) | (bytes[3] & 0x3F);
343                return is_XML11_NameStrt_codepoint(codepoint) ? 4 : 0;
344        }
345}
346
347/*  Return the number of UTF-8 bytes comprising a legal Name character,
348    0 if the byte array does not begin with a valid character. 
349    Use XML 1.0 rules up to 4th edition */
350
351static inline int XML_11_UTF8_NameChar_bytes (const unsigned char bytes[]) {
352        if (bytes[0] <= 0x7F) {
353                if (bit_test(NameChar_XML11_0000_03FF, (int) bytes[0])) return 1;
354                else return 0;
355        }
356        else if (bytes[0] <= 0xDF) {
357                int codepoint = ((bytes[0] & 0x3F) << 6) | (bytes[1] & 0x3F);
358                return is_XML11_NameChar_codepoint(codepoint) ? 2 : 0;
359        }
360        else if (bytes[0] <= 0xEF) {
361                int codepoint = ((bytes[0] & 0x0F) << 12)| ((bytes[1] & 0x3F) << 6) | (bytes[2] & 0x3F);
362                return is_XML11_NameChar_codepoint(codepoint) ? 3 : 0;
363        }
364        else {
365                int codepoint = ((bytes[0] & 0x0F) << 18)| ((bytes[1] & 0x3F) << 12) |
366                                ((bytes[2] & 0x3F) << 6) | (bytes[3] & 0x3F);
367                return is_XML11_NameChar_codepoint(codepoint) ? 4 : 0;
368        }
369}
370
371"""
372
373def gen_NS_bitmaps(filename):
374        ncm = charclass_map(NameChar)
375        nsm = charclass_map(NameStrt)
376        f = open(filename, "w")
377        f.write(namechars_header)
378        f.write(make_C_bit_map('NameStrt_XML10_0000_11FF', nsm, 0, 0x11FF))
379        f.write(make_C_bit_map('NameStrt_XML10_1E00_1FFF', nsm, 0x1E00, 0x1FFF))
380        f.write(make_C_bit_map('NameStrt_XML10_2000_21FF', nsm, 0x2000, 0x21FF))
381        f.write(make_C_bit_map('NameStrt_XML10_3000_31FF', nsm, 0x3000, 0x31FF))
382        f.write(make_C_bit_map('NameChar_XML10_0000_11FF', ncm, 0, 0x11FF))
383        f.write(make_C_bit_map('NameChar_XML10_2000_21FF', ncm, 0x2000, 0x21FF))
384        f.write(make_C_bit_map('NameChar_XML10_3000_31FF', ncm, 0x3000, 0x31FF))
385       
386        ncm11 = charclass_map(XML11_NameChar)
387        nsm11 = charclass_map(XML11_NameStrt)
388        f.write(make_C_bit_map('NameStrt_XML11_0000_03FF', nsm11, 0, 0x03FF))
389        f.write(make_C_bit_map('NameChar_XML11_0000_03FF', ncm11, 0, 0x03FF))
390        f.write(namechars_inlines);
391        f.write("#endif\n");
392        f.close()
393
394if __name__ == "__main__":
395        gen_NS_bitmaps("namechars.h")
396
Note: See TracBrowser for help on using the repository browser.