So...can we apply our hard-earned knowledge of modular arithmetic to the task of getting difftime to do the right thing in the face of the various types that time_t is allowed to assume? A possibility would be to add to private.h... ------- private.h ------- *** /tmp/geta29733 Thu Oct 21 10:29:48 2004 --- /tmp/getb29733 Thu Oct 21 10:29:48 2004 *************** *** 21,27 **** #ifndef lint #ifndef NOID ! static char privatehid[] = "@(#)private.h 7.54"; #endif /* !defined NOID */ #endif /* !defined lint */ --- 21,27 ---- #ifndef lint #ifndef NOID ! static char privatehid[] = "@(#)private.h 7.55"; #endif /* !defined NOID */ #endif /* !defined lint */ *************** *** 238,243 **** --- 238,247 ---- #define TYPE_SIGNED(type) (((type) -1) < 0) #endif /* !defined TYPE_SIGNED */ + #ifndef TYPE_INTEGRAL + #define TYPE_INTEGRAL(type) (((type) 0.4) == 0) + #endif /* !defined TYPE_INTEGRAL */ + #ifndef INT_STRLEN_MAXIMUM /* ** 302 / 1000 is log10(2.0) rounded up. ...and then use the difftime.c that appears below. --ado /* ** This file is in the public domain, so clarified as of ** June 5, 1996 by Arthur David Olson (arthur_david_olson@nih.gov). */ #ifndef lint #ifndef NOID static char elsieid[] = "@(#)difftime.c 7.11"; #endif /* !defined NOID */ #endif /* !defined lint */ /*LINTLIBRARY*/ #include "sys/types.h" /* for time_t */ #include "private.h" /* for TYPE_INTEGRAL and TYPE_SIGNED */ double difftime(time1, time0) const time_t time1; const time_t time0; { if (!TYPE_INTEGRAL(time_t)) { /* ** time_t is floating. ** We can't apply % to floats. ** Do the math in whichever of time_t or double is wider. */ if (sizeof (time_t) >= sizeof (double)) return time1 - time0; else return (double) time1 - (double) time0; } else { /* ** time_t is integral. ** As elsewhere in the time zone package, ** use modular arithmetic to avoid overflow. */ register time_t lead; register time_t trail; lead = time1 / 2 - time0 / 2; trail = time1 % 2 - time0 % 2; return 2 * ((double) lead) + trail; } }