/src/mozilla-central/intl/icu/source/i18n/japancal.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | // © 2016 and later: Unicode, Inc. and others. |
2 | | // License & terms of use: http://www.unicode.org/copyright.html |
3 | | /* |
4 | | ******************************************************************************* |
5 | | * Copyright (C) 2003-2009,2012,2016 International Business Machines Corporation and |
6 | | * others. All Rights Reserved. |
7 | | ******************************************************************************* |
8 | | * |
9 | | * File JAPANCAL.CPP |
10 | | * |
11 | | * Modification History: |
12 | | * 05/16/2003 srl copied from buddhcal.cpp |
13 | | * |
14 | | */ |
15 | | |
16 | | #include "unicode/utypes.h" |
17 | | |
18 | | #if !UCONFIG_NO_FORMATTING |
19 | | |
20 | | #include "cmemory.h" |
21 | | #include "japancal.h" |
22 | | #include "unicode/gregocal.h" |
23 | | #include "umutex.h" |
24 | | #include "uassert.h" |
25 | | |
26 | | //#define U_DEBUG_JCAL |
27 | | |
28 | | #ifdef U_DEBUG_JCAL |
29 | | #include <stdio.h> |
30 | | #endif |
31 | | |
32 | | U_NAMESPACE_BEGIN |
33 | | |
34 | | UOBJECT_DEFINE_RTTI_IMPLEMENTATION(JapaneseCalendar) |
35 | | |
36 | | // Gregorian date of each emperor's ascension |
37 | | // Years are AD, months are 1-based. |
38 | | static const struct { |
39 | | int16_t year; |
40 | | int8_t month; |
41 | | int8_t day; |
42 | | } kEraInfo[] = { |
43 | | // Year Month Day |
44 | | { 645, 6, 19 }, // Taika 0 |
45 | | { 650, 2, 15 }, // Hakuchi 1 |
46 | | { 672, 1, 1 }, // Hakuho 2 |
47 | | { 686, 7, 20 }, // Shucho 3 |
48 | | { 701, 3, 21 }, // Taiho 4 |
49 | | { 704, 5, 10 }, // Keiun 5 |
50 | | { 708, 1, 11 }, // Wado 6 |
51 | | { 715, 9, 2 }, // Reiki 7 |
52 | | { 717, 11, 17 }, // Yoro 8 |
53 | | { 724, 2, 4 }, // Jinki 9 |
54 | | { 729, 8, 5 }, // Tempyo 10 |
55 | | { 749, 4, 14 }, // Tempyo-kampo 11 |
56 | | { 749, 7, 2 }, // Tempyo-shoho 12 |
57 | | { 757, 8, 18 }, // Tempyo-hoji 13 |
58 | | { 765, 1, 7 }, // Tempho-jingo 14 |
59 | | { 767, 8, 16 }, // Jingo-keiun 15 |
60 | | { 770, 10, 1 }, // Hoki 16 |
61 | | { 781, 1, 1 }, // Ten-o 17 |
62 | | { 782, 8, 19 }, // Enryaku 18 |
63 | | { 806, 5, 18 }, // Daido 19 |
64 | | { 810, 9, 19 }, // Konin 20 |
65 | | { 824, 1, 5 }, // Tencho |
66 | | { 834, 1, 3 }, // Showa |
67 | | { 848, 6, 13 }, // Kajo |
68 | | { 851, 4, 28 }, // Ninju |
69 | | { 854, 11, 30 }, // Saiko |
70 | | { 857, 2, 21 }, // Tennan |
71 | | { 859, 4, 15 }, // Jogan |
72 | | { 877, 4, 16 }, // Genkei |
73 | | { 885, 2, 21 }, // Ninna |
74 | | { 889, 4, 27 }, // Kampyo 30 |
75 | | { 898, 4, 26 }, // Shotai |
76 | | { 901, 7, 15 }, // Engi |
77 | | { 923, 4, 11 }, // Encho |
78 | | { 931, 4, 26 }, // Shohei |
79 | | { 938, 5, 22 }, // Tengyo |
80 | | { 947, 4, 22 }, // Tenryaku |
81 | | { 957, 10, 27 }, // Tentoku |
82 | | { 961, 2, 16 }, // Owa |
83 | | { 964, 7, 10 }, // Koho |
84 | | { 968, 8, 13 }, // Anna 40 |
85 | | { 970, 3, 25 }, // Tenroku |
86 | | { 973, 12, 20 }, // Ten-en |
87 | | { 976, 7, 13 }, // Jogen |
88 | | { 978, 11, 29 }, // Tengen |
89 | | { 983, 4, 15 }, // Eikan |
90 | | { 985, 4, 27 }, // Kanna |
91 | | { 987, 4, 5 }, // Ei-en |
92 | | { 989, 8, 8 }, // Eiso |
93 | | { 990, 11, 7 }, // Shoryaku |
94 | | { 995, 2, 22 }, // Chotoku 50 |
95 | | { 999, 1, 13 }, // Choho |
96 | | { 1004, 7, 20 }, // Kanko |
97 | | { 1012, 12, 25 }, // Chowa |
98 | | { 1017, 4, 23 }, // Kannin |
99 | | { 1021, 2, 2 }, // Jian |
100 | | { 1024, 7, 13 }, // Manju |
101 | | { 1028, 7, 25 }, // Chogen |
102 | | { 1037, 4, 21 }, // Choryaku |
103 | | { 1040, 11, 10 }, // Chokyu |
104 | | { 1044, 11, 24 }, // Kantoku 60 |
105 | | { 1046, 4, 14 }, // Eisho |
106 | | { 1053, 1, 11 }, // Tengi |
107 | | { 1058, 8, 29 }, // Kohei |
108 | | { 1065, 8, 2 }, // Jiryaku |
109 | | { 1069, 4, 13 }, // Enkyu |
110 | | { 1074, 8, 23 }, // Shoho |
111 | | { 1077, 11, 17 }, // Shoryaku |
112 | | { 1081, 2, 10 }, // Eiho |
113 | | { 1084, 2, 7 }, // Otoku |
114 | | { 1087, 4, 7 }, // Kanji 70 |
115 | | { 1094, 12, 15 }, // Kaho |
116 | | { 1096, 12, 17 }, // Eicho |
117 | | { 1097, 11, 21 }, // Shotoku |
118 | | { 1099, 8, 28 }, // Kowa |
119 | | { 1104, 2, 10 }, // Choji |
120 | | { 1106, 4, 9 }, // Kasho |
121 | | { 1108, 8, 3 }, // Tennin |
122 | | { 1110, 7, 13 }, // Ten-ei |
123 | | { 1113, 7, 13 }, // Eikyu |
124 | | { 1118, 4, 3 }, // Gen-ei 80 |
125 | | { 1120, 4, 10 }, // Hoan |
126 | | { 1124, 4, 3 }, // Tenji |
127 | | { 1126, 1, 22 }, // Daiji |
128 | | { 1131, 1, 29 }, // Tensho |
129 | | { 1132, 8, 11 }, // Chosho |
130 | | { 1135, 4, 27 }, // Hoen |
131 | | { 1141, 7, 10 }, // Eiji |
132 | | { 1142, 4, 28 }, // Koji |
133 | | { 1144, 2, 23 }, // Tenyo |
134 | | { 1145, 7, 22 }, // Kyuan 90 |
135 | | { 1151, 1, 26 }, // Ninpei |
136 | | { 1154, 10, 28 }, // Kyuju |
137 | | { 1156, 4, 27 }, // Hogen |
138 | | { 1159, 4, 20 }, // Heiji |
139 | | { 1160, 1, 10 }, // Eiryaku |
140 | | { 1161, 9, 4 }, // Oho |
141 | | { 1163, 3, 29 }, // Chokan |
142 | | { 1165, 6, 5 }, // Eiman |
143 | | { 1166, 8, 27 }, // Nin-an |
144 | | { 1169, 4, 8 }, // Kao 100 |
145 | | { 1171, 4, 21 }, // Shoan |
146 | | { 1175, 7, 28 }, // Angen |
147 | | { 1177, 8, 4 }, // Jisho |
148 | | { 1181, 7, 14 }, // Yowa |
149 | | { 1182, 5, 27 }, // Juei |
150 | | { 1184, 4, 16 }, // Genryuku |
151 | | { 1185, 8, 14 }, // Bunji |
152 | | { 1190, 4, 11 }, // Kenkyu |
153 | | { 1199, 4, 27 }, // Shoji |
154 | | { 1201, 2, 13 }, // Kennin 110 |
155 | | { 1204, 2, 20 }, // Genkyu |
156 | | { 1206, 4, 27 }, // Ken-ei |
157 | | { 1207, 10, 25 }, // Shogen |
158 | | { 1211, 3, 9 }, // Kenryaku |
159 | | { 1213, 12, 6 }, // Kenpo |
160 | | { 1219, 4, 12 }, // Shokyu |
161 | | { 1222, 4, 13 }, // Joo |
162 | | { 1224, 11, 20 }, // Gennin |
163 | | { 1225, 4, 20 }, // Karoku |
164 | | { 1227, 12, 10 }, // Antei 120 |
165 | | { 1229, 3, 5 }, // Kanki |
166 | | { 1232, 4, 2 }, // Joei |
167 | | { 1233, 4, 15 }, // Tempuku |
168 | | { 1234, 11, 5 }, // Bunryaku |
169 | | { 1235, 9, 19 }, // Katei |
170 | | { 1238, 11, 23 }, // Ryakunin |
171 | | { 1239, 2, 7 }, // En-o |
172 | | { 1240, 7, 16 }, // Ninji |
173 | | { 1243, 2, 26 }, // Kangen |
174 | | { 1247, 2, 28 }, // Hoji 130 |
175 | | { 1249, 3, 18 }, // Kencho |
176 | | { 1256, 10, 5 }, // Kogen |
177 | | { 1257, 3, 14 }, // Shoka |
178 | | { 1259, 3, 26 }, // Shogen |
179 | | { 1260, 4, 13 }, // Bun-o |
180 | | { 1261, 2, 20 }, // Kocho |
181 | | { 1264, 2, 28 }, // Bun-ei |
182 | | { 1275, 4, 25 }, // Kenji |
183 | | { 1278, 2, 29 }, // Koan |
184 | | { 1288, 4, 28 }, // Shoo 140 |
185 | | { 1293, 8, 55 }, // Einin |
186 | | { 1299, 4, 25 }, // Shoan |
187 | | { 1302, 11, 21 }, // Kengen |
188 | | { 1303, 8, 5 }, // Kagen |
189 | | { 1306, 12, 14 }, // Tokuji |
190 | | { 1308, 10, 9 }, // Enkei |
191 | | { 1311, 4, 28 }, // Ocho |
192 | | { 1312, 3, 20 }, // Showa |
193 | | { 1317, 2, 3 }, // Bunpo |
194 | | { 1319, 4, 28 }, // Geno 150 |
195 | | { 1321, 2, 23 }, // Genkyo |
196 | | { 1324, 12, 9 }, // Shochu |
197 | | { 1326, 4, 26 }, // Kareki |
198 | | { 1329, 8, 29 }, // Gentoku |
199 | | { 1331, 8, 9 }, // Genko |
200 | | { 1334, 1, 29 }, // Kemmu |
201 | | { 1336, 2, 29 }, // Engen |
202 | | { 1340, 4, 28 }, // Kokoku |
203 | | { 1346, 12, 8 }, // Shohei |
204 | | { 1370, 7, 24 }, // Kentoku 160 |
205 | | { 1372, 4, 1 }, // Bunch\u0169 |
206 | | { 1375, 5, 27 }, // Tenju |
207 | | { 1379, 3, 22 }, // Koryaku |
208 | | { 1381, 2, 10 }, // Kowa |
209 | | { 1384, 4, 28 }, // Gench\u0169 |
210 | | { 1384, 2, 27 }, // Meitoku |
211 | | { 1387, 8, 23 }, // Kakei |
212 | | { 1389, 2, 9 }, // Koo |
213 | | { 1390, 3, 26 }, // Meitoku |
214 | | { 1394, 7, 5 }, // Oei 170 |
215 | | { 1428, 4, 27 }, // Shocho |
216 | | { 1429, 9, 5 }, // Eikyo |
217 | | { 1441, 2, 17 }, // Kakitsu |
218 | | { 1444, 2, 5 }, // Bun-an |
219 | | { 1449, 7, 28 }, // Hotoku |
220 | | { 1452, 7, 25 }, // Kyotoku |
221 | | { 1455, 7, 25 }, // Kosho |
222 | | { 1457, 9, 28 }, // Choroku |
223 | | { 1460, 12, 21 }, // Kansho |
224 | | { 1466, 2, 28 }, // Bunsho 180 |
225 | | { 1467, 3, 3 }, // Onin |
226 | | { 1469, 4, 28 }, // Bunmei |
227 | | { 1487, 7, 29 }, // Chokyo |
228 | | { 1489, 8, 21 }, // Entoku |
229 | | { 1492, 7, 19 }, // Meio |
230 | | { 1501, 2, 29 }, // Bunki |
231 | | { 1504, 2, 30 }, // Eisho |
232 | | { 1521, 8, 23 }, // Taiei |
233 | | { 1528, 8, 20 }, // Kyoroku |
234 | | { 1532, 7, 29 }, // Tenmon 190 |
235 | | { 1555, 10, 23 }, // Koji |
236 | | { 1558, 2, 28 }, // Eiroku |
237 | | { 1570, 4, 23 }, // Genki |
238 | | { 1573, 7, 28 }, // Tensho |
239 | | { 1592, 12, 8 }, // Bunroku |
240 | | { 1596, 10, 27 }, // Keicho |
241 | | { 1615, 7, 13 }, // Genwa |
242 | | { 1624, 2, 30 }, // Kan-ei |
243 | | { 1644, 12, 16 }, // Shoho |
244 | | { 1648, 2, 15 }, // Keian 200 |
245 | | { 1652, 9, 18 }, // Shoo |
246 | | { 1655, 4, 13 }, // Meiryaku |
247 | | { 1658, 7, 23 }, // Manji |
248 | | { 1661, 4, 25 }, // Kanbun |
249 | | { 1673, 9, 21 }, // Enpo |
250 | | { 1681, 9, 29 }, // Tenwa |
251 | | { 1684, 2, 21 }, // Jokyo |
252 | | { 1688, 9, 30 }, // Genroku |
253 | | { 1704, 3, 13 }, // Hoei |
254 | | { 1711, 4, 25 }, // Shotoku 210 |
255 | | { 1716, 6, 22 }, // Kyoho |
256 | | { 1736, 4, 28 }, // Genbun |
257 | | { 1741, 2, 27 }, // Kanpo |
258 | | { 1744, 2, 21 }, // Enkyo |
259 | | { 1748, 7, 12 }, // Kan-en |
260 | | { 1751, 10, 27 }, // Horyaku |
261 | | { 1764, 6, 2 }, // Meiwa |
262 | | { 1772, 11, 16 }, // An-ei |
263 | | { 1781, 4, 2 }, // Tenmei |
264 | | { 1789, 1, 25 }, // Kansei 220 |
265 | | { 1801, 2, 5 }, // Kyowa |
266 | | { 1804, 2, 11 }, // Bunka |
267 | | { 1818, 4, 22 }, // Bunsei |
268 | | { 1830, 12, 10 }, // Tenpo |
269 | | { 1844, 12, 2 }, // Koka |
270 | | { 1848, 2, 28 }, // Kaei |
271 | | { 1854, 11, 27 }, // Ansei |
272 | | { 1860, 3, 18 }, // Man-en |
273 | | { 1861, 2, 19 }, // Bunkyu |
274 | | { 1864, 2, 20 }, // Genji 230 |
275 | | { 1865, 4, 7 }, // Keio 231 |
276 | | { 1868, 9, 8 }, // Meiji 232 |
277 | | { 1912, 7, 30 }, // Taisho 233 |
278 | | { 1926, 12, 25 }, // Showa 234 |
279 | | { 1989, 1, 8 } // Heisei 235 |
280 | | }; |
281 | | |
282 | 0 | #define kEraCount UPRV_LENGTHOF(kEraInfo) |
283 | | |
284 | | /** |
285 | | * The current era, for reference. |
286 | | */ |
287 | | static const int32_t kCurrentEra = (kEraCount-1); // int32_t to match the calendar field type |
288 | | |
289 | | static const int32_t kGregorianEpoch = 1970; // used as the default value of EXTENDED_YEAR |
290 | | |
291 | | /* Some platforms don't like to export constants, like old Palm OS and some z/OS configurations. */ |
292 | 0 | uint32_t JapaneseCalendar::getCurrentEra() { |
293 | 0 | return kCurrentEra; |
294 | 0 | } |
295 | | |
296 | | JapaneseCalendar::JapaneseCalendar(const Locale& aLocale, UErrorCode& success) |
297 | | : GregorianCalendar(aLocale, success) |
298 | 0 | { |
299 | 0 | setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. |
300 | 0 | } |
301 | | |
302 | | JapaneseCalendar::~JapaneseCalendar() |
303 | 0 | { |
304 | 0 | } |
305 | | |
306 | | JapaneseCalendar::JapaneseCalendar(const JapaneseCalendar& source) |
307 | | : GregorianCalendar(source) |
308 | 0 | { |
309 | 0 | } |
310 | | |
311 | | JapaneseCalendar& JapaneseCalendar::operator= ( const JapaneseCalendar& right) |
312 | 0 | { |
313 | 0 | GregorianCalendar::operator=(right); |
314 | 0 | return *this; |
315 | 0 | } |
316 | | |
317 | | Calendar* JapaneseCalendar::clone(void) const |
318 | 0 | { |
319 | 0 | return new JapaneseCalendar(*this); |
320 | 0 | } |
321 | | |
322 | | const char *JapaneseCalendar::getType() const |
323 | 0 | { |
324 | 0 | return "japanese"; |
325 | 0 | } |
326 | | |
327 | | int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear) |
328 | 0 | { |
329 | 0 | int32_t era = internalGetEra(); |
330 | 0 | // TODO do we assume we can trust 'era'? What if it is denormalized? |
331 | 0 |
|
332 | 0 | int32_t month = 0; |
333 | 0 |
|
334 | 0 | // Find out if we are at the edge of an era |
335 | 0 |
|
336 | 0 | if(eyear == kEraInfo[era].year) { |
337 | 0 | // Yes, we're in the first year of this era. |
338 | 0 | return kEraInfo[era].month-1; |
339 | 0 | } |
340 | 0 | |
341 | 0 | return month; |
342 | 0 | } |
343 | | |
344 | | int32_t JapaneseCalendar::getDefaultDayInMonth(int32_t eyear, int32_t month) |
345 | 0 | { |
346 | 0 | int32_t era = internalGetEra(); |
347 | 0 | int32_t day = 1; |
348 | 0 |
|
349 | 0 | if(eyear == kEraInfo[era].year) { |
350 | 0 | if(month == (kEraInfo[era].month-1)) { |
351 | 0 | return kEraInfo[era].day; |
352 | 0 | } |
353 | 0 | } |
354 | 0 | |
355 | 0 | return day; |
356 | 0 | } |
357 | | |
358 | | |
359 | | int32_t JapaneseCalendar::internalGetEra() const |
360 | 0 | { |
361 | 0 | return internalGet(UCAL_ERA, kCurrentEra); |
362 | 0 | } |
363 | | |
364 | | int32_t JapaneseCalendar::handleGetExtendedYear() |
365 | 0 | { |
366 | 0 | // EXTENDED_YEAR in JapaneseCalendar is a Gregorian year |
367 | 0 | // The default value of EXTENDED_YEAR is 1970 (Showa 45) |
368 | 0 | int32_t year; |
369 | 0 |
|
370 | 0 | if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR && |
371 | 0 | newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) { |
372 | 0 | year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); |
373 | 0 | } else { |
374 | 0 | // Subtract one because year starts at 1 |
375 | 0 | year = internalGet(UCAL_YEAR) + kEraInfo[internalGetEra()].year - 1; |
376 | 0 | } |
377 | 0 | return year; |
378 | 0 | } |
379 | | |
380 | | |
381 | | void JapaneseCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) |
382 | 0 | { |
383 | 0 | //Calendar::timeToFields(theTime, quick, status); |
384 | 0 | GregorianCalendar::handleComputeFields(julianDay, status); |
385 | 0 | int32_t year = internalGet(UCAL_EXTENDED_YEAR); // Gregorian year |
386 | 0 |
|
387 | 0 | int32_t low = 0; |
388 | 0 |
|
389 | 0 | // Short circuit for recent years. Most modern computations will |
390 | 0 | // occur in the current era and won't require the binary search. |
391 | 0 | // Note that if the year is == the current era year, then we use |
392 | 0 | // the binary search to handle the month/dom comparison. |
393 | | #ifdef U_DEBUG_JCAL |
394 | | fprintf(stderr, "== %d \n", year); |
395 | | #endif |
396 | |
|
397 | 0 | if (year > kEraInfo[kCurrentEra].year) { |
398 | 0 | low = kCurrentEra; |
399 | | #ifdef U_DEBUG_JCAL |
400 | | fprintf(stderr, " low=%d (special)\n", low); |
401 | | #endif |
402 | 0 | } else { |
403 | 0 | // Binary search |
404 | 0 | int32_t high = kEraCount; |
405 | 0 |
|
406 | | #ifdef U_DEBUG_JCAL |
407 | | fprintf(stderr, " high=%d\n", high); |
408 | | #endif |
409 | 0 | while (low < high - 1) { |
410 | 0 | int32_t i = (low + high) / 2; |
411 | 0 | int32_t diff = year - kEraInfo[i].year; |
412 | 0 |
|
413 | | #ifdef U_DEBUG_JCAL |
414 | | fprintf(stderr, " d=%d low=%d, high=%d. Considering %d:M%d D%d Y%d. { we are ?:M%d D%d Y%d }\n", |
415 | | diff,low, high, i, kEraInfo[i].month-1, kEraInfo[i].day, kEraInfo[i].year, internalGet(UCAL_MONTH), internalGet(UCAL_DATE),year); |
416 | | #endif |
417 | |
|
418 | 0 | // If years are the same, then compare the months, and if those |
419 | 0 | // are the same, compare days of month. In the ERAS array |
420 | 0 | // months are 1-based for easier maintenance. |
421 | 0 | if (diff == 0) { |
422 | 0 | diff = internalGet(UCAL_MONTH) - (kEraInfo[i].month - 1); |
423 | | #ifdef U_DEBUG_JCAL |
424 | | fprintf(stderr, "diff now %d (M) = %d - %d - 1\n", diff, internalGet(UCAL_MONTH), kEraInfo[i].month); |
425 | | #endif |
426 | 0 | if (diff == 0) { |
427 | 0 | diff = internalGet(UCAL_DATE) - kEraInfo[i].day; |
428 | | #ifdef U_DEBUG_JCAL |
429 | | fprintf(stderr, "diff now %d (D)\n", diff); |
430 | | #endif |
431 | | } |
432 | 0 | } |
433 | 0 | if (diff >= 0) { |
434 | 0 | low = i; |
435 | 0 | } else { |
436 | 0 | high = i; |
437 | 0 | } |
438 | | #ifdef U_DEBUG_JCAL |
439 | | fprintf(stderr, ". low=%d, high=%d, i=%d, diff=%d.. %d\n", low, high, i, diff, year); |
440 | | #endif |
441 | |
|
442 | 0 | } |
443 | 0 | } |
444 | 0 |
|
445 | | #ifdef U_DEBUG_JCAL |
446 | | fprintf(stderr, " low[era]=%d,.. %d\n", low, year); |
447 | | #endif |
448 | | // Now we've found the last era that starts before this date, so |
449 | 0 | // adjust the year to count from the start of that era. Note that |
450 | 0 | // all dates before the first era will fall into the first era by |
451 | 0 | // the algorithm. |
452 | 0 |
|
453 | 0 | internalSet(UCAL_ERA, low); |
454 | 0 | internalSet(UCAL_YEAR, year - kEraInfo[low].year + 1); |
455 | | #ifdef U_DEBUG_JCAL |
456 | | fprintf(stderr, " Set ERA=%d, year=%d\n", low, year-kEraInfo[low].year+1); |
457 | | #endif |
458 | |
|
459 | 0 | } |
460 | | |
461 | | /* |
462 | | Disable pivoting |
463 | | */ |
464 | | UBool JapaneseCalendar::haveDefaultCentury() const |
465 | 0 | { |
466 | 0 | return FALSE; |
467 | 0 | } |
468 | | |
469 | | UDate JapaneseCalendar::defaultCenturyStart() const |
470 | 0 | { |
471 | 0 | return 0;// WRONG |
472 | 0 | } |
473 | | |
474 | | int32_t JapaneseCalendar::defaultCenturyStartYear() const |
475 | 0 | { |
476 | 0 | return 0; |
477 | 0 | } |
478 | | |
479 | | int32_t JapaneseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const |
480 | 0 | { |
481 | 0 | switch(field) { |
482 | 0 | case UCAL_ERA: |
483 | 0 | if (limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) { |
484 | 0 | return 0; |
485 | 0 | } |
486 | 0 | return kCurrentEra; |
487 | 0 | case UCAL_YEAR: |
488 | 0 | { |
489 | 0 | switch (limitType) { |
490 | 0 | case UCAL_LIMIT_MINIMUM: |
491 | 0 | case UCAL_LIMIT_GREATEST_MINIMUM: |
492 | 0 | return 1; |
493 | 0 | case UCAL_LIMIT_LEAST_MAXIMUM: |
494 | 0 | return 1; |
495 | 0 | case UCAL_LIMIT_COUNT: //added to avoid warning |
496 | 0 | case UCAL_LIMIT_MAXIMUM: |
497 | 0 | return GregorianCalendar::handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM) - kEraInfo[kCurrentEra].year; |
498 | 0 | default: |
499 | 0 | return 1; // Error condition, invalid limitType |
500 | 0 | } |
501 | 0 | } |
502 | 0 | default: |
503 | 0 | return GregorianCalendar::handleGetLimit(field,limitType); |
504 | 0 | } |
505 | 0 | } |
506 | | |
507 | 0 | int32_t JapaneseCalendar::getActualMaximum(UCalendarDateFields field, UErrorCode& status) const { |
508 | 0 | if (field == UCAL_YEAR) { |
509 | 0 | int32_t era = get(UCAL_ERA, status); |
510 | 0 | if (U_FAILURE(status)) { |
511 | 0 | return 0; // error case... any value |
512 | 0 | } |
513 | 0 | if (era == kCurrentEra) { |
514 | 0 | // TODO: Investigate what value should be used here - revisit after 4.0. |
515 | 0 | return handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM); |
516 | 0 | } else { |
517 | 0 | int32_t nextEraYear = kEraInfo[era + 1].year; |
518 | 0 | int32_t nextEraMonth = kEraInfo[era + 1].month; |
519 | 0 | int32_t nextEraDate = kEraInfo[era + 1].day; |
520 | 0 |
|
521 | 0 | int32_t maxYear = nextEraYear - kEraInfo[era].year + 1; // 1-base |
522 | 0 | if (nextEraMonth == 1 && nextEraDate == 1) { |
523 | 0 | // Subtract 1, because the next era starts at Jan 1 |
524 | 0 | maxYear--; |
525 | 0 | } |
526 | 0 | return maxYear; |
527 | 0 | } |
528 | 0 | } |
529 | 0 | return GregorianCalendar::getActualMaximum(field, status); |
530 | 0 | } |
531 | | |
532 | | U_NAMESPACE_END |
533 | | |
534 | | #endif |