summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerick Rethans <github@derickrethans.nl>2014-12-08 11:06:12 +0000
committerJulien Pauli <jpauli@php.net>2014-12-10 13:32:58 +0100
commit3020b613efe92f1f92e8e005551d0f9aacfc21ad (patch)
treed1500ae6c629329dcd89ba85da7fadd79b098659
parent5b098036e8e43ea46d40ab7b7e617e9a0eec3ece (diff)
downloadphp-git-3020b613efe92f1f92e8e005551d0f9aacfc21ad.tar.gz
Fixed day_of_week function as it could sometimes return negative values internally.
-rw-r--r--ext/date/lib/dow.c18
-rw-r--r--ext/date/tests/DateTime_setISODate_variation1.phpt4
-rw-r--r--ext/date/tests/bug49585.phpt5
-rw-r--r--ext/date/tests/date_isodate_set_variation2.phpt4
-rw-r--r--ext/date/tests/getdate_variation7.phpt4
-rw-r--r--ext/date/tests/localtime_variation3.phpt4
6 files changed, 26 insertions, 13 deletions
diff --git a/ext/date/lib/dow.c b/ext/date/lib/dow.c
index a77fdd7182..ccfea996f9 100644
--- a/ext/date/lib/dow.c
+++ b/ext/date/lib/dow.c
@@ -23,9 +23,21 @@
static int m_table_common[13] = { -1, 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 }; /* 1 = jan */
static int m_table_leap[13] = { -1, 6, 2, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 }; /* 1 = jan */
+static timelib_sll positive_mod(timelib_sll x, timelib_sll y)
+{
+ timelib_sll tmp;
+
+ tmp = x % y;
+ if (tmp < 0) {
+ tmp += y;
+ }
+
+ return tmp;
+}
+
static timelib_sll century_value(timelib_sll j)
{
- return 6 - (j % 4) * 2;
+ return 6 - positive_mod(j, 4) * 2;
}
static timelib_sll timelib_day_of_week_ex(timelib_sll y, timelib_sll m, timelib_sll d, int iso)
@@ -36,9 +48,9 @@ static timelib_sll timelib_day_of_week_ex(timelib_sll y, timelib_sll m, timelib_
* Julian calendar. We just return the 'wrong' day of week to be
* consistent. */
c1 = century_value(y / 100);
- y1 = (y % 100);
+ y1 = positive_mod(y, 100);
m1 = timelib_is_leap(y) ? m_table_leap[m] : m_table_common[m];
- dow = (c1 + y1 + m1 + (y1 / 4) + d) % 7;
+ dow = positive_mod((c1 + y1 + m1 + (y1 / 4) + d), 7);
if (iso) {
if (dow == 0) {
dow = 7;
diff --git a/ext/date/tests/DateTime_setISODate_variation1.phpt b/ext/date/tests/DateTime_setISODate_variation1.phpt
index d685f27ed0..a4e8865e73 100644
--- a/ext/date/tests/DateTime_setISODate_variation1.phpt
+++ b/ext/date/tests/DateTime_setISODate_variation1.phpt
@@ -145,7 +145,7 @@ object(DateTime)#%d (3) {
-- int -12345 --
object(DateTime)#%d (3) {
["date"]=>
- string(28) "-12345-02-15 08:34:10.000000"
+ string(28) "-12345-02-11 08:34:10.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
@@ -165,7 +165,7 @@ object(DateTime)#%d (3) {
-- float -10.5 --
object(DateTime)#%d (3) {
["date"]=>
- string(27) "-0010-02-19 08:34:10.000000"
+ string(27) "-0010-02-14 08:34:10.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
diff --git a/ext/date/tests/bug49585.phpt b/ext/date/tests/bug49585.phpt
index 2ec14245ea..d21bba6c5c 100644
--- a/ext/date/tests/bug49585.phpt
+++ b/ext/date/tests/bug49585.phpt
@@ -10,7 +10,8 @@ var_dump($date->format('r'));
$date->setDate(-2147483648, 1, 1);
var_dump($date->format('r'));
var_dump($date->format('c'));
+?>
--EXPECT--
-string(32) "Sat, 01 Jan -1500 00:00:00 +0000"
-string(42) "Unknown, 01 Jan -2147483648 00:00:00 +0000"
+string(32) "Fri, 01 Jan -1500 00:00:00 +0000"
+string(38) "Mon, 01 Jan -2147483648 00:00:00 +0000"
string(32) "-2147483648-01-01T00:00:00+00:00"
diff --git a/ext/date/tests/date_isodate_set_variation2.phpt b/ext/date/tests/date_isodate_set_variation2.phpt
index 5b59a696c6..3c3b6924bb 100644
--- a/ext/date/tests/date_isodate_set_variation2.phpt
+++ b/ext/date/tests/date_isodate_set_variation2.phpt
@@ -145,7 +145,7 @@ object(DateTime)#%d (3) {
-- int -12345 --
object(DateTime)#%d (3) {
["date"]=>
- string(28) "-12345-02-15 08:34:10.000000"
+ string(28) "-12345-02-11 08:34:10.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
@@ -165,7 +165,7 @@ object(DateTime)#%d (3) {
-- float -10.5 --
object(DateTime)#%d (3) {
["date"]=>
- string(27) "-0010-02-19 08:34:10.000000"
+ string(27) "-0010-02-14 08:34:10.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
diff --git a/ext/date/tests/getdate_variation7.phpt b/ext/date/tests/getdate_variation7.phpt
index 5af2dd53fc..2088fa1792 100644
--- a/ext/date/tests/getdate_variation7.phpt
+++ b/ext/date/tests/getdate_variation7.phpt
@@ -61,7 +61,7 @@ array\(11\) {
\["mday"\]=>
int\((9|14|23)\)
\["wday"\]=>
- int\((6|-4)\)
+ int\(0\)
\["mon"\]=>
int\((10|12)\)
\["year"\]=>
@@ -69,7 +69,7 @@ array\(11\) {
\["yday"\]=>
int\((282|347|295)\)
\["weekday"\]=>
- string\((8|7)\) "(Saturday|Unknown)"
+ string\(6\) "Sunday"
\["month"\]=>
string\((7|8)\) "(October|December)"
\[0\]=>
diff --git a/ext/date/tests/localtime_variation3.phpt b/ext/date/tests/localtime_variation3.phpt
index d941e3891e..34d8f57f01 100644
--- a/ext/date/tests/localtime_variation3.phpt
+++ b/ext/date/tests/localtime_variation3.phpt
@@ -87,7 +87,7 @@ array\(9\) {
\[5\]=>
int\((104|1|-3843)\)
\[6\]=>
- int\((5|-5)\)
+ int\(6\)
\[7\]=>
int\((281|346|294)\)
\[8\]=>
@@ -107,7 +107,7 @@ array\(9\) {
\["tm_year"\]=>
int\((104|1|-3843)\)
\["tm_wday"\]=>
- int\((5|-5)\)
+ int\(6\)
\["tm_yday"\]=>
int\((281|346|294)\)
\["tm_isdst"\]=>