|
1 /* |
|
2 ******************************************************************************* |
|
3 * Copyright (C) 2003 - 2013, International Business Machines Corporation and |
|
4 * others. All Rights Reserved. |
|
5 ******************************************************************************* |
|
6 */ |
|
7 |
|
8 #include "unicode/utypes.h" |
|
9 |
|
10 #if !UCONFIG_NO_FORMATTING |
|
11 |
|
12 #include "umutex.h" |
|
13 #include "coptccal.h" |
|
14 #include "cecal.h" |
|
15 #include <float.h> |
|
16 |
|
17 U_NAMESPACE_BEGIN |
|
18 |
|
19 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(CopticCalendar) |
|
20 |
|
21 static const int32_t COPTIC_JD_EPOCH_OFFSET = 1824665; |
|
22 |
|
23 //------------------------------------------------------------------------- |
|
24 // Constructors... |
|
25 //------------------------------------------------------------------------- |
|
26 |
|
27 CopticCalendar::CopticCalendar(const Locale& aLocale, UErrorCode& success) |
|
28 : CECalendar(aLocale, success) |
|
29 { |
|
30 } |
|
31 |
|
32 CopticCalendar::CopticCalendar (const CopticCalendar& other) |
|
33 : CECalendar(other) |
|
34 { |
|
35 } |
|
36 |
|
37 CopticCalendar::~CopticCalendar() |
|
38 { |
|
39 } |
|
40 |
|
41 Calendar* |
|
42 CopticCalendar::clone() const |
|
43 { |
|
44 return new CopticCalendar(*this); |
|
45 } |
|
46 |
|
47 const char* |
|
48 CopticCalendar::getType() const |
|
49 { |
|
50 return "coptic"; |
|
51 } |
|
52 |
|
53 //------------------------------------------------------------------------- |
|
54 // Calendar framework |
|
55 //------------------------------------------------------------------------- |
|
56 |
|
57 int32_t |
|
58 CopticCalendar::handleGetExtendedYear() |
|
59 { |
|
60 int32_t eyear; |
|
61 if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { |
|
62 eyear = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 |
|
63 } else { |
|
64 // The year defaults to the epoch start, the era to CE |
|
65 int32_t era = internalGet(UCAL_ERA, CE); |
|
66 if (era == BCE) { |
|
67 eyear = 1 - internalGet(UCAL_YEAR, 1); // Convert to extended year |
|
68 } else { |
|
69 eyear = internalGet(UCAL_YEAR, 1); // Default to year 1 |
|
70 } |
|
71 } |
|
72 return eyear; |
|
73 } |
|
74 |
|
75 void |
|
76 CopticCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*status*/) |
|
77 { |
|
78 int32_t eyear, month, day, era, year; |
|
79 jdToCE(julianDay, getJDEpochOffset(), eyear, month, day); |
|
80 |
|
81 if (eyear <= 0) { |
|
82 era = BCE; |
|
83 year = 1 - eyear; |
|
84 } else { |
|
85 era = CE; |
|
86 year = eyear; |
|
87 } |
|
88 |
|
89 internalSet(UCAL_EXTENDED_YEAR, eyear); |
|
90 internalSet(UCAL_ERA, era); |
|
91 internalSet(UCAL_YEAR, year); |
|
92 internalSet(UCAL_MONTH, month); |
|
93 internalSet(UCAL_DATE, day); |
|
94 internalSet(UCAL_DAY_OF_YEAR, (30 * month) + day); |
|
95 } |
|
96 |
|
97 /** |
|
98 * The system maintains a static default century start date and Year. They are |
|
99 * initialized the first time they are used. Once the system default century date |
|
100 * and year are set, they do not change. |
|
101 */ |
|
102 static UDate gSystemDefaultCenturyStart = DBL_MIN; |
|
103 static int32_t gSystemDefaultCenturyStartYear = -1; |
|
104 static icu::UInitOnce gSystemDefaultCenturyInit = U_INITONCE_INITIALIZER; |
|
105 |
|
106 |
|
107 static void U_CALLCONV initializeSystemDefaultCentury() { |
|
108 UErrorCode status = U_ZERO_ERROR; |
|
109 CopticCalendar calendar(Locale("@calendar=coptic"), status); |
|
110 if (U_SUCCESS(status)) { |
|
111 calendar.setTime(Calendar::getNow(), status); |
|
112 calendar.add(UCAL_YEAR, -80, status); |
|
113 gSystemDefaultCenturyStart = calendar.getTime(status); |
|
114 gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); |
|
115 } |
|
116 // We have no recourse upon failure unless we want to propagate the failure |
|
117 // out. |
|
118 } |
|
119 |
|
120 UDate |
|
121 CopticCalendar::defaultCenturyStart() const |
|
122 { |
|
123 // lazy-evaluate systemDefaultCenturyStart |
|
124 umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); |
|
125 return gSystemDefaultCenturyStart; |
|
126 } |
|
127 |
|
128 int32_t |
|
129 CopticCalendar::defaultCenturyStartYear() const |
|
130 { |
|
131 // lazy-evaluate systemDefaultCenturyStart |
|
132 umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); |
|
133 return gSystemDefaultCenturyStartYear; |
|
134 } |
|
135 |
|
136 |
|
137 int32_t |
|
138 CopticCalendar::getJDEpochOffset() const |
|
139 { |
|
140 return COPTIC_JD_EPOCH_OFFSET; |
|
141 } |
|
142 |
|
143 |
|
144 #if 0 |
|
145 // We do not want to introduce this API in ICU4C. |
|
146 // It was accidentally introduced in ICU4J as a public API. |
|
147 |
|
148 //------------------------------------------------------------------------- |
|
149 // Calendar system Conversion methods... |
|
150 //------------------------------------------------------------------------- |
|
151 |
|
152 int32_t |
|
153 CopticCalendar::copticToJD(int32_t year, int32_t month, int32_t day) |
|
154 { |
|
155 return CECalendar::ceToJD(year, month, day, COPTIC_JD_EPOCH_OFFSET); |
|
156 } |
|
157 #endif |
|
158 |
|
159 U_NAMESPACE_END |
|
160 |
|
161 #endif /* #if !UCONFIG_NO_FORMATTING */ |
|
162 //eof |