From: hniksic Date: Tue, 5 Jul 2005 18:18:15 +0000 (-0700) Subject: [svn] Handle years after 2099. X-Git-Tag: v1.13~790 X-Git-Url: http://sjero.net/git/?p=wget;a=commitdiff_plain;h=cf67080e5eda4a4d190746e89a68bc2dc7e6ee4a [svn] Handle years after 2099. --- diff --git a/src/ChangeLog b/src/ChangeLog index 0148aa52..ab3a2d89 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2005-07-05 Hrvoje Niksic + + * cmpt.c (timegm): Handle years after 2099. + 2005-07-05 Hrvoje Niksic * cmpt.c (timegm): Remove unused variable. diff --git a/src/cmpt.c b/src/cmpt.c index 56ff5a14..63305398 100644 --- a/src/cmpt.c +++ b/src/cmpt.c @@ -1230,8 +1230,12 @@ fnmatch (const char *pattern, const char *string, int flags) returns the number of seconds since 1970-01-01, converted to time_t. */ -#define IS_LEAP(year) \ - ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) +#define IS_LEAP(year) \ + ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) + +/* Number of leap years in the range [y1, y2). */ +#define LEAPDAYS(y1, y2) \ + ((y2-1)/4 - (y1-1)/4) - ((y2-1)/100 - (y1-1)/100) + ((y2-1)/400 - (y1-1)/400) time_t timegm (struct tm *t) @@ -1240,20 +1244,20 @@ timegm (struct tm *t) { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }, { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 } }; + const int year = 1900 + t->tm_year; unsigned long secs; int days; - /* Only handles years between 1970 and 2099. */ - if (t->tm_year < 70 || t->tm_year > 129) + if (year < 1970) return (time_t) -1; - days = 365 * (t->tm_year - 70); - /* Take into account leap years between 1970 and t->tm_year-1; all - years divisible by four between 1968 and 2100 should be leap. */ - days += (t->tm_year - 1 - 68) / 4; + days = 365 * (year - 1970); + /* Take into account leap years between 1970 and YEAR, not counting + YEAR itself. */ + days += LEAPDAYS (1970, year); if (t->tm_mon < 0 || t->tm_mon >= 12) return (time_t) -1; - days += month_to_days[IS_LEAP (1900 + t->tm_year)][t->tm_mon]; + days += month_to_days[IS_LEAP (year)][t->tm_mon]; days += t->tm_mday - 1; secs = days * 86400 + t->tm_hour * 3600 + t->tm_min * 60 + t->tm_sec;