Detect circular includes. Probably the final commit for #75

felipesanches-svg
Marius Kintel 2012-10-23 20:41:50 -04:00
parent ebe59a0e4d
commit b7cc740b78
1 changed files with 10 additions and 1 deletions

View File

@ -80,6 +80,7 @@ void includefile();
fs::path sourcepath();
std::vector<fs::path> path_stack;
std::vector<FILE*> openfiles;
std::vector<std::string> openfilenames;
std::string filename;
std::string filepath;
@ -142,6 +143,7 @@ use[ \t\r\n>]*"<" { BEGIN(cond_use); }
assert(!openfiles.empty());
fclose(openfiles.back());
openfiles.pop_back();
openfilenames.pop_back();
}
yypop_buffer_state();
if (!YY_CURRENT_BUFFER)
@ -227,10 +229,15 @@ void includefile()
PRINTB("WARNING: Can't find 'include' file '%s'.", filename);
}
std::string fullname = boosty::absolute(finfo).string();
// Detect circular includes
BOOST_FOREACH(std::string &s, openfilenames) {
if (s == fullname) return;
}
filepath.clear();
path_stack.push_back(finfo.parent_path());
std::string fullname = boosty::absolute(finfo).string();
handle_dep(fullname);
currmodule->registerInclude(fullname);
yyin = fopen(fullname.c_str(), "r");
@ -240,6 +247,7 @@ void includefile()
return;
}
openfiles.push_back(yyin);
openfilenames.push_back(fullname);
filename.clear();
yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE));
@ -253,5 +261,6 @@ void lexerdestroy()
{
BOOST_FOREACH (FILE *f, openfiles) fclose(f);
openfiles.clear();
openfilenames.clear();
path_stack.clear();
}