home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_11_02 / 1102014a < prev    next >
Text File  |  1992-12-09  |  2KB  |  73 lines

  1. /* _Ttotm and _Daysto functions */
  2. #include "xtime.h"
  3.  
  4.         /* macros */
  5. #define MONTAB(year)    \
  6.     ((year) & 03 || (year) == 0 ? mos : lmos)
  7.  
  8.         /* static data */
  9. static const short lmos[] = {0, 31, 60, 91, 121, 152,
  10.      182, 213, 244, 274, 305, 335};
  11. static const short mos[] = {0, 31, 59, 90, 120, 151,
  12.      181, 212, 243, 273, 304, 334};
  13.  
  14. int _Daysto(int year, int mon)
  15.     {    /* compute extra days to start of month */
  16.     int days;
  17.  
  18.     if (0 < year)    /* correct for leap year:
  19.             1801-2099 */
  20.         days = (year - 1) / 4;
  21.     else if (year <= -4)
  22.         days = 1 + (4 - year) / 4;
  23.     else
  24.         days = 0;
  25.     return (days + MONTAB(year)[mon]);
  26.     }
  27.  
  28. struct tm *_Ttotm(struct tm *t, time_t secsarg, int isdst)
  29.     {    /* convert scalar time to time structure */
  30.     int year;
  31.     long days;
  32.     time_t secs;
  33.     static struct tm ts;
  34.  
  35.     secsarg += _TBIAS;
  36.     if (t == NULL)
  37.         t = &ts;
  38.     t->tm_isdst = isdst;
  39.     for (secs = secsarg; ; secs = secsarg + 3600)
  40.         {    /* loop to correct for DST */
  41.         days = secs / 86400;
  42.         t->tm_wday = (days + WDAY) % 7;
  43.          {    /* determine year */
  44.         long i;
  45.     
  46.         for (year = days / 365; days <
  47.             (i = _Daysto(year, 0) + 365L * year); )
  48.             --year;    /* correct guess and recheck */
  49.         days -= i;
  50.         t->tm_year = year;
  51.         t->tm_yday = days;
  52.          }
  53.          {    /* determine month */
  54.         int mon;
  55.         const short *pm = MONTAB(year);
  56.     
  57.         for (mon = 12; days < pm[--mon]; )
  58.             ;
  59.         t->tm_mon = mon;
  60.         t->tm_mday = days - pm[mon] + 1;
  61.          }
  62.         secs %= 86400;
  63.         t->tm_hour = secs / 3600;
  64.         secs %= 3600;
  65.         t->tm_min = secs / 60;
  66.         t->tm_sec = secs % 60;
  67.         if (0 <= t->tm_isdst ||
  68.             (t->tm_isdst = _Isdst(t)) <= 0)
  69.             return (t);    /* loop only if <0 => 1 */
  70.         }
  71.     }
  72.  
  73.