aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2018-07-26 16:31:36 -0700
committerRob Landley <rob@landley.net>2018-08-04 11:15:44 -0500
commitd7c111f4c39de122cdd1ea41c8af67a609fc859a (patch)
treeccdc6611f7c465603bd5f7c0d37aa26f69984397
parente9dfdd76d5b4ca9d875136f085acd9001c5bfdce (diff)
downloadtoybox-d7c111f4c39de122cdd1ea41c8af67a609fc859a.tar.gz
wc: fix the column width heuristics even further.
This was found by https://kernel.googlesource.com/pub/scm/linux/kernel/git/shuah/linux-kselftest/+/master/tools/testing/selftests/splice/default_file_splice_read.sh which broke after the recent change. Plus this actually fixes another of our existing test failures on the host. I'm assuming we don't want to try the "exact fit" heuristics until we have a concrete need for them. (I haven't fully understood the circumstances under which they're used, though the two remaining host test failures appear to be because of them.) Bug: http://b/111891791 Test: ran tests
-rwxr-xr-xtests/wc.test6
-rw-r--r--toys/posix/wc.c13
2 files changed, 13 insertions, 6 deletions
diff --git a/tests/wc.test b/tests/wc.test
index 8b6365b1..4ab03868 100755
--- a/tests/wc.test
+++ b/tests/wc.test
@@ -14,10 +14,12 @@ EOF
testing "wc" "wc >/dev/null && echo yes" "yes\n" "" ""
testing "empty file" "wc" " 0 0 0\n" "" ""
testing "standard input" "wc" " 1 3 5\n" "" "a b\nc"
+testing "standard input -c" "wc -c" "5\n" "" "a b\nc"
+testing "standard input -cl" "wc -cl" " 1 5\n" "" "a b\nc"
testing "-c" "wc -c file1" "26 file1\n" "" ""
testing "-l" "wc -l file1" "4 file1\n" "" ""
testing "-w" "wc -w file1" "5 file1\n" "" ""
-testing "format" "wc file1" "4 5 26 file1\n" "" ""
+testing "one file" "wc file1" "4 5 26 file1\n" "" ""
testing "multiple files" "wc input - file1" \
" 1 2 3 input\n 0 2 3 -\n 4 5 26 file1\n 5 9 32 total\n" "a\nb" "a b"
@@ -25,7 +27,7 @@ testing "multiple files" "wc input - file1" \
echo -n " " > file1
for i in $(seq 1 512); do echo -n "üüüüüüüüüüüüüüüü" >> file1; done
testing "-m" "wc -m file1" "8193 file1\n" "" ""
-testing "-m 2" 'cat "$FILES/utf8/test2.txt" | wc -m' " 169\n" "" ""
+testing "-m 2" 'cat "$FILES/utf8/test2.txt" | wc -m' "169\n" "" ""
echo -n " " > file1
testing "-mlw" "wc -mlw input" "1 2 11 input\n" "hello, 世界!\n" ""
rm file1
diff --git a/toys/posix/wc.c b/toys/posix/wc.c
index acd0b3a0..b875c1fd 100644
--- a/toys/posix/wc.c
+++ b/toys/posix/wc.c
@@ -33,12 +33,17 @@ GLOBALS(
static void show_lengths(unsigned long *lengths, char *name)
{
- int i, space, first = 1;
+ int i, space = 0, first = 1;
// POSIX says there should never be leading spaces, but accepts that
- // traditional implementations use 7 spaces, unless only one file
- // is being counted, when there should be no leading spaces.
- space = (toys.optc != 1) ? 7 : 0;
+ // traditional implementations use 7 spaces, unless only one file (or
+ // just stdin) is being counted, when there should be no leading spaces,
+ // *except* for the case where we're going to output multiple numbers.
+ // And, yes, folks have test scripts that rely on all this nonsense :-(
+ // Note: sufficiently modern versions of coreutils wc will use the smallest
+ // column width necessary to have all columns be equal width rather than 0.
+ if (!(toys.optc==0 && (toys.optflags & (toys.optflags-1))==0) && toys.optc!=1)
+ space = 7;
for (i = 0; i<4; i++) {
if (toys.optflags&(1<<i)) {