decfmtst.cpp revision 64339d36f8bd4db5025fe2988eda22b491a9219c
164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others. 264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html 3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 4b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho******************************************************************************* 58de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert* Copyright (C) 2009-2016, International Business Machines Corporation and 68de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert* others. All Rights Reserved. 7b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho******************************************************************************* 8b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* 9b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* This file contains the class DecimalFormatStaticSets 10b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* 11b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* DecimalFormatStaticSets holds the UnicodeSets that are needed for lenient 12b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* parsing of decimal and group separators. 13b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho******************************************************************************** 14b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*/ 15b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 16b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/utypes.h" 17b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 18b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if !UCONFIG_NO_FORMATTING 19b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 20b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/unistr.h" 21b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/uniset.h" 22b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/uchar.h" 23b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "cmemory.h" 24b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "cstring.h" 25b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "uassert.h" 26b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "ucln_in.h" 27b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "umutex.h" 28b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 29b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "decfmtst.h" 30b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 31b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_NAMESPACE_BEGIN 32b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 33b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 34b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//------------------------------------------------------------------------------ 35b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// 36b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// Unicode Set pattern strings for all of the required constant sets. 37b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// Initialized with hex values for portability to EBCDIC based machines. 38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// Really ugly, but there's no good way to avoid it. 39b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// 40b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//------------------------------------------------------------------------------ 41b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 42b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar gDotEquivalentsPattern[] = { 43b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // [ . \u2024 \u3002 \uFE12 \uFE52 \uFF0E \uFF61 ] 44b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x005B, 0x002E, 0x2024, 0x3002, 0xFE12, 0xFE52, 0xFF0E, 0xFF61, 0x005D, 0x0000}; 45b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 46b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar gCommaEquivalentsPattern[] = { 47b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // [ , \u060C \u066B \u3001 \uFE10 \uFE11 \uFE50 \uFE51 \uFF0C \uFF64 ] 48b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x005B, 0x002C, 0x060C, 0x066B, 0x3001, 0xFE10, 0xFE11, 0xFE50, 0xFE51, 0xFF0C, 0xFF64, 0x005D, 0x0000}; 49b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 50b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar gOtherGroupingSeparatorsPattern[] = { 51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // [ \ SPACE ' NBSP \u066C \u2000 - \u200A \u2018 \u2019 \u202F \u205F \u3000 \uFF07 ] 52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x005B, 0x005C, 0x0020, 0x0027, 0x00A0, 0x066C, 0x2000, 0x002D, 0x200A, 0x2018, 0x2019, 0x202F, 0x205F, 0x3000, 0xFF07, 0x005D, 0x0000}; 53b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar gDashEquivalentsPattern[] = { 55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // [ \ - HYPHEN F_DASH N_DASH MINUS ] 56b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x005B, 0x005C, 0x002D, 0x2010, 0x2012, 0x2013, 0x2212, 0x005D, 0x0000}; 57b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 58b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar gStrictDotEquivalentsPattern[] = { 59b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // [ . \u2024 \uFE52 \uFF0E \uFF61 ] 60b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x005B, 0x002E, 0x2024, 0xFE52, 0xFF0E, 0xFF61, 0x005D, 0x0000}; 61b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 62b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar gStrictCommaEquivalentsPattern[] = { 63b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // [ , \u066B \uFE10 \uFE50 \uFF0C ] 64b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x005B, 0x002C, 0x066B, 0xFE10, 0xFE50, 0xFF0C, 0x005D, 0x0000}; 65b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 66b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar gStrictOtherGroupingSeparatorsPattern[] = { 67b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // [ \ SPACE ' NBSP \u066C \u2000 - \u200A \u2018 \u2019 \u202F \u205F \u3000 \uFF07 ] 68b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x005B, 0x005C, 0x0020, 0x0027, 0x00A0, 0x066C, 0x2000, 0x002D, 0x200A, 0x2018, 0x2019, 0x202F, 0x205F, 0x3000, 0xFF07, 0x005D, 0x0000}; 69b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 70b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar gStrictDashEquivalentsPattern[] = { 71b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // [ \ - MINUS ] 72b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x005B, 0x005C, 0x002D, 0x2212, 0x005D, 0x0000}; 73b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 7459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic UChar32 gMinusSigns[] = { 7559d709d503bab6e2b61931737e662dd293b40578ccornelius 0x002D, 7659d709d503bab6e2b61931737e662dd293b40578ccornelius 0x207B, 7759d709d503bab6e2b61931737e662dd293b40578ccornelius 0x208B, 7859d709d503bab6e2b61931737e662dd293b40578ccornelius 0x2212, 7959d709d503bab6e2b61931737e662dd293b40578ccornelius 0x2796, 8059d709d503bab6e2b61931737e662dd293b40578ccornelius 0xFE63, 8159d709d503bab6e2b61931737e662dd293b40578ccornelius 0xFF0D}; 8259d709d503bab6e2b61931737e662dd293b40578ccornelius 8359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic UChar32 gPlusSigns[] = { 8459d709d503bab6e2b61931737e662dd293b40578ccornelius 0x002B, 8559d709d503bab6e2b61931737e662dd293b40578ccornelius 0x207A, 8659d709d503bab6e2b61931737e662dd293b40578ccornelius 0x208A, 8759d709d503bab6e2b61931737e662dd293b40578ccornelius 0x2795, 8859d709d503bab6e2b61931737e662dd293b40578ccornelius 0xfB29, 8959d709d503bab6e2b61931737e662dd293b40578ccornelius 0xFE62, 9059d709d503bab6e2b61931737e662dd293b40578ccornelius 0xFF0B}; 9159d709d503bab6e2b61931737e662dd293b40578ccornelius 9259d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void initUnicodeSet(const UChar32 *raw, int32_t len, UnicodeSet *s) { 9359d709d503bab6e2b61931737e662dd293b40578ccornelius for (int32_t i = 0; i < len; ++i) { 9459d709d503bab6e2b61931737e662dd293b40578ccornelius s->add(raw[i]); 9559d709d503bab6e2b61931737e662dd293b40578ccornelius } 9659d709d503bab6e2b61931737e662dd293b40578ccornelius} 97b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 9859d709d503bab6e2b61931737e662dd293b40578ccorneliusDecimalFormatStaticSets::DecimalFormatStaticSets(UErrorCode &status) 99b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho: fDotEquivalents(NULL), 100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fCommaEquivalents(NULL), 101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fOtherGroupingSeparators(NULL), 102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fDashEquivalents(NULL), 103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictDotEquivalents(NULL), 104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictCommaEquivalents(NULL), 105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictOtherGroupingSeparators(NULL), 106b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictDashEquivalents(NULL), 107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fDefaultGroupingSeparators(NULL), 10859d709d503bab6e2b61931737e662dd293b40578ccornelius fStrictDefaultGroupingSeparators(NULL), 10959d709d503bab6e2b61931737e662dd293b40578ccornelius fMinusSigns(NULL), 11059d709d503bab6e2b61931737e662dd293b40578ccornelius fPlusSigns(NULL) 111b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 11259d709d503bab6e2b61931737e662dd293b40578ccornelius fDotEquivalents = new UnicodeSet(UnicodeString(TRUE, gDotEquivalentsPattern, -1), status); 11359d709d503bab6e2b61931737e662dd293b40578ccornelius fCommaEquivalents = new UnicodeSet(UnicodeString(TRUE, gCommaEquivalentsPattern, -1), status); 11459d709d503bab6e2b61931737e662dd293b40578ccornelius fOtherGroupingSeparators = new UnicodeSet(UnicodeString(TRUE, gOtherGroupingSeparatorsPattern, -1), status); 11559d709d503bab6e2b61931737e662dd293b40578ccornelius fDashEquivalents = new UnicodeSet(UnicodeString(TRUE, gDashEquivalentsPattern, -1), status); 116b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 11759d709d503bab6e2b61931737e662dd293b40578ccornelius fStrictDotEquivalents = new UnicodeSet(UnicodeString(TRUE, gStrictDotEquivalentsPattern, -1), status); 11859d709d503bab6e2b61931737e662dd293b40578ccornelius fStrictCommaEquivalents = new UnicodeSet(UnicodeString(TRUE, gStrictCommaEquivalentsPattern, -1), status); 11959d709d503bab6e2b61931737e662dd293b40578ccornelius fStrictOtherGroupingSeparators = new UnicodeSet(UnicodeString(TRUE, gStrictOtherGroupingSeparatorsPattern, -1), status); 12059d709d503bab6e2b61931737e662dd293b40578ccornelius fStrictDashEquivalents = new UnicodeSet(UnicodeString(TRUE, gStrictDashEquivalentsPattern, -1), status); 121b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 122b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fDefaultGroupingSeparators = new UnicodeSet(*fDotEquivalents); 124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fDefaultGroupingSeparators->addAll(*fCommaEquivalents); 125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fDefaultGroupingSeparators->addAll(*fOtherGroupingSeparators); 126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictDefaultGroupingSeparators = new UnicodeSet(*fStrictDotEquivalents); 128b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictDefaultGroupingSeparators->addAll(*fStrictCommaEquivalents); 129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictDefaultGroupingSeparators->addAll(*fStrictOtherGroupingSeparators); 130b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 13159d709d503bab6e2b61931737e662dd293b40578ccornelius fMinusSigns = new UnicodeSet(); 13259d709d503bab6e2b61931737e662dd293b40578ccornelius fPlusSigns = new UnicodeSet(); 13359d709d503bab6e2b61931737e662dd293b40578ccornelius 134b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Check for null pointers 135b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fDotEquivalents == NULL || fCommaEquivalents == NULL || fOtherGroupingSeparators == NULL || fDashEquivalents == NULL || 136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictDotEquivalents == NULL || fStrictCommaEquivalents == NULL || fStrictOtherGroupingSeparators == NULL || fStrictDashEquivalents == NULL || 13759d709d503bab6e2b61931737e662dd293b40578ccornelius fDefaultGroupingSeparators == NULL || fStrictOtherGroupingSeparators == NULL || 13859d709d503bab6e2b61931737e662dd293b40578ccornelius fMinusSigns == NULL || fPlusSigns == NULL) { 13959d709d503bab6e2b61931737e662dd293b40578ccornelius cleanup(); 14059d709d503bab6e2b61931737e662dd293b40578ccornelius status = U_MEMORY_ALLOCATION_ERROR; 14159d709d503bab6e2b61931737e662dd293b40578ccornelius return; 142b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 14459d709d503bab6e2b61931737e662dd293b40578ccornelius initUnicodeSet( 14559d709d503bab6e2b61931737e662dd293b40578ccornelius gMinusSigns, 1468de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert UPRV_LENGTHOF(gMinusSigns), 14759d709d503bab6e2b61931737e662dd293b40578ccornelius fMinusSigns); 14859d709d503bab6e2b61931737e662dd293b40578ccornelius initUnicodeSet( 14959d709d503bab6e2b61931737e662dd293b40578ccornelius gPlusSigns, 1508de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert UPRV_LENGTHOF(gPlusSigns), 15159d709d503bab6e2b61931737e662dd293b40578ccornelius fPlusSigns); 15259d709d503bab6e2b61931737e662dd293b40578ccornelius 153b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Freeze all the sets 154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fDotEquivalents->freeze(); 155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fCommaEquivalents->freeze(); 156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fOtherGroupingSeparators->freeze(); 157b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fDashEquivalents->freeze(); 158b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictDotEquivalents->freeze(); 159b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictCommaEquivalents->freeze(); 160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictOtherGroupingSeparators->freeze(); 161b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictDashEquivalents->freeze(); 162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fDefaultGroupingSeparators->freeze(); 163b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStrictDefaultGroupingSeparators->freeze(); 16459d709d503bab6e2b61931737e662dd293b40578ccornelius fMinusSigns->freeze(); 16559d709d503bab6e2b61931737e662dd293b40578ccornelius fPlusSigns->freeze(); 166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoDecimalFormatStaticSets::~DecimalFormatStaticSets() { 16959d709d503bab6e2b61931737e662dd293b40578ccornelius cleanup(); 17059d709d503bab6e2b61931737e662dd293b40578ccornelius} 17159d709d503bab6e2b61931737e662dd293b40578ccornelius 17259d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid DecimalFormatStaticSets::cleanup() { // Be sure to clean up newly added fields! 173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete fDotEquivalents; fDotEquivalents = NULL; 174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete fCommaEquivalents; fCommaEquivalents = NULL; 175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete fOtherGroupingSeparators; fOtherGroupingSeparators = NULL; 176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete fDashEquivalents; fDashEquivalents = NULL; 177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete fStrictDotEquivalents; fStrictDotEquivalents = NULL; 178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete fStrictCommaEquivalents; fStrictCommaEquivalents = NULL; 179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete fStrictOtherGroupingSeparators; fStrictOtherGroupingSeparators = NULL; 180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete fStrictDashEquivalents; fStrictDashEquivalents = NULL; 181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete fDefaultGroupingSeparators; fDefaultGroupingSeparators = NULL; 182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete fStrictDefaultGroupingSeparators; fStrictDefaultGroupingSeparators = NULL; 183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete fStrictOtherGroupingSeparators; fStrictOtherGroupingSeparators = NULL; 18459d709d503bab6e2b61931737e662dd293b40578ccornelius delete fMinusSigns; fMinusSigns = NULL; 18559d709d503bab6e2b61931737e662dd293b40578ccornelius delete fPlusSigns; fPlusSigns = NULL; 186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 18859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic DecimalFormatStaticSets *gStaticSets; 18959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic icu::UInitOnce gStaticSetsInitOnce = U_INITONCE_INITIALIZER; 19059d709d503bab6e2b61931737e662dd293b40578ccornelius 191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//------------------------------------------------------------------------------ 193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// 194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// decfmt_cleanup Memory cleanup function, free/delete all 195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// cached memory. Called by ICU's u_cleanup() function. 196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// 197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//------------------------------------------------------------------------------ 198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_CDECL_BEGIN 199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic UBool U_CALLCONV 200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehodecimfmt_cleanup(void) 201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 20259d709d503bab6e2b61931737e662dd293b40578ccornelius delete gStaticSets; 20359d709d503bab6e2b61931737e662dd293b40578ccornelius gStaticSets = NULL; 20459d709d503bab6e2b61931737e662dd293b40578ccornelius gStaticSetsInitOnce.reset(); 20559d709d503bab6e2b61931737e662dd293b40578ccornelius return TRUE; 206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 20859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void U_CALLCONV initSets(UErrorCode &status) { 20959d709d503bab6e2b61931737e662dd293b40578ccornelius U_ASSERT(gStaticSets == NULL); 21059d709d503bab6e2b61931737e662dd293b40578ccornelius ucln_i18n_registerCleanup(UCLN_I18N_DECFMT, decimfmt_cleanup); 21159d709d503bab6e2b61931737e662dd293b40578ccornelius gStaticSets = new DecimalFormatStaticSets(status); 21259d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(status)) { 21359d709d503bab6e2b61931737e662dd293b40578ccornelius delete gStaticSets; 21459d709d503bab6e2b61931737e662dd293b40578ccornelius gStaticSets = NULL; 21559d709d503bab6e2b61931737e662dd293b40578ccornelius return; 21659d709d503bab6e2b61931737e662dd293b40578ccornelius } 21759d709d503bab6e2b61931737e662dd293b40578ccornelius if (gStaticSets == NULL) { 21859d709d503bab6e2b61931737e662dd293b40578ccornelius status = U_MEMORY_ALLOCATION_ERROR; 219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 220b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 22159d709d503bab6e2b61931737e662dd293b40578ccorneliusU_CDECL_END 22259d709d503bab6e2b61931737e662dd293b40578ccornelius 22359d709d503bab6e2b61931737e662dd293b40578ccorneliusconst DecimalFormatStaticSets *DecimalFormatStaticSets::getStaticSets(UErrorCode &status) { 22459d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(gStaticSetsInitOnce, initSets, status); 22559d709d503bab6e2b61931737e662dd293b40578ccornelius return gStaticSets; 22659d709d503bab6e2b61931737e662dd293b40578ccornelius} 22759d709d503bab6e2b61931737e662dd293b40578ccornelius 228b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoconst UnicodeSet *DecimalFormatStaticSets::getSimilarDecimals(UChar32 decimal, UBool strictParse) 230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status = U_ZERO_ERROR; 23259d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(gStaticSetsInitOnce, initSets, status); 233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return NULL; 235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (gStaticSets->fDotEquivalents->contains(decimal)) { 238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return strictParse ? gStaticSets->fStrictDotEquivalents : gStaticSets->fDotEquivalents; 239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (gStaticSets->fCommaEquivalents->contains(decimal)) { 242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return strictParse ? gStaticSets->fStrictCommaEquivalents : gStaticSets->fCommaEquivalents; 243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // if there is no match, return NULL 246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return NULL; 247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_NAMESPACE_END 251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif // !UCONFIG_NO_FORMATTING 252