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 30 U_NAMESPACE_BEGIN 31 32 SimpleDateFormatStaticSets *gStaticSets = NULL; 33 UInitOnce gSimpleDateFormatStaticSetsInitOnce = U_INITONCE_INITIALIZER; 34 35 SimpleDateFormatStaticSets::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 56 ExitConstrDeleteAll: // 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 65 SimpleDateFormatStaticSets::~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 //------------------------------------------------------------------------------ 78 UBool 79 SimpleDateFormatStaticSets::cleanup(void) 80 { 81 delete gStaticSets; 82 gStaticSets = NULL; 83 gSimpleDateFormatStaticSetsInitOnce.reset(); 84 return TRUE; 85 } 86 87 U_CDECL_BEGIN 88 static UBool U_CALLCONV 89 smpdtfmt_cleanup(void) 90 { 91 return SimpleDateFormatStaticSets::cleanup(); 92 } 93 94 static 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 104 U_CDECL_END 105 106 UnicodeSet *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 135 U_NAMESPACE_END 136 137 #endif // #if !UCONFIG_NO_FORMATTING 138