]> git.saurik.com Git - apple/icu.git/blame_incremental - icuSources/i18n/smpdtfst.cpp
ICU-57166.0.1.tar.gz
[apple/icu.git] / icuSources / i18n / smpdtfst.cpp
... / ...
CommitLineData
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