diff --git a/FalloutScriptStore.cpp b/FalloutScriptStore.cpp index c96bed5..55dbcf1 100644 --- a/FalloutScriptStore.cpp +++ b/FalloutScriptStore.cpp @@ -100,7 +100,7 @@ void CFalloutScript::StoreDefinitions() switch(m_GlobalVar[i].GetOperator()) { case COpcode::O_STRINGOP: - strDefinition = format(strDefinition + " := \"%s\"", m_Stringspace[ulVarValue].c_str()); + strDefinition = format(strDefinition + " := \"%s\"", escape_str(m_Stringspace[ulVarValue]).c_str()); break; case COpcode::O_FLOATOP: @@ -245,7 +245,7 @@ void CFalloutScript::StoreDefinitions() switch(defObject.m_ulAttributes & 0xFFFF) { case COpcode::O_STRINGOP: - strDefinition = format(strDefinition + " := \"%s\"", m_Stringspace[defObject.m_ulVarValue].c_str()); + strDefinition = format(strDefinition + " := \"%s\"", escape_str(m_Stringspace[defObject.m_ulVarValue]).c_str()); break; case COpcode::O_FLOATOP: @@ -535,7 +535,8 @@ std::string CFalloutScript::GetSource(CNode& node, bool bLabel, uint32_t ulNumAr else { strResult = "\""; - strResult += m_Stringspace[ulArgument] + "\""; + strResult += escape_str(m_Stringspace[ulArgument]); + strResult += "\""; } } catch(const std::exception& e) diff --git a/Utility.cpp b/Utility.cpp index 80c0e0c..60421fb 100644 --- a/Utility.cpp +++ b/Utility.cpp @@ -45,3 +45,28 @@ std::string replace(std::string subject, std::string search, std::string replace } return subject; } + +std::string escape_str(std::string input) +{ + std::string output; + output.reserve(input.length()); + + for (std::string::size_type i = 0; i < input.length(); ++i) + { + switch (input[i]) + { + case '\n': + output += "\\n"; + break; + + case '\r': + output += "\\r"; + break; + + default: + output += input[i]; + break;; + } + } + return output; +} diff --git a/Utility.h b/Utility.h index 3a69bd3..abd55ad 100644 --- a/Utility.h +++ b/Utility.h @@ -21,5 +21,6 @@ std::string format(std::string format, ...); std::string format(std::string format, std::string value); std::string replace(std::string subject, std::string search, std::string replacement); +std::string escape_str(std::string input); #endif