1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 *******************************************************************************
5 * Copyright (C) 2003 - 2013, International Business Machines Corporation and
6 * others. All Rights Reserved.
7 *******************************************************************************
8 */
9
10 #include "unicode/utypes.h"
11
12 #if !UCONFIG_NO_FORMATTING
13
14 #include "gregoimp.h"
15 #include "umutex.h"
16 #include "coptccal.h"
17 #include "cecal.h"
18 #include <float.h>
19
20 U_NAMESPACE_BEGIN
21
22 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CopticCalendar)
23
24 static const int32_t COPTIC_JD_EPOCH_OFFSET = 1824665;
25
26 //-------------------------------------------------------------------------
27 // Constructors...
28 //-------------------------------------------------------------------------
29
CopticCalendar(const Locale & aLocale,UErrorCode & success)30 CopticCalendar::CopticCalendar(const Locale& aLocale, UErrorCode& success)
31 : CECalendar(aLocale, success)
32 {
33 }
34
CopticCalendar(const CopticCalendar & other)35 CopticCalendar::CopticCalendar (const CopticCalendar& other)
36 : CECalendar(other)
37 {
38 }
39
~CopticCalendar()40 CopticCalendar::~CopticCalendar()
41 {
42 }
43
44 CopticCalendar*
clone() const45 CopticCalendar::clone() const
46 {
47 return new CopticCalendar(*this);
48 }
49
50 const char*
getType() const51 CopticCalendar::getType() const
52 {
53 return "coptic";
54 }
55
56 //-------------------------------------------------------------------------
57 // Calendar framework
58 //-------------------------------------------------------------------------
59
60 int32_t
handleGetExtendedYear(UErrorCode & status)61 CopticCalendar::handleGetExtendedYear(UErrorCode& status)
62 {
63 if (U_FAILURE(status)) {
64 return 0;
65 }
66 if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) {
67 return internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1
68 }
69 // The year defaults to the epoch start, the era to CE
70 int32_t era = internalGet(UCAL_ERA, CE);
71 if (era == BCE) {
72 return 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year
73 }
74 if (era == CE){
75 return internalGet(UCAL_YEAR, 1); // Default to year 1
76 }
77 status = U_ILLEGAL_ARGUMENT_ERROR;
78 return 0;
79 }
80
81 void
handleComputeFields(int32_t julianDay,UErrorCode & status)82 CopticCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status)
83 {
84 int32_t eyear, month, day, era, year;
85 jdToCE(julianDay, getJDEpochOffset(), eyear, month, day, status);
86 if (U_FAILURE(status)) return;
87
88 if (eyear <= 0) {
89 era = BCE;
90 year = 1 - eyear;
91 } else {
92 era = CE;
93 year = eyear;
94 }
95
96 internalSet(UCAL_EXTENDED_YEAR, eyear);
97 internalSet(UCAL_ERA, era);
98 internalSet(UCAL_YEAR, year);
99 internalSet(UCAL_MONTH, month);
100 internalSet(UCAL_ORDINAL_MONTH, month);
101 internalSet(UCAL_DATE, day);
102 internalSet(UCAL_DAY_OF_YEAR, (30 * month) + day);
103 }
104
105 constexpr uint32_t kCopticRelatedYearDiff = 284;
106
getRelatedYear(UErrorCode & status) const107 int32_t CopticCalendar::getRelatedYear(UErrorCode &status) const
108 {
109 int32_t year = get(UCAL_EXTENDED_YEAR, status);
110 if (U_FAILURE(status)) {
111 return 0;
112 }
113 return year + kCopticRelatedYearDiff;
114 }
115
setRelatedYear(int32_t year)116 void CopticCalendar::setRelatedYear(int32_t year)
117 {
118 // set extended year
119 set(UCAL_EXTENDED_YEAR, year - kCopticRelatedYearDiff);
120 }
121
122 IMPL_SYSTEM_DEFAULT_CENTURY(CopticCalendar, "@calendar=coptic")
123
124 int32_t
getJDEpochOffset() const125 CopticCalendar::getJDEpochOffset() const
126 {
127 return COPTIC_JD_EPOCH_OFFSET;
128 }
129
130
131 U_NAMESPACE_END
132
133 #endif /* #if !UCONFIG_NO_FORMATTING */
134 //eof
135