summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2008-08-25 06:35:28 +0000
committerrubidium <rubidium@openttd.org>2008-08-25 06:35:28 +0000
commit411c65e755eb6dd2e1412d2edb0f811ebd5ce73d (patch)
treea086b2427b7b866fcd2b443ad6263ee2dc19845c
parent6e4d8a273e655372cdd1c5a1834cbb947381885f (diff)
downloadopenttd-411c65e755eb6dd2e1412d2edb0f811ebd5ce73d.tar.xz
(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.
-rw-r--r--src/ini.cpp8
-rw-r--r--src/ini_type.h22
-rw-r--r--src/settings.cpp39
3 files changed, 34 insertions, 35 deletions
diff --git a/src/ini.cpp b/src/ini.cpp
index 86cceaa42..c72addd65 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 4c18862ea..060af5d66 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 a8446ef4c..effc9f8d9 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);
}
}