Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Unified Diff: source/common/ucurr.cpp

Issue 2440913002: Update ICU to 58.1
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « source/common/ucol_swp.cpp ('k') | source/common/ucurrimp.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « source/common/ucol_swp.cpp ('k') | source/common/ucurrimp.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698