Index: source/common/uloc_keytype.cpp |
diff --git a/source/common/uloc_keytype.cpp b/source/common/uloc_keytype.cpp |
index f8f1f1f35dcf036451eec300cc2ed6b81a479ba8..fcb066c0dd72e676eca25463308c1180c7928f7e 100644 |
--- a/source/common/uloc_keytype.cpp |
+++ b/source/common/uloc_keytype.cpp |
@@ -1,6 +1,8 @@ |
+// Copyright (C) 2016 and later: Unicode, Inc. and others. |
+// License & terms of use: http://www.unicode.org/copyright.html |
/* |
********************************************************************** |
-* Copyright (C) 2014, International Business Machines |
+* Copyright (C) 2014-2016, International Business Machines |
* Corporation and others. All Rights Reserved. |
********************************************************************** |
*/ |
@@ -13,6 +15,7 @@ |
#include "umutex.h" |
#include "uresimp.h" |
#include "uvector.h" |
+#include "udataswp.h" /* for InvChar functions */ |
static UHashtable* gLocExtKeyMap = NULL; |
static icu::UInitOnce gLocExtKeyMapInitOnce = U_INITONCE_INITIALIZER; |
@@ -24,7 +27,8 @@ static icu::UVector* gLocExtTypeEntries = NULL; |
typedef enum { |
SPECIALTYPE_NONE = 0, |
SPECIALTYPE_CODEPOINTS = 1, |
- SPECIALTYPE_REORDER_CODE = 2 |
+ SPECIALTYPE_REORDER_CODE = 2, |
+ SPECIALTYPE_RG_KEY_VALUE = 4 |
} SpecialType; |
typedef struct LocExtKeyData { |
@@ -215,6 +219,10 @@ initFromResourceBundle(UErrorCode& sts) { |
specialTypes |= SPECIALTYPE_REORDER_CODE; |
continue; |
} |
+ if (uprv_strcmp(legacyTypeId, "RG_KEY_VALUE") == 0) { |
+ specialTypes |= SPECIALTYPE_RG_KEY_VALUE; |
+ continue; |
+ } |
if (isTZ) { |
// a timezone key uses a colon instead of a slash in the resource. |
@@ -307,7 +315,7 @@ initFromResourceBundle(UErrorCode& sts) { |
break; |
} |
// check if this is an alias of canoncal legacy type |
- if (uprv_compareInvAscii(NULL, legacyTypeId, -1, to, toLen) == 0) { |
+ if (uprv_compareInvWithUChar(NULL, legacyTypeId, -1, to, toLen) == 0) { |
const char* from = ures_getKey(typeAliasDataEntry.getAlias()); |
if (isTZ) { |
// replace colon with slash if necessary |
@@ -357,7 +365,7 @@ initFromResourceBundle(UErrorCode& sts) { |
break; |
} |
// check if this is an alias of bcp type |
- if (uprv_compareInvAscii(NULL, bcpTypeId, -1, to, toLen) == 0) { |
+ if (uprv_compareInvWithUChar(NULL, bcpTypeId, -1, to, toLen) == 0) { |
const char* from = ures_getKey(bcpTypeAliasDataEntry.getAlias()); |
uhash_put(typeDataMap, (void*)from, t, &sts); |
} |
@@ -450,6 +458,23 @@ isSpecialTypeReorderCode(const char* val) { |
return (subtagLen >=3 && subtagLen <=8); |
} |
+static UBool |
+isSpecialTypeRgKeyValue(const char* val) { |
+ int32_t subtagLen = 0; |
+ const char* p = val; |
+ while (*p) { |
+ if ( (subtagLen < 2 && uprv_isASCIILetter(*p)) || |
+ (subtagLen >= 2 && (*p == 'Z' || *p == 'z')) ) { |
+ subtagLen++; |
+ } else { |
+ return FALSE; |
+ } |
+ p++; |
+ } |
+ return (subtagLen == 6); |
+ return TRUE; |
+} |
+ |
U_CFUNC const char* |
ulocimp_toBcpKey(const char* key) { |
if (!init()) { |
@@ -506,6 +531,9 @@ ulocimp_toBcpType(const char* key, const char* type, UBool* isKnownKey, UBool* i |
if (!matched && keyData->specialTypes & SPECIALTYPE_REORDER_CODE) { |
matched = isSpecialTypeReorderCode(type); |
} |
+ if (!matched && keyData->specialTypes & SPECIALTYPE_RG_KEY_VALUE) { |
+ matched = isSpecialTypeRgKeyValue(type); |
+ } |
if (matched) { |
if (isSpecialType != NULL) { |
*isSpecialType = TRUE; |
@@ -548,6 +576,9 @@ ulocimp_toLegacyType(const char* key, const char* type, UBool* isKnownKey, UBool |
if (!matched && keyData->specialTypes & SPECIALTYPE_REORDER_CODE) { |
matched = isSpecialTypeReorderCode(type); |
} |
+ if (!matched && keyData->specialTypes & SPECIALTYPE_RG_KEY_VALUE) { |
+ matched = isSpecialTypeRgKeyValue(type); |
+ } |
if (matched) { |
if (isSpecialType != NULL) { |
*isSpecialType = TRUE; |