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