bc: fix "echo -n '#foo' | bc" not eating last 'o'

function                                             old     new   delta
zdc_parse_expr                                       656     653      -3
bc_lex_lineComment                                    39      36      -3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-6)               Total: -6 bytes
   text	   data	    bss	    dec	    hex	filename
 981424	    485	   7296	 989205	  f1815	busybox_old
 981418	    485	   7296	 989199	  f180f	busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-12-18 14:37:16 +01:00
parent a199cc95b7
commit 55f3cab7e9
2 changed files with 12 additions and 3 deletions

View File

@ -2655,9 +2655,13 @@ static FAST_FUNC void bc_result_free(void *result)
static void bc_lex_lineComment(BcLex *l)
{
// Try: echo -n '#foo' | bc
size_t i;
l->t.t = BC_LEX_WHITESPACE;
while (l->i < l->len && l->buf[l->i++] != '\n');
--l->i;
i = l->i;
while (i < l->len && l->buf[i] != '\n')
i++;
l->i = i;
}
static void bc_lex_whitespace(BcLex *l)
@ -2889,8 +2893,8 @@ static BC_STATUS zbc_lex_next(BcLex *l)
// Comments are also BC_LEX_WHITESPACE tokens and eaten here.
s = BC_STATUS_SUCCESS;
do {
l->t.t = BC_LEX_EOF;
if (l->i == l->len) {
l->t.t = BC_LEX_EOF;
if (!G.input_fp)
RETURN_STATUS(BC_STATUS_SUCCESS);
if (!bc_lex_more_input(l)) {

View File

@ -16,6 +16,11 @@ testing "bc comment 2: /*/ is not a closed comment" \
"4\n" \
"" "1 /*/ + 2 */ + 3"
testing "bc comment 3: unterminated #comment" \
"bc" \
"" \
"" "#foo" # no trailing newline
testing "bc backslash 1" \
"bc" \
"3\n" \