[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: Re: [PATCH] vi: fix backward search with GNU regex
From: Denys Vlasenko <vda.linux () googlemail ! com>
Date: 2021-06-21 13:38:35
Message-ID: CAK1hOcPtHhYjvo2Q3u4tWw_Y88v4Ae_LUda=S9tzb20pS98whA () mail ! gmail ! com
[Download RAW message or body]
Applied, thank you
On Mon, Jun 21, 2021 at 12:31 PM Ron Yorston <rmy@pobox.com> wrote:
>
> With FEATURE_VI_REGEX_SEARCH enabled backward searches don't work.
> This is problematic on distros that enable regexes, such as Tiny
> Core Linux and Fedora.
>
> When calling GNU re_search() with a negative range parameter
> (indicating a backward search) the start offset must be set to
> the end of the area being searched.
>
> The return value of re_search() is the offset of the matched pattern
> from the start of the area being searched. For a successful search
> (positive return value) char_search() can return the pointer to
> the start of the area plus the offset.
>
> FEATURE_VI_REGEX_SEARCH isn't enabled by default but when it is:
>
> function old new delta
> char_search 256 247 -9
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-9) Total: -9 bytes
>
> Signed-off-by: Andrey Dobrovolsky <andrey.dobrovolsky.odessa@gmail.com>
> Signed-off-by: Ron Yorston <rmy@pobox.com>
> ---
> editors/vi.c | 33 +++++++++++++--------------------
> 1 file changed, 13 insertions(+), 20 deletions(-)
>
> diff --git a/editors/vi.c b/editors/vi.c
> index d85cdd98d..87d6a628e 100644
> --- a/editors/vi.c
> +++ b/editors/vi.c
> @@ -2371,9 +2371,7 @@ static char *char_search(char *p, const char *pat, int dir_and_range)
> struct re_pattern_buffer preg;
> const char *err;
> char *q;
> - int i;
> - int size;
> - int range;
> + int i, size, range, start;
>
> re_syntax_options = RE_SYNTAX_POSIX_EXTENDED;
> if (ignorecase)
> @@ -2398,31 +2396,26 @@ static char *char_search(char *p, const char *pat, int dir_and_range)
>
> // RANGE could be negative if we are searching backwards
> range = q - p;
> - q = p;
> - size = range;
> if (range < 0) {
> - size = -size;
> - q = p - size;
> - if (q < text)
> - q = text;
> + size = -range;
> + start = size;
> + } else {
> + size = range;
> + start = 0;
> }
> + q = p - start;
> + if (q < text)
> + q = text;
> // search for the compiled pattern, preg, in p[]
> - // range < 0: search backward
> - // range > 0: search forward
> - // 0 < start < size
> + // range < 0, start == size: search backward
> + // range > 0, start == 0: search forward
> // re_search() < 0: not found or error
> // 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, start, 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 i < 0 ? NULL : q + i;
> }
> # else
> # if ENABLE_FEATURE_VI_SETOPTS
> --
> 2.31.1
>
> _______________________________________________
> busybox mailing list
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic