|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)cal.c 4.4 (Berkeley) 87/05/28"; ! 3: #endif ! 4: ! 5: #include <sys/types.h> ! 6: #include <time.h> ! 7: #include <stdio.h> ! 8: ! 9: char dayw[] = { ! 10: " S M Tu W Th F S" ! 11: }; ! 12: char *smon[]= { ! 13: "January", "February", "March", "April", ! 14: "May", "June", "July", "August", ! 15: "September", "October", "November", "December", ! 16: }; ! 17: char string[432]; ! 18: main(argc, argv) ! 19: char *argv[]; ! 20: { ! 21: register y, i, j; ! 22: int m; ! 23: ! 24: if(argc == 2) ! 25: goto xlong; ! 26: /* ! 27: * print out just month ! 28: */ ! 29: if(argc < 2) { /* current month */ ! 30: time_t t; ! 31: struct tm *tm; ! 32: ! 33: t = time(0); ! 34: tm = localtime(&t); ! 35: m = tm->tm_mon + 1; ! 36: y = tm->tm_year + 1900; ! 37: } else { ! 38: m = atoi(argv[1]); ! 39: if(m<1 || m>12) { ! 40: fprintf(stderr, "cal: %s: Bad month.\n", argv[1]); ! 41: exit(1); ! 42: } ! 43: y = atoi(argv[2]); ! 44: if(y<1 || y>9999) { ! 45: fprintf(stderr, "cal: %s: Bad year.\n", argv[2]); ! 46: exit(2); ! 47: } ! 48: } ! 49: printf(" %s %u\n", smon[m-1], y); ! 50: printf("%s\n", dayw); ! 51: cal(m, y, string, 24); ! 52: for(i=0; i<6*24; i+=24) ! 53: pstr(string+i, 24); ! 54: exit(0); ! 55: ! 56: xlong: ! 57: /* ! 58: * print out complete year ! 59: */ ! 60: y = atoi(argv[1]); ! 61: if(y<1 || y>9999) { ! 62: fprintf(stderr, "cal: %s: Bad year.\n", argv[1]); ! 63: exit(2); ! 64: } ! 65: printf("\n\n\n"); ! 66: printf(" %u\n", y); ! 67: printf("\n"); ! 68: for(i=0; i<12; i+=3) { ! 69: for(j=0; j<6*72; j++) ! 70: string[j] = '\0'; ! 71: printf(" %.3s", smon[i]); ! 72: printf(" %.3s", smon[i+1]); ! 73: printf(" %.3s\n", smon[i+2]); ! 74: printf("%s %s %s\n", dayw, dayw, dayw); ! 75: cal(i+1, y, string, 72); ! 76: cal(i+2, y, string+23, 72); ! 77: cal(i+3, y, string+46, 72); ! 78: for(j=0; j<6*72; j+=72) ! 79: pstr(string+j, 72); ! 80: } ! 81: printf("\n\n\n"); ! 82: exit(0); ! 83: } ! 84: ! 85: pstr(str, n) ! 86: char *str; ! 87: { ! 88: register i; ! 89: register char *s; ! 90: ! 91: s = str; ! 92: i = n; ! 93: while(i--) ! 94: if(*s++ == '\0') ! 95: s[-1] = ' '; ! 96: i = n+1; ! 97: while(i--) ! 98: if(*--s != ' ') ! 99: break; ! 100: s[1] = '\0'; ! 101: printf("%s\n", str); ! 102: } ! 103: ! 104: char mon[] = { ! 105: 0, ! 106: 31, 29, 31, 30, ! 107: 31, 30, 31, 31, ! 108: 30, 31, 30, 31, ! 109: }; ! 110: ! 111: cal(m, y, p, w) ! 112: char *p; ! 113: { ! 114: register d, i; ! 115: register char *s; ! 116: ! 117: s = p; ! 118: d = jan1(y); ! 119: mon[2] = 29; ! 120: mon[9] = 30; ! 121: ! 122: switch((jan1(y+1)+7-d)%7) { ! 123: ! 124: /* ! 125: * non-leap year ! 126: */ ! 127: case 1: ! 128: mon[2] = 28; ! 129: break; ! 130: ! 131: /* ! 132: * 1752 ! 133: */ ! 134: default: ! 135: mon[9] = 19; ! 136: break; ! 137: ! 138: /* ! 139: * leap year ! 140: */ ! 141: case 2: ! 142: ; ! 143: } ! 144: for(i=1; i<m; i++) ! 145: d += mon[i]; ! 146: d %= 7; ! 147: s += 3*d; ! 148: for(i=1; i<=mon[m]; i++) { ! 149: if(i==3 && mon[m]==19) { ! 150: i += 11; ! 151: mon[m] += 11; ! 152: } ! 153: if(i > 9) ! 154: *s = i/10+'0'; ! 155: s++; ! 156: *s++ = i%10+'0'; ! 157: s++; ! 158: if(++d == 7) { ! 159: d = 0; ! 160: s = p+w; ! 161: p = s; ! 162: } ! 163: } ! 164: } ! 165: ! 166: /* ! 167: * return day of the week ! 168: * of jan 1 of given year ! 169: */ ! 170: ! 171: jan1(yr) ! 172: { ! 173: register y, d; ! 174: ! 175: /* ! 176: * normal gregorian calendar ! 177: * one extra day per four years ! 178: */ ! 179: ! 180: y = yr; ! 181: d = 4+y+(y+3)/4; ! 182: ! 183: /* ! 184: * julian calendar ! 185: * regular gregorian ! 186: * less three days per 400 ! 187: */ ! 188: ! 189: if(y > 1800) { ! 190: d -= (y-1701)/100; ! 191: d += (y-1601)/400; ! 192: } ! 193: ! 194: /* ! 195: * great calendar changeover instant ! 196: */ ! 197: ! 198: if(y > 1752) ! 199: d += 3; ! 200: ! 201: return(d%7); ! 202: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.