16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2009-2013, International Business Machines Corporation and    *
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* others. All Rights Reserved.                                                *
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* This file contains the class SimpleDateFormatStaticSets
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* SimpleDateFormatStaticSets holds the UnicodeSets that are needed for lenient
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* parsing of literal characters in date/time strings.
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uniset.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/udat.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uassert.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucln_in.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "umutex.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "smpdtfst.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleDateFormatStaticSets *gStaticSets = NULL;
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUInitOnce gSimpleDateFormatStaticSetsInitOnce = U_INITONCE_INITIALIZER;
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleDateFormatStaticSets::SimpleDateFormatStaticSets(UErrorCode &status)
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org: fDateIgnorables(NULL),
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  fTimeIgnorables(NULL),
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  fOtherIgnorables(NULL)
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fDateIgnorables  = new UnicodeSet(UNICODE_STRING("[-,./[:whitespace:]]", 20), status);
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fTimeIgnorables  = new UnicodeSet(UNICODE_STRING("[-.:[:whitespace:]]", 19),  status);
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fOtherIgnorables = new UnicodeSet(UNICODE_STRING("[:whitespace:]", 14),       status);
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Check for null pointers
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fDateIgnorables == NULL || fTimeIgnorables == NULL || fOtherIgnorables == NULL) {
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ExitConstrDeleteAll;
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Freeze all the sets
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fDateIgnorables->freeze();
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fTimeIgnorables->freeze();
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fOtherIgnorables->freeze();
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return; // If we reached this point, everything is fine so just exit
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgExitConstrDeleteAll: // Remove all sets and return error
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fDateIgnorables;  fDateIgnorables = NULL;
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fTimeIgnorables;  fTimeIgnorables = NULL;
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fOtherIgnorables; fOtherIgnorables = NULL;
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_MEMORY_ALLOCATION_ERROR;
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleDateFormatStaticSets::~SimpleDateFormatStaticSets() {
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fDateIgnorables;  fDateIgnorables = NULL;
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fTimeIgnorables;  fTimeIgnorables = NULL;
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fOtherIgnorables; fOtherIgnorables = NULL;
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//   smpdtfmt_cleanup     Memory cleanup function, free/delete all
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//                      cached memory.  Called by ICU's u_cleanup() function.
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleDateFormatStaticSets::cleanup(void)
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete gStaticSets;
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gStaticSets = NULL;
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gSimpleDateFormatStaticSetsInitOnce.reset();
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_CALLCONV
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgsmpdtfmt_cleanup(void)
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return SimpleDateFormatStaticSets::cleanup();
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV smpdtfmt_initSets(UErrorCode &status) {
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucln_i18n_registerCleanup(UCLN_I18N_SMPDTFMT, smpdtfmt_cleanup);
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_ASSERT(gStaticSets == NULL);
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gStaticSets = new SimpleDateFormatStaticSets(status);
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (gStaticSets == NULL) {
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_MEMORY_ALLOCATION_ERROR;
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeSet *SimpleDateFormatStaticSets::getIgnorables(UDateFormatField fieldIndex)
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    umtx_initOnce(gSimpleDateFormatStaticSetsInitOnce, &smpdtfmt_initSets, status);
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch (fieldIndex) {
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UDAT_YEAR_FIELD:
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UDAT_MONTH_FIELD:
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UDAT_DATE_FIELD:
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UDAT_STANDALONE_DAY_FIELD:
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UDAT_STANDALONE_MONTH_FIELD:
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return gStaticSets->fDateIgnorables;
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UDAT_HOUR_OF_DAY1_FIELD:
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UDAT_HOUR_OF_DAY0_FIELD:
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UDAT_MINUTE_FIELD:
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UDAT_SECOND_FIELD:
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UDAT_HOUR1_FIELD:
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case UDAT_HOUR0_FIELD:
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return gStaticSets->fTimeIgnorables;
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default:
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return gStaticSets->fOtherIgnorables;
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif // #if !UCONFIG_NO_FORMATTING
136