diff --git a/core_info.c b/core_info.c index d712930891..050848ee55 100644 --- a/core_info.c +++ b/core_info.c @@ -688,6 +688,52 @@ size_t core_info_list_num_info_files(core_info_list_t *core_info_list) return num; } +bool core_info_unsupported_content_path(const char *path) +{ + size_t i; + + if (!core_info_curr_list) + return false; + + for (i = 0; i < core_info_curr_list->count; i++) + { + const core_info_t *info = &core_info_curr_list->list[i]; + + if (string_list_find_elem(info->supported_extensions_list, path_get_extension(path))) + return false; + } + + return true; +} + +bool core_info_database_supports_content_path(const char *database_path, const char *path) +{ + size_t i; + char *database = NULL; + + if (!core_info_curr_list) + return false; + + database = strdup(path_basename(database_path)); + + path_remove_extension(database); + + for (i = 0; i < core_info_curr_list->count; i++) + { + const core_info_t *info = &core_info_curr_list->list[i]; + + if (string_list_find_elem(info->supported_extensions_list, path_get_extension(path))) + if (string_list_find_elem(info->databases_list, database)) + { + free(database); + return true; + } + } + + free(database); + return false; +} + bool core_info_list_get_display_name(core_info_list_t *core_info_list, const char *path, char *s, size_t len) { diff --git a/core_info.h b/core_info.h index a32301cea1..b1f31e3c3b 100644 --- a/core_info.h +++ b/core_info.h @@ -52,7 +52,7 @@ typedef struct char *notes; struct string_list *categories_list; struct string_list *databases_list; - struct string_list *note_list; + struct string_list *note_list; struct string_list *supported_extensions_list; struct string_list *authors_list; struct string_list *permissions_list; @@ -119,6 +119,10 @@ bool core_info_find(core_info_ctx_find_t *info, const char *name); bool core_info_load(core_info_ctx_find_t *info); +bool core_info_database_supports_content_path(const char *database_path, const char *path); + +bool core_info_unsupported_content_path(const char *path); + RETRO_END_DECLS #endif /* CORE_INFO_H_ */ diff --git a/tasks/task_database.c b/tasks/task_database.c index d301fb064c..5989ea55cf 100644 --- a/tasks/task_database.c +++ b/tasks/task_database.c @@ -23,7 +23,6 @@ #include #include #include - #include "tasks_internal.h" #include "../database_info.h" @@ -35,6 +34,7 @@ #include "../playlist.h" #include "../runloop.h" #include "../verbosity.h" +#include "../core_info.h" #ifndef COLLECTION_SIZE #define COLLECTION_SIZE 99999 @@ -206,6 +206,7 @@ static int database_info_list_iterate_new(database_state_handle_t *db_state, const char *query) { const char *new_database = database_info_get_current_name(db_state); + #if 0 RARCH_LOG("Check database [%d/%d] : %s\n", (unsigned)db_state->list_index, (unsigned)db_state->list->size, new_database); @@ -311,6 +312,7 @@ static int database_info_list_iterate_next( static int task_database_iterate_crc_lookup( database_state_handle_t *db_state, database_info_handle_t *db, + const char *name, const char *archive_entry) { @@ -321,6 +323,11 @@ static int task_database_iterate_crc_lookup( if (db_state->entry_index == 0) { char query[50] = {0}; + + if (!core_info_database_supports_content_path(db_state->list->elems[db_state->list_index].data, name) && + !core_info_unsupported_content_path(name)) + return database_info_list_iterate_next(db_state); + snprintf(query, sizeof(query), "{crc:or(b\"%08X\",b\"%08X\")}", swap_if_big32(db_state->crc), swap_if_big32(db_state->archive_crc)); @@ -362,7 +369,10 @@ static int task_database_iterate_crc_lookup( return 1; database_info_list_free(db_state->info); - free(db_state->info); + + if (db_state->info) + free(db_state->info); + return 0; } @@ -373,7 +383,7 @@ static int task_database_iterate_playlist_archive( #ifdef HAVE_COMPRESSION if (db_state->crc != 0) return task_database_iterate_crc_lookup( - db_state, db, db_state->archive_name); + db_state, db, name, db_state->archive_name); db_state->crc = file_archive_get_file_crc32(name); #endif @@ -500,7 +510,7 @@ static int task_database_iterate(database_state_handle_t *db_state, case DATABASE_TYPE_SERIAL_LOOKUP: return task_database_iterate_serial_lookup(db_state, db, name); case DATABASE_TYPE_CRC_LOOKUP: - return task_database_iterate_crc_lookup(db_state, db, NULL); + return task_database_iterate_crc_lookup(db_state, db, name, NULL); case DATABASE_TYPE_NONE: default: break; @@ -561,7 +571,7 @@ static void task_database_handler(retro_task_t *task) task_database_iterate_start(dbinfo, name); break; case DATABASE_STATUS_ITERATE: - if (dbstate && task_database_iterate(dbstate, dbinfo) == 0) + if (task_database_iterate(dbstate, dbinfo) == 0) { dbinfo->status = DATABASE_STATUS_ITERATE_NEXT; dbinfo->type = DATABASE_TYPE_ITERATE;