preprocessor: handled problem with parsing strings when expanding macros
This commit is contained in:
parent
820df7fdbd
commit
76cb2310af
|
@ -729,6 +729,26 @@ std::string Preprocessor::expandMacros(std::string code)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (code[pos2] == '\"' || code[pos2] == '\'')
|
||||||
|
{
|
||||||
|
par += code[pos2];
|
||||||
|
char ch = code[pos2];
|
||||||
|
++pos2;
|
||||||
|
while (pos2 < code.length() && code[pos2] != ch)
|
||||||
|
{
|
||||||
|
par += code[pos2];
|
||||||
|
if (code[pos2] == '\\')
|
||||||
|
{
|
||||||
|
par += code[pos2];
|
||||||
|
++pos2;
|
||||||
|
}
|
||||||
|
++pos2;
|
||||||
|
}
|
||||||
|
if (pos2 == code.length())
|
||||||
|
break;
|
||||||
|
par += code[pos2];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (parlevel == 1 && code[pos2] == ',')
|
if (parlevel == 1 && code[pos2] == ',')
|
||||||
{
|
{
|
||||||
|
|
|
@ -74,6 +74,7 @@ private:
|
||||||
TEST_CASE(macro_simple4);
|
TEST_CASE(macro_simple4);
|
||||||
TEST_CASE(macro_simple5);
|
TEST_CASE(macro_simple5);
|
||||||
TEST_CASE(macro_simple6);
|
TEST_CASE(macro_simple6);
|
||||||
|
TEST_CASE(macro_simple7);
|
||||||
TEST_CASE(macro_mismatch);
|
TEST_CASE(macro_mismatch);
|
||||||
TEST_CASE(string1);
|
TEST_CASE(string1);
|
||||||
TEST_CASE(string2);
|
TEST_CASE(string2);
|
||||||
|
@ -479,6 +480,13 @@ private:
|
||||||
ASSERT_EQUALS("\n(a+b+c)", Preprocessor::expandMacros(filedata));
|
ASSERT_EQUALS("\n(a+b+c)", Preprocessor::expandMacros(filedata));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void macro_simple7()
|
||||||
|
{
|
||||||
|
const char filedata[] = "#define ABC(str) str\n"
|
||||||
|
"ABC(\"(\")";
|
||||||
|
ASSERT_EQUALS("\n\"(\"", Preprocessor::expandMacros(filedata));
|
||||||
|
}
|
||||||
|
|
||||||
void macro_mismatch()
|
void macro_mismatch()
|
||||||
{
|
{
|
||||||
const char filedata[] = "#define AAA(aa,bb) f(aa)\n"
|
const char filedata[] = "#define AAA(aa,bb) f(aa)\n"
|
||||||
|
@ -564,11 +572,13 @@ private:
|
||||||
|
|
||||||
void fmt()
|
void fmt()
|
||||||
{
|
{
|
||||||
const char filedata[] = "#define DBG(fmt...) printf(fmt);\n"
|
const char filedata[] = "#define DBG(fmt...) printf(fmt)\n"
|
||||||
"DBG(\"[0x%lx-0x%lx)\", pstart, pend);";
|
"DBG(\"[0x%lx-0x%lx)\", pstart, pend);";
|
||||||
|
|
||||||
// Preprocess..
|
// Preprocess..
|
||||||
std::string actual = Preprocessor::expandMacros(filedata);
|
std::string actual = Preprocessor::expandMacros(filedata);
|
||||||
|
|
||||||
|
ASSERT_EQUALS("\nprintf(\"[0x%lx-0x%lx)\", pstart, pend);", actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue