Index: source/common/uloc.cpp |
diff --git a/source/common/uloc.cpp b/source/common/uloc.cpp |
index dc17e7180afdf11f7fd8f2f5791bd81af7db44d2..88a221c6024fe370aa8cab459d0509450da22a1b 100644 |
--- a/source/common/uloc.cpp |
+++ b/source/common/uloc.cpp |
@@ -1,6 +1,6 @@ |
/* |
********************************************************************** |
-* Copyright (C) 1997-2013, International Business Machines |
+* Copyright (C) 1997-2014, International Business Machines |
* Corporation and others. All Rights Reserved. |
********************************************************************** |
* |
@@ -38,7 +38,6 @@ |
#include "umutex.h" |
#include "cstring.h" |
#include "cmemory.h" |
-#include "ucln_cmn.h" |
#include "locmap.h" |
#include "uarrsort.h" |
#include "uenumimp.h" |
@@ -2525,4 +2524,104 @@ uloc_acceptLanguage(char *result, int32_t resultAvailable, |
return -1; |
} |
+U_CAPI const char* U_EXPORT2 |
+uloc_toUnicodeLocaleKey(const char* keyword) |
+{ |
+ const char* bcpKey = ulocimp_toBcpKey(keyword); |
+ if (bcpKey == NULL && ultag_isUnicodeLocaleKey(keyword, -1)) { |
+ // unknown keyword, but syntax is fine.. |
+ return keyword; |
+ } |
+ return bcpKey; |
+} |
+ |
+U_CAPI const char* U_EXPORT2 |
+uloc_toUnicodeLocaleType(const char* keyword, const char* value) |
+{ |
+ const char* bcpType = ulocimp_toBcpType(keyword, value, NULL, NULL); |
+ if (bcpType == NULL && ultag_isUnicodeLocaleType(value, -1)) { |
+ // unknown keyword, but syntax is fine.. |
+ return value; |
+ } |
+ return bcpType; |
+} |
+ |
+#define UPRV_ISDIGIT(c) (((c) >= '0') && ((c) <= '9')) |
+#define UPRV_ISALPHANUM(c) (uprv_isASCIILetter(c) || UPRV_ISDIGIT(c) ) |
+ |
+static UBool |
+isWellFormedLegacyKey(const char* legacyKey) |
+{ |
+ const char* p = legacyKey; |
+ while (*p) { |
+ if (!UPRV_ISALPHANUM(*p)) { |
+ return FALSE; |
+ } |
+ p++; |
+ } |
+ return TRUE; |
+} |
+ |
+static UBool |
+isWellFormedLegacyType(const char* legacyType) |
+{ |
+ const char* p = legacyType; |
+ int32_t alphaNumLen = 0; |
+ while (*p) { |
+ if (*p == '_' || *p == '/' || *p == '-') { |
+ if (alphaNumLen == 0) { |
+ return FALSE; |
+ } |
+ alphaNumLen = 0; |
+ } else if (UPRV_ISALPHANUM(*p)) { |
+ alphaNumLen++; |
+ } else { |
+ return FALSE; |
+ } |
+ p++; |
+ } |
+ return (alphaNumLen != 0); |
+} |
+ |
+U_CAPI const char* U_EXPORT2 |
+uloc_toLegacyKey(const char* keyword) |
+{ |
+ const char* legacyKey = ulocimp_toLegacyKey(keyword); |
+ if (legacyKey == NULL) { |
+ // Checks if the specified locale key is well-formed with the legacy locale syntax. |
+ // |
+ // Note: |
+ // Neither ICU nor LDML/CLDR provides the definition of keyword syntax. |
+ // However, a key should not contain '=' obviously. For now, all existing |
+ // keys are using ASCII alphabetic letters only. We won't add any new key |
+ // that is not compatible with the BCP 47 syntax. Therefore, we assume |
+ // a valid key consist from [0-9a-zA-Z], no symbols. |
+ if (isWellFormedLegacyKey(keyword)) { |
+ return keyword; |
+ } |
+ } |
+ return legacyKey; |
+} |
+ |
+U_CAPI const char* U_EXPORT2 |
+uloc_toLegacyType(const char* keyword, const char* value) |
+{ |
+ const char* legacyType = ulocimp_toLegacyType(keyword, value, NULL, NULL); |
+ if (legacyType == NULL) { |
+ // Checks if the specified locale type is well-formed with the legacy locale syntax. |
+ // |
+ // Note: |
+ // Neither ICU nor LDML/CLDR provides the definition of keyword syntax. |
+ // However, a type should not contain '=' obviously. For now, all existing |
+ // types are using ASCII alphabetic letters with a few symbol letters. We won't |
+ // add any new type that is not compatible with the BCP 47 syntax except timezone |
+ // IDs. For now, we assume a valid type start with [0-9a-zA-Z], but may contain |
+ // '-' '_' '/' in the middle. |
+ if (isWellFormedLegacyType(value)) { |
+ return value; |
+ } |
+ } |
+ return legacyType; |
+} |
+ |
/*eof*/ |