Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- integer ERR_OPEN_BRACKET = 1;
- integer ERR_UNEXPECTED_CLOSING_BRACKET = 2;
- integer COMMAND_CHANNEL = 0;
- integer INPUT_CHANNEL = 1;
- list gMemory;
- integer gDataPtr;
- list gJumpStack;
- string gOutput;
- string gInput;
- string ASCII_CHARSET = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬ ®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
- setValue(integer value)
- {
- gMemory = llListReplaceList(gMemory, [value], gDataPtr, gDataPtr);
- updateText();
- }
- integer interpret(string code)
- {
- integer length = llStringLength(code);
- integer i;
- for (; i<length; ++i)
- {
- string char = llGetSubString(code, i, i);
- if (char == ">")
- {
- increasePtr();
- }
- else if (char == "<")
- {
- decreasePtr();
- }
- else if (char == "+")
- {
- integer value = llList2Integer(gMemory, gDataPtr) + 1;
- if (value > 255)
- {
- value = 0;
- }
- setValue(value);
- }
- else if (char == "-")
- {
- integer value = llList2Integer(gMemory, gDataPtr) - 1;
- if (value < 0)
- {
- value = 255;
- }
- setValue(value);
- }
- else if (char == "[")
- {
- if (llList2Integer(gMemory, gDataPtr) != 0)
- {
- gJumpStack += [i];
- }
- else
- {
- integer find = llSubStringIndex(llGetSubString(code, i, -1), "]");
- if (find > -1)
- {
- i += find;
- }
- else
- {
- return ERR_OPEN_BRACKET;
- }
- }
- }
- else if (char == "]")
- {
- integer length = llGetListLength(gJumpStack);
- if (llList2Integer(gMemory, gDataPtr) != 0)
- {
- if (length > 0)
- {
- i = llList2Integer(gJumpStack, length - 1);
- }
- else
- {
- return ERR_UNEXPECTED_CLOSING_BRACKET;
- }
- }
- else
- {
- integer last_index = length - 1;
- gJumpStack = llDeleteSubList(gJumpStack, last_index, last_index);
- }
- }
- else if (char == ",")
- {
- integer index = llSubStringIndex(ASCII_CHARSET, llGetSubString(gInput, 0, 0));
- if (index > -1)
- {
- setValue(index);
- }
- else
- {
- setValue(0);
- }
- gInput = llDeleteSubString(gInput, 0, 0);
- }
- else if (char == ".")
- {
- gOutput += getFromCharCode(llList2Integer(gMemory, gDataPtr));
- llSetTimerEvent(3600);
- updateText();
- }
- }
- if (llGetListLength(gJumpStack) > 0)
- {
- return ERR_OPEN_BRACKET;
- }
- return 0;
- }
- string getFromCharCode(integer code)
- {
- if (code > -1 && code < llStringLength(ASCII_CHARSET))
- {
- return llGetSubString(ASCII_CHARSET, code, code);
- }
- return " ";
- }
- increasePtr()
- {
- ++gDataPtr;
- if (gDataPtr >= llGetListLength(gMemory))
- {
- gMemory += [0];
- }
- updateText();
- }
- decreasePtr()
- {
- if (gDataPtr > 0)
- {
- --gDataPtr;
- }
- updateText();
- }
- updateText()
- {
- llSetText("Brainfuck Interpreter\n" +
- "[ " + (string)llList2Integer(gMemory, gDataPtr) + " ]\n \n" +
- "Pointer: " + (string)gDataPtr + "\n \n" +
- gOutput, <0,1,0>, 1);
- }
- default
- {
- state_entry()
- {
- updateText();
- llListen(0, "", "", "");
- llListen(1, "", "", "");
- }
- listen(integer channel, string name, key id, string msg)
- {
- if (channel == COMMAND_CHANNEL)
- {
- integer status = interpret(msg);
- if (status == ERR_OPEN_BRACKET)
- {
- llSay(0, "Error: Unclosed open bracket.");
- }
- else if (status == ERR_UNEXPECTED_CLOSING_BRACKET)
- {
- llSay(0, "Error: Unexpected closing bracket.");
- }
- }
- else if (channel == INPUT_CHANNEL)
- {
- gInput = msg;
- }
- }
- timer()
- {
- llSetTimerEvent(0);
- gOutput = "";
- updateText();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement