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:
Jonathan G Rennison
2023-11-25 13:29:58 +00:00
175 changed files with 1086 additions and 1177 deletions

View File

@@ -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);
}
/**