diff options
author | Marius Kintel <marius@kintel.net> | 2012-10-24 00:41:50 (GMT) |
---|---|---|
committer | Marius Kintel <marius@kintel.net> | 2012-10-24 00:41:50 (GMT) |
commit | b7cc740b78ea636868c560871437b3beed45cf2e (patch) | |
tree | 9583b93f262f89db03828fb30d7e00e3c2ca3968 /src/lexer.l | |
parent | ebe59a0e4d10f1757ff0bd4c1cc6fe8fc2c2ee67 (diff) |
Detect circular includes. Probably the final commit for #75
Diffstat (limited to 'src/lexer.l')
-rw-r--r-- | src/lexer.l | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/lexer.l b/src/lexer.l index 1e3bd5b..63b0047 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -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(); } |