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