static UResourceBundle * measurementTypeBundleForLocale(const char *localeID, const char *measurementType, UErrorCode *status){ char region[ULOC_COUNTRY_CAPACITY]; UResourceBundle *rb; UResourceBundle *measTypeBundle = NULL; ulocimp_getRegionForSupplementalData(localeID, TRUE, region, ULOC_COUNTRY_CAPACITY, status); rb = ures_openDirect(NULL, "supplementalData", status); ures_getByKey(rb, "measurementData", rb, status); if (rb != NULL) { UResourceBundle *measDataBundle = ures_getByKey(rb, region, NULL, status); if (U_SUCCESS(*status)) { measTypeBundle = ures_getByKey(measDataBundle, measurementType, NULL, status); } if (*status == U_MISSING_RESOURCE_ERROR) { *status = U_ZERO_ERROR; if (measDataBundle != NULL) { ures_close(measDataBundle); } measDataBundle = ures_getByKey(rb, "001", NULL, status); measTypeBundle = ures_getByKey(measDataBundle, measurementType, NULL, status); } ures_close(measDataBundle); } ures_close(rb); return measTypeBundle; }
U_CAPI UEnumeration* U_EXPORT2 ucal_getKeywordValuesForLocale(const char * /* key */, const char* locale, UBool commonlyUsed, UErrorCode *status) { // Resolve region char prefRegion[ULOC_COUNTRY_CAPACITY]; (void)ulocimp_getRegionForSupplementalData(locale, TRUE, prefRegion, sizeof(prefRegion), status); // Read preferred calendar values from supplementalData calendarPreference UResourceBundle *rb = ures_openDirect(NULL, "supplementalData", status); ures_getByKey(rb, "calendarPreferenceData", rb, status); UResourceBundle *order = ures_getByKey(rb, prefRegion, NULL, status); if (*status == U_MISSING_RESOURCE_ERROR && rb != NULL) { *status = U_ZERO_ERROR; order = ures_getByKey(rb, "001", NULL, status); } // Create a list of calendar type strings UList *values = NULL; if (U_SUCCESS(*status)) { values = ulist_createEmptyList(status); if (U_SUCCESS(*status)) { for (int i = 0; i < ures_getSize(order); i++) { int32_t len; const UChar *type = ures_getStringByIndex(order, i, &len, status); char *caltype = (char*)uprv_malloc(len + 1); if (caltype == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; break; } u_UCharsToChars(type, caltype, len); *(caltype + len) = 0; ulist_addItemEndList(values, caltype, TRUE, status); if (U_FAILURE(*status)) { break; } } if (U_SUCCESS(*status) && !commonlyUsed) { // If not commonlyUsed, add other available values for (int32_t i = 0; CAL_TYPES[i] != NULL; i++) { if (!ulist_containsString(values, CAL_TYPES[i], (int32_t)uprv_strlen(CAL_TYPES[i]))) { ulist_addItemEndList(values, CAL_TYPES[i], FALSE, status); if (U_FAILURE(*status)) { break; } } } } if (U_FAILURE(*status)) { ulist_deleteList(values); values = NULL; } } } ures_close(order); ures_close(rb); if (U_FAILURE(*status) || values == NULL) { return NULL; } // Create string enumeration UEnumeration *en = (UEnumeration*)uprv_malloc(sizeof(UEnumeration)); if (en == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; ulist_deleteList(values); return NULL; } ulist_resetList(values); memcpy(en, &defaultKeywordValues, sizeof(UEnumeration)); en->context = values; return en; }