From: Steinar H. Gunderson Date: Sun, 15 Jun 2014 14:29:04 +0000 (+0200) Subject: Split some UCI stuff into a separate module. X-Git-Url: https://git.sesse.net/?p=remoteglot;a=commitdiff_plain;h=c5722d685ee1354ce6466c1cf3ec947c0045ec14;ds=sidebyside Split some UCI stuff into a separate module. --- 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; diff --git a/remoteglot.pl b/remoteglot.pl index 72eb40a..a4f4ff4 100755 --- a/remoteglot.pl +++ b/remoteglot.pl @@ -15,6 +15,7 @@ use IPC::Open2; use Time::HiRes; use JSON::XS; require 'Position.pm'; +require 'Engine.pm'; use strict; use warnings; @@ -189,7 +190,7 @@ while (1) { # any fun on the UCI channel? if ($nfound > 0 && vec($rout, fileno($engine->{'read'}), 1) == 1) { - my @lines = read_lines($engine); + my @lines = $engine->read_lines(); for my $line (@lines) { next if $line =~ /(upper|lower)bound/; handle_uci($engine, $line, 1); @@ -199,7 +200,7 @@ while (1) { output(); } if (defined($engine2) && $nfound > 0 && vec($rout, fileno($engine2->{'read'}), 1) == 1) { - my @lines = read_lines($engine2); + my @lines = $engine2->read_lines(); for my $line (@lines) { next if $line =~ /(upper|lower)bound/; handle_uci($engine2, $line, 0); @@ -577,7 +578,7 @@ sub output_json { sub uciprint { my ($engine, $msg) = @_; - print { $engine->{'write'} } "$msg\n"; + $engine->print($msg); print UCILOG localtime() . " $engine->{'tag'} => $msg\n"; } @@ -716,65 +717,25 @@ sub book_info { sub open_engine { my ($cmdline, $tag) = @_; - return undef if (!defined($cmdline)); - - my ($uciread, $uciwrite); - my $pid = IPC::Open2::open2($uciread, $uciwrite, $cmdline); - - my $engine = { - pid => $pid, - read => $uciread, - readbuf => '', - write => $uciwrite, - info => {}, - ids => {}, - tag => $tag, - }; + my $engine = Engine->open($cmdline, $tag); uciprint($engine, "uci"); # gobble the options - while (<$uciread>) { - /uciok/ && last; - handle_uci($engine, $_); + my $seen_uciok = 0; + while (!$seen_uciok) { + for my $line ($engine->read_lines()) { + if ($line =~ /uciok/) { + $seen_uciok = 1; + } + handle_uci($engine, $line); + } } return $engine; } -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; -} - sub col_letter_to_num { return ord(shift) - ord('a'); }