summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2009-01-14 20:23:45 +0000
committerpeter1138 <peter1138@openttd.org>2009-01-14 20:23:45 +0000
commitc4c32692dfd65d6535e98e7d9660f4403059553c (patch)
treecdf9f0d4d99c9240cbc6d417f5fd088ede12fd29
parent61093eb2115bf22ca7e417af4e9048f60d2b47af (diff)
downloadopenttd-c4c32692dfd65d6535e98e7d9660f4403059553c.tar.xz
(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.
-rw-r--r--src/ini.cpp7
-rw-r--r--src/ini_type.h5
-rw-r--r--src/settings.cpp11
3 files changed, 16 insertions, 7 deletions
diff --git a/src/ini.cpp b/src/ini.cpp
index dc3f452a5..e8781faab 100644
--- a/src/ini.cpp
+++ b/src/ini.cpp
@@ -77,6 +77,13 @@ IniItem *IniGroup::GetItem(const char *name, bool create)
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;
diff --git a/src/ini_type.h b/src/ini_type.h
index 7bbc2ca20..eade53fd5 100644
--- a/src/ini_type.h
+++ b/src/ini_type.h
@@ -64,6 +64,11 @@ struct IniGroup {
* @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. */
diff --git a/src/settings.cpp b/src/settings.cpp
index e38e01598..9f0a8925c 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -639,7 +639,7 @@ static void ini_save_setting_list(IniFile *ini, const char *grpname, char **list
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 NewsDisplaySaveConfig(IniFile *ini, const char *grpname)
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 @@ static void AISaveConfig(IniFile *ini, const char *grpname)
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);
}
}