]> granicus.if.org Git - php/commitdiff
Improve support for microseconds with Date/Time microseconds
authorDerick Rethans <github@derickrethans.nl>
Wed, 5 Oct 2016 15:24:15 +0000 (11:24 -0400)
committerDerick Rethans <github@derickrethans.nl>
Wed, 5 Oct 2016 19:03:06 +0000 (15:03 -0400)
It fixes several bugs:

- Fixed bug #45554 (Inconsistent behavior of the u format char).
- Fixed bug #48225 (DateTime parser doesn't set microseconds for "now").
- Fixed bug #52514 (microseconds are missing in DateTime class).
- Fixed bug #52519 (microseconds in DateInterval are missing).
- Fixed bug #68506 (General DateTime improvments needed for microseconds to become useful).
- Fixed bug #73109 (timelib_meridian doesn't parse dots correctly).
- Fixed bug #73247 (DateTime constructor does not initialise microseconds property).

It also updates timelib to 2016.04, and updates a data mapping file, which
causes changes to the volatile abbreviations tests.

40 files changed:
NEWS
ext/date/config.w32
ext/date/lib/interval.c
ext/date/lib/parse_date.c
ext/date/lib/parse_date.re
ext/date/lib/timelib.c
ext/date/lib/timelib.h
ext/date/lib/timelib.m4
ext/date/lib/timelib_structs.h
ext/date/lib/timezonemap.h
ext/date/lib/tm2unixtime.c
ext/date/lib/unixtime2tm.c
ext/date/php_date.c
ext/date/tests/010.phpt
ext/date/tests/DateTimeZone_getLocation.phpt
ext/date/tests/DateTimeZone_listAbbreviations_basic1.phpt
ext/date/tests/DateTime_setTime_error.phpt
ext/date/tests/bug45682.phpt
ext/date/tests/bug48678.phpt
ext/date/tests/bug49081.phpt
ext/date/tests/bug49778.phpt
ext/date/tests/bug52113.phpt
ext/date/tests/bug52738.phpt
ext/date/tests/bug52808.phpt
ext/date/tests/bug53437.phpt
ext/date/tests/bug53437_var2.phpt
ext/date/tests/bug53437_var4.phpt
ext/date/tests/bug53437_var5.phpt
ext/date/tests/bug53437_var6.phpt [new file with mode: 0644]
ext/date/tests/bug60774.phpt
ext/date/tests/date_diff1.phpt
ext/date/tests/date_interval_create_from_date_string_nullparam.phpt
ext/date/tests/date_interval_create_from_date_string_wrongparam_002.phpt
ext/date/tests/date_time_fractions.phpt [new file with mode: 0644]
ext/date/tests/date_time_fractions_create_from_format.phpt [new file with mode: 0644]
ext/date/tests/date_time_fractions_serialize.phpt [new file with mode: 0644]
ext/date/tests/date_time_set_error.phpt
ext/date/tests/timezone_abbreviations_list_basic1.phpt
ext/date/tests/timezone_name_from_abbr_basic1.phpt
ext/spl/tests/bug70155.phpt

diff --git a/NEWS b/NEWS
index d1f4b5a81b046f80319c017ab6c73175c818f121..eb4c578b03d890f0ac6c0f5601be2ac7c311e6b2 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,21 @@ PHP                                                                        NEWS
   . Fixed bug #73126 (Cannot pass parameter 1 by reference). (Anatol)
   . Fixed bug #69579 (Invalid free in extension trait). (John Boehr)
 
+- Date:
+  . Fixed bug #45554 (Inconsistent behavior of the u format char). (Derick)
+  . Fixed bug #48225 (DateTime parser doesn't set microseconds for "now").
+    (Derick)
+  . Fixed bug #52514 (microseconds are missing in DateTime class). (Derick)
+  . Fixed bug #52519 (microseconds in DateInterval are missing). (Derick)
+  . Fixed bug #60089 (DateTime::createFromFormat() U after u nukes microtime).
+    (Derick)
+  . Fixed bug #68506 (General DateTime improvments needed for microseconds to
+    become useful). (Derick)
+  . Fixed bug #73109 (timelib_meridian doesn't parse dots correctly). (Derick)
+  . Fixed bug #73247 (DateTime constructor does not initialise microseconds
+    property). (Derick)
+    
+
 - GD:
   . Fixed bug #50194 (imagettftext broken on transparent background w/o
     alphablending). (cmb)
index ff5c4fff1ca0c4d3f569ec4969cbba0518140e40..889032aa855ca0e26a36e755c9bf169d8e838789 100755 (executable)
@@ -11,6 +11,7 @@ var tl_config = FSO.CreateTextFile("ext/date/lib/timelib_config.h", true);
 tl_config.WriteLine("#include \"config.w32.h\"");
 tl_config.WriteLine("#include <php_stdint.h>");
 tl_config.WriteLine("#define TIMELIB_OMIT_STDINT 1");
+tl_config.WriteLine("#define HAVE_GETTIMEOFDAY 1");
 tl_config.WriteLine("#include \"zend.h\"");
 tl_config.WriteLine("#define timelib_malloc  emalloc");
 tl_config.WriteLine("#define timelib_realloc erealloc");
index 9c1cc3b273d8059d2fe57d653d0f451d3f4ca45e..dee9f92eedb1f0a3285a709be6c054808ecdb973 100644 (file)
@@ -65,6 +65,7 @@ timelib_rel_time *timelib_diff(timelib_time *one, timelib_time *two)
        rt->h = two->h - one->h;
        rt->i = two->i - one->i;
        rt->s = two->s - one->s;
+       rt->f = two->f - one->f;
        if (one_backup.dst == 0 && two_backup.dst == 1 && two->sse >= one->sse + 86400 - dst_corr) {
                rt->h += dst_h_corr;
                rt->i += dst_m_corr;
@@ -110,6 +111,7 @@ timelib_time *timelib_add(timelib_time *old_time, timelib_rel_time *interval)
                t->relative.h = interval->h * bias;
                t->relative.i = interval->i * bias;
                t->relative.s = interval->s * bias;
+               t->relative.f = interval->f * bias;
        }
        t->have_relative = 1;
        t->sse_uptodate = 0;
@@ -145,6 +147,7 @@ timelib_time *timelib_sub(timelib_time *old_time, timelib_rel_time *interval)
        t->relative.h = 0 - (interval->h * bias);
        t->relative.i = 0 - (interval->i * bias);
        t->relative.s = 0 - (interval->s * bias);
+       t->relative.f = 0 - (interval->f * bias);
        t->have_relative = 1;
        t->sse_uptodate = 0;
 
