diff --git a/frontend/menu/menu_common.c b/frontend/menu/menu_common.c index d07e371eba..4305928455 100644 --- a/frontend/menu/menu_common.c +++ b/frontend/menu/menu_common.c @@ -247,8 +247,10 @@ void load_menu_game_prepare_dummy(void) bool load_menu_game(void) { - int ret; + int argc, ret, i; struct rarch_main_wrap args = {0}; + char *argv_copy[MAX_ARGS]; + char *argv[MAX_ARGS] = {NULL}; if (!driver.menu) return false; @@ -265,7 +267,17 @@ bool load_menu_game(void) args.rom_path = *g_extern.fullpath ? g_extern.fullpath : NULL; args.libretro_path = *g_settings.libretro ? g_settings.libretro : NULL; - ret = rarch_main_init_wrap(&args); + argc = 0; + + rarch_main_init_wrap(&args, &argc, argv); + + // The pointers themselves are not const, and can be messed around with by getopt_long(). + memcpy(argv_copy, argv, sizeof(argv)); + + ret = rarch_main_init(argc, argv); + + for (i = 0; i < ARRAY_SIZE(argv_copy); i++) + free(argv_copy[i]); if (ret != 0) { diff --git a/general.h b/general.h index 89c07bcd63..71a22c96ba 100644 --- a/general.h +++ b/general.h @@ -739,7 +739,13 @@ void rarch_game_reset(void); void rarch_main_clear_state(void); void rarch_init_system_info(void); int rarch_main(int argc, char *argv[]); -int rarch_main_init_wrap(const struct rarch_main_wrap *args); + +#ifndef MAX_ARGS +#define MAX_ARGS 32 +#endif + +void rarch_main_init_wrap(const struct rarch_main_wrap *args, int *argc, char **argv); + int rarch_main_init(int argc, char *argv[]); bool rarch_main_idle_iterate(void); bool rarch_main_iterate(void); diff --git a/retroarch.c b/retroarch.c index 8d84218431..6980b3c713 100644 --- a/retroarch.c +++ b/retroarch.c @@ -3190,77 +3190,59 @@ void rarch_main_deinit(void) g_extern.main_is_init = false; } -#define MAX_ARGS 32 - -int rarch_main_init_wrap(const struct rarch_main_wrap *args) +void rarch_main_init_wrap(const struct rarch_main_wrap *args, int *argc, char **argv) { unsigned i; - if (g_extern.main_is_init) - rarch_main_deinit(); - int argc = 0; - char *argv[MAX_ARGS] = {NULL}; - char *argv_copy[MAX_ARGS]; - - argv[argc++] = strdup("retroarch"); + argv[(*argc)++] = strdup("retroarch"); if (!args->no_rom) { if (args->rom_path) { RARCH_LOG("Using content: %s.\n", args->rom_path); - argv[argc++] = strdup(args->rom_path); + argv[(*argc)++] = strdup(args->rom_path); } else { RARCH_LOG("No content, starting dummy core.\n"); - argv[argc++] = strdup("--menu"); + argv[(*argc)++] = strdup("--menu"); } } if (args->sram_path) { - argv[argc++] = strdup("-s"); - argv[argc++] = strdup(args->sram_path); + argv[(*argc)++] = strdup("-s"); + argv[(*argc)++] = strdup(args->sram_path); } if (args->state_path) { - argv[argc++] = strdup("-S"); - argv[argc++] = strdup(args->state_path); + argv[(*argc)++] = strdup("-S"); + argv[(*argc)++] = strdup(args->state_path); } if (args->config_path) { - argv[argc++] = strdup("-c"); - argv[argc++] = strdup(args->config_path); + argv[(*argc)++] = strdup("-c"); + argv[(*argc)++] = strdup(args->config_path); } #ifdef HAVE_DYNAMIC if (args->libretro_path) { - argv[argc++] = strdup("-L"); - argv[argc++] = strdup(args->libretro_path); + argv[(*argc)++] = strdup("-L"); + argv[(*argc)++] = strdup(args->libretro_path); } #endif if (args->verbose) - argv[argc++] = strdup("-v"); + argv[(*argc)++] = strdup("-v"); #ifdef HAVE_FILE_LOGGER - for (i = 0; i < argc; i++) + for (i = 0; i < *argc; i++) RARCH_LOG("arg #%d: %s\n", i, argv[i]); #endif - - // The pointers themselves are not const, and can be messed around with by getopt_long(). - memcpy(argv_copy, argv, sizeof(argv)); - - int ret = rarch_main_init(argc, argv); - - for (i = 0; i < ARRAY_SIZE(argv_copy); i++) - free(argv_copy[i]); - - return ret; } bool rarch_main_idle_iterate(void)