awk error as of git / today

Ron Yorston rmy at pobox.com
Fri Jul 9 08:10:43 UTC 2021


Steffen Nurpmeso wrote:
>  $ AWK="/home/steffen/usr-kent-linux-x86_64/bin/busybox awk" \
>    dash mdocmx.sh mdocmx.1|wc -l
>  27

Commit 08ca313d7 (awk: simplify tests for operation class) replaced
tests for operation classes with simple equality tests.

It seems this doesn't work for combinations of print and redirection.
In that case this code:

   case OC_PRINT:
   case OC_PRINTF:
      debug_printf_parse("%s: OC_PRINT[F]\n", __func__);
      n = chain_node(t_info);
      n->l.n = parse_expr(TC_SEMICOL | TC_NEWLINE | TC_OUTRDR | TC_RBRACE);
      if (t_tclass & TC_OUTRDR) {
         n->info |= t_info;
         n->r.n = parse_expr(TC_SEMICOL | TC_NEWLINE | TC_RBRACE);
      }
      if (t_tclass & TC_RBRACE)
         rollback_token();
      break;

combines the print and redirection bits.

Reverting the part of the commit that handles OC_PRINT appears to
fix the problem.  No guarantees, though.

Ron
---
 editors/awk.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/editors/awk.c b/editors/awk.c
index cd135ef64..4dc4d47aa 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -462,8 +462,7 @@ static const uint32_t tokeninfo[] ALIGN4 = {
 	0,
 	0, /* \n */
 	ST_IF,        ST_DO,        ST_FOR,      OC_BREAK,
-#define TI_PRINT OC_PRINT
-	OC_CONTINUE,  OC_DELETE|Rx, TI_PRINT,
+	OC_CONTINUE,  OC_DELETE|Rx, OC_PRINT,
 	OC_PRINTF,    OC_NEXT,      OC_NEXTFILE,
 	OC_RETURN|Vx, OC_EXIT|Nx,
 	ST_WHILE,
@@ -2929,7 +2928,7 @@ static var *evaluate(node *op, var *res)
 				F = rsm->F;
 			}
 
-			if (opinfo == TI_PRINT) {
+			if ((opinfo & OPCLSMASK) == OC_PRINT) {
 				if (!op1) {
 					fputs(getvar_s(intvar[F0]), F);
 				} else {
-- 
2.31.1



More information about the busybox mailing list