diff options
Diffstat (limited to 'Build/source/libs/icu/icu-49.1/i18n/smpdtfst.cpp')
-rw-r--r-- | Build/source/libs/icu/icu-49.1/i18n/smpdtfst.cpp | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-49.1/i18n/smpdtfst.cpp b/Build/source/libs/icu/icu-49.1/i18n/smpdtfst.cpp new file mode 100644 index 00000000000..2e138b84fb8 --- /dev/null +++ b/Build/source/libs/icu/icu-49.1/i18n/smpdtfst.cpp @@ -0,0 +1,158 @@ +/* +******************************************************************************* +* 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 |