macro processor: Make @#include and @#includepath immutable
parent
588896b509
commit
cd99bb3af9
|
@ -41,13 +41,19 @@ Eval::interpret(ostream &output, bool no_line_macro)
|
||||||
|
|
||||||
void
|
void
|
||||||
Include::interpret(ostream &output, bool no_line_macro)
|
Include::interpret(ostream &output, bool no_line_macro)
|
||||||
|
{
|
||||||
|
error(StackTrace("@#include", "should never be interpreted", location));
|
||||||
|
}
|
||||||
|
|
||||||
|
string
|
||||||
|
Include::interpretAndGetName()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
StringPtr msp = dynamic_pointer_cast<String>(expr->eval());
|
StringPtr msp = dynamic_pointer_cast<String>(expr->eval());
|
||||||
if (!msp)
|
if (!msp)
|
||||||
throw StackTrace("File name does not evaluate to a string");
|
throw StackTrace("File name does not evaluate to a string");
|
||||||
name = *msp;
|
return msp->to_string();
|
||||||
}
|
}
|
||||||
catch (StackTrace &ex)
|
catch (StackTrace &ex)
|
||||||
{
|
{
|
||||||
|
@ -58,17 +64,24 @@ Include::interpret(ostream &output, bool no_line_macro)
|
||||||
{
|
{
|
||||||
error(StackTrace("@#include", e.what(), location));
|
error(StackTrace("@#include", e.what(), location));
|
||||||
}
|
}
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
IncludePath::interpret(ostream &output, bool no_line_macro)
|
IncludePath::interpret(ostream &output, bool no_line_macro)
|
||||||
|
{
|
||||||
|
error(StackTrace("@#includepath", "should never be interpreted", location));
|
||||||
|
}
|
||||||
|
|
||||||
|
string
|
||||||
|
IncludePath::interpretAndGetPath()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
StringPtr msp = dynamic_pointer_cast<String>(expr->eval());
|
StringPtr msp = dynamic_pointer_cast<String>(expr->eval());
|
||||||
if (!msp)
|
if (!msp)
|
||||||
throw StackTrace("File name does not evaluate to a string");
|
throw StackTrace("File name does not evaluate to a string");
|
||||||
path = *msp;
|
return *msp;
|
||||||
}
|
}
|
||||||
catch (StackTrace &ex)
|
catch (StackTrace &ex)
|
||||||
{
|
{
|
||||||
|
@ -79,6 +92,7 @@ IncludePath::interpret(ostream &output, bool no_line_macro)
|
||||||
{
|
{
|
||||||
error(StackTrace("@#includepath", e.what(), location));
|
error(StackTrace("@#includepath", e.what(), location));
|
||||||
}
|
}
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -66,12 +66,11 @@ namespace macro
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
const ExpressionPtr expr;
|
const ExpressionPtr expr;
|
||||||
string name;
|
|
||||||
public:
|
public:
|
||||||
Include(ExpressionPtr expr_arg, Environment &env_arg, Tokenizer::location location_arg) :
|
Include(ExpressionPtr expr_arg, Environment &env_arg, Tokenizer::location location_arg) :
|
||||||
Directive(env_arg, move(location_arg)), expr{move(expr_arg)} { }
|
Directive(env_arg, move(location_arg)), expr{move(expr_arg)} { }
|
||||||
void interpret(ostream &output, bool no_line_macro) override;
|
void interpret(ostream &output, bool no_line_macro) override;
|
||||||
inline const string & getName() const { return name; }
|
string interpretAndGetName();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -79,12 +78,11 @@ namespace macro
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
const ExpressionPtr expr;
|
const ExpressionPtr expr;
|
||||||
string path;
|
|
||||||
public:
|
public:
|
||||||
IncludePath(ExpressionPtr expr_arg, Environment &env_arg, Tokenizer::location location_arg) :
|
IncludePath(ExpressionPtr expr_arg, Environment &env_arg, Tokenizer::location location_arg) :
|
||||||
Directive(env_arg, move(location_arg)), expr{move(expr_arg)} { }
|
Directive(env_arg, move(location_arg)), expr{move(expr_arg)} { }
|
||||||
void interpret(ostream &output, bool no_line_macro) override;
|
void interpret(ostream &output, bool no_line_macro) override;
|
||||||
inline const string & getPath() const { return path; }
|
string interpretAndGetPath();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -80,16 +80,14 @@ Driver::parse(const string &file_arg, const string &basename_arg, istream &modfi
|
||||||
statement->printLineInfo(output, no_line_macro);
|
statement->printLineInfo(output, no_line_macro);
|
||||||
printLine = false;
|
printLine = false;
|
||||||
}
|
}
|
||||||
statement->interpret(output, no_line_macro);
|
|
||||||
|
|
||||||
auto ipp = dynamic_pointer_cast<IncludePath>(statement);
|
|
||||||
if (ipp)
|
|
||||||
paths.emplace_back(ipp->getPath());
|
|
||||||
|
|
||||||
auto ip = dynamic_pointer_cast<Include>(statement);
|
auto ip = dynamic_pointer_cast<Include>(statement);
|
||||||
if (ip)
|
auto ipp = dynamic_pointer_cast<IncludePath>(statement);
|
||||||
|
if (ipp)
|
||||||
|
paths.emplace_back(ipp->interpretAndGetPath());
|
||||||
|
else if (ip)
|
||||||
{
|
{
|
||||||
string filename = ip->getName();
|
string filename = ip->interpretAndGetName();
|
||||||
ifstream incfile(filename, ios::binary);
|
ifstream incfile(filename, ios::binary);
|
||||||
if (incfile.fail())
|
if (incfile.fail())
|
||||||
{
|
{
|
||||||
|
@ -116,6 +114,8 @@ Driver::parse(const string &file_arg, const string &basename_arg, istream &modfi
|
||||||
Driver m(env, no_line_macro);
|
Driver m(env, no_line_macro);
|
||||||
m.parse(filename, basename, incfile, output, debug, vector<pair<string, string>>{}, paths);
|
m.parse(filename, basename, incfile, output, debug, vector<pair<string, string>>{}, paths);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
statement->interpret(output, no_line_macro);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue