home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / mm / mm-ccmd-0.91-20031017.tar.gz / mm-ccmd-0.91-20031017.tar / work / mm / dates.c < prev    next >
C/C++ Source or Header  |  2002-02-22  |  5KB  |  222 lines

  1. /*
  2.  * Copyright (c) 1986, 1990 by The Trustees of Columbia University in
  3.  * the City of New York.  Permission is granted to any individual or
  4.  * institution to use, copy, or redistribute this software so long as it
  5.  * is not sold for profit, provided this copyright notice is retained.
  6.  */
  7.  
  8. #ifndef lint
  9. static char *rcsid = "$Header: /f/src2/encore.bin/cucca/mm/tarring-it-up/RCS/dates.c,v 2.1 90/10/04 18:23:52 melissa Exp $";
  10. #endif
  11.  
  12. /*
  13.  * dates.c - miscellaneous routines to manipulate date/time formats
  14.  */
  15.  
  16. #include "mm.h"
  17. #include <sys/time.h>            /* Now use gettimeofday */
  18.  
  19. static int dayspermonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  20.  
  21. char *month_names[] = {
  22.     "January", "February", "March", "April", "May", "June", "July",
  23.     "August", "September", "October", "November", "December"
  24. };
  25. static char *day_names[] = {
  26.     "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
  27.     "Saturday"
  28. };
  29.  
  30. int minutes_west;            /* offset from gmt; set in init.c */
  31.  
  32. #define dysize(y) \
  33.     ((((y) % 4) == 0 && ((y) % 100) != 0 || ((y) % 400) == 0) ? 366 : 365)
  34.  
  35. int
  36. curyr() {
  37.     time_t t;
  38.     struct tm *tm;
  39.  
  40.     t = time(0);
  41.     tm = localtime(&t);
  42.     return tm->tm_year+1900;
  43. }
  44.  
  45. time_t
  46. itime(t)
  47. struct tm *t;                /* as returned by localtime(3) */
  48. {
  49.     int i;
  50.     unsigned long x = 0;
  51.  
  52.     int dst = (t->tm_isdst ? 1 : 0);    /* how much to subtract for dst */
  53.  
  54.     /* count days in previous years back to 1970 */
  55.     for (i = (1900 + (t->tm_year) - 1); i >= 1970; i--)
  56.     x += dysize(i);
  57.  
  58.     /* add in days in previous months for this year */
  59.     for (i = t->tm_mon; i > 0; i--)
  60.     x += dayspermonth[i-1];
  61.  
  62.     /* include Feb 29th if it has occurred this year */
  63.     if ((dysize(1900+t->tm_year) == 366) && (t->tm_mon >= 2))
  64.     x++;
  65.  
  66.     x += t->tm_mday - 1;        /* add days this month */
  67.  
  68.     x = (24*x) + t->tm_hour - dst;    /* convert and add hours */
  69.     x = (60*x) + t->tm_min + minutes_west; /* add minutes, convert to gmt */
  70.     x = (60*x) + t->tm_sec;        /* seconds */
  71.     return (time_t) x;
  72. }
  73.  
  74. /*
  75.  * 1 Jan 70
  76.  */
  77. char *
  78. cdate(it)
  79. time_t it;
  80. {
  81.     struct tm *t;
  82.     static char str[16];
  83.  
  84.     t = localtime(&it);
  85.     sprintf(str, "%d %3.3s %d", t->tm_mday, month_names[t->tm_mon],
  86.         t->tm_year + 1900);
  87.     return (char *) str;
  88. }
  89.  
  90. /*
  91.  * ctad - convert internal time to ascii
  92.  *
  93.  * Similar to ctime, but the output format is "11 Oct 86 12:42am"
  94.  * Returns current time if the argument is zero.
  95.  */
  96.  
  97. char *
  98. ctad(it)
  99. time_t it;
  100. {
  101.     struct tm *t;
  102.     static char str[32];
  103.  
  104.     if (it == 0)
  105.     (void) time (&it);
  106.  
  107.     t = localtime(&it);
  108.     sprintf(str,"%d %3.3s %d %d:%02d%s",
  109.         t->tm_mday, month_names[t->tm_mon],
  110.             (t->tm_year + 1900),
  111.         (((t->tm_hour % 12) == 0) ? 12 : (t->tm_hour % 12)),
  112.         t->tm_min, ((t->tm_hour < 12) ? "am" : "pm"));
  113.     return (char *) str;
  114. }
  115.  
  116. /*
  117.  * fdate - convert internal date/time to message separator format used
  118.  * in mail files
  119.  *
  120.  * 01-Jan-70 00:00:00-GMT
  121.  */
  122.  
  123. char *
  124. fdate (it)
  125. time_t it;
  126. {
  127.     struct tm *t;
  128.     static char str[32];
  129.  
  130.     t = gmtime (&it);
  131.     sprintf (str, "%2d-%3.3s-%d %2d:%02d:%02d-GMT",
  132.          t->tm_mday, month_names[t->tm_mon],
  133.          (t->tm_year + 1900),
  134.          t->tm_hour, t->tm_min, t->tm_sec);
  135.     return (char *) str;
  136. }
  137.  
  138. /*
  139.  * hdate - convert internal date to ascii
  140.  *
  141.  * return a date string for use in displaying headers in the form
  142.  * nn-mmm
  143.  */
  144.  
  145. char *
  146. hdate (it)
  147. time_t it;
  148. {
  149.     struct tm *t;
  150.     static char str[32];
  151.     extern int thisyear;
  152.  
  153.     t = localtime(&it);
  154.     /* %2.0d works.  it should be %2.2d, but that comes out as "07" */
  155.     sprintf(str,"%2.0d-%3.3s",
  156.         t->tm_mday, month_names[t->tm_mon]);
  157.     return (char *) str;
  158. }
  159.  
  160.  
  161. /*
  162.  * More verbose version of ctad; format is "Thursday, 31 July 1986 11:20PM"
  163.  *
  164.  * If the argument is zero, the current date is returned.
  165.  */
  166. char *
  167. daytime(it)
  168. time_t it;
  169. {
  170.     struct tm *t;
  171.     static char str[64];
  172.  
  173.     if (it == 0)
  174.     (void) time (&it);
  175.  
  176.     t = localtime(&it);
  177.     sprintf(str,"%s, %d %s %d %d:%02d%s",
  178.         day_names[t->tm_wday],
  179.         t->tm_mday, month_names[t->tm_mon], t->tm_year + 1900,
  180.         (((t->tm_hour % 12) == 0) ? 12 : (t->tm_hour % 12)),
  181.         t->tm_min, ((t->tm_hour < 12) ? "AM" : "PM"));
  182.     return (char *) str;
  183. }
  184.  
  185.  
  186. /*
  187.  * rfc822-acceptable date, like:
  188.  * Thu, 1 Jan 70 00:00:00 GMT
  189.  */
  190. char *
  191. rfctime(it)
  192. time_t it;
  193. {
  194.     struct tm *t,t1;
  195.     static char str[64];
  196.     struct timeval tv;
  197.     struct timezone tz;
  198. #if MM_OS_SYSV
  199.     extern char *tzname[2];
  200. #endif
  201.  
  202.     if (it == 0)
  203.     (void) time (&it);
  204.  
  205.     t = localtime(&it);
  206.     (void) gettimeofday(&tv, &tz);
  207. #if MM_OS_SYSV
  208.     asctime(t);
  209. #endif    
  210.     sprintf(str,"%3.3s, %d %3.3s %d %d:%02d:%02d %s",
  211.         day_names[t->tm_wday],
  212.         t->tm_mday, month_names[t->tm_mon], t->tm_year + 1900,
  213.         t->tm_hour, t->tm_min, t->tm_sec,
  214. #if MM_OS_BSD && !defined(_POSIX_SOURCE)
  215.         timezone(tz.tz_minuteswest, t->tm_isdst)
  216. #elif MM_OS_SYSV || defined(_POSIX_SOURCE)
  217.         tzname[t->tm_isdst ? 1 : 0]
  218. #endif
  219.         );
  220.     return (char *) str;
  221. }
  222.