X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/efa1e6592fb03ce23b15276b2b91d885a3ee7da5..57a6839dcb3bba09e8228b822b290604668416fe:/icuSources/i18n/hebrwcal.cpp diff --git a/icuSources/i18n/hebrwcal.cpp b/icuSources/i18n/hebrwcal.cpp index 12e850a5..c5dc4079 100644 --- a/icuSources/i18n/hebrwcal.cpp +++ b/icuSources/i18n/hebrwcal.cpp @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 2003-2011, International Business Machines Corporation +* Copyright (C) 2003-2013, International Business Machines Corporation * and others. All Rights Reserved. ****************************************************************************** * @@ -529,6 +529,13 @@ int32_t HebrewCalendar::handleGetYearLength(int32_t eyear) const { return startOfYear(eyear+1, status) - startOfYear(eyear, status); } +void HebrewCalendar::validateField(UCalendarDateFields field, UErrorCode &status) { + if (field == UCAL_MONTH && !isLeapYear(handleGetExtendedYear()) && internalGet(UCAL_MONTH) == ADAR_1) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + Calendar::validateField(field, status); +} //------------------------------------------------------------------------- // Functions for converting from milliseconds to field values //------------------------------------------------------------------------- @@ -668,88 +675,52 @@ HebrewCalendar::inDaylightTime(UErrorCode& status) const return (UBool)(U_SUCCESS(status) ? (internalGet(UCAL_DST_OFFSET) != 0) : FALSE); } -// default century -const UDate HebrewCalendar::fgSystemDefaultCentury = DBL_MIN; -const int32_t HebrewCalendar::fgSystemDefaultCenturyYear = -1; - -UDate HebrewCalendar::fgSystemDefaultCenturyStart = DBL_MIN; -int32_t HebrewCalendar::fgSystemDefaultCenturyStartYear = -1; - +/** + * 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; UBool HebrewCalendar::haveDefaultCentury() const { return TRUE; } -UDate HebrewCalendar::defaultCenturyStart() const -{ - return internalGetDefaultCenturyStart(); -} - -int32_t HebrewCalendar::defaultCenturyStartYear() const -{ - return internalGetDefaultCenturyStartYear(); -} - -UDate -HebrewCalendar::internalGetDefaultCenturyStart() const -{ - // lazy-evaluate systemDefaultCenturyStart - UBool needsUpdate; - UMTX_CHECK(NULL, (fgSystemDefaultCenturyStart == fgSystemDefaultCentury), needsUpdate); - - if (needsUpdate) { - initializeSystemDefaultCentury(); - } - - // use defaultCenturyStart unless it's the flag value; - // then use systemDefaultCenturyStart - - return fgSystemDefaultCenturyStart; -} - -int32_t -HebrewCalendar::internalGetDefaultCenturyStartYear() const -{ - // lazy-evaluate systemDefaultCenturyStartYear - UBool needsUpdate; - UMTX_CHECK(NULL, (fgSystemDefaultCenturyStart == fgSystemDefaultCentury), needsUpdate); - - if (needsUpdate) { - initializeSystemDefaultCentury(); - } - - // use defaultCenturyStart unless it's the flag value; - // then use systemDefaultCenturyStartYear - - return fgSystemDefaultCenturyStartYear; -} - -void -HebrewCalendar::initializeSystemDefaultCentury() +static void U_CALLCONV initializeSystemDefaultCentury() { // initialize systemDefaultCentury and systemDefaultCenturyYear based // on the current time. They'll be set to 80 years before // the current time. UErrorCode status = U_ZERO_ERROR; HebrewCalendar calendar(Locale("@calendar=hebrew"),status); - if (U_SUCCESS(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); - umtx_lock(NULL); - if (fgSystemDefaultCenturyStart == fgSystemDefaultCentury) { - fgSystemDefaultCenturyStartYear = newYear; - fgSystemDefaultCenturyStart = newStart; - } - umtx_unlock(NULL); + + 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 HebrewCalendar::defaultCenturyStart() const { + // lazy-evaluate systemDefaultCenturyStart + umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); + return gSystemDefaultCenturyStart; +} + +int32_t HebrewCalendar::defaultCenturyStartYear() const { + // lazy-evaluate systemDefaultCenturyStartYear + umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); + return gSystemDefaultCenturyStartYear; +} + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HebrewCalendar) U_NAMESPACE_END