From d7bfd54a3d71467a94fb6be95e3db822225cc63c Mon Sep 17 00:00:00 2001 From: rubidium Date: Mon, 25 Aug 2008 06:35:28 +0000 Subject: [PATCH] (svn r14164) -Codechange: simplify and unify the addition of ini items with value when not loading an ini file. -Fix: wrong insertion management causing leaks. --- src/ini.cpp | 8 ++++++++ src/ini_type.h | 22 ++++++++++++++++++++++ src/settings.cpp | 39 ++++----------------------------------- 3 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/ini.cpp b/src/ini.cpp index 86cceaa427..c72addd658 100644 --- a/src/ini.cpp +++ b/src/ini.cpp @@ -19,6 +19,14 @@ IniItem::IniItem(IniGroup *parent, const char *name, size_t len) : next(NULL), v parent->last_item = &this->next; } +IniItem::IniItem(IniGroup *parent, const char *name, const char *value) : next(NULL), comment(NULL) +{ + this->name = strdup(name); + this->value = strdup(value); + *parent->last_item = this; + parent->last_item = &this->next; +} + IniItem::~IniItem() { free(this->name); diff --git a/src/ini_type.h b/src/ini_type.h index 4c18862ea1..060af5d66b 100644 --- a/src/ini_type.h +++ b/src/ini_type.h @@ -18,8 +18,30 @@ struct IniItem { char *value; ///< The value of this item char *comment; ///< The comment associated with this item + /** + * Construct a new in-memory item of an Ini file. + * @param parent the group we belong to + * @param name the name of the item + * @param len the length of the name of the item + */ IniItem(struct IniGroup *parent, const char *name, size_t len = 0); + + /** + * Construct a new in-memory item of an Ini file. + * @param parent the group we belong to + * @param name the name of the item + * @param value the value to immediatelly assign + */ + IniItem(IniGroup *parent, const char *name, const char *value); + + /** Free everything we loaded. */ ~IniItem(); + + /** + * Replace the current value with another value. + * @param value the value to replace with. + */ + void SetValue(const char *value); }; /** A group within an ini file. */ diff --git a/src/settings.cpp b/src/settings.cpp index a8446ef4c8..effc9f8d97 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -628,10 +628,8 @@ static void ini_load_setting_list(IniFile *ini, const char *grpname, char **list static void ini_save_setting_list(IniFile *ini, const char *grpname, char **list, uint len, SettingListCallbackProc proc) { IniGroup *group = ini->GetGroup(grpname); - IniItem *item = NULL; const char *entry; uint i; - bool first = true; if (proc == NULL && list == NULL) return; if (group == NULL) return; @@ -642,16 +640,7 @@ static void ini_save_setting_list(IniFile *ini, const char *grpname, char **list if (entry == NULL || *entry == '\0') continue; - if (first) { // add first item to the head of the group - item = new IniItem(group, entry); - item->value = strdup(""); - group->item = item; - first = false; - } else { // all other items are attached to the previous one - item->next = new IniItem(group, entry); - item = item->next; - item->value = strdup(""); - } + new IniItem(group, entry, ""); } } @@ -1691,11 +1680,6 @@ static GRFConfig *GRFLoadConfig(IniFile *ini, const char *grpname, bool is_stati static void NewsDisplaySaveConfig(IniFile *ini, const char *grpname) { IniGroup *group = ini->GetGroup(grpname); - IniItem **item; - - if (group == NULL) return; - group->item = NULL; - item = &group->item; for (int i = 0; i < NT_END; i++) { const char *value; @@ -1703,9 +1687,7 @@ static void NewsDisplaySaveConfig(IniFile *ini, const char *grpname) value = (v == ND_OFF ? "off" : (v == ND_SUMMARY ? "summarized" : "full")); - *item = new IniItem(group, _news_type_data[i].name); - (*item)->value = strdup(value); - item = &(*item)->next; + new IniItem(group, _news_type_data[i].name, value); } } @@ -1717,10 +1699,6 @@ static void SaveVersionInConfig(IniFile *ini) { IniGroup *group = ini->GetGroup("version"); - if (group == NULL) return; - group->item = NULL; - IniItem **item = &group->item; - char version[9]; snprintf(version, lengthof(version), "%08X", _openttd_newgrf_version); @@ -1730,9 +1708,7 @@ static void SaveVersionInConfig(IniFile *ini) }; for (uint i = 0; i < lengthof(versions); i++) { - *item = new IniItem(group, versions[i][0]); - (*item)->value = strdup(versions[i][1]); - item = &(*item)->next; + new IniItem(group, versions[i][0], versions[i][1]); } } @@ -1740,20 +1716,13 @@ static void SaveVersionInConfig(IniFile *ini) static void GRFSaveConfig(IniFile *ini, const char *grpname, const GRFConfig *list) { IniGroup *group = ini->GetGroup(grpname); - IniItem **item; const GRFConfig *c; - if (group == NULL) return; - group->item = NULL; - item = &group->item; - for (c = list; c != NULL; c = c->next) { char params[512]; GRFBuildParamList(params, c, lastof(params)); - *item = new IniItem(group, c->filename); - (*item)->value = strdup(params); - item = &(*item)->next; + new IniItem(group, c->filename, params); } }