Bring back arg_list_utf_16to8(), but have it just do UTF-16-to-UTF-8 mapping.

Call it from wmain() in the command-line tools, passing it the input
argument count and vector, and call it from main() in Wireshark, after
getting a UTF-16 argument vector from passing the result of
GetCommandLineW() to CommandLineToArgvW().

Change-Id: I0e51703c0a6c92f7892d196e700ab437bd702514
Reviewed-on: https://code.wireshark.org/review/30063
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
Guy Harris 2018-10-07 19:04:50 -07:00
parent 9388bd0436
commit bce13644e9
13 changed files with 69 additions and 77 deletions

View File

@ -1726,15 +1726,12 @@ exit:
#ifdef _WIN32
int
wmain(int argc, wchar_t *argv[])
wmain(int argc, wchar_t *wc_argv[])
{
char **argv_utf8;
char **argv;
/* Convert our arg list from UTF-16LE to UTF-8. */
argv_utf8 = g_malloc(argc * sizeof *argv_utf8);
for (int i = 0; i < argc; i++)
argv_utf8[i] = g_utf16_to_utf8(argv[i], -1, NULL, NULL, NULL);
return real_main(argc, argv_utf8);
argv = arg_list_utf_16to8(argc, wc_argv);
return real_main(argc, argv);
}
#else
int

View File

@ -207,15 +207,12 @@ real_main(int argc, char *argv[])
#ifdef _WIN32
int
wmain(int argc, wchar_t *argv[])
wmain(int argc, wchar_t *wc_argv[])
{
char **argv_utf8;
char **argv;
/* Convert our arg list from UTF-16LE to UTF-8. */
argv_utf8 = g_malloc(argc * sizeof *argv_utf8);
for (int i = 0; i < argc; i++)
argv_utf8[i] = g_utf16_to_utf8(argv[i], -1, NULL, NULL, NULL);
return real_main(argc, argv_utf8);
argv = arg_list_utf_16to8(argc, wc_argv);
return real_main(argc, argv);
}
#else
int

View File

@ -5273,15 +5273,12 @@ real_main(int argc, char *argv[])
#ifdef _WIN32
int
wmain(int argc, wchar_t *argv[])
wmain(int argc, wchar_t *wc_argv[])
{
char **argv_utf8;
char **argv;
/* Convert our arg list from UTF-16LE to UTF-8. */
argv_utf8 = g_malloc(argc * sizeof *argv_utf8);
for (int i = 0; i < argc; i++)
argv_utf8[i] = g_utf16_to_utf8(argv[i], -1, NULL, NULL, NULL);
return real_main(argc, argv_utf8);
argv = arg_list_utf_16to8(argc, wc_argv);
return real_main(argc, argv);
}
#else
int

View File

@ -1954,15 +1954,12 @@ clean_exit:
#ifdef _WIN32
int
wmain(int argc, wchar_t *argv[])
wmain(int argc, wchar_t *wc_argv[])
{
char **argv_utf8;
char **argv;
/* Convert our arg list from UTF-16LE to UTF-8. */
argv_utf8 = g_malloc(argc * sizeof *argv_utf8);
for (int i = 0; i < argc; i++)
argv_utf8[i] = g_utf16_to_utf8(argv[i], -1, NULL, NULL, NULL);
return real_main(argc, argv_utf8);
argv = arg_list_utf_16to8(argc, wc_argv);
return real_main(argc, argv);
}
#else
int

View File

@ -473,15 +473,12 @@ clean_exit:
#ifdef _WIN32
int
wmain(int argc, wchar_t *argv[])
wmain(int argc, wchar_t *wc_argv[])
{
char **argv_utf8;
char **argv;
/* Convert our arg list from UTF-16LE to UTF-8. */
argv_utf8 = g_malloc(argc * sizeof *argv_utf8);
for (int i = 0; i < argc; i++)
argv_utf8[i] = g_utf16_to_utf8(argv[i], -1, NULL, NULL, NULL);
return real_main(argc, argv_utf8);
argv = arg_list_utf_16to8(argc, wc_argv);
return real_main(argc, argv);
}
#else
int

View File

@ -248,15 +248,12 @@ clean_exit:
#ifdef _WIN32
int
wmain(int argc, wchar_t **argv)
wmain(int argc, wchar_t **wc_argv)
{
char **argv_utf8;
char **argv;
/* Convert our arg list from UTF-16LE to UTF-8. */
argv_utf8 = g_malloc(argc * sizeof *argv_utf8);
for (int i = 0; i < argc; i++)
argv_utf8[i] = g_utf16_to_utf8(argv[i], -1, NULL, NULL, NULL);
return real_main(argc, argv_utf8);
argv = arg_list_utf_16to8(argc, wc_argv);
return real_main(argc, argv);
}
#else
int

View File

