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