diff options
author | Jason Hood <jadoxa@yahoo.com.au> | 2019-02-12 21:33:46 +1000 |
---|---|---|
committer | Nico Williams <nico@cryptonector.com> | 2019-02-17 23:58:23 -0600 |
commit | 88e1f59ec176ff37781b13bba065ed231ca5222f (patch) | |
tree | aa463c376e304a7a35bcc62750037619a279c56b /src | |
parent | 80b064f97b0429c4efa9abc7c045c26b3ab3e640 (diff) |
Allow globbing on Windows
The mingw-w64 runtime expands wildcards, which causes a discrepancy
between `main`'s `argv` (multiple file names) and Windows' `wargv` (a
single wildcard). Use `wmain` to retrieve the wide character args.
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 30 |
1 files changed, 19 insertions, 11 deletions
@@ -247,7 +247,26 @@ static void debug_cb(void *data, jv input) { fprintf(stderr, "\n"); } +#ifdef WIN32 +int umain(int argc, char* argv[]); + +int wmain(int argc, wchar_t* wargv[]) { + size_t arg_sz; + char **argv = alloca(argc * sizeof(wchar_t*)); + 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); + } + return umain(argc, argv); +} + +int umain(int argc, char* argv[]) { +#else /*}*/ int main(int argc, char* argv[]) { +#endif jq_state *jq = NULL; int ret = JQ_OK_NO_OUTPUT; int compiled = 0; @@ -263,17 +282,6 @@ int main(int argc, char* argv[]) { fflush(stderr); _setmode(fileno(stdout), _O_TEXT | _O_U8TEXT); _setmode(fileno(stderr), _O_TEXT | _O_U8TEXT); - 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]; |