softlist: Fix entry count tracking issue [O. Galibert]

This commit is contained in:
Olivier Galibert 2012-01-08 21:30:50 +00:00
parent 175551c046
commit 6a9a45fe06
2 changed files with 19 additions and 22 deletions

View File

@ -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))
{ {

View File

@ -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;