forked from mirror/OpenTTD
(svn r1990) Reduce the diff between the OS specific files with respect to file handling and fix some inconsitencies (I hope I didn't break the OS/2 part, couldn't test it, feedback is welcome)
This commit is contained in:
109
unix.c
109
unix.c
@@ -45,13 +45,14 @@ static FiosItem *FiosAlloc(void)
|
||||
return &_fios_items[_fios_count++];
|
||||
}
|
||||
|
||||
int compare_FiosItems (const void *a, const void *b) {
|
||||
const FiosItem *da = (const FiosItem *) a;
|
||||
const FiosItem *db = (const FiosItem *) b;
|
||||
int compare_FiosItems(const void *a, const void *b)
|
||||
{
|
||||
const FiosItem *da = (const FiosItem *)a;
|
||||
const FiosItem *db = (const FiosItem *)b;
|
||||
int r;
|
||||
|
||||
if (_savegame_sort_order < 2) // sort by date
|
||||
r = da->mtime < db->mtime ? -1 : 1;
|
||||
r = da->mtime < db->mtime ? -1 : 1;
|
||||
else
|
||||
r = strcasecmp(
|
||||
da->title[0] != '\0' ? da->title : da->name,
|
||||
@@ -92,7 +93,7 @@ FiosItem *FiosGetSavegameList(int *num, int mode)
|
||||
}
|
||||
|
||||
// Show subdirectories first
|
||||
dir = opendir(_fios_path[0] ? _fios_path : "/");
|
||||
dir = opendir(_fios_path[0] != '\0' ? _fios_path : "/");
|
||||
if (dir != NULL) {
|
||||
while ((dirent = readdir(dir)) != NULL) {
|
||||
snprintf(filename, lengthof(filename), "%s/%s",
|
||||
@@ -100,10 +101,11 @@ FiosItem *FiosGetSavegameList(int *num, int mode)
|
||||
if (!stat(filename, &sb) && S_ISDIR(sb.st_mode) &&
|
||||
dirent->d_name[0] != '.') {
|
||||
fios = FiosAlloc();
|
||||
fios->mtime = 0;
|
||||
fios->type = FIOS_TYPE_DIR;
|
||||
fios->title[0] = '\0';
|
||||
sprintf(fios->name, "%s/ (Directory)", dirent->d_name);
|
||||
fios->mtime = 0;
|
||||
ttd_strlcpy(fios->name, dirent->d_name, lengthof(fios->name));
|
||||
snprintf(fios->title, lengthof(fios->title),
|
||||
"%s/ (Directory)", dirent->d_name);
|
||||
}
|
||||
}
|
||||
closedir(dir);
|
||||
@@ -120,15 +122,15 @@ FiosItem *FiosGetSavegameList(int *num, int mode)
|
||||
// this is where to start sorting
|
||||
sort_start = _fios_count;
|
||||
|
||||
/* Show savegame files
|
||||
* .SAV OpenTTD saved game
|
||||
* .SS1 Transport Tycoon Deluxe preset game
|
||||
* .SV1 Transport Tycoon Deluxe (Patch) saved game
|
||||
* .SV2 Transport Tycoon Deluxe (Patch) saved 2-player game
|
||||
/* Show savegame files
|
||||
* .SAV OpenTTD saved game
|
||||
* .SS1 Transport Tycoon Deluxe preset game
|
||||
* .SV1 Transport Tycoon Deluxe (Patch) saved game
|
||||
* .SV2 Transport Tycoon Deluxe (Patch) saved 2-player game
|
||||
*/
|
||||
dir = opendir(_fios_path[0] != '\0' ? _fios_path : "/");
|
||||
if (dir != NULL) {
|
||||
while ((dirent = readdir(dir))) {
|
||||
while ((dirent = readdir(dir)) != NULL) {
|
||||
char *t;
|
||||
|
||||
snprintf(filename, lengthof(filename), "%s/%s",
|
||||
@@ -137,25 +139,21 @@ FiosItem *FiosGetSavegameList(int *num, int mode)
|
||||
|
||||
t = strrchr(dirent->d_name, '.');
|
||||
if (t != NULL && strcasecmp(t, ".sav") == 0) { // OpenTTD
|
||||
*t = '\0'; // cut extension
|
||||
fios = FiosAlloc();
|
||||
fios->type = FIOS_TYPE_FILE;
|
||||
fios->mtime = sb.st_mtime;
|
||||
fios->title[0] = 0;
|
||||
ttd_strlcpy(fios->name, dirent->d_name, sizeof(fios->name));
|
||||
fios->title[0] = '\0';
|
||||
ttd_strlcpy(fios->name, dirent->d_name, lengthof(fios->name));
|
||||
} else if (mode == SLD_LOAD_GAME || mode == SLD_LOAD_SCENARIO) {
|
||||
int ext = 0; // start of savegame extensions in _old_extensions[]
|
||||
if (t != NULL && (
|
||||
(ext++, strcasecmp(t, ".ss1") == 0) ||
|
||||
(ext++, strcasecmp(t, ".sv1") == 0) ||
|
||||
(ext++, strcasecmp(t, ".sv2") == 0)
|
||||
strcasecmp(t, ".ss1") == 0 ||
|
||||
strcasecmp(t, ".sv1") == 0 ||
|
||||
strcasecmp(t, ".sv2") == 0
|
||||
)) { // TTDLX(Patch)
|
||||
*t = '\0'; // cut extension
|
||||
fios = FiosAlloc();
|
||||
fios->old_extension = ext - 1;
|
||||
fios->type = FIOS_TYPE_OLDFILE;
|
||||
fios->mtime = sb.st_mtime;
|
||||
ttd_strlcpy(fios->name, dirent->d_name, sizeof(fios->name));
|
||||
ttd_strlcpy(fios->name, dirent->d_name, lengthof(fios->name));
|
||||
GetOldSaveGameName(fios->title, filename);
|
||||
}
|
||||
}
|
||||
@@ -163,8 +161,8 @@ FiosItem *FiosGetSavegameList(int *num, int mode)
|
||||
closedir(dir);
|
||||
}
|
||||
|
||||
*num = _fios_count;
|
||||
qsort(_fios_items + sort_start, _fios_count - sort_start, sizeof(FiosItem), compare_FiosItems);
|
||||
*num = _fios_count;
|
||||
return _fios_items;
|
||||
}
|
||||
|
||||
@@ -185,6 +183,14 @@ FiosItem *FiosGetScenarioList(int *num, int mode)
|
||||
}
|
||||
_fios_path = _fios_scn_path;
|
||||
|
||||
// Parent directory, only if not of the type C:\.
|
||||
if (_fios_path[1] != '\0' && mode != SLD_NEW_GAME) {
|
||||
fios = FiosAlloc();
|
||||
fios->type = FIOS_TYPE_PARENT;
|
||||
fios->mtime = 0;
|
||||
strcpy(fios->title, ".. (Parent directory)");
|
||||
}
|
||||
|
||||
// Show subdirectories first
|
||||
dir = opendir(_fios_path[0] ? _fios_path : "/");
|
||||
if (dir != NULL) {
|
||||
@@ -194,10 +200,11 @@ FiosItem *FiosGetScenarioList(int *num, int mode)
|
||||
if (!stat(filename, &sb) && S_ISDIR(sb.st_mode) &&
|
||||
dirent->d_name[0] != '.') {
|
||||
fios = FiosAlloc();
|
||||
fios->mtime = '\0';
|
||||
fios->type = FIOS_TYPE_DIR;
|
||||
fios->title[0] = '\0';
|
||||
sprintf(fios->name, "%s/ (Directory)", dirent->d_name);
|
||||
fios->mtime = 0;
|
||||
ttd_strlcpy(fios->name, dirent->d_name, lengthof(fios->name));
|
||||
snprintf(fios->title, lengthof(fios->title),
|
||||
"%s/ (Directory)", dirent->d_name);
|
||||
}
|
||||
}
|
||||
closedir(dir);
|
||||
@@ -206,49 +213,46 @@ FiosItem *FiosGetScenarioList(int *num, int mode)
|
||||
// this is where to start sorting
|
||||
sort_start = _fios_count;
|
||||
|
||||
/* Show scenario files
|
||||
* .SCN OpenTTD style scenario file
|
||||
* .SV0 Transport Tycoon Deluxe (Patch) scenario
|
||||
* .SS0 Transport Tycoon Deluxe preset scenario
|
||||
/* Show scenario files
|
||||
* .SCN OpenTTD style scenario file
|
||||
* .SV0 Transport Tycoon Deluxe (Patch) scenario
|
||||
* .SS0 Transport Tycoon Deluxe preset scenario
|
||||
*/
|
||||
dir = opendir(_fios_path[0] ? _fios_path : "/");
|
||||
if (dir != NULL) {
|
||||
while ((dirent = readdir(dir)) != NULL) {
|
||||
char *t;
|
||||
|
||||
snprintf(filename, MAX_PATH, "%s/%s", _fios_path, dirent->d_name);
|
||||
snprintf(filename, lengthof(filename), "%s/%s",
|
||||
_fios_path, dirent->d_name);
|
||||
if (stat(filename, &sb) || S_ISDIR(sb.st_mode)) continue;
|
||||
|
||||
t = strrchr(dirent->d_name, '.');
|
||||
if (t != NULL && strcasecmp(t, ".scn") != 0) { // OpenTTD
|
||||
*t = '\0'; // cut extension
|
||||
if (t != NULL && strcasecmp(t, ".scn") == 0) { // OpenTTD
|
||||
fios = FiosAlloc();
|
||||
fios->type = FIOS_TYPE_SCENARIO;
|
||||
fios->mtime = sb.st_mtime;
|
||||
fios->title[0] = '\0';
|
||||
ttd_strlcpy(fios->name, dirent->d_name, sizeof(fios->name)-3);
|
||||
ttd_strlcpy(fios->name, dirent->d_name, lengthof(fios->name));
|
||||
} else if (mode == SLD_LOAD_GAME || mode == SLD_LOAD_SCENARIO ||
|
||||
mode == SLD_NEW_GAME) {
|
||||
int ext = 3; // start of scenario extensions in _old_extensions[]
|
||||
if (t != NULL && (
|
||||
(ext++, strcasecmp(t, ".sv0") == 0) ||
|
||||
(ext++, strcasecmp(t, ".ss0") == 0)
|
||||
)) {// TTDLX(Patch)
|
||||
*t = '\0'; // cut extension
|
||||
strcasecmp(t, ".sv0") == 0 ||
|
||||
strcasecmp(t, ".ss0") == 0
|
||||
)) { // TTDLX(Patch)
|
||||
fios = FiosAlloc();
|
||||
fios->old_extension = ext-1;
|
||||
fios->type = FIOS_TYPE_OLD_SCENARIO;
|
||||
fios->mtime = sb.st_mtime;
|
||||
GetOldScenarioGameName(fios->title, filename);
|
||||
ttd_strlcpy(fios->name, dirent->d_name, sizeof(fios->name)-3);
|
||||
ttd_strlcpy(fios->name, dirent->d_name, lengthof(fios->name));
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir(dir);
|
||||
}
|
||||
|
||||
*num = _fios_count;
|
||||
qsort(_fios_items + sort_start, _fios_count - sort_start, sizeof(FiosItem), compare_FiosItems);
|
||||
*num = _fios_count;
|
||||
return _fios_items;
|
||||
}
|
||||
|
||||
@@ -264,7 +268,6 @@ void FiosFreeSavegameList(void)
|
||||
// Browse to
|
||||
char *FiosBrowseTo(const FiosItem *item)
|
||||
{
|
||||
static char str_buffr[512];
|
||||
char *path = _fios_path;
|
||||
char *s;
|
||||
|
||||
@@ -282,22 +285,14 @@ char *FiosBrowseTo(const FiosItem *item)
|
||||
break;
|
||||
|
||||
case FIOS_TYPE_FILE:
|
||||
FiosMakeSavegameName(str_buffr, item->name);
|
||||
return str_buffr;
|
||||
|
||||
case FIOS_TYPE_OLDFILE:
|
||||
sprintf(str_buffr, "%s/%s.%s",
|
||||
_fios_path, item->name, _old_extensions[item->old_extension]);
|
||||
return str_buffr;
|
||||
|
||||
case FIOS_TYPE_SCENARIO:
|
||||
sprintf(str_buffr, "%s/%s.scn", path, item->name);
|
||||
return str_buffr;
|
||||
case FIOS_TYPE_OLD_SCENARIO: {
|
||||
static char str_buffr[512];
|
||||
|
||||
case FIOS_TYPE_OLD_SCENARIO:
|
||||
sprintf(str_buffr, "%s/%s.%s",
|
||||
path, item->name, _old_extensions[item->old_extension]);
|
||||
sprintf(str_buffr, "%s/%s", path, item->name);
|
||||
return str_buffr;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
Reference in New Issue
Block a user