61 lines
1.2 KiB
Prolog
61 lines
1.2 KiB
Prolog
/* $Id$
|
|
|
|
Part of SWI-Prolog
|
|
|
|
Author: Jan Wielemaker
|
|
E-mail: jan@swi.psy.uva.nl
|
|
WWW: http://www.swi.psy.uva.nl/projects/SWI-Prolog/
|
|
Copying: GPL-2. See the file COPYING or http://www.gnu.org
|
|
|
|
Copyright (C) 1990-2000 SWI, University of Amsterdam. All rights reserved.
|
|
*/
|
|
|
|
:- module(subcommand,
|
|
[ pipe_through_command/3 % +Command, +In, -Out
|
|
]).
|
|
:- use_module(library(unix)).
|
|
|
|
% pipe_through_command(+Command, +In, -Out)
|
|
%
|
|
% Pipe text In through command Command and put the output of command
|
|
% in Out.
|
|
%
|
|
% Example:
|
|
%
|
|
% ?- pipe_through_command(tr('a-z', 'A-Z'), hello, X)
|
|
%
|
|
% X = 'HELLO'
|
|
|
|
pipe_through_command(Command, In, Out) :-
|
|
pipe(ChildIn, MeOut),
|
|
pipe(MeIn, ChildOut),
|
|
fork(Pid),
|
|
( Pid == child,
|
|
close(MeOut),
|
|
close(MeIn),
|
|
dup(ChildIn, 0),
|
|
dup(ChildOut, 1),
|
|
close(ChildIn),
|
|
close(ChildOut),
|
|
exec(Command)
|
|
; close(ChildIn),
|
|
close(ChildOut),
|
|
write(MeOut, In),
|
|
close(MeOut),
|
|
read_input(MeIn, Out),
|
|
close(MeIn),
|
|
wait(Pid, _Status) % avoid zombi
|
|
).
|
|
|
|
|
|
read_input(In, Atom) :-
|
|
get_code(In, C0),
|
|
read_input(C0, In, Codes),
|
|
atom_codes(Atom, Codes).
|
|
|
|
read_input(-1, _, []) :- !.
|
|
read_input(C, In, [C|T]) :-
|
|
get_code(In, C1),
|
|
read_input(C1, In, T).
|
|
|