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