diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-18 14:37:16 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-18 14:39:33 +0100 |
commit | 55f3cab7e9f61c1e9fc342f2d245d6b055a08b84 (patch) | |
tree | 3ebd6f171988f9ce3d006947301b3dccb594ad01 | |
parent | a199cc95b726df7023c19fa5130a3b55287e43a2 (diff) | |
download | busybox-w32-55f3cab7e9f61c1e9fc342f2d245d6b055a08b84.tar.gz busybox-w32-55f3cab7e9f61c1e9fc342f2d245d6b055a08b84.tar.bz2 busybox-w32-55f3cab7e9f61c1e9fc342f2d245d6b055a08b84.zip |
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>
-rw-r--r-- | miscutils/bc.c | 10 | ||||
-rwxr-xr-x | testsuite/bc.tests | 5 |
2 files changed, 12 insertions, 3 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index a5fcaf3bc..eaa28a94a 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c | |||
@@ -2655,9 +2655,13 @@ static FAST_FUNC void bc_result_free(void *result) | |||
2655 | 2655 | ||
2656 | static void bc_lex_lineComment(BcLex *l) | 2656 | static void bc_lex_lineComment(BcLex *l) |
2657 | { | 2657 | { |
2658 | // Try: echo -n '#foo' | bc | ||
2659 | size_t i; | ||
2658 | l->t.t = BC_LEX_WHITESPACE; | 2660 | l->t.t = BC_LEX_WHITESPACE; |
2659 | while (l->i < l->len && l->buf[l->i++] != '\n'); | 2661 | i = l->i; |
2660 | --l->i; | 2662 | while (i < l->len && l->buf[i] != '\n') |
2663 | i++; | ||
2664 | l->i = i; | ||
2661 | } | 2665 | } |
2662 | 2666 | ||
2663 | static void bc_lex_whitespace(BcLex *l) | 2667 | static void bc_lex_whitespace(BcLex *l) |
@@ -2889,8 +2893,8 @@ static BC_STATUS zbc_lex_next(BcLex *l) | |||
2889 | // Comments are also BC_LEX_WHITESPACE tokens and eaten here. | 2893 | // Comments are also BC_LEX_WHITESPACE tokens and eaten here. |
2890 | s = BC_STATUS_SUCCESS; | 2894 | s = BC_STATUS_SUCCESS; |
2891 | do { | 2895 | do { |
2892 | l->t.t = BC_LEX_EOF; | ||
2893 | if (l->i == l->len) { | 2896 | if (l->i == l->len) { |
2897 | l->t.t = BC_LEX_EOF; | ||
2894 | if (!G.input_fp) | 2898 | if (!G.input_fp) |
2895 | RETURN_STATUS(BC_STATUS_SUCCESS); | 2899 | RETURN_STATUS(BC_STATUS_SUCCESS); |
2896 | if (!bc_lex_more_input(l)) { | 2900 | if (!bc_lex_more_input(l)) { |
diff --git a/testsuite/bc.tests b/testsuite/bc.tests index e0a45a8bd..e303cf6ae 100755 --- a/testsuite/bc.tests +++ b/testsuite/bc.tests | |||
@@ -16,6 +16,11 @@ testing "bc comment 2: /*/ is not a closed comment" \ | |||
16 | "4\n" \ | 16 | "4\n" \ |
17 | "" "1 /*/ + 2 */ + 3" | 17 | "" "1 /*/ + 2 */ + 3" |
18 | 18 | ||
19 | testing "bc comment 3: unterminated #comment" \ | ||
20 | "bc" \ | ||
21 | "" \ | ||
22 | "" "#foo" # no trailing newline | ||
23 | |||
19 | testing "bc backslash 1" \ | 24 | testing "bc backslash 1" \ |
20 | "bc" \ | 25 | "bc" \ |
21 | "3\n" \ | 26 | "3\n" \ |