diff options
Diffstat (limited to 'Build/source/libs/icu/icu-4.8.1/common/uscript.c')
-rw-r--r-- | Build/source/libs/icu/icu-4.8.1/common/uscript.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-4.8.1/common/uscript.c b/Build/source/libs/icu/icu-4.8.1/common/uscript.c new file mode 100644 index 00000000000..2a7000431f5 --- /dev/null +++ b/Build/source/libs/icu/icu-4.8.1/common/uscript.c @@ -0,0 +1,110 @@ +/* +********************************************************************** +* Copyright (C) 1997-2010, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* +* File USCRIPT.C +* +* Modification History: +* +* Date Name Description +* 07/06/2001 Ram Creation. +****************************************************************************** +*/ + +#include "unicode/uscript.h" +#include "unicode/ures.h" +#include "unicode/uchar.h" +#include "unicode/putil.h" +#include "uprops.h" +#include "cmemory.h" +#include "cstring.h" + +static const char kLocaleScript[] = "LocaleScript"; + +/* TODO: this is a bad API should be deprecated */ +U_CAPI int32_t U_EXPORT2 +uscript_getCode(const char* nameOrAbbrOrLocale, + UScriptCode* fillIn, + int32_t capacity, + UErrorCode* err){ + + UScriptCode code = USCRIPT_INVALID_CODE; + int32_t numFilled=0; + int32_t len=0; + /* check arguments */ + if(err==NULL ||U_FAILURE(*err)){ + return numFilled; + } + if(nameOrAbbrOrLocale==NULL || fillIn == NULL || capacity<0){ + *err = U_ILLEGAL_ARGUMENT_ERROR; + return numFilled; + } + + if(uprv_strchr(nameOrAbbrOrLocale, '-')==NULL && uprv_strchr(nameOrAbbrOrLocale, '_')==NULL ){ + /* try long and abbreviated script names first */ + code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale); + + } + if(code==(UScriptCode)UCHAR_INVALID_CODE){ + /* Do not propagate error codes from just not finding a locale bundle. */ + UErrorCode localErrorCode = U_ZERO_ERROR; + UResourceBundle* resB = ures_open(NULL,nameOrAbbrOrLocale,&localErrorCode); + if(U_SUCCESS(localErrorCode)&& localErrorCode != U_USING_DEFAULT_WARNING){ + UResourceBundle* resD = ures_getByKey(resB,kLocaleScript,NULL,&localErrorCode); + if(U_SUCCESS(localErrorCode) ){ + len =0; + while(ures_hasNext(resD)){ + const UChar* name = ures_getNextString(resD,&len,NULL,&localErrorCode); + if(U_SUCCESS(localErrorCode)){ + char cName[50] = {'\0'}; + u_UCharsToChars(name,cName,len); + code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, cName); + /* got the script code now fill in the buffer */ + if(numFilled<capacity){ + *(fillIn)++=code; + numFilled++; + }else{ + ures_close(resD); + ures_close(resB); + *err=U_BUFFER_OVERFLOW_ERROR; + return len; + } + } + } + } + ures_close(resD); + } + ures_close(resB); + code = USCRIPT_INVALID_CODE; + } + if(code==(UScriptCode)UCHAR_INVALID_CODE){ + /* still not found .. try long and abbreviated script names again */ + code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale); + } + if(code!=(UScriptCode)UCHAR_INVALID_CODE){ + /* we found it */ + if(numFilled<capacity){ + *(fillIn)++=code; + numFilled++; + }else{ + *err=U_BUFFER_OVERFLOW_ERROR; + return len; + } + } + return numFilled; +} + +U_CAPI const char* U_EXPORT2 +uscript_getName(UScriptCode scriptCode){ + return u_getPropertyValueName(UCHAR_SCRIPT, scriptCode, + U_LONG_PROPERTY_NAME); +} + +U_CAPI const char* U_EXPORT2 +uscript_getShortName(UScriptCode scriptCode){ + return u_getPropertyValueName(UCHAR_SCRIPT, scriptCode, + U_SHORT_PROPERTY_NAME); +} + |