diff src/octave-config.in.cc @ 29540:b6f80b1d448f

Windows: Support non-ASCII characters in command line arguments. * configure.ac: Define macros necessary for Unicode support on Windows. Add linker flags for Unicode executables with mingw. * src/main-cli.cc, src/main-gui.cc, src/main.in.cc, src/mkoctfile.in.cc, src/octave-config.in.cc, src/octave-svgconvert.cc: Optionally use "wmain" instead of "main" as primary entry function. * src/mkoctfile.in.cc (main, wmain): Use Unicode API to open pipe on Windows if possible. * src/module.mk: Use flags for linking with Unicode "wmain" function.
author Markus Mützel <markus.muetzel@gmx.de>
date Sat, 17 Apr 2021 12:21:48 +0200
parents 0a5b15007766
children 8c8031be8072
line wrap: on
line diff
--- a/src/octave-config.in.cc	Sat Apr 17 12:21:35 2021 +0200
+++ b/src/octave-config.in.cc	Sat Apr 17 12:21:48 2021 +0200
@@ -35,6 +35,12 @@
 #include <algorithm>
 #include <cstdlib>
 
+#if defined (OCTAVE_USE_WINDOWS_API)
+#  include <vector>
+#  include <locale>
+#  include <codecvt>
+#endif
+
 #if ! defined (OCTAVE_PREFIX)
 #  define OCTAVE_PREFIX %OCTAVE_PREFIX%
 #endif
@@ -139,9 +145,28 @@
   vars["STARTUPFILEDIR"] = prepend_octave_home (%OCTAVE_STARTUPFILEDIR%);
 }
 
+#if defined (OCTAVE_USE_WINDOWS_API) && defined (_UNICODE)
+extern "C"
+int
+wmain (int argc, wchar_t **wargv)
+{
+  static char **argv = new char * [argc + 1];
+  std::vector<std::string> argv_str;
+
+  // convert wide character strings to multibyte UTF-8 strings
+  std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> wchar_conv;
+  for (int i_arg = 0; i_arg < argc; i_arg++)
+    {
+      argv_str.push_back (wchar_conv.to_bytes (wargv[i_arg]));
+      argv[i_arg] = &argv_str[i_arg][0];
+    }
+  argv[argc] = nullptr;
+
+#else
 int
 main (int argc, char **argv)
 {
+#endif
   initialize ();
 
   if (argc == 1)