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