]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/buddhcal.cpp
ICU-8.11.4.tar.gz
[apple/icu.git] / icuSources / i18n / buddhcal.cpp
index bf4290d07965cfce91c52046442fb7b39bb3d52d..e7cc5d41feac3f9d4e955895c78735bc925a4360 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *******************************************************************************
-* Copyright (C) 2003, International Business Machines Corporation and    *
+* Copyright (C) 2003-2004, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
@@ -22,7 +22,7 @@
 
 U_NAMESPACE_BEGIN
 
-const char BuddhistCalendar::fgClassID = 0; // Value is irrelevant
+UOBJECT_DEFINE_RTTI_IMPLEMENTATION(BuddhistCalendar)
 
 static const int32_t kMaxEra = 0; // only 1 era
 
@@ -92,14 +92,13 @@ int32_t
 BuddhistCalendar::monthLength(int32_t month) const
 {
     UErrorCode status = U_ZERO_ERROR;
-    int32_t year = internalGet(UCAL_YEAR);
     // ignore era
     return GregorianCalendar::monthLength(month, getGregorianYear(status));
 }
 
 int32_t BuddhistCalendar::internalGetEra() const
 {
-    return isSet(UCAL_ERA) ? internalGet(UCAL_ERA) : BE;  
+  return internalGet(UCAL_ERA, BE);
 }
 
 int32_t
@@ -117,9 +116,47 @@ BuddhistCalendar::getGregorianYear(UErrorCode &status)  const
   return year + kBuddhistEraStart;
 }
 
+int32_t BuddhistCalendar::handleGetExtendedYear()
+{
+  int32_t year;
+  if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) {
+    year = internalGet(UCAL_EXTENDED_YEAR, 1);
+  } else {
+    // Ignore the era, as there is only one
+    year = internalGet(UCAL_YEAR, 1);
+  }
+  return year;
+}
+
+int32_t BuddhistCalendar::handleComputeMonthStart(int32_t eyear, int32_t month,
+
+                                                   UBool useMonth) const
+{
+  return GregorianCalendar::handleComputeMonthStart(eyear+kBuddhistEraStart, month, useMonth);
+}
+
+void BuddhistCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status)
+{
+  GregorianCalendar::handleComputeFields(julianDay, status);
+  int32_t y = internalGet(UCAL_EXTENDED_YEAR) - kBuddhistEraStart;
+  internalSet(UCAL_EXTENDED_YEAR, y);
+  internalSet(UCAL_ERA, 0);
+  internalSet(UCAL_YEAR, y);
+}
+
+int32_t BuddhistCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const
+{
+  if(field == UCAL_ERA) {
+    return BE;
+  } else {
+    return GregorianCalendar::handleGetLimit(field,limitType);
+  }
+}
+
+#if 0
 void BuddhistCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& status)
 {
-  GregorianCalendar::timeToFields(theTime, quick, status);
+  //Calendar::timeToFields(theTime, quick, status);
 
   int32_t era = internalGet(UCAL_ERA);
   int32_t year = internalGet(UCAL_YEAR);
@@ -138,6 +175,7 @@ void BuddhistCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& stat
   internalSet(UCAL_ERA, era);
   internalSet(UCAL_YEAR, year);
 }
+#endif
 
 void BuddhistCalendar::add(UCalendarDateFields field, int32_t amount, UErrorCode& status)
 {
@@ -148,8 +186,7 @@ void BuddhistCalendar::add(UCalendarDateFields field, int32_t amount, UErrorCode
         return;   // Do nothing!
     
     if(field == UCAL_YEAR /* || field == UCAL_YEAR_WOY */) {
-        int32_t year = internalGet(field);
-        int32_t era = internalGetEra();
+        int32_t year = get(field, status); // not internalGet -- force completion
 
         year += amount;
         
@@ -235,19 +272,18 @@ BuddhistCalendar::initializeSystemDefaultCentury()
   if (fgSystemDefaultCenturyStart == fgSystemDefaultCentury)
   {
     UErrorCode status = U_ZERO_ERROR;
-    Calendar *calendar = new BuddhistCalendar(Locale("th_TH_TRADITIONAL"),status);
-    if (calendar != NULL && U_SUCCESS(status))
+    BuddhistCalendar calendar(Locale("@calendar=buddhist"),status);
+    if (U_SUCCESS(status))
     {
-      calendar->setTime(Calendar::getNow(), status);
-      calendar->add(UCAL_YEAR, -80, status);
-      UDate    newStart =  calendar->getTime(status);
-      int32_t  newYear  =  calendar->get(UCAL_YEAR, status);
+      calendar.setTime(Calendar::getNow(), status);
+      calendar.add(UCAL_YEAR, -80, status);
+      UDate    newStart =  calendar.getTime(status);
+      int32_t  newYear  =  calendar.get(UCAL_YEAR, status);
       {
         Mutex m;
         fgSystemDefaultCenturyStart = newStart;
         fgSystemDefaultCenturyStartYear = newYear;
       }
-      delete calendar;
     }
     // We have no recourse upon failure unless we want to propagate the failure
     // out.