1: int in; 2: int i 0; 3: char buf[512]; 4: int *wd { 5: &buf[0]}; 6: char *fort[]{ 7: "function","subroutine","common","dimension","block","integer", 8: "real","data","double",0}; 9: char *asc[]{ 10: "sys","mov","tst","clr","jmp",0}; 11: char *c[]{ 12: "int","char","float","double","struct","extern",0}; 13: char *as[]{ 14: "globl","byte","even","text","data","bss","comm",0}; 15: int ibuf[260]; 16: main(argc, argv) 17: char **argv; 18: { 19: 20: while(argc > 1) { 21: printf("%s: ", argv[1]); 22: type(argv[1]); 23: argc--; 24: argv++; 25: } 26: } 27: 28: type(file) 29: char *file; 30: { 31: int j,nl; 32: char ch; 33: int mbuf[20]; 34: 35: if(stat(file, mbuf) < 0) { 36: printf("cannot stat\n"); 37: return; 38: } 39: switch(mbuf[2]&060000) { 40: 41: case 020000: 42: printf("character"); 43: goto spcl; 44: 45: case 040000: 46: printf("directory\n"); 47: return; 48: 49: case 060000: 50: printf("block"); 51: 52: spcl: 53: printf(" special (%d/%d)\n", 54: (mbuf[6]>>8)&0377, 55: mbuf[6]&0377); 56: return; 57: } 58: 59: ibuf[0] = open(file, 0); 60: if(ibuf[0] < 0) { 61: printf("cannot open\n"); 62: return; 63: } 64: in = read(ibuf[0], buf, 512); 65: switch(*wd) { 66: 67: case 0407: 68: printf("executable\n"); 69: goto out; 70: 71: case 0410: 72: printf("pure executable\n"); 73: goto out; 74: 75: case 0411: 76: printf("separate executable\n"); 77: goto out; 78: 79: case 0177555: 80: printf("archive\n"); 81: goto out; 82: } 83: 84: i = 0; 85: if(ccom() == 0)goto notc; 86: while(buf[i] == '#'){ 87: j = i; 88: while(buf[i++] != '\n'){ 89: if(i - j > 255){ 90: printf("data\n"); 91: goto out; 92: } 93: if(i >= in)goto notc; 94: } 95: if(ccom() == 0)goto notc; 96: } 97: check: 98: if(lookup(c) == 1){ 99: while((ch = buf[i++]) != ';' && ch != '{')if(i >= in)goto notc; 100: printf("c program"); 101: goto outa; 102: } 103: nl = 0; 104: while(buf[i] != '('){ 105: if(buf[i] <= 0){ 106: printf("data\n"); 107: goto out; 108: } 109: if(buf[i] == ';'){ 110: i++; 111: goto check; 112: } 113: if(buf[i++] == '\n') 114: if(nl++ > 6)goto notc; 115: if(i >= in)goto notc; 116: } 117: while(buf[i] != ')'){ 118: if(buf[i++] == '\n') 119: if(nl++ > 6)goto notc; 120: if(i >= in)goto notc; 121: } 122: while(buf[i] != '{'){ 123: if(buf[i++] == '\n') 124: if(nl++ > 6)goto notc; 125: if(i >= in)goto notc; 126: } 127: printf("c program"); 128: goto outa; 129: notc: 130: i = 0; 131: while(buf[i] == 'c' || buf[i] == '#'){ 132: while(buf[i++] != '\n')if(i >= in)goto notfort; 133: } 134: if(lookup(fort) == 1){ 135: printf("fortran"); 136: goto outa; 137: } 138: notfort: 139: i=0; 140: if(ascom() == 0)goto notas; 141: j = i-1; 142: if(buf[i] == '.'){ 143: i++; 144: if(lookup(as) == 1){ 145: printf("assembler program"); 146: goto outa; 147: } 148: else if(buf[j] == '\n'){ 149: printf("roff, nroff, or eqn input"); 150: goto outa; 151: } 152: } 153: while(lookup(asc) == 0){ 154: if(ascom() == 0)goto notas; 155: while(buf[i] != '\n' && buf[i++] != ':') 156: if(i >= in)goto notas; 157: while(buf[i] == '\n' || buf[i] == ' ' || buf[i] == '\t')if(i++ >= in)goto notas; 158: j = i-1; 159: if(buf[i] == '.'){ 160: i++; 161: if(lookup(as) == 1){ 162: printf("assembler program"); 163: goto outa; 164: } 165: else if(buf[j] == '\n'){ 166: printf("roff, nroff, or eqn input"); 167: goto outa; 168: } 169: } 170: } 171: printf("assembler program"); 172: goto outa; 173: notas: 174: for(i=0; i < in; i++)if(buf[i] <= 0){ 175: printf("data\n"); 176: goto out; 177: } 178: if((mbuf[2] & 00111) != 0) 179: printf("commands"); 180: else printf("probably text"); 181: outa: 182: while(i < in) 183: if(buf[i++] <= 0){ 184: printf(" with garbage\n"); 185: goto out; 186: } 187: while((in = read(ibuf[0],buf,512)) > 0) 188: for(i = 0; i < in; i++) 189: if(buf[i] <= 0){ 190: printf(" with garbage\n"); 191: goto out; 192: } 193: printf("\n"); 194: out: 195: close(ibuf[0]); 196: } 197: lookup(tab) 198: char *tab[]; 199: { 200: char r; 201: int k,j,l; 202: while(buf[i] == ' ' || buf[i] == '\t' || buf[i] == '\n')i++; 203: for(j=0; tab[j] != 0; j++){ 204: l=0; 205: for(k=i; ((r=tab[j][l++]) == buf[k] && r != '\0');k++); 206: if(r == '\0') 207: if(buf[k] == ' ' || buf[k] == '\n' || buf[k] == '\t' 208: || buf[k] == '{' || buf[k] == '/'){ 209: i=k; 210: return(1); 211: } 212: } 213: return(0); 214: } 215: ccom(){ 216: char cc; 217: while((cc = buf[i]) == ' ' || cc == '\t' || cc == '\n')if(i++ >= in)return(0); 218: if(buf[i] == '/' && buf[i+1] == '*'){ 219: i =+ 2; 220: while(buf[i] != '*' || buf[i+1] != '/'){ 221: if(buf[i] == '\\')i =+ 2; 222: else i++; 223: if(i >= in)return(0); 224: } 225: if((i =+ 2) >= in)return(0); 226: } 227: if(buf[i] == '\n')if(ccom() == 0)return(0); 228: return(1); 229: } 230: ascom(){ 231: while(buf[i] == '/'){ 232: i++; 233: while(buf[i++] != '\n')if(i >= in)return(0); 234: while(buf[i] == '\n')if(i++ >= in)return(0); 235: } 236: return(1); 237: }