diff --git a/src/sfizz/parser/Parser.cpp b/src/sfizz/parser/Parser.cpp index a08d2bcc..a5ebd57f 100644 --- a/src/sfizz/parser/Parser.cpp +++ b/src/sfizz/parser/Parser.cpp @@ -295,7 +295,7 @@ void Parser::processOpcode() bool stop = false; // consume space characters following - while (i < valueSize && isSpaceChar(valueRaw[endPosition + 1])) + while (i < valueSize && isSpaceChar(valueRaw[i])) ++i; // if there aren't non-space characters following, do not extract diff --git a/tests/ParsingT.cpp b/tests/ParsingT.cpp index b54b40db..41fe8383 100644 --- a/tests/ParsingT.cpp +++ b/tests/ParsingT.cpp @@ -685,3 +685,34 @@ R"(#define $VEL v1 sample=$VEL.wav #define $FOO bar)"); REQUIRE(mock.fullBlockHeaders == expectedHeaders); REQUIRE(mock.fullBlockMembers == expectedMembers); } + +TEST_CASE("[Parsing] Opcode value with multiple consecutive spaces") +{ + sfz::Parser parser; + ParsingMocker mock; + parser.setListener(&mock); + parser.parseString("/opcodeValueWithMultipleConsecutiveSpaces.sfz", +R"( sample=foo bar baz .wav key=69 )"); + + std::vector> expectedMembers = { + {{"sample", "foo bar baz .wav"}, + {"key", "69"}}, + }; + std::vector expectedHeaders = { + "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); +}