diff options
Diffstat (limited to 'ext/date/php_date.c')
| -rw-r--r-- | ext/date/php_date.c | 1938 |
1 files changed, 947 insertions, 991 deletions
diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 801208d714..558d6f8ba3 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1,6 +1,6 @@ /* +----------------------------------------------------------------------+ - | PHP Version 5 | + | PHP Version 7 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2016 The PHP Group | +----------------------------------------------------------------------+ @@ -85,7 +85,6 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_mktime, 0, 0, 0) ZEND_ARG_INFO(0, mon) ZEND_ARG_INFO(0, day) ZEND_ARG_INFO(0, year) - ZEND_ARG_INFO(0, is_dst) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_gmmktime, 0, 0, 0) @@ -95,7 +94,6 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_gmmktime, 0, 0, 0) ZEND_ARG_INFO(0, mon) ZEND_ARG_INFO(0, day) ZEND_ARG_INFO(0, year) - ZEND_ARG_INFO(0, is_dst) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO(arginfo_checkdate, 0) @@ -327,8 +325,8 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_timezone_name_from_abbr, 0, 0, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_timezone_offset_get, 0, 0, 2) - ZEND_ARG_INFO(0, object) - ZEND_ARG_INFO(0, datetime) + ZEND_ARG_OBJ_INFO(0, object, DateTimeZone, 0) + ZEND_ARG_OBJ_INFO(0, datetime, DateTimeInterface, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_timezone_method_offset_get, 0, 0, 1) @@ -541,8 +539,8 @@ const zend_function_entry date_funcs_period[] = { PHP_FE_END }; -static char* guess_timezone(const timelib_tzdb *tzdb TSRMLS_DC); -static void date_register_classes(TSRMLS_D); +static char* guess_timezone(const timelib_tzdb *tzdb); +static void date_register_classes(void); /* }}} */ ZEND_DECLARE_MODULE_GLOBALS(date) @@ -610,47 +608,47 @@ static zend_object_handlers date_object_handlers_period; return; \ } \ } else { \ - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, NULL, "O", &object, date_ce_date) == FAILURE) { \ + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), NULL, "O", &object, date_ce_date) == FAILURE) { \ RETURN_FALSE; \ } \ } \ - obj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); \ + obj = Z_PHPDATE_P(object); \ #define DATE_CHECK_INITIALIZED(member, class_name) \ if (!(member)) { \ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "The " #class_name " object has not been correctly initialized by its constructor"); \ + php_error_docref(NULL, E_WARNING, "The " #class_name " object has not been correctly initialized by its constructor"); \ RETURN_FALSE; \ } -static void date_object_free_storage_date(void *object TSRMLS_DC); -static void date_object_free_storage_timezone(void *object TSRMLS_DC); -static void date_object_free_storage_interval(void *object TSRMLS_DC); -static void date_object_free_storage_period(void *object TSRMLS_DC); - -static zend_object_value date_object_new_date(zend_class_entry *class_type TSRMLS_DC); -static zend_object_value date_object_new_timezone(zend_class_entry *class_type TSRMLS_DC); -static zend_object_value date_object_new_interval(zend_class_entry *class_type TSRMLS_DC); -static zend_object_value date_object_new_period(zend_class_entry *class_type TSRMLS_DC); - -static zend_object_value date_object_clone_date(zval *this_ptr TSRMLS_DC); -static zend_object_value date_object_clone_timezone(zval *this_ptr TSRMLS_DC); -static zend_object_value date_object_clone_interval(zval *this_ptr TSRMLS_DC); -static zend_object_value date_object_clone_period(zval *this_ptr TSRMLS_DC); - -static int date_object_compare_date(zval *d1, zval *d2 TSRMLS_DC); -static HashTable *date_object_get_gc(zval *object, zval ***table, int *n TSRMLS_DC); -static HashTable *date_object_get_properties(zval *object TSRMLS_DC); -static HashTable *date_object_get_gc_interval(zval *object, zval ***table, int *n TSRMLS_DC); -static HashTable *date_object_get_properties_interval(zval *object TSRMLS_DC); -static HashTable *date_object_get_gc_period(zval *object, zval ***table, int *n TSRMLS_DC); -static HashTable *date_object_get_properties_period(zval *object TSRMLS_DC); -static HashTable *date_object_get_properties_timezone(zval *object TSRMLS_DC); -static HashTable *date_object_get_gc_timezone(zval *object, zval ***table, int *n TSRMLS_DC); - -zval *date_interval_read_property(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC); -void date_interval_write_property(zval *object, zval *member, zval *value, const zend_literal *key TSRMLS_DC); -static zval *date_period_read_property(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC); -static void date_period_write_property(zval *object, zval *member, zval *value, const zend_literal *key TSRMLS_DC); +static void date_object_free_storage_date(zend_object *object); +static void date_object_free_storage_timezone(zend_object *object); +static void date_object_free_storage_interval(zend_object *object); +static void date_object_free_storage_period(zend_object *object); + +static zend_object *date_object_new_date(zend_class_entry *class_type); +static zend_object *date_object_new_timezone(zend_class_entry *class_type); +static zend_object *date_object_new_interval(zend_class_entry *class_type); +static zend_object *date_object_new_period(zend_class_entry *class_type); + +static zend_object *date_object_clone_date(zval *this_ptr); +static zend_object *date_object_clone_timezone(zval *this_ptr); +static zend_object *date_object_clone_interval(zval *this_ptr); +static zend_object *date_object_clone_period(zval *this_ptr); + +static int date_object_compare_date(zval *d1, zval *d2); +static HashTable *date_object_get_gc(zval *object, zval **table, int *n); +static HashTable *date_object_get_properties(zval *object); +static HashTable *date_object_get_gc_interval(zval *object, zval **table, int *n); +static HashTable *date_object_get_properties_interval(zval *object); +static HashTable *date_object_get_gc_period(zval *object, zval **table, int *n); +static HashTable *date_object_get_properties_period(zval *object); +static HashTable *date_object_get_properties_timezone(zval *object); +static HashTable *date_object_get_gc_timezone(zval *object, zval **table, int *n); + +zval *date_interval_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv); +void date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot); +static zval *date_period_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv); +static void date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot); /* {{{ Module struct */ zend_module_entry date_module_entry = { @@ -664,7 +662,7 @@ zend_module_entry date_module_entry = { PHP_RINIT(date), /* request startup */ PHP_RSHUTDOWN(date), /* request shutdown */ PHP_MINFO(date), /* extension info */ - PHP_VERSION, /* extension version */ + PHP_DATE_VERSION, /* extension version */ PHP_MODULE_GLOBALS(date), /* globals descriptor */ PHP_GINIT(date), /* globals ctor */ NULL, /* globals dtor */ @@ -685,12 +683,12 @@ static PHP_GINIT_FUNCTION(date) /* }}} */ -static void _php_date_tzinfo_dtor(void *tzinfo) +static void _php_date_tzinfo_dtor(zval *zv) /* {{{ */ { - timelib_tzinfo **tzi = (timelib_tzinfo **)tzinfo; + timelib_tzinfo *tzi = (timelib_tzinfo*)Z_PTR_P(zv); - timelib_tzinfo_dtor(*tzi); -} + timelib_tzinfo_dtor(tzi); +} /* }}} */ /* {{{ PHP_RINIT_FUNCTION */ PHP_RINIT_FUNCTION(date) @@ -812,6 +810,16 @@ PHP_RSHUTDOWN_FUNCTION(date) #define DATE_FORMAT_ISO8601 "Y-m-d\\TH:i:sO" /* + * RFC3339, Appendix A: http://www.ietf.org/rfc/rfc3339.txt + * ISO 8601 also requires (in section 5.3.1.3) that a decimal fraction + * be proceeded by a "0" if less than unity. Annex B.2 of ISO 8601 + * gives examples where the decimal fractions are not preceded by a "0". + * This grammar assumes section 5.3.1.3 is correct and that Annex B.2 is + * in error. + */ +#define DATE_FORMAT_RFC3339_EXTENDED "Y-m-d\\TH:i:s.vP" + +/* * This comes from various sources that like to contradict. I'm going with the * format here because of: * http://msdn.microsoft.com/en-us/library/windows/desktop/aa384321%28v=vs.85%29.aspx @@ -819,13 +827,6 @@ PHP_RSHUTDOWN_FUNCTION(date) */ #define DATE_FORMAT_COOKIE "l, d-M-Y H:i:s T" -#define DATE_TZ_ERRMSG \ - "It is not safe to rely on the system's timezone settings. You are " \ - "*required* to use the date.timezone setting or the " \ - "date_default_timezone_set() function. In case you used any of those " \ - "methods and you are still getting this warning, you most likely " \ - "misspelled the timezone identifier. " - #define SUNFUNCS_RET_TIMESTAMP 0 #define SUNFUNCS_RET_STRING 1 #define SUNFUNCS_RET_DOUBLE 2 @@ -834,7 +835,7 @@ PHP_RSHUTDOWN_FUNCTION(date) PHP_MINIT_FUNCTION(date) { REGISTER_INI_ENTRIES(); - date_register_classes(TSRMLS_C); + date_register_classes(); /* * RFC4287, Section 3.3: http://www.ietf.org/rfc/rfc4287.txt * A Date construct is an element whose content MUST conform to the @@ -851,12 +852,15 @@ PHP_MINIT_FUNCTION(date) */ REGISTER_STRING_CONSTANT("DATE_COOKIE", DATE_FORMAT_COOKIE, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_ISO8601", DATE_FORMAT_ISO8601, CONST_CS | CONST_PERSISTENT); + REGISTER_STRING_CONSTANT("DATE_RFC822", DATE_FORMAT_RFC822, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_RFC850", DATE_FORMAT_RFC850, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_RFC1036", DATE_FORMAT_RFC1036, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_RFC1123", DATE_FORMAT_RFC1123, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DATE_RFC2822", DATE_FORMAT_RFC2822, CONST_CS | CONST_PERSISTENT); - REGISTER_STRING_CONSTANT("DATE_RFC3339", DATE_FORMAT_RFC3339, CONST_CS | CONST_PERSISTENT); + REGISTER_STRING_CONSTANT("DATE_RFC3339", DATE_FORMAT_RFC3339, CONST_CS | CONST_PERSISTENT); + REGISTER_STRING_CONSTANT("DATE_RFC3339_EXTENDED", DATE_FORMAT_RFC3339_EXTENDED, CONST_CS | CONST_PERSISTENT); + /* * RSS 2.0 Specification: http://blogs.law.harvard.edu/tech/rss * "All date-times in RSS conform to the Date and Time Specification of RFC 822, @@ -902,7 +906,7 @@ PHP_MINFO_FUNCTION(date) php_info_print_table_row(2, "date/time support", "enabled"); php_info_print_table_row(2, "\"Olson\" Timezone Database Version", tzdb->version); php_info_print_table_row(2, "Timezone Database", php_date_global_timezone_db_enabled ? "external" : "internal"); - php_info_print_table_row(2, "Default timezone", guess_timezone(tzdb TSRMLS_CC)); + php_info_print_table_row(2, "Default timezone", guess_timezone(tzdb)); php_info_print_table_end(); DISPLAY_INI_ENTRIES(); @@ -910,30 +914,29 @@ PHP_MINFO_FUNCTION(date) /* }}} */ /* {{{ Timezone Cache functions */ -static timelib_tzinfo *php_date_parse_tzfile(char *formal_tzname, const timelib_tzdb *tzdb TSRMLS_DC) +static timelib_tzinfo *php_date_parse_tzfile(char *formal_tzname, const timelib_tzdb *tzdb) { - timelib_tzinfo *tzi, **ptzi; + timelib_tzinfo *tzi; if(!DATEG(tzcache)) { ALLOC_HASHTABLE(DATEG(tzcache)); zend_hash_init(DATEG(tzcache), 4, NULL, _php_date_tzinfo_dtor, 0); } - if (zend_hash_find(DATEG(tzcache), formal_tzname, strlen(formal_tzname) + 1, (void **) &ptzi) == SUCCESS) { - return *ptzi; + if ((tzi = zend_hash_str_find_ptr(DATEG(tzcache), formal_tzname, strlen(formal_tzname))) != NULL) { + return tzi; } tzi = timelib_parse_tzfile(formal_tzname, tzdb); if (tzi) { - zend_hash_add(DATEG(tzcache), formal_tzname, strlen(formal_tzname) + 1, (void *) &tzi, sizeof(timelib_tzinfo*), NULL); + zend_hash_str_add_ptr(DATEG(tzcache), formal_tzname, strlen(formal_tzname), tzi); } return tzi; } timelib_tzinfo *php_date_parse_tzfile_wrapper(char *formal_tzname, const timelib_tzdb *tzdb) { - TSRMLS_FETCH(); - return php_date_parse_tzfile(formal_tzname, tzdb TSRMLS_CC); + return php_date_parse_tzfile(formal_tzname, tzdb); } /* }}} */ @@ -941,14 +944,16 @@ timelib_tzinfo *php_date_parse_tzfile_wrapper(char *formal_tzname, const timelib /* {{{ static PHP_INI_MH(OnUpdate_date_timezone) */ static PHP_INI_MH(OnUpdate_date_timezone) { - if (OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC) == FAILURE) { + if (OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage) == FAILURE) { return FAILURE; } DATEG(timezone_valid) = 0; if (stage == PHP_INI_STAGE_RUNTIME) { if (!timelib_timezone_id_is_valid(DATEG(default_timezone), DATE_TIMEZONEDB)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, DATE_TZ_ERRMSG); + if (DATEG(default_timezone) && *DATEG(default_timezone)) { + php_error_docref(NULL, E_WARNING, "Invalid date.timezone value '%s', we selected the timezone 'UTC' for now.", DATEG(default_timezone)); + } } else { DATEG(timezone_valid) = 1; } @@ -959,7 +964,7 @@ static PHP_INI_MH(OnUpdate_date_timezone) /* }}} */ /* {{{ Helper functions */ -static char* guess_timezone(const timelib_tzdb *tzdb TSRMLS_DC) +static char* guess_timezone(const timelib_tzdb *tzdb) { /* Checking configure timezone */ if (DATEG(timezone) && (strlen(DATEG(timezone))) > 0) { @@ -968,11 +973,11 @@ static char* guess_timezone(const timelib_tzdb *tzdb TSRMLS_DC) /* Check config setting for default timezone */ if (!DATEG(default_timezone)) { /* Special case: ext/date wasn't initialized yet */ - zval ztz; + zval *ztz; - if (SUCCESS == zend_get_configuration_directive("date.timezone", sizeof("date.timezone"), &ztz) - && Z_TYPE(ztz) == IS_STRING && Z_STRLEN(ztz) > 0 && timelib_timezone_id_is_valid(Z_STRVAL(ztz), tzdb)) { - return Z_STRVAL(ztz); + if (NULL != (ztz = cfg_get_entry("date.timezone", sizeof("date.timezone"))) + && Z_TYPE_P(ztz) == IS_STRING && Z_STRLEN_P(ztz) > 0 && timelib_timezone_id_is_valid(Z_STRVAL_P(ztz), tzdb)) { + return Z_STRVAL_P(ztz); } } else if (*DATEG(default_timezone)) { if (DATEG(timezone_valid) == 1) { @@ -980,7 +985,7 @@ static char* guess_timezone(const timelib_tzdb *tzdb TSRMLS_DC) } if (!timelib_timezone_id_is_valid(DATEG(default_timezone), tzdb)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid date.timezone value '%s', we selected the timezone 'UTC' for now.", DATEG(default_timezone)); + php_error_docref(NULL, E_WARNING, "Invalid date.timezone value '%s', we selected the timezone 'UTC' for now.", DATEG(default_timezone)); return "UTC"; } @@ -988,19 +993,18 @@ static char* guess_timezone(const timelib_tzdb *tzdb TSRMLS_DC) return DATEG(default_timezone); } /* Fallback to UTC */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, DATE_TZ_ERRMSG "We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone."); return "UTC"; } -PHPAPI timelib_tzinfo *get_timezone_info(TSRMLS_D) +PHPAPI timelib_tzinfo *get_timezone_info(void) { char *tz; timelib_tzinfo *tzi; - tz = guess_timezone(DATE_TIMEZONEDB TSRMLS_CC); - tzi = php_date_parse_tzfile(tz, DATE_TIMEZONEDB TSRMLS_CC); + tz = guess_timezone(DATE_TIMEZONEDB); + tzi = php_date_parse_tzfile(tz, DATE_TIMEZONEDB); if (! tzi) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Timezone database is corrupt - this should *never* happen!"); + php_error_docref(NULL, E_ERROR, "Timezone database is corrupt - this should *never* happen!"); } return tzi; } @@ -1008,7 +1012,7 @@ PHPAPI timelib_tzinfo *get_timezone_info(TSRMLS_D) /* {{{ date() and gmdate() data */ -#include "ext/standard/php_smart_str.h" +#include "zend_smart_str.h" static char *mon_full_names[] = { "January", "February", "March", "April", @@ -1064,7 +1068,7 @@ char *php_date_short_day_name(timelib_sll y, timelib_sll m, timelib_sll d) /* }}} */ /* {{{ date_format - (gm)date helper */ -static char *date_format(char *format, int format_len, timelib_time *t, int localtime) +static zend_string *date_format(char *format, size_t format_len, timelib_time *t, int localtime) { smart_str string = {0}; int i, length = 0; @@ -1075,7 +1079,7 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca int weekYearSet = 0; if (!format_len) { - return estrdup(""); + return ZSTR_EMPTY_ALLOC(); } if (localtime) { @@ -1084,13 +1088,13 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca offset->offset = (t->z - (t->dst * 60)) * -60; offset->leap_secs = 0; offset->is_dst = t->dst; - offset->abbr = strdup(t->tz_abbr); + offset->abbr = timelib_strdup(t->tz_abbr); } else if (t->zone_type == TIMELIB_ZONETYPE_OFFSET) { offset = timelib_time_offset_ctor(); offset->offset = (t->z) * -60; offset->leap_secs = 0; offset->is_dst = 0; - offset->abbr = malloc(9); /* GMT�xxxx\0 */ + offset->abbr = timelib_malloc(9); /* GMT±xxxx\0 */ snprintf(offset->abbr, 9, "GMT%c%02d%02d", localtime ? ((offset->offset < 0) ? '-' : '+') : '+', localtime ? abs(offset->offset / 3600) : 0, @@ -1152,6 +1156,7 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca case 'i': length = slprintf(buffer, 32, "%02d", (int) t->i); break; case 's': length = slprintf(buffer, 32, "%02d", (int) t->s); break; case 'u': length = slprintf(buffer, 32, "%06d", (int) floor(t->f * 1000000 + 0.5)); break; + case 'v': length = slprintf(buffer, 32, "%03d", (int) floor(t->f * 1000 + 0.5)); break; /* timezone */ case 'I': length = slprintf(buffer, 32, "%d", localtime ? offset->is_dst : 0); break; @@ -1219,39 +1224,36 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca timelib_time_offset_dtor(offset); } - return string.c; + return string.s; } static void php_date(INTERNAL_FUNCTION_PARAMETERS, int localtime) { char *format; - int format_len; - long ts; - char *string; + size_t format_len; + zend_long ts; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &format, &format_len, &ts) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", &format, &format_len, &ts) == FAILURE) { RETURN_FALSE; } if (ZEND_NUM_ARGS() == 1) { ts = time(NULL); } - string = php_format_date(format, format_len, ts, localtime TSRMLS_CC); - - RETVAL_STRING(string, 0); + RETURN_STR(php_format_date(format, format_len, ts, localtime)); } /* }}} */ -PHPAPI char *php_format_date(char *format, int format_len, time_t ts, int localtime TSRMLS_DC) /* {{{ */ +PHPAPI zend_string *php_format_date(char *format, size_t format_len, time_t ts, int localtime) /* {{{ */ { timelib_time *t; timelib_tzinfo *tzi; - char *string; + zend_string *string; t = timelib_time_ctor(); if (localtime) { - tzi = get_timezone_info(TSRMLS_C); + tzi = get_timezone_info(); t->tz_info = tzi; t->zone_type = TIMELIB_ZONETYPE_ID; timelib_unixtime2local(t, ts); @@ -1269,7 +1271,7 @@ PHPAPI char *php_format_date(char *format, int format_len, time_t ts, int localt /* {{{ php_idate */ -PHPAPI int php_idate(char format, time_t ts, int localtime TSRMLS_DC) +PHPAPI int php_idate(char format, time_t ts, int localtime) { timelib_time *t; timelib_tzinfo *tzi; @@ -1280,7 +1282,7 @@ PHPAPI int php_idate(char format, time_t ts, int localtime TSRMLS_DC) t = timelib_time_ctor(); if (!localtime) { - tzi = get_timezone_info(TSRMLS_C); + tzi = get_timezone_info(); t->tz_info = tzi; t->zone_type = TIMELIB_ZONETYPE_ID; timelib_unixtime2local(t, ts); @@ -1295,13 +1297,13 @@ PHPAPI int php_idate(char format, time_t ts, int localtime TSRMLS_DC) offset->offset = (t->z - (t->dst * 60)) * -60; offset->leap_secs = 0; offset->is_dst = t->dst; - offset->abbr = strdup(t->tz_abbr); + offset->abbr = timelib_strdup(t->tz_abbr); } else if (t->zone_type == TIMELIB_ZONETYPE_OFFSET) { offset = timelib_time_offset_ctor(); offset->offset = (t->z - (t->dst * 60)) * -60; offset->leap_secs = 0; offset->is_dst = t->dst; - offset->abbr = malloc(9); /* GMT�xxxx\0 */ + offset->abbr = timelib_malloc(9); /* GMT±xxxx\0 */ snprintf(offset->abbr, 9, "GMT%c%02d%02d", !localtime ? ((offset->offset < 0) ? '-' : '+') : '+', !localtime ? abs(offset->offset / 3600) : 0, @@ -1384,16 +1386,16 @@ PHP_FUNCTION(gmdate) PHP_FUNCTION(idate) { char *format; - int format_len; - long ts = 0; + size_t format_len; + zend_long ts = 0; int ret; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &format, &format_len, &ts) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", &format, &format_len, &ts) == FAILURE) { RETURN_FALSE; } if (format_len != 1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "idate format is one char"); + php_error_docref(NULL, E_WARNING, "idate format is one char"); RETURN_FALSE; } @@ -1401,9 +1403,9 @@ PHP_FUNCTION(idate) ts = time(NULL); } - ret = php_idate(format[0], ts, 0 TSRMLS_CC); + ret = php_idate(format[0], ts, 0); if (ret == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unrecognized date format token."); + php_error_docref(NULL, E_WARNING, "Unrecognized date format token."); RETURN_FALSE; } RETURN_LONG(ret); @@ -1423,12 +1425,12 @@ PHPAPI void php_date_set_tzdb(timelib_tzdb *tzdb) /* }}} */ /* {{{ php_parse_date: Backwards compatibility function */ -PHPAPI signed long php_parse_date(char *string, signed long *now) +PHPAPI zend_long php_parse_date(char *string, zend_long *now) { timelib_time *parsed_time; timelib_error_container *error = NULL; int error2; - signed long retval; + zend_long retval; parsed_time = timelib_strtotime(string, strlen(string), &error, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); if (error->error_count) { @@ -1451,43 +1453,25 @@ PHPAPI signed long php_parse_date(char *string, signed long *now) Convert string representation of date and time to a timestamp */ PHP_FUNCTION(strtotime) { - char *times, *initial_ts; - int time_len, error1, error2; + char *times; + size_t time_len; + int error1, error2; struct timelib_error_container *error; - long preset_ts = 0, ts; - + zend_long preset_ts = 0, ts; timelib_time *t, *now; timelib_tzinfo *tzi; - tzi = get_timezone_info(TSRMLS_C); - - if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "sl", ×, &time_len, &preset_ts) != FAILURE) { - /* We have an initial timestamp */ - now = timelib_time_ctor(); - - initial_ts = emalloc(25); - snprintf(initial_ts, 24, "@%ld UTC", preset_ts); - t = timelib_strtotime(initial_ts, strlen(initial_ts), NULL, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); /* we ignore the error here, as this should never fail */ - timelib_update_ts(t, tzi); - now->tz_info = tzi; - now->zone_type = TIMELIB_ZONETYPE_ID; - timelib_unixtime2local(now, t->sse); - timelib_time_dtor(t); - efree(initial_ts); - } else if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", ×, &time_len, &preset_ts) != FAILURE) { - /* We have no initial timestamp */ - now = timelib_time_ctor(); - now->tz_info = tzi; - now->zone_type = TIMELIB_ZONETYPE_ID; - timelib_unixtime2local(now, (timelib_sll) time(NULL)); - } else { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", ×, &time_len, &preset_ts) == FAILURE || !time_len) { RETURN_FALSE; } - if (!time_len) { - timelib_time_dtor(now); - RETURN_FALSE; - } + tzi = get_timezone_info(); + + now = timelib_time_ctor(); + now->tz_info = tzi; + now->zone_type = TIMELIB_ZONETYPE_ID; + timelib_unixtime2local(now, + (ZEND_NUM_ARGS() == 2) ? (timelib_sll) preset_ts : (timelib_sll) time(NULL)); t = timelib_strtotime(times, time_len, &error, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); error1 = error->error_count; @@ -1510,13 +1494,13 @@ PHP_FUNCTION(strtotime) /* {{{ php_mktime - (gm)mktime helper */ PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt) { - long hou = 0, min = 0, sec = 0, mon = 0, day = 0, yea = 0, dst = -1; + zend_long hou = 0, min = 0, sec = 0, mon = 0, day = 0, yea = 0; timelib_time *now; timelib_tzinfo *tzi = NULL; - long ts, adjust_seconds = 0; + zend_long ts, adjust_seconds = 0; int error; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|lllllll", &hou, &min, &sec, &mon, &day, &yea, &dst) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|llllll", &hou, &min, &sec, &mon, &day, &yea) == FAILURE) { RETURN_FALSE; } /* Initialize structure with current time */ @@ -1524,7 +1508,7 @@ PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt) if (gmt) { timelib_unixtime2gmt(now, (timelib_sll) time(NULL)); } else { - tzi = get_timezone_info(TSRMLS_C); + tzi = get_timezone_info(); now->tz_info = tzi; now->zone_type = TIMELIB_ZONETYPE_ID; timelib_unixtime2local(now, (timelib_sll) time(NULL)); @@ -1557,7 +1541,7 @@ PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt) now->h = hou; break; default: - php_error_docref(NULL TSRMLS_CC, E_STRICT, "You should be using the time() function instead"); + php_error_docref(NULL, E_DEPRECATED, "You should be using the time() function instead"); } /* Update the timestamp */ if (gmt) { @@ -1565,27 +1549,7 @@ PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt) } else { timelib_update_ts(now, tzi); } - /* Support for the deprecated is_dst parameter */ - if (dst != -1) { - php_error_docref(NULL TSRMLS_CC, E_DEPRECATED, "The is_dst parameter is deprecated"); - if (gmt) { - /* GMT never uses DST */ - if (dst == 1) { - adjust_seconds = -3600; - } - } else { - /* Figure out is_dst for current TS */ - timelib_time_offset *tmp_offset; - tmp_offset = timelib_get_time_zone_info(now->sse, tzi); - if (dst == 1 && tmp_offset->is_dst == 0) { - adjust_seconds = -3600; - } - if (dst == 0 && tmp_offset->is_dst == 1) { - adjust_seconds = +3600; - } - timelib_time_offset_dtor(tmp_offset); - } - } + /* Clean up and return */ ts = timelib_date_to_int(now, &error); ts += adjust_seconds; @@ -1619,9 +1583,9 @@ PHP_FUNCTION(gmmktime) Returns true(1) if it is a valid date in gregorian calendar */ PHP_FUNCTION(checkdate) { - long m, d, y; + zend_long m, d, y; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lll", &m, &d, &y) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lll", &m, &d, &y) == FAILURE) { RETURN_FALSE; } @@ -1636,19 +1600,20 @@ PHP_FUNCTION(checkdate) /* {{{ php_strftime - (gm)strftime helper */ PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gmt) { - char *format, *buf; - int format_len; - long timestamp = 0; + char *format; + size_t format_len; + zend_long timestamp = 0; struct tm ta; int max_reallocs = 5; size_t buf_len = 256, real_len; timelib_time *ts; timelib_tzinfo *tzi; timelib_time_offset *offset = NULL; + zend_string *buf; - timestamp = (long) time(NULL); + timestamp = (zend_long) time(NULL); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &format, &format_len, ×tamp) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", &format, &format_len, ×tamp) == FAILURE) { RETURN_FALSE; } @@ -1661,7 +1626,7 @@ PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gmt) tzi = NULL; timelib_unixtime2gmt(ts, (timelib_sll) timestamp); } else { - tzi = get_timezone_info(TSRMLS_C); + tzi = get_timezone_info(); ts->tz_info = tzi; ts->zone_type = TIMELIB_ZONETYPE_ID; timelib_unixtime2local(ts, (timelib_sll) timestamp); @@ -1697,19 +1662,19 @@ PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gmt) /* VS2012 crt has a bug where strftime crash with %z and %Z format when the initial buffer is too small. See http://connect.microsoft.com/VisualStudio/feedback/details/759720/vs2012-strftime-crash-with-z-formatting-code */ - buf = (char *) emalloc(buf_len); - while ((real_len=strftime(buf, buf_len, format, &ta))==buf_len || real_len==0) { + buf = zend_string_alloc(buf_len, 0); + while ((real_len = strftime(ZSTR_VAL(buf), buf_len, format, &ta)) == buf_len || real_len == 0) { buf_len *= 2; - buf = (char *) erealloc(buf, buf_len); + buf = zend_string_extend(buf, buf_len, 0); if (!--max_reallocs) { break; } } -#if defined(PHP_WIN32) && _MSC_VER >= 1700 +#ifdef PHP_WIN32 /* VS2012 strftime() returns number of characters, not bytes. See VC++11 bug id 766205. */ if (real_len > 0) { - real_len = strlen(buf); + real_len = strlen(buf->val); } #endif @@ -1719,10 +1684,10 @@ PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gmt) } if (real_len && real_len != buf_len) { - buf = (char *) erealloc(buf, real_len + 1); - RETURN_STRINGL(buf, real_len, 0); + buf = zend_string_truncate(buf, real_len, 0); + RETURN_NEW_STR(buf); } - efree(buf); + zend_string_free(buf); RETURN_FALSE; } /* }}} */ @@ -1748,7 +1713,7 @@ PHP_FUNCTION(gmstrftime) Return current UNIX timestamp */ PHP_FUNCTION(time) { - RETURN_LONG((long)time(NULL)); + RETURN_LONG((zend_long)time(NULL)); } /* }}} */ @@ -1756,16 +1721,16 @@ PHP_FUNCTION(time) Returns the results of the C system call localtime as an associative array if the associative_array argument is set to 1 other wise it is a regular array */ PHP_FUNCTION(localtime) { - long timestamp = (long)time(NULL); + zend_long timestamp = (zend_long)time(NULL); zend_bool associative = 0; timelib_tzinfo *tzi; timelib_time *ts; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|lb", ×tamp, &associative) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|lb", ×tamp, &associative) == FAILURE) { RETURN_FALSE; } - tzi = get_timezone_info(TSRMLS_C); + tzi = get_timezone_info(); ts = timelib_time_ctor(); ts->tz_info = tzi; ts->zone_type = TIMELIB_ZONETYPE_ID; @@ -1803,15 +1768,15 @@ PHP_FUNCTION(localtime) Get date/time information */ PHP_FUNCTION(getdate) { - long timestamp = (long)time(NULL); + zend_long timestamp = (zend_long)time(NULL); timelib_tzinfo *tzi; timelib_time *ts; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", ×tamp) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l", ×tamp) == FAILURE) { RETURN_FALSE; } - tzi = get_timezone_info(TSRMLS_C); + tzi = get_timezone_info(); ts = timelib_time_ctor(); ts->tz_info = tzi; ts->zone_type = TIMELIB_ZONETYPE_ID; @@ -1827,8 +1792,8 @@ PHP_FUNCTION(getdate) add_assoc_long(return_value, "mon", ts->m); add_assoc_long(return_value, "year", ts->y); add_assoc_long(return_value, "yday", timelib_day_of_year(ts->y, ts->m, ts->d)); - add_assoc_string(return_value, "weekday", php_date_full_day_name(ts->y, ts->m, ts->d), 1); - add_assoc_string(return_value, "month", mon_full_names[ts->m - 1], 1); + add_assoc_string(return_value, "weekday", php_date_full_day_name(ts->y, ts->m, ts->d)); + add_assoc_string(return_value, "month", mon_full_names[ts->m - 1]); add_index_long(return_value, 0, timestamp); timelib_time_dtor(ts); @@ -1856,44 +1821,39 @@ PHP_FUNCTION(getdate) /* define an overloaded iterator structure */ typedef struct { zend_object_iterator intern; - zval *date_period_zval; - zval *current; + zval current; php_period_obj *object; int current_index; } date_period_it; /* {{{ date_period_it_invalidate_current */ -static void date_period_it_invalidate_current(zend_object_iterator *iter TSRMLS_DC) +static void date_period_it_invalidate_current(zend_object_iterator *iter) { date_period_it *iterator = (date_period_it *)iter; - if (iterator->current) { + if (Z_TYPE(iterator->current) != IS_UNDEF) { zval_ptr_dtor(&iterator->current); - iterator->current = NULL; + ZVAL_UNDEF(&iterator->current); } } /* }}} */ - /* {{{ date_period_it_dtor */ -static void date_period_it_dtor(zend_object_iterator *iter TSRMLS_DC) +static void date_period_it_dtor(zend_object_iterator *iter) { date_period_it *iterator = (date_period_it *)iter; - date_period_it_invalidate_current(iter TSRMLS_CC); + date_period_it_invalidate_current(iter); - zval_ptr_dtor(&iterator->date_period_zval); - - efree(iterator); + zval_ptr_dtor(&iterator->intern.data); } /* }}} */ - /* {{{ date_period_it_has_more */ -static int date_period_it_has_more(zend_object_iterator *iter TSRMLS_DC) +static int date_period_it_has_more(zend_object_iterator *iter) { date_period_it *iterator = (date_period_it *)iter; - php_period_obj *object = iterator->object; + php_period_obj *object = Z_PHPPERIOD_P(&iterator->intern.data); timelib_time *it_time = object->current; /* apply modification if it's not the first iteration */ @@ -1913,68 +1873,62 @@ static int date_period_it_has_more(zend_object_iterator *iter TSRMLS_DC) } /* }}} */ - /* {{{ date_period_it_current_data */ -static void date_period_it_current_data(zend_object_iterator *iter, zval ***data TSRMLS_DC) +static zval *date_period_it_current_data(zend_object_iterator *iter) { date_period_it *iterator = (date_period_it *)iter; - php_period_obj *object = iterator->object; + php_period_obj *object = Z_PHPPERIOD_P(&iterator->intern.data); timelib_time *it_time = object->current; php_date_obj *newdateobj; /* Create new object */ - MAKE_STD_ZVAL(iterator->current); - php_date_instantiate(object->start_ce, iterator->current TSRMLS_CC); - newdateobj = (php_date_obj *) zend_object_store_get_object(iterator->current TSRMLS_CC); + php_date_instantiate(object->start_ce, &iterator->current); + newdateobj = Z_PHPDATE_P(&iterator->current); newdateobj->time = timelib_time_ctor(); *newdateobj->time = *it_time; if (it_time->tz_abbr) { - newdateobj->time->tz_abbr = strdup(it_time->tz_abbr); + newdateobj->time->tz_abbr = timelib_strdup(it_time->tz_abbr); } if (it_time->tz_info) { newdateobj->time->tz_info = it_time->tz_info; } - *data = &iterator->current; + return &iterator->current; } /* }}} */ - /* {{{ date_period_it_current_key */ -static void date_period_it_current_key(zend_object_iterator *iter, zval *key TSRMLS_DC) +static void date_period_it_current_key(zend_object_iterator *iter, zval *key) { date_period_it *iterator = (date_period_it *)iter; ZVAL_LONG(key, iterator->current_index); } /* }}} */ - /* {{{ date_period_it_move_forward */ -static void date_period_it_move_forward(zend_object_iterator *iter TSRMLS_DC) +static void date_period_it_move_forward(zend_object_iterator *iter) { date_period_it *iterator = (date_period_it *)iter; iterator->current_index++; - date_period_it_invalidate_current(iter TSRMLS_CC); + date_period_it_invalidate_current(iter); } /* }}} */ - /* {{{ date_period_it_rewind */ -static void date_period_it_rewind(zend_object_iterator *iter TSRMLS_DC) +static void date_period_it_rewind(zend_object_iterator *iter) { - date_period_it *iterator = (date_period_it *)iter; + date_period_it *iterator = (date_period_it *)iter; iterator->current_index = 0; if (iterator->object->current) { timelib_time_dtor(iterator->object->current); } iterator->object->current = timelib_time_clone(iterator->object->start); - date_period_it_invalidate_current(iter TSRMLS_CC); + date_period_it_invalidate_current(iter); } /* }}} */ - /* iterator handler table */ zend_object_iterator_funcs date_period_it_funcs = { date_period_it_dtor, @@ -1986,92 +1940,142 @@ zend_object_iterator_funcs date_period_it_funcs = { date_period_it_invalidate_current }; - - -zend_object_iterator *date_object_period_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC) +zend_object_iterator *date_object_period_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ { - date_period_it *iterator = emalloc(sizeof(date_period_it)); - php_period_obj *dpobj = (php_period_obj *)zend_object_store_get_object(object TSRMLS_CC); + date_period_it *iterator = emalloc(sizeof(date_period_it)); if (by_ref) { zend_error(E_ERROR, "An iterator cannot be used with foreach by reference"); } - Z_ADDREF_P(object); - iterator->intern.data = (void*) dpobj; + zend_iterator_init((zend_object_iterator*)iterator); + + ZVAL_COPY(&iterator->intern.data, object); iterator->intern.funcs = &date_period_it_funcs; - iterator->date_period_zval = object; - iterator->object = dpobj; - iterator->current = NULL; + iterator->object = Z_PHPPERIOD_P(object); + ZVAL_UNDEF(&iterator->current); return (zend_object_iterator*)iterator; -} +} /* }}} */ -static int implement_date_interface_handler(zend_class_entry *interface, zend_class_entry *implementor TSRMLS_DC) +static int implement_date_interface_handler(zend_class_entry *interface, zend_class_entry *implementor) /* {{{ */ { if (implementor->type == ZEND_USER_CLASS && - !instanceof_function(implementor, date_ce_date TSRMLS_CC) && - !instanceof_function(implementor, date_ce_immutable TSRMLS_CC) + !instanceof_function(implementor, date_ce_date) && + !instanceof_function(implementor, date_ce_immutable) ) { zend_error(E_ERROR, "DateTimeInterface can't be implemented by user classes"); } return SUCCESS; +} /* }}} */ + +static int date_interval_has_property(zval *object, zval *member, int type, void **cache_slot) /* {{{ */ +{ + php_interval_obj *obj; + zval tmp_member; + zval rv; + zval *prop; + int retval = 0; + + if (Z_TYPE_P(member) != IS_STRING) { + ZVAL_COPY(&tmp_member, member); + convert_to_string(&tmp_member); + member = &tmp_member; + cache_slot = NULL; + } + + obj = Z_PHPINTERVAL_P(object); + + if (!obj->initialized) { + retval = (zend_get_std_object_handlers())->has_property(object, member, type, cache_slot); + if (member == &tmp_member) { + zval_dtor(member); + } + return retval; + } + + prop = date_interval_read_property(object, member, type, cache_slot, &rv); + + if (prop != NULL) { + if (type == 2) { + retval = 1; + } else if (type == 1) { + retval = zend_is_true(prop); + } else if (type == 0) { + retval = (Z_TYPE(*prop) != IS_NULL); + } + } else { + retval = (zend_get_std_object_handlers())->has_property(object, member, type, cache_slot); + } + + if (member == &tmp_member) { + zval_dtor(member); + } + + return retval; + } +/* }}} */ -static void date_register_classes(TSRMLS_D) +static void date_register_classes(void) /* {{{ */ { zend_class_entry ce_date, ce_immutable, ce_timezone, ce_interval, ce_period, ce_interface; INIT_CLASS_ENTRY(ce_interface, "DateTimeInterface", date_funcs_interface); - date_ce_interface = zend_register_internal_interface(&ce_interface TSRMLS_CC); + date_ce_interface = zend_register_internal_interface(&ce_interface); date_ce_interface->interface_gets_implemented = implement_date_interface_handler; INIT_CLASS_ENTRY(ce_date, "DateTime", date_funcs_date); ce_date.create_object = date_object_new_date; - date_ce_date = zend_register_internal_class_ex(&ce_date, NULL, NULL TSRMLS_CC); + date_ce_date = zend_register_internal_class_ex(&ce_date, NULL); memcpy(&date_object_handlers_date, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); + date_object_handlers_date.offset = XtOffsetOf(php_date_obj, std); + date_object_handlers_date.free_obj = date_object_free_storage_date; date_object_handlers_date.clone_obj = date_object_clone_date; date_object_handlers_date.compare_objects = date_object_compare_date; date_object_handlers_date.get_properties = date_object_get_properties; date_object_handlers_date.get_gc = date_object_get_gc; - zend_class_implements(date_ce_date TSRMLS_CC, 1, date_ce_interface); + zend_class_implements(date_ce_date, 1, date_ce_interface); #define REGISTER_DATE_CLASS_CONST_STRING(const_name, value) \ - zend_declare_class_constant_stringl(date_ce_date, const_name, sizeof(const_name)-1, value, sizeof(value)-1 TSRMLS_CC); - - REGISTER_DATE_CLASS_CONST_STRING("ATOM", DATE_FORMAT_RFC3339); - REGISTER_DATE_CLASS_CONST_STRING("COOKIE", DATE_FORMAT_COOKIE); - REGISTER_DATE_CLASS_CONST_STRING("ISO8601", DATE_FORMAT_ISO8601); - REGISTER_DATE_CLASS_CONST_STRING("RFC822", DATE_FORMAT_RFC822); - REGISTER_DATE_CLASS_CONST_STRING("RFC850", DATE_FORMAT_RFC850); - REGISTER_DATE_CLASS_CONST_STRING("RFC1036", DATE_FORMAT_RFC1036); - REGISTER_DATE_CLASS_CONST_STRING("RFC1123", DATE_FORMAT_RFC1123); - REGISTER_DATE_CLASS_CONST_STRING("RFC2822", DATE_FORMAT_RFC2822); - REGISTER_DATE_CLASS_CONST_STRING("RFC3339", DATE_FORMAT_RFC3339); - REGISTER_DATE_CLASS_CONST_STRING("RSS", DATE_FORMAT_RFC1123); - REGISTER_DATE_CLASS_CONST_STRING("W3C", DATE_FORMAT_RFC3339); + zend_declare_class_constant_stringl(date_ce_date, const_name, sizeof(const_name)-1, value, sizeof(value)-1); + + REGISTER_DATE_CLASS_CONST_STRING("ATOM", DATE_FORMAT_RFC3339); + REGISTER_DATE_CLASS_CONST_STRING("COOKIE", DATE_FORMAT_COOKIE); + REGISTER_DATE_CLASS_CONST_STRING("ISO8601", DATE_FORMAT_ISO8601); + REGISTER_DATE_CLASS_CONST_STRING("RFC822", DATE_FORMAT_RFC822); + REGISTER_DATE_CLASS_CONST_STRING("RFC850", DATE_FORMAT_RFC850); + REGISTER_DATE_CLASS_CONST_STRING("RFC1036", DATE_FORMAT_RFC1036); + REGISTER_DATE_CLASS_CONST_STRING("RFC1123", DATE_FORMAT_RFC1123); + REGISTER_DATE_CLASS_CONST_STRING("RFC2822", DATE_FORMAT_RFC2822); + REGISTER_DATE_CLASS_CONST_STRING("RFC3339", DATE_FORMAT_RFC3339); + REGISTER_DATE_CLASS_CONST_STRING("RFC3339_EXTENDED", DATE_FORMAT_RFC3339_EXTENDED); + REGISTER_DATE_CLASS_CONST_STRING("RSS", DATE_FORMAT_RFC1123); + REGISTER_DATE_CLASS_CONST_STRING("W3C", DATE_FORMAT_RFC3339); INIT_CLASS_ENTRY(ce_immutable, "DateTimeImmutable", date_funcs_immutable); ce_immutable.create_object = date_object_new_date; - date_ce_immutable = zend_register_internal_class_ex(&ce_immutable, NULL, NULL TSRMLS_CC); + date_ce_immutable = zend_register_internal_class_ex(&ce_immutable, NULL); memcpy(&date_object_handlers_immutable, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); date_object_handlers_immutable.clone_obj = date_object_clone_date; date_object_handlers_immutable.compare_objects = date_object_compare_date; date_object_handlers_immutable.get_properties = date_object_get_properties; date_object_handlers_immutable.get_gc = date_object_get_gc; - zend_class_implements(date_ce_immutable TSRMLS_CC, 1, date_ce_interface); + zend_class_implements(date_ce_immutable, 1, date_ce_interface); INIT_CLASS_ENTRY(ce_timezone, "DateTimeZone", date_funcs_timezone); ce_timezone.create_object = date_object_new_timezone; - date_ce_timezone = zend_register_internal_class_ex(&ce_timezone, NULL, NULL TSRMLS_CC); + date_ce_timezone = zend_register_internal_class_ex(&ce_timezone, NULL); memcpy(&date_object_handlers_timezone, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); + date_object_handlers_timezone.offset = XtOffsetOf(php_timezone_obj, std); + date_object_handlers_timezone.free_obj = date_object_free_storage_timezone; date_object_handlers_timezone.clone_obj = date_object_clone_timezone; date_object_handlers_timezone.get_properties = date_object_get_properties_timezone; date_object_handlers_timezone.get_gc = date_object_get_gc_timezone; #define REGISTER_TIMEZONE_CLASS_CONST_STRING(const_name, value) \ - zend_declare_class_constant_long(date_ce_timezone, const_name, sizeof(const_name)-1, value TSRMLS_CC); + zend_declare_class_constant_long(date_ce_timezone, const_name, sizeof(const_name)-1, value); REGISTER_TIMEZONE_CLASS_CONST_STRING("AFRICA", PHP_DATE_TIMEZONE_GROUP_AFRICA); REGISTER_TIMEZONE_CLASS_CONST_STRING("AMERICA", PHP_DATE_TIMEZONE_GROUP_AMERICA); @@ -2090,9 +2094,12 @@ static void date_register_classes(TSRMLS_D) INIT_CLASS_ENTRY(ce_interval, "DateInterval", date_funcs_interval); ce_interval.create_object = date_object_new_interval; - date_ce_interval = zend_register_internal_class_ex(&ce_interval, NULL, NULL TSRMLS_CC); + date_ce_interval = zend_register_internal_class_ex(&ce_interval, NULL); memcpy(&date_object_handlers_interval, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); + date_object_handlers_interval.offset = XtOffsetOf(php_interval_obj, std); + date_object_handlers_interval.free_obj = date_object_free_storage_interval; date_object_handlers_interval.clone_obj = date_object_clone_interval; + date_object_handlers_interval.has_property = date_interval_has_property; date_object_handlers_interval.read_property = date_interval_read_property; date_object_handlers_interval.write_property = date_interval_write_property; date_object_handlers_interval.get_properties = date_object_get_properties_interval; @@ -2101,11 +2108,13 @@ static void date_register_classes(TSRMLS_D) INIT_CLASS_ENTRY(ce_period, "DatePeriod", date_funcs_period); ce_period.create_object = date_object_new_period; - date_ce_period = zend_register_internal_class_ex(&ce_period, NULL, NULL TSRMLS_CC); + date_ce_period = zend_register_internal_class_ex(&ce_period, NULL); date_ce_period->get_iterator = date_object_period_get_iterator; date_ce_period->iterator_funcs.funcs = &date_period_it_funcs; - zend_class_implements(date_ce_period TSRMLS_CC, 1, zend_ce_traversable); + zend_class_implements(date_ce_period, 1, zend_ce_traversable); memcpy(&date_object_handlers_period, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); + date_object_handlers_period.offset = XtOffsetOf(php_period_obj, std); + date_object_handlers_period.free_obj = date_object_free_storage_period; date_object_handlers_period.clone_obj = date_object_clone_period; date_object_handlers_period.get_properties = date_object_get_properties_period; date_object_handlers_period.get_property_ptr_ptr = NULL; @@ -2114,80 +2123,66 @@ static void date_register_classes(TSRMLS_D) date_object_handlers_period.write_property = date_period_write_property; #define REGISTER_PERIOD_CLASS_CONST_STRING(const_name, value) \ - zend_declare_class_constant_long(date_ce_period, const_name, sizeof(const_name)-1, value TSRMLS_CC); + zend_declare_class_constant_long(date_ce_period, const_name, sizeof(const_name)-1, value); REGISTER_PERIOD_CLASS_CONST_STRING("EXCLUDE_START_DATE", PHP_DATE_PERIOD_EXCLUDE_START_DATE); -} +} /* }}} */ -static inline zend_object_value date_object_new_date_ex(zend_class_entry *class_type, php_date_obj **ptr TSRMLS_DC) +static inline zend_object *date_object_new_date_ex(zend_class_entry *class_type, int init_props) /* {{{ */ { php_date_obj *intern; - zend_object_value retval; - - intern = emalloc(sizeof(php_date_obj)); - memset(intern, 0, sizeof(php_date_obj)); - if (ptr) { - *ptr = intern; - } - zend_object_std_init(&intern->std, class_type TSRMLS_CC); - object_properties_init(&intern->std, class_type); + intern = ecalloc(1, sizeof(php_date_obj) + zend_object_properties_size(class_type)); - retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) date_object_free_storage_date, NULL TSRMLS_CC); - retval.handlers = &date_object_handlers_date; + zend_object_std_init(&intern->std, class_type); + if (init_props) { + object_properties_init(&intern->std, class_type); + } + intern->std.handlers = &date_object_handlers_date; - return retval; -} + return &intern->std; +} /* }}} */ -static zend_object_value date_object_new_date(zend_class_entry *class_type TSRMLS_DC) +static zend_object *date_object_new_date(zend_class_entry *class_type) /* {{{ */ { - return date_object_new_date_ex(class_type, NULL TSRMLS_CC); -} + return date_object_new_date_ex(class_type, 1); +} /* }}} */ -static zend_object_value date_object_clone_date(zval *this_ptr TSRMLS_DC) +static zend_object *date_object_clone_date(zval *this_ptr) /* {{{ */ { - php_date_obj *new_obj = NULL; - php_date_obj *old_obj = (php_date_obj *) zend_object_store_get_object(this_ptr TSRMLS_CC); - zend_object_value new_ov = date_object_new_date_ex(old_obj->std.ce, &new_obj TSRMLS_CC); + php_date_obj *old_obj = Z_PHPDATE_P(this_ptr); + php_date_obj *new_obj = php_date_obj_from_obj(date_object_new_date_ex(old_obj->std.ce, 0)); - zend_objects_clone_members(&new_obj->std, new_ov, &old_obj->std, Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC); + zend_objects_clone_members(&new_obj->std, &old_obj->std); if (!old_obj->time) { - return new_ov; + return &new_obj->std; } /* this should probably moved to a new `timelib_time *timelime_time_clone(timelib_time *)` */ new_obj->time = timelib_time_ctor(); *new_obj->time = *old_obj->time; if (old_obj->time->tz_abbr) { - new_obj->time->tz_abbr = strdup(old_obj->time->tz_abbr); + new_obj->time->tz_abbr = timelib_strdup(old_obj->time->tz_abbr); } if (old_obj->time->tz_info) { new_obj->time->tz_info = old_obj->time->tz_info; } - return new_ov; -} + return &new_obj->std; +} /* }}} */ -static zval* date_clone_immutable(zval *object TSRMLS_DC) +static void date_clone_immutable(zval *object, zval *new_object) /* {{{ */ { - zval *new_object; - - ALLOC_ZVAL(new_object); - Z_OBJVAL_P(new_object) = date_object_clone_date(object TSRMLS_CC); - Z_SET_REFCOUNT_P(new_object, 1); - Z_SET_ISREF_P(new_object); - Z_TYPE_P(new_object) = IS_OBJECT; - - return new_object; -} + ZVAL_OBJ(new_object, date_object_clone_date(object)); +} /* }}} */ -static int date_object_compare_date(zval *d1, zval *d2 TSRMLS_DC) +static int date_object_compare_date(zval *d1, zval *d2) /* {{{ */ { - php_date_obj *o1 = zend_object_store_get_object(d1 TSRMLS_CC); - php_date_obj *o2 = zend_object_store_get_object(d2 TSRMLS_CC); + php_date_obj *o1 = Z_PHPDATE_P(d1); + php_date_obj *o2 = Z_PHPDATE_P(d2); if (!o1->time || !o2->time) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Trying to compare an incomplete DateTime or DateTimeImmutable object"); + php_error_docref(NULL, E_WARNING, "Trying to compare an incomplete DateTime or DateTimeImmutable object"); return 1; } if (!o1->time->sse_uptodate) { @@ -2198,110 +2193,100 @@ static int date_object_compare_date(zval *d1, zval *d2 TSRMLS_DC) } return timelib_time_compare(o1->time, o2->time); -} +} /* }}} */ -static HashTable *date_object_get_gc(zval *object, zval ***table, int *n TSRMLS_DC) +static HashTable *date_object_get_gc(zval *object, zval **table, int *n) /* {{{ */ { *table = NULL; *n = 0; - return zend_std_get_properties(object TSRMLS_CC); -} + return zend_std_get_properties(object); +} /* }}} */ -static HashTable *date_object_get_gc_timezone(zval *object, zval ***table, int *n TSRMLS_DC) +static HashTable *date_object_get_gc_timezone(zval *object, zval **table, int *n) /* {{{ */ { - *table = NULL; *n = 0; - return zend_std_get_properties(object TSRMLS_CC); -} + return zend_std_get_properties(object); +} /* }}} */ -static HashTable *date_object_get_properties(zval *object TSRMLS_DC) +static HashTable *date_object_get_properties(zval *object) /* {{{ */ { HashTable *props; - zval *zv; + zval zv; php_date_obj *dateobj; - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); - props = zend_std_get_properties(object TSRMLS_CC); + props = zend_std_get_properties(object); if (!dateobj->time) { return props; } /* first we add the date and time in ISO format */ - MAKE_STD_ZVAL(zv); - ZVAL_STRING(zv, date_format("Y-m-d H:i:s.u", 14, dateobj->time, 1), 0); - zend_hash_update(props, "date", 5, &zv, sizeof(zv), NULL); + ZVAL_STR(&zv, date_format("Y-m-d H:i:s.u", sizeof("Y-m-d H:i:s.u")-1, dateobj->time, 1)); + zend_hash_str_update(props, "date", sizeof("date")-1, &zv); /* then we add the timezone name (or similar) */ if (dateobj->time->is_localtime) { - MAKE_STD_ZVAL(zv); - ZVAL_LONG(zv, dateobj->time->zone_type); - zend_hash_update(props, "timezone_type", 14, &zv, sizeof(zv), NULL); + ZVAL_LONG(&zv, dateobj->time->zone_type); + zend_hash_str_update(props, "timezone_type", sizeof("timezone_type")-1, &zv); - MAKE_STD_ZVAL(zv); switch (dateobj->time->zone_type) { case TIMELIB_ZONETYPE_ID: - ZVAL_STRING(zv, dateobj->time->tz_info->name, 1); + ZVAL_STRING(&zv, dateobj->time->tz_info->name); break; case TIMELIB_ZONETYPE_OFFSET: { - char *tmpstr = emalloc(sizeof("UTC+05:00")); + zend_string *tmpstr = zend_string_alloc(sizeof("UTC+05:00")-1, 0); timelib_sll utc_offset = dateobj->time->z; - snprintf(tmpstr, sizeof("+05:00"), "%c%02d:%02d", + ZSTR_LEN(tmpstr) = snprintf(ZSTR_VAL(tmpstr), sizeof("+05:00"), "%c%02d:%02d", utc_offset > 0 ? '-' : '+', abs(utc_offset / 60), abs((utc_offset % 60))); - ZVAL_STRING(zv, tmpstr, 0); + ZVAL_NEW_STR(&zv, tmpstr); } break; case TIMELIB_ZONETYPE_ABBR: - ZVAL_STRING(zv, dateobj->time->tz_abbr, 1); + ZVAL_STRING(&zv, dateobj->time->tz_abbr); break; } - zend_hash_update(props, "timezone", 9, &zv, sizeof(zv), NULL); + zend_hash_str_update(props, "timezone", sizeof("timezone")-1, &zv); } return props; -} +} /* }}} */ -static inline zend_object_value date_object_new_timezone_ex(zend_class_entry *class_type, php_timezone_obj **ptr TSRMLS_DC) +static inline zend_object *date_object_new_timezone_ex(zend_class_entry *class_type, int init_props) /* {{{ */ { php_timezone_obj *intern; - zend_object_value retval; - intern = emalloc(sizeof(php_timezone_obj)); - memset(intern, 0, sizeof(php_timezone_obj)); - if (ptr) { - *ptr = intern; - } + intern = ecalloc(1, sizeof(php_timezone_obj) + zend_object_properties_size(class_type)); - zend_object_std_init(&intern->std, class_type TSRMLS_CC); - object_properties_init(&intern->std, class_type); - - retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) date_object_free_storage_timezone, NULL TSRMLS_CC); - retval.handlers = &date_object_handlers_timezone; + zend_object_std_init(&intern->std, class_type); + if (init_props) { + object_properties_init(&intern->std, class_type); + } + intern->std.handlers = &date_object_handlers_timezone; - return retval; -} + return &intern->std; +} /* }}} */ -static zend_object_value date_object_new_timezone(zend_class_entry *class_type TSRMLS_DC) +static zend_object *date_object_new_timezone(zend_class_entry *class_type) /* {{{ */ { - return date_object_new_timezone_ex(class_type, NULL TSRMLS_CC); -} + return date_object_new_timezone_ex(class_type, 1); +} /* }}} */ -static zend_object_value date_object_clone_timezone(zval *this_ptr TSRMLS_DC) +static zend_object *date_object_clone_timezone(zval *this_ptr) /* {{{ */ { - php_timezone_obj *new_obj = NULL; - php_timezone_obj *old_obj = (php_timezone_obj *) zend_object_store_get_object(this_ptr TSRMLS_CC); - zend_object_value new_ov = date_object_new_timezone_ex(old_obj->std.ce, &new_obj TSRMLS_CC); + php_timezone_obj *old_obj = Z_PHPTIMEZONE_P(this_ptr); + php_timezone_obj *new_obj = php_timezone_obj_from_obj(date_object_new_timezone_ex(old_obj->std.ce, 0)); - zend_objects_clone_members(&new_obj->std, new_ov, &old_obj->std, Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC); + zend_objects_clone_members(&new_obj->std, &old_obj->std); if (!old_obj->initialized) { - return new_ov; + return &new_obj->std; } new_obj->type = old_obj->type; @@ -2316,120 +2301,111 @@ static zend_object_value date_object_clone_timezone(zval *this_ptr TSRMLS_DC) case TIMELIB_ZONETYPE_ABBR: new_obj->tzi.z.utc_offset = old_obj->tzi.z.utc_offset; new_obj->tzi.z.dst = old_obj->tzi.z.dst; - new_obj->tzi.z.abbr = strdup(old_obj->tzi.z.abbr); + new_obj->tzi.z.abbr = timelib_strdup(old_obj->tzi.z.abbr); break; } - return new_ov; -} + return &new_obj->std; +} /* }}} */ -static HashTable *date_object_get_properties_timezone(zval *object TSRMLS_DC) +static HashTable *date_object_get_properties_timezone(zval *object) /* {{{ */ { HashTable *props; - zval *zv; + zval zv; php_timezone_obj *tzobj; - tzobj = (php_timezone_obj *) zend_object_store_get_object(object TSRMLS_CC); + tzobj = Z_PHPTIMEZONE_P(object); - props = zend_std_get_properties(object TSRMLS_CC); + props = zend_std_get_properties(object); if (!tzobj->initialized) { return props; } - MAKE_STD_ZVAL(zv); - ZVAL_LONG(zv, tzobj->type); - zend_hash_update(props, "timezone_type", 14, &zv, sizeof(zv), NULL); + ZVAL_LONG(&zv, tzobj->type); + zend_hash_str_update(props, "timezone_type", sizeof("timezone_type")-1, &zv); - MAKE_STD_ZVAL(zv); switch (tzobj->type) { case TIMELIB_ZONETYPE_ID: - ZVAL_STRING(zv, tzobj->tzi.tz->name, 1); + ZVAL_STRING(&zv, tzobj->tzi.tz->name); break; case TIMELIB_ZONETYPE_OFFSET: { - char *tmpstr = emalloc(sizeof("UTC+05:00")); + zend_string *tmpstr = zend_string_alloc(sizeof("UTC+05:00")-1, 0); - snprintf(tmpstr, sizeof("+05:00"), "%c%02d:%02d", + ZSTR_LEN(tmpstr) = snprintf(ZSTR_VAL(tmpstr), sizeof("+05:00"), "%c%02d:%02d", tzobj->tzi.utc_offset > 0 ? '-' : '+', abs(tzobj->tzi.utc_offset / 60), abs((tzobj->tzi.utc_offset % 60))); - ZVAL_STRING(zv, tmpstr, 0); + ZVAL_NEW_STR(&zv, tmpstr); } break; case TIMELIB_ZONETYPE_ABBR: - ZVAL_STRING(zv, tzobj->tzi.z.abbr, 1); + ZVAL_STRING(&zv, tzobj->tzi.z.abbr); break; } - zend_hash_update(props, "timezone", 9, &zv, sizeof(zv), NULL); + zend_hash_str_update(props, "timezone", sizeof("timezone")-1, &zv); return props; -} +} /* }}} */ -static inline zend_object_value date_object_new_interval_ex(zend_class_entry *class_type, php_interval_obj **ptr TSRMLS_DC) +static inline zend_object *date_object_new_interval_ex(zend_class_entry *class_type, int init_props) /* {{{ */ { php_interval_obj *intern; - zend_object_value retval; - - intern = emalloc(sizeof(php_interval_obj)); - memset(intern, 0, sizeof(php_interval_obj)); - if (ptr) { - *ptr = intern; - } - zend_object_std_init(&intern->std, class_type TSRMLS_CC); - object_properties_init(&intern->std, class_type); + intern = ecalloc(1, sizeof(php_interval_obj) + zend_object_properties_size(class_type)); - retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) date_object_free_storage_interval, NULL TSRMLS_CC); - retval.handlers = &date_object_handlers_interval; + zend_object_std_init(&intern->std, class_type); + if (init_props) { + object_properties_init(&intern->std, class_type); + } + intern->std.handlers = &date_object_handlers_interval; - return retval; -} + return &intern->std; +} /* }}} */ -static zend_object_value date_object_new_interval(zend_class_entry *class_type TSRMLS_DC) +static zend_object *date_object_new_interval(zend_class_entry *class_type) /* {{{ */ { - return date_object_new_interval_ex(class_type, NULL TSRMLS_CC); -} + return date_object_new_interval_ex(class_type, 1); +} /* }}} */ -static zend_object_value date_object_clone_interval(zval *this_ptr TSRMLS_DC) +static zend_object *date_object_clone_interval(zval *this_ptr) /* {{{ */ { - php_interval_obj *new_obj = NULL; - php_interval_obj *old_obj = (php_interval_obj *) zend_object_store_get_object(this_ptr TSRMLS_CC); - zend_object_value new_ov = date_object_new_interval_ex(old_obj->std.ce, &new_obj TSRMLS_CC); + php_interval_obj *old_obj = Z_PHPINTERVAL_P(this_ptr); + php_interval_obj *new_obj = php_interval_obj_from_obj(date_object_new_interval_ex(old_obj->std.ce, 0)); - zend_objects_clone_members(&new_obj->std, new_ov, &old_obj->std, Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC); + zend_objects_clone_members(&new_obj->std, &old_obj->std); /** FIX ME ADD CLONE STUFF **/ - return new_ov; -} + return &new_obj->std; +} /* }}} */ -static HashTable *date_object_get_gc_interval(zval *object, zval ***table, int *n TSRMLS_DC) +static HashTable *date_object_get_gc_interval(zval *object, zval **table, int *n) /* {{{ */ { *table = NULL; *n = 0; - return zend_std_get_properties(object TSRMLS_CC); -} + return zend_std_get_properties(object); +} /* }}} */ -static HashTable *date_object_get_properties_interval(zval *object TSRMLS_DC) +static HashTable *date_object_get_properties_interval(zval *object) /* {{{ */ { HashTable *props; - zval *zv; + zval zv; php_interval_obj *intervalobj; - intervalobj = (php_interval_obj *) zend_object_store_get_object(object TSRMLS_CC); + intervalobj = Z_PHPINTERVAL_P(object); - props = zend_std_get_properties(object TSRMLS_CC); + props = zend_std_get_properties(object); if (!intervalobj->initialized) { return props; } #define PHP_DATE_INTERVAL_ADD_PROPERTY(n,f) \ - MAKE_STD_ZVAL(zv); \ - ZVAL_LONG(zv, (long)intervalobj->diff->f); \ - zend_hash_update(props, n, strlen(n) + 1, &zv, sizeof(zv), NULL); + ZVAL_LONG(&zv, (zend_long)intervalobj->diff->f); \ + zend_hash_str_update(props, n, sizeof(n)-1, &zv); PHP_DATE_INTERVAL_ADD_PROPERTY("y", y); PHP_DATE_INTERVAL_ADD_PROPERTY("m", m); @@ -2444,9 +2420,8 @@ static HashTable *date_object_get_properties_interval(zval *object TSRMLS_DC) if (intervalobj->diff->days != -99999) { PHP_DATE_INTERVAL_ADD_PROPERTY("days", days); } else { - MAKE_STD_ZVAL(zv); - ZVAL_FALSE(zv); - zend_hash_update(props, "days", 5, &zv, sizeof(zv), NULL); + ZVAL_FALSE(&zv); + zend_hash_str_update(props, "days", sizeof("days")-1, &zv); } PHP_DATE_INTERVAL_ADD_PROPERTY("special_type", special.type); PHP_DATE_INTERVAL_ADD_PROPERTY("special_amount", special.amount); @@ -2454,80 +2429,72 @@ static HashTable *date_object_get_properties_interval(zval *object TSRMLS_DC) PHP_DATE_INTERVAL_ADD_PROPERTY("have_special_relative", have_special_relative); return props; -} +} /* }}} */ -static inline zend_object_value date_object_new_period_ex(zend_class_entry *class_type, php_period_obj **ptr TSRMLS_DC) +static inline zend_object *date_object_new_period_ex(zend_class_entry *class_type, int init_props) /* {{{ */ { php_period_obj *intern; - zend_object_value retval; - intern = emalloc(sizeof(php_period_obj)); - memset(intern, 0, sizeof(php_period_obj)); - if (ptr) { - *ptr = intern; - } + intern = ecalloc(1, sizeof(php_period_obj) + zend_object_properties_size(class_type)); - zend_object_std_init(&intern->std, class_type TSRMLS_CC); - object_properties_init(&intern->std, class_type); + zend_object_std_init(&intern->std, class_type); + if (init_props) { + object_properties_init(&intern->std, class_type); + } - retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t)zend_objects_destroy_object, (zend_objects_free_object_storage_t) date_object_free_storage_period, NULL TSRMLS_CC); - retval.handlers = &date_object_handlers_period; + intern->std.handlers = &date_object_handlers_period; - return retval; -} + return &intern->std; +} /* }}} */ -static zend_object_value date_object_new_period(zend_class_entry *class_type TSRMLS_DC) +static zend_object *date_object_new_period(zend_class_entry *class_type) /* {{{ */ { - return date_object_new_period_ex(class_type, NULL TSRMLS_CC); -} + return date_object_new_period_ex(class_type, 1); +} /* }}} */ -static zend_object_value date_object_clone_period(zval *this_ptr TSRMLS_DC) +static zend_object *date_object_clone_period(zval *this_ptr) /* {{{ */ { - php_period_obj *new_obj = NULL; - php_period_obj *old_obj = (php_period_obj *) zend_object_store_get_object(this_ptr TSRMLS_CC); - zend_object_value new_ov = date_object_new_period_ex(old_obj->std.ce, &new_obj TSRMLS_CC); + php_period_obj *old_obj = Z_PHPPERIOD_P(this_ptr); + php_period_obj *new_obj = php_period_obj_from_obj(date_object_new_period_ex(old_obj->std.ce, 0)); - zend_objects_clone_members(&new_obj->std, new_ov, &old_obj->std, Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC); + zend_objects_clone_members(&new_obj->std, &old_obj->std); /** FIX ME ADD CLONE STUFF **/ - return new_ov; -} + return &new_obj->std; +} /* }}} */ -static void date_object_free_storage_date(void *object TSRMLS_DC) +static void date_object_free_storage_date(zend_object *object) /* {{{ */ { - php_date_obj *intern = (php_date_obj *)object; + php_date_obj *intern = php_date_obj_from_obj(object); if (intern->time) { timelib_time_dtor(intern->time); } - zend_object_std_dtor(&intern->std TSRMLS_CC); - efree(object); -} + zend_object_std_dtor(&intern->std); +} /* }}} */ -static void date_object_free_storage_timezone(void *object TSRMLS_DC) +static void date_object_free_storage_timezone(zend_object *object) /* {{{ */ { - php_timezone_obj *intern = (php_timezone_obj *)object; + php_timezone_obj *intern = php_timezone_obj_from_obj(object); if (intern->type == TIMELIB_ZONETYPE_ABBR) { - free(intern->tzi.z.abbr); + timelib_free(intern->tzi.z.abbr); } - zend_object_std_dtor(&intern->std TSRMLS_CC); - efree(object); -} + zend_object_std_dtor(&intern->std); +} /* }}} */ -static void date_object_free_storage_interval(void *object TSRMLS_DC) +static void date_object_free_storage_interval(zend_object *object) /* {{{ */ { - php_interval_obj *intern = (php_interval_obj *)object; + php_interval_obj *intern = php_interval_obj_from_obj(object); timelib_rel_time_dtor(intern->diff); - zend_object_std_dtor(&intern->std TSRMLS_CC); - efree(object); -} + zend_object_std_dtor(&intern->std); +} /* }}} */ -static void date_object_free_storage_period(void *object TSRMLS_DC) +static void date_object_free_storage_period(zend_object *object) /* {{{ */ { - php_period_obj *intern = (php_period_obj *)object; + php_period_obj *intern = php_period_obj_from_obj(object); if (intern->start) { timelib_time_dtor(intern->start); @@ -2542,36 +2509,35 @@ static void date_object_free_storage_period(void *object TSRMLS_DC) } timelib_rel_time_dtor(intern->interval); - zend_object_std_dtor(&intern->std TSRMLS_CC); - efree(object); -} + zend_object_std_dtor(&intern->std); +} /* }}} */ /* Advanced Interface */ -PHPAPI zval *php_date_instantiate(zend_class_entry *pce, zval *object TSRMLS_DC) +PHPAPI zval *php_date_instantiate(zend_class_entry *pce, zval *object) /* {{{ */ { object_init_ex(object, pce); return object; -} +} /* }}} */ /* Helper function used to store the latest found warnings and errors while * parsing, from either strtotime or parse_from_format. */ -static void update_errors_warnings(timelib_error_container *last_errors TSRMLS_DC) +static void update_errors_warnings(timelib_error_container *last_errors) /* {{{ */ { if (DATEG(last_errors)) { timelib_error_container_dtor(DATEG(last_errors)); DATEG(last_errors) = NULL; } DATEG(last_errors) = last_errors; -} +} /* }}} */ -PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int time_str_len, char *format, zval *timezone_object, int ctor TSRMLS_DC) +PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, size_t time_str_len, char *format, zval *timezone_object, int ctor) /* {{{ */ { timelib_time *now; timelib_tzinfo *tzi = NULL; timelib_error_container *err = NULL; int type = TIMELIB_ZONETYPE_ID, new_dst = 0; char *new_abbr = NULL; - timelib_sll new_offset; + timelib_sll new_offset = 0; if (dateobj->time) { timelib_time_dtor(dateobj->time); @@ -2583,12 +2549,12 @@ PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, } /* update last errors and warnings */ - update_errors_warnings(err TSRMLS_CC); + update_errors_warnings(err); if (ctor && err && err->error_count) { /* spit out the first library error message, at least */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", time_str, + php_error_docref(NULL, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", time_str, err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message); } if (err && err->error_count) { @@ -2600,7 +2566,7 @@ PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, if (timezone_object) { php_timezone_obj *tzobj; - tzobj = (php_timezone_obj *) zend_object_store_get_object(timezone_object TSRMLS_CC); + tzobj = Z_PHPTIMEZONE_P(timezone_object); switch (tzobj->type) { case TIMELIB_ZONETYPE_ID: tzi = tzobj->tzi.tz; @@ -2611,14 +2577,14 @@ PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, case TIMELIB_ZONETYPE_ABBR: new_offset = tzobj->tzi.z.utc_offset; new_dst = tzobj->tzi.z.dst; - new_abbr = strdup(tzobj->tzi.z.abbr); + new_abbr = timelib_strdup(tzobj->tzi.z.abbr); break; } type = tzobj->type; } else if (dateobj->time->tz_info) { tzi = dateobj->time->tz_info; } else { - tzi = get_timezone_info(TSRMLS_C); + tzi = get_timezone_info(); } now = timelib_time_ctor(); @@ -2647,7 +2613,7 @@ PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, timelib_time_dtor(now); return 1; -} +} /* }}} */ /* {{{ proto DateTime date_create([string time[, DateTimeZone object]]) Returns new DateTime object @@ -2656,19 +2622,17 @@ PHP_FUNCTION(date_create) { zval *timezone_object = NULL; char *time_str = NULL; - int time_str_len = 0; - zval datetime_object; + size_t time_str_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sO!", &time_str, &time_str_len, &timezone_object, date_ce_timezone) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sO!", &time_str, &time_str_len, &timezone_object, date_ce_timezone) == FAILURE) { RETURN_FALSE; } - php_date_instantiate(date_ce_date, &datetime_object TSRMLS_CC); - if (!php_date_initialize(zend_object_store_get_object(&datetime_object TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 0 TSRMLS_CC)) { - zval_dtor(&datetime_object); + php_date_instantiate(date_ce_date, return_value); + if (!php_date_initialize(Z_PHPDATE_P(return_value), time_str, time_str_len, NULL, timezone_object, 0)) { + zval_ptr_dtor(return_value); RETURN_FALSE; } - RETVAL_ZVAL(&datetime_object, 0, 0); } /* }}} */ @@ -2679,19 +2643,17 @@ PHP_FUNCTION(date_create_immutable) { zval *timezone_object = NULL; char *time_str = NULL; - int time_str_len = 0; - zval datetime_object; + size_t time_str_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sO!", &time_str, &time_str_len, &timezone_object, date_ce_timezone) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sO!", &time_str, &time_str_len, &timezone_object, date_ce_timezone) == FAILURE) { RETURN_FALSE; } - php_date_instantiate(date_ce_immutable, &datetime_object TSRMLS_CC); - if (!php_date_initialize(zend_object_store_get_object(&datetime_object TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 0 TSRMLS_CC)) { - zval_dtor(&datetime_object); + php_date_instantiate(date_ce_immutable, return_value); + if (!php_date_initialize(Z_PHPDATE_P(return_value), time_str, time_str_len, NULL, timezone_object, 0)) { + zval_ptr_dtor(return_value); RETURN_FALSE; } - RETVAL_ZVAL(&datetime_object, 0, 0); } /* }}} */ @@ -2702,19 +2664,17 @@ PHP_FUNCTION(date_create_from_format) { zval *timezone_object = NULL; char *time_str = NULL, *format_str = NULL; - int time_str_len = 0, format_str_len = 0; - zval datetime_object; + size_t time_str_len = 0, format_str_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|O", &format_str, &format_str_len, &time_str, &time_str_len, &timezone_object, date_ce_timezone) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|O!", &format_str, &format_str_len, &time_str, &time_str_len, &timezone_object, date_ce_timezone) == FAILURE) { RETURN_FALSE; } - php_date_instantiate(date_ce_date, &datetime_object TSRMLS_CC); - if (!php_date_initialize(zend_object_store_get_object(&datetime_object TSRMLS_CC), time_str, time_str_len, format_str, timezone_object, 0 TSRMLS_CC)) { - zval_dtor(&datetime_object); + php_date_instantiate(date_ce_date, return_value); + if (!php_date_initialize(Z_PHPDATE_P(return_value), time_str, time_str_len, format_str, timezone_object, 0)) { + zval_ptr_dtor(return_value); RETURN_FALSE; } - RETVAL_ZVAL(&datetime_object, 0, 0); } /* }}} */ @@ -2725,19 +2685,17 @@ PHP_FUNCTION(date_create_immutable_from_format) { zval *timezone_object = NULL; char *time_str = NULL, *format_str = NULL; - int time_str_len = 0, format_str_len = 0; - zval datetime_object; + size_t time_str_len = 0, format_str_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|O", &format_str, &format_str_len, &time_str, &time_str_len, &timezone_object, date_ce_timezone) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|O!", &format_str, &format_str_len, &time_str, &time_str_len, &timezone_object, date_ce_timezone) == FAILURE) { RETURN_FALSE; } - php_date_instantiate(date_ce_immutable, &datetime_object TSRMLS_CC); - if (!php_date_initialize(zend_object_store_get_object(&datetime_object TSRMLS_CC), time_str, time_str_len, format_str, timezone_object, 0 TSRMLS_CC)) { - zval_dtor(&datetime_object); + php_date_instantiate(date_ce_immutable, return_value); + if (!php_date_initialize(Z_PHPDATE_P(return_value), time_str, time_str_len, format_str, timezone_object, 0)) { + zval_ptr_dtor(return_value); RETURN_FALSE; } - RETVAL_ZVAL(&datetime_object, 0, 0); } /* }}} */ @@ -2748,14 +2706,16 @@ PHP_METHOD(DateTime, __construct) { zval *timezone_object = NULL; char *time_str = NULL; - int time_str_len = 0; + size_t time_str_len = 0; zend_error_handling error_handling; - zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); - if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sO!", &time_str, &time_str_len, &timezone_object, date_ce_timezone)) { - php_date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 1 TSRMLS_CC); + if (FAILURE == zend_parse_parameters_throw(ZEND_NUM_ARGS(), "|sO!", &time_str, &time_str_len, &timezone_object, date_ce_timezone)) { + return; } - zend_restore_error_handling(&error_handling TSRMLS_CC); + + zend_replace_error_handling(EH_THROW, NULL, &error_handling); + php_date_initialize(Z_PHPDATE_P(getThis()), time_str, time_str_len, NULL, timezone_object, 1); + zend_restore_error_handling(&error_handling); } /* }}} */ @@ -2766,14 +2726,16 @@ PHP_METHOD(DateTimeImmutable, __construct) { zval *timezone_object = NULL; char *time_str = NULL; - int time_str_len = 0; + size_t time_str_len = 0; zend_error_handling error_handling; - zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); - if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sO!", &time_str, &time_str_len, &timezone_object, date_ce_timezone)) { - php_date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 1 TSRMLS_CC); + if (FAILURE == zend_parse_parameters_throw(ZEND_NUM_ARGS(), "|sO!", &time_str, &time_str_len, &timezone_object, date_ce_timezone)) { + return; } - zend_restore_error_handling(&error_handling TSRMLS_CC); + + zend_replace_error_handling(EH_THROW, NULL, &error_handling); + php_date_initialize(Z_PHPDATE_P(getThis()), time_str, time_str_len, NULL, timezone_object, 1); + zend_restore_error_handling(&error_handling); } /* }}} */ @@ -2786,18 +2748,18 @@ PHP_METHOD(DateTimeImmutable, createFromMutable) php_date_obj *new_obj = NULL; php_date_obj *old_obj = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &datetime_object, date_ce_date) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &datetime_object, date_ce_date) == FAILURE) { return; } - php_date_instantiate(date_ce_immutable, return_value TSRMLS_CC); - old_obj = (php_date_obj *) zend_object_store_get_object(datetime_object TSRMLS_CC); - new_obj = (php_date_obj *) zend_object_store_get_object(return_value TSRMLS_CC); + php_date_instantiate(date_ce_immutable, return_value); + old_obj = Z_PHPDATE_P(datetime_object); + new_obj = Z_PHPDATE_P(return_value); new_obj->time = timelib_time_ctor(); *new_obj->time = *old_obj->time; if (old_obj->time->tz_abbr) { - new_obj->time->tz_abbr = strdup(old_obj->time->tz_abbr); + new_obj->time->tz_abbr = timelib_strdup(old_obj->time->tz_abbr); } if (old_obj->time->tz_info) { new_obj->time->tz_info = old_obj->time->tz_info; @@ -2805,26 +2767,28 @@ PHP_METHOD(DateTimeImmutable, createFromMutable) } /* }}} */ -static int php_date_initialize_from_hash(php_date_obj **dateobj, HashTable *myht TSRMLS_DC) +static int php_date_initialize_from_hash(php_date_obj **dateobj, HashTable *myht) { - zval **z_date = NULL; - zval **z_timezone = NULL; - zval **z_timezone_type = NULL; - zval *tmp_obj = NULL; + zval *z_date; + zval *z_timezone; + zval *z_timezone_type; + zval tmp_obj; timelib_tzinfo *tzi; php_timezone_obj *tzobj; - if (zend_hash_find(myht, "date", 5, (void**) &z_date) == SUCCESS && Z_TYPE_PP(z_date) == IS_STRING) { - if (zend_hash_find(myht, "timezone_type", 14, (void**) &z_timezone_type) == SUCCESS && Z_TYPE_PP(z_timezone_type) == IS_LONG) { - if (zend_hash_find(myht, "timezone", 9, (void**) &z_timezone) == SUCCESS && Z_TYPE_PP(z_timezone) == IS_STRING) { - - switch (Z_LVAL_PP(z_timezone_type)) { + z_date = zend_hash_str_find(myht, "date", sizeof("data")-1); + if (z_date && Z_TYPE_P(z_date) == IS_STRING) { + z_timezone_type = zend_hash_str_find(myht, "timezone_type", sizeof("timezone_type")-1); + if (z_timezone_type && Z_TYPE_P(z_timezone_type) == IS_LONG) { + z_timezone = zend_hash_str_find(myht, "timezone", sizeof("timezone")-1); + if (z_timezone && Z_TYPE_P(z_timezone) == IS_STRING) { + switch (Z_LVAL_P(z_timezone_type)) { case TIMELIB_ZONETYPE_OFFSET: case TIMELIB_ZONETYPE_ABBR: { - char *tmp = emalloc(Z_STRLEN_PP(z_date) + Z_STRLEN_PP(z_timezone) + 2); + char *tmp = emalloc(Z_STRLEN_P(z_date) + Z_STRLEN_P(z_timezone) + 2); int ret; - snprintf(tmp, Z_STRLEN_PP(z_date) + Z_STRLEN_PP(z_timezone) + 2, "%s %s", Z_STRVAL_PP(z_date), Z_STRVAL_PP(z_timezone)); - ret = php_date_initialize(*dateobj, tmp, Z_STRLEN_PP(z_date) + Z_STRLEN_PP(z_timezone) + 1, NULL, NULL, 0 TSRMLS_CC); + snprintf(tmp, Z_STRLEN_P(z_date) + Z_STRLEN_P(z_timezone) + 2, "%s %s", Z_STRVAL_P(z_date), Z_STRVAL_P(z_timezone)); + ret = php_date_initialize(*dateobj, tmp, Z_STRLEN_P(z_date) + Z_STRLEN_P(z_timezone) + 1, NULL, NULL, 0); efree(tmp); return 1 == ret; } @@ -2832,19 +2796,18 @@ static int php_date_initialize_from_hash(php_date_obj **dateobj, HashTable *myht case TIMELIB_ZONETYPE_ID: { int ret; - tzi = php_date_parse_tzfile(Z_STRVAL_PP(z_timezone), DATE_TIMEZONEDB TSRMLS_CC); + tzi = php_date_parse_tzfile(Z_STRVAL_P(z_timezone), DATE_TIMEZONEDB); if (tzi == NULL) { return 0; } - ALLOC_INIT_ZVAL(tmp_obj); - tzobj = zend_object_store_get_object(php_date_instantiate(date_ce_timezone, tmp_obj TSRMLS_CC) TSRMLS_CC); + tzobj = Z_PHPTIMEZONE_P(php_date_instantiate(date_ce_timezone, &tmp_obj)); tzobj->type = TIMELIB_ZONETYPE_ID; tzobj->tzi.tz = tzi; tzobj->initialized = 1; - ret = php_date_initialize(*dateobj, Z_STRVAL_PP(z_date), Z_STRLEN_PP(z_date), NULL, tmp_obj, 0 TSRMLS_CC); + ret = php_date_initialize(*dateobj, Z_STRVAL_P(z_date), Z_STRLEN_P(z_date), NULL, &tmp_obj, 0); zval_ptr_dtor(&tmp_obj); return 1 == ret; } @@ -2853,7 +2816,7 @@ static int php_date_initialize_from_hash(php_date_obj **dateobj, HashTable *myht } } return 0; -} +} /* }}} */ /* {{{ proto DateTime::__set_state() */ @@ -2863,15 +2826,15 @@ PHP_METHOD(DateTime, __set_state) zval *array; HashTable *myht; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &array) == FAILURE) { RETURN_FALSE; } - myht = HASH_OF(array); + myht = Z_ARRVAL_P(array); - php_date_instantiate(date_ce_date, return_value TSRMLS_CC); - dateobj = (php_date_obj *) zend_object_store_get_object(return_value TSRMLS_CC); - if (!php_date_initialize_from_hash(&dateobj, myht TSRMLS_CC)) { + php_date_instantiate(date_ce_date, return_value); + dateobj = Z_PHPDATE_P(return_value); + if (!php_date_initialize_from_hash(&dateobj, myht)) { php_error(E_ERROR, "Invalid serialization data for DateTime object"); } } @@ -2885,15 +2848,15 @@ PHP_METHOD(DateTimeImmutable, __set_state) zval *array; HashTable *myht; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &array) == FAILURE) { RETURN_FALSE; } - myht = HASH_OF(array); + myht = Z_ARRVAL_P(array); - php_date_instantiate(date_ce_immutable, return_value TSRMLS_CC); - dateobj = (php_date_obj *) zend_object_store_get_object(return_value TSRMLS_CC); - if (!php_date_initialize_from_hash(&dateobj, myht TSRMLS_CC)) { + php_date_instantiate(date_ce_immutable, return_value); + dateobj = Z_PHPDATE_P(return_value); + if (!php_date_initialize_from_hash(&dateobj, myht)) { php_error(E_ERROR, "Invalid serialization data for DateTimeImmutable object"); } } @@ -2907,38 +2870,36 @@ PHP_METHOD(DateTime, __wakeup) php_date_obj *dateobj; HashTable *myht; - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); myht = Z_OBJPROP_P(object); - if (!php_date_initialize_from_hash(&dateobj, myht TSRMLS_CC)) { + if (!php_date_initialize_from_hash(&dateobj, myht)) { php_error(E_ERROR, "Invalid serialization data for DateTime object"); } } /* }}} */ /* Helper function used to add an associative array of warnings and errors to a zval */ -static void zval_from_error_container(zval *z, timelib_error_container *error) +static void zval_from_error_container(zval *z, timelib_error_container *error) /* {{{ */ { int i; - zval *element; + zval element; add_assoc_long(z, "warning_count", error->warning_count); - MAKE_STD_ZVAL(element); - array_init(element); + array_init(&element); for (i = 0; i < error->warning_count; i++) { - add_index_string(element, error->warning_messages[i].position, error->warning_messages[i].message, 1); + add_index_string(&element, error->warning_messages[i].position, error->warning_messages[i].message); } - add_assoc_zval(z, "warnings", element); + add_assoc_zval(z, "warnings", &element); add_assoc_long(z, "error_count", error->error_count); - MAKE_STD_ZVAL(element); - array_init(element); + array_init(&element); for (i = 0; i < error->error_count; i++) { - add_index_string(element, error->error_messages[i].position, error->error_messages[i].message, 1); + add_index_string(&element, error->error_messages[i].position, error->error_messages[i].message); } - add_assoc_zval(z, "errors", element); -} + add_assoc_zval(z, "errors", &element); +} /* }}} */ /* {{{ proto array date_get_last_errors() Returns the warnings and errors found while parsing a date/time string. @@ -2954,9 +2915,9 @@ PHP_FUNCTION(date_get_last_errors) } /* }}} */ -void php_date_do_return_parsed_time(INTERNAL_FUNCTION_PARAMETERS, timelib_time *parsed_time, struct timelib_error_container *error) +void php_date_do_return_parsed_time(INTERNAL_FUNCTION_PARAMETERS, timelib_time *parsed_time, struct timelib_error_container *error) /* {{{ */ { - zval *element; + zval element; array_init(return_value); #define PHP_DATE_PARSE_DATE_SET_TIME_ELEMENT(name, elem) \ @@ -2993,41 +2954,40 @@ void php_date_do_return_parsed_time(INTERNAL_FUNCTION_PARAMETERS, timelib_time * break; case TIMELIB_ZONETYPE_ID: if (parsed_time->tz_abbr) { - add_assoc_string(return_value, "tz_abbr", parsed_time->tz_abbr, 1); + add_assoc_string(return_value, "tz_abbr", parsed_time->tz_abbr); } if (parsed_time->tz_info) { - add_assoc_string(return_value, "tz_id", parsed_time->tz_info->name, 1); + add_assoc_string(return_value, "tz_id", parsed_time->tz_info->name); } break; case TIMELIB_ZONETYPE_ABBR: PHP_DATE_PARSE_DATE_SET_TIME_ELEMENT(zone, z); add_assoc_bool(return_value, "is_dst", parsed_time->dst); - add_assoc_string(return_value, "tz_abbr", parsed_time->tz_abbr, 1); + add_assoc_string(return_value, "tz_abbr", parsed_time->tz_abbr); break; } } if (parsed_time->have_relative) { - MAKE_STD_ZVAL(element); - array_init(element); - add_assoc_long(element, "year", parsed_time->relative.y); - add_assoc_long(element, "month", parsed_time->relative.m); - add_assoc_long(element, "day", parsed_time->relative.d); - add_assoc_long(element, "hour", parsed_time->relative.h); - add_assoc_long(element, "minute", parsed_time->relative.i); - add_assoc_long(element, "second", parsed_time->relative.s); + array_init(&element); + add_assoc_long(&element, "year", parsed_time->relative.y); + add_assoc_long(&element, "month", parsed_time->relative.m); + add_assoc_long(&element, "day", parsed_time->relative.d); + add_assoc_long(&element, "hour", parsed_time->relative.h); + add_assoc_long(&element, "minute", parsed_time->relative.i); + add_assoc_long(&element, "second", parsed_time->relative.s); if (parsed_time->relative.have_weekday_relative) { - add_assoc_long(element, "weekday", parsed_time->relative.weekday); + add_assoc_long(&element, "weekday", parsed_time->relative.weekday); } if (parsed_time->relative.have_special_relative && (parsed_time->relative.special.type == TIMELIB_SPECIAL_WEEKDAY)) { - add_assoc_long(element, "weekdays", parsed_time->relative.special.amount); + add_assoc_long(&element, "weekdays", parsed_time->relative.special.amount); } if (parsed_time->relative.first_last_day_of) { - add_assoc_bool(element, parsed_time->relative.first_last_day_of == TIMELIB_SPECIAL_FIRST_DAY_OF_MONTH ? "first_day_of_month" : "last_day_of_month", 1); + add_assoc_bool(&element, parsed_time->relative.first_last_day_of == TIMELIB_SPECIAL_FIRST_DAY_OF_MONTH ? "first_day_of_month" : "last_day_of_month", 1); } - add_assoc_zval(return_value, "relative", element); + add_assoc_zval(return_value, "relative", &element); } timelib_time_dtor(parsed_time); -} +} /* }}} */ /* {{{ proto array date_parse(string date) Returns associative array with detailed info about given date @@ -3035,11 +2995,11 @@ void php_date_do_return_parsed_time(INTERNAL_FUNCTION_PARAMETERS, timelib_time * PHP_FUNCTION(date_parse) { char *date; - int date_len; + size_t date_len; struct timelib_error_container *error; timelib_time *parsed_time; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &date, &date_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &date, &date_len) == FAILURE) { RETURN_FALSE; } @@ -3054,11 +3014,11 @@ PHP_FUNCTION(date_parse) PHP_FUNCTION(date_parse_from_format) { char *date, *format; - int date_len, format_len; + size_t date_len, format_len; struct timelib_error_container *error; timelib_time *parsed_time; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &format, &format_len, &date, &date_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &format, &format_len, &date, &date_len) == FAILURE) { RETURN_FALSE; } @@ -3075,37 +3035,37 @@ PHP_FUNCTION(date_format) zval *object; php_date_obj *dateobj; char *format; - int format_len; + size_t format_len; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &object, date_ce_interface, &format, &format_len) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &object, date_ce_interface, &format, &format_len) == FAILURE) { RETURN_FALSE; } - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); - RETURN_STRING(date_format(format, format_len, dateobj->time, dateobj->time->is_localtime), 0); + RETURN_STR(date_format(format, format_len, dateobj->time, dateobj->time->is_localtime)); } /* }}} */ -static int php_date_modify(zval *object, char *modify, int modify_len TSRMLS_DC) +static int php_date_modify(zval *object, char *modify, size_t modify_len) /* {{{ */ { php_date_obj *dateobj; timelib_time *tmp_time; timelib_error_container *err = NULL; - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); if (!(dateobj->time)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "The DateTime object has not been correctly initialized by its constructor"); + php_error_docref(NULL, E_WARNING, "The DateTime object has not been correctly initialized by its constructor"); return 0; } tmp_time = timelib_strtotime(modify, modify_len, &err, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); /* update last errors and warnings */ - update_errors_warnings(err TSRMLS_CC); + update_errors_warnings(err); if (err && err->error_count) { /* spit out the first library error message, at least */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", modify, + php_error_docref(NULL, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", modify, err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message); timelib_time_dtor(tmp_time); return 0; @@ -3145,9 +3105,9 @@ static int php_date_modify(zval *object, char *modify, int modify_len TSRMLS_DC) timelib_update_from_sse(dateobj->time); dateobj->time->have_relative = 0; memset(&dateobj->time->relative, 0, sizeof(dateobj->time->relative)); - + return 1; -} +} /* }}} */ /* {{{ proto DateTime date_modify(DateTime object, string modify) Alters the timestamp. @@ -3156,17 +3116,18 @@ PHP_FUNCTION(date_modify) { zval *object; char *modify; - int modify_len; + size_t modify_len; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &object, date_ce_date, &modify, &modify_len) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &object, date_ce_date, &modify, &modify_len) == FAILURE) { RETURN_FALSE; } - if (php_date_modify(object, modify, modify_len TSRMLS_CC)) { - RETURN_ZVAL(object, 1, 0); + if (!php_date_modify(object, modify, modify_len)) { + RETURN_FALSE; } - RETURN_FALSE; + Z_ADDREF_P(object); + ZVAL_COPY_VALUE(return_value, object); } /* }}} */ @@ -3174,38 +3135,38 @@ PHP_FUNCTION(date_modify) */ PHP_METHOD(DateTimeImmutable, modify) { - zval *object, *new_object; + zval *object, new_object; char *modify; - int modify_len; + size_t modify_len; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &object, date_ce_immutable, &modify, &modify_len) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &object, date_ce_immutable, &modify, &modify_len) == FAILURE) { RETURN_FALSE; } - - new_object = date_clone_immutable(object TSRMLS_CC); - if (php_date_modify(new_object, modify, modify_len TSRMLS_CC)) { - RETURN_ZVAL(new_object, 0, 1); + + date_clone_immutable(object, &new_object); + if (!php_date_modify(&new_object, modify, modify_len)) { + RETURN_FALSE; } - RETURN_FALSE; + ZVAL_COPY_VALUE(return_value, &new_object); } /* }}} */ -static void php_date_add(zval *object, zval *interval, zval *return_value TSRMLS_DC) +static void php_date_add(zval *object, zval *interval, zval *return_value) /* {{{ */ { php_date_obj *dateobj; php_interval_obj *intobj; timelib_time *new_time; - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); - intobj = (php_interval_obj *) zend_object_store_get_object(interval TSRMLS_CC); + intobj = Z_PHPINTERVAL_P(interval); DATE_CHECK_INITIALIZED(intobj->initialized, DateInterval); new_time = timelib_add(dateobj->time, intobj->diff); timelib_time_dtor(dateobj->time); dateobj->time = new_time; -} +} /* }}} */ /* {{{ proto DateTime date_add(DateTime object, DateInterval interval) Adds an interval to the current date in object. @@ -3214,13 +3175,14 @@ PHP_FUNCTION(date_add) { zval *object, *interval; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &object, date_ce_date, &interval, date_ce_interval) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "OO", &object, date_ce_date, &interval, date_ce_interval) == FAILURE) { RETURN_FALSE; } - php_date_add(object, interval, return_value TSRMLS_CC); + php_date_add(object, interval, return_value); - RETURN_ZVAL(object, 1, 0); + Z_ADDREF_P(object); + ZVAL_COPY_VALUE(return_value, object); } /* }}} */ @@ -3228,39 +3190,39 @@ PHP_FUNCTION(date_add) */ PHP_METHOD(DateTimeImmutable, add) { - zval *object, *interval, *new_object; + zval *object, *interval, new_object; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &object, date_ce_immutable, &interval, date_ce_interval) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "OO", &object, date_ce_immutable, &interval, date_ce_interval) == FAILURE) { RETURN_FALSE; } - new_object = date_clone_immutable(object TSRMLS_CC); - php_date_add(new_object, interval, return_value TSRMLS_CC); + date_clone_immutable(object, &new_object); + php_date_add(&new_object, interval, return_value); - RETURN_ZVAL(new_object, 0, 1); + ZVAL_COPY_VALUE(return_value, &new_object); } /* }}} */ -static void php_date_sub(zval *object, zval *interval, zval *return_value TSRMLS_DC) +static void php_date_sub(zval *object, zval *interval, zval *return_value) /* {{{ */ { php_date_obj *dateobj; php_interval_obj *intobj; timelib_time *new_time; - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); - intobj = (php_interval_obj *) zend_object_store_get_object(interval TSRMLS_CC); + intobj = Z_PHPINTERVAL_P(interval); DATE_CHECK_INITIALIZED(intobj->initialized, DateInterval); if (intobj->diff->have_special_relative) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Only non-special relative time specifications are supported for subtraction"); + php_error_docref(NULL, E_WARNING, "Only non-special relative time specifications are supported for subtraction"); return; } new_time = timelib_sub(dateobj->time, intobj->diff); timelib_time_dtor(dateobj->time); dateobj->time = new_time; -} +} /* }}} */ /* {{{ proto DateTime date_sub(DateTime object, DateInterval interval) Subtracts an interval to the current date in object. @@ -3269,13 +3231,14 @@ PHP_FUNCTION(date_sub) { zval *object, *interval; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &object, date_ce_date, &interval, date_ce_interval) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "OO", &object, date_ce_date, &interval, date_ce_interval) == FAILURE) { RETURN_FALSE; } - php_date_sub(object, interval, return_value TSRMLS_CC); + php_date_sub(object, interval, return_value); - RETURN_ZVAL(object, 1, 0); + Z_ADDREF_P(object); + ZVAL_COPY_VALUE(return_value, object); } /* }}} */ @@ -3283,16 +3246,16 @@ PHP_FUNCTION(date_sub) */ PHP_METHOD(DateTimeImmutable, sub) { - zval *object, *interval, *new_object; + zval *object, *interval, new_object; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &object, date_ce_immutable, &interval, date_ce_interval) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "OO", &object, date_ce_immutable, &interval, date_ce_interval) == FAILURE) { RETURN_FALSE; } - new_object = date_clone_immutable(object TSRMLS_CC); - php_date_sub(new_object, interval, return_value TSRMLS_CC); + date_clone_immutable(object, &new_object); + php_date_sub(&new_object, interval, return_value); - RETURN_ZVAL(new_object, 0, 1); + ZVAL_COPY_VALUE(return_value, &new_object); } /* }}} */ @@ -3310,7 +3273,7 @@ static void set_timezone_from_timelib_time(php_timezone_obj *tzobj, timelib_time case TIMELIB_ZONETYPE_ABBR: tzobj->tzi.z.utc_offset = t->z; tzobj->tzi.z.dst = t->dst; - tzobj->tzi.z.abbr = strdup(t->tz_abbr); + tzobj->tzi.z.abbr = timelib_strdup(t->tz_abbr); break; } } @@ -3325,14 +3288,14 @@ PHP_FUNCTION(date_timezone_get) php_date_obj *dateobj; php_timezone_obj *tzobj; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, date_ce_interface) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &object, date_ce_interface) == FAILURE) { RETURN_FALSE; } - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); if (dateobj->time->is_localtime/* && dateobj->time->tz_info*/) { - php_date_instantiate(date_ce_timezone, return_value TSRMLS_CC); - tzobj = (php_timezone_obj *) zend_object_store_get_object(return_value TSRMLS_CC); + php_date_instantiate(date_ce_timezone, return_value); + tzobj = Z_PHPTIMEZONE_P(return_value); set_timezone_from_timelib_time(tzobj, dateobj->time); } else { RETURN_FALSE; @@ -3340,14 +3303,14 @@ PHP_FUNCTION(date_timezone_get) } /* }}} */ -static void php_date_timezone_set(zval *object, zval *timezone_object, zval *return_value TSRMLS_DC) +static void php_date_timezone_set(zval *object, zval *timezone_object, zval *return_value) /* {{{ */ { php_date_obj *dateobj; php_timezone_obj *tzobj; - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); - tzobj = (php_timezone_obj *) zend_object_store_get_object(timezone_object TSRMLS_CC); + tzobj = Z_PHPTIMEZONE_P(timezone_object); switch (tzobj->type) { case TIMELIB_ZONETYPE_OFFSET: @@ -3361,7 +3324,7 @@ static void php_date_timezone_set(zval *object, zval *timezone_object, zval *ret break; } timelib_unixtime2local(dateobj->time, dateobj->time->sse); -} +} /* }}} */ /* {{{ proto DateTime date_timezone_set(DateTime object, DateTimeZone object) Sets the timezone for the DateTime object. @@ -3371,13 +3334,14 @@ PHP_FUNCTION(date_timezone_set) zval *object; zval *timezone_object; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &object, date_ce_date, &timezone_object, date_ce_timezone) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "OO", &object, date_ce_date, &timezone_object, date_ce_timezone) == FAILURE) { RETURN_FALSE; } - php_date_timezone_set(object, timezone_object, return_value TSRMLS_CC); + php_date_timezone_set(object, timezone_object, return_value); - RETURN_ZVAL(object, 1, 0); + Z_ADDREF_P(object); + ZVAL_COPY_VALUE(return_value, object); } /* }}} */ @@ -3385,17 +3349,17 @@ PHP_FUNCTION(date_timezone_set) */ PHP_METHOD(DateTimeImmutable, setTimezone) { - zval *object, *new_object; + zval *object, new_object; zval *timezone_object; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &object, date_ce_immutable, &timezone_object, date_ce_timezone) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "OO", &object, date_ce_immutable, &timezone_object, date_ce_timezone) == FAILURE) { RETURN_FALSE; } - new_object = date_clone_immutable(object TSRMLS_CC); - php_date_timezone_set(new_object, timezone_object, return_value TSRMLS_CC); + date_clone_immutable(object, &new_object); + php_date_timezone_set(&new_object, timezone_object, return_value); - RETURN_ZVAL(new_object, 0, 1); + ZVAL_COPY_VALUE(return_value, &new_object); } /* }}} */ @@ -3408,10 +3372,10 @@ PHP_FUNCTION(date_offset_get) php_date_obj *dateobj; timelib_time_offset *offset; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, date_ce_interface) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &object, date_ce_interface) == FAILURE) { RETURN_FALSE; } - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); if (dateobj->time->is_localtime/* && dateobj->time->tz_info*/) { switch (dateobj->time->zone_type) { @@ -3434,17 +3398,17 @@ PHP_FUNCTION(date_offset_get) } /* }}} */ -static void php_date_time_set(zval *object, long h, long i, long s, zval *return_value TSRMLS_DC) +static void php_date_time_set(zval *object, zend_long h, zend_long i, zend_long s, zval *return_value) /* {{{ */ { php_date_obj *dateobj; - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); dateobj->time->h = h; dateobj->time->i = i; dateobj->time->s = s; timelib_update_ts(dateobj->time, NULL); -} +} /* }}} */ /* {{{ proto DateTime date_time_set(DateTime object, long hour, long minute[, long second]) Sets the time. @@ -3452,15 +3416,16 @@ static void php_date_time_set(zval *object, long h, long i, long s, zval *return PHP_FUNCTION(date_time_set) { zval *object; - long h, i, s = 0; + zend_long h, i, s = 0; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll|l", &object, date_ce_date, &h, &i, &s) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Oll|l", &object, date_ce_date, &h, &i, &s) == FAILURE) { RETURN_FALSE; } - php_date_time_set(object, h, i, s, return_value TSRMLS_CC); + php_date_time_set(object, h, i, s, return_value); - RETURN_ZVAL(object, 1, 0); + Z_ADDREF_P(object); + ZVAL_COPY_VALUE(return_value, object); } /* }}} */ @@ -3468,31 +3433,31 @@ PHP_FUNCTION(date_time_set) */ PHP_METHOD(DateTimeImmutable, setTime) { - zval *object, *new_object; - long h, i, s = 0; + zval *object, new_object; + zend_long h, i, s = 0; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll|l", &object, date_ce_immutable, &h, &i, &s) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Oll|l", &object, date_ce_immutable, &h, &i, &s) == FAILURE) { RETURN_FALSE; } - new_object = date_clone_immutable(object TSRMLS_CC); - php_date_time_set(new_object, h, i, s, return_value TSRMLS_CC); + date_clone_immutable(object, &new_object); + php_date_time_set(&new_object, h, i, s, return_value); - RETURN_ZVAL(new_object, 0, 1); + ZVAL_COPY_VALUE(return_value, &new_object); } /* }}} */ -static void php_date_date_set(zval *object, long y, long m, long d, zval *return_value TSRMLS_DC) +static void php_date_date_set(zval *object, zend_long y, zend_long m, zend_long d, zval *return_value) /* {{{ */ { php_date_obj *dateobj; - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); dateobj->time->y = y; dateobj->time->m = m; dateobj->time->d = d; timelib_update_ts(dateobj->time, NULL); -} +} /* }}} */ /* {{{ proto DateTime date_date_set(DateTime object, long year, long month, long day) Sets the date. @@ -3500,15 +3465,16 @@ static void php_date_date_set(zval *object, long y, long m, long d, zval *return PHP_FUNCTION(date_date_set) { zval *object; - long y, m, d; + zend_long y, m, d; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olll", &object, date_ce_date, &y, &m, &d) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Olll", &object, date_ce_date, &y, &m, &d) == FAILURE) { RETURN_FALSE; } - php_date_date_set(object, y, m, d, return_value TSRMLS_CC); + php_date_date_set(object, y, m, d, return_value); - RETURN_ZVAL(object, 1, 0); + Z_ADDREF_P(object); + ZVAL_COPY_VALUE(return_value, object); } /* }}} */ @@ -3516,25 +3482,25 @@ PHP_FUNCTION(date_date_set) */ PHP_METHOD(DateTimeImmutable, setDate) { - zval *object, *new_object; - long y, m, d; + zval *object, new_object; + zend_long y, m, d; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olll", &object, date_ce_immutable, &y, &m, &d) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Olll", &object, date_ce_immutable, &y, &m, &d) == FAILURE) { RETURN_FALSE; } - new_object = date_clone_immutable(object TSRMLS_CC); - php_date_date_set(new_object, y, m, d, return_value TSRMLS_CC); + date_clone_immutable(object, &new_object); + php_date_date_set(&new_object, y, m, d, return_value); - RETURN_ZVAL(new_object, 0, 1); + ZVAL_COPY_VALUE(return_value, &new_object); } /* }}} */ -static void php_date_isodate_set(zval *object, long y, long w, long d, zval *return_value TSRMLS_DC) +static void php_date_isodate_set(zval *object, zend_long y, zend_long w, zend_long d, zval *return_value) /* {{{ */ { php_date_obj *dateobj; - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); dateobj->time->y = y; dateobj->time->m = 1; @@ -3544,7 +3510,7 @@ static void php_date_isodate_set(zval *object, long y, long w, long d, zval *ret dateobj->time->have_relative = 1; timelib_update_ts(dateobj->time, NULL); -} +} /* }}} */ /* {{{ proto DateTime date_isodate_set(DateTime object, long year, long week[, long day]) Sets the ISO date. @@ -3552,15 +3518,16 @@ static void php_date_isodate_set(zval *object, long y, long w, long d, zval *ret PHP_FUNCTION(date_isodate_set) { zval *object; - long y, w, d = 1; + zend_long y, w, d = 1; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll|l", &object, date_ce_date, &y, &w, &d) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Oll|l", &object, date_ce_date, &y, &w, &d) == FAILURE) { RETURN_FALSE; } - php_date_isodate_set(object, y, w, d, return_value TSRMLS_CC); + php_date_isodate_set(object, y, w, d, return_value); - RETURN_ZVAL(object, 1, 0); + Z_ADDREF_P(object); + ZVAL_COPY_VALUE(return_value, object); } /* }}} */ @@ -3568,29 +3535,29 @@ PHP_FUNCTION(date_isodate_set) */ PHP_METHOD(DateTimeImmutable, setISODate) { - zval *object, *new_object; - long y, w, d = 1; + zval *object, new_object; + zend_long y, w, d = 1; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll|l", &object, date_ce_immutable, &y, &w, &d) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Oll|l", &object, date_ce_immutable, &y, &w, &d) == FAILURE) { RETURN_FALSE; } - new_object = date_clone_immutable(object TSRMLS_CC); - php_date_isodate_set(new_object, y, w, d, return_value TSRMLS_CC); + date_clone_immutable(object, &new_object); + php_date_isodate_set(&new_object, y, w, d, return_value); - RETURN_ZVAL(new_object, 0, 1); + ZVAL_COPY_VALUE(return_value, &new_object); } /* }}} */ -static void php_date_timestamp_set(zval *object, long timestamp, zval *return_value TSRMLS_DC) +static void php_date_timestamp_set(zval *object, zend_long timestamp, zval *return_value) /* {{{ */ { php_date_obj *dateobj; - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); timelib_unixtime2local(dateobj->time, (timelib_sll)timestamp); timelib_update_ts(dateobj->time, NULL); -} +} /* }}} */ /* {{{ proto DateTime date_timestamp_set(DateTime object, long unixTimestamp) Sets the date and time based on an Unix timestamp. @@ -3598,15 +3565,16 @@ static void php_date_timestamp_set(zval *object, long timestamp, zval *return_va PHP_FUNCTION(date_timestamp_set) { zval *object; - long timestamp; + zend_long timestamp; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &object, date_ce_date, ×tamp) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Ol", &object, date_ce_date, ×tamp) == FAILURE) { RETURN_FALSE; } - php_date_timestamp_set(object, timestamp, return_value TSRMLS_CC); + php_date_timestamp_set(object, timestamp, return_value); - RETURN_ZVAL(object, 1, 0); + Z_ADDREF_P(object); + ZVAL_COPY_VALUE(return_value, object); } /* }}} */ @@ -3614,17 +3582,17 @@ PHP_FUNCTION(date_timestamp_set) */ PHP_METHOD(DateTimeImmutable, setTimestamp) { - zval *object, *new_object; - long timestamp; + zval *object, new_object; + zend_long timestamp; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &object, date_ce_immutable, ×tamp) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Ol", &object, date_ce_immutable, ×tamp) == FAILURE) { RETURN_FALSE; } - new_object = date_clone_immutable(object TSRMLS_CC); - php_date_timestamp_set(new_object, timestamp, return_value TSRMLS_CC); + date_clone_immutable(object, &new_object); + php_date_timestamp_set(&new_object, timestamp, return_value); - RETURN_ZVAL(new_object, 0, 1); + ZVAL_COPY_VALUE(return_value, &new_object); } /* }}} */ @@ -3635,13 +3603,13 @@ PHP_FUNCTION(date_timestamp_get) { zval *object; php_date_obj *dateobj; - long timestamp; + zend_long timestamp; int error; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, date_ce_interface) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &object, date_ce_interface) == FAILURE) { RETURN_FALSE; } - dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC); + dateobj = Z_PHPDATE_P(object); DATE_CHECK_INITIALIZED(dateobj->time, DateTime); timelib_update_ts(dateobj->time, NULL); @@ -3662,20 +3630,20 @@ PHP_FUNCTION(date_diff) zval *object1, *object2; php_date_obj *dateobj1, *dateobj2; php_interval_obj *interval; - long absolute = 0; + zend_bool absolute = 0; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO|l", &object1, date_ce_interface, &object2, date_ce_interface, &absolute) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "OO|b", &object1, date_ce_interface, &object2, date_ce_interface, &absolute) == FAILURE) { RETURN_FALSE; } - dateobj1 = (php_date_obj *) zend_object_store_get_object(object1 TSRMLS_CC); - dateobj2 = (php_date_obj *) zend_object_store_get_object(object2 TSRMLS_CC); + dateobj1 = Z_PHPDATE_P(object1); + dateobj2 = Z_PHPDATE_P(object2); DATE_CHECK_INITIALIZED(dateobj1->time, DateTimeInterface); DATE_CHECK_INITIALIZED(dateobj2->time, DateTimeInterface); timelib_update_ts(dateobj1->time, NULL); timelib_update_ts(dateobj2->time, NULL); - php_date_instantiate(date_ce_interval, return_value TSRMLS_CC); - interval = zend_object_store_get_object(return_value TSRMLS_CC); + php_date_instantiate(date_ce_interval, return_value); + interval = Z_PHPINTERVAL_P(return_value); interval->diff = timelib_diff(dateobj1->time, dateobj2->time); if (absolute) { interval->diff->invert = 0; @@ -3684,29 +3652,30 @@ PHP_FUNCTION(date_diff) } /* }}} */ -static int timezone_initialize(php_timezone_obj *tzobj, /*const*/ char *tz, size_t tz_len TSRMLS_DC) +static int timezone_initialize(php_timezone_obj *tzobj, /*const*/ char *tz, size_t tz_len) /* {{{ */ { timelib_time *dummy_t = ecalloc(1, sizeof(timelib_time)); int dst, not_found; char *orig_tz = tz; if (strlen(tz) != tz_len) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Timezone must not contain null bytes"); + php_error_docref(NULL, E_WARNING, "Timezone must not contain null bytes"); + efree(dummy_t); return FAILURE; } dummy_t->z = timelib_parse_zone(&tz, &dst, dummy_t, ¬_found, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); if (not_found) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown or bad timezone (%s)", orig_tz); + php_error_docref(NULL, E_WARNING, "Unknown or bad timezone (%s)", orig_tz); efree(dummy_t); return FAILURE; } else { set_timezone_from_timelib_time(tzobj, dummy_t); - free(dummy_t->tz_abbr); + timelib_free(dummy_t->tz_abbr); efree(dummy_t); return SUCCESS; } -} +} /* }}} */ /* {{{ proto DateTimeZone timezone_open(string timezone) Returns new DateTimeZone object @@ -3714,14 +3683,15 @@ static int timezone_initialize(php_timezone_obj *tzobj, /*const*/ char *tz, size PHP_FUNCTION(timezone_open) { char *tz; - int tz_len; + size_t tz_len; php_timezone_obj *tzobj; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &tz, &tz_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &tz, &tz_len) == FAILURE) { RETURN_FALSE; } - tzobj = zend_object_store_get_object(php_date_instantiate(date_ce_timezone, return_value TSRMLS_CC) TSRMLS_CC); - if (SUCCESS != timezone_initialize(tzobj, tz, tz_len TSRMLS_CC)) { + tzobj = Z_PHPTIMEZONE_P(php_date_instantiate(date_ce_timezone, return_value)); + if (SUCCESS != timezone_initialize(tzobj, tz, tz_len)) { + zval_ptr_dtor(return_value); RETURN_FALSE; } } @@ -3733,35 +3703,41 @@ PHP_FUNCTION(timezone_open) PHP_METHOD(DateTimeZone, __construct) { char *tz; - int tz_len; + size_t tz_len; php_timezone_obj *tzobj; zend_error_handling error_handling; - zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); - if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &tz, &tz_len)) { - tzobj = zend_object_store_get_object(getThis() TSRMLS_CC); - if (FAILURE == timezone_initialize(tzobj, tz, tz_len TSRMLS_CC)) { - ZVAL_NULL(getThis()); - } + if (FAILURE == zend_parse_parameters_throw(ZEND_NUM_ARGS(), "s", &tz, &tz_len)) { + return; } - zend_restore_error_handling(&error_handling TSRMLS_CC); + + zend_replace_error_handling(EH_THROW, NULL, &error_handling); + tzobj = Z_PHPTIMEZONE_P(getThis()); + timezone_initialize(tzobj, tz, tz_len); + zend_restore_error_handling(&error_handling); } /* }}} */ -static int php_date_timezone_initialize_from_hash(zval **return_value, php_timezone_obj **tzobj, HashTable *myht TSRMLS_DC) +static int php_date_timezone_initialize_from_hash(zval **return_value, php_timezone_obj **tzobj, HashTable *myht) /* {{{ */ { - zval **z_timezone = NULL; - zval **z_timezone_type = NULL; + zval *z_timezone; + zval *z_timezone_type; - if (zend_hash_find(myht, "timezone_type", 14, (void**) &z_timezone_type) == SUCCESS && Z_TYPE_PP(z_timezone_type) == IS_LONG) { - if (zend_hash_find(myht, "timezone", 9, (void**) &z_timezone) == SUCCESS && Z_TYPE_PP(z_timezone) == IS_STRING) { - if (SUCCESS == timezone_initialize(*tzobj, Z_STRVAL_PP(z_timezone), Z_STRLEN_PP(z_timezone) TSRMLS_CC)) { + if ((z_timezone_type = zend_hash_str_find(myht, "timezone_type", sizeof("timezone_type") - 1)) != NULL) { + if ((z_timezone = zend_hash_str_find(myht, "timezone", sizeof("timezone") - 1)) != NULL) { + if (Z_TYPE_P(z_timezone_type) != IS_LONG) { + return FAILURE; + } + if (Z_TYPE_P(z_timezone) != IS_STRING) { + return FAILURE; + } + if (SUCCESS == timezone_initialize(*tzobj, Z_STRVAL_P(z_timezone), Z_STRLEN_P(z_timezone))) { return SUCCESS; } } } return FAILURE; -} +} /* }}} */ /* {{{ proto DateTimeZone::__set_state() * */ @@ -3771,16 +3747,16 @@ PHP_METHOD(DateTimeZone, __set_state) zval *array; HashTable *myht; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &array) == FAILURE) { RETURN_FALSE; } - myht = HASH_OF(array); + myht = Z_ARRVAL_P(array); - php_date_instantiate(date_ce_timezone, return_value TSRMLS_CC); - tzobj = (php_timezone_obj *) zend_object_store_get_object(return_value TSRMLS_CC); - if(php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht TSRMLS_CC) != SUCCESS) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Timezone initialization failed"); + php_date_instantiate(date_ce_timezone, return_value); + tzobj = Z_PHPTIMEZONE_P(return_value); + if(php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht) != SUCCESS) { + php_error_docref(NULL, E_ERROR, "Timezone initialization failed"); } } /* }}} */ @@ -3793,12 +3769,12 @@ PHP_METHOD(DateTimeZone, __wakeup) php_timezone_obj *tzobj; HashTable *myht; - tzobj = (php_timezone_obj *) zend_object_store_get_object(object TSRMLS_CC); + tzobj = Z_PHPTIMEZONE_P(object); myht = Z_OBJPROP_P(object); - - if(php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht TSRMLS_CC) != SUCCESS) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Timezone initialization failed"); + + if(php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht) != SUCCESS) { + php_error_docref(NULL, E_ERROR, "Timezone initialization failed"); } } /* }}} */ @@ -3811,30 +3787,30 @@ PHP_FUNCTION(timezone_name_get) zval *object; php_timezone_obj *tzobj; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, date_ce_timezone) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &object, date_ce_timezone) == FAILURE) { RETURN_FALSE; } - tzobj = (php_timezone_obj *) zend_object_store_get_object(object TSRMLS_CC); + tzobj = Z_PHPTIMEZONE_P(object); DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone); switch (tzobj->type) { case TIMELIB_ZONETYPE_ID: - RETURN_STRING(tzobj->tzi.tz->name, 1); + RETURN_STRING(tzobj->tzi.tz->name); break; case TIMELIB_ZONETYPE_OFFSET: { - char *tmpstr = emalloc(sizeof("UTC+05:00")); + zend_string *tmpstr = zend_string_alloc(sizeof("UTC+05:00")-1, 0); timelib_sll utc_offset = tzobj->tzi.utc_offset; - snprintf(tmpstr, sizeof("+05:00"), "%c%02d:%02d", + ZSTR_LEN(tmpstr) = snprintf(ZSTR_VAL(tmpstr), sizeof("+05:00"), "%c%02d:%02d", utc_offset > 0 ? '-' : '+', abs(utc_offset / 60), abs((utc_offset % 60))); - RETURN_STRING(tmpstr, 0); + RETURN_NEW_STR(tmpstr); } break; case TIMELIB_ZONETYPE_ABBR: - RETURN_STRING(tzobj->tzi.z.abbr, 1); + RETURN_STRING(tzobj->tzi.z.abbr); break; } } @@ -3847,24 +3823,24 @@ PHP_FUNCTION(timezone_name_from_abbr) { char *abbr; char *tzid; - int abbr_len; - long gmtoffset = -1; - long isdst = -1; + size_t abbr_len; + zend_long gmtoffset = -1; + zend_long isdst = -1; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &abbr, &abbr_len, &gmtoffset, &isdst) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|ll", &abbr, &abbr_len, &gmtoffset, &isdst) == FAILURE) { RETURN_FALSE; } tzid = timelib_timezone_id_from_abbr(abbr, gmtoffset, isdst); if (tzid) { - RETURN_STRING(tzid, 1); + RETURN_STRING(tzid); } else { RETURN_FALSE; } } /* }}} */ -/* {{{ proto long timezone_offset_get(DateTimeZone object, DateTimeInterface object) +/* {{{ proto long timezone_offset_get(DateTimeZone object, DateTimeInterface datetime) Returns the timezone offset. */ PHP_FUNCTION(timezone_offset_get) @@ -3874,12 +3850,12 @@ PHP_FUNCTION(timezone_offset_get) php_date_obj *dateobj; timelib_time_offset *offset; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &object, date_ce_timezone, &dateobject, date_ce_interface) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "OO", &object, date_ce_timezone, &dateobject, date_ce_interface) == FAILURE) { RETURN_FALSE; } - tzobj = (php_timezone_obj *) zend_object_store_get_object(object TSRMLS_CC); + tzobj = Z_PHPTIMEZONE_P(object); DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone); - dateobj = (php_date_obj *) zend_object_store_get_object(dateobject TSRMLS_CC); + dateobj = Z_PHPDATE_P(dateobject); DATE_CHECK_INITIALIZED(dateobj->time, DateTimeInterface); switch (tzobj->type) { @@ -3903,45 +3879,43 @@ PHP_FUNCTION(timezone_offset_get) */ PHP_FUNCTION(timezone_transitions_get) { - zval *object, *element; + zval *object, element; php_timezone_obj *tzobj; unsigned int i, begin = 0, found; - long timestamp_begin = LONG_MIN, timestamp_end = LONG_MAX; + zend_long timestamp_begin = ZEND_LONG_MIN, timestamp_end = ZEND_LONG_MAX; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|ll", &object, date_ce_timezone, ×tamp_begin, ×tamp_end) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|ll", &object, date_ce_timezone, ×tamp_begin, ×tamp_end) == FAILURE) { RETURN_FALSE; } - tzobj = (php_timezone_obj *) zend_object_store_get_object(object TSRMLS_CC); + tzobj = Z_PHPTIMEZONE_P(object); DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone); if (tzobj->type != TIMELIB_ZONETYPE_ID) { RETURN_FALSE; } #define add_nominal() \ - MAKE_STD_ZVAL(element); \ - array_init(element); \ - add_assoc_long(element, "ts", timestamp_begin); \ - add_assoc_string(element, "time", php_format_date(DATE_FORMAT_ISO8601, 13, timestamp_begin, 0 TSRMLS_CC), 0); \ - add_assoc_long(element, "offset", tzobj->tzi.tz->type[0].offset); \ - add_assoc_bool(element, "isdst", tzobj->tzi.tz->type[0].isdst); \ - add_assoc_string(element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[0].abbr_idx], 1); \ - add_next_index_zval(return_value, element); + array_init(&element); \ + add_assoc_long(&element, "ts", timestamp_begin); \ + add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601, 13, timestamp_begin, 0)); \ + add_assoc_long(&element, "offset", tzobj->tzi.tz->type[0].offset); \ + add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[0].isdst); \ + add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[0].abbr_idx]); \ + add_next_index_zval(return_value, &element); #define add(i,ts) \ - MAKE_STD_ZVAL(element); \ - array_init(element); \ - add_assoc_long(element, "ts", ts); \ - add_assoc_string(element, "time", php_format_date(DATE_FORMAT_ISO8601, 13, ts, 0 TSRMLS_CC), 0); \ - add_assoc_long(element, "offset", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].offset); \ - add_assoc_bool(element, "isdst", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].isdst); \ - add_assoc_string(element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].abbr_idx], 1); \ - add_next_index_zval(return_value, element); + array_init(&element); \ + add_assoc_long(&element, "ts", ts); \ + add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601, 13, ts, 0)); \ + add_assoc_long(&element, "offset", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].offset); \ + add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].isdst); \ + add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].abbr_idx]); \ + add_next_index_zval(return_value, &element); #define add_last() add(tzobj->tzi.tz->bit32.timecnt - 1, timestamp_begin) array_init(return_value); - if (timestamp_begin == LONG_MIN) { + if (timestamp_begin == ZEND_LONG_MIN) { add_nominal(); begin = 0; found = 1; @@ -3988,24 +3962,24 @@ PHP_FUNCTION(timezone_location_get) zval *object; php_timezone_obj *tzobj; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &object, date_ce_timezone) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &object, date_ce_timezone) == FAILURE) { RETURN_FALSE; } - tzobj = (php_timezone_obj *) zend_object_store_get_object(object TSRMLS_CC); + tzobj = Z_PHPTIMEZONE_P(object); DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone); if (tzobj->type != TIMELIB_ZONETYPE_ID) { RETURN_FALSE; } array_init(return_value); - add_assoc_string(return_value, "country_code", tzobj->tzi.tz->location.country_code, 1); + add_assoc_string(return_value, "country_code", tzobj->tzi.tz->location.country_code); add_assoc_double(return_value, "latitude", tzobj->tzi.tz->location.latitude); add_assoc_double(return_value, "longitude", tzobj->tzi.tz->location.longitude); - add_assoc_string(return_value, "comments", tzobj->tzi.tz->location.comments, 1); + add_assoc_string(return_value, "comments", tzobj->tzi.tz->location.comments); } /* }}} */ -static int date_interval_initialize(timelib_rel_time **rt, /*const*/ char *format, int format_length TSRMLS_DC) +static int date_interval_initialize(timelib_rel_time **rt, /*const*/ char *format, size_t format_length) /* {{{ */ { timelib_time *b = NULL, *e = NULL; timelib_rel_time *p = NULL; @@ -4016,7 +3990,7 @@ static int date_interval_initialize(timelib_rel_time **rt, /*const*/ char *forma timelib_strtointerval(format, format_length, &b, &e, &p, &r, &errors); if (errors->error_count > 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown or bad format (%s)", format); + php_error_docref(NULL, E_WARNING, "Unknown or bad format (%s)", format); retval = FAILURE; } else { if(p) { @@ -4029,35 +4003,37 @@ static int date_interval_initialize(timelib_rel_time **rt, /*const*/ char *forma *rt = timelib_diff(b, e); retval = SUCCESS; } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse interval (%s)", format); + php_error_docref(NULL, E_WARNING, "Failed to parse interval (%s)", format); retval = FAILURE; } } } timelib_error_container_dtor(errors); + timelib_free(b); + timelib_free(e); return retval; -} +} /* }}} */ /* {{{ date_interval_read_property */ -zval *date_interval_read_property(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) +zval *date_interval_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) { php_interval_obj *obj; zval *retval; zval tmp_member; timelib_sll value = -1; - if (member->type != IS_STRING) { + if (Z_TYPE_P(member) != IS_STRING) { tmp_member = *member; zval_copy_ctor(&tmp_member); convert_to_string(&tmp_member); member = &tmp_member; - key = NULL; + cache_slot = NULL; } - obj = (php_interval_obj *)zend_objects_get_address(object TSRMLS_CC); + obj = Z_PHPINTERVAL_P(object); if (!obj->initialized) { - retval = (zend_get_std_object_handlers())->read_property(object, member, type, key TSRMLS_CC); + retval = (zend_get_std_object_handlers())->read_property(object, member, type, cache_slot, rv); if (member == &tmp_member) { zval_dtor(member); } @@ -4079,7 +4055,7 @@ zval *date_interval_read_property(zval *object, zval *member, int type, const ze GET_VALUE_FROM_STRUCT(invert, "invert"); GET_VALUE_FROM_STRUCT(days, "days"); /* didn't find any */ - retval = (zend_get_std_object_handlers())->read_property(object, member, type, key TSRMLS_CC); + retval = (zend_get_std_object_handlers())->read_property(object, member, type, cache_slot, rv); if (member == &tmp_member) { zval_dtor(member); @@ -4088,8 +4064,7 @@ zval *date_interval_read_property(zval *object, zval *member, int type, const ze return retval; } while(0); - ALLOC_INIT_ZVAL(retval); - Z_SET_REFCOUNT_P(retval, 0); + retval = rv; if (value != -99999) { ZVAL_LONG(retval, value); @@ -4106,23 +4081,23 @@ zval *date_interval_read_property(zval *object, zval *member, int type, const ze /* }}} */ /* {{{ date_interval_write_property */ -void date_interval_write_property(zval *object, zval *member, zval *value, const zend_literal *key TSRMLS_DC) +void date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot) { php_interval_obj *obj; - zval tmp_member, tmp_value; + zval tmp_member; - if (member->type != IS_STRING) { + if (Z_TYPE_P(member) != IS_STRING) { tmp_member = *member; zval_copy_ctor(&tmp_member); convert_to_string(&tmp_member); member = &tmp_member; - key = NULL; + cache_slot = NULL; } - obj = (php_interval_obj *)zend_objects_get_address(object TSRMLS_CC); + obj = Z_PHPINTERVAL_P(object); if (!obj->initialized) { - (zend_get_std_object_handlers())->write_property(object, member, value, key TSRMLS_CC); + (zend_get_std_object_handlers())->write_property(object, member, value, cache_slot); if (member == &tmp_member) { zval_dtor(member); } @@ -4131,16 +4106,7 @@ void date_interval_write_property(zval *object, zval *member, zval *value, const #define SET_VALUE_FROM_STRUCT(n,m) \ if (strcmp(Z_STRVAL_P(member), m) == 0) { \ - if (value->type != IS_LONG) { \ - tmp_value = *value; \ - zval_copy_ctor(&tmp_value); \ - convert_to_long(&tmp_value); \ - value = &tmp_value; \ - } \ - obj->diff->n = Z_LVAL_P(value); \ - if (value == &tmp_value) { \ - zval_dtor(value); \ - } \ + obj->diff->n = zval_get_long(value); \ break; \ } @@ -4153,7 +4119,7 @@ void date_interval_write_property(zval *object, zval *member, zval *value, const SET_VALUE_FROM_STRUCT(s, "s"); SET_VALUE_FROM_STRUCT(invert, "invert"); /* didn't find any */ - (zend_get_std_object_handlers())->write_property(object, member, value, key TSRMLS_CC); + (zend_get_std_object_handlers())->write_property(object, member, value, cache_slot); } while(0); if (member == &tmp_member) { @@ -4169,35 +4135,35 @@ void date_interval_write_property(zval *object, zval *member, zval *value, const PHP_METHOD(DateInterval, __construct) { char *interval_string = NULL; - int interval_string_length; + size_t interval_string_length; php_interval_obj *diobj; timelib_rel_time *reltime; zend_error_handling error_handling; - zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &interval_string, &interval_string_length) == SUCCESS) { - if (date_interval_initialize(&reltime, interval_string, interval_string_length TSRMLS_CC) == SUCCESS) { - diobj = zend_object_store_get_object(getThis() TSRMLS_CC); - diobj->diff = reltime; - diobj->initialized = 1; - } else { - ZVAL_NULL(getThis()); - } + if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "s", &interval_string, &interval_string_length) == FAILURE) { + return; + } + + zend_replace_error_handling(EH_THROW, NULL, &error_handling); + if (date_interval_initialize(&reltime, interval_string, interval_string_length) == SUCCESS) { + diobj = Z_PHPINTERVAL_P(getThis()); + diobj->diff = reltime; + diobj->initialized = 1; } - zend_restore_error_handling(&error_handling TSRMLS_CC); + zend_restore_error_handling(&error_handling); } /* }}} */ -static int php_date_interval_initialize_from_hash(zval **return_value, php_interval_obj **intobj, HashTable *myht TSRMLS_DC) +static int php_date_interval_initialize_from_hash(zval **return_value, php_interval_obj **intobj, HashTable *myht) /* {{{ */ { (*intobj)->diff = timelib_rel_time_ctor(); #define PHP_DATE_INTERVAL_READ_PROPERTY(element, member, itype, def) \ do { \ - zval **z_arg = NULL; \ - if (zend_hash_find(myht, element, strlen(element) + 1, (void**) &z_arg) == SUCCESS && Z_TYPE_PP(z_arg) == IS_LONG) { \ - (*intobj)->diff->member = (itype)Z_LVAL_PP(z_arg); \ + zval *z_arg = zend_hash_str_find(myht, element, sizeof(element) - 1); \ + if (z_arg && Z_TYPE_P(z_arg) <= IS_STRING) { \ + (*intobj)->diff->member = (itype)zval_get_long(z_arg); \ } else { \ (*intobj)->diff->member = (itype)def; \ } \ @@ -4205,17 +4171,11 @@ static int php_date_interval_initialize_from_hash(zval **return_value, php_inter #define PHP_DATE_INTERVAL_READ_PROPERTY_I64(element, member) \ do { \ - zval **z_arg = NULL; \ - if (zend_hash_find(myht, element, strlen(element) + 1, (void**) &z_arg) == SUCCESS) { \ - if (Z_TYPE_PP(z_arg) == IS_STRING) { \ - DATE_A64I((*intobj)->diff->member, Z_STRVAL_PP(z_arg)); \ - } else if (Z_TYPE_PP(z_arg) == IS_LONG || Z_TYPE_PP(z_arg) == IS_BOOL) { \ - (*intobj)->diff->member = (timelib_sll)Z_LVAL_PP(z_arg); \ - } else if (Z_TYPE_PP(z_arg) == IS_DOUBLE) { \ - (*intobj)->diff->member = (timelib_sll)Z_DVAL_PP(z_arg); \ - } else { \ - (*intobj)->diff->member = -1LL; \ - } \ + zval *z_arg = zend_hash_str_find(myht, element, sizeof(element) - 1); \ + if (z_arg && Z_TYPE_P(z_arg) <= IS_STRING) { \ + zend_string *str = zval_get_string(z_arg); \ + DATE_A64I((*intobj)->diff->member, ZSTR_VAL(str)); \ + zend_string_release(str); \ } else { \ (*intobj)->diff->member = -1LL; \ } \ @@ -4239,7 +4199,7 @@ static int php_date_interval_initialize_from_hash(zval **return_value, php_inter (*intobj)->initialized = 1; return 0; -} +} /* }}} */ /* {{{ proto DateInterval::__set_state() */ @@ -4249,15 +4209,15 @@ PHP_METHOD(DateInterval, __set_state) zval *array; HashTable *myht; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &array) == FAILURE) { RETURN_FALSE; } - myht = HASH_OF(array); + myht = Z_ARRVAL_P(array); - php_date_instantiate(date_ce_interval, return_value TSRMLS_CC); - intobj = (php_interval_obj *) zend_object_store_get_object(return_value TSRMLS_CC); - php_date_interval_initialize_from_hash(&return_value, &intobj, myht TSRMLS_CC); + php_date_instantiate(date_ce_interval, return_value); + intobj = Z_PHPINTERVAL_P(return_value); + php_date_interval_initialize_from_hash(&return_value, &intobj, myht); } /* }}} */ @@ -4269,32 +4229,33 @@ PHP_METHOD(DateInterval, __wakeup) php_interval_obj *intobj; HashTable *myht; - intobj = (php_interval_obj *) zend_object_store_get_object(object TSRMLS_CC); + intobj = Z_PHPINTERVAL_P(object); myht = Z_OBJPROP_P(object); - php_date_interval_initialize_from_hash(&return_value, &intobj, myht TSRMLS_CC); + php_date_interval_initialize_from_hash(&return_value, &intobj, myht); } /* }}} */ + /* {{{ proto DateInterval date_interval_create_from_date_string(string time) Uses the normal date parsers and sets up a DateInterval from the relative parts of the parsed string */ PHP_FUNCTION(date_interval_create_from_date_string) { char *time_str = NULL; - int time_str_len = 0; + size_t time_str_len = 0; timelib_time *time; timelib_error_container *err = NULL; php_interval_obj *diobj; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &time_str, &time_str_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &time_str, &time_str_len) == FAILURE) { RETURN_FALSE; } - php_date_instantiate(date_ce_interval, return_value TSRMLS_CC); + php_date_instantiate(date_ce_interval, return_value); time = timelib_strtotime(time_str, time_str_len, &err, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); - diobj = (php_interval_obj *) zend_object_store_get_object(return_value TSRMLS_CC); + diobj = Z_PHPINTERVAL_P(return_value); diobj->diff = timelib_rel_time_clone(&time->relative); diobj->initialized = 1; timelib_time_dtor(time); @@ -4303,14 +4264,14 @@ PHP_FUNCTION(date_interval_create_from_date_string) /* }}} */ /* {{{ date_interval_format - */ -static char *date_interval_format(char *format, int format_len, timelib_rel_time *t) +static zend_string *date_interval_format(char *format, size_t format_len, timelib_rel_time *t) { smart_str string = {0}; int i, length, have_format_spec = 0; char buffer[33]; if (!format_len) { - return STR_EMPTY_ALLOC(); + return ZSTR_EMPTY_ALLOC(); } for (i = 0; i < format_len; i++) { @@ -4331,8 +4292,8 @@ static char *date_interval_format(char *format, int format_len, timelib_rel_time case 'I': length = slprintf(buffer, 32, "%02d", (int) t->i); break; case 'i': length = slprintf(buffer, 32, "%d", (int) t->i); break; - case 'S': length = slprintf(buffer, 32, "%02ld", (long) t->s); break; - case 's': length = slprintf(buffer, 32, "%ld", (long) t->s); break; + case 'S': length = slprintf(buffer, 32, "%02" ZEND_LONG_FMT_SPEC, (zend_long) t->s); break; + case 's': length = slprintf(buffer, 32, ZEND_LONG_FMT, (zend_long) t->s); break; case 'a': { if ((int) t->days != -99999) { @@ -4360,11 +4321,11 @@ static char *date_interval_format(char *format, int format_len, timelib_rel_time smart_str_0(&string); - if (string.c == NULL) { - return STR_EMPTY_ALLOC(); + if (string.s == NULL) { + return ZSTR_EMPTY_ALLOC(); } - return string.c; + return string.s; } /* }}} */ @@ -4376,19 +4337,19 @@ PHP_FUNCTION(date_interval_format) zval *object; php_interval_obj *diobj; char *format; - int format_len; + size_t format_len; - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &object, date_ce_interval, &format, &format_len) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &object, date_ce_interval, &format, &format_len) == FAILURE) { RETURN_FALSE; } - diobj = (php_interval_obj *) zend_object_store_get_object(object TSRMLS_CC); + diobj = Z_PHPINTERVAL_P(object); DATE_CHECK_INITIALIZED(diobj->initialized, DateInterval); - RETURN_STRING(date_interval_format(format, format_len, diobj->diff), 0); + RETURN_STR(date_interval_format(format, format_len, diobj->diff)); } /* }}} */ -static int date_period_initialize(timelib_time **st, timelib_time **et, timelib_rel_time **d, long *recurrences, /*const*/ char *format, int format_length TSRMLS_DC) +static int date_period_initialize(timelib_time **st, timelib_time **et, timelib_rel_time **d, zend_long *recurrences, /*const*/ char *format, size_t format_length) /* {{{ */ { timelib_time *b = NULL, *e = NULL; timelib_rel_time *p = NULL; @@ -4399,7 +4360,7 @@ static int date_period_initialize(timelib_time **st, timelib_time **et, timelib_ timelib_strtointerval(format, format_length, &b, &e, &p, &r, &errors); if (errors->error_count > 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown or bad format (%s)", format); + php_error_docref(NULL, E_WARNING, "Unknown or bad format (%s)", format); retval = FAILURE; } else { *st = b; @@ -4410,7 +4371,7 @@ static int date_period_initialize(timelib_time **st, timelib_time **et, timelib_ } timelib_error_container_dtor(errors); return retval; -} +} /* }}} */ /* {{{ proto DatePeriod::__construct(DateTime $start, DateInterval $interval, int recurrences|DateTime $end) Creates new DatePeriod object. @@ -4421,36 +4382,36 @@ PHP_METHOD(DatePeriod, __construct) php_date_obj *dateobj; php_interval_obj *intobj; zval *start, *end = NULL, *interval; - long recurrences = 0, options = 0; + zend_long recurrences = 0, options = 0; char *isostr = NULL; - int isostr_len = 0; + size_t isostr_len = 0; timelib_time *clone; zend_error_handling error_handling; - zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); - if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "OOl|l", &start, date_ce_interface, &interval, date_ce_interval, &recurrences, &options) == FAILURE) { - if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "OOO|l", &start, date_ce_interface, &interval, date_ce_interval, &end, date_ce_interface, &options) == FAILURE) { - if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &isostr, &isostr_len, &options) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "This constructor accepts either (DateTimeInterface, DateInterval, int) OR (DateTimeInterface, DateInterval, DateTime) OR (string) as arguments."); - zend_restore_error_handling(&error_handling TSRMLS_CC); + zend_replace_error_handling(EH_THROW, NULL, &error_handling); + if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "OOl|l", &start, date_ce_interface, &interval, date_ce_interval, &recurrences, &options) == FAILURE) { + if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "OOO|l", &start, date_ce_interface, &interval, date_ce_interval, &end, date_ce_interface, &options) == FAILURE) { + if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "s|l", &isostr, &isostr_len, &options) == FAILURE) { + php_error_docref(NULL, E_WARNING, "This constructor accepts either (DateTimeInterface, DateInterval, int) OR (DateTimeInterface, DateInterval, DateTime) OR (string) as arguments."); + zend_restore_error_handling(&error_handling); return; } } } - dpobj = zend_object_store_get_object(getThis() TSRMLS_CC); + dpobj = Z_PHPPERIOD_P(getThis()); dpobj->current = NULL; if (isostr) { - date_period_initialize(&(dpobj->start), &(dpobj->end), &(dpobj->interval), &recurrences, isostr, isostr_len TSRMLS_CC); + date_period_initialize(&(dpobj->start), &(dpobj->end), &(dpobj->interval), &recurrences, isostr, isostr_len); if (dpobj->start == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "The ISO interval '%s' did not contain a start date.", isostr); + php_error_docref(NULL, E_WARNING, "The ISO interval '%s' did not contain a start date.", isostr); } if (dpobj->interval == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "The ISO interval '%s' did not contain an interval.", isostr); + php_error_docref(NULL, E_WARNING, "The ISO interval '%s' did not contain an interval.", isostr); } if (dpobj->end == NULL && recurrences == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "The ISO interval '%s' did not contain an end date or a recurrence count.", isostr); + php_error_docref(NULL, E_WARNING, "The ISO interval '%s' did not contain an end date or a recurrence count.", isostr); } if (dpobj->start) { @@ -4462,14 +4423,14 @@ PHP_METHOD(DatePeriod, __construct) dpobj->start_ce = date_ce_date; } else { /* init */ - intobj = (php_interval_obj *) zend_object_store_get_object(interval TSRMLS_CC); + intobj = Z_PHPINTERVAL_P(interval); /* start date */ - dateobj = (php_date_obj *) zend_object_store_get_object(start TSRMLS_CC); + dateobj = Z_PHPDATE_P(start); clone = timelib_time_ctor(); memcpy(clone, dateobj->time, sizeof(timelib_time)); if (dateobj->time->tz_abbr) { - clone->tz_abbr = strdup(dateobj->time->tz_abbr); + clone->tz_abbr = timelib_strdup(dateobj->time->tz_abbr); } if (dateobj->time->tz_info) { clone->tz_info = dateobj->time->tz_info; @@ -4482,7 +4443,7 @@ PHP_METHOD(DatePeriod, __construct) /* end date */ if (end) { - dateobj = (php_date_obj *) zend_object_store_get_object(end TSRMLS_CC); + dateobj = Z_PHPDATE_P(end); clone = timelib_time_clone(dateobj->time); dpobj->end = clone; } @@ -4496,7 +4457,7 @@ PHP_METHOD(DatePeriod, __construct) dpobj->initialized = 1; - zend_restore_error_handling(&error_handling TSRMLS_CC); + zend_restore_error_handling(&error_handling); } /* }}} */ @@ -4512,14 +4473,14 @@ PHP_METHOD(DatePeriod, getStartDate) return; } - dpobj = (php_period_obj *)zend_object_store_get_object(getThis() TSRMLS_CC); + dpobj = Z_PHPPERIOD_P(getThis()); - php_date_instantiate(dpobj->start_ce, return_value TSRMLS_CC); - dateobj = (php_date_obj *)zend_object_store_get_object(return_value TSRMLS_CC); + php_date_instantiate(dpobj->start_ce, return_value); + dateobj = Z_PHPDATE_P(return_value); dateobj->time = timelib_time_ctor(); *dateobj->time = *dpobj->start; if (dpobj->start->tz_abbr) { - dateobj->time->tz_abbr = strdup(dpobj->start->tz_abbr); + dateobj->time->tz_abbr = timelib_strdup(dpobj->start->tz_abbr); } if (dpobj->start->tz_info) { dateobj->time->tz_info = dpobj->start->tz_info; @@ -4539,18 +4500,18 @@ PHP_METHOD(DatePeriod, getEndDate) return; } - dpobj = (php_period_obj *)zend_object_store_get_object(getThis() TSRMLS_CC); + dpobj = Z_PHPPERIOD_P(getThis()); if (!dpobj->end) { return; } - php_date_instantiate(dpobj->start_ce, return_value TSRMLS_CC); - dateobj = (php_date_obj *)zend_object_store_get_object(return_value TSRMLS_CC); + php_date_instantiate(dpobj->start_ce, return_value); + dateobj = Z_PHPDATE_P(return_value); dateobj->time = timelib_time_ctor(); *dateobj->time = *dpobj->end; if (dpobj->end->tz_abbr) { - dateobj->time->tz_abbr = strdup(dpobj->end->tz_abbr); + dateobj->time->tz_abbr = timelib_strdup(dpobj->end->tz_abbr); } if (dpobj->end->tz_info) { dateobj->time->tz_info = dpobj->end->tz_info; @@ -4560,26 +4521,26 @@ PHP_METHOD(DatePeriod, getEndDate) /* {{{ proto DatePeriod::getDateInterval() Get date interval. -*/ +*/ PHP_METHOD(DatePeriod, getDateInterval) { php_period_obj *dpobj; php_interval_obj *diobj; - + if (zend_parse_parameters_none() == FAILURE) { return; } - dpobj = (php_period_obj *)zend_object_store_get_object(getThis() TSRMLS_CC); + dpobj = Z_PHPPERIOD_P(getThis()); - php_date_instantiate(date_ce_interval, return_value TSRMLS_CC); - diobj = (php_interval_obj *)zend_object_store_get_object(return_value TSRMLS_CC); + php_date_instantiate(date_ce_interval, return_value); + diobj = Z_PHPINTERVAL_P(return_value); diobj->diff = timelib_rel_time_clone(dpobj->interval); diobj->initialized = 1; } /* }}} */ -static int check_id_allowed(char *id, long what) /* {{{ */ +static int check_id_allowed(char *id, zend_long what) /* {{{ */ { if (what & PHP_DATE_TIMEZONE_GROUP_AFRICA && strncasecmp(id, "Africa/", 7) == 0) return 1; if (what & PHP_DATE_TIMEZONE_GROUP_AMERICA && strncasecmp(id, "America/", 8) == 0) return 1; @@ -4593,7 +4554,7 @@ static int check_id_allowed(char *id, long what) /* {{{ */ if (what & PHP_DATE_TIMEZONE_GROUP_PACIFIC && strncasecmp(id, "Pacific/", 8) == 0) return 1; if (what & PHP_DATE_TIMEZONE_GROUP_UTC && strncasecmp(id, "UTC", 3) == 0) return 1; return 0; -} +} /* }}} */ /* {{{ proto array timezone_identifiers_list([long what[, string country]]) Returns numerically index array with all timezone identifiers. @@ -4603,17 +4564,17 @@ PHP_FUNCTION(timezone_identifiers_list) const timelib_tzdb *tzdb; const timelib_tzdb_index_entry *table; int i, item_count; - long what = PHP_DATE_TIMEZONE_GROUP_ALL; + zend_long what = PHP_DATE_TIMEZONE_GROUP_ALL; char *option = NULL; - int option_len = 0; + size_t option_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ls", &what, &option, &option_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ls", &what, &option, &option_len) == FAILURE) { RETURN_FALSE; } /* Extra validation */ if (what == PHP_DATE_TIMEZONE_PER_COUNTRY && option_len != 2) { - php_error_docref(NULL TSRMLS_CC, E_NOTICE, "A two-letter ISO 3166-1 compatible country code is expected"); + php_error_docref(NULL, E_NOTICE, "A two-letter ISO 3166-1 compatible country code is expected"); RETURN_FALSE; } @@ -4626,10 +4587,10 @@ PHP_FUNCTION(timezone_identifiers_list) for (i = 0; i < item_count; ++i) { if (what == PHP_DATE_TIMEZONE_PER_COUNTRY) { if (tzdb->data[table[i].pos + 5] == option[0] && tzdb->data[table[i].pos + 6] == option[1]) { - add_next_index_string(return_value, table[i].id, 1); + add_next_index_string(return_value, table[i].id); } } else if (what == PHP_DATE_TIMEZONE_GROUP_ALL_W_BC || (check_id_allowed(table[i].id, what) && (tzdb->data[table[i].pos + 4] == '\1'))) { - add_next_index_string(return_value, table[i].id, 1); + add_next_index_string(return_value, table[i].id); } }; } @@ -4643,7 +4604,7 @@ PHP_FUNCTION(timezone_version_get) const timelib_tzdb *tzdb; tzdb = DATE_TIMEZONEDB; - RETURN_STRING(tzdb->version, 1); + RETURN_STRING(tzdb->version); } /* }}} */ @@ -4653,31 +4614,30 @@ PHP_FUNCTION(timezone_version_get) PHP_FUNCTION(timezone_abbreviations_list) { const timelib_tz_lookup_table *table, *entry; - zval *element, **abbr_array_pp, *abbr_array; + zval element, *abbr_array_p, abbr_array; table = timelib_timezone_abbreviations_list(); array_init(return_value); entry = table; do { - MAKE_STD_ZVAL(element); - array_init(element); - add_assoc_bool(element, "dst", entry->type); - add_assoc_long(element, "offset", entry->gmtoffset); + array_init(&element); + add_assoc_bool_ex(&element, "dst", sizeof("dst") -1, entry->type); + add_assoc_long_ex(&element, "offset", sizeof("offset") - 1, entry->gmtoffset); if (entry->full_tz_name) { - add_assoc_string(element, "timezone_id", entry->full_tz_name, 1); + add_assoc_string_ex(&element, "timezone_id", sizeof("timezone_id") - 1, entry->full_tz_name); } else { - add_assoc_null(element, "timezone_id"); + add_assoc_null_ex(&element, "timezone_id", sizeof("timezone_id") - 1); } - if (zend_hash_find(HASH_OF(return_value), entry->name, strlen(entry->name) + 1, (void **) &abbr_array_pp) == FAILURE) { - MAKE_STD_ZVAL(abbr_array); - array_init(abbr_array); - add_assoc_zval(return_value, entry->name, abbr_array); + abbr_array_p = zend_hash_str_find(Z_ARRVAL_P(return_value), entry->name, strlen(entry->name)); + if (!abbr_array_p) { + array_init(&abbr_array); + add_assoc_zval(return_value, entry->name, &abbr_array); } else { - abbr_array = *abbr_array_pp; + ZVAL_COPY_VALUE(&abbr_array, abbr_array_p); } - add_next_index_zval(abbr_array, element); + add_next_index_zval(&abbr_array, &element); entry++; } while (entry->name); } @@ -4688,13 +4648,13 @@ PHP_FUNCTION(timezone_abbreviations_list) PHP_FUNCTION(date_default_timezone_set) { char *zone; - int zone_len; + size_t zone_len; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &zone, &zone_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &zone, &zone_len) == FAILURE) { RETURN_FALSE; } if (!timelib_timezone_id_is_valid(zone, DATE_TIMEZONEDB)) { - php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Timezone ID '%s' is invalid", zone); + php_error_docref(NULL, E_NOTICE, "Timezone ID '%s' is invalid", zone); RETURN_FALSE; } if (DATEG(timezone)) { @@ -4712,8 +4672,8 @@ PHP_FUNCTION(date_default_timezone_get) { timelib_tzinfo *default_tz; - default_tz = get_timezone_info(TSRMLS_C); - RETVAL_STRING(default_tz->name, 1); + default_tz = get_timezone_info(); + RETVAL_STRING(default_tz->name); } /* }}} */ @@ -4725,13 +4685,13 @@ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_su double latitude = 0.0, longitude = 0.0, zenith = 0.0, gmt_offset = 0, altitude; double h_rise, h_set, N; timelib_sll rise, set, transit; - long time, retformat = 0; + zend_long time, retformat = 0; int rs; timelib_time *t; timelib_tzinfo *tzi; - char *retstr; + zend_string *retstr; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|ldddd", &time, &retformat, &latitude, &longitude, &zenith, &gmt_offset) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|ldddd", &time, &retformat, &latitude, &longitude, &zenith, &gmt_offset) == FAILURE) { RETURN_FALSE; } @@ -4752,7 +4712,7 @@ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_su case 6: break; default: - php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid format"); + php_error_docref(NULL, E_WARNING, "invalid format"); RETURN_FALSE; break; } @@ -4760,14 +4720,14 @@ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_su retformat != SUNFUNCS_RET_STRING && retformat != SUNFUNCS_RET_DOUBLE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong return format given, pick one of SUNFUNCS_RET_TIMESTAMP, SUNFUNCS_RET_STRING or SUNFUNCS_RET_DOUBLE"); + php_error_docref(NULL, E_WARNING, "Wrong return format given, pick one of SUNFUNCS_RET_TIMESTAMP, SUNFUNCS_RET_STRING or SUNFUNCS_RET_DOUBLE"); RETURN_FALSE; } altitude = 90 - zenith; /* Initialize time struct */ t = timelib_time_ctor(); - tzi = get_timezone_info(TSRMLS_C); + tzi = get_timezone_info(); t->tz_info = tzi; t->zone_type = TIMELIB_ZONETYPE_ID; @@ -4794,8 +4754,8 @@ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_su switch (retformat) { case SUNFUNCS_RET_STRING: - spprintf(&retstr, 0, "%02d:%02d", (int) N, (int) (60 * (N - (int) N))); - RETURN_STRINGL(retstr, 5, 0); + retstr = strpprintf(0, "%02d:%02d", (int) N, (int) (60 * (N - (int) N))); + RETURN_NEW_STR(retstr); break; case SUNFUNCS_RET_DOUBLE: RETURN_DOUBLE(N); @@ -4824,7 +4784,7 @@ PHP_FUNCTION(date_sunset) Returns an array with information about sun set/rise and twilight begin/end */ PHP_FUNCTION(date_sun_info) { - long time; + zend_long time; double latitude, longitude; timelib_time *t, *t2; timelib_tzinfo *tzi; @@ -4833,12 +4793,12 @@ PHP_FUNCTION(date_sun_info) int dummy; double ddummy; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ldd", &time, &latitude, &longitude) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ldd", &time, &latitude, &longitude) == FAILURE) { RETURN_FALSE; } /* Initialize time struct */ t = timelib_time_ctor(); - tzi = get_timezone_info(TSRMLS_C); + tzi = get_timezone_info(); t->tz_info = tzi; t->zone_type = TIMELIB_ZONETYPE_ID; timelib_unixtime2local(t, time); @@ -4925,131 +4885,129 @@ PHP_FUNCTION(date_sun_info) } /* }}} */ -static HashTable *date_object_get_gc_period(zval *object, zval ***table, int *n TSRMLS_DC) +static HashTable *date_object_get_gc_period(zval *object, zval **table, int *n) /* {{{ */ { *table = NULL; *n = 0; - return zend_std_get_properties(object TSRMLS_CC); -} + return zend_std_get_properties(object); +} /* }}} */ -static HashTable *date_object_get_properties_period(zval *object TSRMLS_DC) +static HashTable *date_object_get_properties_period(zval *object) /* {{{ */ { HashTable *props; - zval *zv; + zval zv; php_period_obj *period_obj; - period_obj = zend_object_store_get_object(object TSRMLS_CC); + period_obj = Z_PHPPERIOD_P(object); - props = zend_std_get_properties(object TSRMLS_CC); + props = zend_std_get_properties(object); if (!period_obj->start) { return props; } - MAKE_STD_ZVAL(zv); if (period_obj->start) { php_date_obj *date_obj; - object_init_ex(zv, date_ce_date); - date_obj = zend_object_store_get_object(zv TSRMLS_CC); + object_init_ex(&zv, date_ce_date); + date_obj = Z_PHPDATE_P(&zv); date_obj->time = timelib_time_clone(period_obj->start); } else { - ZVAL_NULL(zv); + ZVAL_NULL(&zv); } - zend_hash_update(props, "start", sizeof("start"), &zv, sizeof(zv), NULL); + zend_hash_str_update(props, "start", sizeof("start")-1, &zv); - MAKE_STD_ZVAL(zv); if (period_obj->current) { php_date_obj *date_obj; - object_init_ex(zv, date_ce_date); - date_obj = zend_object_store_get_object(zv TSRMLS_CC); + object_init_ex(&zv, date_ce_date); + date_obj = Z_PHPDATE_P(&zv); date_obj->time = timelib_time_clone(period_obj->current); } else { - ZVAL_NULL(zv); + ZVAL_NULL(&zv); } - zend_hash_update(props, "current", sizeof("current"), &zv, sizeof(zv), NULL); + zend_hash_str_update(props, "current", sizeof("current")-1, &zv); - MAKE_STD_ZVAL(zv); if (period_obj->end) { php_date_obj *date_obj; - object_init_ex(zv, date_ce_date); - date_obj = zend_object_store_get_object(zv TSRMLS_CC); + object_init_ex(&zv, date_ce_date); + date_obj = Z_PHPDATE_P(&zv); date_obj->time = timelib_time_clone(period_obj->end); } else { - ZVAL_NULL(zv); + ZVAL_NULL(&zv); } - zend_hash_update(props, "end", sizeof("end"), &zv, sizeof(zv), NULL); + zend_hash_str_update(props, "end", sizeof("end")-1, &zv); - MAKE_STD_ZVAL(zv); if (period_obj->interval) { php_interval_obj *interval_obj; - object_init_ex(zv, date_ce_interval); - interval_obj = zend_object_store_get_object(zv TSRMLS_CC); + object_init_ex(&zv, date_ce_interval); + interval_obj = Z_PHPINTERVAL_P(&zv); interval_obj->diff = timelib_rel_time_clone(period_obj->interval); interval_obj->initialized = 1; } else { - ZVAL_NULL(zv); + ZVAL_NULL(&zv); } - zend_hash_update(props, "interval", sizeof("interval"), &zv, sizeof(zv), NULL); + zend_hash_str_update(props, "interval", sizeof("interval")-1, &zv); /* converted to larger type (int->long); must check when unserializing */ - MAKE_STD_ZVAL(zv); - ZVAL_LONG(zv, (long) period_obj->recurrences); - zend_hash_update(props, "recurrences", sizeof("recurrences"), &zv, sizeof(zv), NULL); + ZVAL_LONG(&zv, (zend_long) period_obj->recurrences); + zend_hash_str_update(props, "recurrences", sizeof("recurrences")-1, &zv); - MAKE_STD_ZVAL(zv); - ZVAL_BOOL(zv, period_obj->include_start_date); - zend_hash_update(props, "include_start_date", sizeof("include_start_date"), &zv, sizeof(zv), NULL); + ZVAL_BOOL(&zv, period_obj->include_start_date); + zend_hash_str_update(props, "include_start_date", sizeof("include_start_date")-1, &zv); return props; -} +} /* }}} */ -static int php_date_period_initialize_from_hash(php_period_obj *period_obj, HashTable *myht TSRMLS_DC) +static int php_date_period_initialize_from_hash(php_period_obj *period_obj, HashTable *myht) /* {{{ */ { - zval **ht_entry; + zval *ht_entry; /* this function does no rollback on error */ - if (zend_hash_find(myht, "start", sizeof("start"), (void**) &ht_entry) == SUCCESS) { - if (Z_TYPE_PP(ht_entry) == IS_OBJECT && Z_OBJCE_PP(ht_entry) == date_ce_date) { + ht_entry = zend_hash_str_find(myht, "start", sizeof("start")-1); + if (ht_entry) { + if (Z_TYPE_P(ht_entry) == IS_OBJECT && Z_OBJCE_P(ht_entry) == date_ce_date) { php_date_obj *date_obj; - date_obj = zend_object_store_get_object(*ht_entry TSRMLS_CC); + date_obj = Z_PHPDATE_P(ht_entry); period_obj->start = timelib_time_clone(date_obj->time); - period_obj->start_ce = Z_OBJCE_PP(ht_entry); - } else if (Z_TYPE_PP(ht_entry) != IS_NULL) { + period_obj->start_ce = Z_OBJCE_P(ht_entry); + } else if (Z_TYPE_P(ht_entry) != IS_NULL) { return 0; } } else { return 0; } - if (zend_hash_find(myht, "end", sizeof("end"), (void**) &ht_entry) == SUCCESS) { - if (Z_TYPE_PP(ht_entry) == IS_OBJECT && Z_OBJCE_PP(ht_entry) == date_ce_date) { + ht_entry = zend_hash_str_find(myht, "end", sizeof("end")-1); + if (ht_entry) { + if (Z_TYPE_P(ht_entry) == IS_OBJECT && Z_OBJCE_P(ht_entry) == date_ce_date) { php_date_obj *date_obj; - date_obj = zend_object_store_get_object(*ht_entry TSRMLS_CC); + date_obj = Z_PHPDATE_P(ht_entry); period_obj->end = timelib_time_clone(date_obj->time); - } else if (Z_TYPE_PP(ht_entry) != IS_NULL) { + } else if (Z_TYPE_P(ht_entry) != IS_NULL) { return 0; } } else { return 0; } - if (zend_hash_find(myht, "current", sizeof("current"), (void**) &ht_entry) == SUCCESS) { - if (Z_TYPE_PP(ht_entry) == IS_OBJECT && Z_OBJCE_PP(ht_entry) == date_ce_date) { + ht_entry = zend_hash_str_find(myht, "current", sizeof("current")-1); + if (ht_entry) { + if (Z_TYPE_P(ht_entry) == IS_OBJECT && Z_OBJCE_P(ht_entry) == date_ce_date) { php_date_obj *date_obj; - date_obj = zend_object_store_get_object(*ht_entry TSRMLS_CC); + date_obj = Z_PHPDATE_P(ht_entry); period_obj->current = timelib_time_clone(date_obj->time); - } else if (Z_TYPE_PP(ht_entry) != IS_NULL) { + } else if (Z_TYPE_P(ht_entry) != IS_NULL) { return 0; } } else { return 0; } - if (zend_hash_find(myht, "interval", sizeof("interval"), (void**) &ht_entry) == SUCCESS) { - if (Z_TYPE_PP(ht_entry) == IS_OBJECT && Z_OBJCE_PP(ht_entry) == date_ce_interval) { + ht_entry = zend_hash_str_find(myht, "interval", sizeof("interval")-1); + if (ht_entry) { + if (Z_TYPE_P(ht_entry) == IS_OBJECT && Z_OBJCE_P(ht_entry) == date_ce_interval) { php_interval_obj *interval_obj; - interval_obj = zend_object_store_get_object(*ht_entry TSRMLS_CC); + interval_obj = Z_PHPINTERVAL_P(ht_entry); period_obj->interval = timelib_rel_time_clone(interval_obj->diff); } else { /* interval is required */ return 0; @@ -5058,16 +5016,18 @@ static int php_date_period_initialize_from_hash(php_period_obj *period_obj, Hash return 0; } - if (zend_hash_find(myht, "recurrences", sizeof("recurrences"), (void**) &ht_entry) == SUCCESS && - Z_TYPE_PP(ht_entry) == IS_LONG && Z_LVAL_PP(ht_entry) >= 0 && Z_LVAL_PP(ht_entry) <= INT_MAX) { - period_obj->recurrences = Z_LVAL_PP(ht_entry); + ht_entry = zend_hash_str_find(myht, "recurrences", sizeof("recurrences")-1); + if (ht_entry && + Z_TYPE_P(ht_entry) == IS_LONG && Z_LVAL_P(ht_entry) >= 0 && Z_LVAL_P(ht_entry) <= INT_MAX) { + period_obj->recurrences = Z_LVAL_P(ht_entry); } else { return 0; } - if (zend_hash_find(myht, "include_start_date", sizeof("include_start_date"), (void**) &ht_entry) == SUCCESS && - Z_TYPE_PP(ht_entry) == IS_BOOL) { - period_obj->include_start_date = Z_BVAL_PP(ht_entry); + ht_entry = zend_hash_str_find(myht, "include_start_date", sizeof("include_start_date")-1); + if (ht_entry && + (Z_TYPE_P(ht_entry) == IS_FALSE || Z_TYPE_P(ht_entry) == IS_TRUE)) { + period_obj->include_start_date = (Z_TYPE_P(ht_entry) == IS_TRUE); } else { return 0; } @@ -5075,7 +5035,7 @@ static int php_date_period_initialize_from_hash(php_period_obj *period_obj, Hash period_obj->initialized = 1; return 1; -} +} /* }}} */ /* {{{ proto DatePeriod::__set_state() */ @@ -5085,15 +5045,15 @@ PHP_METHOD(DatePeriod, __set_state) zval *array; HashTable *myht; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &array) == FAILURE) { RETURN_FALSE; } myht = Z_ARRVAL_P(array); object_init_ex(return_value, date_ce_period); - period_obj = zend_object_store_get_object(return_value TSRMLS_CC); - if (!php_date_period_initialize_from_hash(period_obj, myht TSRMLS_CC)) { + period_obj = Z_PHPPERIOD_P(return_value); + if (!php_date_period_initialize_from_hash(period_obj, myht)) { php_error(E_ERROR, "Invalid serialization data for DatePeriod object"); } } @@ -5107,33 +5067,30 @@ PHP_METHOD(DatePeriod, __wakeup) php_period_obj *period_obj; HashTable *myht; - period_obj = zend_object_store_get_object(object TSRMLS_CC); + period_obj = Z_PHPPERIOD_P(object); myht = Z_OBJPROP_P(object); - if (!php_date_period_initialize_from_hash(period_obj, myht TSRMLS_CC)) { + if (!php_date_period_initialize_from_hash(period_obj, myht)) { php_error(E_ERROR, "Invalid serialization data for DatePeriod object"); } } /* }}} */ /* {{{ date_period_read_property */ -static zval *date_period_read_property(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) +static zval *date_period_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) { zval *zv; if (type != BP_VAR_IS && type != BP_VAR_R) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Retrieval of DatePeriod properties for modification is unsupported"); + php_error_docref(NULL, E_ERROR, "Retrieval of DatePeriod properties for modification is unsupported"); } Z_OBJPROP_P(object); /* build properties hash table */ - zv = std_object_handlers.read_property(object, member, type, key TSRMLS_CC); + zv = std_object_handlers.read_property(object, member, type, cache_slot, rv); if (Z_TYPE_P(zv) == IS_OBJECT && Z_OBJ_HANDLER_P(zv, clone_obj)) { /* defensive copy */ - zend_object_value zov = Z_OBJ_HANDLER_P(zv, clone_obj)(zv TSRMLS_CC); - MAKE_STD_ZVAL(zv); - Z_TYPE_P(zv) = IS_OBJECT; - Z_OBJVAL_P(zv) = zov; + ZVAL_OBJ(zv, Z_OBJ_HANDLER_P(zv, clone_obj)(zv)); } return zv; @@ -5141,13 +5098,12 @@ static zval *date_period_read_property(zval *object, zval *member, int type, con /* }}} */ /* {{{ date_period_write_property */ -static void date_period_write_property(zval *object, zval *member, zval *value, const zend_literal *key TSRMLS_DC) +static void date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Writing to DatePeriod properties is unsupported"); + php_error_docref(NULL, E_ERROR, "Writing to DatePeriod properties is unsupported"); } /* }}} */ - /* * Local variables: * tab-width: 4 |
