Codechange: C++-ify the usage of IniFile in settings.cpp

Instead of creating the object on heap and use a pointer, create
the object on stack and use a guaranteed-not-null pointer.
The size of IniFile doesn't warrent the forcing to heap.

Additionally, use a subclass instead of a function to do some
initial bookkeeping on an IniFile meant to read a configuration.
This commit is contained in:
Patric Stout 2021-07-01 19:59:13 +02:00 committed by Patric Stout
parent a42251fc72
commit 66dc0ce196
3 changed files with 72 additions and 78 deletions

View File

@ -104,11 +104,31 @@ static const SettingTable _setting_tables[] = {
_network_settings,
};
typedef void SettingDescProc(IniFile *ini, const SettingTable &desc, const char *grpname, void *object, bool only_startup);
typedef void SettingDescProcList(IniFile *ini, const char *grpname, StringList &list);
typedef void SettingDescProc(IniFile &ini, const SettingTable &desc, const char *grpname, void *object, bool only_startup);
typedef void SettingDescProcList(IniFile &ini, const char *grpname, StringList &list);
static bool IsSignedVarMemType(VarType vt);
/**
* IniFile to store a configuration.
*/
class ConfigIniFile : public IniFile {
private:
inline static const char * const list_group_names[] = {
"bans",
"newgrf",
"servers",
"server_bind_addresses",
nullptr,
};
public:
ConfigIniFile(const std::string &filename) : IniFile(list_group_names)
{
this->LoadFromDisk(filename, NO_DIRECTORY);
}
};
/**
* Helper to convert the type of the iterated settings description to a pointer to it.
* @param desc The type of the iterator of the value in SettingTable.
@ -119,17 +139,6 @@ static constexpr const SettingDesc *GetSettingDesc(const SettingVariant &desc)
return std::visit([](auto&& arg) -> const SettingDesc * { return &arg; }, desc);
}
/**
* Groups in openttd.cfg that are actually lists.
*/
static const char * const _list_group_names[] = {
"bans",
"newgrf",
"servers",
"server_bind_addresses",
nullptr
};
/**
* Find the index value of a ONEofMANY type in a string separated by |
* @param str the current value of the setting for which a value needs found
@ -532,10 +541,10 @@ const std::string &StringSettingDesc::Read(const void *object) const
* @param object pointer to the object been loaded
* @param only_startup load only the startup settings set
*/
static void IniLoadSettings(IniFile *ini, const SettingTable &settings_table, const char *grpname, void *object, bool only_startup)
static void IniLoadSettings(IniFile &ini, const SettingTable &settings_table, const char *grpname, void *object, bool only_startup)
{
IniGroup *group;
IniGroup *group_def = ini->GetGroup(grpname);
IniGroup *group_def = ini.GetGroup(grpname);
for (auto &desc : settings_table) {
const SettingDesc *sd = GetSettingDesc(desc);
@ -546,7 +555,7 @@ static void IniLoadSettings(IniFile *ini, const SettingTable &settings_table, co
std::string s{ sd->name };
auto sc = s.find('.');
if (sc != std::string::npos) {
group = ini->GetGroup(s.substr(0, sc));
group = ini.GetGroup(s.substr(0, sc));
s = s.substr(sc + 1);
} else {
group = group_def;
@ -562,7 +571,7 @@ static void IniLoadSettings(IniFile *ini, const SettingTable &settings_table, co
/* For settings.xx.zz.yy load the settings from [zz] yy = ? in case the previous
* did not exist (e.g. loading old config files with a [yapf] section */
sc = s.find('.');
if (sc != std::string::npos) item = ini->GetGroup(s.substr(0, sc))->GetItem(s.substr(sc + 1), false);
if (sc != std::string::npos) item = ini.GetGroup(s.substr(0, sc))->GetItem(s.substr(sc + 1), false);
}
sd->ParseValue(item, object);
@ -608,7 +617,7 @@ void ListSettingDesc::ParseValue(const IniItem *item, void *object) const
* values are reloaded when saving). If settings indeed have changed, we get
* these and save them.
*/
static void IniSaveSettings(IniFile *ini, const SettingTable &settings_table, const char *grpname, void *object, bool)
static void IniSaveSettings(IniFile &ini, const SettingTable &settings_table, const char *grpname, void *object, bool)
{
IniGroup *group_def = nullptr, *group;
IniItem *item;
@ -625,10 +634,10 @@ static void IniSaveSettings(IniFile *ini, const SettingTable &settings_table, co
std::string s{ sd->name };
auto sc = s.find('.');
if (sc != std::string::npos) {
group = ini->GetGroup(s.substr(0, sc));
group = ini.GetGroup(s.substr(0, sc));
s = s.substr(sc + 1);
} else {
if (group_def == nullptr) group_def = ini->GetGroup(grpname);
if (group_def == nullptr) group_def = ini.GetGroup(grpname);
group = group_def;
}
@ -706,9 +715,9 @@ bool ListSettingDesc::IsSameValue(const IniItem *item, void *object) const
* @param grpname character string identifying the section-header of the ini file that will be parsed
* @param list new list with entries of the given section
*/
static void IniLoadSettingList(IniFile *ini, const char *grpname, StringList &list)
static void IniLoadSettingList(IniFile &ini, const char *grpname, StringList &list)
{
IniGroup *group = ini->GetGroup(grpname);
IniGroup *group = ini.GetGroup(grpname);
if (group == nullptr) return;
@ -728,9 +737,9 @@ static void IniLoadSettingList(IniFile *ini, const char *grpname, StringList &li
* @param list pointer to an string(pointer) array that will be used as the
* source to be saved into the relevant ini section
*/
static void IniSaveSettingList(IniFile *ini, const char *grpname, StringList &list)
static void IniSaveSettingList(IniFile &ini, const char *grpname, StringList &list)
{
IniGroup *group = ini->GetGroup(grpname);
IniGroup *group = ini.GetGroup(grpname);
if (group == nullptr) return;
group->Clear();
@ -746,7 +755,7 @@ static void IniSaveSettingList(IniFile *ini, const char *grpname, StringList &li
* @param grpname character string identifying the section-header of the ini file that will be parsed
* @param desc Destination WindowDesc
*/
void IniLoadWindowSettings(IniFile *ini, const char *grpname, void *desc)
void IniLoadWindowSettings(IniFile &ini, const char *grpname, void *desc)
{
IniLoadSettings(ini, _window_settings, grpname, desc, false);
}
@ -757,7 +766,7 @@ void IniLoadWindowSettings(IniFile *ini, const char *grpname, void *desc)
* @param grpname character string identifying the section-header of the ini file
* @param desc Source WindowDesc
*/
void IniSaveWindowSettings(IniFile *ini, const char *grpname, void *desc)
void IniSaveWindowSettings(IniFile &ini, const char *grpname, void *desc)
{
IniSaveSettings(ini, _window_settings, grpname, desc, false);
}
@ -1276,9 +1285,9 @@ static void HandleOldDiffCustom(bool savegame)
}
}
static void AILoadConfig(IniFile *ini, const char *grpname)
static void AILoadConfig(IniFile &ini, const char *grpname)
{
IniGroup *group = ini->GetGroup(grpname);
IniGroup *group = ini.GetGroup(grpname);
IniItem *item;
/* Clean any configured AI */
@ -1304,9 +1313,9 @@ static void AILoadConfig(IniFile *ini, const char *grpname)
}
}
static void GameLoadConfig(IniFile *ini, const char *grpname)
static void GameLoadConfig(IniFile &ini, const char *grpname)
{
IniGroup *group = ini->GetGroup(grpname);
IniGroup *group = ini.GetGroup(grpname);
IniItem *item;
/* Clean any configured GameScript */
@ -1370,9 +1379,9 @@ static bool DecodeHexText(const char *pos, uint8 *dest, size_t dest_size)
* @param grpname Group name containing the configuration of the GRF.
* @param is_static GRF is static.
*/
static GRFConfig *GRFLoadConfig(IniFile *ini, const char *grpname, bool is_static)
static GRFConfig *GRFLoadConfig(IniFile &ini, const char *grpname, bool is_static)
{
IniGroup *group = ini->GetGroup(grpname);
IniGroup *group = ini.GetGroup(grpname);
IniItem *item;
GRFConfig *first = nullptr;
GRFConfig **curr = &first;
@ -1464,9 +1473,9 @@ static GRFConfig *GRFLoadConfig(IniFile *ini, const char *grpname, bool is_stati
return first;
}
static void AISaveConfig(IniFile *ini, const char *grpname)
static void AISaveConfig(IniFile &ini, const char *grpname)
{
IniGroup *group = ini->GetGroup(grpname);
IniGroup *group = ini.GetGroup(grpname);
if (group == nullptr) return;
group->Clear();
@ -1487,9 +1496,9 @@ static void AISaveConfig(IniFile *ini, const char *grpname)
}
}
static void GameSaveConfig(IniFile *ini, const char *grpname)
static void GameSaveConfig(IniFile &ini, const char *grpname)
{
IniGroup *group = ini->GetGroup(grpname);
IniGroup *group = ini.GetGroup(grpname);
if (group == nullptr) return;
group->Clear();
@ -1512,9 +1521,9 @@ static void GameSaveConfig(IniFile *ini, const char *grpname)
* Save the version of OpenTTD to the ini file.
* @param ini the ini to write to
*/
static void SaveVersionInConfig(IniFile *ini)
static void SaveVersionInConfig(IniFile &ini)
{
IniGroup *group = ini->GetGroup("version");
IniGroup *group = ini.GetGroup("version");
char version[9];
seprintf(version, lastof(version), "%08X", _openttd_newgrf_version);
@ -1530,10 +1539,10 @@ static void SaveVersionInConfig(IniFile *ini)
}
/* Save a GRF configuration to the given group name */
static void GRFSaveConfig(IniFile *ini, const char *grpname, const GRFConfig *list)
static void GRFSaveConfig(IniFile &ini, const char *grpname, const GRFConfig *list)
{
ini->RemoveGroup(grpname);
IniGroup *group = ini->GetGroup(grpname);
ini.RemoveGroup(grpname);
IniGroup *group = ini.GetGroup(grpname);
const GRFConfig *c;
for (c = list; c != nullptr; c = c->next) {
@ -1550,7 +1559,7 @@ static void GRFSaveConfig(IniFile *ini, const char *grpname, const GRFConfig *li
}
/* Common handler for saving/loading variables to the configuration file */
static void HandleSettingDescs(IniFile *ini, SettingDescProc *proc, SettingDescProcList *proc_list, bool only_startup = false)
static void HandleSettingDescs(IniFile &ini, SettingDescProc *proc, SettingDescProcList *proc_list, bool only_startup = false)
{
proc(ini, _misc_settings, "misc", nullptr, only_startup);
#if defined(_WIN32) && !defined(DEDICATED)
@ -1572,20 +1581,13 @@ static void HandleSettingDescs(IniFile *ini, SettingDescProc *proc, SettingDescP
}
}
static IniFile *IniLoadConfig()
{
IniFile *ini = new IniFile(_list_group_names);
ini->LoadFromDisk(_config_file, NO_DIRECTORY);
return ini;
}
/**
* Load the values from the configuration files
* @param startup Load the minimal amount of the configuration to "bootstrap" the blitter and such.
*/
void LoadFromConfig(bool startup)
{
IniFile *ini = IniLoadConfig();
ConfigIniFile ini(_config_file);
if (!startup) ResetCurrencies(false); // Initialize the array of currencies, without preserving the custom one
/* Load basic settings only during bootstrap, load other settings not during bootstrap */
@ -1608,19 +1610,17 @@ void LoadFromConfig(bool startup)
ScheduleErrorMessage(_settings_error_list);
if (FindWindowById(WC_ERRMSG, 0) == nullptr) ShowFirstError();
}
delete ini;
}
/** Save the values to the configuration file */
void SaveToConfig()
{
IniFile *ini = IniLoadConfig();
ConfigIniFile ini(_config_file);
/* Remove some obsolete groups. These have all been loaded into other groups. */
ini->RemoveGroup("patches");
ini->RemoveGroup("yapf");
ini->RemoveGroup("gameopt");
ini.RemoveGroup("patches");
ini.RemoveGroup("yapf");
ini.RemoveGroup("gameopt");
HandleSettingDescs(ini, IniSaveSettings, IniSaveSettingList);
GRFSaveConfig(ini, "newgrf", _grfconfig_newgame);
@ -1628,8 +1628,7 @@ void SaveToConfig()
AISaveConfig(ini, "ai_players");
GameSaveConfig(ini, "game_scripts");
SaveVersionInConfig(ini);
ini->SaveToDisk(_config_file);
delete ini;
ini.SaveToDisk(_config_file);
}
/**
@ -1640,8 +1639,8 @@ StringList GetGRFPresetList()
{
StringList list;
std::unique_ptr<IniFile> ini(IniLoadConfig());
for (IniGroup *group = ini->group; group != nullptr; group = group->next) {
ConfigIniFile ini(_config_file);
for (IniGroup *group = ini.group; group != nullptr; group = group->next) {
if (group->name.compare(0, 7, "preset-") == 0) {
list.push_back(group->name.substr(7));
}
@ -1662,9 +1661,8 @@ GRFConfig *LoadGRFPresetFromConfig(const char *config_name)
char *section = (char*)alloca(len);
seprintf(section, section + len - 1, "preset-%s", config_name);
IniFile *ini = IniLoadConfig();
ConfigIniFile ini(_config_file);
GRFConfig *config = GRFLoadConfig(ini, section, false);
delete ini;
return config;
}
@ -1681,10 +1679,9 @@ void SaveGRFPresetToConfig(const char *config_name, GRFConfig *config)
char *section = (char*)alloca(len);
seprintf(section, section + len - 1, "preset-%s", config_name);
IniFile *ini = IniLoadConfig();
ConfigIniFile ini(_config_file);
GRFSaveConfig(ini, section, config);
ini->SaveToDisk(_config_file);
delete ini;
ini.SaveToDisk(_config_file);
}
/**
@ -1697,10 +1694,9 @@ void DeleteGRFPresetFromConfig(const char *config_name)
char *section = (char*)alloca(len);
seprintf(section, section + len - 1, "preset-%s", config_name);
IniFile *ini = IniLoadConfig();
ini->RemoveGroup(section);
ini->SaveToDisk(_config_file);
delete ini;
ConfigIniFile ini(_config_file);
ini.RemoveGroup(section);
ini.SaveToDisk(_config_file);
}
/**

View File

@ -24,8 +24,8 @@ void IConsoleListSettings(const char *prefilter);
void LoadFromConfig(bool minimal = false);
void SaveToConfig();
void IniLoadWindowSettings(IniFile *ini, const char *grpname, void *desc);
void IniSaveWindowSettings(IniFile *ini, const char *grpname, void *desc);
void IniLoadWindowSettings(IniFile &ini, const char *grpname, void *desc);
void IniSaveWindowSettings(IniFile &ini, const char *grpname, void *desc);
StringList GetGRFPresetList();
struct GRFConfig *LoadGRFPresetFromConfig(const char *config_name);

View File

@ -153,13 +153,12 @@ int16 WindowDesc::GetDefaultHeight() const
*/
void WindowDesc::LoadFromConfig()
{
IniFile *ini = new IniFile();
ini->LoadFromDisk(_windows_file, NO_DIRECTORY);
IniFile ini;
ini.LoadFromDisk(_windows_file, NO_DIRECTORY);
for (WindowDesc *wd : *_window_descs) {
if (wd->ini_key == nullptr) continue;
IniLoadWindowSettings(ini, wd->ini_key, wd);
}
delete ini;
}
/**
@ -179,14 +178,13 @@ void WindowDesc::SaveToConfig()
/* Sort the stuff to get a nice ini file on first write */
std::sort(_window_descs->begin(), _window_descs->end(), DescSorter);
IniFile *ini = new IniFile();
ini->LoadFromDisk(_windows_file, NO_DIRECTORY);
IniFile ini;
ini.LoadFromDisk(_windows_file, NO_DIRECTORY);
for (WindowDesc *wd : *_window_descs) {
if (wd->ini_key == nullptr) continue;
IniSaveWindowSettings(ini, wd->ini_key, wd);
}
ini->SaveToDisk(_windows_file);
delete ini;
ini.SaveToDisk(_windows_file);
}
/**