From ae1e3b3f07a022987fa72b04942480a595af9424 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 3 Jun 2014 01:45:25 +0200 Subject: [PATCH] Rewrite rarch_main_wrap - we need a way of getting a valid argc/argv pair for consoles where we get stupid argc/argv pairs back that need to be 'converted' into something that RetroArch's PC-style args parsing can deal with --- frontend/menu/menu_common.c | 16 +++++++++++-- general.h | 8 ++++++- retroarch.c | 46 +++++++++++-------------------------- 3 files changed, 35 insertions(+), 35 deletions(-) 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)