/* ============================================================================= calndr.c -- print a calendar Version 1 -- 1986-10-06 ============================================================================= */ #include char dayw[] = { " S M Tu W Th F S" }; char *smon[]= { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", }; char mon[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, }; char string[432]; extern struct tm *localtime(); extern long time(); struct tm *thetime; long timbuf; /* ============================================================================= main function for calndr command ============================================================================= */ main(argc, argv) char *argv[]; { register y, i, j; int m; switch(argc) { case 1: timbuf = time(&timbuf); thetime = localtime(&timbuf); m = thetime->tm_mon + 1; y = thetime->tm_year + 1900; break; case 2: goto xlong; case 3: m = number(argv[1]); y = number(argv[2]); break; default: printf("usage: calndr [ [month] year ]\n"); exit(0); } /* print out just month */ if(m<1 || m>12) goto badarg; if(y<1 || y>9999) goto badarg; printf(" %s %u\n\n", smon[m-1], y); printf("%s\n", dayw); cal(m, y, string, 24); for(i=0; i<6*24; i+=24) pstr(string+i, 24); exit(0); /* print out complete year */ xlong: y = number(argv[1]); if(y<1 || y>9999) goto badarg; printf("\n\n\n"); printf(" %u\n", y); printf("\n"); for(i=0; i<12; i+=3) { for(j=0; j<6*72; j++) string[j] = '\0'; printf(" %.3s", smon[i]); printf(" %.3s", smon[i+1]); printf(" %.3s\n", smon[i+2]); printf("%s %s %s\n", dayw, dayw, dayw); cal(i+1, y, string, 72); cal(i+2, y, string+23, 72); cal(i+3, y, string+46, 72); for(j=0; j<6*72; j+=72) pstr(string+j, 72); } printf("\n\n\n"); exit(0); badarg: printf("calndr: Bad argument\n"); exit(1); } /* ============================================================================= number(str) -- extract an integer from str ============================================================================= */ number(str) char *str; { register n, c; register char *s; n = 0; s = str; while(c = *s++) { if(c<'0' || c>'9') return(0); n = n*10 + c-'0'; } return(n); } /* ============================================================================= pstr(str, n) ============================================================================= */ pstr(str, n) char *str; { register i; register char *s; s = str; i = n; while(i--) if(*s++ == '\0') s[-1] = ' '; i = n+1; while(i--) if(*--s != ' ') break; s[1] = '\0'; printf("%s\n", str); } /* ============================================================================= cal(m, y, p, w) -- calculate calendar string ============================================================================= */ cal(m, y, p, w) char *p; { register d, i; register char *s; s = p; d = jan1(y); mon[2] = 29; mon[9] = 30; switch((jan1(y+1)+7-d)%7) { /* * non-leap year */ case 1: mon[2] = 28; break; /* * 1752 */ default: mon[9] = 19; break; /* * leap year */ case 2: ; } for(i=1; i 9) *s = i/10+'0'; s++; *s++ = i%10+'0'; s++; if(++d == 7) { d = 0; s = p+w; p = s; } } } /* ============================================================================= jan1(yr) -- return day of the week of jan 1 of given year ============================================================================= */ jan1(yr) { register y, d; /* normal gregorian calendar -- one extra day per four years */ y = yr; d = 4+y+(y+3)/4; /* julian calendar -- regular gregorian less three days per 400 */ if(y > 1800) { d -= (y-1701)/100; d += (y-1601)/400; } /* great calendar changeover instant */ if(y > 1752) d += 3; return(d%7); }