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) 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 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"\