less: allow use of last column of terminal
authorRon Yorston <rmy@pobox.com>
Fri, 24 Jul 2015 13:29:45 +0000 (14:29 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 31 Jul 2015 14:22:09 +0000 (16:22 +0200)
When read_lines tests whether a character will fit on the current
line it checks the *next* character but in case of overflow doesn't
display the *current* one.  This results in the last column of the
terminal never being used.

The test in re_wrap (used when the terminal width changes or line
numbers are enabled/disabled) is different:  it does allow the use
of the final column.

function                                             old     new   delta
read_lines                                           764     770      +6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 6/0)                 Total: 6 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
miscutils/less.c

index 5c53cbdbfd74ab1f6a62a3f0a222e5b337c39a8e..b38fcf76625c7fff16c53f312a964660f6b493d8 100644 (file)
@@ -512,16 +512,6 @@ static void read_lines(void)
                                *--p = '\0';
                                continue;
                        }
-                       {
-                               size_t new_last_line_pos = last_line_pos + 1;
-                               if (c == '\t') {
-                                       new_last_line_pos += 7;
-                                       new_last_line_pos &= (~7);
-                               }
-                               if ((int)new_last_line_pos >= w)
-                                       break;
-                               last_line_pos = new_last_line_pos;
-                       }
                        /* ok, we will eat this char */
                        readpos++;
                        if (c == '\n') {
@@ -533,6 +523,16 @@ static void read_lines(void)
                        if (c == '\0') c = '\n';
                        *p++ = c;
                        *p = '\0';
+                       {
+                               size_t new_last_line_pos = last_line_pos + 1;
+                               if (c == '\t') {
+                                       new_last_line_pos += 7;
+                                       new_last_line_pos &= (~7);
+                               }
+                               if ((int)new_last_line_pos >= w)
+                                       break;
+                               last_line_pos = new_last_line_pos;
+                       }
                } /* end of "read chars until we have a line" loop */
 #if 0
 //BUG: also triggers on this: