[git commit] bc: fix interactive handling of comments in strings and quotes in comments

Denys Vlasenko vda.linux at googlemail.com
Tue Dec 25 22:45:57 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=94576d2b972b3bd136fbe8057c95690ae36ea8c9
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
zbc_lex_next                                        1965    1979     +14

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 miscutils/bc.c     | 36 ++++++++++++++++++++----------------
 testsuite/bc.tests | 16 ++++++++++++++--
 2 files changed, 34 insertions(+), 18 deletions(-)

diff --git a/miscutils/bc.c b/miscutils/bc.c
index 809b4bfc4..9d04ddea3 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -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) {
diff --git a/testsuite/bc.tests b/testsuite/bc.tests
index 42fe83013..3fbb49996 100755
--- a/testsuite/bc.tests
+++ b/testsuite/bc.tests
@@ -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" \
 	"" \


More information about the busybox-cvs mailing list