Brainf*** Interpreter

(http://www.gnu.org/copyleft/fdl.html) in the spirit of which this script is GPL'd. Copyright (C) 2013 Subus Tremor
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
This is an esoteric language - that implies a useless programming language (except for the fun of it). 
It interprets correct Brainf*** code. 
There is no debugging etc. provided.
Create a box, and drop this script in it. Then edit the script and assign a valid Brainf*** program code to variable program.
Save the script and touch your box to run the code
<lsl>
// The esoteric computer language Brainf*** - Interpreter for SL by Subus Tremor
//
// Data to the Interpreter - replace the string by any valid Brainf*** program
// if it's a valid progam AND has correct syntax AND does not run out of space -
// then it runs :-) otherwise not :-( have fun.
//sample program1
string program1 = "Hello World program
++++++++++ initialize
[ start loop
>+++++++>++++++++++>+++>+<<<<- set some values
] end loop
>++. H out
>+. e out
+++++++. l out
. l out
+++. o out
>++. blank out
<<+++++++++++++++. W out
>. o out
+++. r out
------. l out
--------. d out
>+. ! out
>. lineend 
";
//sample program2
string program2 = "this brainf*** program asks for your name and then greets you
>+++++++++++[<++++++++>-]<-.>++++[<++++>-]<+.-------.>+++++
[<++++>-]<-.[-]>++++++++[<++++>-]<.>+++++++++[<++++++++>-]<
+.++++++++++.[-]>++++++++[<++++>-]<.>+++++++++++[<++++++++>
-]<+.----------.++++++.---.[-]>++++++++[<++++>-]<.>++++++++
+++++[<++++++>-]<.-------------.++++++++++++.--------.>++++
++[<------>-]<--.[-]+++++++++++++.---.[-]+[>,-------------]
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[
-]>++++++++[<++++>-]<.[-]<-[<-]>[++++++++++++++.>]+++++++++
+.";
list input = [82, 117, 116, 104, 13]; // input Ruth (the "name" the program is asking for)
integer n=0;
// The Brainf*** interpreter
integer commandpointer = 0; //point to 0 at start
string command = ""; 
list storage = ["0"]; //first storage cell inizialized to 0
integer cellpointer = 0;
integer cell=0; 
string bfelements = "+-><[].,"; //the Brainf*** commands
integer pl=0; //program lenght
integer pc=0; //blockcounter
integer si=0; //stackindex
string program; //contains the progeam to be interpreted
list blocklist;
integer waitforchar=FALSE;
makeblocklist() { // to avoid searching - loop structure [ ] is evaluated in advance
 integer i=0;
 list stack;
 integer s;
 integer ie = llStringLength(program);
 for(; i < ie; i+=1) {
 if(llGetSubString(program, i, i)=="[") { //begin
 stack = i + stack; 
 }
 if(llGetSubString(program, i, i)=="]") { //end
 if(llGetListLength(stack)>0) {
 s = llList2Integer(stack,0);
 stack = llDeleteSubList(stack,0,0);
 blocklist = blocklist + s + i;
 } 
 }
 } 
}
default
{
 state_entry()
 {
 program=program1; // assign valid Brainf*** code to the variable program
 // either program1 or program2 or your own code
 makeblocklist(); // build the loop structure in advance
 }
 touch_start(integer total_number)
 {
 llSay(0,"Interpreter start");
 state interpret;
 }
}
state interpret {
 state_entry() // run the Brainf*** Interpreter
 {
 do { // interpret the Brainf*** code in variable program
 command = llGetSubString( program, commandpointer, commandpointer );
 if(command=="+") { // increment cell at cellpointer
 cell = llList2Integer(storage,cellpointer)+1;
 storage = llListReplaceList(storage, [cell], cellpointer, cellpointer);
 }
 if(command=="-") { // decrement cell at cellpointer
 cell = llList2Integer(storage,cellpointer)-1;
 storage = llListReplaceList(storage, [cell], cellpointer, cellpointer);
 }
 if(command==">") { // point at next cell
 if((llGetListLength(storage)-1)==cellpointer) storage += 0;
 cellpointer+=1;
 cell = llList2Integer(storage,cellpointer);
 }
 if(command=="<") { // point ar previous cell
 cellpointer-=1;
 cell = llList2Integer(storage,cellpointer);
 }
 if(command==".") { // output one character
 cell = llList2Integer(storage,cellpointer);
 llSay(0,llGetSubString(llBase64ToString(llIntegerToBase64((integer)cell << 24)),0,0));
 }
 if(command==",") { // input one character
 if(waitforchar==FALSE) {
 waitforchar=TRUE;
 llSay(0,"reading 1 input char now");
 state waitchar;
 }
 else {
 waitforchar = FALSE;
 storage = llListReplaceList(storage, [cell], cellpointer, cellpointer);
 }
 } 
 if(((command=="]")&&(cell!=0))||((command=="[")&&(cell==0))) { // handle loops 
 integer bindex = llListFindList(blocklist,[commandpointer]);
 if(command=="[") bindex++; else bindex--;
 commandpointer = llList2Integer(blocklist, bindex)+1;
 }
 else commandpointer++; // point at next instruction
 } while (commandpointer<llStringLength(program)-1);
 llSay(0,"Interpreter finished");
 llResetScript();
 }
}
state waitchar {
 state_entry() // get inputcharacters, input ends if char hex 13 is detected
 {
 if(n<llGetListLength(input)) {
 cell = llList2Integer(input,n);
 n++;
 }
 state interpret; 
 } 
}
</lsl>