home *** CD-ROM | disk | FTP | other *** search
-
- static char rcsid[] = "@(#)$Id: date.c,v 5.4 1992/12/11 01:45:04 syd Exp $";
-
- /*******************************************************************************
- * The Elm Mail System - $Revision: 5.4 $ $State: Exp $
- *
- * Copyright (c) 1988-1992 USENET Community Trust
- * Copyright (c) 1986,1987 Dave Taylor
- *******************************************************************************
- * Bug reports, patches, comments, suggestions should be sent to:
- *
- * Syd Weinstein, Elm Coordinator
- * elm@DSI.COM dsinc!elm
- *
- *******************************************************************************
- * $Log: date.c,v $
- * Revision 5.4 1992/12/11 01:45:04 syd
- * remove sys/types.h include, it is now included by defs.h
- * and this routine includes defs.h or indirectly includes defs.h
- * From: Syd
- *
- * Revision 5.3 1992/12/07 02:57:09 syd
- * convert long to time_t where relevant
- * From: Syd via prompting from Jim Brown
- *
- * Revision 5.2 1992/11/15 02:10:11 syd
- * remove no longer used tzname
- * From: Syd
- *
- * Revision 5.1 1992/10/03 22:58:40 syd
- * Initial checkin as of 2.4 Release at PL0
- *
- *
- ******************************************************************************/
-
- /** return the current date and time in a readable format! **/
- /** also returns an ARPA RFC-822 format date... **/
-
-
- #include "headers.h"
-
- #ifdef I_TIME
- # include <time.h>
- #endif
- #ifdef I_SYSTIME
- # include <sys/time.h>
- #endif
- #ifdef BSD
- # include <sys/timeb.h>
- #endif
-
- #include <ctype.h>
-
- #ifndef _POSIX_SOURCE
- extern struct tm *localtime();
- extern struct tm *gmtime();
- extern time_t time();
- #endif
-
- #ifdef BSD
- #undef tolower
- #endif
-
- #define MONTHS_IN_YEAR 11 /* 0-11 equals 12 months! */
- #define FEB 1 /* 0 = January */
- #define DAYS_IN_LEAP_FEB 29 /* leap year only */
-
- #define ampm(n) (n > 12? n - 12 : n)
- #define am_or_pm(n) (n > 11? (n > 23? "am" : "pm") : "am")
- #define leapyear(year) ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)))
-
- char *arpa_dayname[] = { "Sun", "Mon", "Tue", "Wed", "Thu",
- "Fri", "Sat", "" };
-
- char *arpa_monname[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ""};
-
- int days_in_month[] = { 31, 28, 31, 30, 31, 30,
- 31, 31, 30, 31, 30, 31, -1};
-
- days_ahead(days, buffer)
- int days;
- char *buffer;
- {
- /** return in buffer the date (Day, Mon Day, Year) of the date
- 'days' days after today.
- **/
-
- struct tm *the_time; /* Time structure, see CTIME(3C) */
- time_t junk; /* time in seconds.... */
-
- junk = time((time_t *) 0); /* this must be here for it to work! */
- the_time = localtime(&junk);
-
- /* increment the day of the week */
-
- the_time->tm_wday = (the_time->tm_wday + days) % 7;
-
- /* the day of the month... */
- the_time->tm_mday += days;
-
- while (the_time->tm_mday > days_in_month[the_time->tm_mon]) {
- if (the_time->tm_mon == FEB && leapyear(the_time->tm_year)) {
- if (the_time->tm_mday > DAYS_IN_LEAP_FEB) {
- the_time->tm_mday -= DAYS_IN_LEAP_FEB;
- the_time->tm_mon += 1;
- }
- else
- break; /* Is Feb 29, so leave */
- }
- else {
- the_time->tm_mday -= days_in_month[the_time->tm_mon];
- the_time->tm_mon += 1;
- }
-
- /* check the month of the year */
- if (the_time->tm_mon > MONTHS_IN_YEAR) {
- the_time->tm_mon -= (MONTHS_IN_YEAR + 1);
- the_time->tm_year += 1;
- }
- }
-
- /* now, finally, build the actual date string */
-
- sprintf(buffer, "%s, %d %s %d",
- arpa_dayname[the_time->tm_wday],
- the_time->tm_mday % 32,
- arpa_monname[the_time->tm_mon],
- the_time->tm_year % 100);
- }
-
- int
- month_number(name)
- char *name;
- {
- /** return the month number given the month name... **/
-
- char ch;
-
- switch (tolower(name[0])) {
- case 'a' : if ((ch = tolower(name[1])) == 'p') return(APRIL);
- else if (ch == 'u') return(AUGUST);
- else return(-1); /* error! */
-
- case 'd' : return(DECEMBER);
- case 'f' : return(FEBRUARY);
- case 'j' : if ((ch = tolower(name[1])) == 'a') return(JANUARY);
- else if (ch == 'u') {
- if ((ch = tolower(name[2])) == 'n') return(JUNE);
- else if (ch == 'l') return(JULY);
- else return(-1); /* error! */
- }
- else return(-1); /* error */
- case 'm' : if ((ch = tolower(name[2])) == 'r') return(MARCH);
- else if (ch == 'y') return(MAY);
- else return(-1); /* error! */
- case 'n' : return(NOVEMBER);
- case 'o' : return(OCTOBER);
- case 's' : return(SEPTEMBER);
- default : return(-1);
- }
- }
-
- #ifdef SITE_HIDING
-
- char *get_ctime_date()
- {
- /** returns a ctime() format date, but a few minutes in the
- past...(more cunningness to implement hidden sites) **/
-
- static char buffer[SLEN]; /* static character buffer */
- struct tm *the_time; /* Time structure, see CTIME(3C) */
-
- #ifdef BSD
- struct timeval time_val;
- struct timezone time_zone;
- long junk; /* time in seconds.... */
- #else
- time_t junk; /* time in seconds.... */
- #endif
-
- #ifdef BSD
- gettimeofday(&time_val, &time_zone);
- junk = time_val.tv_sec;
- #else
- junk = time((time_t *) 0); /* this must be here for it to work! */
- #endif
- the_time = localtime(&junk);
-
- sprintf(buffer, "%s %s %d %02d:%02d:%02d %d",
- arpa_dayname[the_time->tm_wday],
- arpa_monname[the_time->tm_mon],
- the_time->tm_mday % 32,
- min(the_time->tm_hour % 24, (rand() % 24)),
- min(abs(the_time->tm_min % 61 - (rand() % 60)), (rand() % 60)),
- min(abs(the_time->tm_sec % 61 - (rand() % 60)), (rand() % 60)),
- the_time->tm_year % 100 + 1900);
-
- return( (char *) buffer);
- }
-
- #endif
-
- char *
- elm_date_str(buf, seconds)
- char *buf;
- time_t seconds;
- {
- struct tm *tmbuf;
-
- tmbuf = gmtime(&seconds);
-
- sprintf(buf, "%s %d, %d %2.2d:%2.2d:%2.2d %s",
- arpa_monname[tmbuf->tm_mon],
- tmbuf->tm_mday,
- tmbuf->tm_year % 100,
- ampm(tmbuf->tm_hour),
- tmbuf->tm_min,
- tmbuf->tm_sec,
- am_or_pm(tmbuf->tm_hour));
-
- return(buf);
- }
-
- make_menu_date(entry)
- struct header_rec *entry;
- {
- struct tm *tmbuf;
- time_t seconds;
-
- seconds = entry->time_sent + entry->tz_offset;
- tmbuf = gmtime(&seconds);
- sprintf(entry->time_menu, "%3.3s %-2d",
- arpa_monname[tmbuf->tm_mon], tmbuf->tm_mday);
- }
-