/* * * file -- guess the type of file * * file now knows about: pascal objects * pascal programs * spitbol programs ('E.' format only) * packed files * dec object files (absolute loader) * shared data a.outs * new ar format */ 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", "unsigned", "static", 0 }; char *as[] { "globl", "byte", "even", "text", "data", "bss", "comm", 0 }; char *pas[] { "program", "begin", "procedure", "type", "var", "const", "end", "writeln", "function", 0 }; int ibuf[260]; main(argc, argv) char **argv; { extern fout; fout = dup(1); while(argc > 1) { printf("%s: ", argv[1]); type(argv[1]); flush(); argc--; argv++; } } type(file) char *file; { int j, nl; char ch; int mbuf[20]; if(stat(file, mbuf) == -1) { printf("can't 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] == -1) { printf("can't 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 0412: printf("shared data\n"); goto out; case 0177555: printf("archive (old format)\n"); goto out; case 0177545: printf("archive\n"); goto out; case 01: printf("absolute loader (dec)\n"); goto out; case 0404: printf("pascal object\n"); goto out; case 017437: printf("packed\n"); goto out; case 027105: printf("spitbol program\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] == '{') { while(buf[i++] != '}') if(i >= in) goto notpas; } if(lookup(pas) == 1) { printf("pascal program"); goto outa; } notpas: 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); }