16d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru/* 26d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru******************************************************************************* 359d709d503bab6e2b61931737e662dd293b40578ccornelius* Copyright (C) 2010-2013, International Business Machines Corporation and 46d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru* others. All Rights Reserved. 56d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru******************************************************************************* 66d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru* 76d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru* 86d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru* File NUMSYS.CPP 96d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru* 106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru* Modification History:* 116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru* Date Name Description 126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru* 136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru******************************************************************************** 146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru*/ 156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#include "unicode/utypes.h" 1750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/localpointer.h" 186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#include "unicode/uchar.h" 196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#include "unicode/unistr.h" 206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#include "unicode/ures.h" 216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#include "unicode/ustring.h" 226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#include "unicode/uloc.h" 236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#include "unicode/schriter.h" 246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#include "unicode/numsys.h" 2527f654740f2a26ad62a5c155af9199af9e69b889claireho#include "cstring.h" 266d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#include "uresimp.h" 2783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#include "numsys_impl.h" 286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruU_NAMESPACE_BEGIN 326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru// Useful constants 346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#define DEFAULT_DIGITS UNICODE_STRING_SIMPLE("0123456789"); 366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Querustatic const char gNumberingSystems[] = "numberingSystems"; 3727f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char gNumberElements[] = "NumberElements"; 3827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char gDefault[] = "default"; 3983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusstatic const char gNative[] = "native"; 4083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusstatic const char gTraditional[] = "traditional"; 4183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusstatic const char gFinance[] = "finance"; 426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Querustatic const char gDesc[] = "desc"; 436d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Querustatic const char gRadix[] = "radix"; 446d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Querustatic const char gAlgorithmic[] = "algorithmic"; 4527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char gLatn[] = "latn"; 466d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 486d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(NumberingSystem) 4983a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusUOBJECT_DEFINE_RTTI_IMPLEMENTATION(NumsysNameEnumeration) 506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru /** 526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru * Default Constructor. 536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru * 546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru * @draft ICU 4.2 556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru */ 566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberingSystem::NumberingSystem() { 586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru radix = 10; 596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru algorithmic = FALSE; 606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString defaultDigits = DEFAULT_DIGITS; 616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru desc.setTo(defaultDigits); 6227f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcpy(name,gLatn); 636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 656d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru /** 666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru * Copy constructor. 676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru * @draft ICU 4.2 686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru */ 696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberingSystem::NumberingSystem(const NumberingSystem& other) 716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru: UObject(other) { 726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru *this=other; 736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberingSystem* U_EXPORT2 766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberingSystem::createInstance(int32_t radix_in, UBool isAlgorithmic_in, const UnicodeString & desc_in, UErrorCode &status) { 776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 7827f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(status)) { 7927f654740f2a26ad62a5c155af9199af9e69b889claireho return NULL; 8027f654740f2a26ad62a5c155af9199af9e69b889claireho } 8127f654740f2a26ad62a5c155af9199af9e69b889claireho 826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if ( radix_in < 2 ) { 836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return NULL; 856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if ( !isAlgorithmic_in ) { 886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if ( desc_in.countChar32() != radix_in || !isValidDigitString(desc_in)) { 896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return NULL; 916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru NumberingSystem *ns = new NumberingSystem(); 956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru ns->setRadix(radix_in); 976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru ns->setDesc(desc_in); 986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru ns->setAlgorithmic(isAlgorithmic_in); 9927f654740f2a26ad62a5c155af9199af9e69b889claireho ns->setName(NULL); 1006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return ns; 1016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 1026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 1036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 1046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 1056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberingSystem* U_EXPORT2 1066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberingSystem::createInstance(const Locale & inLocale, UErrorCode& status) { 1076d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 10827f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(status)) { 10927f654740f2a26ad62a5c155af9199af9e69b889claireho return NULL; 11083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 11127f654740f2a26ad62a5c155af9199af9e69b889claireho 11283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UBool nsResolved = TRUE; 11383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UBool usingFallback = FALSE; 1146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru char buffer[ULOC_KEYWORDS_CAPACITY]; 1156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru int32_t count = inLocale.getKeywordValue("numbers",buffer, sizeof(buffer),status); 1166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if ( count > 0 ) { // @numbers keyword was specified in the locale 1176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru buffer[count] = '\0'; // Make sure it is null terminated. 11883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if ( !uprv_strcmp(buffer,gDefault) || !uprv_strcmp(buffer,gNative) || 11983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius !uprv_strcmp(buffer,gTraditional) || !uprv_strcmp(buffer,gFinance)) { 12083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius nsResolved = FALSE; 12183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 12283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } else { 12383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius uprv_strcpy(buffer,gDefault); 12483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius nsResolved = FALSE; 12583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 12683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 12783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if (!nsResolved) { // Resolve the numbering system ( default, native, traditional or finance ) into a "real" numbering system 12883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UErrorCode localStatus = U_ZERO_ERROR; 12983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UResourceBundle *resource = ures_open(NULL, inLocale.getName(), &localStatus); 13083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UResourceBundle *numberElementsRes = ures_getByKey(resource,gNumberElements,NULL,&localStatus); 13183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius while (!nsResolved) { 13283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius localStatus = U_ZERO_ERROR; 13383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius count = 0; 13483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius const UChar *nsName = ures_getStringByKeyWithFallback(numberElementsRes, buffer, &count, &localStatus); 13583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if ( count > 0 && count < ULOC_KEYWORDS_CAPACITY ) { // numbering system found 13683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius u_UCharsToChars(nsName,buffer,count); 13783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius buffer[count] = '\0'; // Make sure it is null terminated. 13883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius nsResolved = TRUE; 13983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 14083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 14183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if (!nsResolved) { // Fallback behavior per TR35 - traditional falls back to native, finance and native fall back to default 14283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if (!uprv_strcmp(buffer,gNative) || !uprv_strcmp(buffer,gFinance)) { 14383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius uprv_strcpy(buffer,gDefault); 14483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } else if (!uprv_strcmp(buffer,gTraditional)) { 14583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius uprv_strcpy(buffer,gNative); 14683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } else { // If we get here we couldn't find even the default numbering system 14783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius usingFallback = TRUE; 14883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius nsResolved = TRUE; 14983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 15083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 15183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 15227f654740f2a26ad62a5c155af9199af9e69b889claireho ures_close(numberElementsRes); 15327f654740f2a26ad62a5c155af9199af9e69b889claireho ures_close(resource); 15483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 15527f654740f2a26ad62a5c155af9199af9e69b889claireho 15683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if (usingFallback) { 15783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius status = U_USING_FALLBACK_WARNING; 15883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius NumberingSystem *ns = new NumberingSystem(); 15983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return ns; 16083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } else { 16183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return NumberingSystem::createInstanceByName(buffer,status); 1626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 16383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 1646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 1656d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberingSystem* U_EXPORT2 1666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberingSystem::createInstance(UErrorCode& status) { 1676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return NumberingSystem::createInstance(Locale::getDefault(), status); 1686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 1696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 1706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberingSystem* U_EXPORT2 1716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberingSystem::createInstanceByName(const char *name, UErrorCode& status) { 17283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UResourceBundle *numberingSystemsInfo = NULL; 17383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UResourceBundle *nsTop, *nsCurrent; 17483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius int32_t radix = 10; 17583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius int32_t algorithmic = 0; 1766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 17783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius numberingSystemsInfo = ures_openDirect(NULL,gNumberingSystems, &status); 17883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius nsCurrent = ures_getByKey(numberingSystemsInfo,gNumberingSystems,NULL,&status); 17983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius nsTop = ures_getByKey(nsCurrent,name,NULL,&status); 18083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UnicodeString nsd = ures_getUnicodeStringByKey(nsTop,gDesc,&status); 1816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 18283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius ures_getByKey(nsTop,gRadix,nsCurrent,&status); 18383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius radix = ures_getInt(nsCurrent,&status); 1846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 18583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius ures_getByKey(nsTop,gAlgorithmic,nsCurrent,&status); 18683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius algorithmic = ures_getInt(nsCurrent,&status); 1876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 18883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UBool isAlgorithmic = ( algorithmic == 1 ); 1896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 19083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius ures_close(nsCurrent); 19183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius ures_close(nsTop); 19283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius ures_close(numberingSystemsInfo); 1936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 19483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if (U_FAILURE(status)) { 19583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius status = U_UNSUPPORTED_ERROR; 19683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return NULL; 19783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 1986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 19983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius NumberingSystem* ns = NumberingSystem::createInstance(radix,isAlgorithmic,nsd,status); 20083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius ns->setName(name); 20183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return ns; 2026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 2036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 2046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru /** 2056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru * Destructor. 2066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru * @draft ICU 4.2 2076d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru */ 2086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberingSystem::~NumberingSystem() { 2096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 2106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 21159d709d503bab6e2b61931737e662dd293b40578ccorneliusint32_t NumberingSystem::getRadix() const { 2126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return radix; 2136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 2146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 21559d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString NumberingSystem::getDescription() const { 2166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return desc; 2176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 2186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 21959d709d503bab6e2b61931737e662dd293b40578ccorneliusconst char * NumberingSystem::getName() const { 22027f654740f2a26ad62a5c155af9199af9e69b889claireho return name; 22127f654740f2a26ad62a5c155af9199af9e69b889claireho} 22227f654740f2a26ad62a5c155af9199af9e69b889claireho 2236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid NumberingSystem::setRadix(int32_t r) { 2246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru radix = r; 2256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 2266d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 2276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid NumberingSystem::setAlgorithmic(UBool c) { 2286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru algorithmic = c; 2296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 2306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 2316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid NumberingSystem::setDesc(UnicodeString d) { 2326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru desc.setTo(d); 2336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 23427f654740f2a26ad62a5c155af9199af9e69b889clairehovoid NumberingSystem::setName(const char *n) { 23527f654740f2a26ad62a5c155af9199af9e69b889claireho if ( n == NULL ) { 23627f654740f2a26ad62a5c155af9199af9e69b889claireho name[0] = (char) 0; 23727f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 23827f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strncpy(name,n,NUMSYS_NAME_CAPACITY); 23927f654740f2a26ad62a5c155af9199af9e69b889claireho name[NUMSYS_NAME_CAPACITY] = (char)0; // Make sure it is null terminated. 24027f654740f2a26ad62a5c155af9199af9e69b889claireho } 24127f654740f2a26ad62a5c155af9199af9e69b889claireho} 2426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruUBool NumberingSystem::isAlgorithmic() const { 2436d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return ( algorithmic ); 2446d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 2456d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 24683a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusStringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) { 24783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 24883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius static StringEnumeration* availableNames = NULL; 24983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 25083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if (U_FAILURE(status)) { 25183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return NULL; 25283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 25383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 25483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if ( availableNames == NULL ) { 25583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UVector *fNumsysNames = new UVector(uprv_deleteUObject, NULL, status); 25683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if (U_FAILURE(status)) { 25783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius status = U_MEMORY_ALLOCATION_ERROR; 25883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return NULL; 25983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 26083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 26183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UErrorCode rbstatus = U_ZERO_ERROR; 26283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UResourceBundle *numberingSystemsInfo = ures_openDirect(NULL, "numberingSystems", &rbstatus); 26383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius numberingSystemsInfo = ures_getByKey(numberingSystemsInfo,"numberingSystems",numberingSystemsInfo,&rbstatus); 26483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if(U_FAILURE(rbstatus)) { 26583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius status = U_MISSING_RESOURCE_ERROR; 26683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius ures_close(numberingSystemsInfo); 26783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return NULL; 26883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 26983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 27083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius while ( ures_hasNext(numberingSystemsInfo) ) { 27183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UResourceBundle *nsCurrent = ures_getNextResource(numberingSystemsInfo,NULL,&rbstatus); 27283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius const char *nsName = ures_getKey(nsCurrent); 27383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius fNumsysNames->addElement(new UnicodeString(nsName, -1, US_INV),status); 27483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius ures_close(nsCurrent); 27583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 27683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 27783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius ures_close(numberingSystemsInfo); 27883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius availableNames = new NumsysNameEnumeration(fNumsysNames,status); 27983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 28083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 28183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 28283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return availableNames; 28383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 2846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 2856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruUBool NumberingSystem::isValidDigitString(const UnicodeString& str) { 2866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 2876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru StringCharacterIterator it(str); 2886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UChar32 c; 2896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru int32_t i = 0; 2906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 2916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru for ( it.setToStart(); it.hasNext(); ) { 2926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru c = it.next32PostInc(); 2936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if ( c > 0xFFFF ) { // Digits outside the BMP are not currently supported 2946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return FALSE; 2956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 2966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru i++; 2976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 2986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return TRUE; 2996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 30083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 30183a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusNumsysNameEnumeration::NumsysNameEnumeration(UVector *fNameList, UErrorCode& /*status*/) { 30283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius pos=0; 30383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius fNumsysNames = fNameList; 30483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 30583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 30683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusconst UnicodeString* 30783a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusNumsysNameEnumeration::snext(UErrorCode& status) { 30883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if (U_SUCCESS(status) && pos < fNumsysNames->size()) { 30983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return (const UnicodeString*)fNumsysNames->elementAt(pos++); 31083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 31183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return NULL; 31283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 31383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 31483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusvoid 31583a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusNumsysNameEnumeration::reset(UErrorCode& /*status*/) { 31683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius pos=0; 31783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 31883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 31983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusint32_t 32083a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusNumsysNameEnumeration::count(UErrorCode& /*status*/) const { 32183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return (fNumsysNames==NULL) ? 0 : fNumsysNames->size(); 32283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 32383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 32483a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusNumsysNameEnumeration::~NumsysNameEnumeration() { 32583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius delete fNumsysNames; 32683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 3276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruU_NAMESPACE_END 3286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 3296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */ 3306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 3316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru//eof 332