Difference between revisions of "LlGetListEntryType"

From Second Life Wiki
Jump to navigation Jump to search
(added snippet)
m
 
(12 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{LSL_Function/list/element|src|index|return={{LSL Const|TYPE_INVALID|integer|0|c=none}}}} {{LSL_Function
{{LSL_Function
|inject-2={{LSL_Function/list/element|src|index|return={{LSL Const|TYPE_INVALID|integer|0|c=none}}}}
|func_id=194|func_sleep=0.0|func_energy=10.0
|func_id=194|func_sleep=0.0|func_energy=10.0
|func=llGetListEntryType|return_type=integer
|func=llGetListEntryType|return_type=integer|return_subtype=type
|p1_type=list|p1_name=src
|p1_type=list|p1_name=src
|p2_type=integer|p2_name=index
|p2_type=integer|p2_name=index
|func_footnote
|func_footnote=
|func_desc
|func_desc
|return_text=that is the type of the entry '''index''' in '''src'''.
|Return_text=of the entry at {{LSLP|index}} in {{LSLP|src}}.
|spec
|spec
|caveats=
|caveats=
* If a vector is stored in a list as "<7,5,0>" (as a string type, as opposed to <7,5,0> which is a vector type), its type will be returned as [[TYPE_STRING]], not [[TYPE_VECTOR]]. The same applies for "1" being returned as a string instead of an integer, etc. There is no easy way to guess what the type should be from a string value. The users intent may not be obvious
* If a vector is stored in a list as "<7,5,0>" (as a string type, as opposed to <7,5,0> which is a vector type), its type will be returned as [[TYPE_STRING]], not [[TYPE_VECTOR]]. The same applies for "1" being returned as a string instead of an integer, etc. There is no easy way to guess what the type should be from a string value.
|constants=
|constants=
{{LSL_Constants/ListEntryType}}
{{LSL_Constants/ListEntryType}}
|examples
|examples=
<source lang="lsl2">
string get_list_entry_type_info(integer inputInteger)
{
    if (inputInteger == TYPE_INTEGER)
        return "integer";
    else if (inputInteger == TYPE_FLOAT)
        return "float";
    else if (inputInteger == TYPE_STRING)
        return "string";
    else if (inputInteger == TYPE_KEY)
        return "key";
    else if (inputInteger == TYPE_VECTOR)
        return "vector";
    else if (inputInteger == TYPE_ROTATION)
        return "rotation";
//  else
        return "<!-- invalid type --!>";
}
 
default
{
    touch_start(integer num_detected)
    {
        list listOfStuff = [
            <1.0, 2.0, 3.0, 4.0>,
            <1.0, 2.0, 3.0>,
            llGetKey(),
            "some random text",
            382.4,
            1];
 
        integer index = ~llGetListLength(listOfStuff);
 
        // start with -length and end with -1
        while (++index)
        {
            integer type = llGetListEntryType(listOfStuff, index);
            string entry2string = llList2String(listOfStuff, index);
 
            llSay(0, "'" + entry2string + "' has the list-entry-type: '" + get_list_entry_type_info(type) + "'");
        }
    }
}
</source>
|helpers=This function has two primary uses: serializing a list to a string, debugging.
|helpers=This function has two primary uses: serializing a list to a string, debugging.
<lsl>//A simple list serializer and deserializer.
<source lang="lsl2">//A simple list serializer and deserializer.
//This will round floats to 6 decimal places and not handle strings with embedded "|" characters
//This will round floats to 6 decimal places and not handle strings with embedded "|" characters


Line 20: Line 71:
     integer len = ~llGetListLength(input);
     integer len = ~llGetListLength(input);
     string build = (string)(~len);
     string build = (string)(~len);
     while(++len){
     while(++len)
         build += "|" + llGetListEntryType(input, len) +  
    {
                "=" + llList2String(input, len);//very unsafe, list item could contain "|" character!!!
         build += "|" + (string) llGetListEntryType(input, len) +  
            "=" + llList2String(input, len);       //not safe if list item could contain "|" character
     }
     }
     return build;
     return build;
Line 33: Line 85:
     string value;
     string value;
     list replace;
     list replace;
     while(++len){
     while(++len)
    {
         integer type = (integer)(value = llList2String(pair, len));
         integer type = (integer)(value = llList2String(pair, len));
         value = llDeleteSubString(value, 0, llSubStringIndex(value, "="))
         value = llDeleteSubString(value, 0, llSubStringIndex(value, "="));
         if(TYPE_INTEGER == type)
         if (type == TYPE_INTEGER)
             replace = [(integer)value];
             replace = [(integer)value];
         else if(TYPE_FLOAT == type)
         else if (type == TYPE_FLOAT)
             replace = [(float)value];
             replace = [(float)value];
         else if(TYPE_STRING == type)
         else if (type == TYPE_STRING )
             replace = [value];
             replace = [value];
         else if(TYPE_KEY == type)
         else if (type == TYPE_KEY)
             replace = [(key)value];
             replace = [(key)value];
         else if(TYPE_VECTOR == type)
         else if (type == TYPE_VECTOR)
             replace = [(vector)value];
             replace = [(vector)value];
         else if(TYPE_ROTATION == type)
         else if (type == TYPE_ROTATION)
             replace = [(rotation)value];
             replace = [(rotation)value];
         pair = llListReplaceList(pair, replace, len, len);
         pair = llListReplaceList(pair, replace, len, len);
Line 52: Line 105:
     return pair;
     return pair;
}
}
</lsl>
</source>
 
This snippet produces an LSL formatted dump of a list that can be pasted back into LSL.
<lsl>
<source lang="lsl2">
//A list dumper that produces an output suitable for pasting back into LSL as a variable initialization.
//A list dumper that produces an output suitable for pasting back into LSL as a variable initialization.
//Originally By Talarus Luan
string list_dump(list mylist)
string list_dump(list mylist)
{
{
     string s = "[";
     string output = "[";
     integer i;
     integer i;
     integer t;
     integer count = (mylist != [] );  // length of list (shorthand)
     for (i = 0; i < llGetListLength(mylist); ++i)  
    integer type;
     for ( ; i < count; ++i)  
     {
     {
         if (i > 0)  
         if (i)  
             s += ",";  
             output += ",";  
         t = llGetListEntryType(mylist,i);  
         type = llGetListEntryType(mylist, i);  
         if (t==4)
         if (type == TYPE_KEY)
             s+= "(key)";
             output += "(key)";
         if ((t == 3) || (t==4))   
         if (type == TYPE_STRING || type == TYPE_KEY)   
             s += "\""; s += llList2String(mylist,i);  
             output += "\"";  
         if ((t == 3) || (t==4))
        output += llList2String(mylist, i);  
             s += "\"";  
         if (type == TYPE_STRING || type == TYPE_KEY)
             output += "\"";  
     }
     }
     s += "]";
     return (output + "]");
    return s;
}
}
</lsl>
</source>
For a more complex and robust list (de)serializer see [[TightList|TightListType]].
For a more complex and robust list (de)serializer see [[TightList|TightListType]].
|also_functions={{LSL DefineRow||[[llList2Float]]|}}
|also_functions={{LSL DefineRow||[[llList2Float]]|}}

Latest revision as of 19:32, 20 December 2015

Summary

Function: integer llGetListEntryType( list src, integer index );

Returns the type (an integer) of the entry at index in src.

• list src List containing the element of interest.
• integer index Index of the element of interest.

index supports negative indexes.
If index describes a location not in src then TYPE_INVALID is returned.

Specification

Index Positive Negative
First 0 -length
Last length - 1 -1

Indexes

  • Positive indexes count from the beginning, the first item being indexed as 0, the last as (length - 1).
  • Negative indexes count from the far end, the first item being indexed as -length, the last as -1.

Type Description
TYPE_INTEGER 1 integer
TYPE_FLOAT 2 float
TYPE_STRING 3 string
TYPE_KEY 4 key
TYPE_VECTOR 5 vector
TYPE_ROTATION 6 rotation
TYPE_INVALID 0 none

Caveats

  • If index is out of bounds the script continues to execute without an error message.
  • If a vector is stored in a list as "<7,5,0>" (as a string type, as opposed to <7,5,0> which is a vector type), its type will be returned as TYPE_STRING, not TYPE_VECTOR. The same applies for "1" being returned as a string instead of an integer, etc. There is no easy way to guess what the type should be from a string value.
All Issues ~ Search JIRA for related Bugs

Examples

string get_list_entry_type_info(integer inputInteger)
{
    if (inputInteger == TYPE_INTEGER)
        return "integer";
 
    else if (inputInteger == TYPE_FLOAT)
        return "float";
 
    else if (inputInteger == TYPE_STRING)
        return "string";
 
    else if (inputInteger == TYPE_KEY)
        return "key";
 
    else if (inputInteger == TYPE_VECTOR)
        return "vector";
 
    else if (inputInteger == TYPE_ROTATION)
        return "rotation";
 
//  else
        return "<!-- invalid type --!>";
}

default
{
    touch_start(integer num_detected)
    {
        list listOfStuff = [
            <1.0, 2.0, 3.0, 4.0>,
            <1.0, 2.0, 3.0>,
            llGetKey(),
            "some random text",
            382.4,
            1];

        integer index = ~llGetListLength(listOfStuff);

        // start with -length and end with -1
        while (++index)
        {
            integer type = llGetListEntryType(listOfStuff, index);
            string entry2string = llList2String(listOfStuff, index);

            llSay(0, "'" + entry2string + "' has the list-entry-type: '" + get_list_entry_type_info(type) + "'");
        }
    }
}

Useful Snippets

This function has two primary uses: serializing a list to a string, debugging.

//A simple list serializer and deserializer.
//This will round floats to 6 decimal places and not handle strings with embedded "|" characters

string serialize(list input){
    integer len = ~llGetListLength(input);
    string build = (string)(~len);
    while(++len)
    {
        build += "|" + (string) llGetListEntryType(input, len) + 
             "=" + llList2String(input, len);        //not safe if list item could contain "|" character
    }
    return build;
}

list deserialize(string input){
    integer len = ~(integer)input;//the length is everything before the "|", which is where (integer) stops
    list build = [];
    list pair = llParseString2List(input, ["|"], []);
    string value;
    list replace;
    while(++len)
    {
        integer type = (integer)(value = llList2String(pair, len));
        value = llDeleteSubString(value, 0, llSubStringIndex(value, "="));
        if (type == TYPE_INTEGER)
            replace = [(integer)value];
        else if (type == TYPE_FLOAT)
            replace = [(float)value];
        else if (type == TYPE_STRING )
            replace = [value];
        else if (type == TYPE_KEY)
            replace = [(key)value];
        else if (type == TYPE_VECTOR)
            replace = [(vector)value];
        else if (type == TYPE_ROTATION)
            replace = [(rotation)value];
        pair = llListReplaceList(pair, replace, len, len);
    }
    return pair;
}

This snippet produces an LSL formatted dump of a list that can be pasted back into LSL.

//A list dumper that produces an output suitable for pasting back into LSL as a variable initialization.
string list_dump(list mylist)
{
    string output = "[";
    integer i;
    integer count = (mylist != [] );   // length of list (shorthand)
    integer type;
    for ( ; i < count; ++i) 
    {
        if (i) 
            output += ","; 
        type = llGetListEntryType(mylist, i); 
        if (type == TYPE_KEY)
            output += "(key)";
        if (type == TYPE_STRING || type == TYPE_KEY)  
            output += "\""; 
        output += llList2String(mylist, i); 
        if (type == TYPE_STRING || type == TYPE_KEY)
            output += "\""; 
    }
    return (output + "]");
}

For a more complex and robust list (de)serializer see TightListType.

See Also

Functions

•  llList2Float
•  llList2Integer
•  llList2Key
•  llList2Rot
•  llList2String
•  llList2Vector

Articles

•  Negative Index

Deep Notes

Search JIRA for related Issues

Signature

function integer llGetListEntryType( list src, integer index );