|
1 /* |
|
2 ******************************************************************************* |
|
3 * Copyright (C) 2003-2013, International Business Machines Corporation and |
|
4 * others. All Rights Reserved. |
|
5 ******************************************************************************* |
|
6 * |
|
7 * File TAIWNCAL.CPP |
|
8 * |
|
9 * Modification History: |
|
10 * 05/13/2003 srl copied from gregocal.cpp |
|
11 * 06/29/2007 srl copied from buddhcal.cpp |
|
12 * 05/12/2008 jce modified to use calendar=roc per CLDR |
|
13 * |
|
14 */ |
|
15 |
|
16 #include "unicode/utypes.h" |
|
17 |
|
18 #if !UCONFIG_NO_FORMATTING |
|
19 |
|
20 #include "taiwncal.h" |
|
21 #include "unicode/gregocal.h" |
|
22 #include "umutex.h" |
|
23 #include <float.h> |
|
24 |
|
25 U_NAMESPACE_BEGIN |
|
26 |
|
27 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TaiwanCalendar) |
|
28 |
|
29 static const int32_t kTaiwanEraStart = 1911; // 1911 (Gregorian) |
|
30 |
|
31 static const int32_t kGregorianEpoch = 1970; |
|
32 |
|
33 TaiwanCalendar::TaiwanCalendar(const Locale& aLocale, UErrorCode& success) |
|
34 : GregorianCalendar(aLocale, success) |
|
35 { |
|
36 setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. |
|
37 } |
|
38 |
|
39 TaiwanCalendar::~TaiwanCalendar() |
|
40 { |
|
41 } |
|
42 |
|
43 TaiwanCalendar::TaiwanCalendar(const TaiwanCalendar& source) |
|
44 : GregorianCalendar(source) |
|
45 { |
|
46 } |
|
47 |
|
48 TaiwanCalendar& TaiwanCalendar::operator= ( const TaiwanCalendar& right) |
|
49 { |
|
50 GregorianCalendar::operator=(right); |
|
51 return *this; |
|
52 } |
|
53 |
|
54 Calendar* TaiwanCalendar::clone(void) const |
|
55 { |
|
56 return new TaiwanCalendar(*this); |
|
57 } |
|
58 |
|
59 const char *TaiwanCalendar::getType() const |
|
60 { |
|
61 return "roc"; |
|
62 } |
|
63 |
|
64 int32_t TaiwanCalendar::handleGetExtendedYear() |
|
65 { |
|
66 // EXTENDED_YEAR in TaiwanCalendar is a Gregorian year |
|
67 // The default value of EXTENDED_YEAR is 1970 (Minguo 59) |
|
68 int32_t year = kGregorianEpoch; |
|
69 |
|
70 if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR |
|
71 && newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) { |
|
72 year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); |
|
73 } else { |
|
74 int32_t era = internalGet(UCAL_ERA, MINGUO); |
|
75 if(era == MINGUO) { |
|
76 year = internalGet(UCAL_YEAR, 1) + kTaiwanEraStart; |
|
77 } else if(era == BEFORE_MINGUO) { |
|
78 year = 1 - internalGet(UCAL_YEAR, 1) + kTaiwanEraStart; |
|
79 } |
|
80 } |
|
81 return year; |
|
82 } |
|
83 |
|
84 void TaiwanCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) |
|
85 { |
|
86 GregorianCalendar::handleComputeFields(julianDay, status); |
|
87 int32_t y = internalGet(UCAL_EXTENDED_YEAR) - kTaiwanEraStart; |
|
88 if(y>0) { |
|
89 internalSet(UCAL_ERA, MINGUO); |
|
90 internalSet(UCAL_YEAR, y); |
|
91 } else { |
|
92 internalSet(UCAL_ERA, BEFORE_MINGUO); |
|
93 internalSet(UCAL_YEAR, 1-y); |
|
94 } |
|
95 } |
|
96 |
|
97 int32_t TaiwanCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const |
|
98 { |
|
99 if(field == UCAL_ERA) { |
|
100 if(limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) { |
|
101 return BEFORE_MINGUO; |
|
102 } else { |
|
103 return MINGUO; |
|
104 } |
|
105 } else { |
|
106 return GregorianCalendar::handleGetLimit(field,limitType); |
|
107 } |
|
108 } |
|
109 |
|
110 #if 0 |
|
111 void TaiwanCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& status) |
|
112 { |
|
113 //Calendar::timeToFields(theTime, quick, status); |
|
114 |
|
115 int32_t era = internalGet(UCAL_ERA); |
|
116 int32_t year = internalGet(UCAL_YEAR); |
|
117 |
|
118 if(era == GregorianCalendar::BC) { |
|
119 year = 1-year; |
|
120 era = TaiwanCalendar::MINGUO; |
|
121 } else if(era == GregorianCalendar::AD) { |
|
122 era = TaiwanCalendar::MINGUO; |
|
123 } else { |
|
124 status = U_INTERNAL_PROGRAM_ERROR; |
|
125 } |
|
126 |
|
127 year = year - kTaiwanEraStart; |
|
128 |
|
129 internalSet(UCAL_ERA, era); |
|
130 internalSet(UCAL_YEAR, year); |
|
131 } |
|
132 #endif |
|
133 |
|
134 /** |
|
135 * The system maintains a static default century start date and Year. They are |
|
136 * initialized the first time they are used. Once the system default century date |
|
137 * and year are set, they do not change. |
|
138 */ |
|
139 static UDate gSystemDefaultCenturyStart = DBL_MIN; |
|
140 static int32_t gSystemDefaultCenturyStartYear = -1; |
|
141 static icu::UInitOnce gSystemDefaultCenturyInit = U_INITONCE_INITIALIZER; |
|
142 |
|
143 UBool TaiwanCalendar::haveDefaultCentury() const |
|
144 { |
|
145 return TRUE; |
|
146 } |
|
147 |
|
148 static void U_CALLCONV initializeSystemDefaultCentury() |
|
149 { |
|
150 // initialize systemDefaultCentury and systemDefaultCenturyYear based |
|
151 // on the current time. They'll be set to 80 years before |
|
152 // the current time. |
|
153 UErrorCode status = U_ZERO_ERROR; |
|
154 TaiwanCalendar calendar(Locale("@calendar=roc"),status); |
|
155 if (U_SUCCESS(status)) |
|
156 { |
|
157 calendar.setTime(Calendar::getNow(), status); |
|
158 calendar.add(UCAL_YEAR, -80, status); |
|
159 |
|
160 gSystemDefaultCenturyStart = calendar.getTime(status); |
|
161 gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); |
|
162 } |
|
163 // We have no recourse upon failure unless we want to propagate the failure |
|
164 // out. |
|
165 } |
|
166 |
|
167 UDate TaiwanCalendar::defaultCenturyStart() const { |
|
168 // lazy-evaluate systemDefaultCenturyStart |
|
169 umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); |
|
170 return gSystemDefaultCenturyStart; |
|
171 } |
|
172 |
|
173 int32_t TaiwanCalendar::defaultCenturyStartYear() const { |
|
174 // lazy-evaluate systemDefaultCenturyStartYear |
|
175 umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); |
|
176 return gSystemDefaultCenturyStartYear; |
|
177 } |
|
178 |
|
179 U_NAMESPACE_END |
|
180 |
|
181 #endif |