1 /*
2 *******************************************************************************
3 * Copyright (C) 2009-2011, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 *******************************************************************************
6 *
7 * This file contains the class SimpleDateFormatStaticSets
8 *
9 * SimpleDateFormatStaticSets holds the UnicodeSets that are needed for lenient
10 * parsing of literal characters in date/time strings.
11 ********************************************************************************
12 */
13
14 #include "unicode/utypes.h"
15
16 #if !UCONFIG_NO_FORMATTING
17
18 #include "unicode/uniset.h"
19 #include "unicode/udat.h"
20 #include "cmemory.h"
21 #include "ucln_in.h"
22 #include "umutex.h"
23
24
25 #include "smpdtfst.h"
26
27 U_NAMESPACE_BEGIN
28
29 SimpleDateFormatStaticSets *SimpleDateFormatStaticSets::gStaticSets = NULL;
30
SimpleDateFormatStaticSets(UErrorCode * status)31 SimpleDateFormatStaticSets::SimpleDateFormatStaticSets(UErrorCode *status)
32 : fDateIgnorables(NULL),
33 fTimeIgnorables(NULL),
34 fOtherIgnorables(NULL)
35 {
36 fDateIgnorables = new UnicodeSet(UNICODE_STRING("[-,./[:whitespace:]]", 20), *status);
37 fTimeIgnorables = new UnicodeSet(UNICODE_STRING("[-.:[:whitespace:]]", 19), *status);
38 fOtherIgnorables = new UnicodeSet(UNICODE_STRING("[:whitespace:]", 14), *status);
39
40 // Check for null pointers
41 if (fDateIgnorables == NULL || fTimeIgnorables == NULL || fOtherIgnorables == NULL) {
42 goto ExitConstrDeleteAll;
43 }
44
45 // Freeze all the sets
46 fDateIgnorables->freeze();
47 fTimeIgnorables->freeze();
48 fOtherIgnorables->freeze();
49
50 return; // If we reached this point, everything is fine so just exit
51
52 ExitConstrDeleteAll: // Remove all sets and return error
53 delete fDateIgnorables; fDateIgnorables = NULL;
54 delete fTimeIgnorables; fTimeIgnorables = NULL;
55 delete fOtherIgnorables; fOtherIgnorables = NULL;
56
57 *status = U_MEMORY_ALLOCATION_ERROR;
58 }
59
60
~SimpleDateFormatStaticSets()61 SimpleDateFormatStaticSets::~SimpleDateFormatStaticSets() {
62 delete fDateIgnorables; fDateIgnorables = NULL;
63 delete fTimeIgnorables; fTimeIgnorables = NULL;
64 delete fOtherIgnorables; fOtherIgnorables = NULL;
65 }
66
67
68 //------------------------------------------------------------------------------
69 //
70 // smpdtfmt_cleanup Memory cleanup function, free/delete all
71 // cached memory. Called by ICU's u_cleanup() function.
72 //
73 //------------------------------------------------------------------------------
74 UBool
cleanup(void)75 SimpleDateFormatStaticSets::cleanup(void)
76 {
77 delete SimpleDateFormatStaticSets::gStaticSets;
78 SimpleDateFormatStaticSets::gStaticSets = NULL;
79
80 return TRUE;
81 }
82
83 U_CDECL_BEGIN
84 static UBool U_CALLCONV
smpdtfmt_cleanup(void)85 smpdtfmt_cleanup(void)
86 {
87 return SimpleDateFormatStaticSets::cleanup();
88 }
89 U_CDECL_END
90
initSets(UErrorCode * status)91 void SimpleDateFormatStaticSets::initSets(UErrorCode *status)
92 {
93 SimpleDateFormatStaticSets *p;
94
95 UMTX_CHECK(NULL, gStaticSets, p);
96 if (p == NULL) {
97 p = new SimpleDateFormatStaticSets(status);
98
99 if (p == NULL) {
100 *status = U_MEMORY_ALLOCATION_ERROR;
101 return;
102 }
103
104 if (U_FAILURE(*status)) {
105 delete p;
106 return;
107 }
108
109 umtx_lock(NULL);
110 if (gStaticSets == NULL) {
111 gStaticSets = p;
112 p = NULL;
113 }
114
115 umtx_unlock(NULL);
116 if (p != NULL) {
117 delete p;
118 }
119
120 ucln_i18n_registerCleanup(UCLN_I18N_SMPDTFMT, smpdtfmt_cleanup);
121 }
122 }
123
getIgnorables(UDateFormatField fieldIndex)124 UnicodeSet *SimpleDateFormatStaticSets::getIgnorables(UDateFormatField fieldIndex)
125 {
126 UErrorCode status = U_ZERO_ERROR;
127
128 initSets(&status);
129
130 if (U_FAILURE(status)) {
131 return NULL;
132 }
133
134 switch (fieldIndex) {
135 case UDAT_YEAR_FIELD:
136 case UDAT_MONTH_FIELD:
137 case UDAT_DATE_FIELD:
138 case UDAT_STANDALONE_DAY_FIELD:
139 case UDAT_STANDALONE_MONTH_FIELD:
140 return gStaticSets->fDateIgnorables;
141
142 case UDAT_HOUR_OF_DAY1_FIELD:
143 case UDAT_HOUR_OF_DAY0_FIELD:
144 case UDAT_MINUTE_FIELD:
145 case UDAT_SECOND_FIELD:
146 case UDAT_HOUR1_FIELD:
147 case UDAT_HOUR0_FIELD:
148 return gStaticSets->fTimeIgnorables;
149
150 default:
151 return gStaticSets->fOtherIgnorables;
152 }
153 }
154
155
156 U_NAMESPACE_END
157
158 #endif // #if !UCONFIG_NO_FORMATTING
159