home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / elm.lzh / ELM / SRC / DATE.C < prev    next >
Text File  |  1991-01-11  |  7KB  |  255 lines

  1.  
  2. static char rcsid[] = "@(#)$Id: date.c,v 4.1 90/04/28 22:42:41 syd Exp $";
  3.  
  4. /*******************************************************************************
  5.  *  The Elm Mail System  -  $Revision: 4.1 $   $State: Exp $
  6.  *
  7.  *             Copyright (c) 1986, 1987 Dave Taylor
  8.  *             Copyright (c) 1988, 1989, 1990 USENET Community Trust
  9.  *******************************************************************************
  10.  * Bug reports, patches, comments, suggestions should be sent to:
  11.  *
  12.  *    Syd Weinstein, Elm Coordinator
  13.  *    elm@DSI.COM            dsinc!elm
  14.  *
  15.  *******************************************************************************
  16.  * $Log:    date.c,v $
  17.  * Revision 4.1  90/04/28  22:42:41  syd
  18.  * checkin of Elm 2.3 as of Release PL0
  19.  * 
  20.  * OS-9 specific now !!!
  21.  * =====================
  22.  ******************************************************************************/
  23.  
  24. /** return the current date and time in a readable format! **/
  25. /** also returns an ARPA RFC-822 format date...            **/
  26.  
  27. #include "headers.h"
  28.  
  29. #include <time.h>
  30. #include <sys/types.h>
  31. #include <ctype.h>
  32.  
  33. extern struct tm *localtime();
  34. extern long      time();
  35.  
  36. #undef toupper
  37. #undef tolower
  38.  
  39. #define MONTHS_IN_YEAR    11    /* 0-11 equals 12 months! */
  40. #define FEB         1    /* 0 = January           */
  41. #define DAYS_IN_LEAP_FEB 29    /* leap year only       */
  42.  
  43. #define ampm(n)        (n > 12? n - 12 : n)
  44. #define am_or_pm(n)    (n > 11? (n > 23? "am" : "pm") : "am")
  45. #define leapyear(year)    ((year % 4 == 0) && (year % 100 != 0))
  46.  
  47. char *arpa_dayname[] = { "Sun", "Mon", "Tue", "Wed", "Thu",
  48.           "Fri", "Sat", "" };
  49.  
  50. char *arpa_monname[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  51.           "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ""};
  52.  
  53. int  days_in_month[] = { 31,    28,    31,    30,    31,     30, 
  54.           31,     31,    30,   31,    30,     31,  -1};
  55.  
  56. char *get_arpa_date()
  57. {
  58.     /** returns an ARPA standard date.  The format for the date
  59.         according to DARPA document RFC-822 is exemplified by;
  60.  
  61.                      Mon, 12 Aug 85 6:29:08 MST
  62.  
  63.     **/
  64.  
  65.     static char buffer[SLEN];    /* static character buffer       */
  66.     struct tm *the_time;        /* Time structure, see CTIME(3C) */
  67.     long       junk;        /* time in seconds....         */
  68.     extern char *gettz();        /* top 2 os9lib             */
  69.  
  70.     junk = time((long *) 0);    /* this must be here for it to work! */
  71.  
  72.     the_time = localtime(&junk);
  73.  
  74.     sprintf(buffer, "%s, %d %s %d %d:%02d:%02d %s",
  75.       arpa_dayname[the_time->tm_wday],
  76.       the_time->tm_mday % 32,
  77.       arpa_monname[the_time->tm_mon],
  78.       the_time->tm_year % 100,
  79.       the_time->tm_hour % 24,
  80.       the_time->tm_min  % 61,
  81.       the_time->tm_sec  % 61,
  82.       (gettz()));
  83.       
  84.     return( (char *) buffer);
  85. }
  86.  
  87. days_ahead(days, buffer)
  88. int days;
  89. char *buffer;
  90. {
  91.     /** return in buffer the date (Day, Mon Day, Year) of the date
  92.         'days' days after today.  
  93.     **/
  94.  
  95.     struct tm *the_time;        /* Time structure, see CTIME(3C) */
  96.     long       junk;        /* time in seconds....         */
  97.  
  98.     junk = time((long *) 0);    /* this must be here for it to work! */
  99.     the_time = localtime(&junk);
  100.  
  101.     /* increment the day of the week */
  102.  
  103.     the_time->tm_wday = (the_time->tm_wday + days) % 7;
  104.  
  105.     /* the day of the month... */
  106.     the_time->tm_mday += days;
  107.     
  108.         while (the_time->tm_mday > days_in_month[the_time->tm_mon]) {
  109.           if (the_time->tm_mon == FEB && leapyear(the_time->tm_year)) {
  110.             if (the_time->tm_mday > DAYS_IN_LEAP_FEB) {
  111.               the_time->tm_mday -= DAYS_IN_LEAP_FEB;
  112.               the_time->tm_mon += 1;
  113.             }
  114.             else
  115.               break;            /* Is Feb 29, so leave */
  116.           }
  117.           else {
  118.             the_time->tm_mday -= days_in_month[the_time->tm_mon];
  119.             the_time->tm_mon += 1;
  120.           }
  121.  
  122.           /* check the month of the year */
  123.           if (the_time->tm_mon > MONTHS_IN_YEAR) {
  124.             the_time->tm_mon -= (MONTHS_IN_YEAR + 1);
  125.             the_time->tm_year += 1;
  126.           }
  127.         }
  128.   
  129.         /* now, finally, build the actual date string */
  130.  
  131.     sprintf(buffer, "%s, %d %s %d",
  132.       arpa_dayname[the_time->tm_wday],
  133.       the_time->tm_mday % 32,
  134.       arpa_monname[the_time->tm_mon],
  135.       the_time->tm_year % 100);
  136. }
  137.  
  138. fix_date(entry)
  139. struct header_rec *entry;
  140. {
  141.     /** This routine will 'fix' the date entry for the specified
  142.         message.  This consists of 1) adjusting the year to 0-99
  143.         and 2) altering time from HH:MM:SS to HH:MM am|pm **/ 
  144.  
  145.     if (atoi(entry->year) > 99)     
  146.       sprintf(entry->year,"%d", atoi(entry->year) - 1900);
  147.  
  148.     fix_time(entry->time);
  149. }
  150.  
  151. fix_time(timestring)
  152. char *timestring;
  153. {
  154.     /** Timestring in format HH:MM:SS (24 hour time).  This routine
  155.         will fix it to display as: HH:MM [am|pm] **/
  156.  
  157.     int hour, minute;
  158.  
  159.     sscanf(timestring, "%d:%d", &hour, &minute);
  160.  
  161.     if (hour < 1 || hour == 24) 
  162.       sprintf(timestring, "12:%02d am", minute);
  163.     else if (hour < 12)
  164.       sprintf(timestring, "%d:%02d am", hour, minute);
  165.     else if (hour == 12)
  166.       sprintf(timestring, "12:%02d pm", minute);
  167.     else if (hour < 24)
  168.       sprintf(timestring, "%d:%02d pm", hour-12, minute);
  169. }
  170.  
  171. int
  172. compare_parsed_dates(rec1, rec2)
  173. struct date_rec rec1, rec2;
  174. {
  175.     /** This function is very similar to the compare_dates
  176.         function but assumes that the two record structures
  177.         are already parsed and stored in "date_rec" format.
  178.     **/
  179.  
  180.     if (rec1.year != rec2.year)
  181.       return( rec1.year - rec2.year );
  182.     
  183.     if (rec1.month != rec2.month)
  184.       return( rec1.month - rec2.month );
  185.  
  186.     if (rec1.day != rec2.day)
  187.       return( rec1.day - rec2.day );
  188.  
  189.     if (rec1.hour != rec2.hour)
  190.       return( rec1.hour - rec2.hour );
  191.  
  192.     return( rec1.minute - rec2.minute );        /* ignore seconds... */
  193. }
  194.  
  195. int
  196. month_number(name)
  197. char *name;
  198. {
  199.     /** return the month number given the month name... **/
  200.  
  201.     char ch;
  202.  
  203.     switch (tolower(name[0])) {
  204.      case 'a' : if ((ch = tolower(name[1])) == 'p')    return(APRIL);
  205.             else if (ch == 'u') return(AUGUST);
  206.             else return(-1);    /* error! */
  207.     
  208.      case 'd' : return(DECEMBER);
  209.      case 'f' : return(FEBRUARY);
  210.      case 'j' : if ((ch = tolower(name[1])) == 'a') return(JANUARY);
  211.             else if (ch == 'u') {
  212.                   if ((ch = tolower(name[2])) == 'n') return(JUNE);
  213.               else if (ch == 'l') return(JULY);
  214.               else return(-1);        /* error! */
  215.                 }
  216.             else return(-1);        /* error */
  217.      case 'm' : if ((ch = tolower(name[2])) == 'r') return(MARCH);
  218.             else if (ch == 'y') return(MAY);
  219.             else return(-1);        /* error! */
  220.      case 'n' : return(NOVEMBER);
  221.      case 'o' : return(OCTOBER);
  222.      case 's' : return(SEPTEMBER);
  223.      default  : return(-1);
  224.     }
  225. }
  226.  
  227. #ifdef SITE_HIDING
  228.  
  229. char *get_ctime_date()
  230. {
  231.     /** returns a ctime() format date, but a few minutes in the 
  232.         past...(more cunningness to implement hidden sites) **/
  233.  
  234.     static char buffer[SLEN];    /* static character buffer       */
  235.     struct tm *the_time;        /* Time structure, see CTIME(3C) */
  236.     long       junk;        /* time in seconds....         */
  237.  
  238.     junk = time((long *) 0);    /* this must be here for it to work! */
  239.  
  240.     the_time = localtime(&junk);
  241.  
  242.     sprintf(buffer, "%s %s %d %02d:%02d:%02d %d",
  243.       arpa_dayname[the_time->tm_wday],
  244.       arpa_monname[the_time->tm_mon],
  245.       the_time->tm_mday % 32,
  246.       min(the_time->tm_hour % 24, (rand() % 24)),
  247.       min(abs(the_time->tm_min  % 61 - (rand() % 60)), (rand() % 60)),
  248.       min(abs(the_time->tm_sec  % 61 - (rand() % 60)), (rand() % 60)),
  249.       the_time->tm_year % 100 + 1900);
  250.     
  251.     return( (char *) buffer);
  252. }
  253.  
  254. #endif
  255.