@ -832,15 +832,12 @@ clean_exit:
#ifdef _WIN32
int
wmain(int argc, wchar_t *argv[])
wmain(int argc, wchar_t *wc_argv[])
{
char **argv_utf8;
char **argv;
/* Convert our arg list from UTF-16LE to UTF-8. */
argv_utf8 = g_malloc(argc * sizeof *argv_utf8);
for (int i = 0; i < argc; i++)
argv_utf8[i] = g_utf16_to_utf8(argv[i], -1, NULL, NULL, NULL);
return real_main(argc, argv_utf8);
argv = arg_list_utf_16to8(argc, wc_argv);
return real_main(argc, argv);
}
#else
int

View File

@ -1933,15 +1933,12 @@ clean_exit:
#ifdef _WIN32
int
wmain(int argc, wchar_t *argv[])
wmain(int argc, wchar_t *wc_argv[])
{
char **argv_utf8;
char **argv;
/* Convert our arg list from UTF-16LE to UTF-8. */
argv_utf8 = g_malloc(argc * sizeof *argv_utf8);
for (int i = 0; i < argc; i++)
argv_utf8[i] = g_utf16_to_utf8(argv[i], -1, NULL, NULL, NULL);
return real_main(argc, argv_utf8);
argv = arg_list_utf_16to8(argc, wc_argv);
return real_main(argc, argv);
}
#else
int

View File

@ -1007,15 +1007,12 @@ clean_exit:
#ifdef _WIN32
int
wmain(int argc, wchar_t *argv[])
wmain(int argc, wchar_t *wc_argv[])
{
char **argv_utf8;
char **argv;
/* Convert our arg list from UTF-16LE to UTF-8. */
argv_utf8 = g_malloc(argc * sizeof *argv_utf8);
for (int i = 0; i < argc; i++)
argv_utf8[i] = g_utf16_to_utf8(argv[i], -1, NULL, NULL, NULL);
return real_main(argc, argv_utf8);
argv = arg_list_utf_16to8(argc, wc_argv);
return real_main(argc, argv);
}
#else
int

View File

@ -2260,15 +2260,12 @@ clean_exit:
#ifdef _WIN32
int
wmain(int argc, wchar_t *argv[])
wmain(int argc, wchar_t *wc_argv[])
{
char **argv_utf8;
char **argv;
/* Convert our arg list from UTF-16LE to UTF-8. */
argv_utf8 = g_malloc(argc * sizeof *argv_utf8);
for (int i = 0; i < argc; i++)
argv_utf8[i] = g_utf16_to_utf8(argv[i], -1, NULL, NULL, NULL);
return real_main(argc, argv_utf8);
argv = arg_list_utf_16to8(argc, wc_argv);
return real_main(argc, argv);
}
#else
int

View File

@ -357,7 +357,6 @@ int main(int argc, char *qt_argv[])
MainWindow *main_w;
#ifdef _WIN32
int opt;
LPWSTR *wc_argv;
int wc_argc;
#endif
@ -420,13 +419,11 @@ int main(int argc, char *qt_argv[])
// strings into UTF-8.
//
wc_argv = CommandLineToArgvW(GetCommandLineW(), &wc_argc);
if (wc_argv && wc_argc == argc) {
argv = (char **) g_malloc(sizeof(char *) * argc);
for (opt = 0; opt < argc; opt++) {
argv[opt] = g_utf16_to_utf8((const gunichar2 *)wc_argv[opt], -1, NULL, NULL, NULL);
}
if (wc_argv) {
argc = wc_argc;
argv = arg_list_utf_16to8(wc_argc, wc_argv);
LocalFree(wc_argv);
} /* XXX else bail because something is horribly, horribly wrong? */
LocalFree(wc_argv);
create_app_running_mutex();
#endif /* _WIN32 */

View File

@ -141,6 +141,20 @@ utf_16to8(const wchar_t *utf16str)
return utf8buf[idx];
}
/* Convert our argument list from UTF-16 to UTF-8. */
char **
arg_list_utf_16to8(int argc, wchar_t *wc_argv[]) {
char **argv;
int i;
argv = (char **) g_malloc(sizeof(char *) * argc);
for (i = 0; i < argc; i++) {
argv[i] = g_utf16_to_utf8(wc_argv[i], -1, NULL, NULL, NULL);
}
return argv;
}
#endif
/*

View File

@ -62,6 +62,17 @@ void utf_8to16_snprintf(TCHAR *utf16buf, gint utf16buf_len, const gchar* fmt,
*/
WS_DLL_PUBLIC
gchar * utf_16to8(const wchar_t *utf16str);
/** Convert the supplied program argument list from UTF-16 to UTF-8
* return a pointer to the array of UTF-8 arguments. This is intended
* to be used to normalize command line arguments at program startup.
*
* @param argc The number of arguments.
* @param argv The argument values (vector).
*/
WS_DLL_PUBLIC
char ** arg_list_utf_16to8(int argc, wchar_t *wc_argv[]);
#endif /* _WIN32 */
/*