X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fgetdate.y;h=cc53fde59ddf8d35d42959320a1328550b63a848;hb=692c4b6ea764fd34a53142b53c53a2d54b33ae6a;hp=8f0872d7215d4b8050617d27836177c869961438;hpb=fd6a92931bd9aa252d353d585b10357fd73214ca;p=gnulib.git diff --git a/lib/getdate.y b/lib/getdate.y index 8f0872d72..cc53fde59 100644 --- a/lib/getdate.y +++ b/lib/getdate.y @@ -15,6 +15,10 @@ #ifdef HAVE_CONFIG_H #include + +#ifdef FORCE_ALLOCA_H +#include +#endif #endif /* Since the code of getdate.y is not included in the Emacs executable @@ -30,20 +34,11 @@ #include #include -/* The code at the top of get_date which figures out the offset of the - current time zone checks various CPP symbols to see if special - tricks are need, but defaults to using the gettimeofday system call. - Include if that will be used. */ - #if defined (vms) - #include #include - #else - #include - #ifdef TIME_WITH_SYS_TIME #include #include @@ -62,12 +57,12 @@ #if defined (HAVE_SYS_TIMEB_H) #include #else -/* -** We use the obsolete `struct timeb' as part of our interface! -** Since the system doesn't have it, we define it here; -** our callers must do likewise. -*/ -struct timeb { + +/* get_date uses the obsolete `struct timeb' in its interface! FIXME. + Since some systems don't have it, we define it here; + callers must do likewise. */ +struct timeb + { time_t time; /* Seconds since the epoch */ unsigned short millitm; /* Field not used */ short timezone; /* Minutes west of GMT */ @@ -99,6 +94,7 @@ static int yylex (); static int yyerror (); #define EPOCH 1970 +#define DOOMSDAY 2038 #define HOUR(x) ((time_t)(x) * 60) #define SECSPERDAY (24L * 60L * 60L) @@ -621,11 +617,13 @@ Convert (Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode) if (Year < 0) Year = -Year; - if (Year < 100) + if (Year < DOOMSDAY-2000) + Year += 2000; + else if (Year < 100) Year += 1900; DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) ? 29 : 28; - if (Year < EPOCH || Year > 1999 + if (Year < EPOCH || Year >= DOOMSDAY || Month < 1 || Month > 12 /* Lint fluff: "conversion from long may lose accuracy" */ || Day < 1 || Day > DaysInMonth[(int)--Month]) @@ -690,7 +688,7 @@ RelativeMonth (Start, RelMonth) if (RelMonth == 0) return 0; tm = localtime (&Start); - Month = 12 * tm->tm_year + tm->tm_mon + RelMonth; + Month = 12 * (1900 + tm->tm_year) + tm->tm_mon + RelMonth; Year = Month / 12; Month = Month % 12 + 1; return DSTcorrect (Start, @@ -753,7 +751,7 @@ LookupWord (buff) return tp->type; } - if (strcmp (buff, "dst") == 0) + if (strcmp (buff, "dst") == 0) return tDST; for (tp = UnitsTable; tp->name; tp++) @@ -904,7 +902,7 @@ get_date (p, now) if (! (tm = localtime (&ftz.time))) return -1; - + ftz.timezone = difftm (&gmt, tm) / 60; if (tm->tm_isdst) ftz.timezone += 60;