| /* |
| ******************************************************************************* |
| * Copyright (C) 2009-2011, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| * |
| * This file contains the class SimpleDateFormatStaticSets |
| * |
| * SimpleDateFormatStaticSets holds the UnicodeSets that are needed for lenient |
| * parsing of literal characters in date/time strings. |
| ******************************************************************************** |
| */ |
| |
| #include "unicode/utypes.h" |
| |
| #if !UCONFIG_NO_FORMATTING |
| |
| #include "unicode/uniset.h" |
| #include "unicode/udat.h" |
| #include "cmemory.h" |
| #include "ucln_in.h" |
| #include "umutex.h" |
| |
| |
| #include "smpdtfst.h" |
| |
| U_NAMESPACE_BEGIN |
| |
| SimpleDateFormatStaticSets *SimpleDateFormatStaticSets::gStaticSets = NULL; |
| |
| SimpleDateFormatStaticSets::SimpleDateFormatStaticSets(UErrorCode *status) |
| : fDateIgnorables(NULL), |
| fTimeIgnorables(NULL), |
| fOtherIgnorables(NULL) |
| { |
| fDateIgnorables = new UnicodeSet(UNICODE_STRING("[-,./[:whitespace:]]", 20), *status); |
| fTimeIgnorables = new UnicodeSet(UNICODE_STRING("[-.:[:whitespace:]]", 19), *status); |
| fOtherIgnorables = new UnicodeSet(UNICODE_STRING("[:whitespace:]", 14), *status); |
| |
| // Check for null pointers |
| if (fDateIgnorables == NULL || fTimeIgnorables == NULL || fOtherIgnorables == NULL) { |
| goto ExitConstrDeleteAll; |
| } |
| |
| // Freeze all the sets |
| fDateIgnorables->freeze(); |
| fTimeIgnorables->freeze(); |
| fOtherIgnorables->freeze(); |
| |
| return; // If we reached this point, everything is fine so just exit |
| |
| ExitConstrDeleteAll: // Remove all sets and return error |
| delete fDateIgnorables; fDateIgnorables = NULL; |
| delete fTimeIgnorables; fTimeIgnorables = NULL; |
| delete fOtherIgnorables; fOtherIgnorables = NULL; |
| |
| *status = U_MEMORY_ALLOCATION_ERROR; |
| } |
| |
| |
| SimpleDateFormatStaticSets::~SimpleDateFormatStaticSets() { |
| delete fDateIgnorables; fDateIgnorables = NULL; |
| delete fTimeIgnorables; fTimeIgnorables = NULL; |
| delete fOtherIgnorables; fOtherIgnorables = NULL; |
| } |
| |
| |
| //------------------------------------------------------------------------------ |
| // |
| // smpdtfmt_cleanup Memory cleanup function, free/delete all |
| // cached memory. Called by ICU's u_cleanup() function. |
| // |
| //------------------------------------------------------------------------------ |
| UBool |
| SimpleDateFormatStaticSets::cleanup(void) |
| { |
| delete SimpleDateFormatStaticSets::gStaticSets; |
| SimpleDateFormatStaticSets::gStaticSets = NULL; |
| |
| return TRUE; |
| } |
| |
| U_CDECL_BEGIN |
| static UBool U_CALLCONV |
| smpdtfmt_cleanup(void) |
| { |
| return SimpleDateFormatStaticSets::cleanup(); |
| } |
| U_CDECL_END |
| |
| void SimpleDateFormatStaticSets::initSets(UErrorCode *status) |
| { |
| SimpleDateFormatStaticSets *p; |
| |
| UMTX_CHECK(NULL, gStaticSets, p); |
| if (p == NULL) { |
| p = new SimpleDateFormatStaticSets(status); |
| |
| if (p == NULL) { |
| *status = U_MEMORY_ALLOCATION_ERROR; |
| return; |
| } |
| |
| if (U_FAILURE(*status)) { |
| delete p; |
| return; |
| } |
| |
| umtx_lock(NULL); |
| if (gStaticSets == NULL) { |
| gStaticSets = p; |
| p = NULL; |
| } |
| |
| umtx_unlock(NULL); |
| if (p != NULL) { |
| delete p; |
| } |
| |
| ucln_i18n_registerCleanup(UCLN_I18N_SMPDTFMT, smpdtfmt_cleanup); |
| } |
| } |
| |
| UnicodeSet *SimpleDateFormatStaticSets::getIgnorables(UDateFormatField fieldIndex) |
| { |
| UErrorCode status = U_ZERO_ERROR; |
| |
| initSets(&status); |
| |
| if (U_FAILURE(status)) { |
| return NULL; |
| } |
| |
| switch (fieldIndex) { |
| case UDAT_YEAR_FIELD: |
| case UDAT_MONTH_FIELD: |
| case UDAT_DATE_FIELD: |
| case UDAT_STANDALONE_DAY_FIELD: |
| case UDAT_STANDALONE_MONTH_FIELD: |
| return gStaticSets->fDateIgnorables; |
| |
| case UDAT_HOUR_OF_DAY1_FIELD: |
| case UDAT_HOUR_OF_DAY0_FIELD: |
| case UDAT_MINUTE_FIELD: |
| case UDAT_SECOND_FIELD: |
| case UDAT_HOUR1_FIELD: |
| case UDAT_HOUR0_FIELD: |
| return gStaticSets->fTimeIgnorables; |
| |
| default: |
| return gStaticSets->fOtherIgnorables; |
| } |
| } |
| |
| |
| U_NAMESPACE_END |
| |
| #endif // #if !UCONFIG_NO_FORMATTING |