]> granicus.if.org Git - icu/commitdiff
ICU-10258 Free minus sign and plus sign set in a clean up function.
authorTravis Keep <keep94@gmail.com>
Thu, 15 Aug 2013 21:02:16 +0000 (21:02 +0000)
committerTravis Keep <keep94@gmail.com>
Thu, 15 Aug 2013 21:02:16 +0000 (21:02 +0000)
X-SVN-Rev: 34045

icu4c/source/i18n/decfmtst.cpp
icu4c/source/i18n/decfmtst.h
icu4c/source/i18n/decimfmt.cpp

index c9df897e1a465d1454dad8b0d052d607edbd95bd..44872a7d6595f8416012d7ca3ca9340d2b26bf23 100644 (file)
@@ -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)) {
index e3208421d6199310a6eaa35e2353dd7daebf3cf7..c6db2234588959d0e614a25fe8211fd33ae8ad0a 100644 (file)
@@ -51,6 +51,11 @@ public:
     UnicodeSet *fDefaultGroupingSeparators;
     UnicodeSet *fStrictDefaultGroupingSeparators;
 
+    UnicodeSet *fMinusSigns;
+    UnicodeSet *fPlusSigns;
+private:
+    void cleanup();
+
 };
 
 
index df2dc48fc4902bc1940102e42f012a723c4e4c2a..60d1de0aa3fc3a4e6bb8d04f893be7afb5b4a029 100644 (file)
@@ -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 (a<b) ? a : b; }
@@ -2906,9 +2852,19 @@ int32_t DecimalFormat::compareAffix(const UnicodeString& text,
 }
 
 static UBool equalWithSignCompatibility(UChar32 lhs, UChar32 rhs) {
-  return lhs == rhs
-      || (getMinusSigns()->contains(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));
 }
 
 /**