From 6dc792694eef346fc03b0b0a4e2b12b34612a9d3 Mon Sep 17 00:00:00 2001 From: npwoods Date: Mon, 5 Aug 2019 12:10:07 -0400 Subject: [PATCH] Changed info_xml_creator to use std::ostream Also, we are now passing the stream to every function, rather than sloppily keeping it in a member variable --- src/frontend/mame/clifront.cpp | 2 +- src/frontend/mame/info.cpp | 482 +++++++++++++++--------------- src/frontend/mame/info.h | 53 ++-- src/frontend/mame/ui/miscmenu.cpp | 6 +- 4 files changed, 270 insertions(+), 273 deletions(-) diff --git a/src/frontend/mame/clifront.cpp b/src/frontend/mame/clifront.cpp index 3c0e5c21544..d8c1420e656 100644 --- a/src/frontend/mame/clifront.cpp +++ b/src/frontend/mame/clifront.cpp @@ -355,7 +355,7 @@ void cli_frontend::listxml(const std::vector &args) { // create the XML and print it to stdout info_xml_creator creator(m_options, m_options.bool_value(CLIOPTION_DTD)); - creator.output(stdout, args); + creator.output(std::cout, args); } diff --git a/src/frontend/mame/info.cpp b/src/frontend/mame/info.cpp index 34eec500c60..c24cb2882fc 100644 --- a/src/frontend/mame/info.cpp +++ b/src/frontend/mame/info.cpp @@ -206,8 +206,7 @@ const char info_xml_creator::s_dtd_string[] = //------------------------------------------------- info_xml_creator::info_xml_creator(emu_options const &options, bool dtd) - : m_output(nullptr) - , m_dtd(dtd) + : m_dtd(dtd) { } @@ -217,7 +216,7 @@ info_xml_creator::info_xml_creator(emu_options const &options, bool dtd) // known machines matching a pattern //------------------------------------------------- -void info_xml_creator::output(FILE *out, const std::vector &patterns) +void info_xml_creator::output(std::ostream &out, const std::vector &patterns) { if (patterns.empty()) { @@ -276,20 +275,23 @@ void info_xml_creator::output(FILE *out, const std::vector &pattern // known (and filtered) machines //------------------------------------------------- -void info_xml_creator::output(FILE *out, const std::function &filter, bool include_devices) +void info_xml_creator::output(std::ostream &out, const std::function &filter, bool include_devices) { - // sanity checks - assert(out); - - // set up output - m_output = out; - // prepare a driver enumerator and the queue driver_enumerator drivlist(m_lookup_options); bool drivlist_done = false; bool filter_done = false; bool header_outputted = false; + auto output_header_if_necessary = [this, &header_outputted](std::ostream &out) + { + if (!header_outputted) + { + output_header(out); + header_outputted = true; + } + }; + // only keep a device set when we're asked to track it std::unique_ptr devfilter; if (include_devices && filter) @@ -307,14 +309,10 @@ void info_xml_creator::output(FILE *out, const std::functionempty())) { - if (!header_outputted) - { - output_header(); - header_outputted = true; - } - output_devices(devfilter.get()); + output_header_if_necessary(out); + output_devices(out, devfilter.get()); } if (header_outputted) - output_footer(); + output_footer(out); } @@ -352,30 +346,31 @@ void info_xml_creator::output(FILE *out, const std::function\n"); + out << "" << std::endl; std::string dtd(s_dtd_string); strreplace(dtd, "__XML_ROOT__", XML_ROOT); strreplace(dtd, "__XML_TOP__", XML_TOP); - fprintf(m_output, "%s\n\n", dtd.c_str()); + out << dtd << std::endl << std::endl; } // top-level tag - fprintf(m_output, "<%s build=\"%s\" debug=\"" + out << util::string_format("<%s build=\"%s\" debug=\"" #ifdef MAME_DEBUG "yes" #else "no" #endif - "\" mameconfig=\"%d\">\n", + "\" mameconfig=\"%d\">", XML_ROOT, util::xml::normalize_string(emulator_info::get_build_version()), CONFIG_VERSION); + out << std::endl; } @@ -383,10 +378,10 @@ void info_xml_creator::output_header() // output_header - close the root element //------------------------------------------------- -void info_xml_creator::output_footer() +void info_xml_creator::output_footer(std::ostream &out) { // close the top level tag - fprintf(m_output, "\n", XML_ROOT); + out << util::string_format("", XML_ROOT) << std::endl; } @@ -395,7 +390,7 @@ void info_xml_creator::output_footer() // for one particular machine driver //------------------------------------------------- -void info_xml_creator::output_one(driver_enumerator &drivlist, device_type_set *devtypes) +void info_xml_creator::output_one(std::ostream &out, driver_enumerator &drivlist, device_type_set *devtypes) { const game_driver &driver = drivlist.driver(); machine_config config(driver, drivlist.options()); @@ -446,66 +441,66 @@ void info_xml_creator::output_one(driver_enumerator &drivlist, device_type_set * } // print the header and the machine name - fprintf(m_output, "\t<%s name=\"%s\"", XML_TOP, util::xml::normalize_string(driver.name)); + out << util::string_format("\t<%s name=\"%s\"", XML_TOP, util::xml::normalize_string(driver.name)); // strip away any path information from the source_file and output it const char *start = strrchr(driver.type.source(), '/'); if (!start) start = strrchr(driver.type.source(), '\\'); start = start ? (start + 1) : driver.type.source(); - fprintf(m_output, " sourcefile=\"%s\"", util::xml::normalize_string(start)); + out << util::string_format(" sourcefile=\"%s\"", util::xml::normalize_string(start)); // append bios and runnable flags if (driver.flags & machine_flags::IS_BIOS_ROOT) - fprintf(m_output, " isbios=\"yes\""); + out << " isbios=\"yes\""; if (driver.flags & machine_flags::MECHANICAL) - fprintf(m_output, " ismechanical=\"yes\""); + out << " ismechanical=\"yes\""; // display clone information int clone_of = drivlist.find(driver.parent); if (clone_of != -1 && !(drivlist.driver(clone_of).flags & machine_flags::IS_BIOS_ROOT)) - fprintf(m_output, " cloneof=\"%s\"", util::xml::normalize_string(drivlist.driver(clone_of).name)); + out << util::string_format(" cloneof=\"%s\"", util::xml::normalize_string(drivlist.driver(clone_of).name)); if (clone_of != -1) - fprintf(m_output, " romof=\"%s\"", util::xml::normalize_string(drivlist.driver(clone_of).name)); + out << util::string_format(" romof=\"%s\"", util::xml::normalize_string(drivlist.driver(clone_of).name)); // display sample information and close the game tag - output_sampleof(config.root_device()); - fprintf(m_output, ">\n"); + output_sampleof(out, config.root_device()); + out << '>' << std::endl; // output game description if (driver.type.fullname() != nullptr) - fprintf(m_output, "\t\t%s\n", util::xml::normalize_string(driver.type.fullname())); + out << util::string_format("\t\t%s", util::xml::normalize_string(driver.type.fullname())) << std::endl; // print the year only if is a number or another allowed character (? or +) if (driver.year != nullptr && strspn(driver.year, "0123456789?+") == strlen(driver.year)) - fprintf(m_output, "\t\t%s\n", util::xml::normalize_string(driver.year)); + out << util::string_format("\t\t%s", util::xml::normalize_string(driver.year)) << std::endl; // print the manufacturer information if (driver.manufacturer != nullptr) - fprintf(m_output, "\t\t%s\n", util::xml::normalize_string(driver.manufacturer)); + out << util::string_format("\t\t%s", util::xml::normalize_string(driver.manufacturer)) << std::endl; // now print various additional information - output_bios(config.root_device()); - output_rom(&drivlist, &driver, config.root_device()); - output_device_refs(config.root_device()); - output_sample(config.root_device()); - output_chips(config.root_device(), ""); - output_display(config.root_device(), &driver.flags, ""); - output_sound(config.root_device()); - output_input(portlist); - output_switches(portlist, "", IPT_DIPSWITCH, "dipswitch", "diplocation", "dipvalue"); - output_switches(portlist, "", IPT_CONFIG, "configuration", "conflocation", "confsetting"); - output_ports(portlist); - output_adjusters(portlist); - output_driver(driver, overall_unemulated, overall_imperfect); - output_features(driver.type, overall_unemulated, overall_imperfect); - output_images(config.root_device(), ""); - output_slots(config, config.root_device(), "", devtypes); - output_software_list(config.root_device()); - output_ramoptions(config.root_device()); + output_bios(out, config.root_device()); + output_rom(out, &drivlist, &driver, config.root_device()); + output_device_refs(out, config.root_device()); + output_sample(out, config.root_device()); + output_chips(out, config.root_device(), ""); + output_display(out, config.root_device(), &driver.flags, ""); + output_sound(out, config.root_device()); + output_input(out, portlist); + output_switches(out, portlist, "", IPT_DIPSWITCH, "dipswitch", "diplocation", "dipvalue"); + output_switches(out, portlist, "", IPT_CONFIG, "configuration", "conflocation", "confsetting"); + output_ports(out, portlist); + output_adjusters(out, portlist); + output_driver(out, driver, overall_unemulated, overall_imperfect); + output_features(out, driver.type, overall_unemulated, overall_imperfect); + output_images(out, config.root_device(), ""); + output_slots(out, config, config.root_device(), "", devtypes); + output_software_list(out, config.root_device()); + output_ramoptions(out, config.root_device()); // close the topmost tag - fprintf(m_output, "\t\n", XML_TOP); + out << util::string_format("\t", XML_TOP) << std::endl; } @@ -514,7 +509,7 @@ void info_xml_creator::output_one(driver_enumerator &drivlist, device_type_set * // a single device //------------------------------------------------- -void info_xml_creator::output_one_device(machine_config &config, device_t &device, const char *devtag) +void info_xml_creator::output_one_device(std::ostream &out, machine_config &config, device_t &device, const char *devtag) { bool has_speaker = false, has_input = false; // check if the device adds speakers to the system @@ -544,33 +539,33 @@ void info_xml_creator::output_one_device(machine_config &config, device_t &devic } // start to output info - fprintf(m_output, "\t<%s name=\"%s\"", XML_TOP, util::xml::normalize_string(device.shortname())); + out << util::string_format("\t<%s name=\"%s\"", XML_TOP, util::xml::normalize_string(device.shortname())); std::string src(device.source()); strreplace(src,"../", ""); - fprintf(m_output, " sourcefile=\"%s\" isdevice=\"yes\" runnable=\"no\"", util::xml::normalize_string(src.c_str())); - output_sampleof(device); - fprintf(m_output, ">\n\t\t%s\n", util::xml::normalize_string(device.name())); + out << util::string_format(" sourcefile=\"%s\" isdevice=\"yes\" runnable=\"no\"", util::xml::normalize_string(src.c_str())); + output_sampleof(out, device); + out << '>' << std::endl << util::string_format("\t\t%s", util::xml::normalize_string(device.name())) << std::endl; - output_bios(device); - output_rom(nullptr, nullptr, device); - output_device_refs(device); + output_bios(out, device); + output_rom(out, nullptr, nullptr, device); + output_device_refs(out, device); if (device.type().type() != typeid(samples_device)) // ignore samples_device itself - output_sample(device); + output_sample(out, device); - output_chips(device, devtag); - output_display(device, nullptr, devtag); + output_chips(out, device, devtag); + output_display(out, device, nullptr, devtag); if (has_speaker) - output_sound(device); + output_sound(out, device); if (has_input) - output_input(portlist); - output_switches(portlist, devtag, IPT_DIPSWITCH, "dipswitch", "diplocation", "dipvalue"); - output_switches(portlist, devtag, IPT_CONFIG, "configuration", "conflocation", "confsetting"); - output_adjusters(portlist); - output_features(device.type(), overall_unemulated, overall_imperfect); - output_images(device, devtag); - output_slots(config, device, devtag, nullptr); - fprintf(m_output, "\t\n", XML_TOP); + output_input(out, portlist); + output_switches(out, portlist, devtag, IPT_DIPSWITCH, "dipswitch", "diplocation", "dipvalue"); + output_switches(out, portlist, devtag, IPT_CONFIG, "configuration", "conflocation", "confsetting"); + output_adjusters(out, portlist); + output_features(out, device.type(), overall_unemulated, overall_imperfect); + output_images(out, device, devtag); + output_slots(out, config, device, devtag, nullptr); + out << util::string_format("\t", XML_TOP) << std::endl; } @@ -579,12 +574,12 @@ void info_xml_creator::output_one_device(machine_config &config, device_t &devic // registered device types //------------------------------------------------- -void info_xml_creator::output_devices(device_type_set const *filter) +void info_xml_creator::output_devices(std::ostream &out, device_type_set const *filter) { // get config for empty machine machine_config config(GAME_NAME(___empty), m_lookup_options); - auto const action = [this, &config] (device_type type) + auto const action = [this, &config, &out] (device_type type) { // add it at the root of the machine config device_t *dev; @@ -599,7 +594,7 @@ void info_xml_creator::output_devices(device_type_set const *filter) device.config_complete(); // print details and remove it - output_one_device(config, *dev, dev->tag()); + output_one_device(out, config, *dev, dev->tag()); machine_config::token const tok(config.begin_configuration(config.root_device())); config.device_remove("_tmp"); }; @@ -621,11 +616,11 @@ void info_xml_creator::output_devices(device_type_set const *filter) // subdevice, print a reference //------------------------------------------------- -void info_xml_creator::output_device_refs(device_t &root) +void info_xml_creator::output_device_refs(std::ostream &out, device_t &root) { for (device_t &device : device_iterator(root)) if (&device != &root) - fprintf(m_output, "\t\t\n", util::xml::normalize_string(device.shortname())); + out << util::string_format("\t\t", util::xml::normalize_string(device.shortname())) << std::endl; } @@ -634,7 +629,7 @@ void info_xml_creator::output_device_refs(device_t &root) // attribute, if appropriate //------------------------------------------------- -void info_xml_creator::output_sampleof(device_t &device) +void info_xml_creator::output_sampleof(std::ostream &out, device_t &device) { // iterate over sample devices for (samples_device &samples : samples_device_iterator(device)) @@ -642,7 +637,7 @@ void info_xml_creator::output_sampleof(device_t &device) samples_iterator sampiter(samples); if (sampiter.altbasename() != nullptr) { - fprintf(m_output, " sampleof=\"%s\"", util::xml::normalize_string(sampiter.altbasename())); + out << util::string_format(" sampleof=\"%s\"", util::xml::normalize_string(sampiter.altbasename())); // must stop here, as there can only be one attribute of the same name return; @@ -655,7 +650,7 @@ void info_xml_creator::output_sampleof(device_t &device) // output_bios - print BIOS sets for a device //------------------------------------------------- -void info_xml_creator::output_bios(device_t const &device) +void info_xml_creator::output_bios(std::ostream &out, device_t const &device) { // first determine the default BIOS name char const *defaultname(nullptr); @@ -668,13 +663,13 @@ void info_xml_creator::output_bios(device_t const &device) // iterate over ROM entries and look for BIOSes for (romload::system_bios const &bios : romload::entries(device.rom_region()).get_system_bioses()) { - // output extracted name and descriptions - fprintf(m_output, "\t\t\n"); + out << " default=\"yes\""; + out << "/>" << std::endl; } } @@ -684,7 +679,7 @@ void info_xml_creator::output_bios(device_t const &device) // the XML output //------------------------------------------------- -void info_xml_creator::output_rom(driver_enumerator *drivlist, const game_driver *driver, device_t &device) +void info_xml_creator::output_rom(std::ostream &out, driver_enumerator *drivlist, const game_driver *driver, device_t &device) { enum class type { BIOS, NORMAL, DISK }; std::map biosnames; @@ -767,44 +762,47 @@ void info_xml_creator::output_rom(driver_enumerator *drivlist, const game_driver char const *const merge_name((do_merge_name && !hashes.flag(util::hash_collection::FLAG_NO_DUMP)) ? get_merge_name(*drivlist, *driver, hashes) : nullptr); // opening tag - fprintf(m_output, is_disk ? "\t\tname); if (name && name[0]) - fprintf(m_output, " name=\"%s\"", util::xml::normalize_string(name)); + out << util::string_format(" name=\"%s\"", util::xml::normalize_string(name)); if (merge_name) - fprintf(m_output, " merge=\"%s\"", util::xml::normalize_string(merge_name)); + out << util::string_format(" merge=\"%s\"", util::xml::normalize_string(merge_name)); if (bios_name) - fprintf(m_output, " bios=\"%s\"", util::xml::normalize_string(bios_name)); + out << util::string_format(" bios=\"%s\"", util::xml::normalize_string(bios_name)); if (!is_disk) - fprintf(m_output, " size=\"%u\"", rom_file_size(rom)); + out << util::string_format(" size=\"%u\"", rom_file_size(rom)); // dump checksum information only if there is a known dump if (!hashes.flag(util::hash_collection::FLAG_NO_DUMP)) - fprintf(m_output, " %s", hashes.attribute_string().c_str()); // iterate over hash function types and print m_output their values + out << ' ' << hashes.attribute_string(); // iterate over hash function types and print m_output their values else - fprintf(m_output, " status=\"nodump\""); + out << " status=\"nodump\""; // append a region name - fprintf(m_output, " region=\"%s\"", region->name); + out << util::string_format(" region=\"%s\"", region->name); if (!is_disk) { // for non-disk entries, print offset - fprintf(m_output, " offset=\"%x\"", ROM_GETOFFSET(rom)); + out << util::string_format(" offset=\"%x\"", ROM_GETOFFSET(rom)); } else { // for disk entries, add the disk index - fprintf(m_output, " index=\"%x\" writable=\"%s\"", DISK_GETINDEX(rom), DISK_ISREADONLY(rom) ? "no" : "yes"); + out << util::string_format(" index=\"%x\" writable=\"%s\"", DISK_GETINDEX(rom), DISK_ISREADONLY(rom) ? "no" : "yes"); } // add optional flag if (ROM_ISOPTIONAL(rom)) - fprintf(m_output, " optional=\"yes\""); + out << " optional=\"yes\""; - fprintf(m_output, "/>\n"); + out << "/>" << std::endl; } bios_scanned = true; } @@ -816,7 +814,7 @@ void info_xml_creator::output_rom(driver_enumerator *drivlist, const game_driver // samples referenced by a game_driver //------------------------------------------------- -void info_xml_creator::output_sample(device_t &device) +void info_xml_creator::output_sample(std::ostream &out, device_t &device) { // iterate over sample devices for (samples_device &samples : samples_device_iterator(device)) @@ -830,7 +828,7 @@ void info_xml_creator::output_sample(device_t &device) continue; // output the sample name - fprintf(m_output, "\t\t\n", util::xml::normalize_string(samplename)); + out << util::string_format("\t\t\n", util::xml::normalize_string(samplename)); } } } @@ -841,7 +839,7 @@ void info_xml_creator::output_sample(device_t &device) sound chips used by a game -------------------------------------------------*/ -void info_xml_creator::output_chips(device_t &device, const char *root_tag) +void info_xml_creator::output_chips(std::ostream &out, device_t &device, const char *root_tag) { // iterate over executable devices for (device_execute_interface &exec : execute_interface_iterator(device)) @@ -851,12 +849,12 @@ void info_xml_creator::output_chips(device_t &device, const char *root_tag) std::string newtag(exec.device().tag()), oldtag(":"); newtag = newtag.substr(newtag.find(oldtag.append(root_tag)) + oldtag.length()); - fprintf(m_output, "\t\t\n"); + out << "\t\t" << std::endl; } } @@ -868,13 +866,13 @@ void info_xml_creator::output_chips(device_t &device, const char *root_tag) std::string newtag(sound.device().tag()), oldtag(":"); newtag = newtag.substr(newtag.find(oldtag.append(root_tag)) + oldtag.length()); - fprintf(m_output, "\t\t\n"); + out << util::string_format(" clock=\"%d\"", sound.device().clock()); + out << "/>" << std::endl; } } } @@ -885,7 +883,7 @@ void info_xml_creator::output_chips(device_t &device, const char *root_tag) // displays //------------------------------------------------- -void info_xml_creator::output_display(device_t &device, machine_flags::type const *flags, const char *root_tag) +void info_xml_creator::output_display(std::ostream &out, device_t &device, machine_flags::type const *flags, const char *root_tag) { // iterate over screens for (const screen_device &screendev : screen_device_iterator(device)) @@ -895,43 +893,43 @@ void info_xml_creator::output_display(device_t &device, machine_flags::type cons std::string newtag(screendev.tag()), oldtag(":"); newtag = newtag.substr(newtag.find(oldtag.append(root_tag)) + oldtag.length()); - fprintf(m_output, "\t\t\n"); + out << " />" << std::endl; } } } @@ -971,7 +969,7 @@ void info_xml_creator::output_display(device_t &device, machine_flags::type cons // speakers //------------------------------------------------ -void info_xml_creator::output_sound(device_t &device) +void info_xml_creator::output_sound(std::ostream &out, device_t &device) { speaker_device_iterator spkiter(device); int speakers = spkiter.count(); @@ -981,7 +979,7 @@ void info_xml_creator::output_sound(device_t &device) if (snditer.first() == nullptr) speakers = 0; - fprintf(m_output, "\t\t\n", speakers); + out << util::string_format("\t\t\n", speakers); } @@ -990,10 +988,10 @@ void info_xml_creator::output_sound(device_t &device) // required to use I/O port field/setting //------------------------------------------------- -void info_xml_creator::output_ioport_condition(const ioport_condition &condition, unsigned indent) +void info_xml_creator::output_ioport_condition(std::ostream &out, const ioport_condition &condition, unsigned indent) { for (unsigned i = 0; indent > i; ++i) - fprintf(m_output, "\t"); + out << '\t'; char const *rel(nullptr); switch (condition.condition()) @@ -1007,7 +1005,7 @@ void info_xml_creator::output_ioport_condition(const ioport_condition &condition case ioport_condition::NOTLESSTHAN: rel = "ge"; break; } - fprintf(m_output,"\n", util::xml::normalize_string(condition.tag()), condition.mask(), rel, condition.value()); + out << util::string_format("\n", util::xml::normalize_string(condition.tag()), condition.mask(), rel, condition.value()); } //------------------------------------------------- @@ -1015,7 +1013,7 @@ void info_xml_creator::output_ioport_condition(const ioport_condition &condition // input //------------------------------------------------- -void info_xml_creator::output_input(const ioport_list &portlist) +void info_xml_creator::output_input(std::ostream &out, const ioport_list &portlist) { // enumerated list of control types // NOTE: the order is chosen so that 'spare' button inputs are assigned to the @@ -1409,15 +1407,15 @@ void info_xml_creator::output_input(const ioport_list &portlist) // Output the input info // First basic info - fprintf(m_output, "\t\t\n"); + out << util::string_format(" tilt=\"yes\""); + out << '>' << std::endl; // Then controller specific ones for (auto & elem : control_info) @@ -1426,25 +1424,25 @@ void info_xml_creator::output_input(const ioport_list &portlist) //printf("type %s - player %d - buttons %d\n", elem.type, elem.player, elem.nbuttons); if (elem.analog) { - fprintf(m_output, "\t\t\t 1) - fprintf(m_output, " player=\"%d\"", elem.player); + out << util::string_format(" player=\"%d\"", elem.player); if (elem.nbuttons > 0) { - fprintf(m_output, " buttons=\"%d\"", strcmp(elem.type, "stick") ? elem.nbuttons : elem.maxbuttons); + out << util::string_format(" buttons=\"%d\"", strcmp(elem.type, "stick") ? elem.nbuttons : elem.maxbuttons); if (elem.reqbuttons < elem.nbuttons) - fprintf(m_output, " reqbuttons=\"%d\"", elem.reqbuttons); + out << util::string_format(" reqbuttons=\"%d\"", elem.reqbuttons); } if (elem.min != 0 || elem.max != 0) - fprintf(m_output, " minimum=\"%d\" maximum=\"%d\"", elem.min, elem.max); + out << util::string_format(" minimum=\"%d\" maximum=\"%d\"", elem.min, elem.max); if (elem.sensitivity != 0) - fprintf(m_output, " sensitivity=\"%d\"", elem.sensitivity); + out << util::string_format(" sensitivity=\"%d\"", elem.sensitivity); if (elem.keydelta != 0) - fprintf(m_output, " keydelta=\"%d\"", elem.keydelta); + out << util::string_format(" keydelta=\"%d\"", elem.keydelta); if (elem.reverse) - fprintf(m_output, " reverse=\"yes\""); + out << " reverse=\"yes\""; - fprintf(m_output, "/>\n"); + out << "/>" << std::endl; } else { @@ -1452,14 +1450,14 @@ void info_xml_creator::output_input(const ioport_list &portlist) if (elem.helper[0] == 0 && elem.helper[1] != 0) { elem.helper[0] = elem.helper[1]; elem.helper[1] = 0; } if (elem.helper[1] == 0 && elem.helper[2] != 0) { elem.helper[1] = elem.helper[2]; elem.helper[2] = 0; } const char *joys = (elem.helper[2] != 0) ? "triple" : (elem.helper[1] != 0) ? "double" : ""; - fprintf(m_output, "\t\t\t 1) - fprintf(m_output, " player=\"%d\"", elem.player); + out << util::string_format(" player=\"%d\"", elem.player); if (elem.nbuttons > 0) { - fprintf(m_output, " buttons=\"%d\"", strcmp(elem.type, "joy") ? elem.nbuttons : elem.maxbuttons); + out << util::string_format(" buttons=\"%d\"", strcmp(elem.type, "joy") ? elem.nbuttons : elem.maxbuttons); if (elem.reqbuttons < elem.nbuttons) - fprintf(m_output, " reqbuttons=\"%d\"", elem.reqbuttons); + out << util::string_format(" reqbuttons=\"%d\"", elem.reqbuttons); } for (int lp = 0; lp < 3 && elem.helper[lp] != 0; lp++) { @@ -1494,13 +1492,13 @@ void info_xml_creator::output_input(const ioport_list &portlist) ways = "strange2"; break; } - fprintf(m_output, " ways%s=\"%s\"", plural, ways); + out << util::string_format(" ways%s=\"%s\"", plural, ways); } - fprintf(m_output, "/>\n"); + out << "/>" << std::endl; } } - fprintf(m_output, "\t\t\n"); + out << "\t\t" << std::endl; } @@ -1509,7 +1507,7 @@ void info_xml_creator::output_input(const ioport_list &portlist) // DIP switch settings //------------------------------------------------- -void info_xml_creator::output_switches(const ioport_list &portlist, const char *root_tag, int type, const char *outertag, const char *loctag, const char *innertag) +void info_xml_creator::output_switches(std::ostream &out, const ioport_list &portlist, const char *root_tag, int type, const char *outertag, const char *loctag, const char *innertag) { // iterate looking for DIP switches for (auto &port : portlist) @@ -1522,39 +1520,39 @@ void info_xml_creator::output_switches(const ioport_list &portlist, const char * // output the switch name information std::string const normalized_field_name(util::xml::normalize_string(field.name())); std::string const normalized_newtag(util::xml::normalize_string(newtag.c_str())); - fprintf(m_output, "\t\t<%s name=\"%s\" tag=\"%s\" mask=\"%u\">\n", outertag, normalized_field_name.c_str(), normalized_newtag.c_str(), field.mask()); + out << util::string_format("\t\t<%s name=\"%s\" tag=\"%s\" mask=\"%u\">\n", outertag, normalized_field_name.c_str(), normalized_newtag.c_str(), field.mask()); if (!field.condition().none()) - output_ioport_condition(field.condition(), 3); + output_ioport_condition(out, field.condition(), 3); // loop over locations for (ioport_diplocation const &diploc : field.diplocations()) { - fprintf(m_output, "\t\t\t<%s name=\"%s\" number=\"%u\"", loctag, util::xml::normalize_string(diploc.name()), diploc.number()); + out << util::string_format("\t\t\t<%s name=\"%s\" number=\"%u\"", loctag, util::xml::normalize_string(diploc.name()), diploc.number()); if (diploc.inverted()) - fprintf(m_output, " inverted=\"yes\""); - fprintf(m_output, "/>\n"); + out << " inverted=\"yes\""; + out << "/>" << std::endl; } // loop over settings for (ioport_setting const &setting : field.settings()) { - fprintf(m_output, "\t\t\t<%s name=\"%s\" value=\"%u\"", innertag, util::xml::normalize_string(setting.name()), setting.value()); + out << util::string_format("\t\t\t<%s name=\"%s\" value=\"%u\"", innertag, util::xml::normalize_string(setting.name()), setting.value()); if (setting.value() == field.defvalue()) - fprintf(m_output, " default=\"yes\""); + out << " default=\"yes\""; if (setting.condition().none()) { - fprintf(m_output, "/>\n"); + out << "/>" << std::endl; } else { - fprintf(m_output, ">\n"); - output_ioport_condition(setting.condition(), 4); - fprintf(m_output, "\t\t\t\n", innertag); + out << ">" << std::endl; + output_ioport_condition(out, setting.condition(), 4); + out << util::string_format("\t\t\t\n", innertag); } } // terminate the switch entry - fprintf(m_output, "\t\t\n", outertag); + out << util::string_format("\t\t\n", outertag); } } @@ -1562,18 +1560,18 @@ void info_xml_creator::output_switches(const ioport_list &portlist, const char * // output_ports - print the structure of input // ports in the driver //------------------------------------------------- -void info_xml_creator::output_ports(const ioport_list &portlist) +void info_xml_creator::output_ports(std::ostream &out, const ioport_list &portlist) { // cycle through ports for (auto &port : portlist) { - fprintf(m_output,"\t\t\n", util::xml::normalize_string(port.second->tag())); + out << util::string_format("\t\t\n", util::xml::normalize_string(port.second->tag())); for (ioport_field const &field : port.second->fields()) { if (field.is_analog()) - fprintf(m_output,"\t\t\t\n", field.mask()); + out << util::string_format("\t\t\t\n", field.mask()); } - fprintf(m_output,"\t\t\n"); + out << util::string_format("\t\t\n"); } } @@ -1583,14 +1581,14 @@ void info_xml_creator::output_ports(const ioport_list &portlist) // Adjusters for a game //------------------------------------------------- -void info_xml_creator::output_adjusters(const ioport_list &portlist) +void info_xml_creator::output_adjusters(std::ostream &out, const ioport_list &portlist) { // iterate looking for Adjusters for (auto &port : portlist) for (ioport_field const &field : port.second->fields()) if (field.type() == IPT_ADJUSTER) { - fprintf(m_output, "\t\t\n", util::xml::normalize_string(field.name()), field.defvalue()); + out << util::string_format("\t\t\n", util::xml::normalize_string(field.name()), field.defvalue()); } } @@ -1599,9 +1597,9 @@ void info_xml_creator::output_adjusters(const ioport_list &portlist) // output_driver - print driver status //------------------------------------------------- -void info_xml_creator::output_driver(game_driver const &driver, device_t::feature_type unemulated, device_t::feature_type imperfect) +void info_xml_creator::output_driver(std::ostream &out, game_driver const &driver, device_t::feature_type unemulated, device_t::feature_type imperfect) { - fprintf(m_output, "\t\t\n"); + out << "/>" << std::endl; } @@ -1646,7 +1644,7 @@ void info_xml_creator::output_driver(game_driver const &driver, device_t::featur // //------------------------------------------------- -void info_xml_creator::output_features(device_type type, device_t::feature_type unemulated, device_t::feature_type imperfect) +void info_xml_creator::output_features(std::ostream &out, device_type type, device_t::feature_type unemulated, device_t::feature_type imperfect) { static constexpr std::pair features[] = { { device_t::feature::PROTECTION, "protection" }, @@ -1676,21 +1674,21 @@ void info_xml_creator::output_features(device_type type, device_t::feature_type { if (flags & feature.first) { - fprintf(m_output, "\t\t\n"); + out << "/>" << std::endl; } } } @@ -1701,7 +1699,7 @@ void info_xml_creator::output_features(device_type type, device_t::feature_type // image devices //------------------------------------------------- -void info_xml_creator::output_images(device_t &device, const char *root_tag) +void info_xml_creator::output_images(std::ostream &out, device_t &device, const char *root_tag) { for (const device_image_interface &imagedev : image_interface_iterator(device)) { @@ -1712,46 +1710,46 @@ void info_xml_creator::output_images(device_t &device, const char *root_tag) newtag = newtag.substr(newtag.find(oldtag.append(root_tag)) + oldtag.length()); // print m_output device type - fprintf(m_output, "\t\t\n"); + out << '>' << std::endl; if (loadable) { const char *name = imagedev.instance_name().c_str(); const char *shortname = imagedev.brief_instance_name().c_str(); - fprintf(m_output, "\t\t\t\n"); + out << "\t\t\t" << std::endl; std::string extensions(imagedev.file_extensions()); char *ext = strtok((char *)extensions.c_str(), ","); while (ext != nullptr) { - fprintf(m_output, "\t\t\t\n", util::xml::normalize_string(ext)); + out << util::string_format("\t\t\t\n", util::xml::normalize_string(ext)); ext = strtok(nullptr, ","); } } - fprintf(m_output, "\t\t\n"); + out << "\t\t" << std::endl; } } } @@ -1761,7 +1759,7 @@ void info_xml_creator::output_images(device_t &device, const char *root_tag) // output_slots - prints all info about slots //------------------------------------------------- -void info_xml_creator::output_slots(machine_config &config, device_t &device, const char *root_tag, device_type_set *devtypes) +void info_xml_creator::output_slots(std::ostream &out, machine_config &config, device_t &device, const char *root_tag, device_type_set *devtypes) { for (device_slot_interface &slot : slot_interface_iterator(device)) { @@ -1776,7 +1774,7 @@ void info_xml_creator::output_slots(machine_config &config, device_t &device, co // print m_output device type if (listed) - fprintf(m_output, "\t\t\n", util::xml::normalize_string(newtag.c_str())); + out << util::string_format("\t\t\n", util::xml::normalize_string(newtag.c_str())); for (auto &option : slot.option_list()) { @@ -1791,11 +1789,11 @@ void info_xml_creator::output_slots(machine_config &config, device_t &device, co if (listed && option.second->selectable()) { - fprintf(m_output, "\t\t\tname())); - fprintf(m_output, " devname=\"%s\"", util::xml::normalize_string(dev->shortname())); + out << util::string_format("\t\t\tname())); + out << util::string_format(" devname=\"%s\"", util::xml::normalize_string(dev->shortname())); if (slot.default_option() != nullptr && strcmp(slot.default_option(), option.second->name())==0) - fprintf(m_output, " default=\"yes\""); - fprintf(m_output, "/>\n"); + out << " default=\"yes\""; + out << "/>" << std::endl; } config.device_remove("_dummy"); @@ -1803,7 +1801,7 @@ void info_xml_creator::output_slots(machine_config &config, device_t &device, co } if (listed) - fprintf(m_output, "\t\t\n"); + out << "\t\t" << std::endl; } } } @@ -1814,14 +1812,14 @@ void info_xml_creator::output_slots(machine_config &config, device_t &device, co // for all known software lists for this system //------------------------------------------------- -void info_xml_creator::output_software_list(device_t &root) +void info_xml_creator::output_software_list(std::ostream &out, device_t &root) { for (const software_list_device &swlist : software_list_device_iterator(root)) { - fprintf(m_output, "\t\t\n"); + out << util::string_format(" filter=\"%s\"", util::xml::normalize_string(swlist.filter())); + out << "/>" << std::endl; } } @@ -1832,7 +1830,7 @@ void info_xml_creator::output_software_list(device_t &root) // options for this system //------------------------------------------------- -void info_xml_creator::output_ramoptions(device_t &root) +void info_xml_creator::output_ramoptions(std::ostream &out, device_t &root) { for (const ram_device &ram : ram_device_iterator(root, 1)) { @@ -1846,15 +1844,15 @@ void info_xml_creator::output_ramoptions(device_t &root) { assert(!havedefault); havedefault = true; - fprintf(m_output, "\t\t%u\n", util::xml::normalize_string(option.first.c_str()), option.second); + out << util::string_format("\t\t%u\n", util::xml::normalize_string(option.first.c_str()), option.second); } else { - fprintf(m_output, "\t\t%u\n", util::xml::normalize_string(option.first.c_str()), option.second); + out << util::string_format("\t\t%u\n", util::xml::normalize_string(option.first.c_str()), option.second); } } if (!havedefault) - fprintf(m_output, "\t\t%u\n", ram.default_size_string(), defsize); + out << util::string_format("\t\t%u\n", ram.default_size_string(), defsize); break; } } diff --git a/src/frontend/mame/info.h b/src/frontend/mame/info.h index a4c2f3884ff..76f4389f820 100644 --- a/src/frontend/mame/info.h +++ b/src/frontend/mame/info.h @@ -35,44 +35,43 @@ public: info_xml_creator(emu_options const &options, bool dtd = true); // output - void output(FILE *out, const std::vector &patterns); - void output(FILE *out, const std::function &filter = { }, bool include_devices = true); + void output(std::ostream &out, const std::vector &patterns); + void output(std::ostream &out, const std::function &filter = { }, bool include_devices = true); private: typedef std::unordered_set > device_type_set; // internal helper - void output_header(); - void output_footer(); + void output_header(std::ostream &out); + void output_footer(std::ostream &out); - void output_one(driver_enumerator &drivlist, device_type_set *devtypes); - void output_sampleof(device_t &device); - void output_bios(device_t const &device); - void output_rom(driver_enumerator *drivlist, const game_driver *driver, device_t &device); - void output_device_refs(device_t &root); - void output_sample(device_t &device); - void output_chips(device_t &device, const char *root_tag); - void output_display(device_t &device, machine_flags::type const *flags, const char *root_tag); - void output_sound(device_t &device); - void output_ioport_condition(const ioport_condition &condition, unsigned indent); - void output_input(const ioport_list &portlist); - void output_switches(const ioport_list &portlist, const char *root_tag, int type, const char *outertag, const char *loctag, const char *innertag); - void output_ports(const ioport_list &portlist); - void output_adjusters(const ioport_list &portlist); - void output_driver(game_driver const &driver, device_t::feature_type unemulated, device_t::feature_type imperfect); - void output_features(device_type type, device_t::feature_type unemulated, device_t::feature_type imperfect); - void output_images(device_t &device, const char *root_tag); - void output_slots(machine_config &config, device_t &device, const char *root_tag, device_type_set *devtypes); - void output_software_list(device_t &root); - void output_ramoptions(device_t &root); + void output_one(std::ostream &out, driver_enumerator &drivlist, device_type_set *devtypes); + void output_sampleof(std::ostream &out, device_t &device); + void output_bios(std::ostream &out, device_t const &device); + void output_rom(std::ostream &out, driver_enumerator *drivlist, const game_driver *driver, device_t &device); + void output_device_refs(std::ostream &out, device_t &root); + void output_sample(std::ostream &out, device_t &device); + void output_chips(std::ostream &out, device_t &device, const char *root_tag); + void output_display(std::ostream &out, device_t &device, machine_flags::type const *flags, const char *root_tag); + void output_sound(std::ostream &out, device_t &device); + void output_ioport_condition(std::ostream &out, const ioport_condition &condition, unsigned indent); + void output_input(std::ostream &out, const ioport_list &portlist); + void output_switches(std::ostream &out, const ioport_list &portlist, const char *root_tag, int type, const char *outertag, const char *loctag, const char *innertag); + void output_ports(std::ostream &out, const ioport_list &portlist); + void output_adjusters(std::ostream &out, const ioport_list &portlist); + void output_driver(std::ostream &out, game_driver const &driver, device_t::feature_type unemulated, device_t::feature_type imperfect); + void output_features(std::ostream &out, device_type type, device_t::feature_type unemulated, device_t::feature_type imperfect); + void output_images(std::ostream &out, device_t &device, const char *root_tag); + void output_slots(std::ostream &out, machine_config &config, device_t &device, const char *root_tag, device_type_set *devtypes); + void output_software_list(std::ostream &out, device_t &root); + void output_ramoptions(std::ostream &out, device_t &root); - void output_one_device(machine_config &config, device_t &device, const char *devtag); - void output_devices(device_type_set const *filter); + void output_one_device(std::ostream &out, machine_config &config, device_t &device, const char *devtag); + void output_devices(std::ostream &out, device_type_set const *filter); const char *get_merge_name(driver_enumerator &drivlist, const game_driver &driver, util::hash_collection const &romhashes); // internal state - FILE * m_output; // FIXME: this is not reentrancy-safe emu_options m_lookup_options; static const char s_dtd_string[]; diff --git a/src/frontend/mame/ui/miscmenu.cpp b/src/frontend/mame/ui/miscmenu.cpp index f79125ee7e1..397eb5801ff 100644 --- a/src/frontend/mame/ui/miscmenu.cpp +++ b/src/frontend/mame/ui/miscmenu.cpp @@ -25,6 +25,8 @@ #include "ui/inifile.h" #include "ui/submenu.h" +#include + namespace ui { /*************************************************************************** MENU HANDLERS @@ -585,10 +587,9 @@ void menu_export::handle() emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); if (file.open(filename.c_str(), ".xml") == osd_file::error::NONE) { - FILE *pfile; std::string fullpath(file.fullpath()); file.close(); - pfile = fopen(fullpath.c_str(), "w"); + std::ofstream pfile(fullpath); // prepare a filter for the drivers we want to show std::unordered_set driver_list(m_list.begin(), m_list.end()); @@ -607,7 +608,6 @@ void menu_export::handle() // and do the dirty work info_xml_creator creator(machine().options()); creator.output(pfile, filter, include_devices); - fclose(pfile); machine().popmessage(_("%s.xml saved under ui folder."), filename.c_str()); } }