| Index: source/common/ucurr.cpp
|
| diff --git a/source/i18n/ucurr.cpp b/source/common/ucurr.cpp
|
| similarity index 94%
|
| rename from source/i18n/ucurr.cpp
|
| rename to source/common/ucurr.cpp
|
| index cb955659f196cf36c9f9627c512bc80197e2c4ee..db381733e6664cb745a50f4c26b63b036c023937 100644
|
| --- a/source/i18n/ucurr.cpp
|
| +++ b/source/common/ucurr.cpp
|
| @@ -1,6 +1,8 @@
|
| +// Copyright (C) 2016 and later: Unicode, Inc. and others.
|
| +// License & terms of use: http://www.unicode.org/copyright.html
|
| /*
|
| **********************************************************************
|
| -* Copyright (c) 2002-2014, International Business Machines
|
| +* Copyright (c) 2002-2016, International Business Machines
|
| * Corporation and others. All Rights Reserved.
|
| **********************************************************************
|
| */
|
| @@ -13,20 +15,20 @@
|
| #include "unicode/locid.h"
|
| #include "unicode/ures.h"
|
| #include "unicode/ustring.h"
|
| -#include "unicode/choicfmt.h"
|
| #include "unicode/parsepos.h"
|
| #include "ustr_imp.h"
|
| #include "cmemory.h"
|
| #include "cstring.h"
|
| #include "uassert.h"
|
| #include "umutex.h"
|
| -#include "ucln_in.h"
|
| +#include "ucln_cmn.h"
|
| #include "uenumimp.h"
|
| #include "uhash.h"
|
| #include "hash.h"
|
| #include "uresimp.h"
|
| #include "ulist.h"
|
| #include "ureslocs.h"
|
| +#include "ulocimp.h"
|
|
|
| //#define UCURR_DEBUG_EQUIV 1
|
| #ifdef UCURR_DEBUG_EQUIV
|
| @@ -56,7 +58,7 @@ static const int32_t LAST_RESORT_DATA[] = { 2, 0, 2, 0 };
|
| static const int32_t POW10[] = { 1, 10, 100, 1000, 10000, 100000,
|
| 1000000, 10000000, 100000000, 1000000000 };
|
|
|
| -static const int32_t MAX_POW10 = (sizeof(POW10)/sizeof(POW10[0])) - 1;
|
| +static const int32_t MAX_POW10 = UPRV_LENGTHOF(POW10) - 1;
|
|
|
| // Defines equivalent currency symbols.
|
| static const char *EQUIV_CURRENCY_SYMBOLS[][2] = {
|
| @@ -103,12 +105,6 @@ static const char VAR_DELIM_STR[] = "_";
|
| static const char CURRENCIES[] = "Currencies";
|
| static const char CURRENCYPLURALS[] = "CurrencyPlurals";
|
|
|
| -// Marker character indicating that a display name is a ChoiceFormat
|
| -// pattern. Strings that start with one mark are ChoiceFormat
|
| -// patterns. Strings that start with 2 marks are static strings, and
|
| -// the first mark is deleted.
|
| -static const UChar CHOICE_FORMAT_MARK = 0x003D; // Equals sign
|
| -
|
| static const UChar EUR_STR[] = {0x0045,0x0055,0x0052,0};
|
|
|
| // ISO codes mapping table
|
| @@ -123,7 +119,7 @@ U_NAMESPACE_BEGIN
|
|
|
| // EquivIterator iterates over all strings that are equivalent to a given
|
| // string, s. Note that EquivIterator will never yield s itself.
|
| -class EquivIterator : icu::UMemory {
|
| +class EquivIterator : public icu::UMemory {
|
| public:
|
| // Constructor. hash stores the equivalence relationships; s is the string
|
| // for which we find equivalent strings.
|
| @@ -374,7 +370,7 @@ idForLocale(const char* locale, char* countryAndVariant, int capacity, UErrorCod
|
| // Extract the country name and variant name. We only
|
| // recognize two variant names, EURO and PREEURO.
|
| char variant[ULOC_FULLNAME_CAPACITY];
|
| - uloc_getCountry(locale, countryAndVariant, capacity, ec);
|
| + ulocimp_getRegionForSupplementalData(locale, FALSE, countryAndVariant, capacity, ec);
|
| uloc_getVariant(locale, variant, sizeof(variant), ec);
|
| if (variant[0] != 0) {
|
| variantType = (uint32_t)(0 == uprv_strcmp(variant, VAR_EURO))
|
| @@ -420,7 +416,7 @@ struct CReg : public icu::UMemory {
|
| }
|
| uprv_strncpy(id, _id, len);
|
| id[len] = 0;
|
| - uprv_memcpy(iso, _iso, ISO_CURRENCY_CODE_LENGTH * sizeof(const UChar));
|
| + u_memcpy(iso, _iso, ISO_CURRENCY_CODE_LENGTH);
|
| iso[ISO_CURRENCY_CODE_LENGTH] = 0;
|
| }
|
|
|
| @@ -432,7 +428,7 @@ struct CReg : public icu::UMemory {
|
| umtx_lock(&gCRegLock);
|
| if (!gCRegHead) {
|
| /* register for the first time */
|
| - ucln_i18n_registerCleanup(UCLN_I18N_CURRENCY, currency_cleanup);
|
| + ucln_common_registerCleanup(UCLN_COMMON_CURRENCY, currency_cleanup);
|
| }
|
| n->next = gCRegHead;
|
| gCRegHead = n;
|
| @@ -469,7 +465,7 @@ struct CReg : public icu::UMemory {
|
| CReg* p = gCRegHead;
|
|
|
| /* register cleanup of the mutex */
|
| - ucln_i18n_registerCleanup(UCLN_I18N_CURRENCY, currency_cleanup);
|
| + ucln_common_registerCleanup(UCLN_COMMON_CURRENCY, currency_cleanup);
|
| while (p) {
|
| if (uprv_strcmp(id, p->id) == 0) {
|
| result = p->iso;
|
| @@ -740,20 +736,11 @@ ucurr_getName(const UChar* currency,
|
| }
|
| }
|
|
|
| - // Determine if this is a ChoiceFormat pattern. One leading mark
|
| - // indicates a ChoiceFormat. Two indicates a static string that
|
| - // starts with a mark. In either case, the first mark is ignored,
|
| - // if present. Marks in the rest of the string have no special
|
| - // meaning.
|
| + // We no longer support choice format data in names. Data should not contain
|
| + // choice patterns.
|
| *isChoiceFormat = FALSE;
|
| if (U_SUCCESS(ec2)) {
|
| U_ASSERT(s != NULL);
|
| - int32_t i=0;
|
| - while (i < *len && s[i] == CHOICE_FORMAT_MARK && i < 2) {
|
| - ++i;
|
| - }
|
| - *isChoiceFormat = (i == 1);
|
| - if (i != 0) ++s; // Skip over first mark
|
| return s;
|
| }
|
|
|
| @@ -915,26 +902,10 @@ getCurrencyNameCount(const char* loc, int32_t* total_currency_name_count, int32_
|
| UResourceBundle* names = ures_getByIndex(curr, i, NULL, &ec2);
|
| int32_t len;
|
| s = ures_getStringByIndex(names, UCURR_SYMBOL_NAME, &len, &ec2);
|
| - UBool isChoice = FALSE;
|
| - if (len > 0 && s[0] == CHOICE_FORMAT_MARK) {
|
| - ++s;
|
| - --len;
|
| - if (len > 0 && s[0] != CHOICE_FORMAT_MARK) {
|
| - isChoice = TRUE;
|
| - }
|
| - }
|
| - if (isChoice) {
|
| - ChoiceFormat fmt(UnicodeString(TRUE, s, len), ec2);
|
| - int32_t fmt_count;
|
| - fmt.getFormats(fmt_count);
|
| - *total_currency_symbol_count += fmt_count;
|
| - } else {
|
| - ++(*total_currency_symbol_count); // currency symbol
|
| - if (currencySymbolsEquiv != NULL) {
|
| - *total_currency_symbol_count += countEquivalent(*currencySymbolsEquiv, UnicodeString(TRUE, s, len));
|
| - }
|
| + ++(*total_currency_symbol_count); // currency symbol
|
| + if (currencySymbolsEquiv != NULL) {
|
| + *total_currency_symbol_count += countEquivalent(*currencySymbolsEquiv, UnicodeString(TRUE, s, len));
|
| }
|
| -
|
| ++(*total_currency_symbol_count); // iso code
|
| ++(*total_currency_name_count); // long name
|
| ures_close(names);
|
| @@ -969,7 +940,7 @@ toUpperCase(const UChar* source, int32_t len, const char* locale) {
|
| dest = (UChar*)uprv_malloc(sizeof(UChar) * MAX(destLen, len));
|
| u_strToUpper(dest, destLen, source, len, locale, &ec);
|
| if (U_FAILURE(ec)) {
|
| - uprv_memcpy(dest, source, sizeof(UChar) * len);
|
| + u_memcpy(dest, source, len);
|
| }
|
| return dest;
|
| }
|
| @@ -1047,44 +1018,21 @@ collectCurrencyNames(const char* locale,
|
| uhash_put(currencyIsoCodes, iso, iso, &ec3);
|
| }
|
| }
|
| - UBool isChoice = FALSE;
|
| - if (len > 0 && s[0] == CHOICE_FORMAT_MARK) {
|
| - ++s;
|
| - --len;
|
| - if (len > 0 && s[0] != CHOICE_FORMAT_MARK) {
|
| - isChoice = TRUE;
|
| - }
|
| - }
|
| - if (isChoice) {
|
| - ChoiceFormat fmt(UnicodeString(TRUE, s, len), ec2);
|
| - int32_t fmt_count;
|
| - const UnicodeString* formats = fmt.getFormats(fmt_count);
|
| - for (int i = 0; i < fmt_count; ++i) {
|
| - // put iso, formats[i]; into array
|
| - int32_t length = formats[i].length();
|
| - UChar* name = (UChar*)uprv_malloc(sizeof(UChar)*length);
|
| - formats[i].extract(0, length, name);
|
| + // Add currency symbol.
|
| + (*currencySymbols)[*total_currency_symbol_count].IsoCode = iso;
|
| + (*currencySymbols)[*total_currency_symbol_count].currencyName = (UChar*)s;
|
| + (*currencySymbols)[*total_currency_symbol_count].flag = 0;
|
| + (*currencySymbols)[(*total_currency_symbol_count)++].currencyNameLen = len;
|
| + // Add equivalent symbols
|
| + if (currencySymbolsEquiv != NULL) {
|
| + UnicodeString str(TRUE, s, len);
|
| + icu::EquivIterator iter(*currencySymbolsEquiv, str);
|
| + const UnicodeString *symbol;
|
| + while ((symbol = iter.next()) != NULL) {
|
| (*currencySymbols)[*total_currency_symbol_count].IsoCode = iso;
|
| - (*currencySymbols)[*total_currency_symbol_count].currencyName = name;
|
| - (*currencySymbols)[*total_currency_symbol_count].flag = NEED_TO_BE_DELETED;
|
| - (*currencySymbols)[(*total_currency_symbol_count)++].currencyNameLen = length;
|
| - }
|
| - } else {
|
| - // Add currency symbol.
|
| - (*currencySymbols)[*total_currency_symbol_count].IsoCode = iso;
|
| - (*currencySymbols)[*total_currency_symbol_count].currencyName = (UChar*)s;
|
| - (*currencySymbols)[*total_currency_symbol_count].flag = 0;
|
| - (*currencySymbols)[(*total_currency_symbol_count)++].currencyNameLen = len;
|
| - // Add equivalent symbols
|
| - if (currencySymbolsEquiv != NULL) {
|
| - icu::EquivIterator iter(*currencySymbolsEquiv, UnicodeString(TRUE, s, len));
|
| - const UnicodeString *symbol;
|
| - while ((symbol = iter.next()) != NULL) {
|
| - (*currencySymbols)[*total_currency_symbol_count].IsoCode = iso;
|
| - (*currencySymbols)[*total_currency_symbol_count].currencyName = (UChar*) symbol->getBuffer();
|
| - (*currencySymbols)[*total_currency_symbol_count].flag = 0;
|
| - (*currencySymbols)[(*total_currency_symbol_count)++].currencyNameLen = symbol->length();
|
| - }
|
| + (*currencySymbols)[*total_currency_symbol_count].currencyName = (UChar*) symbol->getBuffer();
|
| + (*currencySymbols)[*total_currency_symbol_count].flag = 0;
|
| + (*currencySymbols)[(*total_currency_symbol_count)++].currencyNameLen = symbol->length();
|
| }
|
| }
|
|
|
| @@ -1450,7 +1398,7 @@ currency_cache_cleanup(void) {
|
| }
|
|
|
|
|
| -U_CFUNC void
|
| +U_CAPI void
|
| uprv_parseCurrency(const char* locale,
|
| const icu::UnicodeString& text,
|
| icu::ParsePosition& pos,
|
| @@ -1528,8 +1476,7 @@ uprv_parseCurrency(const char* locale,
|
| cacheEntry->totalCurrencySymbolCount = total_currency_symbol_count;
|
| cacheEntry->refCount = 2; // one for cache, one for reference
|
| currentCacheEntryIndex = (currentCacheEntryIndex + 1) % CURRENCY_NAME_CACHE_NUM;
|
| - ucln_i18n_registerCleanup(UCLN_I18N_CURRENCY, currency_cache_cleanup);
|
| -
|
| + ucln_common_registerCleanup(UCLN_COMMON_CURRENCY, currency_cache_cleanup);
|
| } else {
|
| deleteCurrencyNames(currencyNames, total_currency_name_count);
|
| deleteCurrencyNames(currencySymbols, total_currency_symbol_count);
|
| @@ -1606,7 +1553,7 @@ uprv_parseCurrency(const char* locale,
|
| * This is used for backward compatibility with old currency logic in
|
| * DecimalFormat and DecimalFormatSymbols.
|
| */
|
| -U_CFUNC void
|
| +U_CAPI void
|
| uprv_getStaticCurrencyName(const UChar* iso, const char* loc,
|
| icu::UnicodeString& result, UErrorCode& ec)
|
| {
|
| @@ -1617,19 +1564,7 @@ uprv_getStaticCurrencyName(const UChar* iso, const char* loc,
|
| const UChar* currname = ucurr_getName(iso, loc, UCURR_SYMBOL_NAME,
|
| &isChoiceFormat, &len, &ec);
|
| if (U_SUCCESS(ec)) {
|
| - // If this is a ChoiceFormat currency, then format an
|
| - // arbitrary value; pick something != 1; more common.
|
| - result.truncate(0);
|
| - if (isChoiceFormat) {
|
| - ChoiceFormat f(UnicodeString(TRUE, currname, len), ec);
|
| - if (U_SUCCESS(ec)) {
|
| - f.format(2.0, result);
|
| - } else {
|
| - result.setTo(iso, -1);
|
| - }
|
| - } else {
|
| - result.setTo(currname, -1);
|
| - }
|
| + result.setTo(currname, len);
|
| }
|
| }
|
|
|
| @@ -2044,7 +1979,7 @@ ucurr_nextCurrencyList(UEnumeration *enumerator,
|
| UCurrencyContext *myContext = (UCurrencyContext *)(enumerator->context);
|
|
|
| /* Find the next in the list that matches the type we are looking for. */
|
| - while (myContext->listIdx < (sizeof(gCurrencyList)/sizeof(gCurrencyList[0]))-1) {
|
| + while (myContext->listIdx < UPRV_LENGTHOF(gCurrencyList)-1) {
|
| const struct CurrencyList *currItem = &gCurrencyList[myContext->listIdx++];
|
| if (UCURR_MATCHES_BITMASK(currItem->currType, myContext->currType))
|
| {
|
| @@ -2167,7 +2102,7 @@ U_CDECL_END
|
|
|
| static void U_CALLCONV initIsoCodes(UErrorCode &status) {
|
| U_ASSERT(gIsoCodes == NULL);
|
| - ucln_i18n_registerCleanup(UCLN_I18N_CURRENCY, currency_cleanup);
|
| + ucln_common_registerCleanup(UCLN_COMMON_CURRENCY, currency_cleanup);
|
|
|
| UHashtable *isoCodes = uhash_open(uhash_hashUChars, uhash_compareUChars, NULL, &status);
|
| if (U_FAILURE(status)) {
|
| @@ -2188,7 +2123,7 @@ static void populateCurrSymbolsEquiv(icu::Hashtable *hash, UErrorCode &status) {
|
| if (U_FAILURE(status)) {
|
| return;
|
| }
|
| - int32_t length = sizeof(EQUIV_CURRENCY_SYMBOLS) / sizeof(EQUIV_CURRENCY_SYMBOLS[0]);
|
| + int32_t length = UPRV_LENGTHOF(EQUIV_CURRENCY_SYMBOLS);
|
| for (int32_t i = 0; i < length; ++i) {
|
| icu::UnicodeString lhs(EQUIV_CURRENCY_SYMBOLS[i][0], -1, US_INV);
|
| icu::UnicodeString rhs(EQUIV_CURRENCY_SYMBOLS[i][1], -1, US_INV);
|
| @@ -2202,7 +2137,7 @@ static void populateCurrSymbolsEquiv(icu::Hashtable *hash, UErrorCode &status) {
|
| static void U_CALLCONV initCurrSymbolsEquiv() {
|
| U_ASSERT(gCurrSymbolsEquiv == NULL);
|
| UErrorCode status = U_ZERO_ERROR;
|
| - ucln_i18n_registerCleanup(UCLN_I18N_CURRENCY, currency_cleanup);
|
| + ucln_common_registerCleanup(UCLN_COMMON_CURRENCY, currency_cleanup);
|
| icu::Hashtable *temp = new icu::Hashtable(status);
|
| if (temp == NULL) {
|
| return;
|
| @@ -2541,15 +2476,8 @@ static const UEnumeration defaultKeywordValues = {
|
|
|
| U_CAPI UEnumeration *U_EXPORT2 ucurr_getKeywordValuesForLocale(const char *key, const char *locale, UBool commonlyUsed, UErrorCode* status) {
|
| // Resolve region
|
| - char prefRegion[ULOC_FULLNAME_CAPACITY] = "";
|
| - int32_t prefRegionLength = 0;
|
| - prefRegionLength = uloc_getCountry(locale, prefRegion, sizeof(prefRegion), status);
|
| - if (prefRegionLength == 0) {
|
| - char loc[ULOC_FULLNAME_CAPACITY] = "";
|
| - uloc_addLikelySubtags(locale, loc, sizeof(loc), status);
|
| -
|
| - /*prefRegionLength = */ uloc_getCountry(loc, prefRegion, sizeof(prefRegion), status);
|
| - }
|
| + char prefRegion[ULOC_COUNTRY_CAPACITY];
|
| + ulocimp_getRegionForSupplementalData(locale, TRUE, prefRegion, sizeof(prefRegion), status);
|
|
|
| // Read value from supplementalData
|
| UList *values = ulist_createEmptyList(status);
|
|
|