From 1dfccb84e1b251dd302233e0dfb584f446c9f409 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 28 Jul 2014 00:18:05 +0200 Subject: [PATCH] Refactor menu_load_game and the content loading routine in frontend.c --- frontend/frontend.c | 139 ++++++++++++++++++-------------- frontend/frontend.h | 4 + frontend/frontend_context.h | 10 ++- frontend/menu/menu_common.c | 36 +-------- frontend/platform/platform_gx.c | 2 +- 5 files changed, 91 insertions(+), 100 deletions(-) diff --git a/frontend/frontend.c b/frontend/frontend.c index 80016b7db6..b2aa8e373f 100644 --- a/frontend/frontend.c +++ b/frontend/frontend.c @@ -283,18 +283,90 @@ void free_args(void *data, char **argv_copy, unsigned argv_size) free(argv_copy[i]); } -returntype main_entry(signature()) +static void check_defaults_dirs(void) { + if (*g_defaults.autoconfig_dir) + path_mkdir(g_defaults.autoconfig_dir); + if (*g_defaults.audio_filter_dir) + path_mkdir(g_defaults.audio_filter_dir); + if (*g_defaults.assets_dir) + path_mkdir(g_defaults.assets_dir); + if (*g_defaults.core_dir) + path_mkdir(g_defaults.core_dir); + if (*g_defaults.core_info_dir) + path_mkdir(g_defaults.core_info_dir); + if (*g_defaults.overlay_dir) + path_mkdir(g_defaults.overlay_dir); + if (*g_defaults.port_dir) + path_mkdir(g_defaults.port_dir); + if (*g_defaults.shader_dir) + path_mkdir(g_defaults.shader_dir); + if (*g_defaults.savestate_dir) + path_mkdir(g_defaults.savestate_dir); + if (*g_defaults.sram_dir) + path_mkdir(g_defaults.sram_dir); + if (*g_defaults.system_dir) + path_mkdir(g_defaults.system_dir); +} + +bool main_load_content(int argc, char **argv, environment_get_t environ_get, + process_args_t process_args) +{ + bool retval = true; int *rarch_argc_ptr; char **rarch_argv_ptr; struct rarch_main_wrap *wrap_args; - declare_argc(); - declare_argv(); - args_type() args = (args_type())args_initial_ptr(); int ret, rarch_argc = 0; char *rarch_argv[MAX_ARGS] = {NULL}; char *argv_copy[MAX_ARGS] = {NULL}; + rarch_argv_ptr = (char**)argv; + rarch_argc_ptr = (int*)&argc; + + (void)rarch_argc_ptr; + (void)rarch_argv_ptr; + + wrap_args = (struct rarch_main_wrap*)calloc(1, sizeof(*wrap_args)); + rarch_assert(wrap_args); + + if (environ_get) + environ_get(rarch_argc_ptr, rarch_argv_ptr, NULL, wrap_args); + + check_defaults_dirs(); + + if (wrap_args->touched) + { + rarch_main_init_wrap(wrap_args, &rarch_argc, rarch_argv); + memcpy(argv_copy, rarch_argv, sizeof(rarch_argv)); + rarch_argv_ptr = (char**)rarch_argv; + rarch_argc_ptr = (int*)&rarch_argc; + } + + if (g_extern.main_is_init) + rarch_main_deinit(); + + if ((ret = rarch_main_init(*rarch_argc_ptr, rarch_argv_ptr))) + { + retval = false; + goto error; + } + + if (process_args) + process_args(rarch_argc_ptr, rarch_argv_ptr); + +error: + free_args(wrap_args, argv_copy, ARRAY_SIZE(argv_copy)); + free(wrap_args); + return retval; +} + +returntype main_entry(signature()) +{ + declare_argc(); + declare_argv(); + args_type() args = (args_type())args_initial_ptr(); + int ret = 0; + driver.frontend_ctx = (frontend_ctx_driver_t*)frontend_ctx_init_first(); if (!driver.frontend_ctx) @@ -306,62 +378,11 @@ returntype main_entry(signature()) rarch_main_clear_state(); rarch_init_msg_queue(); - wrap_args = (struct rarch_main_wrap*)calloc(1, sizeof(*wrap_args)); - rarch_assert(wrap_args); - - rarch_argv_ptr = (char**)argv; - rarch_argc_ptr = (int*)&argc; - - if (driver.frontend_ctx && driver.frontend_ctx->environment_get) - { - driver.frontend_ctx->environment_get(rarch_argc_ptr, rarch_argv_ptr, args, wrap_args); - if (*g_defaults.autoconfig_dir) - path_mkdir(g_defaults.autoconfig_dir); - if (*g_defaults.audio_filter_dir) - path_mkdir(g_defaults.audio_filter_dir); - if (*g_defaults.assets_dir) - path_mkdir(g_defaults.assets_dir); - if (*g_defaults.core_dir) - path_mkdir(g_defaults.core_dir); - if (*g_defaults.core_info_dir) - path_mkdir(g_defaults.core_info_dir); - if (*g_defaults.overlay_dir) - path_mkdir(g_defaults.overlay_dir); - if (*g_defaults.port_dir) - path_mkdir(g_defaults.port_dir); - if (*g_defaults.shader_dir) - path_mkdir(g_defaults.shader_dir); - if (*g_defaults.savestate_dir) - path_mkdir(g_defaults.savestate_dir); - if (*g_defaults.sram_dir) - path_mkdir(g_defaults.sram_dir); - if (*g_defaults.system_dir) - path_mkdir(g_defaults.system_dir); - } - - if (wrap_args->touched) - { - g_extern.verbosity = true; - rarch_main_init_wrap(wrap_args, &rarch_argc, rarch_argv); - memcpy(argv_copy, rarch_argv, sizeof(rarch_argv)); - rarch_argv_ptr = (char**)rarch_argv; - rarch_argc_ptr = (int*)&rarch_argc; - } - - if (g_extern.main_is_init) - rarch_main_deinit(); - - if ((ret = rarch_main_init(*rarch_argc_ptr, rarch_argv_ptr))) - { - free_args(wrap_args, argv_copy, ARRAY_SIZE(argv_copy)); - free(wrap_args); + if (!(main_load_content(argc, argv, driver.frontend_ctx->environment_get, + driver.frontend_ctx->process_args))) return_var(ret); - } #if defined(HAVE_MENU) - if (driver.frontend_ctx && driver.frontend_ctx->process_args) - driver.frontend_ctx->process_args(rarch_argc_ptr, rarch_argv_ptr, args); - g_extern.lifecycle_state |= (1ULL << MODE_GAME); #if defined(RARCH_CONSOLE) || defined(RARCH_MOBILE) @@ -375,10 +396,6 @@ returntype main_entry(signature()) } #endif - if (wrap_args) - free_args(wrap_args, argv_copy, ARRAY_SIZE(argv_copy)); - free(wrap_args); - #if defined(HAVE_MAIN_LOOP) #if defined(HAVE_MENU) while (!main_entry_iterate(signature_expand(), args)); diff --git a/frontend/frontend.h b/frontend/frontend.h index f9c01469d0..3974d60d08 100644 --- a/frontend/frontend.h +++ b/frontend/frontend.h @@ -20,6 +20,8 @@ #include #include +#include "../boolean.h" +#include "frontend_context.h" #if defined(ANDROID) #define args_type() struct android_app* @@ -39,6 +41,8 @@ int main_entry_iterate(signature(), args_type() args); void main_exit(args_type() args); returntype main_entry(signature()); void free_args(void *data, char **argv_copy, unsigned argv_size); +bool main_load_content(int argc, char **argv, environment_get_t environ_get, + process_args_t process_args); #ifdef __cplusplus } diff --git a/frontend/frontend_context.h b/frontend/frontend_context.h index 4de3ffe6cd..91f62f3837 100644 --- a/frontend/frontend_context.h +++ b/frontend/frontend_context.h @@ -28,16 +28,18 @@ extern "C" { #endif +typedef void (*environment_get_t)(int *argc, char *argv[], void *args, + void *params_data); +typedef void (*process_args_t)(int *argc, char *argv[]); + typedef struct frontend_ctx_driver { - void (*environment_get)(int *argc, char *argv[], void *args, - void *params_data); - + environment_get_t environment_get; void (*init)(void *data); void (*deinit)(void *data); void (*exitspawn)(char *core_path, size_t sizeof_core_path); - void (*process_args)(int *argc, char *argv[], void *args); + process_args_t process_args; int (*process_events)(void *data); void (*exec)(const char *, bool); void (*shutdown)(bool); diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index c0014f1e2a..2ab9051a7f 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -195,37 +195,9 @@ static void menu_environment_get(int *argc, char *argv[], void *args, void *para bool load_menu_game(void) { - int *rarch_argc_ptr; - char **rarch_argv_ptr; - struct rarch_main_wrap *wrap_args; - int ret, rarch_argc = 0; - char *rarch_argv[MAX_ARGS] = {NULL}; - char *argv_copy[MAX_ARGS] = {NULL}; - - (void)rarch_argc_ptr; - (void)rarch_argv_ptr; - - wrap_args = (struct rarch_main_wrap*)calloc(1, sizeof(*wrap_args)); - rarch_assert(wrap_args); - - menu_environment_get(rarch_argc_ptr, rarch_argv_ptr, NULL, wrap_args); - - if (wrap_args->touched) + if (!(main_load_content(0, NULL, menu_environment_get, + driver.frontend_ctx->process_args))) { - rarch_main_init_wrap(wrap_args, &rarch_argc, rarch_argv); - memcpy(argv_copy, rarch_argv, sizeof(rarch_argv)); - rarch_argv_ptr = (char**)rarch_argv; - rarch_argc_ptr = (int*)&rarch_argc; - } - - if (g_extern.main_is_init) - rarch_main_deinit(); - - if ((ret = rarch_main_init(rarch_argc, rarch_argv))) - { - free_args(wrap_args, argv_copy, ARRAY_SIZE(argv_copy)); - free(wrap_args); - char name[PATH_MAX], msg[PATH_MAX]; fill_pathname_base(name, g_extern.fullpath, sizeof(name)); @@ -238,10 +210,6 @@ bool load_menu_game(void) return false; } - if (wrap_args) - free_args(wrap_args, argv_copy, ARRAY_SIZE(argv_copy)); - free(wrap_args); - // Update menu state which depends on config. if (driver.menu) menu_update_libretro_info(driver.menu); diff --git a/frontend/platform/platform_gx.c b/frontend/platform/platform_gx.c index aa2a5d6a17..ffff1ad16b 100644 --- a/frontend/platform/platform_gx.c +++ b/frontend/platform/platform_gx.c @@ -301,7 +301,7 @@ static void frontend_gx_exitspawn(char *core_path, size_t sizeof_core_path) frontend_gx_exec(core_path, should_load_game); } -static void frontend_gx_process_args(int *argc, char *argv[], void *args) +static void frontend_gx_process_args(int *argc, char *argv[]) { #ifndef IS_SALAMANDER // a big hack: sometimes salamander doesn't save the new core it loads on first boot,