Do not expand macros in strings

This commit is contained in:
Jan 2023-12-30 13:59:29 +01:00
parent 2af58e5cac
commit d3519c2f62
No known key found for this signature in database
GPG Key ID: 44B581F78FF5C57C
2 changed files with 49 additions and 13 deletions

View File

@ -559,29 +559,49 @@ bool DefinesStreamProxy::FindNextMacro(const std::string& input, unsigned& input
auto wordStart = 0u; auto wordStart = 0u;
auto lastWordEnd = 0u; auto lastWordEnd = 0u;
auto inWord = false; auto inWord = false;
auto inString = false;
auto stringEscape = false;
for (; inputPos < inputSize; inputPos++) for (; inputPos < inputSize; inputPos++)
{ {
const auto c = input[inputPos]; const auto c = input[inputPos];
if (!inWord) if (inString)
{ {
if (isalpha(c) || c == '_') if (!stringEscape)
{ {
wordStart = inputPos; if (c == '"')
inWord = true; inString = false;
else if (c == '\\')
stringEscape = true;
} }
else
stringEscape = false;
} }
else else
{ {
if (!isalnum(c) && c != '_') if (c == '"')
{ inString = true;
if (FindMacroForIdentifier(input, wordStart, inputPos, define))
{
defineStart = wordStart;
return true;
}
inWord = false; if (!inWord)
{
if (isalpha(c) || c == '_')
{
wordStart = inputPos;
inWord = true;
}
}
else
{
if (!isalnum(c) && c != '_')
{
if (FindMacroForIdentifier(input, wordStart, inputPos, define))
{
defineStart = wordStart;
return true;
}
inWord = false;
}
} }
} }
} }

View File

@ -467,6 +467,22 @@ namespace test::parsing::impl::defines_stream_proxy
REQUIRE(proxy.Eof()); REQUIRE(proxy.Eof());
} }
TEST_CASE("DefinesStreamProxy: Ensure does not expand macros in strings", "[parsing][parsingstream]")
{
const std::vector<std::string> lines{
"#define TEST Wrong",
"System.out.println(\"TEST\")",
};
MockParserLineStream mockStream(lines);
DefinesStreamProxy proxy(&mockStream);
ExpectLine(&proxy, 1, "");
ExpectLine(&proxy, 2, "System.out.println(\"TEST\")");
REQUIRE(proxy.Eof());
}
TEST_CASE("DefinesStreamProxy: Ensure simple if is working with truthy value", "[parsing][parsingstream]") TEST_CASE("DefinesStreamProxy: Ensure simple if is working with truthy value", "[parsing][parsingstream]")
{ {
const std::vector<std::string> lines{ const std::vector<std::string> lines{
@ -911,7 +927,7 @@ namespace test::parsing::impl::defines_stream_proxy
REQUIRE(proxy.Eof()); REQUIRE(proxy.Eof());
} }
TEST_CASE("DefinesStreamProxy: Can use strinizing operator inside sample code", "[parsing][parsingstream]") TEST_CASE("DefinesStreamProxy: Can use stringizing operator inside sample code", "[parsing][parsingstream]")
{ {
const std::vector<std::string> lines{ const std::vector<std::string> lines{
"#define testMacro(a) System.out.println(#a)", "#define testMacro(a) System.out.println(#a)",