Add file_list_deinitialize - does everything that file_list_free

does except for freeing the passed struct pointer
This commit is contained in:
twinaphex 2020-08-24 01:45:45 +02:00
parent c2a8a0f04e
commit 93fa9a0194
3 changed files with 67 additions and 74 deletions

View File

@ -70,6 +70,8 @@ void *file_list_get_actiondata_at_offset(const file_list_t *list,
*/
void file_list_free(file_list_t *list);
bool file_list_deinitialize(file_list_t *list);
/**
* @brief makes the list big enough to contain at least nitems
*

View File

@ -29,6 +29,32 @@
#include <string/stdstring.h>
#include <compat/strcasestr.h>
static bool file_list_deinitialize_internal(file_list_t *list)
{
size_t i;
for (i = 0; i < list->size; i++)
{
file_list_free_userdata(list, i);
file_list_free_actiondata(list, i);
if (list->list[i].path)
free(list->list[i].path);
list->list[i].path = NULL;
if (list->list[i].label)
free(list->list[i].label);
list->list[i].label = NULL;
if (list->list[i].alt)
free(list->list[i].alt);
list->list[i].alt = NULL;
}
if (list->list)
free(list->list);
list->list = NULL;
return true;
}
bool file_list_reserve(file_list_t *list, size_t nitems)
{
const size_t item_size = sizeof(struct item_file);
@ -182,34 +208,23 @@ void file_list_pop(file_list_t *list, size_t *directory_ptr)
void file_list_free(file_list_t *list)
{
size_t i;
if (!list)
return;
for (i = 0; i < list->size; i++)
{
file_list_free_userdata(list, i);
file_list_free_actiondata(list, i);
if (list->list[i].path)
free(list->list[i].path);
list->list[i].path = NULL;
if (list->list[i].label)
free(list->list[i].label);
list->list[i].label = NULL;
if (list->list[i].alt)
free(list->list[i].alt);
list->list[i].alt = NULL;
}
if (list->list)
free(list->list);
list->list = NULL;
file_list_deinitialize_internal(list);
free(list);
}
bool file_list_deinitialize(file_list_t *list)
{
if (!list)
return false;
if (!file_list_deinitialize_internal(list))
return false;
list->capacity = 0;
list->size = 0;
return true;
}
void file_list_clear(file_list_t *list)
{
size_t i;

View File

@ -267,7 +267,7 @@ typedef struct xmb_handle
char *bg_file_path;
file_list_t *selection_buf_old;
file_list_t *horizontal_list;
file_list_t horizontal_list; /* ptr alignment */
xmb_node_t main_menu_node;
#ifdef HAVE_IMAGEVIEWER
@ -719,9 +719,7 @@ static size_t xmb_list_get_size(void *data, enum menu_list_type type)
case MENU_LIST_PLAIN:
return menu_entries_get_stack_size(0);
case MENU_LIST_HORIZONTAL:
if (xmb && xmb->horizontal_list)
return file_list_get_size(xmb->horizontal_list);
break;
return file_list_get_size(&xmb->horizontal_list);
case MENU_LIST_TABS:
return xmb->system_tab_end;
}
@ -746,10 +744,9 @@ static void *xmb_list_get_entry(void *data,
}
break;
case MENU_LIST_HORIZONTAL:
if (xmb && xmb->horizontal_list)
list_size = file_list_get_size(xmb->horizontal_list);
list_size = file_list_get_size(&xmb->horizontal_list);
if (i < list_size)
return (void*)&xmb->horizontal_list->list[i];
return (void*)&xmb->horizontal_list.list[i];
break;
default:
break;
@ -1683,10 +1680,10 @@ static xmb_node_t *xmb_node_allocate_userdata(
}
tmp = (xmb_node_t*)file_list_get_userdata_at_offset(
xmb->horizontal_list, i);
&xmb->horizontal_list, i);
xmb_free_node(tmp);
file_list_set_userdata(xmb->horizontal_list, i, node);
file_list_set_userdata(&xmb->horizontal_list, i, node);
return node;
}
@ -1695,7 +1692,7 @@ static xmb_node_t* xmb_get_userdata_from_horizontal_list(
xmb_handle_t *xmb, unsigned i)
{
return (xmb_node_t*)
file_list_get_userdata_at_offset(xmb->horizontal_list, i);
file_list_get_userdata_at_offset(&xmb->horizontal_list, i);
}
static void xmb_push_animations(xmb_node_t *node,
@ -1844,7 +1841,7 @@ static void xmb_set_title(xmb_handle_t *xmb)
const char *path = NULL;
menu_entries_get_at_offset(
xmb->horizontal_list,
&xmb->horizontal_list,
xmb->categories_selection_ptr - (xmb->system_tab_end + 1),
&path, NULL, NULL, NULL, NULL);
@ -2057,7 +2054,7 @@ static void xmb_context_destroy_horizontal_list(xmb_handle_t *xmb)
if (!node)
continue;
file_list_get_at_offset(xmb->horizontal_list, i,
file_list_get_at_offset(&xmb->horizontal_list, i,
&path, NULL, NULL, NULL);
if (!path || !string_ends_with_size(path, ".lpl",
@ -2078,9 +2075,9 @@ static void xmb_init_horizontal_list(xmb_handle_t *xmb)
menu_displaylist_info_init(&info);
info.list = xmb->horizontal_list;
info.path = strdup(dir_playlist);
info.label = strdup(
info.list = &xmb->horizontal_list;
info.path = strdup(dir_playlist);
info.label = strdup(
msg_hash_to_str(MENU_ENUM_LABEL_PLAYLISTS_TAB));
info.exts = strdup("lpl");
info.type_default = FILE_TYPE_PLAIN;
@ -2091,7 +2088,7 @@ static void xmb_init_horizontal_list(xmb_handle_t *xmb)
if (menu_displaylist_ctl(DISPLAYLIST_DATABASE_PLAYLISTS_HORIZONTAL, &info))
{
size_t i;
for (i = 0; i < xmb->horizontal_list->size; i++)
for (i = 0; i < xmb->horizontal_list.size; i++)
xmb_node_allocate_userdata(xmb, (unsigned)i);
menu_displaylist_process(&info);
}
@ -2154,7 +2151,7 @@ static void xmb_context_reset_horizontal_list(
continue;
}
file_list_get_at_offset(xmb->horizontal_list, i,
file_list_get_at_offset(&xmb->horizontal_list, i,
&path, NULL, NULL, NULL);
if (!path)
@ -2236,24 +2233,13 @@ static void xmb_context_reset_horizontal_list(
static void xmb_refresh_horizontal_list(xmb_handle_t *xmb)
{
xmb_context_destroy_horizontal_list(xmb);
if (xmb->horizontal_list)
{
xmb_free_list_nodes(xmb->horizontal_list, false);
file_list_free(xmb->horizontal_list);
}
xmb->horizontal_list = NULL;
xmb_free_list_nodes(&xmb->horizontal_list, false);
file_list_deinitialize(&xmb->horizontal_list);
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
xmb->horizontal_list = (file_list_t*)
malloc(sizeof(file_list_t));
xmb->horizontal_list->list = NULL;
xmb->horizontal_list->capacity = 0;
xmb->horizontal_list->size = 0;
if (xmb->horizontal_list)
xmb_init_horizontal_list(xmb);
xmb_init_horizontal_list(xmb);
xmb_context_reset_horizontal_list(xmb);
}
@ -5497,14 +5483,11 @@ static void *xmb_init(void **userdata, bool video_is_threaded)
gfx_display_allocate_white_texture();
xmb->horizontal_list = (file_list_t*)malloc(sizeof(file_list_t));
xmb->horizontal_list.list = NULL;
xmb->horizontal_list.capacity = 0;
xmb->horizontal_list.size = 0;
xmb->horizontal_list->list = NULL;
xmb->horizontal_list->capacity = 0;
xmb->horizontal_list->size = 0;
if (xmb->horizontal_list)
xmb_init_horizontal_list(xmb);
xmb_init_horizontal_list(xmb);
xmb_init_ribbon(xmb);
@ -5540,12 +5523,9 @@ error:
if (xmb->selection_buf_old)
free(xmb->selection_buf_old);
xmb->selection_buf_old = NULL;
if (xmb->horizontal_list)
{
xmb_free_list_nodes(xmb->horizontal_list, false);
file_list_free(xmb->horizontal_list);
}
xmb->horizontal_list = NULL;
xmb_free_list_nodes(&xmb->horizontal_list, false);
file_list_deinitialize(&xmb->horizontal_list);
gfx_animation_unset_update_time_cb();
return NULL;
}
@ -5562,14 +5542,10 @@ static void xmb_free(void *data)
file_list_free(xmb->selection_buf_old);
}
if (xmb->horizontal_list)
{
xmb_free_list_nodes(xmb->horizontal_list, false);
file_list_free(xmb->horizontal_list);
}
xmb_free_list_nodes(&xmb->horizontal_list, false);
file_list_deinitialize(&xmb->horizontal_list);
xmb->selection_buf_old = NULL;
xmb->horizontal_list = NULL;
video_coord_array_free(&xmb->raster_block.carr);
video_coord_array_free(&xmb->raster_block2.carr);