diff --git a/src/emu/clifront.c b/src/emu/clifront.c index c248873aaae..194b7857b45 100644 --- a/src/emu/clifront.c +++ b/src/emu/clifront.c @@ -1121,6 +1121,12 @@ void cli_frontend::output_single_softlist(FILE *out,software_list *list, const c fprintf( out, "\t\t\t%s\n", xml_normalize_string( swinfo->year ) ); fprintf( out, "\t\t\t%s\n", xml_normalize_string( swinfo->publisher ) ); + feature_list *flist = swinfo->other_info; + while ( flist ) { + fprintf( out, "\t\t\t\n", flist->name, flist->value ); + flist = flist->next; + } + for ( software_part *part = software_find_part( swinfo, NULL, NULL ); part != NULL; part = software_part_next( part ) ) { fprintf( out, "\t\t\tname ); diff --git a/src/emu/softlist.c b/src/emu/softlist.c index 30ca5dc664a..4394d2e6e1d 100644 --- a/src/emu/softlist.c +++ b/src/emu/softlist.c @@ -351,6 +351,46 @@ static void add_info(software_list *swlist, char *feature_name, char *feature_va } } +/*------------------------------------------------- + add_other_info (same as add_info, but its target + is softinfo->other_info) + -------------------------------------------------*/ + +static void add_other_info(software_list *swlist, char *info_name, char *info_value) +{ + software_info *info = swlist->softinfo; + feature_list *new_entry; + + /* First allocate the new entry */ + new_entry = (feature_list *)pool_malloc_lib(swlist->pool, sizeof(feature_list) ); + + if ( new_entry ) + { + new_entry->next = NULL; + new_entry->name = info_name; + new_entry->value = info_value ? info_value : info_name; + + /* Add new feature to end of feature list */ + if ( info->other_info ) + { + feature_list *list = info->other_info; + while ( list->next != NULL ) + { + list = list->next; + } + list->next = new_entry; + } + else + { + info->other_info = new_entry; + } + } + else + { + /* Unable to allocate memory */ + } +} + /*------------------------------------------------- add_software_part -------------------------------------------------*/ @@ -536,8 +576,43 @@ static void start_handler(void *data, const char *tagname, const char **attribut text_dest = (char **) &swlist->softinfo->publisher; else if (!strcmp(tagname, "info")) { - // the "info" field (containing info about actual developers, etc.) is not currently stored. - // full support will be added, but for the moment frontend have to get this info from the xml directly + const char *str_info_name = NULL; + const char *str_info_value = NULL; + for ( ; attributes[0]; attributes += 2 ) + { + if ( !strcmp( attributes[0], "name" ) ) + str_info_name = attributes[1]; + else if ( !strcmp( attributes[0], "value" ) ) + str_info_value = attributes[1]; + else + unknown_attribute(swlist, attributes[0]); + } + + if ( str_info_name && swlist->softinfo ) + { + char *name = (char *)pool_malloc_lib(swlist->pool, ( strlen( str_info_name ) + 1 ) * sizeof(char) ); + char *value = NULL; + + if ( !name ) + return; + + strcpy( name, str_info_name ); + + if ( str_info_value ) + { + value = (char *)pool_malloc_lib(swlist->pool, ( strlen( str_info_value ) + 1 ) * sizeof(char) ); + + if ( !value ) + return; + + strcpy( value, str_info_value ); + + add_other_info( swlist, name, value ); + } + } else { + parse_error(&swlist->state, "%s: Incomplete other_info definition (line %lu)\n", + swlist->file->filename(),XML_GetCurrentLineNumber(swlist->state.parser)); + } } else if (!strcmp(tagname, "sharedfeat")) {