diff options
Diffstat (limited to 'src/frontend/mame/clifront.cpp')
-rw-r--r-- | src/frontend/mame/clifront.cpp | 178 |
1 files changed, 90 insertions, 88 deletions
diff --git a/src/frontend/mame/clifront.cpp b/src/frontend/mame/clifront.cpp index 3316240ea9b..e50f8276567 100644 --- a/src/frontend/mame/clifront.cpp +++ b/src/frontend/mame/clifront.cpp @@ -1083,36 +1083,36 @@ const char cli_frontend::s_softlist_xml_dtd[] = "\t\t\t\t\t\t<!ATTLIST dipvalue default (yes|no) \"no\">\n" \ "]>\n\n"; -void cli_frontend::output_single_softlist(FILE *out, software_list_device &swlistdev) +void cli_frontend::output_single_softlist(std::ostream &out, software_list_device &swlistdev) { - fprintf(out, "\t<softwarelist name=\"%s\" description=\"%s\">\n", swlistdev.list_name().c_str(), util::xml::normalize_string(swlistdev.description().c_str())); + util::stream_format(out, "\t<softwarelist name=\"%s\" description=\"%s\">\n", swlistdev.list_name(), util::xml::normalize_string(swlistdev.description().c_str())); for (const software_info &swinfo : swlistdev.get_info()) { - fprintf(out, "\t\t<software name=\"%s\"", swinfo.shortname().c_str()); + util::stream_format(out, "\t\t<software name=\"%s\"", util::xml::normalize_string(swinfo.shortname().c_str())); if (!swinfo.parentname().empty()) - fprintf(out, " cloneof=\"%s\"", swinfo.parentname().c_str()); + util::stream_format(out, " cloneof=\"%s\"", util::xml::normalize_string(swinfo.parentname().c_str())); if (swinfo.supported() == SOFTWARE_SUPPORTED_PARTIAL) - fprintf(out, " supported=\"partial\""); + out << " supported=\"partial\""; if (swinfo.supported() == SOFTWARE_SUPPORTED_NO) - fprintf(out, " supported=\"no\""); - fprintf(out, ">\n" ); - fprintf(out, "\t\t\t<description>%s</description>\n", util::xml::normalize_string(swinfo.longname().c_str())); - fprintf(out, "\t\t\t<year>%s</year>\n", util::xml::normalize_string(swinfo.year().c_str())); - fprintf(out, "\t\t\t<publisher>%s</publisher>\n", util::xml::normalize_string(swinfo.publisher().c_str())); + out << " supported=\"no\""; + out << ">\n"; + util::stream_format(out, "\t\t\t<description>%s</description>\n", util::xml::normalize_string(swinfo.longname().c_str())); + util::stream_format(out, "\t\t\t<year>%s</year>\n", util::xml::normalize_string(swinfo.year().c_str())); + util::stream_format(out, "\t\t\t<publisher>%s</publisher>\n", util::xml::normalize_string(swinfo.publisher().c_str())); for (const feature_list_item &flist : swinfo.other_info()) - fprintf( out, "\t\t\t<info name=\"%s\" value=\"%s\"/>\n", flist.name().c_str(), util::xml::normalize_string( flist.value().c_str()) ); + util::stream_format(out, "\t\t\t<info name=\"%s\" value=\"%s\"/>\n", flist.name().c_str(), util::xml::normalize_string(flist.value().c_str())); for (const software_part &part : swinfo.parts()) { - fprintf(out, "\t\t\t<part name=\"%s\"", part.name().c_str()); + util::stream_format(out, "\t\t\t<part name=\"%s\"", util::xml::normalize_string(part.name().c_str())); if (!part.interface().empty()) - fprintf(out, " interface=\"%s\"", part.interface().c_str()); + util::stream_format(out, " interface=\"%s\"", util::xml::normalize_string(part.interface().c_str())); - fprintf(out, ">\n"); + out << ">\n"; for (const feature_list_item &flist : part.featurelist()) - fprintf(out, "\t\t\t\t<feature name=\"%s\" value=\"%s\" />\n", flist.name().c_str(), util::xml::normalize_string(flist.value().c_str())); + util::stream_format(out, "\t\t\t\t<feature name=\"%s\" value=\"%s\" />\n", flist.name().c_str(), util::xml::normalize_string(flist.value().c_str())); // TODO: display ROM region information for (const rom_entry *region = part.romdata().data(); region; region = rom_next_region(region)) @@ -1120,84 +1120,86 @@ void cli_frontend::output_single_softlist(FILE *out, software_list_device &swlis int is_disk = ROMREGION_ISDISKDATA(region); if (!is_disk) - fprintf( out, "\t\t\t\t<dataarea name=\"%s\" size=\"%d\">\n", ROMREGION_GETTAG(region), ROMREGION_GETLENGTH(region) ); + util::stream_format(out, "\t\t\t\t<dataarea name=\"%s\" size=\"%d\">\n", util::xml::normalize_string(ROMREGION_GETTAG(region)), ROMREGION_GETLENGTH(region)); else - fprintf( out, "\t\t\t\t<diskarea name=\"%s\">\n", ROMREGION_GETTAG(region) ); + util::stream_format(out, "\t\t\t\t<diskarea name=\"%s\">\n", util::xml::normalize_string(ROMREGION_GETTAG(region))); - for ( const rom_entry *rom = rom_first_file( region ); rom && !ROMENTRY_ISREGIONEND(rom); rom++ ) + for (const rom_entry *rom = rom_first_file(region); rom && !ROMENTRY_ISREGIONEND(rom); rom++) { - if ( ROMENTRY_ISFILE(rom) ) + if (ROMENTRY_ISFILE(rom)) { if (!is_disk) - fprintf( out, "\t\t\t\t\t<rom name=\"%s\" size=\"%d\"", util::xml::normalize_string(ROM_GETNAME(rom)), rom_file_size(rom) ); + util::stream_format(out, "\t\t\t\t\t<rom name=\"%s\" size=\"%d\"", util::xml::normalize_string(ROM_GETNAME(rom)), rom_file_size(rom)); else - fprintf( out, "\t\t\t\t\t<disk name=\"%s\"", util::xml::normalize_string(ROM_GETNAME(rom)) ); + util::stream_format(out, "\t\t\t\t\t<disk name=\"%s\"", util::xml::normalize_string(ROM_GETNAME(rom))); - /* dump checksum information only if there is a known dump */ + // dump checksum information only if there is a known dump util::hash_collection hashes(ROM_GETHASHDATA(rom)); - if ( !hashes.flag(util::hash_collection::FLAG_NO_DUMP) ) - fprintf( out, " %s", hashes.attribute_string().c_str() ); + if (!hashes.flag(util::hash_collection::FLAG_NO_DUMP)) + util::stream_format(out, " %s", util::xml::normalize_string(hashes.attribute_string().c_str())); else - fprintf( out, " status=\"nodump\"" ); + out << " status=\"nodump\""; if (is_disk) - fprintf( out, " writeable=\"%s\"", (ROM_GETFLAGS(rom) & DISK_READONLYMASK) ? "no" : "yes"); + util::stream_format(out, " writeable=\"%s\"", (ROM_GETFLAGS(rom) & DISK_READONLYMASK) ? "no" : "yes"); if ((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(1)) - fprintf( out, " loadflag=\"load16_byte\"" ); + out << " loadflag=\"load16_byte\""; if ((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(3)) - fprintf( out, " loadflag=\"load32_byte\"" ); + out << " loadflag=\"load32_byte\""; if (((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(2)) && ((ROM_GETFLAGS(rom) & ROM_GROUPMASK) == ROM_GROUPWORD)) { if (!(ROM_GETFLAGS(rom) & ROM_REVERSEMASK)) - fprintf( out, " loadflag=\"load32_word\"" ); + out << " loadflag=\"load32_word\""; else - fprintf( out, " loadflag=\"load32_word_swap\"" ); + out << " loadflag=\"load32_word_swap\""; } if (((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(6)) && ((ROM_GETFLAGS(rom) & ROM_GROUPMASK) == ROM_GROUPWORD)) { if (!(ROM_GETFLAGS(rom) & ROM_REVERSEMASK)) - fprintf( out, " loadflag=\"load64_word\"" ); + out << " loadflag=\"load64_word\""; else - fprintf( out, " loadflag=\"load64_word_swap\"" ); + out << " loadflag=\"load64_word_swap\""; } if (((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_NOSKIP) && ((ROM_GETFLAGS(rom) & ROM_GROUPMASK) == ROM_GROUPWORD)) { if (!(ROM_GETFLAGS(rom) & ROM_REVERSEMASK)) - fprintf( out, " loadflag=\"load32_dword\"" ); + out << " loadflag=\"load32_dword\""; else - fprintf( out, " loadflag=\"load16_word_swap\"" ); + out << " loadflag=\"load16_word_swap\""; } - fprintf( out, "/>\n" ); + out << "/>\n"; } - else if ( ROMENTRY_ISRELOAD(rom) ) + else if (ROMENTRY_ISRELOAD(rom)) { - fprintf( out, "\t\t\t\t\t<rom size=\"%d\" offset=\"0x%x\" loadflag=\"reload\" />\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom) ); + util::stream_format(out, "\t\t\t\t\t<rom size=\"%d\" offset=\"0x%x\" loadflag=\"reload\" />\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom)); } - else if ( ROMENTRY_ISFILL(rom) ) + else if (ROMENTRY_ISFILL(rom)) { - fprintf( out, "\t\t\t\t\t<rom size=\"%d\" offset=\"0x%x\" loadflag=\"fill\" />\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom) ); + util::stream_format(out, "\t\t\t\t\t<rom size=\"%d\" offset=\"0x%x\" loadflag=\"fill\" />\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom)); } } if (!is_disk) - fprintf( out, "\t\t\t\t</dataarea>\n" ); + out << "\t\t\t\t</dataarea>\n"; else - fprintf( out, "\t\t\t\t</diskarea>\n" ); + out << "\t\t\t\t</diskarea>\n"; } - fprintf( out, "\t\t\t</part>\n" ); + out << "\t\t\t</part>\n"; } - fprintf( out, "\t\t</software>\n" ); + out << "\t\t</software>\n"; } - fprintf(out, "\t</softwarelist>\n" ); + out << "\t</softwarelist>\n"; } + + /*------------------------------------------------- info_listsoftware - output the list of software supported by a given game or set of @@ -1207,38 +1209,35 @@ void cli_frontend::output_single_softlist(FILE *out, software_list_device &swlis void cli_frontend::listsoftware(const std::vector<std::string> &args) { - const char *gamename = args.empty() ? nullptr : args[0].c_str(); - - FILE *out = stdout; std::unordered_set<std::string> list_map; - bool isfirst = true; - - // determine which drivers to output; return an error if none found - driver_enumerator drivlist(m_options, gamename); - if (drivlist.count() == 0) - throw emu_fatalerror(EMU_ERR_NO_SUCH_SYSTEM, "No matching systems found for '%s'", gamename); - - while (drivlist.next()) - { - for (software_list_device &swlistdev : software_list_device_iterator(drivlist.config()->root_device())) - if (list_map.insert(swlistdev.list_name()).second) - if (!swlistdev.get_info().empty()) + bool firstlist(true); + apply_device_action( + args, + [this, &list_map, &firstlist] (device_t &root, char const *type, bool first) + { + for (software_list_device &swlistdev : software_list_device_iterator(root)) { - if (isfirst) + if (list_map.insert(swlistdev.list_name()).second) { - if (m_options.bool_value(CLIOPTION_DTD)) - fprintf(out, s_softlist_xml_dtd); - fprintf(out, "<softwarelists>\n"); - isfirst = false; + if (!swlistdev.get_info().empty()) + { + if (firstlist) + { + if (m_options.bool_value(CLIOPTION_DTD)) + std::cout << s_softlist_xml_dtd; + std::cout << "<softwarelists>\n"; + firstlist = false; + } + output_single_softlist(std::cout, swlistdev); + } } - output_single_softlist(out, swlistdev); } - } + }); - if (!isfirst) - fprintf( out, "</softwarelists>\n" ); + if (!firstlist) + std::cout << "</softwarelists>\n"; else - fprintf( out, "No software lists found for this system\n" ); + fprintf(stdout, "No software lists found for this system\n"); // TODO: should this go to stderr instead? } @@ -1325,32 +1324,35 @@ void cli_frontend::getsoftlist(const std::vector<std::string> &args) { const char *gamename = args.empty() ? "*" : args[0].c_str(); - FILE *out = stdout; std::unordered_set<std::string> list_map; - bool isfirst = true; - - driver_enumerator drivlist(m_options); - while (drivlist.next()) - { - for (software_list_device &swlistdev : software_list_device_iterator(drivlist.config()->root_device())) - if (core_strwildcmp(gamename, swlistdev.list_name().c_str()) == 0 && list_map.insert(swlistdev.list_name()).second) - if (!swlistdev.get_info().empty()) + bool firstlist(true); + apply_device_action( + std::vector<std::string>(), + [this, gamename, &list_map, &firstlist] (device_t &root, char const *type, bool first) + { + for (software_list_device &swlistdev : software_list_device_iterator(root)) { - if (isfirst) + if (core_strwildcmp(gamename, swlistdev.list_name().c_str()) == 0 && list_map.insert(swlistdev.list_name()).second) { - if (m_options.bool_value(CLIOPTION_DTD)) - fprintf(out, s_softlist_xml_dtd); - fprintf(out, "<softwarelists>\n"); - isfirst = false; + if (!swlistdev.get_info().empty()) + { + if (firstlist) + { + if (m_options.bool_value(CLIOPTION_DTD)) + std::cout << s_softlist_xml_dtd; + std::cout << "<softwarelists>\n"; + firstlist = false; + } + output_single_softlist(std::cout, swlistdev); + } } - output_single_softlist(out, swlistdev); } - } + }); - if (!isfirst) - fprintf( out, "</softwarelists>\n" ); + if (!firstlist) + std::cout << "</softwarelists>\n"; else - fprintf( out, "No such software lists found\n" ); + fprintf(stdout, "No such software lists found\n"); // TODO: should this go to stderr instead? } |