[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: Re: [PATCH] vi: allow delimiter in ':s' to be escaped
From: Denys Vlasenko <vda.linux () googlemail ! com>
Date: 2021-07-13 12:45:55
Message-ID: CAK1hOcPwPJNZPBDHiSru+1HRpUf0N+SXHros4hy3j3WC=K_QWg () mail ! gmail ! com
[Download RAW message or body]
Applied 4 vi patches. Thank you.
Let me know if something does not work.
On Sat, Jul 10, 2021 at 12:00 PM Ron Yorston <rmy@pobox.com> wrote:
>
> When regular expressions are allowed in search commands it becomes
> possible to escape the delimiter in search/replace commands. For
> example, this command will replace '/abc' with '/abc/':
>
> :s/\/abc/\/abc\//g
>
> The code to split the command into 'find' and 'replace' strings
> should allow for this possibility.
>
> VI_REGEX_SEARCH isn't enabled by default. When it is:
>
> function old new delta
> strchr_backslash - 38 +38
> colon 4378 4373 -5
> ------------------------------------------------------------------------------
> (add/remove: 1/0 grow/shrink: 0/1 up/down: 38/-5) Total: 33 bytes
>
> Signed-off-by: Ron Yorston <rmy@pobox.com>
> ---
> editors/vi.c | 19 +++++++++++++++++--
> 1 file changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/editors/vi.c b/editors/vi.c
> index f830368c2..ce5740e49 100644
> --- a/editors/vi.c
> +++ b/editors/vi.c
> @@ -2680,6 +2680,19 @@ static char *expand_args(char *args)
> #if ENABLE_FEATURE_VI_REGEX_SEARCH
> # define MAX_SUBPATTERN 10 // subpatterns \0 .. \9
>
> +// Like strchr() but skipping backslash-escaped characters
> +static char *strchr_backslash(const char *s, int c)
> +{
> + for (; *s; ++s) {
> + if (*s == c) {
> + return (char *)s;
> + } else if (*s == '\\' && *++s == '\0') {
> + break;
> + }
> + }
> + return NULL;
> +}
> +
> // If the return value is not NULL the caller should free R
> static char *regex_search(char *q, regex_t *preg, const char *Rorig,
> size_t *len_F, size_t *len_R, char **R)
> @@ -2728,6 +2741,8 @@ static char *regex_search(char *q, regex_t *preg, const char *Rorig,
>
> return found;
> }
> +#else /* !ENABLE_FEATURE_VI_REGEX_SEARCH */
> +# define strchr_backslash(s, c) strchr(s, c)
> #endif /* ENABLE_FEATURE_VI_REGEX_SEARCH */
>
> // buf must be no longer than MAX_INPUT_LEN!
> @@ -3151,12 +3166,12 @@ static void colon(char *buf)
> // replace the cmd line delimiters "/" with NULs
> c = buf[1]; // what is the delimiter
> F = buf + 2; // start of "find"
> - R = strchr(F, c); // middle delimiter
> + R = strchr_backslash(F, c); // middle delimiter
> if (!R)
> goto colon_s_fail;
> len_F = R - F;
> *R++ = '\0'; // terminate "find"
> - flags = strchr(R, c);
> + flags = strchr_backslash(R, c);
> if (flags) {
> *flags++ = '\0'; // terminate "replace"
> gflag = *flags;
> --
> 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