summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2016-04-21 20:52:21 +0200
committer Miodrag Milanovic <mmicko@gmail.com>2016-04-21 20:52:21 +0200
commit682bc907644430982629f9a8a27b9cce802f8a23 (patch)
tree61d35015b603cb76a6814c0cdad06e48756114a9
parente5690695e1d36d8ff9f0d8d61d28fec472842462 (diff)
Created mame_options as 1st step towards creating core independent of MAME implementation (nw)
-rw-r--r--src/emu/clifront.cpp14
-rw-r--r--src/emu/emuopts.cpp310
-rw-r--r--src/emu/emuopts.h55
-rw-r--r--src/emu/info.cpp2
-rw-r--r--src/emu/mame.cpp6
-rw-r--r--src/emu/ui/miscmenu.cpp2
-rw-r--r--src/emu/ui/slotopt.cpp2
7 files changed, 199 insertions, 192 deletions
diff --git a/src/emu/clifront.cpp b/src/emu/clifront.cpp
index 835573f2f41..49097f2c016 100644
--- a/src/emu/clifront.cpp
+++ b/src/emu/clifront.cpp
@@ -159,7 +159,7 @@ cli_frontend::cli_frontend(emu_options &options, osd_interface &osd)
cli_frontend::~cli_frontend()
{
// nuke any device options since they will leak memory
- m_options.remove_device_options();
+ mame_options::remove_device_options(m_options);
}
//-------------------------------------------------
@@ -177,9 +177,9 @@ int cli_frontend::execute(int argc, char **argv)
{
// first parse options to be able to get software from it
std::string option_errors;
- m_options.parse_command_line(argc, argv, option_errors);
+ mame_options::parse_command_line(m_options,argc, argv, option_errors);
- m_options.parse_standard_inis(option_errors);
+ mame_options::parse_standard_inis(m_options,option_errors);
load_translation(m_options);
@@ -226,7 +226,7 @@ int cli_frontend::execute(int argc, char **argv)
std::string val = string_format("%s:%s:%s", swlistdev.list_name(), m_options.software_name(), swpart.name());
// call this in order to set slot devices according to mounting
- m_options.parse_slot_devices(argc, argv, option_errors, image.instance_name(), val.c_str(), &swpart);
+ mame_options::parse_slot_devices(m_options, argc, argv, option_errors, image.instance_name(), val.c_str(), &swpart);
break;
}
}
@@ -249,7 +249,7 @@ int cli_frontend::execute(int argc, char **argv)
}
// parse the command line, adding any system-specific options
- if (!m_options.parse_command_line(argc, argv, option_errors))
+ if (!mame_options::parse_command_line(m_options,argc, argv, option_errors))
{
// if we failed, check for no command and a system name first; in that case error on the name
if (*(m_options.command()) == 0 && m_options.system() == nullptr && *(m_options.system_name()) != 0)
@@ -276,7 +276,7 @@ int cli_frontend::execute(int argc, char **argv)
if (m_options.read_config())
{
m_options.revert(OPTION_PRIORITY_INI);
- m_options.parse_standard_inis(option_errors);
+ mame_options::parse_standard_inis(m_options,option_errors);
}
if (!option_errors.empty())
osd_printf_error("Error in command line:\n%s\n", strtrimspace(option_errors).c_str());
@@ -1670,7 +1670,7 @@ void cli_frontend::execute_commands(const char *exename)
// other commands need the INIs parsed
std::string option_errors;
- m_options.parse_standard_inis(option_errors);
+ mame_options::parse_standard_inis(m_options,option_errors);
if (!option_errors.empty())
osd_printf_error("%s\n", option_errors.c_str());
diff --git a/src/emu/emuopts.cpp b/src/emu/emuopts.cpp
index d8c04bea283..6e8f267d117 100644
--- a/src/emu/emuopts.cpp
+++ b/src/emu/emuopts.cpp
@@ -225,30 +225,88 @@ emu_options::emu_options()
, m_joystick_contradictory(false)
, m_sleep(true)
, m_refresh_speed(false)
-, m_slot_options(0)
-, m_device_options(0)
{
add_entries(emu_options::s_option_entries);
}
+
+//-------------------------------------------------
+// system - return a pointer to the specified
+// system driver, or NULL if no match
+//-------------------------------------------------
+
+const game_driver *emu_options::system() const
+{
+ int index = driver_list::find(core_filename_extract_base(system_name(), true).c_str());
+ return (index != -1) ? &driver_list::driver(index) : nullptr;
+}
+
+
+std::string emu_options::main_value(const char *name) const
+{
+ std::string buffer = value(name);
+ int pos = buffer.find_first_of(',');
+ if (pos != -1)
+ buffer = buffer.substr(0, pos);
+ return buffer;
+}
+
+std::string emu_options::sub_value(const char *name, const char *subname) const
+{
+ std::string tmp = std::string(",").append(subname).append("=");
+ std::string buffer = value(name);
+ int pos = buffer.find(tmp);
+ if (pos != -1)
+ {
+ int endpos = buffer.find_first_of(',', pos + 1);
+ if (endpos == -1)
+ endpos = buffer.length();
+ buffer = buffer.substr(pos + tmp.length(), endpos - pos - tmp.length());
+ }
+ else
+ buffer.clear();
+ return buffer;
+}
+
+
+//-------------------------------------------------
+// update_cached_options - to prevent tagmap
+// lookups keep copies of frequently requested
+// options in member variables.
+//-------------------------------------------------
+
+void emu_options::update_cached_options()
+{
+ m_coin_impulse = int_value(OPTION_COIN_IMPULSE);
+ m_joystick_contradictory = bool_value(OPTION_JOYSTICK_CONTRADICTORY);
+ m_sleep = bool_value(OPTION_SLEEP);
+ m_refresh_speed = bool_value(OPTION_REFRESHSPEED);
+}
+
+
+
+
+int mame_options::m_slot_options = 0;
+int mame_options::m_device_options = 0;
+
//-------------------------------------------------
// add_slot_options - add all of the slot
// options for the configured system
//-------------------------------------------------
-bool emu_options::add_slot_options(const software_part *swpart)
+bool mame_options::add_slot_options(emu_options &options, const software_part *swpart)
{
// look up the system configured by name; if no match, do nothing
- const game_driver *cursystem = system();
+ const game_driver *cursystem = options.system();
if (cursystem == nullptr)
return false;
// create the configuration
- machine_config config(*cursystem, *this);
+ machine_config config(*cursystem, options);
// iterate through all slot devices
- int starting_count = options_count();
+ int starting_count = options.options_count();
for (const device_slot_interface &slot : slot_interface_iterator(config.root_device()))
{
// skip fixed slots
@@ -257,14 +315,14 @@ bool emu_options::add_slot_options(const software_part *swpart)
// retrieve info about the device instance
const char *name = slot.device().tag() + 1;
- if (!exists(name))
+ if (!options.exists(name))
{
// first device? add the header as to be pretty
if (m_slot_options++ == 0)
- add_entry(nullptr, "SLOT DEVICES", OPTION_HEADER | OPTION_FLAG_DEVICE);
+ options.add_entry(nullptr, "SLOT DEVICES", OPTION_HEADER | OPTION_FLAG_DEVICE);
// add the option
- add_entry(name, nullptr, OPTION_STRING | OPTION_FLAG_DEVICE, slot.default_option(), true);
+ options.add_entry(name, nullptr, OPTION_STRING | OPTION_FLAG_DEVICE, slot.default_option(), true);
}
// allow software lists to supply their own defaults
@@ -276,11 +334,11 @@ bool emu_options::add_slot_options(const software_part *swpart)
{
// set priority above INIs but below actual command line
std::string error;
- set_value(name, value, OPTION_PRIORITY_SUBCMD, error);
+ options.set_value(name, value, OPTION_PRIORITY_SUBCMD, error);
}
}
}
- return (options_count() != starting_count);
+ return (options.options_count() != starting_count);
}
@@ -289,26 +347,26 @@ bool emu_options::add_slot_options(const software_part *swpart)
// depending of image mounted
//-------------------------------------------------
-void emu_options::update_slot_options(const software_part *swpart)
+void mame_options::update_slot_options(emu_options &options, const software_part *swpart)
{
// look up the system configured by name; if no match, do nothing
- const game_driver *cursystem = system();
+ const game_driver *cursystem = options.system();
if (cursystem == nullptr)
return;
- machine_config config(*cursystem, *this);
+ machine_config config(*cursystem, options);
// iterate through all slot devices
for (device_slot_interface &slot : slot_interface_iterator(config.root_device()))
{
// retrieve info about the device instance
const char *name = slot.device().tag() + 1;
- if (exists(name) && !slot.option_list().empty())
+ if (options.exists(name) && !slot.option_list().empty())
{
std::string defvalue = slot.get_default_card_software();
if (defvalue.empty())
{
// keep any non-default setting
- if (priority(name) > OPTION_PRIORITY_DEFAULT)
+ if (options.priority(name) > OPTION_PRIORITY_DEFAULT)
continue;
// reinstate the actual default value as configured
@@ -317,13 +375,13 @@ void emu_options::update_slot_options(const software_part *swpart)
}
// set the value and hide the option if not selectable
- set_default_value(name, defvalue.c_str());
+ options.set_default_value(name, defvalue.c_str());
const device_slot_option *option = slot.option(defvalue.c_str());
- set_flag(name, ~OPTION_FLAG_INTERNAL, (option != nullptr && !option->selectable()) ? OPTION_FLAG_INTERNAL : 0);
+ options.set_flag(name, ~OPTION_FLAG_INTERNAL, (option != nullptr && !option->selectable()) ? OPTION_FLAG_INTERNAL : 0);
}
}
- while (add_slot_options(swpart)) { }
- add_device_options();
+ while (add_slot_options(options,swpart)) {}
+ add_device_options(options);
}
@@ -332,13 +390,13 @@ void emu_options::update_slot_options(const software_part *swpart)
// options for the configured system
//-------------------------------------------------
-void emu_options::add_device_options()
+void mame_options::add_device_options(emu_options &options)
{
// look up the system configured by name; if no match, do nothing
- const game_driver *cursystem = system();
+ const game_driver *cursystem = options.system();
if (cursystem == nullptr)
return;
- machine_config config(*cursystem, *this);
+ machine_config config(*cursystem, options);
// iterate through all image devices
for (const device_image_interface &image : image_interface_iterator(config.root_device()))
@@ -346,21 +404,21 @@ void emu_options::add_device_options()
if (!image.user_loadable())
continue;
- // retrieve info about the device instance
+ // retrieve info about the device instance
std::ostringstream option_name;
util::stream_format(option_name, "%s;%s", image.instance_name(), image.brief_instance_name());
if (strcmp(image.device_typename(image.image_type()), image.instance_name()) == 0)
util::stream_format(option_name, ";%s1;%s1", image.instance_name(), image.brief_instance_name());
// add the option
- if (!exists(image.instance_name()))
+ if (!options.exists(image.instance_name()))
{
// first device? add the header as to be pretty
if (m_device_options++ == 0)
- add_entry(nullptr, "IMAGE DEVICES", OPTION_HEADER | OPTION_FLAG_DEVICE);
+ options.add_entry(nullptr, "IMAGE DEVICES", OPTION_HEADER | OPTION_FLAG_DEVICE);
// add the option
- add_entry(option_name.str().c_str(), nullptr, OPTION_STRING | OPTION_FLAG_DEVICE, nullptr, true);
+ options.add_entry(option_name.str().c_str(), nullptr, OPTION_STRING | OPTION_FLAG_DEVICE, nullptr, true);
}
}
}
@@ -370,22 +428,22 @@ void emu_options::add_device_options()
// remove_device_options - remove device options
//-------------------------------------------------
-void emu_options::remove_device_options()
+void mame_options::remove_device_options(emu_options &options)
{
// iterate through options and remove interesting ones
- entry *nextentry;
- for (entry *curentry = first(); curentry != nullptr; curentry = nextentry)
+ core_options::entry *nextentry;
+ for (auto *curentry = options.first(); curentry != nullptr; curentry = nextentry)
{
// pre-fetch the next entry in case we delete this one
nextentry = curentry->next();
// if this is a device option, nuke it
if ((curentry->flags() & OPTION_FLAG_DEVICE) != 0)
- remove_entry(*curentry);
+ options.remove_entry(*curentry);
}
// take also care of ramsize options
- set_default_value(OPTION_RAMSIZE, "");
+ options.set_default_value(OPTION_RAMSIZE, "");
// reset counters
m_slot_options = 0;
@@ -398,31 +456,31 @@ void emu_options::remove_device_options()
// and update slot and image devices
//-------------------------------------------------
-bool emu_options::parse_slot_devices(int argc, char *argv[], std::string &error_string, const char *name, const char *value, const software_part *swpart)
+bool mame_options::parse_slot_devices(emu_options &options, int argc, char *argv[], std::string &error_string, const char *name, const char *value, const software_part *swpart)
{
// an initial parse to capture the initial set of values
bool result;
- core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string);
+ options.parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string);
// keep adding slot options until we stop seeing new stuff
- while (add_slot_options(swpart))
- core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string);
+ while (add_slot_options(options,swpart))
+ options.parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string);
// add device options and reparse
- add_device_options();
- if (name != nullptr && exists(name))
- set_value(name, value, OPTION_PRIORITY_SUBCMD, error_string);
- core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string);
+ add_device_options(options);
+ if (name != nullptr && options.exists(name))
+ options.set_value(name, value, OPTION_PRIORITY_SUBCMD, error_string);
+ options.parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string);
int num;
do {
- num = options_count();
- update_slot_options(swpart);
- result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string);
- } while (num != options_count());
+ num = options.options_count();
+ update_slot_options(options,swpart);
+ result = options.parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string);
+ } while (num != options.options_count());
- update_cached_options();
+ options.update_cached_options();
return result;
}
@@ -433,12 +491,12 @@ bool emu_options::parse_slot_devices(int argc, char *argv[], std::string &error_
// and update the devices
//-------------------------------------------------
-bool emu_options::parse_command_line(int argc, char *argv[], std::string &error_string)
+bool mame_options::parse_command_line(emu_options &options, int argc, char *argv[], std::string &error_string)
{
// parse as normal
- core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string);
- bool result = parse_slot_devices(argc, argv, error_string);
- update_cached_options();
+ options.parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string);
+ bool result = parse_slot_devices(options,argc, argv, error_string);
+ options.update_cached_options();
return result;
}
@@ -448,134 +506,121 @@ bool emu_options::parse_command_line(int argc, char *argv[], std::string &error_
// of INI files
//-------------------------------------------------
-void emu_options::parse_standard_inis(std::string &error_string, const game_driver *driver)
+void mame_options::parse_standard_inis(emu_options &options, std::string &error_string, const game_driver *driver)
{
// start with an empty string
error_string.clear();
// parse the INI file defined by the platform (e.g., "mame.ini")
// we do this twice so that the first file can change the INI path
- parse_one_ini(emulator_info::get_configname(), OPTION_PRIORITY_MAME_INI);
- parse_one_ini(emulator_info::get_configname(), OPTION_PRIORITY_MAME_INI, &error_string);
+ parse_one_ini(options,emulator_info::get_configname(), OPTION_PRIORITY_MAME_INI);
+ parse_one_ini(options,emulator_info::get_configname(), OPTION_PRIORITY_MAME_INI, &error_string);
// debug mode: parse "debug.ini" as well
- if (debug())
- parse_one_ini("debug", OPTION_PRIORITY_DEBUG_INI, &error_string);
+ if (options.debug())
+ parse_one_ini(options,"debug", OPTION_PRIORITY_DEBUG_INI, &error_string);
// if we have a valid system driver, parse system-specific INI files
- const game_driver *cursystem = (driver == nullptr) ? system() : driver;
+ const game_driver *cursystem = (driver == nullptr) ? options.system() : driver;
if (cursystem == nullptr)
return;
// parse "vertical.ini" or "horizont.ini"
if (cursystem->flags & ORIENTATION_SWAP_XY)
- parse_one_ini("vertical", OPTION_PRIORITY_ORIENTATION_INI, &error_string);
+ parse_one_ini(options,"vertical", OPTION_PRIORITY_ORIENTATION_INI, &error_string);
else
- parse_one_ini("horizont", OPTION_PRIORITY_ORIENTATION_INI, &error_string);
+ parse_one_ini(options,"horizont", OPTION_PRIORITY_ORIENTATION_INI, &error_string);
if (cursystem->flags & MACHINE_TYPE_ARCADE)
- parse_one_ini("arcade", OPTION_PRIORITY_SYSTYPE_INI, &error_string);
+ parse_one_ini(options,"arcade", OPTION_PRIORITY_SYSTYPE_INI, &error_string);
else if (cursystem->flags & MACHINE_TYPE_CONSOLE)
- parse_one_ini("console", OPTION_PRIORITY_SYSTYPE_INI, &error_string);
+ parse_one_ini(options,"console", OPTION_PRIORITY_SYSTYPE_INI, &error_string);
else if (cursystem->flags & MACHINE_TYPE_COMPUTER)
- parse_one_ini("computer", OPTION_PRIORITY_SYSTYPE_INI, &error_string);
+ parse_one_ini(options,"computer", OPTION_PRIORITY_SYSTYPE_INI, &error_string);
else if (cursystem->flags & MACHINE_TYPE_OTHER)
- parse_one_ini("othersys", OPTION_PRIORITY_SYSTYPE_INI, &error_string);
+ parse_one_ini(options,"othersys", OPTION_PRIORITY_SYSTYPE_INI, &error_string);
- machine_config config(*cursystem, *this);
+ machine_config config(*cursystem, options);
for (const screen_device &device : screen_device_iterator(config.root_device()))
{
// parse "raster.ini" for raster games
if (device.screen_type() == SCREEN_TYPE_RASTER)
{
- parse_one_ini("raster", OPTION_PRIORITY_SCREEN_INI, &error_string);
+ parse_one_ini(options,"raster", OPTION_PRIORITY_SCREEN_INI, &error_string);
break;
}
// parse "vector.ini" for vector games
if (device.screen_type() == SCREEN_TYPE_VECTOR)
{
- parse_one_ini("vector", OPTION_PRIORITY_SCREEN_INI, &error_string);
+ parse_one_ini(options,"vector", OPTION_PRIORITY_SCREEN_INI, &error_string);
break;
}
// parse "lcd.ini" for lcd games
if (device.screen_type() == SCREEN_TYPE_LCD)
{
- parse_one_ini("lcd", OPTION_PRIORITY_SCREEN_INI, &error_string);
+ parse_one_ini(options,"lcd", OPTION_PRIORITY_SCREEN_INI, &error_string);
break;
}
}
// next parse "source/<sourcefile>.ini"; if that doesn't exist, try <sourcefile>.ini
std::string sourcename = core_filename_extract_base(cursystem->source_file, true).insert(0, "source" PATH_SEPARATOR);
- if (!parse_one_ini(sourcename.c_str(), OPTION_PRIORITY_SOURCE_INI, &error_string))
+ if (!parse_one_ini(options,sourcename.c_str(), OPTION_PRIORITY_SOURCE_INI, &error_string))
{
sourcename = core_filename_extract_base(cursystem->source_file, true);
- parse_one_ini(sourcename.c_str(), OPTION_PRIORITY_SOURCE_INI, &error_string);
+ parse_one_ini(options,sourcename.c_str(), OPTION_PRIORITY_SOURCE_INI, &error_string);
}
// then parse the grandparent, parent, and system-specific INIs
int parent = driver_list::clone(*cursystem);
int gparent = (parent != -1) ? driver_list::clone(parent) : -1;
if (gparent != -1)
- parse_one_ini(driver_list::driver(gparent).name, OPTION_PRIORITY_GPARENT_INI, &error_string);
+ parse_one_ini(options,driver_list::driver(gparent).name, OPTION_PRIORITY_GPARENT_INI, &error_string);
if (parent != -1)
- parse_one_ini(driver_list::driver(parent).name, OPTION_PRIORITY_PARENT_INI, &error_string);
- parse_one_ini(cursystem->name, OPTION_PRIORITY_DRIVER_INI, &error_string);
+ parse_one_ini(options,driver_list::driver(parent).name, OPTION_PRIORITY_PARENT_INI, &error_string);
+ parse_one_ini(options,cursystem->name, OPTION_PRIORITY_DRIVER_INI, &error_string);
// Re-evaluate slot options after loading ini files
- update_slot_options();
-
- update_cached_options();
-}
-
-
-//-------------------------------------------------
-// system - return a pointer to the specified
-// system driver, or NULL if no match
-//-------------------------------------------------
+ update_slot_options(options);
-const game_driver *emu_options::system() const
-{
- int index = driver_list::find(core_filename_extract_base(system_name(), true).c_str());
- return (index != -1) ? &driver_list::driver(index) : nullptr;
+ options.update_cached_options();
}
-
//-------------------------------------------------
// set_system_name - set a new system name
//-------------------------------------------------
-void emu_options::set_system_name(const char *name)
+void mame_options::set_system_name(emu_options &options, const char *name)
{
// remember the original system name
- std::string old_system_name(system_name());
- bool new_system = old_system_name.compare(name)!=0;
+ std::string old_system_name(options.system_name());
+ bool new_system = old_system_name.compare(name) != 0;
// if the system name changed, fix up the device options
if (new_system)
{
// first set the new name
std::string error;
- set_value(OPTION_SYSTEMNAME, name, OPTION_PRIORITY_CMDLINE, error);
+ options.set_value(OPTION_SYSTEMNAME, name, OPTION_PRIORITY_CMDLINE, error);
assert(error.empty());
// remove any existing device options
- remove_device_options();
+ remove_device_options(options);
}
else
{
// revert device options set for the old software
- revert(OPTION_PRIORITY_SUBCMD, OPTION_PRIORITY_SUBCMD);
+ options.revert(OPTION_PRIORITY_SUBCMD, OPTION_PRIORITY_SUBCMD);
}
// get the new system
- const game_driver *cursystem = system();
+ const game_driver *cursystem = options.system();
if (cursystem == nullptr)
return;
- if (*software_name() != 0)
+ if (*options.software_name() != 0)
{
- std::string sw_load(software_name());
+ std::string sw_load(options.software_name());
std::string sw_list, sw_name, sw_part, sw_instance, error_string;
int left = sw_load.find_first_of(':');
int middle = sw_load.find_first_of(':', left + 1);
@@ -588,7 +633,7 @@ void emu_options::set_system_name(const char *name)
sw_load.assign(sw_load.substr(0, right));
// look up the software part
- machine_config config(*cursystem, *this);
+ machine_config config(*cursystem, options);
software_list_device *swlist = software_list_device::find_by_name(config, sw_list.c_str());
software_info *swinfo = swlist != nullptr ? swlist->find(sw_name.c_str()) : nullptr;
software_part *swpart = swinfo != nullptr ? swinfo->find_part(sw_part.c_str()) : nullptr;
@@ -596,30 +641,30 @@ void emu_options::set_system_name(const char *name)
// then add the options
if (new_system)
{
- while (add_slot_options(swpart)) { }
- add_device_options();
+ while (add_slot_options(options,swpart)) {}
+ add_device_options(options);
}
- set_value(OPTION_SOFTWARENAME, sw_name.c_str(), OPTION_PRIORITY_CMDLINE, error_string);
- if (exists(sw_instance.c_str()))
- set_value(sw_instance.c_str(), sw_load.c_str(), OPTION_PRIORITY_SUBCMD, error_string);
+ options.set_value(OPTION_SOFTWARENAME, sw_name.c_str(), OPTION_PRIORITY_CMDLINE, error_string);
+ if (options.exists(sw_instance.c_str()))
+ options.set_value(sw_instance.c_str(), sw_load.c_str(), OPTION_PRIORITY_SUBCMD, error_string);
int num;
do {
- num = options_count();
- update_slot_options(swpart);
- } while(num != options_count());
+ num = options.options_count();
+ update_slot_options(options,swpart);
+ } while (num != options.options_count());
}
else if (new_system)
{
// add the options afresh
- while (add_slot_options()) { }
- add_device_options();
+ while (add_slot_options(options)) {}
+ add_device_options(options);
int num;
do {
- num = options_count();
- update_slot_options();
- } while(num != options_count());
+ num = options.options_count();
+ update_slot_options(options);
+ } while (num != options.options_count());
}
}
@@ -627,14 +672,14 @@ void emu_options::set_system_name(const char *name)
// parse_one_ini - parse a single INI file
//-------------------------------------------------
-bool emu_options::parse_one_ini(const char *basename, int priority, std::string *error_string)
+bool mame_options::parse_one_ini(emu_options &options, const char *basename, int priority, std::string *error_string)
{
// don't parse if it has been disabled
- if (!read_config())
+ if (!options.read_config())
return false;
// open the file; if we fail, that's ok
- emu_file file(ini_path(), OPEN_FLAG_READ);
+ emu_file file(options.ini_path(), OPEN_FLAG_READ);
osd_file::error filerr = file.open(basename, ".ini");
if (filerr != osd_file::error::NONE)
return false;
@@ -642,7 +687,7 @@ bool emu_options::parse_one_ini(const char *basename, int priority, std::string
// parse the file
osd_printf_verbose("Parsing %s.ini\n", basename);
std::string error;
- bool result = parse_ini_file((util::core_file&)file, priority, OPTION_PRIORITY_DRIVER_INI, error);
+ bool result = options.parse_ini_file((util::core_file&)file, priority, OPTION_PRIORITY_DRIVER_INI, error);
// append errors if requested
if (!error.empty() && error_string)
@@ -651,44 +696,3 @@ bool emu_options::parse_one_ini(const char *basename, int priority, std::string
return result;
}
-
-std::string emu_options::main_value(const char *name) const
-{
- std::string buffer = value(name);
- int pos = buffer.find_first_of(',');
- if (pos != -1)
- buffer = buffer.substr(0, pos);
- return buffer;
-}
-
-std::string emu_options::sub_value(const char *name, const char *subname) const
-{
- std::string tmp = std::string(",").append(subname).append("=");
- std::string buffer = value(name);
- int pos = buffer.find(tmp);
- if (pos != -1)
- {
- int endpos = buffer.find_first_of(',', pos + 1);
- if (endpos == -1)
- endpos = buffer.length();
- buffer = buffer.substr(pos + tmp.length(), endpos - pos - tmp.length());
- }
- else
- buffer.clear();
- return buffer;
-}
-
-
-//-------------------------------------------------
-// update_cached_options - to prevent tagmap
-// lookups keep copies of frequently requested
-// options in member variables.
-//-------------------------------------------------
-
-void emu_options::update_cached_options()
-{
- m_coin_impulse = int_value(OPTION_COIN_IMPULSE);
- m_joystick_contradictory = bool_value(OPTION_JOYSTICK_CONTRADICTORY);
- m_sleep = bool_value(OPTION_SLEEP);
- m_refresh_speed = bool_value(OPTION_REFRESHSPEED);
-}
diff --git a/src/emu/emuopts.h b/src/emu/emuopts.h
index a0e20153241..ccf1738a8c4 100644
--- a/src/emu/emuopts.h
+++ b/src/emu/emuopts.h
@@ -218,25 +218,43 @@ enum
struct game_driver;
class software_part;
-
-class emu_options : public core_options
+class mame_options
{
static const UINT32 OPTION_FLAG_DEVICE = 0x80000000;
public:
+ // parsing wrappers
+ static bool parse_command_line(emu_options &options, int argc, char *argv[], std::string &error_string);
+ static void parse_standard_inis(emu_options &options, std::string &error_string, const game_driver *driver = nullptr);
+ static bool parse_slot_devices(emu_options &options, int argc, char *argv[], std::string &error_string, const char *name = nullptr, const char *value = nullptr, const software_part *swpart = nullptr);
+ // FIXME: Couriersud: This should be in image_device_exit
+ static void remove_device_options(emu_options &options);
+
+ static void set_system_name(emu_options &options, const char *name);
+ static bool add_slot_options(emu_options &options, const software_part *swpart = nullptr);
+private:
+ // device-specific option handling
+ static void add_device_options(emu_options &options);
+ static void update_slot_options(emu_options &options, const software_part *swpart = nullptr);
+
+ // INI parsing helper
+ static bool parse_one_ini(emu_options &options, const char *basename, int priority, std::string *error_string = nullptr);
+
+ static int m_slot_options;
+ static int m_device_options;
+
+};
+
+class emu_options : public core_options
+{
+public:
// construction/destruction
emu_options();
- // parsing wrappers
- bool parse_command_line(int argc, char *argv[], std::string &error_string);
- void parse_standard_inis(std::string &error_string, const game_driver *driver = nullptr);
- bool parse_slot_devices(int argc, char *argv[], std::string &error_string, const char *name = nullptr, const char *value = nullptr, const software_part *swpart = nullptr);
-
// core options
const char *system_name() const { return value(OPTION_SYSTEMNAME); }
const char *software_name() const { return value(OPTION_SOFTWARENAME); }
const game_driver *system() const;
- void set_system_name(const char *name);
// core configuration options
bool read_config() const { return bool_value(OPTION_READCONFIG); }
@@ -405,26 +423,13 @@ public:
const char *no_plugin() const { return value(OPTION_NO_PLUGIN); }
const char *language() const { return value(OPTION_LANGUAGE); }
-
- // FIXME: Couriersud: This should be in image_device_exit
- void remove_device_options();
+
+ // cache frequently used options in members
+ void update_cached_options();
std::string main_value(const char *option) const;
std::string sub_value(const char *name, const char *subname) const;
- bool add_slot_options(const software_part *swpart = nullptr);
-
-
private:
- // device-specific option handling
- void add_device_options();
- void update_slot_options(const software_part *swpart = nullptr);
-
- // INI parsing helper
- bool parse_one_ini(const char *basename, int priority, std::string *error_string = nullptr);
-
- // cache frequently used options in members
- void update_cached_options();
-
static const options_entry s_option_entries[];
// cached options
@@ -432,8 +437,6 @@ private:
bool m_joystick_contradictory;
bool m_sleep;
bool m_refresh_speed;
- int m_slot_options;
- int m_device_options;
};
diff --git a/src/emu/info.cpp b/src/emu/info.cpp
index 7f64e85b596..9169796f04d 100644
--- a/src/emu/info.cpp
+++ b/src/emu/info.cpp
@@ -184,7 +184,7 @@ info_xml_creator::info_xml_creator(driver_enumerator &drivlist)
m_drivlist(drivlist),
m_lookup_options(m_drivlist.options())
{
- m_lookup_options.remove_device_options();
+ mame_options::remove_device_options(m_lookup_options);
}
diff --git a/src/emu/mame.cpp b/src/emu/mame.cpp
index 3c4b35df058..3ba16963bb7 100644
--- a/src/emu/mame.cpp
+++ b/src/emu/mame.cpp
@@ -259,7 +259,7 @@ int machine_manager::execute()
{
m_options.revert(OPTION_PRIORITY_INI);
std::string errors;
- m_options.parse_standard_inis(errors);
+ mame_options::parse_standard_inis(m_options,errors);
}
// otherwise, perform validity checks before anything else
@@ -286,12 +286,12 @@ int machine_manager::execute()
if (m_new_driver_pending)
{
// set up new system name and adjust device options accordingly
- m_options.set_system_name(m_new_driver_pending->name);
+ mame_options::set_system_name(m_options,m_new_driver_pending->name);
firstrun = true;
}
else
{
- if (machine.exit_pending()) m_options.set_system_name("");
+ if (machine.exit_pending()) mame_options::set_system_name(m_options,"");
}
if (machine.exit_pending() && (!started_empty || (system == &GAME_NAME(___empty))))
diff --git a/src/emu/ui/miscmenu.cpp b/src/emu/ui/miscmenu.cpp
index 518c834535e..4a000595de4 100644
--- a/src/emu/ui/miscmenu.cpp
+++ b/src/emu/ui/miscmenu.cpp
@@ -693,7 +693,7 @@ ui_menu_machine_configure::ui_menu_machine_configure(running_machine &machine, r
{
// parse the INI file
std::string error;
- m_opts.parse_standard_inis(error, m_drv);
+ mame_options::parse_standard_inis(m_opts,error, m_drv);
setup_bios();
}
diff --git a/src/emu/ui/slotopt.cpp b/src/emu/ui/slotopt.cpp
index b676778b07e..470647ea063 100644
--- a/src/emu/ui/slotopt.cpp
+++ b/src/emu/ui/slotopt.cpp
@@ -188,7 +188,7 @@ void ui_menu_slot_devices::handle()
{
if ((FPTR)menu_event->itemref == 1 && menu_event->iptkey == IPT_UI_SELECT)
{
- machine().options().add_slot_options();
+ mame_options::add_slot_options(machine().options());
machine().schedule_hard_reset();
}
else if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT)