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