diff options
Diffstat (limited to 'Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp')
-rw-r--r-- | Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp | 90 |
1 files changed, 67 insertions, 23 deletions
diff --git a/Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp b/Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp index 187342e4af2..aefd70464eb 100644 --- a/Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp +++ b/Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp @@ -261,12 +261,21 @@ static const char* const CLDR_FIELD_APPEND[] = { "Hour", "Minute", "Second", "*", "Timezone" }; -static const char* const CLDR_FIELD_NAME[] = { +static const char* const CLDR_FIELD_NAME[UDATPG_FIELD_COUNT] = { "era", "year", "quarter", "month", "week", "weekOfMonth", "weekday", "dayOfYear", "weekdayOfMonth", "day", "dayperiod", // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J "hour", "minute", "second", "*", "zone" }; +static const char* const CLDR_FIELD_WIDTH[] = { // [UDATPG_WIDTH_COUNT] + "", "-short", "-narrow" +}; + +// TODO(ticket:13619): remove when definition uncommented in dtptngen.h. +static const int32_t UDATPG_WIDTH_COUNT = UDATPG_NARROW + 1; +static constexpr UDateTimePGDisplayWidth UDATPG_WIDTH_APPENDITEM = UDATPG_WIDE; +static constexpr int32_t UDATPG_FIELD_KEY_MAX = 24; // max length of CLDR field tag (type + width) + // For appendItems static const UChar UDATPG_ItemFormat[]= {0x7B, 0x30, 0x7D, 0x20, 0x251C, 0x7B, 0x32, 0x7D, 0x3A, 0x20, 0x7B, 0x31, 0x7D, 0x2524, 0}; // {0} \u251C{2}: {1}\u2524 @@ -379,10 +388,11 @@ DateTimePatternGenerator::operator=(const DateTimePatternGenerator& other) { } for (int32_t i=0; i< UDATPG_FIELD_COUNT; ++i ) { appendItemFormats[i] = other.appendItemFormats[i]; - appendItemNames[i] = other.appendItemNames[i]; - // NUL-terminate for the C API. - appendItemFormats[i].getTerminatedBuffer(); - appendItemNames[i].getTerminatedBuffer(); + appendItemFormats[i].getTerminatedBuffer(); // NUL-terminate for the C API. + for (int32_t j=0; j< UDATPG_WIDTH_COUNT; ++j ) { + fieldDisplayNames[i][j] = other.fieldDisplayNames[i][j]; + fieldDisplayNames[i][j].getTerminatedBuffer(); // NUL-terminate for the C API. + } } UErrorCode status = U_ZERO_ERROR; patternMap->copyFrom(*other.patternMap, status); @@ -399,10 +409,14 @@ DateTimePatternGenerator::operator==(const DateTimePatternGenerator& other) cons if ((pLocale==other.pLocale) && (patternMap->equals(*other.patternMap)) && (dateTimeFormat==other.dateTimeFormat) && (decimal==other.decimal)) { for ( int32_t i=0 ; i<UDATPG_FIELD_COUNT; ++i ) { - if ((appendItemFormats[i] != other.appendItemFormats[i]) || - (appendItemNames[i] != other.appendItemNames[i]) ) { - return FALSE; - } + if (appendItemFormats[i] != other.appendItemFormats[i]) { + return FALSE; + } + for (int32_t j=0; j< UDATPG_WIDTH_COUNT; ++j ) { + if (fieldDisplayNames[i][j] != other.fieldDisplayNames[i][j]) { + return FALSE; + } + } } return TRUE; } @@ -824,15 +838,16 @@ struct DateTimePatternGenerator::AppendItemNamesSink : public ResourceSink { ResourceTable itemsTable = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } for (int32_t i = 0; itemsTable.getKeyAndValue(i, key, value); ++i) { - UDateTimePatternField field = dtpg.getAppendNameNumber(key); + UDateTimePGDisplayWidth width; + UDateTimePatternField field = dtpg.getFieldAndWidthIndices(key, &width); if (field == UDATPG_FIELD_COUNT) { continue; } ResourceTable detailsTable = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } for (int32_t j = 0; detailsTable.getKeyAndValue(j, key, value); ++j) { if (uprv_strcmp(key, "dn") != 0) { continue; } const UnicodeString& valueStr = value.getUnicodeString(errorCode); - if (dtpg.getAppendItemName(field).isEmpty() && !valueStr.isEmpty()) { - dtpg.setAppendItemName(field, valueStr); + if (dtpg.getFieldDisplayName(field,width).isEmpty() && !valueStr.isEmpty()) { + dtpg.setFieldDisplayName(field,width,valueStr); } break; } @@ -841,8 +856,7 @@ struct DateTimePatternGenerator::AppendItemNamesSink : public ResourceSink { void fillInMissing() { for (int32_t i = 0; i < UDATPG_FIELD_COUNT; i++) { - UDateTimePatternField field = (UDateTimePatternField)i; - UnicodeString& valueStr = dtpg.getMutableAppendItemName(field); + UnicodeString& valueStr = dtpg.getMutableFieldDisplayName((UDateTimePatternField)i, UDATPG_WIDE); if (valueStr.isEmpty()) { valueStr = CAP_F; U_ASSERT(i < 20); @@ -857,6 +871,12 @@ struct DateTimePatternGenerator::AppendItemNamesSink : public ResourceSink { // NUL-terminate for the C API. valueStr.getTerminatedBuffer(); } + for (int32_t j = 1; j < UDATPG_WIDTH_COUNT; j++) { + UnicodeString& valueStr = dtpg.getMutableFieldDisplayName((UDateTimePatternField)i, (UDateTimePGDisplayWidth)j); + if (valueStr.isEmpty()) { + valueStr = dtpg.getFieldDisplayName((UDateTimePatternField)i, (UDateTimePGDisplayWidth)(j-1)); + } + } } } }; @@ -969,25 +989,35 @@ DateTimePatternGenerator::getAppendItemFormat(UDateTimePatternField field) const void DateTimePatternGenerator::setAppendItemName(UDateTimePatternField field, const UnicodeString& value) { - appendItemNames[field] = value; - // NUL-terminate for the C API. - appendItemNames[field].getTerminatedBuffer(); + setFieldDisplayName(field, UDATPG_WIDTH_APPENDITEM, value); } const UnicodeString& DateTimePatternGenerator::getAppendItemName(UDateTimePatternField field) const { - return appendItemNames[field]; + return fieldDisplayNames[field][UDATPG_WIDTH_APPENDITEM]; +} + +void +DateTimePatternGenerator::setFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width, const UnicodeString& value) { + fieldDisplayNames[field][width] = value; + // NUL-terminate for the C API. + fieldDisplayNames[field][width].getTerminatedBuffer(); +} + +UnicodeString +DateTimePatternGenerator::getFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width) const { + return fieldDisplayNames[field][width]; } UnicodeString& -DateTimePatternGenerator::getMutableAppendItemName(UDateTimePatternField field) { - return appendItemNames[field]; +DateTimePatternGenerator::getMutableFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width) { + return fieldDisplayNames[field][width]; } void DateTimePatternGenerator::getAppendName(UDateTimePatternField field, UnicodeString& value) { value = SINGLE_QUOTE; - value += appendItemNames[field]; + value += fieldDisplayNames[field][UDATPG_WIDTH_APPENDITEM]; value += SINGLE_QUOTE; } @@ -1312,9 +1342,23 @@ DateTimePatternGenerator::getAppendFormatNumber(const char* field) const { } UDateTimePatternField -DateTimePatternGenerator::getAppendNameNumber(const char* field) const { +DateTimePatternGenerator::getFieldAndWidthIndices(const char* key, UDateTimePGDisplayWidth* widthP) const { + char cldrFieldKey[UDATPG_FIELD_KEY_MAX + 1]; + uprv_strncpy(cldrFieldKey, key, UDATPG_FIELD_KEY_MAX); + cldrFieldKey[UDATPG_FIELD_KEY_MAX]=0; // ensure termination + *widthP = UDATPG_WIDE; + char* hyphenPtr = uprv_strchr(cldrFieldKey, '-'); + if (hyphenPtr) { + for (int32_t i=UDATPG_WIDTH_COUNT-1; i>0; --i) { + if (uprv_strcmp(CLDR_FIELD_WIDTH[i], hyphenPtr)==0) { + *widthP=(UDateTimePGDisplayWidth)i; + break; + } + } + *hyphenPtr = 0; // now delete width portion of key + } for (int32_t i=0; i<UDATPG_FIELD_COUNT; ++i ) { - if (uprv_strcmp(CLDR_FIELD_NAME[i],field)==0) { + if (uprv_strcmp(CLDR_FIELD_NAME[i],cldrFieldKey)==0) { return (UDateTimePatternField)i; } } |