| |
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 |
| |
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 |
| |
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 |
| |
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 |
| |
87 smpdtfmt_cleanup(void) |
| |
88 { |
| |
89 return SimpleDateFormatStaticSets::cleanup(); |
| |
90 } |
| |
91 |
| |
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 |
| |
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 |