summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Thau2021-09-02 07:41:08 -0400
committerDenys Vlasenko2021-09-30 00:15:44 +0200
commit9ea17d5a0a7723bac05633520277a1ca35180a16 (patch)
treeb487f699e6980c2353919845647e0c15b52ed598
parent76ef4391548ded8db511e2f7f8f35a3010be7ec5 (diff)
downloadbusybox-9ea17d5a0a7723bac05633520277a1ca35180a16.zip
busybox-9ea17d5a0a7723bac05633520277a1ca35180a16.tar.gz
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 3adbca7..f7b8ef0 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++;
+ c = *++f;
+ if (c == '%') { /* double % */
+ slen = f - s;
+ s = xstrndup(s, slen);
+ f++;
+ 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 dc2ae2e..bcaafe8 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 34a6592..050edef 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"\