|
|
1.1 ! root 1: /* ! 2: * determine type of file ! 3: */ ! 4: ! 5: #include <sys/param.h> ! 6: #include <sys/stat.h> ! 7: #include <stdio.h> ! 8: #include <ctype.h> ! 9: int in; ! 10: int i = 0; ! 11: char buf[512]; ! 12: char *fort[] = { ! 13: "function","subroutine","common","dimension","block","integer", ! 14: "real","data","double",0}; ! 15: char *asc[] = { ! 16: "chmk","mov","tst","clr","jmp",0}; ! 17: char *c[] = { ! 18: "int","char","float","double","struct","extern",0}; ! 19: char *as[] = { ! 20: "globl","byte","align","text","data","comm",0}; ! 21: int ifile; ! 22: ! 23: main(argc, argv) ! 24: char **argv; ! 25: { ! 26: FILE *fl; ! 27: register char *p; ! 28: char ap[128]; ! 29: ! 30: if (argc>1 && argv[1][0]=='-' && argv[1][1]=='f') { ! 31: if ((fl = fopen(argv[2], "r")) == NULL) { ! 32: printf("Can't open %s\n", argv[2]); ! 33: exit(2); ! 34: } ! 35: while ((p = fgets(ap, 128, fl)) != NULL) { ! 36: int l = strlen(p); ! 37: if (l>0) ! 38: p[l-1] = '\0'; ! 39: printf("%s: ", p); ! 40: type(p); ! 41: if (ifile>=0) ! 42: close(ifile); ! 43: } ! 44: exit(1); ! 45: } ! 46: while(argc > 1) { ! 47: printf("%s: ", argv[1]); ! 48: type(argv[1]); ! 49: argc--; ! 50: argv++; ! 51: if (ifile >= 0) ! 52: close(ifile); ! 53: } ! 54: } ! 55: ! 56: type(file) ! 57: char *file; ! 58: { ! 59: int j,nl; ! 60: char ch; ! 61: struct stat mbuf; ! 62: ! 63: ifile = -1; ! 64: if(stat(file, &mbuf) < 0) { ! 65: printf("cannot stat\n"); ! 66: return; ! 67: } ! 68: switch (mbuf.st_mode & S_IFMT) { ! 69: ! 70: case S_IFCHR: ! 71: printf("character"); ! 72: goto spcl; ! 73: ! 74: case S_IFDIR: ! 75: printf("directory\n"); ! 76: return; ! 77: ! 78: case S_IFBLK: ! 79: printf("block"); ! 80: ! 81: spcl: ! 82: printf(" special (%d/%d)\n", major(mbuf.st_rdev), minor(mbuf.st_rdev)); ! 83: return; ! 84: } ! 85: ! 86: ifile = open(file, 0); ! 87: if(ifile < 0) { ! 88: printf("cannot open\n"); ! 89: return; ! 90: } ! 91: in = read(ifile, buf, 512); ! 92: if(in == 0){ ! 93: printf("empty\n"); ! 94: return; ! 95: } ! 96: switch(*(int *)buf) { ! 97: ! 98: case 0413: ! 99: printf("demand paged "); ! 100: case 0410: ! 101: printf("pure "); ! 102: goto exec; ! 103: ! 104: case 0412: ! 105: printf("demand paged "); ! 106: goto exec; ! 107: ! 108: case 0411: ! 109: printf("separate "); ! 110: ! 111: case 0407: ! 112: exec: ! 113: printf("executable"); ! 114: if(((int *)buf)[4] != 0) ! 115: printf(" not stripped"); ! 116: printf("\n"); ! 117: goto out; ! 118: ! 119: case 0177555: ! 120: printf("old archive\n"); ! 121: goto out; ! 122: ! 123: case 0177545: ! 124: printf("archive\n"); ! 125: goto out; ! 126: } ! 127: ! 128: i = 0; ! 129: if(ccom() == 0)goto notc; ! 130: while(buf[i] == '#'){ ! 131: j = i; ! 132: while(buf[i++] != '\n'){ ! 133: if(i - j > 255){ ! 134: printf("data\n"); ! 135: goto out; ! 136: } ! 137: if(i >= in)goto notc; ! 138: } ! 139: if(ccom() == 0)goto notc; ! 140: } ! 141: check: ! 142: if(lookup(c) == 1){ ! 143: while((ch = buf[i++]) != ';' && ch != '{')if(i >= in)goto notc; ! 144: printf("c program text"); ! 145: goto outa; ! 146: } ! 147: nl = 0; ! 148: while(buf[i] != '('){ ! 149: if(buf[i] <= 0) ! 150: goto notas; ! 151: if(buf[i] == ';'){ ! 152: i++; ! 153: goto check; ! 154: } ! 155: if(buf[i++] == '\n') ! 156: if(nl++ > 6)goto notc; ! 157: if(i >= in)goto notc; ! 158: } ! 159: while(buf[i] != ')'){ ! 160: if(buf[i++] == '\n') ! 161: if(nl++ > 6)goto notc; ! 162: if(i >= in)goto notc; ! 163: } ! 164: while(buf[i] != '{'){ ! 165: if(buf[i++] == '\n') ! 166: if(nl++ > 6)goto notc; ! 167: if(i >= in)goto notc; ! 168: } ! 169: printf("c program text"); ! 170: goto outa; ! 171: notc: ! 172: i = 0; ! 173: while(buf[i] == 'c' || buf[i] == '#'){ ! 174: while(buf[i++] != '\n')if(i >= in)goto notfort; ! 175: } ! 176: if(lookup(fort) == 1){ ! 177: printf("fortran program text"); ! 178: goto outa; ! 179: } ! 180: notfort: ! 181: i=0; ! 182: if(ascom() == 0)goto notas; ! 183: j = i-1; ! 184: if(buf[i] == '.'){ ! 185: i++; ! 186: if(lookup(as) == 1){ ! 187: printf("assembler program text"); ! 188: goto outa; ! 189: } ! 190: else if(buf[j] == '\n' && isalpha(buf[j+2])){ ! 191: printf("roff, nroff, or eqn input text"); ! 192: goto outa; ! 193: } ! 194: } ! 195: while(lookup(asc) == 0){ ! 196: if(ascom() == 0)goto notas; ! 197: while(buf[i] != '\n' && buf[i++] != ':') ! 198: if(i >= in)goto notas; ! 199: while(buf[i] == '\n' || buf[i] == ' ' || buf[i] == '\t')if(i++ >= in)goto notas; ! 200: j = i-1; ! 201: if(buf[i] == '.'){ ! 202: i++; ! 203: if(lookup(as) == 1){ ! 204: printf("assembler program text"); ! 205: goto outa; ! 206: } ! 207: else if(buf[j] == '\n' && isalpha(buf[j+2])){ ! 208: printf("roff, nroff, or eqn input text"); ! 209: goto outa; ! 210: } ! 211: } ! 212: } ! 213: printf("assembler program text"); ! 214: goto outa; ! 215: notas: ! 216: for(i=0; i < in; i++)if(buf[i]&0200){ ! 217: if (buf[0]=='\100' && buf[1]=='\357') { ! 218: printf("troff output\n"); ! 219: goto out; ! 220: } ! 221: printf("data\n"); ! 222: goto out; ! 223: } ! 224: if (mbuf.st_mode&((S_IEXEC)|(S_IEXEC>>3)|(S_IEXEC>>6))) ! 225: printf("commands text"); ! 226: else ! 227: if (english(buf, in)) ! 228: printf("English text"); ! 229: else ! 230: printf("ascii text"); ! 231: outa: ! 232: while(i < in) ! 233: if((buf[i++]&0377) > 127){ ! 234: printf(" with garbage\n"); ! 235: goto out; ! 236: } ! 237: /* if next few lines in then read whole file looking for nulls ... ! 238: while((in = read(ifile,buf,512)) > 0) ! 239: for(i = 0; i < in; i++) ! 240: if((buf[i]&0377) > 127){ ! 241: printf(" with garbage\n"); ! 242: goto out; ! 243: } ! 244: /*.... */ ! 245: printf("\n"); ! 246: out:; ! 247: } ! 248: lookup(tab) ! 249: char *tab[]; ! 250: { ! 251: char r; ! 252: int k,j,l; ! 253: while(buf[i] == ' ' || buf[i] == '\t' || buf[i] == '\n')i++; ! 254: for(j=0; tab[j] != 0; j++){ ! 255: l=0; ! 256: for(k=i; ((r=tab[j][l++]) == buf[k] && r != '\0');k++); ! 257: if(r == '\0') ! 258: if(buf[k] == ' ' || buf[k] == '\n' || buf[k] == '\t' ! 259: || buf[k] == '{' || buf[k] == '/'){ ! 260: i=k; ! 261: return(1); ! 262: } ! 263: } ! 264: return(0); ! 265: } ! 266: ccom(){ ! 267: char cc; ! 268: while((cc = buf[i]) == ' ' || cc == '\t' || cc == '\n')if(i++ >= in)return(0); ! 269: if(buf[i] == '/' && buf[i+1] == '*'){ ! 270: i += 2; ! 271: while(buf[i] != '*' || buf[i+1] != '/'){ ! 272: if(buf[i] == '\\')i += 2; ! 273: else i++; ! 274: if(i >= in)return(0); ! 275: } ! 276: if((i += 2) >= in)return(0); ! 277: } ! 278: if(buf[i] == '\n')if(ccom() == 0)return(0); ! 279: return(1); ! 280: } ! 281: ascom(){ ! 282: while(buf[i] == '/'){ ! 283: i++; ! 284: while(buf[i++] != '\n')if(i >= in)return(0); ! 285: while(buf[i] == '\n')if(i++ >= in)return(0); ! 286: } ! 287: return(1); ! 288: } ! 289: ! 290: english (bp, n) ! 291: char *bp; ! 292: { ! 293: # define NASC 128 ! 294: int ct[NASC], j, vow, freq, rare; ! 295: int badpun = 0, punct = 0; ! 296: if (n<50) return(0); /* no point in statistics on squibs */ ! 297: for(j=0; j<NASC; j++) ! 298: ct[j]=0; ! 299: for(j=0; j<n; j++) ! 300: { ! 301: if (bp[j]<NASC) ! 302: ct[bp[j]|040]++; ! 303: switch (bp[j]) ! 304: { ! 305: case '.': ! 306: case ',': ! 307: case ')': ! 308: case '%': ! 309: case ';': ! 310: case ':': ! 311: case '?': ! 312: punct++; ! 313: if ( j < n-1 && ! 314: bp[j+1] != ' ' && ! 315: bp[j+1] != '\n') ! 316: badpun++; ! 317: } ! 318: } ! 319: if (badpun*5 > punct) ! 320: return(0); ! 321: vow = ct['a'] + ct['e'] + ct['i'] + ct['o'] + ct['u']; ! 322: freq = ct['e'] + ct['t'] + ct['a'] + ct['i'] + ct['o'] + ct['n']; ! 323: rare = ct['v'] + ct['j'] + ct['k'] + ct['q'] + ct['x'] + ct['z']; ! 324: if (2*ct[';'] > ct['e']) return(0); ! 325: if ( (ct['>']+ct['<']+ct['/'])>ct['e']) return(0); /* shell file test */ ! 326: return (vow*5 >= n-ct[' '] && freq >= 10*rare); ! 327: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.