[PATCH] vi: further fixes to undo after autoindent

Ron Yorston rmy at pobox.com
Mon Feb 11 08:29:15 UTC 2019


Commit bb983f30e (vi: fix faulty undo after autoinsert) has a
number of problems:

- The commit message refers to 'autoinsert' when it really means
  'autoindent'.

- The indentation of undo_push_insert() was incorrect.

- Most seriously the commit only fixed the problem for cases where
  the indentation was exactly one character.  This is because undo_push()
  only allows single characters to be queued for UNDO_INS_QUEUED.

  Lifting this restriction allows the example given in the previous
  commit message (with a three character indent) to work.

function                                             old     new   delta
undo_push                                            406     435     +29
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 29/0)               Total: 29 bytes

Signed-off-by: Ron Yorston <rmy at pobox.com>
---
 editors/vi.c | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/editors/vi.c b/editors/vi.c
index 899fcf57e..065a1068e 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -2314,16 +2314,18 @@ static void undo_push(char *src, unsigned int length, uint8_t u_type)	// Add to
 		}
 		break;
 	case UNDO_INS_QUEUED:
-		if (length != 1)
+		if (length < 1)
 			return;
 		switch (undo_queue_state) {
 		case UNDO_EMPTY:
 			undo_queue_state = UNDO_INS;
 			undo_queue_spos = src;
 		case UNDO_INS:
-			undo_q++;	// Don't need to save any data for insertions
-			if (undo_q == CONFIG_FEATURE_VI_UNDO_QUEUE_MAX)
-				undo_queue_commit();
+			while (length--) {
+				undo_q++;	// Don't need to save any data for insertions
+				if (undo_q == CONFIG_FEATURE_VI_UNDO_QUEUE_MAX)
+					undo_queue_commit();
+			}
 			return;
 		case UNDO_DEL:
 			// Switch from storing deleted text to inserted text
@@ -2372,16 +2374,16 @@ static void undo_push(char *src, unsigned int length, uint8_t u_type)	// Add to
 static void undo_push_insert(char *p, int len, int undo)
 {
 	switch (undo) {
-		case ALLOW_UNDO:
-			undo_push(p, len, UNDO_INS);
-			break;
-		case ALLOW_UNDO_CHAIN:
-			undo_push(p, len, UNDO_INS_CHAIN);
-			break;
+	case ALLOW_UNDO:
+		undo_push(p, len, UNDO_INS);
+		break;
+	case ALLOW_UNDO_CHAIN:
+		undo_push(p, len, UNDO_INS_CHAIN);
+		break;
 # if ENABLE_FEATURE_VI_UNDO_QUEUE
-		case ALLOW_UNDO_QUEUED:
-			undo_push(p, len, UNDO_INS_QUEUED);
-			break;
+	case ALLOW_UNDO_QUEUED:
+		undo_push(p, len, UNDO_INS_QUEUED);
+		break;
 # endif
 	}
 }
-- 
2.20.1



More information about the busybox mailing list