From bce13644e9d528a153f87019738a1582c9cae606 Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Sun, 7 Oct 2018 19:04:50 -0700 Subject: [PATCH] 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 Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris --- capinfos.c | 11 ++++------- captype.c | 11 ++++------- dumpcap.c | 11 ++++------- editcap.c | 11 ++++------- mergecap.c | 11 ++++------- randpkt.c | 11 ++++------- rawshark.c | 11 ++++------- text2pcap.c | 11 ++++------- tfshark.c | 11 ++++------- tshark.c | 11 ++++------- ui/qt/main.cpp | 11 ++++------- wsutil/unicode-utils.c | 14 ++++++++++++++ wsutil/unicode-utils.h | 11 +++++++++++ 13 files changed, 69 insertions(+), 77 deletions(-) diff --git a/capinfos.c b/capinfos.c index 3bf92a72ca..5f227e6afe 100644 --- a/capinfos.c +++ b/capinfos.c @@ -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 diff --git a/captype.c b/captype.c index e93f8637a2..99d8251e27 100644 --- a/captype.c +++ b/captype.c @@ -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 diff --git a/dumpcap.c b/dumpcap.c index b4ef6422ea..1991e9d0a2 100644 --- a/dumpcap.c +++ b/dumpcap.c @@ -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 diff --git a/editcap.c b/editcap.c index 8f754f88e1..5114135d7d 100644 --- a/editcap.c +++ b/editcap.c @@ -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 diff --git a/mergecap.c b/mergecap.c index 516ab714da..172dcece3f 100644 --- a/mergecap.c +++ b/mergecap.c @@ -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 diff --git a/randpkt.c b/randpkt.c index c4786c6452..a39cbf53de 100644 --- a/randpkt.c +++ b/randpkt.c @@ -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 diff --git a/rawshark.c b/rawshark.c index c488bc44fd..89c6925271 100644 --- a/rawshark.c +++ b/rawshark.c @@ -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 diff --git a/text2pcap.c b/text2pcap.c index 3aa39bc87f..c5f795fb8c 100644 --- a/text2pcap.c +++ b/text2pcap.c @@ -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 diff --git a/tfshark.c b/tfshark.c index d91faeadf5..0a44c4eba9 100644 --- a/tfshark.c +++ b/tfshark.c @@ -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 diff --git a/tshark.c b/tshark.c index e716aa9db3..387845d66f 100644 --- a/tshark.c +++ b/tshark.c @@ -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 diff --git a/ui/qt/main.cpp b/ui/qt/main.cpp index fbd367085a..351f71985e 100644 --- a/ui/qt/main.cpp +++ b/ui/qt/main.cpp @@ -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 */ diff --git a/wsutil/unicode-utils.c b/wsutil/unicode-utils.c index 5a8fa2336a..46dbcadbda 100644 --- a/wsutil/unicode-utils.c +++ b/wsutil/unicode-utils.c @@ -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 /* diff --git a/wsutil/unicode-utils.h b/wsutil/unicode-utils.h index 1190d63b03..6938914f3f 100644 --- a/wsutil/unicode-utils.h +++ b/wsutil/unicode-utils.h @@ -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 */ /*