index a23dc81db2ca205d8ce187a9c65c225a340af79d..c1547a0f32af990c5a64b7485f5a11426e6be37c 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.15.3 on Fri Sep 30 20:30:54 2016 */
+/* Generated by re2c 0.15.3 on Wed Oct  5 11:54:35 2016 */
 #line 1 "ext/date/lib/parse_date.re"
 /*
  * The MIT License (MIT)
@@ -824,7 +824,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 std:
        s->tok = cursor;
        s->len = 0;
-#line 950 "ext/date/lib/parse_date.re"
+#line 951 "ext/date/lib/parse_date.re"
 
 
 
@@ -951,19 +951,19 @@ yy2:
                } else {
                        if (yych <= '@') goto yy3;
                        if (yych <= 'D') goto yy140;
-                       goto yy1523;
+                       goto yy1531;
                }
        } else {
                if (yych <= 'd') {
                        if (yych <= 'Z') goto yy140;
                        if (yych >= 'a') goto yy145;
                } else {
-                       if (yych <= 'e') goto yy1532;
+                       if (yych <= 'e') goto yy1540;
                        if (yych <= 'z') goto yy145;
                }
        }
 yy3:
-#line 1630 "ext/date/lib/parse_date.re"
+#line 1659 "ext/date/lib/parse_date.re"
        {
                int tz_not_found;
                DEBUG_OUTPUT("tzcorrection | tz");
@@ -986,7 +986,7 @@ yy4:
                } else {
                        if (yych <= '@') goto yy3;
                        if (yych <= 'D') goto yy140;
-                       goto yy1523;
+                       goto yy1531;
                }
        } else {
                if (yych <= 'd') {
@@ -994,7 +994,7 @@ yy4:
                        if (yych <= '`') goto yy3;
                        goto yy140;
                } else {
-                       if (yych <= 'e') goto yy1523;
+                       if (yych <= 'e') goto yy1531;
                        if (yych <= 'z') goto yy140;
                        goto yy3;
                }
@@ -1008,12 +1008,12 @@ yy5:
                        goto yy140;
                } else {
                        if (yych <= 'H') {
-                               if (yych <= 'E') goto yy1494;
+                               if (yych <= 'E') goto yy1502;
                                goto yy140;
                        } else {
-                               if (yych <= 'I') goto yy1495;
+                               if (yych <= 'I') goto yy1503;
                                if (yych <= 'N') goto yy140;
-                               goto yy1493;
+                               goto yy1501;
                        }
                }
        } else {
@@ -1022,15 +1022,15 @@ yy5:
                                if (yych <= 'Z') goto yy140;
                                goto yy3;
                        } else {
-                               if (yych == 'e') goto yy1510;
+                               if (yych == 'e') goto yy1518;
                                goto yy145;
                        }
                } else {
                        if (yych <= 'n') {
-                               if (yych <= 'i') goto yy1511;
+                               if (yych <= 'i') goto yy1519;
                                goto yy145;
                        } else {
-                               if (yych <= 'o') goto yy1509;
+                               if (yych <= 'o') goto yy1517;
                                if (yych <= 'z') goto yy145;
                                goto yy3;
                        }
@@ -1045,12 +1045,12 @@ yy6:
                        goto yy140;
                } else {
                        if (yych <= 'H') {
-                               if (yych <= 'E') goto yy1494;
+                               if (yych <= 'E') goto yy1502;
                                goto yy140;
                        } else {
-                               if (yych <= 'I') goto yy1495;
+                               if (yych <= 'I') goto yy1503;
                                if (yych <= 'N') goto yy140;
-                               goto yy1493;
+                               goto yy1501;
                        }
                }
        } else {
@@ -1059,15 +1059,15 @@ yy6:
                                if (yych <= 'Z') goto yy140;
                                goto yy3;
                        } else {
-                               if (yych == 'e') goto yy1494;
+                               if (yych == 'e') goto yy1502;
                                goto yy140;
                        }
                } else {
                        if (yych <= 'n') {
-                               if (yych <= 'i') goto yy1495;
+                               if (yych <= 'i') goto yy1503;
                                goto yy140;
                        } else {
-                               if (yych <= 'o') goto yy1493;
+                               if (yych <= 'o') goto yy1501;
                                if (yych <= 'z') goto yy140;
                                goto yy3;
                        }
@@ -1079,24 +1079,24 @@ yy7:
                if (yych <= 'A') {
                        if (yych == ')') goto yy139;
                        if (yych <= '@') goto yy3;
-                       goto yy1463;
+                       goto yy1471;
                } else {
-                       if (yych == 'I') goto yy1464;
+                       if (yych == 'I') goto yy1472;
                        if (yych <= 'N') goto yy140;
-                       goto yy1465;
+                       goto yy1473;
                }
        } else {
                if (yych <= 'h') {
                        if (yych <= 'Z') goto yy140;
                        if (yych <= '`') goto yy3;
-                       if (yych <= 'a') goto yy1478;
+                       if (yych <= 'a') goto yy1486;
                        goto yy145;
                } else {
                        if (yych <= 'n') {
-                               if (yych <= 'i') goto yy1479;
+                               if (yych <= 'i') goto yy1487;
                                goto yy145;
                        } else {
-                               if (yych <= 'o') goto yy1480;
+                               if (yych <= 'o') goto yy1488;
                                if (yych <= 'z') goto yy145;
                                goto yy3;
                        }
@@ -1108,24 +1108,24 @@ yy8:
                if (yych <= 'A') {
                        if (yych == ')') goto yy139;
                        if (yych <= '@') goto yy3;
-                       goto yy1463;
+                       goto yy1471;
                } else {
-                       if (yych == 'I') goto yy1464;
+                       if (yych == 'I') goto yy1472;
                        if (yych <= 'N') goto yy140;
-                       goto yy1465;
+                       goto yy1473;
                }
        } else {
                if (yych <= 'h') {
                        if (yych <= 'Z') goto yy140;
                        if (yych <= '`') goto yy3;
-                       if (yych <= 'a') goto yy1463;
+                       if (yych <= 'a') goto yy1471;
                        goto yy140;
                } else {
                        if (yych <= 'n') {
-                               if (yych <= 'i') goto yy1464;
+                               if (yych <= 'i') goto yy1472;
                                goto yy140;
                        } else {
-                               if (yych <= 'o') goto yy1465;
+                               if (yych <= 'o') goto yy1473;
                                if (yych <= 'z') goto yy140;
                                goto yy3;
                        }
@@ -1137,15 +1137,15 @@ yy9:
        switch (yych) {
        case ')':       goto yy139;
        case '0':
-       case '1':       goto yy1393;
-       case '2':       goto yy1394;
+       case '1':       goto yy1401;
+       case '2':       goto yy1402;
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
-       case '9':       goto yy1395;
+       case '9':       goto yy1403;
        case 'A':
        case 'B':
        case 'C':
@@ -1167,11 +1167,11 @@ yy9:
        case 'X':
        case 'Y':
        case 'Z':       goto yy140;
-       case 'E':       goto yy1388;
-       case 'H':       goto yy1389;
-       case 'O':       goto yy1390;
-       case 'U':       goto yy1391;
-       case 'W':       goto yy1392;
+       case 'E':       goto yy1396;
+       case 'H':       goto yy1397;
+       case 'O':       goto yy1398;
+       case 'U':       goto yy1399;
+       case 'W':       goto yy1400;
        case 'a':
        case 'b':
        case 'c':
@@ -1193,11 +1193,11 @@ yy9:
        case 'x':
        case 'y':
        case 'z':       goto yy145;
-       case 'e':       goto yy1431;
-       case 'h':       goto yy1432;
-       case 'o':       goto yy1433;
-       case 'u':       goto yy1434;
-       case 'w':       goto yy1435;
+       case 'e':       goto yy1439;
+       case 'h':       goto yy1440;
+       case 'o':       goto yy1441;
+       case 'u':       goto yy1442;
+       case 'w':       goto yy1443;
        default:        goto yy3;
        }
 yy10:
@@ -1206,15 +1206,15 @@ yy10:
        switch (yych) {
        case ')':       goto yy139;
        case '0':
-       case '1':       goto yy1393;
-       case '2':       goto yy1394;
+       case '1':       goto yy1401;
+       case '2':       goto yy1402;
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
-       case '9':       goto yy1395;
+       case '9':       goto yy1403;
        case 'A':
        case 'B':
        case 'C':
@@ -1258,15 +1258,15 @@ yy10:
        case 'y':
        case 'z':       goto yy140;
        case 'E':
-       case 'e':       goto yy1388;
+       case 'e':       goto yy1396;
        case 'H':
-       case 'h':       goto yy1389;
+       case 'h':       goto yy1397;
        case 'O':
-       case 'o':       goto yy1390;
+       case 'o':       goto yy1398;
        case 'U':
-       case 'u':       goto yy1391;
+       case 'u':       goto yy1399;
        case 'W':
-       case 'w':       goto yy1392;
+       case 'w':       goto yy1400;
        default:        goto yy3;
        }
 yy11:
@@ -1276,7 +1276,7 @@ yy11:
        if (yych <= '/') goto yy12;
        if (yych <= '9') goto yy1385;
 yy12:
-#line 1725 "ext/date/lib/parse_date.re"
+#line 1754 "ext/date/lib/parse_date.re"
        {
                add_error(s, "Unexpected character");
                goto std;
@@ -2295,7 +2295,7 @@ yy48:
        if (yych <= '/') goto yy49;
        if (yych <= '9') goto yy54;
 yy49:
-#line 1714 "ext/date/lib/parse_date.re"
+#line 1743 "ext/date/lib/parse_date.re"
        {
                goto std;
        }
@@ -2305,7 +2305,7 @@ yy50:
        goto yy49;
 yy51:
        ++YYCURSOR;
-#line 1719 "ext/date/lib/parse_date.re"
+#line 1748 "ext/date/lib/parse_date.re"
        {
                s->pos = cursor; s->line++;
                goto std;
@@ -2372,7 +2372,7 @@ yy54:
        }
 yy56:
        YYCURSOR = YYMARKER;
-       if (yyaccept <= 16) {
+       if (yyaccept <= 17) {
                if (yyaccept <= 8) {
                        if (yyaccept <= 4) {
                                if (yyaccept <= 2) {
@@ -2408,98 +2408,102 @@ yy56:
                                }
                        }
                } else {
-                       if (yyaccept <= 12) {
-                               if (yyaccept <= 10) {
-                                       if (yyaccept == 9) {
-                                               goto yy392;
+                       if (yyaccept <= 13) {
+                               if (yyaccept <= 11) {
+                                       if (yyaccept <= 10) {
+                                               if (yyaccept == 9) {
+                                                       goto yy392;
+                                               } else {
+                                                       goto yy475;
+                                               }
                                        } else {
-                                               goto yy475;
+                                               goto yy490;
                                        }
                                } else {
-                                       if (yyaccept == 11) {
-                                               goto yy490;
-                                       } else {
+                                       if (yyaccept == 12) {
                                                goto yy611;
+                                       } else {
+                                               goto yy656;
                                        }
                                }
                        } else {
-                               if (yyaccept <= 14) {
-                                       if (yyaccept == 13) {
-                                               goto yy656;
-                                       } else {
+                               if (yyaccept <= 15) {
+                                       if (yyaccept == 14) {
                                                goto yy666;
+                                       } else {
+                                               goto yy763;
                                        }
                                } else {
-                                       if (yyaccept == 15) {
-                                               goto yy763;
-                                       } else {
+                                       if (yyaccept == 16) {
                                                goto yy783;
+                                       } else {
+                                               goto yy814;
                                        }
                                }
                        }
                }
        } else {
-               if (yyaccept <= 25) {
-                       if (yyaccept <= 21) {
-                               if (yyaccept <= 19) {
-                                       if (yyaccept <= 18) {
-                                               if (yyaccept == 17) {
-                                                       goto yy814;
-                                               } else {
+               if (yyaccept <= 26) {
+                       if (yyaccept <= 22) {
+                               if (yyaccept <= 20) {
+                                       if (yyaccept <= 19) {
+                                               if (yyaccept == 18) {
                                                        goto yy821;
+                                               } else {
+                                                       goto yy848;
                                                }
                                        } else {
-                                               goto yy848;
+                                               goto yy793;
                                        }
                                } else {
-                                       if (yyaccept == 20) {
-                                               goto yy793;
-                                       } else {
+                                       if (yyaccept == 21) {
                                                goto yy454;
+                                       } else {
+                                               goto yy973;
                                        }
                                }
                        } else {
-                               if (yyaccept <= 23) {
-                                       if (yyaccept == 22) {
-                                               goto yy973;
-                                       } else {
+                               if (yyaccept <= 24) {
+                                       if (yyaccept == 23) {
                                                goto yy842;
+                                       } else {
+                                               goto yy1067;
                                        }
                                } else {
-                                       if (yyaccept == 24) {
-                                               goto yy1067;
-                                       } else {
+                                       if (yyaccept == 25) {
                                                goto yy1075;
+                                       } else {
+                                               goto yy1117;
                                        }
                                }
                        }
                } else {
-                       if (yyaccept <= 29) {
-                               if (yyaccept <= 27) {
-                                       if (yyaccept == 26) {
-                                               goto yy1117;
-                                       } else {
+                       if (yyaccept <= 30) {
+                               if (yyaccept <= 28) {
+                                       if (yyaccept == 27) {
                                                goto yy1141;
+                                       } else {
+                                               goto yy1294;
                                        }
                                } else {
-                                       if (yyaccept == 28) {
-                                               goto yy1294;
+                                       if (yyaccept == 29) {
+                                               goto yy1387;
                                        } else {
-                                               goto yy1417;
+                                               goto yy1425;
                                        }
                                }
                        } else {
-                               if (yyaccept <= 31) {
-                                       if (yyaccept == 30) {
-                                               goto yy1420;
+                               if (yyaccept <= 32) {
+                                       if (yyaccept == 31) {
+                                               goto yy1428;
                                        } else {
-                                               goto yy1500;
+                                               goto yy1508;
                                        }
                                } else {
-                                       if (yyaccept == 32) {
-                                               goto yy1508;
+                                       if (yyaccept == 33) {
+                                               goto yy1516;
                                        } else {
-                                               goto yy1531;
+                                               goto yy1539;
                                        }
                                }
                        }
@@ -2677,7 +2681,7 @@ yy71:
        if (yych == 'S') goto yy73;
        if (yych == 's') goto yy73;
 yy72:
-#line 1698 "ext/date/lib/parse_date.re"
+#line 1727 "ext/date/lib/parse_date.re"
        {
                timelib_ull i;
                DEBUG_OUTPUT("relative");
@@ -2692,7 +2696,7 @@ yy72:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 2696 "<stdout>"
+#line 2700 "<stdout>"
 yy73:
        yych = *++YYCURSOR;
        if (yych == 'D') goto yy74;
@@ -3360,7 +3364,7 @@ yy165:
                }
        }
 yy166:
-#line 1561 "ext/date/lib/parse_date.re"
+#line 1590 "ext/date/lib/parse_date.re"
        {
                const timelib_relunit* relunit;
                DEBUG_OUTPUT("daytext");
@@ -3377,7 +3381,7 @@ yy166:
                TIMELIB_DEINIT;
                return TIMELIB_WEEKDAY;
        }
-#line 3381 "<stdout>"
+#line 3385 "<stdout>"
 yy167:
        yych = *++YYCURSOR;
        if (yych <= 'K') {
@@ -3870,7 +3874,7 @@ yy192:
                }
        }
 yy193:
-#line 1620 "ext/date/lib/parse_date.re"
+#line 1649 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("monthtext");
                TIMELIB_INIT;
@@ -3879,7 +3883,7 @@ yy193:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_TEXT;
        }
-#line 3883 "<stdout>"
+#line 3887 "<stdout>"
 yy194:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 21) YYFILL(21);
@@ -3925,7 +3929,7 @@ yy197:
                }
        }
 yy198:
-#line 1366 "ext/date/lib/parse_date.re"
+#line 1395 "ext/date/lib/parse_date.re"
        {
                int length = 0;
                DEBUG_OUTPUT("datetextual | datenoyear");
@@ -3938,7 +3942,7 @@ yy198:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_TEXT;
        }
-#line 3942 "<stdout>"
+#line 3946 "<stdout>"
 yy199:
        yyaccept = 6;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -4183,7 +4187,7 @@ yy221:
                if (yych <= ':') goto yy224;
        }
 yy222:
-#line 1668 "ext/date/lib/parse_date.re"
+#line 1697 "ext/date/lib/parse_date.re"
        {
                int tz_not_found;
                DEBUG_OUTPUT("dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz");
@@ -4212,7 +4216,7 @@ yy222:
                TIMELIB_DEINIT;
                return TIMELIB_SHORTDATE_WITH_TIME;
        }
-#line 4216 "<stdout>"
+#line 4220 "<stdout>"
 yy223:
        yyaccept = 7;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -4854,7 +4858,7 @@ yy276:
        }
 yy277:
        ++YYCURSOR;
-#line 1644 "ext/date/lib/parse_date.re"
+#line 1673 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("dateshortwithtimeshort12 | dateshortwithtimelong12");
                TIMELIB_INIT;
@@ -4877,7 +4881,7 @@ yy277:
                TIMELIB_DEINIT;
                return TIMELIB_SHORTDATE_WITH_TIME;
        }
-#line 4881 "<stdout>"
+#line 4885 "<stdout>"
 yy279:
        yych = *++YYCURSOR;
        if (yych <= 0x1F) {
@@ -5039,7 +5043,7 @@ yy292:
 yy293:
        ++YYCURSOR;
 yy294:
-#line 1338 "ext/date/lib/parse_date.re"
+#line 1367 "ext/date/lib/parse_date.re"
        {
                int length = 0;
                DEBUG_OUTPUT("datenoday");
@@ -5052,7 +5056,7 @@ yy294:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_NO_DAY;
        }
-#line 5056 "<stdout>"
+#line 5060 "<stdout>"
 yy295:
        yych = *++YYCURSOR;
        if (yych <= '/') {
@@ -6203,7 +6207,7 @@ yy361:
        if ((yych = *YYCURSOR) <= '/') goto yy363;
        if (yych <= '9') goto yy364;
 yy363:
-#line 1482 "ext/date/lib/parse_date.re"
+#line 1511 "ext/date/lib/parse_date.re"
        {
                int length = 0;
                DEBUG_OUTPUT("pgtextshort");
@@ -6216,7 +6220,7 @@ yy363:
                TIMELIB_DEINIT;
                return TIMELIB_PG_TEXT;
        }
-#line 6220 "<stdout>"
+#line 6224 "<stdout>"
 yy364:
        yych = *++YYCURSOR;
        if (yych <= '/') goto yy363;
@@ -6825,7 +6829,7 @@ yy391:
                if (yych <= 'z') goto yy142;
        }
 yy392:
-#line 1540 "ext/date/lib/parse_date.re"
+#line 1569 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("ago");
                TIMELIB_INIT;
@@ -6845,7 +6849,7 @@ yy392:
                TIMELIB_DEINIT;
                return TIMELIB_AGO;
        }
-#line 6849 "<stdout>"
+#line 6853 "<stdout>"
 yy393:
        yyaccept = 5;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -8533,7 +8537,7 @@ yy452:
 yy453:
        ++YYCURSOR;
 yy454:
-#line 1243 "ext/date/lib/parse_date.re"
+#line 1272 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("iso8601date4 | iso8601date2 | iso8601dateslash | dateslash");
                TIMELIB_INIT;
@@ -8544,7 +8548,7 @@ yy454:
                TIMELIB_DEINIT;
                return TIMELIB_ISO_DATE;
        }
-#line 8548 "<stdout>"
+#line 8552 "<stdout>"
 yy455:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -9080,7 +9084,7 @@ yy474:
                }
        }
 yy475:
-#line 1380 "ext/date/lib/parse_date.re"
+#line 1409 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("datenoyearrev");
                TIMELIB_INIT;
@@ -9091,7 +9095,7 @@ yy475:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_TEXT;
        }
-#line 9095 "<stdout>"
+#line 9099 "<stdout>"
 yy476:
        yyaccept = 10;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -9219,7 +9223,7 @@ yy485:
        }
 yy487:
        ++YYCURSOR;
-#line 1098 "ext/date/lib/parse_date.re"
+#line 1127 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("timetiny12 | timeshort12 | timelong12");
                TIMELIB_INIT;
@@ -9235,7 +9239,7 @@ yy487:
                TIMELIB_DEINIT;
                return TIMELIB_TIME12;
        }
-#line 9239 "<stdout>"
+#line 9243 "<stdout>"
 yy489:
        yyaccept = 11;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -9246,7 +9250,7 @@ yy489:
                if (yych <= ':') goto yy492;
        }
 yy490:
-#line 1135 "ext/date/lib/parse_date.re"
+#line 1164 "ext/date/lib/parse_date.re"
        {
                int tz_not_found;
                DEBUG_OUTPUT("timeshort24 | timelong24 | iso8601long");
@@ -9271,7 +9275,7 @@ yy490:
                TIMELIB_DEINIT;
                return TIMELIB_TIME24_WITH_ZONE;
        }
-#line 9275 "<stdout>"
+#line 9279 "<stdout>"
 yy491:
        yyaccept = 11;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -9548,7 +9552,7 @@ yy520:
        }
 yy522:
        ++YYCURSOR;
-#line 1115 "ext/date/lib/parse_date.re"
+#line 1144 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("mssqltime");
                TIMELIB_INIT;
@@ -9567,7 +9571,7 @@ yy522:
                TIMELIB_DEINIT;
                return TIMELIB_TIME24_WITH_ZONE;
        }
-#line 9571 "<stdout>"
+#line 9575 "<stdout>"
 yy524:
        yyaccept = 11;
        YYMARKER = ++YYCURSOR;
@@ -9662,7 +9666,7 @@ yy533:
        if ((yych = *YYCURSOR) <= '/') goto yy534;
        if (yych <= '9') goto yy540;
 yy534:
-#line 1297 "ext/date/lib/parse_date.re"
+#line 1326 "ext/date/lib/parse_date.re"
        {
                int length = 0;
                DEBUG_OUTPUT("datefull");
@@ -9676,7 +9680,7 @@ yy534:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_FULL;
        }
-#line 9680 "<stdout>"
+#line 9684 "<stdout>"
 yy535:
        yych = *++YYCURSOR;
        if (yych == 'M') goto yy536;
@@ -10340,7 +10344,7 @@ yy604:
        if (yych <= '/') goto yy56;
        if (yych >= ':') goto yy56;
        ++YYCURSOR;
-#line 1312 "ext/date/lib/parse_date.re"
+#line 1341 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("pointed date YYYY");
                TIMELIB_INIT;
@@ -10351,7 +10355,7 @@ yy604:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_FULL_POINTED;
        }
-#line 10355 "<stdout>"
+#line 10359 "<stdout>"
 yy607:
        yyaccept = 11;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -10382,7 +10386,7 @@ yy610:
        if (yych <= '/') goto yy611;
        if (yych <= '9') goto yy604;
 yy611:
-#line 1324 "ext/date/lib/parse_date.re"
+#line 1353 "ext/date/lib/parse_date.re"
        {
                int length = 0;
                DEBUG_OUTPUT("pointed date YY");
@@ -10395,7 +10399,7 @@ yy611:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_FULL_POINTED;
        }
-#line 10399 "<stdout>"
+#line 10403 "<stdout>"
 yy612:
        yyaccept = 11;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -10991,7 +10995,7 @@ yy655:
                }
        }
 yy656:
-#line 1283 "ext/date/lib/parse_date.re"
+#line 1312 "ext/date/lib/parse_date.re"
        {
                int length = 0;
                DEBUG_OUTPUT("gnudateshort");
@@ -11004,7 +11008,7 @@ yy656:
                TIMELIB_DEINIT;
                return TIMELIB_ISO_DATE;
        }
-#line 11008 "<stdout>"
+#line 11012 "<stdout>"
 yy657:
        yyaccept = 13;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -11100,7 +11104,7 @@ yy665:
                }
        }
 yy666:
-#line 1227 "ext/date/lib/parse_date.re"
+#line 1256 "ext/date/lib/parse_date.re"
        {
                int length = 0;
                DEBUG_OUTPUT("americanshort | american");
@@ -11115,7 +11119,7 @@ yy666:
                TIMELIB_DEINIT;
                return TIMELIB_AMERICAN;
        }
-#line 11119 "<stdout>"
+#line 11123 "<stdout>"
 yy667:
        yyaccept = 14;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -11314,7 +11318,7 @@ yy699:
        if (yych <= '9') goto yy702;
        if (yych <= ':') goto yy703;
 yy700:
-#line 1510 "ext/date/lib/parse_date.re"
+#line 1539 "ext/date/lib/parse_date.re"
        {
                int tz_not_found;
                DEBUG_OUTPUT("clf");
@@ -11334,7 +11338,7 @@ yy700:
                TIMELIB_DEINIT;
                return TIMELIB_CLF;
        }
-#line 11338 "<stdout>"
+#line 11342 "<stdout>"
 yy701:
        yych = *++YYCURSOR;
        if (yych <= '5') {
@@ -11821,7 +11825,7 @@ yy762:
                if (yych <= 't') goto yy662;
        }
 yy763:
-#line 1255 "ext/date/lib/parse_date.re"
+#line 1284 "ext/date/lib/parse_date.re"
        {
                int length = 0;
                DEBUG_OUTPUT("iso8601date2");
@@ -11834,7 +11838,7 @@ yy763:
                TIMELIB_DEINIT;
                return TIMELIB_ISO_DATE;
        }
-#line 11838 "<stdout>"
+#line 11842 "<stdout>"
 yy764:
        yych = *++YYCURSOR;
        if (yych == 'C') goto yy765;
@@ -11865,7 +11869,7 @@ yy769:
        if (yych >= '2') goto yy56;
 yy770:
        ++YYCURSOR;
-#line 1496 "ext/date/lib/parse_date.re"
+#line 1525 "ext/date/lib/parse_date.re"
        {
                int length = 0;
                DEBUG_OUTPUT("pgtextreverse");
@@ -11878,7 +11882,7 @@ yy770:
                TIMELIB_DEINIT;
                return TIMELIB_PG_TEXT;
        }
-#line 11882 "<stdout>"
+#line 11886 "<stdout>"
 yy772:
        yych = *++YYCURSOR;
        if (yych == 'V') goto yy765;
@@ -12003,7 +12007,7 @@ yy782:
        default:        goto yy783;
        }
 yy783:
-#line 1531 "ext/date/lib/parse_date.re"
+#line 1560 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("year4");
                TIMELIB_INIT;
@@ -12011,7 +12015,7 @@ yy783:
                TIMELIB_DEINIT;
                return TIMELIB_CLF;
        }
-#line 12015 "<stdout>"
+#line 12019 "<stdout>"
 yy784:
        yych = *++YYCURSOR;
        switch (yych) {
@@ -12149,7 +12153,7 @@ yy792:
                if (yych <= 'X') goto yy883;
        }
 yy793:
-#line 1352 "ext/date/lib/parse_date.re"
+#line 1381 "ext/date/lib/parse_date.re"
        {
                int length = 0;
                DEBUG_OUTPUT("datenodayrev");
@@ -12162,7 +12166,7 @@ yy793:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_NO_DAY;
        }
-#line 12166 "<stdout>"
+#line 12170 "<stdout>"
 yy794:
        yych = *++YYCURSOR;
        if (yych == 'I') goto yy927;
@@ -12356,7 +12360,7 @@ yy813:
        if (yych <= '/') goto yy814;
        if (yych <= '7') goto yy816;
 yy814:
-#line 1463 "ext/date/lib/parse_date.re"
+#line 1492 "ext/date/lib/parse_date.re"
        {
                timelib_sll w, d;
                DEBUG_OUTPUT("isoweek");
@@ -12374,14 +12378,14 @@ yy814:
                TIMELIB_DEINIT;
                return TIMELIB_ISO_WEEK;
        }
-#line 12378 "<stdout>"
+#line 12382 "<stdout>"
 yy815:
        yych = *++YYCURSOR;
        if (yych <= '/') goto yy56;
        if (yych >= '8') goto yy56;
 yy816:
        ++YYCURSOR;
-#line 1444 "ext/date/lib/parse_date.re"
+#line 1473 "ext/date/lib/parse_date.re"
        {
                timelib_sll w, d;
                DEBUG_OUTPUT("isoweekday");
@@ -12399,7 +12403,7 @@ yy816:
                TIMELIB_DEINIT;
                return TIMELIB_ISO_WEEK;
        }
-#line 12403 "<stdout>"
+#line 12407 "<stdout>"
 yy818:
        yych = *++YYCURSOR;
        if (yych <= '/') goto yy60;
@@ -12459,7 +12463,7 @@ yy820:
                }
        }
 yy821:
-#line 1430 "ext/date/lib/parse_date.re"
+#line 1459 "ext/date/lib/parse_date.re"
        {
                int length = 0;
                DEBUG_OUTPUT("pgydotd");
@@ -12472,7 +12476,7 @@ yy821:
                TIMELIB_DEINIT;
                return TIMELIB_PG_YEARDAY;
        }
-#line 12476 "<stdout>"
+#line 12480 "<stdout>"
 yy822:
        yych = *++YYCURSOR;
        if (yych <= '/') goto yy60;
@@ -12554,7 +12558,7 @@ yy840:
 yy841:
        ++YYCURSOR;
 yy842:
-#line 1404 "ext/date/lib/parse_date.re"
+#line 1433 "ext/date/lib/parse_date.re"
        {
                int tz_not_found;
                DEBUG_OUTPUT("xmlrpc | xmlrpcnocolon | soap | wddx | exif");
@@ -12579,7 +12583,7 @@ yy842:
                TIMELIB_DEINIT;
                return TIMELIB_XMLRPC_SOAP;
        }
-#line 12583 "<stdout>"
+#line 12587 "<stdout>"
 yy843:
        yych = *++YYCURSOR;
        if (yych <= '2') {
@@ -12835,7 +12839,7 @@ yy847:
                }
        }
 yy848:
-#line 1392 "ext/date/lib/parse_date.re"
+#line 1421 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("datenocolon");
                TIMELIB_INIT;
@@ -12846,7 +12850,7 @@ yy848:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_NOCOLON;
        }
-#line 12850 "<stdout>"
+#line 12854 "<stdout>"
 yy849:
        yych = *++YYCURSOR;
        if (yych <= 'H') {
@@ -13640,7 +13644,7 @@ yy972:
        if (yych <= '/') goto yy973;
        if (yych <= '9') goto yy995;
 yy973:
-#line 1269 "ext/date/lib/parse_date.re"
+#line 1298 "ext/date/lib/parse_date.re"
        {
                int length = 0;
                DEBUG_OUTPUT("gnudateshorter");
@@ -13653,7 +13657,7 @@ yy973:
                TIMELIB_DEINIT;
                return TIMELIB_ISO_DATE;
        }
-#line 13657 "<stdout>"
+#line 13661 "<stdout>"
 yy974:
        yyaccept = 22;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -14565,7 +14569,7 @@ yy1065:
        default:        goto yy1067;
        }
 yy1067:
-#line 1161 "ext/date/lib/parse_date.re"
+#line 1190 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("gnunocolon");
                TIMELIB_INIT;
@@ -14587,7 +14591,7 @@ yy1067:
                TIMELIB_DEINIT;
                return TIMELIB_GNU_NOCOLON;
        }
-#line 14591 "<stdout>"
+#line 14595 "<stdout>"
 yy1068:
        yych = *++YYCURSOR;
        if (yych <= '/') goto yy60;
@@ -14671,7 +14675,7 @@ yy1074:
                }
        }
 yy1075:
-#line 1207 "ext/date/lib/parse_date.re"
+#line 1236 "ext/date/lib/parse_date.re"
        {
                int tz_not_found;
                DEBUG_OUTPUT("iso8601nocolon");
@@ -14690,7 +14694,7 @@ yy1075:
                TIMELIB_DEINIT;
                return TIMELIB_ISO_NOCOLON;
        }
-#line 14694 "<stdout>"
+#line 14698 "<stdout>"
 yy1076:
        yyaccept = 25;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -15546,7 +15550,7 @@ yy1116:
                }
        }
 yy1117:
-#line 1603 "ext/date/lib/parse_date.re"
+#line 1632 "ext/date/lib/parse_date.re"
        {
                timelib_sll i;
                int         behavior = 0;
@@ -15562,7 +15566,7 @@ yy1117:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 15566 "<stdout>"
+#line 15570 "<stdout>"
 yy1118:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
@@ -15604,7 +15608,7 @@ yy1124:
        if (yych != 'f') goto yy56;
 yy1125:
        ++YYCURSOR;
-#line 1076 "ext/date/lib/parse_date.re"
+#line 1105 "ext/date/lib/parse_date.re"
        {
                timelib_sll i;
                int         behavior = 0;
@@ -15625,7 +15629,7 @@ yy1125:
                TIMELIB_DEINIT;
                return TIMELIB_WEEK_DAY_OF_MONTH;
        }
-#line 15629 "<stdout>"
+#line 15633 "<stdout>"
 yy1127:
        yyaccept = 26;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -15718,7 +15722,7 @@ yy1140:
                }
        }
 yy1141:
-#line 1579 "ext/date/lib/parse_date.re"
+#line 1608 "ext/date/lib/parse_date.re"
        {
                timelib_sll i;
                int         behavior = 0;
@@ -15741,7 +15745,7 @@ yy1141:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 15745 "<stdout>"
+#line 15749 "<stdout>"
 yy1142:
        yych = *++YYCURSOR;
        goto yy1117;
@@ -18265,7 +18269,7 @@ yy1293:
        if (yych <= '9') goto yy1296;
        goto yy1297;
 yy1294:
-#line 1053 "ext/date/lib/parse_date.re"
+#line 1082 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("backof | frontof");
                TIMELIB_INIT;
@@ -18287,7 +18291,7 @@ yy1294:
                TIMELIB_DEINIT;
                return TIMELIB_LF_DAY_OF_MONTH;
        }
-#line 18291 "<stdout>"
+#line 18295 "<stdout>"
 yy1295:
        yyaccept = 28;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -18526,7 +18530,7 @@ yy1314:
        if (yych != 'f') goto yy56;
 yy1315:
        ++YYCURSOR;
-#line 1036 "ext/date/lib/parse_date.re"
+#line 1065 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("firstdayof | lastdayof");
                TIMELIB_INIT;
@@ -18542,7 +18546,7 @@ yy1315:
                TIMELIB_DEINIT;
                return TIMELIB_LF_DAY_OF_MONTH;
        }
-#line 18546 "<stdout>"
+#line 18550 "<stdout>"
 yy1317:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
@@ -19896,13 +19900,15 @@ yy1384:
        if (yych <= '/') goto yy56;
        if (yych >= ':') goto yy56;
 yy1385:
-       ++YYCURSOR;
-       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yyaccept = 29;
+       YYMARKER = ++YYCURSOR;
+       if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7);
        yych = *YYCURSOR;
+       if (yych == '.') goto yy1388;
        if (yych <= '/') goto yy1387;
        if (yych <= '9') goto yy1385;
 yy1387:
-#line 1010 "ext/date/lib/parse_date.re"
+#line 1011 "ext/date/lib/parse_date.re"
        {
                timelib_ull i;
 
@@ -19927,8 +19933,56 @@ yy1387:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 19931 "<stdout>"
+#line 19937 "<stdout>"
 yy1388:
+       yych = *++YYCURSOR;
+       if (yych <= '/') goto yy56;
+       if (yych >= ':') goto yy56;
+       yych = *++YYCURSOR;
+       if (yych <= '/') goto yy56;
+       if (yych >= ':') goto yy56;
+       yych = *++YYCURSOR;
+       if (yych <= '/') goto yy56;
+       if (yych >= ':') goto yy56;
+       yych = *++YYCURSOR;
+       if (yych <= '/') goto yy56;
+       if (yych >= ':') goto yy56;
+       yych = *++YYCURSOR;
+       if (yych <= '/') goto yy56;
+       if (yych >= ':') goto yy56;
+       yych = *++YYCURSOR;
+       if (yych <= '/') goto yy56;
+       if (yych >= ':') goto yy56;
+       ++YYCURSOR;
+#line 1037 "ext/date/lib/parse_date.re"
+       {
+               timelib_ull i, ms;
+
+               TIMELIB_INIT;
+               TIMELIB_HAVE_RELATIVE();
+               TIMELIB_UNHAVE_DATE();
+               TIMELIB_UNHAVE_TIME();
+               TIMELIB_HAVE_TZ();
+
+               i = timelib_get_unsigned_nr((char **) &ptr, 24);
+               ms = timelib_get_unsigned_nr((char **) &ptr, 24);
+               s->time->y = 1970;
+               s->time->m = 1;
+               s->time->d = 1;
+               s->time->h = s->time->i = s->time->s = 0;
+               s->time->f = 0.0;
+               s->time->relative.s += i;
+               s->time->relative.f = ((double) ms) / 1000000.0;
+               s->time->is_localtime = 1;
+               s->time->zone_type = TIMELIB_ZONETYPE_OFFSET;
+               s->time->z = 0;
+               s->time->dst = 0;
+
+               TIMELIB_DEINIT;
+               return TIMELIB_RELATIVE;
+       }
+#line 19985 "<stdout>"
+yy1396:
        yych = *++YYCURSOR;
        if (yych <= 'N') {
                if (yych <= ')') {
@@ -19937,7 +19991,7 @@ yy1388:
                } else {
                        if (yych <= '@') goto yy3;
                        if (yych <= 'M') goto yy141;
-                       goto yy1429;
+                       goto yy1437;
                }
        } else {
                if (yych <= 'm') {
@@ -19945,58 +19999,58 @@ yy1388:
                        if (yych <= '`') goto yy3;
                        goto yy141;
                } else {
-                       if (yych <= 'n') goto yy1429;
+                       if (yych <= 'n') goto yy1437;
                        if (yych <= 'z') goto yy141;
                        goto yy3;
                }
        }
-yy1389:
+yy1397:
        yych = *++YYCURSOR;
        if (yych <= 'U') {
                if (yych <= '@') {
                        if (yych == ')') goto yy139;
                        goto yy3;
                } else {
-                       if (yych == 'I') goto yy1421;
+                       if (yych == 'I') goto yy1429;
                        if (yych <= 'T') goto yy141;
-                       goto yy1422;
+                       goto yy1430;
                }
        } else {
                if (yych <= 'i') {
                        if (yych <= 'Z') goto yy141;
                        if (yych <= '`') goto yy3;
                        if (yych <= 'h') goto yy141;
-                       goto yy1421;
+                       goto yy1429;
                } else {
-                       if (yych == 'u') goto yy1422;
+                       if (yych == 'u') goto yy1430;
                        if (yych <= 'z') goto yy141;
                        goto yy3;
                }
        }
-yy1390:
+yy1398:
        yych = *++YYCURSOR;
        if (yych <= 'M') {
                if (yych <= '@') {
                        if (yych == ')') goto yy139;
                        goto yy3;
                } else {
-                       if (yych == 'D') goto yy1410;
+                       if (yych == 'D') goto yy1418;
                        if (yych <= 'L') goto yy141;
-                       goto yy1411;
+                       goto yy1419;
                }
        } else {
                if (yych <= 'd') {
                        if (yych <= 'Z') goto yy141;
                        if (yych <= '`') goto yy3;
                        if (yych <= 'c') goto yy141;
-                       goto yy1410;
+                       goto yy1418;
                } else {
-                       if (yych == 'm') goto yy1411;
+                       if (yych == 'm') goto yy1419;
                        if (yych <= 'z') goto yy141;
                        goto yy3;
                }
        }
-yy1391:
+yy1399:
        yych = *++YYCURSOR;
        if (yych <= 'E') {
                if (yych <= ')') {
@@ -20005,7 +20059,7 @@ yy1391:
                } else {
                        if (yych <= '@') goto yy3;
                        if (yych <= 'D') goto yy141;
-                       goto yy1406;
+                       goto yy1414;
                }
        } else {
                if (yych <= 'd') {
@@ -20013,12 +20067,12 @@ yy1391:
                        if (yych <= '`') goto yy3;
                        goto yy141;
                } else {
-                       if (yych <= 'e') goto yy1406;
+                       if (yych <= 'e') goto yy1414;
                        if (yych <= 'z') goto yy141;
                        goto yy3;
                }
        }
-yy1392:
+yy1400:
        yych = *++YYCURSOR;
        if (yych <= 'E') {
                if (yych <= ')') {
@@ -20027,7 +20081,7 @@ yy1392:
                } else {
                        if (yych <= '@') goto yy3;
                        if (yych <= 'D') goto yy141;
-                       goto yy1402;
+                       goto yy1410;
                }
        } else {
                if (yych <= 'd') {
@@ -20035,68 +20089,68 @@ yy1392:
                        if (yych <= '`') goto yy3;
                        goto yy141;
                } else {
-                       if (yych <= 'e') goto yy1402;
+                       if (yych <= 'e') goto yy1410;
                        if (yych <= 'z') goto yy141;
                        goto yy3;
                }
        }
-yy1393:
+yy1401:
        yych = *++YYCURSOR;
        if (yych <= '/') {
                if (yych == '.') goto yy1064;
                goto yy56;
        } else {
-               if (yych <= '9') goto yy1396;
+               if (yych <= '9') goto yy1404;
                if (yych <= ':') goto yy1064;
                goto yy56;
        }
-yy1394:
+yy1402:
        yych = *++YYCURSOR;
        if (yych <= '/') {
                if (yych == '.') goto yy1064;
                goto yy56;
        } else {
-               if (yych <= '4') goto yy1396;
+               if (yych <= '4') goto yy1404;
                if (yych == ':') goto yy1064;
                goto yy56;
        }
-yy1395:
+yy1403:
        yych = *++YYCURSOR;
        if (yych == '.') goto yy1064;
        if (yych == ':') goto yy1064;
        goto yy56;
-yy1396:
+yy1404:
        yych = *++YYCURSOR;
        if (yych <= '/') {
                if (yych == '.') goto yy1064;
                goto yy56;
        } else {
-               if (yych <= '5') goto yy1397;
+               if (yych <= '5') goto yy1405;
                if (yych == ':') goto yy1064;
                goto yy56;
        }
-yy1397:
+yy1405:
        yych = *++YYCURSOR;
        if (yych <= '/') goto yy56;
        if (yych >= ':') goto yy56;
        yyaccept = 24;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '/') goto yy1067;
-       if (yych <= '5') goto yy1399;
-       if (yych <= '6') goto yy1400;
+       if (yych <= '5') goto yy1407;
+       if (yych <= '6') goto yy1408;
        goto yy1067;
-yy1399:
+yy1407:
        yych = *++YYCURSOR;
        if (yych <= '/') goto yy56;
-       if (yych <= '9') goto yy1401;
+       if (yych <= '9') goto yy1409;
        goto yy56;
-yy1400:
+yy1408:
        yych = *++YYCURSOR;
        if (yych != '0') goto yy56;
-yy1401:
+yy1409:
        yych = *++YYCURSOR;
        goto yy1075;
-yy1402:
+yy1410:
        yych = *++YYCURSOR;
        if (yych <= 'L') {
                if (yych <= ')') {
@@ -20112,12 +20166,12 @@ yy1402:
                        if (yych <= '`') goto yy3;
                        goto yy142;
                } else {
-                       if (yych <= 'l') goto yy1403;
+                       if (yych <= 'l') goto yy1411;
                        if (yych <= 'z') goto yy142;
                        goto yy3;
                }
        }
-yy1403:
+yy1411:
        yych = *++YYCURSOR;
        if (yych <= 'F') {
                if (yych <= ')') {
@@ -20133,12 +20187,12 @@ yy1403:
                        if (yych <= '`') goto yy3;
                        goto yy143;
                } else {
-                       if (yych <= 'f') goto yy1404;
+                       if (yych <= 'f') goto yy1412;
                        if (yych <= 'z') goto yy143;
                        goto yy3;
                }
        }
-yy1404:
+yy1412:
        yych = *++YYCURSOR;
        if (yych <= 'T') {
                if (yych <= ')') {
@@ -20154,12 +20208,12 @@ yy1404:
                        if (yych <= '`') goto yy3;
                        goto yy144;
                } else {
-                       if (yych <= 't') goto yy1405;
+                       if (yych <= 't') goto yy1413;
                        if (yych <= 'z') goto yy144;
                        goto yy3;
                }
        }
-yy1405:
+yy1413:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'G') {
@@ -20170,7 +20224,7 @@ yy1405:
                if (yych == 'h') goto yy1205;
                goto yy3;
        }
-yy1406:
+yy1414:
        yych = *++YYCURSOR;
        if (yych <= 'S') {
                if (yych <= ')') {
@@ -20186,12 +20240,12 @@ yy1406:
                        if (yych <= '`') goto yy166;
                        goto yy142;
                } else {
-                       if (yych <= 's') goto yy1407;
+                       if (yych <= 's') goto yy1415;
                        if (yych <= 'z') goto yy142;
                        goto yy166;
                }
        }
-yy1407:
+yy1415:
        yych = *++YYCURSOR;
        if (yych <= 'D') {
                if (yych <= ')') {
@@ -20207,12 +20261,12 @@ yy1407:
                        if (yych <= '`') goto yy3;
                        goto yy143;
                } else {
-                       if (yych <= 'd') goto yy1408;
+                       if (yych <= 'd') goto yy1416;
                        if (yych <= 'z') goto yy143;
                        goto yy3;
                }
        }
-yy1408:
+yy1416:
        yych = *++YYCURSOR;
        if (yych <= 'A') {
                if (yych == ')') goto yy139;
@@ -20222,12 +20276,12 @@ yy1408:
                        if (yych <= 'Z') goto yy144;
                        goto yy3;
                } else {
-                       if (yych <= 'a') goto yy1409;
+                       if (yych <= 'a') goto yy1417;
                        if (yych <= 'z') goto yy144;
                        goto yy3;
                }
        }
-yy1409:
+yy1417:
        yych = *++YYCURSOR;
        if (yych <= 'X') {
                if (yych == ')') goto yy139;
@@ -20237,23 +20291,23 @@ yy1409:
                if (yych == 'y') goto yy172;
                goto yy3;
        }
-yy1410:
+yy1418:
        yych = *++YYCURSOR;
        if (yych <= 'A') {
                if (yych == ')') goto yy139;
                if (yych <= '@') goto yy3;
-               goto yy1418;
+               goto yy1426;
        } else {
                if (yych <= '`') {
                        if (yych <= 'Z') goto yy142;
                        goto yy3;
                } else {
-                       if (yych <= 'a') goto yy1418;
+                       if (yych <= 'a') goto yy1426;
                        if (yych <= 'z') goto yy142;
                        goto yy3;
                }
        }
-yy1411:
+yy1419:
        yych = *++YYCURSOR;
        if (yych <= 'O') {
                if (yych <= ')') {
@@ -20269,12 +20323,12 @@ yy1411:
                        if (yych <= '`') goto yy3;
                        goto yy142;
                } else {
-                       if (yych <= 'o') goto yy1412;
+                       if (yych <= 'o') goto yy1420;
                        if (yych <= 'z') goto yy142;
                        goto yy3;
                }
        }
-yy1412:
+yy1420:
        yych = *++YYCURSOR;
        if (yych <= 'R') {
                if (yych <= ')') {
@@ -20290,12 +20344,12 @@ yy1412:
                        if (yych <= '`') goto yy3;
                        goto yy143;
                } else {
-                       if (yych <= 'r') goto yy1413;
+                       if (yych <= 'r') goto yy1421;
                        if (yych <= 'z') goto yy143;
                        goto yy3;
                }
        }
-yy1413:
+yy1421:
        yych = *++YYCURSOR;
        if (yych <= 'R') {
                if (yych <= ')') {
@@ -20311,29 +20365,29 @@ yy1413:
                        if (yych <= '`') goto yy3;
                        goto yy144;
                } else {
-                       if (yych <= 'r') goto yy1414;
+                       if (yych <= 'r') goto yy1422;
                        if (yych <= 'z') goto yy144;
                        goto yy3;
                }
        }
-yy1414:
+yy1422:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'N') {
                if (yych == ')') goto yy139;
                goto yy3;
        } else {
-               if (yych <= 'O') goto yy1415;
+               if (yych <= 'O') goto yy1423;
                if (yych != 'o') goto yy3;
        }
-yy1415:
+yy1423:
        yych = *++YYCURSOR;
-       if (yych == 'W') goto yy1416;
+       if (yych == 'W') goto yy1424;
        if (yych != 'w') goto yy56;
-yy1416:
+yy1424:
        ++YYCURSOR;
-yy1417:
-#line 998 "ext/date/lib/parse_date.re"
+yy1425:
+#line 999 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("tomorrow");
                TIMELIB_INIT;
@@ -20344,8 +20398,8 @@ yy1417:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 20348 "<stdout>"
-yy1418:
+#line 20402 "<stdout>"
+yy1426:
        yych = *++YYCURSOR;
        if (yych <= 'Y') {
                if (yych <= ')') {
@@ -20361,22 +20415,22 @@ yy1418:
                        if (yych <= '`') goto yy3;
                        goto yy143;
                } else {
-                       if (yych <= 'y') goto yy1419;
+                       if (yych <= 'y') goto yy1427;
                        if (yych <= 'z') goto yy143;
                        goto yy3;
                }
        }
-yy1419:
+yy1427:
        ++YYCURSOR;
        if ((yych = *YYCURSOR) <= '@') {
                if (yych == ')') goto yy139;
        } else {
                if (yych <= 'Z') goto yy144;
-               if (yych <= '`') goto yy1420;
+               if (yych <= '`') goto yy1428;
                if (yych <= 'z') goto yy144;
        }
-yy1420:
-#line 988 "ext/date/lib/parse_date.re"
+yy1428:
+#line 989 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("midnight | today");
                TIMELIB_INIT;
@@ -20385,8 +20439,8 @@ yy1420:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 20389 "<stdout>"
-yy1421:
+#line 20443 "<stdout>"
+yy1429:
        yych = *++YYCURSOR;
        if (yych <= 'S') {
                if (yych <= '@') {
@@ -20394,8 +20448,8 @@ yy1421:
                        goto yy3;
                } else {
                        if (yych <= 'Q') goto yy142;
-                       if (yych <= 'R') goto yy1427;
-                       goto yy1428;
+                       if (yych <= 'R') goto yy1435;
+                       goto yy1436;
                }
        } else {
                if (yych <= 'q') {
@@ -20403,13 +20457,13 @@ yy1421:
                        if (yych <= '`') goto yy3;
                        goto yy142;
                } else {
-                       if (yych <= 'r') goto yy1427;
-                       if (yych <= 's') goto yy1428;
+                       if (yych <= 'r') goto yy1435;
+                       if (yych <= 's') goto yy1436;
                        if (yych <= 'z') goto yy142;
                        goto yy3;
                }
        }
-yy1422:
+yy1430:
        yych = *++YYCURSOR;
        if (yych <= 'R') {
                if (yych <= ')') {
@@ -20425,12 +20479,12 @@ yy1422:
                        if (yych <= '`') goto yy166;
                        goto yy142;
                } else {
-                       if (yych <= 'r') goto yy1423;
+                       if (yych <= 'r') goto yy1431;
                        if (yych <= 'z') goto yy142;
                        goto yy166;
                }
        }
-yy1423:
+yy1431:
        yych = *++YYCURSOR;
        if (yych <= 'S') {
                if (yych <= ')') {
@@ -20446,12 +20500,12 @@ yy1423:
                        if (yych <= '`') goto yy3;
                        goto yy143;
                } else {
-                       if (yych <= 's') goto yy1424;
+                       if (yych <= 's') goto yy1432;
                        if (yych <= 'z') goto yy143;
                        goto yy3;
                }
        }
-yy1424:
+yy1432:
        yych = *++YYCURSOR;
        if (yych <= 'D') {
                if (yych <= ')') {
@@ -20467,27 +20521,27 @@ yy1424:
                        if (yych <= '`') goto yy3;
                        goto yy144;
                } else {
-                       if (yych <= 'd') goto yy1425;
+                       if (yych <= 'd') goto yy1433;
                        if (yych <= 'z') goto yy144;
                        goto yy3;
                }
        }
-yy1425:
+yy1433:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
                if (yych == ')') goto yy139;
                goto yy3;
        } else {
-               if (yych <= 'A') goto yy1426;
+               if (yych <= 'A') goto yy1434;
                if (yych != 'a') goto yy3;
        }
-yy1426:
+yy1434:
        yych = *++YYCURSOR;
        if (yych == 'Y') goto yy172;
        if (yych == 'y') goto yy172;
        goto yy56;
-yy1427:
+yy1435:
        yych = *++YYCURSOR;
        if (yych <= 'D') {
                if (yych <= ')') {
@@ -20509,7 +20563,7 @@ yy1427:
                        goto yy3;
                }
        }
-yy1428:
+yy1436:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '(') {
@@ -20531,7 +20585,7 @@ yy1428:
                        goto yy3;
                }
        }
-yy1429:
+yy1437:
        yych = *++YYCURSOR;
        if (yych <= 'T') {
                if (yych <= ')') {
@@ -20547,12 +20601,12 @@ yy1429:
                        if (yych <= '`') goto yy3;
                        goto yy142;
                } else {
-                       if (yych <= 't') goto yy1430;
+                       if (yych <= 't') goto yy1438;
                        if (yych <= 'z') goto yy142;
                        goto yy3;
                }
        }
-yy1430:
+yy1438:
        yych = *++YYCURSOR;
        if (yych <= 'H') {
                if (yych <= ')') {
@@ -20574,7 +20628,7 @@ yy1430:
                        goto yy3;
                }
        }
-yy1431:
+yy1439:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'M') {
@@ -20589,7 +20643,7 @@ yy1431:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'N') goto yy1429;
+                       if (yych <= 'N') goto yy1437;
                        if (yych <= 'Z') goto yy141;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -20598,13 +20652,13 @@ yy1431:
                                if (yych <= '`') goto yy3;
                                goto yy146;
                        } else {
-                               if (yych <= 'n') goto yy1461;
+                               if (yych <= 'n') goto yy1469;
                                if (yych <= 'z') goto yy146;
                                goto yy3;
                        }
                }
        }
-yy1432:
+yy1440:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'T') {
@@ -20621,14 +20675,14 @@ yy1432:
                                if (yych <= '/') goto yy147;
                                goto yy3;
                        } else {
-                               if (yych == 'I') goto yy1421;
+                               if (yych == 'I') goto yy1429;
                                goto yy141;
                        }
                }
        } else {
                if (yych <= '`') {
                        if (yych <= 'Z') {
-                               if (yych <= 'U') goto yy1422;
+                               if (yych <= 'U') goto yy1430;
                                goto yy141;
                        } else {
                                if (yych == '_') goto yy147;
@@ -20636,16 +20690,16 @@ yy1432:
                        }
                } else {
                        if (yych <= 't') {
-                               if (yych == 'i') goto yy1453;
+                               if (yych == 'i') goto yy1461;
                                goto yy146;
                        } else {
-                               if (yych <= 'u') goto yy1454;
+                               if (yych <= 'u') goto yy1462;
                                if (yych <= 'z') goto yy146;
                                goto yy3;
                        }
                }
        }
-yy1433:
+yy1441:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'L') {
@@ -20662,14 +20716,14 @@ yy1433:
                                if (yych <= '/') goto yy147;
                                goto yy3;
                        } else {
-                               if (yych == 'D') goto yy1410;
+                               if (yych == 'D') goto yy1418;
                                goto yy141;
                        }
                }
        } else {
                if (yych <= '`') {
                        if (yych <= 'Z') {
-                               if (yych <= 'M') goto yy1411;
+                               if (yych <= 'M') goto yy1419;
                                goto yy141;
                        } else {
                                if (yych == '_') goto yy147;
@@ -20677,16 +20731,16 @@ yy1433:
                        }
                } else {
                        if (yych <= 'l') {
-                               if (yych == 'd') goto yy1444;
+                               if (yych == 'd') goto yy1452;
                                goto yy146;
                        } else {
-                               if (yych <= 'm') goto yy1445;
+                               if (yych <= 'm') goto yy1453;
                                if (yych <= 'z') goto yy146;
                                goto yy3;
                        }
                }
        }
-yy1434:
+yy1442:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'D') {
@@ -20701,7 +20755,7 @@ yy1434:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'E') goto yy1406;
+                       if (yych <= 'E') goto yy1414;
                        if (yych <= 'Z') goto yy141;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -20710,13 +20764,13 @@ yy1434:
                                if (yych <= '`') goto yy3;
                                goto yy146;
                        } else {
-                               if (yych <= 'e') goto yy1440;
+                               if (yych <= 'e') goto yy1448;
                                if (yych <= 'z') goto yy146;
                                goto yy3;
                        }
                }
        }
-yy1435:
+yy1443:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'D') {
@@ -20731,7 +20785,7 @@ yy1435:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'E') goto yy1402;
+                       if (yych <= 'E') goto yy1410;
                        if (yych <= 'Z') goto yy141;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -20740,13 +20794,13 @@ yy1435:
                                if (yych <= '`') goto yy3;
                                goto yy146;
                        } else {
-                               if (yych <= 'e') goto yy1436;
+                               if (yych <= 'e') goto yy1444;
                                if (yych <= 'z') goto yy146;
                                goto yy3;
                        }
                }
        }
-yy1436:
+yy1444:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'K') {
@@ -20761,7 +20815,7 @@ yy1436:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'L') goto yy1403;
+                       if (yych <= 'L') goto yy1411;
                        if (yych <= 'Z') goto yy142;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -20770,13 +20824,13 @@ yy1436:
                                if (yych <= '`') goto yy3;
                                goto yy150;
                        } else {
-                               if (yych <= 'l') goto yy1437;
+                               if (yych <= 'l') goto yy1445;
                                if (yych <= 'z') goto yy150;
                                goto yy3;
                        }
                }
        }
-yy1437:
+yy1445:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'E') {
@@ -20791,7 +20845,7 @@ yy1437:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'F') goto yy1404;
+                       if (yych <= 'F') goto yy1412;
                        if (yych <= 'Z') goto yy143;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -20800,13 +20854,13 @@ yy1437:
                                if (yych <= '`') goto yy3;
                                goto yy151;
                        } else {
-                               if (yych <= 'f') goto yy1438;
+                               if (yych <= 'f') goto yy1446;
                                if (yych <= 'z') goto yy151;
                                goto yy3;
                        }
                }
        }
-yy1438:
+yy1446:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'S') {
@@ -20821,7 +20875,7 @@ yy1438:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'T') goto yy1405;
+                       if (yych <= 'T') goto yy1413;
                        if (yych <= 'Z') goto yy144;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -20830,13 +20884,13 @@ yy1438:
                                if (yych <= '`') goto yy3;
                                goto yy152;
                        } else {
-                               if (yych <= 't') goto yy1439;
+                               if (yych <= 't') goto yy1447;
                                if (yych <= 'z') goto yy152;
                                goto yy3;
                        }
                }
        }
-yy1439:
+yy1447:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'G') {
@@ -20859,7 +20913,7 @@ yy1439:
                        goto yy3;
                }
        }
-yy1440:
+yy1448:
        yyaccept = 4;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'R') {
@@ -20874,7 +20928,7 @@ yy1440:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'S') goto yy1407;
+                       if (yych <= 'S') goto yy1415;
                        if (yych <= 'Z') goto yy142;
                        if (yych <= '^') goto yy166;
                        goto yy147;
@@ -20883,13 +20937,13 @@ yy1440:
                                if (yych <= '`') goto yy166;
                                goto yy150;
                        } else {
-                               if (yych <= 's') goto yy1441;
+                               if (yych <= 's') goto yy1449;
                                if (yych <= 'z') goto yy150;
                                goto yy166;
                        }
                }
        }
-yy1441:
+yy1449:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'C') {
@@ -20904,7 +20958,7 @@ yy1441:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'D') goto yy1408;
+                       if (yych <= 'D') goto yy1416;
                        if (yych <= 'Z') goto yy143;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -20913,13 +20967,13 @@ yy1441:
                                if (yych <= '`') goto yy3;
                                goto yy151;
                        } else {
-                               if (yych <= 'd') goto yy1442;
+                               if (yych <= 'd') goto yy1450;
                                if (yych <= 'z') goto yy151;
                                goto yy3;
                        }
                }
        }
-yy1442:
+yy1450:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
@@ -20933,18 +20987,18 @@ yy1442:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'A') goto yy1409;
+                       if (yych <= 'A') goto yy1417;
                        if (yych <= 'Z') goto yy144;
                        if (yych <= '^') goto yy3;
                        goto yy147;
                } else {
                        if (yych <= '`') goto yy3;
-                       if (yych <= 'a') goto yy1443;
+                       if (yych <= 'a') goto yy1451;
                        if (yych <= 'z') goto yy152;
                        goto yy3;
                }
        }
-yy1443:
+yy1451:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'X') {
@@ -20967,7 +21021,7 @@ yy1443:
                        goto yy3;
                }
        }
-yy1444:
+yy1452:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
@@ -20981,18 +21035,18 @@ yy1444:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'A') goto yy1418;
+                       if (yych <= 'A') goto yy1426;
                        if (yych <= 'Z') goto yy142;
                        if (yych <= '^') goto yy3;
                        goto yy147;
                } else {
                        if (yych <= '`') goto yy3;
-                       if (yych <= 'a') goto yy1451;
+                       if (yych <= 'a') goto yy1459;
                        if (yych <= 'z') goto yy150;
                        goto yy3;
                }
        }
-yy1445:
+yy1453:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'N') {
@@ -21007,7 +21061,7 @@ yy1445:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'O') goto yy1412;
+                       if (yych <= 'O') goto yy1420;
                        if (yych <= 'Z') goto yy142;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -21016,13 +21070,13 @@ yy1445:
                                if (yych <= '`') goto yy3;
                                goto yy150;
                        } else {
-                               if (yych <= 'o') goto yy1446;
+                               if (yych <= 'o') goto yy1454;
                                if (yych <= 'z') goto yy150;
                                goto yy3;
                        }
                }
        }
-yy1446:
+yy1454:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'Q') {
@@ -21037,7 +21091,7 @@ yy1446:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'R') goto yy1413;
+                       if (yych <= 'R') goto yy1421;
                        if (yych <= 'Z') goto yy143;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -21046,13 +21100,13 @@ yy1446:
                                if (yych <= '`') goto yy3;
                                goto yy151;
                        } else {
-                               if (yych <= 'r') goto yy1447;
+                               if (yych <= 'r') goto yy1455;
                                if (yych <= 'z') goto yy151;
                                goto yy3;
                        }
                }
        }
-yy1447:
+yy1455:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'Q') {
@@ -21067,7 +21121,7 @@ yy1447:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'R') goto yy1414;
+                       if (yych <= 'R') goto yy1422;
                        if (yych <= 'Z') goto yy144;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -21076,13 +21130,13 @@ yy1447:
                                if (yych <= '`') goto yy3;
                                goto yy152;
                        } else {
-                               if (yych <= 'r') goto yy1448;
+                               if (yych <= 'r') goto yy1456;
                                if (yych <= 'z') goto yy152;
                                goto yy3;
                        }
                }
        }
-yy1448:
+yy1456:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'N') {
@@ -21096,33 +21150,33 @@ yy1448:
                }
        } else {
                if (yych <= '`') {
-                       if (yych <= 'O') goto yy1415;
+                       if (yych <= 'O') goto yy1423;
                        if (yych == '_') goto yy147;
                        goto yy3;
                } else {
-                       if (yych == 'o') goto yy1449;
+                       if (yych == 'o') goto yy1457;
                        if (yych <= 'z') goto yy153;
                        goto yy3;
                }
        }
-yy1449:
+yy1457:
        yych = *++YYCURSOR;
-       if (yych == 'W') goto yy1416;
+       if (yych == 'W') goto yy1424;
        if (yych != 'w') goto yy154;
-       yyaccept = 29;
+       yyaccept = 30;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yybm[0+yych] & 16) {
                goto yy153;
        }
        if (yych <= '.') {
                if (yych == '-') goto yy147;
-               goto yy1417;
+               goto yy1425;
        } else {
                if (yych <= '/') goto yy147;
                if (yych == '_') goto yy147;
-               goto yy1417;
+               goto yy1425;
        }
-yy1451:
+yy1459:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'X') {
@@ -21137,7 +21191,7 @@ yy1451:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'Y') goto yy1419;
+                       if (yych <= 'Y') goto yy1427;
                        if (yych <= 'Z') goto yy143;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -21146,36 +21200,36 @@ yy1451:
                                if (yych <= '`') goto yy3;
                                goto yy151;
                        } else {
-                               if (yych <= 'y') goto yy1452;
+                               if (yych <= 'y') goto yy1460;
                                if (yych <= 'z') goto yy151;
                                goto yy3;
                        }
                }
        }
-yy1452:
-       yyaccept = 30;
+yy1460:
+       yyaccept = 31;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '/') {
                if (yych <= ',') {
                        if (yych == ')') goto yy139;
-                       goto yy1420;
+                       goto yy1428;
                } else {
-                       if (yych == '.') goto yy1420;
+                       if (yych == '.') goto yy1428;
                        goto yy147;
                }
        } else {
                if (yych <= '^') {
-                       if (yych <= '@') goto yy1420;
+                       if (yych <= '@') goto yy1428;
                        if (yych <= 'Z') goto yy144;
-                       goto yy1420;
+                       goto yy1428;
                } else {
                        if (yych <= '_') goto yy147;
-                       if (yych <= '`') goto yy1420;
+                       if (yych <= '`') goto yy1428;
                        if (yych <= 'z') goto yy152;
-                       goto yy1420;
+                       goto yy1428;
                }
        }
-yy1453:
+yy1461:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'R') {
@@ -21190,13 +21244,13 @@ yy1453:
                        } else {
                                if (yych <= '@') goto yy3;
                                if (yych <= 'Q') goto yy142;
-                               goto yy1427;
+                               goto yy1435;
                        }
                }
        } else {
                if (yych <= '`') {
                        if (yych <= 'Z') {
-                               if (yych <= 'S') goto yy1428;
+                               if (yych <= 'S') goto yy1436;
                                goto yy142;
                        } else {
                                if (yych == '_') goto yy147;
@@ -21205,15 +21259,15 @@ yy1453:
                } else {
                        if (yych <= 'r') {
                                if (yych <= 'q') goto yy150;
-                               goto yy1459;
+                               goto yy1467;
                        } else {
-                               if (yych <= 's') goto yy1460;
+                               if (yych <= 's') goto yy1468;
                                if (yych <= 'z') goto yy150;
                                goto yy3;
                        }
                }
        }
-yy1454:
+yy1462:
        yyaccept = 4;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'Q') {
@@ -21228,7 +21282,7 @@ yy1454:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'R') goto yy1423;
+                       if (yych <= 'R') goto yy1431;
                        if (yych <= 'Z') goto yy142;
                        if (yych <= '^') goto yy166;
                        goto yy147;
@@ -21237,13 +21291,13 @@ yy1454:
                                if (yych <= '`') goto yy166;
                                goto yy150;
                        } else {
-                               if (yych <= 'r') goto yy1455;
+                               if (yych <= 'r') goto yy1463;
                                if (yych <= 'z') goto yy150;
                                goto yy166;
                        }
                }
        }
-yy1455:
+yy1463:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'R') {
@@ -21258,7 +21312,7 @@ yy1455:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'S') goto yy1424;
+                       if (yych <= 'S') goto yy1432;
                        if (yych <= 'Z') goto yy143;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -21267,13 +21321,13 @@ yy1455:
                                if (yych <= '`') goto yy3;
                                goto yy151;
                        } else {
-                               if (yych <= 's') goto yy1456;
+                               if (yych <= 's') goto yy1464;
                                if (yych <= 'z') goto yy151;
                                goto yy3;
                        }
                }
        }
-yy1456:
+yy1464:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'C') {
@@ -21288,7 +21342,7 @@ yy1456:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'D') goto yy1425;
+                       if (yych <= 'D') goto yy1433;
                        if (yych <= 'Z') goto yy144;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -21297,13 +21351,13 @@ yy1456:
                                if (yych <= '`') goto yy3;
                                goto yy152;
                        } else {
-                               if (yych <= 'd') goto yy1457;
+                               if (yych <= 'd') goto yy1465;
                                if (yych <= 'z') goto yy152;
                                goto yy3;
                        }
                }
        }
-yy1457:
+yy1465:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
@@ -21317,22 +21371,22 @@ yy1457:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'A') goto yy1426;
+                       if (yych <= 'A') goto yy1434;
                        if (yych <= '^') goto yy3;
                        goto yy147;
                } else {
                        if (yych <= '`') goto yy3;
-                       if (yych <= 'a') goto yy1458;
+                       if (yych <= 'a') goto yy1466;
                        if (yych <= 'z') goto yy153;
                        goto yy3;
                }
        }
-yy1458:
+yy1466:
        yych = *++YYCURSOR;
        if (yych == 'Y') goto yy172;
        if (yych == 'y') goto yy185;
        goto yy154;
-yy1459:
+yy1467:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'C') {
@@ -21362,7 +21416,7 @@ yy1459:
                        }
                }
        }
-yy1460:
+yy1468:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '-') {
@@ -21391,7 +21445,7 @@ yy1460:
                        }
                }
        }
-yy1461:
+yy1469:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'S') {
@@ -21406,7 +21460,7 @@ yy1461:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'T') goto yy1430;
+                       if (yych <= 'T') goto yy1438;
                        if (yych <= 'Z') goto yy142;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -21415,13 +21469,13 @@ yy1461:
                                if (yych <= '`') goto yy3;
                                goto yy150;
                        } else {
-                               if (yych <= 't') goto yy1462;
+                               if (yych <= 't') goto yy1470;
                                if (yych <= 'z') goto yy150;
                                goto yy3;
                        }
                }
        }
-yy1462:
+yy1470:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'G') {
@@ -21451,30 +21505,30 @@ yy1462:
                        }
                }
        }
-yy1463:
+yy1471:
        yych = *++YYCURSOR;
        if (yych <= 'Y') {
                if (yych <= '@') {
                        if (yych == ')') goto yy139;
                        goto yy3;
                } else {
-                       if (yych == 'R') goto yy1475;
+                       if (yych == 'R') goto yy1483;
                        if (yych <= 'X') goto yy141;
-                       goto yy1476;
+                       goto yy1484;
                }
        } else {
                if (yych <= 'r') {
                        if (yych <= 'Z') goto yy141;
                        if (yych <= '`') goto yy3;
                        if (yych <= 'q') goto yy141;
-                       goto yy1475;
+                       goto yy1483;
                } else {
-                       if (yych == 'y') goto yy1476;
+                       if (yych == 'y') goto yy1484;
                        if (yych <= 'z') goto yy141;
                        goto yy3;
                }
        }
-yy1464:
+yy1472:
        yych = *++YYCURSOR;
        if (yych <= 'D') {
                if (yych <= ')') {
@@ -21483,7 +21537,7 @@ yy1464:
                } else {
                        if (yych <= '@') goto yy3;
                        if (yych <= 'C') goto yy141;
-                       goto yy1469;
+                       goto yy1477;
                }
        } else {
                if (yych <= 'c') {
@@ -21491,12 +21545,12 @@ yy1464:
                        if (yych <= '`') goto yy3;
                        goto yy141;
                } else {
-                       if (yych <= 'd') goto yy1469;
+                       if (yych <= 'd') goto yy1477;
                        if (yych <= 'z') goto yy141;
                        goto yy3;
                }
        }
-yy1465:
+yy1473:
        yych = *++YYCURSOR;
        if (yych <= 'N') {
                if (yych <= ')') {
@@ -21512,12 +21566,12 @@ yy1465:
                        if (yych <= '`') goto yy3;
                        goto yy141;
                } else {
-                       if (yych <= 'n') goto yy1466;
+                       if (yych <= 'n') goto yy1474;
                        if (yych <= 'z') goto yy141;
                        goto yy3;
                }
        }
-yy1466:
+yy1474:
        yych = *++YYCURSOR;
        if (yych <= 'D') {
                if (yych <= ')') {
@@ -21533,12 +21587,12 @@ yy1466:
                        if (yych <= '`') goto yy166;
                        goto yy142;
                } else {
-                       if (yych <= 'd') goto yy1467;
+                       if (yych <= 'd') goto yy1475;
                        if (yych <= 'z') goto yy142;
                        goto yy166;
                }
        }
-yy1467:
+yy1475:
        yych = *++YYCURSOR;
        if (yych <= 'A') {
                if (yych == ')') goto yy139;
@@ -21548,12 +21602,12 @@ yy1467:
                        if (yych <= 'Z') goto yy143;
                        goto yy3;
                } else {
-                       if (yych <= 'a') goto yy1468;
+                       if (yych <= 'a') goto yy1476;
                        if (yych <= 'z') goto yy143;
                        goto yy3;
                }
        }
-yy1468:
+yy1476:
        yych = *++YYCURSOR;
        if (yych <= 'Y') {
                if (yych <= ')') {
@@ -21575,7 +21629,7 @@ yy1468:
                        goto yy3;
                }
        }
-yy1469:
+yy1477:
        yych = *++YYCURSOR;
        if (yych <= 'N') {
                if (yych <= ')') {
@@ -21591,12 +21645,12 @@ yy1469:
                        if (yych <= '`') goto yy3;
                        goto yy142;
                } else {
-                       if (yych <= 'n') goto yy1470;
+                       if (yych <= 'n') goto yy1478;
                        if (yych <= 'z') goto yy142;
                        goto yy3;
                }
        }
-yy1470:
+yy1478:
        yych = *++YYCURSOR;
        if (yych <= 'I') {
                if (yych <= ')') {
@@ -21612,12 +21666,12 @@ yy1470:
                        if (yych <= '`') goto yy3;
                        goto yy143;
                } else {
-                       if (yych <= 'i') goto yy1471;
+                       if (yych <= 'i') goto yy1479;
                        if (yych <= 'z') goto yy143;
                        goto yy3;
                }
        }
-yy1471:
+yy1479:
        yych = *++YYCURSOR;
        if (yych <= 'G') {
                if (yych <= ')') {
@@ -21633,29 +21687,29 @@ yy1471:
                        if (yych <= '`') goto yy3;
                        goto yy144;
                } else {
-                       if (yych <= 'g') goto yy1472;
+                       if (yych <= 'g') goto yy1480;
                        if (yych <= 'z') goto yy144;
                        goto yy3;
                }
        }
-yy1472:
+yy1480:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'G') {
                if (yych == ')') goto yy139;
                goto yy3;
        } else {
-               if (yych <= 'H') goto yy1473;
+               if (yych <= 'H') goto yy1481;
                if (yych != 'h') goto yy3;
        }
-yy1473:
+yy1481:
        yych = *++YYCURSOR;
-       if (yych == 'T') goto yy1474;
+       if (yych == 'T') goto yy1482;
        if (yych != 't') goto yy56;
-yy1474:
+yy1482:
        yych = *++YYCURSOR;
-       goto yy1420;
-yy1475:
+       goto yy1428;
+yy1483:
        yyaccept = 5;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '/') {
@@ -21683,7 +21737,7 @@ yy1475:
                                if (yych <= '9') goto yy195;
                                goto yy193;
                        } else {
-                               if (yych == 'C') goto yy1477;
+                               if (yych == 'C') goto yy1485;
                                goto yy142;
                        }
                } else {
@@ -21691,13 +21745,13 @@ yy1475:
                                if (yych <= '`') goto yy193;
                                goto yy142;
                        } else {
-                               if (yych <= 'c') goto yy1477;
+                               if (yych <= 'c') goto yy1485;
                                if (yych <= 'z') goto yy142;
                                goto yy193;
                        }
                }
        }
-yy1476:
+yy1484:
        yyaccept = 5;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '-') {
@@ -21722,7 +21776,7 @@ yy1476:
                        goto yy193;
                }
        }
-yy1477:
+yy1485:
        yych = *++YYCURSOR;
        if (yych <= 'H') {
                if (yych <= ')') {
@@ -21744,7 +21798,7 @@ yy1477:
                        goto yy3;
                }
        }
-yy1478:
+yy1486:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'X') {
@@ -21761,14 +21815,14 @@ yy1478:
                                if (yych <= '/') goto yy147;
                                goto yy3;
                        } else {
-                               if (yych == 'R') goto yy1475;
+                               if (yych == 'R') goto yy1483;
                                goto yy141;
                        }
                }
        } else {
                if (yych <= '`') {
                        if (yych <= 'Z') {
-                               if (yych <= 'Y') goto yy1476;
+                               if (yych <= 'Y') goto yy1484;
                                goto yy141;
                        } else {
                                if (yych == '_') goto yy147;
@@ -21776,16 +21830,16 @@ yy1478:
                        }
                } else {
                        if (yych <= 'x') {
-                               if (yych == 'r') goto yy1490;
+                               if (yych == 'r') goto yy1498;
                                goto yy146;
                        } else {
-                               if (yych <= 'y') goto yy1491;
+                               if (yych <= 'y') goto yy1499;
                                if (yych <= 'z') goto yy146;
                                goto yy3;
                        }
                }
        }
-yy1479:
+yy1487:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'C') {
@@ -21800,7 +21854,7 @@ yy1479:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'D') goto yy1469;
+                       if (yych <= 'D') goto yy1477;
                        if (yych <= 'Z') goto yy141;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -21809,13 +21863,13 @@ yy1479:
                                if (yych <= '`') goto yy3;
                                goto yy146;
                        } else {
-                               if (yych <= 'd') goto yy1484;
+                               if (yych <= 'd') goto yy1492;
                                if (yych <= 'z') goto yy146;
                                goto yy3;
                        }
                }
        }
-yy1480:
+yy1488:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'M') {
@@ -21830,7 +21884,7 @@ yy1480:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'N') goto yy1466;
+                       if (yych <= 'N') goto yy1474;
                        if (yych <= 'Z') goto yy141;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -21839,13 +21893,13 @@ yy1480:
                                if (yych <= '`') goto yy3;
                                goto yy146;
                        } else {
-                               if (yych <= 'n') goto yy1481;
+                               if (yych <= 'n') goto yy1489;
                                if (yych <= 'z') goto yy146;
                                goto yy3;
                        }
                }
        }
-yy1481:
+yy1489:
        yyaccept = 4;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'C') {
@@ -21860,7 +21914,7 @@ yy1481:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'D') goto yy1467;
+                       if (yych <= 'D') goto yy1475;
                        if (yych <= 'Z') goto yy142;
                        if (yych <= '^') goto yy166;
                        goto yy147;
@@ -21869,13 +21923,13 @@ yy1481:
                                if (yych <= '`') goto yy166;
                                goto yy150;
                        } else {
-                               if (yych <= 'd') goto yy1482;
+                               if (yych <= 'd') goto yy1490;
                                if (yych <= 'z') goto yy150;
                                goto yy166;
                        }
                }
        }
-yy1482:
+yy1490:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
@@ -21889,18 +21943,18 @@ yy1482:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'A') goto yy1468;
+                       if (yych <= 'A') goto yy1476;
                        if (yych <= 'Z') goto yy143;
                        if (yych <= '^') goto yy3;
                        goto yy147;
                } else {
                        if (yych <= '`') goto yy3;
-                       if (yych <= 'a') goto yy1483;
+                       if (yych <= 'a') goto yy1491;
                        if (yych <= 'z') goto yy151;
                        goto yy3;
                }
        }
-yy1483:
+yy1491:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'X') {
@@ -21930,7 +21984,7 @@ yy1483:
                        }
                }
        }
-yy1484:
+yy1492:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'M') {
@@ -21945,7 +21999,7 @@ yy1484:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'N') goto yy1470;
+                       if (yych <= 'N') goto yy1478;
                        if (yych <= 'Z') goto yy142;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -21954,13 +22008,13 @@ yy1484:
                                if (yych <= '`') goto yy3;
                                goto yy150;
                        } else {
-                               if (yych <= 'n') goto yy1485;
+                               if (yych <= 'n') goto yy1493;
                                if (yych <= 'z') goto yy150;
                                goto yy3;
                        }
                }
        }
-yy1485:
+yy1493:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'H') {
@@ -21975,7 +22029,7 @@ yy1485:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'I') goto yy1471;
+                       if (yych <= 'I') goto yy1479;
                        if (yych <= 'Z') goto yy143;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -21984,13 +22038,13 @@ yy1485:
                                if (yych <= '`') goto yy3;
                                goto yy151;
                        } else {
-                               if (yych <= 'i') goto yy1486;
+                               if (yych <= 'i') goto yy1494;
                                if (yych <= 'z') goto yy151;
                                goto yy3;
                        }
                }
        }
-yy1486:
+yy1494:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'F') {
@@ -22005,7 +22059,7 @@ yy1486:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'G') goto yy1472;
+                       if (yych <= 'G') goto yy1480;
                        if (yych <= 'Z') goto yy144;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -22014,13 +22068,13 @@ yy1486:
                                if (yych <= '`') goto yy3;
                                goto yy152;
                        } else {
-                               if (yych <= 'g') goto yy1487;
+                               if (yych <= 'g') goto yy1495;
                                if (yych <= 'z') goto yy152;
                                goto yy3;
                        }
                }
        }
-yy1487:
+yy1495:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'G') {
@@ -22034,33 +22088,33 @@ yy1487:
                }
        } else {
                if (yych <= '`') {
-                       if (yych <= 'H') goto yy1473;
+                       if (yych <= 'H') goto yy1481;
                        if (yych == '_') goto yy147;
                        goto yy3;
                } else {
-                       if (yych == 'h') goto yy1488;
+                       if (yych == 'h') goto yy1496;
                        if (yych <= 'z') goto yy153;
                        goto yy3;
                }
        }
-yy1488:
+yy1496:
        yych = *++YYCURSOR;
-       if (yych == 'T') goto yy1474;
+       if (yych == 'T') goto yy1482;
        if (yych != 't') goto yy154;
-       yyaccept = 30;
+       yyaccept = 31;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yybm[0+yych] & 16) {
                goto yy153;
        }
        if (yych <= '.') {
                if (yych == '-') goto yy147;
-               goto yy1420;
+               goto yy1428;
        } else {
                if (yych <= '/') goto yy147;
                if (yych == '_') goto yy147;
-               goto yy1420;
+               goto yy1428;
        }
-yy1490:
+yy1498:
        yyaccept = 5;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '9') {
@@ -22088,7 +22142,7 @@ yy1490:
                                if (yych <= '@') goto yy193;
                                goto yy142;
                        } else {
-                               if (yych <= 'C') goto yy1477;
+                               if (yych <= 'C') goto yy1485;
                                if (yych <= 'Z') goto yy142;
                                goto yy193;
                        }
@@ -22098,13 +22152,13 @@ yy1490:
                                if (yych <= '`') goto yy193;
                                goto yy150;
                        } else {
-                               if (yych <= 'c') goto yy1492;
+                               if (yych <= 'c') goto yy1500;
                                if (yych <= 'z') goto yy150;
                                goto yy193;
                        }
                }
        }
-yy1491:
+yy1499:
        yyaccept = 5;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '.') {
@@ -22139,7 +22193,7 @@ yy1491:
                        }
                }
        }
-yy1492:
+yy1500:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'G') {
@@ -22169,7 +22223,7 @@ yy1492:
                        }
                }
        }
-yy1493:
+yy1501:
        yych = *++YYCURSOR;
        if (yych <= 'W') {
                if (yych <= 'N') {
@@ -22177,29 +22231,29 @@ yy1493:
                        if (yych <= '@') goto yy3;
                        goto yy141;
                } else {
-                       if (yych <= 'O') goto yy1501;
+                       if (yych <= 'O') goto yy1509;
                        if (yych <= 'U') goto yy141;
-                       if (yych <= 'V') goto yy1502;
-                       goto yy1499;
+                       if (yych <= 'V') goto yy1510;
+                       goto yy1507;
                }
        } else {
                if (yych <= 'o') {
                        if (yych <= 'Z') goto yy141;
                        if (yych <= '`') goto yy3;
                        if (yych <= 'n') goto yy141;
-                       goto yy1501;
+                       goto yy1509;
                } else {
                        if (yych <= 'v') {
                                if (yych <= 'u') goto yy141;
-                               goto yy1502;
+                               goto yy1510;
                        } else {
-                               if (yych <= 'w') goto yy1499;
+                               if (yych <= 'w') goto yy1507;
                                if (yych <= 'z') goto yy141;
                                goto yy3;
                        }
                }
        }
-yy1494:
+yy1502:
        yych = *++YYCURSOR;
        if (yych <= 'X') {
                if (yych <= ')') {
@@ -22208,7 +22262,7 @@ yy1494:
                } else {
                        if (yych <= '@') goto yy3;
                        if (yych <= 'W') goto yy141;
-                       goto yy1498;
+                       goto yy1506;
                }
        } else {
                if (yych <= 'w') {
@@ -22216,12 +22270,12 @@ yy1494:
                        if (yych <= '`') goto yy3;
                        goto yy141;
                } else {
-                       if (yych <= 'x') goto yy1498;
+                       if (yych <= 'x') goto yy1506;
                        if (yych <= 'z') goto yy141;
                        goto yy3;
                }
        }
-yy1495:
+yy1503:
        yych = *++YYCURSOR;
        if (yych <= 'N') {
                if (yych <= ')') {
@@ -22237,12 +22291,12 @@ yy1495:
                        if (yych <= '`') goto yy3;
                        goto yy141;
                } else {
-                       if (yych <= 'n') goto yy1496;
+                       if (yych <= 'n') goto yy1504;
                        if (yych <= 'z') goto yy141;
                        goto yy3;
                }
        }
-yy1496:
+yy1504:
        yych = *++YYCURSOR;
        if (yych <= 'T') {
                if (yych <= ')') {
@@ -22258,12 +22312,12 @@ yy1496:
                        if (yych <= '`') goto yy3;
                        goto yy142;
                } else {
-                       if (yych <= 't') goto yy1497;
+                       if (yych <= 't') goto yy1505;
                        if (yych <= 'z') goto yy142;
                        goto yy3;
                }
        }
-yy1497:
+yy1505:
        yych = *++YYCURSOR;
        if (yych <= 'H') {
                if (yych <= ')') {
@@ -22285,7 +22339,7 @@ yy1497:
                        goto yy3;
                }
        }
-yy1498:
+yy1506:
        yych = *++YYCURSOR;
        if (yych <= 'T') {
                if (yych <= ')') {
@@ -22294,7 +22348,7 @@ yy1498:
                } else {
                        if (yych <= '@') goto yy3;
                        if (yych <= 'S') goto yy142;
-                       goto yy1428;
+                       goto yy1436;
                }
        } else {
                if (yych <= 's') {
@@ -22302,22 +22356,22 @@ yy1498:
                        if (yych <= '`') goto yy3;
                        goto yy142;
                } else {
-                       if (yych <= 't') goto yy1428;
+                       if (yych <= 't') goto yy1436;
                        if (yych <= 'z') goto yy142;
                        goto yy3;
                }
        }
-yy1499:
+yy1507:
        ++YYCURSOR;
        if ((yych = *YYCURSOR) <= '@') {
                if (yych == ')') goto yy139;
        } else {
                if (yych <= 'Z') goto yy142;
-               if (yych <= '`') goto yy1500;
+               if (yych <= '`') goto yy1508;
                if (yych <= 'z') goto yy142;
        }
-yy1500:
-#line 967 "ext/date/lib/parse_date.re"
+yy1508:
+#line 968 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("now");
                TIMELIB_INIT;
@@ -22325,8 +22379,8 @@ yy1500:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 22329 "<stdout>"
-yy1501:
+#line 22383 "<stdout>"
+yy1509:
        yych = *++YYCURSOR;
        if (yych <= 'N') {
                if (yych <= ')') {
@@ -22335,7 +22389,7 @@ yy1501:
                } else {
                        if (yych <= '@') goto yy3;
                        if (yych <= 'M') goto yy142;
-                       goto yy1507;
+                       goto yy1515;
                }
        } else {
                if (yych <= 'm') {
@@ -22343,12 +22397,12 @@ yy1501:
                        if (yych <= '`') goto yy3;
                        goto yy142;
                } else {
-                       if (yych <= 'n') goto yy1507;
+                       if (yych <= 'n') goto yy1515;
                        if (yych <= 'z') goto yy142;
                        goto yy3;
                }
        }
-yy1502:
+yy1510:
        yyaccept = 5;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '/') {
@@ -22383,13 +22437,13 @@ yy1502:
                                if (yych <= '`') goto yy193;
                                goto yy142;
                        } else {
-                               if (yych <= 'e') goto yy1503;
+                               if (yych <= 'e') goto yy1511;
                                if (yych <= 'z') goto yy142;
                                goto yy193;
                        }
                }
        }
-yy1503:
+yy1511:
        yych = *++YYCURSOR;
        if (yych <= 'M') {
                if (yych <= ')') {
@@ -22405,12 +22459,12 @@ yy1503:
                        if (yych <= '`') goto yy3;
                        goto yy143;
                } else {
-                       if (yych <= 'm') goto yy1504;
+                       if (yych <= 'm') goto yy1512;
                        if (yych <= 'z') goto yy143;
                        goto yy3;
                }
        }
-yy1504:
+yy1512:
        yych = *++YYCURSOR;
        if (yych <= 'B') {
                if (yych <= ')') {
@@ -22426,37 +22480,37 @@ yy1504:
                        if (yych <= '`') goto yy3;
                        goto yy144;
                } else {
-                       if (yych <= 'b') goto yy1505;
+                       if (yych <= 'b') goto yy1513;
                        if (yych <= 'z') goto yy144;
                        goto yy3;
                }
        }
-yy1505:
+yy1513:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'D') {
                if (yych == ')') goto yy139;
                goto yy3;
        } else {
-               if (yych <= 'E') goto yy1506;
+               if (yych <= 'E') goto yy1514;
                if (yych != 'e') goto yy3;
        }
-yy1506:
+yy1514:
        yych = *++YYCURSOR;
        if (yych == 'R') goto yy205;
        if (yych == 'r') goto yy205;
        goto yy56;
-yy1507:
+yy1515:
        ++YYCURSOR;
        if ((yych = *YYCURSOR) <= '@') {
                if (yych == ')') goto yy139;
        } else {
                if (yych <= 'Z') goto yy143;
-               if (yych <= '`') goto yy1508;
+               if (yych <= '`') goto yy1516;
                if (yych <= 'z') goto yy143;
        }
-yy1508:
-#line 976 "ext/date/lib/parse_date.re"
+yy1516:
+#line 977 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("noon");
                TIMELIB_INIT;
@@ -22467,8 +22521,8 @@ yy1508:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 22471 "<stdout>"
-yy1509:
+#line 22525 "<stdout>"
+yy1517:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'V') {
@@ -22486,15 +22540,15 @@ yy1509:
                                if (yych <= '@') goto yy3;
                                goto yy141;
                        } else {
-                               if (yych <= 'O') goto yy1501;
+                               if (yych <= 'O') goto yy1509;
                                if (yych <= 'U') goto yy141;
-                               goto yy1502;
+                               goto yy1510;
                        }
                }
        } else {
                if (yych <= 'n') {
                        if (yych <= '^') {
-                               if (yych <= 'W') goto yy1499;
+                               if (yych <= 'W') goto yy1507;
                                if (yych <= 'Z') goto yy141;
                                goto yy3;
                        } else {
@@ -22504,17 +22558,17 @@ yy1509:
                        }
                } else {
                        if (yych <= 'v') {
-                               if (yych <= 'o') goto yy1516;
+                               if (yych <= 'o') goto yy1524;
                                if (yych <= 'u') goto yy146;
-                               goto yy1517;
+                               goto yy1525;
                        } else {
-                               if (yych <= 'w') goto yy1515;
+                               if (yych <= 'w') goto yy1523;
                                if (yych <= 'z') goto yy146;
                                goto yy3;
                        }
                }
        }
-yy1510:
+yy1518:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'W') {
@@ -22529,7 +22583,7 @@ yy1510:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'X') goto yy1498;
+                       if (yych <= 'X') goto yy1506;
                        if (yych <= 'Z') goto yy141;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -22538,13 +22592,13 @@ yy1510:
                                if (yych <= '`') goto yy3;
                                goto yy146;
                        } else {
-                               if (yych <= 'x') goto yy1514;
+                               if (yych <= 'x') goto yy1522;
                                if (yych <= 'z') goto yy146;
                                goto yy3;
                        }
                }
        }
-yy1511:
+yy1519:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'M') {
@@ -22559,7 +22613,7 @@ yy1511:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'N') goto yy1496;
+                       if (yych <= 'N') goto yy1504;
                        if (yych <= 'Z') goto yy141;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -22568,13 +22622,13 @@ yy1511:
                                if (yych <= '`') goto yy3;
                                goto yy146;
                        } else {
-                               if (yych <= 'n') goto yy1512;
+                               if (yych <= 'n') goto yy1520;
                                if (yych <= 'z') goto yy146;
                                goto yy3;
                        }
                }
        }
-yy1512:
+yy1520:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'S') {
@@ -22589,7 +22643,7 @@ yy1512:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'T') goto yy1497;
+                       if (yych <= 'T') goto yy1505;
                        if (yych <= 'Z') goto yy142;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -22598,13 +22652,13 @@ yy1512:
                                if (yych <= '`') goto yy3;
                                goto yy150;
                        } else {
-                               if (yych <= 't') goto yy1513;
+                               if (yych <= 't') goto yy1521;
                                if (yych <= 'z') goto yy150;
                                goto yy3;
                        }
                }
        }
-yy1513:
+yy1521:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'G') {
@@ -22634,7 +22688,7 @@ yy1513:
                        }
                }
        }
-yy1514:
+yy1522:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'S') {
@@ -22649,7 +22703,7 @@ yy1514:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'T') goto yy1428;
+                       if (yych <= 'T') goto yy1436;
                        if (yych <= 'Z') goto yy142;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -22658,36 +22712,36 @@ yy1514:
                                if (yych <= '`') goto yy3;
                                goto yy150;
                        } else {
-                               if (yych <= 't') goto yy1460;
+                               if (yych <= 't') goto yy1468;
                                if (yych <= 'z') goto yy150;
                                goto yy3;
                        }
                }
        }
-yy1515:
-       yyaccept = 31;
+yy1523:
+       yyaccept = 32;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '/') {
                if (yych <= ',') {
                        if (yych == ')') goto yy139;
-                       goto yy1500;
+                       goto yy1508;
                } else {
-                       if (yych == '.') goto yy1500;
+                       if (yych == '.') goto yy1508;
                        goto yy147;
                }
        } else {
                if (yych <= '^') {
-                       if (yych <= '@') goto yy1500;
+                       if (yych <= '@') goto yy1508;
                        if (yych <= 'Z') goto yy142;
-                       goto yy1500;
+                       goto yy1508;
                } else {
                        if (yych <= '_') goto yy147;
-                       if (yych <= '`') goto yy1500;
+                       if (yych <= '`') goto yy1508;
                        if (yych <= 'z') goto yy150;
-                       goto yy1500;
+                       goto yy1508;
                }
        }
-yy1516:
+yy1524:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'M') {
@@ -22702,7 +22756,7 @@ yy1516:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'N') goto yy1507;
+                       if (yych <= 'N') goto yy1515;
                        if (yych <= 'Z') goto yy142;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -22711,13 +22765,13 @@ yy1516:
                                if (yych <= '`') goto yy3;
                                goto yy150;
                        } else {
-                               if (yych <= 'n') goto yy1522;
+                               if (yych <= 'n') goto yy1530;
                                if (yych <= 'z') goto yy150;
                                goto yy3;
                        }
                }
        }
-yy1517:
+yy1525:
        yyaccept = 5;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '9') {
@@ -22745,7 +22799,7 @@ yy1517:
                                if (yych <= '@') goto yy193;
                                goto yy142;
                        } else {
-                               if (yych <= 'E') goto yy1503;
+                               if (yych <= 'E') goto yy1511;
                                if (yych <= 'Z') goto yy142;
                                goto yy193;
                        }
@@ -22755,13 +22809,13 @@ yy1517:
                                if (yych <= '`') goto yy193;
                                goto yy150;
                        } else {
-                               if (yych <= 'e') goto yy1518;
+                               if (yych <= 'e') goto yy1526;
                                if (yych <= 'z') goto yy150;
                                goto yy193;
                        }
                }
        }
-yy1518:
+yy1526:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'L') {
@@ -22776,7 +22830,7 @@ yy1518:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'M') goto yy1504;
+                       if (yych <= 'M') goto yy1512;
                        if (yych <= 'Z') goto yy143;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -22785,13 +22839,13 @@ yy1518:
                                if (yych <= '`') goto yy3;
                                goto yy151;
                        } else {
-                               if (yych <= 'm') goto yy1519;
+                               if (yych <= 'm') goto yy1527;
                                if (yych <= 'z') goto yy151;
                                goto yy3;
                        }
                }
        }
-yy1519:
+yy1527:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'A') {
@@ -22806,7 +22860,7 @@ yy1519:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'B') goto yy1505;
+                       if (yych <= 'B') goto yy1513;
                        if (yych <= 'Z') goto yy144;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -22815,13 +22869,13 @@ yy1519:
                                if (yych <= '`') goto yy3;
                                goto yy152;
                        } else {
-                               if (yych <= 'b') goto yy1520;
+                               if (yych <= 'b') goto yy1528;
                                if (yych <= 'z') goto yy152;
                                goto yy3;
                        }
                }
        }
-yy1520:
+yy1528:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'D') {
@@ -22835,44 +22889,44 @@ yy1520:
                }
        } else {
                if (yych <= '`') {
-                       if (yych <= 'E') goto yy1506;
+                       if (yych <= 'E') goto yy1514;
                        if (yych == '_') goto yy147;
                        goto yy3;
                } else {
-                       if (yych == 'e') goto yy1521;
+                       if (yych == 'e') goto yy1529;
                        if (yych <= 'z') goto yy153;
                        goto yy3;
                }
        }
-yy1521:
+yy1529:
        yych = *++YYCURSOR;
        if (yych == 'R') goto yy205;
        if (yych == 'r') goto yy376;
        goto yy154;
-yy1522:
-       yyaccept = 32;
+yy1530:
+       yyaccept = 33;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= '/') {
                if (yych <= ',') {
                        if (yych == ')') goto yy139;
-                       goto yy1508;
+                       goto yy1516;
                } else {
-                       if (yych == '.') goto yy1508;
+                       if (yych == '.') goto yy1516;
                        goto yy147;
                }
        } else {
                if (yych <= '^') {
-                       if (yych <= '@') goto yy1508;
+                       if (yych <= '@') goto yy1516;
                        if (yych <= 'Z') goto yy143;
-                       goto yy1508;
+                       goto yy1516;
                } else {
                        if (yych <= '_') goto yy147;
-                       if (yych <= '`') goto yy1508;
+                       if (yych <= '`') goto yy1516;
                        if (yych <= 'z') goto yy151;
-                       goto yy1508;
+                       goto yy1516;
                }
        }
-yy1523:
+yy1531:
        yych = *++YYCURSOR;
        if (yych <= 'S') {
                if (yych <= ')') {
@@ -22888,12 +22942,12 @@ yy1523:
                        if (yych <= '`') goto yy3;
                        goto yy141;
                } else {
-                       if (yych <= 's') goto yy1524;
+                       if (yych <= 's') goto yy1532;
                        if (yych <= 'z') goto yy141;
                        goto yy3;
                }
        }
-yy1524:
+yy1532:
        yych = *++YYCURSOR;
        if (yych <= 'T') {
                if (yych <= ')') {
@@ -22909,12 +22963,12 @@ yy1524:
                        if (yych <= '`') goto yy3;
                        goto yy142;
                } else {
-                       if (yych <= 't') goto yy1525;
+                       if (yych <= 't') goto yy1533;
                        if (yych <= 'z') goto yy142;
                        goto yy3;
                }
        }
-yy1525:
+yy1533:
        yych = *++YYCURSOR;
        if (yych <= 'E') {
                if (yych <= ')') {
@@ -22930,12 +22984,12 @@ yy1525:
                        if (yych <= '`') goto yy3;
                        goto yy143;
                } else {
-                       if (yych <= 'e') goto yy1526;
+                       if (yych <= 'e') goto yy1534;
                        if (yych <= 'z') goto yy143;
                        goto yy3;
                }
        }
-yy1526:
+yy1534:
        yych = *++YYCURSOR;
        if (yych <= 'R') {
                if (yych <= ')') {
@@ -22951,33 +23005,33 @@ yy1526:
                        if (yych <= '`') goto yy3;
                        goto yy144;
                } else {
-                       if (yych <= 'r') goto yy1527;
+                       if (yych <= 'r') goto yy1535;
                        if (yych <= 'z') goto yy144;
                        goto yy3;
                }
        }
-yy1527:
+yy1535:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'C') {
                if (yych == ')') goto yy139;
                goto yy3;
        } else {
-               if (yych <= 'D') goto yy1528;
+               if (yych <= 'D') goto yy1536;
                if (yych != 'd') goto yy3;
        }
-yy1528:
+yy1536:
        yych = *++YYCURSOR;
-       if (yych == 'A') goto yy1529;
+       if (yych == 'A') goto yy1537;
        if (yych != 'a') goto yy56;
-yy1529:
+yy1537:
        yych = *++YYCURSOR;
-       if (yych == 'Y') goto yy1530;
+       if (yych == 'Y') goto yy1538;
        if (yych != 'y') goto yy56;
-yy1530:
+yy1538:
        ++YYCURSOR;
-yy1531:
-#line 955 "ext/date/lib/parse_date.re"
+yy1539:
+#line 956 "ext/date/lib/parse_date.re"
        {
                DEBUG_OUTPUT("yesterday");
                TIMELIB_INIT;
@@ -22988,8 +23042,8 @@ yy1531:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 22992 "<stdout>"
-yy1532:
+#line 23046 "<stdout>"
+yy1540:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'R') {
@@ -23004,7 +23058,7 @@ yy1532:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'S') goto yy1524;
+                       if (yych <= 'S') goto yy1532;
                        if (yych <= 'Z') goto yy141;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -23013,13 +23067,13 @@ yy1532:
                                if (yych <= '`') goto yy3;
                                goto yy146;
                        } else {
-                               if (yych <= 's') goto yy1533;
+                               if (yych <= 's') goto yy1541;
                                if (yych <= 'z') goto yy146;
                                goto yy3;
                        }
                }
        }
-yy1533:
+yy1541:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'S') {
@@ -23034,7 +23088,7 @@ yy1533:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'T') goto yy1525;
+                       if (yych <= 'T') goto yy1533;
                        if (yych <= 'Z') goto yy142;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -23043,13 +23097,13 @@ yy1533:
                                if (yych <= '`') goto yy3;
                                goto yy150;
                        } else {
-                               if (yych <= 't') goto yy1534;
+                               if (yych <= 't') goto yy1542;
                                if (yych <= 'z') goto yy150;
                                goto yy3;
                        }
                }
        }
-yy1534:
+yy1542:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'D') {
@@ -23064,7 +23118,7 @@ yy1534:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'E') goto yy1526;
+                       if (yych <= 'E') goto yy1534;
                        if (yych <= 'Z') goto yy143;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -23073,13 +23127,13 @@ yy1534:
                                if (yych <= '`') goto yy3;
                                goto yy151;
                        } else {
-                               if (yych <= 'e') goto yy1535;
+                               if (yych <= 'e') goto yy1543;
                                if (yych <= 'z') goto yy151;
                                goto yy3;
                        }
                }
        }
-yy1535:
+yy1543:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'Q') {
@@ -23094,7 +23148,7 @@ yy1535:
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'R') goto yy1527;
+                       if (yych <= 'R') goto yy1535;
                        if (yych <= 'Z') goto yy144;
                        if (yych <= '^') goto yy3;
                        goto yy147;
@@ -23103,13 +23157,13 @@ yy1535:
                                if (yych <= '`') goto yy3;
                                goto yy152;
                        } else {
-                               if (yych <= 'r') goto yy1536;
+                               if (yych <= 'r') goto yy1544;
                                if (yych <= 'z') goto yy152;
                                goto yy3;
                        }
                }
        }
-yy1536:
+yy1544:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych <= 'C') {
@@ -23123,37 +23177,37 @@ yy1536:
                }
        } else {
                if (yych <= '`') {
-                       if (yych <= 'D') goto yy1528;
+                       if (yych <= 'D') goto yy1536;
                        if (yych == '_') goto yy147;
                        goto yy3;
                } else {
-                       if (yych == 'd') goto yy1537;
+                       if (yych == 'd') goto yy1545;
                        if (yych <= 'z') goto yy153;
                        goto yy3;
                }
        }
-yy1537:
+yy1545:
        yych = *++YYCURSOR;
-       if (yych == 'A') goto yy1529;
+       if (yych == 'A') goto yy1537;
        if (yych != 'a') goto yy154;
        yych = *++YYCURSOR;
-       if (yych == 'Y') goto yy1530;
+       if (yych == 'Y') goto yy1538;
        if (yych != 'y') goto yy154;
-       yyaccept = 33;
+       yyaccept = 34;
        yych = *(YYMARKER = ++YYCURSOR);
        if (yybm[0+yych] & 16) {
                goto yy153;
        }
        if (yych <= '.') {
                if (yych == '-') goto yy147;
-               goto yy1531;
+               goto yy1539;
        } else {
                if (yych <= '/') goto yy147;
                if (yych == '_') goto yy147;
-               goto yy1531;
+               goto yy1539;
        }
 }
-#line 1729 "ext/date/lib/parse_date.re"
+#line 1758 "ext/date/lib/parse_date.re"
 
 }
 
@@ -23460,7 +23514,6 @@ timelib_time *timelib_parse_from_format(char *format, char *string, size_t len,
                                s->time->m = 1;
                                s->time->d = 1;
                                s->time->h = s->time->i = s->time->s = 0;
-                               s->time->f = 0.0;
                                s->time->relative.s += tmp;
                                s->time->is_localtime = 1;
                                s->time->zone_type = TIMELIB_ZONETYPE_OFFSET;
@@ -23618,13 +23671,20 @@ void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options)
                parsed->s = 0;
                parsed->f = 0;
        }
+       if (
+               parsed->y != TIMELIB_UNSET || parsed->m != TIMELIB_UNSET || parsed->d != TIMELIB_UNSET ||
+               parsed->h != TIMELIB_UNSET || parsed->i != TIMELIB_UNSET || parsed->s != TIMELIB_UNSET
+       ) {
+               if (parsed->f == TIMELIB_UNSET) parsed->f = 0;
+       } else {
+               if (parsed->f == TIMELIB_UNSET) parsed->f = now->f != TIMELIB_UNSET ? now->f : 0;
+       }
        if (parsed->y == TIMELIB_UNSET) parsed->y = now->y != TIMELIB_UNSET ? now->y : 0;
-       if (parsed->d == TIMELIB_UNSET) parsed->d = now->d != TIMELIB_UNSET ? now->d : 0;
        if (parsed->m == TIMELIB_UNSET) parsed->m = now->m != TIMELIB_UNSET ? now->m : 0;
+       if (parsed->d == TIMELIB_UNSET) parsed->d = now->d != TIMELIB_UNSET ? now->d : 0;
        if (parsed->h == TIMELIB_UNSET) parsed->h = now->h != TIMELIB_UNSET ? now->h : 0;
        if (parsed->i == TIMELIB_UNSET) parsed->i = now->i != TIMELIB_UNSET ? now->i : 0;
        if (parsed->s == TIMELIB_UNSET) parsed->s = now->s != TIMELIB_UNSET ? now->s : 0;
-       if (parsed->f == TIMELIB_UNSET) parsed->f = now->f != TIMELIB_UNSET ? now->f : 0;
        if (parsed->z == TIMELIB_UNSET) parsed->z = now->z != TIMELIB_UNSET ? now->z : 0;
        if (parsed->dst == TIMELIB_UNSET) parsed->dst = now->dst != TIMELIB_UNSET ? now->dst : 0;
 
index 79dabe4ef6fa406de682d64c43df3998328b94bd..ad14b96deff6213335ec32eeee99fa307a2687ad 100644 (file)
@@ -925,6 +925,7 @@ clf              = day "/" monthabbr "/" year4 ":" hour24lz ":" minutelz ":" sec
 
 /* Timestamp format: @1126396800 */
 timestamp        = "@" "-"? [0-9]+;
