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