From 76d880b44f82754967ac9ab358a87009dd4562db Mon Sep 17 00:00:00 2001 From: Peter Edberg Date: Mon, 8 Jul 2013 06:34:53 +0000 Subject: [PATCH] ICU-10244 (C) Handle localeDisplayPattern/separator as pattern X-SVN-Rev: 33889 --- icu4c/source/common/locdispnames.cpp | 25 +++++++++++++++++++---- icu4c/source/i18n/locdspnm.cpp | 30 +++++++++++++++++++++------- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/icu4c/source/common/locdispnames.cpp b/icu4c/source/common/locdispnames.cpp index dd4445246fb..cca0730be9b 100644 --- a/icu4c/source/common/locdispnames.cpp +++ b/icu4c/source/common/locdispnames.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1997-2012, International Business Machines +* Copyright (C) 1997-2013, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -465,8 +465,7 @@ uloc_getDisplayName(const char *locale, UChar *dest, int32_t destCapacity, UErrorCode *pErrorCode) { - static const UChar defaultSeparator[3] = { 0x002c, 0x0020, 0x0000 }; /* comma + space */ - static const int32_t defaultSepLen = 2; + static const UChar defaultSeparator[9] = { 0x007b, 0x0030, 0x007d, 0x002c, 0x0020, 0x007b, 0x0031, 0x007d, 0x0000 }; /* "{0}, {1}" */ static const UChar sub0[4] = { 0x007b, 0x0030, 0x007d , 0x0000 } ; /* {0} */ static const UChar sub1[4] = { 0x007b, 0x0031, 0x007d , 0x0000 } ; /* {1} */ static const int32_t subLen = 3; @@ -518,7 +517,25 @@ uloc_getDisplayName(const char *locale, /* If we couldn't find any data, then use the defaults */ if(sepLen == 0) { separator = defaultSeparator; - sepLen = defaultSepLen; + } + /* #10244: Even though separator is now a pattern, it is awkward to handle it as such + * here since we are trying to build the display string in place in the dest buffer, + * and to handle it as a pattern would entail having separate storage for the + * substrings that need to be combined (the first of which may be the result of + * previous such combinations). So for now we continue to treat the portion between + * {0} and {1} as a string to be appended when joining substrings, ignoring anything + * that is before {0} or after {1} (no existing separator pattern has any such thing). + * This is similar to how pattern is handled below. + */ + { + UChar *p0=u_strstr(separator, sub0); + UChar *p1=u_strstr(separator, sub1); + if (p0==NULL || p1==NULL || p1format(data, 2, combined, fpos, status); + if (U_SUCCESS(status)) { + buffer.setTo(combined); + } } - buffer.append(src); return buffer; } -- 2.40.0