From 7d70f0cd14f55ecc0a273d206aa054165edaf6b9 Mon Sep 17 00:00:00 2001 From: peter1138 Date: Wed, 14 Jan 2009 20:23:45 +0000 Subject: (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. --- src/ini.cpp | 7 +++++++ src/ini_type.h | 5 +++++ src/settings.cpp | 11 ++++------- 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); } } -- cgit v1.2.3-70-g09d2