Setup main_entry and environment_get for proper building of

argc/argv for console/mobile ports with non-conformant argc/argv
input values
This commit is contained in:
twinaphex 2014-06-03 03:35:12 +02:00
parent 3ad7f76cd8
commit 29a3a46e73
9 changed files with 62 additions and 12 deletions

View File

@ -276,14 +276,32 @@ void main_exit(args_type() args)
driver.frontend_ctx->shutdown(false);
}
static void free_args(struct rarch_main_wrap *wrap_args,
char *argv_copy[])
{
int i;
for (i = 0; i < ARRAY_SIZE(argv_copy); i++)
if (argv_copy[i])
free(argv_copy[i]);
free(wrap_args);
}
returntype main_entry(signature())
{
int ret;
int ret, rarch_argc;
char *rarch_argv[MAX_ARGS], *argv_copy[MAX_ARGS];
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();
wrap_args = NULL;
driver.frontend_ctx = (frontend_ctx_driver_t*)frontend_ctx_init_first();
rarch_argv_ptr = (char**)argv;
rarch_argc_ptr = (int*)&argc;
if (!driver.frontend_ctx)
{
@ -298,7 +316,7 @@ returntype main_entry(signature())
if (driver.frontend_ctx && driver.frontend_ctx->environment_get)
{
driver.frontend_ctx->environment_get(&argc, argv, args);
driver.frontend_ctx->environment_get(rarch_argc_ptr, rarch_argv_ptr, args, wrap_args);
#if defined(RARCH_CONSOLE) || defined(RARCH_MOBILE)
if (*default_paths.autoconfig_dir)
path_mkdir(default_paths.autoconfig_dir);
@ -323,13 +341,30 @@ returntype main_entry(signature())
if (*default_paths.system_dir)
path_mkdir(default_paths.system_dir);
#endif
if (wrap_args)
{
rarch_main_init_wrap(wrap_args, &rarch_argc, rarch_argv);
if (rarch_argc > 0)
{
memcpy(argv_copy, rarch_argv, sizeof(rarch_argv));
rarch_argv_ptr = (char**)rarch_argv;
rarch_argc_ptr = (int*)&rarch_argc;
}
}
}
if ((ret = rarch_main_init(argc, argv))) return_var(ret);
if ((ret = rarch_main_init(*rarch_argc_ptr, rarch_argv_ptr)))
{
free_args(wrap_args, argv_copy);
return_var(ret);
}
#if defined(HAVE_MENU)
if (driver.frontend_ctx && driver.frontend_ctx->process_args)
ret = driver.frontend_ctx->process_args(&argc, argv, args);
ret = driver.frontend_ctx->process_args(rarch_argc_ptr, rarch_argv_ptr, args);
g_extern.lifecycle_state |= (1ULL << MODE_GAME);
@ -342,7 +377,12 @@ returntype main_entry(signature())
if (!g_extern.libretro_dummy)
menu_rom_history_push_current();
}
#endif
if (wrap_args)
free_args(wrap_args, argv_copy);
#if defined(HAVE_MENU)
while (!main_entry_iterate(signature_expand(), args));
#else
while ((g_extern.is_paused && !g_extern.is_oneshot) ? rarch_main_idle_iterate() : rarch_main_iterate());

View File

@ -29,7 +29,8 @@ extern "C" {
typedef struct frontend_ctx_driver
{
void (*environment_get)(int *argc, char *argv[], void *args);
void (*environment_get)(int *argc, char *argv[], void *args,
void *params_data);
void (*init)(void *data);
void (*deinit)(void *data);

View File

@ -89,7 +89,10 @@ static void find_first_libretro_core(char *first_file,
int main(int argc, char *argv[])
{
void *args = NULL;
struct rarch_main_wrap *wrap_args;
frontend_ctx_driver_t *frontend_ctx = (frontend_ctx_driver_t*)frontend_ctx_init_first();
wrap_args = NULL;
if (!frontend_ctx)
return 0;
@ -98,7 +101,7 @@ int main(int argc, char *argv[])
frontend_ctx->init(args);
if (frontend_ctx && frontend_ctx->environment_get)
frontend_ctx->environment_get(&argc, argv, args);
frontend_ctx->environment_get(&argc, argv, args, wrap_args);
if (frontend_ctx && frontend_ctx->salamander_init)
frontend_ctx->salamander_init();

View File

@ -407,7 +407,8 @@ static bool android_run_events (void *data)
return true;
}
static void frontend_android_get_environment_settings(int *argc, char *argv[], void *data)
static void frontend_android_get_environment_settings(int *argc, char *argv[],
void *data, void *params_data)
{
JNIEnv *env;
jobject obj = NULL;

View File

@ -217,7 +217,8 @@ int gx_logger_file(struct _reent *r, int fd, const char *ptr, size_t len)
extern char gx_rom_path[PATH_MAX];
#endif
static void frontend_gx_get_environment_settings(int *argc, char *argv[], void *args)
static void frontend_gx_get_environment_settings(int *argc, char *argv[],
void *args, void *params_data)
{
#ifndef IS_SALAMANDER
#if defined(HAVE_LOGGER)

View File

@ -167,7 +167,8 @@ static void callback_sysutil_exit(uint64_t status, uint64_t param, void *userdat
}
#endif
static void frontend_ps3_get_environment_settings(int *argc, char *argv[], void *args)
static void frontend_ps3_get_environment_settings(int *argc, char *argv[],
void *args, void *params_data)
{
#ifndef IS_SALAMANDER
bool original_verbose = g_extern.verbose;

View File

@ -44,7 +44,8 @@ static int exit_callback(int arg1, int arg2, void *common)
return 0;
}
static void frontend_psp_get_environment_settings(int *argc, char *argv[], void *args)
static void frontend_psp_get_environment_settings(int *argc, char *argv[],
void *args, void *params_data)
{
(void)args;
#ifndef IS_SALAMANDER

View File

@ -23,7 +23,8 @@
#include "../../dynamic.h"
#include "../../libretro_private.h"
static void frontend_qnx_get_environment_settings(int *argc, char *argv[], void *args)
static void frontend_qnx_get_environment_settings(int *argc, char *argv[],
void *args, void *params_data)
{
(void)argc;
(void)argv;

View File

@ -192,7 +192,8 @@ static HRESULT xbox_io_unmount(char *szDrive)
}
#endif
static void frontend_xdk_get_environment_settings(int *argc, char *argv[], void *args)
static void frontend_xdk_get_environment_settings(int *argc, char *argv[],
void *args, void *params_data)
{
HRESULT ret;
(void)ret;