[git commit] bc: fix "print 1,2,3" parsing

Denys Vlasenko vda.linux at googlemail.com
Sun Dec 16 20:08:30 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=5d18f6be90a940f80c3b7238dc7a8b42a41f55bd
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        2245    2180     -65
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-65)             Total: -65 bytes
   text	   data	    bss	    dec	    hex	filename
 982237	    485	   7296	 990018	  f1b42	busybox_old
 982152	    485	   7296	 989933	  f1aed	busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 miscutils/bc.c     | 31 ++++++++-----------------------
 testsuite/bc.tests |  5 +++++
 2 files changed, 13 insertions(+), 23 deletions(-)

diff --git a/miscutils/bc.c b/miscutils/bc.c
index 2dc64dbc6..9f40a551e 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -4048,38 +4048,23 @@ static BC_STATUS zbc_parse_print(BcParse *p)
 {
 	BcStatus s;
 	BcLexType type;
-	bool comma;
 
-	s = zbc_lex_next(&p->l);
-	if (s) RETURN_STATUS(s);
-
-	type = p->l.t.t;
-
-	if (type == BC_LEX_SCOLON || type == BC_LEX_NLINE)
-		RETURN_STATUS(bc_error("bad print statement"));
-
-	comma = false;
-	while (type != BC_LEX_SCOLON && type != BC_LEX_NLINE) {
+	for (;;) {
+		s = zbc_lex_next(&p->l);
+		if (s) RETURN_STATUS(s);
+		type = p->l.t.t;
 		if (type == BC_LEX_STR) {
 			s = zbc_parse_string(p, BC_INST_PRINT_POP);
-			if (s) RETURN_STATUS(s);
 		} else {
 			s = zbc_parse_expr(p, 0, bc_parse_next_print);
-			if (s) RETURN_STATUS(s);
 			bc_parse_push(p, BC_INST_PRINT_POP);
 		}
-
-		comma = p->l.t.t == BC_LEX_COMMA;
-		if (comma) {
-			s = zbc_lex_next(&p->l);
-			if (s) RETURN_STATUS(s);
-		}
-		type = p->l.t.t;
+		if (s) RETURN_STATUS(s);
+		if (p->l.t.t != BC_LEX_COMMA)
+			break;
 	}
 
-	if (comma) RETURN_STATUS(bc_error_bad_token());
-
-	RETURN_STATUS(zbc_lex_next(&p->l));
+	RETURN_STATUS(s);
 }
 #if ERRORS_ARE_FATAL
 # define zbc_parse_print(...) (zbc_parse_print(__VA_ARGS__), BC_STATUS_SUCCESS)
diff --git a/testsuite/bc.tests b/testsuite/bc.tests
index 36baeea89..21b26008f 100755
--- a/testsuite/bc.tests
+++ b/testsuite/bc.tests
@@ -71,6 +71,11 @@ testing "bc while(cond)<NL>" \
 	"8\n7\n6\n5\n4\n3\n2\n1\n9\n" \
 	"" "i=9;while(--i)\ni\n9"
 
+testing "bc print 1,2,3" \
+	"bc" \
+	"123" \
+	"" "print 1,2,3"
+
 tar xJf bc_large.tar.xz
 
 for f in bc*.bc; do


More information about the busybox-cvs mailing list