removed assumption that time_t is an unsigned type

This commit is contained in:
eck 1990-09-11 10:18:51 +00:00
parent f0581f7706
commit 0d8a8bae5f
2 changed files with 12 additions and 8 deletions

View file

@ -8,8 +8,10 @@
double double
difftime(time_t time1, time_t time0) difftime(time_t time1, time_t time0)
{ {
/* be careful: time_t is unsigned */ /* be careful: time_t may be unsigned */
if (time0 > time1) if ((time_t)-1 > 0 && time0 > time1) {
return - (double) (time0 - time1); return - (double) (time0 - time1);
else return (double) (time1 - time0); } else {
return (double)(time1 - time0);
}
} }

View file

@ -7,8 +7,9 @@
#include <limits.h> #include <limits.h>
#include "loc_incl.h" #include "loc_incl.h"
/* The code assumes that time_t is an unsigned long. When it is not, some /* The code assumes that unsigned long can be converted to time_t.
* things may have to change. * A time_t should not be wider than unsigned long, since this would mean
* that the check for overflow at the end could fail.
*/ */
time_t time_t
mktime(register struct tm *timep) mktime(register struct tm *timep)
@ -16,7 +17,7 @@ mktime(register struct tm *timep)
register long day, year; register long day, year;
register int tm_year; register int tm_year;
int yday, month; int yday, month;
register time_t seconds; register unsigned long seconds;
int overflow; int overflow;
unsigned dst; unsigned dst;
@ -63,7 +64,7 @@ mktime(register struct tm *timep)
timep->tm_mday = day + 1; timep->tm_mday = day + 1;
_tzset(); /* set timezone and dst info */ _tzset(); /* set timezone and dst info */
year = EPOCH_YR; year = EPOCH_YR;
if (timep->tm_year < year - YEAR0) return -1; if (timep->tm_year < year - YEAR0) return (time_t)-1;
seconds = 0; seconds = 0;
day = 0; /* means days since day 0 now */ day = 0; /* means days since day 0 now */
overflow = 0; overflow = 0;
@ -124,5 +125,6 @@ mktime(register struct tm *timep)
if (overflow) return (time_t)-1; if (overflow) return (time_t)-1;
return seconds; if ((time_t)seconds != seconds) return (time_t)-1;
return (time_t)seconds;
} }