Home | History | Annotate | Download | only in i18n
      1 /*
      2 *******************************************************************************
      3 * Copyright (C) 2009-2013, International Business Machines Corporation and    *
      4 * others. All Rights Reserved.                                                *
      5 *******************************************************************************
      6 *
      7 * This file contains the class SimpleDateFormatStaticSets
      8 *
      9 * SimpleDateFormatStaticSets holds the UnicodeSets that are needed for lenient
     10 * parsing of literal characters in date/time strings.
     11 ********************************************************************************
     12 */
     13 
     14 #include "unicode/utypes.h"
     15 
     16 #if !UCONFIG_NO_FORMATTING
     17 
     18 #include "unicode/uniset.h"
     19 #include "unicode/udat.h"
     20 #include "cmemory.h"
     21 #include "uassert.h"
     22 #include "ucln_in.h"
     23 #include "umutex.h"
     24 
     25 
     26 #include "smpdtfst.h"
     27 
     28 U_NAMESPACE_BEGIN
     29 
     30 SimpleDateFormatStaticSets *gStaticSets = NULL;
     31 UInitOnce gSimpleDateFormatStaticSetsInitOnce = U_INITONCE_INITIALIZER;
     32 
     33 SimpleDateFormatStaticSets::SimpleDateFormatStaticSets(UErrorCode &status)
     34 : fDateIgnorables(NULL),
     35   fTimeIgnorables(NULL),
     36   fOtherIgnorables(NULL)
     37 {
     38     fDateIgnorables  = new UnicodeSet(UNICODE_STRING("[-,./[:whitespace:]]", 20), status);
     39     fTimeIgnorables  = new UnicodeSet(UNICODE_STRING("[-.:[:whitespace:]]", 19),  status);
     40     fOtherIgnorables = new UnicodeSet(UNICODE_STRING("[:whitespace:]", 14),       status);
     41 
     42     // Check for null pointers
     43     if (fDateIgnorables == NULL || fTimeIgnorables == NULL || fOtherIgnorables == NULL) {
     44         goto ExitConstrDeleteAll;
     45     }
     46 
     47     // Freeze all the sets
     48     fDateIgnorables->freeze();
     49     fTimeIgnorables->freeze();
     50     fOtherIgnorables->freeze();
     51 
     52     return; // If we reached this point, everything is fine so just exit
     53 
     54 ExitConstrDeleteAll: // Remove all sets and return error
     55     delete fDateIgnorables;  fDateIgnorables = NULL;
     56     delete fTimeIgnorables;  fTimeIgnorables = NULL;
     57     delete fOtherIgnorables; fOtherIgnorables = NULL;
     58 
     59     status = U_MEMORY_ALLOCATION_ERROR;
     60 }
     61 
     62 
     63 SimpleDateFormatStaticSets::~SimpleDateFormatStaticSets() {
     64     delete fDateIgnorables;  fDateIgnorables = NULL;
     65     delete fTimeIgnorables;  fTimeIgnorables = NULL;
     66     delete fOtherIgnorables; fOtherIgnorables = NULL;
     67 }
     68 
     69 
     70 //------------------------------------------------------------------------------
     71 //
     72 //   smpdtfmt_cleanup     Memory cleanup function, free/delete all
     73 //                      cached memory.  Called by ICU's u_cleanup() function.
     74 //
     75 //------------------------------------------------------------------------------
     76 UBool
     77 SimpleDateFormatStaticSets::cleanup(void)
     78 {
     79     delete gStaticSets;
     80     gStaticSets = NULL;
     81     gSimpleDateFormatStaticSetsInitOnce.reset();
     82     return TRUE;
     83 }
     84 
     85 U_CDECL_BEGIN
     86 static UBool U_CALLCONV
     87 smpdtfmt_cleanup(void)
     88 {
     89     return SimpleDateFormatStaticSets::cleanup();
     90 }
     91 
     92 static void U_CALLCONV smpdtfmt_initSets(UErrorCode &status) {
     93     ucln_i18n_registerCleanup(UCLN_I18N_SMPDTFMT, smpdtfmt_cleanup);
     94     U_ASSERT(gStaticSets == NULL);
     95     gStaticSets = new SimpleDateFormatStaticSets(status);
     96     if (gStaticSets == NULL) {
     97         status = U_MEMORY_ALLOCATION_ERROR;
     98         return;
     99     }
    100 }
    101 
    102 U_CDECL_END
    103 
    104 UnicodeSet *SimpleDateFormatStaticSets::getIgnorables(UDateFormatField fieldIndex)
    105 {
    106     UErrorCode status = U_ZERO_ERROR;
    107     umtx_initOnce(gSimpleDateFormatStaticSetsInitOnce, &smpdtfmt_initSets, status);
    108     if (U_FAILURE(status)) {
    109         return NULL;
    110     }
    111 
    112     switch (fieldIndex) {
    113         case UDAT_YEAR_FIELD:
    114         case UDAT_MONTH_FIELD:
    115         case UDAT_DATE_FIELD:
    116         case UDAT_STANDALONE_DAY_FIELD:
    117         case UDAT_STANDALONE_MONTH_FIELD:
    118             return gStaticSets->fDateIgnorables;
    119 
    120         case UDAT_HOUR_OF_DAY1_FIELD:
    121         case UDAT_HOUR_OF_DAY0_FIELD:
    122         case UDAT_MINUTE_FIELD:
    123         case UDAT_SECOND_FIELD:
    124         case UDAT_HOUR1_FIELD:
    125         case UDAT_HOUR0_FIELD:
    126             return gStaticSets->fTimeIgnorables;
    127 
    128         default:
    129             return gStaticSets->fOtherIgnorables;
    130     }
    131 }
    132 
    133 U_NAMESPACE_END
    134 
    135 #endif // #if !UCONFIG_NO_FORMATTING
    136