| Index: source/i18n/identifier_info.cpp
|
| diff --git a/source/i18n/identifier_info.cpp b/source/i18n/identifier_info.cpp
|
| index 369a0678c59f41579cbfbf5423d3786bbbef35d7..d4e167c98f18e68b57df5c88485dbb2d89d2c812 100644
|
| --- a/source/i18n/identifier_info.cpp
|
| +++ b/source/i18n/identifier_info.cpp
|
| @@ -1,6 +1,6 @@
|
| /*
|
| **********************************************************************
|
| -* Copyright (C) 2012-2013, International Business Machines
|
| +* Copyright (C) 2012-2014, International Business Machines
|
| * Corporation and others. All Rights Reserved.
|
| **********************************************************************
|
| */
|
| @@ -18,18 +18,17 @@
|
|
|
| U_NAMESPACE_BEGIN
|
|
|
| -#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
|
| +static UnicodeSet *ASCII;
|
| +static ScriptSet *JAPANESE;
|
| +static ScriptSet *CHINESE;
|
| +static ScriptSet *KOREAN;
|
| +static ScriptSet *CONFUSABLE_WITH_LATIN;
|
| +static UInitOnce gIdentifierInfoInitOnce = U_INITONCE_INITIALIZER;
|
|
|
| -static UMutex gInitMutex = U_MUTEX_INITIALIZER;
|
| -static UBool gStaticsAreInitialized = FALSE;
|
|
|
| -UnicodeSet *IdentifierInfo::ASCII;
|
| -ScriptSet *IdentifierInfo::JAPANESE;
|
| -ScriptSet *IdentifierInfo::CHINESE;
|
| -ScriptSet *IdentifierInfo::KOREAN;
|
| -ScriptSet *IdentifierInfo::CONFUSABLE_WITH_LATIN;
|
| -
|
| -UBool IdentifierInfo::cleanup() {
|
| +U_CDECL_BEGIN
|
| +static UBool U_CALLCONV
|
| +IdentifierInfo_cleanup(void) {
|
| delete ASCII;
|
| ASCII = NULL;
|
| delete JAPANESE;
|
| @@ -40,14 +39,30 @@ UBool IdentifierInfo::cleanup() {
|
| KOREAN = NULL;
|
| delete CONFUSABLE_WITH_LATIN;
|
| CONFUSABLE_WITH_LATIN = NULL;
|
| - gStaticsAreInitialized = FALSE;
|
| + gIdentifierInfoInitOnce.reset();
|
| return TRUE;
|
| }
|
|
|
| -U_CDECL_BEGIN
|
| -static UBool U_CALLCONV
|
| -IdentifierInfo_cleanup(void) {
|
| - return IdentifierInfo::cleanup();
|
| +static void U_CALLCONV
|
| +IdentifierInfo_init(UErrorCode &status) {
|
| + ASCII = new UnicodeSet(0, 0x7f);
|
| + JAPANESE = new ScriptSet();
|
| + CHINESE = new ScriptSet();
|
| + KOREAN = new ScriptSet();
|
| + CONFUSABLE_WITH_LATIN = new ScriptSet();
|
| + if (ASCII == NULL || JAPANESE == NULL || CHINESE == NULL || KOREAN == NULL
|
| + || CONFUSABLE_WITH_LATIN == NULL) {
|
| + status = U_MEMORY_ALLOCATION_ERROR;
|
| + return;
|
| + }
|
| + ASCII->freeze();
|
| + JAPANESE->set(USCRIPT_LATIN, status).set(USCRIPT_HAN, status).set(USCRIPT_HIRAGANA, status)
|
| + .set(USCRIPT_KATAKANA, status);
|
| + CHINESE->set(USCRIPT_LATIN, status).set(USCRIPT_HAN, status).set(USCRIPT_BOPOMOFO, status);
|
| + KOREAN->set(USCRIPT_LATIN, status).set(USCRIPT_HAN, status).set(USCRIPT_HANGUL, status);
|
| + CONFUSABLE_WITH_LATIN->set(USCRIPT_CYRILLIC, status).set(USCRIPT_GREEK, status)
|
| + .set(USCRIPT_CHEROKEE, status);
|
| + ucln_i18n_registerCleanup(UCLN_I18N_IDENTIFIER_INFO, IdentifierInfo_cleanup);
|
| }
|
| U_CDECL_END
|
|
|
| @@ -55,33 +70,11 @@ U_CDECL_END
|
| IdentifierInfo::IdentifierInfo(UErrorCode &status):
|
| fIdentifier(NULL), fRequiredScripts(NULL), fScriptSetSet(NULL),
|
| fCommonAmongAlternates(NULL), fNumerics(NULL), fIdentifierProfile(NULL) {
|
| + umtx_initOnce(gIdentifierInfoInitOnce, &IdentifierInfo_init, status);
|
| if (U_FAILURE(status)) {
|
| return;
|
| }
|
| - {
|
| - Mutex lock(&gInitMutex);
|
| - if (!gStaticsAreInitialized) {
|
| - ASCII = new UnicodeSet(0, 0x7f);
|
| - JAPANESE = new ScriptSet();
|
| - CHINESE = new ScriptSet();
|
| - KOREAN = new ScriptSet();
|
| - CONFUSABLE_WITH_LATIN = new ScriptSet();
|
| - if (ASCII == NULL || JAPANESE == NULL || CHINESE == NULL || KOREAN == NULL
|
| - || CONFUSABLE_WITH_LATIN == NULL) {
|
| - status = U_MEMORY_ALLOCATION_ERROR;
|
| - return;
|
| - }
|
| - ASCII->freeze();
|
| - JAPANESE->set(USCRIPT_LATIN, status).set(USCRIPT_HAN, status).set(USCRIPT_HIRAGANA, status)
|
| - .set(USCRIPT_KATAKANA, status);
|
| - CHINESE->set(USCRIPT_LATIN, status).set(USCRIPT_HAN, status).set(USCRIPT_BOPOMOFO, status);
|
| - KOREAN->set(USCRIPT_LATIN, status).set(USCRIPT_HAN, status).set(USCRIPT_HANGUL, status);
|
| - CONFUSABLE_WITH_LATIN->set(USCRIPT_CYRILLIC, status).set(USCRIPT_GREEK, status)
|
| - .set(USCRIPT_CHEROKEE, status);
|
| - ucln_i18n_registerCleanup(UCLN_I18N_IDENTIFIER_INFO, IdentifierInfo_cleanup);
|
| - gStaticsAreInitialized = TRUE;
|
| - }
|
| - }
|
| +
|
| fIdentifier = new UnicodeString();
|
| fRequiredScripts = new ScriptSet();
|
| fScriptSetSet = uhash_open(uhash_hashScriptSet, uhash_compareScriptSet, NULL, &status);
|
| @@ -142,7 +135,7 @@ IdentifierInfo &IdentifierInfo::setIdentifier(const UnicodeString &identifier, U
|
| fNumerics->add(cp - (UChar32)u_getNumericValue(cp));
|
| }
|
| UScriptCode extensions[500];
|
| - int32_t extensionsCount = uscript_getScriptExtensions(cp, extensions, LENGTHOF(extensions), &status);
|
| + int32_t extensionsCount = uscript_getScriptExtensions(cp, extensions, UPRV_LENGTHOF(extensions), &status);
|
| if (U_FAILURE(status)) {
|
| return *this;
|
| }
|
| @@ -247,7 +240,7 @@ URestrictionLevel IdentifierInfo::getRestrictionLevel(UErrorCode &status) const
|
| int32_t cardinalityPlus = fRequiredScripts->countMembers() +
|
| (fCommonAmongAlternates->countMembers() == 0 ? uhash_count(fScriptSetSet) : 1);
|
| if (cardinalityPlus < 2) {
|
| - return USPOOF_HIGHLY_RESTRICTIVE;
|
| + return USPOOF_SINGLE_SCRIPT_RESTRICTIVE;
|
| }
|
| if (containsWithAlternates(*JAPANESE, *fRequiredScripts) || containsWithAlternates(*CHINESE, *fRequiredScripts)
|
| || containsWithAlternates(*KOREAN, *fRequiredScripts)) {
|
|
|