Partial fix for #322 (get configurations from headers that don't start at the beginning of the file)
This commit is contained in:
parent
fb81100bec
commit
cbc853fdba
|
@ -637,6 +637,8 @@ std::list<std::string> Preprocessor::getcfgs(const std::string &filedata, const
|
||||||
// 0=>Source file, 1=>Included by source file, 2=>included by header that was included by source file, etc
|
// 0=>Source file, 1=>Included by source file, 2=>included by header that was included by source file, etc
|
||||||
int filelevel = 0;
|
int filelevel = 0;
|
||||||
|
|
||||||
|
bool includeguard = false;
|
||||||
|
|
||||||
unsigned int linenr = 0;
|
unsigned int linenr = 0;
|
||||||
std::istringstream istr(filedata);
|
std::istringstream istr(filedata);
|
||||||
std::string line;
|
std::string line;
|
||||||
|
@ -646,18 +648,20 @@ std::list<std::string> Preprocessor::getcfgs(const std::string &filedata, const
|
||||||
|
|
||||||
if (line.compare(0, 6, "#file ") == 0)
|
if (line.compare(0, 6, "#file ") == 0)
|
||||||
{
|
{
|
||||||
|
includeguard = true;
|
||||||
++filelevel;
|
++filelevel;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (line == "#endfile")
|
else if (line == "#endfile")
|
||||||
{
|
{
|
||||||
|
includeguard = false;
|
||||||
if (filelevel > 0)
|
if (filelevel > 0)
|
||||||
--filelevel;
|
--filelevel;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (line.compare(0, 8, "#define ") == 0 && line.find("(", 8) == std::string::npos)
|
if (line.compare(0, 8, "#define ") == 0 && line.find("(", 8) == std::string::npos)
|
||||||
{
|
{
|
||||||
if (line.find(" ", 8) == std::string::npos)
|
if (line.find(" ", 8) == std::string::npos)
|
||||||
defines.insert(line.substr(8));
|
defines.insert(line.substr(8));
|
||||||
|
@ -669,7 +673,10 @@ std::list<std::string> Preprocessor::getcfgs(const std::string &filedata, const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filelevel > 0)
|
if (!line.empty() && line.compare(0, 3, "#if") != 0)
|
||||||
|
includeguard = false;
|
||||||
|
|
||||||
|
if (includeguard)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
std::string def = getdef(line, true) + getdef(line, false);
|
std::string def = getdef(line, true) + getdef(line, false);
|
||||||
|
|
|
@ -82,7 +82,8 @@ private:
|
||||||
TEST_CASE(error2);
|
TEST_CASE(error2);
|
||||||
|
|
||||||
// Handling include guards (don't create extra configuration for it)
|
// Handling include guards (don't create extra configuration for it)
|
||||||
TEST_CASE(includeguard);
|
TEST_CASE(includeguard1);
|
||||||
|
TEST_CASE(includeguard2);
|
||||||
|
|
||||||
TEST_CASE(newlines);
|
TEST_CASE(newlines);
|
||||||
|
|
||||||
|
@ -436,7 +437,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void includeguard()
|
void includeguard1()
|
||||||
{
|
{
|
||||||
// Handling include guards..
|
// Handling include guards..
|
||||||
const char filedata[] = "#file \"abc.h\"\n"
|
const char filedata[] = "#file \"abc.h\"\n"
|
||||||
|
@ -457,6 +458,29 @@ private:
|
||||||
ASSERT_EQUALS(2, static_cast<unsigned int>(actual.size()));
|
ASSERT_EQUALS(2, static_cast<unsigned int>(actual.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void includeguard2()
|
||||||
|
{
|
||||||
|
// Handling include guards..
|
||||||
|
const char filedata[] = "#file \"abc.h\"\n"
|
||||||
|
"foo\n"
|
||||||
|
"#ifdef ABC\n"
|
||||||
|
"\n"
|
||||||
|
"#endif\n"
|
||||||
|
"#endfile\n";
|
||||||
|
|
||||||
|
// Preprocess => actual result..
|
||||||
|
std::istringstream istr(filedata);
|
||||||
|
std::map<std::string, std::string> actual;
|
||||||
|
Preprocessor preprocessor;
|
||||||
|
preprocessor.preprocess(istr, actual, "file.c");
|
||||||
|
|
||||||
|
// Expected configurations: "" and "ABC"
|
||||||
|
ASSERT_EQUALS(2, static_cast<unsigned int>(actual.size()));
|
||||||
|
ASSERT_EQUALS(true, actual.find("") != actual.end());
|
||||||
|
ASSERT_EQUALS(true, actual.find("ABC") != actual.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ifdefwithfile()
|
void ifdefwithfile()
|
||||||
{
|
{
|
||||||
// Handling include guards..
|
// Handling include guards..
|
||||||
|
|
Loading…
Reference in New Issue