From aca7c64aa69a4e14a2dd57779cd206a5aa15f649 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 16 Mar 2014 00:09:30 -0700 Subject: * configure: Detect _wspawn* functions. * stream.c (run): Implement using _wspawnvp on MinGW. --- ChangeLog | 6 ++++++ configure | 21 +++++++++++++++++++++ stream.c | 24 ++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/ChangeLog b/ChangeLog index 2bd7511f..d7b929fe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2014-03-16 Kaz Kylheku + + * configure: Detect _wspawn* functions. + + * stream.c (run): Implement using _wspawnvp on MinGW. + 2014-03-15 Kaz Kylheku * parser.l: Bugfix. When handling a backslash-newline continuation diff --git a/configure b/configure index ff7f67fa..f20ec31d 100755 --- a/configure +++ b/configure @@ -1720,6 +1720,27 @@ else printf "no\n" fi +printf "Checking for _wspawvp ... " + +cat > conftest.c < +#include + +int main(int argc, char **argv) +{ + wchar_t *wargv[] = { L"foo", L"bar", 0 }; + int r = _wspawnlp(_P_WAIT, L"foo", wargv); + return 0; +} +! +if conftest ; then + printf "yes\n" + printf "#define HAVE_WSPAWN 1\n" >> config.h +else + printf "no\n" +fi + # # Dependent variables # diff --git a/stream.c b/stream.c index 14ec811b..338f62d8 100644 --- a/stream.c +++ b/stream.c @@ -2338,6 +2338,30 @@ static val run(val name, val args) return status == 0 ? zero : nil; } } +#elif HAVE_WSPAWN +static val run(val command, val args) +{ + const wchar_t **wargv = 0; + val iter; + int i, nargs, status; + + args = default_bool_arg(args); + nargs = c_num(length(args)) + 1; + + wargv = (const wchar_t **) chk_malloc((nargs + 2) * sizeof *wargv); + + for (i = 0, iter = cons(command, args); iter; i++, iter = cdr(iter)) + wargv[i] = c_str(car(iter)); + wargv[i] = 0; + + status = _wspawnvp(_P_WAIT, c_str(command), wargv); + + for (i = 0; i < nargs; i++) + free((void *) wargv[i]); + free((void *) wargv); + + return (status < 0) ? nil : num(status); +} #else static val run(val command, val args) { -- cgit v1.2.3