diff --git a/README b/README index 5203db1..49f681f 100644 --- a/README +++ b/README @@ -67,7 +67,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support, sort no -m, -o, -d, -f, -i =* split yes none =* sponge non-posix none - strings no -n, -t + strings no -t =* sync non-posix none =* tail yes none =* tar non-posix none diff --git a/strings.1 b/strings.1 index ec534d3..3568a6a 100644 --- a/strings.1 +++ b/strings.1 @@ -7,6 +7,7 @@ .Sh SYNOPSIS .Nm .Op Fl a +.Op Fl n Ar len .Op Ar file ... .Sh DESCRIPTION .Nm @@ -20,6 +21,10 @@ reads from stdin. .Bl -tag -width Ds .It Fl a Scan files in their entirety. This is the default. +.It Fl n Ar len +Only print sequences that are at least +.Ar len +characters. The default is 4 characters. .El .Sh STANDARDS .Nm diff --git a/strings.c b/strings.c index 59f3363..c380752 100644 --- a/strings.c +++ b/strings.c @@ -1,48 +1,12 @@ /* See LICENSE file for copyright and license details. */ #include #include +#include #include "util.h" -static void dostrings(FILE *fp, const char *fname); - static void -usage(void) -{ - eprintf("usage: %s [-a] [file ...]\n", argv0); -} - -int -main(int argc, char *argv[]) -{ - FILE *fp; - int ret = 0; - - ARGBEGIN { - case 'a': - break; - default: - usage(); - } ARGEND; - - if (argc == 0) { - dostrings(stdin, ""); - } else { - for (; argc > 0; argc--, argv++) { - if (!(fp = fopen(argv[0], "r"))) { - weprintf("fopen %s:", argv[0]); - ret = 1; - continue; - } - dostrings(fp, argv[0]); - fclose(fp); - } - } - return ret; -} - -static void -dostrings(FILE *fp, const char *fname) +strings(FILE *fp, const char *fname, int len) { unsigned char buf[BUFSIZ]; int c, i = 0; @@ -52,7 +16,7 @@ dostrings(FILE *fp, const char *fname) offset++; if (isprint(c = getc(fp))) buf[i++] = c; - if ((!isprint(c) && i >= 6) || i == sizeof(buf) - 1) { + if ((!isprint(c) && i >= len) || i == sizeof(buf) - 1) { buf[i] = '\0'; printf("%8ld: %s\n", (long)offset - i - 1, buf); i = 0; @@ -61,3 +25,42 @@ dostrings(FILE *fp, const char *fname) if (ferror(fp)) eprintf("%s: read error:", fname); } + +static void +usage(void) +{ + eprintf("usage: %s [-a] [-n len] [file ...]\n", argv0); +} + +int +main(int argc, char *argv[]) +{ + FILE *fp; + int ret = 0; + int len = 4; + + ARGBEGIN { + case 'a': + break; + case 'n': + len = estrtonum(EARGF(usage()), 1, INT_MAX); + break; + default: + usage(); + } ARGEND; + + if (argc == 0) { + strings(stdin, "", len); + } else { + for (; argc > 0; argc--, argv++) { + if (!(fp = fopen(argv[0], "r"))) { + weprintf("fopen %s:", argv[0]); + ret = 1; + continue; + } + strings(fp, argv[0], len); + fclose(fp); + } + } + return ret; +}