(filebrowser_parse) Use non-heap allocated string_list functions

This commit is contained in:
twinaphex 2020-09-04 06:29:06 +02:00
parent 5ce53c3c01
commit 318ac1f667
3 changed files with 57 additions and 28 deletions

View File

@ -438,6 +438,33 @@ end:
return ret; return ret;
} }
bool file_archive_get_file_list_noalloc(struct string_list *list,
const char *path,
const char *valid_exts)
{
struct archive_extract_userdata userdata;
strlcpy(userdata.archive_path, path, sizeof(userdata.archive_path));
userdata.current_file_path[0] = '\0';
userdata.first_extracted_file_path = NULL;
userdata.extraction_directory = NULL;
userdata.archive_path_size = 0;
userdata.ext = NULL;
userdata.list = list;
userdata.found_file = false;
userdata.list_only = true;
userdata.crc = 0;
userdata.transfer = NULL;
userdata.dec = NULL;
if (!userdata.list)
return false;
if (!file_archive_walk(path, valid_exts,
file_archive_get_file_list_cb, &userdata))
return false;
return true;
}
/** /**
* file_archive_get_file_list: * file_archive_get_file_list:
* @path : filename path of archive * @path : filename path of archive
@ -463,18 +490,14 @@ struct string_list *file_archive_get_file_list(const char *path,
userdata.dec = NULL; userdata.dec = NULL;
if (!userdata.list) if (!userdata.list)
goto error; return NULL;
if (!file_archive_walk(path, valid_exts, if (!file_archive_walk(path, valid_exts,
file_archive_get_file_list_cb, &userdata)) file_archive_get_file_list_cb, &userdata))
goto error; {
return userdata.list;
error:
if (userdata.list)
string_list_free(userdata.list); string_list_free(userdata.list);
return NULL; return NULL;
}
return userdata.list;
} }
bool file_archive_perform_mode(const char *path, const char *valid_exts, bool file_archive_perform_mode(const char *path, const char *valid_exts,

View File

@ -164,6 +164,10 @@ bool file_archive_extract_file(char *archive_path, size_t archive_path_size,
const char *valid_exts, const char *extraction_dir, const char *valid_exts, const char *extraction_dir,
char *out_path, size_t len); char *out_path, size_t len);
bool file_archive_get_file_list_noalloc(struct string_list *list,
const char *path,
const char *valid_exts);
/** /**
* file_archive_get_file_list: * file_archive_get_file_list:
* @path : filename path of archive * @path : filename path of archive

View File

@ -169,7 +169,8 @@ static void filebrowser_parse(
{ {
size_t i, list_size; size_t i, list_size;
const struct retro_subsystem_info *subsystem; const struct retro_subsystem_info *subsystem;
struct string_list *str_list = NULL; bool ret = false;
struct string_list str_list = {0};
unsigned items_found = 0; unsigned items_found = 0;
unsigned files_count = 0; unsigned files_count = 0;
unsigned dirs_count = 0; unsigned dirs_count = 0;
@ -180,6 +181,9 @@ static void filebrowser_parse(
? path_is_compressed_file(path) : false; ? path_is_compressed_file(path) : false;
rarch_system_info_t *system = runloop_get_system_info(); rarch_system_info_t *system = runloop_get_system_info();
if (!string_list_initialize(&str_list))
return;
/* Core fully loaded, use the subsystem data */ /* Core fully loaded, use the subsystem data */
if (system->subsystem.data) if (system->subsystem.data)
subsystem = system->subsystem.data + content_get_subsystem(); subsystem = system->subsystem.data + content_get_subsystem();
@ -187,6 +191,7 @@ static void filebrowser_parse(
else else
subsystem = subsystem_data + content_get_subsystem(); subsystem = subsystem_data + content_get_subsystem();
if (info) if (info)
{ {
if (info->type_default == FILE_TYPE_SHADER_PRESET || if (info->type_default == FILE_TYPE_SHADER_PRESET ||
@ -201,9 +206,11 @@ static void filebrowser_parse(
if (info && path_is_compressed) if (info && path_is_compressed)
{ {
if (filebrowser_types != FILEBROWSER_SELECT_FILE_SUBSYSTEM) if (filebrowser_types != FILEBROWSER_SELECT_FILE_SUBSYSTEM)
str_list = file_archive_get_file_list(path, info->exts); ret = file_archive_get_file_list_noalloc(&str_list,
path, info->exts);
else if (subsystem && subsystem_current_count > 0) else if (subsystem && subsystem_current_count > 0)
str_list = file_archive_get_file_list(path, ret = file_archive_get_file_list_noalloc(&str_list,
path,
subsystem->roms[ subsystem->roms[
content_get_subsystem_rom_id()].valid_extensions); content_get_subsystem_rom_id()].valid_extensions);
} }
@ -212,15 +219,16 @@ static void filebrowser_parse(
if (filebrowser_types == FILEBROWSER_SELECT_FILE_SUBSYSTEM) if (filebrowser_types == FILEBROWSER_SELECT_FILE_SUBSYSTEM)
{ {
if (subsystem && subsystem_current_count > 0 && content_get_subsystem_rom_id() < subsystem->num_roms) if (subsystem && subsystem_current_count > 0 && content_get_subsystem_rom_id() < subsystem->num_roms)
str_list = dir_list_new(path, ret = dir_list_initialize(&str_list,
path,
(filter_ext && info) ? subsystem->roms[content_get_subsystem_rom_id()].valid_extensions : NULL, (filter_ext && info) ? subsystem->roms[content_get_subsystem_rom_id()].valid_extensions : NULL,
true, show_hidden_files, true, false); true, show_hidden_files, true, false);
} }
else if (info && ((info->type_default == FILE_TYPE_MANUAL_SCAN_DAT) || (info->type_default == FILE_TYPE_SIDELOAD_CORE))) else if (info && ((info->type_default == FILE_TYPE_MANUAL_SCAN_DAT) || (info->type_default == FILE_TYPE_SIDELOAD_CORE)))
str_list = dir_list_new(path, ret = dir_list_initialize(&str_list, path,
info->exts, true, show_hidden_files, false, false); info->exts, true, show_hidden_files, false, false);
else else
str_list = dir_list_new(path, ret = dir_list_initialize(&str_list, path,
(filter_ext && info) ? info->exts : NULL, (filter_ext && info) ? info->exts : NULL,
true, show_hidden_files, true, false); true, show_hidden_files, true, false);
} }
@ -257,7 +265,7 @@ static void filebrowser_parse(
break; break;
} }
if (!str_list) if (!ret)
{ {
const char *str = path_is_compressed const char *str = path_is_compressed
? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE) ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE)
@ -269,16 +277,11 @@ static void filebrowser_parse(
goto end; goto end;
} }
dir_list_sort(str_list, true); dir_list_sort(&str_list, true);
list_size = str_list->size; list_size = str_list.size;
if (list_size == 0) if (list_size > 0)
{
string_list_free(str_list);
str_list = NULL;
}
else
{ {
for (i = 0; i < list_size; i++) for (i = 0; i < list_size; i++)
{ {
@ -286,11 +289,11 @@ static void filebrowser_parse(
bool is_dir = false; bool is_dir = false;
enum msg_hash_enums enum_idx = MSG_UNKNOWN; enum msg_hash_enums enum_idx = MSG_UNKNOWN;
enum msg_file_type file_type = FILE_TYPE_NONE; enum msg_file_type file_type = FILE_TYPE_NONE;
const char *path = str_list->elems[i].data; const char *path = str_list.elems[i].data;
label[0] = '\0'; label[0] = '\0';
switch (str_list->elems[i].attr.i) switch (str_list.elems[i].attr.i)
{ {
case RARCH_DIRECTORY: case RARCH_DIRECTORY:
file_type = FILE_TYPE_DIRECTORY; file_type = FILE_TYPE_DIRECTORY;
@ -416,8 +419,7 @@ static void filebrowser_parse(
} }
} }
if (str_list && str_list->size > 0) string_list_deinitialize(&str_list);
string_list_free(str_list);
if (items_found == 0) if (items_found == 0)
{ {