150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/*
250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*******************************************************************************
350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*
459d709d503bab6e2b61931737e662dd293b40578ccornelius*   Copyright (C) 1997-2013, International Business Machines
550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   Corporation and others.  All Rights Reserved.
650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*
750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*******************************************************************************
850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   file name:  locdispnames.cpp
950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   encoding:   US-ASCII
1050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   tab size:   8 (not used)
1150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   indentation:4
1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*
1350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   created on: 2010feb25
1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   created by: Markus W. Scherer
1550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*
1650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   Code for locale display names, separated out from other .cpp files
1750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*   that then do not depend on resource bundle code and display name data.
1850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*/
1950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/utypes.h"
2150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/brkiter.h"
2250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/locid.h"
2350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/uloc.h"
2450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/ures.h"
2550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/ustring.h"
2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cmemory.h"
2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cstring.h"
2850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "putilimp.h"
2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "ulocimp.h"
3050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "uresimp.h"
3150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "ureslocs.h"
3250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "ustr_imp.h"
3350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// C++ API ----------------------------------------------------------------- ***
3550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_BEGIN
3750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
3950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoLocale::getDisplayLanguage(UnicodeString& dispLang) const
4050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
4150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return this->getDisplayLanguage(getDefault(), dispLang);
4250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
4350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
4450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/*We cannot make any assumptions on the size of the output display strings
4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* Yet, since we are calling through to a C API, we need to set limits on
4650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* buffer size. For all the following getDisplay functions we first attempt
4750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* to fill up a stack allocated buffer. If it is to small we heap allocated
4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* the exact buffer we need copy it to the UnicodeString and delete it*/
4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
5050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
5150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoLocale::getDisplayLanguage(const Locale &displayLocale,
5250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                           UnicodeString &result) const {
5350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UChar *buffer;
5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode errorCode=U_ZERO_ERROR;
5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t length;
5650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
5750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY);
5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(buffer==0) {
5950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result.truncate(0);
6050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return result;
6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    length=uloc_getDisplayLanguage(fullName, displayLocale.fullName,
6450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                   buffer, result.getCapacity(),
6550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                   &errorCode);
6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
6750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        buffer=result.getBuffer(length);
7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(buffer==0) {
7150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            result.truncate(0);
7250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            return result;
7350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
7450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errorCode=U_ZERO_ERROR;
7550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        length=uloc_getDisplayLanguage(fullName, displayLocale.fullName,
7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                       buffer, result.getCapacity(),
7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                       &errorCode);
7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
7950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return result;
8250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
8450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
8550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoLocale::getDisplayScript(UnicodeString& dispScript) const
8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return this->getDisplayScript(getDefault(), dispScript);
8850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
9050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
9150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoLocale::getDisplayScript(const Locale &displayLocale,
9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                          UnicodeString &result) const {
9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UChar *buffer;
9450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode errorCode=U_ZERO_ERROR;
9550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t length;
9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
9750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY);
9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(buffer==0) {
9950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result.truncate(0);
10050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return result;
10150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
10250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    length=uloc_getDisplayScript(fullName, displayLocale.fullName,
10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                  buffer, result.getCapacity(),
10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                  &errorCode);
10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
10850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
10950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        buffer=result.getBuffer(length);
11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(buffer==0) {
11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            result.truncate(0);
11250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            return result;
11350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
11450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errorCode=U_ZERO_ERROR;
11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        length=uloc_getDisplayScript(fullName, displayLocale.fullName,
11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                      buffer, result.getCapacity(),
11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                      &errorCode);
11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
12050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return result;
12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
12450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
12550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoLocale::getDisplayCountry(UnicodeString& dispCntry) const
12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return this->getDisplayCountry(getDefault(), dispCntry);
12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
13050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
13150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoLocale::getDisplayCountry(const Locale &displayLocale,
13250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                          UnicodeString &result) const {
13350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UChar *buffer;
13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode errorCode=U_ZERO_ERROR;
13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t length;
13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY);
13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(buffer==0) {
13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result.truncate(0);
14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return result;
14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    length=uloc_getDisplayCountry(fullName, displayLocale.fullName,
14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                  buffer, result.getCapacity(),
14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                  &errorCode);
14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        buffer=result.getBuffer(length);
15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(buffer==0) {
15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            result.truncate(0);
15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            return result;
15350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
15450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errorCode=U_ZERO_ERROR;
15550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        length=uloc_getDisplayCountry(fullName, displayLocale.fullName,
15650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                      buffer, result.getCapacity(),
15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                      &errorCode);
15850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
16150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return result;
16250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
16350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
16450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
16550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoLocale::getDisplayVariant(UnicodeString& dispVar) const
16650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
16750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return this->getDisplayVariant(getDefault(), dispVar);
16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
16950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
17050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
17150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoLocale::getDisplayVariant(const Locale &displayLocale,
17250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                          UnicodeString &result) const {
17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UChar *buffer;
17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode errorCode=U_ZERO_ERROR;
17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t length;
17650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY);
17850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(buffer==0) {
17950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result.truncate(0);
18050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return result;
18150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
18250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
18350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    length=uloc_getDisplayVariant(fullName, displayLocale.fullName,
18450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                  buffer, result.getCapacity(),
18550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                  &errorCode);
18650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
18750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
18850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
18950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        buffer=result.getBuffer(length);
19050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(buffer==0) {
19150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            result.truncate(0);
19250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            return result;
19350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
19450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errorCode=U_ZERO_ERROR;
19550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        length=uloc_getDisplayVariant(fullName, displayLocale.fullName,
19650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                      buffer, result.getCapacity(),
19750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                      &errorCode);
19850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
19950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
20050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
20150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return result;
20250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
20350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
20450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
20550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoLocale::getDisplayName( UnicodeString& name ) const
20650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
20750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return this->getDisplayName(getDefault(), name);
20850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
20950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
21050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
21150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoLocale::getDisplayName(const Locale &displayLocale,
21250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       UnicodeString &result) const {
21350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UChar *buffer;
21450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode errorCode=U_ZERO_ERROR;
21550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t length;
21650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
21750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    buffer=result.getBuffer(ULOC_FULLNAME_CAPACITY);
21850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(buffer==0) {
21950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result.truncate(0);
22050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return result;
22150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
22250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
22350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    length=uloc_getDisplayName(fullName, displayLocale.fullName,
22450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               buffer, result.getCapacity(),
22550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               &errorCode);
22650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
22750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
22850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
22950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        buffer=result.getBuffer(length);
23050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(buffer==0) {
23150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            result.truncate(0);
23250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            return result;
23350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errorCode=U_ZERO_ERROR;
23550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        length=uloc_getDisplayName(fullName, displayLocale.fullName,
23650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                   buffer, result.getCapacity(),
23750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                   &errorCode);
23850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result.releaseBuffer(U_SUCCESS(errorCode) ? length : 0);
23950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
24050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
24150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return result;
24250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
24350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
24450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if ! UCONFIG_NO_BREAK_ITERATION
24550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
24650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// -------------------------------------
24750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Gets the objectLocale display name in the default locale language.
24850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& U_EXPORT2
24950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoBreakIterator::getDisplayName(const Locale& objectLocale,
25050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                             UnicodeString& name)
25150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
25250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return objectLocale.getDisplayName(name);
25350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
25450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
25550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// -------------------------------------
25650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Gets the objectLocale display name in the displayLocale language.
25750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& U_EXPORT2
25850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoBreakIterator::getDisplayName(const Locale& objectLocale,
25950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                             const Locale& displayLocale,
26050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                             UnicodeString& name)
26150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
26250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return objectLocale.getDisplayName(displayLocale, name);
26350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
26450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
26550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
26650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
26750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
26850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_END
26950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
27050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// C API ------------------------------------------------------------------- ***
27150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
27250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_USE
27350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
27450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* ### Constants **************************************************/
27550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
27650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* These strings describe the resources we attempt to load from
27750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho the locale ResourceBundle data file.*/
27850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char _kLanguages[]       = "Languages";
27950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char _kScripts[]         = "Scripts";
280103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic const char _kScriptsStandAlone[] = "Scripts%stand-alone";
28150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char _kCountries[]       = "Countries";
28250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char _kVariants[]        = "Variants";
28350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char _kKeys[]            = "Keys";
28450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char _kTypes[]           = "Types";
28554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius//static const char _kRootName[]        = "root";
28650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char _kCurrency[]        = "currency";
28750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char _kCurrencies[]      = "Currencies";
28850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char _kLocaleDisplayPattern[] = "localeDisplayPattern";
28950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char _kPattern[]         = "pattern";
29050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic const char _kSeparator[]       = "separator";
29150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
29250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* ### Display name **************************************************/
29350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
29450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int32_t
29550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho_getStringOrCopyKey(const char *path, const char *locale,
29650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    const char *tableKey,
29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    const char* subTableKey,
29850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    const char *itemKey,
29950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    const char *substitute,
30050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    UChar *dest, int32_t destCapacity,
30150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    UErrorCode *pErrorCode) {
30250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const UChar *s = NULL;
30350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t length = 0;
30450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
30550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(itemKey==NULL) {
30650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* top-level item: normal resource bundle access */
30750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UResourceBundle *rb;
30850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
30950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        rb=ures_open(path, locale, pErrorCode);
31050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
31150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(U_SUCCESS(*pErrorCode)) {
31250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            s=ures_getStringByKey(rb, tableKey, &length, pErrorCode);
31350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            /* see comment about closing rb near "return item;" in _res_getTableStringWithFallback() */
31450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            ures_close(rb);
31550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
31650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else {
31750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* Language code should not be a number. If it is, set the error code. */
31850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (!uprv_strncmp(tableKey, "Languages", 9) && uprv_strtol(itemKey, NULL, 10)) {
31950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            *pErrorCode = U_MISSING_RESOURCE_ERROR;
32050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        } else {
32150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            /* second-level item, use special fallback */
32250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            s=uloc_getTableStringWithFallback(path, locale,
32350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                               tableKey,
32450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                               subTableKey,
32550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                               itemKey,
32650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                               &length,
32750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                               pErrorCode);
32850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
32950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
33050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
33150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(U_SUCCESS(*pErrorCode)) {
33250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t copyLength=uprv_min(length, destCapacity);
33350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(copyLength>0 && s != NULL) {
33450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            u_memcpy(dest, s, copyLength);
33550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
33650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else {
33750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* no string from a resource bundle: convert the substitute */
33850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        length=(int32_t)uprv_strlen(substitute);
33950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_charsToUChars(substitute, dest, uprv_min(length, destCapacity));
34050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        *pErrorCode=U_USING_DEFAULT_WARNING;
34150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
34250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
34350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return u_terminateUChars(dest, destCapacity, length, pErrorCode);
34450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
34550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
34650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehotypedef  int32_t U_CALLCONV UDisplayNameGetter(const char *, char *, int32_t, UErrorCode *);
34750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
34850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic int32_t
34950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho_getDisplayNameForComponent(const char *locale,
35050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            const char *displayLocale,
35150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            UChar *dest, int32_t destCapacity,
35250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            UDisplayNameGetter *getter,
35350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            const char *tag,
35450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            UErrorCode *pErrorCode) {
35550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    char localeBuffer[ULOC_FULLNAME_CAPACITY*4];
35650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t length;
35750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode localStatus;
35850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char* root = NULL;
35950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
36050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* argument checking */
36150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
36250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return 0;
36350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
36450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
36550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(destCapacity<0 || (destCapacity>0 && dest==NULL)) {
36650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
36750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return 0;
36850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
36950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
37050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    localStatus = U_ZERO_ERROR;
37150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    length=(*getter)(locale, localeBuffer, sizeof(localeBuffer), &localStatus);
37250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(U_FAILURE(localStatus) || localStatus==U_STRING_NOT_TERMINATED_WARNING) {
37350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
37450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return 0;
37550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
37650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(length==0) {
37750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return u_terminateUChars(dest, destCapacity, 0, pErrorCode);
37850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
37950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
38050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    root = tag == _kCountries ? U_ICUDATA_REGION : U_ICUDATA_LANG;
38150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
38250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return _getStringOrCopyKey(root, displayLocale,
38350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               tag, NULL, localeBuffer,
38450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               localeBuffer,
38550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               dest, destCapacity,
38650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               pErrorCode);
38750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
38850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
38950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI int32_t U_EXPORT2
39050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouloc_getDisplayLanguage(const char *locale,
39150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                        const char *displayLocale,
39250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                        UChar *dest, int32_t destCapacity,
39350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                        UErrorCode *pErrorCode) {
39450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity,
39550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                uloc_getLanguage, _kLanguages, pErrorCode);
39650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
39750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
39850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI int32_t U_EXPORT2
39950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouloc_getDisplayScript(const char* locale,
40050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                      const char* displayLocale,
40150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                      UChar *dest, int32_t destCapacity,
40250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                      UErrorCode *pErrorCode)
40350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
404103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius	UErrorCode err = U_ZERO_ERROR;
405103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius	int32_t res = _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity,
406103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                uloc_getScript, _kScriptsStandAlone, &err);
407103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
408103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius	if ( err == U_USING_DEFAULT_WARNING ) {
409103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity,
410103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    uloc_getScript, _kScripts, pErrorCode);
411103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius	} else {
412103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius		*pErrorCode = err;
413103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius		return res;
414103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius	}
415103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
416103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
417103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusU_INTERNAL int32_t U_EXPORT2
418103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusuloc_getDisplayScriptInContext(const char* locale,
419103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                      const char* displayLocale,
420103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                      UChar *dest, int32_t destCapacity,
421103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                      UErrorCode *pErrorCode)
422103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{
42350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity,
424103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    uloc_getScript, _kScripts, pErrorCode);
42550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
42650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
42750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI int32_t U_EXPORT2
42850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouloc_getDisplayCountry(const char *locale,
42950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       const char *displayLocale,
43050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       UChar *dest, int32_t destCapacity,
43150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       UErrorCode *pErrorCode) {
43250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity,
43350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                uloc_getCountry, _kCountries, pErrorCode);
43450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
43550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
43650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/*
43750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * TODO separate variant1_variant2_variant3...
43850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * by getting each tag's display string and concatenating them with ", "
43950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * in between - similar to uloc_getDisplayName()
44050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */
44150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI int32_t U_EXPORT2
44250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouloc_getDisplayVariant(const char *locale,
44350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       const char *displayLocale,
44450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       UChar *dest, int32_t destCapacity,
44550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       UErrorCode *pErrorCode) {
44650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return _getDisplayNameForComponent(locale, displayLocale, dest, destCapacity,
44750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                uloc_getVariant, _kVariants, pErrorCode);
44850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
44950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
450b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* Instead of having a separate pass for 'special' patterns, reintegrate the two
451b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * so we don't get bitten by preflight bugs again.  We can be reasonably efficient
452b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * without two separate code paths, this code isn't that performance-critical.
453b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *
454b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * This code is general enough to deal with patterns that have a prefix or swap the
455b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * language and remainder components, since we gave developers enough rope to do such
456b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * things if they futz with the pattern data.  But since we don't give them a way to
457b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * specify a pattern for arbitrary combinations of components, there's not much use in
458b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * that.  I don't think our data includes such patterns, the only variable I know if is
459b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * whether there is a space before the open paren, or not.  Oh, and zh uses different
460b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * chars than the standard open/close paren (which ja and ko use, btw).
461b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
46250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI int32_t U_EXPORT2
46350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouloc_getDisplayName(const char *locale,
46450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    const char *displayLocale,
46550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    UChar *dest, int32_t destCapacity,
46650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    UErrorCode *pErrorCode)
46750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
46859d709d503bab6e2b61931737e662dd293b40578ccornelius    static const UChar defaultSeparator[9] = { 0x007b, 0x0030, 0x007d, 0x002c, 0x0020, 0x007b, 0x0031, 0x007d, 0x0000 }; /* "{0}, {1}" */
469b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const UChar sub0[4] = { 0x007b, 0x0030, 0x007d , 0x0000 } ; /* {0} */
470b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const UChar sub1[4] = { 0x007b, 0x0031, 0x007d , 0x0000 } ; /* {1} */
471b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const int32_t subLen = 3;
472b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const UChar defaultPattern[10] = {
473b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        0x007b, 0x0030, 0x007d, 0x0020, 0x0028, 0x007b, 0x0031, 0x007d, 0x0029, 0x0000
474b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }; /* {0} ({1}) */
475b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const int32_t defaultPatLen = 9;
476b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const int32_t defaultSub0Pos = 0;
477b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const int32_t defaultSub1Pos = 5;
478b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
479b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t length; /* of formatted result */
480b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
481b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UChar *separator;
482b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t sepLen = 0;
483b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UChar *pattern;
484b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t patLen = 0;
485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t sub0Pos, sub1Pos;
48659d709d503bab6e2b61931737e662dd293b40578ccornelius
48759d709d503bab6e2b61931737e662dd293b40578ccornelius    UChar formatOpenParen         = 0x0028; // (
48859d709d503bab6e2b61931737e662dd293b40578ccornelius    UChar formatReplaceOpenParen  = 0x005B; // [
48959d709d503bab6e2b61931737e662dd293b40578ccornelius    UChar formatCloseParen        = 0x0029; // )
49059d709d503bab6e2b61931737e662dd293b40578ccornelius    UChar formatReplaceCloseParen = 0x005D; // ]
491b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
492b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool haveLang = TRUE; /* assume true, set false if we find we don't have
493b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                              a lang component in the locale */
494b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool haveRest = TRUE; /* assume true, set false if we find we don't have
495b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                              any other component in the locale */
496b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool retry = FALSE; /* set true if we need to retry, see below */
497b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
498b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t langi = 0; /* index of the language substitution (0 or 1), virtually always 0 */
49950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
50050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
50150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return 0;
50250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
50350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
50450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(destCapacity<0 || (destCapacity>0 && dest==NULL)) {
50550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
50650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return 0;
50750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
50850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
509b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {
510b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UErrorCode status = U_ZERO_ERROR;
511b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UResourceBundle* locbundle=ures_open(U_ICUDATA_LANG, displayLocale, &status);
512b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UResourceBundle* dspbundle=ures_getByKeyWithFallback(locbundle, _kLocaleDisplayPattern,
513b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                                             NULL, &status);
51450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
515b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        separator=ures_getStringByKeyWithFallback(dspbundle, _kSeparator, &sepLen, &status);
516b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        pattern=ures_getStringByKeyWithFallback(dspbundle, _kPattern, &patLen, &status);
51750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
518b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ures_close(dspbundle);
519b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ures_close(locbundle);
52050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
52150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
522b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* If we couldn't find any data, then use the defaults */
523b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(sepLen == 0) {
524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       separator = defaultSeparator;
52559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
52659d709d503bab6e2b61931737e662dd293b40578ccornelius    /* #10244: Even though separator is now a pattern, it is awkward to handle it as such
52759d709d503bab6e2b61931737e662dd293b40578ccornelius     * here since we are trying to build the display string in place in the dest buffer,
52859d709d503bab6e2b61931737e662dd293b40578ccornelius     * and to handle it as a pattern would entail having separate storage for the
52959d709d503bab6e2b61931737e662dd293b40578ccornelius     * substrings that need to be combined (the first of which may be the result of
53059d709d503bab6e2b61931737e662dd293b40578ccornelius     * previous such combinations). So for now we continue to treat the portion between
53159d709d503bab6e2b61931737e662dd293b40578ccornelius     * {0} and {1} as a string to be appended when joining substrings, ignoring anything
53259d709d503bab6e2b61931737e662dd293b40578ccornelius     * that is before {0} or after {1} (no existing separator pattern has any such thing).
53359d709d503bab6e2b61931737e662dd293b40578ccornelius     * This is similar to how pattern is handled below.
53459d709d503bab6e2b61931737e662dd293b40578ccornelius     */
53559d709d503bab6e2b61931737e662dd293b40578ccornelius    {
53659d709d503bab6e2b61931737e662dd293b40578ccornelius        UChar *p0=u_strstr(separator, sub0);
53759d709d503bab6e2b61931737e662dd293b40578ccornelius        UChar *p1=u_strstr(separator, sub1);
53859d709d503bab6e2b61931737e662dd293b40578ccornelius        if (p0==NULL || p1==NULL || p1<p0) {
53959d709d503bab6e2b61931737e662dd293b40578ccornelius            *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
54059d709d503bab6e2b61931737e662dd293b40578ccornelius            return 0;
54159d709d503bab6e2b61931737e662dd293b40578ccornelius        }
54259d709d503bab6e2b61931737e662dd293b40578ccornelius        separator = (const UChar *)p0 + subLen;
54359d709d503bab6e2b61931737e662dd293b40578ccornelius        sepLen = p1 - separator;
544b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
545b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
546b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(patLen==0 || (patLen==defaultPatLen && !u_strncmp(pattern, defaultPattern, patLen))) {
547b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        pattern=defaultPattern;
548b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        patLen=defaultPatLen;
549b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        sub0Pos=defaultSub0Pos;
550b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        sub1Pos=defaultSub1Pos;
55159d709d503bab6e2b61931737e662dd293b40578ccornelius        // use default formatOpenParen etc. set above
552b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else { /* non-default pattern */
553b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar *p0=u_strstr(pattern, sub0);
554b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar *p1=u_strstr(pattern, sub1);
555b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (p0==NULL || p1==NULL) {
556b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
557b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return 0;
55850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
559b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        sub0Pos=p0-pattern;
560b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        sub1Pos=p1-pattern;
561b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (sub1Pos < sub0Pos) { /* a very odd pattern */
562b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            int32_t t=sub0Pos; sub0Pos=sub1Pos; sub1Pos=t;
563b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            langi=1;
56450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
56559d709d503bab6e2b61931737e662dd293b40578ccornelius        if (u_strchr(pattern, 0xFF08) != NULL) {
56659d709d503bab6e2b61931737e662dd293b40578ccornelius            formatOpenParen         = 0xFF08; // fullwidth (
56759d709d503bab6e2b61931737e662dd293b40578ccornelius            formatReplaceOpenParen  = 0xFF3B; // fullwidth [
56859d709d503bab6e2b61931737e662dd293b40578ccornelius            formatCloseParen        = 0xFF09; // fullwidth )
56959d709d503bab6e2b61931737e662dd293b40578ccornelius            formatReplaceCloseParen = 0xFF3D; // fullwidth ]
57059d709d503bab6e2b61931737e662dd293b40578ccornelius        }
57150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
57250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
573b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* We loop here because there is one case in which after the first pass we could need to
574b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * reextract the data.  If there's initial padding before the first element, we put in
575b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * the padding and then write that element.  If it turns out there's no second element,
576b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * we didn't need the padding.  If we do need the data (no preflight), and the first element
577b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * would have fit but for the padding, we need to reextract.  In this case (only) we
578b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * adjust the parameters so padding is not added, and repeat.
579b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
580b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    do {
581b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar* p=dest;
582b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t patPos=0; /* position in the pattern, used for non-substitution portions */
583b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t langLen=0; /* length of language substitution */
584b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t langPos=0; /* position in output of language substitution */
585b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t restLen=0; /* length of 'everything else' substitution */
586b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t restPos=0; /* position in output of 'everything else' substitution */
587b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UEnumeration* kenum = NULL; /* keyword enumeration */
588b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
589b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /* prefix of pattern, extremely likely to be empty */
590b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(sub0Pos) {
591b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(destCapacity >= sub0Pos) {
592b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                while (patPos < sub0Pos) {
593b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    *p++ = pattern[patPos++];
594b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
595b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            } else {
596b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                patPos=sub0Pos;
597b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
598b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            length=sub0Pos;
599b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
600b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            length=0;
60150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
60250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
603b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        for(int32_t subi=0,resti=0;subi<2;) { /* iterate through patterns 0 and 1*/
604b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UBool subdone = FALSE; /* set true when ready to move to next substitution */
60550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
606b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            /* prep p and cap for calls to get display components, pin cap to 0 since
607b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho               they complain if cap is negative */
608b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            int32_t cap=destCapacity-length;
609b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (cap <= 0) {
610b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                cap=0;
61150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            } else {
612b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                p=dest+length;
61350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
61450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
615b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (subi == langi) { /* {0}*/
616b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if(haveLang) {
617b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    langPos=length;
618b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    langLen=uloc_getDisplayLanguage(locale, displayLocale, p, cap, pErrorCode);
619b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    length+=langLen;
620b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    haveLang=langLen>0;
621b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
622b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                subdone=TRUE;
623b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            } else { /* {1} */
624b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if(!haveRest) {
625b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    subdone=TRUE;
626b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                } else {
627b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    int32_t len; /* length of component (plus other stuff) we just fetched */
628b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    switch(resti++) {
629b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        case 0:
630b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            restPos=length;
631103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                            len=uloc_getDisplayScriptInContext(locale, displayLocale, p, cap, pErrorCode);
632b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            break;
633b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        case 1:
634b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            len=uloc_getDisplayCountry(locale, displayLocale, p, cap, pErrorCode);
635b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            break;
636b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        case 2:
637b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            len=uloc_getDisplayVariant(locale, displayLocale, p, cap, pErrorCode);
638b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            break;
639b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        case 3:
640b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            kenum = uloc_openKeywords(locale, pErrorCode);
641b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            /* fall through */
642b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        default: {
643b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            const char* kw=uenum_next(kenum, &len, pErrorCode);
644b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            if (kw == NULL) {
645b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                uenum_close(kenum);
646b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                len=0; /* mark that we didn't add a component */
647b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                subdone=TRUE;
648b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            } else {
649b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                /* incorporating this behavior into the loop made it even more complex,
650b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                   so just special case it here */
651b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                len = uloc_getDisplayKeyword(kw, displayLocale, p, cap, pErrorCode);
652b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                if(len) {
653b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    if(len < cap) {
654b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                        p[len]=0x3d; /* '=', assume we'll need it */
655b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    }
656b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    len+=1;
657b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
658b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    /* adjust for call to get keyword */
659b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    cap-=len;
660b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    if(cap <= 0) {
661b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                        cap=0;
662b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    } else {
663b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                        p+=len;
664b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    }
665b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                }
666b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                /* reset for call below */
667b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                if(*pErrorCode == U_BUFFER_OVERFLOW_ERROR) {
668b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    *pErrorCode=U_ZERO_ERROR;
669b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                }
670b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                int32_t vlen = uloc_getDisplayKeywordValue(locale, kw, displayLocale,
671b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                                                           p, cap, pErrorCode);
672b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                if(len) {
673b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    if(vlen==0) {
674b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                        --len; /* remove unneeded '=' */
675b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    }
676b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    /* restore cap and p to what they were at start */
677b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    cap=destCapacity-length;
678b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    if(cap <= 0) {
679b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                        cap=0;
680b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    } else {
681b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                        p=dest+length;
682b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    }
683b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                }
684b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                len+=vlen; /* total we added for key + '=' + value */
685b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            }
686b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        } break;
687b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    } /* end switch */
688b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
689b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    if (len>0) {
690b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        /* we addeed a component, so add separator and write it if there's room. */
691b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        if(len+sepLen<=cap) {
69259d709d503bab6e2b61931737e662dd293b40578ccornelius                            const UChar * plimit = p + len;
69359d709d503bab6e2b61931737e662dd293b40578ccornelius                            for (; p < plimit; p++) {
69459d709d503bab6e2b61931737e662dd293b40578ccornelius                                if (*p == formatOpenParen) {
69559d709d503bab6e2b61931737e662dd293b40578ccornelius                                    *p = formatReplaceOpenParen;
69659d709d503bab6e2b61931737e662dd293b40578ccornelius                                } else if (*p == formatCloseParen) {
69759d709d503bab6e2b61931737e662dd293b40578ccornelius                                    *p = formatReplaceCloseParen;
69859d709d503bab6e2b61931737e662dd293b40578ccornelius                                }
69959d709d503bab6e2b61931737e662dd293b40578ccornelius                            }
700b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            for(int32_t i=0;i<sepLen;++i) {
701b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                *p++=separator[i];
702b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            }
703b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        }
704b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        length+=len+sepLen;
705b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    } else if(subdone) {
706b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        /* remove separator if we added it */
707b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        if (length!=restPos) {
708b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            length-=sepLen;
709b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        }
710b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        restLen=length-restPos;
711b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        haveRest=restLen>0;
712b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    }
713b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
714b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
71550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
716b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(*pErrorCode == U_BUFFER_OVERFLOW_ERROR) {
717b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                *pErrorCode=U_ZERO_ERROR;
718b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
71950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
720b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(subdone) {
721b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if(haveLang && haveRest) {
722b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    /* append internal portion of pattern, the first time,
723b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                       or last portion of pattern the second time */
724b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    int32_t padLen;
725b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    patPos+=subLen;
726b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    padLen=(subi==0 ? sub1Pos : patLen)-patPos;
727b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    if(length+padLen < destCapacity) {
728b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        p=dest+length;
729b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        for(int32_t i=0;i<padLen;++i) {
730b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            *p++=pattern[patPos++];
731b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        }
732b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    } else {
733b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        patPos+=padLen;
734b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    }
735b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    length+=padLen;
736b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                } else if(subi==0) {
737b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    /* don't have first component, reset for second component */
738b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    sub0Pos=0;
739b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    length=0;
740b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                } else if(length>0) {
741b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    /* true length is the length of just the component we got. */
742b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    length=haveLang?langLen:restLen;
743b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    if(dest && sub0Pos!=0) {
744b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        if (sub0Pos+length<=destCapacity) {
745b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            /* first component not at start of result,
746b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                               but we have full component in buffer. */
747b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            u_memmove(dest, dest+(haveLang?langPos:restPos), length);
748b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        } else {
749b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            /* would have fit, but didn't because of pattern prefix. */
750b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            sub0Pos=0; /* stops initial padding (and a second retry,
751b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                          so we won't end up here again) */
752b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            retry=TRUE;
753b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        }
754b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    }
755b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
756b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
757b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                ++subi; /* move on to next substitution */
758b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
75950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
760b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } while(retry);
76150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
76250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return u_terminateUChars(dest, destCapacity, length, pErrorCode);
76350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
76450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
76550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI int32_t U_EXPORT2
76650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouloc_getDisplayKeyword(const char* keyword,
76750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       const char* displayLocale,
76850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       UChar* dest,
76950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       int32_t destCapacity,
77050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                       UErrorCode* status){
77150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
77250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* argument checking */
77350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(status==NULL || U_FAILURE(*status)) {
77450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return 0;
77550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
77650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
77750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(destCapacity<0 || (destCapacity>0 && dest==NULL)) {
77850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        *status=U_ILLEGAL_ARGUMENT_ERROR;
77950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return 0;
78050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
78150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
78250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
78350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* pass itemKey=NULL to look for a top-level item */
78450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return _getStringOrCopyKey(U_ICUDATA_LANG, displayLocale,
78550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               _kKeys, NULL,
78650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               keyword,
78750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               keyword,
78850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               dest, destCapacity,
78950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               status);
79050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
79150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
79250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
79350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
79450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define UCURRENCY_DISPLAY_NAME_INDEX 1
79550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
79650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI int32_t U_EXPORT2
79750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouloc_getDisplayKeywordValue(   const char* locale,
79850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               const char* keyword,
79950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               const char* displayLocale,
80050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               UChar* dest,
80150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               int32_t destCapacity,
80250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                               UErrorCode* status){
80350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
80450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
80550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    char keywordValue[ULOC_FULLNAME_CAPACITY*4];
80650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t capacity = ULOC_FULLNAME_CAPACITY*4;
80750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t keywordValueLen =0;
80850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
80950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* argument checking */
81050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(status==NULL || U_FAILURE(*status)) {
81150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return 0;
81250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
81350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
81450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(destCapacity<0 || (destCapacity>0 && dest==NULL)) {
81550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        *status=U_ILLEGAL_ARGUMENT_ERROR;
81650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return 0;
81750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
81850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
81950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* get the keyword value */
82050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    keywordValue[0]=0;
82150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    keywordValueLen = uloc_getKeywordValue(locale, keyword, keywordValue, capacity, status);
82250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
82350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
82450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * if the keyword is equal to currency .. then to get the display name
82550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * we need to do the fallback ourselves
82650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
82750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(uprv_stricmp(keyword, _kCurrency)==0){
82850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
82950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t dispNameLen = 0;
83050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const UChar *dispName = NULL;
83150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
83250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UResourceBundle *bundle     = ures_open(U_ICUDATA_CURR, displayLocale, status);
83350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UResourceBundle *currencies = ures_getByKey(bundle, _kCurrencies, NULL, status);
83450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UResourceBundle *currency   = ures_getByKeyWithFallback(currencies, keywordValue, NULL, status);
83550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
83650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dispName = ures_getStringByIndex(currency, UCURRENCY_DISPLAY_NAME_INDEX, &dispNameLen, status);
83750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
83850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*close the bundles */
83950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ures_close(currency);
84050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ures_close(currencies);
84150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ures_close(bundle);
84250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
84350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(U_FAILURE(*status)){
84450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if(*status == U_MISSING_RESOURCE_ERROR){
84550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                /* we just want to write the value over if nothing is available */
84650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                *status = U_USING_DEFAULT_WARNING;
84750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }else{
84850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                return 0;
84950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
85050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
85150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
85250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* now copy the dispName over if not NULL */
85350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(dispName != NULL){
85450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if(dispNameLen <= destCapacity){
85550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                uprv_memcpy(dest, dispName, dispNameLen * U_SIZEOF_UCHAR);
85650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                return u_terminateUChars(dest, destCapacity, dispNameLen, status);
85750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }else{
85850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                *status = U_BUFFER_OVERFLOW_ERROR;
85950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                return dispNameLen;
86050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
86150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }else{
86250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            /* we have not found the display name for the value .. just copy over */
86350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if(keywordValueLen <= destCapacity){
86450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                u_charsToUChars(keywordValue, dest, keywordValueLen);
86550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                return u_terminateUChars(dest, destCapacity, keywordValueLen, status);
86650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }else{
86750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                 *status = U_BUFFER_OVERFLOW_ERROR;
86850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                return keywordValueLen;
86950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
87050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
87150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
87250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
87350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }else{
87450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
87550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return _getStringOrCopyKey(U_ICUDATA_LANG, displayLocale,
87650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                   _kTypes, keyword,
87750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                   keywordValue,
87850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                   keywordValue,
87950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                   dest, destCapacity,
88050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                   status);
88150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
88250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
883