OSDN Git Service

strings tests and bugfixes
authorIlya Kuzmich <ilya.kuzmich@gmail.com>
Mon, 29 May 2017 04:05:16 +0000 (07:05 +0300)
committerRob Landley <rob@landley.net>
Mon, 3 Jul 2017 01:28:47 +0000 (20:28 -0500)
Fixes missing newline in output if last byte of the input is string.
Fixes one-off offset bug.
Adds strings tests.

Signed-off-by: Ilya Kuzmich <ilya.kuzmich@gmail.com>
tests/strings.test [new file with mode: 0644]
toys/posix/strings.c

diff --git a/tests/strings.test b/tests/strings.test
new file mode 100644 (file)
index 0000000..8becc2f
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "stdin" "strings" "foobar\n" "" "foobar\n"
+testing "file" "strings input" "foobar\n" "foobar\n" ""
+testing "string to the end" "strings input" "foobar\n" "foobar" ""
+testing "short strings" "strings input" "" "foo\nbar\n" ""
+testing "-n6" "strings -n6 input" "foobar\n" "foobar\nbaz\n" ""
+testing "string and nulls" "strings input" "foobar\nbazfoo\n" \
+       "\0foobar\0\0bazfoo\0foo" ""
+testing "-f" "strings -f input" "input: foobar\n" "foobar\n" ""
+testing "-o" "strings -o input | sed 's/^ *//'" "6 foobar\n" \
+       "\0\0\0\0\0\0foobar\n" ""
+testing "-o, multiple strings" "strings -n3 -o input | sed 's/^ *//'" \
+       "1 foo\n7 bar\n" "\0foo\0b\0bar\n" ""
+testing "-fo" "strings -fo input | sed 's/: */: /'" "input: 6 foobar\n" \
+       "\0\0\0\0\0\0foobar\n" ""
index f3ce70c..d2154e7 100644 (file)
@@ -38,7 +38,10 @@ static void do_strings(int fd, char *filename)
   for (;;) {
     nread = read(fd, toybuf, sizeof(toybuf));
     if (nread < 0) perror_msg_raw(filename);
-    if (nread < 1) break;
+    if (nread < 1) {
+      if (count == wlen) xputc('\n');
+      break;
+    }
     for (i = 0; i < nread; i++, offset++) {
       if (((toybuf[i] >= 32) && (toybuf[i] <= 126)) || (toybuf[i] == '\t')) {
         if (count == wlen) fputc(toybuf[i], stdout);
@@ -47,7 +50,7 @@ static void do_strings(int fd, char *filename)
           if (count == wlen) {
             if (toys.optflags & FLAG_f) printf("%s: ", filename);
             if (toys.optflags & FLAG_o)
-              printf("%7lld ",(long long)(offset - wlen));
+              printf("%7lld ",(long long)(offset + 1 - wlen));
             printf("%s", string);
           }
         }