+timestampms      = "@" "-"? [0-9]+ "." [0-9]{6};
 
 /* To fix some ambiguities */
 dateshortwithtimeshort12  = datenoyear timeshort12;
@@ -1032,6 +1033,34 @@ weekdayof        = (reltextnumber|reltexttext) space (dayfull|dayabbr) space 'of
                return TIMELIB_RELATIVE;
        }
 
+       timestampms
+       {
+               timelib_ull i, ms;
+
+               TIMELIB_INIT;
+               TIMELIB_HAVE_RELATIVE();
+               TIMELIB_UNHAVE_DATE();
+               TIMELIB_UNHAVE_TIME();
+               TIMELIB_HAVE_TZ();
+
+               i = timelib_get_unsigned_nr((char **) &ptr, 24);
+               ms = timelib_get_unsigned_nr((char **) &ptr, 24);
+               s->time->y = 1970;
+               s->time->m = 1;
+               s->time->d = 1;
+               s->time->h = s->time->i = s->time->s = 0;
+               s->time->f = 0.0;
+               s->time->relative.s += i;
+               s->time->relative.f = ((double) ms) / 1000000.0;
+               s->time->is_localtime = 1;
+               s->time->zone_type = TIMELIB_ZONETYPE_OFFSET;
+               s->time->z = 0;
+               s->time->dst = 0;
+
+               TIMELIB_DEINIT;
+               return TIMELIB_RELATIVE;
+       }
+
        firstdayof | lastdayof
        {
                DEBUG_OUTPUT("firstdayof | lastdayof");
@@ -2032,7 +2061,6 @@ timelib_time *timelib_parse_from_format(char *format, char *string, size_t len,
                                s->time->m = 1;
                                s->time->d = 1;
                                s->time->h = s->time->i = s->time->s = 0;
-                               s->time->f = 0.0;
                                s->time->relative.s += tmp;
                                s->time->is_localtime = 1;
                                s->time->zone_type = TIMELIB_ZONETYPE_OFFSET;
@@ -2190,13 +2218,20 @@ void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options)
                parsed->s = 0;
                parsed->f = 0;
        }
