(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
authorrubidium
Sun, 17 Jun 2007 21:26:57 +0000
changeset 6941 72147014e54d
parent 6940 32f30eb820f0
child 6942 9a0a07c109d0
(svn r10194) -Codechange: prefer the current working directory above the user's home directory when openttd.cfg exists in the current working directory, otherwise prefer the home directory.
src/fileio.cpp
src/fileio.h
--- a/src/fileio.cpp	Sun Jun 17 20:47:11 2007 +0000
+++ b/src/fileio.cpp	Sun Jun 17 21:26:57 2007 +0000
@@ -224,7 +224,7 @@
 	assert(subdir < NUM_SUBDIRS);
 	assert(sp < NUM_SEARCHPATHS);
 
-	snprintf(buf, buflen, "%s%s" PATHSEP "%s", _searchpaths[sp], _subdirs[subdir], filename);
+	snprintf(buf, buflen, "%s%s%s", _searchpaths[sp], _subdirs[subdir], filename);
 	return buf;
 }
 
@@ -464,17 +464,39 @@
 	Searchpath sp;
 	FOR_ALL_SEARCHPATHS(sp) DEBUG(misc, 4, "%s added as search path", _searchpaths[sp]);
 
-	/* Search for the first search path, as that will be the closest to
-	 * the personal directory. */
-	FOR_ALL_SEARCHPATHS(sp) {
-		_personal_dir = strdup(_searchpaths[sp]);
-		DEBUG(misc, 3, "%s found as personal directory", _searchpaths[sp]);
-		break;
+	if (_config_file != NULL) {
+		_personal_dir = strdup(_config_file);
+		char *end = strrchr(_personal_dir , PATHSEPCHAR);
+		if (end == NULL) {
+			_personal_dir[0] = '\0';
+		} else {
+			end[1] = '\0';
+		}
+	} else {
+		char personal_dir[MAX_PATH];
+		FioFindFullPath(personal_dir, lengthof(personal_dir), BASE_DIR, "openttd.cfg");
+
+		if (FileExists(personal_dir)) {
+			char *end = strrchr(personal_dir, PATHSEPCHAR);
+			if (end != NULL) end[1] = '\0';
+			_personal_dir = strdup(personal_dir);
+			_config_file = str_fmt("%sopenttd.cfg", _personal_dir);
+		} else {
+			static const Searchpath new_openttd_cfg_order[] = {
+					SP_PERSONAL_DIR, SP_BINARY_DIR, SP_WORKING_DIR, SP_SHARED_DIR, SP_INSTALLATION_DIR
+				};
+
+			for (uint i = 0; i < lengthof(new_openttd_cfg_order); i++) {
+				if (IsValidSearchPath(new_openttd_cfg_order[i])) {
+					_personal_dir = strdup(_searchpaths[new_openttd_cfg_order[i]]);
+					_config_file = str_fmt("%sopenttd.cfg", _personal_dir);
+					break;
+				}
+			}
+		}
 	}
 
-	if (_config_file == NULL) {
-		_config_file = str_fmt("%sopenttd.cfg", _personal_dir);
-	}
+	DEBUG(misc, 3, "%s found as personal directory", _personal_dir);
 
 	_highscore_file = str_fmt("%shs.dat", _personal_dir);
 	_log_file = str_fmt("%sopenttd.log",  _personal_dir);
--- a/src/fileio.h	Sun Jun 17 20:47:11 2007 +0000
+++ b/src/fileio.h	Sun Jun 17 21:26:57 2007 +0000
@@ -40,9 +40,9 @@
  * Types of searchpaths OpenTTD might use
  */
 enum Searchpath {
+	SP_WORKING_DIR,            ///< Search in the working directory
 	SP_PERSONAL_DIR,           ///< Search in the personal directory
 	SP_SHARED_DIR,             ///< Search in the shared directory, like 'Shared Files' under Windows
-	SP_WORKING_DIR,            ///< Search in the working directory
 	SP_BINARY_DIR,             ///< Search in the directory where the binary resides
 	SP_INSTALLATION_DIR,       ///< Search in the installation directory
 	SP_APPLICATION_BUNDLE_DIR, ///< Search within the application bundle