61 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			61 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
|   | /*  $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). | ||
|  | 
 |