Difference between revisions of "ParseString2List"

From Second Life Wiki
Jump to navigation Jump to search
m (<lsl> tag to <source>)
 
(19 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<noinclude>{{LSL Header}}__NOTOC__</noinclude>
<noinclude>{{LSL Header
{{#vardefine:p_src_desc|source string}}
{{#vardefine:p_separators_desc|separators to be discarded}}
{{#vardefine:p_spacers_desc|spacers to be kept}}
}}__NOTOC__</noinclude>{{#vardefine:p_ParseStringKeepNulls_desc|boolean}}
<div id="box">
<div id="box">
== Function: [[list]] ParseString2List([[string]] {{LSL Param|src}}, [[list]] {{LSL Param|separators}}, [[list]] {{LSL Param|spacers}}, [[integer]] {{LSL Param|ParseStringKeepNulls}}); ==
== Function: [[list]] ParseString2List([[string]] {{LSL Param|src}}, [[list]] {{LSL Param|separators}}, [[list]] {{LSL Param|spacers}}, [[integer]] {{LSL Param|ParseStringKeepNulls}}); ==
Line 15: Line 19:
Thus substitute a call to the '''[[llParseStringKeepNulls]]''' function by a call to '''ParseString2List''' whenever you have more than 8 separators or more than 8 spacers.  
Thus substitute a call to the '''[[llParseStringKeepNulls]]''' function by a call to '''ParseString2List''' whenever you have more than 8 separators or more than 8 spacers.  
</div>
</div>
<pre>
<source lang="lsl2">list ParseString2List(string src, list separators, list spacers, integer ParseStringKeepNulls)
list ParseString2List(string src, list separators, list spacers, integer ParseStringKeepNulls)
{//works just like llParseString2List and llParseStringKeepNulls
{//works just like llParseString2List and llParseStringKeepNulls but without
  //Instead of each list being limited to 8 items, it is now 1024.
  //the limits on spacers or separators
//The max length of src is 2,097,151 characters.
    list keys;
     integer i = ~(separators != []);
     integer i = ~(separators != []);
    integer r = (spacers != []);
    spacers += separators;
    list out = "" + (separators = []);
    string p;
     integer offset;
     integer offset;
    integer test;
     while((i = -~i) < r)
    list out = [""];
    string p;
     while(i = -~i)
        if(!~llListFindList(out, (list)(p = llList2String(separators, i))))
            if(~(test = llSubStringIndex(src, p)))
            {
                keys = (keys + test) + ~i;
                out += p;
            }
    for(i = ~(spacers != []);i = -~i;)
         if(!~llListFindList(out, (list)(p = llList2String(spacers, i))))
         if(!~llListFindList(out, (list)(p = llList2String(spacers, i))))
             if(~(test = llSubStringIndex(src, p)))
             if(~(offset = llSubStringIndex(src, p)))
             {
             {
                 keys = (keys + test) + i;
                 separators += ((offset + 0xFFF00000) << 11) | (i + 0x400);
                 out += p;
                 out += p;
             }
             }
     list t = out = [];
     out = [];
     offset = 0;
     offset = 0xFFF00000;
     while(keys)
     while(separators != [])//Can't use just "while(separators)" because of JIRA:SVC-689
     {
     {
         if(0x80000000 & test = llList2Integer(t = llList2List(llListSort(keys, 2, TRUE), 0, 1), 1))
         if(offset <= (i = ( (r = llList2Integer(separators = llListSort(separators, 1, TRUE), 0) ) >> 11) ) )
            p = llList2String(spacers, test);
        else
            p = llList2String(separators, ~test);
        if(offset <= (i = llList2Integer(t, 0)))
         {
         {
             if(offset ^ i || ParseStringKeepNulls)
             if(offset ^ i || ParseStringKeepNulls)
                 out += llDeleteSubString(src, i - offset, -1);
                 out += llDeleteSubString(src, i - offset, -1);
             if(0x80000000 & test)
            src = llDeleteSubString(src, 0, ~(offset - (i += llStringLength(p = llList2String(spacers, (r & 0x7FF) - 0x400)))));
             if(r & 0x400)
                 out += p;
                 out += p;
            src = llDeleteSubString(src, 0, ~(offset - (i += llStringLength(p))));
             offset = i;
             offset = i;
         }
         }
         i = llListFindList(keys, t);
         separators = llDeleteSubList(separators, 0, 0);
         if(~(test = llSubStringIndex(src, p)))
         if(~(i = llSubStringIndex(src, p)))
             keys = llListReplaceList(keys, (list)(test + offset), i, i);
             separators += ((i + offset) << 11) | (r & 0x7FF);
        else
            keys = llDeleteSubList(keys, i, -~i);
     }
     }
     if(src != "" || ParseStringKeepNulls)
     if(src != "" || ParseStringKeepNulls)
         return out + src;
         out += src;
     return out;
     return out;
}//Strife Onizuka
}//Strife Onizuka</source>
</pre>
<noinclude>
<noinclude>
<pre>
<source lang="lsl2">//Use for testing the function.
//Use for testing the function.
string test(string src, list separators, list spacers, integer nulls)
string test(string src, list separators, list spacers, integer nulls)
{
{
Line 107: Line 96:
         llOwnerSay("----------------  " + (string)llGetFreeMemory());
         llOwnerSay("----------------  " + (string)llGetFreeMemory());
     }
     }
}</pre>{{LSLC|Library}}
}</source>
 
See also: Script Library - [[Separate Words]]
 
{{LSLC|Library}}
</noinclude></div></div>
</noinclude></div></div>

Latest revision as of 07:22, 25 January 2015

Function: list ParseString2List(string src, list separators, list spacers, integer ParseStringKeepNulls);

Returns a list that is src broken into a list, discarding separators, keeping spacers.

if ParseStringKeepNulls == FALSE

Same as llParseString2List, but not limited to 8 spacers or separators.

Thus substitute a call to the llParseString2List function by a call to ParseString2List whenever you have more than 8 separators or more than 8 spacers.

if ParseStringKeepNulls != FALSE

Same as llParseStringKeepNulls, but not limited to 8 spacers or separators.

Thus substitute a call to the llParseStringKeepNulls function by a call to ParseString2List whenever you have more than 8 separators or more than 8 spacers.

list ParseString2List(string src, list separators, list spacers, integer ParseStringKeepNulls)
{//works just like llParseString2List and llParseStringKeepNulls
 //Instead of each list being limited to 8 items, it is now 1024.
 //The max length of src is 2,097,151 characters.
    integer i = ~(separators != []);
    integer r = (spacers != []);
    spacers += separators;
    list out = "" + (separators = []);
    string p;
    integer offset;
    while((i = -~i) < r)
        if(!~llListFindList(out, (list)(p = llList2String(spacers, i))))
            if(~(offset = llSubStringIndex(src, p)))
            {
                separators += ((offset + 0xFFF00000) << 11) | (i + 0x400);
                out += p;
            }
    out = [];
    offset = 0xFFF00000;
    while(separators != [])//Can't use just "while(separators)" because of JIRA:SVC-689
    {
        if(offset <= (i = ( (r = llList2Integer(separators = llListSort(separators, 1, TRUE), 0) ) >> 11) ) )
        {
            if(offset ^ i || ParseStringKeepNulls)
                out += llDeleteSubString(src, i - offset, -1);
            src = llDeleteSubString(src, 0, ~(offset - (i += llStringLength(p = llList2String(spacers, (r & 0x7FF) - 0x400)))));
            if(r & 0x400)
                out += p;
            offset = i;
        }
        separators = llDeleteSubList(separators, 0, 0);
        if(~(i = llSubStringIndex(src, p)))
            separators += ((i + offset) << 11) | (r & 0x7FF);
    }
    if(src != "" || ParseStringKeepNulls)
        out += src;
    return out;
}//Strife Onizuka
//Use for testing the function.
string test(string src, list separators, list spacers, integer nulls)
{
    list t = [];
    if(nulls)
        t = llParseStringKeepNulls(src, separators, spacers);
    else
        t = llParseString2List(src, separators, spacers);
    string a = llList2CSV(t);
    string b = llList2CSV(ParseString2List(src, separators, spacers, nulls));
    return (string)(a==b) + " : " + a + "            " + b;
}

default
{
    state_entry()
    {
        llOwnerSay("----------------  " + (string)llGetFreeMemory());
        llOwnerSay(test("abcdefg", ["b"], ["b"], FALSE));
        llOwnerSay(test("abcdefg", ["b"], ["bc"], FALSE));
        llOwnerSay(test("abcdefg", ["bc"], ["b"], FALSE));
        llOwnerSay(test("abcdefg", ["b"], ["ab"], FALSE));
        llOwnerSay(test("abcdefg", ["b", "g"], ["ab"], FALSE));
        llOwnerSay(test("abcdefg", ["b"], ["ab", "g"], FALSE));
        llOwnerSay(test("abcdefg", ["b", "a"], ["a", "b"], FALSE));
        llOwnerSay(test("abcdefg", ["a", "b"], ["b", "a"], FALSE));
        llOwnerSay(test("abcdefg", ["b", "c"], ["a", "b"], FALSE));
        llOwnerSay(test("abcdefg", ["c", "b"], ["b", "a"], FALSE));
        llOwnerSay(test("abcdefg", ["b", "a"], ["c", "b"], FALSE));
        llOwnerSay(test("abcdefg", ["a", "b"], ["b", "c"], FALSE));
        llOwnerSay(test("abcdefg", ["b"], ["b"], TRUE));
        llOwnerSay(test("abcdefg", ["b"], ["bc"], TRUE));
        llOwnerSay(test("abcdefg", ["bc"], ["b"], TRUE));
        llOwnerSay(test("abcdefg", ["b"], ["ab"], TRUE));
        llOwnerSay(test("abcdefg", ["b", "g"], ["ab"], TRUE));
        llOwnerSay(test("abcdefg", ["b"], ["ab", "g"], TRUE));
        llOwnerSay("----------------  " + (string)llGetFreeMemory());
    }
}

See also: Script Library - Separate Words