16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2003 - 2013, International Business Machines Corporation and 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "umutex.h" 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "coptccal.h" 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cecal.h" 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <float.h> 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUOBJECT_DEFINE_RTTI_IMPLEMENTATION(CopticCalendar) 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t COPTIC_JD_EPOCH_OFFSET = 1824665; 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------- 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Constructors... 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------- 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCopticCalendar::CopticCalendar(const Locale& aLocale, UErrorCode& success) 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org: CECalendar(aLocale, success) 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCopticCalendar::CopticCalendar (const CopticCalendar& other) 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org: CECalendar(other) 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCopticCalendar::~CopticCalendar() 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendar* 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCopticCalendar::clone() const 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return new CopticCalendar(*this); 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char* 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCopticCalendar::getType() const 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return "coptic"; 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------- 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Calendar framework 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------- 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCopticCalendar::handleGetExtendedYear() 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t eyear; 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org eyear = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // The year defaults to the epoch start, the era to CE 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t era = internalGet(UCAL_ERA, CE); 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (era == BCE) { 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org eyear = 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org eyear = internalGet(UCAL_YEAR, 1); // Default to year 1 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return eyear; 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCopticCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/) 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t eyear, month, day, era, year; 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org jdToCE(julianDay, getJDEpochOffset(), eyear, month, day); 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (eyear <= 0) { 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org era = BCE; 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org year = 1 - eyear; 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org era = CE; 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org year = eyear; 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org internalSet(UCAL_EXTENDED_YEAR, eyear); 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org internalSet(UCAL_ERA, era); 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org internalSet(UCAL_YEAR, year); 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org internalSet(UCAL_MONTH, month); 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org internalSet(UCAL_DATE, day); 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org internalSet(UCAL_DAY_OF_YEAR, (30 * month) + day); 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The system maintains a static default century start date and Year. They are 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * initialized the first time they are used. Once the system default century date 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and year are set, they do not change. 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UDate gSystemDefaultCenturyStart = DBL_MIN; 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t gSystemDefaultCenturyStartYear = -1; 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::UInitOnce gSystemDefaultCenturyInit = U_INITONCE_INITIALIZER; 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV initializeSystemDefaultCentury() { 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CopticCalendar calendar(Locale("@calendar=coptic"), status); 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status)) { 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org calendar.setTime(Calendar::getNow(), status); 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org calendar.add(UCAL_YEAR, -80, status); 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gSystemDefaultCenturyStart = calendar.getTime(status); 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // We have no recourse upon failure unless we want to propagate the failure 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // out. 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUDate 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCopticCalendar::defaultCenturyStart() const 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // lazy-evaluate systemDefaultCenturyStart 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return gSystemDefaultCenturyStart; 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCopticCalendar::defaultCenturyStartYear() const 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // lazy-evaluate systemDefaultCenturyStart 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return gSystemDefaultCenturyStartYear; 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCopticCalendar::getJDEpochOffset() const 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return COPTIC_JD_EPOCH_OFFSET; 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 0 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// We do not want to introduce this API in ICU4C. 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// It was accidentally introduced in ICU4J as a public API. 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------- 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Calendar system Conversion methods... 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------- 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCopticCalendar::copticToJD(int32_t year, int32_t month, int32_t day) 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return CECalendar::ceToJD(year, month, day, COPTIC_JD_EPOCH_OFFSET); 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */ 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//eof 163