(svn r9990) -Fix: MorphOS and AmigaOS do not like "//" in filenames as that means the same as "/../" in means in Unix.
authorrubidium
Wed, 30 May 2007 18:24:54 +0000
changeset 6755 7cca96e92189
parent 6754 bffdba516cdd
child 6756 44f714e247ba
(svn r9990) -Fix: MorphOS and AmigaOS do not like "//" in filenames as that means the same as "/../" in means in Unix.
src/fileio.cpp
src/fios.cpp
src/unix.cpp
--- a/src/fileio.cpp	Wed May 30 18:22:56 2007 +0000
+++ b/src/fileio.cpp	Wed May 30 18:24:54 2007 +0000
@@ -359,10 +359,10 @@
 {
 	DetermineBasePaths(exe);
 
-	_paths.save_dir      = str_fmt("%ssave", _paths.personal_dir);
-	_paths.autosave_dir  = str_fmt("%s" PATHSEP "autosave", _paths.save_dir);
-	_paths.scenario_dir  = str_fmt("%sscenario", _paths.personal_dir);
-	_paths.heightmap_dir = str_fmt("%s" PATHSEP "heightmap", _paths.scenario_dir);
+	_paths.save_dir      = str_fmt("%ssave" PATHSEP, _paths.personal_dir);
+	_paths.autosave_dir  = str_fmt("%s" PATHSEP "autosave" PATHSEP, _paths.save_dir);
+	_paths.scenario_dir  = str_fmt("%sscenario" PATHSEP, _paths.personal_dir);
+	_paths.heightmap_dir = str_fmt("%s" PATHSEP "heightmap" PATHSEP, _paths.scenario_dir);
 	_paths.gm_dir        = str_fmt("%sgm" PATHSEP, _paths.game_data_dir);
 	_paths.data_dir      = str_fmt("%sdata" PATHSEP, _paths.game_data_dir);
 #if defined(CUSTOM_LANG_DIR)
--- a/src/fios.cpp	Wed May 30 18:22:56 2007 +0000
+++ b/src/fios.cpp	Wed May 30 18:24:54 2007 +0000
@@ -114,9 +114,10 @@
 
 	case FIOS_TYPE_PARENT:
 		/* Check for possible NULL ptr (not required for UNIXes, but AmigaOS-alikes) */
-		if ((s = strrchr(path, PATHSEPCHAR)) != NULL) {
-			s[1] = '\0'; // go up a directory
-			if (!FiosIsRoot(path)) s[0] = '\0';
+		if ((s = strrchr(path, PATHSEPCHAR)) != path) {
+			s[0] = '\0'; // Remove last path separator character, so we can go up one level.
+			s = strrchr(path, PATHSEPCHAR);
+			if (s != NULL) s[1] = '\0'; // go up a directory
 		}
 #if defined(__MORPHOS__) || defined(__AMIGAOS__)
 		/* On MorphOS or AmigaOS paths look like: "Volume:directory/subdirectory" */
@@ -125,14 +126,12 @@
 		break;
 
 	case FIOS_TYPE_DIR:
-		if (!FiosIsRoot(path)) strcat(path, PATHSEP);
 		strcat(path, item->name);
+		strcat(path, PATHSEP);
 		break;
 
 	case FIOS_TYPE_DIRECT:
-		sprintf(path, "%s" PATHSEP, item->name);
-		s = strrchr(path, PATHSEPCHAR);
-		if (s != NULL && s[1] == '\0') s[0] = '\0'; // strip trailing slash
+		sprintf(path, "%s", item->name);
 		break;
 
 	case FIOS_TYPE_FILE:
@@ -150,7 +149,7 @@
 			snprintf(str_buffr, lengthof(str_buffr), "%s:%s", path, item->name);
 		} else // XXX - only next line!
 #endif
-		snprintf(str_buffr, lengthof(str_buffr), "%s" PATHSEP "%s", path, item->name);
+		snprintf(str_buffr, lengthof(str_buffr), "%s%s", path, item->name);
 
 		return str_buffr;
 	}
--- a/src/unix.cpp	Wed May 30 18:22:56 2007 +0000
+++ b/src/unix.cpp	Wed May 30 18:24:54 2007 +0000
@@ -87,8 +87,11 @@
 	if (FiosIsRoot(path)) {
 		snprintf(filename, lengthof(filename), "%s:%s", path, ent->d_name);
 	} else // XXX - only next line!
+#else
+	assert(path[strlen(path) - 1] == PATHSEPCHAR);
+	if (strlen(path) > 2) assert(path[strlen(path) - 2] != PATHSEPCHAR);
 #endif
-	snprintf(filename, lengthof(filename), "%s" PATHSEP "%s", path, ent->d_name);
+	snprintf(filename, lengthof(filename), "%s%s", path, ent->d_name);
 
 	return stat(filename, sb) == 0;
 }