Czervik LSL Computer

From Second Life Wiki
Jump to navigation Jump to search

The below code is some code being written by Xaviar Czervik. It isn't even partially done, and if I were a programmer it'd be version 0.00.0.000.0.01, although I don't do that... So, if you're interested in crashing the LSL compiler (This code doesn't compile 99% of the time) check out the code below. And in case you couldn't tell, I don't believe in comments.


<lsl> key kQuery; integer iLine = 0;

list ifStack;

list stringsName; list strings; list intsName; list ints;

string getType(string s) {

   if ((string)((integer)s) == s)
   return "int";
   return "str";

}

fail(string error) {

   llOwnerSay("Run-time Error: " + error);
   llResetScript();

}

integer ifTest() {

   integer i = 0;
   if (llGetListLength(ifStack) == 0)
       return 1;
   while (i < llGetListLength(ifStack)) {
       string ifStr = llList2String(ifStack, 0);
       list ll = llParseString2List(ifStr, [" "], []);
       list ld = [];
       integer pos;
       pos = llListFindList(stringsName, [llList2String(ll, 1)]);
       llOwnerSay("Looking up '" + llList2String(ll, 1) + "'.");
       if (pos != -1) {
           ld += llList2String(stringsName, pos);
           ld += "";
           pos = llListFindList(stringsName, [llList2String(ll, 3)]);
           ld += llList2String(stringsName, pos);
       } else if (llListFindList(intsName, [llList2String(ll, 1)]) != -1) {
           ld += llList2String(intsName, pos);
           ld += 0;
           pos = llListFindList(intsName, [llList2String(ll, 3)]);
           ld += llList2String(intsName, pos);
       } else {
           fail("Variable not found on line " + (string)iLine + ".");
       }
       string typeFirst  = getType(llList2String(ld, 1));
       string typeSecond = getType(llList2String(ld, 3));
       if (typeFirst == "str" || typeSecond == "str") {
           if (llList2String(ld, 2) == "==") {
               if (llList2String(ld, 1) == llList2String(ld, 3)) {} else {
                   return 0;
               }
           } else if (llList2String(ld, 2) == "!=") {
               if (llList2String(ld, 1) != llList2String(ld, 3)) {} else {
                   return 0;
               }
           } else {
               fail("Can not compare two strings using the " + llList2String(ld, 2) + " opperator.");
           }
       } else {
           if (llList2String(ld, 2) == "==") {
               if (llList2String(ld, 1) == llList2String(ld, 3)) {} else {
                   return 0;
               }
           } else if (llList2String(ld, 2) == "!=") {
               if (llList2String(ld, 1) != llList2String(ld, 3)) {} else {
                   return 0;
               }
           } else if (llList2String(ld, 2) == "<") {
               if ((integer)llList2String(ld, 1) < (integer)llList2String(ld, 3)) {} else {
                   return 0;
               }
           } else if (llList2String(ld, 2) == ">") {
               if ((integer)llList2String(ld, 1) > (integer)llList2String(ld, 3)) {} else {
                   return 0;
               }
           } else if (llList2String(ld, 2) == "<=") {
               if ((integer)llList2String(ld, 1) <= (integer)llList2String(ld, 3)) {} else {
                   return 0;
               }
           } else if (llList2String(ld, 2) == ">=") {
               if ((integer)llList2String(ld, 1) >= (integer)llList2String(ld, 3)) {} else {
                   return 0;
               }
           } else {
               fail("Can not compare two ints using the " + llList2String(ld, 2) + " opperator.");
           }
       }
       i++;
   }
   return 1;

}

default {

   touch_start(integer i) {
       llSay(0, "Starting Program...");
       kQuery = llGetNotecardLine("Program", iLine);
   }
   
   changed(integer i) {
       llResetScript();
   }
   dataserver(key query_id, string data) {
       llOwnerSay(data);
       if (data == EOF) {    
           llSay(0, "Ending Program.");
       } else {
           if (data == ":")
               ifStack = llListReplaceList(ifStack, [], llGetListLength(ifStack) - 1, llGetListLength(ifStack) - 1);
           if (ifTest()) {
               list ld = llParseString2List(data, [" "], []);
               if (llList2String(ld, 0) == "str") {
                   llOwnerSay("Init: " + llList2String(ld, 1));
                   stringsName += llList2String(ld, 1);
                   strings += llGetSubString(llList2String(ld, 3), 1, -2);
                   llOwnerSay("-----VAR: " + llList2CSV(strings));
               } else if (llList2String(ld, 0) == "int") {
                   intsName += (integer)llList2String(ld, 1);
                   ints += (integer)llList2String(ld, 3);
               } else if (llList2String(ld, 0) == "?") {
                   ifStack += data;
               } else if (llList2String(ld, 0) == "say") {
                   llOwnerSay("Say: " + data);
                   integer pos = llListFindList(stringsName, [llList2String(ld, 1)]);
                   if (pos != -1) {
                       llSay(0, llList2String(strings, pos));
                   } else {
                       integer pos = llListFindList(intsName, [(integer)llList2String(ld, 1)]);
                       if (pos != -1)
                           llSay(0, (string)llList2Integer(ints, pos));
                   }
               } else {
                   llOwnerSay("AAAA");
                   llOwnerSay("-----NAME: " + llList2CSV(stringsName));
                   integer pos = llListFindList(stringsName, [llList2String(ld, 0)]);
                   llOwnerSay(llList2String(ld, 0));
                   if (pos != -1) {
                       if (llList2String(ld, 1) == "=") {
                           llOwnerSay("-----VAR: " + llList2CSV(strings));
                           llListReplaceList(strings, [llList2String(ld, 2)], pos-1, pos-1);
                           llOwnerSay("-----VAR: " + llList2CSV(strings));
                       }
                   } else {
                       integer pos = llListFindList(intsName, [(integer)llList2String(ld, 0)]);
                       if (pos != -1) {
                           if (llList2String(ld, 1) == "=") {
                               llListReplaceList(ints, [(integer)llList2String(ld, 2)], pos, pos);
                           }
                       } else {
                           fail("Variable not found on line " + (string)iLine + ".");
                       }
                   }
               }
                   
           } else {
           }
           ++iLine;
           kQuery = llGetNotecardLine("Program", iLine);
       }
   }

} </lsl>