X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmain.c;h=808dda0c2fa3cc7811cb561cce25921abc1d1ed6;hb=46733c1a6700a7158cea01bd6c38dc05ac9d1cbb;hp=4c5ae3ea0523a507a1b5c5a1ab692437950441f4;hpb=fc4b07f20f9e79fe99d4b520bb5ff8b5e80b10f6;p=mono.git diff --git a/mono/mini/main.c b/mono/mini/main.c index 4c5ae3ea052..808dda0c2fa 100644 --- a/mono/mini/main.c +++ b/mono/mini/main.c @@ -1,8 +1,127 @@ +#include #include "mini.h" +#ifndef HOST_WIN32 +#ifdef HAVE_SGEN_GC +#include "buildver-sgen.h" +#else +#include "buildver.h" +#endif +#endif + +/* + * If the MONO_ENV_OPTIONS environment variable is set, it uses this as a + * source of command line arguments that are passed to Mono before the + * command line arguments specified in the command line. + */ +static int +mono_main_with_options (int argc, char *argv []) +{ + const char *env_options = getenv ("MONO_ENV_OPTIONS"); + if (env_options != NULL){ + GPtrArray *array = g_ptr_array_new (); + GString *buffer = g_string_new (""); + const char *p; + int i; + gboolean in_quotes = FALSE; + char quote_char = '\0'; + + for (p = env_options; *p; p++){ + switch (*p){ + case ' ': case '\t': + if (!in_quotes) { + if (buffer->len != 0){ + g_ptr_array_add (array, g_strdup (buffer->str)); + g_string_truncate (buffer, 0); + } + } else { + g_string_append_c (buffer, *p); + } + break; + case '\\': + if (p [1]){ + g_string_append_c (buffer, p [1]); + p++; + } + break; + case '\'': + case '"': + if (in_quotes) { + if (quote_char == *p) + in_quotes = FALSE; + else + g_string_append_c (buffer, *p); + } else { + in_quotes = TRUE; + quote_char = *p; + } + break; + default: + g_string_append_c (buffer, *p); + break; + } + } + if (in_quotes) { + fprintf (stderr, "Unmatched quotes in value of MONO_ENV_OPTIONS: [%s]\n", env_options); + exit (1); + } + + if (buffer->len != 0) + g_ptr_array_add (array, g_strdup (buffer->str)); + g_string_free (buffer, TRUE); + + if (array->len > 0){ + int new_argc = array->len + argc; + char **new_argv = g_new (char *, new_argc + 1); + int j; + + new_argv [0] = argv [0]; + + /* First the environment variable settings, to allow the command line options to override */ + for (i = 0; i < array->len; i++) + new_argv [i+1] = g_ptr_array_index (array, i); + i++; + for (j = 1; j < argc; j++) + new_argv [i++] = argv [j]; + new_argv [i] = NULL; + + argc = new_argc; + argv = new_argv; + } + g_ptr_array_free (array, TRUE); + } + + return mono_main (argc, argv); +} + +#ifdef HOST_WIN32 + +int +main () +{ + int argc; + gunichar2** argvw; + gchar** argv; + int i; + + argvw = CommandLineToArgvW (GetCommandLine (), &argc); + argv = g_new0 (gchar*, argc + 1); + for (i = 0; i < argc; i++) + argv [i] = g_utf16_to_utf8 (argvw [i], -1, NULL, NULL, NULL); + argv [argc] = NULL; + + LocalFree (argvw); + + return mono_main_with_options (argc, argv); +} + +#else int main (int argc, char* argv[]) { - return mono_main (argc, argv); + mono_build_date = build_date; + + return mono_main_with_options (argc, argv); } +#endif