commit 6116d07d35806108dd5d27f1a7d0f269ec379539
Author: sin <[email protected]>
Date:   Tue Feb 17 13:46:48 2015 +0000

    strings: Add -n len support

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,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);
-}

Reply via email to