bc: fix interactive handling of comments in strings and quotes in comments

function                                             old     new   delta
zbc_lex_next                                        1965    1979     +14

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko
2018-12-25 23:45:57 +01:00
parent c192b0442b
commit 94576d2b97
2 changed files with 34 additions and 18 deletions

View File

@@ -2910,6 +2910,7 @@ static bool bc_lex_more_input(void)
string = G.input_buffer.v + prevlen; string = G.input_buffer.v + prevlen;
while (*string) { while (*string) {
char c = *string; char c = *string;
if (!comment) {
if (string == G.input_buffer.v || string[-1] != '\\') { if (string == G.input_buffer.v || string[-1] != '\\') {
if (IS_BC) if (IS_BC)
str ^= (c == '"'); str ^= (c == '"');
@@ -2920,7 +2921,9 @@ static bool bc_lex_more_input(void)
str += 1; str += 1;
} }
} }
}
string++; string++;
if (!str) {
if (c == '/' && *string == '*') { if (c == '/' && *string == '*') {
comment = true; comment = true;
string++; string++;
@@ -2931,6 +2934,7 @@ static bool bc_lex_more_input(void)
string++; string++;
} }
} }
}
if (str != 0 || comment) { if (str != 0 || comment) {
G.input_buffer.len--; // backstep over the trailing NUL byte G.input_buffer.len--; // backstep over the trailing NUL byte
continue; continue;

View File

@@ -6,16 +6,28 @@
# testing "test name" "command" "expected result" "file input" "stdin" # testing "test name" "command" "expected result" "file input" "stdin"
testing "bc comment 1" \ testing "bc comment" \
"bc" \ "bc" \
"3\n" \ "3\n" \
"" "1 /* comment */ + 2" "" "1 /* comment */ + 2"
testing "bc comment 2: /*/ is not a closed comment" \ testing "bc /*/ is not a closed comment" \
"bc" \ "bc" \
"4\n" \ "4\n" \
"" "1 /*/ + 2 */ + 3" "" "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" \ testing "bc comment 3: unterminated #comment" \
"bc" \ "bc" \
"" \ "" \