bc: fix "print 1,2,3" parsing
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 16 Dec 2018 20:08:30 +0000 (21:08 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 16 Dec 2018 20:08:30 +0000 (21:08 +0100)
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@googlemail.com>
miscutils/bc.c
testsuite/bc.tests

index 2dc64dbc6446957ca04d6df12e9236d0fdaecfa1..9f40a551ed6df219fd9f33e1c3c16a9b0a432313 100644 (file)
@@ -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)
index 36baeea89bb4c3647cab29ff958b852aa3105d1b..21b26008f0cddcea269bbdde0146eb560f63688d 100755 (executable)
@@ -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