Difference between revisions of "User:ANSI Soderstrom/Simple LSL Array (Associative)"

From Second Life Wiki
Jump to navigation Jump to search
m
Line 77: Line 77:
   
   
         // --------------------------------------------------------------------------------
         // --------------------------------------------------------------------------------
       
         // Add new KEY/VALUE to the "Array" while the KEY is non existent
         // Add new KEY/VALUE to the "Array" while the KEY is non existent
         SOMELIST = PUT(SOMELIST,["KEY"],["VALUE"]);
         SOMELIST = PUT(SOMELIST,["KEY"],["VALUE"]);
Line 88: Line 88:
         llSay(0,GET(SOMELIST,["TEST"]));    // Output : VALUE
         llSay(0,GET(SOMELIST,["TEST"]));    // Output : VALUE
         llSay(0,GET(SOMELIST,["VALUE"]));  // Output : TEST
         llSay(0,GET(SOMELIST,["VALUE"]));  // Output : TEST
       
         // --------------------------------------------------------------------------------
         // --------------------------------------------------------------------------------
       
         // Overwrite the VALUE from the given KEY if KEY is existent
         // Overwrite the VALUE from the given KEY if KEY is existent
         SOMELIST = PUT(SOMELIST,["KEY"],["9adba1b4-a733-4a44-8275-f4a666784d8c"]);
         SOMELIST = PUT(SOMELIST,["KEY"],["9adba1b4-a733-4a44-8275-f4a666784d8c"]);
Line 101: Line 101:
         llSay(0,GET(SOMELIST,["TEST"]));    // Output : TEST
         llSay(0,GET(SOMELIST,["TEST"]));    // Output : TEST
         llSay(0,GET(SOMELIST,["VALUE"]));  // Output : VALUE       
         llSay(0,GET(SOMELIST,["VALUE"]));  // Output : VALUE       
       
         // --------------------------------------------------------------------------------
         // --------------------------------------------------------------------------------
               
         // case sensitive KEY´s
         // case sensitive KEY´s
         SOMELIST = PUT(SOMELIST,["AGENT"],[NULL_KEY]);
         SOMELIST = PUT(SOMELIST,["AGENT"],[NULL_KEY]);
         SOMELIST = PUT(SOMELIST,[AGENT],[ZERO_ROTATION]);
         SOMELIST = PUT(SOMELIST,[AGENT],[ZERO_ROTATION]);
       
         llSay(0,GET(SOMELIST,["agent"]));  // Output : 0
         llSay(0,GET(SOMELIST,["agent"]));  // Output : 0
         llSay(0,GET(SOMELIST,["AGENT"]));  // Output : 00000000-0000-0000-0000-000000000000
         llSay(0,GET(SOMELIST,["AGENT"]));  // Output : 00000000-0000-0000-0000-000000000000
         llSay(0,GET(SOMELIST,[AGENT]));    // Output : <0.000000, 0.000000, 0.000000, 1.000000>
         llSay(0,GET(SOMELIST,[AGENT]));    // Output : <0.000000, 0.000000, 0.000000, 1.000000>
       
         // --------------------------------------------------------------------------------         
         // --------------------------------------------------------------------------------         
       
         // Let us play...
         // Let us play...
         SOMELIST = PUT(SOMELIST,[AGENT],llGetObjectDetails(GET(SOMELIST,["KEY"]),([OBJECT_NAME])));   
         SOMELIST = PUT(SOMELIST,[AGENT],llGetObjectDetails(GET(SOMELIST,["KEY"]),([OBJECT_NAME])));   
Line 119: Line 119:
         llSay(0,GET(SOMELIST,["KEY"])); // Output : 9adba1b4-a733-4a44-8275-f4a666784d8c
         llSay(0,GET(SOMELIST,["KEY"])); // Output : 9adba1b4-a733-4a44-8275-f4a666784d8c
         llSay(0,GET(SOMELIST,[AGENT])); // Output : ANSI Soderstrom   
         llSay(0,GET(SOMELIST,[AGENT])); // Output : ANSI Soderstrom   
       
         // --------------------------------------------------------------------------------           
         // --------------------------------------------------------------------------------           
   
   
