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
This commit is contained in:
twinaphex 2014-06-03 01:45:25 +02:00
parent a5a85dbbd9
commit ae1e3b3f07
3 changed files with 35 additions and 35 deletions

View File

@ -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)
{

View File

@ -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);

View File

@ -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)