changeset 10752:74e1afb29204 draft

(svn r15085) -Fix (r14164): Clearing a settings group did not delete old items nor reset the last_item pointer, causing lists to not be saved unless they started blank.
author peter1138 <peter1138@openttd.org>
date Wed, 14 Jan 2009 20:23:45 +0000
parents e94f51590725
children 6557d28a44cf
files src/ini.cpp src/ini_type.h src/settings.cpp
diffstat 3 files changed, 16 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/ini.cpp
+++ b/src/ini.cpp
@@ -77,6 +77,13 @@
 	return new IniItem(this, name, len);
 }
 
+void IniGroup::Clear()
+{
+	delete this->item;
+	this->item = NULL;
+	this->last_item = &this->item;
+}
+
 IniFile::IniFile(const char **list_group_names) : group(NULL), comment(NULL), list_group_names(list_group_names)
 {
 	this->last_group = &this->group;
--- a/src/ini_type.h
+++ b/src/ini_type.h
@@ -64,6 +64,11 @@
 	 * @return the requested item or NULL if not found.
 	 */
 	IniItem *GetItem(const char *name, bool create);
+
+	/**
+	 * Clear all items in the group
+	 */
+	void Clear();
 };
 
 /** The complete ini file. */
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -639,7 +639,7 @@
 
 	if (proc == NULL && list == NULL) return;
 	if (group == NULL) return;
-	group->item = NULL;
+	group->Clear();
 
 	for (i = 0; i != len; i++) {
 		entry = (proc != NULL) ? proc(NULL, i) : list[i];
@@ -1720,11 +1720,9 @@
 static void AISaveConfig(IniFile *ini, const char *grpname)
 {
 	IniGroup *group = ini->GetGroup(grpname);
-	IniItem **item;
 
 	if (group == NULL) return;
-	group->item = NULL;
-	item = &group->item;
+	group->Clear();
 
 	for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
 		AIConfig *config = AIConfig::GetConfig(c, true);
@@ -1739,9 +1737,8 @@
 			name = "none";
 		}
 
-		*item = new IniItem(group, name);
-		(*item)->value = strdup(value);
-		item = &(*item)->next;
+		IniItem *item = new IniItem(group, name, strlen(name));
+		item->SetValue(value);
 	}
 }