V10/cmd/calendar2.c
/* /usr/lib/calendar produces an egrep -f file
that will select today's and tomorrow's
calendar entries, with special weekend provisions
used by calendar command
*/
#include <time.h>
#include <string.h>
#define DAY (3600*24L)
#define NHOL (sizeof holidays / sizeof *holidays)
char *month[] = {
"[Jj]an",
"[Ff]eb",
"[Mm]ar",
"[Aa]pr",
"[Mm]ay",
"[Jj]un",
"[Jj]ul",
"[Aa]ug",
"[Ss]ep",
"[Oo]ct",
"[Nn]ov",
"[Dd]ec"
};
/* Table of holidays gives inclusive months, inclusive
* days of month, and inclusive days of week on which a
* holiday may fall. Thus Thanksgiving, 4th Thursday of November,
* may happen as early as Nov 22 and as late as Nov 28.
* American holidays celebrated in more than two states
* are in table, but most are commented out as irrelevant to
* the schedule of the author's place of work
*/
struct hol {
int h_mon0, h_mon1;
int h_mday0, h_mday1;
int h_wday0, h_wday1;
} holidays[] = {
1,12, 1,31, 6,6, /* sat */
1,12, 1,31, 0,0, /* sun */
1,1, 1,1, 0,6, /* new year's */
/* 1,1, 8,14, 0,0, /* martin luther king's birthday */
/* 1,1, 15,15, 0,6, /* martin luther king's birthday */
/* 1,1, 15,21, 1,1, /* martin luther king's birthday */
/* 1,1, 19,19, 0,6, /* robert e lee's birthday */
/* 1,1, 15,21, 1,1, /* robert e lee's birthday */
/* 2,2, 1,7, 1,1, /* lincoln's birthday */
/* 2,2, 12,12, 0,6, /* lincoln's birthday */
/* 2,2, 15,21, 1,1, /* washington's birthday */
/* 2,2, 22,22, 0,6, /* washington's birthday */
/* 3,4, ??,??, 5,5, /* good fri, beyond calculation */
5,5, 25,31, 1,1, /* memorial day */
/* 5,5, 30,30, 0,6, /* memorial day */
/* 6,6, 1,7, 1,1, /* jefferson davis's birthday */
/* 6,6, 3,3, 0,6, /* jefferson davis's birthday */
7,7, 3,3, 6,6, /* fri before sat july 4th */
7,7, 4,4, 0,6, /* independence day */
7,7, 5,5, 1,1, /* mon after sun july 4th */
9,9, 1,7, 1,1, /* labor day */
/* 10,10, 8,14, 1,1, /* columbus day */
/* 10,10, 12,12, 0,6, /* columbus day */
/* 10,10, 22,28, 1,1, /* veterans' day */
/* 11,11, 2,8, 2,2, /* election day */
/* 11,11, 11,11, 0,6, /* veterans' day */
11,11, 22,28, 4,4, /* thanksgiving */
11,11, 23,29, 5,5, /* fri after thanksgiving */
12,12, 24,24, 1,1, /* mon before tue christmas */
12,12, 25,25, 0,6, /* christmas */
12,12, 26,26, 5,5, /* fri after thu christmas */
12,12, 31,31, 1,1, /* mon before tue new years */
};
struct tm *localtime();
char *ctime();
char *date1, *date2;
#define year(date) (&date[20])
int hflg = 0;
main(argc,argv)
char **argv;
{
long t;
int hidigit, lastday;
struct tm ctm, ntm;
int horiz = argc>1? atoi(argv[1]): 2;
if(horiz<=0) horiz = 1;
time(&t);
date1 = strdup(ctime(&t));
printf("(^|[ \t(,;])(");
for(ctm= *localtime(&t); horiz>0; ctm=ntm) {
hidigit = ctm.tm_mday/10;
ntm = ctm;
while(horiz>0) {
lastday = ntm.tm_mday;
if(horiz>1 || !dayoff(&ntm))
horiz--;
t += DAY;
ntm = *localtime(&t);
if(ntm.tm_mday/10!=hidigit)
break;
}
printf("((%s[^ ]* *|0*%d/|\\* */?)0*",
month[ctm.tm_mon], ctm.tm_mon+1);
if(hidigit!=0)
printf("%d",hidigit);
printf("[%d-%d])", ctm.tm_mday%10, lastday%10);
if(horiz>0)
printf("\n");
}
date2 = strdup(ctime(&t));
/* good until year 2000, but sloppy across year ends */
printf(")([^0-9,/ ]|$|/%c%c|",year(date1)[2],year(date1)[3]);
printf("([, ] *([^189 ]|1([^9]|$)|19[^89]|(19)?($|");
printf("%c%c|",year(date1)[2],year(date1)[3]);
printf("%c%c|",year(date2)[2],year(date2)[3]);
printf("[89]($|[^0-9])))))\n");
}
dayoff(tm)
register struct tm *tm;
{
struct hol *hol;
for(hol= holidays; hol<&holidays[NHOL]; hol++) {
if(hol->h_mon0 <= tm->tm_mon+1 &&
tm->tm_mon+1 <= hol->h_mon1 &&
hol->h_mday0 <= tm->tm_mday &&
tm->tm_mday <= hol->h_mday1 &&
hol->h_wday0 <= tm->tm_wday &&
tm->tm_wday <= hol->h_wday1 )
return(1);
}
return(0);
}