| 
<?php 
 /****
 ****
 *** @ Brainf_ck interpreter class
 *** @ Developed by Takis Maletsas
 ****
 ****/
 
 class Brainfuck
 {
 private $source = [], $charset = [">", "<", "+", "-", ".", ",", "[", "]"], $cells, $pointer = 0;
 
 public function __construct($source)
 {
 foreach (str_split($source) as $ch)
 if (in_array($ch, $this->charset))
 $this->source[] = $ch;
 
 $this->cells = array_fill(0, 30000, 0);
 
 $this->parse($this->source);
 }
 
 private function parse($source)
 {
 for ($i = 0; $i < count($source); $i++)
 switch ($source[$i])
 {
 case '>': $this->incPtr(); break;
 case '<': $this->decPtr(); break;
 case '+': $this->incVal(); break;
 case '-': $this->decVal(); break;
 case ',': $this->inpVal(); break;
 case '.': $this->outVal(); break;
 case '[':
 $pointer = $this->pointer;
 
 $skip = 0;
 $char = @$source[++$i];
 
 while ($char)
 {
 if ($char == '[')
 $skip++;
 
 if ($char == ']')
 {
 if (!$skip)
 break;
 else
 $skip--;
 }
 
 $loop[] = $char;
 $char   = @$source[++$i];
 }
 
 while ($this->cells[$pointer])
 $this->parse($loop);
 
 break;
 }
 }
 
 private function incVal()
 {
 $this->cells[$this->pointer]++;
 $this->cells[$this->pointer] %= 255;
 }
 
 private function decVal()
 {
 if (--$this->cells[$this->pointer] < 0)
 $this->cells[$this->pointer] = 255;
 }
 
 private function incPtr()
 {
 if (++$this->pointer > 29999)
 exit("Brainfuck: Cell overflow.");
 }
 
 private function decPtr()
 {
 if (--$this->pointer < 0)
 exit("Brainfuck: Cell underflow.");
 }
 
 private function inpVal()
 {
 echo "Input: ";
 $this->cells[$this->pointer] = ord(fread(STDIN, 1));
 }
 
 private function outVal()
 {
 echo chr($this->cells[$this->pointer]);
 }
 }
 
 ?>
 |