File Coverage

blib/lib/Acme/Brainfuck.pm
Criterion Covered Total %
statement 9 9 100.0
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 12 12 100.0


line stmt bran cond sub pod time code
1             #
2             # See POD documentation below for description, copyright and licensing info.
3             #
4             # $Id: Brainfuck.pm,v 1.5 2002/09/23 02:26:31 jaldhar Exp $
5             #
6             package Acme::Brainfuck;
7 1     1   51080 use Filter::Simple;
  1         81002  
  1         8  
8 1     1   49 use strict;
  1         2  
  1         40  
9 1     1   6 use warnings;
  1         3  
  1         1487  
10              
11             #remember to change this in the POD too.
12             our $VERSION = '1.1.1';
13            
14             # The memory pointer and memory cells of our Turing machine.
15             our $p = 0;
16             our @m = ();
17              
18             # The basic Brainfuck instructions. Extras will be added in import().
19             our $ops = '+-<>,.[]';
20              
21             # Whether or not we accept extra instructions.
22             our $verbose = 0;
23              
24             # print out filtered text?
25             our $debug = 0;
26              
27             sub import()
28             {
29             shift;
30             foreach (@_)
31             {
32             if (/^verbose$/)
33             {
34             $ops .= '~#';
35             $verbose = 1;
36             }
37             if (/^debug$/)
38             {
39             $debug = 1;
40             }
41             }
42             }
43              
44             FILTER_ONLY code => sub
45             {
46             my $ret = $_;
47             while ($ret =~ /\s ([\Q$ops\E]+) \s/gsx)
48             {
49             my $code = $1;
50             my $len = length($1);
51             my $at = pos($ret) - ($len + 1);
52              
53             $code =~ s/^/do { /g;
54             $code =~ s/$/P; }; /g;
55             $code =~ s/(\++)/"P += ".length($1).";" /eg;
56             $code =~ s/(\-+)/"P -= ".length($1).";" /eg;
57             $code =~ s/(<+)/"\$Acme::Brainfuck::p -= ".length($1).";" /eg;
58             $code =~ s/(>+)/"\$Acme::Brainfuck::p += ".length($1).";" /eg;
59             $code =~ s/\./print chr P; /g;
60             $code =~ s/,/P = ord getc;/g;
61             $code =~ s/\[/while(P){/g;
62             $code =~ s/\]/}; /g;
63             if ($verbose)
64             {
65             $code =~
66             s/~/\$Acme::Brainfuck::p = 0;\@Acme::Brainfuck::m = (); /g;
67             $code =~
68             s/\#/print STDERR sprintf\('\$p = %d \$m[\$p]= %d', \$Acme::Brainfuck::p, P\), "\\n"; /g;
69             }
70             $code =~ s/P/\$Acme::Brainfuck::m\[\$Acme::Brainfuck::p\]/g;
71             substr($ret, $at, $len, $code);
72             }
73             $_ = $ret;
74             print $_ if $debug;
75             };
76              
77             1;
78              
79             __END__