Line 129: Line 129:
         }  
         }  
         // Output : Not in List     
         // Output : Not in List     
       
         // --------------------------------------------------------------------------------  
         // --------------------------------------------------------------------------------  
       
         llSay(0,llList2CSV(SOMELIST));
         llSay(0,llList2CSV(SOMELIST));
         /*
         /*
Line 140: Line 140:
                         AGENT, 00000000-0000-0000-0000-000000000000
                         AGENT, 00000000-0000-0000-0000-000000000000
         */     
         */     
 
         // --------------------------------------------------------------------------------  
         // --------------------------------------------------------------------------------  
 
         // Extended behavior
         // Extended behavior
   
   
         list WHITELIST;
         list WHITELIST;
         list BLACKLIST;
         list BLACKLIST;
             
         WHITELIST = [  "1234","ANSI Soderstrom",
         WHITELIST = [  "1234","ANSI Soderstrom",
                         "4321","Other Name"
                         "4321","Other Name"
                     ];
                     ];
                                                             
         BLACKLIST = [  "9876","Invisible Linden",
         BLACKLIST = [  "9876","Invisible Linden",
                         "6789","Visible Linden"
                         "6789","Visible Linden"
                     ];
                     ];
       
         // Does NOTHING (no Target List)
         // Does NOTHING (no Target List)
         PUT(WHITELIST,["1234"],["Any Value"]);             
         PUT(WHITELIST,["1234"],["Any Value"]);             
       
         // Dont touch the Blacklist...
         // Dont touch the Blacklist...
         // Overwrite Whitelist with Blacklist AND CHANGE the Value of the given Name in the Whitelist
         // Overwrite Whitelist with Blacklist AND CHANGE the Value of the given Name in the Whitelist
Line 164: Line 164:
         WHITELIST = PUT(BLACKLIST,["9876"],["Changed Name"]);  
         WHITELIST = PUT(BLACKLIST,["9876"],["Changed Name"]);  
         llOwnerSay(llList2CSV(WHITELIST));  // Whitelist : 9876, Changed Name, 6789, Visible Linden
         llOwnerSay(llList2CSV(WHITELIST));  // Whitelist : 9876, Changed Name, 6789, Visible Linden
       
         // Dont touch the Blacklist...
         // Dont touch the Blacklist...
         // Overwrite Whitelist with Blacklist AND ADD the given KEY/VALUE to Whitelist
         // Overwrite Whitelist with Blacklist AND ADD the given KEY/VALUE to Whitelist
Line 170: Line 170:
         WHITELIST = PUT(BLACKLIST,["1234"],["Any Value"]);
         WHITELIST = PUT(BLACKLIST,["1234"],["Any Value"]);
         llOwnerSay(llList2CSV(WHITELIST));  // Whitelist : 9876, Invisible Linden, 6789, Visible Linden, 1234, Any Value
         llOwnerSay(llList2CSV(WHITELIST));  // Whitelist : 9876, Invisible Linden, 6789, Visible Linden, 1234, Any Value
 
         // --------------------------------------------------------------------------------  
         // --------------------------------------------------------------------------------  
 
         // Simple eval();
         // Simple eval();
 
         list EVAL = [  "Key 1","Test 1",
         list EVAL = [  "Key 1","Test 1",
                         "Key 2","Test 2",
                         "Key 2","Test 2",
                         "Key 3","Test 3"
                         "Key 3","Test 3"
                     ];
                     ];
 
         integer i = llGetListLength(EVAL)/2;
         integer i = llGetListLength(EVAL)/2;
         for(;i;--i) {
         for(;i;--i) {
             llSay(0,GET(EVAL,["Key " + (string)i]));
             llSay(0,GET(EVAL,["Key " + (string)i]));
         }
         }
 
         // Output:
         // Output:
         // Test 3
         // Test 3
         // Test 2
         // Test 2
         // Test 1
         // Test 1
 
         // --------------------------------------------------------------------------------  
         // --------------------------------------------------------------------------------  
 
         // more complex... (Beware of Traps...)
         // more complex... (Beware of Traps...)
       
         list LIST;   
         list LIST;   
         list TEST;
         list TEST;
