From 6a9a45fe06e06a6f5c48b0a016b6aebcfbe8beef Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Sun, 8 Jan 2012 21:30:50 +0000 Subject: [PATCH] softlist: Fix entry count tracking issue [O. Galibert] --- src/emu/softlist.c | 28 ++++++++++++++-------------- src/emu/softlist.h | 13 +++++-------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/emu/softlist.c b/src/emu/softlist.c index df6b66e80b3..35b56ad80a8 100644 --- a/src/emu/softlist.c +++ b/src/emu/softlist.c @@ -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;icurrent_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)) { diff --git a/src/emu/softlist.h b/src/emu/softlist.h index 9748342b334..9983bcc68d6 100644 --- a/src/emu/softlist.h +++ b/src/emu/softlist.h @@ -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;