PHP_INSTALL_HEADERS([ext/date], [php_date.h lib/timelib.h lib/timelib_structs.h lib/timelib_config.h])
-AC_CHECK_FUNCS([llabs])
-
cat > $ext_builddir/lib/timelib_config.h <<EOF
#ifdef PHP_WIN32
# include "config.w32.h"
-/* Generated by re2c 0.13.5 on Thu Jan 7 07:53:05 2010 */
+/* Generated by re2c 0.13.5 on Wed Feb 10 15:19:16 2010 */
#line 1 "ext/date/lib/parse_date.re"
/*
+----------------------------------------------------------------------+
TIMELIB_CHECK_NUMBER;
tptr = ptr;
- if ((f = timelib_get_nr((char **) &ptr, 6)) == TIMELIB_UNSET || (ptr - tptr) < 1) {
- add_pbf_error(s, "At least a single digit millisecond could not be found", string, begin);
+ if ((f = timelib_get_nr((char **) &ptr, 6)) == TIMELIB_UNSET || ptr - tptr != 6) {
+ add_pbf_error(s, "A six digit millisecond could not be found", string, begin);
} else {
s->time->f = (f / 1000000);
}
TIMELIB_CHECK_NUMBER;
tptr = ptr;
- if ((f = timelib_get_nr((char **) &ptr, 6)) == TIMELIB_UNSET || (ptr - tptr) < 1) {
- add_pbf_error(s, "At least a single digit millisecond could not be found", string, begin);
+ if ((f = timelib_get_nr((char **) &ptr, 6)) == TIMELIB_UNSET || ptr - tptr != 6) {
+ add_pbf_error(s, "A six digit millisecond could not be found", string, begin);
} else {
s->time->f = (f / 1000000);
}
# include "win32/php_stdint.h"
#endif
-#ifndef HAVE_LLABS
-# if defined(__GNUC__) && __GNUC__ < 3
-static __inline __int64_t llabs( __int64_t i ) { return i >= 0 ? i : -i; }
-# elif defined(NETWARE) && defined(__MWERKS__)
-static __inline long long llabs( long long i ) { return i >= 0 ? i : -i; }
-# endif
-#endif
+static __inline long long php_date_llabs( long long i ) { return i >= 0 ? i : -i; }
/* {{{ arginfo */
ZEND_BEGIN_ARG_INFO_EX(arginfo_date, 0, 0, 1)
php_date_global_timezone_db = NULL;
php_date_global_timezone_db_enabled = 0;
-
DATEG(last_errors) = NULL;
return SUCCESS;
}
char *modify;
int modify_len;
timelib_time *tmp_time;
- struct timelib_error_container *error;
+ timelib_error_container *err = NULL;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &object, date_ce_date, &modify, &modify_len) == FAILURE) {
RETURN_FALSE;
dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC);
DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
- tmp_time = timelib_strtotime(modify, modify_len, &error, DATE_TIMEZONEDB);
+ tmp_time = timelib_strtotime(modify, modify_len, &err, DATE_TIMEZONEDB);
- /* update last errors and warnings, and display the first one */
- update_errors_warnings(error TSRMLS_CC);
- if (error && error->error_count > 0) {
+ /* update last errors and warnings */
+ update_errors_warnings(err TSRMLS_CC);
+ 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,
- error->error_messages[0].position, error->error_messages[0].character, error->error_messages[0].message);
+ err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message);
timelib_time_dtor(tmp_time);
RETURN_FALSE;
}
--- /dev/null
+--TEST--
+Bug #45866 (decimal values fed to DateTime->modify() causes long execution times)
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
+$date->modify( "+1.61538461538 day" );
+echo $date->format( 'r' ), "\n";
+
+$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
+$date->modify( "61538461538 day" );
+echo $date->format( 'r' ), "\n";
+
+$date = new DateTime( '2009-07-29 16:44:23 Europe/London' );
+$date->modify( "£61538461538 day" );
+echo $date->format( 'r' ), "\n";
+?>
+--EXPECTF--
+Thu, 14 Aug 168488594 16:44:23 +0000
+Thu, 14 Aug 168488594 16:44:23 +0000
+
+Warning: DateTime::modify(): Failed to parse time string (£61538461538 day) at position 0 (%s): Unexpected character in %sbug45866.php on line 11
+Wed, 29 Jul 2009 16:44:23 +0100
$now = new DateTime('2008-10-10 01:02:03');
echo $now->format("Y-m-d H:i:s") . PHP_EOL;
-$now->modify("1 day after");
+$now->modify("1 day");
echo $now->format("Y-m-d H:i:s") . PHP_EOL;
-$now->modify("1 hour after");
+$now->modify("1 hour");
echo $now->format("Y-m-d H:i:s") . PHP_EOL;
$now->setTime(0, 0, 0);
var_dump($d->format(DateTime::RFC822));
$c = clone $d;
var_dump($c->format(DateTime::RFC822));
-$d->modify("1 hour after");
+$d->modify("1 hour");
$c->modify("1 second ago");
var_dump($d->format(DateTime::RFC822));
var_dump($c->format(DateTime::RFC822));