From f656336b7f44ad5695fb04921dca502a6bd06fdd Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 9 May 2014 21:00:50 +0200 Subject: [PATCH] (Lakka) Use strlcpy/strlcat (Menu) Abstract menu_init_core_info - we can have different implementations of this per menu drivers --- driver.h | 1 + frontend/menu/backend/menu_common_backend.c | 13 ++++-- frontend/menu/disp/lakka.c | 47 ++++++++++++--------- frontend/menu/disp/rgui.c | 11 +++++ frontend/menu/disp/rmenu.c | 10 +++++ frontend/menu/disp/rmenu_xui.cpp | 11 +++++ frontend/menu/menu_common.c | 11 ----- frontend/menu/menu_common.h | 2 - 8 files changed, 69 insertions(+), 37 deletions(-) diff --git a/driver.h b/driver.h index 09ef3375ef..09eeb7e43c 100644 --- a/driver.h +++ b/driver.h @@ -431,6 +431,7 @@ typedef struct menu_ctx_driver void (*list_delete)(void *, size_t); void (*list_clear)(void *); void (*list_set_selection)(void *); + void (*init_core_info)(void *); const menu_ctx_driver_backend_t *backend; // Human readable string. diff --git a/frontend/menu/backend/menu_common_backend.c b/frontend/menu/backend/menu_common_backend.c index feb15809c6..7a9ef176e3 100644 --- a/frontend/menu/backend/menu_common_backend.c +++ b/frontend/menu/backend/menu_common_backend.c @@ -1470,7 +1470,9 @@ static int menu_common_iterate(void *data, unsigned action) else if (menu_type == RGUI_LIBRETRO_DIR_PATH) { strlcpy(g_settings.libretro_directory, dir, sizeof(g_settings.libretro_directory)); - menu_init_core_info(rgui); + + if (driver.menu_ctx && driver.menu_ctx->init_core_info) + driver.menu_ctx->init_core_info(rgui); menu_flush_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); } #ifdef HAVE_DYNAMIC @@ -1483,7 +1485,8 @@ static int menu_common_iterate(void *data, unsigned action) else if (menu_type == RGUI_LIBRETRO_INFO_DIR_PATH) { strlcpy(g_settings.libretro_info_path, dir, sizeof(g_settings.libretro_info_path)); - menu_init_core_info(rgui); + if (driver.menu_ctx && driver.menu_ctx->init_core_info) + driver.menu_ctx->init_core_info(rgui); menu_flush_stack_type(rgui, RGUI_SETTINGS_PATH_OPTIONS); } else if (menu_type == RGUI_SHADER_DIR_PATH) @@ -2979,14 +2982,16 @@ static int menu_common_setting_set(void *data, unsigned setting, unsigned action if (action == RGUI_ACTION_START) { *g_settings.libretro_directory = '\0'; - menu_init_core_info(rgui); + if (driver.menu_ctx && driver.menu_ctx->init_core_info) + driver.menu_ctx->init_core_info(rgui); } break; case RGUI_LIBRETRO_INFO_DIR_PATH: if (action == RGUI_ACTION_START) { *g_settings.libretro_info_path = '\0'; - menu_init_core_info(rgui); + if (driver.menu_ctx && driver.menu_ctx->init_core_info) + driver.menu_ctx->init_core_info(rgui); } break; case RGUI_CONFIG_DIR_PATH: diff --git a/frontend/menu/disp/lakka.c b/frontend/menu/disp/lakka.c index e603c16e95..392455725e 100644 --- a/frontend/menu/disp/lakka.c +++ b/frontend/menu/disp/lakka.c @@ -904,12 +904,7 @@ static void *lakka_init(void) init_font(gl, g_settings.video.font_path, 6, 1440, 900); - menu_init_core_info(rgui); - - rgui->core_info = core_info_list_new(*g_settings.libretro_directory ? g_settings.libretro_directory : "/usr/lib/libretro"); - - num_categories = rgui->core_info ? rgui->core_info->count + 1 : 1; - + lakka_init_core_info(rgui); lakka_init_assets(rgui); categories = realloc(categories, num_categories * sizeof(menu_category)); @@ -923,22 +918,22 @@ static void *lakka_init(void) struct font_output_list out; core_info_t corenfo = rgui->core_info->list[i]; - strcpy(core_id, basename(corenfo.path)); - strcpy(core_id, str_replace(core_id, ".so", "")); - strcpy(core_id, str_replace(core_id, ".dll", "")); - strcpy(core_id, str_replace(core_id, ".dylib", "")); - strcpy(core_id, str_replace(core_id, "-libretro", "")); - strcpy(core_id, str_replace(core_id, "_libretro", "")); - strcpy(core_id, str_replace(core_id, "libretro-", "")); - strcpy(core_id, str_replace(core_id, "libretro_", "")); + strlcpy(core_id, basename(corenfo.path), sizeof(core_id)); + strlcpy(core_id, str_replace(core_id, ".so", ""), sizeof(core_id)); + strlcpy(core_id, str_replace(core_id, ".dll", ""), sizeof(core_id)); + strlcpy(core_id, str_replace(core_id, ".dylib", ""), sizeof(core_id)); + strlcpy(core_id, str_replace(core_id, "-libretro", ""), sizeof(core_id)); + strlcpy(core_id, str_replace(core_id, "_libretro", ""), sizeof(core_id)); + strlcpy(core_id, str_replace(core_id, "libretro-", ""), sizeof(core_id)); + strlcpy(core_id, str_replace(core_id, "libretro_", ""), sizeof(core_id)); - strcpy(texturepath, "/usr/share/retroarch/"); - strcat(texturepath, core_id); - strcat(texturepath, ".png"); + strlcpy(texturepath, "/usr/share/retroarch/", sizeof(texturepath)); + strlcat(texturepath, core_id, sizeof(texturepath)); + strlcat(texturepath, ".png", sizeof(texturepath)); - strcpy(gametexturepath, "/usr/share/retroarch/"); - strcat(gametexturepath, core_id); - strcat(gametexturepath, "-game.png"); + strlcpy(gametexturepath, sizeof(gametexturepath), "/usr/share/retroarch/"); + strlcat(gametexturepath, core_id, sizeof(gametexturepath)); + strlcat(gametexturepath, "-game.png", sizeof(gametexturepath)); mcat.name = corenfo.display_name; mcat.libretro = corenfo.path; @@ -990,6 +985,17 @@ static int lakka_input_postprocess(void *data, uint64_t old_state) return ret; } +static void lakka_init_core_info(void *data) +{ + rgui_handle_t *rgui = (rgui_handle_t*)data; + + core_info_list_free(rgui->core_info); + rgui->core_info = NULL; + + rgui->core_info = core_info_list_new(*g_settings.libretro_directory ? g_settings.libretro_directory : "/usr/lib/libretro"); + + num_categories = rgui->core_info ? rgui->core_info->count + 1 : 1; +} const menu_ctx_driver_t menu_ctx_lakka = { lakka_set_texture, @@ -1014,6 +1020,7 @@ const menu_ctx_driver_t menu_ctx_lakka = { NULL, NULL, NULL, + lakka_init_core_info, &menu_ctx_backend_lakka, "lakka", }; diff --git a/frontend/menu/disp/rgui.c b/frontend/menu/disp/rgui.c index a33eed58c4..aa81a785ba 100644 --- a/frontend/menu/disp/rgui.c +++ b/frontend/menu/disp/rgui.c @@ -621,6 +621,16 @@ void rgui_set_texture(void *data, bool enable) enable, rgui->width, rgui->height, 1.0f); } +static void rgui_init_core_info(void *data) +{ + rgui_handle_t *rgui = (rgui_handle_t*)data; + + core_info_list_free(rgui->core_info); + rgui->core_info = NULL; + if (*g_settings.libretro_directory) + rgui->core_info = core_info_list_new(g_settings.libretro_directory); +} + const menu_ctx_driver_t menu_ctx_rgui = { rgui_set_texture, rgui_render_messagebox, @@ -644,6 +654,7 @@ const menu_ctx_driver_t menu_ctx_rgui = { NULL, NULL, NULL, + rgui_init_core_info, &menu_ctx_backend_common, "rgui", }; diff --git a/frontend/menu/disp/rmenu.c b/frontend/menu/disp/rmenu.c index 2df3cab2c9..30f3424201 100644 --- a/frontend/menu/disp/rmenu.c +++ b/frontend/menu/disp/rmenu.c @@ -480,6 +480,15 @@ static int rmenu_input_postprocess(void *data, uint64_t old_state) return ret; } +static void rmenu_init_core_info(void *data) +{ + rgui_handle_t *rgui = (rgui_handle_t*)data; + + core_info_list_free(rgui->core_info); + rgui->core_info = NULL; + if (*g_settings.libretro_directory) + rgui->core_info = core_info_list_new(g_settings.libretro_directory); +} const menu_ctx_driver_t menu_ctx_rmenu = { rmenu_set_texture, @@ -504,6 +513,7 @@ const menu_ctx_driver_t menu_ctx_rmenu = { NULL, NULL, NULL, + rmenu_init_core_info, &menu_ctx_backend_common, "rmenu", }; diff --git a/frontend/menu/disp/rmenu_xui.cpp b/frontend/menu/disp/rmenu_xui.cpp index 3c95cdf508..3da67f8c1b 100644 --- a/frontend/menu/disp/rmenu_xui.cpp +++ b/frontend/menu/disp/rmenu_xui.cpp @@ -709,6 +709,16 @@ static void rmenu_xui_list_set_selection(void *data) XuiListSetCurSel(m_menulist, list->list[list->size].directory_ptr); } +static void rmenu_xui_init_core_info(void *data) +{ + rgui_handle_t *rgui = (rgui_handle_t*)data; + + core_info_list_free(rgui->core_info); + rgui->core_info = NULL; + if (*g_settings.libretro_directory) + rgui->core_info = core_info_list_new(g_settings.libretro_directory); +} + const menu_ctx_driver_t menu_ctx_rmenu_xui = { NULL, rmenu_xui_render_messagebox, @@ -732,6 +742,7 @@ const menu_ctx_driver_t menu_ctx_rmenu_xui = { rmenu_xui_list_delete, rmenu_xui_list_clear, rmenu_xui_list_set_selection, + rmenu_xui_init_core_info, &menu_ctx_backend_common, "rmenu_xui", }; diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index 254f0be4ba..759342f9ab 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -895,14 +895,3 @@ void menu_build_scroll_indices(void *data, file_list_t *buf) rgui->scroll_indices[rgui->scroll_indices_size++] = buf->size - 1; } - - -void menu_init_core_info(void *data) -{ - rgui_handle_t *rgui = (rgui_handle_t*)data; - - core_info_list_free(rgui->core_info); - rgui->core_info = NULL; - if (*g_settings.libretro_directory) - rgui->core_info = core_info_list_new(g_settings.libretro_directory); -} diff --git a/frontend/menu/menu_common.h b/frontend/menu/menu_common.h index f7137f8f92..3b6834a4b2 100644 --- a/frontend/menu/menu_common.h +++ b/frontend/menu/menu_common.h @@ -191,8 +191,6 @@ void menu_free(void *data); void menu_ticker_line(char *buf, size_t len, unsigned tick, const char *str, bool selected); -void menu_init_core_info(void *data); - void load_menu_game_prepare(void *data); void load_menu_game_prepare_dummy(void *data); bool load_menu_game(void *data);