xref: /csrg-svn/usr.bin/strings/strings.c (revision 1105)
1*1105Sbill static char *sccsid = "@(#)strings.c	4.1 (Berkeley) 10/01/80";
2*1105Sbill #include <stdio.h>
3*1105Sbill #include <a.out.h>
4*1105Sbill #include <ctype.h>
5*1105Sbill 
6*1105Sbill long	ftell();
7*1105Sbill 
8*1105Sbill /*
9*1105Sbill  * strings
10*1105Sbill  */
11*1105Sbill 
12*1105Sbill struct	exec header;
13*1105Sbill 
14*1105Sbill char	*infile = "Standard input";
15*1105Sbill int	oflg;
16*1105Sbill int	asdata;
17*1105Sbill long	offset;
18*1105Sbill int	minlength = 4;
19*1105Sbill 
20*1105Sbill main(argc, argv)
21*1105Sbill 	int argc;
22*1105Sbill 	char *argv[];
23*1105Sbill {
24*1105Sbill 
25*1105Sbill 	argc--, argv++;
26*1105Sbill 	while (argc > 0 && argv[0][0] == '-') {
27*1105Sbill 		register int i;
28*1105Sbill 		if (argv[0][1] == 0)
29*1105Sbill 			asdata++;
30*1105Sbill 		else for (i = 1; argv[0][i] != 0; i++) switch (argv[0][i]) {
31*1105Sbill 
32*1105Sbill 		case 'o':
33*1105Sbill 			oflg++;
34*1105Sbill 			break;
35*1105Sbill 
36*1105Sbill 		case 'a':
37*1105Sbill 			asdata++;
38*1105Sbill 			break;
39*1105Sbill 
40*1105Sbill 		default:
41*1105Sbill 			if (!isdigit(argv[0][i])) {
42*1105Sbill 				fprintf(stderr, "Usage: strings [ -a ] [ -o ] [ -# ] [ file ... ]\n");
43*1105Sbill 				exit(1);
44*1105Sbill 			}
45*1105Sbill 			minlength = argv[0][i] - '0';
46*1105Sbill 			for (i++; isdigit(argv[0][i]); i++)
47*1105Sbill 				minlength = minlength * 10 + argv[0][i] - '0';
48*1105Sbill 			i--;
49*1105Sbill 			break;
50*1105Sbill 		}
51*1105Sbill 		argc--, argv++;
52*1105Sbill 	}
53*1105Sbill 	do {
54*1105Sbill 		if (argc > 0) {
55*1105Sbill 			if (freopen(argv[0], "r", stdin) == NULL) {
56*1105Sbill 				perror(argv[0]);
57*1105Sbill 				exit(1);
58*1105Sbill 			}
59*1105Sbill 			infile = argv[0];
60*1105Sbill 			argc--, argv++;
61*1105Sbill 		}
62*1105Sbill 		fseek(stdin, (long) 0, 0);
63*1105Sbill 		if (asdata ||
64*1105Sbill 		    fread((char *)&header, sizeof header, 1, stdin) != 1 ||
65*1105Sbill 		    N_BADMAG(header)) {
66*1105Sbill 			fseek(stdin, (long) 0, 0);
67*1105Sbill 			find((long) 100000000L);
68*1105Sbill 			continue;
69*1105Sbill 		}
70*1105Sbill 		fseek(stdin, (long) N_TXTOFF(header)+header.a_text, 1);
71*1105Sbill 		find((long) header.a_data);
72*1105Sbill 	} while (argc > 0);
73*1105Sbill }
74*1105Sbill 
75*1105Sbill find(cnt)
76*1105Sbill 	long cnt;
77*1105Sbill {
78*1105Sbill 	static char buf[BUFSIZ];
79*1105Sbill 	register char *cp;
80*1105Sbill 	register int c, cc;
81*1105Sbill 
82*1105Sbill 	cp = buf, cc = 0;
83*1105Sbill 	for (; cnt != 0; cnt--) {
84*1105Sbill 		c = getc(stdin);
85*1105Sbill 		if (c == '\n' || dirt(c) || cnt == 0) {
86*1105Sbill 			if (cp > buf && cp[-1] == '\n')
87*1105Sbill 				--cp;
88*1105Sbill 			*cp++ = 0;
89*1105Sbill 			if (cp > &buf[minlength]) {
90*1105Sbill 				if (oflg)
91*1105Sbill 					printf("%7D ", ftell(stdin) - cc - 1);
92*1105Sbill 				printf("%s\n", buf);
93*1105Sbill 			}
94*1105Sbill 			cp = buf, cc = 0;
95*1105Sbill 		} else {
96*1105Sbill 			if (cp < &buf[sizeof buf - 2])
97*1105Sbill 				*cp++ = c;
98*1105Sbill 			cc++;
99*1105Sbill 		}
100*1105Sbill 		if (ferror(stdin) || feof(stdin))
101*1105Sbill 			break;
102*1105Sbill 	}
103*1105Sbill }
104*1105Sbill 
105*1105Sbill dirt(c)
106*1105Sbill 	int c;
107*1105Sbill {
108*1105Sbill 
109*1105Sbill 	switch (c) {
110*1105Sbill 
111*1105Sbill 	case '\n':
112*1105Sbill 	case '\f':
113*1105Sbill 		return (0);
114*1105Sbill 
115*1105Sbill 	case 0177:
116*1105Sbill 		return (1);
117*1105Sbill 
118*1105Sbill 	default:
119*1105Sbill 		return (c > 0200 || c < ' ');
120*1105Sbill 	}
121*1105Sbill }
122