From 04901ea995935c73d4b0ced17f396594c5df1580 Mon Sep 17 00:00:00 2001 From: Arthur David Olson Date: Tue, 5 Oct 2004 10:17:24 -0400 Subject: [PATCH] SCCS-file: zdump.c SCCS-SID: 7.41 --- zdump.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/zdump.c b/zdump.c index 0be1255..34f153d 100644 --- a/zdump.c +++ b/zdump.c @@ -60,10 +60,35 @@ static char elsieid[] = "%W%"; #define DAYSPERNYEAR 365 #endif /* !defined DAYSPERNYEAR */ +#ifndef C99IPMOD +/* +** Given an integral argument (a) and a positive integral argument (b), +** return a % b per C99. +*/ + +#define C99IPMOD(a, b) ((-1 % 2 < 0 || (a) >= 0) ? \ + ((a) % (b)) : ((a) % (b) - (b))) +#endif /* !defined C99IPMOD */ + #ifndef isleap -#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0) +#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) #endif /* !defined isleap */ +#ifndef isleap_sum +/* +** Since everything in isleap is modulo 400 (or a factor of 400), we know that +** isleap(y) == isleap(y % 400) +** and so +** isleap(a + b) == isleap((a + b) % 400) +** or +** isleap(a + b) == isleap(a % 400 + b % 400) +** (at least under the C99 definition of %). +** We use this to avoid addition overflow problems. +*/ + +#define isleap_sum(a, b) isleap(C99IPMOD((a), 400) + C99IPMOD((b), 400)) +#endif /* !defined isleap_sum */ + #if HAVE_GETTEXT #include "locale.h" /* for setlocale */ #include "libintl.h" @@ -321,7 +346,7 @@ struct tm * oldp; return -delta(oldp, newp); result = 0; for (tmy = oldp->tm_year; tmy < newp->tm_year; ++tmy) - result += DAYSPERNYEAR + isleap(tmy + (long) TM_YEAR_BASE); + result += DAYSPERNYEAR + isleap_sum(tmy, TM_YEAR_BASE); result += newp->tm_yday - oldp->tm_yday; result *= HOURSPERDAY; result += newp->tm_hour - oldp->tm_hour; @@ -398,9 +423,9 @@ register const struct tm * timeptr; (int) (sizeof mon_name / sizeof mon_name[0])) mn = "???"; else mn = mon_name[timeptr->tm_mon]; - (void) printf("%.3s %.3s%3d %.2d:%.2d:%.2d %ld", + (void) printf("%.3s %.3s%3d %.2d:%.2d:%.2d %.0lf", wn, mn, timeptr->tm_mday, timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec, - timeptr->tm_year + (long) TM_YEAR_BASE); + (double) timeptr->tm_year + (double) TM_YEAR_BASE); }