Listing 8 mktime.c

/* mktime function */
#include <limits.h>
#include "xtime.h"

time_t (mktime)(struct tm *t)
       {       /* convert local time structure
                    to scalar time */
       double dsecs;
       int mon, year, ymon;
       time_t secs;

       ymon = t->tm_mon / 12;
       mon = t->tm_mon - ymon * 12;
       if (mon < 0)
              mon += 12, --ymon;
       if (ymon < 0 && t->tm_year < INT_MIN - ymon
              || 0 < ymon && INT_MAX - ymon < t->tm_year)
              return ((time_t)(-1));
       year = t->tm_year + ymon;
       dsecs = 86400.0 * (_Daysto(year, mon) - 1)
              + 31536000.0 * year + 86400.0 * t->tm_mday;
       dsecs += 3600.0 * t->tm hour + 60.0 * t->tm_min
              + (double)t->tm-sec;
       if (dsecs < 0.0 || (double)(time_t)(-1) <= dsecs)
              return ((time_t)(-1));
       secs = (time_t)dsecs - _TBIAS;
       _Ttotm(t, secs, t->tm_isdst);
       if (0 < t->tm_isdst)
              secs -= 3600;
       return (secs - _Tzoff());
       }
/* End of File */