From f5b9829e8fc5f3f10323f5d4d5e74dbe15a4ac57 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Thu, 23 Jul 2020 16:30:52 +0200 Subject: [PATCH 1/3] Failing parser test --- tests/ParsingT.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/ParsingT.cpp b/tests/ParsingT.cpp index 4cf3bbfa..b61375bc 100644 --- a/tests/ParsingT.cpp +++ b/tests/ParsingT.cpp @@ -622,6 +622,48 @@ R"(#define $B foo-$A-baz REQUIRE(mock.fullBlockMembers == expectedMembers); } +TEST_CASE("[Parsing] Strange #define behavior") +{ + sfz::Parser parser; + ParsingMocker mock; + parser.setListener(&mock); + parser.parseString("/define_cc_bug.sfz",R"( +#define $CCVAL 100 + amplitude_oncc$CCVAL=100 sample=*sine + transpose=-12 amplitude_oncc$CCVAL=100 sample=*sine + transpose=-12 amplitude_oncc100=100 sample=*sine +)"); + + std::vector> expectedMembers = { + {{"amplitude_oncc100", "100"}}, + {{"sample", "*sine"}}, + {{"transpose", "-12"}}, + {{"amplitude_oncc100", "100"}}, + {{"sample", "*sine"}}, + {{"transpose", "-12"}}, + {{"amplitude_oncc100", "100"}}, + {{"sample", "*sine"}}, + }; + + std::vector expectedHeaders = { + "region", "region", "region" + }; + std::vector expectedOpcodes; + + for (auto& members: expectedMembers) + for (auto& opcode: members) + expectedOpcodes.push_back(opcode); + + REQUIRE(mock.beginnings == 1); + REQUIRE(mock.endings == 1); + REQUIRE(mock.errors.empty()); + REQUIRE(mock.warnings.empty()); + REQUIRE(mock.opcodes == expectedOpcodes); + REQUIRE(mock.headers == expectedHeaders); + REQUIRE(mock.fullBlockHeaders == expectedHeaders); + REQUIRE(mock.fullBlockMembers == expectedMembers); +} + TEST_CASE("[Parsing] Opcode value special character") { sfz::Parser parser; From eac81e673395b672d80f990d780389877eeb51b6 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Thu, 23 Jul 2020 22:32:07 +0200 Subject: [PATCH 2/3] Also check for opcode containing $ in value extraction --- src/sfizz/parser/Parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sfizz/parser/Parser.cpp b/src/sfizz/parser/Parser.cpp index c846e588..071bc1e2 100644 --- a/src/sfizz/parser/Parser.cpp +++ b/src/sfizz/parser/Parser.cpp @@ -314,7 +314,7 @@ void Parser::processOpcode() // if sequence of identifier chars and then "=", an opcode follows else if (isIdentifierChar(valueRaw[i])) { ++i; - while (i < valueSize && isIdentifierChar(valueRaw[i])) + while (i < valueSize && (isIdentifierChar(valueRaw[i]) || valueRaw[i] == '$')) ++i; if (i < valueSize && valueRaw[i] == '=') stop = true; From 003676a6c23ddfd3855265d6ffa1dc4c562d9d28 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Thu, 23 Jul 2020 22:36:05 +0200 Subject: [PATCH 3/3] Rewrite the test correctly --- tests/ParsingT.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/ParsingT.cpp b/tests/ParsingT.cpp index b61375bc..a1e12266 100644 --- a/tests/ParsingT.cpp +++ b/tests/ParsingT.cpp @@ -635,14 +635,14 @@ TEST_CASE("[Parsing] Strange #define behavior") )"); std::vector> expectedMembers = { - {{"amplitude_oncc100", "100"}}, - {{"sample", "*sine"}}, - {{"transpose", "-12"}}, - {{"amplitude_oncc100", "100"}}, - {{"sample", "*sine"}}, - {{"transpose", "-12"}}, - {{"amplitude_oncc100", "100"}}, - {{"sample", "*sine"}}, + {{"amplitude_oncc100", "100"}, + {"sample", "*sine"}}, + {{"transpose", "-12"}, + {"amplitude_oncc100", "100"}, + {"sample", "*sine"}}, + {{"transpose", "-12"}, + {"amplitude_oncc100", "100"}, + {"sample", "*sine"}}, }; std::vector expectedHeaders = {