Acme-Brainfuck
view release on metacpan or search on metacpan
lib/Acme/Brainfuck.pm view on Meta::CPAN
}
}
}
FILTER_ONLY code => sub
{
my $ret = $_;
while ($ret =~ /\s ([\Q$ops\E]+) \s/gsx)
{
my $code = $1;
my $len = length($1);
my $at = pos($ret) - ($len + 1);
$code =~ s/^/do { /g;
$code =~ s/$/P; }; /g;
$code =~ s/(\++)/"P += ".length($1).";" /eg;
$code =~ s/(\-+)/"P -= ".length($1).";" /eg;
$code =~ s/(<+)/"\$Acme::Brainfuck::p -= ".length($1).";" /eg;
$code =~ s/(>+)/"\$Acme::Brainfuck::p += ".length($1).";" /eg;
$code =~ s/\./print chr P; /g;
$code =~ s/,/P = ord getc;/g;
$code =~ s/\[/while(P){/g;
$code =~ s/\]/}; /g;
if ($verbose)
{
$code =~
s/~/\$Acme::Brainfuck::p = 0;\@Acme::Brainfuck::m = (); /g;
$code =~
s/\#/print STDERR sprintf\('\$p = %d \$m[\$p]= %d', \$Acme::Brainfuck::p, P\), "\\n"; /g;
sub FILENO {
my $class = shift;
return $class->{FILENO};
}
sub WRITE {
my $class = shift;
my($buf,$len,$offset) = @_;
$offset = 0 if (! defined $offset);
my $data = substr($buf, $offset, $len);
my $n = length($data);
$class->print($data);
return $n;
}
sub PRINT {
my $class = shift;
${$class->{data}} .= join('', @_);
$class->{position} = length(${$class->{data}});
1;
}
sub PRINTF {
my $class = shift;
my $fmt = shift;
$class->PRINT(sprintf $fmt, @_);
}
sub READ {
my $class = shift;
my ($buf,$len,$offset) = @_;
$offset = 0 if (! defined $offset);
my $data = ${ $class->{data} };
if ($class->{end} >= length($data)) {
return 0;
}
$buf = substr($data,$offset,$len);
$_[0] = $buf;
$class->{end} += length($buf);
return length($buf);
}
sub READLINE {
my $class = shift;
if ($class->{end} >= length(${ $class->{data} })) {
return undef;
}
my $recsep = $/;
my $rod = substr(${ $class->{data} }, $class->{end}, -1);
$rod =~ m/^(.*)$recsep{0,1}/; # use 0,1 for line sep to include possible no \n on last line
my $line = $1 . $recsep;
$class->{end} += length($line);
return $line;
}
sub CLOSE {
my $class = shift;
if (-e $class->{tmpfile}) {
$class->{fh}->close();
unlink $class->{tmpfile} or warn $!;
}
$class = undef;
( run in 0.903 second using v1.01-cache-2.11-cpan-65fba6d93b7 )