diff options
Diffstat (limited to 'intl/icu/source/i18n/smpdtfst.cpp')
-rw-r--r-- | intl/icu/source/i18n/smpdtfst.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/intl/icu/source/i18n/smpdtfst.cpp b/intl/icu/source/i18n/smpdtfst.cpp new file mode 100644 index 000000000..fbb2ab5fb --- /dev/null +++ b/intl/icu/source/i18n/smpdtfst.cpp @@ -0,0 +1,137 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +******************************************************************************* +* Copyright (C) 2009-2013, 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 "uassert.h" +#include "ucln_in.h" +#include "umutex.h" + + +#include "smpdtfst.h" + +U_NAMESPACE_BEGIN + +SimpleDateFormatStaticSets *gStaticSets = NULL; +UInitOnce gSimpleDateFormatStaticSetsInitOnce = U_INITONCE_INITIALIZER; + +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 gStaticSets; + gStaticSets = NULL; + gSimpleDateFormatStaticSetsInitOnce.reset(); + return TRUE; +} + +U_CDECL_BEGIN +static UBool U_CALLCONV +smpdtfmt_cleanup(void) +{ + return SimpleDateFormatStaticSets::cleanup(); +} + +static void U_CALLCONV smpdtfmt_initSets(UErrorCode &status) { + ucln_i18n_registerCleanup(UCLN_I18N_SMPDTFMT, smpdtfmt_cleanup); + U_ASSERT(gStaticSets == NULL); + gStaticSets = new SimpleDateFormatStaticSets(status); + if (gStaticSets == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } +} + +U_CDECL_END + +UnicodeSet *SimpleDateFormatStaticSets::getIgnorables(UDateFormatField fieldIndex) +{ + UErrorCode status = U_ZERO_ERROR; + umtx_initOnce(gSimpleDateFormatStaticSetsInitOnce, &smpdtfmt_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 |