Process $ expansions inside #include

This commit is contained in:
Jean Pierre Cimalando 2020-05-18 18:02:41 +02:00
parent d5c1759def
commit d3f8a0bce1
4 changed files with 40 additions and 0 deletions

View file

@ -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 });
}

View file

@ -716,3 +716,32 @@ R"(<region> 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<std::vector<sfz::Opcode>> expectedMembers = {
{{"sample", "*sine"}},
};
std::vector<std::string> expectedHeaders = {
"region"
};
std::vector<sfz::Opcode> 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);
}

View file

@ -0,0 +1,3 @@
#define $foo dollar
#define $bar sine
#include "$foo_include_$bar.sfz"

View file

@ -0,0 +1 @@
<region> sample=*sine