// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* * Copyright (C) 2001-2014, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * ******************************************************************************* */ #include "unicode/utypes.h" #if !UCONFIG_NO_SERVICE #include "unicode/resbund.h" #include "uresimp.h" #include "cmemory.h" #include "servloc.h" #include "ustrfmt.h" #include "uhash.h" #include "charstr.h" #include "uassert.h" #define UNDERSCORE_CHAR ((UChar)0x005f) #define AT_SIGN_CHAR ((UChar)64) #define PERIOD_CHAR ((UChar)46) U_NAMESPACE_BEGIN LocaleKey* LocaleKey::createWithCanonicalFallback(const UnicodeString* primaryID, const UnicodeString* canonicalFallbackID, UErrorCode& status) { return LocaleKey::createWithCanonicalFallback(primaryID, canonicalFallbackID, KIND_ANY, status); } LocaleKey* LocaleKey::createWithCanonicalFallback(const UnicodeString* primaryID, const UnicodeString* canonicalFallbackID, int32_t kind, UErrorCode& status) { if (primaryID == NULL || U_FAILURE(status)) { return NULL; } UnicodeString canonicalPrimaryID; LocaleUtility::canonicalLocaleString(primaryID, canonicalPrimaryID); return new LocaleKey(*primaryID, canonicalPrimaryID, canonicalFallbackID, kind); } LocaleKey::LocaleKey(const UnicodeString& primaryID, const UnicodeString& canonicalPrimaryID, const UnicodeString* canonicalFallbackID, int32_t kind) : ICUServiceKey(primaryID) , _kind(kind) , _primaryID(canonicalPrimaryID) , _fallbackID() , _currentID() { _fallbackID.setToBogus(); if (_primaryID.length() != 0) { if (canonicalFallbackID != NULL && _primaryID != *canonicalFallbackID) { _fallbackID = *canonicalFallbackID; } } _currentID = _primaryID; } LocaleKey::~LocaleKey() {} UnicodeString& LocaleKey::prefix(UnicodeString& result) const { if (_kind != KIND_ANY) { UChar buffer[64]; uprv_itou(buffer, 64, _kind, 10, 0); UnicodeString temp(buffer); result.append(temp); } return result; } int32_t LocaleKey::kind() const { return _kind; } UnicodeString& LocaleKey::canonicalID(UnicodeString& result) const { return result.append(_primaryID); } UnicodeString& LocaleKey::currentID(UnicodeString& result) const { if (!_currentID.isBogus()) { result.append(_currentID); } return result; } UnicodeString& LocaleKey::currentDescriptor(UnicodeString& result) const { if (!_currentID.isBogus()) { prefix(result).append(PREFIX_DELIMITER).append(_currentID); } else { result.setToBogus(); } return result; } Locale& LocaleKey::canonicalLocale(Locale& result) const { return LocaleUtility::initLocaleFromName(_primaryID, result); } Locale& LocaleKey::currentLocale(Locale& result) const { return LocaleUtility::initLocaleFromName(_currentID, result); } UBool LocaleKey::fallback() { if (!_currentID.isBogus()) { int x = _currentID.lastIndexOf(UNDERSCORE_CHAR); if (x != -1) { _currentID.remove(x); // truncate current or fallback, whichever we're pointing to return true; } if (!_fallbackID.isBogus()) { _currentID = _fallbackID; _fallbackID.setToBogus(); return true; } if (_currentID.length() > 0) { _currentID.remove(0); // completely truncate return true; } _currentID.setToBogus(); } return false; } UBool LocaleKey::isFallbackOf(const UnicodeString& id) const { UnicodeString temp(id); parseSuffix(temp); return temp.indexOf(_primaryID) == 0 && (temp.length() == _primaryID.length() || temp.charAt(_primaryID.length()) == UNDERSCORE_CHAR); } #ifdef SERVICE_DEBUG UnicodeString& LocaleKey::debug(UnicodeString& result) const { ICUServiceKey::debug(result); result.append((UnicodeString)" kind: "); result.append(_kind); result.append((UnicodeString)" primaryID: "); result.append(_primaryID); result.append((UnicodeString)" fallbackID: "); result.append(_fallbackID); result.append((UnicodeString)" currentID: "); result.append(_currentID); return result; } UnicodeString& LocaleKey::debugClass(UnicodeString& result) const { return result.append((UnicodeString)"LocaleKey "); } #endif UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKey) U_NAMESPACE_END /* !UCONFIG_NO_SERVICE */ #endif