diff --git a/command.c b/command.c index 983bd8aae22..dcc37f7575f 100644 --- a/command.c +++ b/command.c @@ -1901,7 +1901,7 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_LOAD_CORE: { bool success = false; - subsystem_size = 0; + subsystem_current_count = 0; content_clear_subsystem(); success = command_event(CMD_EVENT_LOAD_CORE_PERSIST, NULL); (void)success; @@ -2045,7 +2045,7 @@ bool command_event(enum event_command cmd, void *data) #endif if (is_inited) { - subsystem_size = 0; + subsystem_current_count = 0; content_clear_subsystem(); } } diff --git a/dynamic.c b/dynamic.c index a3092dd8cd6..274d5c61a51 100644 --- a/dynamic.c +++ b/dynamic.c @@ -188,7 +188,7 @@ static bool environ_cb_get_system_info(unsigned cmd, void *data) unsigned size = i; const struct retro_subsystem_info *info = (const struct retro_subsystem_info*)data; - subsystem_size = 0; + subsystem_current_count = 0; RARCH_LOG("Environ SET_SUBSYSTEM_INFO.\n"); for (i = 0; info[i].ident; i++) @@ -207,18 +207,24 @@ static bool environ_cb_get_system_info(unsigned cmd, void *data) } RARCH_LOG("Subsystems: %d\n", i); - size = i; + size = i; + + if (size > SUBSYSTEM_MAX_SUBSYSTEMS) + RARCH_WARN("Subsystems exceed subsystem max, clamping to %d\n", SUBSYSTEM_MAX_SUBSYSTEMS); if (system) { - for (i = 0; i < size; i++) + for (i = 0; i < size && i < SUBSYSTEM_MAX_SUBSYSTEMS; i++) { subsystem_data[i].desc = strdup(info[i].desc); subsystem_data[i].ident = strdup(info[i].ident); subsystem_data[i].id = info[i].id; subsystem_data[i].num_roms = info[i].num_roms; - for (j = 0; j < subsystem_data[i].num_roms; j++) + if (subsystem_data[i].num_roms > SUBSYSTEM_MAX_SUBSYSTEM_ROMS) + RARCH_WARN("Subsystems exceed subsystem max roms, clamping to %d\n", SUBSYSTEM_MAX_SUBSYSTEM_ROMS); + + for (j = 0; j < subsystem_data[i].num_roms && j < SUBSYSTEM_MAX_SUBSYSTEM_ROMS; j++) { subsystem_data_roms[i][j].desc = strdup(info[i].roms[j].desc); subsystem_data_roms[i][j].valid_extensions = strdup(info[i].roms[j].valid_extensions); @@ -229,15 +235,19 @@ static bool environ_cb_get_system_info(unsigned cmd, void *data) subsystem_data[i].roms = subsystem_data_roms[i]; } - for (i = 0; i < size; i++) + + subsystem_current_count = size <= SUBSYSTEM_MAX_SUBSYSTEMS ? size : SUBSYSTEM_MAX_SUBSYSTEMS; +#if 0 + RARCH_LOG("Subsystems: %d\n", subsystem_current_count); + + for (i = 0; i < subsystem_current_count; i++) { -#if 1 RARCH_LOG("Subsystem ID: %d\n", i); RARCH_LOG("Special game type: %s\n", subsystem_data[i].desc); RARCH_LOG(" Ident: %s\n", subsystem_data[i].ident); RARCH_LOG(" ID: %u\n", subsystem_data[i].id); RARCH_LOG(" Content:\n"); -#endif + for (j = 0; j < subsystem_data[i].num_roms; j++) { RARCH_LOG(" %s (%s)\n", @@ -245,9 +255,7 @@ static bool environ_cb_get_system_info(unsigned cmd, void *data) "required" : "optional"); } } - RARCH_LOG("Subsystems: %d\n", subsystem_size); - subsystem_size = size; - RARCH_LOG("Subsystems: %d\n", subsystem_size); +#endif } break; } @@ -1461,7 +1469,6 @@ bool rarch_environment_cb(unsigned cmd, void *data) cb, offsetof(struct retro_hw_render_callback, stencil)); memset(hwr + offsetof(struct retro_hw_render_callback, stencil), 0, sizeof(*cb) - offsetof(struct retro_hw_render_callback, stencil)); - } else memcpy(hwr, cb, sizeof(*cb)); diff --git a/dynamic.h b/dynamic.h index 505082bc97f..79b7d50fff0 100644 --- a/dynamic.h +++ b/dynamic.h @@ -146,9 +146,14 @@ bool init_libretro_sym_custom(enum rarch_core_type type, struct retro_core_t *cu **/ void uninit_libretro_sym(struct retro_core_t *core); -struct retro_subsystem_info subsystem_data[20]; -struct retro_subsystem_rom_info subsystem_data_roms[10][10]; -unsigned subsystem_size; +/* Arbitrary twenty subsystems limite */ +#define SUBSYSTEM_MAX_SUBSYSTEMS 20 +/* Arbitrary 10 roms for each subsystem limit */ +#define SUBSYSTEM_MAX_SUBSYSTEM_ROMS 10 + +struct retro_subsystem_info subsystem_data[SUBSYSTEM_MAX_SUBSYSTEMS]; +struct retro_subsystem_rom_info subsystem_data_roms[SUBSYSTEM_MAX_SUBSYSTEMS][SUBSYSTEM_MAX_SUBSYSTEM_ROMS]; +unsigned subsystem_current_count; RETRO_END_DECLS diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 1079c997cf5..31410d59e0c 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -521,10 +521,11 @@ static int action_bind_sublabel_subsystem_add( char *s, size_t len) { rarch_system_info_t *system = runloop_get_system_info(); - const struct retro_subsystem_info *subsystem = (system && subsystem_size > 0) ? - subsystem_data + (type - MENU_SETTINGS_SUBSYSTEM_ADD) : NULL; + const struct retro_subsystem_info *subsystem = (system && subsystem_current_count > 0) ? + subsystem_data + (type - MENU_SETTINGS_SUBSYSTEM_ADD) : NULL; - if (subsystem_size > 0 && content_get_subsystem_rom_id() < subsystem->num_roms) + /* To-Do: localization & sublabels for pre-init case */ + if (subsystem_current_count > 0 && content_get_subsystem_rom_id() < subsystem->num_roms) snprintf(s, len, " Current Content: %s", content_get_subsystem() == type - MENU_SETTINGS_SUBSYSTEM_ADD ? subsystem->roms[content_get_subsystem_rom_id()].desc diff --git a/menu/drivers/ozone/ozone.c b/menu/drivers/ozone/ozone.c index 909d293a678..4ca662b7fee 100644 --- a/menu/drivers/ozone/ozone.c +++ b/menu/drivers/ozone/ozone.c @@ -596,10 +596,10 @@ static int ozone_list_push(void *data, void *userdata, entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST; menu_displaylist_setting(&entry); - if (subsystem_size > 0) + if (subsystem_current_count > 0) { const struct retro_subsystem_info* subsystem = subsystem_data; - for (i = 0; i < subsystem_size; i++, subsystem++) + for (i = 0; i < subsystem_current_count; i++, subsystem++) { char s[PATH_MAX_LENGTH]; if (content_get_subsystem() == i) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index ea131d53421..cace669d2ea 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -5548,10 +5548,10 @@ static int xmb_list_push(void *data, void *userdata, entry.enum_idx = MENU_ENUM_LABEL_LOAD_CONTENT_LIST; menu_displaylist_setting(&entry); - if (subsystem_size > 0) + if (subsystem_current_count > 0) { const struct retro_subsystem_info* subsystem = subsystem_data; - for (i = 0; i < subsystem_size; i++, subsystem++) + for (i = 0; i < subsystem_current_count; i++, subsystem++) { char s[PATH_MAX_LENGTH]; if (content_get_subsystem() == i) diff --git a/menu/widgets/menu_filebrowser.c b/menu/widgets/menu_filebrowser.c index ee19acefbe8..fbde8101432 100644 --- a/menu/widgets/menu_filebrowser.c +++ b/menu/widgets/menu_filebrowser.c @@ -86,7 +86,7 @@ void filebrowser_parse(menu_displaylist_info_t *info, unsigned type_data) { const struct retro_subsystem_info *subsystem = &subsystem_data[content_get_subsystem()]; - if (subsystem_size > 0) + if (subsystem_current_count > 0) str_list = file_archive_get_file_list(path, subsystem->roms[content_get_subsystem_rom_id()].valid_extensions); } } @@ -96,7 +96,7 @@ void filebrowser_parse(menu_displaylist_info_t *info, unsigned type_data) { const struct retro_subsystem_info *subsystem = &subsystem_data[content_get_subsystem()]; - if (subsystem_size > 0 && content_get_subsystem_rom_id() < subsystem->num_roms) + if (subsystem_current_count > 0 && content_get_subsystem_rom_id() < subsystem->num_roms) str_list = dir_list_new(path, (filter_ext && info) ? subsystem->roms[content_get_subsystem_rom_id()].valid_extensions : NULL, true, settings->bools.show_hidden_files, true, false); diff --git a/tasks/task_content.c b/tasks/task_content.c index 3db8f943b0d..ceb4bbf173e 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -663,7 +663,7 @@ static bool content_file_load( static const struct retro_subsystem_info *content_file_init_subsystem( const struct retro_subsystem_info *subsystem_data, - size_t subsystem_size, + size_t subsystem_current_count, char **error_string, bool *ret) { @@ -671,7 +671,7 @@ retro_subsystem_info *content_file_init_subsystem( char *msg = (char*)malloc(path_size); struct string_list *subsystem = path_get_subsystem_list(); const struct retro_subsystem_info *special = libretro_find_subsystem_info( - subsystem_data, subsystem_size, + subsystem_data, subsystem_current_count, path_get(RARCH_PATH_SUBSYSTEM)); msg[0] = '\0'; @@ -1786,7 +1786,7 @@ void content_set_subsystem(unsigned idx) pending_subsystem_id = idx; - if (subsystem_size > 0) + if (subsystem_current_count > 0) { strlcpy(pending_subsystem_ident, subsystem->ident, sizeof(pending_subsystem_ident));