185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho******************************************************************************* 359d709d503bab6e2b61931737e662dd293b40578ccornelius* Copyright (C) 2003 - 2013, International Business Machines Corporation and 459d709d503bab6e2b61931737e662dd293b40578ccornelius* others. All Rights Reserved. 585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho******************************************************************************* 685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*/ 785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/utypes.h" 985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if !UCONFIG_NO_FORMATTING 1185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "umutex.h" 1385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "coptccal.h" 1485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "cecal.h" 1585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include <float.h> 1685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1785bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_NAMESPACE_BEGIN 1885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUOBJECT_DEFINE_RTTI_IMPLEMENTATION(CopticCalendar) 2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic const int32_t COPTIC_JD_EPOCH_OFFSET = 1824665; 2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//------------------------------------------------------------------------- 2485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Constructors... 2585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//------------------------------------------------------------------------- 2685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2785bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCopticCalendar::CopticCalendar(const Locale& aLocale, UErrorCode& success) 2885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho: CECalendar(aLocale, success) 2985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3285bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCopticCalendar::CopticCalendar (const CopticCalendar& other) 3385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho: CECalendar(other) 3485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 3585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 3685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCopticCalendar::~CopticCalendar() 3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 3985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 4085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 4185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCalendar* 4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCopticCalendar::clone() const 4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 4485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return new CopticCalendar(*this); 4585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 4685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 4785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoconst char* 4885bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCopticCalendar::getType() const 4985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 5085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return "coptic"; 5185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 5385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//------------------------------------------------------------------------- 5485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Calendar framework 5585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//------------------------------------------------------------------------- 5685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint32_t 5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCopticCalendar::handleGetExtendedYear() 5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 6085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t eyear; 6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { 6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho eyear = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // The year defaults to the epoch start, the era to CE 6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t era = internalGet(UCAL_ERA, CE); 6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (era == BCE) { 6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho eyear = 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year 6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho eyear = internalGet(UCAL_YEAR, 1); // Default to year 1 7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return eyear; 7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid 7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCopticCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/) 7785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t eyear, month, day, era, year; 7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho jdToCE(julianDay, getJDEpochOffset(), eyear, month, day); 8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (eyear <= 0) { 8285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho era = BCE; 8385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho year = 1 - eyear; 8485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 8585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho era = CE; 8685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho year = eyear; 8785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 8885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 8985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho internalSet(UCAL_EXTENDED_YEAR, eyear); 9085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho internalSet(UCAL_ERA, era); 9185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho internalSet(UCAL_YEAR, year); 9285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho internalSet(UCAL_MONTH, month); 9385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho internalSet(UCAL_DATE, day); 9485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho internalSet(UCAL_DAY_OF_YEAR, (30 * month) + day); 9585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 9685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 9759d709d503bab6e2b61931737e662dd293b40578ccornelius/** 9859d709d503bab6e2b61931737e662dd293b40578ccornelius * The system maintains a static default century start date and Year. They are 9959d709d503bab6e2b61931737e662dd293b40578ccornelius * initialized the first time they are used. Once the system default century date 10059d709d503bab6e2b61931737e662dd293b40578ccornelius * and year are set, they do not change. 10159d709d503bab6e2b61931737e662dd293b40578ccornelius */ 10259d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic UDate gSystemDefaultCenturyStart = DBL_MIN; 10359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic int32_t gSystemDefaultCenturyStartYear = -1; 10459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic icu::UInitOnce gSystemDefaultCenturyInit = U_INITONCE_INITIALIZER; 10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 10659d709d503bab6e2b61931737e662dd293b40578ccornelius 10759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void U_CALLCONV initializeSystemDefaultCentury() { 10859d709d503bab6e2b61931737e662dd293b40578ccornelius UErrorCode status = U_ZERO_ERROR; 10959d709d503bab6e2b61931737e662dd293b40578ccornelius CopticCalendar calendar(Locale("@calendar=coptic"), status); 11059d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_SUCCESS(status)) { 11159d709d503bab6e2b61931737e662dd293b40578ccornelius calendar.setTime(Calendar::getNow(), status); 11259d709d503bab6e2b61931737e662dd293b40578ccornelius calendar.add(UCAL_YEAR, -80, status); 11359d709d503bab6e2b61931737e662dd293b40578ccornelius gSystemDefaultCenturyStart = calendar.getTime(status); 11459d709d503bab6e2b61931737e662dd293b40578ccornelius gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); 11559d709d503bab6e2b61931737e662dd293b40578ccornelius } 11659d709d503bab6e2b61931737e662dd293b40578ccornelius // We have no recourse upon failure unless we want to propagate the failure 11759d709d503bab6e2b61931737e662dd293b40578ccornelius // out. 11859d709d503bab6e2b61931737e662dd293b40578ccornelius} 11985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 12085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoUDate 12185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCopticCalendar::defaultCenturyStart() const 12285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 12359d709d503bab6e2b61931737e662dd293b40578ccornelius // lazy-evaluate systemDefaultCenturyStart 12459d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); 12559d709d503bab6e2b61931737e662dd293b40578ccornelius return gSystemDefaultCenturyStart; 12685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 12785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 12885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint32_t 12985bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCopticCalendar::defaultCenturyStartYear() const 13085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 13185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // lazy-evaluate systemDefaultCenturyStart 13259d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); 13359d709d503bab6e2b61931737e662dd293b40578ccornelius return gSystemDefaultCenturyStartYear; 13485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 13585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 13659d709d503bab6e2b61931737e662dd293b40578ccornelius 13785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint32_t 13885bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCopticCalendar::getJDEpochOffset() const 13985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 14085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return COPTIC_JD_EPOCH_OFFSET; 14185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 14285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 14385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 14485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if 0 14585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// We do not want to introduce this API in ICU4C. 14685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// It was accidentally introduced in ICU4J as a public API. 14785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 14885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//------------------------------------------------------------------------- 14985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// Calendar system Conversion methods... 15085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//------------------------------------------------------------------------- 15185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 15285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint32_t 15385bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoCopticCalendar::copticToJD(int32_t year, int32_t month, int32_t day) 15485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 15585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return CECalendar::ceToJD(year, month, day, COPTIC_JD_EPOCH_OFFSET); 15685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 15785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif 15885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 15985bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_NAMESPACE_END 16085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 16185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif /* #if !UCONFIG_NO_FORMATTING */ 16285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//eof 163