16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 2009-2011, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *******************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/currpinf.h"
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//#define CURRENCY_PLURAL_INFO_DEBUG 1
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef CURRENCY_PLURAL_INFO_DEBUG
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <iostream>
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/plurrule.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ures.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/numsys.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "hash.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uresimp.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ureslocs.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar gNumberPatternSeparator = 0x3B; // ;
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal ICU 4.2
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_CALLCONV ValueComparator(UHashTok val1, UHashTok val2);
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CALLCONV ValueComparator(UHashTok val1, UHashTok val2) {
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UnicodeString* affix_1 = (UnicodeString*)val1.pointer;
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UnicodeString* affix_2 = (UnicodeString*)val2.pointer;
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return  *affix_1 == *affix_2;
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUOBJECT_DEFINE_RTTI_IMPLEMENTATION(CurrencyPluralInfo)
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar gDefaultCurrencyPluralPattern[] = {'0', '.', '#', '#', ' ', 0xA4, 0xA4, 0xA4, 0};
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar gTripleCurrencySign[] = {0xA4, 0xA4, 0xA4, 0};
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar gPluralCountOther[] = {0x6F, 0x74, 0x68, 0x65, 0x72, 0};
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar gPart0[] = {0x7B, 0x30, 0x7D, 0};
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar gPart1[] = {0x7B, 0x31, 0x7D, 0};
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gNumberElementsTag[]="NumberElements";
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gLatnTag[]="latn";
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gPatternsTag[]="patterns";
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gDecimalFormatTag[]="decimalFormat";
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char gCurrUnitPtnTag[]="CurrencyUnitPatterns";
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::CurrencyPluralInfo(UErrorCode& status)
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org:   fPluralCountToCurrencyUnitPattern(NULL),
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fPluralRules(NULL),
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fLocale(NULL) {
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    initialize(Locale::getDefault(), status);
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::CurrencyPluralInfo(const Locale& locale, UErrorCode& status)
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org:   fPluralCountToCurrencyUnitPattern(NULL),
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fPluralRules(NULL),
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fLocale(NULL) {
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    initialize(locale, status);
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::CurrencyPluralInfo(const CurrencyPluralInfo& info)
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org:   UObject(info),
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fPluralCountToCurrencyUnitPattern(NULL),
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fPluralRules(NULL),
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fLocale(NULL) {
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *this = info;
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo&
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::operator=(const CurrencyPluralInfo& info) {
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (this == &info) {
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return *this;
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    deleteHash(fPluralCountToCurrencyUnitPattern);
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fPluralCountToCurrencyUnitPattern = initHash(status);
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    copyHash(info.fPluralCountToCurrencyUnitPattern,
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             fPluralCountToCurrencyUnitPattern, status);
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( U_FAILURE(status) ) {
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return *this;
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fPluralRules;
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fLocale;
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (info.fPluralRules) {
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fPluralRules = info.fPluralRules->clone();
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fPluralRules = NULL;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (info.fLocale) {
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fLocale = info.fLocale->clone();
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fLocale = NULL;
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return *this;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::~CurrencyPluralInfo() {
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    deleteHash(fPluralCountToCurrencyUnitPattern);
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fPluralCountToCurrencyUnitPattern = NULL;
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fPluralRules;
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fLocale;
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fPluralRules = NULL;
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fLocale = NULL;
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::operator==(const CurrencyPluralInfo& info) const {
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef CURRENCY_PLURAL_INFO_DEBUG
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (*fPluralRules == *info.fPluralRules) {
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        std::cout << "same plural rules\n";
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (*fLocale == *info.fLocale) {
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        std::cout << "same locale\n";
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fPluralCountToCurrencyUnitPattern->equals(*info.fPluralCountToCurrencyUnitPattern)) {
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        std::cout << "same pattern\n";
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return *fPluralRules == *info.fPluralRules &&
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           *fLocale == *info.fLocale &&
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           fPluralCountToCurrencyUnitPattern->equals(*info.fPluralCountToCurrencyUnitPattern);
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo*
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::clone() const {
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return new CurrencyPluralInfo(*this);
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst PluralRules*
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::getPluralRules() const {
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return fPluralRules;
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString&
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::getCurrencyPluralPattern(const UnicodeString&  pluralCount,
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                             UnicodeString& result) const {
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UnicodeString* currencyPluralPattern =
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (UnicodeString*)fPluralCountToCurrencyUnitPattern->get(pluralCount);
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (currencyPluralPattern == NULL) {
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // fall back to "other"
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (pluralCount.compare(gPluralCountOther, 5)) {
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            currencyPluralPattern =
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (UnicodeString*)fPluralCountToCurrencyUnitPattern->get(UnicodeString(TRUE, gPluralCountOther, 5));
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (currencyPluralPattern == NULL) {
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // no currencyUnitPatterns defined,
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // fallback to predefined defult.
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // This should never happen when ICU resource files are
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // available, since currencyUnitPattern of "other" is always
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // defined in root.
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            result = UnicodeString(gDefaultCurrencyPluralPattern);
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return result;
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = *currencyPluralPattern;
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return result;
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst Locale&
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::getLocale() const {
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return *fLocale;
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::setPluralRules(const UnicodeString& ruleDescription,
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                   UErrorCode& status) {
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (fPluralRules) {
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            delete fPluralRules;
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fPluralRules = PluralRules::createRules(ruleDescription, status);
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::setCurrencyPluralPattern(const UnicodeString& pluralCount,
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                             const UnicodeString& pattern,
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                             UErrorCode& status) {
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fPluralCountToCurrencyUnitPattern->put(pluralCount, new UnicodeString(pattern), status);
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::setLocale(const Locale& loc, UErrorCode& status) {
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    initialize(loc, status);
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::initialize(const Locale& loc, UErrorCode& status) {
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fLocale;
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fLocale = loc.clone();
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fPluralRules) {
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete fPluralRules;
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fPluralRules = PluralRules::forLocale(loc, status);
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    setupCurrencyPluralPattern(loc, status);
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::setupCurrencyPluralPattern(const Locale& loc, UErrorCode& status) {
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fPluralCountToCurrencyUnitPattern) {
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        deleteHash(fPluralCountToCurrencyUnitPattern);
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fPluralCountToCurrencyUnitPattern = initHash(status);
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    NumberingSystem *ns = NumberingSystem::createInstance(loc,status);
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec = U_ZERO_ERROR;
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *rb = ures_open(NULL, loc.getName(), &ec);
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *numElements = ures_getByKeyWithFallback(rb, gNumberElementsTag, NULL, &ec);
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rb = ures_getByKeyWithFallback(numElements, ns->getName(), rb, &ec);
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rb = ures_getByKeyWithFallback(rb, gPatternsTag, rb, &ec);
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t ptnLen;
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar* numberStylePattern = ures_getStringByKeyWithFallback(rb, gDecimalFormatTag, &ptnLen, &ec);
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Fall back to "latn" if num sys specific pattern isn't there.
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( ec == U_MISSING_RESOURCE_ERROR && uprv_strcmp(ns->getName(),gLatnTag)) {
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ec = U_ZERO_ERROR;
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        rb = ures_getByKeyWithFallback(numElements, gLatnTag, rb, &ec);
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        rb = ures_getByKeyWithFallback(rb, gPatternsTag, rb, &ec);
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numberStylePattern = ures_getStringByKeyWithFallback(rb, gDecimalFormatTag, &ptnLen, &ec);
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t numberStylePatternLen = ptnLen;
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar* negNumberStylePattern = NULL;
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t negNumberStylePatternLen = 0;
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // TODO: Java
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // parse to check whether there is ";" separator in the numberStylePattern
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool hasSeparator = false;
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(ec)) {
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (int32_t styleCharIndex = 0; styleCharIndex < ptnLen; ++styleCharIndex) {
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (numberStylePattern[styleCharIndex] == gNumberPatternSeparator) {
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                hasSeparator = true;
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                // split the number style pattern into positive and negative
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                negNumberStylePattern = numberStylePattern + styleCharIndex + 1;
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                negNumberStylePatternLen = ptnLen - styleCharIndex - 1;
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                numberStylePatternLen = styleCharIndex;
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(numElements);
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(rb);
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete ns;
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(ec)) {
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *currRb = ures_open(U_ICUDATA_CURR, loc.getName(), &ec);
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *currencyRes = ures_getByKeyWithFallback(currRb, gCurrUnitPtnTag, NULL, &ec);
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef CURRENCY_PLURAL_INFO_DEBUG
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    std::cout << "in set up\n";
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    StringEnumeration* keywords = fPluralRules->getKeywords(ec);
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(ec)) {
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char* pluralCount;
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while ((pluralCount = keywords->next(NULL, ec)) != NULL) {
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( U_SUCCESS(ec) ) {
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t ptnLen;
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UErrorCode err = U_ZERO_ERROR;
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const UChar* patternChars = ures_getStringByKeyWithFallback(
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    currencyRes, pluralCount, &ptnLen, &err);
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_SUCCESS(err) && ptnLen > 0) {
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    UnicodeString* pattern = new UnicodeString(patternChars, ptnLen);
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef CURRENCY_PLURAL_INFO_DEBUG
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    char result_1[1000];
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    pattern->extract(0, pattern->length(), result_1, "UTF-8");
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    std::cout << "pluralCount: " << pluralCount << "; pattern: " << result_1 << "\n";
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    pattern->findAndReplace(UnicodeString(TRUE, gPart0, 3),
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      UnicodeString(numberStylePattern, numberStylePatternLen));
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    pattern->findAndReplace(UnicodeString(TRUE, gPart1, 3), UnicodeString(TRUE, gTripleCurrencySign, 3));
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (hasSeparator) {
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        UnicodeString negPattern(patternChars, ptnLen);
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        negPattern.findAndReplace(UnicodeString(TRUE, gPart0, 3),
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          UnicodeString(negNumberStylePattern, negNumberStylePatternLen));
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        negPattern.findAndReplace(UnicodeString(TRUE, gPart1, 3), UnicodeString(TRUE, gTripleCurrencySign, 3));
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        pattern->append(gNumberPatternSeparator);
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        pattern->append(negPattern);
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef CURRENCY_PLURAL_INFO_DEBUG
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    pattern->extract(0, pattern->length(), result_1, "UTF-8");
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    std::cout << "pluralCount: " << pluralCount << "; pattern: " << result_1 << "\n";
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    fPluralCountToCurrencyUnitPattern->put(UnicodeString(pluralCount, -1, US_INV), pattern, status);
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete keywords;
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(currencyRes);
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(currRb);
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::deleteHash(Hashtable* hTable)
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( hTable == NULL ) {
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t pos = -1;
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UHashElement* element = NULL;
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while ( (element = hTable->nextElement(pos)) != NULL ) {
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UHashTok valueTok = element->value;
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UnicodeString* value = (UnicodeString*)valueTok.pointer;
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete value;
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete hTable;
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    hTable = NULL;
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgHashtable*
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::initHash(UErrorCode& status) {
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( U_FAILURE(status) ) {
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Hashtable* hTable;
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( (hTable = new Hashtable(TRUE, status)) == NULL ) {
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_MEMORY_ALLOCATION_ERROR;
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( U_FAILURE(status) ) {
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete hTable;
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    hTable->setValueComparator(ValueComparator);
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return hTable;
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCurrencyPluralInfo::copyHash(const Hashtable* source,
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           Hashtable* target,
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           UErrorCode& status) {
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( U_FAILURE(status) ) {
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t pos = -1;
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UHashElement* element = NULL;
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( source ) {
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while ( (element = source->nextElement(pos)) != NULL ) {
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const UHashTok keyTok = element->key;
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const UnicodeString* key = (UnicodeString*)keyTok.pointer;
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const UHashTok valueTok = element->value;
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const UnicodeString* value = (UnicodeString*)valueTok.pointer;
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UnicodeString* copy = new UnicodeString(*value);
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            target->put(UnicodeString(*key), copy, status);
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( U_FAILURE(status) ) {
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return;
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
400