Merge branch 'master' into jgrpp
# Conflicts: # regression/regression/result.txt # src/aircraft_cmd.cpp # src/airport_gui.cpp # src/articulated_vehicles.cpp # src/console_cmds.cpp # src/date_gui.cpp # src/engine.cpp # src/genworld_gui.cpp # src/gfx_layout_fallback.cpp # src/group_gui.cpp # src/hotkeys.cpp # src/network/core/tcp_connect.cpp # src/network/core/tcp_listen.h # src/newgrf.cpp # src/newgrf.h # src/newgrf_engine.cpp # src/newgrf_gui.cpp # src/newgrf_station.cpp # src/openttd.cpp # src/order_gui.cpp # src/os/macosx/osx_main.cpp # src/pathfinder/yapf/yapf_node_rail.hpp # src/rail_gui.cpp # src/saveload/afterload.cpp # src/saveload/cargopacket_sl.cpp # src/saveload/linkgraph_sl.cpp # src/saveload/station_sl.cpp # src/script/api/script_industrytype.cpp # src/settings.cpp # src/settings_gui.cpp # src/settings_table.cpp # src/settingsgen/settingsgen.cpp # src/station.cpp # src/station_cmd.cpp # src/strings.cpp # src/timer/timer_game_calendar.cpp # src/timer/timer_game_calendar.h # src/timer/timer_manager.h # src/timer/timer_window.cpp # src/timetable_cmd.cpp # src/toolbar_gui.cpp # src/town_cmd.cpp # src/town_gui.cpp # src/train_gui.cpp # src/vehicle_cmd.h # src/vehicle_gui.cpp # src/viewport.cpp # src/widgets/dropdown.cpp # src/window_func.h # src/window_gui.h
This commit is contained in:
@@ -157,10 +157,10 @@ private:
|
||||
struct SettingsIniFile : IniLoadFile {
|
||||
/**
|
||||
* Construct a new ini loader.
|
||||
* @param list_group_names A \c nullptr terminated list with group names that should be loaded as lists instead of variables. @see IGT_LIST
|
||||
* @param seq_group_names A \c nullptr terminated list with group names that should be loaded as lists of names. @see IGT_SEQUENCE
|
||||
* @param list_group_names A list with group names that should be loaded as lists instead of variables. @see IGT_LIST
|
||||
* @param seq_group_names A list with group names that should be loaded as lists of names. @see IGT_SEQUENCE
|
||||
*/
|
||||
SettingsIniFile(const char * const *list_group_names = nullptr, const char * const *seq_group_names = nullptr) :
|
||||
SettingsIniFile(const IniGroupNameList &list_group_names = {}, const IniGroupNameList &seq_group_names = {}) :
|
||||
IniLoadFile(list_group_names, seq_group_names)
|
||||
{
|
||||
}
|
||||
@@ -194,32 +194,18 @@ static const char *TEMPLATES_GROUP_NAME = "templates"; ///< Name of the group co
|
||||
static const char *VALIDATION_GROUP_NAME = "validation"; ///< Name of the group containing the validation statements.
|
||||
static const char *DEFAULTS_GROUP_NAME = "defaults"; ///< Name of the group containing default values for the template variables.
|
||||
|
||||
/**
|
||||
* Load the INI file.
|
||||
* @param filename Name of the file to load.
|
||||
* @return Loaded INI data.
|
||||
*/
|
||||
static IniLoadFile *LoadIniFile(const char *filename)
|
||||
{
|
||||
static const char * const seq_groups[] = {PREAMBLE_GROUP_NAME, POSTAMBLE_GROUP_NAME, nullptr};
|
||||
|
||||
IniLoadFile *ini = new SettingsIniFile(nullptr, seq_groups);
|
||||
ini->LoadFromDisk(filename, NO_DIRECTORY);
|
||||
return ini;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump a #IGT_SEQUENCE group into #_stored_output.
|
||||
* @param ifile Loaded INI data.
|
||||
* @param group_name Name of the group to copy.
|
||||
*/
|
||||
static void DumpGroup(IniLoadFile *ifile, const char * const group_name)
|
||||
static void DumpGroup(const IniLoadFile &ifile, const char * const group_name)
|
||||
{
|
||||
IniGroup *grp = ifile->GetGroup(group_name, false);
|
||||
const IniGroup *grp = ifile.GetGroup(group_name);
|
||||
if (grp != nullptr && grp->type == IGT_SEQUENCE) {
|
||||
for (IniItem *item = grp->item; item != nullptr; item = item->next) {
|
||||
if (!item->name.empty()) {
|
||||
_stored_output.Add(item->name.c_str());
|
||||
for (const IniItem &item : grp->items) {
|
||||
if (!item.name.empty()) {
|
||||
_stored_output.Add(item.name.c_str());
|
||||
_stored_output.Add("\n", 1);
|
||||
}
|
||||
}
|
||||
@@ -233,9 +219,9 @@ static void DumpGroup(IniLoadFile *ifile, const char * const group_name)
|
||||
* @param defaults Fallback group to search, \c nullptr skips the search.
|
||||
* @return Text of the item if found, else \c nullptr.
|
||||
*/
|
||||
static const char *FindItemValue(const char *name, IniGroup *grp, IniGroup *defaults)
|
||||
static const char *FindItemValue(const char *name, const IniGroup *grp, const IniGroup *defaults)
|
||||
{
|
||||
IniItem *item = grp->GetItem(name);
|
||||
const IniItem *item = grp->GetItem(name);
|
||||
if (item == nullptr && defaults != nullptr) item = defaults->GetItem(name);
|
||||
if (item == nullptr || !item->value.has_value()) return nullptr;
|
||||
return item->value->c_str();
|
||||
@@ -248,18 +234,18 @@ static const char *FindItemValue(const char *name, IniGroup *grp, IniGroup *defa
|
||||
* @param default_grp Default values for items not set in @grp.
|
||||
* @param output Output to use for result.
|
||||
*/
|
||||
static void DumpLine(IniItem *item, IniGroup *grp, IniGroup *default_grp, OutputStore &output)
|
||||
static void DumpLine(const IniItem *item, const IniGroup *grp, const IniGroup *default_grp, OutputStore &output)
|
||||
{
|
||||
static const int MAX_VAR_LENGTH = 64;
|
||||
|
||||
/* Prefix with #if/#ifdef/#ifndef */
|
||||
static const char * const pp_lines[] = {"if", "ifdef", "ifndef", nullptr};
|
||||
static const auto pp_lines = {"if", "ifdef", "ifndef"};
|
||||
int count = 0;
|
||||
for (const char * const *name = pp_lines; *name != nullptr; name++) {
|
||||
const char *condition = FindItemValue(*name, grp, default_grp);
|
||||
for (const auto &name : pp_lines) {
|
||||
const char *condition = FindItemValue(name, grp, default_grp);
|
||||
if (condition != nullptr) {
|
||||
output.Add("#", 1);
|
||||
output.Add(*name);
|
||||
output.Add(name);
|
||||
output.Add(" ", 1);
|
||||
output.Add(condition);
|
||||
output.Add("\n", 1);
|
||||
@@ -312,31 +298,30 @@ static void DumpLine(IniItem *item, IniGroup *grp, IniGroup *default_grp, Output
|
||||
* Output all non-special sections through the template / template variable expansion system.
|
||||
* @param ifile Loaded INI data.
|
||||
*/
|
||||
static void DumpSections(IniLoadFile *ifile)
|
||||
static void DumpSections(const IniLoadFile &ifile)
|
||||
{
|
||||
static const char * const special_group_names[] = {PREAMBLE_GROUP_NAME, POSTAMBLE_GROUP_NAME, DEFAULTS_GROUP_NAME, TEMPLATES_GROUP_NAME, VALIDATION_GROUP_NAME, nullptr};
|
||||
static const auto special_group_names = {PREAMBLE_GROUP_NAME, POSTAMBLE_GROUP_NAME, DEFAULTS_GROUP_NAME, TEMPLATES_GROUP_NAME, VALIDATION_GROUP_NAME};
|
||||
|
||||
IniGroup *default_grp = ifile->GetGroup(DEFAULTS_GROUP_NAME, false);
|
||||
IniGroup *templates_grp = ifile->GetGroup(TEMPLATES_GROUP_NAME, false);
|
||||
IniGroup *validation_grp = ifile->GetGroup(VALIDATION_GROUP_NAME, false);
|
||||
const IniGroup *default_grp = ifile.GetGroup(DEFAULTS_GROUP_NAME);
|
||||
const IniGroup *templates_grp = ifile.GetGroup(TEMPLATES_GROUP_NAME);
|
||||
const IniGroup *validation_grp = ifile.GetGroup(VALIDATION_GROUP_NAME);
|
||||
if (templates_grp == nullptr) return;
|
||||
|
||||
/* Output every group, using its name as template name. */
|
||||
for (IniGroup *grp = ifile->group; grp != nullptr; grp = grp->next) {
|
||||
const char * const *sgn;
|
||||
for (sgn = special_group_names; *sgn != nullptr; sgn++) if (grp->name == *sgn) break;
|
||||
if (*sgn != nullptr) continue;
|
||||
for (const IniGroup &grp : ifile.groups) {
|
||||
/* Exclude special group names. */
|
||||
if (std::find(std::begin(special_group_names), std::end(special_group_names), grp.name) != std::end(special_group_names)) continue;
|
||||
|
||||
IniItem *template_item = templates_grp->GetItem(grp->name); // Find template value.
|
||||
const IniItem *template_item = templates_grp->GetItem(grp.name); // Find template value.
|
||||
if (template_item == nullptr || !template_item->value.has_value()) {
|
||||
error("Cannot find template %s", grp->name.c_str());
|
||||
error("Cannot find template %s", grp.name.c_str());
|
||||
}
|
||||
DumpLine(template_item, grp, default_grp, _stored_output);
|
||||
DumpLine(template_item, &grp, default_grp, _stored_output);
|
||||
|
||||
if (validation_grp != nullptr) {
|
||||
IniItem *validation_item = validation_grp->GetItem(grp->name); // Find template value.
|
||||
const IniItem *validation_item = validation_grp->GetItem(grp.name); // Find template value.
|
||||
if (validation_item != nullptr && validation_item->value.has_value()) {
|
||||
DumpLine(validation_item, grp, default_grp, _post_amble_output);
|
||||
DumpLine(validation_item, &grp, default_grp, _post_amble_output);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -436,11 +421,14 @@ static const OptionData _opts[] = {
|
||||
*/
|
||||
static void ProcessIniFile(const char *fname)
|
||||
{
|
||||
IniLoadFile *ini_data = LoadIniFile(fname);
|
||||
DumpGroup(ini_data, PREAMBLE_GROUP_NAME);
|
||||
DumpSections(ini_data);
|
||||
DumpGroup(ini_data, POSTAMBLE_GROUP_NAME);
|
||||
delete ini_data;
|
||||
static const IniLoadFile::IniGroupNameList seq_groups = {PREAMBLE_GROUP_NAME, POSTAMBLE_GROUP_NAME};
|
||||
|
||||
SettingsIniFile ini{{}, seq_groups};
|
||||
ini.LoadFromDisk(fname, NO_DIRECTORY);
|
||||
|
||||
DumpGroup(ini, PREAMBLE_GROUP_NAME);
|
||||
DumpSections(ini);
|
||||
DumpGroup(ini, POSTAMBLE_GROUP_NAME);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user