From: Nicolas Williams Date: Fri, 19 Jun 2015 22:10:45 +0000 (-0500) Subject: Fix #811: use CommandLineToArgvW() and _wfopen() X-Git-Tag: jq-1.5rc2~59 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7811ef1e1746f0963deb960af2c9623fb53c24a5;p=jq Fix #811: use CommandLineToArgvW() and _wfopen() --- diff --git a/main.c b/main.c index ceb2360..a888c30 100644 --- a/main.c +++ b/main.c @@ -6,6 +6,15 @@ #include #include #include + +#ifdef WIN32 +#include +#include +#include +#include +#include +#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 b7781a1..62b5ba2 100644 --- a/util.c +++ b/util.c @@ -32,11 +32,32 @@ void *alloca (size_t); #include #endif +#ifdef WIN32 +#include +#include +#include +#include +#include +#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);