From e7de7ff9e2f0b9638b9a71096f8b4c2f3624e3a9 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Wed, 29 Jun 2005 19:07:06 +0000 Subject: [PATCH] - Added support for negative timestamps with the @ format. (Patch by Nuno Lopes) --- ext/date/lib/parse_date.c | 214 +++++++++--------- ext/date/lib/parse_date.re | 6 +- ext/date/lib/resource/parse_date.re | 6 +- ext/date/tests/format-negative-timestamp.phpt | 23 ++ 4 files changed, 137 insertions(+), 112 deletions(-) create mode 100644 ext/date/tests/format-negative-timestamp.phpt diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c index ceb0d07d36..f5c4ca34e7 100644 --- a/ext/date/lib/parse_date.c +++ b/ext/date/lib/parse_date.c @@ -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 +#include "timelib.h" #include @@ -33,8 +33,6 @@ #include #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 "" +#line 812 "" { 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 "" +#line 890 "" 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 "" -yy1141: - YYDEBUG(1141, *YYCURSOR); - yych = *++YYCURSOR; - if(yych == 'd') goto yy1142; - if(yych == 'm') goto yy1143; - goto yy49; +#line 10767 "" 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 "" -yy1150: - YYDEBUG(1150, *YYCURSOR); - yych = *++YYCURSOR; - if(yych != 'y') goto yy49; - goto yy1151; +#line 10808 "" 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 "" -yy1153: - YYDEBUG(1153, *YYCURSOR); +#line 10828 "" +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 "" -yy1156: - YYDEBUG(1156, *YYCURSOR); - yych = *++YYCURSOR; - if(yych != 's') goto yy49; - goto yy1157; +#line 10853 "" 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 "" +#line 10893 "" } } -#line 1377 "parse_date.re" +#line 1375 "parse_date.re" } diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re index 7d033381e1..01488405da 100644 --- a/ext/date/lib/parse_date.re +++ b/ext/date/lib/parse_date.re @@ -18,7 +18,7 @@ /* $Id$ */ -#include +#include "timelib.h" #include @@ -31,8 +31,6 @@ #include #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/lib/resource/parse_date.re b/ext/date/lib/resource/parse_date.re index 7d033381e1..01488405da 100644 --- a/ext/date/lib/resource/parse_date.re +++ b/ext/date/lib/resource/parse_date.re @@ -18,7 +18,7 @@ /* $Id$ */ -#include +#include "timelib.h" #include @@ -31,8 +31,6 @@ #include #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 index 0000000000..e85fce10ad --- /dev/null +++ b/ext/date/tests/format-negative-timestamp.phpt @@ -0,0 +1,23 @@ +--TEST-- +strtotime() - Format: @timestamps +--FILE-- + $max_2) + $new_tm *= -1; + + if (strtotime("@$new_tm") != $new_tm) { + echo "Error when parsing: @$new_tm\n"; + } +} + +echo "done!"; +?> +--EXPECT-- +done! -- 2.40.0