From 318ac1f6674de4a1a327f0eb36f68cbd62e75105 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 4 Sep 2020 06:29:06 +0200 Subject: [PATCH] (filebrowser_parse) Use non-heap allocated string_list functions --- libretro-common/file/archive_file.c | 41 ++++++++++++++++----- libretro-common/include/file/archive_file.h | 4 ++ menu/menu_displaylist.c | 40 ++++++++++---------- 3 files changed, 57 insertions(+), 28 deletions(-) diff --git a/libretro-common/file/archive_file.c b/libretro-common/file/archive_file.c index 552afc5bc9..bd5fb3ea83 100644 --- a/libretro-common/file/archive_file.c +++ b/libretro-common/file/archive_file.c @@ -438,6 +438,33 @@ end: 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: * @path : filename path of archive @@ -463,18 +490,14 @@ struct string_list *file_archive_get_file_list(const char *path, userdata.dec = NULL; if (!userdata.list) - goto error; - + return NULL; if (!file_archive_walk(path, valid_exts, file_archive_get_file_list_cb, &userdata)) - goto error; - - return userdata.list; - -error: - if (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, diff --git a/libretro-common/include/file/archive_file.h b/libretro-common/include/file/archive_file.h index 7d0987e10d..e22ed67171 100644 --- a/libretro-common/include/file/archive_file.h +++ b/libretro-common/include/file/archive_file.h @@ -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, 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: * @path : filename path of archive diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 32f5777f11..d67e43f36a 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -169,7 +169,8 @@ static void filebrowser_parse( { size_t i, list_size; 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 files_count = 0; unsigned dirs_count = 0; @@ -180,6 +181,9 @@ static void filebrowser_parse( ? path_is_compressed_file(path) : false; rarch_system_info_t *system = runloop_get_system_info(); + if (!string_list_initialize(&str_list)) + return; + /* Core fully loaded, use the subsystem data */ if (system->subsystem.data) subsystem = system->subsystem.data + content_get_subsystem(); @@ -187,6 +191,7 @@ static void filebrowser_parse( else subsystem = subsystem_data + content_get_subsystem(); + if (info) { if (info->type_default == FILE_TYPE_SHADER_PRESET || @@ -201,9 +206,11 @@ static void filebrowser_parse( if (info && path_is_compressed) { 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) - str_list = file_archive_get_file_list(path, + ret = file_archive_get_file_list_noalloc(&str_list, + path, subsystem->roms[ content_get_subsystem_rom_id()].valid_extensions); } @@ -212,15 +219,16 @@ static void filebrowser_parse( if (filebrowser_types == FILEBROWSER_SELECT_FILE_SUBSYSTEM) { 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, true, show_hidden_files, true, false); } 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); else - str_list = dir_list_new(path, + ret = dir_list_initialize(&str_list, path, (filter_ext && info) ? info->exts : NULL, true, show_hidden_files, true, false); } @@ -257,7 +265,7 @@ static void filebrowser_parse( break; } - if (!str_list) + if (!ret) { const char *str = path_is_compressed ? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE) @@ -269,16 +277,11 @@ static void filebrowser_parse( 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) - { - string_list_free(str_list); - str_list = NULL; - } - else + if (list_size > 0) { for (i = 0; i < list_size; i++) { @@ -286,11 +289,11 @@ static void filebrowser_parse( bool is_dir = false; enum msg_hash_enums enum_idx = MSG_UNKNOWN; 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'; - switch (str_list->elems[i].attr.i) + switch (str_list.elems[i].attr.i) { case RARCH_DIRECTORY: file_type = FILE_TYPE_DIRECTORY; @@ -416,8 +419,7 @@ static void filebrowser_parse( } } - if (str_list && str_list->size > 0) - string_list_free(str_list); + string_list_deinitialize(&str_list); if (items_found == 0) {