xref: /plan9/sys/src/cmd/strings.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include	<u.h>
23e12c5d1SDavid du Colombier #include 	<libc.h>
33e12c5d1SDavid du Colombier #include	<bio.h>
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier Biobuf	*fin;
63e12c5d1SDavid du Colombier Biobuf	fout;
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier #define	MINSPAN		6		/* Min characters in string */
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier #define BUFSIZE		70
113e12c5d1SDavid du Colombier 
123e12c5d1SDavid du Colombier void stringit(char *);
133e12c5d1SDavid du Colombier int isprint(Rune);
143e12c5d1SDavid du Colombier 
153e12c5d1SDavid du Colombier void
163e12c5d1SDavid du Colombier main(int argc, char **argv)
173e12c5d1SDavid du Colombier {
183e12c5d1SDavid du Colombier 	int i;
193e12c5d1SDavid du Colombier 
203e12c5d1SDavid du Colombier 	Binit(&fout, 1, OWRITE);
213e12c5d1SDavid du Colombier 	if(argc < 2) {
223e12c5d1SDavid du Colombier 		stringit("/fd/0");
233e12c5d1SDavid du Colombier 		exits(0);
243e12c5d1SDavid du Colombier 	}
253e12c5d1SDavid du Colombier 
263e12c5d1SDavid du Colombier 	for(i = 1; i < argc; i++) {
273e12c5d1SDavid du Colombier 		if(argc > 2)
283e12c5d1SDavid du Colombier 			print("%s:\n", argv[i]);
293e12c5d1SDavid du Colombier 
303e12c5d1SDavid du Colombier 		stringit(argv[i]);
313e12c5d1SDavid du Colombier 	}
323e12c5d1SDavid du Colombier 
333e12c5d1SDavid du Colombier 	exits(0);
343e12c5d1SDavid du Colombier }
353e12c5d1SDavid du Colombier 
363e12c5d1SDavid du Colombier void
373e12c5d1SDavid du Colombier stringit(char *str)
383e12c5d1SDavid du Colombier {
393e12c5d1SDavid du Colombier 	long posn, start;
403e12c5d1SDavid du Colombier 	int cnt = 0;
413e12c5d1SDavid du Colombier 	long c;
423e12c5d1SDavid du Colombier 
433e12c5d1SDavid du Colombier 	Rune buf[BUFSIZE];
443e12c5d1SDavid du Colombier 
453e12c5d1SDavid du Colombier 	if ((fin = Bopen(str, OREAD)) == 0) {
463e12c5d1SDavid du Colombier 		perror("open");
473e12c5d1SDavid du Colombier 		return;
483e12c5d1SDavid du Colombier 	}
493e12c5d1SDavid du Colombier 
503e12c5d1SDavid du Colombier 	start = 0;
51*219b2ee8SDavid du Colombier 	posn = BOFFSET(fin);
52*219b2ee8SDavid du Colombier 	while((c = Bgetrune(fin)) >= 0) {
533e12c5d1SDavid du Colombier 		if(isprint(c)) {
543e12c5d1SDavid du Colombier 			if(start == 0)
553e12c5d1SDavid du Colombier 				start = posn;
563e12c5d1SDavid du Colombier 			buf[cnt++] = c;
573e12c5d1SDavid du Colombier 			if(cnt == BUFSIZE-1) {
58*219b2ee8SDavid du Colombier 				buf[cnt] = 0;
593e12c5d1SDavid du Colombier 				Bprint(&fout, "%8d: %S ...\n", start, buf);
603e12c5d1SDavid du Colombier 				start = 0;
613e12c5d1SDavid du Colombier 				cnt = 0;
623e12c5d1SDavid du Colombier 			}
63*219b2ee8SDavid du Colombier 		} else {
64*219b2ee8SDavid du Colombier 			 if(cnt >= MINSPAN) {
653e12c5d1SDavid du Colombier 				buf[cnt] = 0;
663e12c5d1SDavid du Colombier 				Bprint(&fout, "%8d: %S\n", start, buf);
673e12c5d1SDavid du Colombier 			}
683e12c5d1SDavid du Colombier 			start = 0;
693e12c5d1SDavid du Colombier 			cnt = 0;
703e12c5d1SDavid du Colombier 		}
71*219b2ee8SDavid du Colombier 		posn = BOFFSET(fin);
723e12c5d1SDavid du Colombier 	}
733e12c5d1SDavid du Colombier 
74*219b2ee8SDavid du Colombier 	if(cnt >= MINSPAN){
753e12c5d1SDavid du Colombier 		buf[cnt] = 0;
763e12c5d1SDavid du Colombier 		Bprint(&fout, "%8d: %S\n", start, buf);
773e12c5d1SDavid du Colombier 	}
78*219b2ee8SDavid du Colombier 	Bterm(fin);
793e12c5d1SDavid du Colombier }
803e12c5d1SDavid du Colombier 
813e12c5d1SDavid du Colombier int
823e12c5d1SDavid du Colombier isprint(Rune r)
833e12c5d1SDavid du Colombier {
843e12c5d1SDavid du Colombier 	if ((r >= ' ' && r <0x7f) || r > 0xA0)
853e12c5d1SDavid du Colombier 		return 1;
863e12c5d1SDavid du Colombier 	else
873e12c5d1SDavid du Colombier 		return 0;
883e12c5d1SDavid du Colombier }
89