1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************* 359d709d503bab6e2b61931737e662dd293b40578ccornelius* Copyright (C) 2003-2013, International Business Machines Corporation and * 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* others. All Rights Reserved. * 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************* 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* File BUDDHCAL.CPP 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History: 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 05/13/2003 srl copied from gregocal.cpp 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "buddhcal.h" 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/gregocal.h" 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "umutex.h" 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <float.h> 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(BuddhistCalendar) 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 2754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius//static const int32_t kMaxEra = 0; // only 1 era 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const int32_t kBuddhistEraStart = -543; // 544 BC (Gregorian) 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const int32_t kGregorianEpoch = 1970; // used as the default value of EXTENDED_YEAR 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruBuddhistCalendar::BuddhistCalendar(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 QueruBuddhistCalendar::~BuddhistCalendar() 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruBuddhistCalendar::BuddhistCalendar(const BuddhistCalendar& source) 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru: GregorianCalendar(source) 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruBuddhistCalendar& BuddhistCalendar::operator= ( const BuddhistCalendar& right) 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GregorianCalendar::operator=(right); 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return *this; 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruCalendar* BuddhistCalendar::clone(void) const 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return new BuddhistCalendar(*this); 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char *BuddhistCalendar::getType() const 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return "buddhist"; 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t BuddhistCalendar::handleGetExtendedYear() 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // EXTENDED_YEAR in BuddhistCalendar is a Gregorian year. 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // The default value of EXTENDED_YEAR is 1970 (Buddhist 2513) 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t year; 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // extended year is a gregorian year, where 1 = 1AD, 0 = 1BC, -1 = 2BC, etc 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year = internalGet(UCAL_YEAR, kGregorianEpoch - kBuddhistEraStart) 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru + kBuddhistEraStart; 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return year; 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t BuddhistCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool useMonth) const 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return GregorianCalendar::handleComputeMonthStart(eyear, month, useMonth); 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid BuddhistCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GregorianCalendar::handleComputeFields(julianDay, status); 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t y = internalGet(UCAL_EXTENDED_YEAR) - kBuddhistEraStart; 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_ERA, 0); 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_YEAR, y); 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t BuddhistCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(field == UCAL_ERA) { 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return BE; 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return GregorianCalendar::handleGetLimit(field,limitType); 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid BuddhistCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& status) 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //Calendar::timeToFields(theTime, quick, status); 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t era = internalGet(UCAL_ERA); 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t year = internalGet(UCAL_YEAR); 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(era == GregorianCalendar::BC) { 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year = 1-year; 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru era = BuddhistCalendar::BE; 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else if(era == GregorianCalendar::AD) { 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru era = BuddhistCalendar::BE; 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru status = U_INTERNAL_PROGRAM_ERROR; 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year = year - kBuddhistEraStart; 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_ERA, era); 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_YEAR, year); 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 12759d709d503bab6e2b61931737e662dd293b40578ccornelius/** 12859d709d503bab6e2b61931737e662dd293b40578ccornelius * The system maintains a static default century start date. This is initialized 12959d709d503bab6e2b61931737e662dd293b40578ccornelius * the first time it is used. Once the system default century date and year 13059d709d503bab6e2b61931737e662dd293b40578ccornelius * are set, they do not change. 13159d709d503bab6e2b61931737e662dd293b40578ccornelius */ 13259d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic UDate gSystemDefaultCenturyStart = DBL_MIN; 13359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic int32_t gSystemDefaultCenturyStartYear = -1; 13459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic icu::UInitOnce gBCInitOnce; 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool BuddhistCalendar::haveDefaultCentury() const 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return TRUE; 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 14259d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void U_CALLCONV 14359d709d503bab6e2b61931737e662dd293b40578ccorneliusinitializeSystemDefaultCentury() 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // initialize systemDefaultCentury and systemDefaultCenturyYear based 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // on the current time. They'll be set to 80 years before 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // the current time. 14885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 14985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho BuddhistCalendar calendar(Locale("@calendar=buddhist"),status); 15059d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_SUCCESS(status)) { 15185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho calendar.setTime(Calendar::getNow(), status); 15285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho calendar.add(UCAL_YEAR, -80, status); 15385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UDate newStart = calendar.getTime(status); 15485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t newYear = calendar.get(UCAL_YEAR, status); 15559d709d503bab6e2b61931737e662dd293b40578ccornelius gSystemDefaultCenturyStartYear = newYear; 15659d709d503bab6e2b61931737e662dd293b40578ccornelius gSystemDefaultCenturyStart = newStart; 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 15885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // We have no recourse upon failure unless we want to propagate the failure 15985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // out. 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 16259d709d503bab6e2b61931737e662dd293b40578ccorneliusUDate BuddhistCalendar::defaultCenturyStart() const 16359d709d503bab6e2b61931737e662dd293b40578ccornelius{ 16459d709d503bab6e2b61931737e662dd293b40578ccornelius // lazy-evaluate systemDefaultCenturyStart and systemDefaultCenturyStartYear 16559d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(gBCInitOnce, &initializeSystemDefaultCentury); 16659d709d503bab6e2b61931737e662dd293b40578ccornelius return gSystemDefaultCenturyStart; 16759d709d503bab6e2b61931737e662dd293b40578ccornelius} 16859d709d503bab6e2b61931737e662dd293b40578ccornelius 16959d709d503bab6e2b61931737e662dd293b40578ccorneliusint32_t BuddhistCalendar::defaultCenturyStartYear() const 17059d709d503bab6e2b61931737e662dd293b40578ccornelius{ 17159d709d503bab6e2b61931737e662dd293b40578ccornelius // lazy-evaluate systemDefaultCenturyStartYear and systemDefaultCenturyStart 17259d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(gBCInitOnce, &initializeSystemDefaultCentury); 17359d709d503bab6e2b61931737e662dd293b40578ccornelius return gSystemDefaultCenturyStartYear; 17459d709d503bab6e2b61931737e662dd293b40578ccornelius} 17559d709d503bab6e2b61931737e662dd293b40578ccornelius 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 180