Prefer to use string_split_noalloc

This commit is contained in:
twinaphex 2020-08-26 12:41:57 +02:00
parent e67cdb39ae
commit 01e5ec94bb
6 changed files with 164 additions and 181 deletions

View File

@ -312,36 +312,33 @@ bool core_updater_list_get_core(
static bool core_updater_list_set_date( static bool core_updater_list_set_date(
core_updater_list_entry_t *entry, const char *date_str) core_updater_list_entry_t *entry, const char *date_str)
{ {
struct string_list *date_list = NULL; struct string_list date_list = {0};
if (!entry || string_is_empty(date_str)) if (!entry || string_is_empty(date_str))
goto error; goto error;
/* Split date string into component values */ /* Split date string into component values */
date_list = string_split(date_str, "-"); string_list_initialize(&date_list);
if (!string_split_noalloc(&date_list, date_str, "-"))
if (!date_list) goto error;
goto error;
/* Date string must have 3 values: /* Date string must have 3 values:
* [year] [month] [day] */ * [year] [month] [day] */
if (date_list->size < 3) if (date_list.size < 3)
goto error; goto error;
/* Convert date string values */ /* Convert date string values */
entry->date.year = string_to_unsigned(date_list->elems[0].data); entry->date.year = string_to_unsigned(date_list.elems[0].data);
entry->date.month = string_to_unsigned(date_list->elems[1].data); entry->date.month = string_to_unsigned(date_list.elems[1].data);
entry->date.day = string_to_unsigned(date_list->elems[2].data); entry->date.day = string_to_unsigned(date_list.elems[2].data);
/* Clean up */ /* Clean up */
string_list_free(date_list); string_list_deinitialize(&date_list);
return true; return true;
error: error:
string_list_deinitialize(&date_list);
if (date_list)
string_list_free(date_list);
return false; return false;
} }
@ -758,10 +755,9 @@ bool core_updater_list_parse_network_data(
const char *network_buildbot_url, const char *network_buildbot_url,
const char *data, size_t len) const char *data, size_t len)
{ {
struct string_list *network_core_list = NULL;
struct string_list *network_core_entry_list = NULL;
char *data_buf = NULL;
size_t i; size_t i;
char *data_buf = NULL;
struct string_list network_core_list = {0};
/* Sanity check */ /* Sanity check */
if (!core_list || string_is_empty(data) || (len < 1)) if (!core_list || string_is_empty(data) || (len < 1))
@ -782,12 +778,11 @@ bool core_updater_list_parse_network_data(
data_buf[len] = '\0'; data_buf[len] = '\0';
/* Split network listing request into lines */ /* Split network listing request into lines */
network_core_list = string_split(data_buf, "\n"); string_list_initialize(&network_core_list);
if (!string_split_noalloc(&network_core_list, data_buf, "\n"))
if (!network_core_list)
goto error; goto error;
if (network_core_list->size < 1) if (network_core_list.size < 1)
goto error; goto error;
/* Temporary data buffer is no longer required */ /* Temporary data buffer is no longer required */
@ -795,15 +790,17 @@ bool core_updater_list_parse_network_data(
data_buf = NULL; data_buf = NULL;
/* Loop over lines */ /* Loop over lines */
for (i = 0; i < network_core_list->size; i++) for (i = 0; i < network_core_list.size; i++)
{ {
const char *line = network_core_list->elems[i].data; struct string_list network_core_entry_list = {0};
const char *line = network_core_list.elems[i].data;
if (string_is_empty(line)) if (string_is_empty(line))
continue; continue;
string_list_initialize(&network_core_entry_list);
/* Split line into listings info components */ /* Split line into listings info components */
network_core_entry_list = string_split(line, " "); string_split_noalloc(&network_core_entry_list, line, " ");
/* Parse listings info and add to core updater /* Parse listings info and add to core updater
* list */ * list */
@ -812,11 +809,10 @@ bool core_updater_list_parse_network_data(
path_dir_libretro, path_dir_libretro,
path_libretro_info, path_libretro_info,
network_buildbot_url, network_buildbot_url,
network_core_entry_list); &network_core_entry_list);
/* Clean up */ /* Clean up */
string_list_free(network_core_entry_list); string_list_deinitialize(&network_core_entry_list);
network_core_entry_list = NULL;
} }
/* Sanity check */ /* Sanity check */
@ -824,7 +820,7 @@ bool core_updater_list_parse_network_data(
goto error; goto error;
/* Clean up */ /* Clean up */
string_list_free(network_core_list); string_list_deinitialize(&network_core_list);
/* Sort completed list */ /* Sort completed list */
core_updater_list_qsort(core_list); core_updater_list_qsort(core_list);
@ -832,12 +828,7 @@ bool core_updater_list_parse_network_data(
return true; return true;
error: error:
string_list_deinitialize(&network_core_list);
if (network_core_list)
string_list_free(network_core_list);
if (network_core_entry_list)
string_list_free(network_core_entry_list);
if (data_buf) if (data_buf)
free(data_buf); free(data_buf);

View File

@ -329,14 +329,18 @@ static int deferred_push_cursor_manager_list_generic(
char query[PATH_MAX_LENGTH]; char query[PATH_MAX_LENGTH];
int ret = -1; int ret = -1;
const char *path = info->path; const char *path = info->path;
struct string_list *str_list = path ? string_split(path, "|") : NULL; struct string_list str_list = {0};
if (!str_list) if (!path)
goto end; goto end;
string_list_initialize(&str_list);
string_split_noalloc(&str_list, path, "|");
query[0] = '\0'; query[0] = '\0';
database_info_build_query_enum(query, sizeof(query), type, str_list->elems[0].data); database_info_build_query_enum(query, sizeof(query), type,
str_list.elems[0].data);
if (string_is_empty(query)) if (string_is_empty(query))
goto end; goto end;
@ -348,14 +352,14 @@ static int deferred_push_cursor_manager_list_generic(
if (!string_is_empty(info->path)) if (!string_is_empty(info->path))
free(info->path); free(info->path);
info->path = strdup(str_list->elems[1].data); info->path = strdup(str_list.elems[1].data);
info->path_b = strdup(str_list->elems[0].data); info->path_b = strdup(str_list.elems[0].data);
info->path_c = strdup(query); info->path_c = strdup(query);
ret = deferred_push_dlist(info, DISPLAYLIST_DATABASE_QUERY); ret = deferred_push_dlist(info, DISPLAYLIST_DATABASE_QUERY);
end: end:
string_list_free(str_list); string_list_deinitialize(&str_list);
return ret; return ret;
} }
@ -375,43 +379,6 @@ GENERIC_DEFERRED_CURSOR_MANAGER(deferred_push_cursor_manager_list_deferred_query
GENERIC_DEFERRED_CURSOR_MANAGER(deferred_push_cursor_manager_list_deferred_query_rdb_entry_origin, DATABASE_QUERY_ENTRY_ORIGIN) GENERIC_DEFERRED_CURSOR_MANAGER(deferred_push_cursor_manager_list_deferred_query_rdb_entry_origin, DATABASE_QUERY_ENTRY_ORIGIN)
GENERIC_DEFERRED_CURSOR_MANAGER(deferred_push_cursor_manager_list_deferred_query_rdb_entry_releasemonth, DATABASE_QUERY_ENTRY_RELEASEDATE_MONTH) GENERIC_DEFERRED_CURSOR_MANAGER(deferred_push_cursor_manager_list_deferred_query_rdb_entry_releasemonth, DATABASE_QUERY_ENTRY_RELEASEDATE_MONTH)
GENERIC_DEFERRED_CURSOR_MANAGER(deferred_push_cursor_manager_list_deferred_query_rdb_entry_releaseyear, DATABASE_QUERY_ENTRY_RELEASEDATE_YEAR) GENERIC_DEFERRED_CURSOR_MANAGER(deferred_push_cursor_manager_list_deferred_query_rdb_entry_releaseyear, DATABASE_QUERY_ENTRY_RELEASEDATE_YEAR)
#endif
#if 0
static int deferred_push_cursor_manager_list_deferred_query_subsearch(
menu_displaylist_info_t *info)
{
int ret = -1;
#ifdef HAVE_LIBRETRODB
char query[PATH_MAX_LENGTH];
struct string_list *str_list = string_split(info->path, "|");
query[0] = '\0';
database_info_build_query(query, sizeof(query),
info->label, str_list->elems[0].data);
if (string_is_empty(query))
goto end;
if (!string_is_empty(info->path))
free(info->path);
if (!string_is_empty(info->path_b))
free(info->path_b);
if (!string_is_empty(info->path_c))
free(info->path_c);
info->path = strdup(str_list->elems[1].data);
info->path_b = strdup(str_list->elems[0].data);
info->path_c = strdup(query);
ret = deferred_push_dlist(info, DISPLAYLIST_DATABASE_QUERY);
end:
string_list_free(str_list);
#endif
return ret;
}
#endif #endif
static int general_push(menu_displaylist_info_t *info, static int general_push(menu_displaylist_info_t *info,

View File

@ -4370,9 +4370,12 @@ static int action_ok_download_generic(const char *path,
break; break;
case MENU_ENUM_LABEL_CB_CORE_CONTENT_DOWNLOAD: case MENU_ENUM_LABEL_CB_CORE_CONTENT_DOWNLOAD:
{ {
struct string_list *str_list = string_split(menu_label, ";"); struct string_list str_list = {0};
strlcpy(s, str_list->elems[0].data, sizeof(s));
string_list_free(str_list); string_list_initialize(&str_list);
if (string_split_noalloc(&str_list, menu_label, ";"))
strlcpy(s, str_list.elems[0].data, sizeof(s));
string_list_deinitialize(&str_list);
} }
break; break;
case MENU_ENUM_LABEL_CB_LAKKA_DOWNLOAD: case MENU_ENUM_LABEL_CB_LAKKA_DOWNLOAD:
@ -4927,22 +4930,19 @@ static int action_ok_rdb_entry_submenu(const char *path,
int ret = -1; int ret = -1;
char *rdb = NULL; char *rdb = NULL;
int len = 0; int len = 0;
struct string_list *str_list = NULL; struct string_list str_list = {0};
struct string_list *str_list2 = NULL; struct string_list str_list2 = {0};
if (!label) if (!label)
return menu_cbs_exit(); return menu_cbs_exit();
new_label[0] = new_path[0] = '\0'; new_label[0] = new_path[0] = '\0';
str_list = string_split(label, "|"); string_list_initialize(&str_list);
if (!string_split_noalloc(&str_list, label, "|"))
if (!str_list)
goto end; goto end;
str_list2 = string_list_new(); string_list_initialize(&str_list2);
if (!str_list2)
goto end;
/* element 0 : label /* element 0 : label
* element 1 : value * element 1 : value
@ -4951,23 +4951,23 @@ static int action_ok_rdb_entry_submenu(const char *path,
attr.i = 0; attr.i = 0;
len += strlen(str_list->elems[1].data) + 1; len += strlen(str_list.elems[1].data) + 1;
string_list_append(str_list2, str_list->elems[1].data, attr); string_list_append(&str_list2, str_list.elems[1].data, attr);
len += strlen(str_list->elems[2].data) + 1; len += strlen(str_list.elems[2].data) + 1;
string_list_append(str_list2, str_list->elems[2].data, attr); string_list_append(&str_list2, str_list.elems[2].data, attr);
rdb = (char*)calloc(len, sizeof(char)); rdb = (char*)calloc(len, sizeof(char));
if (!rdb) if (!rdb)
goto end; goto end;
string_list_join_concat(rdb, len, str_list2, "|"); string_list_join_concat(rdb, len, &str_list2, "|");
strlcpy(new_path, rdb, sizeof(new_path)); strlcpy(new_path, rdb, sizeof(new_path));
fill_pathname_join_delim(new_label, fill_pathname_join_delim(new_label,
msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_CURSOR_MANAGER_LIST), msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_CURSOR_MANAGER_LIST),
str_list->elems[0].data, '_', str_list.elems[0].data, '_',
sizeof(new_label)); sizeof(new_label));
ret = generic_action_ok_displaylist_push(new_path, NULL, ret = generic_action_ok_displaylist_push(new_path, NULL,
@ -4977,10 +4977,8 @@ static int action_ok_rdb_entry_submenu(const char *path,
end: end:
if (rdb) if (rdb)
free(rdb); free(rdb);
if (str_list) string_list_deinitialize(&str_list);
string_list_free(str_list); string_list_deinitialize(&str_list2);
if (str_list2)
string_list_free(str_list2);
return ret; return ret;
} }

View File

@ -1172,15 +1172,19 @@ static int action_bind_sublabel_netplay_room(
{ {
char buf[4096]; char buf[4096];
unsigned i = 0; unsigned i = 0;
struct string_list *list = string_split(gamename, "|"); struct string_list list = {0};
string_list_initialize(&list);
string_split_noalloc(&list, gamename, "|");
buf[0] = '\0'; buf[0] = '\0';
for (i = 0; i < list->size; i++)
for (i = 0; i < list.size; i++)
{ {
strlcat(buf, " ", sizeof(buf)); strlcat(buf, " ", sizeof(buf));
strlcat(buf, list->elems[i].data, sizeof(buf)); strlcat(buf, list.elems[i].data, sizeof(buf));
/* Never terminate a UI string with a newline */ /* Never terminate a UI string with a newline */
if (i != list->size - 1) if (i != list.size - 1)
strlcat(buf, "\n", sizeof(buf)); strlcat(buf, "\n", sizeof(buf));
} }
snprintf(s, len, snprintf(s, len,
@ -1192,7 +1196,7 @@ static int action_bind_sublabel_netplay_room(
corename, core_ver, subsystem, corename, core_ver, subsystem,
!string_is_equal(gamename, na) ? buf : na !string_is_equal(gamename, na) ? buf : na
); );
string_list_free(list); string_list_deinitialize(&list);
} }
else else
{ {

View File

@ -189,10 +189,13 @@ static int action_get_title_dropdown_item(
if (string_starts_with_size(path, "core_option_", STRLEN_CONST("core_option_"))) if (string_starts_with_size(path, "core_option_", STRLEN_CONST("core_option_")))
{ {
/* This is a core options item */ /* This is a core options item */
struct string_list *tmp_str_list = string_split(path, "_"); struct string_list tmp_str_list = {0};
int ret = 0; int ret = 0;
if (tmp_str_list && tmp_str_list->size > 0) string_list_initialize(&tmp_str_list);
string_split_noalloc(&tmp_str_list, path, "_");
if (tmp_str_list.size > 0)
{ {
core_option_manager_t *coreopts = NULL; core_option_manager_t *coreopts = NULL;
@ -201,7 +204,8 @@ static int action_get_title_dropdown_item(
if (coreopts) if (coreopts)
{ {
unsigned i; unsigned i;
unsigned menu_index = string_to_unsigned(tmp_str_list->elems[(unsigned)tmp_str_list->size - 1].data); unsigned menu_index = string_to_unsigned(
tmp_str_list.elems[(unsigned)tmp_str_list.size - 1].data);
unsigned visible_index = 0; unsigned visible_index = 0;
unsigned option_index = 0; unsigned option_index = 0;
bool option_found = false; bool option_found = false;
@ -242,8 +246,7 @@ static int action_get_title_dropdown_item(
} }
/* Clean up */ /* Clean up */
if (tmp_str_list) string_list_deinitialize(&tmp_str_list);
string_list_free(tmp_str_list);
return ret; return ret;
} }
@ -795,20 +798,20 @@ static int action_get_title_group_settings(const char *path, const char *label,
{ {
char elem0[255]; char elem0[255];
char elem1[255]; char elem1[255];
struct string_list *list_label = string_split(label, "|"); struct string_list list_label = {0};
elem0[0] = elem1[0] = '\0'; elem0[0] = elem1[0] = '\0';
if (list_label) string_list_initialize(&list_label);
string_split_noalloc(&list_label, label, "|");
if (list_label.size > 0)
{ {
if (list_label->size > 0) strlcpy(elem0, list_label.elems[0].data, sizeof(elem0));
{ if (list_label.size > 1)
strlcpy(elem0, list_label->elems[0].data, sizeof(elem0)); strlcpy(elem1, list_label.elems[1].data, sizeof(elem1));
if (list_label->size > 1)
strlcpy(elem1, list_label->elems[1].data, sizeof(elem1));
}
string_list_free(list_label);
} }
string_list_deinitialize(&list_label);
strlcpy(s, elem0, len); strlcpy(s, elem0, len);
@ -822,7 +825,8 @@ static int action_get_title_group_settings(const char *path, const char *label,
return 0; return 0;
} }
static int action_get_title_input_binds_list(const char *path, const char *label, static int action_get_title_input_binds_list(
const char *path, const char *label,
unsigned menu_type, char *s, size_t len) unsigned menu_type, char *s, size_t len)
{ {
unsigned val = (((unsigned)path[0]) - 49) + 1; unsigned val = (((unsigned)path[0]) - 49) + 1;

View File

@ -1764,45 +1764,46 @@ static int menu_displaylist_parse_database_entry(menu_handle_t *menu,
for (j = 0; j < playlist_size(playlist); j++) for (j = 0; j < playlist_size(playlist); j++)
{ {
const struct playlist_entry *entry = NULL; const struct playlist_entry *entry = NULL;
bool match_found = false; bool match_found = false;
struct string_list *tmp_str_list = NULL;
playlist_get_index(playlist, j, &entry); playlist_get_index(playlist, j, &entry);
if (entry->crc32) if (entry->crc32)
tmp_str_list = string_split(entry->crc32, "|");
if (!tmp_str_list)
continue;
if (tmp_str_list->size > 0)
{ {
if (tmp_str_list->size > 1) struct string_list tmp_str_list = {0};
{
const char *elem0 = tmp_str_list->elems[0].data;
const char *elem1 = tmp_str_list->elems[1].data;
switch (extension_to_file_hash_type(elem1)) string_list_initialize(&tmp_str_list);
string_split_noalloc(&tmp_str_list, entry->crc32, "|");
if (tmp_str_list.size > 0)
{
if (tmp_str_list.size > 1)
{ {
case FILE_TYPE_CRC: const char *elem0 = tmp_str_list.elems[0].data;
if (string_is_equal(crc_str, elem0)) const char *elem1 = tmp_str_list.elems[1].data;
match_found = true;
break; switch (extension_to_file_hash_type(elem1))
case FILE_TYPE_SHA1: {
if (string_is_equal(db_info_entry->sha1, elem0)) case FILE_TYPE_CRC:
match_found = true; if (string_is_equal(crc_str, elem0))
break; match_found = true;
case FILE_TYPE_MD5: break;
if (string_is_equal(db_info_entry->md5, elem0)) case FILE_TYPE_SHA1:
match_found = true; if (string_is_equal(db_info_entry->sha1, elem0))
break; match_found = true;
default: break;
break; case FILE_TYPE_MD5:
if (string_is_equal(db_info_entry->md5, elem0))
match_found = true;
break;
default:
break;
}
} }
} }
}
string_list_free(tmp_str_list); string_list_deinitialize(&tmp_str_list);
}
if (!match_found) if (!match_found)
continue; continue;
@ -9904,14 +9905,17 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
{ {
#ifdef HAVE_NETWORKING #ifdef HAVE_NETWORKING
char new_label[PATH_MAX_LENGTH]; char new_label[PATH_MAX_LENGTH];
struct string_list *str_list = string_split(info->path, ";"); struct string_list str_list = {0};
new_label[0] = '\0'; new_label[0] = '\0';
if (str_list->elems[0].data) string_list_initialize(&str_list);
strlcpy(new_label, str_list->elems[0].data, sizeof(new_label)); string_split_noalloc(&str_list, info->path, ";");
if (str_list->elems[1].data)
strlcpy(menu->core_buf, str_list->elems[1].data, menu->core_len); if (str_list.elems[0].data)
strlcpy(new_label, str_list.elems[0].data, sizeof(new_label));
if (str_list.elems[1].data)
strlcpy(menu->core_buf, str_list.elems[1].data, menu->core_len);
count = print_buf_lines(info->list, menu->core_buf, new_label, count = print_buf_lines(info->list, menu->core_buf, new_label,
(int)menu->core_len, FILE_TYPE_DOWNLOAD_URL, false, false); (int)menu->core_len, FILE_TYPE_DOWNLOAD_URL, false, false);
@ -9927,7 +9931,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
info->need_refresh = true; info->need_refresh = true;
info->need_clear = true; info->need_clear = true;
string_list_free(str_list); string_list_deinitialize(&str_list);
#endif #endif
} }
break; break;
@ -11865,9 +11869,11 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
if (string_starts_with_size(info->path, "core_option_", if (string_starts_with_size(info->path, "core_option_",
STRLEN_CONST("core_option_"))) STRLEN_CONST("core_option_")))
{ {
struct string_list *tmp_str_list = string_split(info->path, "_"); struct string_list tmp_str_list = {0};
string_list_initialize(&tmp_str_list);
string_split_noalloc(&tmp_str_list, info->path, "_");
if (tmp_str_list && tmp_str_list->size > 0) if (tmp_str_list.size > 0)
{ {
core_option_manager_t *coreopts = NULL; core_option_manager_t *coreopts = NULL;
const char *val = NULL; const char *val = NULL;
@ -11877,8 +11883,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
if (coreopts) if (coreopts)
{ {
unsigned i; unsigned i;
unsigned size = (unsigned)tmp_str_list->size; unsigned size = (unsigned)
unsigned menu_index = atoi(tmp_str_list->elems[size-1].data); tmp_str_list.size;
unsigned menu_index = atoi(tmp_str_list.elems[size-1].data);
unsigned visible_index = 0; unsigned visible_index = 0;
unsigned option_index = 0; unsigned option_index = 0;
bool option_found = false; bool option_found = false;
@ -11958,8 +11965,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
} }
} }
if (tmp_str_list) string_list_deinitialize(&tmp_str_list);
string_list_free(tmp_str_list);
} }
else else
{ {
@ -11972,12 +11978,16 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
{ {
case ST_STRING_OPTIONS: case ST_STRING_OPTIONS:
{ {
struct string_list *tmp_str_list = string_split(setting->values, "|"); struct string_list tmp_str_list = {0};
string_list_initialize(&tmp_str_list);
string_split_noalloc(&tmp_str_list,
setting->values, "|");
if (tmp_str_list && tmp_str_list->size > 0) if (tmp_str_list.size > 0)
{ {
unsigned i; unsigned i;
unsigned size = (unsigned)tmp_str_list->size; unsigned size = (unsigned)
tmp_str_list.size;
bool checked_found = false; bool checked_found = false;
unsigned checked = 0; unsigned checked = 0;
@ -11986,13 +11996,15 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
char val_d[256]; char val_d[256];
snprintf(val_d, sizeof(val_d), "%d", setting->enum_idx); snprintf(val_d, sizeof(val_d), "%d", setting->enum_idx);
if (menu_entries_append_enum(info->list, if (menu_entries_append_enum(info->list,
tmp_str_list->elems[i].data, tmp_str_list.elems[i].data,
val_d, val_d,
MENU_ENUM_LABEL_NO_ITEMS, MENU_ENUM_LABEL_NO_ITEMS,
MENU_SETTING_DROPDOWN_SETTING_STRING_OPTIONS_ITEM, i, 0)) MENU_SETTING_DROPDOWN_SETTING_STRING_OPTIONS_ITEM, i, 0))
count++; count++;
if (!checked_found && string_is_equal(tmp_str_list->elems[i].data, setting->value.target.string)) if (!checked_found && string_is_equal(
tmp_str_list.elems[i].data,
setting->value.target.string))
{ {
checked = i; checked = i;
checked_found = true; checked_found = true;
@ -12006,8 +12018,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
} }
} }
if (tmp_str_list) string_list_deinitialize(&tmp_str_list);
string_list_free(tmp_str_list);
} }
break; break;
case ST_INT: case ST_INT:
@ -12285,9 +12296,12 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
if (string_starts_with_size(info->path, "core_option_", if (string_starts_with_size(info->path, "core_option_",
STRLEN_CONST("core_option_"))) STRLEN_CONST("core_option_")))
{ {
struct string_list *tmp_str_list = string_split(info->path, "_"); struct string_list tmp_str_list = {0};
if (tmp_str_list && tmp_str_list->size > 0) string_list_initialize(&tmp_str_list);
string_split_noalloc(&tmp_str_list, info->path, "_");
if (tmp_str_list.size > 0)
{ {
core_option_manager_t *coreopts = NULL; core_option_manager_t *coreopts = NULL;
const char *val = NULL; const char *val = NULL;
@ -12296,8 +12310,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
if (coreopts) if (coreopts)
{ {
unsigned size = (unsigned)tmp_str_list->size; unsigned size = (unsigned)
unsigned menu_index = atoi(tmp_str_list->elems[size-1].data); tmp_str_list.size;
unsigned menu_index = atoi(tmp_str_list.elems[size-1].data);
unsigned visible_index = 0; unsigned visible_index = 0;
unsigned option_index = 0; unsigned option_index = 0;
bool option_found = false; bool option_found = false;
@ -12375,8 +12390,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
} }
} }
if (tmp_str_list) string_list_deinitialize(&tmp_str_list);
string_list_free(tmp_str_list);
} }
else else
{ {
@ -12389,12 +12403,16 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
{ {
case ST_STRING_OPTIONS: case ST_STRING_OPTIONS:
{ {
struct string_list *tmp_str_list = string_split(setting->values, "|"); struct string_list tmp_str_list = {0};
string_list_initialize(&tmp_str_list);
string_split_noalloc(&tmp_str_list,
setting->values, "|");
if (tmp_str_list && tmp_str_list->size > 0) if (tmp_str_list.size > 0)
{ {
unsigned i; unsigned i;
unsigned size = (unsigned)tmp_str_list->size; unsigned size = (unsigned)tmp_str_list.size;
bool checked_found = false; bool checked_found = false;
unsigned checked = 0; unsigned checked = 0;
@ -12403,13 +12421,15 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
char val_d[256]; char val_d[256];
snprintf(val_d, sizeof(val_d), "%d", setting->enum_idx); snprintf(val_d, sizeof(val_d), "%d", setting->enum_idx);
if (menu_entries_append_enum(info->list, if (menu_entries_append_enum(info->list,
tmp_str_list->elems[i].data, tmp_str_list.elems[i].data,
val_d, val_d,
MENU_ENUM_LABEL_NO_ITEMS, MENU_ENUM_LABEL_NO_ITEMS,
MENU_SETTING_DROPDOWN_SETTING_STRING_OPTIONS_ITEM_SPECIAL, i, 0)) MENU_SETTING_DROPDOWN_SETTING_STRING_OPTIONS_ITEM_SPECIAL, i, 0))
count++; count++;
if (!checked_found && string_is_equal(tmp_str_list->elems[i].data, setting->value.target.string)) if (!checked_found &&
string_is_equal(tmp_str_list.elems[i].data,
setting->value.target.string))
{ {
checked = i; checked = i;
checked_found = true; checked_found = true;
@ -12423,8 +12443,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
} }
} }
if (tmp_str_list) string_list_deinitialize(&tmp_str_list);
string_list_free(tmp_str_list);
} }
break; break;
case ST_INT: case ST_INT: