Escape string values when menu dumping

This commit is contained in:
Jan 2023-08-24 19:36:37 +02:00
parent 8a1fe03358
commit aea76d0b42
4 changed files with 42 additions and 4 deletions

View File

@ -193,7 +193,7 @@ void MenuDumper::WriteStatementOperand(const Statement_s* statement, size_t& cur
break; break;
case VAL_STRING: case VAL_STRING:
m_stream << "\"" << operand.internals.stringVal.string << "\""; WriteEscapedString(operand.internals.stringVal.string);
break; break;
case VAL_FUNCTION: case VAL_FUNCTION:

View File

@ -192,7 +192,7 @@ void MenuDumper::WriteStatementOperand(const Statement_s* statement, size_t& cur
break; break;
case VAL_STRING: case VAL_STRING:
m_stream << "\"" << operand.internals.stringVal.string << "\""; WriteEscapedString(operand.internals.stringVal.string);
break; break;
case VAL_FUNCTION: case VAL_FUNCTION:

View File

@ -130,6 +130,38 @@ bool AbstractMenuDumper::DoesTokenNeedQuotationMarks(const std::string& token)
return hasNonIdentifierCharacter; return hasNonIdentifierCharacter;
} }
void AbstractMenuDumper::WriteEscapedString(const std::string_view& str) const
{
m_stream << "\"";
for (const auto& c : str)
{
switch (c)
{
case '\r':
m_stream << "\\r";
break;
case '\n':
m_stream << "\\n";
break;
case '\t':
m_stream << "\\t";
break;
case '\f':
m_stream << "\\f";
break;
case '"':
m_stream << "\\\"";
break;
default:
m_stream << c;
break;
}
}
m_stream << "\"";
}
const std::string& AbstractMenuDumper::BoolValue(const bool value) const std::string& AbstractMenuDumper::BoolValue(const bool value)
{ {
return value ? BOOL_VALUE_TRUE : BOOL_VALUE_FALSE; return value ? BOOL_VALUE_TRUE : BOOL_VALUE_FALSE;
@ -154,7 +186,9 @@ void AbstractMenuDumper::WriteStringProperty(const std::string& propertyKey, con
Indent(); Indent();
WriteKey(propertyKey); WriteKey(propertyKey);
m_stream << "\"" << propertyValue << "\"\n";
WriteEscapedString(propertyValue);
m_stream << "\n";
} }
void AbstractMenuDumper::WriteStringProperty(const std::string& propertyKey, const char* propertyValue) const void AbstractMenuDumper::WriteStringProperty(const std::string& propertyKey, const char* propertyValue) const
@ -164,7 +198,9 @@ void AbstractMenuDumper::WriteStringProperty(const std::string& propertyKey, con
Indent(); Indent();
WriteKey(propertyKey); WriteKey(propertyKey);
m_stream << "\"" << propertyValue << "\"\n";
WriteEscapedString(propertyValue);
m_stream << "\n";
} }
void AbstractMenuDumper::WriteBoolProperty(const std::string& propertyKey, const bool propertyValue, const bool defaultValue) const void AbstractMenuDumper::WriteBoolProperty(const std::string& propertyKey, const bool propertyValue, const bool defaultValue) const

View File

@ -30,6 +30,8 @@ protected:
static std::vector<std::string> CreateScriptTokenList(const char* script); static std::vector<std::string> CreateScriptTokenList(const char* script);
static bool DoesTokenNeedQuotationMarks(const std::string& token); static bool DoesTokenNeedQuotationMarks(const std::string& token);
void WriteEscapedString(const std::string_view& str) const;
static const std::string& BoolValue(bool value); static const std::string& BoolValue(bool value);
void WriteKey(const std::string& keyName) const; void WriteKey(const std::string& keyName) const;
void WriteStringProperty(const std::string& propertyKey, const std::string& propertyValue) const; void WriteStringProperty(const std::string& propertyKey, const std::string& propertyValue) const;