Preprocessor: Bailout #include if it is recursive

This commit is contained in:
Daniel Marjamaki 2011-10-30 19:00:11 +01:00
parent 278ba0ab3a
commit f2199adc3f
2 changed files with 12 additions and 3 deletions

View File

@ -1732,7 +1732,7 @@ static bool openHeader(std::string &filename, const std::list<std::string> &incl
} }
std::string Preprocessor::handleIncludes(const std::string &code, const std::string &filePath, const std::list<std::string> &includePaths, std::map<std::string,std::string> &defs) std::string Preprocessor::handleIncludes(const std::string &code, const std::string &filePath, const std::list<std::string> &includePaths, std::map<std::string,std::string> &defs, std::list<std::string> includes)
{ {
const std::string path(filePath.substr(0, 1 + filePath.find_last_of("\\/"))); const std::string path(filePath.substr(0, 1 + filePath.find_last_of("\\/")));
@ -1771,8 +1771,16 @@ std::string Preprocessor::handleIncludes(const std::string &code, const std::str
continue; continue;
} }
// Prevent that files are recursively included
if (std::find(includes.begin(), includes.end(), filename) != includes.end()) {
ostr << std::endl;
continue;
}
includes.push_back(filename);
ostr << "#file \"" << filename << "\"\n" ostr << "#file \"" << filename << "\"\n"
<< handleIncludes(read(fin, filename, NULL), filename, includePaths, defs) << std::endl << handleIncludes(read(fin, filename, NULL), filename, includePaths, defs, includes) << std::endl
<< "#endfile"; << "#endfile";
} else if (line.compare(0,7,"#ifdef ") == 0) { } else if (line.compare(0,7,"#ifdef ") == 0) {
if (indent == indentmatch && defs.find(getdef(line,true)) != defs.end()) { if (indent == indentmatch && defs.find(getdef(line,true)) != defs.end()) {

View File

@ -215,9 +215,10 @@ public:
* @param filePath filename of code * @param filePath filename of code
* @param includePaths Paths where headers might be * @param includePaths Paths where headers might be
* @param defs defines (only values) * @param defs defines (only values)
* @param includes provide a empty list. this is just used to prevent recursive inclusions.
* \return resulting string * \return resulting string
*/ */
std::string handleIncludes(const std::string &code, const std::string &filePath, const std::list<std::string> &includePaths, std::map<std::string,std::string> &defs); std::string handleIncludes(const std::string &code, const std::string &filePath, const std::list<std::string> &includePaths, std::map<std::string,std::string> &defs, std::list<std::string> includes = std::list<std::string>());
private: private:
void missingInclude(const std::string &filename, unsigned int linenr, const std::string &header, bool userheader); void missingInclude(const std::string &filename, unsigned int linenr, const std::string &header, bool userheader);