X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/4388f060552cc537e71e957d32f35e9d75a61233..08b89b0a244153b9f5bbb2f49c55ab0f7298122e:/icuSources/common/locdispnames.cpp diff --git a/icuSources/common/locdispnames.cpp b/icuSources/common/locdispnames.cpp index 53922456..3ea9602d 100644 --- a/icuSources/common/locdispnames.cpp +++ b/icuSources/common/locdispnames.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* * -* Copyright (C) 1997-2011, International Business Machines +* Copyright (C) 1997-2013, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* @@ -282,7 +282,7 @@ static const char _kCountries[] = "Countries"; static const char _kVariants[] = "Variants"; static const char _kKeys[] = "Keys"; static const char _kTypes[] = "Types"; -static const char _kRootName[] = "root"; +//static const char _kRootName[] = "root"; static const char _kCurrency[] = "currency"; static const char _kCurrencies[] = "Currencies"; static const char _kLocaleDisplayPattern[] = "localeDisplayPattern"; @@ -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; @@ -484,6 +483,11 @@ uloc_getDisplayName(const char *locale, const UChar *pattern; int32_t patLen = 0; int32_t sub0Pos, sub1Pos; + + UChar formatOpenParen = 0x0028; // ( + UChar formatReplaceOpenParen = 0x005B; // [ + UChar formatCloseParen = 0x0029; // ) + UChar formatReplaceCloseParen = 0x005D; // ] UBool haveLang = TRUE; /* assume true, set false if we find we don't have a lang component in the locale */ @@ -518,7 +522,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 || p10) { /* we addeed a component, so add separator and write it if there's room. */ if(len+sepLen<=cap) { - p+=len; + const UChar * plimit = p + len; + for (; p < plimit; p++) { + if (*p == formatOpenParen) { + *p = formatReplaceOpenParen; + } else if (*p == formatCloseParen) { + *p = formatReplaceCloseParen; + } + } for(int32_t i=0;i