138 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			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
 |