diff options
Diffstat (limited to 'src/emu/ui/datfile.cpp')
-rw-r--r-- | src/emu/ui/datfile.cpp | 650 |
1 files changed, 0 insertions, 650 deletions
diff --git a/src/emu/ui/datfile.cpp b/src/emu/ui/datfile.cpp deleted file mode 100644 index 9171242d072..00000000000 --- a/src/emu/ui/datfile.cpp +++ /dev/null @@ -1,650 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Dankan1890 -/*************************************************************************** - - ui/datfile.cpp - - UI DATs manager. - -***************************************************************************/ - -#include "emu.h" -#include "drivenum.h" -#include "ui/ui.h" -#include "ui/datfile.h" -#include "ui/utils.h" - -//------------------------------------------------- -// TAGS -//------------------------------------------------- -static std::string DATAFILE_TAG("$"); -static std::string TAG_BIO("$bio"); -static std::string TAG_INFO("$info"); -static std::string TAG_MAME("$mame"); -static std::string TAG_COMMAND("$cmd"); -static std::string TAG_END("$end"); -static std::string TAG_DRIVER("$drv"); -static std::string TAG_STORY("$story"); -static std::string TAG_HISTORY_R("## REVISION:"); -static std::string TAG_MAMEINFO_R("# MAMEINFO.DAT"); -static std::string TAG_MESSINFO_R("# MESSINFO.DAT"); -static std::string TAG_SYSINFO_R("# This file was generated on"); -static std::string TAG_STORY_R("# version"); -static std::string TAG_COMMAND_SEPARATOR("-----------------------------------------------"); - -//------------------------------------------------- -// Statics -//------------------------------------------------- -datfile_manager::dataindex datfile_manager::m_histidx; -datfile_manager::dataindex datfile_manager::m_mameidx; -datfile_manager::dataindex datfile_manager::m_messidx; -datfile_manager::dataindex datfile_manager::m_cmdidx; -datfile_manager::dataindex datfile_manager::m_sysidx; -datfile_manager::dataindex datfile_manager::m_storyidx; -datfile_manager::drvindex datfile_manager::m_drvidx; -datfile_manager::drvindex datfile_manager::m_messdrvidx; -datfile_manager::drvindex datfile_manager::m_menuidx; -datfile_manager::swindex datfile_manager::m_swindex; -std::string datfile_manager::m_history_rev; -std::string datfile_manager::m_mame_rev; -std::string datfile_manager::m_mess_rev; -std::string datfile_manager::m_sysinfo_rev; -std::string datfile_manager::m_story_rev; -bool datfile_manager::first_run = true; - -//------------------------------------------------- -// ctor -//------------------------------------------------- -datfile_manager::datfile_manager(running_machine &machine) : m_machine(machine) -{ - if (machine.ui().options().enabled_dats() && first_run) - { - first_run = false; - if (parseopen("mameinfo.dat")) - { - init_mameinfo(); - parseclose(); - } - - if (parseopen("command.dat")) - { - init_command(); - parseclose(); - } - - if (parseopen("story.dat")) - { - init_storyinfo(); - parseclose(); - } - - if (parseopen("messinfo.dat")) - { - init_messinfo(); - parseclose(); - } - - if (parseopen("sysinfo.dat")) - { - init_sysinfo(); - parseclose(); - } - - if (parseopen("history.dat")) - { - init_history(); - parseclose(); - } - } -} - -//------------------------------------------------- -// initialize sysinfo.dat index -//------------------------------------------------- -void datfile_manager::init_sysinfo() -{ - int swcount = 0; - int count = index_datafile(m_sysidx, swcount); - osd_printf_verbose("Sysinfo.dat games found = %i\n", count); - osd_printf_verbose("Rev = %s\n", m_sysinfo_rev.c_str()); -} - -//------------------------------------------------- -// initialize story.dat index -//------------------------------------------------- -void datfile_manager::init_storyinfo() -{ - int swcount = 0; - int count = index_datafile(m_storyidx, swcount); - osd_printf_verbose("Story.dat games found = %i\n", count); -} - -//------------------------------------------------- -// initialize history.dat index -//------------------------------------------------- -void datfile_manager::init_history() -{ - int swcount = 0; - int count = index_datafile(m_histidx, swcount); - osd_printf_verbose("History.dat games found = %i\n", count); - osd_printf_verbose("History.dat softwares found = %i\n", swcount); - osd_printf_verbose("Rev = %s\n", m_history_rev.c_str()); -} - -//------------------------------------------------- -// initialize mameinfo.dat index -//------------------------------------------------- -void datfile_manager::init_mameinfo() -{ - int drvcount = 0; - int count = index_mame_mess_info(m_mameidx, m_drvidx, drvcount); - osd_printf_verbose("Mameinfo.dat games found = %i\n", count); - osd_printf_verbose("Mameinfo.dat drivers found = %d\n", drvcount); - osd_printf_verbose("Rev = %s\n", m_mame_rev.c_str()); -} - -//------------------------------------------------- -// initialize messinfo.dat index -//------------------------------------------------- -void datfile_manager::init_messinfo() -{ - int drvcount = 0; - int count = index_mame_mess_info(m_messidx, m_messdrvidx, drvcount); - osd_printf_verbose("Messinfo.dat games found = %i\n", count); - osd_printf_verbose("Messinfo.dat drivers found = %d\n", drvcount); - osd_printf_verbose("Rev = %s\n", m_mess_rev.c_str()); -} - -//------------------------------------------------- -// initialize command.dat index -//------------------------------------------------- -void datfile_manager::init_command() -{ - int swcount = 0; - int count = index_datafile(m_cmdidx, swcount); - osd_printf_verbose("Command.dat games found = %i\n", count); -} - -bool datfile_manager::has_software(std::string &softlist, std::string &softname, std::string &parentname) -{ - // Find software in software list index - if (m_swindex.find(softlist) == m_swindex.end()) - return false; - - m_itemsiter = m_swindex[softlist].find(softname); - if (m_itemsiter == m_swindex[softlist].end() && !parentname.empty()) - m_itemsiter = m_swindex[softlist].find(parentname); - - if (m_itemsiter == m_swindex[softlist].end()) - return false; - - return true; -} -//------------------------------------------------- -// load software info -//------------------------------------------------- -void datfile_manager::load_software_info(std::string &softlist, std::string &buffer, std::string &softname, std::string &parentname) -{ - // Load history text - if (!m_swindex.empty() && parseopen("history.dat")) - { - // Find software in software list index - if (!has_software(softlist, softname, parentname)) - return; - - long s_offset = (*m_itemsiter).second; - char rbuf[64 * 1024]; - fseek(fp, s_offset, SEEK_SET); - std::string readbuf; - while (fgets(rbuf, 64 * 1024, fp) != nullptr) - { - readbuf = chartrimcarriage(rbuf); - - // end entry when a end tag is encountered - if (readbuf == TAG_END) - break; - - // add this string to the buffer - buffer.append(readbuf).append("\n"); - } - parseclose(); - } -} - -//------------------------------------------------- -// load_data_info -//------------------------------------------------- -void datfile_manager::load_data_info(const game_driver *drv, std::string &buffer, int type) -{ - dataindex index_idx; - drvindex driver_idx; - std::string tag; - std::string filename; - - switch (type) - { - case UI_HISTORY_LOAD: - filename = "history.dat"; - tag = TAG_BIO; - index_idx = m_histidx; - break; - case UI_MAMEINFO_LOAD: - filename = "mameinfo.dat"; - tag = TAG_MAME; - index_idx = m_mameidx; - driver_idx = m_drvidx; - break; - case UI_SYSINFO_LOAD: - filename = "sysinfo.dat"; - tag = TAG_BIO; - index_idx = m_sysidx; - break; - case UI_MESSINFO_LOAD: - filename = "messinfo.dat"; - tag = TAG_MAME; - index_idx = m_messidx; - driver_idx = m_messdrvidx; - break; - case UI_STORY_LOAD: - filename = "story.dat"; - tag = TAG_STORY; - index_idx = m_storyidx; - break; - } - - if (parseopen(filename.c_str())) - { - load_data_text(drv, buffer, index_idx, tag); - - // load driver info - if (!driver_idx.empty()) - load_driver_text(drv, buffer, driver_idx, TAG_DRIVER); - - // cleanup mameinfo and sysinfo double line spacing - if (tag == TAG_MAME || type == UI_SYSINFO_LOAD) - strreplace(buffer, "\n\n", "\n"); - - parseclose(); - } -} - -//------------------------------------------------- -// load a game text into the buffer -//------------------------------------------------- -void datfile_manager::load_data_text(const game_driver *drv, std::string &buffer, dataindex &idx, std::string &tag) -{ - dataindex::iterator itemsiter = idx.find(drv); - if (itemsiter == idx.end()) - { - int cloneof = driver_list::non_bios_clone(*drv); - if (cloneof == -1) - return; - else - { - const game_driver *c_drv = &driver_list::driver(cloneof); - itemsiter = idx.find(c_drv); - if (itemsiter == idx.end()) - return; - } - } - - long s_offset = (*itemsiter).second; - fseek(fp, s_offset, SEEK_SET); - char rbuf[64 * 1024]; - std::string readbuf; - while (fgets(rbuf, 64 * 1024, fp) != nullptr) - { - readbuf = chartrimcarriage(rbuf); - - // end entry when a end tag is encountered - if (readbuf == TAG_END) - break; - - // continue if a specific tag is encountered - if (readbuf == tag) - continue; - - // add this string to the buffer - buffer.append(readbuf).append("\n"); - } -} - -//------------------------------------------------- -// load a driver name and offset into an -// indexed array -//------------------------------------------------- -void datfile_manager::load_driver_text(const game_driver *drv, std::string &buffer, drvindex &idx, std::string &tag) -{ - std::string s(core_filename_extract_base(drv->source_file)); - drvindex::const_iterator index = idx.find(s); - - // if driver not found, return - if (index == idx.end()) - return; - - buffer.append("\n--- DRIVER INFO ---\n").append("Driver: ").append(s).append("\n\n"); - long s_offset = (*index).second; - fseek(fp, s_offset, SEEK_SET); - char rbuf[64 * 1024]; - std::string readbuf; - while (fgets(rbuf, 64 * 1024, fp) != nullptr) - { - readbuf = chartrimcarriage(rbuf); - - // end entry when a end tag is encountered - if (readbuf == TAG_END) - break; - - // continue if a specific tag is encountered - if (readbuf == tag) - continue; - - // add this string to the buffer - buffer.append(readbuf).append("\n"); - } -} - -//------------------------------------------------- -// load a game name and offset into an -// indexed array (mameinfo) -//------------------------------------------------- -int datfile_manager::index_mame_mess_info(dataindex &index, drvindex &index_drv, int &drvcount) -{ - std::string name; - size_t foundtag; - size_t t_mame = TAG_MAMEINFO_R.size(); - size_t t_mess = TAG_MESSINFO_R.size(); - size_t t_info = TAG_INFO.size(); - - char rbuf[64 * 1024]; - std::string readbuf, xid; - while (fgets(rbuf, 64 * 1024, fp) != nullptr) - { - readbuf = chartrimcarriage(rbuf); - if (m_mame_rev.empty() && readbuf.compare(0, t_mame, TAG_MAMEINFO_R) == 0) - { - size_t found = readbuf.find(" ", t_mame + 1); - m_mame_rev = readbuf.substr(t_mame + 1, found - t_mame); - } - else if (m_mess_rev.empty() && (foundtag = readbuf.find(TAG_MESSINFO_R)) != std::string::npos) - { - size_t found = readbuf.find(" ", foundtag + t_mess + 1); - m_mess_rev = readbuf.substr(foundtag + t_mess + 1, found - t_mess - foundtag); - } - else if (readbuf.compare(0, t_info, TAG_INFO) == 0) - { - // TAG_INFO - fgets(rbuf, 64 * 1024, fp); - xid = chartrimcarriage(rbuf); - name = readbuf.substr(t_info + 1); - if (xid == TAG_MAME) - { - // validate driver - int game_index = driver_list::find(name.c_str()); - if (game_index != -1) - index.emplace(&driver_list::driver(game_index), ftell(fp)); - } - else if (xid == TAG_DRIVER) - { - index_drv.emplace(name, ftell(fp)); - drvcount++; - } - } - } - return index.size(); -} - -//------------------------------------------------- -// load a game name and offset into an -// indexed array -//------------------------------------------------- -int datfile_manager::index_datafile(dataindex &index, int &swcount) -{ - std::string readbuf, name; - size_t t_hist = TAG_HISTORY_R.size(); - size_t t_story = TAG_STORY_R.size(); - size_t t_sysinfo = TAG_SYSINFO_R.size(); - size_t t_info = TAG_INFO.size(); - size_t t_bio = TAG_BIO.size(); - char rbuf[64 * 1024]; - while (fgets(rbuf, 64 * 1024, fp) != nullptr) - { - readbuf = chartrimcarriage(rbuf); - - if (m_history_rev.empty() && readbuf.compare(0, t_hist, TAG_HISTORY_R) == 0) - { - size_t found = readbuf.find(" ", t_hist + 1); - m_history_rev = readbuf.substr(t_hist + 1, found - t_hist); - } - else if (m_sysinfo_rev.empty() && readbuf.compare(0, t_sysinfo, TAG_SYSINFO_R) == 0) - { - size_t found = readbuf.find(".", t_sysinfo + 1); - m_sysinfo_rev = readbuf.substr(t_sysinfo + 1, found - t_sysinfo); - } - else if (m_story_rev.empty() && readbuf.compare(0, t_story, TAG_STORY_R) == 0) - m_story_rev = readbuf.substr(t_story + 1); - - // TAG_INFO identifies the driver - else if (readbuf.compare(0, t_info, TAG_INFO) == 0) - { - int curpoint = t_info + 1; - int ends = readbuf.size(); - while (curpoint < ends) - { - // search for comma - size_t found = readbuf.find(",", curpoint); - - // found it - if (found != std::string::npos) - { - // copy data and validate driver - name = readbuf.substr(curpoint, found - curpoint); - - // validate driver - int game_index = driver_list::find(name.c_str()); - if (game_index != -1) - index.emplace(&driver_list::driver(game_index), ftell(fp)); - - // update current point - curpoint = ++found; - } - // if comma not found, copy data while until reach the end of string - else if (curpoint < ends) - { - name = readbuf.substr(curpoint); - int game_index = driver_list::find(name.c_str()); - if (game_index != -1) - index.emplace(&driver_list::driver(game_index), ftell(fp)); - - // update current point - curpoint = ends; - } - } - } - // search for software info - else if (!readbuf.empty() && readbuf[0] == DATAFILE_TAG[0]) - { - fgets(rbuf, 64 * 1024, fp); - std::string readbuf_2(chartrimcarriage(rbuf)); - - // TAG_BIO identifies software list - if (readbuf_2.compare(0, t_bio, TAG_BIO) == 0) - { - size_t eq_sign = readbuf.find("="); - std::string s_list(readbuf.substr(1, eq_sign - 1)); - std::string s_roms(readbuf.substr(eq_sign + 1)); - int ends = s_list.size(); - int curpoint = 0; - - while (curpoint < ends) - { - size_t found = s_list.find(",", curpoint); - - // found it - if (found != std::string::npos) - { - name = s_list.substr(curpoint, found - curpoint); - curpoint = ++found; - } - else - { - name = s_list; - curpoint = ends; - } - - // search for a software list in the index, if not found then allocates - std::string lname(name); - int cpoint = 0; - int cends = s_roms.size(); - - while (cpoint < cends) - { - // search for comma - size_t found = s_roms.find(",", cpoint); - - // found it - if (found != std::string::npos) - { - // copy data - name = s_roms.substr(cpoint, found - cpoint); - - // add a SoftwareItem - m_swindex[lname].emplace(name, ftell(fp)); - - // update current point - cpoint = ++found; - swcount++; - } - else - { - // if reach the end, bail out - if (s_roms[cpoint] == '\r' || s_roms[cpoint] == '\n') - break; - - // copy data - name = s_roms.substr(cpoint); - - // add a SoftwareItem - m_swindex[lname].emplace(name, ftell(fp)); - - // update current point - cpoint = cends; - swcount++; - } - } - } - } - } - } - return index.size(); -} - -//--------------------------------------------------------- -// parseopen - Open up file for reading -//--------------------------------------------------------- -bool datfile_manager::parseopen(const char *filename) -{ - // MAME core file parsing functions fail in recognizing UNICODE chars in UTF-8 without BOM, - // so it's better and faster use standard C fileio functions. - - emu_file file(machine().ui().options().history_path(), OPEN_FLAG_READ); - if (file.open(filename) != FILERR_NONE) - return false; - - m_fullpath = file.fullpath(); - file.close(); - fp = fopen(m_fullpath.c_str(), "rb"); - - fgetc(fp); - fseek(fp, 0, SEEK_SET); - return true; -} - -//------------------------------------------------- -// create the menu index -//------------------------------------------------- -void datfile_manager::index_menuidx(const game_driver *drv, dataindex &idx, drvindex &index) -{ - dataindex::iterator itemsiter = idx.find(drv); - if (itemsiter == idx.end()) - { - int cloneof = driver_list::non_bios_clone(*drv); - if (cloneof == -1) - return; - else - { - const game_driver *c_drv = &driver_list::driver(cloneof); - itemsiter = idx.find(c_drv); - if (itemsiter == idx.end()) - return; - } - } - - // seek to correct point in datafile - long s_offset = (*itemsiter).second; - fseek(fp, s_offset, SEEK_SET); - size_t tinfo = TAG_INFO.size(); - char rbuf[64 * 1024]; - std::string readbuf; - while (fgets(rbuf, 64 * 1024, fp) != nullptr) - { - readbuf = chartrimcarriage(rbuf); - - if (!core_strnicmp(TAG_INFO.c_str(), readbuf.c_str(), tinfo)) - break; - - // TAG_COMMAND identifies the driver - if (readbuf == TAG_COMMAND) - { - fgets(rbuf, 64 * 1024, fp); - chartrimcarriage(rbuf); - index.emplace(rbuf, ftell(fp)); - } - } -} - -//------------------------------------------------- -// load command text into the buffer -//------------------------------------------------- -void datfile_manager::load_command_info(std::string &buffer, std::string &sel) -{ - if (parseopen("command.dat")) - { - // open and seek to correct point in datafile - long offset = m_menuidx.at(sel); - fseek(fp, offset, SEEK_SET); - char rbuf[64 * 1024]; - std::string readbuf; - while (fgets(rbuf, 64 * 1024, fp) != nullptr) - { - readbuf = chartrimcarriage(rbuf); - - // skip separator lines - if (readbuf == TAG_COMMAND_SEPARATOR) - continue; - - // end entry when a tag is encountered - if (readbuf == TAG_END) - break; - - // add this string to the buffer - buffer.append(readbuf).append("\n");; - } - parseclose(); - } -} - -//------------------------------------------------- -// load submenu item for command.dat -//------------------------------------------------- -void datfile_manager::command_sub_menu(const game_driver *drv, std::vector<std::string> &menuitems) -{ - if (parseopen("command.dat")) - { - m_menuidx.clear(); - index_menuidx(drv, m_cmdidx, m_menuidx); - for (auto & elem : m_menuidx) - menuitems.push_back(elem.first); - parseclose(); - } -}
\ No newline at end of file |