From 5cf07785d092065b68f70c405f58ada17f6ebb40 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 4 Jul 2010 19:16:47 +0000 Subject: [PATCH] Software list update: [Wilbert Pol] - Software list xml files are now read in full such that information for clone and parent sets is available. - Added validity check to check for existence of parent sets. --- src/emu/clifront.c | 6 +-- src/emu/softlist.c | 108 ++++++++++++++++++++------------------------- src/emu/softlist.h | 5 +-- 3 files changed, 54 insertions(+), 65 deletions(-) diff --git a/src/emu/clifront.c b/src/emu/clifront.c index 583217a6ed7..6ebe5c67654 100644 --- a/src/emu/clifront.c +++ b/src/emu/clifront.c @@ -890,7 +890,7 @@ static int info_listsoftware(core_options *options, const char *gamename) fprintf(out, "\t\n", swlist->list_name[i] ); - for ( software_info *swinfo = software_list_first( list ); swinfo != NULL; swinfo = software_list_next( list ) ) + for ( software_info *swinfo = software_list_find( list, "*", NULL ); swinfo != NULL; swinfo = software_list_find( list, "*", swinfo ) ) { fprintf( out, "\t\tshortname ); if ( swinfo->parentname != NULL ) @@ -1007,7 +1007,7 @@ static void softlist_match_roms(core_options *options, const char *hash, int len { software_list *list = software_list_open( options, swlist->list_name[i], FALSE, NULL ); - for ( software_info *swinfo = software_list_first( list ); swinfo != NULL; swinfo = software_list_next( list ) ) + for ( software_info *swinfo = software_list_find( list, "*", NULL ); swinfo != NULL; swinfo = software_list_find( list, "*", swinfo ) ) { for ( software_part *part = software_find_part( swinfo, NULL, NULL ); part != NULL; part = software_part_next( part ) ) { @@ -1478,4 +1478,4 @@ static void match_roms(core_options *options, const char *hash, int length, int } softlist_match_roms( options, hash, length, found ); -} \ No newline at end of file +} diff --git a/src/emu/softlist.c b/src/emu/softlist.c index 135ec1ef724..abf8f47c18a 100644 --- a/src/emu/softlist.c +++ b/src/emu/softlist.c @@ -38,21 +38,14 @@ typedef struct _parse_state } parse_state; -struct software_info_list -{ - software_info info; - struct software_info_list *next; -}; - - struct _software_list { mame_file *file; object_pool *pool; parse_state state; const char *description; - struct software_info_list *software_info_list; - struct software_info_list *current_software_info; + struct software_info *software_info_list; + struct software_info *current_software_info; software_info *softinfo; const char *look_for; int part_entries; @@ -379,44 +372,44 @@ static void start_handler(void *data, const char *tagname, const char **attribut } } - if ( name && !mame_strwildcmp( swlist->look_for, name ) ) + if ( name ) { - struct software_info_list *elem = (struct software_info_list *)pool_malloc_lib(swlist->pool,sizeof(struct software_info_list)); + struct software_info *elem = (struct software_info *)pool_malloc_lib(swlist->pool,sizeof(struct software_info)); if ( !elem ) return; /* Clear element and add element to list */ - memset(elem,0,sizeof(struct software_info_list)); + memset(elem,0,sizeof(struct software_info)); /* Allocate space to hold the shortname and copy the short name */ - elem->info.shortname = (const char*)pool_malloc_lib(swlist->pool, ( strlen( name ) + 1 ) * sizeof(char) ); + elem->shortname = (const char*)pool_malloc_lib(swlist->pool, ( strlen( name ) + 1 ) * sizeof(char) ); - if ( ! elem->info.shortname ) + if ( ! elem->shortname ) return; - strcpy( (char *)elem->info.shortname, name ); + strcpy( (char *)elem->shortname, name ); /* Allocate space to hold the parentname and copy the parent name */ if (parent) { - elem->info.parentname = (const char*)pool_malloc_lib(swlist->pool, ( strlen(parent) + 1 ) * sizeof(char) ); - strcpy((char *)elem->info.parentname, parent); + elem->parentname = (const char*)pool_malloc_lib(swlist->pool, ( strlen(parent) + 1 ) * sizeof(char) ); + strcpy((char *)elem->parentname, parent); } /* Allocate initial space to hold part information */ swlist->part_entries = 2; swlist->current_part_entry = 0; - elem->info.partdata = (software_part *)pool_malloc_lib(swlist->pool, swlist->part_entries * sizeof(software_part) ); - if ( !elem->info.partdata ) + elem->partdata = (software_part *)pool_malloc_lib(swlist->pool, swlist->part_entries * sizeof(software_part) ); + if ( !elem->partdata ) return; /* Handle the supported flag */ - elem->info.supported = SOFTWARE_SUPPORTED_YES; + elem->supported = SOFTWARE_SUPPORTED_YES; if ( supported && ! strcmp( supported, "partial" ) ) - elem->info.supported = SOFTWARE_SUPPORTED_PARTIAL; + elem->supported = SOFTWARE_SUPPORTED_PARTIAL; if ( supported && ! strcmp( supported, "no" ) ) - elem->info.supported = SOFTWARE_SUPPORTED_NO; + elem->supported = SOFTWARE_SUPPORTED_NO; /* Add the entry to the end of the list */ if ( swlist->software_info_list == NULL ) @@ -431,7 +424,7 @@ static void start_handler(void *data, const char *tagname, const char **attribut } /* Quick lookup for setting software information */ - swlist->softinfo = &swlist->current_software_info->info; + swlist->softinfo = swlist->current_software_info; } else { @@ -828,8 +821,11 @@ software_list *software_list_open(core_options *options, const char *listname, i if (filerr != FILERR_NONE) goto error; -// if (is_preload) -// software_list_parse(swlist, swlist->error_proc, NULL); + if (is_preload) + { + software_list_parse(swlist, swlist->error_proc, NULL); + swlist->current_software_info = NULL; + } return swlist; @@ -859,39 +855,22 @@ void software_list_close(software_list *swlist) software_list_find -------------------------------------------------*/ -software_info *software_list_find(software_list *swlist, const char *software) +software_info *software_list_find(software_list *swlist, const char *look_for, software_info *prev) { if (swlist == NULL) return NULL; - swlist->look_for = software; - software_list_parse( swlist, swlist->error_proc, NULL ); + /* If we haven't read in the xml file yet, then do it now */ + if ( ! swlist->software_info_list ) + software_list_parse( swlist, swlist->error_proc, NULL ); - return swlist->current_software_info ? &swlist->current_software_info->info : NULL; -} - - -/*------------------------------------------------- - software_list_first --------------------------------------------------*/ - -software_info *software_list_first(software_list *swlist) -{ - return software_list_find(swlist, "*"); -} - - -/*------------------------------------------------- - software_list_next --------------------------------------------------*/ - -software_info *software_list_next(software_list *swlist) -{ - if ( swlist->current_software_info ) + for ( prev = prev ? prev->next : swlist->software_info_list; prev; prev = prev->next ) { - swlist->current_software_info = swlist->current_software_info->next; + if ( !mame_strwildcmp( look_for, prev->shortname ) ) + break; } - return swlist->current_software_info ? &swlist->current_software_info->info : NULL; + + return prev; } @@ -1001,7 +980,7 @@ bool load_software_part(device_image_interface *image, const char *path, softwar if ( software_list_ptr ) { - software_info_ptr = software_list_find( software_list_ptr, swname ); + software_info_ptr = software_list_find( software_list_ptr, swname, NULL ); if ( software_info_ptr ) { @@ -1035,7 +1014,7 @@ bool load_software_part(device_image_interface *image, const char *path, softwar if ( software_list_ptr ) { - software_info_ptr = software_list_find( software_list_ptr, swname ); + software_info_ptr = software_list_find( software_list_ptr, swname, NULL ); if ( software_info_ptr ) { @@ -1061,7 +1040,7 @@ bool load_software_part(device_image_interface *image, const char *path, softwar if ( software_list_ptr ) { - software_info_ptr = software_list_find( software_list_ptr, swname ); + software_info_ptr = software_list_find( software_list_ptr, swname, NULL ); if ( software_info_ptr ) { @@ -1087,7 +1066,7 @@ bool load_software_part(device_image_interface *image, const char *path, softwar if ( software_list_ptr ) { - software_info_ptr = software_list_find( software_list_ptr, swname ); + software_info_ptr = software_list_find( software_list_ptr, swname, NULL ); if ( software_info_ptr ) { @@ -1207,7 +1186,7 @@ static DEVICE_VALIDITY_CHECK( software_list ) if (list == NULL) return FALSE; - for (software_info *swinfo = software_list_first(list); swinfo != NULL; swinfo = software_list_next(list)) + for (software_info *swinfo = software_list_find(list, "*", NULL); swinfo != NULL; swinfo = software_list_find(list, "*", swinfo)) { const char *s; int is_clone = 0; @@ -1254,8 +1233,19 @@ static DEVICE_VALIDITY_CHECK( software_list ) } if (swinfo->parentname != NULL) + { is_clone = 1; + /* make sure the parent exists */ + software_info *swinfo2 = software_list_find(list, swinfo->parentname, NULL ); + + if ( !swinfo2 ) + { + mame_printf_error("%s: parent '%s' software for '%s' not found\n", swlist->list_name[i], swinfo->parentname, swinfo->shortname ); + error = TRUE; + } + } + /* make sure the driver name is 8 chars or less */ if ((is_clone && strlen(swinfo->shortname) > NAME_LEN_CLONE) || ((!is_clone) && strlen(swinfo->shortname) > NAME_LEN_PARENT)) { @@ -1340,7 +1330,7 @@ static void ui_mess_menu_populate_software_entries(running_machine *machine, ui_ if (list) { - for (software_info *swinfo = software_list_first(list); swinfo != NULL; swinfo = software_list_next(list)) + for (software_info *swinfo = software_list_find(list, "*", NULL); swinfo != NULL; swinfo = software_list_find(list, "*", swinfo)) { software_entry_state *entry = (software_entry_state *) ui_menu_pool_alloc(menu, sizeof(*entry)); entry->short_name = ui_menu_pool_strdup(menu, swinfo->shortname); @@ -1412,7 +1402,7 @@ static void ui_mess_menu_populate_software_list(running_machine *machine, ui_men if (list) { /* todo: fix this */ - for (software_info *swinfo = software_list_first(list); swinfo != NULL; swinfo = software_list_next(list)) + for (software_info *swinfo = software_list_find(list, "*", NULL); swinfo != NULL; swinfo = software_list_find(list, "*", swinfo)) { } @@ -1445,4 +1435,4 @@ void ui_image_menu_software(running_machine *machine, ui_menu *menu, void *param } } -DEFINE_LEGACY_DEVICE(SOFTWARE_LIST, software_list); \ No newline at end of file +DEFINE_LEGACY_DEVICE(SOFTWARE_LIST, software_list); diff --git a/src/emu/softlist.h b/src/emu/softlist.h index 2fa52347c9e..fc7ebc6305c 100644 --- a/src/emu/softlist.h +++ b/src/emu/softlist.h @@ -48,6 +48,7 @@ struct software_info const char *publisher; UINT32 supported; software_part *partdata; + struct software_info *next; /* Used internally */ }; @@ -56,9 +57,7 @@ typedef struct _software_list software_list; /* Handling a software list */ software_list *software_list_open(core_options *options, const char *listname, int is_preload, void (*error_proc)(const char *message)); void software_list_close(software_list *swlist); -software_info *software_list_first(software_list *swlist); -software_info *software_list_find(software_list *swlist, const char *software); -software_info *software_list_next(software_list *swlist); +software_info *software_list_find(software_list *swlist, const char *look_for, software_info *prev); software_part *software_find_part(software_info *sw, const char *partname, const char *interface_); software_part *software_part_next(software_part *part);