diff options
Diffstat (limited to 'ext/date/php_date.c')
-rw-r--r-- | ext/date/php_date.c | 157 |
1 files changed, 123 insertions, 34 deletions
diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 2cca079a31..390dd5d590 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -32,26 +32,31 @@ #include <time.h> /* {{{ arginfo */ +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date, 0, 0, 1) ZEND_ARG_INFO(0, format) ZEND_ARG_INFO(0, timestamp) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_gmdate, 0, 0, 1) ZEND_ARG_INFO(0, format) ZEND_ARG_INFO(0, timestamp) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_idate, 0, 0, 1) ZEND_ARG_INFO(0, format) ZEND_ARG_INFO(0, timestamp) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_strtotime, 0, 0, 1) ZEND_ARG_INFO(0, time) ZEND_ARG_INFO(0, now) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_mktime, 0, 0, 0) ZEND_ARG_INFO(0, hour) ZEND_ARG_INFO(0, min) @@ -61,6 +66,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_mktime, 0, 0, 0) ZEND_ARG_INFO(0, year) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_gmmktime, 0, 0, 0) ZEND_ARG_INFO(0, hour) ZEND_ARG_INFO(0, min) @@ -70,41 +76,50 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_gmmktime, 0, 0, 0) ZEND_ARG_INFO(0, year) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_checkdate, 0) ZEND_ARG_INFO(0, month) ZEND_ARG_INFO(0, day) ZEND_ARG_INFO(0, year) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_strftime, 0, 0, 1) ZEND_ARG_INFO(0, format) ZEND_ARG_INFO(0, timestamp) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_gmstrftime, 0, 0, 1) ZEND_ARG_INFO(0, format) ZEND_ARG_INFO(0, timestamp) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_time, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_localtime, 0, 0, 0) ZEND_ARG_INFO(0, timestamp) ZEND_ARG_INFO(0, associative_array) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_getdate, 0, 0, 0) ZEND_ARG_INFO(0, timestamp) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_date_default_timezone_set, 0) ZEND_ARG_INFO(0, timezone_identifier) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_date_default_timezone_get, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_sunrise, 0, 0, 1) ZEND_ARG_INFO(0, time) ZEND_ARG_INFO(0, format) @@ -114,6 +129,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_date_sunrise, 0, 0, 1) ZEND_ARG_INFO(0, gmt_offset) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_sunset, 0, 0, 1) ZEND_ARG_INFO(0, time) ZEND_ARG_INFO(0, format) @@ -123,105 +139,128 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_date_sunset, 0, 0, 1) ZEND_ARG_INFO(0, gmt_offset) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_date_sun_info, 0) ZEND_ARG_INFO(0, time) ZEND_ARG_INFO(0, latitude) ZEND_ARG_INFO(0, longitude) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_create, 0, 0, 0) ZEND_ARG_INFO(0, time) ZEND_ARG_INFO(0, object) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_create_from_format, 0, 0, 2) ZEND_ARG_INFO(0, format) ZEND_ARG_INFO(0, time) ZEND_ARG_INFO(0, object) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_parse, 0, 0, 1) ZEND_ARG_INFO(0, date) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_parse_from_format, 0, 0, 2) ZEND_ARG_INFO(0, format) ZEND_ARG_INFO(0, date) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_date_get_last_errors, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_format, 0, 0, 2) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, format) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_format, 0, 0, 1) ZEND_ARG_INFO(0, format) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_modify, 0, 0, 2) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, modify) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_modify, 0, 0, 1) ZEND_ARG_INFO(0, modify) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_add, 0, 0, 2) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, interval) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_add, 0, 0, 1) ZEND_ARG_INFO(0, interval) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_sub, 0, 0, 2) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, interval) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_sub, 0, 0, 1) ZEND_ARG_INFO(0, interval) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_timezone_get, 0, 0, 1) ZEND_ARG_INFO(0, object) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_date_method_timezone_get, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_timezone_set, 0, 0, 2) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, timezone) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_timezone_set, 0, 0, 1) ZEND_ARG_INFO(0, timezone) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_offset_get, 0, 0, 1) ZEND_ARG_INFO(0, object) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_date_method_offset_get, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_diff, 0, 0, 2) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, object2) ZEND_ARG_INFO(0, absolute) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_diff, 0, 0, 1) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, absolute) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_time_set, 0, 0, 3) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, hour) @@ -229,12 +268,14 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_date_time_set, 0, 0, 3) ZEND_ARG_INFO(0, second) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_time_set, 0, 0, 2) ZEND_ARG_INFO(0, hour) ZEND_ARG_INFO(0, minute) ZEND_ARG_INFO(0, second) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_date_set, 0, 0, 4) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, year) @@ -242,12 +283,14 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_date_date_set, 0, 0, 4) ZEND_ARG_INFO(0, day) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_date_set, 0, 0, 3) ZEND_ARG_INFO(0, year) ZEND_ARG_INFO(0, month) ZEND_ARG_INFO(0, day) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_isodate_set, 0, 0, 3) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, year) @@ -255,96 +298,118 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_date_isodate_set, 0, 0, 3) ZEND_ARG_INFO(0, day) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_isodate_set, 0, 0, 2) ZEND_ARG_INFO(0, year) ZEND_ARG_INFO(0, week) ZEND_ARG_INFO(0, day) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_timestamp_set, 0, 0, 2) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, unixtimestamp) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_timestamp_set, 0, 0, 1) ZEND_ARG_INFO(0, unixtimestamp) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_timestamp_get, 0, 0, 1) ZEND_ARG_INFO(0, object) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_date_method_timestamp_get, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_timezone_open, 0, 0, 1) ZEND_ARG_INFO(0, timezone) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_timezone_name_get, 0, 0, 1) ZEND_ARG_INFO(0, object) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_timezone_method_name_get, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_timezone_name_from_abbr, 0, 0, 1) ZEND_ARG_INFO(0, abbr) ZEND_ARG_INFO(0, gmtoffset) ZEND_ARG_INFO(0, isdst) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_timezone_offset_get, 0, 0, 2) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, datetime) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_timezone_method_offset_get, 0, 0, 1) ZEND_ARG_INFO(0, datetime) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_timezone_transitions_get, 0, 0, 1) ZEND_ARG_INFO(0, object) ZEND_ARG_INFO(0, timestamp_begin) ZEND_ARG_INFO(0, timestamp_end) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_timezone_method_transitions_get, 0) ZEND_ARG_INFO(0, timestamp_begin) ZEND_ARG_INFO(0, timestamp_end) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_timezone_location_get, 0, 0, 1) ZEND_ARG_INFO(0, object) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_timezone_method_location_get, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_timezone_identifiers_list, 0, 0, 0) ZEND_ARG_INFO(0, what) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_timezone_abbreviations_list, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_interval_create_from_date_string, 0, 0, 1) ZEND_ARG_INFO(0, time) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_interval_format, 0, 0, 1) ZEND_ARG_INFO(0, object) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_date_method_interval_format, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_period_construct, 0, 0, 3) ZEND_ARG_INFO(0, start) ZEND_ARG_INFO(0, interval) ZEND_ARG_INFO(0, end) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_date_interval_construct, 0, 0, 0) ZEND_ARG_INFO(0, interval_spec) ZEND_END_ARG_INFO() @@ -491,22 +556,55 @@ PHP_INI_END() zend_class_entry *date_ce_date, *date_ce_timezone, *date_ce_interval, *date_ce_period; - -PHPAPI zend_class_entry *php_date_get_date_ce(void) -{ - return date_ce_date; -} - -PHPAPI zend_class_entry *php_date_get_timezone_ce(void) -{ - return date_ce_timezone; -} - static zend_object_handlers date_object_handlers_date; static zend_object_handlers date_object_handlers_timezone; static zend_object_handlers date_object_handlers_interval; static zend_object_handlers date_object_handlers_period; +typedef struct _php_date_obj php_date_obj; +typedef struct _php_timezone_obj php_timezone_obj; +typedef struct _php_interval_obj php_interval_obj; +typedef struct _php_period_obj php_period_obj; + +struct _php_date_obj { + zend_object std; + timelib_time *time; + HashTable *props; +}; + +struct _php_timezone_obj { + zend_object std; + int initialized; + int type; + union { + timelib_tzinfo *tz; /* TIMELIB_ZONETYPE_ID; */ + timelib_sll utc_offset; /* TIMELIB_ZONETYPE_OFFSET */ + struct /* TIMELIB_ZONETYPE_ABBR */ + { + timelib_sll utc_offset; + char *abbr; + int dst; + } z; + } tzi; +}; + +struct _php_interval_obj { + zend_object std; + timelib_rel_time *diff; + HashTable *props; + int initialized; +}; + +struct _php_period_obj { + zend_object std; + timelib_time *start; + timelib_time *end; + timelib_rel_time *interval; + int recurrences; + int initialized; + int include_start_date; +}; + #define DATE_SET_CONTEXT \ zval *object; \ object = getThis(); \ @@ -1287,7 +1385,7 @@ PHP_FUNCTION(idate) { char *format; int format_len; - long ts = 0; + long ts; int ret; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &format, &format_len, &ts) == FAILURE) { @@ -1350,7 +1448,7 @@ PHP_FUNCTION(strtotime) char *times, *initial_ts; int time_len, error1, error2; struct timelib_error_container *error; - long preset_ts = 0, ts; + long preset_ts, ts; timelib_time *t, *now; timelib_tzinfo *tzi; @@ -1407,7 +1505,7 @@ 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; + long hou, min, sec, mon, day, yea, dst = -1; timelib_time *now; timelib_tzinfo *tzi = NULL; long ts, adjust_seconds = 0; @@ -1433,7 +1531,7 @@ PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt) case 6: if (yea >= 0 && yea < 70) { yea += 2000; - } else if (yea >= 70 && yea <= 100) { + } else if (yea >= 70 && yea <= 110) { yea += 1900; } now->y = yea; @@ -1536,7 +1634,7 @@ PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gmt) { char *format, *buf; int format_len; - long timestamp = 0; + long timestamp; struct tm ta; int max_reallocs = 5; size_t buf_len = 64, real_len; @@ -2420,13 +2518,12 @@ PHP_METHOD(DateTime, __construct) zval *timezone_object = NULL; char *time_str = NULL; int time_str_len = 0; - zend_error_handling error_handling; + - zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); + zend_replace_error_handling(EH_THROW, NULL, NULL TSRMLS_CC); if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sO", &time_str, &time_str_len, &timezone_object, date_ce_timezone)) { date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, NULL, timezone_object, 1 TSRMLS_CC); } - zend_restore_error_handling(&error_handling TSRMLS_CC); } /* }}} */ @@ -2512,7 +2609,7 @@ PHP_METHOD(DateTime, __wakeup) /* }}} */ /* 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) +void zval_from_error_container(zval *z, timelib_error_container *error) { int i; zval *element; @@ -3095,9 +3192,8 @@ PHP_METHOD(DateTimeZone, __construct) int tz_len; timelib_tzinfo *tzi = NULL; php_timezone_obj *tzobj; - zend_error_handling error_handling; - zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); + zend_replace_error_handling(EH_THROW, NULL, NULL TSRMLS_CC); if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &tz, &tz_len)) { if (SUCCESS == timezone_initialize(&tzi, tz TSRMLS_CC)) { tzobj = zend_object_store_get_object(getThis() TSRMLS_CC); @@ -3108,7 +3204,6 @@ PHP_METHOD(DateTimeZone, __construct) ZVAL_NULL(getThis()); } } - zend_restore_error_handling(&error_handling TSRMLS_CC); } /* }}} */ @@ -3440,9 +3535,8 @@ PHP_METHOD(DateInterval, __construct) int 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); + zend_replace_error_handling(EH_THROW, NULL, NULL 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); @@ -3452,7 +3546,6 @@ PHP_METHOD(DateInterval, __construct) ZVAL_NULL(getThis()); } } - zend_restore_error_handling(&error_handling TSRMLS_CC); } /* }}} */ @@ -3595,14 +3688,12 @@ PHP_METHOD(DatePeriod, __construct) char *isostr = NULL; int isostr_len = 0; timelib_time *clone; - zend_error_handling error_handling; - zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); + zend_replace_error_handling(EH_THROW, NULL, NULL TSRMLS_CC); if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "OOl|l", &start, date_ce_date, &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_date, &interval, date_ce_interval, &end, date_ce_date, &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 (DateTime, DateInterval, int) OR (DateTime, DateInterval, DateTime) OR (string) as arguments."); - zend_restore_error_handling(&error_handling TSRMLS_CC); return; } } @@ -3669,8 +3760,6 @@ PHP_METHOD(DatePeriod, __construct) dpobj->recurrences = recurrences + dpobj->include_start_date; dpobj->initialized = 1; - - zend_restore_error_handling(&error_handling TSRMLS_CC); } /* }}} */ @@ -3699,7 +3788,7 @@ PHP_FUNCTION(timezone_identifiers_list) const timelib_tzdb_index_entry *table; int i, item_count; long what = PHP_DATE_TIMEZONE_GROUP_ALL; - char *option = NULL; + char *option; int option_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ls", &what, &option, &option_len) == FAILURE) { @@ -3805,10 +3894,10 @@ PHP_FUNCTION(date_default_timezone_get) */ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_sunset) { - double latitude = 0.0, longitude = 0.0, zenith = 0.0, gmt_offset = 0, altitude; + double latitude, longitude, zenith, gmt_offset = 0, altitude; double h_rise, h_set, N; timelib_sll rise, set, transit; - long time, retformat = 0; + long time, retformat; int rs; timelib_time *t; timelib_tzinfo *tzi; |