home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / unixlib36d / src / c / ctime < prev    next >
Text File  |  1994-03-08  |  4KB  |  225 lines

  1. #ifdef __STDC__
  2. static char sccs_id[] = "@(#) ctime.c 2.0 " __DATE__ " HJR";
  3. #else
  4. static char sccs_id[] = "@(#) ctime.c 2.0 26/9/90 HJR";
  5. #endif
  6.  
  7. /* ctime.c (c) Copyright 1990 H.Rogers */
  8.  
  9. #include <time.h>
  10. #include <stdio.h>
  11. #include <ctype.h>
  12.  
  13. static char *__tdays[] =
  14. {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
  15. static char *__tdayl[] =
  16. {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
  17. static char *__tmonths[] =
  18. {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
  19. static char *__tmonthl[] =
  20. {"January", "February", "March", "April", "May", "June", "July", "August",
  21.  "September", "October", "November", "December"};
  22.  
  23. /* standard representations (take care to avoid making
  24.  * strftime() call itself recursively ad infinitum) */
  25.  
  26. static char *__dtrep = "%a %b %d %H:%M:%S %Y";
  27. static char *__drep = "%a %b %d %Y";
  28. static char *__trep = "%H:%M:%S";
  29.  
  30. #ifdef __STDC__
  31. char *
  32. asctime (register const struct tm *t)
  33. #else
  34. char *
  35. asctime (t)
  36.      register const struct tm *t;
  37. #endif
  38. {
  39.   static char _buf[26];
  40.   register char *buf = _buf;
  41.  
  42.   buf += strftime (buf, 24, __dtrep, t);
  43.   *buf++ = '\n';
  44.   *buf++ = 0;
  45.  
  46.   return (_buf);
  47. }
  48.  
  49. #ifdef __STDC__
  50. char *
  51. ctime (register const time_t * tp)
  52. #else
  53. char *
  54. ctime (tp)
  55.      register const time_t *tp;
  56. #endif
  57. {
  58.   return (asctime (localtime (tp)));
  59. }
  60.  
  61. #ifdef __STDC__
  62. size_t
  63. strftime (register char *buf, register size_t max,
  64.       register const char *fmt, register const struct tm * t)
  65. #else
  66. size_t
  67. strftime (buf, max, fmt, t)
  68.      register char *buf;
  69.      register size_t max;
  70.      register const char *fmt;
  71.      register const struct tm *t;
  72. #endif
  73. {
  74.   register int i = max;
  75.  
  76.   while (*fmt && i)
  77.     {
  78.       if (*fmt != '%' || *++fmt == '%')        /* left to right evaluation */
  79.     {
  80.       *buf++ = *fmt++, i--;
  81.       continue;
  82.     }
  83.  
  84.       {
  85.     register char *s;
  86.     register int j;
  87.  
  88.     switch (*fmt)
  89.       {
  90.       case 'a':
  91.         s = __tdays[t->tm_wday];
  92.       scp:while (i && (*buf = *s))
  93.           buf++, s++, i--;
  94.         break;
  95.       case 'A':
  96.         s = __tdayl[t->tm_wday];
  97.         goto scp;
  98.       case 'b':
  99.         s = __tmonths[t->tm_mon];
  100.         goto scp;
  101.       case 'B':
  102.         s = __tmonthl[t->tm_mon];
  103.         goto scp;
  104.       case 'c':
  105.         j = strftime (buf, i, __dtrep, t);
  106.         buf += j, i -= j;
  107.         break;
  108.       case 'd':
  109.         if (i >= 2)
  110.           {
  111.         sprintf (buf, "%2d", t->tm_mday);
  112.         buf += 2, i -= 2;
  113.           }
  114.         break;
  115.       case 'H':
  116.         if (i >= 2)
  117.           {
  118.         sprintf (buf, "%.2d", t->tm_hour);
  119.         buf += 2, i -= 2;
  120.           }
  121.         break;
  122.       case 'I':
  123.         j = t->tm_hour;
  124.         if (j > 12)
  125.           j -= 12;
  126.         if (i >= 2)
  127.           {
  128.         sprintf (buf, "%2d", j);
  129.         buf += 2, i -= 2;
  130.           }
  131.         break;
  132.       case 'j':
  133.         if (i >= 3)
  134.           {
  135.         sprintf (buf, "%3d", t->tm_yday);
  136.         buf += 3, i -= 3;
  137.           }
  138.         break;
  139.       case 'm':
  140.         if (i >= 2)
  141.           {
  142.         sprintf (buf, "%2d", t->tm_mon);
  143.         buf += 2, i -= 2;
  144.           }
  145.         break;
  146.       case 'M':
  147.         if (i >= 2)
  148.           {
  149.         sprintf (buf, "%.2d", t->tm_min);
  150.         buf += 2, i -= 2;
  151.           }
  152.         break;
  153.       case 'p':
  154.         s = (t->tm_hour > 12) ? "PM" : "AM";
  155.         goto scp;
  156.       case 'S':
  157.         if (i >= 2)
  158.           {
  159.         sprintf (buf, "%.2d", t->tm_sec);
  160.         buf += 2, i -= 2;
  161.           }
  162.         break;
  163.       case 'U':
  164.         j = t->tm_yday;
  165.         if (j > 2)
  166.           j += (4 - t->tm_wday);
  167.         if (i >= 2)
  168.           {
  169.         sprintf (buf, "%2d", j / 7);
  170.         buf += 2, i -= 2;
  171.           }
  172.         break;
  173.       case 'w':
  174.         *buf++ = t->tm_wday + '0';
  175.         i--;
  176.         break;
  177.       case 'W':
  178.         j = t->tm_yday;
  179.         if (j > 2)
  180.           j += (5 - ((j = t->tm_wday) ? j : 7));
  181.         if (i >= 2)
  182.           {
  183.         sprintf (buf, "%2d", j / 7);
  184.         buf += 2, i -= 2;
  185.           }
  186.         break;
  187.       case 'x':
  188.         j = strftime (buf, i, __drep, t);
  189.         buf += j, i -= j;
  190.         break;
  191.       case 'X':
  192.         j = strftime (buf, i, __trep, t);
  193.         buf += j, i -= j;
  194.         break;
  195.       case 'y':
  196.         if (i >= 2)
  197.           {
  198.         sprintf (buf, "%2d", t->tm_year);
  199.         buf += 2, i -= 2;
  200.           }
  201.         break;
  202.       case 'Y':
  203.         if (i >= 4)
  204.           {
  205.         sprintf (buf, "%4d", t->tm_year + 1900);
  206.         buf += 4, i -= 4;
  207.           }
  208.         break;
  209.       case 'Z':
  210.         s = (char *) t->tm_zone;
  211.         goto scp;
  212.         break;
  213.       default:
  214.         *buf++ = *fmt, i--;
  215.         break;
  216.       }
  217.     fmt++;
  218.       }
  219.     }
  220.  
  221.   *buf = 0;
  222.  
  223.   return ((*fmt) ? 0 : max - i);
  224. }
  225.