Created
July 10, 2012 16:30
-
-
Save niallo/3084482 to your computer and use it in GitHub Desktop.
"cal" program from V6 AT&T UNIX (release May 1975)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
char dayw[] | |
{ | |
" S M Tu W Th F S" | |
}; | |
char *smon[] | |
{ | |
"Jan", "Feb", "Mar", "Apr", | |
"May", "Jun", "Jul", "Aug", | |
"Sep", "Oct", "Nov", "Dec", | |
}; | |
char string[432]; | |
main(argc, argv) | |
char *argv[]; | |
{ | |
register y, i, j; | |
int m; | |
if(argc < 2) { | |
printf("usage: cal [month] year\n"); | |
exit(); | |
} | |
if(argc == 2) | |
goto xlong; | |
/* | |
* print out just month | |
*/ | |
m = number(argv[1]); | |
if(m<1 || m>12) | |
goto badarg; | |
y = number(argv[2]); | |
if(y<1 || y>9999) | |
goto badarg; | |
printf(" %s %l\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(); | |
/* | |
* print out complete year | |
*/ | |
xlong: | |
y = number(argv[1]); | |
if(y<1 || y>9999) | |
goto badarg; | |
printf("\n\n\n"); | |
printf(" %l\n", y); | |
printf("\n"); | |
for(i=0; i<12; i=+3) { | |
for(j=0; j<6*72; j++) | |
string[j] = '\0'; | |
printf(" %s", smon[i]); | |
printf(" %s", smon[i+1]); | |
printf(" %s\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(); | |
badarg: | |
printf("Bad argument\n"); | |
} | |
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) | |
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); | |
} | |
char mon[] | |
{ | |
0, | |
31, 29, 31, 30, | |
31, 30, 31, 31, | |
30, 31, 30, 31, | |
}; | |
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<m; i++) | |
d =+ mon[i]; | |
d =% 7; | |
s =+ 3*d; | |
for(i=1; i<=mon[m]; i++) { | |
if(i==3 & mon[m]==19) { | |
i =+ 11; | |
mon[m] =+ 11; | |
} | |
if(i > 9) | |
*s = i/10+'0'; | |
s++; | |
*s++ = i%10+'0'; | |
s++; | |
if(++d == 7) { | |
d = 0; | |
s = p+w; | |
p = s; | |
} | |
} | |
} | |
/* | |
* 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); | |
} |
Pre-STDLIB. Those were the days. Header files - who needs 'em?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
;-)