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 <[email protected]>
---
 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);
-- 
2.30.2

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to