Index: icu46/source/common/servlk.cpp |
=================================================================== |
--- icu46/source/common/servlk.cpp (revision 0) |
+++ icu46/source/common/servlk.cpp (revision 0) |
@@ -0,0 +1,187 @@ |
+/** |
+ ******************************************************************************* |
+ * Copyright (C) 2001-2004, 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 "ucln_cmn.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(" kind: "); |
+ result.append(_kind); |
+ result.append(" primaryID: "); |
+ result.append(_primaryID); |
+ result.append(" fallbackID: "); |
+ result.append(_fallbackID); |
+ result.append(" currentID: "); |
+ result.append(_currentID); |
+ return result; |
+} |
+ |
+UnicodeString& |
+LocaleKey::debugClass(UnicodeString& result) const |
+{ |
+ return result.append("LocaleKey "); |
+} |
+#endif |
+ |
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LocaleKey) |
+ |
+U_NAMESPACE_END |
+ |
+/* !UCONFIG_NO_SERVICE */ |
+#endif |
+ |
+ |
Property changes on: icu46/source/common/servlk.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |