/* +----------------------------------------------------------------------+ | Copyright © The PHP Group and Contributors. | +----------------------------------------------------------------------+ | This source file is subject to the Modified BSD License that is | | bundled with this package in the file LICENSE, and is available | | through the World Wide Web at . | | | | SPDX-License-Identifier: BSD-3-Clause | +----------------------------------------------------------------------+ | Authors: Gustavo Lopes | +----------------------------------------------------------------------+ */ #include "../intl_cppshims.h" #include #include #include "dateformat_helpers.h" extern "C" { #include "../php_intl.h" #include #define USE_CALENDAR_POINTER 1 #include "../calendar/calendar_class.h" } using icu::GregorianCalendar; zend_result datefmt_process_calendar_arg( zend_object *calendar_obj, zend_long calendar_long, bool calendar_is_null, Locale const& locale, intl_error *err, Calendar*& cal, zend_long& cal_int_type, bool& calendar_owned ) { UErrorCode status = UErrorCode(); if (calendar_is_null) { // default requested cal = new GregorianCalendar(locale, status); calendar_owned = true; cal_int_type = UCAL_GREGORIAN; } else if (!calendar_obj) { zend_long v = calendar_long; if (v != (zend_long)UCAL_TRADITIONAL && v != (zend_long)UCAL_GREGORIAN) { intl_errors_set(err, U_ILLEGAL_ARGUMENT_ERROR, "Invalid value for calendar type; it must be one of " "IntlDateFormatter::TRADITIONAL (locale's default calendar) or" " IntlDateFormatter::GREGORIAN. Alternatively, it can be an " "IntlCalendar object"); return FAILURE; } else if (v == (zend_long)UCAL_TRADITIONAL) { cal = Calendar::createInstance(locale, status); } else { //UCAL_GREGORIAN cal = new GregorianCalendar(locale, status); } calendar_owned = true; cal_int_type = calendar_long; } else if (calendar_obj) { cal = calendar_fetch_native_calendar(calendar_obj); if (cal == NULL) { intl_errors_set(err, U_ILLEGAL_ARGUMENT_ERROR, "Found unconstructed IntlCalendar object"); return FAILURE; } calendar_owned = false; cal_int_type = -1; } else { intl_errors_set(err, U_ILLEGAL_ARGUMENT_ERROR, "Invalid calendar argument; should be an integer or an IntlCalendar instance"); return FAILURE; } if (cal == NULL && !U_FAILURE(status)) { status = U_MEMORY_ALLOCATION_ERROR; } if (U_FAILURE(status)) { intl_errors_set(err, U_ILLEGAL_ARGUMENT_ERROR, "Failure instantiating calendar"); return FAILURE; } return SUCCESS; }