Line 213: Line 213:
         llSay(0,GET(TEST,["1234"]));    // Output : First Value
         llSay(0,GET(TEST,["1234"]));    // Output : First Value
         llSay(0,GET(TEST,[1234]));      // Output : 0   
         llSay(0,GET(TEST,[1234]));      // Output : 0   
 
         // --------------------------------------------------------------------------------
         // --------------------------------------------------------------------------------
       
         // AGENT is a static integer with the value 1
         // AGENT is a static integer with the value 1
         SOMELIST = PUT(SOMELIST,[AGENT],["AGENT"]);  
         SOMELIST = PUT(SOMELIST,[AGENT],["AGENT"]);  
       
         llSay(0,GET(SOMELIST,[1]));    // Output : AGENT
         llSay(0,GET(SOMELIST,[1]));    // Output : AGENT
         llSay(0,GET(SOMELIST,[AGENT])); // Output : AGENT
         llSay(0,GET(SOMELIST,[AGENT])); // Output : AGENT
 
         // --------------------------------------------------------------------------------         
         // --------------------------------------------------------------------------------         
         
         // Remember... "AGENT" and AGENT are different, and "AGENT" is a VALUE, not a KEY !!!
         // Remember... "AGENT" and AGENT are different, and "AGENT" is a VALUE, not a KEY !!!
         if(!(integer)GET(SOMELIST,["AGENT"])) {
         if(!(integer)GET(SOMELIST,["AGENT"])) {
Line 231: Line 231:
         }
         }
         // Output : Not in List
         // Output : Not in List
 
         // --------------------------------------------------------------------------------  
         // --------------------------------------------------------------------------------  
       
        llSay(0,llList2CSV(SOMELIST));
        // Output : KEY, 9adba1b4-a733-4a44-8275-f4a666784d8c,
        //          1, AGENT,
        //          TEST, TEST,
        //          VALUE, VALUE,
        //          AGENT, 00000000-0000-0000-0000-000000000000
       
        SOMELIST = ERASE(SOMELIST,["KEY"]);
       
        llSay(0,llList2CSV(SOMELIST));
        // Output : 1, AGENT,
        //          TEST, TEST,
        //          VALUE, VALUE,
        //          AGENT, 00000000-0000-0000-0000-000000000000
               
        SOMELIST = ERASE(SOMELIST,[AGENT]);
        llSay(0,llList2CSV(SOMELIST));
        // Output : TEST, TEST,
        //          VALUE, VALUE,
        //          AGENT, 00000000-0000-0000-0000-000000000000
               
        SOMELIST = ERASE(SOMELIST,["AGENT"]);
       
        llSay(0,llList2CSV(SOMELIST));
        // Output : TEST, TEST,
        //          VALUE, VALUE,
               
        SOMELIST = ERASE(SOMELIST,["VALUE"]);
       
        llSay(0,llList2CSV(SOMELIST));
        // Output : TEST, TEST,     
       
        SOMELIST = ERASE(SOMELIST,["TEST"]);


        llSay(0,llList2CSV(SOMELIST));
        // Output :
               
         // --------------------------------------------------------------------------------  
         // --------------------------------------------------------------------------------  
 
         /*  
         /*  
 
         Now you can manage your Settings simple...
         Now you can manage your Settings simple...
 
         list SETTINGS;
         list SETTINGS;
 
         SETTINGS = PUT(SETTINGS,["owner"],[llGetOwner()]);
         SETTINGS = PUT(SETTINGS,["owner"],[llGetOwner()]);
         SETTINGS = PUT(SETTINGS,["POS"],[llGetPos()]);
         SETTINGS = PUT(SETTINGS,["POS"],[llGetPos()]);
       
         list API;
         list API;
 
         API = PUT(API,["I_HAVE_THE_SETTINGS"],[-34234242]);
         API = PUT(API,["I_HAVE_THE_SETTINGS"],[-34234242]);
 
         llMessageLinked(LINK_SET,(integer)GET(API,["I_HAVE_THE_SETTINGS"]),llList2CSV(SETTINGS),llGetOwner());
         llMessageLinked(LINK_SET,(integer)GET(API,["I_HAVE_THE_SETTINGS"]),llList2CSV(SETTINGS),llGetOwner());
 
         // --------------------------------------------------------------------------------  
         // --------------------------------------------------------------------------------  
 
         list SETTINGS;
         list SETTINGS;
         list API;
         list API;
 
         API = PUT(API,["I_HAVE_THE_SETTINGS"],[-34234242]);
         API = PUT(API,["I_HAVE_THE_SETTINGS"],[-34234242]);
 
         link_message(integer sender_num, integer num, string str, key id) {
         link_message(integer sender_num, integer num, string str, key id) {
             // receive a valid message for this state AND try a further Copy Protection
             // receive a valid message for this state AND try a further Copy Protection
Line 264: Line 302:
             } // if     
             } // if     
         } // link_message   
         } // link_message   
     
         */
         */
     }  
     }  
}
}
</lsl>
</lsl>

