Fix ticket #244 (Headers from included file are searched from wrong path)
http://apps.sourceforge.net/trac/cppcheck/ticket/244
This commit is contained in:
parent
2185a95cde
commit
051f2929b5
|
@ -28,6 +28,7 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
Preprocessor::Preprocessor()
|
Preprocessor::Preprocessor()
|
||||||
{
|
{
|
||||||
|
@ -490,13 +491,18 @@ std::string Preprocessor::getHeaderFileName(const std::string &str)
|
||||||
|
|
||||||
void Preprocessor::handleIncludes(std::string &code, const std::string &filename, const std::list<std::string> &includePaths)
|
void Preprocessor::handleIncludes(std::string &code, const std::string &filename, const std::list<std::string> &includePaths)
|
||||||
{
|
{
|
||||||
// std::string line;
|
std::list<std::string> paths;
|
||||||
std::string path = filename;
|
std::string path;
|
||||||
|
path = filename;
|
||||||
path.erase(1 + path.find_last_of("\\/"));
|
path.erase(1 + path.find_last_of("\\/"));
|
||||||
|
paths.push_back(path);
|
||||||
std::string::size_type pos = 0;
|
std::string::size_type pos = 0;
|
||||||
|
std::string::size_type endfilePos = 0;
|
||||||
std::map<std::string, bool> handledFiles;
|
std::map<std::string, bool> handledFiles;
|
||||||
|
endfilePos = pos;
|
||||||
while ((pos = code.find("#include", pos)) != std::string::npos)
|
while ((pos = code.find("#include", pos)) != std::string::npos)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Accept only includes that are at the start of a line
|
// Accept only includes that are at the start of a line
|
||||||
if (pos > 0 && code[pos-1] != '\n')
|
if (pos > 0 && code[pos-1] != '\n')
|
||||||
{
|
{
|
||||||
|
@ -504,6 +510,15 @@ void Preprocessor::handleIncludes(std::string &code, const std::string &filename
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If endfile is encountered, we have moved to a next file in our stack,
|
||||||
|
// so remove last path in our list.
|
||||||
|
while ((endfilePos = code.find("#endfile", endfilePos)) != std::string::npos && endfilePos < pos)
|
||||||
|
{
|
||||||
|
paths.pop_back();
|
||||||
|
endfilePos += 8; // size of #endfile
|
||||||
|
}
|
||||||
|
|
||||||
|
endfilePos = pos;
|
||||||
std::string::size_type end = code.find("\n", pos);
|
std::string::size_type end = code.find("\n", pos);
|
||||||
std::string filename = code.substr(pos, end - pos);
|
std::string filename = code.substr(pos, end - pos);
|
||||||
|
|
||||||
|
@ -541,9 +556,10 @@ void Preprocessor::handleIncludes(std::string &code, const std::string &filename
|
||||||
|
|
||||||
if (processedFile.length() == 0)
|
if (processedFile.length() == 0)
|
||||||
{
|
{
|
||||||
filename = path + filename;
|
filename = paths.back() + filename;
|
||||||
std::ifstream fin(filename.c_str());
|
std::ifstream fin(filename.c_str());
|
||||||
processedFile = Preprocessor::read(fin);
|
if (fin.is_open())
|
||||||
|
processedFile = Preprocessor::read(fin);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (processedFile.length() > 0)
|
if (processedFile.length() > 0)
|
||||||
|
@ -560,6 +576,9 @@ void Preprocessor::handleIncludes(std::string &code, const std::string &filename
|
||||||
processedFile = "#file \"" + filename + "\"\n" + processedFile + "\n#endfile";
|
processedFile = "#file \"" + filename + "\"\n" + processedFile + "\n#endfile";
|
||||||
code.insert(pos, processedFile);
|
code.insert(pos, processedFile);
|
||||||
|
|
||||||
|
path = filename;
|
||||||
|
path.erase(1 + path.find_last_of("\\/"));
|
||||||
|
paths.push_back(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue