[net.sources] calendar program

silvert@dalcs.UUCP (Bill Silvert) (04/24/85)

This program prints a calendar sheet starting on any Sunday for any number
of weeks, with user-selectable width and length.  For example --
 Sunday     Monday     Tuesday    Wednesday  Thursday   Friday     Saturday  
|----------|----------|----------|----------|----------|----------|----------|
| Apr. 28  | Apr. 29  | Apr. 30  | May.  1  | May.  2  | May.  3  | May.  4  |
|          |          |          |          |          |          |          |
|----------|----------|----------|----------|----------|----------|----------|
| May.  5  | May.  6  | May.  7  | May.  8  | May.  9  | May. 10  | May. 11  |
|          |          |          |          |          |          |          |
|----------|----------|----------|----------|----------|----------|----------|
-------------------------cut here----------------------------------
cat >calform.c << xxCALxx
/* program to create calendar forms of various widths -- W. Silvert */
static char SCCSID[] = "@(#)calform.c	Ver. 1.4, 85/03/04 13:33:47";
struct months {
	char *name;
	int length;
} m[] = {	/* months mod 12 */
	"December",31,
	"January",31,
	"February",28,
	"March",31,
	"April",30,
	"May",31,
	"June",30,
	"July",31,
	"August",31,
	"September",30,
	"October",31,
	"November",30
};
char *week[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
/* Formatting information */
#define WEEK	" %-9s%s"
#define BAR	"|---------%s"
#define SPACE	"|         %s"
#define DLINE	"| %.3s. %2d %s"
#define ENDLIN	"|\n"
char *fill[]={""," ","  ","   ","    ","     ","      ","       ","        "};
char *rill[]={"","-","--","---","----","-----","------","-------","--------"};
int argint[3], month, nlines; /* argint={month, day, nweeks} */
int length=62, width=1; /* default length and width */
main(argc,argv)
	int argc;
	char *argv[];
{
	int index=2 ;
	char c;
	if(argc < 4) {	/* error processing */
		printf("Usage: %s [-lnn] [-wnn] [-L] month day #weeks\n",
				argv[0]);
		exit();
	}
	/* process arguments for -l and -w here */
	while(--argc > 0) {
		switch(c = argv[argc][0]) {
		case '-':	/* flag */
			switch(c = argv[argc][1]) {
			case 'l':	/* next part of argument is length */
				length=atoi(argv[argc]+2);
				break;
			case 'w':	/* next part of argument is width */
				width=atoi(argv[argc]+2);
				width=(width - 71)/7;
				if(width < 0 || width >8) {
					printf("Illegal width\n");
					exit(1);
				}
				break;
			case 'L':	/* leap year correction */
				m[2].length=29;
				break;
			default:
				printf("Unknown flag %s\n",argv[argc]);
				exit(1);
			}
			break;
		default:	/* should test for digits here */
			argint[index]=atoi(argv[argc]);
			if(index-- < 0) {
				printf("Too many arguments\n");
				exit(1);
			}
			break;
		}
	}
	month = argint[0] % 12 ;
	nlines = (length - 2) / argint[2] ;
	do_top(); /* print header and first bar */
	while(argint[2]-- > 0) { /* main loop */
		do_date();
		do_fill(nlines);
		do_bar();
	}
}
do_top() /* printer header with days of week */
{
	int i;
	for(i=0;i<7;printf(WEEK,week[i++],fill[width]));
	printf("\n");
	do_bar();
	return;
}
do_date() /* enter row of dates */
{
	int i;
	for (i=0;i++ <7;) {
		printf(DLINE,m[month].name,argint[1]++,fill[width]);
		if(argint[1] > m[month].length) {
			argint[1]=1;
			month= ++month % 12;
		}
	}
	printf(ENDLIN);
	return;
}
do_fill(n) /* print n-2 blank lines */
	int n;
{
	int i;
	while(n-- > 2) {
		for(i=0;i++<7;printf(SPACE,fill[width]));
		printf(ENDLIN);
	}
	return;
}
do_bar() /* draw a bar across */
{
	int i;
	for(i=0;i++<7;printf(BAR,rill[width]));
	printf(ENDLIN);
	return;
}
xxCALxx
-- 
Bill Silvert
Marine Ecology Lab.
Dartmouth, NS
dalcs!biomel!bill