16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 1997-2011, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File USCRIPT.C 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History: 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date Name Description 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 07/06/2001 Ram Creation. 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org****************************************************************************** 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uscript.h" 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ures.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/putil.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uprops.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char kLocaleScript[] = "LocaleScript"; 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* TODO: this is a bad API should be deprecated */ 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguscript_getCode(const char* nameOrAbbrOrLocale, 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UScriptCode* fillIn, 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t capacity, 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode* err){ 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UScriptCode code = USCRIPT_INVALID_CODE; 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t numFilled=0; 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len=0; 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* check arguments */ 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(err==NULL ||U_FAILURE(*err)){ 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return numFilled; 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(nameOrAbbrOrLocale==NULL || fillIn == NULL || capacity<0){ 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *err = U_ILLEGAL_ARGUMENT_ERROR; 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return numFilled; 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_strchr(nameOrAbbrOrLocale, '-')==NULL && uprv_strchr(nameOrAbbrOrLocale, '_')==NULL ){ 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* try long and abbreviated script names first */ 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale); 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(code==(UScriptCode)UCHAR_INVALID_CODE){ 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Do not propagate error codes from just not finding a locale bundle. */ 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode localErrorCode = U_ZERO_ERROR; 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle* resB = ures_open(NULL,nameOrAbbrOrLocale,&localErrorCode); 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(localErrorCode)&& localErrorCode != U_USING_DEFAULT_WARNING){ 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle* resD = ures_getByKey(resB,kLocaleScript,NULL,&localErrorCode); 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(localErrorCode) ){ 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org len =0; 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(ures_hasNext(resD)){ 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar* name = ures_getNextString(resD,&len,NULL,&localErrorCode); 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(localErrorCode)){ 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char cName[50] = {'\0'}; 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_UCharsToChars(name,cName,len); 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, cName); 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* got the script code now fill in the buffer */ 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(numFilled<capacity){ 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *(fillIn)++=code; 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numFilled++; 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(resD); 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(resB); 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *err=U_BUFFER_OVERFLOW_ERROR; 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return len; 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(resD); 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(resB); 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org code = USCRIPT_INVALID_CODE; 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(code==(UScriptCode)UCHAR_INVALID_CODE){ 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* still not found .. try long and abbreviated script names again */ 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org code = (UScriptCode) u_getPropertyValueEnum(UCHAR_SCRIPT, nameOrAbbrOrLocale); 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(code!=(UScriptCode)UCHAR_INVALID_CODE){ 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* we found it */ 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(numFilled<capacity){ 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *(fillIn)++=code; 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numFilled++; 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *err=U_BUFFER_OVERFLOW_ERROR; 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return len; 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return numFilled; 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 98