]> pd.if.org Git - pdclib/blob - functions/locale/UnicodeData.py
eb0f3c33137f249a71b6b2cd70b2fff480b5257e
[pdclib] / functions / locale / UnicodeData.py
1 #!/usr/bin/python\r
2 # -*- coding: ascii -*-\r
3 # Unicode Data Converter\r
4 #\r
5 # This file is part of the Public Domain C Library (PDCLib).\r
6 # Permission is granted to use, modify, and / or redistribute at will.\r
7 """\r
8 Converts the character information provdied by Unicode in the UnicodeData.txt\r
9 file from the Unicode character database into a table for use by PDCLib.\r
10 \r
11 Usage: Download the UnicodeData.txt file to the same directory as this script \r
12 and then run it. Both Python 2 and 3 are supported.\r
13 \r
14 Download the data from\r
15     ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt\r
16 """\r
17 import os\r
18 \r
19 # MUST BE KEPT SYNCHRONIZED WITH _PDCLIB_locale.h\r
20 BIT_ALPHA =   1\r
21 BIT_BLANK =   2\r
22 BIT_CNTRL =   4\r
23 BIT_GRAPH =   8\r
24 BIT_PUNCT =  16\r
25 BIT_SPACE =  32\r
26 BIT_LOWER =  64\r
27 BIT_UPPER = 128\r
28 BIT_DIGIT = 256\r
29 BIT_XDIGT = 512\r
30 \r
31 # Category to bitfield mapping\r
32 categories = {\r
33     'Lu': BIT_ALPHA | BIT_GRAPH | BIT_UPPER,    # Uppercase\r
34     'Ll': BIT_ALPHA | BIT_GRAPH | BIT_LOWER,    # Lowercase\r
35     'Lt': BIT_ALPHA | BIT_GRAPH | BIT_UPPER,    # Title case. Upper?\r
36     'Lm': BIT_ALPHA | BIT_GRAPH,                # Modifier. Case?\r
37     'Lo': BIT_ALPHA | BIT_GRAPH,                # "Other" letter (e.g. Ideograph)\r
38     'Nd': BIT_DIGIT | BIT_GRAPH,                # Decimal digit\r
39     'Nl': BIT_GRAPH,                            # Letter-like numeric character\r
40     'No': BIT_GRAPH,                            # Other numeric\r
41     'Pc': BIT_PUNCT | BIT_GRAPH,                # Connecting punctuation\r
42     'Pd': BIT_PUNCT | BIT_GRAPH,                # Dash punctuation\r
43     'Ps': BIT_PUNCT | BIT_GRAPH,                # Opening punctuation\r
44     'Pe': BIT_PUNCT | BIT_GRAPH,                # Closing punctuation\r
45     'Pi': BIT_PUNCT | BIT_GRAPH,                # Opening quote\r
46     'Pf': BIT_PUNCT | BIT_GRAPH,                # Closing quote\r
47     'Po': BIT_PUNCT | BIT_GRAPH,                # Other punctuation\r
48     'Sm': BIT_GRAPH,                            # Mathematical symbol\r
49     'Sc': BIT_GRAPH,                            # Currency symbol\r
50     'Sk': BIT_GRAPH,                            # Non-letterlike modifier symbol\r
51     'So': BIT_GRAPH,                            # Other symbol\r
52     'Zs': BIT_SPACE,                            # Non-zero-width space character\r
53     'Zl': BIT_SPACE,                            # Line separator\r
54     'Zp': BIT_SPACE,                            # Paragraph separator\r
55     'Cc': BIT_CNTRL,                            # C0/C1 control codes\r
56 }\r
57 \r
58 # Characters with special properties\r
59 special = {\r
60     # Blank characters\r
61     0x0020: BIT_SPACE | BIT_BLANK, # space\r
62     0x0009: BIT_SPACE | BIT_BLANK, # tab\r
63 \r
64     # Digits\r
65     0x0030: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
66     0x0031: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
67     0x0032: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
68     0x0033: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
69     0x0034: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
70     0x0035: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
71     0x0036: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
72     0x0037: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
73     0x0038: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
74     0x0039: BIT_XDIGT | BIT_DIGIT | BIT_GRAPH,\r
75 \r
76     # A-F (hex uppercase)\r
77     0x0041: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER,\r
78     0x0042: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER,\r
79     0x0043: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER,\r
80     0x0044: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER,\r
81     0x0045: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER,\r
82     0x0046: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_UPPER,\r
83 \r
84 \r
85     # a-f (hex lowercase)\r
86     0x0061: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER,\r
87     0x0062: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER,\r
88     0x0063: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER,\r
89     0x0064: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER,\r
90     0x0065: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER,\r
91     0x0066: BIT_XDIGT | BIT_ALPHA | BIT_GRAPH | BIT_LOWER,\r
92 }\r
93 \r
94 in_file  = open('UnicodeData.txt', 'r')\r
95 out_file = open('_PDCLIB_unicodedata.c', 'w')\r
96 try:\r
97     out_file.write("""\r
98 /* Unicode Character Information ** AUTOMATICALLY GENERATED FILE **\r
99  *\r
100  * This file is part of the PDCLib public domain C Library, but is automatically\r
101  * generated from the Unicode character data information file found at\r
102  *   ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt\r
103  * \r
104  * As a result, the licensing that applies to that file also applies to this \r
105  * file. The licensing which applies to the Unicode character data can be found \r
106  * in Exhibit 1 of the Unicode Terms of Use, found at\r
107  *   http://www.unicode.org/copyright.html#Exhibit1\r
108  */\r
109  #ifndef REGTEST\r
110  #include <_PDCLIB_locale.h>\r
111 \r
112 const _PDCLIB_wcinfo_t _PDCLIB_wcinfo[] = {\r
113 //   { value,\tflags,\tlower,\tupper\t}, // name\r
114  """)\r
115     for line in in_file:\r
116         (num_hex, name, category, combining_class, bidi_class, decomposition,\r
117          numeric_type, numeric_digit, numeric_value, mirrored, u1name, iso_com, \r
118          upper_case_hex, lower_case_hex, title_case_hex) = line.split(";")\r
119 \r
120         num       = int(num_hex, 16)\r
121         upper_case = int(upper_case_hex, 16) if len(upper_case_hex) else num\r
122         lower_case = int(lower_case_hex, 16) if len(lower_case_hex) else num\r
123         bits = special.get(num, categories.get(category, 0))\r
124 \r
125         if upper_case == 0 and lower_case == 0 and bits == 0:\r
126             continue\r
127 \r
128         out_file.write("    { 0x%X,\t0x%X,\t0x%X,\t0x%X }, // %s\n" % (\r
129             num, bits, lower_case, upper_case, name))\r
130     out_file.write('};\n\n')\r
131     out_file.write("""\r
132 const size_t _PDCLIB_wcinfo_size = sizeof(_PDCLIB_wcinfo) / sizeof(_PDCLIB_wcinfo[0]);\r
133 #endif\r
134 \r
135 #ifdef TEST\r
136 #include <_PDCLIB_test.h>\r
137 int main( void )\r
138 {\r
139     return TEST_RESULTS;\r
140 }\r
141 #endif\r
142 \r
143 """)\r
144 except:\r
145     in_file.close()\r
146     out_file.close()\r
147     os.remove('_PDCLIB_unicodedata.c')\r
148     raise\r
149 else:\r
150     in_file.close()\r
151     out_file.close()\r