summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerick Rethans <derick@php.net>2010-03-07 15:26:39 +0000
committerDerick Rethans <derick@php.net>2010-03-07 15:26:39 +0000
commit2c9de65193cf1243fff4bc96e4352300d9f0c077 (patch)
tree89055854a3717d6387eeb990306b3f43bd7a0f3e
parentffeb100e5ef8e093d57d4baadb6f61418cf4da25 (diff)
downloadphp-git-2c9de65193cf1243fff4bc96e4352300d9f0c077.tar.gz
- Fixed bug #40778 (DateInterval::format("%a") is always zero when an interval
is created from an ISO string).
-rw-r--r--ext/date/lib/parse_iso_intervals.c47
-rw-r--r--ext/date/lib/parse_iso_intervals.re1
-rw-r--r--ext/date/php_date.c16
-rw-r--r--ext/date/tests/bug49778.phpt30
4 files changed, 73 insertions, 21 deletions
diff --git a/ext/date/lib/parse_iso_intervals.c b/ext/date/lib/parse_iso_intervals.c
index ba27a5427f..d27d6ff0e2 100644
--- a/ext/date/lib/parse_iso_intervals.c
+++ b/ext/date/lib/parse_iso_intervals.c
@@ -1,10 +1,10 @@
-/* Generated by re2c 0.13.5 on Sat Aug 2 15:43:19 2008 */
+/* Generated by re2c 0.13.5 on Sun Mar 7 15:09:39 2010 */
#line 1 "ext/date/lib/parse_iso_intervals.re"
/*
+----------------------------------------------------------------------+
| PHP Version 6 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2006 The PHP Group |
+ | Copyright (c) 1997-2010 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -270,6 +270,11 @@ static long timelib_get_zone(char **ptr, int *dst, timelib_time *t, int *tz_not_
} \
}
+/* date parser's scan function too large for VC6 - VC7.x
+ drop the optimization solves the problem */
+#ifdef PHP_WIN32
+#pragma optimize( "", off )
+#endif
static int scan(Scanner *s)
{
uchar *cursor = s->cur;
@@ -278,11 +283,11 @@ static int scan(Scanner *s)
std:
s->tok = cursor;
s->len = 0;
-#line 306 "ext/date/lib/parse_iso_intervals.re"
+#line 311 "ext/date/lib/parse_iso_intervals.re"
-#line 286 "ext/date/lib/parse_iso_intervals.c"
+#line 291 "ext/date/lib/parse_iso_intervals.c"
{
YYCTYPE yych;
unsigned int yyaccept = 0;
@@ -352,12 +357,12 @@ std:
if (yych <= '9') goto yy98;
yy3:
YYDEBUG(3, *YYCURSOR);
-#line 419 "ext/date/lib/parse_iso_intervals.re"
+#line 424 "ext/date/lib/parse_iso_intervals.re"
{
add_error(s, "Unexpected character");
goto std;
}
-#line 361 "ext/date/lib/parse_iso_intervals.c"
+#line 366 "ext/date/lib/parse_iso_intervals.c"
yy4:
YYDEBUG(4, *YYCURSOR);
yyaccept = 0;
@@ -374,7 +379,7 @@ yy5:
if (yych == 'T') goto yy14;
yy6:
YYDEBUG(6, *YYCURSOR);
-#line 346 "ext/date/lib/parse_iso_intervals.re"
+#line 351 "ext/date/lib/parse_iso_intervals.re"
{
timelib_sll nr;
int in_time = 0;
@@ -415,26 +420,26 @@ yy6:
TIMELIB_DEINIT;
return TIMELIB_PERIOD;
}
-#line 419 "ext/date/lib/parse_iso_intervals.c"
+#line 424 "ext/date/lib/parse_iso_intervals.c"
yy7:
YYDEBUG(7, *YYCURSOR);
++YYCURSOR;
YYDEBUG(8, *YYCURSOR);
-#line 408 "ext/date/lib/parse_iso_intervals.re"
+#line 413 "ext/date/lib/parse_iso_intervals.re"
{
goto std;
}
-#line 428 "ext/date/lib/parse_iso_intervals.c"
+#line 433 "ext/date/lib/parse_iso_intervals.c"
yy9:
YYDEBUG(9, *YYCURSOR);
++YYCURSOR;
YYDEBUG(10, *YYCURSOR);
-#line 413 "ext/date/lib/parse_iso_intervals.re"
+#line 418 "ext/date/lib/parse_iso_intervals.re"
{
s->pos = cursor; s->line++;
goto std;
}
-#line 438 "ext/date/lib/parse_iso_intervals.c"
+#line 443 "ext/date/lib/parse_iso_intervals.c"
yy11:
YYDEBUG(11, *YYCURSOR);
yych = *++YYCURSOR;
@@ -764,7 +769,7 @@ yy51:
YYDEBUG(57, *YYCURSOR);
++YYCURSOR;
YYDEBUG(58, *YYCURSOR);
-#line 388 "ext/date/lib/parse_iso_intervals.re"
+#line 393 "ext/date/lib/parse_iso_intervals.re"
{
DEBUG_OUTPUT("combinedrep");
TIMELIB_INIT;
@@ -783,7 +788,7 @@ yy51:
TIMELIB_DEINIT;
return TIMELIB_PERIOD;
}
-#line 787 "ext/date/lib/parse_iso_intervals.c"
+#line 792 "ext/date/lib/parse_iso_intervals.c"
yy59:
YYDEBUG(59, *YYCURSOR);
yych = *++YYCURSOR;
@@ -912,7 +917,7 @@ yy83:
YYDEBUG(83, *YYCURSOR);
++YYCURSOR;
YYDEBUG(84, *YYCURSOR);
-#line 322 "ext/date/lib/parse_iso_intervals.re"
+#line 327 "ext/date/lib/parse_iso_intervals.re"
{
timelib_time *current;
@@ -935,7 +940,7 @@ yy83:
TIMELIB_DEINIT;
return TIMELIB_ISO_DATE;
}
-#line 939 "ext/date/lib/parse_iso_intervals.c"
+#line 944 "ext/date/lib/parse_iso_intervals.c"
yy85:
YYDEBUG(85, *YYCURSOR);
yych = *++YYCURSOR;
@@ -1013,7 +1018,7 @@ yy98:
if (yych <= '9') goto yy98;
yy100:
YYDEBUG(100, *YYCURSOR);
-#line 311 "ext/date/lib/parse_iso_intervals.re"
+#line 316 "ext/date/lib/parse_iso_intervals.re"
{
DEBUG_OUTPUT("recurrences");
TIMELIB_INIT;
@@ -1023,11 +1028,14 @@ yy100:
s->have_recurrences = 1;
return TIMELIB_PERIOD;
}
-#line 1027 "ext/date/lib/parse_iso_intervals.c"
+#line 1032 "ext/date/lib/parse_iso_intervals.c"
}
-#line 423 "ext/date/lib/parse_iso_intervals.re"
+#line 428 "ext/date/lib/parse_iso_intervals.re"
}
+#ifdef PHP_WIN32
+#pragma optimize( "", on )
+#endif
#define YYMAXFILL 20
@@ -1110,6 +1118,7 @@ void timelib_strtointerval(char *s, int len,
in.period->weekday = 0;
in.period->weekday_behavior = 0;
in.period->first_last_day_of = 0;
+ in.period->days = TIMELIB_UNSET;
in.recurrences = 1;
diff --git a/ext/date/lib/parse_iso_intervals.re b/ext/date/lib/parse_iso_intervals.re
index e47ab78238..598e8ecf2c 100644
--- a/ext/date/lib/parse_iso_intervals.re
+++ b/ext/date/lib/parse_iso_intervals.re
@@ -512,6 +512,7 @@ void timelib_strtointerval(char *s, int len,
in.period->weekday = 0;
in.period->weekday_behavior = 0;
in.period->first_last_day_of = 0;
+ in.period->days = TIMELIB_UNSET;
in.recurrences = 1;
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index 521aa7eddd..40e75a6d66 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -2347,7 +2347,13 @@ static HashTable *date_object_get_properties_interval(zval *object TSRMLS_DC)
PHP_DATE_INTERVAL_ADD_PROPERTY("i", i);
PHP_DATE_INTERVAL_ADD_PROPERTY("s", s);
PHP_DATE_INTERVAL_ADD_PROPERTY("invert", invert);
- PHP_DATE_INTERVAL_ADD_PROPERTY("days", days);
+ 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(zval), NULL);
+ }
return props;
}
@@ -3727,7 +3733,13 @@ static char *date_interval_format(char *format, int format_len, timelib_rel_time
case 'S': length = slprintf(buffer, 32, "%02d", (int) t->s); break;
case 's': length = slprintf(buffer, 32, "%d", (int) t->s); break;
- case 'a': length = slprintf(buffer, 32, "%d", (int) t->days); break;
+ case 'a': {
+ if ((int) t->days != -99999) {
+ length = slprintf(buffer, 32, "%d", (int) t->days);
+ } else {
+ length = slprintf(buffer, 32, "(unknown)");
+ }
+ } break;
case 'r': length = slprintf(buffer, 32, "%s", t->invert ? "-" : ""); break;
case 'R': length = slprintf(buffer, 32, "%c", t->invert ? '-' : '+'); break;
diff --git a/ext/date/tests/bug49778.phpt b/ext/date/tests/bug49778.phpt
new file mode 100644
index 0000000000..67c8e27f91
--- /dev/null
+++ b/ext/date/tests/bug49778.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #49778 (DateInterval::format("%a") is always zero when an interval is created from an ISO string)
+--FILE--
+<?php
+$i=new DateInterval('P7D');
+var_dump($i);
+echo $i->format("%d"), "\n";
+echo $i->format("%a"), "\n";
+?>
+--EXPECT--
+object(DateInterval)#1 (8) {
+ ["y"]=>
+ int(0)
+ ["m"]=>
+ int(0)
+ ["d"]=>
+ int(7)
+ ["h"]=>
+ int(0)
+ ["i"]=>
+ int(0)
+ ["s"]=>
+ int(0)
+ ["invert"]=>
+ int(0)
+ ["days"]=>
+ bool(false)
+}
+7
+(unknown)