Revision as of 23:13, 22 April 2010

Leave a comment

Simple LSL Array (Associative)

<lsl> // Simple LSL Array for your Scripts (useful but slow) // (C) 02/2010 ANSI Soderstrom

list SOMELIST;

string GET(list ARRAY,list KEY) {

   if(!llGetListLength(KEY)>1) {
      // dont allow lists in lists
      return "-1";
   }
   integer position;
   do {
       position = llListFindList(ARRAY, KEY);
       if(position%2 && ~position && position) {
           ARRAY = llDeleteSubList(ARRAY,0,position);
       } 
   } while (~position  && position%2);
   if(~position) {
       return llList2String(ARRAY,position+1);
   } else {
       return "0";
   } 

}

list PUT(list ARRAY,list KEY, list VALUE) {

   if(llGetListLength(KEY)>1 || llGetListLength(VALUE)>1) {
       // dont allow lists in lists
       return [-1];
   }  
   integer position = llListFindList(ARRAY, KEY);
   list helparray = [];
   do {
       if(!~position) { 
           ARRAY += KEY;
           ARRAY += VALUE;
           return helparray + ARRAY;
       }        
       if(position%2 && ~position && position) {
           helparray += llList2List(ARRAY,0,position);
           ARRAY = llDeleteSubList(ARRAY,0,position);
           position = llListFindList(ARRAY, KEY);     
       } 
   } while (position%2);
   ARRAY = llListReplaceList(ARRAY, VALUE, position + 1, position + 1);
   return helparray + ARRAY;   

}

list ERASE(list ARRAY,list KEY) {

   integer position = llListFindList(ARRAY, KEY);
   list helparray = [];
   do {
       if(!~position) { 
           return helparray + ARRAY;
       }        
       if(position%2 && ~position && position) {
           helparray += llList2List(ARRAY,0,position);
           ARRAY = llDeleteSubList(ARRAY,0,position);
           position = llListFindList(ARRAY, KEY);     
       } 
   } while (position%2);
   ARRAY = llDeleteSubList(ARRAY,position, position + 1);
   return helparray + ARRAY;   

} </lsl>

What do those lines do?

