summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Hood <jadoxa@yahoo.com.au>2019-02-12 21:33:46 +1000
committerNico Williams <nico@cryptonector.com>2019-02-17 23:58:23 -0600
commit88e1f59ec176ff37781b13bba065ed231ca5222f (patch)
treeaa463c376e304a7a35bcc62750037619a279c56b /src
parent80b064f97b0429c4efa9abc7c045c26b3ab3e640 (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.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/src/main.c b/src/main.c
index b8c2857d..34d2c7e7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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];