From b7cc740b78ea636868c560871437b3beed45cf2e Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 23 Oct 2012 20:41:50 -0400 Subject: [PATCH] Detect circular includes. Probably the final commit for #75 --- src/lexer.l | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/lexer.l b/src/lexer.l index 1e3bd5b1..63b00474 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -80,6 +80,7 @@ void includefile(); fs::path sourcepath(); std::vector path_stack; std::vector openfiles; +std::vector 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(); }