+       if (
+               parsed->y != TIMELIB_UNSET || parsed->m != TIMELIB_UNSET || parsed->d != TIMELIB_UNSET ||
+               parsed->h != TIMELIB_UNSET || parsed->i != TIMELIB_UNSET || parsed->s != TIMELIB_UNSET
+       ) {
+               if (parsed->f == TIMELIB_UNSET) parsed->f = 0;
+       } else {
+               if (parsed->f == TIMELIB_UNSET) parsed->f = now->f != TIMELIB_UNSET ? now->f : 0;
+       }
        if (parsed->y == TIMELIB_UNSET) parsed->y = now->y != TIMELIB_UNSET ? now->y : 0;
-       if (parsed->d == TIMELIB_UNSET) parsed->d = now->d != TIMELIB_UNSET ? now->d : 0;
        if (parsed->m == TIMELIB_UNSET) parsed->m = now->m != TIMELIB_UNSET ? now->m : 0;
+       if (parsed->d == TIMELIB_UNSET) parsed->d = now->d != TIMELIB_UNSET ? now->d : 0;
        if (parsed->h == TIMELIB_UNSET) parsed->h = now->h != TIMELIB_UNSET ? now->h : 0;
        if (parsed->i == TIMELIB_UNSET) parsed->i = now->i != TIMELIB_UNSET ? now->i : 0;
        if (parsed->s == TIMELIB_UNSET) parsed->s = now->s != TIMELIB_UNSET ? now->s : 0;
