diff options
-rw-r--r-- | main.c | 23 | ||||
-rw-r--r-- | util.c | 21 |
2 files changed, 44 insertions, 0 deletions
@@ -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(); @@ -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); |