In order to perform backward search using re_search(), starting offset must be 
set
to the end of the area searched, while "range" parameter is negative.

The returned value of re_search() is an offset of the pattern start inside the 
area
searched, so char_search() can return area start adress plus offset, in case 
re_search()
returned positive offset, meaning succeful search.
---
 editors/vi.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/editors/vi.c b/editors/vi.c
index 458ca62..5bfb69d 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -2189,15 +2189,11 @@ static char *char_search(char *p, const char *pat, int 
dir_and_range)
        // re_search() >= 0: index of found pattern
        //           struct pattern   char     int   int    int    struct reg
        // re_search(*pattern_buffer, *string, size, start, range, *regs)
-       i = re_search(&preg, q, size, /*start:*/ 0, range, /*struct 
re_registers*:*/ NULL);
+       i = re_search(&preg, q, size, (range < 0) ? size : 0 , range, /*struct 
re_registers*:*/ NULL);
        regfree(&preg);
        if (i < 0)
                return NULL;
-       if (dir_and_range > 0) // FORWARD?
-               p = p + i;
-       else
-               p = p - i;
-       return p;
+        return (q + i) ;
 }
 # else
 #  if ENABLE_FEATURE_VI_SETOPTS
-- 
2.9.2


_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to