diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/strings.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/strings.c')
-rwxr-xr-x | sys/src/cmd/strings.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/sys/src/cmd/strings.c b/sys/src/cmd/strings.c new file mode 100755 index 000000000..67cf464ff --- /dev/null +++ b/sys/src/cmd/strings.c @@ -0,0 +1,104 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> + +Biobuf *fin; +Biobuf fout; + +#define MINSPAN 6 /* Min characters in string (default) */ +#define BUFSIZE 70 + +void stringit(char *); +int isprint(Rune); + +static int minspan = MINSPAN; + +static void +usage(void) +{ + fprint(2, "usage: %s [-m min] [file...]\n", argv0); + exits("usage"); +} + +void +main(int argc, char **argv) +{ + int i; + + ARGBEGIN{ + case 'm': + minspan = atoi(EARGF(usage())); + break; + default: + usage(); + break; + }ARGEND + Binit(&fout, 1, OWRITE); + if(argc < 1) { + stringit("/fd/0"); + exits(0); + } + + for(i = 0; 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 != Runeerror) + if ((r >= ' ' && r < 0x7F) || r > 0xA0) + return 1; + return 0; +} |