macro processor: allow @#includepath to accept a colon-separated list of paths

issue#70
Houtan Bastani 2019-06-24 12:20:48 +02:00
parent 6cf9a410d0
commit 12b09073e3
No known key found for this signature in database
GPG Key ID: 000094FB955BE169
3 changed files with 14 additions and 4 deletions

View File

@ -68,7 +68,14 @@ IncludePath::interpret(ostream &output, bool no_line_macro)
StringPtr msp = dynamic_pointer_cast<String>(expr->eval());
if (!msp)
throw StackTrace("File name does not evaluate to a string");
path = *msp;
size_t last = 0;
size_t next = 0;
while ((next = static_cast<string>(*msp).find(":", last)) != string::npos)
{
path.push_back(static_cast<string>(*msp).substr(last, next-last));
last = next + 1;
}
path.push_back(static_cast<string>(*msp).substr(last));
}
catch (StackTrace &ex)
{

View File

@ -83,12 +83,12 @@ namespace macro
{
private:
const ExpressionPtr expr;
string path;
vector<string> path;
public:
IncludePath(const ExpressionPtr expr_arg, Environment &env_arg, const Tokenizer::location location_arg) :
Directive(env_arg, move(location_arg)), expr{move(expr_arg)} { }
void interpret(ostream &output, bool no_line_macro) override;
inline string getPath() const { return path; }
inline vector<string> getPath() const { return path; }
};

View File

@ -85,7 +85,10 @@ Driver::parse(const string &file_arg, const string &basename_arg, istream &modfi
auto ipp = dynamic_pointer_cast<IncludePath>(statement);
if (ipp)
paths.emplace_back(ipp->getPath());
{
auto p = ipp->getPath();
paths.insert(paths.end(), p.begin(), p.end());
}
auto ip = dynamic_pointer_cast<Include>(statement);
if (ip)