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