]> granicus.if.org Git - jq/commitdiff
Fix #811: use CommandLineToArgvW() and _wfopen()
authorNicolas Williams <nico@cryptonector.com>
Fri, 19 Jun 2015 22:10:45 +0000 (17:10 -0500)
committerNicolas Williams <nico@cryptonector.com>
Fri, 19 Jun 2015 23:54:44 +0000 (18:54 -0500)
main.c
util.c

diff --git a/main.c b/main.c
index ceb2360afac08da835e500c20f4f87d434ecb6fe..a888c3060cf96d7f34cb1ff3468b78083eaedec5 100644 (file)
--- a/main.c
+++ b/main.c
@@ -6,6 +6,15 @@
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
+
+#ifdef WIN32
+#include <windows.h>
+#include <processenv.h>
+#include <shellapi.h>
+#include <wchar.h>
+#include <wtypes.h>
+#endif
+
 #include "compile.h"
 #include "jv.h"
 #include "jq.h"
@@ -165,6 +174,20 @@ int main(int argc, char* argv[]) {
   int badwrite;
   jv program_arguments = jv_array();
 
+#ifdef WIN32
+  int wargc;
+  wchar_t **wargv = CommandLineToArgvW(GetCommandLineW(), &wargc);
+  assert(wargc == argc);
+  size_t arg_sz;
+  for (int i = 0; i < argc; i++) {
+    argv[i] = alloca((arg_sz = WideCharToMultiByte(CP_UTF8,
+                                                   0,
+                                                   wargv[i],
+                                                   -1, 0, 0, 0, 0)));
+    WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1, argv[i], arg_sz, 0, 0);
+  }
+#endif
+
   if (argc) progname = argv[0];
 
   jq = jq_init();
diff --git a/util.c b/util.c
index b7781a1627f3ad1a3d55b98db96cd5ded6f40e01..62b5ba2892bfac6ad3153d7605386bb14e8202c8 100644 (file)
--- a/util.c
+++ b/util.c
@@ -32,11 +32,32 @@ void *alloca (size_t);
 #include <pwd.h>
 #endif
 
+#ifdef WIN32
+#include <windows.h>
+#include <processenv.h>
+#include <shellapi.h>
+#include <wchar.h>
+#include <wtypes.h>
+#endif
+
 
 #include "util.h"
 #include "jq.h"
 #include "jv_alloc.h"
 
+#ifdef WIN32
+FILE *fopen(const char *fname, const char *mode) {
+  size_t sz = MultiByteToWideChar(CP_UTF8, 0, fname, -1, NULL, 0);
+  wchar_t *wfname = alloca(sz);
+  MultiByteToWideChar(CP_UTF8, 0, fname, -1, wfname, sz);
+
+  sz = MultiByteToWideChar(CP_UTF8, 0, mode, -1, NULL, 0);
+  wchar_t *wmode = alloca(sz);
+  MultiByteToWideChar(CP_UTF8, 0, mode, -1, wmode, sz);
+  return _wfopen(wfname, wmode);
+}
+#endif
+
 #ifndef HAVE_MKSTEMP
 int mkstemp(char *template) {
   size_t len = strlen(template);