U_CFUNC PHP_FUNCTION(intltz_create_time_zone) { char *str_id; int str_id_len; intl_error_reset(NULL TSRMLS_CC); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str_id, &str_id_len) == FAILURE) { intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "intltz_create_time_zone: bad arguments", 0 TSRMLS_CC); RETURN_NULL(); } UErrorCode status = UErrorCode(); UnicodeString id = UnicodeString(); if (intl_stringFromChar(id, str_id, str_id_len, &status) == FAILURE) { intl_error_set(NULL, status, "intltz_create_time_zone: could not convert time zone id to UTF-16", 0 TSRMLS_CC); RETURN_NULL(); } //guaranteed non-null; GMT if timezone cannot be understood TimeZone *tz = TimeZone::createTimeZone(id); timezone_object_construct(tz, return_value, 1 TSRMLS_CC); }
U_CFUNC PHP_FUNCTION(intltz_from_date_time_zone) { zval *zv_timezone; TimeZone *tz; php_timezone_obj *tzobj; intl_error_reset(NULL); if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &zv_timezone, php_date_get_timezone_ce()) == FAILURE) { intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "intltz_from_date_time_zone: bad arguments", 0); RETURN_NULL(); } tzobj = Z_PHPTIMEZONE_P(zv_timezone); if (!tzobj->initialized) { intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "intltz_from_date_time_zone: DateTimeZone object is unconstructed", 0); RETURN_NULL(); } tz = timezone_convert_datetimezone(tzobj->type, tzobj, FALSE, NULL, "intltz_from_date_time_zone"); if (tz == NULL) { RETURN_NULL(); } timezone_object_construct(tz, return_value, 1); }
/* {{{ proto IntlTimeZone datefmt_get_timezone(IntlDateFormatter $mf) * Get formatter timezone. */ U_CFUNC PHP_FUNCTION(datefmt_get_timezone) { DATE_FORMAT_METHOD_INIT_VARS; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, IntlDateFormatter_ce_ptr ) == FAILURE) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_get_timezone: unable to parse input params", 0 TSRMLS_CC ); RETURN_FALSE; } DATE_FORMAT_METHOD_FETCH_OBJECT; const TimeZone& tz = fetch_datefmt(dfo)->getTimeZone(); TimeZone *tz_clone = tz.clone(); if (tz_clone == NULL) { intl_errors_set(INTL_DATA_ERROR_P(dfo), U_MEMORY_ALLOCATION_ERROR, "datefmt_get_timezone: Out of memory when cloning time zone", 0 TSRMLS_CC); RETURN_FALSE; } object_init_ex(return_value, TimeZone_ce_ptr); timezone_object_construct(tz_clone, return_value, 1 TSRMLS_CC); }
U_CFUNC PHP_FUNCTION(intltz_get_unknown) { intl_error_reset(NULL); if (zend_parse_parameters_none() == FAILURE) { intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "intltz_get_unknown: bad arguments", 0); RETURN_NULL(); } timezone_object_construct(&TimeZone::getUnknown(), return_value, 0); }
U_CFUNC PHP_FUNCTION(intltz_get_gmt) { intl_error_reset(NULL TSRMLS_CC); if (zend_parse_parameters_none() == FAILURE) { intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "intltz_get_gmt: bad arguments", 0 TSRMLS_CC); RETURN_NULL(); } timezone_object_construct(TimeZone::getGMT(), return_value, 0 TSRMLS_CC); }
U_CFUNC PHP_FUNCTION(intltz_create_default) { intl_error_reset(NULL); if (zend_parse_parameters_none() == FAILURE) { intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "intltz_create_default: bad arguments", 0); RETURN_NULL(); } TimeZone *tz = TimeZone::createDefault(); timezone_object_construct(tz, return_value, 1); }
U_CFUNC PHP_FUNCTION(intlcal_get_time_zone) { CALENDAR_METHOD_INIT_VARS; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, Calendar_ce_ptr) == FAILURE) { intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "intlcal_get_time_zone: bad arguments", 0 TSRMLS_CC); RETURN_FALSE; } CALENDAR_METHOD_FETCH_OBJECT; TimeZone *tz = co->ucal->getTimeZone().clone(); if (tz == NULL) { intl_errors_set(CALENDAR_ERROR_P(co), U_MEMORY_ALLOCATION_ERROR, "intlcal_get_time_zone: could not clone TimeZone", 0 TSRMLS_CC); RETURN_FALSE; } timezone_object_construct(tz, return_value, 1 TSRMLS_CC); }
/* {{{ get_debug_info handler for Calendar */ static HashTable *Calendar_get_debug_info(zval *object, int *is_temp) { zval zv, zfields; Calendar_object *co; const Calendar *cal; HashTable *debug_info; *is_temp = 1; ALLOC_HASHTABLE(debug_info); zend_hash_init(debug_info, 8, NULL, ZVAL_PTR_DTOR, 0); co = Z_INTL_CALENDAR_P(object); cal = co->ucal; if (cal == NULL) { ZVAL_FALSE(&zv); zend_hash_str_update(debug_info, "valid", sizeof("valid") - 1, &zv); return debug_info; } ZVAL_TRUE(&zv); zend_hash_str_update(debug_info, "valid", sizeof("valid") - 1, &zv); ZVAL_STRING(&zv, const_cast<char*>(cal->getType())); zend_hash_str_update(debug_info, "type", sizeof("type") - 1, &zv); { zval ztz, ztz_debug; int is_tmp; HashTable *debug_info_tz; timezone_object_construct(&cal->getTimeZone(), &ztz , 0); debug_info = Z_OBJ_HANDLER(ztz, get_debug_info)(&ztz, &is_tmp); assert(is_tmp == 1); array_init(&ztz_debug); zend_hash_copy(Z_ARRVAL(ztz_debug), debug_info_tz, zval_add_ref); zend_hash_destroy(debug_info_tz); FREE_HASHTABLE(debug_info_tz); zend_hash_str_update(debug_info, "timeZone", sizeof("timeZone") - 1, &ztz_debug); } { UErrorCode uec = U_ZERO_ERROR; Locale locale = cal->getLocale(ULOC_VALID_LOCALE, uec); if (U_SUCCESS(uec)) { ZVAL_STRING(&zv, const_cast<char*>(locale.getName())); zend_hash_str_update(debug_info, "locale", sizeof("locale") - 1, &zv); } else { ZVAL_STRING(&zv, const_cast<char*>(u_errorName(uec))); zend_hash_str_update(debug_info, "locale", sizeof("locale") - 1, &zv); } } array_init_size(&zfields, UCAL_FIELD_COUNT); for (int i = 0; i < sizeof(debug_info_fields) / sizeof(*debug_info_fields); i++) { UErrorCode uec = U_ZERO_ERROR; const char *name = debug_info_fields[i].name; int32_t res = cal->get(debug_info_fields[i].field, uec); if (U_SUCCESS(uec)) { add_assoc_long(&zfields, name, (zend_long)res); } else { add_assoc_string(&zfields, name, const_cast<char*>(u_errorName(uec))); } } zend_hash_str_update(debug_info, "fields", sizeof("fields") - 1, &zfields); return debug_info; }