mirror of https://github.com/vitalif/openscad
detect flaws in 'use' and 'include' statements. make locate_file consider directories as 'non files'.
parent
d87dd48215
commit
47a06c074f
14
src/lexer.l
14
src/lexer.l
|
@ -122,10 +122,16 @@ use[ \t\r\n>]*"<" { BEGIN(cond_use); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Only accept regular files which exists */
|
/* 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());
|
handle_dep(usepath.string());
|
||||||
parserlval.text = strdup(usepath.string().c_str());
|
parserlval.text = strdup(usepath.string().c_str());
|
||||||
return TOK_USE;
|
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());
|
finfo = locate_file((fs::path(filepath) / filename).string());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (finfo.empty()) {
|
||||||
|
PRINTB("WARNING: Can't find 'include' file '%s'.", filename);
|
||||||
|
}
|
||||||
|
|
||||||
filepath.clear();
|
filepath.clear();
|
||||||
path_stack.push_back(finfo.parent_path());
|
path_stack.push_back(finfo.parent_path());
|
||||||
|
|
||||||
|
@ -225,7 +235,7 @@ void includefile()
|
||||||
currmodule->registerInclude(fullname);
|
currmodule->registerInclude(fullname);
|
||||||
yyin = fopen(fullname.c_str(), "r");
|
yyin = fopen(fullname.c_str(), "r");
|
||||||
if (!yyin) {
|
if (!yyin) {
|
||||||
PRINTB("WARNING: Can't open input file '%s'.", filename);
|
PRINTB("WARNING: Can't open 'include' file '%s'.", filename);
|
||||||
path_stack.pop_back();
|
path_stack.pop_back();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
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)
|
std::string locate_file(const std::string &filename)
|
||||||
{
|
{
|
||||||
BOOST_FOREACH(const std::string &dir, librarypath) {
|
BOOST_FOREACH(const std::string &dir, librarypath) {
|
||||||
fs::path usepath = fs::path(dir) / filename;
|
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();
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//Test blank
|
||||||
|
use <>
|
||||||
|
|
||||||
//Test that the entire path is pushed onto the stack upto the last '/'
|
//Test that the entire path is pushed onto the stack upto the last '/'
|
||||||
use <sub1/sub2/sub3/sub4/use-test2.scad>
|
use <sub1/sub2/sub3/sub4/use-test2.scad>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue