1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *******************************************************************************
359d709d503bab6e2b61931737e662dd293b40578ccornelius * Copyright (C) 2003-2013, International Business Machines Corporation and
459d709d503bab6e2b61931737e662dd293b40578ccornelius * others. All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *******************************************************************************
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * File TAIWNCAL.CPP
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Modification History:
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *  05/13/2003    srl     copied from gregocal.cpp
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *  06/29/2007    srl     copied from buddhcal.cpp
1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho *  05/12/2008    jce     modified to use calendar=roc per CLDR
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "taiwncal.h"
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/gregocal.h"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "umutex.h"
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <float.h>
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(TaiwanCalendar)
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const int32_t kTaiwanEraStart = 1911;  // 1911 (Gregorian)
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const int32_t kGregorianEpoch = 1970;
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTaiwanCalendar::TaiwanCalendar(const Locale& aLocale, UErrorCode& success)
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru:   GregorianCalendar(aLocale, success)
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly.
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTaiwanCalendar::~TaiwanCalendar()
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTaiwanCalendar::TaiwanCalendar(const TaiwanCalendar& source)
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru: GregorianCalendar(source)
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTaiwanCalendar& TaiwanCalendar::operator= ( const TaiwanCalendar& right)
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    GregorianCalendar::operator=(right);
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return *this;
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruCalendar* TaiwanCalendar::clone(void) const
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return new TaiwanCalendar(*this);
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char *TaiwanCalendar::getType() const
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return "roc";
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t TaiwanCalendar::handleGetExtendedYear()
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // EXTENDED_YEAR in TaiwanCalendar is a Gregorian year
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // The default value of EXTENDED_YEAR is 1970 (Minguo 59)
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t year = kGregorianEpoch;
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        && newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) {
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch);
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t era = internalGet(UCAL_ERA, MINGUO);
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(era == MINGUO) {
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            year =     internalGet(UCAL_YEAR, 1) + kTaiwanEraStart;
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else if(era == BEFORE_MINGUO) {
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            year = 1 - internalGet(UCAL_YEAR, 1) + kTaiwanEraStart;
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return year;
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TaiwanCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status)
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    GregorianCalendar::handleComputeFields(julianDay, status);
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t y = internalGet(UCAL_EXTENDED_YEAR) - kTaiwanEraStart;
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(y>0) {
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        internalSet(UCAL_ERA, MINGUO);
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        internalSet(UCAL_YEAR, y);
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        internalSet(UCAL_ERA, BEFORE_MINGUO);
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        internalSet(UCAL_YEAR, 1-y);
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t TaiwanCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(field == UCAL_ERA) {
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) {
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return BEFORE_MINGUO;
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return MINGUO;
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return GregorianCalendar::handleGetLimit(field,limitType);
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TaiwanCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& status)
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    //Calendar::timeToFields(theTime, quick, status);
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t era = internalGet(UCAL_ERA);
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t year = internalGet(UCAL_YEAR);
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(era == GregorianCalendar::BC) {
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        year = 1-year;
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        era = TaiwanCalendar::MINGUO;
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else if(era == GregorianCalendar::AD) {
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        era = TaiwanCalendar::MINGUO;
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_INTERNAL_PROGRAM_ERROR;
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    year = year - kTaiwanEraStart;
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    internalSet(UCAL_ERA, era);
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    internalSet(UCAL_YEAR, year);
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
13459d709d503bab6e2b61931737e662dd293b40578ccornelius/**
13559d709d503bab6e2b61931737e662dd293b40578ccornelius * The system maintains a static default century start date and Year.  They are
13659d709d503bab6e2b61931737e662dd293b40578ccornelius * initialized the first time they are used.  Once the system default century date
13759d709d503bab6e2b61931737e662dd293b40578ccornelius * and year are set, they do not change.
13859d709d503bab6e2b61931737e662dd293b40578ccornelius */
13959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic UDate           gSystemDefaultCenturyStart       = DBL_MIN;
14059d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic int32_t         gSystemDefaultCenturyStartYear   = -1;
14159d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic icu::UInitOnce  gSystemDefaultCenturyInit        = U_INITONCE_INITIALIZER;
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool TaiwanCalendar::haveDefaultCentury() const
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return TRUE;
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
14859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void U_CALLCONV initializeSystemDefaultCentury()
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // initialize systemDefaultCentury and systemDefaultCenturyYear based
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // on the current time.  They'll be set to 80 years before
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // the current time.
15385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UErrorCode status = U_ZERO_ERROR;
15485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    TaiwanCalendar calendar(Locale("@calendar=roc"),status);
15585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_SUCCESS(status))
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
15785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        calendar.setTime(Calendar::getNow(), status);
15885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        calendar.add(UCAL_YEAR, -80, status);
15959d709d503bab6e2b61931737e662dd293b40578ccornelius
16059d709d503bab6e2b61931737e662dd293b40578ccornelius        gSystemDefaultCenturyStart = calendar.getTime(status);
16159d709d503bab6e2b61931737e662dd293b40578ccornelius        gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status);
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
16385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    // We have no recourse upon failure unless we want to propagate the failure
16485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    // out.
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
16759d709d503bab6e2b61931737e662dd293b40578ccorneliusUDate TaiwanCalendar::defaultCenturyStart() const {
16859d709d503bab6e2b61931737e662dd293b40578ccornelius    // lazy-evaluate systemDefaultCenturyStart
16959d709d503bab6e2b61931737e662dd293b40578ccornelius    umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury);
17059d709d503bab6e2b61931737e662dd293b40578ccornelius    return gSystemDefaultCenturyStart;
17159d709d503bab6e2b61931737e662dd293b40578ccornelius}
17259d709d503bab6e2b61931737e662dd293b40578ccornelius
17359d709d503bab6e2b61931737e662dd293b40578ccorneliusint32_t TaiwanCalendar::defaultCenturyStartYear() const {
17459d709d503bab6e2b61931737e662dd293b40578ccornelius    // lazy-evaluate systemDefaultCenturyStartYear
17559d709d503bab6e2b61931737e662dd293b40578ccornelius    umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury);
17659d709d503bab6e2b61931737e662dd293b40578ccornelius    return gSystemDefaultCenturyStartYear;
17759d709d503bab6e2b61931737e662dd293b40578ccornelius}
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
182