X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=Engine.pm;fp=Engine.pm;h=f2c6545213f67c1168c17f7e65bd8c730404467f;hb=c5722d685ee1354ce6466c1cf3ec947c0045ec14;hp=0000000000000000000000000000000000000000;hpb=693c37120d34bddafca03c4adabba49f9de19faf;p=remoteglot-book diff --git a/Engine.pm b/Engine.pm new file mode 100644 index 0000000..f2c6545 --- /dev/null +++ b/Engine.pm @@ -0,0 +1,65 @@ +#! /usr/bin/perl +use strict; +use warnings; + +package Engine; + +sub open { + my ($class, $cmdline, $tag) = @_; + + my ($uciread, $uciwrite); + my $pid = IPC::Open2::open2($uciread, $uciwrite, $cmdline); + + my $engine = { + pid => $pid, + read => $uciread, + readbuf => '', + write => $uciwrite, + info => {}, + ids => {}, + tag => $tag, + }; + + return bless $engine; +} + +sub print { + my ($engine, $msg) = @_; + print { $engine->{'write'} } "$msg\n"; +} + +sub read_lines { + my $engine = shift; + + # + # Read until we've got a full line -- if the engine sends part of + # a line and then stops we're pretty much hosed, but that should + # never happen. + # + while ($engine->{'readbuf'} !~ /\n/) { + my $tmp; + my $ret = sysread $engine->{'read'}, $tmp, 4096; + + if (!defined($ret)) { + next if ($!{EINTR}); + die "error in reading from the UCI engine: $!"; + } elsif ($ret == 0) { + die "EOF from UCI engine"; + } + + $engine->{'readbuf'} .= $tmp; + } + + # Blah. + my @lines = (); + while ($engine->{'readbuf'} =~ s/^([^\n]*)\n//) { + my $line = $1; + $line =~ tr/\r\n//d; + push @lines, $line; + } + return @lines; +} + + + +1;