2
**********************************************************************
3
* Copyright (C) 1997-2001, International Business Machines
4
* Corporation and others. All Rights Reserved.
5
**********************************************************************
9
* Modification History:
11
* Date Name Description
12
* 07/06/2001 Ram Creation.
13
******************************************************************************
16
#include "unicode/uscript.h"
17
#include "unicode/ures.h"
20
#define USCRIPT_CODE_ARRAY_SIZE 440
22
static const char kLocaleScript[] = "LocaleScript";
24
static const char * const scriptNames[]={
25
"ARABIC", /* USCRIPT_ARABIC */
26
"ARMENIAN", /* USCRIPT_ARMENIAN */
27
"BENGALI", /* USCRIPT_BENGALI */
28
"BOPOMOFO", /* USCRIPT_BOPOMOFO */
29
"CANADIAN-ABORIGINAL", /* USCRIPT_UCAS */
30
"CHEROKEE", /* USCRIPT_CHEROKEE */
31
"COMMON", /* USCRIPT_COMMON */
32
"CYRILLIC", /* USCRIPT_CYRILLIC */
33
"DESERET", /* USCRIPT_DESERET */
34
"DEVANAGARI", /* USCRIPT_DEVANAGARI */
35
"ETHIOPIC", /* USCRIPT_ETHIOPIC */
36
"GEORGIAN", /* USCRIPT_GEORGIAN */
37
"GOTHIC", /* USCRIPT_GOTHIC */
38
"GREEK", /* USCRIPT_GREEK */
39
"GUJARATI", /* USCRIPT_GUJARATI */
40
"GURMUKHI", /* USCRIPT_GURMUKHI */
41
"HAN", /* USCRIPT_HAN */
42
"HANGUL", /* USCRIPT_HANGUL */
43
"HEBREW", /* USCRIPT_HEBREW */
44
"HIRAGANA", /* USCRIPT_HIRAGANA */
45
"INHERITED", /* USCRIPT_INHERITED */
46
"KANNADA", /* USCRIPT_KANNADA */
47
"KATAKANA", /* USCRIPT_KATAKANA */
48
"KHMER", /* USCRIPT_KHMER */
49
"LATIN", /* USCRIPT_LATIN */
50
"MALAYALAM", /* USCRIPT_MALAYALAM */
51
"MONGOLIAN", /* USCRIPT_MONGOLIAN */
52
"MYANMAR", /* USCRIPT_MYANMAR */
53
"OGHAM", /* USCRIPT_OGHAM */
54
"OLD-ITALIC", /* USCRIPT_OLD_ITALIC */
55
"ORIYA", /* USCRIPT_ORIYA */
56
"RUNIC", /* USCRIPT_RUNIC */
57
"SINHALA", /* USCRIPT_SINHALA */
58
"SYRIAC", /* USCRIPT_SYRIAC */
59
"TAMIL", /* USCRIPT_TAMIL */
60
"TELUGU", /* USCRIPT_TELUGU */
61
"THAANA", /* USCRIPT_THANA */
62
"THAI", /* USCRIPT_THAI */
63
"TIBETAN", /* USCRIPT_TIBETAN */
64
"UCAS", /* USCRIPT_UCAS */
68
static const char * const scriptAbbr[]= {
69
"Arab", /* USCRIPT_ARABIC */
70
"Armn", /* USCRIPT_ARMENIAN */
71
"Beng", /* USCRIPT_BENGALI */
72
"Bopo", /* USCRIPT_BOPOMOFO */
73
"Cans", /* USCRIPT_UCAS */
74
"Cher", /* USCRIPT_CHEROKEE */
75
"Cyrl", /* USCRIPT_CYRILLIC */
76
/* "Cyrs", */ /* USCRIPT_CYRILLIC */
77
"Deva", /* USCRIPT_DEVANAGARI */
78
"Dsrt", /* USCRIPT_DESERET */
79
"Ethi", /* USCRIPT_ETHIOPIC */
80
/* "Geoa", */ /* USCRIPT_GEORGIAN */
81
/* "Geon", */ /* USCRIPT_GEORGIAN */
82
"Geor", /* USCRIPT_GEORGIAN */
83
"Goth", /* USCRIPT_GOTHIC */
84
"Grek", /* USCRIPT_GREEK */
85
"Gujr", /* USCRIPT_GUJARATI */
86
"Guru", /* USCRIPT_GURMUKHI */
87
"Hang", /* USCRIPT_HANGUL */
88
"Hani", /* USCRIPT_HAN */
89
"Hebr", /* USCRIPT_HEBREW */
90
"Hira", /* USCRIPT_HIRAGANA */
91
"Ital", /* USCRIPT_OLD_ITALIC */
92
"Kana", /* USCRIPT_KATAKANA */
93
"Khmr", /* USCRIPT_KHMER */
94
"Knda", /* USCRIPT_KANNADA */
95
"Lao", /* USCRIPT_LAO */
96
/*"Laoo", */ /* USCRIPT_LAO */
97
/*"Latf", */ /* USCRIPT_LATIN */
98
/*"Latg", */ /* USCRIPT_LATIN */
99
"Latn", /* USCRIPT_LATIN */
100
"Mlym", /* USCRIPT_MALAYALAM */
101
"Mong", /* USCRIPT_MONGOLIAN */
102
"Mymr", /* USCRIPT_MYANMAR */
103
"Ogam", /* USCRIPT_OGHAM */
104
"Orya", /* USCRIPT_ORIYA */
105
"Qaac", /* USCRIPT_COPTIC */
106
"Qaai", /* USCRIPT_INHERITED */
107
"Runr", /* USCRIPT_RUNIC */
108
"Sinh", /* USCRIPT_SINHALA */
109
"Syrc", /* USCRIPT_SYRIAC */
110
/* "Syre", */ /* USCRIPT_SYRIAC */
111
/* "Syrj", */ /* USCRIPT_SYRIAC */
112
/* "Syrn", */ /* USCRIPT_SYRIAC */
113
"Taml", /* USCRIPT_TAMIL */
114
"Telu", /* USCRIPT_TELUGU */
115
"Thaa", /* USCRIPT_THANA */
116
"Thai", /* USCRIPT_THAI */
117
"Tibt", /* USCRIPT_TIBETAN */
118
"Yiii", /* USCRIPT_YI */
119
"Zyyy" /* USCRIPT_COMMON */
123
static const UScriptCode scriptNameCodes[]= {
168
static const UScriptCode scriptAbbrCodes[] = {
176
/* USCRIPT_CYRILLIC , */
180
/* USCRIPT_GEORGIAN , */
181
/* USCRIPT_GEORGIAN , */
197
/* USCRIPT_LATIN , */
198
/* USCRIPT_LATIN , */
210
/* USCRIPT_SYRIAC , */
211
/* USCRIPT_SYRIAC , */
212
/* USCRIPT_SYRIAC , */
222
/* binary search the string array */
224
findStringIndex(const char* const *sortedArr, const char* target, int size){
225
int left, middle, right,rc;
229
while(left <= right){
230
middle = (left+right)/2;
231
rc=uprv_stricmp(sortedArr[middle],target);
245
findCodeIndex(const UScriptCode sorted[], const UScriptCode target, int size){
246
int left, middle, right;
249
while(left <= right){
250
middle = (left+right)/2;
251
if(sorted[middle] < target){
253
}else if(sorted[middle]>target){
262
/* linearly search the array and return the index */
264
findCodeIndex(const UScriptCode unsorted[], const UScriptCode target, int size){
267
if(target == unsorted[i]){
275
U_CAPI int32_t U_EXPORT2
276
uscript_getCode(const char* nameOrAbbrOrLocale,
281
UScriptCode code = USCRIPT_INVALID_CODE;
285
/* check arguments */
286
if(err==NULL ||U_FAILURE(*err)){
289
if(nameOrAbbrOrLocale==NULL || fillIn == NULL || capacity<0){
290
*err = U_ILLEGAL_ARGUMENT_ERROR;
293
/* try the Names array first */
294
strIndex = findStringIndex(scriptNames, nameOrAbbrOrLocale, sizeof(scriptNames)/sizeof(*scriptNames));
297
code = (UScriptCode) scriptNameCodes[strIndex];
300
/* we did not find in names array so try abbr array*/
301
if(code ==USCRIPT_INVALID_CODE){
302
strIndex = findStringIndex(scriptAbbr, nameOrAbbrOrLocale, sizeof(scriptAbbr)/sizeof(*scriptAbbr));
304
code = (UScriptCode) scriptAbbrCodes[strIndex];
309
/* we still haven't found it try locale */
310
if(code==USCRIPT_INVALID_CODE){
311
UResourceBundle* resB = ures_open(u_getDataDirectory(),nameOrAbbrOrLocale,err);
312
if(U_SUCCESS(*err)&& *err != U_USING_DEFAULT_ERROR){
313
UResourceBundle* resD = ures_getByKey(resB,kLocaleScript,NULL,err);
315
if(U_SUCCESS(*err) ){
317
while(ures_hasNext(resD)){
318
const UChar* name = ures_getNextString(resD,&len,NULL,err);
320
char cName[50] = {'\0'};
321
u_UCharsToChars(name,cName,len);
322
index = findStringIndex(scriptAbbr, cName, sizeof(scriptAbbr)/sizeof(*scriptAbbr));
323
code = (UScriptCode) scriptAbbrCodes[index];
324
/* got the script code now fill in the buffer */
325
if(numFilled<=capacity){
331
*err=U_BUFFER_OVERFLOW_ERROR;
343
if(numFilled<=capacity){
347
*err=U_BUFFER_OVERFLOW_ERROR;
354
U_CAPI const char* U_EXPORT2
355
uscript_getName(UScriptCode scriptCode){
357
if(scriptCode > USCRIPT_CODE_LIMIT){
360
index = findCodeIndex(scriptNameCodes,scriptCode,sizeof(scriptNameCodes)/sizeof(*scriptNameCodes));
362
return scriptNames[index];
368
U_CAPI const char* U_EXPORT2
369
uscript_getShortName(UScriptCode scriptCode){
371
if(scriptCode > USCRIPT_CODE_LIMIT){
374
index = findCodeIndex(scriptAbbrCodes,scriptCode,sizeof(scriptAbbrCodes)/sizeof(*scriptAbbrCodes));
376
return scriptAbbr[index];