123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- // © 2016 and later: Unicode, Inc. and others.
- // License & terms of use: http://www.unicode.org/copyright.html
- /*
- *******************************************************************************
- * Copyright (C) 2003 - 2013, International Business Machines Corporation and
- * others. All Rights Reserved.
- *******************************************************************************
- */
- #include "unicode/utypes.h"
- #if !UCONFIG_NO_FORMATTING
- #include "umutex.h"
- #include "coptccal.h"
- #include "cecal.h"
- #include <float.h>
- U_NAMESPACE_BEGIN
- UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CopticCalendar)
- static const int32_t COPTIC_JD_EPOCH_OFFSET = 1824665;
- //-------------------------------------------------------------------------
- // Constructors...
- //-------------------------------------------------------------------------
- CopticCalendar::CopticCalendar(const Locale& aLocale, UErrorCode& success)
- : CECalendar(aLocale, success)
- {
- }
- CopticCalendar::CopticCalendar (const CopticCalendar& other)
- : CECalendar(other)
- {
- }
- CopticCalendar::~CopticCalendar()
- {
- }
- CopticCalendar*
- CopticCalendar::clone() const
- {
- return new CopticCalendar(*this);
- }
- const char*
- CopticCalendar::getType() const
- {
- return "coptic";
- }
- //-------------------------------------------------------------------------
- // Calendar framework
- //-------------------------------------------------------------------------
- int32_t
- CopticCalendar::handleGetExtendedYear()
- {
- int32_t eyear;
- if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) {
- eyear = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1
- } else {
- // The year defaults to the epoch start, the era to CE
- int32_t era = internalGet(UCAL_ERA, CE);
- if (era == BCE) {
- eyear = 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year
- } else {
- eyear = internalGet(UCAL_YEAR, 1); // Default to year 1
- }
- }
- return eyear;
- }
- void
- CopticCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/)
- {
- int32_t eyear, month, day, era, year;
- jdToCE(julianDay, getJDEpochOffset(), eyear, month, day);
- if (eyear <= 0) {
- era = BCE;
- year = 1 - eyear;
- } else {
- era = CE;
- year = eyear;
- }
- internalSet(UCAL_EXTENDED_YEAR, eyear);
- internalSet(UCAL_ERA, era);
- internalSet(UCAL_YEAR, year);
- internalSet(UCAL_MONTH, month);
- internalSet(UCAL_ORDINAL_MONTH, month);
- internalSet(UCAL_DATE, day);
- internalSet(UCAL_DAY_OF_YEAR, (30 * month) + day);
- }
- constexpr uint32_t kCopticRelatedYearDiff = 284;
- int32_t CopticCalendar::getRelatedYear(UErrorCode &status) const
- {
- int32_t year = get(UCAL_EXTENDED_YEAR, status);
- if (U_FAILURE(status)) {
- return 0;
- }
- return year + kCopticRelatedYearDiff;
- }
- void CopticCalendar::setRelatedYear(int32_t year)
- {
- // set extended year
- set(UCAL_EXTENDED_YEAR, year - kCopticRelatedYearDiff);
- }
- /**
- * The system maintains a static default century start date and Year. They are
- * initialized the first time they are used. Once the system default century date
- * and year are set, they do not change.
- */
- static UDate gSystemDefaultCenturyStart = DBL_MIN;
- static int32_t gSystemDefaultCenturyStartYear = -1;
- static icu::UInitOnce gSystemDefaultCenturyInit {};
- static void U_CALLCONV initializeSystemDefaultCentury() {
- UErrorCode status = U_ZERO_ERROR;
- CopticCalendar calendar(Locale("@calendar=coptic"), status);
- if (U_SUCCESS(status)) {
- calendar.setTime(Calendar::getNow(), status);
- calendar.add(UCAL_YEAR, -80, status);
- gSystemDefaultCenturyStart = calendar.getTime(status);
- gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status);
- }
- // We have no recourse upon failure unless we want to propagate the failure
- // out.
- }
- UDate
- CopticCalendar::defaultCenturyStart() const
- {
- // lazy-evaluate systemDefaultCenturyStart
- umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury);
- return gSystemDefaultCenturyStart;
- }
- int32_t
- CopticCalendar::defaultCenturyStartYear() const
- {
- // lazy-evaluate systemDefaultCenturyStart
- umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury);
- return gSystemDefaultCenturyStartYear;
- }
- int32_t
- CopticCalendar::getJDEpochOffset() const
- {
- return COPTIC_JD_EPOCH_OFFSET;
- }
- #if 0
- // We do not want to introduce this API in ICU4C.
- // It was accidentally introduced in ICU4J as a public API.
- //-------------------------------------------------------------------------
- // Calendar system Conversion methods...
- //-------------------------------------------------------------------------
- int32_t
- CopticCalendar::copticToJD(int32_t year, int32_t month, int32_t day)
- {
- return CECalendar::ceToJD(year, month, day, COPTIC_JD_EPOCH_OFFSET);
- }
- #endif
- U_NAMESPACE_END
- #endif /* #if !UCONFIG_NO_FORMATTING */
- //eof
|