removed assumption that time_t is an unsigned type
authoreck <none@none>
Tue, 11 Sep 1990 10:18:51 +0000 (10:18 +0000)
committereck <none@none>
Tue, 11 Sep 1990 10:18:51 +0000 (10:18 +0000)
lang/cem/libcc.ansi/time/difftime.c
lang/cem/libcc.ansi/time/mktime.c

index bf22f74..ed6e64c 100644 (file)
@@ -8,8 +8,10 @@
 double
 difftime(time_t time1, time_t time0)
 {
-       /* be careful: time_t is unsigned */
-       if (time0 > time1)
+       /* be careful: time_t may be unsigned */
+       if ((time_t)-1 > 0 && time0 > time1) {
                return - (double) (time0 - time1);
-       else    return (double) (time1 - time0);
+       } else {
+               return (double)(time1 - time0);
+       }
 }
index 9ea4ec6..0aa05ee 100644 (file)
@@ -7,8 +7,9 @@
 #include       <limits.h>
 #include       "loc_incl.h"
 
-/* The code assumes that time_t is an unsigned long. When it is not, some
- * things may have to change.
+/* The code assumes that unsigned long can be converted to time_t.
+ * 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
 mktime(register struct tm *timep)
@@ -16,7 +17,7 @@ mktime(register struct tm *timep)
        register long day, year;
        register int tm_year;
        int yday, month;
-       register time_t seconds;
+       register unsigned long seconds;
        int overflow;
        unsigned dst;
 
@@ -63,7 +64,7 @@ mktime(register struct tm *timep)
        timep->tm_mday = day + 1;
        _tzset();                       /* set timezone and dst info  */
        year = EPOCH_YR;
-       if (timep->tm_year < year - YEAR0) return -1;
+       if (timep->tm_year < year - YEAR0) return (time_t)-1;
        seconds = 0;
        day = 0;                        /* means days since day 0 now */
        overflow = 0;
@@ -124,5 +125,6 @@ mktime(register struct tm *timep)
 
        if (overflow) return (time_t)-1;
 
-       return seconds;
+       if ((time_t)seconds != seconds) return (time_t)-1;
+       return (time_t)seconds;
 }