From: Travis Keep Date: Thu, 15 Aug 2013 21:02:16 +0000 (+0000) Subject: ICU-10258 Free minus sign and plus sign set in a clean up function. X-Git-Tag: milestone-59-0-1~2709 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=60501becc409205f8e3ff760c69f6d641192c4f3;p=icu ICU-10258 Free minus sign and plus sign set in a clean up function. X-SVN-Rev: 34045 --- diff --git a/icu4c/source/i18n/decfmtst.cpp b/icu4c/source/i18n/decfmtst.cpp index c9df897e1a4..44872a7d659 100644 --- a/icu4c/source/i18n/decfmtst.cpp +++ b/icu4c/source/i18n/decfmtst.cpp @@ -69,6 +69,29 @@ static const UChar gStrictDashEquivalentsPattern[] = { // [ \ - MINUS ] 0x005B, 0x005C, 0x002D, 0x2212, 0x005D, 0x0000}; +static UChar32 gMinusSigns[] = { + 0x002D, + 0x207B, + 0x208B, + 0x2212, + 0x2796, + 0xFE63, + 0xFF0D}; + +static UChar32 gPlusSigns[] = { + 0x002B, + 0x207A, + 0x208A, + 0x2795, + 0xfB29, + 0xFE62, + 0xFF0B}; + +static void initUnicodeSet(const UChar32 *raw, int32_t len, UnicodeSet *s) { + for (int32_t i = 0; i < len; ++i) { + s->add(raw[i]); + } +} DecimalFormatStaticSets::DecimalFormatStaticSets(UErrorCode &status) : fDotEquivalents(NULL), @@ -80,7 +103,9 @@ DecimalFormatStaticSets::DecimalFormatStaticSets(UErrorCode &status) fStrictOtherGroupingSeparators(NULL), fStrictDashEquivalents(NULL), fDefaultGroupingSeparators(NULL), - fStrictDefaultGroupingSeparators(NULL) + fStrictDefaultGroupingSeparators(NULL), + fMinusSigns(NULL), + fPlusSigns(NULL) { fDotEquivalents = new UnicodeSet(UnicodeString(TRUE, gDotEquivalentsPattern, -1), status); fCommaEquivalents = new UnicodeSet(UnicodeString(TRUE, gCommaEquivalentsPattern, -1), status); @@ -101,13 +126,28 @@ DecimalFormatStaticSets::DecimalFormatStaticSets(UErrorCode &status) fStrictDefaultGroupingSeparators->addAll(*fStrictCommaEquivalents); fStrictDefaultGroupingSeparators->addAll(*fStrictOtherGroupingSeparators); + fMinusSigns = new UnicodeSet(); + fPlusSigns = new UnicodeSet(); + // Check for null pointers if (fDotEquivalents == NULL || fCommaEquivalents == NULL || fOtherGroupingSeparators == NULL || fDashEquivalents == NULL || fStrictDotEquivalents == NULL || fStrictCommaEquivalents == NULL || fStrictOtherGroupingSeparators == NULL || fStrictDashEquivalents == NULL || - fDefaultGroupingSeparators == NULL || fStrictOtherGroupingSeparators == NULL) { - goto ExitConstrDeleteAll; + fDefaultGroupingSeparators == NULL || fStrictOtherGroupingSeparators == NULL || + fMinusSigns == NULL || fPlusSigns == NULL) { + cleanup(); + status = U_MEMORY_ALLOCATION_ERROR; + return; } + initUnicodeSet( + gMinusSigns, + sizeof(gMinusSigns) / sizeof(gMinusSigns[0]), + fMinusSigns); + initUnicodeSet( + gPlusSigns, + sizeof(gPlusSigns) / sizeof(gPlusSigns[0]), + fPlusSigns); + // Freeze all the sets fDotEquivalents->freeze(); fCommaEquivalents->freeze(); @@ -119,27 +159,15 @@ DecimalFormatStaticSets::DecimalFormatStaticSets(UErrorCode &status) fStrictDashEquivalents->freeze(); fDefaultGroupingSeparators->freeze(); fStrictDefaultGroupingSeparators->freeze(); - - return; // If we reached this point, everything is fine so just exit - -ExitConstrDeleteAll: // Remove fPropSets and fRuleSets and return error - delete fDotEquivalents; fDotEquivalents = NULL; - delete fCommaEquivalents; fCommaEquivalents = NULL; - delete fOtherGroupingSeparators; fOtherGroupingSeparators = NULL; - delete fDashEquivalents; fDashEquivalents = NULL; - delete fStrictDotEquivalents; fStrictDotEquivalents = NULL; - delete fStrictCommaEquivalents; fStrictCommaEquivalents = NULL; - delete fStrictOtherGroupingSeparators; fStrictOtherGroupingSeparators = NULL; - delete fStrictDashEquivalents; fStrictDashEquivalents = NULL; - delete fDefaultGroupingSeparators; fDefaultGroupingSeparators = NULL; - delete fStrictDefaultGroupingSeparators; fStrictDefaultGroupingSeparators = NULL; - delete fStrictOtherGroupingSeparators; fStrictOtherGroupingSeparators = NULL; - - status = U_MEMORY_ALLOCATION_ERROR; + fMinusSigns->freeze(); + fPlusSigns->freeze(); } - DecimalFormatStaticSets::~DecimalFormatStaticSets() { + cleanup(); +} + +void DecimalFormatStaticSets::cleanup() { // Be sure to clean up newly added fields! delete fDotEquivalents; fDotEquivalents = NULL; delete fCommaEquivalents; fCommaEquivalents = NULL; delete fOtherGroupingSeparators; fOtherGroupingSeparators = NULL; @@ -151,9 +179,10 @@ DecimalFormatStaticSets::~DecimalFormatStaticSets() { delete fDefaultGroupingSeparators; fDefaultGroupingSeparators = NULL; delete fStrictDefaultGroupingSeparators; fStrictDefaultGroupingSeparators = NULL; delete fStrictOtherGroupingSeparators; fStrictOtherGroupingSeparators = NULL; + delete fMinusSigns; fMinusSigns = NULL; + delete fPlusSigns; fPlusSigns = NULL; } - static DecimalFormatStaticSets *gStaticSets; static UInitOnce gStaticSetsInitOnce = U_INITONCE_INITIALIZER; @@ -175,6 +204,7 @@ decimfmt_cleanup(void) } static void U_CALLCONV initSets(UErrorCode &status) { + U_ASSERT(gStaticSets == NULL); ucln_i18n_registerCleanup(UCLN_I18N_DECFMT, decimfmt_cleanup); gStaticSets = new DecimalFormatStaticSets(status); if (U_FAILURE(status)) { diff --git a/icu4c/source/i18n/decfmtst.h b/icu4c/source/i18n/decfmtst.h index e3208421d61..c6db2234588 100644 --- a/icu4c/source/i18n/decfmtst.h +++ b/icu4c/source/i18n/decfmtst.h @@ -51,6 +51,11 @@ public: UnicodeSet *fDefaultGroupingSeparators; UnicodeSet *fStrictDefaultGroupingSeparators; + UnicodeSet *fMinusSigns; + UnicodeSet *fPlusSigns; +private: + void cleanup(); + }; diff --git a/icu4c/source/i18n/decimfmt.cpp b/icu4c/source/i18n/decimfmt.cpp index df2dc48fc49..60d1de0aa3f 100644 --- a/icu4c/source/i18n/decimfmt.cpp +++ b/icu4c/source/i18n/decimfmt.cpp @@ -283,60 +283,6 @@ static const char fgPatterns[]="patterns"; static const char fgDecimalFormat[]="decimalFormat"; static const char fgCurrencyFormat[]="currencyFormat"; -static UChar32 gMinusSigns[] = { - 0x002D, - 0x207B, - 0x208B, - 0x2212, - 0x2796, - 0xFE63, - 0xFF0D}; - -static UChar32 gPlusSigns[] = { - 0x002B, - 0x207A, - 0x208A, - 0x2795, - 0xfB29, - 0xFE62, - 0xFF0B}; - -static UnicodeSet *gMinusSignsSet = NULL; -static UnicodeSet *gPlusSignsSet = NULL; - -static UInitOnce gSignsInitOnce = U_INITONCE_INITIALIZER; - -static void initSigns(const UChar32 *raw, int32_t len, UnicodeSet *s) { - for (int32_t i = 0; i < len; ++i) { - s->add(raw[i]); - } -} - -static void U_CALLCONV initSigns() { - U_ASSERT(gMinusSignsSet == NULL); - U_ASSERT(gPlusSignsSet == NULL); - gMinusSignsSet = new UnicodeSet(); - gPlusSignsSet = new UnicodeSet(); - initSigns( - gMinusSigns, - sizeof(gMinusSigns) / sizeof(gMinusSigns[0]), - gMinusSignsSet); - initSigns( - gPlusSigns, - sizeof(gPlusSigns) / sizeof(gPlusSigns[0]), - gPlusSignsSet); -} - -static const UnicodeSet* getMinusSigns() { - umtx_initOnce(gSignsInitOnce, &initSigns); - return gMinusSignsSet; -} - -static const UnicodeSet* getPlusSigns() { - umtx_initOnce(gSignsInitOnce, &initSigns); - return gPlusSignsSet; -} - static const UChar fgTripleCurrencySign[] = {0xA4, 0xA4, 0xA4, 0}; inline int32_t _min(int32_t a, int32_t b) { return (acontains(lhs) && getMinusSigns()->contains(rhs)) - || (getPlusSigns()->contains(lhs) && getPlusSigns()->contains(rhs)); + if (lhs == rhs) { + return TRUE; + } + UErrorCode status = U_ZERO_ERROR; + const DecimalFormatStaticSets* staticSets = DecimalFormatStaticSets::getStaticSets(status); + if (U_FAILURE(status)) { + // This is the best we can do + return FALSE; + } + const UnicodeSet *minusSigns = staticSets->fMinusSigns; + const UnicodeSet *plusSigns = staticSets->fPlusSigns; + return (minusSigns->contains(lhs) && minusSigns->contains(rhs)) || + (plusSigns->contains(lhs) && plusSigns->contains(rhs)); } /**