/usr/share/perl5/Acme/Brainfuck.pm is in libacme-brainfck-perl 1.1.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | #
# See POD documentation below for description, copyright and licensing info.
#
# $Id: Brainfuck.pm,v 1.5 2002/09/23 02:26:31 jaldhar Exp $
#
package Acme::Brainfuck;
use Filter::Simple;
use strict;
use warnings;
#remember to change this in the POD too.
our $VERSION = '1.1.1';
# The memory pointer and memory cells of our Turing machine.
our $p = 0;
our @m = ();
# The basic Brainfuck instructions. Extras will be added in import().
our $ops = '+-<>,.[]';
# Whether or not we accept extra instructions.
our $verbose = 0;
# print out filtered text?
our $debug = 0;
sub import()
{
shift;
foreach (@_)
{
if (/^verbose$/)
{
$ops .= '~#';
$verbose = 1;
}
if (/^debug$/)
{
$debug = 1;
}
}
}
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;
}
$code =~ s/P/\$Acme::Brainfuck::m\[\$Acme::Brainfuck::p\]/g;
substr($ret, $at, $len, $code);
}
$_ = $ret;
print $_ if $debug;
};
1;
__END__
=pod
=head1 NAME
Acme::Brainfuck - Embed Brainfuck in your perl code
=head1 SYNOPSIS
#!/usr/bin/env perl
use Acme::Brainfuck;
print 'Hello world!', chr ++++++++++. ;
=head1 DESCRIPTION
Brainfuck is about the tiniest Turing-complete programming language you
can get. A language is Turing-complete if it can model the operations of
a Turing machine--an abstract model of a computer defined by the British
mathematician Alan Turing in 1936. A Turing machine consists only of an
endless sequence of memory cells and a pointer to one particular memory
cell. Yet it is theoretically capable of performing any computation. With
this module, you can embed Brainfuck instructions delimited by whitespace
into your perl code. It will be translated into Perl as parsed.
Brainfuck has just just 8 instructions (well more in this implementation,
see L</"Extensions to ANSI Brainfuck"> below.) which are as follows
=head2 Instructions
=over 4
=item + Increment
Increase the value of the current memory cell by one.
=item - Decrement
Decrease the value of the current memory cell by one.
=item > Forward
Move the pointer to the next memory cell.
=item < Back
Move the pointer to the previous memory cell.
=item , Input
Read a byte from Standard Input and store it in the current memory cell.
=item . Output
Write the value of the current memory cell to standard output.
=item [ Loop
If the value of the current memory cell is 0, continue to the cell after
the next ']'.
=item ] Next
Go back to the last previous '['.
=back
=head2 Extensions to ANSI Brainfuck
This implementation has extra instructions available. In order to avoid such
terrible bloat, they are only available if you use the I<verbose> pragma like
so:
use Acme::Brainfuck qw/verbose/;
The extra instructions are:
=over 4
=item ~ Reset
Resets the pointer to the first memory cell and clear all memory cells.
=item # Peek
Prints the values of the memory pointer and the current memory cell to
STDERR. See also L</"Debugging"> below.
=back
=head2 Debugging
By using the I<debug> pragma like this:
use Acme::Brainfuck qw/debug/;
you can dump out the generated perl code. (Caution: it is not pretty.)
The key to understanding it is that the memory pointer is represented by
I<$p>, and the memory array by I<@m> Therefore the value of the current
memory cell is I<$m[$p]>.
=head1 RETURN VALUE
Each sequence of Brainfuck instructions becomes a Perl block and returns the
value of the current memory cell.
=head1 EXAMPLES
=head2 JABH
#!/usr/bin/env perl
use Acme::Brainfuck;
print "Just another ";
++++++[>++++++++++++++++<-]>
++.--
>+++[<++++++>-]<.>[-]+++[<------>-]<
+.-
+++++++++.---------
++++++++++++++.--------------
++++++.------
>+++[<+++++++>-]<.>[-]+++[<------->-]<
+++.---
+++++++++++.-----------
print " hacker.\n";
=head2 Countdown
#!/usr/bin/env perl
use strict;
use Acme::Brainfuck qw/verbose/;
print "Countdown commencing...\n";
++++++++++[>+>+<<-]
>>+++++++++++++++++++++++++++++++++++++++++++++++<<
++++++++++[>>.-<.<-]
print "We have liftoff!\n";
=head2 Reverse
#!/usr/bin/env perl
use Acme::Brainfuck qw/verbose/;
while(1)
{
print "Say something to Backwards Man and then press enter: ";
+[->,----------]<
print 'Backwards Man says, "';
[+++++++++++.<]<
print "\" to you too.\n";
~
}
=head2 Math
#!/usr/bin/env perl
use Acme::Brainfuck;
use strict;
use warnings;
my $answer = +++[>++++++<-]> ;
print "3 * 6 = $answer \n";
=head1 VERSION
1.1.1 Apr 06, 2004
=head1 AUTHOR
Jaldhar H. Vyas E<lt>jaldhar@braincells.comE<gt>
=head1 THANKS
Urban Mueller - The inventor of Brainfuck.
Damian Conway - For twisting perl to hitherto unimaginable heights of
weirdness.
Marco Nippula E<lt>http://www.hut.fi/~mnippula/E<gt> - Some code in this
module comes from his F<brainfuck.pl>
Mr. Rock - Who has a nice Brainfuck tutorial at
L<http://www.cydathria.com/bf/>. Some of the example code comes from there.
=head1 COPYRIGHT AND LICENSE
Copyright (c) 2004, Consolidated Braincells Inc.
Licensed with no warranties under the Crowley Public License:
"Do what thou wilt shall be the whole of the license."
=cut
|