summaryrefslogtreecommitdiff
path: root/chromium/third_party/icu/patches/localeAddLikely.patch
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/icu/patches/localeAddLikely.patch')
-rw-r--r--chromium/third_party/icu/patches/localeAddLikely.patch244
1 files changed, 244 insertions, 0 deletions
diff --git a/chromium/third_party/icu/patches/localeAddLikely.patch b/chromium/third_party/icu/patches/localeAddLikely.patch
new file mode 100644
index 00000000000..0c71c11104a
--- /dev/null
+++ b/chromium/third_party/icu/patches/localeAddLikely.patch
@@ -0,0 +1,244 @@
+diff --git a/source/common/loclikely.cpp b/source/common/loclikely.cpp
+index a4a4181c..54c4a464 100644
+--- a/source/common/loclikely.cpp
++++ b/source/common/loclikely.cpp
+@@ -826,7 +826,7 @@ error:
+ } \
+ } UPRV_BLOCK_MACRO_END
+
+-static void
++static UBool
+ _uloc_addLikelySubtags(const char* localeID,
+ icu::ByteSink& sink,
+ UErrorCode* err) {
+@@ -897,15 +897,22 @@ _uloc_addLikelySubtags(const char* localeID,
+ sink.Append(localeID, localIDLength);
+ }
+
+- return;
++ return success;
+
+ error:
+
+ if (!U_FAILURE(*err)) {
+ *err = U_ILLEGAL_ARGUMENT_ERROR;
+ }
++ return FALSE;
+ }
+
++// Add likely subtags to the sink
++// return true if the value in the sink is produced by a match during the lookup
++// return false if the value in the sink is the same as input because there are
++// no match after the lookup.
++static UBool _ulocimp_addLikelySubtags(const char*, icu::ByteSink&, UErrorCode*);
++
+ static void
+ _uloc_minimizeSubtags(const char* localeID,
+ icu::ByteSink& sink,
+@@ -921,6 +928,7 @@ _uloc_minimizeSubtags(const char* localeID,
+ const char* trailing = "";
+ int32_t trailingLength = 0;
+ int32_t trailingIndex = 0;
++ UBool successGetMax = FALSE;
+
+ if(U_FAILURE(*err)) {
+ goto error;
+@@ -961,7 +969,7 @@ _uloc_minimizeSubtags(const char* localeID,
+ {
+ icu::CharString base;
+ {
+- icu::CharStringByteSink sink(&base);
++ icu::CharStringByteSink baseSink(&base);
+ createTagString(
+ lang,
+ langLength,
+@@ -971,7 +979,7 @@ _uloc_minimizeSubtags(const char* localeID,
+ regionLength,
+ NULL,
+ 0,
+- sink,
++ baseSink,
+ err);
+ }
+
+@@ -980,8 +988,8 @@ _uloc_minimizeSubtags(const char* localeID,
+ * from AddLikelySubtags.
+ **/
+ {
+- icu::CharStringByteSink sink(&maximizedTagBuffer);
+- ulocimp_addLikelySubtags(base.data(), sink, err);
++ icu::CharStringByteSink maxSink(&maximizedTagBuffer);
++ successGetMax = _ulocimp_addLikelySubtags(base.data(), maxSink, err);
+ }
+ }
+
+@@ -989,13 +997,40 @@ _uloc_minimizeSubtags(const char* localeID,
+ goto error;
+ }
+
++ if (!successGetMax) {
++ /**
++ * If we got here, return the locale ID parameter unchanged.
++ **/
++ const int32_t localeIDLength = (int32_t)uprv_strlen(localeID);
++ sink.Append(localeID, localeIDLength);
++ return;
++ }
++
++ // In the following, the lang, script, region are referring to those in
++ // the maximizedTagBuffer, not the one in the localeID.
++ langLength = sizeof(lang);
++ scriptLength = sizeof(script);
++ regionLength = sizeof(region);
++ parseTagString(
++ maximizedTagBuffer.data(),
++ lang,
++ &langLength,
++ script,
++ &scriptLength,
++ region,
++ &regionLength,
++ err);
++ if(U_FAILURE(*err)) {
++ goto error;
++ }
++
+ /**
+ * Start first with just the language.
+ **/
+ {
+ icu::CharString tagBuffer;
+ {
+- icu::CharStringByteSink sink(&tagBuffer);
++ icu::CharStringByteSink tagSink(&tagBuffer);
+ createLikelySubtagsString(
+ lang,
+ langLength,
+@@ -1005,14 +1040,15 @@ _uloc_minimizeSubtags(const char* localeID,
+ 0,
+ NULL,
+ 0,
+- sink,
++ tagSink,
+ err);
+ }
+
+ if(U_FAILURE(*err)) {
+ goto error;
+ }
+- else if (!tagBuffer.isEmpty() && uprv_strnicmp(
++ else if (!tagBuffer.isEmpty() &&
++ uprv_strnicmp(
+ maximizedTagBuffer.data(),
+ tagBuffer.data(),
+ tagBuffer.length()) == 0) {
+@@ -1039,7 +1075,7 @@ _uloc_minimizeSubtags(const char* localeID,
+
+ icu::CharString tagBuffer;
+ {
+- icu::CharStringByteSink sink(&tagBuffer);
++ icu::CharStringByteSink tagSink(&tagBuffer);
+ createLikelySubtagsString(
+ lang,
+ langLength,
+@@ -1049,14 +1085,15 @@ _uloc_minimizeSubtags(const char* localeID,
+ regionLength,
+ NULL,
+ 0,
+- sink,
++ tagSink,
+ err);
+ }
+
+ if(U_FAILURE(*err)) {
+ goto error;
+ }
+- else if (uprv_strnicmp(
++ else if (!tagBuffer.isEmpty() &&
++ uprv_strnicmp(
+ maximizedTagBuffer.data(),
+ tagBuffer.data(),
+ tagBuffer.length()) == 0) {
+@@ -1081,10 +1118,10 @@ _uloc_minimizeSubtags(const char* localeID,
+ * since trying with all three subtags would only yield the
+ * maximal version that we already have.
+ **/
+- if (scriptLength > 0 && regionLength > 0) {
++ if (scriptLength > 0) {
+ icu::CharString tagBuffer;
+ {
+- icu::CharStringByteSink sink(&tagBuffer);
++ icu::CharStringByteSink tagSink(&tagBuffer);
+ createLikelySubtagsString(
+ lang,
+ langLength,
+@@ -1094,14 +1131,15 @@ _uloc_minimizeSubtags(const char* localeID,
+ 0,
+ NULL,
+ 0,
+- sink,
++ tagSink,
+ err);
+ }
+
+ if(U_FAILURE(*err)) {
+ goto error;
+ }
+- else if (uprv_strnicmp(
++ else if (!tagBuffer.isEmpty() &&
++ uprv_strnicmp(
+ maximizedTagBuffer.data(),
+ tagBuffer.data(),
+ tagBuffer.length()) == 0) {
+@@ -1123,10 +1161,19 @@ _uloc_minimizeSubtags(const char* localeID,
+
+ {
+ /**
+- * If we got here, return the locale ID parameter.
++ * If we got here, return the max + trail.
+ **/
+- const int32_t localeIDLength = (int32_t)uprv_strlen(localeID);
+- sink.Append(localeID, localeIDLength);
++ createTagString(
++ lang,
++ langLength,
++ script,
++ scriptLength,
++ region,
++ regionLength,
++ trailing,
++ trailingLength,
++ sink,
++ err);
+ return;
+ }
+
+@@ -1193,15 +1240,23 @@ uloc_addLikelySubtags(const char* localeID,
+ return reslen;
+ }
+
+-U_CAPI void U_EXPORT2
+-ulocimp_addLikelySubtags(const char* localeID,
+- icu::ByteSink& sink,
+- UErrorCode* status) {
++static UBool
++_ulocimp_addLikelySubtags(const char* localeID,
++ icu::ByteSink& sink,
++ UErrorCode* status) {
+ char localeBuffer[ULOC_FULLNAME_CAPACITY];
+
+ if (do_canonicalize(localeID, localeBuffer, sizeof localeBuffer, status)) {
+- _uloc_addLikelySubtags(localeBuffer, sink, status);
++ return _uloc_addLikelySubtags(localeBuffer, sink, status);
+ }
++ return FALSE;
++}
++
++U_CAPI void U_EXPORT2
++ulocimp_addLikelySubtags(const char* localeID,
++ icu::ByteSink& sink,
++ UErrorCode* status) {
++ _ulocimp_addLikelySubtags(localeID, sink, status);
+ }
+
+ U_CAPI int32_t U_EXPORT2