tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

taiwncal.cpp (3305B)


      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 * File TAIWNCAL.CPP
     10 *
     11 * Modification History:
     12 *  05/13/2003    srl     copied from gregocal.cpp
     13 *  06/29/2007    srl     copied from buddhcal.cpp
     14 *  05/12/2008    jce     modified to use calendar=roc per CLDR
     15 *
     16 */
     17 
     18 #include "unicode/utypes.h"
     19 
     20 #if !UCONFIG_NO_FORMATTING
     21 
     22 #include "taiwncal.h"
     23 #include "gregoimp.h"
     24 #include "unicode/gregocal.h"
     25 #include "umutex.h"
     26 #include <float.h>
     27 
     28 U_NAMESPACE_BEGIN
     29 
     30 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TaiwanCalendar)
     31 
     32 static const int32_t kTaiwanEraStart = 1911;  // 1911 (Gregorian)
     33 
     34 static const int32_t kGregorianEpoch = 1970;
     35 
     36 TaiwanCalendar::TaiwanCalendar(const Locale& aLocale, UErrorCode& success)
     37 :   GregorianCalendar(aLocale, success)
     38 {
     39 }
     40 
     41 TaiwanCalendar::~TaiwanCalendar()
     42 {
     43 }
     44 
     45 TaiwanCalendar::TaiwanCalendar(const TaiwanCalendar& source)
     46 : GregorianCalendar(source)
     47 {
     48 }
     49 
     50 TaiwanCalendar* TaiwanCalendar::clone() const
     51 {
     52    return new TaiwanCalendar(*this);
     53 }
     54 
     55 const char *TaiwanCalendar::getType() const
     56 {
     57    return "roc";
     58 }
     59 
     60 int32_t TaiwanCalendar::handleGetExtendedYear(UErrorCode& status)
     61 {
     62    if (U_FAILURE(status)) {
     63        return 0;
     64    }
     65 
     66    // EXTENDED_YEAR in TaiwanCalendar is a Gregorian year
     67    // The default value of EXTENDED_YEAR is 1970 (Minguo 59)
     68    if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR
     69        && newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) {
     70        return internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch);
     71    }
     72    int32_t era = internalGet(UCAL_ERA, MINGUO);
     73    int32_t year = internalGet(UCAL_YEAR, 1);
     74    switch (era) {
     75        case MINGUO:
     76            if (uprv_add32_overflow(year, kTaiwanEraStart, &year)) {
     77                status = U_ILLEGAL_ARGUMENT_ERROR;
     78                return 0;
     79            }
     80            return year;
     81        case BEFORE_MINGUO:
     82            if (uprv_add32_overflow(1 + kTaiwanEraStart, -year, &year)) {
     83                status = U_ILLEGAL_ARGUMENT_ERROR;
     84                return 0;
     85            }
     86            return year;
     87        default:
     88            status = U_ILLEGAL_ARGUMENT_ERROR;
     89            return 0;
     90    }
     91 }
     92 
     93 void TaiwanCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status)
     94 {
     95    GregorianCalendar::handleComputeFields(julianDay, status);
     96    int32_t y = internalGet(UCAL_EXTENDED_YEAR) - kTaiwanEraStart;
     97    if(y>0) {
     98        internalSet(UCAL_ERA, MINGUO);
     99        internalSet(UCAL_YEAR, y);
    100    } else {
    101        internalSet(UCAL_ERA, BEFORE_MINGUO);
    102        internalSet(UCAL_YEAR, 1-y);
    103    }
    104 }
    105 
    106 int32_t TaiwanCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const
    107 {
    108    if(field != UCAL_ERA) {
    109        return GregorianCalendar::handleGetLimit(field,limitType);
    110    }
    111    if (limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) {
    112        return BEFORE_MINGUO;
    113    }
    114    return MINGUO;
    115 }
    116 
    117 IMPL_SYSTEM_DEFAULT_CENTURY(TaiwanCalendar, "@calendar=roc")
    118 
    119 U_NAMESPACE_END
    120 
    121 #endif