Poke into zip files as well to find matches.

This commit is contained in:
Themaister 2013-10-05 18:33:22 +02:00
parent 3d212c1d7c
commit bf0bce64b0
3 changed files with 50 additions and 5 deletions

View File

@ -17,8 +17,13 @@
#include "general.h" #include "general.h"
#include "file.h" #include "file.h"
#include "file_ext.h" #include "file_ext.h"
#include "file_extract.h"
#include "config.def.h" #include "config.def.h"
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
core_info_list_t *core_info_list_new(const char *modules_path) core_info_list_t *core_info_list_new(const char *modules_path)
{ {
struct string_list *contents = dir_list_new(modules_path, EXT_EXECUTABLES, false); struct string_list *contents = dir_list_new(modules_path, EXT_EXECUTABLES, false);
@ -92,7 +97,11 @@ core_info_list_t *core_info_list_new(const char *modules_path)
} }
if (all_ext_len) if (all_ext_len)
{
all_ext_len += strlen("|zip");
core_info_list->all_ext = (char*)calloc(1, all_ext_len); core_info_list->all_ext = (char*)calloc(1, all_ext_len);
}
if (core_info_list->all_ext) if (core_info_list->all_ext)
{ {
for (size_t i = 0; i < core_info_list->count; i++) for (size_t i = 0; i < core_info_list->count; i++)
@ -103,6 +112,7 @@ core_info_list_t *core_info_list_new(const char *modules_path)
strlcat(core_info_list->all_ext, "|", all_ext_len); strlcat(core_info_list->all_ext, "|", all_ext_len);
} }
} }
strlcat(core_info_list->all_ext, "|zip", all_ext_len);
} }
dir_list_free(contents); dir_list_free(contents);
@ -134,6 +144,17 @@ void core_info_list_free(core_info_list_t *core_info_list)
free(core_info_list); free(core_info_list);
} }
bool core_info_does_support_any_file(const core_info_t *core, const struct string_list *list)
{
if (!list || !core || !core->supported_extensions_list)
return false;
for (size_t i = 0; i < list->size; i++)
if (string_list_find_elem_prefix(core->supported_extensions_list, ".", path_get_extension(list->elems[i].data)))
return true;
return false;
}
bool core_info_does_support_file(const core_info_t *core, const char *path) bool core_info_does_support_file(const core_info_t *core, const char *path)
{ {
if (!path || !core || !core->supported_extensions_list) if (!path || !core || !core->supported_extensions_list)
@ -147,13 +168,20 @@ const char *core_info_list_get_all_extensions(core_info_list_t *core_info_list)
return core_info_list->all_ext; return core_info_list->all_ext;
} }
static const char *core_info_tmp_path; // qsort_r() is not in standard C, sadly. // qsort_r() is not in standard C, sadly.
static const char *core_info_tmp_path;
static const struct string_list *core_info_tmp_list;
static int core_info_qsort_cmp(const void *a_, const void *b_) static int core_info_qsort_cmp(const void *a_, const void *b_)
{ {
const core_info_t *a = (const core_info_t*)a_; const core_info_t *a = (const core_info_t*)a_;
const core_info_t *b = (const core_info_t*)b_; const core_info_t *b = (const core_info_t*)b_;
int support_a = core_info_does_support_file(a, core_info_tmp_path);
int support_b = core_info_does_support_file(b, core_info_tmp_path); int support_a = core_info_does_support_any_file(a, core_info_tmp_list) ||
core_info_does_support_file(a, core_info_tmp_path);
int support_b = core_info_does_support_any_file(b, core_info_tmp_list) ||
core_info_does_support_file(b, core_info_tmp_path);
if (support_a != support_b) if (support_a != support_b)
return support_b - support_a; return support_b - support_a;
else else
@ -164,15 +192,30 @@ void core_info_list_get_supported_cores(core_info_list_t *core_info_list, const
const core_info_t **infos, size_t *num_infos) const core_info_t **infos, size_t *num_infos)
{ {
core_info_tmp_path = path; core_info_tmp_path = path;
#ifdef HAVE_ZLIB
struct string_list *list = NULL;
if (!strcasecmp(path_get_extension(path), "zip"))
list = zlib_get_file_list(path);
core_info_tmp_list = list;
#endif
// Let supported core come first in list so we can return a pointer to them.
qsort(core_info_list->list, core_info_list->count, sizeof(core_info_t), core_info_qsort_cmp); qsort(core_info_list->list, core_info_list->count, sizeof(core_info_t), core_info_qsort_cmp);
size_t supported = 0; size_t supported = 0;
for (size_t i = 0; i < core_info_list->count; i++, supported++) for (size_t i = 0; i < core_info_list->count; i++, supported++)
{ {
if (!core_info_does_support_file(&core_info_list->list[i], path)) const core_info_t *core = &core_info_list->list[i];
if (!core_info_does_support_file(core, path) && !core_info_does_support_any_file(core, list))
break; break;
} }
#ifdef HAVE_ZLIB
if (list)
string_list_free(list);
#endif
*infos = core_info_list->list; *infos = core_info_list->list;
*num_infos = supported; *num_infos = supported;
} }

View File

@ -42,6 +42,7 @@ core_info_list_t *core_info_list_new(const char *modules_path);
void core_info_list_free(core_info_list_t *core_info_list); void core_info_list_free(core_info_list_t *core_info_list);
bool core_info_does_support_file(const core_info_t *core, const char *path); bool core_info_does_support_file(const core_info_t *core, const char *path);
bool core_info_does_support_any_file(const core_info_t *core, const struct string_list *list);
// Non-reentrant, does not allocate. Returns pointer to internal state. // Non-reentrant, does not allocate. Returns pointer to internal state.
void core_info_list_get_supported_cores(core_info_list_t *core_info_list, const char *path, void core_info_list_get_supported_cores(core_info_list_t *core_info_list, const char *path,

View File

@ -1441,7 +1441,8 @@ static int rgui_iterate(void *data, unsigned action)
} }
else // Present a selection. else // Present a selection.
{ {
rgui_list_push(rgui->menu_stack, rgui->libretro_dir, RGUI_SETTINGS_DEFERRED_CORE, 0); rgui_list_push(rgui->menu_stack, rgui->libretro_dir, RGUI_SETTINGS_DEFERRED_CORE, rgui->selection_ptr);
rgui->selection_ptr = 0;
rgui->need_refresh = true; rgui->need_refresh = true;
} }
} }