Rewrite file_list_insert - use memmove instead of a malloc and copy (#18097)
* Rewrite file_list_insert - use memmove instead of a malloc and copy * Use INLINE keyword - C89 buildfix
This commit is contained in:
parent
fa2ce70c5b
commit
26b806f860
|
@ -74,58 +74,41 @@ bool file_list_reserve(file_list_t *list, size_t nitems)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Helper function to initialize item_file structure */
|
||||||
|
static INLINE void init_item_file(struct item_file *item,
|
||||||
|
const char *path, const char *label, unsigned type,
|
||||||
|
size_t directory_ptr, size_t entry_idx)
|
||||||
|
{
|
||||||
|
item->path = strdup(path);
|
||||||
|
item->label = strdup(label);
|
||||||
|
item->alt = NULL;
|
||||||
|
item->type = type;
|
||||||
|
item->directory_ptr = directory_ptr;
|
||||||
|
item->entry_idx = entry_idx;
|
||||||
|
item->userdata = NULL;
|
||||||
|
item->actiondata = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
bool file_list_insert(file_list_t *list,
|
bool file_list_insert(file_list_t *list,
|
||||||
const char *path, const char *label,
|
const char *path, const char *label,
|
||||||
unsigned type, size_t directory_ptr,
|
unsigned type, size_t directory_ptr,
|
||||||
size_t entry_idx,
|
size_t entry_idx,
|
||||||
size_t idx)
|
size_t idx)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Expand file list if needed */
|
/* Expand file list if needed */
|
||||||
if (list->size >= list->capacity)
|
if (list->size >= list->capacity)
|
||||||
if (!file_list_reserve(list, list->capacity * 2 + 1))
|
{
|
||||||
|
size_t new_capacity = list->capacity > 0 ? list->capacity * 2 : 1;
|
||||||
|
if (!file_list_reserve(list, new_capacity))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (i = (unsigned)list->size; i > (int)idx; i--)
|
|
||||||
{
|
|
||||||
struct item_file *copy = (struct item_file*)
|
|
||||||
malloc(sizeof(struct item_file));
|
|
||||||
|
|
||||||
if (copy)
|
|
||||||
{
|
|
||||||
copy->path = NULL;
|
|
||||||
copy->label = NULL;
|
|
||||||
copy->alt = NULL;
|
|
||||||
copy->type = 0;
|
|
||||||
copy->directory_ptr = 0;
|
|
||||||
copy->entry_idx = 0;
|
|
||||||
copy->userdata = NULL;
|
|
||||||
copy->actiondata = NULL;
|
|
||||||
|
|
||||||
memcpy(copy, &list->list[i-1], sizeof(struct item_file));
|
|
||||||
|
|
||||||
memcpy(&list->list[i-1], &list->list[i], sizeof(struct item_file));
|
|
||||||
memcpy(&list->list[i], copy, sizeof(struct item_file));
|
|
||||||
|
|
||||||
free(copy);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
list->list[idx].path = NULL;
|
/* Shift elements to the right using memmove */
|
||||||
list->list[idx].label = NULL;
|
if (idx < list->size)
|
||||||
list->list[idx].alt = NULL;
|
memmove(&list->list[idx + 1], &list->list[idx],
|
||||||
list->list[idx].type = type;
|
(list->size - idx) * sizeof(struct item_file));
|
||||||
list->list[idx].directory_ptr = directory_ptr;
|
|
||||||
list->list[idx].entry_idx = entry_idx;
|
|
||||||
list->list[idx].userdata = NULL;
|
|
||||||
list->list[idx].actiondata = NULL;
|
|
||||||
|
|
||||||
if (label)
|
|
||||||
list->list[idx].label = strdup(label);
|
|
||||||
if (path)
|
|
||||||
list->list[idx].path = strdup(path);
|
|
||||||
|
|
||||||
|
init_item_file(&list->list[idx], path, label, type, directory_ptr, entry_idx);
|
||||||
list->size++;
|
list->size++;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue