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
27U_NAMESPACE_BEGIN
28
29SimpleDateFormatStaticSets *SimpleDateFormatStaticSets::gStaticSets = NULL;
30
31SimpleDateFormatStaticSets::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
52ExitConstrDeleteAll: // 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
61SimpleDateFormatStaticSets::~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//------------------------------------------------------------------------------
74UBool
75SimpleDateFormatStaticSets::cleanup(void)
76{
77    delete SimpleDateFormatStaticSets::gStaticSets;
78    SimpleDateFormatStaticSets::gStaticSets = NULL;
79
80    return TRUE;
81}
82
83U_CDECL_BEGIN
84static UBool U_CALLCONV
85smpdtfmt_cleanup(void)
86{
87    return SimpleDateFormatStaticSets::cleanup();
88}
89U_CDECL_END
90
91void 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
124UnicodeSet *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
156U_NAMESPACE_END
157
158#endif // #if !UCONFIG_NO_FORMATTING
159