summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Williams <nico@cryptonector.com>2015-06-19 17:10:45 -0500
committerNicolas Williams <nico@cryptonector.com>2015-06-19 18:54:44 -0500
commit7811ef1e1746f0963deb960af2c9623fb53c24a5 (patch)
tree1f8d7c7e70ed278e18e801a65f84261b3b811191
parentb04cd6aadaa8b8327654969392a5d094f3995f6d (diff)
Fix #811: use CommandLineToArgvW() and _wfopen()
-rw-r--r--main.c23
-rw-r--r--util.c21
2 files changed, 44 insertions, 0 deletions
diff --git a/main.c b/main.c
index ceb2360a..a888c306 100644
--- 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 b7781a16..62b5ba28 100644
--- 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);