Implement stringization operator

This commit is contained in:
Jan 2023-12-27 09:55:08 +01:00
parent b151c37dc0
commit e8d029d846
No known key found for this signature in database
GPG Key ID: 44B581F78FF5C57C
2 changed files with 28 additions and 8 deletions

View File

@ -6,6 +6,7 @@
#include "Parsing/Simple/Expression/SimpleExpressionMatchers.h" #include "Parsing/Simple/Expression/SimpleExpressionMatchers.h"
#include "Parsing/Simple/SimpleExpressionInterpreter.h" #include "Parsing/Simple/SimpleExpressionInterpreter.h"
#include "Utils/ClassUtils.h" #include "Utils/ClassUtils.h"
#include "Utils/StringUtils.h"
#include <regex> #include <regex>
#include <sstream> #include <sstream>
@ -13,13 +14,15 @@
DefinesStreamProxy::DefineParameterPosition::DefineParameterPosition() DefinesStreamProxy::DefineParameterPosition::DefineParameterPosition()
: m_parameter_index(0u), : m_parameter_index(0u),
m_parameter_position(0u) m_parameter_position(0u),
m_stringize(false)
{ {
} }
DefinesStreamProxy::DefineParameterPosition::DefineParameterPosition(const unsigned index, const unsigned position) DefinesStreamProxy::DefineParameterPosition::DefineParameterPosition(const unsigned index, const unsigned position, const bool stringize)
: m_parameter_index(index), : m_parameter_index(index),
m_parameter_position(position) m_parameter_position(position),
m_stringize(stringize)
{ {
} }
@ -40,11 +43,15 @@ std::string DefinesStreamProxy::Define::Render(const std::vector<std::string>& p
auto lastPos = 0u; auto lastPos = 0u;
for (const auto& parameterPosition : m_parameter_positions) for (const auto& parameterPosition : m_parameter_positions)
{ {
const auto stringizeSkipLastChar = parameterPosition.m_stringize ? 1 : 0;
if (lastPos < parameterPosition.m_parameter_position) if (lastPos < parameterPosition.m_parameter_position)
str << std::string(m_value, lastPos, parameterPosition.m_parameter_position - lastPos); str << std::string(m_value, lastPos, parameterPosition.m_parameter_position - lastPos - stringizeSkipLastChar);
if (parameterPosition.m_parameter_index < parameterValues.size()) if (parameterPosition.m_parameter_index < parameterValues.size())
{ {
if (parameterPosition.m_stringize)
str << '"' << utils::EscapeStringForQuotationMarks(parameterValues[parameterPosition.m_parameter_index]) << '"';
else
str << parameterValues[parameterPosition.m_parameter_index]; str << parameterValues[parameterPosition.m_parameter_index];
} }
@ -82,8 +89,14 @@ void DefinesStreamProxy::Define::IdentifyParameters(const std::vector<std::strin
if (parameterIndex < parameterNames.size()) if (parameterIndex < parameterNames.size())
{ {
const auto stringize =
// Check if # is prepended to the word
(wordStart > 0 && m_value[wordStart - 1] == '#')
// Make sure it's not a token pasting operator
&& (wordStart <= 1 || m_value[wordStart - 2] != '#');
m_value.erase(wordStart, i - wordStart); m_value.erase(wordStart, i - wordStart);
m_parameter_positions.emplace_back(parameterIndex, wordStart); m_parameter_positions.emplace_back(parameterIndex, wordStart, stringize);
i = wordStart; i = wordStart;
} }
@ -113,8 +126,14 @@ void DefinesStreamProxy::Define::IdentifyParameters(const std::vector<std::strin
if (parameterIndex < parameterNames.size()) if (parameterIndex < parameterNames.size())
{ {
const auto stringize =
// Check if # is prepended to the word
(wordStart > 0 && m_value[wordStart - 1] == '#')
// Make sure it's not a token pasting operator
&& (wordStart <= 1 || m_value[wordStart - 2] != '#');
m_value.erase(wordStart, m_value.size() - wordStart); m_value.erase(wordStart, m_value.size() - wordStart);
m_parameter_positions.emplace_back(parameterIndex, wordStart); m_parameter_positions.emplace_back(parameterIndex, wordStart, stringize);
} }
} }
} }

View File

@ -28,9 +28,10 @@ public:
public: public:
unsigned m_parameter_index; unsigned m_parameter_index;
unsigned m_parameter_position; unsigned m_parameter_position;
bool m_stringize;
DefineParameterPosition(); DefineParameterPosition();
DefineParameterPosition(unsigned index, unsigned position); DefineParameterPosition(unsigned index, unsigned position, bool stringize);
}; };
class Define class Define