1 /*
2 *******************************************************************************
3 * Copyright (C) 2009-2013, 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 "uassert.h"
22 #include "ucln_in.h"
23 #include "umutex.h"
24
25
26 #include "smpdtfst.h"
27
28 U_NAMESPACE_BEGIN
29
30 SimpleDateFormatStaticSets *gStaticSets = NULL;
31 UInitOnce gSimpleDateFormatStaticSetsInitOnce = U_INITONCE_INITIALIZER;
32
SimpleDateFormatStaticSets(UErrorCode & status)33 SimpleDateFormatStaticSets::SimpleDateFormatStaticSets(UErrorCode &status)
34 : fDateIgnorables(NULL),
35 fTimeIgnorables(NULL),
36 fOtherIgnorables(NULL)
37 {
38 fDateIgnorables = new UnicodeSet(UNICODE_STRING("[-,./[:whitespace:]]", 20), status);
39 fTimeIgnorables = new UnicodeSet(UNICODE_STRING("[-.:[:whitespace:]]", 19), status);
40 fOtherIgnorables = new UnicodeSet(UNICODE_STRING("[:whitespace:]", 14), status);
41
42 // Check for null pointers
43 if (fDateIgnorables == NULL || fTimeIgnorables == NULL || fOtherIgnorables == NULL) {
44 goto ExitConstrDeleteAll;
45 }
46
47 // Freeze all the sets
48 fDateIgnorables->freeze();
49 fTimeIgnorables->freeze();
50 fOtherIgnorables->freeze();
51
52 return; // If we reached this point, everything is fine so just exit
53
54 ExitConstrDeleteAll: // Remove all sets and return error
55 delete fDateIgnorables; fDateIgnorables = NULL;
56 delete fTimeIgnorables; fTimeIgnorables = NULL;
57 delete fOtherIgnorables; fOtherIgnorables = NULL;
58
59 status = U_MEMORY_ALLOCATION_ERROR;
60 }
61
62
~SimpleDateFormatStaticSets()63 SimpleDateFormatStaticSets::~SimpleDateFormatStaticSets() {
64 delete fDateIgnorables; fDateIgnorables = NULL;
65 delete fTimeIgnorables; fTimeIgnorables = NULL;
66 delete fOtherIgnorables; fOtherIgnorables = NULL;
67 }
68
69
70 //------------------------------------------------------------------------------
71 //
72 // smpdtfmt_cleanup Memory cleanup function, free/delete all
73 // cached memory. Called by ICU's u_cleanup() function.
74 //
75 //------------------------------------------------------------------------------
76 UBool
cleanup(void)77 SimpleDateFormatStaticSets::cleanup(void)
78 {
79 delete gStaticSets;
80 gStaticSets = NULL;
81 gSimpleDateFormatStaticSetsInitOnce.reset();
82 return TRUE;
83 }
84
85 U_CDECL_BEGIN
86 static UBool U_CALLCONV
smpdtfmt_cleanup(void)87 smpdtfmt_cleanup(void)
88 {
89 return SimpleDateFormatStaticSets::cleanup();
90 }
91
smpdtfmt_initSets(UErrorCode & status)92 static void U_CALLCONV smpdtfmt_initSets(UErrorCode &status) {
93 ucln_i18n_registerCleanup(UCLN_I18N_SMPDTFMT, smpdtfmt_cleanup);
94 U_ASSERT(gStaticSets == NULL);
95 gStaticSets = new SimpleDateFormatStaticSets(status);
96 if (gStaticSets == NULL) {
97 status = U_MEMORY_ALLOCATION_ERROR;
98 return;
99 }
100 }
101
102 U_CDECL_END
103
getIgnorables(UDateFormatField fieldIndex)104 UnicodeSet *SimpleDateFormatStaticSets::getIgnorables(UDateFormatField fieldIndex)
105 {
106 UErrorCode status = U_ZERO_ERROR;
107 umtx_initOnce(gSimpleDateFormatStaticSetsInitOnce, &smpdtfmt_initSets, status);
108 if (U_FAILURE(status)) {
109 return NULL;
110 }
111
112 switch (fieldIndex) {
113 case UDAT_YEAR_FIELD:
114 case UDAT_MONTH_FIELD:
115 case UDAT_DATE_FIELD:
116 case UDAT_STANDALONE_DAY_FIELD:
117 case UDAT_STANDALONE_MONTH_FIELD:
118 return gStaticSets->fDateIgnorables;
119
120 case UDAT_HOUR_OF_DAY1_FIELD:
121 case UDAT_HOUR_OF_DAY0_FIELD:
122 case UDAT_MINUTE_FIELD:
123 case UDAT_SECOND_FIELD:
124 case UDAT_HOUR1_FIELD:
125 case UDAT_HOUR0_FIELD:
126 return gStaticSets->fTimeIgnorables;
127
128 default:
129 return gStaticSets->fOtherIgnorables;
130 }
131 }
132
133 U_NAMESPACE_END
134
135 #endif // #if !UCONFIG_NO_FORMATTING
136