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
28U_NAMESPACE_BEGIN
29
30SimpleDateFormatStaticSets *gStaticSets = NULL;
31UInitOnce gSimpleDateFormatStaticSetsInitOnce = U_INITONCE_INITIALIZER;
32
33SimpleDateFormatStaticSets::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
54ExitConstrDeleteAll: // 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
63SimpleDateFormatStaticSets::~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//------------------------------------------------------------------------------
76UBool
77SimpleDateFormatStaticSets::cleanup(void)
78{
79    delete gStaticSets;
80    gStaticSets = NULL;
81    gSimpleDateFormatStaticSetsInitOnce.reset();
82    return TRUE;
83}
84
85U_CDECL_BEGIN
86static UBool U_CALLCONV
87smpdtfmt_cleanup(void)
88{
89    return SimpleDateFormatStaticSets::cleanup();
90}
91
92static 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
102U_CDECL_END
103
104UnicodeSet *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
133U_NAMESPACE_END
134
135#endif // #if !UCONFIG_NO_FORMATTING
136