]> granicus.if.org Git - php/commitdiff
- Added support for negative timestamps with the @<number> format. (Patch by
authorDerick Rethans <derick@php.net>
Wed, 29 Jun 2005 19:07:06 +0000 (19:07 +0000)
committerDerick Rethans <derick@php.net>
Wed, 29 Jun 2005 19:07:06 +0000 (19:07 +0000)
  Nuno Lopes)

ext/date/lib/parse_date.c
ext/date/lib/parse_date.re
ext/date/lib/resource/parse_date.re
ext/date/tests/format-negative-timestamp.phpt [new file with mode: 0644]

index ceb0d07d3617320d888bc7d44fcc55036619e73e..f5c4ca34e7ee2e7cb39a798b95f2e631f6b28916 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.9.8.dev on Tue Jun 28 20:03:29 2005 */
+/* Generated by re2c 0.9.8.dev on Wed Jun 29 20:46:25 2005 */
 #line 1 "parse_date.re"
 /*
    +----------------------------------------------------------------------+
@@ -20,7 +20,7 @@
 
 /* $Id$ */
 
-#include <timelib_config.h>
+#include "timelib.h"
 
 #include <stdio.h>
 
@@ -33,8 +33,6 @@
 #include <strings.h>
 #endif
 
-#include "timelib.h"
-
 #if defined(_MSC_VER)
 # define strcasecmp stricmp
 # define strtoll(s, f, b) _atoi64(s)
@@ -771,7 +769,7 @@ static int scan(Scanner *s)
 std:
        s->tok = cursor;
        s->len = 0;
-#line 875 "parse_date.re"
+#line 873 "parse_date.re"
 
 
 {
@@ -810,7 +808,7 @@ std:
          0,   0,   0,   0,   0,   0,   0,   0, 
        };
 
-#line 814 "<stdout>"
+#line 812 "<stdout>"
 {
        YYCTYPE yych;
        unsigned int yyaccept;
@@ -883,19 +881,19 @@ yy0:
 yy2:
        YYDEBUG(2, *YYCURSOR);
        ++YYCURSOR;
-       if((yych = *YYCURSOR) == 'e')   goto yy1156;
+       if((yych = *YYCURSOR) == 'e')   goto yy1157;
        goto yy49;
 yy3:
        YYDEBUG(3, *YYCURSOR);
 
-#line 1313 "parse_date.re"
+#line 1311 "parse_date.re"
 {
                TIMELIB_INIT;
                s->time->z = timelib_get_zone((char **) &ptr, &s->time->dst, s->time);
                TIMELIB_DEINIT;
                return TIMELIB_TIMEZONE;
        }
-#line 892 "<stdout>"
+#line 890 "<stdout>"
 yy4:
        YYDEBUG(4, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -914,7 +912,7 @@ yy4:
                        goto yy49;
                } else {
                        if(yych <= 'i') goto yy473;
-                       if(yych == 'o') goto yy1153;
+                       if(yych == 'o') goto yy1154;
                        goto yy49;
                }
        }
