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