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