[git commit] vi: allow backward search to specify line address

Denys Vlasenko vda.linux at googlemail.com
Thu Apr 15 11:09:12 UTC 2021


commit: https://git.busybox.net/busybox/commit/?id=47f78913f7576596d44c602a015735cb9c49f4f0
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

It should be possible to use a backward search as a line address
in colon commands.

function                                             old     new   delta
colon                                               3661    3701     +40
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 40/0)               Total: 40 bytes

Signed-off-by: Ron Yorston <rmy at pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 editors/vi.c | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/editors/vi.c b/editors/vi.c
index 1d326f454..0866e0fa9 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -2346,9 +2346,9 @@ static char *get_one_address(char *p, int *addr)	// get colon addr, if present
 {
 	int st;
 # if ENABLE_FEATURE_VI_YANKMARK || ENABLE_FEATURE_VI_SEARCH
-	char *q;
+	char *q, c;
 # endif
-	IF_FEATURE_VI_YANKMARK(char c;)
+	IF_FEATURE_VI_SEARCH(int dir;)
 
 	*addr = -1;			// assume no addr
 	if (*p == '.') {	// the current line
@@ -2372,18 +2372,25 @@ static char *get_one_address(char *p, int *addr)	// get colon addr, if present
 	}
 # endif
 # if ENABLE_FEATURE_VI_SEARCH
-	else if (*p == '/') {	// a search pattern
-		q = strchrnul(p + 1, '/');
+	else if (*p == '/' || *p == '?') {	// a search pattern
+		c = *p;
+		q = strchrnul(p + 1, c);
 		if (p + 1 != q) {
 			// save copy of new pattern
 			free(last_search_pattern);
 			last_search_pattern = xstrndup(p, q - p);
 		}
 		p = q;
-		if (*p == '/')
+		if (*p == c)
 			p++;
-		q = char_search(next_line(dot), last_search_pattern + 1,
-						(FORWARD << 1) | FULL);
+		if (c == '/') {
+			q = next_line(dot);
+			dir = (FORWARD << 1) | FULL;
+		} else {
+			q = begin_line(dot);
+			dir = ((unsigned)BACK << 1) | FULL;
+		}
+		q = char_search(q, last_search_pattern + 1, dir);
 		if (q == NULL)
 			return NULL;
 		*addr = count_lines(text, q);


More information about the busybox-cvs mailing list