Home | History | Annotate | Download | only in i18n
      1 /*
      2 *******************************************************************************
      3 * Copyright (C) 2003 - 2013, International Business Machines Corporation and
      4 * others. All Rights Reserved.
      5 *******************************************************************************
      6 */
      7 
      8 #include "unicode/utypes.h"
      9 
     10 #if !UCONFIG_NO_FORMATTING
     11 
     12 #include "umutex.h"
     13 #include "coptccal.h"
     14 #include "cecal.h"
     15 #include <float.h>
     16 
     17 U_NAMESPACE_BEGIN
     18 
     19 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CopticCalendar)
     20 
     21 static const int32_t COPTIC_JD_EPOCH_OFFSET  = 1824665;
     22 
     23 //-------------------------------------------------------------------------
     24 // Constructors...
     25 //-------------------------------------------------------------------------
     26 
     27 CopticCalendar::CopticCalendar(const Locale& aLocale, UErrorCode& success)
     28 : CECalendar(aLocale, success)
     29 {
     30 }
     31 
     32 CopticCalendar::CopticCalendar (const CopticCalendar& other)
     33 : CECalendar(other)
     34 {
     35 }
     36 
     37 CopticCalendar::~CopticCalendar()
     38 {
     39 }
     40 
     41 Calendar*
     42 CopticCalendar::clone() const
     43 {
     44     return new CopticCalendar(*this);
     45 }
     46 
     47 const char*
     48 CopticCalendar::getType() const
     49 {
     50     return "coptic";
     51 }
     52 
     53 //-------------------------------------------------------------------------
     54 // Calendar framework
     55 //-------------------------------------------------------------------------
     56 
     57 int32_t
     58 CopticCalendar::handleGetExtendedYear()
     59 {
     60     int32_t eyear;
     61     if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) {
     62         eyear = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1
     63     } else {
     64         // The year defaults to the epoch start, the era to CE
     65         int32_t era = internalGet(UCAL_ERA, CE);
     66         if (era == BCE) {
     67             eyear = 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year
     68         } else {
     69             eyear = internalGet(UCAL_YEAR, 1); // Default to year 1
     70         }
     71     }
     72     return eyear;
     73 }
     74 
     75 void
     76 CopticCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/)
     77 {
     78     int32_t eyear, month, day, era, year;
     79     jdToCE(julianDay, getJDEpochOffset(), eyear, month, day);
     80 
     81     if (eyear <= 0) {
     82         era = BCE;
     83         year = 1 - eyear;
     84     } else {
     85         era = CE;
     86         year = eyear;
     87     }
     88 
     89     internalSet(UCAL_EXTENDED_YEAR, eyear);
     90     internalSet(UCAL_ERA, era);
     91     internalSet(UCAL_YEAR, year);
     92     internalSet(UCAL_MONTH, month);
     93     internalSet(UCAL_DATE, day);
     94     internalSet(UCAL_DAY_OF_YEAR, (30 * month) + day);
     95 }
     96 
     97 /**
     98  * The system maintains a static default century start date and Year.  They are
     99  * initialized the first time they are used.  Once the system default century date
    100  * and year are set, they do not change.
    101  */
    102 static UDate           gSystemDefaultCenturyStart       = DBL_MIN;
    103 static int32_t         gSystemDefaultCenturyStartYear   = -1;
    104 static icu::UInitOnce  gSystemDefaultCenturyInit        = U_INITONCE_INITIALIZER;
    105 
    106 
    107 static void U_CALLCONV initializeSystemDefaultCentury() {
    108     UErrorCode status = U_ZERO_ERROR;
    109     CopticCalendar calendar(Locale("@calendar=coptic"), status);
    110     if (U_SUCCESS(status)) {
    111         calendar.setTime(Calendar::getNow(), status);
    112         calendar.add(UCAL_YEAR, -80, status);
    113         gSystemDefaultCenturyStart = calendar.getTime(status);
    114         gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status);
    115     }
    116     // We have no recourse upon failure unless we want to propagate the failure
    117     // out.
    118 }
    119 
    120 UDate
    121 CopticCalendar::defaultCenturyStart() const
    122 {
    123     // lazy-evaluate systemDefaultCenturyStart
    124     umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury);
    125     return gSystemDefaultCenturyStart;
    126 }
    127 
    128 int32_t
    129 CopticCalendar::defaultCenturyStartYear() const
    130 {
    131     // lazy-evaluate systemDefaultCenturyStart
    132     umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury);
    133     return gSystemDefaultCenturyStartYear;
    134 }
    135 
    136 
    137 int32_t
    138 CopticCalendar::getJDEpochOffset() const
    139 {
    140     return COPTIC_JD_EPOCH_OFFSET;
    141 }
    142 
    143 
    144 #if 0
    145 // We do not want to introduce this API in ICU4C.
    146 // It was accidentally introduced in ICU4J as a public API.
    147 
    148 //-------------------------------------------------------------------------
    149 // Calendar system Conversion methods...
    150 //-------------------------------------------------------------------------
    151 
    152 int32_t
    153 CopticCalendar::copticToJD(int32_t year, int32_t month, int32_t day)
    154 {
    155     return CECalendar::ceToJD(year, month, day, COPTIC_JD_EPOCH_OFFSET);
    156 }
    157 #endif
    158 
    159 U_NAMESPACE_END
    160 
    161 #endif /* #if !UCONFIG_NO_FORMATTING */
    162 //eof
    163