Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2018
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. integer ERR_OPEN_BRACKET = 1;
  2. integer ERR_UNEXPECTED_CLOSING_BRACKET = 2;
  3.  
  4. integer COMMAND_CHANNEL = 0;
  5. integer INPUT_CHANNEL = 1;
  6.  
  7. list gMemory;
  8. integer gDataPtr;
  9. list gJumpStack;
  10. string gOutput;
  11. string gInput;
  12.  
  13. string ASCII_CHARSET = "                                 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ € ‚ƒ„…†‡ˆ‰Š‹Œ Ž  ‘’“”•–—˜™š›œ žŸ  ¡¢£¤¥¦§¨©ª«¬ ­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
  14.  
  15.  
  16. setValue(integer value)
  17. {
  18.     gMemory = llListReplaceList(gMemory, [value], gDataPtr, gDataPtr);
  19.     updateText();
  20. }
  21.    
  22. integer interpret(string code)
  23. {
  24.     integer length = llStringLength(code);
  25.     integer i;
  26.     for (; i<length; ++i)
  27.     {
  28.         string char = llGetSubString(code, i, i);
  29.         if (char == ">")
  30.         {
  31.             increasePtr();
  32.         }
  33.         else if (char == "<")
  34.         {
  35.             decreasePtr();
  36.         }
  37.         else if (char == "+")
  38.         {
  39.             integer value = llList2Integer(gMemory, gDataPtr) + 1;
  40.             if (value > 255)
  41.             {
  42.                 value = 0;
  43.             }
  44.            
  45.             setValue(value);
  46.         }
  47.         else if (char == "-")
  48.         {
  49.             integer value = llList2Integer(gMemory, gDataPtr) - 1;
  50.             if (value < 0)
  51.             {
  52.                 value = 255;
  53.             }
  54.            
  55.             setValue(value);
  56.         }
  57.         else if (char == "[")
  58.         {
  59.             if (llList2Integer(gMemory, gDataPtr) != 0)
  60.             {
  61.                 gJumpStack += [i];
  62.             }
  63.             else
  64.             {
  65.                 integer find = llSubStringIndex(llGetSubString(code, i, -1), "]");
  66.                 if (find > -1)
  67.                 {
  68.                     i += find;
  69.                 }
  70.                 else
  71.                 {
  72.                     return ERR_OPEN_BRACKET;
  73.                 }
  74.             }
  75.         }
  76.         else if (char == "]")
  77.         {
  78.             integer length = llGetListLength(gJumpStack);
  79.             if (llList2Integer(gMemory, gDataPtr) != 0)
  80.             {
  81.                 if (length > 0)
  82.                 {
  83.                     i = llList2Integer(gJumpStack, length - 1);
  84.                 }
  85.                 else
  86.                 {
  87.                     return ERR_UNEXPECTED_CLOSING_BRACKET;
  88.                 }
  89.             }
  90.             else
  91.             {
  92.                 integer last_index = length - 1;
  93.                 gJumpStack = llDeleteSubList(gJumpStack, last_index, last_index);
  94.             }
  95.         }
  96.         else if (char == ",")
  97.         {
  98.             integer index = llSubStringIndex(ASCII_CHARSET, llGetSubString(gInput, 0, 0));
  99.             if (index > -1)
  100.             {
  101.                 setValue(index);
  102.             }
  103.             else
  104.             {
  105.                 setValue(0);
  106.             }
  107.            
  108.             gInput = llDeleteSubString(gInput, 0, 0);
  109.         }
  110.         else if (char == ".")
  111.         {
  112.             gOutput += getFromCharCode(llList2Integer(gMemory, gDataPtr));
  113.             llSetTimerEvent(3600);
  114.             updateText();
  115.         }
  116.     }
  117.    
  118.     if (llGetListLength(gJumpStack) > 0)
  119.     {
  120.         return ERR_OPEN_BRACKET;
  121.     }
  122.     return 0;
  123. }
  124.  
  125. string getFromCharCode(integer code)
  126. {
  127.     if (code > -1 && code < llStringLength(ASCII_CHARSET))
  128.     {
  129.         return llGetSubString(ASCII_CHARSET, code, code);
  130.     }
  131.    
  132.     return " ";
  133. }
  134.  
  135. increasePtr()
  136. {
  137.     ++gDataPtr;
  138.     if (gDataPtr >= llGetListLength(gMemory))
  139.     {
  140.         gMemory += [0];
  141.     }
  142.    
  143.     updateText();
  144. }
  145.  
  146. decreasePtr()
  147. {
  148.     if (gDataPtr > 0)
  149.     {
  150.         --gDataPtr;
  151.     }
  152.    
  153.     updateText();
  154. }
  155.  
  156. updateText()
  157. {
  158.     llSetText("Brainfuck Interpreter\n" +
  159.     "[ " + (string)llList2Integer(gMemory, gDataPtr) + " ]\n \n" +
  160.     "Pointer: " + (string)gDataPtr + "\n \n" +
  161.     gOutput, <0,1,0>, 1);
  162. }
  163.  
  164. default
  165. {
  166.     state_entry()
  167.     {
  168.         updateText();
  169.         llListen(0, "", "", "");
  170.         llListen(1, "", "", "");
  171.     }
  172.  
  173.     listen(integer channel, string name, key id, string msg)
  174.     {
  175.         if (channel == COMMAND_CHANNEL)
  176.         {
  177.             integer status = interpret(msg);
  178.             if (status == ERR_OPEN_BRACKET)
  179.             {
  180.                 llSay(0, "Error: Unclosed open bracket.");
  181.             }
  182.             else if (status == ERR_UNEXPECTED_CLOSING_BRACKET)
  183.             {
  184.                 llSay(0, "Error: Unexpected closing bracket.");
  185.             }
  186.         }
  187.         else if (channel == INPUT_CHANNEL)
  188.         {
  189.             gInput = msg;
  190.         }
  191.     }
  192.    
  193.     timer()
  194.     {
  195.         llSetTimerEvent(0);
  196.         gOutput = "";
  197.         updateText();
  198.     }
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement