diff options
author | Elliott Hughes <enh@google.com> | 2018-07-26 16:31:36 -0700 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2018-08-04 11:15:44 -0500 |
commit | d7c111f4c39de122cdd1ea41c8af67a609fc859a (patch) | |
tree | ccdc6611f7c465603bd5f7c0d37aa26f69984397 | |
parent | e9dfdd76d5b4ca9d875136f085acd9001c5bfdce (diff) | |
download | toybox-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-x | tests/wc.test | 6 | ||||
-rw-r--r-- | toys/posix/wc.c | 13 |
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)) { |