1 /* ====================================================================
2  * Copyright (c) 2004-2013 Open Source Applications Foundation.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included
12  * in all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20  * DEALINGS IN THE SOFTWARE.
21  * ====================================================================
22  */
23 
24 #include <stdlib.h>
25 #include <string.h>
26 
27 #include "common.h"
28 #include "structmember.h"
29 
30 #include "bases.h"
31 #include "script.h"
32 #include "macros.h"
33 
34 DECLARE_CONSTANTS_TYPE(UScriptCode);
35 #if U_ICU_VERSION_HEX >= VERSION_HEX(51, 0, 0)
36 DECLARE_CONSTANTS_TYPE(UScriptUsage);
37 #endif
38 
39 /* Script */
40 
41 class t_script : public _wrapper {
42 public:
43     UNone *object;
44     UScriptCode code;
45 };
46 
47 static int t_script_init(t_script *self, PyObject *args, PyObject *kwds);
48 static PyObject *t_script_getName(t_script *self);
49 static PyObject *t_script_getShortName(t_script *self);
50 static PyObject *t_script_getScriptCode(t_script *self);
51 static PyObject *t_script_getCode(PyTypeObject *type, PyObject *arg);
52 static PyObject *t_script_getScript(PyTypeObject *type, PyObject *arg);
53 #if U_ICU_VERSION_HEX >= VERSION_HEX(49, 0, 0)
54 static PyObject *t_script_hasScript(PyTypeObject *type, PyObject *args);
55 static PyObject *t_script_getScriptExtensions(PyTypeObject *type, PyObject *arg);
56 #endif
57 #if U_ICU_VERSION_HEX >= VERSION_HEX(51, 0, 0)
58 static PyObject *t_script_isRightToLeft(t_script *self);
59 static PyObject *t_script_isCased(t_script *self);
60 static PyObject *t_script_breaksBetweenLetters(t_script *self);
61 static PyObject *t_script_getSampleString(t_script *self);
62 static PyObject *t_script_getUsage(t_script *self);
63 #endif
64 
65 static PyMethodDef t_script_methods[] = {
66     DECLARE_METHOD(t_script, getName, METH_NOARGS),
67     DECLARE_METHOD(t_script, getShortName, METH_NOARGS),
68     DECLARE_METHOD(t_script, getScriptCode, METH_NOARGS),
69     DECLARE_METHOD(t_script, getCode, METH_O | METH_CLASS),
70     DECLARE_METHOD(t_script, getScript, METH_O | METH_CLASS),
71 #if U_ICU_VERSION_HEX >= VERSION_HEX(49, 0, 0)
72     DECLARE_METHOD(t_script, hasScript, METH_VARARGS | METH_CLASS),
73     DECLARE_METHOD(t_script, getScriptExtensions, METH_O | METH_CLASS),
74 #endif
75 #if U_ICU_VERSION_HEX >= VERSION_HEX(51, 0, 0)
76     DECLARE_METHOD(t_script, isRightToLeft, METH_NOARGS),
77     DECLARE_METHOD(t_script, isCased, METH_NOARGS),
78     DECLARE_METHOD(t_script, breaksBetweenLetters, METH_NOARGS),
79     DECLARE_METHOD(t_script, getSampleString, METH_NOARGS),
80     DECLARE_METHOD(t_script, getUsage, METH_NOARGS),
81 #endif
82     { NULL, NULL, 0, NULL }
83 };
84 
t_script_dealloc(t_script * self)85 static void t_script_dealloc(t_script *self)
86 {
87     Py_TYPE(self)->tp_free((PyObject *) self);
88 }
89 
90 DECLARE_STRUCT(Script, t_script, UNone, t_script_init, t_script_dealloc);
91 
92 
93 /* Script */
94 
t_script_init(t_script * self,PyObject * args,PyObject * kwds)95 static int t_script_init(t_script *self, PyObject *args, PyObject *kwds)
96 {
97     UScriptCode code;
98 
99     switch (PyTuple_Size(args)) {
100       case 1:
101         if (!parseArgs(args, "i", &code))
102         {
103             if (uscript_getName(code) == NULL)
104             {
105                 PyErr_Format(PyExc_ValueError, "Invalid script code: %d",
106                              code);
107                 return -1;
108             }
109             self->object = NULL;  /* there is no ICU struct for this */
110             self->code = code;
111             self->flags = T_OWNED;
112 
113             return 0;
114         }
115         PyErr_SetArgsError((PyObject *) self, "__init__", args);
116         return -1;
117       default:
118         PyErr_SetArgsError((PyObject *) self, "__init__", args);
119         return -1;
120     }
121 }
122 
t_script_getName(t_script * self)123 static PyObject *t_script_getName(t_script *self)
124 {
125     return PyString_FromString(uscript_getName(self->code));
126 }
127 
t_script_getShortName(t_script * self)128 static PyObject *t_script_getShortName(t_script *self)
129 {
130     return PyString_FromString(uscript_getShortName(self->code));
131 }
132 
t_script_getScriptCode(t_script * self)133 static PyObject *t_script_getScriptCode(t_script *self)
134 {
135     return PyInt_FromLong(self->code);
136 }
137 
t_script_getCode(PyTypeObject * type,PyObject * arg)138 static PyObject *t_script_getCode(PyTypeObject *type, PyObject *arg)
139 {
140     charsArg name;
141 
142     if (!parseArg(arg, "n", &name))
143     {
144         UScriptCode codes[256];
145         int count;
146 
147         STATUS_CALL(count = uscript_getCode(
148             name, codes, sizeof(codes) / sizeof(UScriptCode), &status));
149 
150         PyObject *tuple = PyTuple_New(count);
151 
152         for (int i = 0; i < count; ++i)
153             PyTuple_SET_ITEM(tuple, i, PyInt_FromLong(codes[i]));
154 
155         return tuple;
156     }
157 
158     return PyErr_SetArgsError((PyObject *) type, "getCode", arg);
159 }
160 
t_script_getScript(PyTypeObject * type,PyObject * arg)161 static PyObject *t_script_getScript(PyTypeObject *type, PyObject *arg)
162 {
163     UnicodeString *u, _u;
164     int cp;
165 
166     if (!parseArg(arg, "S", &u, &_u))
167     {
168         UScriptCode code;
169 
170         if (u->countChar32() != 1)
171         {
172             PyObject *tuple = Py_BuildValue(
173                 "(sO)", "string must contain only one codepoint", arg);
174 
175             PyErr_SetObject(PyExc_ValueError, tuple);
176             Py_DECREF(tuple);
177 
178             return NULL;
179         }
180 
181         STATUS_CALL(code = uscript_getScript(u->char32At(0), &status));
182 
183         return PyObject_CallFunction((PyObject *) type, (char *) "i", code);
184     }
185     if (!parseArg(arg, "i", &cp))
186     {
187         UScriptCode code;
188 
189         STATUS_CALL(code = uscript_getScript((UChar32) cp, &status));
190 
191         return PyObject_CallFunction((PyObject *) type, (char *) "i", code);
192     }
193 
194     return PyErr_SetArgsError((PyObject *) type, "getScript", arg);
195 }
196 
197 #if U_ICU_VERSION_HEX >= VERSION_HEX(49, 0, 0)
t_script_hasScript(PyTypeObject * type,PyObject * args)198 static PyObject *t_script_hasScript(PyTypeObject *type, PyObject *args)
199 {
200     UnicodeString *u, _u;
201     UScriptCode code;
202     int cp;
203 
204     switch (PyTuple_Size(args)) {
205       case 2:
206         if (!parseArgs(args, "Si", &u, &_u, &code))
207         {
208             if (u->countChar32() != 1)
209             {
210                 PyObject *tuple = Py_BuildValue(
211                     "(sO)", "string must contain only one codepoint",
212                     PyTuple_GET_ITEM(args, 0));
213 
214                 PyErr_SetObject(PyExc_ValueError, tuple);
215                 Py_DECREF(tuple);
216 
217                 return NULL;
218             }
219 
220             if (uscript_hasScript(u->char32At(0), code))
221                 Py_RETURN_TRUE;
222 
223             Py_RETURN_FALSE;
224         }
225         if (!parseArgs(args, "ii", &cp, &code))
226         {
227             if (uscript_hasScript((UChar32) cp, code))
228                 Py_RETURN_TRUE;
229 
230             Py_RETURN_FALSE;
231         }
232         break;
233     }
234 
235     return PyErr_SetArgsError((PyObject *) type, "hasScript", args);
236 }
237 
t_script_getScriptExtensions(PyTypeObject * type,PyObject * arg)238 static PyObject *t_script_getScriptExtensions(PyTypeObject *type, PyObject *arg)
239 {
240     UnicodeString *u, _u;
241     int cp;
242 
243     if (!parseArg(arg, "S", &u, &_u))
244     {
245         if (u->countChar32() != 1)
246         {
247             PyObject *tuple = Py_BuildValue(
248                 "(sO)", "string must contain only one codepoint", arg);
249 
250             PyErr_SetObject(PyExc_ValueError, tuple);
251             Py_DECREF(tuple);
252 
253             return NULL;
254         }
255 
256         UScriptCode codes[256];
257         int count;
258 
259         STATUS_CALL(count = uscript_getScriptExtensions(
260             u->char32At(0), codes, sizeof(codes) / sizeof(UScriptCode),
261             &status));
262 
263         PyObject *tuple = PyTuple_New(count);
264 
265         for (int i = 0; i < count; ++i)
266             PyTuple_SET_ITEM(tuple, i, PyInt_FromLong(codes[i]));
267 
268         return tuple;
269     }
270     if (!parseArg(arg, "i", &cp))
271     {
272         UScriptCode codes[256];
273         int count;
274 
275         STATUS_CALL(count = uscript_getScriptExtensions(
276             (UChar32) cp, codes, sizeof(codes) / sizeof(UScriptCode),
277             &status));
278 
279         PyObject *tuple = PyTuple_New(count);
280 
281         for (int i = 0; i < count; ++i)
282             PyTuple_SET_ITEM(tuple, i, PyInt_FromLong(codes[i]));
283 
284         return tuple;
285     }
286 
287     return PyErr_SetArgsError((PyObject *) type, "getScriptExtensions", arg);
288 }
289 #endif
290 
291 #if U_ICU_VERSION_HEX >= VERSION_HEX(51, 0, 0)
t_script_isRightToLeft(t_script * self)292 static PyObject *t_script_isRightToLeft(t_script *self)
293 {
294     if (uscript_isRightToLeft(self->code))
295         Py_RETURN_TRUE;
296 
297     Py_RETURN_FALSE;
298 }
299 
t_script_isCased(t_script * self)300 static PyObject *t_script_isCased(t_script *self)
301 {
302     if (uscript_isCased(self->code))
303         Py_RETURN_TRUE;
304 
305     Py_RETURN_FALSE;
306 }
307 
t_script_breaksBetweenLetters(t_script * self)308 static PyObject *t_script_breaksBetweenLetters(t_script *self)
309 {
310     if (uscript_breaksBetweenLetters(self->code))
311         Py_RETURN_TRUE;
312 
313     Py_RETURN_FALSE;
314 }
315 
t_script_getSampleString(t_script * self)316 static PyObject *t_script_getSampleString(t_script *self)
317 {
318     UChar dest[32];
319     int32_t count;
320 
321     STATUS_CALL(count = uscript_getSampleString(self->code, dest, sizeof(dest),
322                                                 &status));
323 
324     return PyUnicode_FromUnicodeString(dest, count);
325 }
326 
t_script_getUsage(t_script * self)327 static PyObject *t_script_getUsage(t_script *self)
328 {
329     return PyInt_FromLong(uscript_getUsage(self->code));
330 }
331 #endif
332 
333 
t_script__getCode(t_script * self,void * data)334 static PyObject *t_script__getCode(t_script *self, void *data)
335 {
336     return PyInt_FromLong(self->code);
337 }
338 
339 static PyGetSetDef t_script_properties[] = {
340     { (char *) "code", (getter) t_script__getCode, NULL, (char *) "", NULL },
341     { NULL, NULL, NULL, NULL, NULL }
342 };
343 
344 
_init_script(PyObject * m)345 void _init_script(PyObject *m)
346 {
347     ScriptType_.tp_getset = t_script_properties;
348 
349     INSTALL_CONSTANTS_TYPE(UScriptCode, m);
350 #if U_ICU_VERSION_HEX >= VERSION_HEX(51, 0, 0)
351     INSTALL_CONSTANTS_TYPE(UScriptUsage, m);
352 #endif
353     INSTALL_STRUCT(Script, m);
354 
355     INSTALL_ENUM(UScriptCode, "COMMON", USCRIPT_COMMON);
356     INSTALL_ENUM(UScriptCode, "INHERITED", USCRIPT_INHERITED);
357     INSTALL_ENUM(UScriptCode, "ARABIC", USCRIPT_ARABIC);
358     INSTALL_ENUM(UScriptCode, "ARMENIAN", USCRIPT_ARMENIAN);
359     INSTALL_ENUM(UScriptCode, "BENGALI", USCRIPT_BENGALI);
360     INSTALL_ENUM(UScriptCode, "BOPOMOFO", USCRIPT_BOPOMOFO);
361     INSTALL_ENUM(UScriptCode, "CHEROKEE", USCRIPT_CHEROKEE);
362     INSTALL_ENUM(UScriptCode, "COPTIC", USCRIPT_COPTIC);
363     INSTALL_ENUM(UScriptCode, "CYRILLIC", USCRIPT_CYRILLIC);
364     INSTALL_ENUM(UScriptCode, "DESERET", USCRIPT_DESERET);
365     INSTALL_ENUM(UScriptCode, "DEVANAGARI", USCRIPT_DEVANAGARI);
366     INSTALL_ENUM(UScriptCode, "ETHIOPIC", USCRIPT_ETHIOPIC);
367     INSTALL_ENUM(UScriptCode, "GEORGIAN", USCRIPT_GEORGIAN);
368     INSTALL_ENUM(UScriptCode, "GOTHIC", USCRIPT_GOTHIC);
369     INSTALL_ENUM(UScriptCode, "GREEK", USCRIPT_GREEK);
370     INSTALL_ENUM(UScriptCode, "GUJARATI", USCRIPT_GUJARATI);
371     INSTALL_ENUM(UScriptCode, "GURMUKHI", USCRIPT_GURMUKHI);
372     INSTALL_ENUM(UScriptCode, "HAN", USCRIPT_HAN);
373     INSTALL_ENUM(UScriptCode, "HANGUL", USCRIPT_HANGUL);
374     INSTALL_ENUM(UScriptCode, "HEBREW", USCRIPT_HEBREW);
375     INSTALL_ENUM(UScriptCode, "HIRAGANA", USCRIPT_HIRAGANA);
376     INSTALL_ENUM(UScriptCode, "KANNADA", USCRIPT_KANNADA);
377     INSTALL_ENUM(UScriptCode, "KATAKANA", USCRIPT_KATAKANA);
378     INSTALL_ENUM(UScriptCode, "KHMER", USCRIPT_KHMER);
379     INSTALL_ENUM(UScriptCode, "LAO", USCRIPT_LAO);
380     INSTALL_ENUM(UScriptCode, "LATIN", USCRIPT_LATIN);
381     INSTALL_ENUM(UScriptCode, "MALAYALAM", USCRIPT_MALAYALAM);
382     INSTALL_ENUM(UScriptCode, "MONGOLIAN", USCRIPT_MONGOLIAN);
383     INSTALL_ENUM(UScriptCode, "MYANMAR", USCRIPT_MYANMAR);
384     INSTALL_ENUM(UScriptCode, "OGHAM", USCRIPT_OGHAM);
385     INSTALL_ENUM(UScriptCode, "OLD_ITALIC", USCRIPT_OLD_ITALIC);
386     INSTALL_ENUM(UScriptCode, "ORIYA", USCRIPT_ORIYA);
387     INSTALL_ENUM(UScriptCode, "RUNIC", USCRIPT_RUNIC);
388     INSTALL_ENUM(UScriptCode, "SINHALA", USCRIPT_SINHALA);
389     INSTALL_ENUM(UScriptCode, "SYRIAC", USCRIPT_SYRIAC);
390     INSTALL_ENUM(UScriptCode, "TAMIL", USCRIPT_TAMIL);
391     INSTALL_ENUM(UScriptCode, "TELUGU", USCRIPT_TELUGU);
392     INSTALL_ENUM(UScriptCode, "THAANA", USCRIPT_THAANA);
393     INSTALL_ENUM(UScriptCode, "THAI", USCRIPT_THAI);
394     INSTALL_ENUM(UScriptCode, "TIBETAN", USCRIPT_TIBETAN);
395     INSTALL_ENUM(UScriptCode, "CANADIAN_ABORIGINAL", USCRIPT_CANADIAN_ABORIGINAL);
396     INSTALL_ENUM(UScriptCode, "UCAS", USCRIPT_UCAS);
397     INSTALL_ENUM(UScriptCode, "YI", USCRIPT_YI);
398     INSTALL_ENUM(UScriptCode, "TAGALOG", USCRIPT_TAGALOG);
399     INSTALL_ENUM(UScriptCode, "HANUNOO", USCRIPT_HANUNOO);
400     INSTALL_ENUM(UScriptCode, "BUHID", USCRIPT_BUHID);
401     INSTALL_ENUM(UScriptCode, "TAGBANWA", USCRIPT_TAGBANWA);
402     INSTALL_ENUM(UScriptCode, "BRAILLE", USCRIPT_BRAILLE);
403     INSTALL_ENUM(UScriptCode, "CYPRIOT", USCRIPT_CYPRIOT);
404     INSTALL_ENUM(UScriptCode, "LIMBU", USCRIPT_LIMBU);
405     INSTALL_ENUM(UScriptCode, "LINEAR_B", USCRIPT_LINEAR_B);
406     INSTALL_ENUM(UScriptCode, "OSMANYA", USCRIPT_OSMANYA);
407     INSTALL_ENUM(UScriptCode, "SHAVIAN", USCRIPT_SHAVIAN);
408     INSTALL_ENUM(UScriptCode, "TAI_LE", USCRIPT_TAI_LE);
409     INSTALL_ENUM(UScriptCode, "UGARITIC", USCRIPT_UGARITIC);
410     INSTALL_ENUM(UScriptCode, "KATAKANA_OR_HIRAGANA", USCRIPT_KATAKANA_OR_HIRAGANA);
411     INSTALL_ENUM(UScriptCode, "BUGINESE", USCRIPT_BUGINESE);
412     INSTALL_ENUM(UScriptCode, "GLAGOLITIC", USCRIPT_GLAGOLITIC);
413     INSTALL_ENUM(UScriptCode, "KHAROSHTHI", USCRIPT_KHAROSHTHI);
414     INSTALL_ENUM(UScriptCode, "SYLOTI_NAGRI", USCRIPT_SYLOTI_NAGRI);
415     INSTALL_ENUM(UScriptCode, "NEW_TAI_LUE", USCRIPT_NEW_TAI_LUE);
416     INSTALL_ENUM(UScriptCode, "TIFINAGH", USCRIPT_TIFINAGH);
417     INSTALL_ENUM(UScriptCode, "OLD_PERSIAN", USCRIPT_OLD_PERSIAN);
418     INSTALL_ENUM(UScriptCode, "BALINESE", USCRIPT_BALINESE);
419     INSTALL_ENUM(UScriptCode, "BATAK", USCRIPT_BATAK);
420     INSTALL_ENUM(UScriptCode, "BLISSYMBOLS", USCRIPT_BLISSYMBOLS);
421     INSTALL_ENUM(UScriptCode, "BRAHMI", USCRIPT_BRAHMI);
422     INSTALL_ENUM(UScriptCode, "CHAM", USCRIPT_CHAM);
423     INSTALL_ENUM(UScriptCode, "CIRTH", USCRIPT_CIRTH);
424     INSTALL_ENUM(UScriptCode, "OLD_CHURCH_SLAVONIC_CYRILLIC", USCRIPT_OLD_CHURCH_SLAVONIC_CYRILLIC);
425     INSTALL_ENUM(UScriptCode, "DEMOTIC_EGYPTIAN", USCRIPT_DEMOTIC_EGYPTIAN);
426     INSTALL_ENUM(UScriptCode, "HIERATIC_EGYPTIAN", USCRIPT_HIERATIC_EGYPTIAN);
427     INSTALL_ENUM(UScriptCode, "EGYPTIAN_HIEROGLYPHS", USCRIPT_EGYPTIAN_HIEROGLYPHS);
428     INSTALL_ENUM(UScriptCode, "KHUTSURI", USCRIPT_KHUTSURI);
429     INSTALL_ENUM(UScriptCode, "SIMPLIFIED_HAN", USCRIPT_SIMPLIFIED_HAN);
430     INSTALL_ENUM(UScriptCode, "TRADITIONAL_HAN", USCRIPT_TRADITIONAL_HAN);
431     INSTALL_ENUM(UScriptCode, "PAHAWH_HMONG", USCRIPT_PAHAWH_HMONG);
432     INSTALL_ENUM(UScriptCode, "OLD_HUNGARIAN", USCRIPT_OLD_HUNGARIAN);
433     INSTALL_ENUM(UScriptCode, "HARAPPAN_INDUS", USCRIPT_HARAPPAN_INDUS);
434     INSTALL_ENUM(UScriptCode, "JAVANESE", USCRIPT_JAVANESE);
435     INSTALL_ENUM(UScriptCode, "KAYAH_LI", USCRIPT_KAYAH_LI);
436     INSTALL_ENUM(UScriptCode, "LATIN_FRAKTUR", USCRIPT_LATIN_FRAKTUR);
437     INSTALL_ENUM(UScriptCode, "LATIN_GAELIC", USCRIPT_LATIN_GAELIC);
438     INSTALL_ENUM(UScriptCode, "LEPCHA", USCRIPT_LEPCHA);
439     INSTALL_ENUM(UScriptCode, "LINEAR_A", USCRIPT_LINEAR_A);
440     INSTALL_ENUM(UScriptCode, "MANDAEAN", USCRIPT_MANDAEAN);
441     INSTALL_ENUM(UScriptCode, "MEROITIC", USCRIPT_MEROITIC);
442     INSTALL_ENUM(UScriptCode, "ORKHON", USCRIPT_ORKHON);
443     INSTALL_ENUM(UScriptCode, "OLD_PERMIC", USCRIPT_OLD_PERMIC);
444     INSTALL_ENUM(UScriptCode, "PHAGS_PA", USCRIPT_PHAGS_PA);
445     INSTALL_ENUM(UScriptCode, "PHOENICIAN", USCRIPT_PHOENICIAN);
446     INSTALL_ENUM(UScriptCode, "PHONETIC_POLLARD", USCRIPT_PHONETIC_POLLARD);
447     INSTALL_ENUM(UScriptCode, "RONGORONGO", USCRIPT_RONGORONGO);
448     INSTALL_ENUM(UScriptCode, "SARATI", USCRIPT_SARATI);
449     INSTALL_ENUM(UScriptCode, "ESTRANGELO_SYRIAC", USCRIPT_ESTRANGELO_SYRIAC);
450     INSTALL_ENUM(UScriptCode, "WESTERN_SYRIAC", USCRIPT_WESTERN_SYRIAC);
451     INSTALL_ENUM(UScriptCode, "EASTERN_SYRIAC", USCRIPT_EASTERN_SYRIAC);
452     INSTALL_ENUM(UScriptCode, "TENGWAR", USCRIPT_TENGWAR);
453     INSTALL_ENUM(UScriptCode, "VAI", USCRIPT_VAI);
454     INSTALL_ENUM(UScriptCode, "VISIBLE_SPEECH", USCRIPT_VISIBLE_SPEECH);
455     INSTALL_ENUM(UScriptCode, "CUNEIFORM", USCRIPT_CUNEIFORM);
456     INSTALL_ENUM(UScriptCode, "UNWRITTEN_LANGUAGES", USCRIPT_UNWRITTEN_LANGUAGES);
457     INSTALL_ENUM(UScriptCode, "UNKNOWN", USCRIPT_UNKNOWN);
458     INSTALL_ENUM(UScriptCode, "CARIAN", USCRIPT_CARIAN);
459     INSTALL_ENUM(UScriptCode, "JAPANESE", USCRIPT_JAPANESE);
460     INSTALL_ENUM(UScriptCode, "LANNA", USCRIPT_LANNA);
461     INSTALL_ENUM(UScriptCode, "LYCIAN", USCRIPT_LYCIAN);
462     INSTALL_ENUM(UScriptCode, "LYDIAN", USCRIPT_LYDIAN);
463     INSTALL_ENUM(UScriptCode, "OL_CHIKI", USCRIPT_OL_CHIKI);
464     INSTALL_ENUM(UScriptCode, "REJANG", USCRIPT_REJANG);
465     INSTALL_ENUM(UScriptCode, "SAURASHTRA", USCRIPT_SAURASHTRA);
466     INSTALL_ENUM(UScriptCode, "SIGN_WRITING", USCRIPT_SIGN_WRITING);
467     INSTALL_ENUM(UScriptCode, "SUNDANESE", USCRIPT_SUNDANESE);
468     INSTALL_ENUM(UScriptCode, "MOON", USCRIPT_MOON);
469     INSTALL_ENUM(UScriptCode, "MEITEI_MAYEK", USCRIPT_MEITEI_MAYEK);
470 
471 #if U_ICU_VERSION_HEX >= 0x04000000
472     INSTALL_ENUM(UScriptCode, "IMPERIAL_ARAMAIC", USCRIPT_IMPERIAL_ARAMAIC);
473     INSTALL_ENUM(UScriptCode, "AVESTAN", USCRIPT_AVESTAN);
474     INSTALL_ENUM(UScriptCode, "CHAKMA", USCRIPT_CHAKMA);
475     INSTALL_ENUM(UScriptCode, "KOREAN", USCRIPT_KOREAN);
476     INSTALL_ENUM(UScriptCode, "KAITHI", USCRIPT_KAITHI);
477     INSTALL_ENUM(UScriptCode, "MANICHAEAN", USCRIPT_MANICHAEAN);
478     INSTALL_ENUM(UScriptCode, "INSCRIPTIONAL_PAHLAVI", USCRIPT_INSCRIPTIONAL_PAHLAVI);
479     INSTALL_ENUM(UScriptCode, "PSALTER_PAHLAVI", USCRIPT_PSALTER_PAHLAVI);
480     INSTALL_ENUM(UScriptCode, "BOOK_PAHLAVI", USCRIPT_BOOK_PAHLAVI);
481     INSTALL_ENUM(UScriptCode, "INSCRIPTIONAL_PARTHIAN", USCRIPT_INSCRIPTIONAL_PARTHIAN);
482     INSTALL_ENUM(UScriptCode, "SAMARITAN", USCRIPT_SAMARITAN);
483     INSTALL_ENUM(UScriptCode, "TAI_VIET", USCRIPT_TAI_VIET);
484     INSTALL_ENUM(UScriptCode, "MATHEMATICAL_NOTATION", USCRIPT_MATHEMATICAL_NOTATION);
485     INSTALL_ENUM(UScriptCode, "SYMBOLS", USCRIPT_SYMBOLS);
486 #endif
487 
488 #if U_ICU_VERSION_HEX >= 0x04040000
489     INSTALL_ENUM(UScriptCode, "BAMUM", USCRIPT_BAMUM);
490     INSTALL_ENUM(UScriptCode, "LISU", USCRIPT_LISU);
491     INSTALL_ENUM(UScriptCode, "NAKHI_GEBA", USCRIPT_NAKHI_GEBA);
492     INSTALL_ENUM(UScriptCode, "OLD_SOUTH_ARABIAN", USCRIPT_OLD_SOUTH_ARABIAN);
493 #endif
494 
495 #if U_ICU_VERSION_HEX >= 0x04060000
496     INSTALL_ENUM(UScriptCode, "BASSA_VAH", USCRIPT_BASSA_VAH);
497     INSTALL_ENUM(UScriptCode, "DUPLOYAN_SHORTAND", USCRIPT_DUPLOYAN_SHORTAND);
498     INSTALL_ENUM(UScriptCode, "ELBASAN", USCRIPT_ELBASAN);
499     INSTALL_ENUM(UScriptCode, "GRANTHA", USCRIPT_GRANTHA);
500     INSTALL_ENUM(UScriptCode, "KPELLE", USCRIPT_KPELLE);
501     INSTALL_ENUM(UScriptCode, "LOMA", USCRIPT_LOMA);
502     INSTALL_ENUM(UScriptCode, "MANDAIC", USCRIPT_MANDAIC);
503     INSTALL_ENUM(UScriptCode, "MENDE", USCRIPT_MENDE);
504     INSTALL_ENUM(UScriptCode, "MEROITIC_CURSIVE", USCRIPT_MEROITIC_CURSIVE);
505     INSTALL_ENUM(UScriptCode, "MEROITIC_HIEROGLYPHS", USCRIPT_MEROITIC_HIEROGLYPHS);
506     INSTALL_ENUM(UScriptCode, "OLD_NORTH_ARABIAN", USCRIPT_OLD_NORTH_ARABIAN);
507     INSTALL_ENUM(UScriptCode, "NABATAEAN", USCRIPT_NABATAEAN);
508     INSTALL_ENUM(UScriptCode, "PALMYRENE", USCRIPT_PALMYRENE);
509     INSTALL_ENUM(UScriptCode, "SINDHI", USCRIPT_SINDHI);
510     INSTALL_ENUM(UScriptCode, "WARANG_CITI", USCRIPT_WARANG_CITI);
511 #endif
512 
513 #if U_ICU_VERSION_HEX >= 0x04080000
514     INSTALL_ENUM(UScriptCode, "AFAKA", USCRIPT_AFAKA);
515     INSTALL_ENUM(UScriptCode, "JURCHEN", USCRIPT_JURCHEN);
516     INSTALL_ENUM(UScriptCode, "MRO", USCRIPT_MRO);
517     INSTALL_ENUM(UScriptCode, "NUSHU", USCRIPT_NUSHU);
518     INSTALL_ENUM(UScriptCode, "SHARADA", USCRIPT_SHARADA);
519     INSTALL_ENUM(UScriptCode, "SORA_SOMPENG", USCRIPT_SORA_SOMPENG);
520     INSTALL_ENUM(UScriptCode, "TAKRI", USCRIPT_TAKRI);
521     INSTALL_ENUM(UScriptCode, "TANGUT", USCRIPT_TANGUT);
522     INSTALL_ENUM(UScriptCode, "WOLEAI", USCRIPT_WOLEAI);
523 #endif
524 
525 #if U_ICU_VERSION_HEX >= VERSION_HEX(49, 0, 0)
526     INSTALL_ENUM(UScriptCode, "ANATOLIAN_HIEROGLYPHS", USCRIPT_ANATOLIAN_HIEROGLYPHS);
527     INSTALL_ENUM(UScriptCode, "KHOJKI", USCRIPT_KHOJKI);
528     INSTALL_ENUM(UScriptCode, "TIRHUTA", USCRIPT_TIRHUTA);
529 #endif
530 #if U_ICU_VERSION_HEX >= VERSION_HEX(52, 0, 0)
531     INSTALL_ENUM(UScriptCode, "MIAO", USCRIPT_MIAO);
532     INSTALL_ENUM(UScriptCode, "CAUCASIAN_ALBANIAN", USCRIPT_CAUCASIAN_ALBANIAN);
533     INSTALL_ENUM(UScriptCode, "MAHAJANI", USCRIPT_MAHAJANI);
534 #endif
535 #if U_ICU_VERSION_HEX >= VERSION_HEX(54, 0, 0)
536     INSTALL_ENUM(UScriptCode, "DUPLOYAN", USCRIPT_DUPLOYAN);
537     INSTALL_ENUM(UScriptCode, "KHUDAWADI", USCRIPT_KHUDAWADI);
538     INSTALL_ENUM(UScriptCode, "AHOM", USCRIPT_AHOM);
539     INSTALL_ENUM(UScriptCode, "HATRAN", USCRIPT_HATRAN);
540     INSTALL_ENUM(UScriptCode, "MODI", USCRIPT_MODI);
541     INSTALL_ENUM(UScriptCode, "MULTANI", USCRIPT_MULTANI);
542     INSTALL_ENUM(UScriptCode, "PAU_CIN_HAU", USCRIPT_PAU_CIN_HAU);
543     INSTALL_ENUM(UScriptCode, "SIDDHAM", USCRIPT_SIDDHAM);
544 #endif
545 #if U_ICU_VERSION_HEX >= VERSION_HEX(58, 0, 0)
546     INSTALL_ENUM(UScriptCode, "ADLAM", USCRIPT_ADLAM);
547     INSTALL_ENUM(UScriptCode, "BHAIKSUKI", USCRIPT_BHAIKSUKI);
548     INSTALL_ENUM(UScriptCode, "MARCHEN", USCRIPT_MARCHEN);
549     INSTALL_ENUM(UScriptCode, "NEWA", USCRIPT_NEWA);
550     INSTALL_ENUM(UScriptCode, "OSAGE", USCRIPT_OSAGE);
551     INSTALL_ENUM(UScriptCode, "HAN_WITH_BOPOMOFO", USCRIPT_HAN_WITH_BOPOMOFO);
552     INSTALL_ENUM(UScriptCode, "JAMO", USCRIPT_JAMO);
553     INSTALL_ENUM(UScriptCode, "SYMBOLS_EMOJI", USCRIPT_SYMBOLS_EMOJI);
554 #endif
555 #if U_ICU_VERSION_HEX >= VERSION_HEX(60, 0, 0)
556     INSTALL_ENUM(UScriptCode, "MASARAM_GONDI", USCRIPT_MASARAM_GONDI);
557     INSTALL_ENUM(UScriptCode, "SOYOMBO", USCRIPT_SOYOMBO);
558     INSTALL_ENUM(UScriptCode, "ZANABAZAR_SQUARE", USCRIPT_ZANABAZAR_SQUARE);
559 #endif
560 #if U_ICU_VERSION_HEX >= VERSION_HEX(62, 0, 0)
561     INSTALL_ENUM(UScriptCode, "DOGRA", USCRIPT_DOGRA);
562     INSTALL_ENUM(UScriptCode, "GUNJALA_GONDI", USCRIPT_GUNJALA_GONDI);
563     INSTALL_ENUM(UScriptCode, "MAKASAR", USCRIPT_MAKASAR);
564     INSTALL_ENUM(UScriptCode, "MEDEFAIDRIN", USCRIPT_MEDEFAIDRIN);
565     INSTALL_ENUM(UScriptCode, "HANIFI_ROHINGYA", USCRIPT_HANIFI_ROHINGYA);
566     INSTALL_ENUM(UScriptCode, "SOGDIAN", USCRIPT_SOGDIAN);
567     INSTALL_ENUM(UScriptCode, "OLD_SOGDIAN", USCRIPT_OLD_SOGDIAN);
568 #endif
569 #if U_ICU_VERSION_HEX >= VERSION_HEX(64, 0, 0)
570     INSTALL_ENUM(UScriptCode, "ELYMAIC", USCRIPT_ELYMAIC);
571     INSTALL_ENUM(UScriptCode, "NANDINAGARI", USCRIPT_NANDINAGARI);
572     INSTALL_ENUM(UScriptCode, "NYIAKENG_PUACHUE_HMONG", USCRIPT_NYIAKENG_PUACHUE_HMONG);
573     INSTALL_ENUM(UScriptCode, "WANCHO", USCRIPT_WANCHO);
574 #endif
575 
576 #if U_ICU_VERSION_HEX >= VERSION_HEX(51, 0, 0)
577     INSTALL_ENUM(UScriptUsage, "NOT_ENCODED", USCRIPT_USAGE_NOT_ENCODED);
578     INSTALL_ENUM(UScriptUsage, "UNKNOWN", USCRIPT_USAGE_UNKNOWN);
579     INSTALL_ENUM(UScriptUsage, "EXCLUDED", USCRIPT_USAGE_EXCLUDED);
580     INSTALL_ENUM(UScriptUsage, "LIMITED_USE", USCRIPT_USAGE_LIMITED_USE);
581     INSTALL_ENUM(UScriptUsage, "ASPIRATIONAL", USCRIPT_USAGE_ASPIRATIONAL);
582     INSTALL_ENUM(UScriptUsage, "RECOMMENDED", USCRIPT_USAGE_RECOMMENDED);
583 #endif
584 }
585