1
0
mirror of https://github.com/stedolan/jq.git synced 2024-05-11 05:55:39 +00:00

Fix #811: use CommandLineToArgvW() and _wfopen()

This commit is contained in:
Nicolas Williams
2015-06-19 17:10:45 -05:00
parent b04cd6aada
commit 7811ef1e17
2 changed files with 44 additions and 0 deletions

23
main.c
View File

@@ -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();

21
util.c
View File

@@ -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);