diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-03-16 00:09:30 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-03-16 00:10:42 -0700 |
commit | aca7c64aa69a4e14a2dd57779cd206a5aa15f649 (patch) | |
tree | 6a700564ae7356241a9d29f5fe7fc8c4a0ae858e | |
parent | ef14bd0e49bec4025b80bdc01638b7a34b7778de (diff) | |
download | txr-aca7c64aa69a4e14a2dd57779cd206a5aa15f649.tar.gz txr-aca7c64aa69a4e14a2dd57779cd206a5aa15f649.tar.bz2 txr-aca7c64aa69a4e14a2dd57779cd206a5aa15f649.zip |
* configure: Detect _wspawn* functions.
* stream.c (run): Implement using _wspawnvp on MinGW.
-rw-r--r-- | ChangeLog | 6 | ||||
-rwxr-xr-x | configure | 21 | ||||
-rw-r--r-- | stream.c | 24 |
3 files changed, 51 insertions, 0 deletions
@@ -1,3 +1,9 @@ +2014-03-16 Kaz Kylheku <kaz@kylheku.com> + + * configure: Detect _wspawn* functions. + + * stream.c (run): Implement using _wspawnvp on MinGW. + 2014-03-15 Kaz Kylheku <kaz@kylheku.com> * parser.l: Bugfix. When handling a backslash-newline continuation @@ -1720,6 +1720,27 @@ else printf "no\n" fi +printf "Checking for _wspawvp ... " + +cat > conftest.c <<! +#include "config.h" +#include <process.h> +#include <wchar.h> + +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 # @@ -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) { |