commit d8a89002d3a0a19e6d75394a622855d2a7344e4d
parent 8ce6d7091a38127e145f9e92d969e58c73c3dce0
Author: sin <sin@2f30.org>
Date: Tue, 17 Feb 2015 13:46:48 +0000
strings: Add -n len support
Diffstat:
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);
-}