# HG changeset patch # User rubidium # Date 1315475704 0 # Node ID 475be2c9338321b2236ba412bbce5a91f3c3dcbf # Parent 7de5da0151469b692b635a72ee856a70d70e5385 (svn r22905) -Fix [FS#4753] (r22836): the name of the tar was removed from the AI filenames, so record it differently. Also removes some of the hackery to get the tar's filename diff --git a/src/ai/ai_scanner.cpp b/src/ai/ai_scanner.cpp --- a/src/ai/ai_scanner.cpp +++ b/src/ai/ai_scanner.cpp @@ -423,15 +423,8 @@ if (!md5sum) return true; AIFileChecksumCreator checksum; - char path[MAX_PATH]; - strecpy(path, info->GetMainScript(), lastof(path)); - /* There'll always be at least 2 path separator characters in an AI's - * main script name as the search algorithm requires the main script to - * be in a subdirectory of the AI directory; so ai//main.nut. */ - *strrchr(path, PATHSEPCHAR) = '\0'; - *strrchr(path, PATHSEPCHAR) = '\0'; - TarList::iterator iter = _tar_list.find(path); - + const char *tar_filename = info->GetTarFile(); + TarList::iterator iter = _tar_list.find(tar_filename); if (iter != _tar_list.end()) { /* The main script is in a tar file, so find all files that * are in the same tar and add them to the MD5 checksumming. */ @@ -444,14 +437,15 @@ const char *ext = strrchr(tar->first.c_str(), '.'); if (ext == NULL || strcasecmp(ext, ".nut") != 0) continue; - /* Create the full path name, */ - seprintf(path, lastof(path), "%s%c%s", tar->second.tar_filename, PATHSEPCHAR, tar->first.c_str()); - checksum.AddFile(path, 0, NULL); + checksum.AddFile(tar->first.c_str(), 0, tar_filename); } } else { - /* Add the path sep char back when searching a directory, so we are - * in the actual directory. */ - path[strlen(path)] = PATHSEPCHAR; + char path[MAX_PATH]; + strecpy(path, info->GetMainScript(), lastof(path)); + /* There'll always be at least 1 path separator character in an AI's + * main script name as the search algorithm requires the main script to + * be in a subdirectory of the AI directory; so ai//main.nut. */ + *strrchr(path, PATHSEPCHAR) = '\0'; checksum.Scan(".nut", path); } diff --git a/src/script/script_info.cpp b/src/script/script_info.cpp --- a/src/script/script_info.cpp +++ b/src/script/script_info.cpp @@ -31,6 +31,7 @@ free((void *)this->instance_name); free((void *)this->url); free(this->main_script); + free(this->tar_file); free(this->SQ_instance); } @@ -69,6 +70,8 @@ } info->main_script = strdup(scanner->GetMainScript()); + const char *tar_name = scanner->GetTarFile(); + if (tar_name != NULL) info->tar_file = strdup(tar_name); /* Cache the data the info file gives us. */ if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetAuthor", &info->author, MAX_GET_OPS)) return SQ_ERROR; diff --git a/src/script/script_info.hpp b/src/script/script_info.hpp --- a/src/script/script_info.hpp +++ b/src/script/script_info.hpp @@ -20,6 +20,7 @@ ScriptFileInfo() : SQ_instance(NULL), main_script(NULL), + tar_file(NULL), author(NULL), name(NULL), short_name(NULL), @@ -77,6 +78,11 @@ const char *GetMainScript() const { return this->main_script; } /** + * Get the filename of the tar the script is in. + */ + const char *GetTarFile() const { return this->tar_file; } + + /** * Check if a given method exists. */ bool CheckMethod(const char *name) const; @@ -91,6 +97,7 @@ HSQOBJECT *SQ_instance; private: char *main_script; + char *tar_file; const char *author; const char *name; const char *short_name; diff --git a/src/script/script_scanner.cpp b/src/script/script_scanner.cpp --- a/src/script/script_scanner.cpp +++ b/src/script/script_scanner.cpp @@ -23,6 +23,14 @@ this->main_script = strdup(filename); if (this->main_script == NULL) return false; + free(this->tar_file); + if (tar_filename != NULL) { + this->tar_file = strdup(tar_filename); + if (this->tar_file == NULL) return false; + } else { + this->tar_file = NULL; + } + const char *end = this->main_script + strlen(this->main_script) + 1; char *p = strrchr(this->main_script, PATHSEPCHAR); if (p == NULL) {