aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Thau <danthau@bedrocklinux.org>2021-09-02 07:41:08 -0400
committerDenys Vlasenko <vda.linux@googlemail.com>2021-09-05 03:42:51 +0200
commit7d06d6e18651cb183a3723fa21ef62935ea08647 (patch)
tree29a36fb92c34c697ca6e0c21d5cdc4edf26484d3
parentf4ba69d47698c5357c32e21eb9122a5031b9b080 (diff)
downloadbusybox-w32-7d06d6e18651cb183a3723fa21ef62935ea08647.tar.gz
busybox-w32-7d06d6e18651cb183a3723fa21ef62935ea08647.tar.bz2
busybox-w32-7d06d6e18651cb183a3723fa21ef62935ea08647.zip
awk: fix printf %%
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. function old new delta awk_printf 626 672 +46 Signed-off-by: Daniel Thau <danthau at bedrocklinux.org> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--editors/awk.c9
-rwxr-xr-xtestsuite/awk.tests6
-rwxr-xr-xtestsuite/printf.tests5
3 files changed, 19 insertions, 1 deletions
diff --git a/editors/awk.c b/editors/awk.c
index 3adbca7aa..f7b8ef0d3 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -2346,8 +2346,15 @@ static char *awk_printf(node *n, size_t *len)
2346 size_t slen; 2346 size_t slen;
2347 2347
2348 s = f; 2348 s = f;
2349 while (*f && (*f != '%' || *++f == '%')) 2349 while (*f && *f != '%')
2350 f++; 2350 f++;
2351 c = *++f;
2352 if (c == '%') { /* double % */
2353 slen = f - s;
2354 s = xstrndup(s, slen);
2355 f++;
2356 goto tail;
2357 }
2351 while (*f && !isalpha(*f)) { 2358 while (*f && !isalpha(*f)) {
2352 if (*f == '*') 2359 if (*f == '*')
2353 syntax_error("%*x formats are not supported"); 2360 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" \
463 "HELLO\n" \ 463 "HELLO\n" \
464 '' '' 464 '' ''
465 465
466# printf %% should print one % (had a bug where it didn't)
467testing 'awk printf %% prints one %' \
468 "awk 'BEGIN { printf \"%%\n\" }'" \
469 "%\n" \
470 '' ''
471
466exit $FAILCOUNT 472exit $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" \
79 "-5\n""0\n" \ 79 "-5\n""0\n" \
80 "" "" 80 "" ""
81 81
82testing "printf understands %%" \
83 "${bb}printf '%%\n' 2>&1; echo \$?" \
84 "%\n""0\n" \
85 "" ""
86
82testing "printf handles positive numbers for %d" \ 87testing "printf handles positive numbers for %d" \
83 "${bb}printf '%d\n' 3 +3 ' 3' ' +3' 2>&1; echo \$?" \ 88 "${bb}printf '%d\n' 3 +3 ' 3' ' +3' 2>&1; echo \$?" \
84 "3\n"\ 89 "3\n"\