preprocessor: fixed so the TestPreprocessor::preprocessor_undef succeeds
This commit is contained in:
parent
9ac05af78a
commit
ea686a1da9
|
@ -549,10 +549,6 @@ public:
|
||||||
|
|
||||||
std::string Preprocessor::expandMacros(std::string code)
|
std::string Preprocessor::expandMacros(std::string code)
|
||||||
{
|
{
|
||||||
// Bail out if there are "#undef" it can cause cppcheck to hang
|
|
||||||
if (code.find("#undef") != std::string::npos)
|
|
||||||
return code;
|
|
||||||
|
|
||||||
// Search for macros and expand them..
|
// Search for macros and expand them..
|
||||||
std::string::size_type defpos = 0;
|
std::string::size_type defpos = 0;
|
||||||
while ((defpos = code.find("#define ", defpos)) != std::string::npos)
|
while ((defpos = code.find("#define ", defpos)) != std::string::npos)
|
||||||
|
@ -580,9 +576,42 @@ std::string Preprocessor::expandMacros(std::string code)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Expand all macros in the code..
|
// Expand all macros in the code..
|
||||||
|
char pattern[5] = "\"'# ";
|
||||||
|
pattern[3] = macro.name().at(0);
|
||||||
std::string::size_type pos1 = defpos;
|
std::string::size_type pos1 = defpos;
|
||||||
while ((pos1 = code.find(macro.name(), pos1 + 1)) != std::string::npos)
|
while ((pos1 = code.find_first_of(pattern, pos1 + 1)) != std::string::npos)
|
||||||
{
|
{
|
||||||
|
char ch = code[pos1];
|
||||||
|
|
||||||
|
// #undef => break
|
||||||
|
if (code[pos1] == '#')
|
||||||
|
{
|
||||||
|
const std::string substr(code.substr(pos1, 7 + macro.name().length()));
|
||||||
|
if (substr == "#undef " + macro.name())
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// String or char..
|
||||||
|
if (code[pos1] == '\"' || code[pos1] == '\'')
|
||||||
|
{
|
||||||
|
//char ch = code[pos1];
|
||||||
|
++pos1;
|
||||||
|
while (code[pos1] != ch)
|
||||||
|
{
|
||||||
|
if (code[pos1] == '\\')
|
||||||
|
++pos1;
|
||||||
|
++pos1;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Matching the macroname?
|
||||||
|
const std::string substr(code.substr(pos1, macro.name().length()));
|
||||||
|
if (code.substr(pos1, macro.name().length()) != macro.name())
|
||||||
|
continue;
|
||||||
|
|
||||||
// Previous char must not be alphanumeric or '_'
|
// Previous char must not be alphanumeric or '_'
|
||||||
if (pos1 != 0 && (isalnum(code[pos1-1]) || code[pos1-1] == '_'))
|
if (pos1 != 0 && (isalnum(code[pos1-1]) || code[pos1-1] == '_'))
|
||||||
continue;
|
continue;
|
||||||
|
@ -653,6 +682,15 @@ std::string Preprocessor::expandMacros(std::string code)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove all #undef..
|
||||||
|
defpos = 0;
|
||||||
|
while ((defpos = code.find("\n#undef ", defpos)) != std::string::npos)
|
||||||
|
{
|
||||||
|
++defpos;
|
||||||
|
std::string::size_type pos2 = code.find("\n", defpos);
|
||||||
|
code.erase(defpos, pos2 - defpos);
|
||||||
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,7 @@ private:
|
||||||
TEST_CASE(macro_simple5);
|
TEST_CASE(macro_simple5);
|
||||||
TEST_CASE(macro_mismatch);
|
TEST_CASE(macro_mismatch);
|
||||||
TEST_CASE(preprocessor_inside_string);
|
TEST_CASE(preprocessor_inside_string);
|
||||||
// TODO TEST_CASE(preprocessor_undef);
|
TEST_CASE(preprocessor_undef);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -518,15 +518,8 @@ private:
|
||||||
"#define AAA char b=0;\n"
|
"#define AAA char b=0;\n"
|
||||||
"AAA\n";
|
"AAA\n";
|
||||||
|
|
||||||
// Preprocess => actual result..
|
|
||||||
std::istringstream istr(filedata);
|
|
||||||
std::map<std::string, std::string> actual;
|
|
||||||
Preprocessor preprocessor;
|
|
||||||
preprocessor.preprocess(istr, actual);
|
|
||||||
|
|
||||||
// Compare results..
|
// Compare results..
|
||||||
ASSERT_EQUALS(1, actual.size());
|
ASSERT_EQUALS("\n\n\nchar b=0;\n", Preprocessor::expandMacros(filedata));
|
||||||
ASSERT_EQUALS("\n\n\nchar b=0;\n", actual[""]);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue