llGetListEntryType

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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 );