mirror of https://github.com/vitalif/openscad
Minor clarification, cleanup file reading
parent
accb71b546
commit
abcd702a68
|
@ -5,6 +5,7 @@
|
||||||
#include "openscad.h"
|
#include "openscad.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
@ -12,8 +13,9 @@ ModuleCache *ModuleCache::inst = NULL;
|
||||||
|
|
||||||
Module *ModuleCache::evaluate(const std::string &filename)
|
Module *ModuleCache::evaluate(const std::string &filename)
|
||||||
{
|
{
|
||||||
Module *cached = NULL;
|
Module *lib_mod = NULL;
|
||||||
|
|
||||||
|
// Create cache ID
|
||||||
struct stat st;
|
struct stat st;
|
||||||
memset(&st, 0, sizeof(struct stat));
|
memset(&st, 0, sizeof(struct stat));
|
||||||
stat(filename.c_str(), &st);
|
stat(filename.c_str(), &st);
|
||||||
|
@ -22,61 +24,55 @@ Module *ModuleCache::evaluate(const std::string &filename)
|
||||||
idstream << std::hex << st.st_mtime << "." << st.st_size;
|
idstream << std::hex << st.st_mtime << "." << st.st_size;
|
||||||
std::string cache_id = idstream.str();
|
std::string cache_id = idstream.str();
|
||||||
|
|
||||||
|
// Lookup in cache
|
||||||
if (this->entries.find(filename) != this->entries.end() &&
|
if (this->entries.find(filename) != this->entries.end() &&
|
||||||
this->entries[filename].cache_id == cache_id) {
|
this->entries[filename].cache_id == cache_id) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
PRINTB("Using cached library: %s (%s)", filename % cache_id);
|
PRINTB("Using cached library: %s (%s)", filename % cache_id);
|
||||||
#endif
|
#endif
|
||||||
PRINTB("%s", this->entries[filename].msg);
|
PRINTB("%s", this->entries[filename].msg);
|
||||||
cached = &(*this->entries[filename].module);
|
lib_mod = &(*this->entries[filename].module);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cached) {
|
// If cache lookup failed (non-existing or old timestamp), compile module
|
||||||
cached->handleDependencies();
|
if (!lib_mod) {
|
||||||
return cached;
|
#ifdef DEBUG
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (this->entries.find(filename) != this->entries.end()) {
|
if (this->entries.find(filename) != this->entries.end()) {
|
||||||
PRINTB("Recompiling cached library: %s (%s)", filename % cache_id);
|
PRINTB("Recompiling cached library: %s (%s)", filename % cache_id);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PRINTB("Compiling library '%s'.", filename);
|
PRINTB("Compiling library '%s'.", filename);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
std::ifstream ifs(filename.c_str());
|
||||||
|
if (!ifs.is_open()) {
|
||||||
|
PRINTB("WARNING: Can't open library file '%s'\n", filename);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
std::string text((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
|
||||||
|
|
||||||
|
print_messages_push();
|
||||||
|
|
||||||
|
cache_entry e = { NULL, cache_id, std::string("WARNING: Library `") + filename + "' tries to recursively use itself!" };
|
||||||
|
if (this->entries.find(filename) != this->entries.end())
|
||||||
|
delete this->entries[filename].module;
|
||||||
|
this->entries[filename] = e;
|
||||||
|
|
||||||
|
std::string pathname = boosty::stringy(fs::path(filename).parent_path());
|
||||||
|
lib_mod = dynamic_cast<Module*>(parse(text.c_str(), pathname.c_str(), 0));
|
||||||
|
|
||||||
|
if (lib_mod) {
|
||||||
|
this->entries[filename].module = lib_mod;
|
||||||
|
this->entries[filename].msg = print_messages_stack.back();
|
||||||
|
} else {
|
||||||
|
this->entries.erase(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
print_messages_pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE *fp = fopen(filename.c_str(), "rt");
|
if (lib_mod) lib_mod->handleDependencies();
|
||||||
if (!fp) {
|
|
||||||
fprintf(stderr, "WARNING: Can't open library file '%s'\n", filename.c_str());
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
std::stringstream text;
|
|
||||||
char buffer[513];
|
|
||||||
int ret;
|
|
||||||
while ((ret = fread(buffer, 1, 512, fp)) > 0) {
|
|
||||||
buffer[ret] = 0;
|
|
||||||
text << buffer;
|
|
||||||
}
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
print_messages_push();
|
|
||||||
|
|
||||||
cache_entry e = { NULL, cache_id, std::string("WARNING: Library `") + filename + "' tries to recursively use itself!" };
|
|
||||||
if (this->entries.find(filename) != this->entries.end())
|
|
||||||
delete this->entries[filename].module;
|
|
||||||
this->entries[filename] = e;
|
|
||||||
|
|
||||||
std::string pathname = boosty::stringy(fs::path(filename).parent_path());
|
|
||||||
Module *lib_mod = dynamic_cast<Module*>(parse(text.str().c_str(), pathname.c_str(), 0));
|
|
||||||
|
|
||||||
if (lib_mod) {
|
|
||||||
this->entries[filename].module = lib_mod;
|
|
||||||
this->entries[filename].msg = print_messages_stack.back();
|
|
||||||
lib_mod->handleDependencies();
|
|
||||||
} else {
|
|
||||||
this->entries.erase(filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
print_messages_pop();
|
|
||||||
|
|
||||||
return lib_mod;
|
return lib_mod;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue