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.
This commit is contained in:
Miodrag Milanovic 2010-07-04 19:16:47 +00:00
parent 79dbd821c0
commit 5cf07785d0
3 changed files with 54 additions and 65 deletions

View File

@ -890,7 +890,7 @@ static int info_listsoftware(core_options *options, const char *gamename)
fprintf(out, "\t<softwarelist name=\"%s\">\n", swlist->list_name[i] ); fprintf(out, "\t<softwarelist name=\"%s\">\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\t<software name=\"%s\"", swinfo->shortname ); fprintf( out, "\t\t<software name=\"%s\"", swinfo->shortname );
if ( swinfo->parentname != NULL ) 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 ); 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 ) ) 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 ); softlist_match_roms( options, hash, length, found );
} }

View File

@ -38,21 +38,14 @@ typedef struct _parse_state
} parse_state; } parse_state;
struct software_info_list
{
software_info info;
struct software_info_list *next;
};
struct _software_list struct _software_list
{ {
mame_file *file; mame_file *file;
object_pool *pool; object_pool *pool;
parse_state state; parse_state state;
const char *description; const char *description;
struct software_info_list *software_info_list; struct software_info *software_info_list;
struct software_info_list *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 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 ) if ( !elem )
return; return;
/* Clear element and add element to list */ /* 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 */ /* 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; return;
strcpy( (char *)elem->info.shortname, name ); strcpy( (char *)elem->shortname, name );
/* Allocate space to hold the parentname and copy the parent name */ /* Allocate space to hold the parentname and copy the parent name */
if (parent) if (parent)
{ {
elem->info.parentname = (const char*)pool_malloc_lib(swlist->pool, ( strlen(parent) + 1 ) * sizeof(char) ); elem->parentname = (const char*)pool_malloc_lib(swlist->pool, ( strlen(parent) + 1 ) * sizeof(char) );
strcpy((char *)elem->info.parentname, parent); strcpy((char *)elem->parentname, parent);
} }
/* Allocate initial space to hold part information */ /* Allocate initial space to hold part information */
swlist->part_entries = 2; swlist->part_entries = 2;
swlist->current_part_entry = 0; swlist->current_part_entry = 0;
elem->info.partdata = (software_part *)pool_malloc_lib(swlist->pool, swlist->part_entries * sizeof(software_part) ); elem->partdata = (software_part *)pool_malloc_lib(swlist->pool, swlist->part_entries * sizeof(software_part) );
if ( !elem->info.partdata ) if ( !elem->partdata )
return; return;
/* Handle the supported flag */ /* Handle the supported flag */
elem->info.supported = SOFTWARE_SUPPORTED_YES; elem->supported = SOFTWARE_SUPPORTED_YES;
if ( supported && ! strcmp( supported, "partial" ) ) if ( supported && ! strcmp( supported, "partial" ) )
elem->info.supported = SOFTWARE_SUPPORTED_PARTIAL; elem->supported = SOFTWARE_SUPPORTED_PARTIAL;
if ( supported && ! strcmp( supported, "no" ) ) 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 */ /* Add the entry to the end of the list */
if ( swlist->software_info_list == NULL ) 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 */ /* Quick lookup for setting software information */
swlist->softinfo = &swlist->current_software_info->info; swlist->softinfo = swlist->current_software_info;
} }
else else
{ {
@ -828,8 +821,11 @@ software_list *software_list_open(core_options *options, const char *listname, i
if (filerr != FILERR_NONE) if (filerr != FILERR_NONE)
goto error; goto error;
// if (is_preload) if (is_preload)
// software_list_parse(swlist, swlist->error_proc, NULL); {
software_list_parse(swlist, swlist->error_proc, NULL);
swlist->current_software_info = NULL;
}
return swlist; return swlist;
@ -859,39 +855,22 @@ void software_list_close(software_list *swlist)
software_list_find 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) if (swlist == NULL)
return NULL; return NULL;
swlist->look_for = software; /* If we haven't read in the xml file yet, then do it now */
software_list_parse( swlist, swlist->error_proc, NULL ); if ( ! swlist->software_info_list )
software_list_parse( swlist, swlist->error_proc, NULL );
return swlist->current_software_info ? &swlist->current_software_info->info : NULL; for ( prev = prev ? prev->next : swlist->software_info_list; prev; prev = prev->next )
}
/*-------------------------------------------------
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 )
{ {
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 ) 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 ) if ( software_info_ptr )
{ {
@ -1035,7 +1014,7 @@ bool load_software_part(device_image_interface *image, const char *path, softwar
if ( software_list_ptr ) 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 ) if ( software_info_ptr )
{ {
@ -1061,7 +1040,7 @@ bool load_software_part(device_image_interface *image, const char *path, softwar
if ( software_list_ptr ) 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 ) if ( software_info_ptr )
{ {
@ -1087,7 +1066,7 @@ bool load_software_part(device_image_interface *image, const char *path, softwar
if ( software_list_ptr ) 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 ) if ( software_info_ptr )
{ {
@ -1207,7 +1186,7 @@ static DEVICE_VALIDITY_CHECK( software_list )
if (list == NULL) if (list == NULL)
return FALSE; 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; const char *s;
int is_clone = 0; int is_clone = 0;
@ -1254,8 +1233,19 @@ static DEVICE_VALIDITY_CHECK( software_list )
} }
if (swinfo->parentname != NULL) if (swinfo->parentname != NULL)
{
is_clone = 1; 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 */ /* 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)) 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) 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)); software_entry_state *entry = (software_entry_state *) ui_menu_pool_alloc(menu, sizeof(*entry));
entry->short_name = ui_menu_pool_strdup(menu, swinfo->shortname); 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) if (list)
{ {
/* todo: fix this */ /* 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); DEFINE_LEGACY_DEVICE(SOFTWARE_LIST, software_list);

View File

@ -48,6 +48,7 @@ struct software_info
const char *publisher; const char *publisher;
UINT32 supported; UINT32 supported;
software_part *partdata; software_part *partdata;
struct software_info *next; /* Used internally */
}; };
@ -56,9 +57,7 @@ typedef struct _software_list software_list;
/* Handling a 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)); 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); 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 *look_for, software_info *prev);
software_info *software_list_find(software_list *swlist, const char *software);
software_info *software_list_next(software_list *swlist);
software_part *software_find_part(software_info *sw, const char *partname, const char *interface_); software_part *software_find_part(software_info *sw, const char *partname, const char *interface_);
software_part *software_part_next(software_part *part); software_part *software_part_next(software_part *part);