sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit d8a89002d3a0a19e6d75394a622855d2a7344e4d
parent 8ce6d7091a38127e145f9e92d969e58c73c3dce0
Author: sin <sin@2f30.org>
Date:   Tue, 17 Feb 2015 13:46:48 +0000

strings: Add -n len support

Diffstat:
MREADME | 2+-
Mstrings.1 | 5+++++
Mstrings.c | 53++++++++++++++++++++++++++++-------------------------
3 files changed, 34 insertions(+), 26 deletions(-)

diff --git 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 @@ -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 @@ -1,15 +1,35 @@ /* See LICENSE file for copyright and license details. */ #include <ctype.h> #include <stdio.h> +#include <stdlib.h> #include "util.h" -static void dostrings(FILE *fp, const char *fname); +static void +strings(FILE *fp, const char *fname, int len) +{ + unsigned char buf[BUFSIZ]; + int c, i = 0; + off_t offset = 0; + + do { + offset++; + if (isprint(c = getc(fp))) + buf[i++] = c; + if ((!isprint(c) && i >= len) || i == sizeof(buf) - 1) { + buf[i] = '\0'; + printf("%8ld: %s\n", (long)offset - i - 1, buf); + i = 0; + } + } while (c != EOF); + if (ferror(fp)) + eprintf("%s: read error:", fname); +} static void usage(void) { - eprintf("usage: %s [-a] [file ...]\n", argv0); + eprintf("usage: %s [-a] [-n len] [file ...]\n", argv0); } int @@ -17,16 +37,20 @@ 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) { - dostrings(stdin, "<stdin>"); + strings(stdin, "<stdin>", len); } else { for (; argc > 0; argc--, argv++) { if (!(fp = fopen(argv[0], "r"))) { @@ -34,30 +58,9 @@ main(int argc, char *argv[]) ret = 1; continue; } - dostrings(fp, argv[0]); + strings(fp, argv[0], len); fclose(fp); } } return ret; } - -static void -dostrings(FILE *fp, const char *fname) -{ - unsigned char buf[BUFSIZ]; - int c, i = 0; - off_t offset = 0; - - do { - offset++; - if (isprint(c = getc(fp))) - buf[i++] = c; - if ((!isprint(c) && i >= 6) || i == sizeof(buf) - 1) { - buf[i] = '\0'; - printf("%8ld: %s\n", (long)offset - i - 1, buf); - i = 0; - } - } while (c != EOF); - if (ferror(fp)) - eprintf("%s: read error:", fname); -}