<lsl> default {

   state_entry() {        

       // --------------------------------------------------------------------------------

       // Add new KEY/VALUE to the "Array" while the KEY is non existent
       SOMELIST = PUT(SOMELIST,["KEY"],["VALUE"]);
       SOMELIST = PUT(SOMELIST,[AGENT],[<1,1,1>]);
       SOMELIST = PUT(SOMELIST,["TEST"],["VALUE"]);
       SOMELIST = PUT(SOMELIST,["VALUE"],["TEST"]);

       llSay(0,GET(SOMELIST,["KEY"]));     // Output : VALUE
       llSay(0,GET(SOMELIST,[AGENT]));     // Output : <1.000000, 1.000000, 1.000000>
       llSay(0,GET(SOMELIST,["TEST"]));    // Output : VALUE
       llSay(0,GET(SOMELIST,["VALUE"]));   // Output : TEST

       // --------------------------------------------------------------------------------

       // Overwrite the VALUE from the given KEY if KEY is existent
       SOMELIST = PUT(SOMELIST,["KEY"],["9adba1b4-a733-4a44-8275-f4a666784d8c"]);
       SOMELIST = PUT(SOMELIST,[AGENT],["unknown"]);
       SOMELIST = PUT(SOMELIST,["TEST"],["TEST"]);
       SOMELIST = PUT(SOMELIST,["VALUE"],["VALUE"]);

       llSay(0,GET(SOMELIST,["KEY"]));     // Output : 9adba1b4-a733-4a44-8275-f4a666784d8c
       llSay(0,GET(SOMELIST,[AGENT]));     // Output : unknown
       llSay(0,GET(SOMELIST,["TEST"]));    // Output : TEST
       llSay(0,GET(SOMELIST,["VALUE"]));   // Output : VALUE      

       // --------------------------------------------------------------------------------

       // case sensitive KEY´s
       SOMELIST = PUT(SOMELIST,["AGENT"],[NULL_KEY]);
       SOMELIST = PUT(SOMELIST,[AGENT],[ZERO_ROTATION]);

       llSay(0,GET(SOMELIST,["agent"]));   // Output : 0
       llSay(0,GET(SOMELIST,["AGENT"]));   // Output : 00000000-0000-0000-0000-000000000000
       llSay(0,GET(SOMELIST,[AGENT]));     // Output : <0.000000, 0.000000, 0.000000, 1.000000>

       // --------------------------------------------------------------------------------        

       // Let us play...
       SOMELIST = PUT(SOMELIST,[AGENT],llGetObjectDetails(GET(SOMELIST,["KEY"]),([OBJECT_NAME])));   

       llSay(0,GET(SOMELIST,["KEY"])); // Output : 9adba1b4-a733-4a44-8275-f4a666784d8c
       llSay(0,GET(SOMELIST,[AGENT])); // Output : ANSI Soderstrom  

       // --------------------------------------------------------------------------------           

       // ANSI Soderstrom is not a KEY, only a VALUE
       if(!(integer)GET(SOMELIST,["ANSI Soderstrom"])) {
           llSay(0,"Not in List");
       } else {
           llSay(0,"Found");
       } 
       // Output : Not in List     

       // -------------------------------------------------------------------------------- 

       llSay(0,llList2CSV(SOMELIST));
       /*
           Output :    KEY, 9adba1b4-a733-4a44-8275-f4a666784d8c, 
                       1, ANSI Soderstrom, 
                       TEST, TEST, 
                       VALUE, VALUE, 
                       AGENT, 00000000-0000-0000-0000-000000000000
       */    

       // -------------------------------------------------------------------------------- 

       // Extended behavior

       list WHITELIST;
       list BLACKLIST;

       WHITELIST = [   "1234","ANSI Soderstrom",
                       "4321","Other Name"
                   ];

       BLACKLIST = [   "9876","Invisible Linden",
                       "6789","Visible Linden"
                   ];

       // Does NOTHING (no Target List)
       PUT(WHITELIST,["1234"],["Any Value"]);             

       // Dont touch the Blacklist...
       // Overwrite Whitelist with Blacklist AND CHANGE the Value of the given Name in the Whitelist
       // (because KEY is in Blacklist)        
       WHITELIST = PUT(BLACKLIST,["9876"],["Changed Name"]); 
       llOwnerSay(llList2CSV(WHITELIST));  // Whitelist : 9876, Changed Name, 6789, Visible Linden

       // Dont touch the Blacklist...
       // Overwrite Whitelist with Blacklist AND ADD the given KEY/VALUE to Whitelist
       // (because KEY is not in Blacklist)              
       WHITELIST = PUT(BLACKLIST,["1234"],["Any Value"]);
       llOwnerSay(llList2CSV(WHITELIST));  // Whitelist : 9876, Invisible Linden, 6789, Visible Linden, 1234, Any Value

       // -------------------------------------------------------------------------------- 

       // Simple eval();

       list EVAL = [   "Key 1","Test 1",
                       "Key 2","Test 2",
                       "Key 3","Test 3"
                   ];

       integer i = llGetListLength(EVAL)/2;
       for(;i;--i) {
           llSay(0,GET(EVAL,["Key " + (string)i]));
       }

       // Output:
       // Test 3
       // Test 2
       // Test 1

       // -------------------------------------------------------------------------------- 

       // more complex... (Beware of Traps...)

       list LIST;  
       list TEST;
       string test;

       LIST = PUT(LIST,["1234"],["First Value"]);  
       LIST = PUT(LIST,[1234],["Second Value"]);     

       test = llList2CSV(LIST);
       llSay(0,test);                  // Output : 1234, First Value, 1234, Second Value

       llSay(0,GET(LIST,["1234"]));    // Output : First Value
       llSay(0,GET(LIST,[1234]));      // Output : Second Value   

       TEST = llCSV2List(test);
       llSay(0,llList2CSV(TEST));      // Output : 1234, First Value, 1234, Second Value

       // ARRAY BROKEN AFTER llList2CSV(); !!!
       llSay(0,GET(TEST,["1234"]));    // Output : First Value
       llSay(0,GET(TEST,[1234]));      // Output : 0   

       // --------------------------------------------------------------------------------

       // AGENT is a static integer with the value 1
       SOMELIST = PUT(SOMELIST,[AGENT],["AGENT"]); 

       llSay(0,GET(SOMELIST,[1]));     // Output : AGENT
       llSay(0,GET(SOMELIST,[AGENT])); // Output : AGENT

       // --------------------------------------------------------------------------------        

       // Remember... "AGENT" and AGENT are different, and "AGENT" is a VALUE, not a KEY !!!
       if(!(integer)GET(SOMELIST,["AGENT"])) {
           llSay(0,"Not in List");
       } else {
           llSay(0,"Found");
       }
       // Output : Not in List

       // -------------------------------------------------------------------------------- 
       
       llSay(0,llList2CSV(SOMELIST));
       // Output : KEY, 9adba1b4-a733-4a44-8275-f4a666784d8c, 
       //          1, AGENT, 
       //          TEST, TEST, 
       //          VALUE, VALUE, 
       //          AGENT, 00000000-0000-0000-0000-000000000000
       
       SOMELIST = ERASE(SOMELIST,["KEY"]);
       
       llSay(0,llList2CSV(SOMELIST));
       // Output : 1, AGENT, 
       //          TEST, TEST, 
       //          VALUE, VALUE, 
       //          AGENT, 00000000-0000-0000-0000-000000000000
               
       SOMELIST = ERASE(SOMELIST,[AGENT]);

       llSay(0,llList2CSV(SOMELIST));
       // Output : TEST, TEST, 
       //          VALUE, VALUE, 
       //          AGENT, 00000000-0000-0000-0000-000000000000
               
       SOMELIST = ERASE(SOMELIST,["AGENT"]);
       
       llSay(0,llList2CSV(SOMELIST));
       // Output : TEST, TEST, 
       //          VALUE, VALUE, 
               
       SOMELIST = ERASE(SOMELIST,["VALUE"]);
       
       llSay(0,llList2CSV(SOMELIST));
       // Output : TEST, TEST,      
       
       SOMELIST = ERASE(SOMELIST,["TEST"]);
       llSay(0,llList2CSV(SOMELIST));
       // Output : 
               
       // -------------------------------------------------------------------------------- 

       /* 

       Now you can manage your Settings simple...

       list SETTINGS;

       SETTINGS = PUT(SETTINGS,["owner"],[llGetOwner()]);
       SETTINGS = PUT(SETTINGS,["POS"],[llGetPos()]);

       list API;

       API = PUT(API,["I_HAVE_THE_SETTINGS"],[-34234242]);

       llMessageLinked(LINK_SET,(integer)GET(API,["I_HAVE_THE_SETTINGS"]),llList2CSV(SETTINGS),llGetOwner());

       // -------------------------------------------------------------------------------- 

       list SETTINGS;
       list API;

       API = PUT(API,["I_HAVE_THE_SETTINGS"],[-34234242]);

       link_message(integer sender_num, integer num, string str, key id) {
           // receive a valid message for this state AND try a further Copy Protection
           if(id==llGetCreator() && num==(integer)GET(API,["I_HAVE_THE_SETTINGS"]) {
               SETTINGS = llCSV2List(str);
           } // if     
       } // link_message  

       */
   } 

}

</lsl>