ls: fix columnar output. Closes 8731
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 6 Mar 2016 16:53:11 +0000 (17:53 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 6 Mar 2016 16:53:11 +0000 (17:53 +0100)
In coreutils/ls.c, 1.19 introduced commit
2f7d9e8903029b1b5e51a15f9cb0dcb6ca17c3ac, removing the variable tabstops and
hard coding the column separation to 2 characters, but was not done correctly.
The column_width assumes a gap of 1 character, so the computed number of
columns exceeds the terminal width when many small files are encountered.

A minor problem but surprisingly annoying.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/ls.c

index c48498858182c37cc555ee2789b2b1fb0a8e03cd..20bd6186053b41aabb075e3a3dda26eb90559104 100644 (file)
@@ -668,7 +668,7 @@ static void display_files(struct dnode **dn, unsigned nfiles)
                        if (column_width < len)
                                column_width = len;
                }
-               column_width += 1 +
+               column_width += 2 +
                        IF_SELINUX( ((G.all_fmt & LIST_CONTEXT) ? 33 : 0) + )
                                ((G.all_fmt & LIST_INO) ? 8 : 0) +
                                ((G.all_fmt & LIST_BLOCKS) ? 5 : 0);
@@ -696,8 +696,8 @@ static void display_files(struct dnode **dn, unsigned nfiles)
                        if (i < nfiles) {
                                if (column > 0) {
                                        nexttab -= column;
-                                       printf("%*s ", nexttab, "");
-                                       column += nexttab + 1;
+                                       printf("%*s", nexttab, "");
+                                       column += nexttab;
                                }
                                nexttab = column + column_width;
                                column += display_single(dn[i]);