diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /intl/icu/source/i18n/ethpccal.cpp | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'intl/icu/source/i18n/ethpccal.cpp')
-rw-r--r-- | intl/icu/source/i18n/ethpccal.cpp | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/intl/icu/source/i18n/ethpccal.cpp b/intl/icu/source/i18n/ethpccal.cpp new file mode 100644 index 000000000..10735ad6e --- /dev/null +++ b/intl/icu/source/i18n/ethpccal.cpp @@ -0,0 +1,207 @@ +// Copyright (C) 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 "ethpccal.h" +#include "cecal.h" +#include <float.h> + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(EthiopicCalendar) + +//static const int32_t JD_EPOCH_OFFSET_AMETE_ALEM = -285019; +static const int32_t JD_EPOCH_OFFSET_AMETE_MIHRET = 1723856; +static const int32_t AMETE_MIHRET_DELTA = 5500; // 5501 - 1 (Amete Alem 5501 = Amete Mihret 1) + +//------------------------------------------------------------------------- +// Constructors... +//------------------------------------------------------------------------- + +EthiopicCalendar::EthiopicCalendar(const Locale& aLocale, + UErrorCode& success, + EEraType type /*= AMETE_MIHRET_ERA*/) +: CECalendar(aLocale, success), + eraType(type) +{ +} + +EthiopicCalendar::EthiopicCalendar(const EthiopicCalendar& other) +: CECalendar(other), + eraType(other.eraType) +{ +} + +EthiopicCalendar::~EthiopicCalendar() +{ +} + +Calendar* +EthiopicCalendar::clone() const +{ + return new EthiopicCalendar(*this); +} + +const char * +EthiopicCalendar::getType() const +{ + if (isAmeteAlemEra()) { + return "ethiopic-amete-alem"; + } + return "ethiopic"; +} + +void +EthiopicCalendar::setAmeteAlemEra(UBool onOff) +{ + eraType = onOff ? AMETE_ALEM_ERA : AMETE_MIHRET_ERA; +} + +UBool +EthiopicCalendar::isAmeteAlemEra() const +{ + return (eraType == AMETE_ALEM_ERA); +} + +//------------------------------------------------------------------------- +// Calendar framework +//------------------------------------------------------------------------- + +int32_t +EthiopicCalendar::handleGetExtendedYear() +{ + // Ethiopic calendar uses EXTENDED_YEAR aligned to + // Amelete Hihret year always. + int32_t eyear; + if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { + eyear = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 + } else if (isAmeteAlemEra()) { + eyear = internalGet(UCAL_YEAR, 1 + AMETE_MIHRET_DELTA) + - AMETE_MIHRET_DELTA; // Default to year 1 of Amelete Mihret + } else { + // The year defaults to the epoch start, the era to AMETE_MIHRET + int32_t era = internalGet(UCAL_ERA, AMETE_MIHRET); + if (era == AMETE_MIHRET) { + eyear = internalGet(UCAL_YEAR, 1); // Default to year 1 + } else { + eyear = internalGet(UCAL_YEAR, 1) - AMETE_MIHRET_DELTA; + } + } + return eyear; +} + +void +EthiopicCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/) +{ + int32_t eyear, month, day, era, year; + jdToCE(julianDay, getJDEpochOffset(), eyear, month, day); + + if (isAmeteAlemEra()) { + era = AMETE_ALEM; + year = eyear + AMETE_MIHRET_DELTA; + } else { + if (eyear > 0) { + era = AMETE_MIHRET; + year = eyear; + } else { + era = AMETE_ALEM; + year = eyear + AMETE_MIHRET_DELTA; + } + } + + internalSet(UCAL_EXTENDED_YEAR, eyear); + internalSet(UCAL_ERA, era); + internalSet(UCAL_YEAR, year); + internalSet(UCAL_MONTH, month); + internalSet(UCAL_DATE, day); + internalSet(UCAL_DAY_OF_YEAR, (30 * month) + day); +} + +int32_t +EthiopicCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const +{ + if (isAmeteAlemEra() && field == UCAL_ERA) { + return 0; // Only one era in this mode, era is always 0 + } + return CECalendar::handleGetLimit(field, limitType); +} + +/** + * 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 = U_INITONCE_INITIALIZER; + +static void U_CALLCONV initializeSystemDefaultCentury() +{ + UErrorCode status = U_ZERO_ERROR; + EthiopicCalendar calendar(Locale("@calendar=ethiopic"), 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 +EthiopicCalendar::defaultCenturyStart() const +{ + // lazy-evaluate systemDefaultCenturyStart + umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); + return gSystemDefaultCenturyStart; +} + +int32_t +EthiopicCalendar::defaultCenturyStartYear() const +{ + // lazy-evaluate systemDefaultCenturyStartYear + umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); + if (isAmeteAlemEra()) { + return gSystemDefaultCenturyStartYear + AMETE_MIHRET_DELTA; + } + return gSystemDefaultCenturyStartYear; +} + + +int32_t +EthiopicCalendar::getJDEpochOffset() const +{ + return JD_EPOCH_OFFSET_AMETE_MIHRET; +} + + +#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 +EthiopicCalendar::ethiopicToJD(int32_t year, int32_t month, int32_t date) +{ + return ceToJD(year, month, date, JD_EPOCH_OFFSET_AMETE_MIHRET); +} +#endif + +U_NAMESPACE_END + +#endif |