Festival-Client-Async
view release on metacpan or search on metacpan
my $count = 0;
my $burf = sysread $fh, my($rbuf), 4096;
print "read $burf bytes\n" if DEBUG;
$self->{inbuf} .= $rbuf;
CHUNK:
while (length($self->{inbuf}) > 0) {
# In the middle of a tag?
if ($self->{intag}) {
# Look for the stuff key
if ((my $i = index($self->{inbuf}, KEY)) != $[-1) {
if (substr($self->{inbuf}, $i+KEYLEN, 1) eq 'X') {
# If there's an X at the end, it's literal
substr($self->{inbuf}, $i+KEYLEN, 1) = "";
} else {
# Otherwise, we've got a complete waveform/expr/whatever
push @{$self->{inq}{$self->{intag}}},
substr($self->{inbuf}, 0, $i);
print "queued $i bytes of $self->{intag}\n" if DEBUG;
substr($self->{inbuf}, 0, $i+KEYLEN) = "";
$self->{intag} = "";
my ($rbuf, $rest, $tag);
print $fh $lisp;
while (defined($rbuf = $rest) or defined($rbuf = <$fh>)) {
undef $rest;
if ($rbuf =~ s/^(WV|LP|ER|OK)\n$//s) {
$tag = $1;
last if $tag eq 'OK' or $tag eq 'ER';
}
if ((my $i = index($rbuf, KEY)) != $[-1) {
if (substr($rbuf, $i+KEYLEN, 1) eq 'X') {
substr($rbuf, $i+KEYLEN, 1) = "";
} else {
$rest = substr($rbuf, $i+KEYLEN);
substr($rbuf, $i) = "";
}
}
if (defined $tag and exists $actions->{$tag}) {
$actions->{$tag}->($rbuf);
( run in 0.626 second using v1.01-cache-2.11-cpan-cc502c75498 )