ICU-9543 Simplify code that finds UNUM_SHORT and UNUM_LONG data. Thanks Mark Davis.

X-SVN-Rev: 32852
This commit is contained in:
Travis Keep 2012-11-16 17:50:41 +00:00
parent e929da430f
commit 3688cea886

View File

@ -55,12 +55,6 @@ enum QuoteState {
INSIDE_FULL
};
enum DataLocation {
LOCAL_LOC,
LATIN_LOC,
ROOT_LOC
};
enum FallbackFlags {
ANY = 0,
MUST = 1,
@ -488,15 +482,12 @@ static CDFLocaleData* loadCDFLocaleData(const Locale& inLocale, UErrorCode& stat
// initCDFLocaleData initializes result with data from CLDR.
// inLocale is the locale, the CLDR data is stored in result.
// First we load the UNUM_SHORT data looking first in local numbering
// We load the UNUM_SHORT and UNUM_LONG data looking first in local numbering
// system and not including root locale in fallback. Next we try in the latn
// numbering system where we fallback all the way to root. So we find the
// short data in one of 3 places: the local numbering system, the latn
// numbering system non root, latn numbering system root locale.
// Next we look for the UNUM_LONG data in the same way except that if we don't
// find the UNUM_LONG data before we get to where we found the UNUM_SHORT data
// we mark our UNUM_LONG data bogus so that it will fallback to what we have
// for UNUM_SHORT.
// numbering system where we fallback all the way to root. If we don't find
// UNUM_SHORT data in these three places, we report an error. If we find
// UNUM_SHORT data before finding UNUM_LONG data we make UNUM_LONG data fall
// back to UNUM_SHORT data.
static void initCDFLocaleData(const Locale& inLocale, CDFLocaleData* result, UErrorCode& status) {
LocalPointer<NumberingSystem> ns(NumberingSystem::createInstance(inLocale, status));
if (U_FAILURE(status)) {
@ -509,53 +500,51 @@ static void initCDFLocaleData(const Locale& inLocale, CDFLocaleData* result, UEr
ures_close(rb);
return;
}
LocalUResourceBundlePointer localResource;
LocalUResourceBundlePointer latnResource;
UResourceBundle* dataFillIn = NULL;
UResourceBundle* data = NULL;
UResourceBundle* shortDataFillIn = NULL;
UResourceBundle* longDataFillIn = NULL;
UResourceBundle* shortData = NULL;
UResourceBundle* longData = NULL;
// Look in local numbering system first for UNUM_SHORT if it is not latn
DataLocation shortLocation = LOCAL_LOC;
if (uprv_strcmp(numberingSystemName, gLatnTag) != 0) {
localResource.adoptInstead(tryGetByKeyWithFallback(rb, numberingSystemName, NULL, NOT_ROOT, status));
data = tryGetDecimalFallback(localResource.getAlias(), gPatternsShort, &dataFillIn, NOT_ROOT, status);
LocalUResourceBundlePointer localResource(
tryGetByKeyWithFallback(rb, numberingSystemName, NULL, NOT_ROOT, status));
shortData = tryGetDecimalFallback(
localResource.getAlias(), gPatternsShort, &shortDataFillIn, NOT_ROOT, status);
longData = tryGetDecimalFallback(
localResource.getAlias(), gPatternsLong, &longDataFillIn, NOT_ROOT, status);
}
// If we haven't found UNUM_SHORT look in latn numbering system. We must
// succeed at finding UNUM_SHORT here.
if (data == NULL) {
latnResource.adoptInstead(tryGetByKeyWithFallback(rb, gLatnTag, NULL, MUST, status));
data = tryGetDecimalFallback(latnResource.getAlias(), gPatternsShort, &dataFillIn, MUST, status);
shortLocation = isRoot(data, status) ? ROOT_LOC : LATIN_LOC;
}
initCDFLocaleStyleData(data, &result->shortData, status);
if (U_FAILURE(status)) {
ures_close(dataFillIn);
ures_close(shortDataFillIn);
ures_close(longDataFillIn);
ures_close(rb);
return;
}
data = NULL;
// Look for UNUM_LONG data in local numbering system first.
data = tryGetDecimalFallback(localResource.getAlias(), gPatternsLong, &dataFillIn, NOT_ROOT, status);
// If we haven't found UNUM_SHORT look in latn numbering system. We must
// succeed at finding UNUM_SHORT here.
if (shortData == NULL) {
LocalUResourceBundlePointer latnResource(tryGetByKeyWithFallback(rb, gLatnTag, NULL, MUST, status));
shortData = tryGetDecimalFallback(latnResource.getAlias(), gPatternsShort, &shortDataFillIn, MUST, status);
if (longData == NULL) {
longData = tryGetDecimalFallback(latnResource.getAlias(), gPatternsLong, &longDataFillIn, ANY, status);
if (longData != NULL && isRoot(longData, status) && !isRoot(shortData, status)) {
longData = NULL;
}
}
}
initCDFLocaleStyleData(shortData, &result->shortData, status);
ures_close(shortDataFillIn);
if (U_FAILURE(status)) {
ures_close(longDataFillIn);
ures_close(rb);
}
// If we haven't found UNUM_LONG and we found the UNUM_SHORT data in the latn
// Numbering system, continue. If we find UNUM_LONG in the latin numbering
// system, we have to be sure that we didn't find it after where we found
// UNUM_SHORT.
if (data == NULL && shortLocation != LOCAL_LOC) {
data = tryGetDecimalFallback(latnResource.getAlias(), gPatternsLong, &dataFillIn, ANY, status);
if (data != NULL) {
if (shortLocation == LATIN_LOC && isRoot(data, status)) {
data = NULL;
}
}
}
if (data == NULL) {
if (longData == NULL) {
result->longData.setToBogus();
} else {
initCDFLocaleStyleData(data, &result->longData, status);
initCDFLocaleStyleData(longData, &result->longData, status);
}
ures_close(dataFillIn);
ures_close(longDataFillIn);
ures_close(rb);
}