|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)file.c 4.8 (Berkeley) 8/11/83"; ! 3: #endif ! 4: /* ! 5: * file - determine type of file ! 6: */ ! 7: ! 8: #include <sys/types.h> ! 9: #include <sys/stat.h> ! 10: #include <stdio.h> ! 11: #include <ctype.h> ! 12: #include <a.out.h> ! 13: int errno; ! 14: char *sys_errlist[]; ! 15: int in; ! 16: int i = 0; ! 17: char buf[BUFSIZ]; ! 18: char *troff[] = { /* new troff intermediate lang */ ! 19: "x","T","res","init","font","202","V0","p1",0}; ! 20: char *fort[] = { ! 21: "function","subroutine","common","dimension","block","integer", ! 22: "real","data","double",0}; ! 23: char *asc[] = { ! 24: "chmk","mov","tst","clr","jmp",0}; ! 25: char *c[] = { ! 26: "int","char","float","double","struct","extern",0}; ! 27: char *as[] = { ! 28: "globl","byte","align","text","data","comm",0}; ! 29: int ifile; ! 30: ! 31: main(argc, argv) ! 32: char **argv; ! 33: { ! 34: FILE *fl; ! 35: register char *p; ! 36: char ap[128]; ! 37: extern char _sobuf[]; ! 38: ! 39: if (argc>1 && argv[1][0]=='-' && argv[1][1]=='f') { ! 40: if ((fl = fopen(argv[2], "r")) == NULL) { ! 41: perror(argv[2]); ! 42: exit(2); ! 43: } ! 44: while ((p = fgets(ap, 128, fl)) != NULL) { ! 45: int l = strlen(p); ! 46: if (l>0) ! 47: p[l-1] = '\0'; ! 48: printf("%s: ", p); ! 49: type(p); ! 50: if (ifile>=0) ! 51: close(ifile); ! 52: } ! 53: exit(1); ! 54: } ! 55: while(argc > 1) { ! 56: printf("%s: ", argv[1]); ! 57: type(argv[1]); ! 58: fflush(stdout); ! 59: argc--; ! 60: argv++; ! 61: if (ifile >= 0) ! 62: close(ifile); ! 63: } ! 64: } ! 65: ! 66: type(file) ! 67: char *file; ! 68: { ! 69: int j,nl; ! 70: char ch; ! 71: struct stat mbuf; ! 72: ! 73: ifile = -1; ! 74: if (lstat(file, &mbuf) < 0) { ! 75: printf("%s\n", sys_errlist[errno]); ! 76: return; ! 77: } ! 78: switch (mbuf.st_mode & S_IFMT) { ! 79: ! 80: case S_IFCHR: ! 81: printf("character"); ! 82: goto spcl; ! 83: ! 84: case S_IFLNK: ! 85: printf("symbolic link\n"); ! 86: return; ! 87: ! 88: case S_IFDIR: ! 89: printf("directory\n"); ! 90: return; ! 91: ! 92: case S_IFBLK: ! 93: printf("block"); ! 94: ! 95: spcl: ! 96: printf(" special (%d/%d)\n", major(mbuf.st_rdev), minor(mbuf.st_rdev)); ! 97: return; ! 98: } ! 99: ! 100: ifile = open(file, 0); ! 101: if(ifile < 0) { ! 102: printf("cannot open\n"); ! 103: return; ! 104: } ! 105: in = read(ifile, buf, BUFSIZ); ! 106: if(in == 0){ ! 107: printf("empty\n"); ! 108: return; ! 109: } ! 110: switch(*(int *)buf) { ! 111: ! 112: case 0413: ! 113: printf("demand paged "); ! 114: ! 115: case 0410: ! 116: printf("pure "); ! 117: goto exec; ! 118: ! 119: case 0411: ! 120: printf("jfr or pdp-11 unix 411 executable\n"); ! 121: return; ! 122: ! 123: case 0407: ! 124: exec: ! 125: printf("executable"); ! 126: if(((int *)buf)[4] != 0) { ! 127: printf(" not stripped"); ! 128: if(oldo(buf)) ! 129: printf(" (old format symbol table)"); ! 130: } ! 131: printf("\n"); ! 132: goto out; ! 133: ! 134: case 0177555: ! 135: printf("very old archive\n"); ! 136: goto out; ! 137: ! 138: case 0177545: ! 139: printf("old archive\n"); ! 140: goto out; ! 141: ! 142: case 070707: ! 143: printf("cpio data\n"); ! 144: goto out; ! 145: } ! 146: ! 147: if(strncmp(buf, "!<arch>\n__.SYMDEF", 17) == 0 ) { ! 148: printf("archive random library\n"); ! 149: goto out; ! 150: } ! 151: if (strncmp(buf, "!<arch>\n", 8)==0) { ! 152: printf("archive\n"); ! 153: goto out; ! 154: } ! 155: if (mbuf.st_size % 512 == 0) { /* it may be a PRESS file */ ! 156: lseek(ifile, -512L, 2); /* last block */ ! 157: if (read(ifile, buf, BUFSIZ) > 0 ! 158: && *(short int *)buf == 12138) { ! 159: printf("PRESS file\n"); ! 160: goto out; ! 161: } ! 162: } ! 163: i = 0; ! 164: if(ccom() == 0)goto notc; ! 165: while(buf[i] == '#'){ ! 166: j = i; ! 167: while(buf[i++] != '\n'){ ! 168: if(i - j > 255){ ! 169: printf("data\n"); ! 170: goto out; ! 171: } ! 172: if(i >= in)goto notc; ! 173: } ! 174: if(ccom() == 0)goto notc; ! 175: } ! 176: check: ! 177: if(lookup(c) == 1){ ! 178: while((ch = buf[i++]) != ';' && ch != '{')if(i >= in)goto notc; ! 179: printf("c program text"); ! 180: goto outa; ! 181: } ! 182: nl = 0; ! 183: while(buf[i] != '('){ ! 184: if(buf[i] <= 0) ! 185: goto notas; ! 186: if(buf[i] == ';'){ ! 187: i++; ! 188: goto check; ! 189: } ! 190: if(buf[i++] == '\n') ! 191: if(nl++ > 6)goto notc; ! 192: if(i >= in)goto notc; ! 193: } ! 194: while(buf[i] != ')'){ ! 195: if(buf[i++] == '\n') ! 196: if(nl++ > 6)goto notc; ! 197: if(i >= in)goto notc; ! 198: } ! 199: while(buf[i] != '{'){ ! 200: if(buf[i++] == '\n') ! 201: if(nl++ > 6)goto notc; ! 202: if(i >= in)goto notc; ! 203: } ! 204: printf("c program text"); ! 205: goto outa; ! 206: notc: ! 207: i = 0; ! 208: while(buf[i] == 'c' || buf[i] == '#'){ ! 209: while(buf[i++] != '\n')if(i >= in)goto notfort; ! 210: } ! 211: if(lookup(fort) == 1){ ! 212: printf("fortran program text"); ! 213: goto outa; ! 214: } ! 215: notfort: ! 216: i=0; ! 217: if(ascom() == 0)goto notas; ! 218: j = i-1; ! 219: if(buf[i] == '.'){ ! 220: i++; ! 221: if(lookup(as) == 1){ ! 222: printf("assembler program text"); ! 223: goto outa; ! 224: } ! 225: else if(buf[j] == '\n' && isalpha(buf[j+2])){ ! 226: printf("roff, nroff, or eqn input text"); ! 227: goto outa; ! 228: } ! 229: } ! 230: while(lookup(asc) == 0){ ! 231: if(ascom() == 0)goto notas; ! 232: while(buf[i] != '\n' && buf[i++] != ':') ! 233: if(i >= in)goto notas; ! 234: while(buf[i] == '\n' || buf[i] == ' ' || buf[i] == '\t')if(i++ >= in)goto notas; ! 235: j = i-1; ! 236: if(buf[i] == '.'){ ! 237: i++; ! 238: if(lookup(as) == 1){ ! 239: printf("assembler program text"); ! 240: goto outa; ! 241: } ! 242: else if(buf[j] == '\n' && isalpha(buf[j+2])){ ! 243: printf("roff, nroff, or eqn input text"); ! 244: goto outa; ! 245: } ! 246: } ! 247: } ! 248: printf("assembler program text"); ! 249: goto outa; ! 250: notas: ! 251: for(i=0; i < in; i++)if(buf[i]&0200){ ! 252: if (buf[0]=='\100' && buf[1]=='\357') { ! 253: printf("troff (CAT) output\n"); ! 254: goto out; ! 255: } ! 256: printf("data\n"); ! 257: goto out; ! 258: } ! 259: if (mbuf.st_mode&((S_IEXEC)|(S_IEXEC>>3)|(S_IEXEC>>6))) ! 260: printf("commands text"); ! 261: else if (troffint(buf, in)) ! 262: printf("troff intermediate output text"); ! 263: else if (english(buf, in)) ! 264: printf("English text"); ! 265: else ! 266: printf("ascii text"); ! 267: outa: ! 268: while(i < in) ! 269: if((buf[i++]&0377) > 127){ ! 270: printf(" with garbage\n"); ! 271: goto out; ! 272: } ! 273: /* if next few lines in then read whole file looking for nulls ... ! 274: while((in = read(ifile,buf,BUFSIZ)) > 0) ! 275: for(i = 0; i < in; i++) ! 276: if((buf[i]&0377) > 127){ ! 277: printf(" with garbage\n"); ! 278: goto out; ! 279: } ! 280: /*.... */ ! 281: printf("\n"); ! 282: out:; ! 283: } ! 284: ! 285: oldo(cp) ! 286: char *cp; ! 287: { ! 288: struct exec ex; ! 289: struct stat stb; ! 290: ! 291: ex = *(struct exec *)cp; ! 292: if (fstat(ifile, &stb) < 0) ! 293: return(0); ! 294: if (N_STROFF(ex)+sizeof(off_t) > stb.st_size) ! 295: return (1); ! 296: return (0); ! 297: } ! 298: ! 299: ! 300: ! 301: troffint(bp, n) ! 302: char *bp; ! 303: int n; ! 304: { ! 305: int k; ! 306: ! 307: i = 0; ! 308: for (k = 0; k < 6; k++) { ! 309: if (lookup(troff) == 0) ! 310: return(0); ! 311: if (lookup(troff) == 0) ! 312: return(0); ! 313: while (i < n && buf[i] != '\n') ! 314: i++; ! 315: if (i++ >= n) ! 316: return(0); ! 317: } ! 318: return(1); ! 319: } ! 320: lookup(tab) ! 321: char *tab[]; ! 322: { ! 323: char r; ! 324: int k,j,l; ! 325: while(buf[i] == ' ' || buf[i] == '\t' || buf[i] == '\n')i++; ! 326: for(j=0; tab[j] != 0; j++){ ! 327: l=0; ! 328: for(k=i; ((r=tab[j][l++]) == buf[k] && r != '\0');k++); ! 329: if(r == '\0') ! 330: if(buf[k] == ' ' || buf[k] == '\n' || buf[k] == '\t' ! 331: || buf[k] == '{' || buf[k] == '/'){ ! 332: i=k; ! 333: return(1); ! 334: } ! 335: } ! 336: return(0); ! 337: } ! 338: ccom(){ ! 339: char cc; ! 340: while((cc = buf[i]) == ' ' || cc == '\t' || cc == '\n')if(i++ >= in)return(0); ! 341: if(buf[i] == '/' && buf[i+1] == '*'){ ! 342: i += 2; ! 343: while(buf[i] != '*' || buf[i+1] != '/'){ ! 344: if(buf[i] == '\\')i += 2; ! 345: else i++; ! 346: if(i >= in)return(0); ! 347: } ! 348: if((i += 2) >= in)return(0); ! 349: } ! 350: if(buf[i] == '\n')if(ccom() == 0)return(0); ! 351: return(1); ! 352: } ! 353: ascom(){ ! 354: while(buf[i] == '/'){ ! 355: i++; ! 356: while(buf[i++] != '\n')if(i >= in)return(0); ! 357: while(buf[i] == '\n')if(i++ >= in)return(0); ! 358: } ! 359: return(1); ! 360: } ! 361: ! 362: english (bp, n) ! 363: char *bp; ! 364: { ! 365: # define NASC 128 ! 366: int ct[NASC], j, vow, freq, rare; ! 367: int badpun = 0, punct = 0; ! 368: if (n<50) return(0); /* no point in statistics on squibs */ ! 369: for(j=0; j<NASC; j++) ! 370: ct[j]=0; ! 371: for(j=0; j<n; j++) ! 372: { ! 373: if (bp[j]<NASC) ! 374: ct[bp[j]|040]++; ! 375: switch (bp[j]) ! 376: { ! 377: case '.': ! 378: case ',': ! 379: case ')': ! 380: case '%': ! 381: case ';': ! 382: case ':': ! 383: case '?': ! 384: punct++; ! 385: if ( j < n-1 && ! 386: bp[j+1] != ' ' && ! 387: bp[j+1] != '\n') ! 388: badpun++; ! 389: } ! 390: } ! 391: if (badpun*5 > punct) ! 392: return(0); ! 393: vow = ct['a'] + ct['e'] + ct['i'] + ct['o'] + ct['u']; ! 394: freq = ct['e'] + ct['t'] + ct['a'] + ct['i'] + ct['o'] + ct['n']; ! 395: rare = ct['v'] + ct['j'] + ct['k'] + ct['q'] + ct['x'] + ct['z']; ! 396: if (2*ct[';'] > ct['e']) return(0); ! 397: if ( (ct['>']+ct['<']+ct['/'])>ct['e']) return(0); /* shell file test */ ! 398: return (vow*5 >= n-ct[' '] && freq >= 10*rare); ! 399: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.