(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.
pull/155/head
rubidium 16 years ago
parent e3fad31f31
commit d7bfd54a3d

@ -19,6 +19,14 @@ IniItem::IniItem(IniGroup *parent, const char *name, size_t len) : next(NULL), v
parent->last_item = &this->next; 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() IniItem::~IniItem()
{ {
free(this->name); free(this->name);

@ -18,8 +18,30 @@ struct IniItem {
char *value; ///< The value of this item char *value; ///< The value of this item
char *comment; ///< The comment associated with 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); 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(); ~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. */ /** A group within an ini file. */

@ -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) static void ini_save_setting_list(IniFile *ini, const char *grpname, char **list, uint len, SettingListCallbackProc proc)
{ {
IniGroup *group = ini->GetGroup(grpname); IniGroup *group = ini->GetGroup(grpname);
IniItem *item = NULL;
const char *entry; const char *entry;
uint i; uint i;
bool first = true;
if (proc == NULL && list == NULL) return; if (proc == NULL && list == NULL) return;
if (group == 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 (entry == NULL || *entry == '\0') continue;
if (first) { // add first item to the head of the group new IniItem(group, entry, "");
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("");
}
} }
} }
@ -1691,11 +1680,6 @@ static GRFConfig *GRFLoadConfig(IniFile *ini, const char *grpname, bool is_stati
static void NewsDisplaySaveConfig(IniFile *ini, const char *grpname) static void NewsDisplaySaveConfig(IniFile *ini, const char *grpname)
{ {
IniGroup *group = ini->GetGroup(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++) { for (int i = 0; i < NT_END; i++) {
const char *value; 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")); value = (v == ND_OFF ? "off" : (v == ND_SUMMARY ? "summarized" : "full"));
*item = new IniItem(group, _news_type_data[i].name); new IniItem(group, _news_type_data[i].name, value);
(*item)->value = strdup(value);
item = &(*item)->next;
} }
} }
@ -1717,10 +1699,6 @@ static void SaveVersionInConfig(IniFile *ini)
{ {
IniGroup *group = ini->GetGroup("version"); IniGroup *group = ini->GetGroup("version");
if (group == NULL) return;
group->item = NULL;
IniItem **item = &group->item;
char version[9]; char version[9];
snprintf(version, lengthof(version), "%08X", _openttd_newgrf_version); 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++) { for (uint i = 0; i < lengthof(versions); i++) {
*item = new IniItem(group, versions[i][0]); new IniItem(group, versions[i][0], versions[i][1]);
(*item)->value = strdup(versions[i][1]);
item = &(*item)->next;
} }
} }
@ -1740,20 +1716,13 @@ static void SaveVersionInConfig(IniFile *ini)
static void GRFSaveConfig(IniFile *ini, const char *grpname, const GRFConfig *list) static void GRFSaveConfig(IniFile *ini, const char *grpname, const GRFConfig *list)
{ {
IniGroup *group = ini->GetGroup(grpname); IniGroup *group = ini->GetGroup(grpname);
IniItem **item;
const GRFConfig *c; const GRFConfig *c;
if (group == NULL) return;
group->item = NULL;
item = &group->item;
for (c = list; c != NULL; c = c->next) { for (c = list; c != NULL; c = c->next) {
char params[512]; char params[512];
GRFBuildParamList(params, c, lastof(params)); GRFBuildParamList(params, c, lastof(params));
*item = new IniItem(group, c->filename); new IniItem(group, c->filename, params);
(*item)->value = strdup(params);
item = &(*item)->next;
} }
} }

Loading…
Cancel
Save