[git commit] awk: fix handling of "if ... break ; else ..." - closes 7226

Denys Vlasenko vda.linux at googlemail.com
Thu Jun 26 14:40:28 UTC 2014


commit: http://git.busybox.net/busybox/commit/?id=5f8daefb835687e428215f90d26fdf1f0206149d
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 editors/awk.c       |    2 ++
 testsuite/awk.tests |   16 ++++++++++++++++
 2 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/editors/awk.c b/editors/awk.c
index d0e3781..f487163 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -1540,12 +1540,14 @@ static void chain_group(void)
 			debug_printf_parse("%s: OC_BREAK\n", __func__);
 			n = chain_node(OC_EXEC);
 			n->a.n = break_ptr;
+			chain_expr(t_info);
 			break;
 
 		case OC_CONTINUE:
 			debug_printf_parse("%s: OC_CONTINUE\n", __func__);
 			n = chain_node(OC_EXEC);
 			n->a.n = continue_ptr;
+			chain_expr(t_info);
 			break;
 
 		/* delete, next, nextfile, return, exit */
diff --git a/testsuite/awk.tests b/testsuite/awk.tests
index 132afc6..9e6952f 100755
--- a/testsuite/awk.tests
+++ b/testsuite/awk.tests
@@ -295,6 +295,22 @@ testing "awk -e and ARGC" \
 	""
 SKIP=
 
+# The examples are in fact not valid awk programs (break/continue
+# can only be used inside loops).
+# But we do accept them outside of loops.
+# We had a bug with misparsing "break ; else" sequence.
+# Test that *that* bug is fixed, using simplest possible scripts:
+testing "awk break" \
+	"awk -f - 2>&1; echo \$?" \
+	"0\n" \
+	"" \
+	'BEGIN { if (1) break; else a = 1 }'
+testing "awk continue" \
+	"awk -f - 2>&1; echo \$?" \
+	"0\n" \
+	"" \
+	'BEGIN { if (1) continue; else a = 1 }'
+
 # testing "description" "command" "result" "infile" "stdin"
 
 exit $FAILCOUNT


More information about the busybox-cvs mailing list