Bring back arg_list_utf_16to8(), but have it just do UTF-16-to-UTF-8 mapping.
authorGuy Harris <guy@alum.mit.edu>
Mon, 8 Oct 2018 02:04:50 +0000 (19:04 -0700)
committerGuy Harris <guy@alum.mit.edu>
Mon, 8 Oct 2018 03:05:45 +0000 (03:05 +0000)
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>
13 files changed:
capinfos.c
captype.c
dumpcap.c
editcap.c
mergecap.c
randpkt.c
rawshark.c
text2pcap.c
tfshark.c
tshark.c
ui/qt/main.cpp
wsutil/unicode-utils.c
wsutil/unicode-utils.h

index 3bf92a7..5f227e6 100644 (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
index e93f863..99d8251 100644 (file)
--- 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
index b4ef642..1991e9d 100644 (file)
--- 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
index 8f754f8..5114135 100644 (file)
--- 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
index 516ab71..172dcec 100644 (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
index c4786c6..a39cbf5 100644 (file)
--- 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
index c488bc4..89c6925 100644 (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
index 3aa39bc..c5f795f 100644 (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
index d91faea..0a44c4e 100644 (file)
--- 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
index e716aa9..387845d 100644 (file)
--- 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
index fbd3670..351f719 100644 (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 */
index 5a8fa23..46dbcad 100644 (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
 
 /*
index 1190d63..6938914 100644 (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 */
 
 /*