|  | #include	<u.h> | 
|  | #include 	<libc.h> | 
|  | #include	<bio.h> | 
|  |  | 
|  | Biobuf	*fin; | 
|  | Biobuf	fout; | 
|  |  | 
|  | #define	MINSPAN		6		/* Min characters in string */ | 
|  |  | 
|  | #define BUFSIZE		70 | 
|  |  | 
|  | void stringit(char *); | 
|  | #undef isprint | 
|  | #define isprint risprint | 
|  | int isprint(Rune); | 
|  |  | 
|  | void | 
|  | main(int argc, char **argv) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | Binit(&fout, 1, OWRITE); | 
|  | if(argc < 2) { | 
|  | stringit("/dev/stdin"); | 
|  | exits(0); | 
|  | } | 
|  |  | 
|  | for(i = 1; i < argc; i++) { | 
|  | if(argc > 2) | 
|  | print("%s:\n", argv[i]); | 
|  |  | 
|  | stringit(argv[i]); | 
|  | } | 
|  |  | 
|  | exits(0); | 
|  | } | 
|  |  | 
|  | void | 
|  | stringit(char *str) | 
|  | { | 
|  | long posn, start; | 
|  | int cnt = 0; | 
|  | long c; | 
|  |  | 
|  | Rune buf[BUFSIZE]; | 
|  |  | 
|  | if ((fin = Bopen(str, OREAD)) == 0) { | 
|  | perror("open"); | 
|  | return; | 
|  | } | 
|  |  | 
|  | start = 0; | 
|  | posn = Boffset(fin); | 
|  | while((c = Bgetrune(fin)) >= 0) { | 
|  | if(isprint(c)) { | 
|  | if(start == 0) | 
|  | start = posn; | 
|  | buf[cnt++] = c; | 
|  | if(cnt == BUFSIZE-1) { | 
|  | buf[cnt] = 0; | 
|  | Bprint(&fout, "%8ld: %S ...\n", start, buf); | 
|  | start = 0; | 
|  | cnt = 0; | 
|  | } | 
|  | } else { | 
|  | if(cnt >= MINSPAN) { | 
|  | buf[cnt] = 0; | 
|  | Bprint(&fout, "%8ld: %S\n", start, buf); | 
|  | } | 
|  | start = 0; | 
|  | cnt = 0; | 
|  | } | 
|  | posn = Boffset(fin); | 
|  | } | 
|  |  | 
|  | if(cnt >= MINSPAN){ | 
|  | buf[cnt] = 0; | 
|  | Bprint(&fout, "%8ld: %S\n", start, buf); | 
|  | } | 
|  | Bterm(fin); | 
|  | } | 
|  |  | 
|  | int | 
|  | isprint(Rune r) | 
|  | { | 
|  | if ((r >= ' ' && r <0x7f) || r > 0xA0) | 
|  | return 1; | 
|  | else | 
|  | return 0; | 
|  | } |