changeset 18084:475be2c93383 draft

(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
author rubidium <rubidium@openttd.org>
date Thu, 08 Sep 2011 09:55:04 +0000
parents 7de5da015146
children 4c20dc16f447
files src/ai/ai_scanner.cpp src/script/script_info.cpp src/script/script_info.hpp src/script/script_scanner.cpp
diffstat 4 files changed, 27 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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/<path>/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/<path>/main.nut. */
+		*strrchr(path, PATHSEPCHAR) = '\0';
 		checksum.Scan(".nut", path);
 	}
 
--- 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;
--- 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;
--- 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) {