vhdlpp: Escape quotation marks in emitted strings.

This commit is contained in:
Maciej Suminski 2015-09-14 14:04:23 +02:00
parent 6f5addb1b7
commit 925827d2c2
6 changed files with 34 additions and 21 deletions

View File

@ -415,12 +415,8 @@ void ExpRelation::dump(ostream&out, int indent) const
void ExpString::dump(ostream&out, int indent) const
{
out << setw(indent) << "" << "String \"";
for(vector<char>::const_iterator it = value_.begin();
it != value_.end(); ++it)
out << *it;
out << "\""
<< " at " << get_fileline() << endl;
out << setw(indent) << "" << "String \"" << value_;
out << "\"" << " at " << get_fileline() << endl;
}
void ExpUAbs::dump(ostream&out, int indent) const

View File

@ -632,10 +632,8 @@ ExpShift::ExpShift(ExpShift::shift_t op, Expression*op1, Expression*op2)
}
ExpString::ExpString(const char* value)
: value_(strlen(value))
: value_(value)
{
for(size_t idx = 0; idx < value_.size(); idx += 1)
value_[idx] = value[idx];
}
ExpString::~ExpString()

View File

@ -796,13 +796,17 @@ class ExpString : public Expression {
int emit(ostream&out, Entity*ent, ScopeBase*scope);
bool is_primary(void) const;
void dump(ostream&out, int indent = 0) const;
const std::vector<char>& get_value() const { return value_; }
const std::string& get_value() const { return value_; }
// Converts quotation marks (") to its escaped
// counterpart in SystemVerilog (\")
static std::string escape_quot(const std::string& str);
private:
int emit_as_array_(ostream&out, Entity*ent, ScopeBase*scope, const VTypeArray*arr);
private:
std::vector<char> value_;
std::string value_;
};
class ExpUAbs : public ExpUnary {

View File

@ -916,11 +916,8 @@ int ExpString::emit(ostream& out, Entity*ent, ScopeBase*scope)
return emit_as_array_(out, ent, scope, arr);
}
out << "\"";
for(vector<char>::const_iterator it = value_.begin()
; it != value_.end(); ++it)
out << *it;
out << "\"";
out << "\"" << escape_quot(value_) << "\"";
return 0;
}
@ -959,6 +956,19 @@ int ExpString::emit_as_array_(ostream& out, Entity*, ScopeBase*, const VTypeArra
return errors;
}
std::string ExpString::escape_quot(const std::string& str)
{
size_t idx = 0;
string result(str);
while((idx = result.find('"', idx)) != string::npos) {
result.replace(idx, 1, "\\\"");
idx += 2;
}
return result;
}
int ExpUAbs::emit(ostream&out, Entity*ent, ScopeBase*scope)
{
int errors = 0;

View File

@ -272,10 +272,15 @@ void ExpShift::write_to_stream(ostream&out) const
void ExpString::write_to_stream(ostream&fd) const
{
fd << "\"";
for(vector<char>::const_iterator it = value_.begin();
it != value_.end(); ++it) {
fd << *it;
// Restore double quotation marks
for(string::const_iterator it = value_.begin(); it != value_.end(); ++it) {
if(*it == '"')
fd << "\"\"";
else
fd << *it;
}
fd << "\"";
}

View File

@ -484,7 +484,7 @@ int ReportStmt::emit(ostream&out, Entity*, ScopeBase*)
case UNSPECIFIED: ivl_assert(*this, false); break;
}
out << msg_;
out << ExpString::escape_quot(msg_);
out << " (" << get_fileline() << ")\");";
if(severity_ == FAILURE)
@ -497,7 +497,7 @@ int ReportStmt::emit(ostream&out, Entity*, ScopeBase*)
void ReportStmt::write_to_stream(std::ostream&fd)
{
fd << "report \"" << msg_ << "\"" << std::endl;
fd << "report \"" << ExpString::escape_quot(msg_) << "\"" << std::endl;
fd << "severity ";
switch(severity_)