]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/common/servlk.cpp
ICU-8.11.tar.gz
[apple/icu.git] / icuSources / common / servlk.cpp
diff --git a/icuSources/common/servlk.cpp b/icuSources/common/servlk.cpp
new file mode 100644 (file)
index 0000000..b620414
--- /dev/null
@@ -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
+
+