mirror of
https://github.com/holub/mame
synced 2025-05-22 13:48:55 +03:00
softlist: Fix entry count tracking issue [O. Galibert]
This commit is contained in:
parent
175551c046
commit
6a9a45fe06
@ -175,7 +175,7 @@ static void software_name_split(const char *swlist_swname, char **swlist_name, c
|
||||
|
||||
static void add_rom_entry(software_list *swlist, const char *name, const char *hashdata, UINT32 offset, UINT32 length, UINT32 flags)
|
||||
{
|
||||
software_part *part = &swlist->softinfo->partdata[swlist->current_part_entry-1];
|
||||
software_part *part = &swlist->softinfo->partdata[swlist->softinfo->current_part_entry-1];
|
||||
if ((flags & ROMENTRY_TYPEMASK) == ROMENTRYTYPE_REGION && name!=NULL && part!=NULL) {
|
||||
if (swlist->current_rom_entry>0) {
|
||||
for (int i=0;i<swlist->current_rom_entry;i++) {
|
||||
@ -221,7 +221,7 @@ static void add_rom_entry(software_list *swlist, const char *name, const char *h
|
||||
|
||||
static void add_feature(software_list *swlist, char *feature_name, char *feature_value)
|
||||
{
|
||||
software_part *part = &swlist->softinfo->partdata[swlist->current_part_entry-1];
|
||||
software_part *part = &swlist->softinfo->partdata[swlist->softinfo->current_part_entry-1];
|
||||
feature_list *new_entry;
|
||||
|
||||
/* First allocate the new entry */
|
||||
@ -300,21 +300,21 @@ static void add_info(software_list *swlist, char *feature_name, char *feature_va
|
||||
|
||||
static void add_software_part(software_list *swlist, const char *name, const char *interface)
|
||||
{
|
||||
software_part *part = &swlist->softinfo->partdata[swlist->current_part_entry];
|
||||
software_part *part = &swlist->softinfo->partdata[swlist->softinfo->current_part_entry];
|
||||
|
||||
part->name = name;
|
||||
part->interface_ = interface;
|
||||
part->featurelist = NULL;
|
||||
part->romdata = NULL;
|
||||
|
||||
swlist->current_part_entry += 1;
|
||||
swlist->softinfo->current_part_entry += 1;
|
||||
|
||||
if ( swlist->current_part_entry >= swlist->part_entries )
|
||||
if ( swlist->softinfo->current_part_entry >= swlist->softinfo->part_entries )
|
||||
{
|
||||
software_part *new_parts;
|
||||
|
||||
swlist->part_entries += 2;
|
||||
new_parts = (software_part *)pool_realloc_lib(swlist->pool, swlist->softinfo->partdata, swlist->part_entries * sizeof(software_part) );
|
||||
swlist->softinfo->part_entries += 2;
|
||||
new_parts = (software_part *)pool_realloc_lib(swlist->pool, swlist->softinfo->partdata, swlist->softinfo->part_entries * sizeof(software_part) );
|
||||
|
||||
if ( new_parts )
|
||||
{
|
||||
@ -323,7 +323,7 @@ static void add_software_part(software_list *swlist, const char *name, const cha
|
||||
else
|
||||
{
|
||||
/* Allocation error */
|
||||
swlist->current_part_entry -= 1;
|
||||
swlist->softinfo->current_part_entry -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -416,9 +416,9 @@ static void start_handler(void *data, const char *tagname, const char **attribut
|
||||
}
|
||||
|
||||
/* Allocate initial space to hold part information */
|
||||
swlist->part_entries = 2;
|
||||
swlist->current_part_entry = 0;
|
||||
elem->partdata = (software_part *)pool_malloc_lib(swlist->pool, swlist->part_entries * sizeof(software_part) );
|
||||
elem->part_entries = 2;
|
||||
elem->current_part_entry = 0;
|
||||
elem->partdata = (software_part *)pool_malloc_lib(swlist->pool, elem->part_entries * sizeof(software_part) );
|
||||
if ( !elem->partdata )
|
||||
return;
|
||||
elem->shared_info = (feature_list *)pool_malloc_lib(swlist->pool, sizeof(feature_list) );
|
||||
@ -561,8 +561,8 @@ static void start_handler(void *data, const char *tagname, const char **attribut
|
||||
/* Allocate initial space to hold the rom information */
|
||||
swlist->rom_entries = 3;
|
||||
swlist->current_rom_entry = 0;
|
||||
swlist->softinfo->partdata[swlist->current_part_entry-1].romdata = (struct rom_entry *)pool_malloc_lib(swlist->pool, swlist->rom_entries * sizeof(struct rom_entry));
|
||||
if ( ! swlist->softinfo->partdata[swlist->current_part_entry-1].romdata )
|
||||
swlist->softinfo->partdata[swlist->softinfo->current_part_entry-1].romdata = (struct rom_entry *)pool_malloc_lib(swlist->pool, swlist->rom_entries * sizeof(struct rom_entry));
|
||||
if ( ! swlist->softinfo->partdata[swlist->softinfo->current_part_entry-1].romdata )
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -1664,7 +1664,7 @@ bool load_software_part(emu_options &options, device_image_interface *image, con
|
||||
if ( software_info_ptr->publisher )
|
||||
(*sw_info)->publisher = auto_strdup( image->device().machine(), software_info_ptr->publisher );
|
||||
|
||||
(*sw_info)->partdata = (software_part *)auto_alloc_array_clear(image->device().machine(), UINT8, (software_list_ptr->part_entries + 1)* sizeof(software_part) );
|
||||
(*sw_info)->partdata = (software_part *)auto_alloc_array_clear(image->device().machine(), UINT8, (software_info_ptr->part_entries + 1)* sizeof(software_part) );
|
||||
software_part *new_part = (*sw_info)->partdata;
|
||||
for (software_part *swp = software_find_part(software_info_ptr, NULL, NULL); swp != NULL; swp = software_part_next(swp))
|
||||
{
|
||||
|
@ -49,6 +49,8 @@ struct software_info
|
||||
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
|
||||
};
|
||||
@ -64,8 +66,7 @@ enum softlist_parse_position
|
||||
};
|
||||
|
||||
|
||||
typedef struct _parse_state parse_state;
|
||||
struct _parse_state
|
||||
struct parse_state
|
||||
{
|
||||
XML_Parser parser;
|
||||
int done;
|
||||
@ -78,8 +79,7 @@ struct _parse_state
|
||||
};
|
||||
|
||||
|
||||
typedef struct _software_list software_list;
|
||||
struct _software_list
|
||||
struct software_list
|
||||
{
|
||||
emu_file *file;
|
||||
object_pool *pool;
|
||||
@ -89,16 +89,13 @@ struct _software_list
|
||||
struct software_info *current_software_info;
|
||||
software_info *softinfo;
|
||||
const char *look_for;
|
||||
int part_entries;
|
||||
int current_part_entry;
|
||||
int rom_entries;
|
||||
int current_rom_entry;
|
||||
void (*error_proc)(const char *message);
|
||||
int list_entries;
|
||||
};
|
||||
|
||||
typedef struct _software_list_config software_list_config;
|
||||
struct _software_list_config
|
||||
struct software_list_config
|
||||
{
|
||||
char *list_name;
|
||||
UINT32 list_type;
|
||||
|
Loading…
Reference in New Issue
Block a user