[PATCH] vi: fixes to string search in colon commands, closes 10321

Denys Vlasenko vda.linux at googlemail.com
Wed Jan 29 13:10:20 UTC 2020


Applied, thanks!

On Thu, Jan 23, 2020 at 4:31 PM Ron Yorston <rmy at pobox.com> wrote:
>
> Handling of string searches in colon commands (e.g ':/pat1/,/pat2/cmd')
> differ from standard vi:
>
> - As reported in bug 10321 such searches can't be repeated using the
>   'n' command.  This is because the last search pattern isn't updated.
>
> - The search also can't be repeated using the command '://' because
>   an empty search pattern doesn't imply the use of the last search
>   pattern.
>
> - Such searches should start on the line after the current line,
>   otherwise '://' never moves to the next occurrence of the pattern.
>   This can also affect other cases where line ranges are specified
>   using search patterns.
>
> Fix these various issues.
>
> function                                             old     new   delta
> get_one_address                                      325     342     +17
>
> Signed-off-by: Ron Yorston <rmy at pobox.com>
> ---
>  editors/vi.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/editors/vi.c b/editors/vi.c
> index 51dfc1209..1dd0b6fb6 100644
> --- a/editors/vi.c
> +++ b/editors/vi.c
> @@ -2251,7 +2251,6 @@ static char *get_one_address(char *p, int *addr)  // get colon addr, if present
>         int st;
>         char *q;
>         IF_FEATURE_VI_YANKMARK(char c;)
> -       IF_FEATURE_VI_SEARCH(char *pat;)
>
>         *addr = -1;                     // assume no addr
>         if (*p == '.') {        // the current line
> @@ -2276,16 +2275,20 @@ 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, '/');
> -               pat = xstrndup(p, q - p); // save copy of pattern
> +               q = strchrnul(p + 1, '/');
> +               if (p + 1 != q) {
> +                       // save copy of new pattern
> +                       free(last_search_pattern);
> +                       last_search_pattern = xstrndup(p, q - p);
> +               }
>                 p = q;
>                 if (*p == '/')
>                         p++;
> -               q = char_search(dot, pat, (FORWARD << 1) | FULL);
> +               q = char_search(next_line(dot), last_search_pattern + 1,
> +                                               (FORWARD << 1) | FULL);
>                 if (q != NULL) {
>                         *addr = count_lines(text, q);
>                 }
> -               free(pat);
>         }
>  #endif
>         else if (*p == '$') {   // the last line in file
> --
> 2.24.1
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox


More information about the busybox mailing list