derick Sun May 4 09:59:42 2008 UTC
Modified files:
/php-src/ext/date php_date.c
/php-src/ext/date/lib parse_iso_intervals.c parse_iso_intervals.re
Log:
- Added support for using ISO 8601 time intervals to define a DatePeriod
iterator.
http://cvs.php.net/viewvc.cgi/php-src/ext/date/php_date.c?r1=1.184&r2=1.185&diff_format=u
Index: php-src/ext/date/php_date.c
diff -u php-src/ext/date/php_date.c:1.184 php-src/ext/date/php_date.c:1.185
--- php-src/ext/date/php_date.c:1.184 Sat May 3 10:59:14 2008
+++ php-src/ext/date/php_date.c Sun May 4 09:59:42 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_date.c,v 1.184 2008/05/03 10:59:14 derick Exp $ */
+/* $Id: php_date.c,v 1.185 2008/05/04 09:59:42 derick Exp $ */
#include "php.h"
#include "php_streams.h"
@@ -3538,6 +3538,30 @@
}
/* }}} */
+static int date_period_initialize(timelib_time **st, timelib_time **et,
timelib_rel_time **d, int *recurrences, /*const*/ char *format, int
format_length TSRMLS_DC)
+{
+ timelib_time *b = NULL, *e = NULL;
+ timelib_rel_time *p = NULL;
+ int r = 0;
+ int retval = 0;
+ struct timelib_error_container *errors;
+
+ 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);
+ retval = FAILURE;
+ } else {
+ *st = b;
+ *et = e;
+ *d = p;
+ *recurrences = r;
+ retval = SUCCESS;
+ }
+ timelib_error_container_dtor(errors);
+ return retval;
+}
+
/* {{{ proto DatePeriod::__construct(DateTime $start, DateInterval $interval,
int recurrences|DateTime $end)
Creates new DatePeriod object.
*/
@@ -3548,38 +3572,44 @@
php_interval_obj *intobj;
zval *start, *end = NULL, *interval;
long recurrences = 0, options = 0;
+ char *isostr = NULL;
+ int isostr_len;
timelib_time *clone;
php_set_error_handling(EH_THROW, 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) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "This
constructor accepts either (DateTime, DateInterval, int) OR (DateTime,
DateInterval, DateTime) as arguments.");
- return;
+ 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.");
+ return;
+ }
}
}
- /* init */
- intobj = (php_interval_obj *) zend_object_store_get_object(interval
TSRMLS_CC);
dpobj = zend_object_store_get_object(getThis() TSRMLS_CC);
- /* start date */
- dateobj = (php_date_obj *) zend_object_store_get_object(start
TSRMLS_CC);
- clone = timelib_time_ctor();
- memcpy(clone, dateobj->time, sizeof(timelib_time));
- if (dateobj->time->tz_abbr) {
- clone->tz_abbr = strdup(dateobj->time->tz_abbr);
- }
- if (dateobj->time->tz_info) {
- clone->tz_info = timelib_tzinfo_clone(dateobj->time->tz_info);
- }
- dpobj->start = clone;
+ if (isostr_len) {
+ date_period_initialize(&(dpobj->start), &(dpobj->end),
&(dpobj->interval), (int*) &recurrences, isostr, isostr_len TSRMLS_CC);
+ if (dpobj->start == NULL) {
+ php_error_docref(NULL TSRMLS_CC, 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);
+ }
+ 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);
+ }
- /* interval */
- dpobj->interval = timelib_rel_time_clone(intobj->diff);
+ timelib_update_ts(dpobj->start, NULL);
+ if (dpobj->end) {
+ timelib_update_ts(dpobj->end, NULL);
+ }
+ } else {
+ /* init */
+ intobj = (php_interval_obj *)
zend_object_store_get_object(interval TSRMLS_CC);
- /* end date */
- if (end) {
- dateobj = (php_date_obj *) zend_object_store_get_object(end
TSRMLS_CC);
+ /* start date */
+ dateobj = (php_date_obj *) zend_object_store_get_object(start
TSRMLS_CC);
clone = timelib_time_ctor();
memcpy(clone, dateobj->time, sizeof(timelib_time));
if (dateobj->time->tz_abbr) {
@@ -3588,7 +3618,24 @@
if (dateobj->time->tz_info) {
clone->tz_info =
timelib_tzinfo_clone(dateobj->time->tz_info);
}
- dpobj->end = clone;
+ dpobj->start = clone;
+
+ /* interval */
+ dpobj->interval = timelib_rel_time_clone(intobj->diff);
+
+ /* end date */
+ if (end) {
+ dateobj = (php_date_obj *)
zend_object_store_get_object(end TSRMLS_CC);
+ clone = timelib_time_ctor();
+ memcpy(clone, dateobj->time, sizeof(timelib_time));
+ if (dateobj->time->tz_abbr) {
+ clone->tz_abbr = strdup(dateobj->time->tz_abbr);
+ }
+ if (dateobj->time->tz_info) {
+ clone->tz_info =
timelib_tzinfo_clone(dateobj->time->tz_info);
+ }
+ dpobj->end = clone;
+ }
}
/* options */
http://cvs.php.net/viewvc.cgi/php-src/ext/date/lib/parse_iso_intervals.c?r1=1.2&r2=1.3&diff_format=u
Index: php-src/ext/date/lib/parse_iso_intervals.c
diff -u php-src/ext/date/lib/parse_iso_intervals.c:1.2
php-src/ext/date/lib/parse_iso_intervals.c:1.3
--- php-src/ext/date/lib/parse_iso_intervals.c:1.2 Fri Apr 25 12:55:16 2008
+++ php-src/ext/date/lib/parse_iso_intervals.c Sun May 4 09:59:42 2008
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.3 on Mon Apr 7 19:58:19 2008 */
+/* Generated by re2c 0.13.4 on Sun May 4 11:58:27 2008 */
#line 1 "ext/date/lib/parse_iso_intervals.re"
/*
+----------------------------------------------------------------------+
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: parse_iso_intervals.c,v 1.2 2008/04/25 12:55:16 derick Exp $ */
+/* $Id: parse_iso_intervals.c,v 1.3 2008/05/04 09:59:42 derick Exp $ */
#include "timelib.h"
@@ -325,10 +325,10 @@
if ((YYLIMIT - YYCURSOR) < 20) YYFILL(20);
yych = *YYCURSOR;
if (yych <= ',') {
- if (yych <= 0x0A) {
+ if (yych <= '\n') {
if (yych <= 0x00) goto yy9;
if (yych <= 0x08) goto yy11;
- if (yych <= 0x09) goto yy7;
+ if (yych <= '\t') goto yy7;
goto yy9;
} else {
if (yych == ' ') goto yy7;
@@ -527,7 +527,7 @@
yy23:
YYDEBUG(23, *YYCURSOR);
++YYCURSOR;
- if (YYLIMIT == YYCURSOR) YYFILL(1);
+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
YYDEBUG(24, *YYCURSOR);
if (yych <= '/') goto yy14;
@@ -830,7 +830,7 @@
yy74:
YYDEBUG(74, *YYCURSOR);
++YYCURSOR;
- if (YYLIMIT == YYCURSOR) YYFILL(1);
+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
YYDEBUG(75, *YYCURSOR);
if (yych <= '/') goto yy76;
@@ -905,11 +905,11 @@
in.begin->h = TIMELIB_UNSET;
in.begin->i = TIMELIB_UNSET;
in.begin->s = TIMELIB_UNSET;
- in.begin->f = TIMELIB_UNSET;
- in.begin->z = TIMELIB_UNSET;
- in.begin->dst = TIMELIB_UNSET;
+ in.begin->f = 0;
+ in.begin->z = 0;
+ in.begin->dst = 0;
in.begin->is_localtime = 0;
- in.begin->zone_type = 0;
+ in.begin->zone_type = TIMELIB_ZONETYPE_OFFSET;
in.end = timelib_time_ctor();
in.end->y = TIMELIB_UNSET;
@@ -918,11 +918,11 @@
in.end->h = TIMELIB_UNSET;
in.end->i = TIMELIB_UNSET;
in.end->s = TIMELIB_UNSET;
- in.end->f = TIMELIB_UNSET;
- in.end->z = TIMELIB_UNSET;
- in.end->dst = TIMELIB_UNSET;
+ in.end->f = 0;
+ in.end->z = 0;
+ in.end->dst = 0;
in.end->is_localtime = 0;
- in.end->zone_type = 0;
+ in.end->zone_type = TIMELIB_ZONETYPE_OFFSET;
in.period = timelib_rel_time_ctor();
in.period->y = 0;
http://cvs.php.net/viewvc.cgi/php-src/ext/date/lib/parse_iso_intervals.re?r1=1.2&r2=1.3&diff_format=u
Index: php-src/ext/date/lib/parse_iso_intervals.re
diff -u php-src/ext/date/lib/parse_iso_intervals.re:1.2
php-src/ext/date/lib/parse_iso_intervals.re:1.3
--- php-src/ext/date/lib/parse_iso_intervals.re:1.2 Fri Apr 25 12:55:16 2008
+++ php-src/ext/date/lib/parse_iso_intervals.re Sun May 4 09:59:42 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: parse_iso_intervals.re,v 1.2 2008/04/25 12:55:16 derick Exp $ */
+/* $Id: parse_iso_intervals.re,v 1.3 2008/05/04 09:59:42 derick Exp $ */
#include "timelib.h"
@@ -452,11 +452,11 @@
in.begin->h = TIMELIB_UNSET;
in.begin->i = TIMELIB_UNSET;
in.begin->s = TIMELIB_UNSET;
- in.begin->f = TIMELIB_UNSET;
- in.begin->z = TIMELIB_UNSET;
- in.begin->dst = TIMELIB_UNSET;
+ in.begin->f = 0;
+ in.begin->z = 0;
+ in.begin->dst = 0;
in.begin->is_localtime = 0;
- in.begin->zone_type = 0;
+ in.begin->zone_type = TIMELIB_ZONETYPE_OFFSET;
in.end = timelib_time_ctor();
in.end->y = TIMELIB_UNSET;
@@ -465,11 +465,11 @@
in.end->h = TIMELIB_UNSET;
in.end->i = TIMELIB_UNSET;
in.end->s = TIMELIB_UNSET;
- in.end->f = TIMELIB_UNSET;
- in.end->z = TIMELIB_UNSET;
- in.end->dst = TIMELIB_UNSET;
+ in.end->f = 0;
+ in.end->z = 0;
+ in.end->dst = 0;
in.end->is_localtime = 0;
- in.end->zone_type = 0;
+ in.end->zone_type = TIMELIB_ZONETYPE_OFFSET;
in.period = timelib_rel_time_ctor();
in.period->y = 0;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php