[PATCH] awk: fix printf %%
Denys Vlasenko
vda.linux at googlemail.com
Sun Sep 5 01:47:48 UTC 2021
Applied, thank you.
On Thu, Sep 2, 2021 at 1:43 PM Daniel Thau <danthau at bedrocklinux.org> wrote:
>
> A refactor of the awk printf code in
> e2e3802987266c98df0efdf40ad5da4b07df0113
> appears to have broken the printf interpretation of two percent signs,
> which normally outputs only one percent sign.
>
> The patch below brings busybox awk printf behavior back into alignment
> with the pre-e2e380 behavior, the busybox printf util, and other common
> (awk and non-awk) printf implementations.
>
> Please let me know if there's anything else I can or should do ensure
> the awk printf %% handling is remedied.
>
> Thanks!
>
> Signed-off-by: Daniel "paradigm" Thau <danthau at bedrocklinux.org>
> ---
> editors/awk.c | 9 ++++++++-
> testsuite/awk.tests | 6 ++++++
> testsuite/printf.tests | 5 +++++
> 3 files changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/editors/awk.c b/editors/awk.c
> index 3adbca7aa..162000697 100644
> --- a/editors/awk.c
> +++ b/editors/awk.c
> @@ -2346,8 +2346,15 @@ static char *awk_printf(node *n, size_t *len)
> size_t slen;
>
> s = f;
> - while (*f && (*f != '%' || *++f == '%'))
> + while (*f && *f != '%')
> f++;
> + if (*++f == '%') { /* double % */
> + *f = '\0';
> + s = xstrdup(s);
> + slen = strlen(s);
> + *f++ = c = '%';
> + goto tail;
> + }
> while (*f && !isalpha(*f)) {
> if (*f == '*')
> syntax_error("%*x formats are not supported");
> diff --git a/testsuite/awk.tests b/testsuite/awk.tests
> index dc2ae2e11..bcaafe8fd 100755
> --- a/testsuite/awk.tests
> +++ b/testsuite/awk.tests
> @@ -463,4 +463,10 @@ testing "awk \"cmd\" | getline" \
> "HELLO\n" \
> '' ''
>
> +# printf %% should print one % (had a bug where it didn't)
> +testing 'awk printf %% prints one %' \
> + "awk 'BEGIN { printf \"%%\n\" }'" \
> + "%\n" \
> + '' ''
> +
> exit $FAILCOUNT
> diff --git a/testsuite/printf.tests b/testsuite/printf.tests
> index 34a65926e..050edef71 100755
> --- a/testsuite/printf.tests
> +++ b/testsuite/printf.tests
> @@ -79,6 +79,11 @@ testing "printf understands %Ld" \
> "-5\n""0\n" \
> "" ""
>
> +testing "printf understands %%" \
> + "${bb}printf '%%\n' 2>&1; echo \$?" \
> + "%\n""0\n" \
> + "" ""
> +
> testing "printf handles positive numbers for %d" \
> "${bb}printf '%d\n' 3 +3 ' 3' ' +3' 2>&1; echo \$?" \
> "3\n"\
> --
> 2.20.1
>
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
More information about the busybox
mailing list