src/mess/softlist.c
| r8128 | r8129 | |
| 168 | 168 | from the global pool. So they should be global_free'ed |
| 169 | 169 | when they are not used anymore. |
| 170 | 170 | -------------------------------------------------*/ |
| 171 | | static void software_name_split(const char *swlist_swname, char **swlist_name, char **swname, char **swpart ) |
| 171 | static void software_name_split(running_machine* machine, const char *swlist_swname, char **swlist_name, char **swname, char **swpart ) |
| 172 | 172 | { |
| 173 | 173 | const char *split_1st_loc = strchr( swlist_swname, ':' ); |
| 174 | 174 | const char *split_2nd_loc = ( split_1st_loc ) ? strchr( split_1st_loc + 1, ':' ) : NULL; |
| r8128 | r8129 | |
| 182 | 182 | if ( split_2nd_loc ) |
| 183 | 183 | { |
| 184 | 184 | int size = split_1st_loc - swlist_swname; |
| 185 | | *swlist_name = global_alloc_array_clear(char,size+1); |
| 185 | *swlist_name = auto_alloc_array_clear(machine,char,size+1); |
| 186 | 186 | memcpy( *swlist_name, swlist_swname, size ); |
| 187 | 187 | |
| 188 | 188 | size = split_2nd_loc - ( split_1st_loc + 1 ); |
| 189 | | *swname = global_alloc_array_clear(char,size+1); |
| 189 | *swname = auto_alloc_array_clear(machine,char,size+1); |
| 190 | 190 | memcpy( *swname, split_1st_loc + 1, size ); |
| 191 | 191 | |
| 192 | 192 | size = strlen( swlist_swname ) - ( split_2nd_loc + 1 - swlist_swname ); |
| 193 | | *swpart = global_alloc_array_clear(char,size+1); |
| 193 | *swpart = auto_alloc_array_clear(machine,char,size+1); |
| 194 | 194 | memcpy( *swpart, split_2nd_loc + 1, size ); |
| 195 | 195 | } |
| 196 | 196 | else |
| 197 | 197 | { |
| 198 | 198 | int size = split_1st_loc - swlist_swname; |
| 199 | | *swname = global_alloc_array_clear(char,size+1); |
| 199 | *swname = auto_alloc_array_clear(machine,char,size+1); |
| 200 | 200 | memcpy( *swname, swlist_swname, size ); |
| 201 | 201 | |
| 202 | 202 | size = strlen( swlist_swname ) - ( split_1st_loc + 1 - swlist_swname ); |
| 203 | | *swpart = global_alloc_array_clear(char,size+1); |
| 203 | *swpart = auto_alloc_array_clear(machine,char,size+1); |
| 204 | 204 | memcpy( *swpart, split_1st_loc + 1, size ); |
| 205 | 205 | } |
| 206 | 206 | } |
| 207 | 207 | else |
| 208 | 208 | { |
| 209 | | int size = strlen( swlist_swname ); |
| 210 | | *swname = global_alloc_array_clear(char,size+1); |
| 211 | | memcpy( *swname, swlist_swname, size ); |
| 209 | *swname = auto_strdup(machine,swlist_swname); |
| 212 | 210 | } |
| 213 | 211 | } |
| 214 | 212 | |
| r8128 | r8129 | |
| 928 | 926 | *sw_part = NULL; |
| 929 | 927 | |
| 930 | 928 | /* Split full software name into software list name and short software name */ |
| 931 | | software_name_split( path, &swlist_name, &swname, &swpart ); |
| 929 | software_name_split( device->machine, path, &swlist_name, &swname, &swpart ); |
| 932 | 930 | |
| 933 | 931 | interface = device->get_config_string(DEVINFO_STR_INTERFACE); |
| 934 | 932 | |
| r8128 | r8129 | |
| 1043 | 1041 | if ( software_part_ptr ) |
| 1044 | 1042 | { |
| 1045 | 1043 | /* Load the software part */ |
| 1046 | | load_software_part_region( device, (char *)swlist_name, (char *)software_info_ptr->shortname, software_part_ptr->romdata ); |
| 1044 | try { |
| 1045 | load_software_part_region( device, (char *)swlist_name, (char *)software_info_ptr->shortname, software_part_ptr->romdata ); |
| 1046 | } |
| 1047 | catch (emu_fatalerror &fatal) |
| 1048 | { |
| 1049 | software_list_close( software_list_ptr ); |
| 1050 | throw fatal; |
| 1051 | } |
| 1047 | 1052 | |
| 1048 | 1053 | /* Create a copy of the software and part information */ |
| 1049 | 1054 | *sw_info = auto_alloc_clear( device->machine, software_info ); |
| r8128 | r8129 | |
| 1075 | 1080 | software_info_ptr = NULL; |
| 1076 | 1081 | software_list_ptr = NULL; |
| 1077 | 1082 | } |
| 1078 | | global_free( swlist_name ); |
| 1079 | | global_free( swname ); |
| 1080 | | global_free( swpart ); |
| 1083 | auto_free( device->machine, swlist_name ); |
| 1084 | auto_free( device->machine, swname ); |
| 1085 | auto_free( device->machine, swpart ); |
| 1081 | 1086 | |
| 1082 | 1087 | return result; |
| 1083 | 1088 | } |