diff options
Diffstat (limited to 'src/fios.cpp')
-rw-r--r-- | src/fios.cpp | 61 |
1 files changed, 22 insertions, 39 deletions
diff --git a/src/fios.cpp b/src/fios.cpp index 2145378a3..73c3b9ae2 100644 --- a/src/fios.cpp +++ b/src/fios.cpp @@ -10,7 +10,6 @@ #include "heightmap.h" #include "fios.h" #include "fileio.h" -#include "core/alloc_func.hpp" #include "functions.h" #include "string_func.h" #include <sys/types.h> @@ -30,12 +29,9 @@ #include "table/strings.h" /* Variables to display file lists */ -int _fios_num; - +SmallVector<FiosItem, 32> _fios_items; static char *_fios_path; -static FiosItem *_fios_items; SmallFiosItem _file_to_saveload; -static int _fios_count, _fios_alloc; /* OS-specific functions are taken from their respective files (win32/unix/os2 .c) */ extern bool FiosIsRoot(const char *path); @@ -48,19 +44,6 @@ extern bool FiosGetDiskFreeSpace(const char *path, uint32 *tot); extern void GetOldSaveGameName(char *title, const char *path, const char *file); /** - * Allocate a new FiosItem. - * @return A pointer to the newly allocated FiosItem. - */ -FiosItem *FiosAlloc() -{ - if (_fios_count == _fios_alloc) { - _fios_alloc += 256; - _fios_items = ReallocT(_fios_items, _fios_alloc); - } - return &_fios_items[_fios_count++]; -} - -/** * Compare two FiosItem's. Used with qsort when sorting the file list. * @param a A pointer to the first FiosItem to compare. * @param b A pointer to the second FiosItem to compare. @@ -82,15 +65,12 @@ int CDECL compare_FiosItems(const void *a, const void *b) return r; } -/** - * Free the list of savegames - */ +/** Clear the list */ void FiosFreeSavegameList() { - free(_fios_items); - _fios_items = NULL; - _fios_alloc = _fios_count = 0; -} + _fios_items.Clear(); + _fios_items.Compact(); +}; /** * Get descriptive texts. Returns the path and free space @@ -229,9 +209,11 @@ static FiosItem *FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_ int sort_start; char d_name[sizeof(fios->name)]; + _fios_items.Clear(); + /* A parent directory link exists if we are not in the root directory */ if (!FiosIsRoot(_fios_path) && mode != SLD_NEW_GAME) { - fios = FiosAlloc(); + fios = _fios_items.Append(); fios->type = FIOS_TYPE_PARENT; fios->mtime = 0; ttd_strlcpy(fios->name, "..", lengthof(fios->name)); @@ -247,7 +229,7 @@ static FiosItem *FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_ if (FiosIsValidFile(_fios_path, dirent, &sb) && (sb.st_mode & S_IFDIR) && (!FiosIsHiddenFile(dirent) || strncasecmp(d_name, PERSONAL_DIR, strlen(d_name)) == 0) && strcmp(d_name, ".") != 0 && strcmp(d_name, "..") != 0) { - fios = FiosAlloc(); + fios = _fios_items.Append(); fios->type = FIOS_TYPE_DIR; fios->mtime = 0; ttd_strlcpy(fios->name, d_name, lengthof(fios->name)); @@ -262,12 +244,12 @@ static FiosItem *FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_ { byte order = _savegame_sort_order; _savegame_sort_order = SORT_BY_NAME | SORT_ASCENDING; - qsort(_fios_items, _fios_count, sizeof(FiosItem), compare_FiosItems); + qsort(_fios_items.Begin(), _fios_items.Length(), sizeof(FiosItem), compare_FiosItems); _savegame_sort_order = order; } /* This is where to start sorting for the filenames */ - sort_start = _fios_count; + sort_start = _fios_items.Length(); /* Show files */ dir = ttd_opendir(_fios_path); @@ -285,7 +267,7 @@ static FiosItem *FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_ FiosType type = callback_proc(mode, d_name, t, fios_title); if (type != FIOS_TYPE_INVALID) { - fios = FiosAlloc(); + fios = _fios_items.Append(); fios->mtime = sb.st_mtime; fios->type = type; ttd_strlcpy(fios->name, d_name, lengthof(fios->name)); @@ -300,13 +282,14 @@ static FiosItem *FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_ closedir(dir); } - qsort(_fios_items + sort_start, _fios_count - sort_start, sizeof(FiosItem), compare_FiosItems); + qsort(_fios_items.Get(sort_start), _fios_items.Length() - sort_start, sizeof(FiosItem), compare_FiosItems); /* Show drives */ if (mode != SLD_NEW_GAME) FiosGetDrives(); - _fios_num = _fios_count; - return _fios_items; + _fios_items.Compact(); + + return _fios_items.Begin(); } /** @@ -345,7 +328,7 @@ static FiosType FiosGetSavegameListCallback(SaveLoadDialogMode mode, const char * @return A pointer to an array of FiosItem representing all the files to be shown in the save/load dialog. * @see FiosGetFileList */ -FiosItem *FiosGetSavegameList(SaveLoadDialogMode mode) +void FiosGetSavegameList(SaveLoadDialogMode mode) { static char *fios_save_path = NULL; @@ -356,7 +339,7 @@ FiosItem *FiosGetSavegameList(SaveLoadDialogMode mode) _fios_path = fios_save_path; - return FiosGetFileList(mode, &FiosGetSavegameListCallback); + FiosGetFileList(mode, &FiosGetSavegameListCallback); } /** @@ -393,7 +376,7 @@ static FiosType FiosGetScenarioListCallback(SaveLoadDialogMode mode, const char * @return A pointer to an array of FiosItem representing all the files to be shown in the save/load dialog. * @see FiosGetFileList */ -FiosItem *FiosGetScenarioList(SaveLoadDialogMode mode) +void FiosGetScenarioList(SaveLoadDialogMode mode) { static char *fios_scn_path = NULL; @@ -405,7 +388,7 @@ FiosItem *FiosGetScenarioList(SaveLoadDialogMode mode) _fios_path = fios_scn_path; - return FiosGetFileList(mode, &FiosGetScenarioListCallback); + FiosGetFileList(mode, &FiosGetScenarioListCallback); } static FiosType FiosGetHeightmapListCallback(SaveLoadDialogMode mode, const char *file, const char *ext, char *title) @@ -425,7 +408,7 @@ static FiosType FiosGetHeightmapListCallback(SaveLoadDialogMode mode, const char } /* Get a list of Heightmaps */ -FiosItem *FiosGetHeightmapList(SaveLoadDialogMode mode) +void FiosGetHeightmapList(SaveLoadDialogMode mode) { static char *fios_hmap_path = NULL; @@ -436,5 +419,5 @@ FiosItem *FiosGetHeightmapList(SaveLoadDialogMode mode) _fios_path = fios_hmap_path; - return FiosGetFileList(mode, &FiosGetHeightmapListCallback); + FiosGetFileList(mode, &FiosGetHeightmapListCallback); } |