home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Product / Product.zip / sc621_3.zip / src / time.c < prev    next >
C/C++ Source or Header  |  1994-03-15  |  3KB  |  121 lines

  1. /* MSC time routines are broken. These are adapted from the emx/gcc
  2.    library routines. */
  3.  
  4. /* gmtime.c (emx+gcc) -- Copyright (c) 1990-1993 by Eberhard Mattes */
  5.  
  6. #include <stdlib.h>
  7. #include <time.h>
  8. #include <string.h>
  9.  
  10. typedef struct {
  11.   unsigned long quot;
  12.   unsigned int  rem;
  13. } _uldiv_t;
  14.  
  15. static _uldiv_t _uldiv(time_t t0, unsigned n)
  16. {
  17.   _uldiv_t q;
  18.   q.quot = t0 / n;
  19.   q.rem = t0 % n;
  20.   return(q);
  21. }
  22.  
  23. static int leap (unsigned int y)
  24. {
  25.   return (y % 4 != 0 ? 0 : y % 100 != 0 ? 1 : y % 400 != 0 ? 0 : 1);
  26. }
  27.  
  28.  
  29. struct tm *gmtime (const time_t *t)
  30. {
  31.   static struct tm result;
  32.   time_t t0, t1;
  33.   _uldiv_t q;
  34.   static int const mon_len[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
  35.  
  36.   t0 = *t;
  37.   if (t0 == (time_t)(-1))
  38.     return (NULL);
  39.   q = _uldiv (t0, 60); result.tm_sec = q.rem; t0 = q.quot;
  40.   q = _uldiv (t0, 60); result.tm_min = q.rem; t0 = q.quot;
  41.   q = _uldiv (t0, 24); result.tm_hour = q.rem; t0 = q.quot;
  42.   result.tm_wday = (t0+4) % 7;  /* 01-Jan-1970 was Thursday, ie, 4 */
  43.   result.tm_year = 70;          /* 1970 */
  44.   for (;;)
  45.     {
  46.       t1 = (leap (result.tm_year+1900) ? 366 : 365);
  47.       if (t1 > t0)
  48.         break;
  49.       t0 -= t1;
  50.       ++result.tm_year;
  51.     }
  52.   result.tm_mon = 0;
  53.   result.tm_yday = t0;
  54.   for (;;)
  55.     {
  56.       if (result.tm_mon == 1)       /* February */
  57.         t1 = (leap (result.tm_year+1900) ? 29 : 28);
  58.       else
  59.         t1 = mon_len[result.tm_mon];
  60.       if (t1 > t0)
  61.         break;
  62.       t0 -= t1;
  63.       ++result.tm_mon;
  64.     }
  65.   result.tm_mday = t0 + 1;
  66.   result.tm_isdst = 0;
  67.   return (&result);
  68. }
  69.  
  70.  
  71. /* asctime.c (emx+gcc) -- Copyright (c) 1990-1993 by Eberhard Mattes */
  72.  
  73. static char const months[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
  74. static char const wdays[] = "SunMonTueWedThuFriSat";
  75.  
  76. #define digit(i) (char)(((i)%10)+'0')
  77.  
  78. char *asctime (const struct tm *t)
  79. {
  80.   static char result[26];
  81.  
  82.   memcpy (result+0, wdays+t->tm_wday*3, 3);
  83.   result[3] = ' ';
  84.   memcpy (result+4, months+t->tm_mon*3, 3);
  85.   result[7] = ' ';
  86.   result[8] = digit (t->tm_mday / 10);
  87.   result[9] = digit (t->tm_mday / 1);
  88.   result[10] = ' ';
  89.   result[11] = digit (t->tm_hour / 10);
  90.   result[12] = digit (t->tm_hour / 1);
  91.   result[13] = ':';
  92.   result[14] = digit (t->tm_min / 10);
  93.   result[15] = digit (t->tm_min / 1);
  94.   result[16] = ':';
  95.   result[17] = digit (t->tm_sec / 10);
  96.   result[18] = digit (t->tm_sec / 1);
  97.   result[19] = ' ';
  98.   result[20] = digit ((t->tm_year+1900) / 1000);
  99.   result[21] = digit ((t->tm_year+1900) / 100);
  100.   result[22] = digit ((t->tm_year+1900) / 10);
  101.   result[23] = digit ((t->tm_year+1900) / 1);
  102.   result[24] = '\n';
  103.   result[25] = '\0';
  104.   return (result);
  105. }
  106.  
  107.  
  108. /* ctime.c (emx+gcc) -- Copyright (c) 1990-1993 by Eberhard Mattes */
  109.  
  110. char *ctime (const time_t *t)
  111. {
  112.   struct tm *x;
  113.  
  114.   x = localtime (t);
  115.   if (x == NULL)
  116.     return (NULL);
  117.   else
  118.     return (asctime (x));
  119. }
  120.  
  121.