Process $ expansions inside #include
This commit is contained in:
parent
d5c1759def
commit
d3f8a0bce1
4 changed files with 40 additions and 0 deletions
|
|
@ -184,8 +184,13 @@ void Parser::processDirective()
|
||||||
std::string path;
|
std::string path;
|
||||||
bool valid = false;
|
bool valid = false;
|
||||||
|
|
||||||
|
SourceLocation valueStart;
|
||||||
|
SourceLocation valueEnd;
|
||||||
|
|
||||||
if (reader.extractExactChar('"')) {
|
if (reader.extractExactChar('"')) {
|
||||||
|
valueStart = reader.location();
|
||||||
reader.extractWhile(&path, [](char c) { return c != '"' && c != '\r' && c != '\n'; });
|
reader.extractWhile(&path, [](char c) { return c != '"' && c != '\r' && c != '\n'; });
|
||||||
|
valueEnd = reader.location();
|
||||||
valid = reader.extractExactChar('"');
|
valid = reader.extractExactChar('"');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -197,6 +202,8 @@ void Parser::processDirective()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
path = expandDollarVars({ valueStart, valueEnd }, path);
|
||||||
|
|
||||||
std::replace(path.begin(), path.end(), '\\', '/');
|
std::replace(path.begin(), path.end(), '\\', '/');
|
||||||
includeNewFile(path, nullptr, { start, end });
|
includeNewFile(path, nullptr, { start, end });
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -716,3 +716,32 @@ R"(<region> sample=foo bar baz .wav key=69 )");
|
||||||
REQUIRE(mock.fullBlockHeaders == expectedHeaders);
|
REQUIRE(mock.fullBlockHeaders == expectedHeaders);
|
||||||
REQUIRE(mock.fullBlockMembers == expectedMembers);
|
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);
|
||||||
|
}
|
||||||
|
|
|
||||||
3
tests/TestFiles/dollar_include_main.sfz
Normal file
3
tests/TestFiles/dollar_include_main.sfz
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
#define $foo dollar
|
||||||
|
#define $bar sine
|
||||||
|
#include "$foo_include_$bar.sfz"
|
||||||
1
tests/TestFiles/dollar_include_sine.sfz
Normal file
1
tests/TestFiles/dollar_include_sine.sfz
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
<region> sample=*sine
|
||||||
Loading…
Add table
Reference in a new issue