diff --git a/usr.bin/calendar/calendar.1 b/usr.bin/calendar/calendar.1 index 3a3bba9..19a3506 100644 --- a/usr.bin/calendar/calendar.1 +++ b/usr.bin/calendar/calendar.1 @@ -1,21 +1,25 @@ -CALENDAR(1) CALENDAR(1) - -NAME - calendar - reminder service - -SYNOPSIS - calendar - -DESCRIPTION - calendar consults the file calendar in the current directory and prints - out lines that contain today's or tomorrow's date anywhere in the line. - Most reasonable month-day dates such as ``Aug. 24,'' ``august 24,'' - ``8/24,'' etc., are recognized, but not ``24 August'' or ``24/8''. On - weekends ``tomorrow'' extends through Monday. - -BUGS - calendar's extended idea of ``tomorrow'' does not account for holidays. - -Page 1 Release 4.0.5 May 1992 +.TH CALENDAR 1 "June 30, 1998" +.SH NAME +.BR calendar +\- reminder service +.SH SYNOPSIS +calendar +.SH DESCRIPTION +.BR calendar +consults the file calendar in the current directory +and prints out lines that contain today's or tomorrow's date +anywhere in the line. Most reasonable month-day dates such as +Aug. 24, august 24, 8/24, and so on, are recognized, but not +24 August or 24/8. On weekends ``tomorrow'' extends through +Monday. +.BR calendar +can be invoked regularly by using the +crontab(1) or at(1) commands. +.SH REFERENCES +at(1), cron(1M), crontab(1), date(1) +.SH NOTICES +.BR calendar's +extended idea of ``tomorrow'' does not account for +holidays. diff --git a/usr.bin/calendar/calendar.c b/usr.bin/calendar/calendar.c index 567cc56..0a2f7b7 100644 --- a/usr.bin/calendar/calendar.c +++ b/usr.bin/calendar/calendar.c @@ -1,12 +1,13 @@ /* Calendar file v1.0. Copyright 1994 by Christopher Neufeld */ /* The executable for this file contains linked runtime libraries - copyrighted by The Byte Works. Used with permission. */ + copyrighted by The Byte Works. Used with permission. */ #include #include #include #include #include +#include #pragma stacksize 512 @@ -16,11 +17,16 @@ #define CALFILE "calendar" -#define SECSPERDAY (24 * 60 * 60) +#define SECSPERDAY (24 * 60 * (long)60) -const char months[NMONTHS][] = {"jan", "feb", "mar", "apr", "may", "jun", +const char months[NMONTHS][4] = {"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"}; +#ifdef NODIFFTIME +#define difftime(x1,x2) (double)((x1) - (x2)) +#endif /* Note that this is not necessarily portable, but works with */ + /* some systems which don't have 'difftime' */ + int main(void) { FILE *ifile; @@ -30,52 +36,73 @@ int main(void) char *ptr1, *ptr2, holdmnth[4]; static char thislin[MAXLINELEN+1]; long deltat; + long ldayschk; - if ((ifile = fopen(CALFILE, "r")) == NULL) exit(0); - t1 = time(NULL); - st1 = *localtime(&t1); - st1.tm_sec = st1.tm_min = st1.tm_hour = 0; - t1 = mktime(&st1); - dayschk = (st1.tm_wday >= 5) ? 8 - st1.tm_wday : 1; + if ((ifile = fopen(CALFILE, "r")) == NULL) exit(0); /* Open calendar file + in CWD. If there is none, exit successfully */ + t1 = time(NULL); /* Get the current time */ + st1 = *localtime(&t1); /* Convert to formatted date/time */ + st1.tm_sec = st1.tm_min = st1.tm_hour = 0; /* Pretend it's midnight, it + makes the checking later much easier */ + t1 = mktime(&st1); /* Make an internal representation for that midnight + (the one which heralded today's date) */ + dayschk = (st1.tm_wday >= 5) ? 8 - st1.tm_wday : 2; /* Check today and + tomorrow, unless tomorrow is on the weekend, in + which case we check up to and including Monday */ thislin[MAXLINELEN] = 0; while (!feof(ifile)) { - fgets(thislin, MAXLINELEN, ifile); + if (fgets(thislin, MAXLINELEN, ifile) == NULL) { /* Get a line from the calendar file */ + if (feof(ifile)) break; /* Didn't read a line, if we're done, quit */ + fprintf(stderr, "Can't happen\n"); + continue; /* Something funny happened on the read */ + } ptr1 = thislin; - while (isspace(*ptr1) && *ptr1 != 0) ptr1++; + while (isspace(*ptr1) && *ptr1 != 0) ptr1++; /* Flush initial whitespace */ if (*ptr1 == 0) continue; /* Blank line */ monthnum = -1; + while (*ptr1) { if (isdigit(*ptr1)) { /* month/day format */ monthnum = strtoul(ptr1, &ptr2, 10) - 1; daynum = strtoul(ptr2+1, NULL, 10); - if (monthnum < 0 || monthnum >= NMONTHS || daynum < 0 || daynum > NDAYS) - continue; + /* We've now parsed a month/day format line */ + if (monthnum && monthnum < NMONTHS && daynum && daynum <= NDAYS) + break; /* Valid date, print line of the file */ } else { - for (i=0; i<3; i++) holdmnth[i] = tolower(ptr1[i]); + for (i=0; i<3; i++) holdmnth[i] = tolower(ptr1[i]); /* make the search + case-insensitive */ holdmnth[3] = 0; for (i = 0; i < NMONTHS; i++) if (!(strcmp(holdmnth, months[i]))) { - monthnum = i; + monthnum = i; /* look for "jan", "feb", etc. */ break; } - if (monthnum == -1) continue; - while (!isspace(*ptr1) && *ptr1 != 0) ptr1++; - if (*ptr1 == 0) continue; - while (isspace(*ptr1) && *ptr1 != 0) ptr1++; - if (*ptr1 == 0) continue; - daynum = atoi(ptr1); - if (daynum < 1 || daynum > NDAYS) continue; + if (monthnum != -1) { /* found a valid month, get day */ + while (!isspace(*ptr1) && *ptr1 != 0) ptr1++; /* flush text */ + if (*ptr1 == 0) break; + while (isspace(*ptr1) && *ptr1 != 0) ptr1++; /* flush whitespace */ + if (*ptr1 == 0) break; /* No day number, go to next line in file */ + daynum = atoi(ptr1); /* get day number */ + if (daynum >= 1 && daynum <= NDAYS) break; /* Valid, go print line */ + } + } + ptr1++; } st2.tm_sec = st2.tm_min = st2.tm_hour = st2.tm_isdst = 0; st2.tm_mday = daynum; st2.tm_mon = monthnum; st2.tm_year = st1.tm_year; - t2 = mktime(&st2); - if ((deltat = difftime(t2, t1)) < 0) { /* Next year */ + /* We've now set up the time for midnight at the + beginning of the day represented by the line we + found in the calendar file */ + t2 = mktime(&st2); /* Change to internal format */ + if ((deltat = difftime(t2, t1)) < 0) { /* The day was in the past, check + the same date next year */ st2.tm_year++; t2 = mktime(&st2); deltat = difftime(t2, t1); } if (deltat <= dayschk * SECSPERDAY) printf(thislin); + /* print the entire line if it is inside our acceptance window */ } fclose(ifile); exit(0); diff --git a/usr.bin/calendar/calendar.desc b/usr.bin/calendar/calendar.desc index cf090c2..a3bd5de 100644 --- a/usr.bin/calendar/calendar.desc +++ b/usr.bin/calendar/calendar.desc @@ -1,11 +1,11 @@ Name: calendar -Version: 1.0 +Version: 1.1 Shell: GNO -Author: Christopher Neufeld -Contact: neufeld@physics.utoronto.ca -Where: /usr/local/games -FTP: ftp.gno.org, ground.isca.uiowa.edu +Author: Christopher Neufeld, Marlin Allred +Contact: neufeld@physics.utoronto.ca, Marlin.Allred@unisys.com +Where: /usr/games +FTP: ftp.gno.org - This program consults a calandar database, and prints out entries +This program consults a calandar database, and prints out entries corresponding to today's or tomorrow's entries. On weekends, "tomorrow" extends through Monday.