summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/softlist.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/softlist.h')
-rw-r--r--src/emu/softlist.h279
1 files changed, 161 insertions, 118 deletions
diff --git a/src/emu/softlist.h b/src/emu/softlist.h
index c0d48b6ac88..5a32e67c1c8 100644
--- a/src/emu/softlist.h
+++ b/src/emu/softlist.h
@@ -11,10 +11,14 @@
#include "ui/menu.h"
#include "expat.h"
-#include "pool.h"
+#include "cstrpool.h"
+//**************************************************************************
+// CONSTANTS
+//**************************************************************************
+
#define SOFTWARE_SUPPORTED_YES 0
#define SOFTWARE_SUPPORTED_PARTIAL 1
#define SOFTWARE_SUPPORTED_NO 2
@@ -25,6 +29,12 @@ enum softlist_type
SOFTWARE_LIST_COMPATIBLE_SYSTEM
};
+
+
+//**************************************************************************
+// MACROS
+//**************************************************************************
+
#define MCFG_SOFTWARE_LIST_CONFIG(_list,_list_type) \
software_list_device::static_set_config(*device, _list, _list_type);
@@ -52,10 +62,129 @@ enum softlist_type
MCFG_DEVICE_REMOVE( _tag )
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> feature_list_item
+
+// an item in a list of name/value pairs
+class feature_list_item
+{
+ friend class simple_list<feature_list_item>;
+
+public:
+ // construction/destruction
+ feature_list_item(const char *name = NULL, const char *value = NULL)
+ : m_next(NULL),
+ m_name(name),
+ m_value(value) { }
+
+ // getters
+ feature_list_item *next() const { return m_next; }
+ const char *name() const { return m_name; }
+ const char *value() const { return m_value; }
+
+private:
+ // internal state
+ feature_list_item * m_next;
+ const char * m_name;
+ const char * m_value;
+};
+
+
+// ======================> software_part
+
+// a single part of a software item
+class software_part
+{
+ friend class softlist_parser;
+ friend class simple_list<software_part>;
+
+public:
+ // construction/destruction
+ software_part(software_info &info, const char *name = NULL, const char *interface = NULL);
+
+ // getters
+ software_part *next() const { return m_next; }
+ software_info &info() const { return m_info; }
+ const char *name() const { return m_name; }
+ const char *interface() const { return m_interface; }
+ feature_list_item *featurelist() const { return m_featurelist.first(); }
+ rom_entry *romdata(int index = 0) { return (index < m_romdata.count()) ? &m_romdata[index] : NULL; }
+
+ // helpers
+ bool is_compatible(const software_list_device &swlist) const;
+ bool matches_interface(const char *interface) const;
+ const char *feature(const char *feature_name) const;
+
+private:
+ // internal state
+ software_part * m_next;
+ software_info & m_info;
+ const char * m_name;
+ const char * m_interface;
+ simple_list<feature_list_item> m_featurelist;
+ dynamic_array<rom_entry> m_romdata;
+};
+
+
+// ======================> software_info
+
+// a single software item
+class software_info
+{
+ friend class softlist_parser;
+ friend class simple_list<software_info>;
+
+public:
+ // construction/destruction
+ software_info(software_list_device &list, const char *name, const char *parent, const char *supported);
+
+ // getters
+ software_info *next() const { return m_next; }
+ software_list_device &list() const { return m_list; }
+ const char *shortname() const { return m_shortname; }
+ const char *longname() const { return m_longname; }
+ const char *parentname() const { return m_parentname; }
+ const char *year() const { return m_year; }
+ const char *publisher() const { return m_publisher; }
+ feature_list_item *other_info() const { return m_other_info.first(); }
+ feature_list_item *shared_info() const { return m_shared_info.first(); }
+ UINT32 supported() const { return m_supported; }
+ int num_parts() const { return m_partdata.count(); }
+ software_part *first_part() const { return m_partdata.first(); }
+ software_part *last_part() const { return m_partdata.last(); }
+
+ // additional operations
+ software_part *find_part(const char *partname, const char *interface = NULL);
+ bool has_multiple_parts(const char *interface) const;
+
+private:
+ // internal state
+ software_info * m_next;
+ software_list_device & m_list;
+ UINT32 m_supported;
+ const char * m_shortname;
+ const char * m_longname;
+ const char * m_parentname;
+ const char * m_year; // Copyright year on title screen, actual release dates can be tracked in external resources
+ const char * m_publisher;
+ simple_list<feature_list_item> m_other_info; // Here we store info like developer, serial #, etc. which belong to the software entry as a whole
+ simple_list<feature_list_item> m_shared_info; // Here we store info like TV standard compatibility, or add-on requirements, etc. which get inherited
+ // by each part of this software entry (after loading these are stored in partdata->featurelist)
+ simple_list<software_part> m_partdata;
+};
+
+
// ======================> software_list_device
+// device representing a software list
class software_list_device : public device_t
{
+ friend class softlist_parser;
+
public:
// construction/destruction
software_list_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
@@ -68,22 +197,48 @@ public:
const char *list_name() const { return m_list_name; }
softlist_type list_type() const { return m_list_type; }
const char *filter() const { return m_filter; }
+ const char *filename() { return m_file.filename(); }
- // validation helpers
- static void reset_checked_lists() { s_checked_lists.reset(); }
+ // getters that may trigger a parse
+ const char *description() { if (!m_parsed) parse(); return m_description; }
+ bool valid() { if (!m_parsed) parse(); return m_infolist.count() > 0; }
+ const char *errors_string() { if (!m_parsed) parse(); return m_errors; }
+
+ // operations
+ software_info *find(const char *look_for, software_info *prev = NULL);
+ software_info *first_software_info() { if (!m_parsed) parse(); return m_infolist.first(); }
+ void find_approx_matches(const char *name, int matches, software_info **list, const char *interface);
+ void release();
+
+ // string pool helpers
+ const char *add_string(const char *string) { return m_stringpool.add(string); }
+ bool string_pool_contains(const char *string) { return m_stringpool.contains(string); }
+
+ // static helpers
+ static software_list_device *find_by_name(const machine_config &mconfig, const char *name);
+ static void display_matches(const machine_config &config, const char *interface, const char *name);
protected:
+ // internal helpers
+ void parse();
+ void internal_validity_check(validity_checker &valid) ATTR_COLD;
+
// device-level overrides
virtual void device_start();
virtual void device_validity_check(validity_checker &valid) const ATTR_COLD;
// configuration state
- const char * m_list_name;
+ astring m_list_name;
softlist_type m_list_type;
const char * m_filter;
- // static state
- static tagmap_t<UINT8> s_checked_lists;
+ // internal state
+ bool m_parsed;
+ emu_file m_file;
+ const char * m_description;
+ astring m_errors;
+ simple_list<software_info> m_infolist;
+ const_string_pool m_stringpool;
};
@@ -94,116 +249,4 @@ extern const device_type SOFTWARE_LIST;
typedef device_type_iterator<&device_creator<software_list_device>, software_list_device> software_list_device_iterator;
-
-/*********************************************************************
-
- Internal structures and XML file handling
-
-*********************************************************************/
-
-/* Replace this with list<string>? */
-struct feature_list
-{
- feature_list *next;
- char *name;
- char *value;
-};
-
-struct software_part
-{
- const char *name;
- const char *interface_;
- feature_list *featurelist;
- struct rom_entry *romdata;
-};
-
-
-/* The software info struct holds basic software information. */
-struct software_info
-{
- const char *shortname;
- const char *longname;
- const char *parentname;
- const char *year; // Copyright year on title screen, actual release dates can be tracked in external resources
- const char *publisher;
- feature_list *other_info; // Here we store info like developer, serial #, etc. which belong to the software entry as a whole
- feature_list *shared_info; // Here we store info like TV standard compatibility, or add-on requirements, etc. which get inherited
- // by each part of this software entry (after loading these are stored in partdata->featurelist)
- UINT32 supported;
- int part_entries;
- int current_part_entry;
- software_part *partdata;
- struct software_info *next; // Used internally
-};
-
-
-enum softlist_parse_position
-{
- POS_ROOT,
- POS_MAIN,
- POS_SOFT,
- POS_PART,
- POS_DATA
-};
-
-
-struct parse_state
-{
- XML_Parser parser;
- int done;
-
- void (*error_proc)(const char *message);
- void *param;
-
- enum softlist_parse_position pos;
- char **text_dest;
-};
-
-
-struct software_list
-{
- emu_file *file;
- object_pool *pool;
- parse_state state;
- const char *description;
- struct software_info *software_info_list;
- struct software_info *current_software_info;
- software_info *softinfo;
- const char *look_for;
- int rom_entries;
- int current_rom_entry;
- void (*error_proc)(const char *message);
- int list_entries;
-};
-
-/* Handling a software list */
-software_list *software_list_open(emu_options &options, const char *listname, int is_preload, void (*error_proc)(const char *message));
-void software_list_close(const software_list *swlist);
-software_info *software_list_find(software_list *swlist, const char *look_for, software_info *prev);
-const char *software_list_get_description(const software_list *swlist);
-void software_list_parse(software_list *swlist, void (*error_proc)(const char *message), void *param);
-
-software_part *software_find_part(software_info *sw, const char *partname, const char *interface_);
-software_part *software_part_next(software_part *part);
-
-const software_info *software_list_find(const software_list *swlist, const char *look_for, const software_info *prev);
-const software_part *software_find_part(const software_info *sw, const char *partname, const char *interface_);
-const software_part *software_part_next(const software_part *part);
-
-/* helpers */
-const char *software_get_clone(emu_options &options, char *swlist, const char *swname);
-UINT32 software_get_support(emu_options &options, char *swlist, const char *swname);
-const char *software_part_get_feature(const software_part *part, const char *feature_name);
-void software_name_split(const char *swlist_swname, char **swlist_name, char **swname, char **swpart);
-
-bool load_software_part(emu_options &options, device_image_interface *image, const char *path, software_info **sw_info, software_part **sw_part, char **full_sw_name, char**list_name);
-
-void software_display_matches(const machine_config &config, emu_options &options,const char *interface,const char *swname_bckp);
-
-const char *software_get_default_slot(const machine_config &config, emu_options &options, const device_image_interface *image, const char* default_card_slot);
-
-bool is_software_compatible(const software_part *swpart, const software_list_device *swlist);
-bool swinfo_has_multiple_parts(const software_info *swinfo, const char *interface);
-
-bool softlist_contain_interface(const char *interface, const char *part_interface);
#endif