* zdump.c (delta_nonneg): Speed up code by using division rather than repeated addition. Based on a suggestion from Arthur David Olson; this version avoids int overflow. --- zdump.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/zdump.c b/zdump.c index 464a334..b006229 100644 --- a/zdump.c +++ b/zdump.c @@ -693,11 +693,11 @@ hunt(timezone_t tz, char *name, time_t lot, time_t hit) static intmax_t delta_nonneg(struct tm *newp, struct tm *oldp) { - register intmax_t result; - register int tmy; - - result = 0; - for (tmy = oldp->tm_year; tmy < newp->tm_year; ++tmy) + intmax_t oldy = oldp->tm_year; + int cycles = (newp->tm_year - oldy) / YEARSPERREPEAT; + intmax_t sec = SECSPERREPEAT, result = cycles * sec; + int tmy = oldp->tm_year + cycles * YEARSPERREPEAT; + for ( ; tmy < newp->tm_year; ++tmy) result += DAYSPERNYEAR + isleap_sum(tmy, TM_YEAR_BASE); result += newp->tm_yday - oldp->tm_yday; result *= HOURSPERDAY; -- 2.27.0