Add original unix v6
This commit is contained in:
@@ -0,0 +1,237 @@
|
||||
int in;
|
||||
int i 0;
|
||||
char buf[512];
|
||||
int *wd {
|
||||
&buf[0]};
|
||||
char *fort[]{
|
||||
"function","subroutine","common","dimension","block","integer",
|
||||
"real","data","double",0};
|
||||
char *asc[]{
|
||||
"sys","mov","tst","clr","jmp",0};
|
||||
char *c[]{
|
||||
"int","char","float","double","struct","extern",0};
|
||||
char *as[]{
|
||||
"globl","byte","even","text","data","bss","comm",0};
|
||||
int ibuf[260];
|
||||
main(argc, argv)
|
||||
char **argv;
|
||||
{
|
||||
|
||||
while(argc > 1) {
|
||||
printf("%s: ", argv[1]);
|
||||
type(argv[1]);
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
}
|
||||
|
||||
type(file)
|
||||
char *file;
|
||||
{
|
||||
int j,nl;
|
||||
char ch;
|
||||
int mbuf[20];
|
||||
|
||||
if(stat(file, mbuf) < 0) {
|
||||
printf("cannot stat\n");
|
||||
return;
|
||||
}
|
||||
switch(mbuf[2]&060000) {
|
||||
|
||||
case 020000:
|
||||
printf("character");
|
||||
goto spcl;
|
||||
|
||||
case 040000:
|
||||
printf("directory\n");
|
||||
return;
|
||||
|
||||
case 060000:
|
||||
printf("block");
|
||||
|
||||
spcl:
|
||||
printf(" special (%d/%d)\n",
|
||||
(mbuf[6]>>8)&0377,
|
||||
mbuf[6]&0377);
|
||||
return;
|
||||
}
|
||||
|
||||
ibuf[0] = open(file, 0);
|
||||
if(ibuf[0] < 0) {
|
||||
printf("cannot open\n");
|
||||
return;
|
||||
}
|
||||
in = read(ibuf[0], buf, 512);
|
||||
switch(*wd) {
|
||||
|
||||
case 0407:
|
||||
printf("executable\n");
|
||||
goto out;
|
||||
|
||||
case 0410:
|
||||
printf("pure executable\n");
|
||||
goto out;
|
||||
|
||||
case 0411:
|
||||
printf("separate executable\n");
|
||||
goto out;
|
||||
|
||||
case 0177555:
|
||||
printf("archive\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
if(ccom() == 0)goto notc;
|
||||
while(buf[i] == '#'){
|
||||
j = i;
|
||||
while(buf[i++] != '\n'){
|
||||
if(i - j > 255){
|
||||
printf("data\n");
|
||||
goto out;
|
||||
}
|
||||
if(i >= in)goto notc;
|
||||
}
|
||||
if(ccom() == 0)goto notc;
|
||||
}
|
||||
check:
|
||||
if(lookup(c) == 1){
|
||||
while((ch = buf[i++]) != ';' && ch != '{')if(i >= in)goto notc;
|
||||
printf("c program");
|
||||
goto outa;
|
||||
}
|
||||
nl = 0;
|
||||
while(buf[i] != '('){
|
||||
if(buf[i] <= 0){
|
||||
printf("data\n");
|
||||
goto out;
|
||||
}
|
||||
if(buf[i] == ';'){
|
||||
i++;
|
||||
goto check;
|
||||
}
|
||||
if(buf[i++] == '\n')
|
||||
if(nl++ > 6)goto notc;
|
||||
if(i >= in)goto notc;
|
||||
}
|
||||
while(buf[i] != ')'){
|
||||
if(buf[i++] == '\n')
|
||||
if(nl++ > 6)goto notc;
|
||||
if(i >= in)goto notc;
|
||||
}
|
||||
while(buf[i] != '{'){
|
||||
if(buf[i++] == '\n')
|
||||
if(nl++ > 6)goto notc;
|
||||
if(i >= in)goto notc;
|
||||
}
|
||||
printf("c program");
|
||||
goto outa;
|
||||
notc:
|
||||
i = 0;
|
||||
while(buf[i] == 'c' || buf[i] == '#'){
|
||||
while(buf[i++] != '\n')if(i >= in)goto notfort;
|
||||
}
|
||||
if(lookup(fort) == 1){
|
||||
printf("fortran");
|
||||
goto outa;
|
||||
}
|
||||
notfort:
|
||||
i=0;
|
||||
if(ascom() == 0)goto notas;
|
||||
j = i-1;
|
||||
if(buf[i] == '.'){
|
||||
i++;
|
||||
if(lookup(as) == 1){
|
||||
printf("assembler program");
|
||||
goto outa;
|
||||
}
|
||||
else if(buf[j] == '\n'){
|
||||
printf("roff, nroff, or eqn input");
|
||||
goto outa;
|
||||
}
|
||||
}
|
||||
while(lookup(asc) == 0){
|
||||
if(ascom() == 0)goto notas;
|
||||
while(buf[i] != '\n' && buf[i++] != ':')
|
||||
if(i >= in)goto notas;
|
||||
while(buf[i] == '\n' || buf[i] == ' ' || buf[i] == '\t')if(i++ >= in)goto notas;
|
||||
j = i-1;
|
||||
if(buf[i] == '.'){
|
||||
i++;
|
||||
if(lookup(as) == 1){
|
||||
printf("assembler program");
|
||||
goto outa;
|
||||
}
|
||||
else if(buf[j] == '\n'){
|
||||
printf("roff, nroff, or eqn input");
|
||||
goto outa;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("assembler program");
|
||||
goto outa;
|
||||
notas:
|
||||
for(i=0; i < in; i++)if(buf[i] <= 0){
|
||||
printf("data\n");
|
||||
goto out;
|
||||
}
|
||||
if((mbuf[2] & 00111) != 0)
|
||||
printf("commands");
|
||||
else printf("probably text");
|
||||
outa:
|
||||
while(i < in)
|
||||
if(buf[i++] <= 0){
|
||||
printf(" with garbage\n");
|
||||
goto out;
|
||||
}
|
||||
while((in = read(ibuf[0],buf,512)) > 0)
|
||||
for(i = 0; i < in; i++)
|
||||
if(buf[i] <= 0){
|
||||
printf(" with garbage\n");
|
||||
goto out;
|
||||
}
|
||||
printf("\n");
|
||||
out:
|
||||
close(ibuf[0]);
|
||||
}
|
||||
lookup(tab)
|
||||
char *tab[];
|
||||
{
|
||||
char r;
|
||||
int k,j,l;
|
||||
while(buf[i] == ' ' || buf[i] == '\t' || buf[i] == '\n')i++;
|
||||
for(j=0; tab[j] != 0; j++){
|
||||
l=0;
|
||||
for(k=i; ((r=tab[j][l++]) == buf[k] && r != '\0');k++);
|
||||
if(r == '\0')
|
||||
if(buf[k] == ' ' || buf[k] == '\n' || buf[k] == '\t'
|
||||
|| buf[k] == '{' || buf[k] == '/'){
|
||||
i=k;
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
ccom(){
|
||||
char cc;
|
||||
while((cc = buf[i]) == ' ' || cc == '\t' || cc == '\n')if(i++ >= in)return(0);
|
||||
if(buf[i] == '/' && buf[i+1] == '*'){
|
||||
i =+ 2;
|
||||
while(buf[i] != '*' || buf[i+1] != '/'){
|
||||
if(buf[i] == '\\')i =+ 2;
|
||||
else i++;
|
||||
if(i >= in)return(0);
|
||||
}
|
||||
if((i =+ 2) >= in)return(0);
|
||||
}
|
||||
if(buf[i] == '\n')if(ccom() == 0)return(0);
|
||||
return(1);
|
||||
}
|
||||
ascom(){
|
||||
while(buf[i] == '/'){
|
||||
i++;
|
||||
while(buf[i++] != '\n')if(i >= in)return(0);
|
||||
while(buf[i] == '\n')if(i++ >= in)return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
Reference in New Issue
Block a user