Index: source/common/listformatter.cpp |
diff --git a/source/common/listformatter.cpp b/source/common/listformatter.cpp |
index cfbd08bdce3cf31fea0b2376d6d5ce423fc602a3..6dbf6c567716c07ebc0f43846dc6fb098927e586 100644 |
--- a/source/common/listformatter.cpp |
+++ b/source/common/listformatter.cpp |
@@ -178,12 +178,6 @@ static ListFormatInternal* loadListFormatInternal( |
rb = ures_getByKeyWithFallback(rb, "listPattern", rb, &errorCode); |
rb = ures_getByKeyWithFallback(rb, style, rb, &errorCode); |
- // TODO(Travis Keep): This is a hack until fallbacks can be added for |
- // listPattern/duration and listPattern/duration-narrow in CLDR. |
- if (errorCode == U_MISSING_RESOURCE_ERROR) { |
- errorCode = U_ZERO_ERROR; |
- rb = ures_getByKeyWithFallback(rb, "standard", rb, &errorCode); |
- } |
if (U_FAILURE(errorCode)) { |
ures_close(rb); |
return NULL; |
@@ -254,9 +248,10 @@ ListFormatter::~ListFormatter() { |
* On entry offset is an offset into first or -1 if offset unspecified. |
* On exit offset is offset of second in result if recordOffset was set |
* Otherwise if it was >=0 it is set to point into result where it used |
- * to point into first. |
+ * to point into first. On exit, result is the join of first and second |
+ * according to pat. Any previous value of result gets replaced. |
*/ |
-static void joinStrings( |
+static void joinStringsAndReplace( |
const SimplePatternFormatter& pat, |
const UnicodeString& first, |
const UnicodeString& second, |
@@ -269,7 +264,7 @@ static void joinStrings( |
} |
const UnicodeString *params[2] = {&first, &second}; |
int32_t offsets[2]; |
- pat.format( |
+ pat.formatAndReplace( |
params, |
UPRV_LENGTHOF(params), |
result, |
@@ -325,69 +320,43 @@ UnicodeString& ListFormatter::format( |
appendTo.append(items[0]); |
return appendTo; |
} |
- if (nItems == 2) { |
- if (index == 0) { |
- offset = 0; |
- } |
- joinStrings( |
- data->twoPattern, |
- items[0], |
- items[1], |
- appendTo, |
- index == 1, |
- offset, |
- errorCode); |
- return appendTo; |
- } |
- UnicodeString temp[2]; |
+ UnicodeString result(items[0]); |
if (index == 0) { |
offset = 0; |
} |
- joinStrings( |
- data->startPattern, |
- items[0], |
+ joinStringsAndReplace( |
+ nItems == 2 ? data->twoPattern : data->startPattern, |
+ result, |
items[1], |
- temp[0], |
+ result, |
index == 1, |
offset, |
errorCode); |
- int32_t i; |
- int32_t pos = 0; |
- int32_t npos = 0; |
- UBool startsWithZeroPlaceholder = |
- data->middlePattern.startsWithPlaceholder(0); |
- for (i = 2; i < nItems - 1; ++i) { |
- if (!startsWithZeroPlaceholder) { |
- npos = (pos + 1) & 1; |
- temp[npos].remove(); |
- } |
- joinStrings( |
- data->middlePattern, |
- temp[pos], |
- items[i], |
- temp[npos], |
- index == i, |
- offset, |
- errorCode); |
- pos = npos; |
- } |
- if (!data->endPattern.startsWithPlaceholder(0)) { |
- npos = (pos + 1) & 1; |
- temp[npos].remove(); |
+ if (nItems > 2) { |
+ for (int32_t i = 2; i < nItems - 1; ++i) { |
+ joinStringsAndReplace( |
+ data->middlePattern, |
+ result, |
+ items[i], |
+ result, |
+ index == i, |
+ offset, |
+ errorCode); |
+ } |
+ joinStringsAndReplace( |
+ data->endPattern, |
+ result, |
+ items[nItems - 1], |
+ result, |
+ index == nItems - 1, |
+ offset, |
+ errorCode); |
} |
- joinStrings( |
- data->endPattern, |
- temp[pos], |
- items[nItems - 1], |
- temp[npos], |
- index == nItems - 1, |
- offset, |
- errorCode); |
if (U_SUCCESS(errorCode)) { |
if (offset >= 0) { |
offset += appendTo.length(); |
} |
- appendTo += temp[npos]; |
+ appendTo += result; |
} |
return appendTo; |
} |