mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-19 15:52:53 +00:00
Identify token joining operators
This commit is contained in:
parent
729b72c1d9
commit
70d4d77266
@ -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);
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user