From 9471bd46603d9f61c76d672b0a679c2b9446c3cf Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 23 Dec 2018 00:13:15 +0100 Subject: [PATCH] bc: fix empty lines in dc generating "bad token" message function old new delta zdc_program_asciify - 370 +370 zbc_program_pushArray - 147 +147 zbc_vm_process 824 828 +4 zbc_program_exec 4182 4046 -136 zdc_program_printStream 146 - -146 zbc_program_read 268 - -268 ------------------------------------------------------------------------------ (add/remove: 2/2 grow/shrink: 1/1 up/down: 521/-550) Total: -29 bytes Signed-off-by: Denys Vlasenko --- miscutils/bc.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/miscutils/bc.c b/miscutils/bc.c index 25150a9eb..a7b8aa4bb 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c @@ -6695,9 +6695,18 @@ static BC_STATUS zbc_vm_process(const char *text) // "print 1" part. IF_BC(s = zbc_parse_stmt_or_funcdef(&G.prs)); } else { + // Most of dc parsing assumes all whitespace, + // including '\n', is eaten. + while (G.prs.l.t.t == BC_LEX_NLINE) { + s = zbc_lex_next(&G.prs.l); + if (s) goto err; + if (G.prs.l.t.t == BC_LEX_EOF) + goto done; + } IF_DC(s = zdc_parse_expr(&G.prs)); } if (s || G_interrupt) { + err: bc_parse_reset(&G.prs); // includes bc_program_reset() RETURN_STATUS(BC_STATUS_FAILURE); } @@ -6735,13 +6744,6 @@ static BC_STATUS zbc_vm_process(const char *text) IF_BC(bc_vec_pop_all(&f->strs);) IF_BC(bc_vec_pop_all(&f->consts);) } else { - // Most of dc parsing assumes all whitespace, - // including '\n', is eaten. - if (G.prs.l.t.t == BC_LEX_NLINE) { - s = zbc_lex_next(&G.prs.l); - if (s) RETURN_STATUS(s); - } - if (G.prog.results.len == 0 && G.prog.vars.len == 0 ) { @@ -6762,7 +6764,7 @@ static BC_STATUS zbc_vm_process(const char *text) bc_vec_pop_all(&f->code); ip->inst_idx = 0; } - + done: dbg_lex_done("%s:%d done", __func__, __LINE__); RETURN_STATUS(s); }