(svn r13359) -Codechange: convert _fios_items to a SmallVector
authorskidd13
Mon, 02 Jun 2008 14:19:27 +0000
changeset 10808 d42b140d24f2
parent 10807 e4e343679ed6
child 10809 5e1189c1df5c
(svn r13359) -Codechange: convert _fios_items to a SmallVector
-Cleanup: some reincarnations of _fios_items in the code
src/console_cmds.cpp
src/fios.cpp
src/fios.h
src/misc_gui.cpp
src/network/network_gui.cpp
--- a/src/console_cmds.cpp	Mon Jun 02 08:33:38 2008 +0000
+++ b/src/console_cmds.cpp	Mon Jun 02 14:19:27 2008 +0000
@@ -215,32 +215,25 @@
 
 static const FiosItem* GetFiosItem(const char* file)
 {
-	int i;
-
 	_saveload_mode = SLD_LOAD_GAME;
 	BuildFileList();
 
-	for (i = 0; i < _fios_num; i++) {
-		if (strcmp(file, _fios_list[i].name) == 0) break;
-		if (strcmp(file, _fios_list[i].title) == 0) break;
+	for (const FiosItem *item = _fios_items.Begin(); item != _fios_items.End(); item++) {
+		if (strcmp(file, item->name) == 0) return item;
+		if (strcmp(file, item->title) == 0) return item;
 	}
 
-	if (i == _fios_num) { // If no name matches, try to parse it as number
-		char* endptr;
+	/* If no name matches, try to parse it as number */
+	char *endptr;
+	int i = strtol(file, &endptr, 10);
+	if (file == endptr || *endptr != '\0') i = -1;
 
-		i = strtol(file, &endptr, 10);
-		if (file == endptr || *endptr != '\0') i = -1;
-	}
-
-	return IsInsideMM(i, 0, _fios_num) ? &_fios_list[i] : NULL;
+	return IsInsideMM(i, 0, _fios_items.Length()) ? _fios_items.Get(i) : NULL;
 }
 
 
 DEF_CONSOLE_CMD(ConLoad)
 {
-	const FiosItem *item;
-	const char *file;
-
 	if (argc == 0) {
 		IConsoleHelp("Load a game by name or index. Usage: 'load <file | number>'");
 		return true;
@@ -248,8 +241,8 @@
 
 	if (argc != 2) return false;
 
-	file = argv[1];
-	item = GetFiosItem(file);
+	const char *file = argv[1];
+	const FiosItem *item = GetFiosItem(file);
 	if (item != NULL) {
 		switch (item->type) {
 			case FIOS_TYPE_FILE: case FIOS_TYPE_OLDFILE: {
@@ -272,9 +265,6 @@
 
 DEF_CONSOLE_CMD(ConRemove)
 {
-	const FiosItem* item;
-	const char* file;
-
 	if (argc == 0) {
 		IConsoleHelp("Remove a savegame by name or index. Usage: 'rm <file | number>'");
 		return true;
@@ -282,8 +272,8 @@
 
 	if (argc != 2) return false;
 
-	file = argv[1];
-	item = GetFiosItem(file);
+	const char *file = argv[1];
+	const FiosItem *item = GetFiosItem(file);
 	if (item != NULL) {
 		if (!FiosDelete(item->name))
 			IConsolePrintF(CC_ERROR, "%s: Failed to delete file", file);
@@ -299,8 +289,6 @@
 /* List all the files in the current dir via console */
 DEF_CONSOLE_CMD(ConListFiles)
 {
-	int i;
-
 	if (argc == 0) {
 		IConsoleHelp("List all loadable savegames and directories in the current dir via console. Usage: 'ls | dir'");
 		return true;
@@ -308,9 +296,8 @@
 
 	BuildFileList();
 
-	for (i = 0; i < _fios_num; i++) {
-		const FiosItem *item = &_fios_list[i];
-		IConsolePrintF(CC_DEFAULT, "%d) %s", i, item->title);
+	for (uint i = 0; i < _fios_items.Length(); i++) {
+		IConsolePrintF(CC_DEFAULT, "%d) %s", i, _fios_items[i].title);
 	}
 
 	FiosFreeSavegameList();
@@ -320,9 +307,6 @@
 /* Change the dir via console */
 DEF_CONSOLE_CMD(ConChangeDirectory)
 {
-	const FiosItem *item;
-	const char *file;
-
 	if (argc == 0) {
 		IConsoleHelp("Change the dir via console. Usage: 'cd <directory | number>'");
 		return true;
@@ -330,8 +314,8 @@
 
 	if (argc != 2) return false;
 
-	file = argv[1];
-	item = GetFiosItem(file);
+	const char *file = argv[1];
+	const FiosItem *item = GetFiosItem(file);
 	if (item != NULL) {
 		switch (item->type) {
 			case FIOS_TYPE_DIR: case FIOS_TYPE_DRIVE: case FIOS_TYPE_PARENT:
--- a/src/fios.cpp	Mon Jun 02 08:33:38 2008 +0000
+++ b/src/fios.cpp	Mon Jun 02 14:19:27 2008 +0000
@@ -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 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 @@
 	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 @@
 	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 @@
 			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 @@
 	{
 		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 @@
 
 			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 @@
 		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 @@
  * @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 @@
 
 	_fios_path = fios_save_path;
 
-	return FiosGetFileList(mode, &FiosGetSavegameListCallback);
+	FiosGetFileList(mode, &FiosGetSavegameListCallback);
 }
 
 /**
@@ -393,7 +376,7 @@
  * @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 @@
 
 	_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 @@
 }
 
 /* Get a list of Heightmaps */
-FiosItem *FiosGetHeightmapList(SaveLoadDialogMode mode)
+void FiosGetHeightmapList(SaveLoadDialogMode mode)
 {
 	static char *fios_hmap_path = NULL;
 
@@ -436,5 +419,5 @@
 
 	_fios_path = fios_hmap_path;
 
-	return FiosGetFileList(mode, &FiosGetHeightmapListCallback);
+	FiosGetFileList(mode, &FiosGetHeightmapListCallback);
 }
--- a/src/fios.h	Mon Jun 02 08:33:38 2008 +0000
+++ b/src/fios.h	Mon Jun 02 14:19:27 2008 +0000
@@ -6,6 +6,7 @@
 #define FIOS_H
 
 #include "strings_type.h"
+#include "misc/smallvec.h"
 
 enum {
 	/**
@@ -80,8 +81,7 @@
 };
 
 /* Variables to display file lists */
-extern FiosItem *_fios_list; ///< defined in misc_gui.cpp
-extern int _fios_num;        ///< defined in fios.cpp, read_only version of _fios_count
+extern SmallVector<FiosItem, 32> _fios_items; ///< defined in fios.cpp
 extern SmallFiosItem _file_to_saveload;
 extern SaveLoadDialogMode _saveload_mode;   ///< defined in misc_gui.cpp
 extern byte _savegame_sort_order;
@@ -90,11 +90,11 @@
 void ShowSaveLoadDialog(SaveLoadDialogMode mode);
 
 /* Get a list of savegames */
-FiosItem *FiosGetSavegameList(SaveLoadDialogMode mode);
+void FiosGetSavegameList(SaveLoadDialogMode mode);
 /* Get a list of scenarios */
-FiosItem *FiosGetScenarioList(SaveLoadDialogMode mode);
+void FiosGetScenarioList(SaveLoadDialogMode mode);
 /* Get a list of Heightmaps */
-FiosItem *FiosGetHeightmapList(SaveLoadDialogMode mode);
+void FiosGetHeightmapList(SaveLoadDialogMode mode);
 /* Free the list of savegames */
 void FiosFreeSavegameList();
 /* Browse to. Returns a filename w/path if we reached a file. */
--- a/src/misc_gui.cpp	Mon Jun 02 08:33:38 2008 +0000
+++ b/src/misc_gui.cpp	Mon Jun 02 14:19:27 2008 +0000
@@ -50,7 +50,6 @@
 #include "table/strings.h"
 
 /* Variables to display file lists */
-FiosItem *_fios_list;
 SaveLoadDialogMode _saveload_mode;
 
 
@@ -1300,11 +1299,11 @@
 		case SLD_NEW_GAME:
 		case SLD_LOAD_SCENARIO:
 		case SLD_SAVE_SCENARIO:
-			_fios_list = FiosGetScenarioList(_saveload_mode); break;
+			FiosGetScenarioList(_saveload_mode); break;
 		case SLD_LOAD_HEIGHTMAP:
-			_fios_list = FiosGetHeightmapList(_saveload_mode); break;
+			FiosGetHeightmapList(_saveload_mode); break;
 
-		default: _fios_list = FiosGetSavegameList(_saveload_mode); break;
+		default: FiosGetSavegameList(_saveload_mode); break;
 	}
 }
 
@@ -1333,8 +1332,8 @@
 	 * Drives (A:\ (windows only) are always under the files (FIOS_TYPE_DRIVE)
 	 * Only sort savegames/scenarios, not directories
 	 */
-	for (int i = 0; i < _fios_num; i++) {
-		switch (_fios_list[i].type) {
+	for (const FiosItem *item = _fios_items.Begin(); item != _fios_items.End(); item++) {
+		switch (item->type) {
 			case FIOS_TYPE_DIR:    sort_start++; break;
 			case FIOS_TYPE_PARENT: sort_start++; break;
 			case FIOS_TYPE_DRIVE:  sort_end++;   break;
@@ -1342,9 +1341,9 @@
 		}
 	}
 
-	uint s_amount = _fios_num - sort_start - sort_end;
+	uint s_amount = _fios_items.Length() - sort_start - sort_end;
 	if (s_amount > 0) {
-		qsort(_fios_list + sort_start, s_amount, sizeof(FiosItem), compare_FiosItems);
+		qsort(_fios_items.Get(sort_start), s_amount, sizeof(FiosItem), compare_FiosItems);
 	}
 }
 
@@ -1443,10 +1442,9 @@
 
 	virtual void OnPaint()
 	{
-		int pos;
 		int y;
 
-		SetVScrollCount(this, _fios_num);
+		SetVScrollCount(this, _fios_items.Length());
 		this->DrawWidgets();
 		DrawFiosTexts(this->width);
 
@@ -1459,8 +1457,8 @@
 		this->DrawSortButtonState(_savegame_sort_order & SORT_BY_NAME ? 2 : 3, _savegame_sort_order & SORT_DESCENDING ? SBS_DOWN : SBS_UP);
 
 		y = this->widget[7].top + 1;
-		for (pos = this->vscroll.pos; pos < _fios_num; pos++) {
-			const FiosItem *item = _fios_list + pos;
+		for (uint pos = this->vscroll.pos; pos < _fios_items.Length(); pos++) {
+			const FiosItem *item = _fios_items.Get(pos);
 
 			DoDrawStringTruncated(item->title, 4, y, _fios_colors[item->type], this->width - 18);
 			y += 10;
@@ -1497,14 +1495,12 @@
 
 			case 7: { // Click the listbox
 				int y = (pt.y - this->widget[widget].top - 1) / 10;
-				char *name;
-				const FiosItem *file;
 
 				if (y < 0 || (y += this->vscroll.pos) >= this->vscroll.count) return;
 
-				file = _fios_list + y;
+				const FiosItem *file = _fios_items.Get(y);
 
-				name = FiosBrowseTo(file);
+				char *name = FiosBrowseTo(file);
 				if (name != NULL) {
 					if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) {
 						_switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD;
--- a/src/network/network_gui.cpp	Mon Jun 02 08:33:38 2008 +0000
+++ b/src/network/network_gui.cpp	Mon Jun 02 14:19:27 2008 +0000
@@ -670,7 +670,7 @@
 		_saveload_mode = SLD_NEW_GAME;
 		BuildFileList();
 		this->vscroll.cap = 12;
-		this->vscroll.count = _fios_num + 1;
+		this->vscroll.count = _fios_items.Length();
 
 		this->afilter = CS_ALPHANUMERAL;
 		InitializeTextBuffer(&this->text, this->edit_str_buf, lengthof(this->edit_str_buf), 160);
@@ -683,7 +683,7 @@
 
 	virtual void OnPaint()
 	{
-		int y = NSSWND_START, pos;
+		int y = NSSWND_START;
 		const FiosItem *item;
 
 		/* draw basic widgets */
@@ -703,9 +703,8 @@
 		/* draw list of maps */
 		GfxFillRect(11, 63, 258, 215, 0xD7);  // black background of maps list
 
-		pos = this->vscroll.pos;
-		while (pos < _fios_num + 1) {
-			item = _fios_list + pos - 1;
+		for (uint pos = this->vscroll.pos; pos < _fios_items.Length() + 1; pos++) {
+			item = _fios_items.Get(pos - 1);
 			if (item == this->map || (pos == 0 && this->map == NULL))
 				GfxFillRect(11, y - 1, 258, y + 10, 155); // show highlighted item with a different colour
 
@@ -714,7 +713,6 @@
 			} else {
 				DoDrawString(item->title, 14, y, _fios_colors[item->type] );
 			}
-			pos++;
 			y += NSSWND_ROWSIZE;
 
 			if (y >= this->vscroll.cap * NSSWND_ROWSIZE + NSSWND_START) break;
@@ -746,7 +744,7 @@
 				y += this->vscroll.pos;
 				if (y >= this->vscroll.count) return;
 
-				this->map = (y == 0) ? NULL : _fios_list + y - 1;
+				this->map = (y == 0) ? NULL : _fios_items.Get(y - 1);
 				this->SetDirty();
 			} break;