16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2003-2009,2012, International Business Machines Corporation and    *
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* others. All Rights Reserved.                                                *
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File JAPANCAL.CPP
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History:
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*  05/16/2003    srl     copied from buddhcal.cpp
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "japancal.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/gregocal.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "umutex.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uassert.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//#define U_DEBUG_JCAL
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_DEBUG_JCAL
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUOBJECT_DEFINE_RTTI_IMPLEMENTATION(JapaneseCalendar)
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//  Gregorian date of each emperor's ascension
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//  Years are AD, months are 1-based.
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const struct {
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int16_t year;
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int8_t  month;
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int8_t  day;
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} kEraInfo[] =  {
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //  Year  Month Day
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   645,    6, 19 },   // Taika   0
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   650,    2, 15 },   // Hakuchi 1
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   672,    1,  1 },   // Hakuho  2
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   686,    7, 20 },   // Shucho  3
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   701,    3, 21 },   // Taiho   4
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   704,    5, 10 },   // Keiun   5
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   708,    1, 11 },   // Wado    6
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   715,    9,  2 },   // Reiki   7
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   717,   11, 17 },   // Yoro    8
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   724,    2,  4 },   // Jinki   9
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   729,    8,  5 },   // Tempyo  10
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   749,    4, 14 },   // Tempyo-kampo 11
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   749,    7,  2 },   // Tempyo-shoho 12
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   757,    8, 18 },   // Tempyo-hoji  13
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   765,    1,  7 },   // Tempho-jingo 14
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   767,    8, 16 },   // Jingo-keiun  15
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   770,   10,  1 },   // Hoki         16
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   781,    1,  1 },   // Ten-o        17
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   782,    8, 19 },   // Enryaku      18
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   806,    5, 18 },   // Daido        19
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   810,    9, 19 },   // Konin        20
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   824,    1,  5 },   // Tencho
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   834,    1,  3 },   // Showa
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   848,    6, 13 },   // Kajo
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   851,    4, 28 },   // Ninju
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   854,   11, 30 },   // Saiko
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   857,    2, 21 },   // Tennan
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   859,    4, 15 },   // Jogan
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   877,    4, 16 },   // Genkei
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   885,    2, 21 },   // Ninna
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   889,    4, 27 },   // Kampyo       30
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   898,    4, 26 },   // Shotai
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   901,    7, 15 },   // Engi
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   923,    4, 11 },   // Encho
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   931,    4, 26 },   // Shohei
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   938,    5, 22 },   // Tengyo
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   947,    4, 22 },   // Tenryaku
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   957,   10, 27 },   // Tentoku
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   961,    2, 16 },   // Owa
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   964,    7, 10 },   // Koho
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   968,    8, 13 },   // Anna        40
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   970,    3, 25 },   // Tenroku
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   973,   12, 20 },   // Ten-en
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   976,    7, 13 },   // Jogen
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   978,   11, 29 },   // Tengen
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   983,    4, 15 },   // Eikan
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   985,    4, 27 },   // Kanna
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   987,    4,  5 },   // Ei-en
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   989,    8,  8 },   // Eiso
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   990,   11,  7 },   // Shoryaku
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   995,    2, 22 },   // Chotoku      50
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {   999,    1, 13 },   // Choho
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1004,    7, 20 },   // Kanko
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1012,   12, 25 },   // Chowa
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1017,    4, 23 },   // Kannin
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1021,    2,  2 },   // Jian
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1024,    7, 13 },   // Manju
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1028,    7, 25 },   // Chogen
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1037,    4, 21 },   // Choryaku
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1040,   11, 10 },   // Chokyu
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1044,   11, 24 },   // Kantoku      60
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1046,    4, 14 },   // Eisho
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1053,    1, 11 },   // Tengi
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1058,    8, 29 },   // Kohei
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1065,    8,  2 },   // Jiryaku
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1069,    4, 13 },   // Enkyu
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1074,    8, 23 },   // Shoho
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1077,   11, 17 },   // Shoryaku
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1081,    2, 10 },   // Eiho
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1084,    2,  7 },   // Otoku
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1087,    4,  7 },   // Kanji       70
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1094,   12, 15 },   // Kaho
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1096,   12, 17 },   // Eicho
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1097,   11, 21 },   // Shotoku
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1099,    8, 28 },   // Kowa
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1104,    2, 10 },   // Choji
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1106,    4,  9 },   // Kasho
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1108,    8,  3 },   // Tennin
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1110,    7, 13 },   // Ten-ei
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1113,    7, 13 },   // Eikyu
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1118,    4,  3 },   // Gen-ei      80
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1120,    4, 10 },   // Hoan
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1124,    4,  3 },   // Tenji
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1126,    1, 22 },   // Daiji
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1131,    1, 29 },   // Tensho
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1132,    8, 11 },   // Chosho
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1135,    4, 27 },   // Hoen
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1141,    7, 10 },   // Eiji
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1142,    4, 28 },   // Koji
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1144,    2, 23 },   // Tenyo
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1145,    7, 22 },   // Kyuan      90
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1151,    1, 26 },   // Ninpei
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1154,   10, 28 },   // Kyuju
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1156,    4, 27 },   // Hogen
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1159,    4, 20 },   // Heiji
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1160,    1, 10 },   // Eiryaku
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1161,    9,  4 },   // Oho
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1163,    3, 29 },   // Chokan
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1165,    6,  5 },   // Eiman
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1166,    8, 27 },   // Nin-an
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1169,    4,  8 },   // Kao       100
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1171,    4, 21 },   // Shoan
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1175,    7, 28 },   // Angen
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1177,    8,  4 },   // Jisho
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1181,    7, 14 },   // Yowa
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1182,    5, 27 },   // Juei
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1184,    4, 16 },   // Genryuku
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1185,    8, 14 },   // Bunji
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1190,    4, 11 },   // Kenkyu
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1199,    4, 27 },   // Shoji
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1201,    2, 13 },   // Kennin     110
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1204,    2, 20 },   // Genkyu
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1206,    4, 27 },   // Ken-ei
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1207,   10, 25 },   // Shogen
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1211,    3,  9 },   // Kenryaku
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1213,   12,  6 },   // Kenpo
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1219,    4, 12 },   // Shokyu
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1222,    4, 13 },   // Joo
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1224,   11, 20 },   // Gennin
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1225,    4, 20 },   // Karoku
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1227,   12, 10 },   // Antei      120
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1229,    3,  5 },   // Kanki
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1232,    4,  2 },   // Joei
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1233,    4, 15 },   // Tempuku
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1234,   11,  5 },   // Bunryaku
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1235,    9, 19 },   // Katei
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1238,   11, 23 },   // Ryakunin
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1239,    2,  7 },   // En-o
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1240,    7, 16 },   // Ninji
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1243,    2, 26 },   // Kangen
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1247,    2, 28 },   // Hoji      130
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1249,    3, 18 },   // Kencho
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1256,   10,  5 },   // Kogen
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1257,    3, 14 },   // Shoka
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1259,    3, 26 },   // Shogen
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1260,    4, 13 },   // Bun-o
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1261,    2, 20 },   // Kocho
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1264,    2, 28 },   // Bun-ei
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1275,    4, 25 },   // Kenji
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1278,    2, 29 },   // Koan
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1288,    4, 28 },   // Shoo      140
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1293,    8, 55 },   // Einin
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1299,    4, 25 },   // Shoan
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1302,   11, 21 },   // Kengen
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1303,    8,  5 },   // Kagen
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1306,   12, 14 },   // Tokuji
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1308,   10,  9 },   // Enkei
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1311,    4, 28 },   // Ocho
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1312,    3, 20 },   // Showa
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1317,    2,  3 },   // Bunpo
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1319,    4, 28 },   // Geno      150
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1321,    2, 23 },   // Genkyo
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1324,   12,  9 },   // Shochu
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1326,    4, 26 },   // Kareki
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1329,    8, 29 },   // Gentoku
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1331,    8,  9 },   // Genko
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1334,    1, 29 },   // Kemmu
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1336,    2, 29 },   // Engen
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1340,    4, 28 },   // Kokoku
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1346,   12,  8 },   // Shohei
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1370,    7, 24 },   // Kentoku       160
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1372,    4,  1 },   // Bunch\u0169
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1375,    5, 27 },   // Tenju
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1379,    3, 22 },   // Koryaku
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1381,    2, 10 },   // Kowa
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1384,    4, 28 },   // Gench\u0169
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1384,    2, 27 },   // Meitoku
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1387,    8, 23 },   // Kakei
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1389,    2,  9 },   // Koo
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1390,    3, 26 },   // Meitoku
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1394,    7,  5 },   // Oei           170
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1428,    4, 27 },   // Shocho
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1429,    9,  5 },   // Eikyo
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1441,    2, 17 },   // Kakitsu
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1444,    2,  5 },   // Bun-an
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1449,    7, 28 },   // Hotoku
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1452,    7, 25 },   // Kyotoku
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1455,    7, 25 },   // Kosho
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1457,    9, 28 },   // Choroku
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1460,   12, 21 },   // Kansho
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1466,    2, 28 },   // Bunsho        180
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1467,    3,  3 },   // Onin
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1469,    4, 28 },   // Bunmei
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1487,    7, 29 },   // Chokyo
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1489,    8, 21 },   // Entoku
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1492,    7, 19 },   // Meio
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1501,    2, 29 },   // Bunki
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1504,    2, 30 },   // Eisho
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1521,    8, 23 },   // Taiei
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1528,    8, 20 },   // Kyoroku
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1532,    7, 29 },   // Tenmon       190
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1555,   10, 23 },   // Koji
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1558,    2, 28 },   // Eiroku
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1570,    4, 23 },   // Genki
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1573,    7, 28 },   // Tensho
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1592,   12,  8 },   // Bunroku
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1596,   10, 27 },   // Keicho
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1615,    7, 13 },   // Genwa
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1624,    2, 30 },   // Kan-ei
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1644,   12, 16 },   // Shoho
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1648,    2, 15 },   // Keian       200
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1652,    9, 18 },   // Shoo
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1655,    4, 13 },   // Meiryaku
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1658,    7, 23 },   // Manji
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1661,    4, 25 },   // Kanbun
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1673,    9, 21 },   // Enpo
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1681,    9, 29 },   // Tenwa
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1684,    2, 21 },   // Jokyo
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1688,    9, 30 },   // Genroku
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1704,    3, 13 },   // Hoei
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1711,    4, 25 },   // Shotoku      210
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1716,    6, 22 },   // Kyoho
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1736,    4, 28 },   // Genbun
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1741,    2, 27 },   // Kanpo
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1744,    2, 21 },   // Enkyo
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1748,    7, 12 },   // Kan-en
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1751,   10, 27 },   // Horyaku
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1764,    6,  2 },   // Meiwa
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1772,   11, 16 },   // An-ei
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1781,    4,  2 },   // Tenmei
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1789,    1, 25 },   // Kansei      220
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1801,    2,  5 },   // Kyowa
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1804,    2, 11 },   // Bunka
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1818,    4, 22 },   // Bunsei
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1830,   12, 10 },   // Tenpo
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1844,   12,  2 },   // Koka
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1848,    2, 28 },   // Kaei
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1854,   11, 27 },   // Ansei
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1860,    3, 18 },   // Man-en
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1861,    2, 19 },   // Bunkyu
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1864,    2, 20 },   // Genji        230
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1865,    4,  7 },   // Keio     231
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1868,    9,  8 },   // Meiji    232
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1912,    7, 30 },   // Taisho   233
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1926,   12, 25 },   // Showa    234
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {  1989,    1,  8 }   // Heisei    235
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kEraCount (sizeof(kEraInfo)/sizeof(kEraInfo[0]))
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The current era, for reference.
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t kCurrentEra = (kEraCount-1);  // int32_t to match the calendar field type
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t kGregorianEpoch = 1970;    // used as the default value of EXTENDED_YEAR
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Some platforms don't like to export constants, like old Palm OS and some z/OS configurations. */
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguint32_t JapaneseCalendar::getCurrentEra() {
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return kCurrentEra;
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgJapaneseCalendar::JapaneseCalendar(const Locale& aLocale, UErrorCode& success)
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org:   GregorianCalendar(aLocale, success)
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly.
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgJapaneseCalendar::~JapaneseCalendar()
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgJapaneseCalendar::JapaneseCalendar(const JapaneseCalendar& source)
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org: GregorianCalendar(source)
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgJapaneseCalendar& JapaneseCalendar::operator= ( const JapaneseCalendar& right)
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar::operator=(right);
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return *this;
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendar* JapaneseCalendar::clone(void) const
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return new JapaneseCalendar(*this);
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char *JapaneseCalendar::getType() const
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return "japanese";
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear)
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t era = internalGetEra();
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // TODO do we assume we can trust 'era'?  What if it is denormalized?
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t month = 0;
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Find out if we are at the edge of an era
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(eyear == kEraInfo[era].year) {
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Yes, we're in the first year of this era.
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return kEraInfo[era].month-1;
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return month;
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t JapaneseCalendar::getDefaultDayInMonth(int32_t eyear, int32_t month)
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t era = internalGetEra();
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t day = 1;
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(eyear == kEraInfo[era].year) {
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(month == (kEraInfo[era].month-1)) {
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return kEraInfo[era].day;
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return day;
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t JapaneseCalendar::internalGetEra() const
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return internalGet(UCAL_ERA, kCurrentEra);
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t JapaneseCalendar::handleGetExtendedYear()
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // EXTENDED_YEAR in JapaneseCalendar is a Gregorian year
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // The default value of EXTENDED_YEAR is 1970 (Showa 45)
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t year;
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR &&
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) {
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch);
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // Subtract one because year starts at 1
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            year = internalGet(UCAL_YEAR) + kEraInfo[internalGetEra()].year - 1;
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return year;
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid JapaneseCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status)
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //Calendar::timeToFields(theTime, quick, status);
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar::handleComputeFields(julianDay, status);
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t year = internalGet(UCAL_EXTENDED_YEAR); // Gregorian year
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t low = 0;
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Short circuit for recent years.  Most modern computations will
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // occur in the current era and won't require the binary search.
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Note that if the year is == the current era year, then we use
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // the binary search to handle the month/dom comparison.
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_DEBUG_JCAL
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr, "==  %d \n", year);
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (year > kEraInfo[kCurrentEra].year) {
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        low = kCurrentEra;
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_DEBUG_JCAL
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, " low=%d (special)\n", low);
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Binary search
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t high = kEraCount;
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_DEBUG_JCAL
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stderr, " high=%d\n", high);
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while (low < high - 1) {
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t i = (low + high) / 2;
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t diff = year - kEraInfo[i].year;
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_DEBUG_JCAL
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            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",
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                diff,low, high, i, kEraInfo[i].month-1, kEraInfo[i].day,  kEraInfo[i].year, internalGet(UCAL_MONTH), internalGet(UCAL_DATE),year);
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // If years are the same, then compare the months, and if those
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // are the same, compare days of month.  In the ERAS array
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // months are 1-based for easier maintenance.
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (diff == 0) {
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                diff = internalGet(UCAL_MONTH) - (kEraInfo[i].month - 1);
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_DEBUG_JCAL
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                fprintf(stderr, "diff now %d (M)  = %d - %d - 1\n", diff, internalGet(UCAL_MONTH), kEraInfo[i].month);
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (diff == 0) {
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    diff = internalGet(UCAL_DATE) - kEraInfo[i].day;
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_DEBUG_JCAL
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    fprintf(stderr, "diff now %d (D)\n", diff);
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (diff >= 0) {
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                low = i;
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                high = i;
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_DEBUG_JCAL
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fprintf(stderr, ". low=%d, high=%d, i=%d, diff=%d.. %d\n", low, high, i, diff, year);
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_DEBUG_JCAL
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr, "  low[era]=%d,.. %d\n", low, year);
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Now we've found the last era that starts before this date, so
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // adjust the year to count from the start of that era.  Note that
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // all dates before the first era will fall into the first era by
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // the algorithm.
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    internalSet(UCAL_ERA, low);
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    internalSet(UCAL_YEAR, year - kEraInfo[low].year + 1);
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_DEBUG_JCAL
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr, "  Set ERA=%d, year=%d\n", low, year-kEraInfo[low].year+1);
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgDisable pivoting
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool JapaneseCalendar::haveDefaultCentury() const
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return FALSE;
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUDate JapaneseCalendar::defaultCenturyStart() const
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 0;// WRONG
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t JapaneseCalendar::defaultCenturyStartYear() const
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 0;
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t JapaneseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch(field) {
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UCAL_ERA:
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) {
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return 0;
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return kCurrentEra;
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UCAL_YEAR:
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            switch (limitType) {
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            case UCAL_LIMIT_MINIMUM:
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            case UCAL_LIMIT_GREATEST_MINIMUM:
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return 1;
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            case UCAL_LIMIT_LEAST_MAXIMUM:
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return 1;
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            case  UCAL_LIMIT_COUNT: //added to avoid warning
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            case UCAL_LIMIT_MAXIMUM:
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return GregorianCalendar::handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM) - kEraInfo[kCurrentEra].year;
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            default:
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return 1;    // Error condition, invalid limitType
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    default:
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return GregorianCalendar::handleGetLimit(field,limitType);
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t JapaneseCalendar::getActualMaximum(UCalendarDateFields field, UErrorCode& status) const {
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (field == UCAL_YEAR) {
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t era = get(UCAL_ERA, status);
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return 0; // error case... any value
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (era == kCurrentEra) {
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // TODO: Investigate what value should be used here - revisit after 4.0.
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM);
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t nextEraYear = kEraInfo[era + 1].year;
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t nextEraMonth = kEraInfo[era + 1].month;
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t nextEraDate = kEraInfo[era + 1].day;
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t maxYear = nextEraYear - kEraInfo[era].year + 1; // 1-base
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (nextEraMonth == 1 && nextEraDate == 1) {
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                // Subtract 1, because the next era starts at Jan 1
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                maxYear--;
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return maxYear;
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return GregorianCalendar::getActualMaximum(field, status);
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
532