mirror of
https://github.com/holub/mame
synced 2025-05-22 21:58:57 +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)
|
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 ((flags & ROMENTRY_TYPEMASK) == ROMENTRYTYPE_REGION && name!=NULL && part!=NULL) {
|
||||||
if (swlist->current_rom_entry>0) {
|
if (swlist->current_rom_entry>0) {
|
||||||
for (int i=0;i<swlist->current_rom_entry;i++) {
|
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)
|
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;
|
feature_list *new_entry;
|
||||||
|
|
||||||
/* First allocate the 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)
|
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->name = name;
|
||||||
part->interface_ = interface;
|
part->interface_ = interface;
|
||||||
part->featurelist = NULL;
|
part->featurelist = NULL;
|
||||||
part->romdata = 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;
|
software_part *new_parts;
|
||||||
|
|
||||||
swlist->part_entries += 2;
|
swlist->softinfo->part_entries += 2;
|
||||||
new_parts = (software_part *)pool_realloc_lib(swlist->pool, swlist->softinfo->partdata, swlist->part_entries * sizeof(software_part) );
|
new_parts = (software_part *)pool_realloc_lib(swlist->pool, swlist->softinfo->partdata, swlist->softinfo->part_entries * sizeof(software_part) );
|
||||||
|
|
||||||
if ( new_parts )
|
if ( new_parts )
|
||||||
{
|
{
|
||||||
@ -323,7 +323,7 @@ static void add_software_part(software_list *swlist, const char *name, const cha
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Allocation error */
|
/* 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 */
|
/* Allocate initial space to hold part information */
|
||||||
swlist->part_entries = 2;
|
elem->part_entries = 2;
|
||||||
swlist->current_part_entry = 0;
|
elem->current_part_entry = 0;
|
||||||
elem->partdata = (software_part *)pool_malloc_lib(swlist->pool, swlist->part_entries * sizeof(software_part) );
|
elem->partdata = (software_part *)pool_malloc_lib(swlist->pool, elem->part_entries * sizeof(software_part) );
|
||||||
if ( !elem->partdata )
|
if ( !elem->partdata )
|
||||||
return;
|
return;
|
||||||
elem->shared_info = (feature_list *)pool_malloc_lib(swlist->pool, sizeof(feature_list) );
|
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 */
|
/* Allocate initial space to hold the rom information */
|
||||||
swlist->rom_entries = 3;
|
swlist->rom_entries = 3;
|
||||||
swlist->current_rom_entry = 0;
|
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));
|
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->current_part_entry-1].romdata )
|
if ( ! swlist->softinfo->partdata[swlist->softinfo->current_part_entry-1].romdata )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1664,7 +1664,7 @@ bool load_software_part(emu_options &options, device_image_interface *image, con
|
|||||||
if ( software_info_ptr->publisher )
|
if ( software_info_ptr->publisher )
|
||||||
(*sw_info)->publisher = auto_strdup( image->device().machine(), 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;
|
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))
|
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
|
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)
|
// by each part of this software entry (after loading these are stored in partdata->featurelist)
|
||||||
UINT32 supported;
|
UINT32 supported;
|
||||||
|
int part_entries;
|
||||||
|
int current_part_entry;
|
||||||
software_part *partdata;
|
software_part *partdata;
|
||||||
struct software_info *next; // Used internally
|
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;
|
XML_Parser parser;
|
||||||
int done;
|
int done;
|
||||||
@ -78,8 +79,7 @@ struct _parse_state
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef struct _software_list software_list;
|
struct software_list
|
||||||
struct _software_list
|
|
||||||
{
|
{
|
||||||
emu_file *file;
|
emu_file *file;
|
||||||
object_pool *pool;
|
object_pool *pool;
|
||||||
@ -89,16 +89,13 @@ struct _software_list
|
|||||||
struct software_info *current_software_info;
|
struct software_info *current_software_info;
|
||||||
software_info *softinfo;
|
software_info *softinfo;
|
||||||
const char *look_for;
|
const char *look_for;
|
||||||
int part_entries;
|
|
||||||
int current_part_entry;
|
|
||||||
int rom_entries;
|
int rom_entries;
|
||||||
int current_rom_entry;
|
int current_rom_entry;
|
||||||
void (*error_proc)(const char *message);
|
void (*error_proc)(const char *message);
|
||||||
int list_entries;
|
int list_entries;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _software_list_config software_list_config;
|
struct software_list_config
|
||||||
struct _software_list_config
|
|
||||||
{
|
{
|
||||||
char *list_name;
|
char *list_name;
|
||||||
UINT32 list_type;
|
UINT32 list_type;
|
||||||
|
Loading…
Reference in New Issue
Block a user