Fix SimpleLexer not being able to read escaped strings

This commit is contained in:
Jan
2023-09-23 14:28:59 +02:00
parent 7d0abaf256
commit 88bc1c1056
6 changed files with 154 additions and 3 deletions

View File

@ -0,0 +1,91 @@
#include "StringUtils.h"
#include <sstream>
namespace utils
{
std::string EscapeStringForQuotationMarks(const std::string_view& str)
{
std::ostringstream ss;
EscapeStringForQuotationMarks(ss, str);
return ss.str();
}
void EscapeStringForQuotationMarks(std::ostream& stream, const std::string_view& str)
{
for (const auto& c : str)
{
switch (c)
{
case '\r':
stream << "\\r";
break;
case '\n':
stream << "\\n";
break;
case '\t':
stream << "\\t";
break;
case '\f':
stream << "\\f";
break;
case '"':
stream << "\\\"";
break;
case '\\':
stream << "\\\\";
break;
default:
stream << c;
break;
}
}
}
std::string UnescapeStringFromQuotationMarks(const std::string_view& str)
{
std::ostringstream ss;
UnescapeStringFromQuotationMarks(ss, str);
return ss.str();
}
void UnescapeStringFromQuotationMarks(std::ostream& stream, const std::string_view& str)
{
auto inEscape = false;
for (const auto& c : str)
{
if (inEscape)
{
switch (c)
{
case 'r':
stream << "\r";
break;
case 'n':
stream << "\n";
break;
case 't':
stream << "\t";
break;
case 'f':
stream << "\f";
break;
case '"':
stream << "\"";
break;
case '\\':
stream << "\\";
break;
default:
stream << c;
break;
}
inEscape = false;
}
else if (c != '\\')
stream << c;
else
inEscape = true;
}
}
}

View File

@ -0,0 +1,10 @@
#pragma once
#include <string>
namespace utils
{
std::string EscapeStringForQuotationMarks(const std::string_view& str);
void EscapeStringForQuotationMarks(std::ostream& stream, const std::string_view& str);
std::string UnescapeStringFromQuotationMarks(const std::string_view& str);
void UnescapeStringFromQuotationMarks(std::ostream& stream, const std::string_view& str);
}