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