bc: fix "print 1,2,3" parsing

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>
This commit is contained in:
Denys Vlasenko 2018-12-16 21:08:30 +01:00
parent cb18b546f7
commit 5d18f6be90
2 changed files with 13 additions and 23 deletions

View 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)

View File

@ -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