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