Identify token joining operators

This commit is contained in:
Jan 2023-12-30 16:41:17 +01:00
parent 729b72c1d9
commit 70d4d77266
No known key found for this signature in database
GPG Key ID: 44B581F78FF5C57C
2 changed files with 38 additions and 14 deletions

View File

@ -39,27 +39,41 @@ DefinesStreamProxy::MacroParameterState::MacroParameterState()
{ {
} }
bool DefinesStreamProxy::Define::IsStringizeParameter(const std::string& value, unsigned pos) bool DefinesStreamProxy::Define::IsStringizeParameterBackwardsLookup(const std::string& value, unsigned pos)
{ {
// Check if # is prepended to the word // Check if # is prepended to the word
if (pos <= 0 || value[pos - 1] != '#') return pos > 0 && value[pos - 1] == '#';
return false; }
bool min2IsNumberSign = pos >= 2 && value[pos - 2] == '#'; bool DefinesStreamProxy::Define::IsTokenJoiningOperatorForwardLookup(const std::string& value, unsigned pos)
bool min3IsNumberSign = pos >= 3 && value[pos - 3] == '#'; {
bool min4IsNumberSign = pos >= 4 && value[pos - 4] == '#'; return pos + 1 < value.size() && value[pos + 1] == '#';
}
return void DefinesStreamProxy::Define::IdentifyTokenJoinsOnly()
// # {
!min2IsNumberSign for (auto i = 0u; i < m_value.size(); i++)
// ### {
|| (min3IsNumberSign && !min4IsNumberSign); const auto c = m_value[i];
if (!isalnum(c) && c != '_')
{
if (c == '#' && IsTokenJoiningOperatorForwardLookup(m_value, i))
{
m_token_joins.push_back(i);
m_value.erase(i, 2);
i -= 1;
}
}
}
} }
void DefinesStreamProxy::Define::IdentifyParameters(const std::vector<std::string>& parameterNames) void DefinesStreamProxy::Define::IdentifyParameters(const std::vector<std::string>& parameterNames)
{ {
if (parameterNames.empty()) if (parameterNames.empty())
{
IdentifyTokenJoinsOnly();
return; return;
}
auto inWord = false; auto inWord = false;
auto wordStart = 0u; auto wordStart = 0u;
@ -81,7 +95,7 @@ void DefinesStreamProxy::Define::IdentifyParameters(const std::vector<std::strin
if (parameterIndex < parameterNames.size()) if (parameterIndex < parameterNames.size())
{ {
const auto stringize = IsStringizeParameter(m_value, wordStart); const auto stringize = IsStringizeParameterBackwardsLookup(m_value, wordStart);
const auto stringizeOffset = stringize ? 1 : 0; const auto stringizeOffset = stringize ? 1 : 0;
m_value.erase(wordStart - stringizeOffset, i - wordStart + stringizeOffset); m_value.erase(wordStart - stringizeOffset, i - wordStart + stringizeOffset);
@ -91,6 +105,13 @@ void DefinesStreamProxy::Define::IdentifyParameters(const std::vector<std::strin
inWord = false; inWord = false;
} }
if (c == '#' && IsTokenJoiningOperatorForwardLookup(m_value, i))
{
m_token_joins.push_back(i);
m_value.erase(i, 2);
i -= 1;
}
} }
else else
{ {
@ -115,7 +136,7 @@ void DefinesStreamProxy::Define::IdentifyParameters(const std::vector<std::strin
if (parameterIndex < parameterNames.size()) if (parameterIndex < parameterNames.size())
{ {
const auto stringize = IsStringizeParameter(m_value, wordStart); const auto stringize = IsStringizeParameterBackwardsLookup(m_value, wordStart);
const auto stringizeOffset = stringize ? 1 : 0; const auto stringizeOffset = stringize ? 1 : 0;
m_value.erase(wordStart - stringizeOffset, m_value.size() - wordStart + stringizeOffset); m_value.erase(wordStart - stringizeOffset, m_value.size() - wordStart + stringizeOffset);

View File

@ -42,13 +42,16 @@ public:
std::string m_name; std::string m_name;
std::string m_value; std::string m_value;
std::vector<DefineParameterPosition> m_parameter_positions; std::vector<DefineParameterPosition> m_parameter_positions;
std::vector<unsigned> m_token_joins;
Define(); Define();
Define(std::string name, std::string value); Define(std::string name, std::string value);
void IdentifyParameters(const std::vector<std::string>& parameterNames); void IdentifyParameters(const std::vector<std::string>& parameterNames);
private: private:
static bool IsStringizeParameter(const std::string& value, unsigned pos); static bool IsStringizeParameterBackwardsLookup(const std::string& value, unsigned pos);
static bool IsTokenJoiningOperatorForwardLookup(const std::string& value, unsigned pos);
void IdentifyTokenJoinsOnly();
}; };
enum class ParameterState : uint8_t enum class ParameterState : uint8_t