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