summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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"\