[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    [PATCH 1/2] vi: fix changes to word at end of line.  Closes 11796
From:       Ron Yorston <rmy () pobox ! com>
Date:       2019-04-28 8:09:33
Message-ID: 5cc55fbd.Zop0qQw0dL7i8mHZ%rmy () pobox ! com
[Download RAW message or body]

As reported in bug 11796 BusyBox vi incorrectly handles changes
to a word at the end of a line.  If the following line starts
with whitespace changing or deleting the last word of a line
with the 'cw' or 'dw' commands causes the lines to be joined.

This happens because the range for the change returned by
find_range() covers all whitespace after the word, including
newlines.  The problem can be fixed by setting 'ml' to zero
to indicate to yank_delete() that processing should stop at
the end of the current line.

However, this results in a new problem.  'dw' correctly deletes
all whitespace following the word but so does 'cw', which should
preserve the trailing whitespace.  To fix this the code to omit
whitespace from the change is modified to include all whitespace
not just blanks.

function                                             old     new   delta
do_cmd                                              5034    5069     +35
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 35/0)               Total: 35 bytes

Reported-by: David Kelly <david.kelly@liberica.ch>
Signed-off-by: Ron Yorston <rmy@pobox.com>
---
 editors/vi.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/editors/vi.c b/editors/vi.c
index c4360f8d3..dfef42019 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -3770,11 +3770,10 @@ static void do_cmd(int c)
 		if (c1 == 27) {	// ESC- user changed mind and wants out
 			c = c1 = 27;	// Escape- do nothing
 		} else if (strchr("wW", c1)) {
+			ml = 0;	// multi-line ranges aren't allowed for words
 			if (c == 'c') {
 				// don't include trailing WS as part of word
-				while (isblank(*q)) {
-					if (q <= text || q[-1] == '\n')
-						break;
+				while (isspace(*q) && q > p) {
 					q--;
 				}
 			}
-- 
2.20.1

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic