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