summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgraehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f>2010-07-16 02:38:18 +0000
committergraehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f>2010-07-16 02:38:18 +0000
commitf57dde37dfb1d98b5ff9f5d1716687c690e4b4ba (patch)
tree20f70773ebec3bc14f982c5504fd239d21d00ae7
parent8b26fcd27aae78bf17d356e2677a9e7e62e7d1b2 (diff)
hooks up two processes, 2nd of which has one line of output per line of input, expected by the first, which starts off the communication
git-svn-id: https://ws10smt.googlecode.com/svn/trunk@281 ec762483-ff6d-05da-a07a-a48fb63a330f
-rwxr-xr-xvest/line_mediator.pl35
1 files changed, 35 insertions, 0 deletions
diff --git a/vest/line_mediator.pl b/vest/line_mediator.pl
new file mode 100755
index 00000000..defc11e8
--- /dev/null
+++ b/vest/line_mediator.pl
@@ -0,0 +1,35 @@
+#!/usr/bin/perl -w
+#hooks up two processes, 2nd of which has one line of output per line of input, expected by the first, which starts off the communication
+
+# if you don't know how to fork/exec in a C program, this could be helpful under limited cirmustances (would be ok to liaise with sentserver)
+
+use strict;
+use IPC::Open2;
+$,=' ';
+my $quiet=$ENV{QUIET};
+sub info {
+ print STDERR @_ unless $quiet;
+}
+
+my @c1;
+do {
+ push @c1,shift
+} while $c1[$#c1] ne '--';
+pop @c1;
+my @c2=@ARGV;
+(scalar @c1 && scalar @c2) || die "usage: $0 cmd1 args -- cmd2 args; hooks up two processes, 2nd of which has one line of output per line of input, expected by the first, which starts off the communication. crosses stdin/stderr of cmd1 and cmd2 line by line (both must flush on newline and output. cmd1 initiates the conversation (sends the first line). QUIET env var suppresses debugging output.";
+info("1 cmd:",@c1,"\n");
+info("2 cmd:",@c2,"\n");
+my ($R1,$W1,$R2,$W2);
+my $c1p=open2($R1,$W1,@c1); # Open2 R W backward from Open3.
+my $c2p=open2($R2,$W2,@c2);
+select $W2;
+$|=1;
+while(<$R1>) {
+ info("1:",$_);
+ print $_;
+ $_=<$R2>;
+ last unless defined $_;
+ info("2:",$_);
+ print $W1 $_;
+}