X-Git-Url: https://git.distorted.org.uk/~mdw/cfd/blobdiff_plain/574495fc3431b8f18f488fbd7ba17403e64a2389..282625e1b87743236f1cb8c70c2762edd413c6b0:/getdate.y diff --git a/getdate.y b/getdate.y index a11c0ac..1a7c788 100644 --- a/getdate.y +++ b/getdate.y @@ -14,6 +14,7 @@ #include #include +#include #define ISSPACE(c) (isspace ((unsigned char)c)) #define ISALPHA(c) (isalpha ((unsigned char)c)) @@ -91,7 +92,8 @@ static int yylex (); static int yyerror (); #define EPOCH 1970 -#define HOUR(x) ((x) * 60) +#define HOUR(x) ((time_t)(x) * 60) +#define SECSPERDAY (24L * 60L * 60L) #define MAX_BUFF_LEN 128 /* size of buffer to read the date into */ @@ -319,7 +321,7 @@ relunit : tUNUMBER tYEAR_UNIT { yyRelYear += $1 * $2; } | tYEAR_UNIT { - yyRelYear++; + yyRelYear += $1; } | tUNUMBER tMONTH_UNIT { yyRelMonth += $1 * $2; @@ -328,7 +330,7 @@ relunit : tUNUMBER tYEAR_UNIT { yyRelMonth += $1 * $2; } | tMONTH_UNIT { - yyRelMonth++; + yyRelMonth += $1; } | tUNUMBER tDAY_UNIT { yyRelDay += $1 * $2; @@ -337,7 +339,7 @@ relunit : tUNUMBER tYEAR_UNIT { yyRelDay += $1 * $2; } | tDAY_UNIT { - yyRelDay++; + yyRelDay += $1; } | tUNUMBER tHOUR_UNIT { yyRelHour += $1 * $2; @@ -346,7 +348,7 @@ relunit : tUNUMBER tYEAR_UNIT { yyRelHour += $1 * $2; } | tHOUR_UNIT { - yyRelHour++; + yyRelHour += $1; } | tUNUMBER tMINUTE_UNIT { yyRelMinutes += $1 * $2; @@ -355,7 +357,7 @@ relunit : tUNUMBER tYEAR_UNIT { yyRelMinutes += $1 * $2; } | tMINUTE_UNIT { - yyRelMinutes++; + yyRelMinutes += $1; } | tUNUMBER tSEC_UNIT { yyRelSeconds += $1 * $2; @@ -364,12 +366,12 @@ relunit : tUNUMBER tYEAR_UNIT { yyRelSeconds += $1 * $2; } | tSEC_UNIT { - yyRelSeconds++; + yyRelSeconds += $1; } ; number : tUNUMBER - { + { if (yyHaveTime && yyHaveDate && !yyHaveRel) yyYear = $1; else @@ -391,8 +393,8 @@ number : tUNUMBER } else { - yyHour = $1 / 100; - yyMinutes = $1 % 100; + yyHour = $1 / 100; + yyMinutes = $1 % 100; } yySeconds = 0; yyMeridian = MER24; @@ -465,7 +467,7 @@ static TABLE const OtherTable[] = { { "now", tMINUTE_UNIT, 0 }, { "last", tUNUMBER, -1 }, { "this", tMINUTE_UNIT, 0 }, - { "next", tUNUMBER, 2 }, + { "next", tUNUMBER, 1 /* Was bogusly 2 [mdw] */ }, { "first", tUNUMBER, 1 }, /* { "second", tUNUMBER, 2 }, */ { "third", tUNUMBER, 3 }, @@ -835,6 +837,8 @@ yylex () #define TM_YEAR_ORIGIN 1900 +#ifndef GETDATE_IGNORE_TIMEZONE + /* Yield A - B, measured in seconds. */ static long difftm (a, b) @@ -857,6 +861,8 @@ difftm (a, b) + (a->tm_sec - b->tm_sec)); } +#endif + time_t get_date (p, now) const char *p; @@ -918,14 +924,15 @@ get_date (p, now) { /* Guard against falsely reporting errors near the time_t boundaries - when parsing times in other time zones. For example, if the min - time_t value is 1970-01-01 00:00:00 UTC and we are 8 hours ahead - of UTC, then the min localtime value is 1970-01-01 08:00:00; if - we apply mktime to 1970-01-01 00:00:00 we will get an error, so - we apply mktime to 1970-01-02 08:00:00 instead and adjust the time - zone by 24 hours to compensate. This algorithm assumes that - there is no DST transition within a day of the time_t boundaries. */ - + when parsing times in other time zones. For example, if the min + time_t value is 1970-01-01 00:00:00 UTC and we are 8 hours ahead + of UTC, then the min localtime value is 1970-01-01 08:00:00; if + we apply mktime to 1970-01-01 00:00:00 we will get an error, so + we apply mktime to 1970-01-02 08:00:00 instead and adjust the time + zone by 24 hours to compensate. This algorithm assumes that + there is no DST transition within a day of the time_t boundaries. */ + +#ifndef GETDATE_IGNORE_TIMEZONE if (yyHaveZone) { tm = tm0; @@ -941,6 +948,7 @@ get_date (p, now) } Start = mktime (&tm); } +#endif if (Start == (time_t) -1) return Start; @@ -955,6 +963,7 @@ get_date (p, now) return Start; } +#ifndef GETDATE_IGNORE_TIMEZONE if (yyHaveZone) { long delta = yyTimezone * 60L + difftm (&tm, gmtime (&Start)); @@ -962,6 +971,7 @@ get_date (p, now) return -1; /* time_t overflow */ Start += delta; } +#endif return Start; }