MiniUnix/usr/source/s1/file.c
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);
}