16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2010-2013, International Business Machines Corporation and 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File NUMSYS.CPP 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History:* 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date Name Description 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************** 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/localpointer.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ures.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uloc.h" 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/schriter.h" 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/numsys.h" 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uresimp.h" 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "numsys_impl.h" 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Useful constants 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DEFAULT_DIGITS UNICODE_STRING_SIMPLE("0123456789"); 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gNumberingSystems[] = "numberingSystems"; 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gNumberElements[] = "NumberElements"; 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gDefault[] = "default"; 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gNative[] = "native"; 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gTraditional[] = "traditional"; 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gFinance[] = "finance"; 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gDesc[] = "desc"; 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gRadix[] = "radix"; 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gAlgorithmic[] = "algorithmic"; 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gLatn[] = "latn"; 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUOBJECT_DEFINE_RTTI_IMPLEMENTATION(NumberingSystem) 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUOBJECT_DEFINE_RTTI_IMPLEMENTATION(NumsysNameEnumeration) 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Default Constructor. 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @draft ICU 4.2 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumberingSystem::NumberingSystem() { 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org radix = 10; 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org algorithmic = FALSE; 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString defaultDigits = DEFAULT_DIGITS; 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org desc.setTo(defaultDigits); 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcpy(name,gLatn); 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copy constructor. 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @draft ICU 4.2 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumberingSystem::NumberingSystem(const NumberingSystem& other) 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org: UObject(other) { 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *this=other; 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumberingSystem* U_EXPORT2 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumberingSystem::createInstance(int32_t radix_in, UBool isAlgorithmic_in, const UnicodeString & desc_in, UErrorCode &status) { 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( radix_in < 2 ) { 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ILLEGAL_ARGUMENT_ERROR; 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( !isAlgorithmic_in ) { 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( desc_in.countChar32() != radix_in || !isValidDigitString(desc_in)) { 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ILLEGAL_ARGUMENT_ERROR; 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NumberingSystem *ns = new NumberingSystem(); 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ns->setRadix(radix_in); 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ns->setDesc(desc_in); 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ns->setAlgorithmic(isAlgorithmic_in); 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ns->setName(NULL); 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return ns; 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumberingSystem* U_EXPORT2 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumberingSystem::createInstance(const Locale & inLocale, UErrorCode& status) { 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool nsResolved = TRUE; 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool usingFallback = FALSE; 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char buffer[ULOC_KEYWORDS_CAPACITY]; 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t count = inLocale.getKeywordValue("numbers",buffer, sizeof(buffer),status); 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( count > 0 ) { // @numbers keyword was specified in the locale 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[count] = '\0'; // Make sure it is null terminated. 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( !uprv_strcmp(buffer,gDefault) || !uprv_strcmp(buffer,gNative) || 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org !uprv_strcmp(buffer,gTraditional) || !uprv_strcmp(buffer,gFinance)) { 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nsResolved = FALSE; 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcpy(buffer,gDefault); 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nsResolved = FALSE; 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!nsResolved) { // Resolve the numbering system ( default, native, traditional or finance ) into a "real" numbering system 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode localStatus = U_ZERO_ERROR; 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *resource = ures_open(NULL, inLocale.getName(), &localStatus); 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *numberElementsRes = ures_getByKey(resource,gNumberElements,NULL,&localStatus); 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (!nsResolved) { 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org localStatus = U_ZERO_ERROR; 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count = 0; 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *nsName = ures_getStringByKeyWithFallback(numberElementsRes, buffer, &count, &localStatus); 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( count > 0 && count < ULOC_KEYWORDS_CAPACITY ) { // numbering system found 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_UCharsToChars(nsName,buffer,count); 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[count] = '\0'; // Make sure it is null terminated. 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nsResolved = TRUE; 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!nsResolved) { // Fallback behavior per TR35 - traditional falls back to native, finance and native fall back to default 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!uprv_strcmp(buffer,gNative) || !uprv_strcmp(buffer,gFinance)) { 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcpy(buffer,gDefault); 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (!uprv_strcmp(buffer,gTraditional)) { 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcpy(buffer,gNative); 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { // If we get here we couldn't find even the default numbering system 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org usingFallback = TRUE; 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nsResolved = TRUE; 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(numberElementsRes); 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(resource); 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (usingFallback) { 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_USING_FALLBACK_WARNING; 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NumberingSystem *ns = new NumberingSystem(); 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return ns; 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NumberingSystem::createInstanceByName(buffer,status); 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumberingSystem* U_EXPORT2 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumberingSystem::createInstance(UErrorCode& status) { 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NumberingSystem::createInstance(Locale::getDefault(), status); 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumberingSystem* U_EXPORT2 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumberingSystem::createInstanceByName(const char *name, UErrorCode& status) { 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *numberingSystemsInfo = NULL; 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *nsTop, *nsCurrent; 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t radix = 10; 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t algorithmic = 0; 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numberingSystemsInfo = ures_openDirect(NULL,gNumberingSystems, &status); 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nsCurrent = ures_getByKey(numberingSystemsInfo,gNumberingSystems,NULL,&status); 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nsTop = ures_getByKey(nsCurrent,name,NULL,&status); 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString nsd = ures_getUnicodeStringByKey(nsTop,gDesc,&status); 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getByKey(nsTop,gRadix,nsCurrent,&status); 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org radix = ures_getInt(nsCurrent,&status); 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_getByKey(nsTop,gAlgorithmic,nsCurrent,&status); 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org algorithmic = ures_getInt(nsCurrent,&status); 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isAlgorithmic = ( algorithmic == 1 ); 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(nsCurrent); 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(nsTop); 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(numberingSystemsInfo); 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_UNSUPPORTED_ERROR; 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NumberingSystem* ns = NumberingSystem::createInstance(radix,isAlgorithmic,nsd,status); 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ns->setName(name); 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return ns; 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Destructor. 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @draft ICU 4.2 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumberingSystem::~NumberingSystem() { 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t NumberingSystem::getRadix() const { 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return radix; 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString NumberingSystem::getDescription() const { 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return desc; 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char * NumberingSystem::getName() const { 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return name; 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid NumberingSystem::setRadix(int32_t r) { 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org radix = r; 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid NumberingSystem::setAlgorithmic(UBool c) { 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org algorithmic = c; 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid NumberingSystem::setDesc(UnicodeString d) { 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org desc.setTo(d); 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid NumberingSystem::setName(const char *n) { 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( n == NULL ) { 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name[0] = (char) 0; 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strncpy(name,n,NUMSYS_NAME_CAPACITY); 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name[NUMSYS_NAME_CAPACITY] = (char)0; // Make sure it is null terminated. 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool NumberingSystem::isAlgorithmic() const { 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return ( algorithmic ); 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) { 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static StringEnumeration* availableNames = NULL; 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( availableNames == NULL ) { 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVector *fNumsysNames = new UVector(uprv_deleteUObject, NULL, status); 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_MEMORY_ALLOCATION_ERROR; 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode rbstatus = U_ZERO_ERROR; 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *numberingSystemsInfo = ures_openDirect(NULL, "numberingSystems", &rbstatus); 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numberingSystemsInfo = ures_getByKey(numberingSystemsInfo,"numberingSystems",numberingSystemsInfo,&rbstatus); 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(rbstatus)) { 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_MISSING_RESOURCE_ERROR; 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(numberingSystemsInfo); 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ( ures_hasNext(numberingSystemsInfo) ) { 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *nsCurrent = ures_getNextResource(numberingSystemsInfo,NULL,&rbstatus); 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *nsName = ures_getKey(nsCurrent); 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fNumsysNames->addElement(new UnicodeString(nsName, -1, US_INV),status); 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(nsCurrent); 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(numberingSystemsInfo); 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org availableNames = new NumsysNameEnumeration(fNumsysNames,status); 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return availableNames; 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool NumberingSystem::isValidDigitString(const UnicodeString& str) { 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringCharacterIterator it(str); 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c; 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i = 0; 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( it.setToStart(); it.hasNext(); ) { 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = it.next32PostInc(); 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( c > 0xFFFF ) { // Digits outside the BMP are not currently supported 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i++; 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumsysNameEnumeration::NumsysNameEnumeration(UVector *fNameList, UErrorCode& /*status*/) { 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=0; 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fNumsysNames = fNameList; 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst UnicodeString* 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumsysNameEnumeration::snext(UErrorCode& status) { 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status) && pos < fNumsysNames->size()) { 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (const UnicodeString*)fNumsysNames->elementAt(pos++); 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumsysNameEnumeration::reset(UErrorCode& /*status*/) { 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=0; 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumsysNameEnumeration::count(UErrorCode& /*status*/) const { 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (fNumsysNames==NULL) ? 0 : fNumsysNames->size(); 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumsysNameEnumeration::~NumsysNameEnumeration() { 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete fNumsysNames; 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */ 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//eof 332