bc: fix interactive handling of comments in strings and quotes in comments
No binary (build failed)
—
(log yok)
| @@ -2910,25 +2910,29 @@ static bool bc_lex_more_input(void) | |
| string = G.input_buffer.v + prevlen; | |
| while (*string) { | |
| char c = *string; | |
| - | if (string == G.input_buffer.v || string[-1] != '\\') { |
| - | if (IS_BC) |
| - | str ^= (c == '"'); |
| - | else { |
| - | if (c == ']') |
| - | str -= 1; |
| - | else if (c == '[') |
| - | str += 1; |
| + | if (!comment) { |
| + | if (string == G.input_buffer.v || string[-1] != '\\') { |
| + | if (IS_BC) |
| + | str ^= (c == '"'); |
| + | else { |
| + | if (c == ']') |
| + | str -= 1; |
| + | else if (c == '[') |
| + | str += 1; |
| + | } |
| } | |
| } | |
| string++; | |
| - | if (c == '/' && *string == '*') { |
| - | comment = true; |
| - | string++; |
| - | continue; |
| - | } |
| - | if (c == '*' && *string == '/') { |
| - | comment = false; |
| - | string++; |
| + | if (!str) { |
| + | if (c == '/' && *string == '*') { |
| + | comment = true; |
| + | string++; |
| + | continue; |
| + | } |
| + | if (c == '*' && *string == '/') { |
| + | comment = false; |
| + | string++; |
| + | } |
| } | |
| } | |
| if (str != 0 || comment) { | |
| @@ -6,16 +6,28 @@ | |
| # testing "test name" "command" "expected result" "file input" "stdin" | |
| - | testing "bc comment 1" \ |
| + | testing "bc comment" \ |
| "bc" \ | |
| "3\n" \ | |
| "" "1 /* comment */ + 2" | |
| - | testing "bc comment 2: /*/ is not a closed comment" \ |
| + | testing "bc /*/ is not a closed comment" \ |
| "bc" \ | |
| "4\n" \ | |
| "" "1 /*/ + 2 */ + 3" | |
| + | # this needs interactive testing |
| + | testing "bc comment with \"" \ |
| + | "bc" \ |
| + | "3\n" \ |
| + | "" "1 /* \" */ + 2" |
| + | |
| + | # this needs interactive testing |
| + | testing "bc \"string/*\" is not a comment" \ |
| + | "bc" \ |
| + | "string/*9\n" \ |
| + | "" "\"string/*\";9" |
| + | |
| testing "bc comment 3: unterminated #comment" \ | |
| "bc" \ | |
| "" \ | |