xref: /plan9/sys/src/cmd/strings.c (revision 07a7a51ed4816825cfa938d1d3cb2d6f02fe1284)
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 
8*07a7a51eSDavid du Colombier #define	MINSPAN		6		/* Min characters in string (default) */
93e12c5d1SDavid du Colombier #define BUFSIZE		70
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier void stringit(char *);
123e12c5d1SDavid du Colombier int isprint(Rune);
133e12c5d1SDavid du Colombier 
14*07a7a51eSDavid du Colombier static int minspan = MINSPAN;
15*07a7a51eSDavid du Colombier 
16*07a7a51eSDavid du Colombier static void
usage(void)17*07a7a51eSDavid du Colombier usage(void)
18*07a7a51eSDavid du Colombier {
19*07a7a51eSDavid du Colombier 	fprint(2, "usage: %s [-m min] [file...]\n", argv0);
20*07a7a51eSDavid du Colombier 	exits("usage");
21*07a7a51eSDavid du Colombier }
22*07a7a51eSDavid du Colombier 
233e12c5d1SDavid du Colombier void
main(int argc,char ** argv)243e12c5d1SDavid du Colombier main(int argc, char **argv)
253e12c5d1SDavid du Colombier {
263e12c5d1SDavid du Colombier 	int i;
273e12c5d1SDavid du Colombier 
28*07a7a51eSDavid du Colombier 	ARGBEGIN{
29*07a7a51eSDavid du Colombier 	case 'm':
30*07a7a51eSDavid du Colombier 		minspan = atoi(EARGF(usage()));
31*07a7a51eSDavid du Colombier 		break;
32*07a7a51eSDavid du Colombier 	default:
33*07a7a51eSDavid du Colombier 		usage();
34*07a7a51eSDavid du Colombier 		break;
35*07a7a51eSDavid du Colombier 	}ARGEND
363e12c5d1SDavid du Colombier 	Binit(&fout, 1, OWRITE);
37*07a7a51eSDavid du Colombier 	if(argc < 1) {
383e12c5d1SDavid du Colombier 		stringit("/fd/0");
393e12c5d1SDavid du Colombier 		exits(0);
403e12c5d1SDavid du Colombier 	}
413e12c5d1SDavid du Colombier 
42*07a7a51eSDavid du Colombier 	for(i = 0; i < argc; i++) {
433e12c5d1SDavid du Colombier 		if(argc > 2)
443e12c5d1SDavid du Colombier 			print("%s:\n", argv[i]);
453e12c5d1SDavid du Colombier 
463e12c5d1SDavid du Colombier 		stringit(argv[i]);
473e12c5d1SDavid du Colombier 	}
483e12c5d1SDavid du Colombier 
493e12c5d1SDavid du Colombier 	exits(0);
503e12c5d1SDavid du Colombier }
513e12c5d1SDavid du Colombier 
523e12c5d1SDavid du Colombier void
stringit(char * str)533e12c5d1SDavid du Colombier stringit(char *str)
543e12c5d1SDavid du Colombier {
553e12c5d1SDavid du Colombier 	long posn, start;
563e12c5d1SDavid du Colombier 	int cnt = 0;
573e12c5d1SDavid du Colombier 	long c;
583e12c5d1SDavid du Colombier 
593e12c5d1SDavid du Colombier 	Rune buf[BUFSIZE];
603e12c5d1SDavid du Colombier 
613e12c5d1SDavid du Colombier 	if ((fin = Bopen(str, OREAD)) == 0) {
623e12c5d1SDavid du Colombier 		perror("open");
633e12c5d1SDavid du Colombier 		return;
643e12c5d1SDavid du Colombier 	}
653e12c5d1SDavid du Colombier 
663e12c5d1SDavid du Colombier 	start = 0;
677dd7cddfSDavid du Colombier 	posn = Boffset(fin);
68219b2ee8SDavid du Colombier 	while((c = Bgetrune(fin)) >= 0) {
693e12c5d1SDavid du Colombier 		if(isprint(c)) {
703e12c5d1SDavid du Colombier 			if(start == 0)
713e12c5d1SDavid du Colombier 				start = posn;
723e12c5d1SDavid du Colombier 			buf[cnt++] = c;
733e12c5d1SDavid du Colombier 			if(cnt == BUFSIZE-1) {
74219b2ee8SDavid du Colombier 				buf[cnt] = 0;
757dd7cddfSDavid du Colombier 				Bprint(&fout, "%8ld: %S ...\n", start, buf);
763e12c5d1SDavid du Colombier 				start = 0;
773e12c5d1SDavid du Colombier 				cnt = 0;
783e12c5d1SDavid du Colombier 			}
79219b2ee8SDavid du Colombier 		} else {
80*07a7a51eSDavid du Colombier 			 if(cnt >= minspan) {
813e12c5d1SDavid du Colombier 				buf[cnt] = 0;
827dd7cddfSDavid du Colombier 				Bprint(&fout, "%8ld: %S\n", start, buf);
833e12c5d1SDavid du Colombier 			}
843e12c5d1SDavid du Colombier 			start = 0;
853e12c5d1SDavid du Colombier 			cnt = 0;
863e12c5d1SDavid du Colombier 		}
877dd7cddfSDavid du Colombier 		posn = Boffset(fin);
883e12c5d1SDavid du Colombier 	}
893e12c5d1SDavid du Colombier 
90*07a7a51eSDavid du Colombier 	if(cnt >= minspan){
913e12c5d1SDavid du Colombier 		buf[cnt] = 0;
927dd7cddfSDavid du Colombier 		Bprint(&fout, "%8ld: %S\n", start, buf);
933e12c5d1SDavid du Colombier 	}
94219b2ee8SDavid du Colombier 	Bterm(fin);
953e12c5d1SDavid du Colombier }
963e12c5d1SDavid du Colombier 
973e12c5d1SDavid du Colombier int
isprint(Rune r)983e12c5d1SDavid du Colombier isprint(Rune r)
993e12c5d1SDavid du Colombier {
10064c7f6b6SDavid du Colombier 	if (r != Runeerror)
10164c7f6b6SDavid du Colombier 	if ((r >= ' ' && r < 0x7F) || r > 0xA0)
1023e12c5d1SDavid du Colombier 		return 1;
1033e12c5d1SDavid du Colombier 	return 0;
1043e12c5d1SDavid du Colombier }
105