1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3/*
4*******************************************************************************
5* Copyright (C) 2009-2013, International Business Machines Corporation and *
6* others. All Rights Reserved. *
7*******************************************************************************
8*
9* This file contains the class SimpleDateFormatStaticSets
10*
11* SimpleDateFormatStaticSets holds the UnicodeSets that are needed for lenient
12* parsing of literal characters in date/time strings.
13********************************************************************************
14*/
15
16#include "unicode/utypes.h"
17
18#if !UCONFIG_NO_FORMATTING
19
20#include "unicode/uniset.h"
21#include "unicode/udat.h"
22#include "cmemory.h"
23#include "uassert.h"
24#include "ucln_in.h"
25#include "umutex.h"
26
27
28#include "smpdtfst.h"
29
30U_NAMESPACE_BEGIN
31
32SimpleDateFormatStaticSets *gStaticSets = NULL;
33UInitOnce gSimpleDateFormatStaticSetsInitOnce = U_INITONCE_INITIALIZER;
34
35SimpleDateFormatStaticSets::SimpleDateFormatStaticSets(UErrorCode &status)
36: fDateIgnorables(NULL),
37 fTimeIgnorables(NULL),
38 fOtherIgnorables(NULL)
39{
40 fDateIgnorables = new UnicodeSet(UNICODE_STRING("[-,./[:whitespace:]]", 20), status);
41 fTimeIgnorables = new UnicodeSet(UNICODE_STRING("[-.:[:whitespace:]]", 19), status);
42 fOtherIgnorables = new UnicodeSet(UNICODE_STRING("[:whitespace:]", 14), status);
43
44 // Check for null pointers
45 if (fDateIgnorables == NULL || fTimeIgnorables == NULL || fOtherIgnorables == NULL) {
46 goto ExitConstrDeleteAll;
47 }
48
49 // Freeze all the sets
50 fDateIgnorables->freeze();
51 fTimeIgnorables->freeze();
52 fOtherIgnorables->freeze();
53
54 return; // If we reached this point, everything is fine so just exit
55
56ExitConstrDeleteAll: // Remove all sets and return error
57 delete fDateIgnorables; fDateIgnorables = NULL;
58 delete fTimeIgnorables; fTimeIgnorables = NULL;
59 delete fOtherIgnorables; fOtherIgnorables = NULL;
60
61 status = U_MEMORY_ALLOCATION_ERROR;
62}
63
64
65SimpleDateFormatStaticSets::~SimpleDateFormatStaticSets() {
66 delete fDateIgnorables; fDateIgnorables = NULL;
67 delete fTimeIgnorables; fTimeIgnorables = NULL;
68 delete fOtherIgnorables; fOtherIgnorables = NULL;
69}
70
71
72//------------------------------------------------------------------------------
73//
74// smpdtfmt_cleanup Memory cleanup function, free/delete all
75// cached memory. Called by ICU's u_cleanup() function.
76//
77//------------------------------------------------------------------------------
78UBool
79SimpleDateFormatStaticSets::cleanup(void)
80{
81 delete gStaticSets;
82 gStaticSets = NULL;
83 gSimpleDateFormatStaticSetsInitOnce.reset();
84 return TRUE;
85}
86
87U_CDECL_BEGIN
88static UBool U_CALLCONV
89smpdtfmt_cleanup(void)
90{
91 return SimpleDateFormatStaticSets::cleanup();
92}
93
94static void U_CALLCONV smpdtfmt_initSets(UErrorCode &status) {
95 ucln_i18n_registerCleanup(UCLN_I18N_SMPDTFMT, smpdtfmt_cleanup);
96 U_ASSERT(gStaticSets == NULL);
97 gStaticSets = new SimpleDateFormatStaticSets(status);
98 if (gStaticSets == NULL) {
99 status = U_MEMORY_ALLOCATION_ERROR;
100 return;
101 }
102}
103
104U_CDECL_END
105
106UnicodeSet *SimpleDateFormatStaticSets::getIgnorables(UDateFormatField fieldIndex)
107{
108 UErrorCode status = U_ZERO_ERROR;
109 umtx_initOnce(gSimpleDateFormatStaticSetsInitOnce, &smpdtfmt_initSets, status);
110 if (U_FAILURE(status)) {
111 return NULL;
112 }
113
114 switch (fieldIndex) {
115 case UDAT_YEAR_FIELD:
116 case UDAT_MONTH_FIELD:
117 case UDAT_DATE_FIELD:
118 case UDAT_STANDALONE_DAY_FIELD:
119 case UDAT_STANDALONE_MONTH_FIELD:
120 return gStaticSets->fDateIgnorables;
121
122 case UDAT_HOUR_OF_DAY1_FIELD:
123 case UDAT_HOUR_OF_DAY0_FIELD:
124 case UDAT_MINUTE_FIELD:
125 case UDAT_SECOND_FIELD:
126 case UDAT_HOUR1_FIELD:
127 case UDAT_HOUR0_FIELD:
128 return gStaticSets->fTimeIgnorables;
129
130 default:
131 return gStaticSets->fOtherIgnorables;
132 }
133}
134
135U_NAMESPACE_END
136
137#endif // #if !UCONFIG_NO_FORMATTING
138