detect flaws in 'use' and 'include' statements. make locate_file consider directories as 'non files'.

felipesanches-svg
don bright 2012-08-18 18:38:24 +02:00
parent d87dd48215
commit 47a06c074f
3 changed files with 17 additions and 4 deletions

View File

@ -122,10 +122,16 @@ use[ \t\r\n>]*"<" { BEGIN(cond_use); }
}
}
/* Only accept regular files which exists */
if (usepath.has_parent_path() && fs::exists(usepath)) {
if (usepath.has_parent_path() && fs::exists(usepath) && !fs::is_directory(usepath)) {
handle_dep(usepath.string());
parserlval.text = strdup(usepath.string().c_str());
return TOK_USE;
} else {
PRINTB("WARNING: Can't open 'use' file '%s'.", filename);
if ( filename.size() == 0 )
PRINT("WARNING: 'use' filename is blank");
else if ( fs::is_directory( usepath ) )
PRINTB("WARNING: 'use' file points to a directory: %s",filename);
}
}
}
@ -217,6 +223,10 @@ void includefile()
finfo = locate_file((fs::path(filepath) / filename).string());
}
if (finfo.empty()) {
PRINTB("WARNING: Can't find 'include' file '%s'.", filename);
}
filepath.clear();
path_stack.push_back(finfo.parent_path());
@ -225,7 +235,7 @@ void includefile()
currmodule->registerInclude(fullname);
yyin = fopen(fullname.c_str(), "r");
if (!yyin) {
PRINTB("WARNING: Can't open input file '%s'.", filename);
PRINTB("WARNING: Can't open 'include' file '%s'.", filename);
path_stack.pop_back();
return;
}

View File

@ -15,13 +15,13 @@ void add_librarydir(const std::string &libdir)
/*!
Searces for the given file in library paths and returns the full path if found.
Returns an empty path if file cannot be found.
Returns an empty path if file cannot be found or filename is a directory.
*/
std::string locate_file(const std::string &filename)
{
BOOST_FOREACH(const std::string &dir, librarypath) {
fs::path usepath = fs::path(dir) / filename;
if (fs::exists(usepath)) return usepath.string();
if (fs::exists(usepath) && !fs::is_directory(usepath)) return usepath.string();
}
return std::string();
}

View File

@ -1,3 +1,6 @@
//Test blank
use <>
//Test that the entire path is pushed onto the stack upto the last '/'
use <sub1/sub2/sub3/sub4/use-test2.scad>