[PATCH 03/12] vi: code shrink motion by paragraph

Ron Yorston rmy at pobox.com
Thu Apr 15 11:02:11 UTC 2021


Use a hand-coded loop to search for paragraph boundaries instead
of calling char_search().  We were using a loop anyway to skip
consecutive newlines.

function                                             old     new   delta
do_cmd                                              4792    4752     -40
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-40)             Total: -40 bytes

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

diff --git a/editors/vi.c b/editors/vi.c
index f71897253..d37357edd 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -3636,21 +3636,24 @@ static void do_cmd(int c)
 		break;
 	case '{':			// {- move backward paragraph
 	case '}':			// }- move forward paragraph
+		dir = c == '}' ? FORWARD : BACK;
 		do {
-			dir = c == '}' ? FORWARD : BACK;
-			// skip over consecutive empty lines
-			while ((dir == FORWARD ? dot < end - 1 : dot > text) &&
-						*dot == '\n' && dot[dir] == '\n') {
+			int skip = TRUE; // initially skip consecutive empty lines
+			while (dir == FORWARD ? dot < end - 1 : dot > text) {
+				if (*dot == '\n' && dot[dir] == '\n') {
+					if (!skip) {
+						if (dir == FORWARD)
+							++dot;	// move to next blank line
+						goto dc2;
+					}
+				}
+				else {
+					skip = FALSE;
+				}
 				dot += dir;
 			}
-			q = char_search(dot, "\n\n", ((unsigned)dir << 1) | FULL);
-			if (q != NULL) {	// found blank line
-				dot = next_line(q);	// move to next blank line
-			}
-			else {	// blank line not found, move to end of file
-				dot = dir == FORWARD ? end - 1 : text;
-				break;
-			}
+			goto dc6; // end of file
+ dc2:		continue;
 		} while (--cmdcnt > 0);
 		break;
 #endif /* FEATURE_VI_SEARCH */
-- 
2.30.2



More information about the busybox mailing list