OpenSim.Region.ScriptEngine.Shared.Api.LSL_Api.llListFindList C# (CSharp) Method

llListFindList() public method

Returns the index of the first occurrence of test in src.
public llListFindList ( OpenSim.Region.ScriptEngine.Shared.LSL_Types.list src, OpenSim.Region.ScriptEngine.Shared.LSL_Types.list test ) : OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger
src OpenSim.Region.ScriptEngine.Shared.LSL_Types.list Source list
test OpenSim.Region.ScriptEngine.Shared.LSL_Types.list List to search for
return OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger
        public LSL_Integer llListFindList(LSL_List src, LSL_List test)
        {
            int index  = -1;
            int length = src.Length - test.Length + 1;

            m_host.AddScriptLPS(1);

            // If either list is empty, do not match
            if (src.Length != 0 && test.Length != 0)
            {
                for (int i = 0; i < length; i++)
                {
                    int needle = llGetListEntryType(test, 0).value;
                    int haystack = llGetListEntryType(src, i).value;

                    // Why this piece of insanity?  This is because most script constants are C# value types (e.g. int)
                    // rather than wrapped LSL types.  Such a script constant does not have int.Equal(LSL_Integer) code
                    // and so the comparison fails even if the LSL_Integer conceptually has the same value.
                    // Therefore, here we test Equals on both the source and destination objects.
                    // However, a future better approach may be use LSL struct script constants (e.g. LSL_Integer(1)).
                    if ((needle == haystack) && (src.Data[i].Equals(test.Data[0]) || test.Data[0].Equals(src.Data[i])))
                    {
                        int j;
                        for (j = 1; j < test.Length; j++)
                        {
                            needle = llGetListEntryType(test, j).value;
                            haystack = llGetListEntryType(src, i+j).value;

                            if ((needle != haystack) || (!(src.Data[i+j].Equals(test.Data[j]) || test.Data[j].Equals(src.Data[i+j]))))
                                break;
                        }

                        if (j == test.Length)
                        {
                            index = i;
                            break;
                        }
                    }
                }
            }

            return index;
        }
LSL_Api