-       if (parsed->f == TIMELIB_UNSET) parsed->f = now->f != TIMELIB_UNSET ? now->f : 0;
        if (parsed->z == TIMELIB_UNSET) parsed->z = now->z != TIMELIB_UNSET ? now->z : 0;
        if (parsed->dst == TIMELIB_UNSET) parsed->dst = now->dst != TIMELIB_UNSET ? now->dst : 0;
 
index b9fb66f00fbbfd8d24969cfebec582050c126350..84dba3d96964579f9e90f767fa311b932bf1e4ae 100644 (file)
@@ -231,7 +231,7 @@ void timelib_dump_date(timelib_time *d, int options)
        printf("TS: %lld | %s%04lld-%02lld-%02lld %02lld:%02lld:%02lld",
                d->sse, d->y < 0 ? "-" : "", TIMELIB_LLABS(d->y), d->m, d->d, d->h, d->i, d->s);
        if (d->f > +0.0) {
-               printf(" %.5f", d->f);
+               printf(" %.6f", d->f);
        }
 
        if (d->is_localtime) {
@@ -260,6 +260,9 @@ void timelib_dump_date(timelib_time *d, int options)
                if (d->have_relative) {
                        printf("%3lldY %3lldM %3lldD / %3lldH %3lldM %3lldS",
                                d->relative.y, d->relative.m, d->relative.d, d->relative.h, d->relative.i, d->relative.s);
+                       if (d->relative.f) {
+                               printf(" %6f", d->relative.f);
+                       }
                        if (d->relative.first_last_day_of != 0) {
                                switch (d->relative.first_last_day_of) {
                                        case 1:
index 9a59d89770b7927e211979b65106195598837440..5cd1fe6ebcb4394c59c993698f528ff721ce5785 100644 (file)
@@ -38,8 +38,8 @@
 # define timelib_free    free
 #endif
 
-#define TIMELIB_VERSION 201602
-#define TIMELIB_ASCII_VERSION "2016.02"
+#define TIMELIB_VERSION 201604
+#define TIMELIB_ASCII_VERSION "2016.04"
 
 #define TIMELIB_NONE             0x00
 #define TIMELIB_OVERRIDE_TIME    0x01
@@ -139,6 +139,7 @@ void timelib_time_set_option(timelib_time* tm, int option, void* option_value);
 void timelib_time_dtor(timelib_time* t);
 timelib_time* timelib_time_clone(timelib_time* orig);
 int timelib_time_compare(timelib_time *t1, timelib_time *t2);
+void timelib_set_fraction_from_timeval(timelib_time *t, struct timeval tp);
 
 timelib_time_offset* timelib_time_offset_ctor(void);
 void timelib_time_offset_dtor(timelib_time_offset* t);
index c7255727f24e6dd6b99e133ee42677c1a3c5c4ad..99bf9fad20bc44fc6593b2d0e09898b090a6ce72 100644 (file)
@@ -77,4 +77,4 @@ stdlib.h
 ])
 
 dnl Check for strtoll, atoll
-AC_CHECK_FUNCS(strtoll atoll strftime)
+AC_CHECK_FUNCS(strtoll atoll strftime gettimeofday)
index d38175753a46741f11a6e8c051849addca751797..4256dd4f6f08a58b6ad6f987ffb323e0ff65797e 100644 (file)
@@ -125,7 +125,7 @@ typedef unsigned __int64  uint64_t;
 #include <strings.h>
 #endif
 
-#if defined(__x86_64__) || defined(__LP64__) || defined(_LP64) || defined(_WIN64)
+#if (defined(__x86_64__) || defined(__LP64__) || defined(_LP64) || defined(_WIN64)) && !defined(TIMELIB_FORCE_LONG32)
 typedef int64_t timelib_long;
 typedef uint64_t timelib_ulong;
 # define TIMELIB_LONG_MAX INT64_MAX
@@ -216,6 +216,7 @@ typedef struct timelib_special {
 typedef struct timelib_rel_time {
        timelib_sll y, m, d; /* Years, Months and Days */
        timelib_sll h, i, s; /* Hours, mInutes and Seconds */
+       double      f;       /* Fraction */
 
        int weekday; /* Stores the day in 'next monday' */
        int weekday_behavior; /* 0: the current day should *not* be counted when advancing forwards; 1: the current day *should* be counted */
index 41471909ac9e96116311c5bf8d54cab290e2e379..d8898bf33dc76b90b12b0f01d2e1b832d87d68b2 100644 (file)
@@ -5,10 +5,16 @@
        { "acdt",  1,  37800, "Australia/South"               },
        { "acdt",  1,  37800, "Australia/Yancowinna"          },
        { "acst",  1, -14400, "America/Porto_Acre"            },
+       { "acst",  0,  32400, "Australia/Adelaide"            },
        { "acst",  0,  34200, "Australia/Adelaide"            },
        { "acst",  1, -14400, "America/Eirunepe"              },
        { "acst",  1, -14400, "America/Rio_Branco"            },
        { "acst",  1, -14400, "Brazil/Acre"                   },
+       { "acst",  0,  32400, "Australia/Broken_Hill"         },
+       { "acst",  0,  32400, "Australia/Darwin"              },
+       { "acst",  0,  32400, "Australia/North"               },
+       { "acst",  0,  32400, "Australia/South"               },
+       { "acst",  0,  32400, "Australia/Yancowinna"          },
        { "acst",  0,  34200, "Asia/Jayapura"                 },
        { "acst",  0,  34200, "Australia/Broken_Hill"         },
        { "acst",  0,  34200, "Australia/Darwin"              },
        { "ahst",  0, -36000, "America/Atka"                  },
        { "akdt",  1, -28800, "America/Anchorage"             },
        { "akdt",  1, -28800, "America/Juneau"                },
+       { "akdt",  1, -28800, "America/Metlakatla"            },
        { "akdt",  1, -28800, "America/Nome"                  },
        { "akdt",  1, -28800, "America/Sitka"                 },
        { "akdt",  1, -28800, "America/Yakutat"               },
        { "akst",  0, -32400, "America/Anchorage"             },
        { "akst",  0, -32400, "America/Juneau"                },
+       { "akst",  0, -32400, "America/Metlakatla"            },
        { "akst",  0, -32400, "America/Nome"                  },
        { "akst",  0, -32400, "America/Sitka"                 },
        { "akst",  0, -32400, "America/Yakutat"               },
-       { "aktst", 1,  21600, "Asia/Aqtobe"                   },
-       { "aktt",  0,  21600, "Asia/Aqtobe"                   },
-       { "aktt",  0,  14400, "Asia/Aqtobe"                   },
-       { "aktt",  0,  18000, "Asia/Aqtobe"                   },
-       { "almst", 1,  25200, "Asia/Almaty"                   },
-       { "almt",  0,  21600, "Asia/Almaty"                   },
-       { "almt",  0,  18000, "Asia/Almaty"                   },
-       { "amst",  1,  18000, "Asia/Yerevan"                  },
-       { "amst",  1,  14400, "Asia/Yerevan"                  },
        { "amst",  1, -10800, "America/Boa_Vista"             },
        { "amst",  1, -10800, "America/Campo_Grande"          },
        { "amst",  1, -10800, "America/Cuiaba"                },
@@ -95,8 +94,6 @@
        { "amst",  1, -10800, "America/Porto_Velho"           },
        { "amst",  1, -10800, "America/Santarem"              },
        { "amst",  1, -10800, "Brazil/West"                   },
-       { "amt",   0,  14400, "Asia/Yerevan"                  },
-       { "amt",   0,  10800, "Asia/Yerevan"                  },
        { "amt",   0, -13840, "America/Asuncion"              },
        { "amt",   0, -14400, "America/Boa_Vista"             },
        { "amt",   0, -14400, "America/Campo_Grande"          },
        { "amt",   0, -14400, "Brazil/West"                   },
        { "amt",   0,   1172, "Europe/Amsterdam"              },
        { "amt",   0,   5692, "Europe/Athens"                 },
-       { "anast", 1,  50400, "Asia/Anadyr"                   },
-       { "anast", 1,  43200, "Asia/Anadyr"                   },
-       { "anast", 1,  46800, "Asia/Anadyr"                   },
-       { "anat",  0,  46800, "Asia/Anadyr"                   },
-       { "anat",  0,  39600, "Asia/Anadyr"                   },
-       { "anat",  0,  43200, "Asia/Anadyr"                   },
        { "ant",   0, -16200, "America/Curacao"               },
        { "ant",   0, -16200, "America/Aruba"                 },
        { "ant",   0, -16200, "America/Kralendijk"            },
        { "apt",   1, -10800, "America/Pangnirtung"           },
        { "apt",   1, -10800, "America/Puerto_Rico"           },
        { "apt",   1, -10800, "Canada/Atlantic"               },
-       { "aqtst", 1,  21600, "Asia/Aqtau"                    },
-       { "aqtst", 1,  18000, "Asia/Aqtau"                    },
-       { "aqtst", 1,  21600, "Asia/Aqtobe"                   },
-       { "aqtt",  0,  18000, "Asia/Aqtau"                    },
-       { "aqtt",  0,  14400, "Asia/Aqtau"                    },
-       { "aqtt",  0,  18000, "Asia/Aqtobe"                   },
        { "arst",  1,  -7200, "America/Buenos_Aires"          },
        { "arst",  1, -10800, "America/Buenos_Aires"          },
        { "arst",  1, -10800, "America/Argentina/Buenos_Aires" },
        { "art",   0, -14400, "America/Mendoza"               },
        { "art",   0, -14400, "America/Rosario"               },
        { "art",   0, -14400, "Antarctica/Palmer"             },
-       { "ashst", 1,  21600, "Asia/Ashkhabad"                },
-       { "ashst", 1,  18000, "Asia/Ashkhabad"                },
-       { "ashst", 1,  18000, "Asia/Ashgabat"                 },
-       { "ashst", 1,  21600, "Asia/Ashgabat"                 },
-       { "asht",  0,  18000, "Asia/Ashkhabad"                },
-       { "asht",  0,  14400, "Asia/Ashkhabad"                },
-       { "asht",  0,  14400, "Asia/Ashgabat"                 },
-       { "asht",  0,  18000, "Asia/Ashgabat"                 },
        { "ast",   0,  10800, "Asia/Riyadh"                   },
        { "ast",   0, -14400, "America/Anguilla"              },
        { "ast",   0, -14400, "America/Antigua"               },
        { "awdt",  1,  32400, "Australia/Perth"               },
        { "awdt",  1,  32400, "Australia/West"                },
        { "awst",  0,  28800, "Australia/Perth"               },
-       { "awst",  0,  28800, "Antarctica/Casey"              },
        { "awst",  0,  28800, "Australia/West"                },
        { "awt",   1, -10800, "America/Halifax"               },
        { "awt",   1, -10800, "America/Blanc-Sablon"          },
        { "azost", 1,  -3600, "Atlantic/Azores"               },
        { "azot",  0,  -3600, "Atlantic/Azores"               },
        { "azot",  0,  -7200, "Atlantic/Azores"               },
-       { "azst",  1,  18000, "Asia/Baku"                     },
-       { "azst",  1,  14400, "Asia/Baku"                     },
-       { "azt",   0,  14400, "Asia/Baku"                     },
-       { "azt",   0,  10800, "Asia/Baku"                     },
-       { "bakst", 1,  18000, "Asia/Baku"                     },
-       { "bakst", 1,  14400, "Asia/Baku"                     },
-       { "bakt",  0,  14400, "Asia/Baku"                     },
-       { "bakt",  0,  10800, "Asia/Baku"                     },
        { "bdst",  1,   7200, "Europe/London"                 },
        { "bdst",  1,  25200, "Asia/Dacca"                    },
        { "bdst",  1,  25200, "Asia/Dhaka"                    },
        { "bmt",   0, -14309, "America/Barbados"              },
        { "bmt",   0,   6264, "Europe/Tiraspol"               },
        { "bmt",   0, -17776, "America/Bogota"                },
+       { "bmt",   0,   1050, "Europe/Brussels"               },
        { "bmt",   0,  10656, "Asia/Baghdad"                  },
+       { "bmt",   0,   1786, "Europe/Busingen"               },
+       { "bmt",   0,   1786, "Europe/Vaduz"                  },
+       { "bmt",   0,   1786, "Europe/Zurich"                 },
        { "bmt",   0,  24124, "Asia/Bangkok"                  },
        { "bmt",   0,  24124, "Asia/Phnom_Penh"               },
        { "bmt",   0,  24124, "Asia/Vientiane"                },
        { "burt",  0,  23400, "Asia/Dacca"                    },
        { "burt",  0,  23400, "Asia/Dhaka"                    },
        { "burt",  0,  23400, "Asia/Rangoon"                  },
+       { "burt",  0,  23400, "Asia/Yangon"                   },
        { "cant",  0,  -3600, "Atlantic/Canary"               },
        { "capt",  1, -32400, "America/Anchorage"             },
        { "cast",  0,  34200, "Australia/Adelaide"            },
        { "cast",  1,  10800, "Africa/Juba"                   },
        { "cast",  1,  10800, "Africa/Khartoum"               },
-       { "cast",  0,  39600, "Antarctica/Casey"              },
        { "cat",   0, -36000, "America/Anchorage"             },
        { "cat",   0,   7200, "Africa/Khartoum"               },
        { "cat",   0,   7200, "Africa/Blantyre"               },
        { "cest",  1,   7200, "Africa/Ceuta"                  },
        { "cest",  1,   7200, "Africa/Tripoli"                },
        { "cest",  1,   7200, "Africa/Tunis"                  },
-       { "cest",  1,   7200, "Antarctica/Troll"              },
        { "cest",  1,   7200, "Arctic/Longyearbyen"           },
        { "cest",  1,   7200, "Atlantic/Jan_Mayen"            },
        { "cest",  1,   7200, "Europe/Amsterdam"              },
        { "clst",  1, -10800, "Chile/Continental"             },
        { "clst",  1, -14400, "Chile/Continental"             },
        { "clt",   0, -14400, "America/Santiago"              },
-       { "clt",   0, -10800, "America/Santiago"              },
        { "clt",   0, -18000, "America/Santiago"              },
-       { "clt",   0, -10800, "Antarctica/Palmer"             },
-       { "clt",   0, -10800, "Chile/Continental"             },
        { "clt",   0, -14400, "Antarctica/Palmer"             },
        { "clt",   0, -14400, "Chile/Continental"             },
        { "clt",   0, -18000, "Chile/Continental"             },
        { "cmt",   0, -16356, "America/La_Paz"                },
        { "cmt",   0, -19176, "America/Cayman"                },
        { "cmt",   0, -19176, "America/Panama"                },
+       { "cmt",   0,   3020, "Europe/Copenhagen"             },
        { "cmt",   0,   6900, "Europe/Chisinau"               },
        { "cmt",   0,   6900, "Europe/Tiraspol"               },
        { "cost",  1, -14400, "America/Bogota"                },
        { "chst",  0,  36000, "Pacific/Saipan"                },
        { "dact",  0,  21600, "Asia/Dacca"                    },
        { "dact",  0,  21600, "Asia/Dhaka"                    },
-       { "davt",  0,  25200, "Antarctica/Davis"              },
-       { "davt",  0,  18000, "Antarctica/Davis"              },
-       { "ddut",  0,  36000, "Antarctica/DumontDUrville"     },
        { "dmt",   0,  -1521, "Europe/Dublin"                 },
-       { "dusst", 1,  25200, "Asia/Dushanbe"                 },
-       { "dusst", 1,  21600, "Asia/Dushanbe"                 },
-       { "dust",  0,  21600, "Asia/Dushanbe"                 },
-       { "dust",  0,  18000, "Asia/Dushanbe"                 },
        { "easst", 1, -21600, "Chile/EasterIsland"            },
        { "easst", 1, -18000, "Chile/EasterIsland"            },
        { "easst", 1, -18000, "Pacific/Easter"                },
        { "easst", 1, -21600, "Pacific/Easter"                },
-       { "east",  0, -18000, "Chile/EasterIsland"            },
        { "east",  0, -21600, "Chile/EasterIsland"            },
        { "east",  0, -25200, "Chile/EasterIsland"            },
-       { "east",  0, -18000, "Pacific/Easter"                },
        { "east",  0, -21600, "Pacific/Easter"                },
        { "east",  0, -25200, "Pacific/Easter"                },
        { "eat",   0,  10800, "Africa/Khartoum"               },
        { "eest",  1,  10800, "Europe/Moscow"                 },
        { "eest",  1,  10800, "Europe/Nicosia"                },
        { "eest",  1,  10800, "Europe/Riga"                   },
-       { "eest",  1,  10800, "Europe/Samara"                 },
        { "eest",  1,  10800, "Europe/Simferopol"             },
        { "eest",  1,  10800, "Europe/Sofia"                  },
        { "eest",  1,  10800, "Europe/Tallinn"                },
        { "ewt",   1, -14400, "America/Thunder_Bay"           },
        { "ewt",   1, -14400, "America/Toronto"               },
        { "ewt",   1, -14400, "Canada/Eastern"                },
-       { "fet",   0,  10800, "Europe/Kaliningrad"            },
-       { "fet",   0,  10800, "Europe/Minsk"                  },
        { "ffmt",  0, -14660, "America/Martinique"            },
        { "fjst",  1,  46800, "Pacific/Fiji"                  },
        { "fjt",   0,  43200, "Pacific/Fiji"                  },
        { "fnst",  1,  -3600, "Brazil/DeNoronha"              },
        { "fnt",   0,  -7200, "America/Noronha"               },
        { "fnt",   0,  -7200, "Brazil/DeNoronha"              },
-       { "fort",  0,  18000, "Asia/Aqtau"                    },
-       { "fort",  0,  14400, "Asia/Aqtau"                    },
-       { "frust", 1,  25200, "Asia/Bishkek"                  },
-       { "frust", 1,  21600, "Asia/Bishkek"                  },
-       { "frut",  0,  21600, "Asia/Bishkek"                  },
-       { "frut",  0,  18000, "Asia/Bishkek"                  },
        { "galt",  0, -21600, "Pacific/Galapagos"             },
        { "gamt",  0, -32400, "Pacific/Gambier"               },
        { "gbgt",  0, -13500, "America/Guyana"                },
-       { "gest",  1,  14400, "Asia/Tbilisi"                  },
-       { "gest",  1,  18000, "Asia/Tbilisi"                  },
-       { "get",   0,  14400, "Asia/Tbilisi"                  },
-       { "get",   0,  10800, "Asia/Tbilisi"                  },
        { "gft",   0, -14400, "America/Cayenne"               },
        { "gft",   0, -10800, "America/Cayenne"               },
        { "ghst",  1,   1200, "Africa/Accra"                  },
        { "gyt",   0, -14400, "America/Guyana"                },
        { "gyt",   0, -10800, "America/Guyana"                },
        { "gyt",   0, -13500, "America/Guyana"                },
-       { "hadt",  1, -32400, "America/Adak"                  },
-       { "hadt",  1, -32400, "America/Atka"                  },
-       { "hast",  0, -36000, "America/Adak"                  },
-       { "hast",  0, -36000, "America/Atka"                  },
        { "hdt",   1, -34200, "Pacific/Honolulu"              },
+       { "hdt",   1, -32400, "America/Adak"                  },
+       { "hdt",   1, -32400, "America/Atka"                  },
        { "hdt",   1, -34200, "Pacific/Johnston"              },
        { "hkst",  1,  32400, "Asia/Hong_Kong"                },
        { "hkt",   0,  28800, "Asia/Hong_Kong"                },
        { "hovt",  0,  21600, "Asia/Hovd"                     },
        { "hst",   0, -36000, "Pacific/Honolulu"              },
        { "hst",   0, -37800, "Pacific/Honolulu"              },
+       { "hst",   0, -36000, "America/Adak"                  },
+       { "hst",   0, -36000, "America/Atka"                  },
        { "hst",   0, -36000, "Pacific/Johnston"              },
        { "hst",   0, -37800, "Pacific/Johnston"              },
        { "ict",   0,  25200, "Asia/Bangkok"                  },
        { "imt",   0,  25025, "Asia/Irkutsk"                  },
        { "imt",   0,   7016, "Asia/Istanbul"                 },
        { "imt",   0,   7016, "Europe/Istanbul"               },
+       { "imt",   0,   7016, "Europe/Sofia"                  },
        { "iot",   0,  21600, "Indian/Chagos"                 },
        { "iot",   0,  18000, "Indian/Chagos"                 },
        { "irdt",  1,  16200, "Asia/Tehran"                   },
        { "irdt",  1,  18000, "Asia/Tehran"                   },
-       { "irkst", 1,  32400, "Asia/Irkutsk"                  },
-       { "irkst", 1,  28800, "Asia/Irkutsk"                  },
-       { "irkt",  0,  28800, "Asia/Irkutsk"                  },
-       { "irkt",  0,  25200, "Asia/Irkutsk"                  },
-       { "irkt",  0,  32400, "Asia/Irkutsk"                  },
-       { "irkt",  0,  28800, "Asia/Chita"                    },
        { "irst",  0,  12600, "Asia/Tehran"                   },
        { "irst",  0,  14400, "Asia/Tehran"                   },
        { "isst",  1,      0, "Atlantic/Reykjavik"            },
        { "ist",   0,   7200, "Asia/Tel_Aviv"                 },
        { "javt",  0,  26400, "Asia/Jakarta"                  },
        { "jcst",  0,  32400, "Asia/Pyongyang"                },
-       { "jcst",  0,  32400, "Asia/Sakhalin"                 },
        { "jcst",  0,  32400, "Asia/Seoul"                    },
        { "jcst",  0,  32400, "Asia/Tokyo"                    },
        { "jcst",  0,  32400, "ROK"                           },
        { "jst",   0,  32400, "Asia/Pyongyang"                },
        { "jst",   0,  32400, "Asia/Rangoon"                  },
        { "jst",   0,  32400, "Asia/Saigon"                   },
-       { "jst",   0,  32400, "Asia/Sakhalin"                 },
        { "jst",   0,  32400, "Asia/Seoul"                    },
        { "jst",   0,  32400, "Asia/Singapore"                },
        { "jst",   0,  32400, "Asia/Taipei"                   },
        { "jst",   0,  32400, "Asia/Ujung_Pandang"            },
+       { "jst",   0,  32400, "Asia/Yangon"                   },
        { "jst",   0,  32400, "Pacific/Bougainville"          },
        { "jst",   0,  32400, "Pacific/Nauru"                 },
        { "jst",   0,  32400, "ROC"                           },
        { "kdt",   1,  34200, "Asia/Seoul"                    },
        { "kdt",   1,  34200, "ROK"                           },
        { "kdt",   1,  36000, "ROK"                           },
-       { "kgst",  1,  21600, "Asia/Bishkek"                  },
-       { "kgt",   0,  18000, "Asia/Bishkek"                  },
-       { "kgt",   0,  21600, "Asia/Bishkek"                  },
-       { "kizst", 1,  21600, "Asia/Qyzylorda"                },
-       { "kizt",  0,  21600, "Asia/Qyzylorda"                },
-       { "kizt",  0,  14400, "Asia/Qyzylorda"                },
-       { "kizt",  0,  18000, "Asia/Qyzylorda"                },
        { "kmt",   0,   5736, "Europe/Vilnius"                },
        { "kmt",   0, -18431, "America/Grand_Turk"            },
        { "kmt",   0, -18431, "America/Jamaica"               },
        { "kmt",   0,   7324, "Europe/Kiev"                   },
        { "kost",  0,  43200, "Pacific/Kosrae"                },
        { "kost",  0,  39600, "Pacific/Kosrae"                },
-       { "krast", 1,  28800, "Asia/Krasnoyarsk"              },
-       { "krast", 1,  25200, "Asia/Krasnoyarsk"              },
-       { "krast", 1,  25200, "Asia/Novokuznetsk"             },
-       { "krast", 1,  28800, "Asia/Novokuznetsk"             },
-       { "krat",  0,  25200, "Asia/Krasnoyarsk"              },
-       { "krat",  0,  21600, "Asia/Krasnoyarsk"              },
-       { "krat",  0,  28800, "Asia/Krasnoyarsk"              },
-       { "krat",  0,  21600, "Asia/Novokuznetsk"             },
-       { "krat",  0,  25200, "Asia/Novokuznetsk"             },
        { "kst",   0,  30600, "Asia/Seoul"                    },
        { "kst",   0,  32400, "Asia/Pyongyang"                },
        { "kst",   0,  32400, "Asia/Seoul"                    },
        { "kst",   0,  30600, "Asia/Pyongyang"                },
        { "kst",   0,  30600, "ROK"                           },
        { "kst",   0,  32400, "ROK"                           },
-       { "kuyst", 1,  18000, "Europe/Samara"                 },
-       { "kuyt",  0,  14400, "Europe/Samara"                 },
-       { "kuyt",  0,  10800, "Europe/Samara"                 },
        { "kwat",  0, -43200, "Pacific/Kwajalein"             },
        { "lhdt",  1,  39600, "Australia/LHI"                 },
        { "lhdt",  1,  39600, "Australia/Lord_Howe"           },
        { "madmt", 1,   3600, "Atlantic/Madeira"              },
        { "madst", 1,      0, "Atlantic/Madeira"              },
        { "madt",  0,  -3600, "Atlantic/Madeira"              },
-       { "magst", 1,  43200, "Asia/Magadan"                  },
-       { "magst", 1,  39600, "Asia/Magadan"                  },
-       { "magst", 1,  39600, "Asia/Srednekolymsk"            },
-       { "magst", 1,  39600, "Asia/Ust-Nera"                 },
-       { "magst", 1,  43200, "Asia/Srednekolymsk"            },
-       { "magst", 1,  43200, "Asia/Ust-Nera"                 },
-       { "magt",  0,  36000, "Asia/Magadan"                  },
-       { "magt",  0,  39600, "Asia/Magadan"                  },
-       { "magt",  0,  43200, "Asia/Magadan"                  },
-       { "magt",  0,  36000, "Asia/Srednekolymsk"            },
-       { "magt",  0,  36000, "Asia/Ust-Nera"                 },
-       { "magt",  0,  39600, "Asia/Srednekolymsk"            },
-       { "magt",  0,  39600, "Asia/Ust-Nera"                 },
-       { "magt",  0,  43200, "Asia/Srednekolymsk"            },
-       { "magt",  0,  43200, "Asia/Ust-Nera"                 },
        { "malst", 1,  26400, "Asia/Singapore"                },
        { "malst", 1,  26400, "Asia/Kuala_Lumpur"             },
        { "malt",  0,  27000, "Asia/Singapore"                },
        { "malt",  0,  26400, "Asia/Kuala_Lumpur"             },
        { "malt",  0,  27000, "Asia/Kuala_Lumpur"             },
        { "mart",  0, -34200, "Pacific/Marquesas"             },
-       { "mawt",  0,  21600, "Antarctica/Mawson"             },
-       { "mawt",  0,  18000, "Antarctica/Mawson"             },
        { "mddt",  1, -18000, "America/Cambridge_Bay"         },
        { "mddt",  1, -18000, "America/Yellowknife"           },
        { "mdst",  1,  16279, "Europe/Moscow"                 },
        { "mdt",   1, -21600, "Canada/Mountain"               },
        { "mdt",   1, -21600, "Canada/Saskatchewan"           },
        { "mdt",   1, -21600, "Mexico/BajaSur"                },
+       { "mest",  1,   7200, "MET"                           },
+       { "met",   0,   3600, "MET"                           },
        { "mht",   0,  43200, "Pacific/Kwajalein"             },
        { "mht",   0,  39600, "Pacific/Kwajalein"             },
        { "mht",   0,  39600, "Pacific/Majuro"                },
        { "mmt",   0,  17640, "Indian/Maldives"               },
        { "mmt",   0,  19172, "Asia/Colombo"                  },
        { "mmt",   0,  23400, "Asia/Rangoon"                  },
+       { "mmt",   0,  23400, "Asia/Yangon"                   },
        { "mmt",   0,  28656, "Asia/Makassar"                 },
        { "mmt",   0,  28656, "Asia/Ujung_Pandang"            },
        { "mmt",   0,   6600, "Europe/Minsk"                  },
        { "msd",   1,  14400, "Europe/Kiev"                   },
        { "msd",   1,  14400, "Europe/Minsk"                  },
        { "msd",   1,  14400, "Europe/Riga"                   },
-       { "msd",   1,  14400, "Europe/Samara"                 },
        { "msd",   1,  14400, "Europe/Simferopol"             },
        { "msd",   1,  14400, "Europe/Tallinn"                },
        { "msd",   1,  14400, "Europe/Tiraspol"               },
        { "msd",   1,  14400, "Europe/Uzhgorod"               },
        { "msd",   1,  14400, "Europe/Vilnius"                },
-       { "msd",   1,  14400, "Europe/Volgograd"              },
        { "msd",   1,  14400, "Europe/Zaporozhye"             },
        { "msk",   0,  10800, "Europe/Moscow"                 },
        { "msk",   0,  14400, "Europe/Moscow"                 },
        { "msk",   0,  10800, "Europe/Kiev"                   },
        { "msk",   0,  10800, "Europe/Minsk"                  },
        { "msk",   0,  10800, "Europe/Riga"                   },
-       { "msk",   0,  10800, "Europe/Samara"                 },
        { "msk",   0,  10800, "Europe/Simferopol"             },
        { "msk",   0,  10800, "Europe/Tallinn"                },
        { "msk",   0,  10800, "Europe/Tiraspol"               },
        { "msk",   0,  10800, "Europe/Uzhgorod"               },
        { "msk",   0,  10800, "Europe/Vilnius"                },
-       { "msk",   0,  10800, "Europe/Volgograd"              },
        { "msk",   0,  10800, "Europe/Zaporozhye"             },
        { "msk",   0,  14400, "Europe/Simferopol"             },
-       { "msk",   0,  14400, "Europe/Volgograd"              },
-       { "msm",   1,  18000, "Europe/Moscow"                 },
        { "mst",   0, -25200, "America/Denver"                },
        { "mst",   0, -25200, "America/Bahia_Banderas"        },
        { "mst",   0, -25200, "America/Boise"                 },
        { "mst",   0, -25200, "America/Dawson_Creek"          },
        { "mst",   0, -25200, "America/Edmonton"              },
        { "mst",   0, -25200, "America/Ensenada"              },
+       { "mst",   0, -25200, "America/Fort_Nelson"           },
        { "mst",   0, -25200, "America/Hermosillo"            },
        { "mst",   0, -25200, "America/Inuvik"                },
        { "mst",   0, -25200, "America/Mazatlan"              },
        { "negt",  0, -12600, "America/Paramaribo"            },
        { "nest",  1,   4800, "Europe/Amsterdam"              },
        { "net",   0,   1200, "Europe/Amsterdam"              },
+       { "nfst",  1,  45000, "Pacific/Norfolk"               },
        { "nft",   0,  41400, "Pacific/Norfolk"               },
+       { "nft",   0,  39600, "Pacific/Norfolk"               },
        { "nmt",   0,  40320, "Pacific/Norfolk"               },
-       { "novst", 1,  25200, "Asia/Novosibirsk"              },
-       { "novst", 1,  28800, "Asia/Novosibirsk"              },
-       { "novst", 1,  25200, "Asia/Novokuznetsk"             },
-       { "novt",  0,  21600, "Asia/Novosibirsk"              },
-       { "novt",  0,  25200, "Asia/Novosibirsk"              },
-       { "novt",  0,  21600, "Asia/Novokuznetsk"             },
-       { "novt",  0,  25200, "Asia/Novokuznetsk"             },
        { "npt",   1,  -9000, "America/St_Johns"              },
        { "npt",   0,  20700, "Asia/Katmandu"                 },
        { "npt",   1, -36000, "America/Adak"                  },
        { "nzst",  1,  45000, "Antarctica/McMurdo"            },
        { "nzst",  1,  45000, "Antarctica/South_Pole"         },
        { "nzst",  1,  45000, "NZ"                            },
-       { "omsst", 1,  25200, "Asia/Omsk"                     },
-       { "omsst", 1,  21600, "Asia/Omsk"                     },
-       { "omst",  0,  21600, "Asia/Omsk"                     },
-       { "omst",  0,  18000, "Asia/Omsk"                     },
-       { "omst",  0,  25200, "Asia/Omsk"                     },
-       { "orast", 1,  18000, "Asia/Oral"                     },
-       { "orat",  0,  18000, "Asia/Oral"                     },
-       { "orat",  0,  14400, "Asia/Oral"                     },
        { "pddt",  1, -21600, "America/Inuvik"                },
        { "pdt",   1, -25200, "America/Los_Angeles"           },
        { "pdt",   1, -25200, "America/Boise"                 },
        { "pdt",   1, -25200, "America/Dawson"                },
        { "pdt",   1, -25200, "America/Dawson_Creek"          },
        { "pdt",   1, -25200, "America/Ensenada"              },
+       { "pdt",   1, -25200, "America/Fort_Nelson"           },
        { "pdt",   1, -25200, "America/Juneau"                },
        { "pdt",   1, -25200, "America/Metlakatla"            },
        { "pdt",   1, -25200, "America/Santa_Isabel"          },
        { "pdt",   1, -25200, "Canada/Yukon"                  },
        { "pdt",   1, -25200, "Mexico/BajaNorte"              },
        { "pest",  1, -14400, "America/Lima"                  },
-       { "petst", 1,  46800, "Asia/Kamchatka"                },
-       { "petst", 1,  43200, "Asia/Kamchatka"                },
-       { "pett",  0,  43200, "Asia/Kamchatka"                },
-       { "pett",  0,  39600, "Asia/Kamchatka"                },
        { "pet",   0, -18000, "America/Lima"                  },
        { "pgt",   0,  36000, "Pacific/Bougainville"          },
        { "pgt",   0,  36000, "Pacific/Port_Moresby"          },
        { "plmt",  0,  25590, "Asia/Ho_Chi_Minh"              },
        { "plmt",  0,  25590, "Asia/Saigon"                   },
        { "pmdt",  1,  -7200, "America/Miquelon"              },
+       { "pmmt",  0,  35312, "Pacific/Bougainville"          },
        { "pmst",  0, -10800, "America/Miquelon"              },
        { "pmt",   0, -13236, "America/Paramaribo"            },
        { "pmt",   0, -13252, "America/Paramaribo"            },
-       { "pmt",   0,  36000, "Antarctica/DumontDUrville"     },
        { "pmt",   0,  13505, "Asia/Yekaterinburg"            },
        { "pmt",   0,  26240, "Asia/Pontianak"                },
+       { "pmt",   0,   3464, "Europe/Bratislava"             },
+       { "pmt",   0,   3464, "Europe/Prague"                 },
        { "pmt",   0,    561, "Africa/Algiers"                },
        { "pmt",   0,    561, "Africa/Tunis"                  },
        { "pmt",   0,    561, "Europe/Monaco"                 },
        { "ppt",   1, -25200, "America/Los_Angeles"           },
        { "ppt",   1, -25200, "America/Dawson_Creek"          },
        { "ppt",   1, -25200, "America/Ensenada"              },
+       { "ppt",   1, -25200, "America/Fort_Nelson"           },
        { "ppt",   1, -25200, "America/Juneau"                },
        { "ppt",   1, -25200, "America/Metlakatla"            },
        { "ppt",   1, -25200, "America/Santa_Isabel"          },
        { "pst",   0, -28800, "America/Dawson"                },
        { "pst",   0, -28800, "America/Dawson_Creek"          },
        { "pst",   0, -28800, "America/Ensenada"              },
+       { "pst",   0, -28800, "America/Fort_Nelson"           },
        { "pst",   0, -28800, "America/Hermosillo"            },
        { "pst",   0, -28800, "America/Inuvik"                },
        { "pst",   0, -28800, "America/Juneau"                },
        { "pwt",   1, -25200, "America/Los_Angeles"           },
        { "pwt",   1, -25200, "America/Dawson_Creek"          },
        { "pwt",   1, -25200, "America/Ensenada"              },
+       { "pwt",   1, -25200, "America/Fort_Nelson"           },
        { "pwt",   1, -25200, "America/Juneau"                },
        { "pwt",   1, -25200, "America/Metlakatla"            },
        { "pwt",   1, -25200, "America/Santa_Isabel"          },
        { "pyt",   0, -14400, "America/Asuncion"              },
        { "pyt",   0, -10800, "America/Asuncion"              },
        { "qmt",   0, -18840, "America/Guayaquil"             },
-       { "qyzst", 1,  25200, "Asia/Qyzylorda"                },
-       { "qyzt",  0,  21600, "Asia/Qyzylorda"                },
-       { "qyzt",  0,  18000, "Asia/Qyzylorda"                },
        { "ret",   0,  14400, "Indian/Reunion"                },
        { "rmt",   0,   5794, "Europe/Riga"                   },
        { "rmt",   0,  23080, "Asia/Rangoon"                  },
-       { "rott",  0, -10800, "Antarctica/Rothera"            },
-       { "sakst", 1,  39600, "Asia/Sakhalin"                 },
-       { "sakst", 1,  43200, "Asia/Sakhalin"                 },
-       { "sakt",  0,  36000, "Asia/Sakhalin"                 },
-       { "sakt",  0,  39600, "Asia/Sakhalin"                 },
-       { "samst", 1,  21600, "Asia/Samarkand"                },
-       { "samst", 1,  14400, "Europe/Samara"                 },
-       { "samst", 1,  18000, "Europe/Samara"                 },
-       { "samt",  0,  18000, "Asia/Samarkand"                },
-       { "samt",  0,  14400, "Asia/Samarkand"                },
-       { "samt",  0,  10800, "Europe/Samara"                 },
-       { "samt",  0,  14400, "Europe/Samara"                 },
+       { "rmt",   0,  23080, "Asia/Yangon"                   },
+       { "rmt",   0,   2996, "Europe/Rome"                   },
+       { "rmt",   0,   2996, "Europe/San_Marino"             },
+       { "rmt",   0,   2996, "Europe/Vatican"                },
        { "sast",  0,   7200, "Africa/Johannesburg"           },
        { "sast",  1,  10800, "Africa/Johannesburg"           },
        { "sast",  0,   5400, "Africa/Johannesburg"           },
        { "sct",   0,  14400, "Indian/Mahe"                   },
        { "sdmt",  0, -16800, "America/Santo_Domingo"         },
        { "sdt",   1, -36000, "Pacific/Apia"                  },
+       { "set",   0,   3614, "Europe/Stockholm"              },
        { "sgt",   0,  28800, "Asia/Singapore"                },
        { "sgt",   0,  27000, "Asia/Singapore"                },
-       { "shest", 1,  21600, "Asia/Aqtau"                    },
-       { "shet",  0,  21600, "Asia/Aqtau"                    },
-       { "shet",  0,  18000, "Asia/Aqtau"                    },
        { "sjmt",  0, -20173, "America/Costa_Rica"            },
        { "smt",   0, -13884, "Atlantic/Stanley"              },
        { "smt",   0, -16966, "America/Santiago"              },
        { "smt",   0,  24925, "Asia/Kuala_Lumpur"             },
        { "smt",   0,  24925, "Asia/Singapore"                },
        { "smt",   0,   8160, "Europe/Simferopol"             },
-       { "sret",  0,  39600, "Asia/Srednekolymsk"            },
        { "srt",   0, -10800, "America/Paramaribo"            },
        { "srt",   0, -12600, "America/Paramaribo"            },
        { "sst",   0, -39600, "Pacific/Samoa"                 },
        { "sst",   0, -39600, "Pacific/Apia"                  },
        { "sst",   0, -39600, "Pacific/Midway"                },
        { "sst",   0, -39600, "Pacific/Pago_Pago"             },
-       { "stat",  0,  10800, "Europe/Volgograd"              },
-       { "stat",  0,  14400, "Europe/Volgograd"              },
-       { "svest", 1,  21600, "Asia/Yekaterinburg"            },
-       { "svest", 1,  18000, "Asia/Yekaterinburg"            },
-       { "svet",  0,  18000, "Asia/Yekaterinburg"            },
-       { "svet",  0,  14400, "Asia/Yekaterinburg"            },
        { "swat",  0,   5400, "Africa/Windhoek"               },
-       { "syot",  0,  10800, "Antarctica/Syowa"              },
        { "taht",  0, -36000, "Pacific/Tahiti"                },
-       { "tasst", 1,  25200, "Asia/Samarkand"                },
-       { "tasst", 1,  21600, "Asia/Tashkent"                 },
-       { "tasst", 1,  25200, "Asia/Tashkent"                 },
-       { "tast",  0,  21600, "Asia/Samarkand"                },
-       { "tast",  0,  18000, "Asia/Tashkent"                 },
-       { "tast",  0,  21600, "Asia/Tashkent"                 },
-       { "tbist", 1,  18000, "Asia/Tbilisi"                  },
-       { "tbist", 1,  14400, "Asia/Tbilisi"                  },
-       { "tbit",  0,  14400, "Asia/Tbilisi"                  },
-       { "tbit",  0,  10800, "Asia/Tbilisi"                  },
        { "tbmt",  0,  10751, "Asia/Tbilisi"                  },
-       { "tft",   0,  18000, "Indian/Kerguelen"              },
-       { "tjt",   0,  18000, "Asia/Dushanbe"                 },
        { "tkt",   0, -39600, "Pacific/Fakaofo"               },
        { "tkt",   0,  46800, "Pacific/Fakaofo"               },
        { "tlt",   0,  32400, "Asia/Dili"                     },
        { "tlt",   0,  28800, "Asia/Dili"                     },
        { "tmt",   0,  12344, "Asia/Tehran"                   },
        { "tmt",   0,   5940, "Europe/Tallinn"                },
-       { "tmt",   0,  14400, "Asia/Ashgabat"                 },
-       { "tmt",   0,  14400, "Asia/Ashkhabad"                },
-       { "tmt",   0,  18000, "Asia/Ashgabat"                 },
-       { "tmt",   0,  18000, "Asia/Ashkhabad"                },
        { "tost",  1,  50400, "Pacific/Tongatapu"             },
        { "tot",   0,  46800, "Pacific/Tongatapu"             },
        { "tot",   0,  44400, "Pacific/Tongatapu"             },
-       { "trst",  1,  14400, "Europe/Istanbul"               },
-       { "trst",  1,  14400, "Asia/Istanbul"                 },
-       { "trt",   0,  10800, "Europe/Istanbul"               },
-       { "trt",   0,  10800, "Asia/Istanbul"                 },
-       { "tsat",  0,  10800, "Europe/Volgograd"              },
        { "tvt",   0,  43200, "Pacific/Funafuti"              },
        { "uct",   0,      0, "Etc/UCT"                       },
        { "ulast", 1,  32400, "Asia/Ulaanbaatar"              },
        { "ulat",  0,  25200, "Asia/Ulan_Bator"               },
        { "ulat",  0,  28800, "Asia/Choibalsan"               },
        { "ulat",  0,  28800, "Asia/Ulan_Bator"               },
-       { "urast", 1,  21600, "Asia/Oral"                     },
-       { "urast", 1,  18000, "Asia/Oral"                     },
-       { "urat",  0,  21600, "Asia/Oral"                     },
-       { "urat",  0,  14400, "Asia/Oral"                     },
-       { "urat",  0,  18000, "Asia/Oral"                     },
-       { "utc",   0,      0, "Antarctica/Troll"              },
        { "utc",   0,      0, "Etc/Universal"                 },
        { "utc",   0,      0, "Etc/UTC"                       },
        { "utc",   0,      0, "Etc/Zulu"                      },
        { "uyst",  1,  -7200, "America/Montevideo"            },
        { "uyt",   0, -10800, "America/Montevideo"            },
        { "uyt",   0, -12600, "America/Montevideo"            },
-       { "uzst",  1,  21600, "Asia/Samarkand"                },
-       { "uzst",  1,  21600, "Asia/Tashkent"                 },
-       { "uzt",   0,  18000, "Asia/Samarkand"                },
-       { "uzt",   0,  18000, "Asia/Tashkent"                 },
        { "vet",   0, -16200, "America/Caracas"               },
        { "vet",   0, -14400, "America/Caracas"               },
-       { "vlast", 1,  39600, "Asia/Vladivostok"              },
-       { "vlast", 1,  36000, "Asia/Vladivostok"              },
-       { "vlast", 1,  39600, "Asia/Khandyga"                 },
-       { "vlat",  0,  36000, "Asia/Vladivostok"              },
-       { "vlat",  0,  32400, "Asia/Vladivostok"              },
-       { "vlat",  0,  39600, "Asia/Vladivostok"              },
-       { "vlat",  0,  36000, "Asia/Khandyga"                 },
-       { "vlat",  0,  36000, "Asia/Ust-Nera"                 },
-       { "vlat",  0,  39600, "Asia/Khandyga"                 },
-       { "vlat",  0,  39600, "Asia/Ust-Nera"                 },
-       { "volst", 1,  14400, "Europe/Volgograd"              },
-       { "volst", 1,  18000, "Europe/Volgograd"              },
-       { "volt",  0,  10800, "Europe/Volgograd"              },
-       { "volt",  0,  14400, "Europe/Volgograd"              },
-       { "vost",  0,  21600, "Antarctica/Vostok"             },
        { "vust",  1,  43200, "Pacific/Efate"                 },
        { "vut",   0,  39600, "Pacific/Efate"                 },
        { "wakt",  0,  43200, "Pacific/Wake"                  },
        { "wsst",  0,  46800, "Pacific/Apia"                  },
        { "xjt",   0,  21600, "Asia/Kashgar"                  },
        { "xjt",   0,  21600, "Asia/Urumqi"                   },
-       { "yakst", 1,  36000, "Asia/Yakutsk"                  },
-       { "yakst", 1,  32400, "Asia/Yakutsk"                  },
-       { "yakst", 1,  32400, "Asia/Chita"                    },
-       { "yakst", 1,  32400, "Asia/Khandyga"                 },
-       { "yakst", 1,  36000, "Asia/Chita"                    },
-       { "yakst", 1,  36000, "Asia/Khandyga"                 },
-       { "yakt",  0,  32400, "Asia/Yakutsk"                  },
-       { "yakt",  0,  28800, "Asia/Yakutsk"                  },
-       { "yakt",  0,  36000, "Asia/Yakutsk"                  },
-       { "yakt",  0,  28800, "Asia/Chita"                    },
-       { "yakt",  0,  28800, "Asia/Khandyga"                 },
-       { "yakt",  0,  28800, "Asia/Ust-Nera"                 },
-       { "yakt",  0,  32400, "Asia/Chita"                    },
-       { "yakt",  0,  32400, "Asia/Khandyga"                 },
-       { "yakt",  0,  32400, "Asia/Ust-Nera"                 },
-       { "yakt",  0,  36000, "Asia/Chita"                    },
-       { "yakt",  0,  36000, "Asia/Khandyga"                 },
        { "yddt",  1, -25200, "America/Dawson"                },
        { "yddt",  1, -25200, "America/Whitehorse"            },
        { "yddt",  1, -25200, "Canada/Yukon"                  },
        { "ydt",   1, -28800, "America/Whitehorse"            },
        { "ydt",   1, -28800, "America/Yakutat"               },
        { "ydt",   1, -28800, "Canada/Yukon"                  },
-       { "yekst", 1,  21600, "Asia/Yekaterinburg"            },
-       { "yekt",  0,  18000, "Asia/Yekaterinburg"            },
-       { "yekt",  0,  21600, "Asia/Yekaterinburg"            },
-       { "yerst", 1,  18000, "Asia/Yerevan"                  },
-       { "yerst", 1,  14400, "Asia/Yerevan"                  },
-       { "yert",  0,  14400, "Asia/Yerevan"                  },
-       { "yert",  0,  10800, "Asia/Yerevan"                  },
        { "ypt",   1, -28800, "America/Dawson"                },
        { "ypt",   1, -28800, "America/Whitehorse"            },
        { "ypt",   1, -28800, "America/Yakutat"               },
        { "w",     0, -36000, NULL                            },
        { "x",     0, -39600, NULL                            },
        { "y",     0, -43200, NULL                            },
-       { "zzz",   0,      0, "Antarctica/Davis"              },
-       { "zzz",   0,      0, "America/Cambridge_Bay"         },
-       { "zzz",   0,      0, "America/Inuvik"                },
-       { "zzz",   0,      0, "America/Iqaluit"               },
-       { "zzz",   0,      0, "America/Pangnirtung"           },
-       { "zzz",   0,      0, "America/Rankin_Inlet"          },
-       { "zzz",   0,      0, "America/Resolute"              },
-       { "zzz",   0,      0, "America/Yellowknife"           },
-       { "zzz",   0,      0, "Antarctica/Casey"              },
-       { "zzz",   0,      0, "Antarctica/DumontDUrville"     },
-       { "zzz",   0,      0, "Antarctica/Macquarie"          },
-       { "zzz",   0,      0, "Antarctica/Mawson"             },
-       { "zzz",   0,      0, "Antarctica/Palmer"             },
-       { "zzz",   0,      0, "Antarctica/Rothera"            },
-       { "zzz",   0,      0, "Antarctica/Syowa"              },
-       { "zzz",   0,      0, "Antarctica/Troll"              },
-       { "zzz",   0,      0, "Antarctica/Vostok"             },
-       { "zzz",   0,      0, "Indian/Kerguelen"              },
        { "z",     0,      0, NULL                            },
index 57e0cef1be61956874402c02799ea25a8da0d60c..0d65006de4a182a068102752860e7c0444cd417b 100644 (file)
@@ -32,6 +32,18 @@ static int month_tab[12]          = {   0,  31,  59,  90, 120, 151, 181, 212, 24
 static int days_in_month_leap[13] = {  31,  31,  29,  31,  30,  31,  30,  31,  31,  30,  31,  30,  31 };
 static int days_in_month[13]      = {  31,  31,  28,  31,  30,  31,  30,  31,  31,  30,  31,  30,  31 };
 
+static void do_range_limit_fraction(double *fraction, timelib_sll *seconds)
+{
+       if (*fraction < 0) {
+               *fraction += 1;
+               *seconds -= 1;
+       }
+       if (*fraction > 1) {
+               *fraction -= 1;
+               *seconds += 1;
+       }
+}
+
 static void do_range_limit(timelib_sll start, timelib_sll end, timelib_sll adj, timelib_sll *a, timelib_sll *b)
 {
        if (*a < start) {
@@ -192,6 +204,7 @@ void timelib_do_rel_normalize(timelib_time *base, timelib_rel_time *rt)
 
 void timelib_do_normalize(timelib_time* time)
 {
+       if (time->s != TIMELIB_UNSET) do_range_limit_fraction(&time->f, &time->s);
        if (time->s != TIMELIB_UNSET) do_range_limit(0, 60, 60, &time->s, &time->i);
        if (time->s != TIMELIB_UNSET) do_range_limit(0, 60, 60, &time->i, &time->h);
        if (time->s != TIMELIB_UNSET) do_range_limit(0, 24, 24, &time->h, &time->d);
@@ -209,6 +222,8 @@ static void do_adjust_relative(timelib_time* time)
        timelib_do_normalize(time);
 
        if (time->have_relative) {
+               time->f += time->relative.f;
+
                time->s += time->relative.s;
                time->i += time->relative.i;
                time->h += time->relative.h;
index a9b71662eadef9ea4e019b50f70d7f5f0b8344d0..6a8627a98684bc27878dc1c4da48dfc06f5a5236 100644 (file)
@@ -294,3 +294,10 @@ int timelib_apply_localtime(timelib_time *t, unsigned int localtime)
        }
        return 0;
 }
+
+#if HAVE_GETTIMEOFDAY
+void timelib_set_fraction_from_timeval(timelib_time *t, struct timeval tp)
+{
+       t->f = (double) tp.tv_usec / 1000000;
+}
+#endif
index e960161987daae5f187bd1c3e3762b4e3beb1bec..73715904693a3de854328218794e8d029dc3658b 100644 (file)
@@ -253,12 +253,14 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_date_time_set, 0, 0, 3)
        ZEND_ARG_INFO(0, hour)
        ZEND_ARG_INFO(0, minute)
        ZEND_ARG_INFO(0, second)
+       ZEND_ARG_INFO(0, microseconds)
 ZEND_END_ARG_INFO()
 
 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_ARG_INFO(0, microseconds)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_date_date_set, 0, 0, 4)
@@ -2370,6 +2372,8 @@ static HashTable *date_object_get_properties_interval(zval *object) /* {{{ */
        PHP_DATE_INTERVAL_ADD_PROPERTY("h", h);
        PHP_DATE_INTERVAL_ADD_PROPERTY("i", i);
        PHP_DATE_INTERVAL_ADD_PROPERTY("s", s);
+       ZVAL_DOUBLE(&zv, (double)intervalobj->diff->f);
+       zend_hash_str_update(props, "f", sizeof("f") - 1, &zv);
        PHP_DATE_INTERVAL_ADD_PROPERTY("weekday", weekday);
        PHP_DATE_INTERVAL_ADD_PROPERTY("weekday_behavior", weekday_behavior);
        PHP_DATE_INTERVAL_ADD_PROPERTY("first_last_day_of", first_last_day_of);
@@ -2487,6 +2491,23 @@ static void update_errors_warnings(timelib_error_container *last_errors) /* {{{
        DATEG(last_errors) = last_errors;
 } /* }}} */
 
+static void php_date_set_time_fraction(timelib_time *time, int microseconds)
+{
+       time->f = microseconds / 1000000;
+}
+
+static void php_date_set_current_time_fraction(timelib_time *time)
+{
+#if HAVE_GETTIMEOFDAY
+       struct timeval tp = {0}; /* For setting microseconds */
+
+       gettimeofday(&tp, NULL);
+       timelib_set_fraction_from_timeval(time, tp);
+#else
+       time->f = 0;
+#endif
+}
+
 PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, size_t time_str_len, char *format, zval *timezone_object, int ctor) /* {{{ */
 {
        timelib_time   *now;
@@ -2560,7 +2581,7 @@ PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str,
                        break;
        }
        timelib_unixtime2local(now, (timelib_sll) time(NULL));
-
+       php_date_set_current_time_fraction(now);
        timelib_fill_holes(dateobj->time, now, TIMELIB_NO_CLONE);
        timelib_update_ts(dateobj->time, tzi);
        timelib_update_from_sse(dateobj->time);
@@ -3056,6 +3077,11 @@ static int php_date_modify(zval *object, char *modify, size_t modify_len) /* {{{
                        dateobj->time->s = 0;
                }
        }
+
+       if (tmp_time->f != -99999) {
+               dateobj->time->f = tmp_time->f;
+       }
+
        timelib_time_dtor(tmp_time);
 
        timelib_update_ts(dateobj->time, NULL);
@@ -3355,7 +3381,7 @@ PHP_FUNCTION(date_offset_get)
 }
 /* }}} */
 
-static void php_date_time_set(zval *object, zend_long h, zend_long i, zend_long s, zval *return_value) /* {{{ */
+static void php_date_time_set(zval *object, zend_long h, zend_long i, zend_long s, zend_long ms, zval *return_value) /* {{{ */
 {
        php_date_obj *dateobj;
 
@@ -3364,22 +3390,23 @@ static void php_date_time_set(zval *object, zend_long h, zend_long i, zend_long
        dateobj->time->h = h;
        dateobj->time->i = i;
        dateobj->time->s = s;
+       dateobj->time->f = ((double) ms) / 1000000;
        timelib_update_ts(dateobj->time, NULL);
 } /* }}} */
 
-/* {{{ proto DateTime date_time_set(DateTime object, long hour, long minute[, long second])
+/* {{{ proto DateTime date_time_set(DateTime object, long hour, long minute[, long second[, long microseconds]])
    Sets the time.
 */
 PHP_FUNCTION(date_time_set)
 {
        zval *object;
-       zend_long  h, i, s = 0;
+       zend_long  h, i, s = 0, ms = 0;
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Oll|l", &object, date_ce_date, &h, &i, &s) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Oll|ll", &object, date_ce_date, &h, &i, &s, &ms) == FAILURE) {
                RETURN_FALSE;
        }
 
-       php_date_time_set(object, h, i, s, return_value);
+       php_date_time_set(object, h, i, s, ms, return_value);
 
        Z_ADDREF_P(object);
        ZVAL_COPY_VALUE(return_value, object);
@@ -3391,14 +3418,14 @@ PHP_FUNCTION(date_time_set)
 PHP_METHOD(DateTimeImmutable, setTime)
 {
        zval *object, new_object;
-       zend_long  h, i, s = 0;
+       zend_long  h, i, s = 0, ms = 0;
 
-       if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Oll|l", &object, date_ce_immutable, &h, &i, &s) == FAILURE) {
+       if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Oll|ll", &object, date_ce_immutable, &h, &i, &s, &ms) == FAILURE) {
                RETURN_FALSE;
        }
 
        date_clone_immutable(object, &new_object);
-       php_date_time_set(&new_object, h, i, s, return_value);
+       php_date_time_set(&new_object, h, i, s, ms, return_value);
 
        ZVAL_OBJ(return_value, Z_OBJ(new_object));
 }
@@ -3514,6 +3541,7 @@ static void php_date_timestamp_set(zval *object, zend_long timestamp, zval *retu
        DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
        timelib_unixtime2local(dateobj->time, (timelib_sll)timestamp);
        timelib_update_ts(dateobj->time, NULL);
+       php_date_set_time_fraction(dateobj->time, 0);
 } /* }}} */
 
 /* {{{ proto DateTime date_timestamp_set(DateTime object, long unixTimestamp)
@@ -3979,6 +4007,7 @@ zval *date_interval_read_property(zval *object, zval *member, int type, void **c
        zval *retval;
        zval tmp_member;
        timelib_sll value = -1;
+       double      fvalue = -1;
 
        if (Z_TYPE_P(member) != IS_STRING) {
                tmp_member = *member;
@@ -4010,6 +4039,10 @@ zval *date_interval_read_property(zval *object, zval *member, int type, void **c
                GET_VALUE_FROM_STRUCT(h, "h");
                GET_VALUE_FROM_STRUCT(i, "i");
                GET_VALUE_FROM_STRUCT(s, "s");
+               if (strcmp(Z_STRVAL_P(member), "f") == 0) {
+                       fvalue = obj->diff->f;
+                       break;
+               }
                GET_VALUE_FROM_STRUCT(invert, "invert");
                GET_VALUE_FROM_STRUCT(days, "days");
                /* didn't find any */
@@ -4024,7 +4057,9 @@ zval *date_interval_read_property(zval *object, zval *member, int type, void **c
 
        retval = rv;
 
-       if (value != -99999) {
+       if (fvalue != -1) {
+               ZVAL_DOUBLE(retval, fvalue);
+       } else if (value != -99999) {
                ZVAL_LONG(retval, value);
        } else {
                ZVAL_FALSE(retval);
@@ -4075,6 +4110,10 @@ void date_interval_write_property(zval *object, zval *member, zval *value, void
                SET_VALUE_FROM_STRUCT(h, "h");
                SET_VALUE_FROM_STRUCT(i, "i");
                SET_VALUE_FROM_STRUCT(s, "s");
+               if (strcmp(Z_STRVAL_P(member), "f") == 0) {
+                       obj->diff->f = zval_get_double(value);
+                       break;
+               }
                SET_VALUE_FROM_STRUCT(invert, "invert");
                /* didn't find any */
                (zend_get_std_object_handlers())->write_property(object, member, value, cache_slot);
@@ -4139,12 +4178,23 @@ static int php_date_interval_initialize_from_hash(zval **return_value, php_inter
                } \
        } while (0);
 
+#define PHP_DATE_INTERVAL_READ_PROPERTY_DOUBLE(element, member, def) \
+       do { \
+               zval *z_arg = zend_hash_str_find(myht, element, sizeof(element) - 1); \
+               if (z_arg) { \
+                       (*intobj)->diff->member = (double)zval_get_double(z_arg); \
+               } else { \
+                       (*intobj)->diff->member = (double)def; \
+               } \
+       } while (0);
+
        PHP_DATE_INTERVAL_READ_PROPERTY("y", y, timelib_sll, -1)
        PHP_DATE_INTERVAL_READ_PROPERTY("m", m, timelib_sll, -1)
        PHP_DATE_INTERVAL_READ_PROPERTY("d", d, timelib_sll, -1)
        PHP_DATE_INTERVAL_READ_PROPERTY("h", h, timelib_sll, -1)
        PHP_DATE_INTERVAL_READ_PROPERTY("i", i, timelib_sll, -1)
        PHP_DATE_INTERVAL_READ_PROPERTY("s", s, timelib_sll, -1)
+       PHP_DATE_INTERVAL_READ_PROPERTY_DOUBLE("f", f, -1)
        PHP_DATE_INTERVAL_READ_PROPERTY("weekday", weekday, int, -1)
        PHP_DATE_INTERVAL_READ_PROPERTY("weekday_behavior", weekday_behavior, int, -1)
        PHP_DATE_INTERVAL_READ_PROPERTY("first_last_day_of", first_last_day_of, int, -1)
@@ -4254,6 +4304,9 @@ static zend_string *date_interval_format(char *format, size_t format_len, timeli
                                case 'S': length = slprintf(buffer, 32, "%02" ZEND_LONG_FMT_SPEC, (zend_long) t->s); break;
                                case 's': length = slprintf(buffer, 32, ZEND_LONG_FMT, (zend_long) t->s); break;
 
+                               case 'F': length = slprintf(buffer, 32, "%06" ZEND_LONG_FMT_SPEC, (zend_long) (t->f * 1000000)); break;
+                               case 'f': length = slprintf(buffer, 32, ZEND_LONG_FMT, (zend_long) (t->f * 1000000)); break;
+
                                case 'a': {
                                        if ((int) t->days != -99999) {
                                                length = slprintf(buffer, 32, "%d", (int) t->days);
index 8b392297036a3dadc3c8e571081f6632a8013ffb..ff42de5dea179ba203cb6ea5c447df8f664d7878 100644 (file)
@@ -8,17 +8,8 @@ date_default_timezone_set('UTC');
   echo "Done\n";
 ?>
 --EXPECTF--
-array(6) {
+array(5) {
   [0]=>
-  array(3) {
-    ["dst"]=>
-    bool(false)
-    ["offset"]=>
-    int(0)
-    ["timezone_id"]=>
-    string(16) "Antarctica/Troll"
-  }
-  [1]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -27,7 +18,7 @@ array(6) {
     ["timezone_id"]=>
     string(13) "Etc/Universal"
   }
-  [2]=>
+  [1]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -36,7 +27,7 @@ array(6) {
     ["timezone_id"]=>
     string(7) "Etc/UTC"
   }
-  [3]=>
+  [2]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -45,7 +36,7 @@ array(6) {
     ["timezone_id"]=>
     string(8) "Etc/Zulu"
   }
-  [4]=>
+  [3]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -54,7 +45,7 @@ array(6) {
     ["timezone_id"]=>
     string(3) "UTC"
   }
-  [5]=>
+  [4]=>
   array(3) {
     ["dst"]=>
     bool(false)
index 8e6e33bd173bdffc78778ec305adc8774df23405..2dec10ad57b67d139999abc8c9e47baf2b489c04 100644 (file)
@@ -1,6 +1,5 @@
 --TEST--
-DateTimeZone::getLocation -- timezone_location_get â€” Returns location information for a timezone
-public array DateTimeZone::getLocation ( void ) ;
+DateTimeZone::getLocation -- timezone_location_get â€” Returns location information for a timezone public array DateTimeZone::getLocation ( void ) ;
 --CREDITS--
 marcosptf - <marcosptf@yahoo.com.br> - #phparty7 - @phpsp - novatec/2015 - sao paulo - br
 --SKIPIF--
@@ -66,17 +65,3 @@ Array
     [longitude] => %f
     [comments] => %s
 )
-Array
-(
-    [country_code] => %s
-    [latitude] => %f
-    [longitude] => %f
-    [comments] => %s
-)
-Array
-(
-    [country_code] => %s
-    [latitude] => %f
-    [longitude] => %f
-    [comments] => 
-)
index e4a5dbd1757b8712d65f92f91f3cc9bec5a3c25a..1cbaaef377e17cadd3f831adf5f6ba471c3024d3 100644 (file)
@@ -29,7 +29,7 @@ string(5) "array"
 int(%d)
 
 -- Format a sample entry --
-array(11) {
+array(17) {
   [0]=>
   array(3) {
     ["dst"]=>
@@ -44,11 +44,20 @@ array(11) {
     ["dst"]=>
     bool(false)
     ["offset"]=>
-    int(34200)
+    int(32400)
     ["timezone_id"]=>
     string(18) "Australia/Adelaide"
   }
   [2]=>
+  array(3) {
+    ["dst"]=>
+    bool(false)
+    ["offset"]=>
+    int(34200)
+    ["timezone_id"]=>
+    string(18) "Australia/Adelaide"
+  }
+  [3]=>
   array(3) {
     ["dst"]=>
     bool(true)
@@ -57,7 +66,7 @@ array(11) {
     ["timezone_id"]=>
     string(16) "America/Eirunepe"
   }
-  [3]=>
+  [4]=>
   array(3) {
     ["dst"]=>
     bool(true)
@@ -66,7 +75,7 @@ array(11) {
     ["timezone_id"]=>
     string(18) "America/Rio_Branco"
   }
-  [4]=>
+  [5]=>
   array(3) {
     ["dst"]=>
     bool(true)
@@ -75,7 +84,52 @@ array(11) {
     ["timezone_id"]=>
     string(11) "Brazil/Acre"
   }
-  [5]=>
+  [6]=>
+  array(3) {
+    ["dst"]=>
+    bool(false)
+    ["offset"]=>
+    int(32400)
+    ["timezone_id"]=>
+    string(21) "Australia/Broken_Hill"
+  }
+  [7]=>
+  array(3) {
+    ["dst"]=>
+    bool(false)
+    ["offset"]=>
+    int(32400)
+    ["timezone_id"]=>
+    string(16) "Australia/Darwin"
+  }
+  [8]=>
+  array(3) {
+    ["dst"]=>
+    bool(false)
+    ["offset"]=>
+    int(32400)
+    ["timezone_id"]=>
+    string(15) "Australia/North"
+  }
+  [9]=>
+  array(3) {
+    ["dst"]=>
+    bool(false)
+    ["offset"]=>
+    int(32400)
+    ["timezone_id"]=>
+    string(15) "Australia/South"
+  }
+  [10]=>
+  array(3) {
+    ["dst"]=>
+    bool(false)
+    ["offset"]=>
+    int(32400)
+    ["timezone_id"]=>
+    string(20) "Australia/Yancowinna"
+  }
+  [11]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -84,7 +138,7 @@ array(11) {
     ["timezone_id"]=>
     string(13) "Asia/Jayapura"
   }
-  [6]=>
+  [12]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -93,7 +147,7 @@ array(11) {
     ["timezone_id"]=>
     string(21) "Australia/Broken_Hill"
   }
-  [7]=>
+  [13]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -102,7 +156,7 @@ array(11) {
     ["timezone_id"]=>
     string(16) "Australia/Darwin"
   }
-  [8]=>
+  [14]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -111,7 +165,7 @@ array(11) {
     ["timezone_id"]=>
     string(15) "Australia/North"
   }
-  [9]=>
+  [15]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -120,7 +174,7 @@ array(11) {
     ["timezone_id"]=>
     string(15) "Australia/South"
   }
-  [10]=>
+  [16]=>
   array(3) {
     ["dst"]=>
     bool(false)
index eaf1555d1d1b9027a165216a2c28fef13f90ca2a..a6b5c5edea0e159cca93bc4ffd2e9faaa5142dd0 100644 (file)
@@ -25,7 +25,8 @@ echo "\n-- Testing DateTime::setTime() function with more than expected no. of a
 $min = 15;
 $sec = 30;
 $extra_arg = 10;
-var_dump( $datetime->setTime($hour, $min, $sec, $extra_arg) );
+$microseconds = 123123;
+var_dump( $datetime->setTime($hour, $min, $sec, $microseconds, $extra_arg) );
 
 ?>
 ===DONE===
@@ -44,6 +45,6 @@ bool(false)
 
 -- Testing DateTime::setTime() function with more than expected no. of arguments --
 
-Warning: DateTime::setTime() expects at most 3 parameters, 4 given in %s on line %d
+Warning: DateTime::setTime() expects at most 4 parameters, 5 given in %s on line %d
 bool(false)
 ===DONE===
index ea8fa94706ef8e6b399025e03593ee55e35dbbbe..324f64867d2ce22640a6101bebd0f3e5715edec0 100644 (file)
@@ -12,7 +12,7 @@ $diff = date_diff($date, $other);
 
 var_dump($diff);
 --EXPECTF--
-object(DateInterval)#%d (15) {
+object(DateInterval)#%d (16) {
   ["y"]=>
   int(0)
   ["m"]=>
@@ -25,6 +25,8 @@ object(DateInterval)#%d (15) {
   int(0)
   ["s"]=>
   int(0)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
index 253cb84ce6beb537482298ebc3946d6387276f1f..9565cb2dfbf25417bb31be015cd3253c343ede99 100644 (file)
@@ -15,6 +15,7 @@ DateInterval Object
     [h] => 12
     [i] => 30
     [s] => 5
+    [f] => 0
     [weekday] => 0
     [weekday_behavior] => 0
     [first_last_day_of] => 0
@@ -33,6 +34,7 @@ DateInterval Object
     [h] => 12
     [i] => 30
     [s] => 5
+    [f] => 0
     [weekday] => 0
     [weekday_behavior] => 0
     [first_last_day_of] => 0
index 31f735148195c47a60afa3c3e29530a0ef3ef956..b5d17a6c264b6d3fa6acd9774a520b01851a9974 100644 (file)
@@ -17,6 +17,7 @@ DateInterval Object
     [h] => 4
     [i] => 0
     [s] => 0
+    [f] => 0
     [weekday] => 0
     [weekday_behavior] => 0
     [first_last_day_of] => 0
index 2062d69168d8d1437401218911df213ba2bd5284..56ce135179222ae16303131b074ba0779ad18778 100644 (file)
@@ -7,8 +7,8 @@ var_dump($i);
 echo $i->format("%d"), "\n";
 echo $i->format("%a"), "\n";
 ?>
---EXPECT--
-object(DateInterval)#1 (15) {
+--EXPECTF--
+object(DateInterval)#%d (16) {
   ["y"]=>
   int(0)
   ["m"]=>
@@ -21,6 +21,8 @@ object(DateInterval)#1 (15) {
   int(0)
   ["s"]=>
   int(0)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
index 62c2fca94ea5a9a4c10cfcad58d322d570bdee05..dfc7d6112d3539a5636c549f2275b221b0e74b11 100644 (file)
@@ -23,6 +23,7 @@ $unser = DateInterval::__set_state(array(
    'h' => 4,
    'i' => 3,
    's' => 2,
+   'f' => 0.876543,
    'invert' => 1,
    'days' => 2400,
 ));
@@ -32,7 +33,7 @@ var_dump($unser, $p);
 
 ?>
 --EXPECT--
-object(DateInterval)#3 (15) {
+object(DateInterval)#3 (16) {
   ["y"]=>
   int(0)
   ["m"]=>
@@ -45,6 +46,8 @@ object(DateInterval)#3 (15) {
   int(0)
   ["s"]=>
   int(0)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
@@ -64,7 +67,7 @@ object(DateInterval)#3 (15) {
   ["have_special_relative"]=>
   int(0)
 }
-string(320) "O:12:"DateInterval":15:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:4;s:1:"i";i:0;s:1:"s";i:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}"
+string(332) "O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:4;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}"
 DateInterval::__set_state(array(
    'y' => 0,
    'm' => 0,
@@ -72,6 +75,7 @@ DateInterval::__set_state(array(
    'h' => 4,
    'i' => 0,
    's' => 0,
+   'f' => 0.0,
    'weekday' => 0,
    'weekday_behavior' => 0,
    'first_last_day_of' => 0,
@@ -81,7 +85,7 @@ DateInterval::__set_state(array(
    'special_amount' => 0,
    'have_weekday_relative' => 0,
    'have_special_relative' => 0,
-))object(DateInterval)#5 (15) {
+))object(DateInterval)#5 (16) {
   ["y"]=>
   int(0)
   ["m"]=>
@@ -94,6 +98,8 @@ DateInterval::__set_state(array(
   int(0)
   ["s"]=>
   int(0)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
@@ -128,7 +134,7 @@ object(DatePeriod)#6 (6) {
   ["end"]=>
   NULL
   ["interval"]=>
-  object(DateInterval)#7 (15) {
+  object(DateInterval)#7 (16) {
     ["y"]=>
     int(0)
     ["m"]=>
@@ -141,6 +147,8 @@ object(DatePeriod)#6 (6) {
     int(0)
     ["s"]=>
     int(0)
+    ["f"]=>
+    float(0)
     ["weekday"]=>
     int(0)
     ["weekday_behavior"]=>
@@ -165,7 +173,7 @@ object(DatePeriod)#6 (6) {
   ["include_start_date"]=>
   bool(true)
 }
-object(DateInterval)#8 (15) {
+object(DateInterval)#8 (16) {
   ["y"]=>
   int(7)
   ["m"]=>
@@ -178,6 +186,8 @@ object(DateInterval)#8 (15) {
   int(3)
   ["s"]=>
   int(2)
+  ["f"]=>
+  float(0.876543)
   ["weekday"]=>
   int(-1)
   ["weekday_behavior"]=>
@@ -212,7 +222,7 @@ object(DatePeriod)#9 (6) {
   ["end"]=>
   NULL
   ["interval"]=>
-  object(DateInterval)#7 (15) {
+  object(DateInterval)#7 (16) {
     ["y"]=>
     int(0)
     ["m"]=>
@@ -225,6 +235,8 @@ object(DatePeriod)#9 (6) {
     int(0)
     ["s"]=>
     int(0)
+    ["f"]=>
+    float(0)
     ["weekday"]=>
     int(0)
     ["weekday_behavior"]=>
index ea219f7c7c6f9a2b51e4ad2d017bace1e092c243..6ed72af1c108ecb82d36731c8f66b1d743ec7166 100644 (file)
@@ -27,6 +27,7 @@ di Object
     [h] => 0
     [i] => 0
     [s] => 0
+    [f] => 0
     [weekday] => 0
     [weekday_behavior] => 0
     [first_last_day_of] => 0
index 1f0fc84cd78206609ccb9b6572b88cc1bdcbdf72..810874858f6afe983e838ded070065b6cfde84fe 100644 (file)
@@ -25,7 +25,7 @@ foreach($intervals as $iv) {
 echo "==DONE==\n";
 ?>
 --EXPECTF--
-object(DateInterval)#%d (15) {
+object(DateInterval)#%d (16) {
   ["y"]=>
   int(1)
   ["m"]=>
@@ -38,6 +38,8 @@ object(DateInterval)#%d (15) {
   int(30)
   ["s"]=>
   int(0)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
@@ -57,7 +59,7 @@ object(DateInterval)#%d (15) {
   ["have_special_relative"]=>
   int(0)
 }
-object(DateInterval)#%d (15) {
+object(DateInterval)#%d (16) {
   ["y"]=>
   int(0)
   ["m"]=>
@@ -70,6 +72,8 @@ object(DateInterval)#%d (15) {
   int(30)
   ["s"]=>
   int(0)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
@@ -89,7 +93,7 @@ object(DateInterval)#%d (15) {
   ["have_special_relative"]=>
   int(0)
 }
-object(DateInterval)#%d (15) {
+object(DateInterval)#%d (16) {
   ["y"]=>
   int(0)
   ["m"]=>
@@ -102,6 +106,8 @@ object(DateInterval)#%d (15) {
   int(30)
   ["s"]=>
   int(0)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
index f82a4879b387e030046bc82f5a0b7de6faf7e0d9..0be9691a1401000aa2ab31daf5a072c5268aff60 100644 (file)
@@ -51,7 +51,7 @@ object(DatePeriod)#1 (6) {
   ["end"]=>
   NULL
   ["interval"]=>
-  object(DateInterval)#5 (15) {
+  object(DateInterval)#5 (16) {
     ["y"]=>
     int(0)
     ["m"]=>
@@ -64,6 +64,8 @@ object(DatePeriod)#1 (6) {
     int(0)
     ["s"]=>
     int(0)
+    ["f"]=>
+    float(0)
     ["weekday"]=>
     int(0)
     ["weekday_behavior"]=>
@@ -110,7 +112,7 @@ object(DatePeriod)#5 (6) {
   ["end"]=>
   NULL
   ["interval"]=>
-  object(DateInterval)#8 (15) {
+  object(DateInterval)#8 (16) {
     ["y"]=>
     int(0)
     ["m"]=>
@@ -123,6 +125,8 @@ object(DatePeriod)#5 (6) {
     int(0)
     ["s"]=>
     int(0)
+    ["f"]=>
+    float(0)
     ["weekday"]=>
     int(0)
     ["weekday_behavior"]=>
index 50aebda57c24b38d8286772fa488584816e03926..2ef21e738e5fa2a0660127c4da329bbf9131abd3 100644 (file)
@@ -13,7 +13,7 @@ var_dump($di0, $di1);
 ?>
 ==DONE==
 --EXPECT--
-object(DateInterval)#1 (15) {
+object(DateInterval)#1 (16) {
   ["y"]=>
   int(2)
   ["m"]=>
@@ -26,6 +26,8 @@ object(DateInterval)#1 (15) {
   int(8)
   ["s"]=>
   int(0)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
@@ -45,7 +47,7 @@ object(DateInterval)#1 (15) {
   ["have_special_relative"]=>
   int(0)
 }
-object(DateInterval)#2 (15) {
+object(DateInterval)#2 (16) {
   ["y"]=>
   int(2)
   ["m"]=>
@@ -58,6 +60,8 @@ object(DateInterval)#2 (15) {
   int(8)
   ["s"]=>
   int(0)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
index 88fd81c9db17d5482a56162dcec5ee5425782275..189c15cb1b329aa8259a8ef45dae0ae781b6ff7f 100644 (file)
@@ -15,13 +15,14 @@ var_dump($df,
        $df->h,
        $df->i,
        $df->s,
+       $df->f,
        $df->invert,
        $df->days);
 
 ?>
 ==DONE==
 --EXPECTF--
-object(DateInterval)#%d (15) {
+object(DateInterval)#%d (16) {
   ["y"]=>
   int(0)
   ["m"]=>
@@ -34,6 +35,8 @@ object(DateInterval)#%d (15) {
   int(0)
   ["s"]=>
   int(0)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
@@ -59,6 +62,7 @@ int(2)
 int(0)
 int(0)
 int(0)
+float(0)
 int(0)
 int(2)
 ==DONE==
index e95fcdae96447d4edf31f16bbaa685a2ac649e2f..38783b15456bd111bec710362a8bc78c3c8e356f 100644 (file)
@@ -12,7 +12,7 @@ var_dump($di);
 ?>
 ==DONE==
 --EXPECTF--
-object(DateInterval)#%d (15) {
+object(DateInterval)#%d (16) {
   ["y"]=>
   int(2)
   ["m"]=>
@@ -43,5 +43,7 @@ object(DateInterval)#%d (15) {
   int(9)
   ["have_special_relative"]=>
   int(0)
+  ["f"]=>
+  float(-1)
 }
 ==DONE==
diff --git a/ext/date/tests/bug53437_var6.phpt b/ext/date/tests/bug53437_var6.phpt
new file mode 100644 (file)
index 0000000..633fcb3
--- /dev/null
@@ -0,0 +1,49 @@
+--TEST--
+Bug #53437 DateInterval unserialize bad data, 64 bit
+--SKIPIF--
+<?php if (PHP_INT_SIZE != 8) { die('skip true 64 bit only'); } ?>
+--FILE--
+<?php
+$s = 'O:12:"DateInterval":16:{s:1:"y";s:1:"2";s:1:"m";s:1:"0";s:1:"d";s:3:"bla";s:1:"h";s:1:"6";s:1:"i";s:1:"8";s:1:"s";s:1:"0";s:1:"f";d:0.123654;s:7:"weekday";i:10;s:16:"weekday_behavior";i:10;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";s:4:"aoeu";s:12:"special_type";i:0;s:14:"special_amount";s:21:"234523452345234532455";s:21:"have_weekday_relative";i:21474836489;s:21:"have_special_relative";s:3:"bla";}';
+
+$di = unserialize($s);
+var_dump($di);
+
+?>
+==DONE==
+--EXPECTF--
+object(DateInterval)#%d (16) {
+  ["y"]=>
+  int(2)
+  ["m"]=>
+  int(0)
+  ["d"]=>
+  int(0)
+  ["h"]=>
+  int(6)
+  ["i"]=>
+  int(8)
+  ["s"]=>
+  int(0)
+  ["f"]=>
+  float(0.123654)
+  ["weekday"]=>
+  int(10)
+  ["weekday_behavior"]=>
+  int(10)
+  ["first_last_day_of"]=>
+  int(0)
+  ["invert"]=>
+  int(0)
+  ["days"]=>
+  int(0)
+  ["special_type"]=>
+  int(0)
+  ["special_amount"]=>
+  int(9223372036854775807)
+  ["have_weekday_relative"]=>
+  int(9)
+  ["have_special_relative"]=>
+  int(0)
+}
+==DONE==
index 7045cd7781fdf7cb3c8e173be802481c00a84141..0a9c4223c37c3600282080157e7a0fed595fcf6a 100644 (file)
@@ -21,6 +21,8 @@ object(DateInterval)#1 (%d) {
   int(0)
   ["s"]=>
   int(0)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
index fefffcde521fd82e0489443b9bdd4375de4e6b09..2b73eae6a8cc31f9e77d92de7b30c2f5b5efb79c 100644 (file)
@@ -11,7 +11,7 @@ var_dump($start);
 var_dump($end);
 var_dump($int);
 ?>
---EXPECT--
+--EXPECTF--
 object(DateTime)#1 (3) {
   ["date"]=>
   string(26) "2010-10-04 02:18:48.000000"
@@ -28,7 +28,7 @@ object(DateTime)#2 (3) {
   ["timezone"]=>
   string(3) "EDT"
 }
-object(DateInterval)#3 (15) {
+object(DateInterval)#%d (16) {
   ["y"]=>
   int(0)
   ["m"]=>
@@ -41,6 +41,8 @@ object(DateInterval)#3 (15) {
   int(19)
   ["s"]=>
   int(40)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
index 369db5714acec144cb1ce69e4c606c29a4707249..526b474e47c0af0f78fdcd27984ff83b2bdde711 100644 (file)
@@ -8,7 +8,7 @@ $i = date_interval_create_from_date_string(null); //returns a empty object
 var_dump($i);
 ?>
 --EXPECTF--
-object(DateInterval)#1 (15) {
+object(DateInterval)#%d (16) {
   ["y"]=>
   int(0)
   ["m"]=>
@@ -21,6 +21,8 @@ object(DateInterval)#1 (15) {
   int(0)
   ["s"]=>
   int(0)
+  ["f"]=>
+  float(0)
   ["weekday"]=>
   int(0)
   ["weekday_behavior"]=>
@@ -39,4 +41,4 @@ object(DateInterval)#1 (15) {
   int(0)
   ["have_special_relative"]=>
   int(0)
-}
\ No newline at end of file
+}
index a3407c39679dff6a26cfd7cd8c6be5b290f3ffb5..89cea6abf36fa46130e9a12b5a163eb4f018219d 100644 (file)
@@ -1,9 +1,8 @@
 --TEST--
 Test date_interval_create_from_date_string() function : with 2 parameters (wrong).
-Rodrigo Prado de Jesus <royopa [at] gmail [dot] com>
 --FILE--
 <?php
 $i = date_interval_create_from_date_string('1 year', 'wrong');
 ?>
 --EXPECTF--
-Warning: date_interval_create_from_date_string() expects exactly 1 parameter, 2 given in %s on line %d
\ No newline at end of file
+Warning: date_interval_create_from_date_string() expects exactly 1 parameter, 2 given in %s on line %d
diff --git a/ext/date/tests/date_time_fractions.phpt b/ext/date/tests/date_time_fractions.phpt
new file mode 100644 (file)
index 0000000..c58ed4f
--- /dev/null
@@ -0,0 +1,99 @@
+--TEST--
+Fractions with DateTime objects
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+/* This will go wrong, once in a million times */
+$ms = date_create()->format('u');
+echo ($ms = 0) ? "microseconds = false\n" : "microseconds = true\n";
+
+/* Normal creation */
+echo date_create( "2016-10-03 12:47:18.819313" )->format( "Y-m-d H:i:s.u" ), "\n\n";
+
+/* With modifications */
+$dt = new DateTimeImmutable( "2016-10-03 12:47:18.819210" );
+echo $dt->modify( "+1 day" )->format( "Y-m-d H:i:s.u" ), "\n";
+
+$dt = new DateTimeImmutable( "2016-10-03 12:47:18.081921" );
+echo $dt->modify( "-3 months" )->format( "Y-m-d H:i:s.u" ), "\n";
+
+echo "\n";
+
+/* These should reset the time (and hence fraction) to 0 */
+$dt = new DateTimeImmutable( "2016-10-03 12:47:18.081921" );
+echo $dt->modify( "yesterday" )->format( "Y-m-d H:i:s.u" ), "\n";
+
+$dt = new DateTimeImmutable( "2016-10-03 12:47:18.081921" );
+echo $dt->modify( "noon" )->format( "Y-m-d H:i:s.u" ), "\n";
+
+$dt = new DateTimeImmutable( "2016-10-03 12:47:18.081921" );
+echo $dt->modify( "10 weekday" )->format( "Y-m-d H:i:s.u" ), "\n";
+
+/* Interval containing fractions */
+
+$dt1 = new DateTimeImmutable( "2016-10-03 13:20:07.103123" );
+$dt2 = new DateTimeImmutable( "2016-10-03 13:20:07.481312" );
+$diff = $dt1->diff( $dt2 );
+
+var_dump( $diff );
+
+$dt0 = $dt1->sub( $diff );
+$dt3 = $dt2->add( $diff );
+$dt4 = $dt3->add( $diff );
+
+echo $dt0->format( "Y-m-d H:i:s.u" ), "\n";
+echo $dt1->format( "Y-m-d H:i:s.u" ), "\n";
+echo $dt2->format( "Y-m-d H:i:s.u" ), "\n";
+echo $dt3->format( "Y-m-d H:i:s.u" ), "\n";
+echo $dt4->format( "Y-m-d H:i:s.u" ), "\n";
+?>
+--EXPECTF--
+microseconds = true
+2016-10-03 12:47:18.819313
+
+2016-10-04 12:47:18.819210
+2016-07-03 12:47:18.081921
+
+2016-10-02 00:00:00.000000
+2016-10-03 12:00:00.000000
+2016-10-17 00:00:00.000000
+object(DateInterval)#%d (16) {
+  ["y"]=>
+  int(0)
+  ["m"]=>
+  int(0)
+  ["d"]=>
+  int(0)
+  ["h"]=>
+  int(0)
+  ["i"]=>
+  int(0)
+  ["s"]=>
+  int(0)
+  ["f"]=>
+  float(0.378189)
+  ["weekday"]=>
+  int(0)
+  ["weekday_behavior"]=>
+  int(0)
+  ["first_last_day_of"]=>
+  int(0)
+  ["invert"]=>
+  int(0)
+  ["days"]=>
+  int(0)
+  ["special_type"]=>
+  int(0)
+  ["special_amount"]=>
+  int(0)
+  ["have_weekday_relative"]=>
+  int(0)
+  ["have_special_relative"]=>
+  int(0)
+}
+2016-10-03 13:20:06.724934
+2016-10-03 13:20:07.103123
+2016-10-03 13:20:07.481312
+2016-10-03 13:20:07.859501
+2016-10-03 13:20:08.237690
diff --git a/ext/date/tests/date_time_fractions_create_from_format.phpt b/ext/date/tests/date_time_fractions_create_from_format.phpt
new file mode 100644 (file)
index 0000000..c598f17
--- /dev/null
@@ -0,0 +1,29 @@
+--TEST--
+Fractions with DateTime objects (create_from_format)
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$dt = date_create_from_format( "Y-m-d H:i:s.u", "2016-10-03 12:47:18.819313" );
+var_dump( $dt );
+
+$dt = date_create_from_format( "U.u", "1475500799.176312" );
+var_dump( $dt );
+?>
+--EXPECTF--
+object(DateTime)#%d (%d) {
+  ["date"]=>
+  string(26) "2016-10-03 12:47:18.819313"
+  ["timezone_type"]=>
+  int(3)
+  ["timezone"]=>
+  string(3) "UTC"
+}
+object(DateTime)#%d (%d) {
+  ["date"]=>
+  string(26) "2016-10-03 13:19:59.176312"
+  ["timezone_type"]=>
+  int(1)
+  ["timezone"]=>
+  string(6) "+00:00"
+}
diff --git a/ext/date/tests/date_time_fractions_serialize.phpt b/ext/date/tests/date_time_fractions_serialize.phpt
new file mode 100644 (file)
index 0000000..4931bb0
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Fractions with DateTime objects (Serialization)
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+/* Normal creation */
+$dt = date_create( "2016-10-03 12:47:18.819313" );
+
+$s = serialize( $dt );
+echo $s, "\n";
+
+$u = unserialize( $s );
+var_dump( $u );
+?>
+--EXPECTF--
+O:8:"DateTime":3:{s:4:"date";s:26:"2016-10-03 12:47:18.819313";s:13:"timezone_type";i:3;s:8:"timezone";s:3:"UTC";}
+object(DateTime)#2 (%d) {
+  ["date"]=>
+  string(26) "2016-10-03 12:47:18.819313"
+  ["timezone_type"]=>
+  int(3)
+  ["timezone"]=>
+  string(3) "UTC"
+}
index 8e5c855bcd065d384640ef611fefdc012ca039bd..5c5ddaf4d2825526eadc8caffa3f61d7f56ec27c 100644 (file)
@@ -24,8 +24,9 @@ var_dump( date_time_set($datetime, $hour) );
 echo "\n-- Testing date_time_set() function with more than expected no. of arguments --\n";
 $min = 15;
 $sec = 30;
+$microseconds = 123123;
 $extra_arg = 10;
-var_dump( date_time_set($datetime, $hour, $min, $sec, $extra_arg) );
+var_dump( date_time_set($datetime, $hour, $min, $sec, $microseconds, $extra_arg) );
 
 echo "\n-- Testing date_time_set() function with an invalid values for \$object argument --\n";
 $invalid_obj = new stdClass();
@@ -54,7 +55,7 @@ bool(false)
 
 -- Testing date_time_set() function with more than expected no. of arguments --
 
-Warning: date_time_set() expects at most 4 parameters, 5 given in %s on line %d
+Warning: date_time_set() expects at most 5 parameters, 6 given in %s on line %d
 bool(false)
 
 -- Testing date_time_set() function with an invalid values for $object argument --
index 73af2acf3dd42037acdd429b72eb6252b9b263ce..7a0dcdee98f065f03a106bf588fae7d95eb81a61 100644 (file)
@@ -29,7 +29,7 @@ string(5) "array"
 int(%d)
 
 -- Format a sample entry --
-array(11) {
+array(17) {
   [0]=>
   array(3) {
     ["dst"]=>
@@ -44,11 +44,20 @@ array(11) {
     ["dst"]=>
     bool(false)
     ["offset"]=>
-    int(34200)
+    int(32400)
     ["timezone_id"]=>
     string(18) "Australia/Adelaide"
   }
   [2]=>
+  array(3) {
+    ["dst"]=>
+    bool(false)
+    ["offset"]=>
+    int(34200)
+    ["timezone_id"]=>
+    string(18) "Australia/Adelaide"
+  }
+  [3]=>
   array(3) {
     ["dst"]=>
     bool(true)
@@ -57,7 +66,7 @@ array(11) {
     ["timezone_id"]=>
     string(16) "America/Eirunepe"
   }
-  [3]=>
+  [4]=>
   array(3) {
     ["dst"]=>
     bool(true)
@@ -66,7 +75,7 @@ array(11) {
     ["timezone_id"]=>
     string(18) "America/Rio_Branco"
   }
-  [4]=>
+  [5]=>
   array(3) {
     ["dst"]=>
     bool(true)
@@ -75,7 +84,52 @@ array(11) {
     ["timezone_id"]=>
     string(11) "Brazil/Acre"
   }
-  [5]=>
+  [6]=>
+  array(3) {
+    ["dst"]=>
+    bool(false)
+    ["offset"]=>
+    int(32400)
+    ["timezone_id"]=>
+    string(21) "Australia/Broken_Hill"
+  }
+  [7]=>
+  array(3) {
+    ["dst"]=>
+    bool(false)
+    ["offset"]=>
+    int(32400)
+    ["timezone_id"]=>
+    string(16) "Australia/Darwin"
+  }
+  [8]=>
+  array(3) {
+    ["dst"]=>
+    bool(false)
+    ["offset"]=>
+    int(32400)
+    ["timezone_id"]=>
+    string(15) "Australia/North"
+  }
+  [9]=>
+  array(3) {
+    ["dst"]=>
+    bool(false)
+    ["offset"]=>
+    int(32400)
+    ["timezone_id"]=>
+    string(15) "Australia/South"
+  }
+  [10]=>
+  array(3) {
+    ["dst"]=>
+    bool(false)
+    ["offset"]=>
+    int(32400)
+    ["timezone_id"]=>
+    string(20) "Australia/Yancowinna"
+  }
+  [11]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -84,7 +138,7 @@ array(11) {
     ["timezone_id"]=>
     string(13) "Asia/Jayapura"
   }
-  [6]=>
+  [12]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -93,7 +147,7 @@ array(11) {
     ["timezone_id"]=>
     string(21) "Australia/Broken_Hill"
   }
-  [7]=>
+  [13]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -102,7 +156,7 @@ array(11) {
     ["timezone_id"]=>
     string(16) "Australia/Darwin"
   }
-  [8]=>
+  [14]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -111,7 +165,7 @@ array(11) {
     ["timezone_id"]=>
     string(15) "Australia/North"
   }
-  [9]=>
+  [15]=>
   array(3) {
     ["dst"]=>
     bool(false)
@@ -120,7 +174,7 @@ array(11) {
     ["timezone_id"]=>
     string(15) "Australia/South"
   }
-  [10]=>
+  [16]=>
   array(3) {
     ["dst"]=>
     bool(false)
index b591fe28f92a2a33cbd3c4a85aeea3248db76e38..492c623eb190c548cc2fe8fb48351dde25cc1d51 100644 (file)
@@ -24,11 +24,7 @@ var_dump( timezone_name_from_abbr("EDT") );
 echo "-- Lookup with name and offset--\n"; 
 var_dump( timezone_name_from_abbr("ADT", -10800) );
 var_dump( timezone_name_from_abbr("ADT", 14400) );
-var_dump( timezone_name_from_abbr("AKTT", 14400) );
-var_dump( timezone_name_from_abbr("aktt", 18000) );
-var_dump( timezone_name_from_abbr("Aktt", 21600) );
 var_dump( timezone_name_from_abbr("AMST", -10800) );
-var_dump( timezone_name_from_abbr("amst", 180000) );
 
 echo "-- Tests without valid name - uses gmtOffset and isdst to find match --\n"; 
 var_dump( timezone_name_from_abbr("", 3600, 1) );
@@ -52,11 +48,7 @@ string(16) "America/New_York"
 -- Lookup with name and offset--
 string(15) "America/Halifax"
 string(12) "Asia/Baghdad"
-string(11) "Asia/Aqtobe"
-string(11) "Asia/Aqtobe"
-string(11) "Asia/Aqtobe"
 string(17) "America/Boa_Vista"
-string(12) "Asia/Yerevan"
 -- Tests without valid name - uses gmtOffset and isdst to find match --
 string(13) "Europe/London"
 string(17) "America/Sao_Paulo"
@@ -65,4 +57,4 @@ string(15) "America/Halifax"
 -- Tests with invalid offsets --
 bool(false)
 bool(false)
-===DONE===
\ No newline at end of file
+===DONE===
index 1730a1a587f9158cca62c46a22dc871dc3a7f068..340700471d7abd8ea719bca57e9225d7f645895e 100644 (file)
@@ -14,7 +14,7 @@ object(ArrayObject)#1 (2) {
   [0]=>
   int(0)
   ["storage":"ArrayObject":private]=>
-  object(DateInterval)#2 (15) {
+  object(DateInterval)#2 (16) {
     ["y"]=>
     int(3)
     ["m"]=>
@@ -27,6 +27,8 @@ object(ArrayObject)#1 (2) {
     int(-1)
     ["s"]=>
     int(-1)
+    ["f"]=>
+    float(-1)
     ["weekday"]=>
     int(-1)
     ["weekday_behavior"]=>