/* ****************************************************************************** * * * Copyright (C) 2003-2005, International Business Machines * * Corporation and others. All Rights Reserved. * * * ****************************************************************************** * file name: ulocdata.c * encoding: US-ASCII * tab size: 8 (not used) * indentation:4 * * created on: 2003Oct21 * created by: Ram Viswanadha */ #include "unicode/ulocdata.h" #define MEASUREMENT_SYSTEM "MeasurementSystem" #define PAPER_SIZE "PaperSize" U_CAPI ULocaleData* U_EXPORT2 ulocdata_open(const char *localeID, UErrorCode *status) { ULocaleData *uld; if (U_FAILURE(*status)) { return NULL; } uld = (ULocaleData *)uprv_malloc(sizeof(ULocaleData)); if (uld == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; return(NULL); } uld->noSubstitute = FALSE; uld->bundle = ures_open(NULL, localeID, status); if (U_FAILURE(*status)) { uprv_free(uld); return NULL; } return uld; } U_CAPI void U_EXPORT2 ulocdata_close(ULocaleData *uld) { if ( uld != NULL ) { ures_close(uld->bundle); uprv_free(uld); } } U_CAPI USet* U_EXPORT2 ulocdata_getExemplarSet(ULocaleData *uld, USet *fillIn, uint32_t options, ULocaleDataExemplarSetType extype, UErrorCode *status){ const char* exemplarSetTypes[] = { "ExemplarCharacters", "AuxExemplarCharacters" }; const UChar *exemplarChars = NULL; int32_t len = 0; UErrorCode localStatus = U_ZERO_ERROR; if (U_FAILURE(*status)) return NULL; exemplarChars = ures_getStringByKey(uld->bundle, exemplarSetTypes[extype], &len, &localStatus); if (U_FAILURE(localStatus) || (*status != U_USING_DEFAULT_WARNING && localStatus != U_ZERO_ERROR)) { *status = localStatus; } if(fillIn != NULL) uset_applyPattern(fillIn, exemplarChars, len, USET_IGNORE_SPACE | options, status); else fillIn = uset_openPatternOptions(exemplarChars, len, USET_IGNORE_SPACE | options, status); return fillIn; } U_CAPI int32_t U_EXPORT2 ulocdata_getDelimiter(ULocaleData *uld, ULocaleDataDelimiterType type, UChar *result, int32_t resultLength, UErrorCode *status){ /* TODO: fix this function */ const char* delimiterKeys[] = { "delimiters/quotationStart", "delimiters/quotationEnd", "delimiters/alternateQuotationStart", "delimiters/alternateQuotationEnd" }; int32_t len = 0; const UChar *delimiter = NULL; UErrorCode localStatus = U_ZERO_ERROR; if (U_FAILURE(*status)) return NULL; delimiter = ures_getStringByKey(uld->bundle, delimiterKeys[type], &len, &localStatus); if (U_FAILURE(localStatus) || (*status != U_USING_DEFAULT_WARNING && localStatus != U_ZERO_ERROR)) { *status = localStatus; } u_strncpy(result,delimiter,resultLength); return len; } U_CAPI UMeasurementSystem U_EXPORT2 ulocdata_getMeasurementSystem(const char *localeID, UErrorCode *status){ UResourceBundle* bundle=NULL; UResourceBundle* measurement=NULL; UMeasurementSystem system = UMS_LIMIT; if(status == NULL || U_FAILURE(*status)){ return system; } bundle = ures_open(NULL, localeID, status); measurement = ures_getByKey(bundle, MEASUREMENT_SYSTEM, NULL, status); system = (UMeasurementSystem) ures_getInt(measurement, status); ures_close(bundle); ures_close(measurement); return system; } U_CAPI void U_EXPORT2 ulocdata_getPaperSize(const char* localeID, int32_t *height, int32_t *width, UErrorCode *status){ UResourceBundle* bundle=NULL; UResourceBundle* paperSizeBundle = NULL; const int32_t* paperSize=NULL; int32_t len = 0; if(status == NULL || U_FAILURE(*status)){ return; } bundle = ures_open(NULL, localeID, status); paperSizeBundle = ures_getByKey(bundle, PAPER_SIZE, NULL, status); paperSize = ures_getIntVector(paperSizeBundle, &len, status); if(U_SUCCESS(*status)){ if(len < 2){ *status = U_INTERNAL_PROGRAM_ERROR; }else{ *height = paperSize[0]; *width = paperSize[1]; } } ures_close(bundle); ures_close(paperSizeBundle); }