diff options
-rw-r--r-- | src/ai/ai_scanner.cpp | 8 | ||||
-rw-r--r-- | src/script/script_scanner.cpp | 91 | ||||
-rw-r--r-- | src/script/script_scanner.hpp | 19 |
3 files changed, 30 insertions, 88 deletions
diff --git a/src/ai/ai_scanner.cpp b/src/ai/ai_scanner.cpp index 424746c07..aa4e5190a 100644 --- a/src/ai/ai_scanner.cpp +++ b/src/ai/ai_scanner.cpp @@ -24,8 +24,8 @@ void AIScanner::RescanAIDir() { /* Get rid of information of old AIs. */ this->Reset(); - this->ScanScriptDir("info.nut", AI_DIR); - this->ScanScriptDir("library.nut", AI_LIBRARY_DIR); + this->Scan(PATHSEP "info.nut", AI_DIR); + this->Scan(PATHSEP "library.nut", AI_LIBRARY_DIR); } AIScanner::AIScanner() : @@ -56,7 +56,9 @@ AIScanner::AIScanner() : /* Create the dummy AI */ this->engine->ResetCrashed(); - strecpy(this->main_script, "%_dummy", lastof(this->main_script)); + + free(this->main_script); + this->main_script = strdup("%_dummy"); extern void AI_CreateAIInfoDummy(HSQUIRRELVM vm); AI_CreateAIInfoDummy(this->engine->GetVM()); } diff --git a/src/script/script_scanner.cpp b/src/script/script_scanner.cpp index 995b2e1c3..72f1c3b2a 100644 --- a/src/script/script_scanner.cpp +++ b/src/script/script_scanner.cpp @@ -17,91 +17,42 @@ #include "../script/squirrel.hpp" #include "script_scanner.hpp" -void ScriptScanner::ScanDir(const char *dirname, const char *info_file_name) +bool ScriptScanner::AddFile(const char *filename, size_t basepath_length) { - extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb); - extern bool FiosIsHiddenFile(const struct dirent *ent); - - char d_name[MAX_PATH]; - char temp_script[1024]; - struct stat sb; - struct dirent *dirent; - DIR *dir; - - dir = ttd_opendir(dirname); - /* Dir not found, so do nothing */ - if (dir == NULL) return; - - /* Walk all dirs trying to find a dir in which 'main.nut' exists */ - while ((dirent = readdir(dir)) != NULL) { - ttd_strlcpy(d_name, FS2OTTD(dirent->d_name), sizeof(d_name)); - - /* Valid file, not '.' or '..', not hidden */ - if (!FiosIsValidFile(dirname, dirent, &sb)) continue; - if (strcmp(d_name, ".") == 0 || strcmp(d_name, "..") == 0) continue; - if (FiosIsHiddenFile(dirent) && strncasecmp(d_name, PERSONAL_DIR, strlen(d_name)) != 0) continue; - - /* Create the full length dirname */ - ttd_strlcpy(temp_script, dirname, sizeof(temp_script)); - ttd_strlcat(temp_script, d_name, sizeof(temp_script)); - - if (S_ISREG(sb.st_mode)) { - /* Only .tar files are allowed */ - char *ext = strrchr(d_name, '.'); - if (ext == NULL || strcasecmp(ext, ".tar") != 0) continue; - - /* We always expect a directory in the TAR */ - const char *first_dir = FioTarFirstDir(temp_script); - if (first_dir == NULL) continue; - - ttd_strlcat(temp_script, PATHSEP, sizeof(temp_script)); - ttd_strlcat(temp_script, first_dir, sizeof(temp_script)); - FioTarAddLink(temp_script, first_dir); - } else if (!S_ISDIR(sb.st_mode)) { - /* Skip any other type of file */ - continue; - } - - /* Add an additional / where needed */ - if (temp_script[strlen(temp_script) - 1] != PATHSEPCHAR) ttd_strlcat(temp_script, PATHSEP, sizeof(temp_script)); - - char info_script[MAX_PATH]; - ttd_strlcpy(info_script, temp_script, sizeof(info_script)); - ttd_strlcpy(main_script, temp_script, sizeof(main_script)); - - /* Every script should contain an 'info.nut' and 'main.nut' file; else it is not a valid script */ - ttd_strlcat(info_script, info_file_name, sizeof(info_script)); - ttd_strlcat(main_script, "main.nut", sizeof(main_script)); - if (!FioCheckFileExists(info_script, NO_DIRECTORY) || !FioCheckFileExists(main_script, NO_DIRECTORY)) continue; - - /* We don't care if one of the other scripts failed to load. */ - this->engine->ResetCrashed(); - this->engine->LoadScript(info_script); + free(this->main_script); + this->main_script = strdup(filename); + if (this->main_script == NULL) return false; + + const char *end = this->main_script + strlen(this->main_script) + 1; + char *p = strrchr(this->main_script, PATHSEPCHAR); + if (p == NULL) { + p = this->main_script; + } else { + /* Skip over the path separator character. We don't need that. */ + p++; } - closedir(dir); -} -void ScriptScanner::ScanScriptDir(const char *info_file_name, Subdirectory search_dir) -{ - char buf[MAX_PATH]; - Searchpath sp; + strecpy(p, "main.nut", end); - FOR_ALL_SEARCHPATHS(sp) { - FioAppendDirectory(buf, MAX_PATH, sp, search_dir); - if (FileExists(buf)) this->ScanDir(buf, info_file_name); - } + if (!FioCheckFileExists(filename, this->subdir) || !FioCheckFileExists(this->main_script, this->subdir)) return false; + + /* We don't care if one of the other scripts failed to load. */ + this->engine->ResetCrashed(); + this->engine->LoadScript(filename); + return true; } ScriptScanner::ScriptScanner() { this->engine = new Squirrel(); - this->main_script[0] = '\0'; /* Mark this class as global pointer */ this->engine->SetGlobalPointer(this); + this->main_script = NULL; } ScriptScanner::~ScriptScanner() { + free(this->main_script); delete this->engine; } diff --git a/src/script/script_scanner.hpp b/src/script/script_scanner.hpp index 415b7f6db..2fba6ef5a 100644 --- a/src/script/script_scanner.hpp +++ b/src/script/script_scanner.hpp @@ -12,10 +12,10 @@ #ifndef SCRIPT_SCANNER_HPP #define SCRIPT_SCANNER_HPP -#include "../fileio_type.h" +#include "../fileio_func.h" /** Scanner to help finding scripts. */ -class ScriptScanner { +class ScriptScanner : public FileScanner { public: ScriptScanner(); ~ScriptScanner(); @@ -30,22 +30,11 @@ public: */ const char *GetMainScript() { return this->main_script; } - /** - * Rescan for scripts. - * @param info_file_name The name of the 'info.nut' file. - * @param search_dir The subdirecotry to search for scripts. - */ - void ScanScriptDir(const char *info_file_name, Subdirectory search_dir); - -private: - /** - * Scan a dir for scripts. - */ - void ScanDir(const char *dirname, const char *info_file_name); + /* virtual */ bool AddFile(const char *filename, size_t basepath_length); protected: class Squirrel *engine; ///< The engine we're scanning with. - char main_script[1024]; ///< The name of the current main script. + char *main_script; ///< The name of the current main script. }; #endif /* SCRIPT_SCANNER_HPP */ |