10596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*                                                                            *
68de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert* Copyright (C) 2003-2016, International Business Machines                   *
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*                Corporation and others. All Rights Reserved.                *
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*                                                                            *
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   file name:  ulocdata.c
110596faeddefbf198de137d5e893708495ab1584cFredrik Roubert*   encoding:   UTF-8
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   tab size:   8 (not used)
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   indentation:4
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created on: 2003Oct21
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created by: Ram Viswanadha,John Emmons
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
2159d709d503bab6e2b61931737e662dd293b40578ccornelius#include "unicode/ures.h"
2259d709d503bab6e2b61931737e662dd293b40578ccornelius#include "unicode/uloc.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ulocdata.h"
24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "uresimp.h"
2550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "ureslocs.h"
268de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "ulocimp.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MEASUREMENT_SYSTEM  "MeasurementSystem"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define PAPER_SIZE          "PaperSize"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** A locale data object.
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *  For usage in C programs.
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *  @draft ICU 3.4
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustruct ULocaleData {
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Controls the "No Substitute" behavior of this locale data object
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool noSubstitute;
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Pointer to the resource bundle associated with this locale data object
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *bundle;
4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
4650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
4750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Pointer to the lang resource bundle associated with this locale data object
4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UResourceBundle *langBundle;
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI ULocaleData* U_EXPORT2
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruulocdata_open(const char *localeID, UErrorCode *status)
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   ULocaleData *uld;
56b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   if (U_FAILURE(*status)) {
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       return NULL;
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   }
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   uld = (ULocaleData *)uprv_malloc(sizeof(ULocaleData));
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   if (uld == NULL) {
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      *status = U_MEMORY_ALLOCATION_ERROR;
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return(NULL);
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   }
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
6750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   uld->langBundle = NULL;
68b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   uld->noSubstitute = FALSE;
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   uld->bundle = ures_open(NULL, localeID, status);
7150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   uld->langBundle = ures_open(U_ICUDATA_LANG, localeID, status);
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   if (U_FAILURE(*status)) {
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      uprv_free(uld);
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return NULL;
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   }
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   return uld;
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruulocdata_close(ULocaleData *uld)
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( uld != NULL ) {
8550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho       ures_close(uld->langBundle);
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       ures_close(uld->bundle);
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       uprv_free(uld);
88b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruulocdata_setNoSubstitute(ULocaleData *uld, UBool setting)
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   uld->noSubstitute = setting;
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruulocdata_getNoSubstitute(ULocaleData *uld)
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   return uld->noSubstitute;
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI USet* U_EXPORT2
104b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruulocdata_getExemplarSet(ULocaleData *uld, USet *fillIn,
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        uint32_t options, ULocaleDataExemplarSetType extype, UErrorCode *status){
106b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const char* const exemplarSetTypes[] = { "ExemplarCharacters",
108b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                                    "AuxExemplarCharacters",
1098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                                                    "ExemplarCharactersIndex",
1108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                                                    "ExemplarCharactersPunctuation"};
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar *exemplarChars = NULL;
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len = 0;
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode localStatus = U_ZERO_ERROR;
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(*status))
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
117b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    exemplarChars = ures_getStringByKey(uld->bundle, exemplarSetTypes[extype], &len, &localStatus);
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( (localStatus == U_USING_DEFAULT_WARNING) && uld->noSubstitute ) {
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localStatus = U_MISSING_RESOURCE_ERROR;
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
122b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (localStatus != U_ZERO_ERROR) {
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *status = localStatus;
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(*status))
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
129b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fillIn != NULL)
131b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        uset_applyPattern(fillIn, exemplarChars, len,
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          USET_IGNORE_SPACE | options, status);
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fillIn = uset_openPatternOptions(exemplarChars, len,
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                         USET_IGNORE_SPACE | options, status);
136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fillIn;
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruulocdata_getDelimiter(ULocaleData *uld, ULocaleDataDelimiterType type,
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UChar *result, int32_t resultLength, UErrorCode *status){
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* const delimiterKeys[] =  {
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "quotationStart",
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "quotationEnd",
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "alternateQuotationStart",
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "alternateQuotationEnd"
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *delimiterBundle;
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len = 0;
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar *delimiter = NULL;
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode localStatus = U_ZERO_ERROR;
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(*status))
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delimiterBundle = ures_getByKey(uld->bundle, "delimiters", NULL, &localStatus);
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( (localStatus == U_USING_DEFAULT_WARNING) && uld->noSubstitute ) {
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localStatus = U_MISSING_RESOURCE_ERROR;
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (localStatus != U_ZERO_ERROR) {
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *status = localStatus;
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(*status)){
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ures_close(delimiterBundle);
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delimiter = ures_getStringByKey(delimiterBundle, delimiterKeys[type], &len, &localStatus);
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(delimiterBundle);
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( (localStatus == U_USING_DEFAULT_WARNING) && uld->noSubstitute ) {
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localStatus = U_MISSING_RESOURCE_ERROR;
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (localStatus != U_ZERO_ERROR) {
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *status = localStatus;
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
185b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(*status)){
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
189b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
190b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strncpy(result,delimiter, resultLength);
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return len;
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic UResourceBundle * measurementTypeBundleForLocale(const char *localeID, const char *measurementType, UErrorCode *status){
19559d709d503bab6e2b61931737e662dd293b40578ccornelius    char region[ULOC_COUNTRY_CAPACITY];
19659d709d503bab6e2b61931737e662dd293b40578ccornelius    UResourceBundle *rb;
19759d709d503bab6e2b61931737e662dd293b40578ccornelius    UResourceBundle *measTypeBundle = NULL;
19859d709d503bab6e2b61931737e662dd293b40578ccornelius
1998de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    ulocimp_getRegionForSupplementalData(localeID, TRUE, region, ULOC_COUNTRY_CAPACITY, status);
20059d709d503bab6e2b61931737e662dd293b40578ccornelius
20159d709d503bab6e2b61931737e662dd293b40578ccornelius    rb = ures_openDirect(NULL, "supplementalData", status);
20259d709d503bab6e2b61931737e662dd293b40578ccornelius    ures_getByKey(rb, "measurementData", rb, status);
20359d709d503bab6e2b61931737e662dd293b40578ccornelius    if (rb != NULL) {
20459d709d503bab6e2b61931737e662dd293b40578ccornelius        UResourceBundle *measDataBundle = ures_getByKey(rb, region, NULL, status);
20559d709d503bab6e2b61931737e662dd293b40578ccornelius        if (U_SUCCESS(*status)) {
20659d709d503bab6e2b61931737e662dd293b40578ccornelius        	measTypeBundle = ures_getByKey(measDataBundle, measurementType, NULL, status);
20759d709d503bab6e2b61931737e662dd293b40578ccornelius        }
20859d709d503bab6e2b61931737e662dd293b40578ccornelius        if (*status == U_MISSING_RESOURCE_ERROR) {
20959d709d503bab6e2b61931737e662dd293b40578ccornelius            *status = U_ZERO_ERROR;
21059d709d503bab6e2b61931737e662dd293b40578ccornelius            if (measDataBundle != NULL) {
21159d709d503bab6e2b61931737e662dd293b40578ccornelius                ures_close(measDataBundle);
21259d709d503bab6e2b61931737e662dd293b40578ccornelius            }
21359d709d503bab6e2b61931737e662dd293b40578ccornelius            measDataBundle = ures_getByKey(rb, "001", NULL, status);
21459d709d503bab6e2b61931737e662dd293b40578ccornelius            measTypeBundle = ures_getByKey(measDataBundle, measurementType, NULL, status);
21559d709d503bab6e2b61931737e662dd293b40578ccornelius        }
21659d709d503bab6e2b61931737e662dd293b40578ccornelius        ures_close(measDataBundle);
21759d709d503bab6e2b61931737e662dd293b40578ccornelius    }
21859d709d503bab6e2b61931737e662dd293b40578ccornelius    ures_close(rb);
21959d709d503bab6e2b61931737e662dd293b40578ccornelius    return measTypeBundle;
22059d709d503bab6e2b61931737e662dd293b40578ccornelius}
22159d709d503bab6e2b61931737e662dd293b40578ccornelius
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UMeasurementSystem U_EXPORT2
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruulocdata_getMeasurementSystem(const char *localeID, UErrorCode *status){
224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle* measurement=NULL;
226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UMeasurementSystem system = UMS_LIMIT;
227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == NULL || U_FAILURE(*status)){
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return system;
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
23259d709d503bab6e2b61931737e662dd293b40578ccornelius    measurement = measurementTypeBundleForLocale(localeID, MEASUREMENT_SYSTEM, status);
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    system = (UMeasurementSystem) ures_getInt(measurement, status);
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(measurement);
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return system;
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruulocdata_getPaperSize(const char* localeID, int32_t *height, int32_t *width, UErrorCode *status){
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle* paperSizeBundle = NULL;
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t* paperSize=NULL;
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len = 0;
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == NULL || U_FAILURE(*status)){
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
25159d709d503bab6e2b61931737e662dd293b40578ccornelius    paperSizeBundle = measurementTypeBundleForLocale(localeID, PAPER_SIZE, status);
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    paperSize = ures_getIntVector(paperSizeBundle, &len,  status);
253b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(*status)){
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(len < 2){
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *status = U_INTERNAL_PROGRAM_ERROR;
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *height = paperSize[0];
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *width  = paperSize[1];
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
262b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(paperSizeBundle);
264b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
26754dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI void U_EXPORT2
268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruulocdata_getCLDRVersion(UVersionInfo versionArray, UErrorCode *status) {
269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UResourceBundle *rb = NULL;
270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    rb = ures_openDirect(NULL, "supplementalData", status);
271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ures_getVersionByKey(rb, "cldrVersion", versionArray, status);
272b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ures_close(rb);
273b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
274b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
27554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI int32_t U_EXPORT2
276b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruulocdata_getLocaleDisplayPattern(ULocaleData *uld,
277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                 UChar *result,
278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                 int32_t resultCapacity,
279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                 UErrorCode *status) {
280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UResourceBundle *patternBundle;
281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t len = 0;
282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UChar *pattern = NULL;
283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode localStatus = U_ZERO_ERROR;
284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(*status))
286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return 0;
287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
28850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    patternBundle = ures_getByKey(uld->langBundle, "localeDisplayPattern", NULL, &localStatus);
289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if ( (localStatus == U_USING_DEFAULT_WARNING) && uld->noSubstitute ) {
291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        localStatus = U_MISSING_RESOURCE_ERROR;
292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (localStatus != U_ZERO_ERROR) {
295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        *status = localStatus;
296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
298b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(*status)){
299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ures_close(patternBundle);
300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return 0;
301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
302b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    pattern = ures_getStringByKey(patternBundle, "pattern", &len, &localStatus);
304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ures_close(patternBundle);
305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if ( (localStatus == U_USING_DEFAULT_WARNING) && uld->noSubstitute ) {
307b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        localStatus = U_MISSING_RESOURCE_ERROR;
308b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (localStatus != U_ZERO_ERROR) {
311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        *status = localStatus;
312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(*status)){
315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return 0;
316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strncpy(result, pattern, resultCapacity);
319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return len;
320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
32354dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI int32_t U_EXPORT2
324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruulocdata_getLocaleSeparator(ULocaleData *uld,
325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                            UChar *result,
326b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                            int32_t resultCapacity,
327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                            UErrorCode *status)  {
328b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UResourceBundle *separatorBundle;
329b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t len = 0;
330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UChar *separator = NULL;
331b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode localStatus = U_ZERO_ERROR;
33259d709d503bab6e2b61931737e662dd293b40578ccornelius    UChar *p0, *p1;
33359d709d503bab6e2b61931737e662dd293b40578ccornelius    static const UChar sub0[4] = { 0x007b, 0x0030, 0x007d , 0x0000 }; /* {0} */
33459d709d503bab6e2b61931737e662dd293b40578ccornelius    static const UChar sub1[4] = { 0x007b, 0x0031, 0x007d , 0x0000 }; /* {1} */
33559d709d503bab6e2b61931737e662dd293b40578ccornelius    static const int32_t subLen = 3;
336b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
337b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(*status))
338b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return 0;
339b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
34050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    separatorBundle = ures_getByKey(uld->langBundle, "localeDisplayPattern", NULL, &localStatus);
341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if ( (localStatus == U_USING_DEFAULT_WARNING) && uld->noSubstitute ) {
343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        localStatus = U_MISSING_RESOURCE_ERROR;
344b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
346b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (localStatus != U_ZERO_ERROR) {
347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        *status = localStatus;
348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
350b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(*status)){
351b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ures_close(separatorBundle);
352b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return 0;
353b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    separator = ures_getStringByKey(separatorBundle, "separator", &len, &localStatus);
356b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ures_close(separatorBundle);
357b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
358b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if ( (localStatus == U_USING_DEFAULT_WARNING) && uld->noSubstitute ) {
359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        localStatus = U_MISSING_RESOURCE_ERROR;
360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
361b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
362b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (localStatus != U_ZERO_ERROR) {
363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        *status = localStatus;
364b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
365b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
366b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(*status)){
367b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return 0;
368b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
369b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
37059d709d503bab6e2b61931737e662dd293b40578ccornelius    /* For backwards compatibility, if we have a pattern, return the portion between {0} and {1} */
37159d709d503bab6e2b61931737e662dd293b40578ccornelius    p0=u_strstr(separator, sub0);
37259d709d503bab6e2b61931737e662dd293b40578ccornelius    p1=u_strstr(separator, sub1);
37359d709d503bab6e2b61931737e662dd293b40578ccornelius    if (p0!=NULL && p1!=NULL && p0<=p1) {
37459d709d503bab6e2b61931737e662dd293b40578ccornelius        separator = (const UChar *)p0 + subLen;
37559d709d503bab6e2b61931737e662dd293b40578ccornelius        len = p1 - separator;
37659d709d503bab6e2b61931737e662dd293b40578ccornelius        /* Desired separator is no longer zero-terminated; handle that if necessary */
37759d709d503bab6e2b61931737e662dd293b40578ccornelius        if (len < resultCapacity) {
37859d709d503bab6e2b61931737e662dd293b40578ccornelius            u_strncpy(result, separator, len);
37959d709d503bab6e2b61931737e662dd293b40578ccornelius            result[len] = 0;
38059d709d503bab6e2b61931737e662dd293b40578ccornelius            return len;
38159d709d503bab6e2b61931737e662dd293b40578ccornelius        }
38259d709d503bab6e2b61931737e662dd293b40578ccornelius    }
38359d709d503bab6e2b61931737e662dd293b40578ccornelius
384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_strncpy(result, separator, resultCapacity);
385b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return len;
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
387