]> granicus.if.org Git - jq/commitdiff
Allow globbing on Windows
authorJason Hood <jadoxa@yahoo.com.au>
Tue, 12 Feb 2019 11:33:46 +0000 (21:33 +1000)
committerNico Williams <nico@cryptonector.com>
Mon, 18 Feb 2019 05:58:23 +0000 (23:58 -0600)
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.

Makefile.am
src/main.c

index 4b47d74aa0ff59f6704832a18b353a771da88d9d..e1083fe765aa5336c935d5f7f3e9aa1e643854a6 100644 (file)
@@ -18,6 +18,10 @@ LIBJQ_SRC = src/builtin.c src/bytecode.c src/compile.c src/execute.c    \
 AM_CFLAGS = -Wextra -Wall -Wno-missing-field-initializers               \
         -Wno-unused-parameter -Wno-unused-function
 
+if WIN32
+AM_CFLAGS += -municode
+endif
+
 ACLOCAL_AMFLAGS = -I config/m4
 
 ### Generating the lexer and parser
index b8c2857da04060d87427878bcdeccc090b1a3c15..34d2c7e764746b7c54ff0a56502479ef78724f5b 100644 (file)
@@ -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];