From d3f8a0bce103eaf3977de2180db44e72815a6689 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Mon, 18 May 2020 18:02:41 +0200 Subject: [PATCH] Process $ expansions inside #include --- src/sfizz/parser/Parser.cpp | 7 ++++++ tests/ParsingT.cpp | 29 +++++++++++++++++++++++++ tests/TestFiles/dollar_include_main.sfz | 3 +++ tests/TestFiles/dollar_include_sine.sfz | 1 + 4 files changed, 40 insertions(+) create mode 100644 tests/TestFiles/dollar_include_main.sfz create mode 100644 tests/TestFiles/dollar_include_sine.sfz diff --git a/src/sfizz/parser/Parser.cpp b/src/sfizz/parser/Parser.cpp index a5ebd57f..c846e588 100644 --- a/src/sfizz/parser/Parser.cpp +++ b/src/sfizz/parser/Parser.cpp @@ -184,8 +184,13 @@ void Parser::processDirective() std::string path; bool valid = false; + SourceLocation valueStart; + SourceLocation valueEnd; + if (reader.extractExactChar('"')) { + valueStart = reader.location(); reader.extractWhile(&path, [](char c) { return c != '"' && c != '\r' && c != '\n'; }); + valueEnd = reader.location(); valid = reader.extractExactChar('"'); } @@ -197,6 +202,8 @@ void Parser::processDirective() return; } + path = expandDollarVars({ valueStart, valueEnd }, path); + std::replace(path.begin(), path.end(), '\\', '/'); includeNewFile(path, nullptr, { start, end }); } diff --git a/tests/ParsingT.cpp b/tests/ParsingT.cpp index 41fe8383..4cf3bbfa 100644 --- a/tests/ParsingT.cpp +++ b/tests/ParsingT.cpp @@ -716,3 +716,32 @@ R"( sample=foo bar baz .wav key=69 )"); REQUIRE(mock.fullBlockHeaders == expectedHeaders); REQUIRE(mock.fullBlockMembers == expectedMembers); } + +TEST_CASE("[Parsing] Expanded value of #include") +{ + sfz::Parser parser; + ParsingMocker mock; + parser.setListener(&mock); + parser.parseFile(fs::current_path() / "tests/TestFiles/dollar_include_main.sfz"); + + std::vector> expectedMembers = { + {{"sample", "*sine"}}, + }; + 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); +} diff --git a/tests/TestFiles/dollar_include_main.sfz b/tests/TestFiles/dollar_include_main.sfz new file mode 100644 index 00000000..594bc7e9 --- /dev/null +++ b/tests/TestFiles/dollar_include_main.sfz @@ -0,0 +1,3 @@ +#define $foo dollar +#define $bar sine +#include "$foo_include_$bar.sfz" diff --git a/tests/TestFiles/dollar_include_sine.sfz b/tests/TestFiles/dollar_include_sine.sfz new file mode 100644 index 00000000..4a2aac97 --- /dev/null +++ b/tests/TestFiles/dollar_include_sine.sfz @@ -0,0 +1 @@ + sample=*sine