@@ -943,7 +941,7 @@ yy5:
                        } else {
                                if(yych <= 'h') goto yy344;
                                if(yych <= 'n') goto yy49;
-                               goto yy1141;
+                               goto yy1142;
                        }
                } else {
                        if(yych <= 'u'){
@@ -957,14 +955,16 @@ yy5:
        }
 yy6:
        YYDEBUG(6, *YYCURSOR);
-       ++YYCURSOR;
-       if((yych = *YYCURSOR) <= '0')   goto yy7;
-       if(yych <= '9') goto yy1138;
+       yyaccept = 0;
+       yych = *(YYMARKER = ++YYCURSOR);
+       if(yych == '-') goto yy1138;
+       if(yych <= '0') goto yy7;
+       if(yych <= '9') goto yy1139;
        goto yy7;
 yy7:
        YYDEBUG(7, *YYCURSOR);
 
-#line 1373 "parse_date.re"
+#line 1371 "parse_date.re"
 {
 /*             printf("unexpected character: #%d, %c\n", *s->tok, *s->tok); */
                goto std;
@@ -1704,7 +1704,7 @@ yy43:
 yy44:
        YYDEBUG(44, *YYCURSOR);
 
-#line 1362 "parse_date.re"
+#line 1360 "parse_date.re"
 {
                goto std;
        }
@@ -1716,7 +1716,7 @@ yy45:
 yy46:
        YYDEBUG(46, *YYCURSOR);
 
-#line 1367 "parse_date.re"
+#line 1365 "parse_date.re"
 {
                s->pos = cursor; s->line++;
                goto std;
@@ -2074,7 +2074,7 @@ yy80:
 yy81:
        YYDEBUG(81, *YYCURSOR);
 
-#line 1346 "parse_date.re"
+#line 1344 "parse_date.re"
 {
                timelib_ull i;
 
@@ -2712,7 +2712,7 @@ yy147:
 yy148:
        YYDEBUG(148, *YYCURSOR);
 
-#line 1308 "parse_date.re"
+#line 1306 "parse_date.re"
 {
                goto std;
        }
@@ -2758,7 +2758,7 @@ yy154:
 yy155:
        YYDEBUG(155, *YYCURSOR);
 
-#line 1292 "parse_date.re"
+#line 1290 "parse_date.re"
 {
                const timelib_relunit* relunit;
 
@@ -3157,7 +3157,7 @@ yy187:
 yy188:
        YYDEBUG(188, *YYCURSOR);
 
-#line 1276 "parse_date.re"
+#line 1274 "parse_date.re"
 {
                timelib_sll i;
 
@@ -5345,7 +5345,7 @@ yy390:
 yy391:
        YYDEBUG(391, *YYCURSOR);
 
-#line 1106 "parse_date.re"
+#line 1104 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -5407,7 +5407,7 @@ yy396:
 yy397:
        YYDEBUG(397, *YYCURSOR);
 
-#line 1130 "parse_date.re"
+#line 1128 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -5507,7 +5507,7 @@ yy408:
 yy409:
        YYDEBUG(409, *YYCURSOR);
 
-#line 1321 "parse_date.re"
+#line 1319 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -5857,7 +5857,7 @@ yy449:
 yy450:
        YYDEBUG(450, *YYCURSOR);
 
-#line 1222 "parse_date.re"
+#line 1220 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -7315,7 +7315,7 @@ yy557:
 yy558:
        YYDEBUG(558, *YYCURSOR);
 
-#line 1262 "parse_date.re"
+#line 1260 "parse_date.re"
 {
                TIMELIB_INIT;
                s->time->relative.y = 0 - s->time->relative.y;
@@ -8973,7 +8973,7 @@ yy667:
 yy668:
        YYDEBUG(668, *YYCURSOR);
 
-#line 962 "parse_date.re"
+#line 960 "parse_date.re"
 {
                DEBUG_OUTPUT("timeshort24 | timelong24 | iso8601long");
                TIMELIB_INIT;
@@ -9121,7 +9121,7 @@ yy682:
 yy683:
        YYDEBUG(683, *YYCURSOR);
 
-#line 947 "parse_date.re"
+#line 945 "parse_date.re"
 {
                DEBUG_OUTPUT("timeshort12 | timelong12");
                TIMELIB_INIT;
@@ -9245,7 +9245,7 @@ yy695:
 yy696:
        YYDEBUG(696, *YYCURSOR);
 
-#line 1082 "parse_date.re"
+#line 1080 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -9623,7 +9623,7 @@ yy754:
 yy755:
        YYDEBUG(755, *YYCURSOR);
 
-#line 1094 "parse_date.re"
+#line 1092 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -10006,7 +10006,7 @@ yy799:
 yy800:
        YYDEBUG(800, *YYCURSOR);
 
-#line 1070 "parse_date.re"
+#line 1068 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -10039,7 +10039,7 @@ yy803:
 yy804:
        YYDEBUG(804, *YYCURSOR);
 
-#line 1045 "parse_date.re"
+#line 1043 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -10274,7 +10274,7 @@ yy836:
 yy837:
        YYDEBUG(837, *YYCURSOR);
 
-#line 1246 "parse_date.re"
+#line 1244 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_TIME();
@@ -10601,7 +10601,7 @@ yy876:
 yy877:
        YYDEBUG(877, *YYCURSOR);
 
-#line 1234 "parse_date.re"
+#line 1232 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -10858,7 +10858,7 @@ yy896:
 yy897:
        YYDEBUG(897, *YYCURSOR);
 
-#line 1118 "parse_date.re"
+#line 1116 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -11023,7 +11023,7 @@ yy916:
 yy917:
        YYDEBUG(917, *YYCURSOR);
 
-#line 1203 "parse_date.re"
+#line 1201 "parse_date.re"
 {
                timelib_sll w, d;
 
@@ -11049,7 +11049,7 @@ yy918:
 yy919:
        YYDEBUG(919, *YYCURSOR);
 
-#line 1184 "parse_date.re"
+#line 1182 "parse_date.re"
 {
                timelib_sll w, d;
 
@@ -11100,7 +11100,7 @@ yy922:
 yy923:
        YYDEBUG(923, *YYCURSOR);
 
-#line 1172 "parse_date.re"
+#line 1170 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -11187,7 +11187,7 @@ yy929:
 yy930:
        YYDEBUG(930, *YYCURSOR);
 
-#line 1142 "parse_date.re"
+#line 1140 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -11265,7 +11265,7 @@ yy940:
 yy941:
        YYDEBUG(941, *YYCURSOR);
 
-#line 1153 "parse_date.re"
+#line 1151 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_TIME();
@@ -11964,7 +11964,7 @@ yy1034:
 yy1035:
        YYDEBUG(1035, *YYCURSOR);
 
-#line 1059 "parse_date.re"
+#line 1057 "parse_date.re"
 {
                TIMELIB_INIT;
                TIMELIB_HAVE_DATE();
@@ -12757,7 +12757,7 @@ yy1115:
 yy1116:
        YYDEBUG(1116, *YYCURSOR);
 
-#line 984 "parse_date.re"
+#line 982 "parse_date.re"
 {
                DEBUG_OUTPUT("gnunocolon");
                TIMELIB_INIT;
@@ -12851,7 +12851,7 @@ yy1123:
 yy1124:
        YYDEBUG(1124, *YYCURSOR);
 
-#line 1029 "parse_date.re"
+#line 1027 "parse_date.re"
 {
                DEBUG_OUTPUT("iso8601nocolon");
                TIMELIB_INIT;
@@ -13032,19 +13032,25 @@ yy1137:
        }
 yy1138:
        YYDEBUG(1138, *YYCURSOR);
-       ++YYCURSOR;
-       if(YYLIMIT == YYCURSOR) YYFILL(1);
-       yych = *YYCURSOR;
+       yych = *++YYCURSOR;
+       if(yych <= '0') goto yy53;
+       if(yych >= ':') goto yy53;
        goto yy1139;
 yy1139:
        YYDEBUG(1139, *YYCURSOR);
-       if(yych <= '/') goto yy1140;
-       if(yych <= '9') goto yy1138;
+       ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
        goto yy1140;
 yy1140:
        YYDEBUG(1140, *YYCURSOR);
+       if(yych <= '/') goto yy1141;
+       if(yych <= '9') goto yy1139;
+       goto yy1141;
+yy1141:
+       YYDEBUG(1141, *YYCURSOR);
 
-#line 923 "parse_date.re"
+#line 921 "parse_date.re"
 {
                timelib_ull i;
 
@@ -13067,27 +13073,22 @@ yy1140:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 10763 "<stdout>"
-yy1141:
-       YYDEBUG(1141, *YYCURSOR);
-       yych = *++YYCURSOR;
-       if(yych == 'd') goto yy1142;
-       if(yych == 'm') goto yy1143;
-       goto yy49;
+#line 10767 "<stdout>"
 yy1142:
        YYDEBUG(1142, *YYCURSOR);
        yych = *++YYCURSOR;
-       if(yych == 'a') goto yy1150;
+       if(yych == 'd') goto yy1143;
+       if(yych == 'm') goto yy1144;
        goto yy49;
 yy1143:
        YYDEBUG(1143, *YYCURSOR);
        yych = *++YYCURSOR;
-       if(yych != 'o') goto yy49;
-       goto yy1144;
+       if(yych == 'a') goto yy1151;
+       goto yy49;
 yy1144:
        YYDEBUG(1144, *YYCURSOR);
        yych = *++YYCURSOR;
-       if(yych != 'r') goto yy49;
+       if(yych != 'o') goto yy49;
        goto yy1145;
 yy1145:
        YYDEBUG(1145, *YYCURSOR);
@@ -13097,25 +13098,30 @@ yy1145:
 yy1146:
        YYDEBUG(1146, *YYCURSOR);
        yych = *++YYCURSOR;
-       if(yych != 'o') goto yy49;
+       if(yych != 'r') goto yy49;
        goto yy1147;
 yy1147:
        YYDEBUG(1147, *YYCURSOR);
        yych = *++YYCURSOR;
-       if(yych != 'w') goto yy49;
+       if(yych != 'o') goto yy49;
        goto yy1148;
 yy1148:
        YYDEBUG(1148, *YYCURSOR);
+       yych = *++YYCURSOR;
+       if(yych != 'w') goto yy49;
+       goto yy1149;
+yy1149:
+       YYDEBUG(1149, *YYCURSOR);
        ++YYCURSOR;
        if(yybm[0+(yych = *YYCURSOR)] & 4) {
                yych = *YYCURSOR;
                goto yy48;
        }
-       goto yy1149;
-yy1149:
-       YYDEBUG(1149, *YYCURSOR);
+       goto yy1150;
+yy1150:
+       YYDEBUG(1150, *YYCURSOR);
 
-#line 911 "parse_date.re"
+#line 909 "parse_date.re"
 {
                DEBUG_OUTPUT("tomorrow");
                TIMELIB_INIT;
@@ -13126,24 +13132,24 @@ yy1149:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 10804 "<stdout>"
-yy1150:
-       YYDEBUG(1150, *YYCURSOR);
-       yych = *++YYCURSOR;
-       if(yych != 'y') goto yy49;
-       goto yy1151;
+#line 10808 "<stdout>"
 yy1151:
        YYDEBUG(1151, *YYCURSOR);
+       yych = *++YYCURSOR;
+       if(yych != 'y') goto yy49;
+       goto yy1152;
+yy1152:
+       YYDEBUG(1152, *YYCURSOR);
        ++YYCURSOR;
        if(yybm[0+(yych = *YYCURSOR)] & 4) {
                yych = *YYCURSOR;
                goto yy48;
        }
-       goto yy1152;
-yy1152:
-       YYDEBUG(1152, *YYCURSOR);
+       goto yy1153;
+yy1153:
+       YYDEBUG(1153, *YYCURSOR);
 
-#line 901 "parse_date.re"
+#line 899 "parse_date.re"
 {
                DEBUG_OUTPUT("today");
                TIMELIB_INIT;
@@ -13152,9 +13158,9 @@ yy1152:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 10824 "<stdout>"
-yy1153:
-       YYDEBUG(1153, *YYCURSOR);
+#line 10828 "<stdout>"
+yy1154:
+       YYDEBUG(1154, *YYCURSOR);
        yych = *++YYCURSOR;
        if(yych <= 'u'){
                if(yych == 'V') goto yy480;
@@ -13162,20 +13168,20 @@ yy1153:
        } else {
                if(yych <= 'v') goto yy480;
                if(yych >= 'x') goto yy49;
-               goto yy1154;
+               goto yy1155;
        }
-yy1154:
-       YYDEBUG(1154, *YYCURSOR);
+yy1155:
+       YYDEBUG(1155, *YYCURSOR);
        ++YYCURSOR;
        if(yybm[0+(yych = *YYCURSOR)] & 4) {
                yych = *YYCURSOR;
                goto yy48;
        }
-       goto yy1155;
-yy1155:
-       YYDEBUG(1155, *YYCURSOR);
+       goto yy1156;
+yy1156:
+       YYDEBUG(1156, *YYCURSOR);
 
-#line 892 "parse_date.re"
+#line 890 "parse_date.re"
 {
                DEBUG_OUTPUT("now");
                TIMELIB_INIT;
@@ -13183,54 +13189,54 @@ yy1155:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 10849 "<stdout>"
-yy1156:
-       YYDEBUG(1156, *YYCURSOR);
-       yych = *++YYCURSOR;
-       if(yych != 's') goto yy49;
-       goto yy1157;
+#line 10853 "<stdout>"
 yy1157:
        YYDEBUG(1157, *YYCURSOR);
        yych = *++YYCURSOR;
-       if(yych != 't') goto yy49;
+       if(yych != 's') goto yy49;
        goto yy1158;
 yy1158:
        YYDEBUG(1158, *YYCURSOR);
        yych = *++YYCURSOR;
-       if(yych != 'e') goto yy49;
+       if(yych != 't') goto yy49;
        goto yy1159;
 yy1159:
        YYDEBUG(1159, *YYCURSOR);
        yych = *++YYCURSOR;
-       if(yych != 'r') goto yy49;
+       if(yych != 'e') goto yy49;
        goto yy1160;
 yy1160:
        YYDEBUG(1160, *YYCURSOR);
        yych = *++YYCURSOR;
-       if(yych != 'd') goto yy49;
+       if(yych != 'r') goto yy49;
        goto yy1161;
 yy1161:
        YYDEBUG(1161, *YYCURSOR);
        yych = *++YYCURSOR;
-       if(yych != 'a') goto yy49;
+       if(yych != 'd') goto yy49;
        goto yy1162;
 yy1162:
        YYDEBUG(1162, *YYCURSOR);
        yych = *++YYCURSOR;
-       if(yych != 'y') goto yy49;
+       if(yych != 'a') goto yy49;
        goto yy1163;
 yy1163:
        YYDEBUG(1163, *YYCURSOR);
+       yych = *++YYCURSOR;
+       if(yych != 'y') goto yy49;
+       goto yy1164;
+yy1164:
+       YYDEBUG(1164, *YYCURSOR);
        ++YYCURSOR;
        if(yybm[0+(yych = *YYCURSOR)] & 4) {
                yych = *YYCURSOR;
                goto yy48;
        }
-       goto yy1164;
-yy1164:
-       YYDEBUG(1164, *YYCURSOR);
+       goto yy1165;
+yy1165:
+       YYDEBUG(1165, *YYCURSOR);
 
-#line 880 "parse_date.re"
+#line 878 "parse_date.re"
 {
                DEBUG_OUTPUT("yesterday");
                TIMELIB_INIT;
@@ -13241,10 +13247,10 @@ yy1164:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 10889 "<stdout>"
+#line 10893 "<stdout>"
 }
 }
-#line 1377 "parse_date.re"
+#line 1375 "parse_date.re"
 
 }
 
index 7d033381e1ca810c9d3e6e72e32c1afef311c478..01488405da4eb757d9cae354995c7b37d8720789 100644 (file)
@@ -18,7 +18,7 @@
 
 /* $Id$ */
 
-#include <timelib_config.h>
+#include "timelib.h"
 
 #include <stdio.h>
 
@@ -31,8 +31,6 @@
 #include <strings.h>
 #endif
 
-#include "timelib.h"
-
 #if defined(_MSC_VER)
 # define strcasecmp stricmp
 # define strtoll(s, f, b) _atoi64(s)
@@ -855,7 +853,7 @@ isoweek          = year4 "W" weekofyear;
 clf              = day "/" monthabbr "/" year4 ":" hour24lz ":" minutelz ":" secondlz space tzcorrection;
 
 /* Timestamp format: @1126396800 */
-timestamp        = "@" [1-9] [0-9]*;
+timestamp        = "@" "-"? [1-9] [0-9]*;
 
 /* To fix some ambiguities */
 dateshortwithtimeshort  = datenoyear timeshort24;
index 7d033381e1ca810c9d3e6e72e32c1afef311c478..01488405da4eb757d9cae354995c7b37d8720789 100644 (file)
@@ -18,7 +18,7 @@
 
 /* $Id$ */
 
-#include <timelib_config.h>
+#include "timelib.h"
 
 #include <stdio.h>
 
@@ -31,8 +31,6 @@
 #include <strings.h>
 #endif
 
-#include "timelib.h"
-
 #if defined(_MSC_VER)
 # define strcasecmp stricmp
 # define strtoll(s, f, b) _atoi64(s)
@@ -855,7 +853,7 @@ isoweek          = year4 "W" weekofyear;
 clf              = day "/" monthabbr "/" year4 ":" hour24lz ":" minutelz ":" secondlz space tzcorrection;
 
 /* Timestamp format: @1126396800 */
-timestamp        = "@" [1-9] [0-9]*;
+timestamp        = "@" "-"? [1-9] [0-9]*;
 
 /* To fix some ambiguities */
 dateshortwithtimeshort  = datenoyear timeshort24;
diff --git a/ext/date/tests/format-negative-timestamp.phpt b/ext/date/tests/format-negative-timestamp.phpt
new file mode 100644 (file)
index 0000000..e85fce1
--- /dev/null
@@ -0,0 +1,23 @@
+--TEST--
+strtotime() - Format: @timestamps
+--FILE--
+<?php
+
+$i = 5;
+$max = getrandmax();
+$max_2 = $max / 2;
+
+while($i--) {
+       $new_tm = rand(1, $max);
+       if ($new_tm > $max_2)
+               $new_tm *= -1;
+
+       if (strtotime("@$new_tm") != $new_tm) {
+               echo "Error when parsing: @$new_tm\n";
+       }
+}
+
+echo "done!";
+?>
+--EXPECT--
+done!