[m-rev.] for review: unicode command line arguments on windows

Julien Fischer juliensf at csse.unimelb.edu.au
Wed Dec 14 14:25:28 AEDT 2011


On Wed, 14 Dec 2011, Peter Wang wrote:

> This can be applied to a later 11.07 release if you like.
> --
>
> Branches: main, 11.07
>
> Support Unicode characters in command line arguments on Windows.
>
> util/mkinit.c:
> 	Retrieve the array of wide-character command-line argument
> 	strings with GetCommandLineW and CommandLineToArgvW.
>
> 	Convert the strings to UTF-8.
>
> 	Pass the array of UTF-8 argument strings to mercury_main as usual.
>
> diff --git a/util/mkinit.c b/util/mkinit.c
> index 8df56b8..73d825e 100644
> --- a/util/mkinit.c
> +++ b/util/mkinit.c
> @@ -327,6 +327,10 @@ static const char header2[] =
>     "#endif\n"
>     "#include \"mercury_init.h\"\n"
>     "#include \"mercury_grade.h\"\n"
> +    "#ifdef MR_WIN32\n"
> +    "  #include \"mercury_windows.h\"\n"
> +    "  #include <shellapi.h>\n"
> +    "#endif\n"
>     "\n"
>     "#define MR_TRACE_ENABLED %d\n"
>     "#if MR_TRACE_ENABLED\n"
> @@ -531,6 +535,32 @@ static const char mercury_main_func[] =
>     "   return mercury_terminate();\n"
>     "}\n"
>     "\n"
> +    /*
> +    ** Convert wide-character representation of the command line
> +    ** arguments to UTF-8.
> +    */
> +    "#ifdef MR_WIN32\n"
> +    "static char **\n"
> +    "mercury_win32_args(int *argc_ptr)\n"
> +    "{\n"
> +    "   LPWSTR  *wargv;\n"
> +    "   char    **argv;\n"
> +    "   int     i;\n"
> +    "\n"
> +    "   wargv = CommandLineToArgvW(GetCommandLineW(), argc_ptr);\n"
> +    "   argv = MR_GC_NEW_ARRAY(char *, *argc_ptr);\n"
> +    "   for (i = 0; i < *argc_ptr; i++) {\n"
> +    "       int bytes = WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1,\n"
> +    "           NULL, 0, NULL, NULL);\n"
> +    "       argv[i] = MR_GC_malloc(bytes);\n"
> +    "       WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1,\n"
> +    "           argv[i], bytes, NULL, NULL);\n"
> +    "   }\n"
> +    "   LocalFree(wargv);\n"
> +    "   return argv;\n"
> +    "}\n"
> +    "#endif\n"
> +    "\n"

Are you sure the above sets argv[argc] correctly?

Looks fine otherwise.

Julien.
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to:       mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions:          mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the reviews mailing list