ParseString2List
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 but without
//the limits on spacers or separators
list keys;
integer i = spacers != [];
integer offset;
integer test;
list out;
string p;
while(i)
if((p = llList2String(spacers, i = ~-i)))
{
if(~(test = llSubStringIndex(src, p)))
{
if(~(offset = llListFindList(out, (list)p)))
{
out = llDeleteSubList(out, offset, offset);
keys = llDeleteSubList(keys, -~(offset << 1), (-~offset) << 1);
}
keys = test + ((~i) + keys);
out = p + out;
}
}
for(i = separators != [];i;)
if((p = llList2String(separators, i = ~-i)))
{
if(~(test = llSubStringIndex(src, p)))
{
if(~(offset = llListFindList(out, (list)p)))
{
out = llDeleteSubList(out, offset, offset);
keys = llDeleteSubList(keys, -~(offset << 1), (-~offset) << 1);
}
keys = test + (i + keys);
out = p + out;
}
}
out = [];
offset = 0;
while(keys)
{
list t = llList2List(llListSort(keys, 2, TRUE), 0, 1);
integer r = llListFindList(keys, t);
if((i = llList2Integer(t, 0)) < offset)
keys = llDeleteSubList(keys, r, -~r);
else
{
if(offset != i || ParseStringKeepNulls)
out += llDeleteSubString(src, i - offset, -1);
if(0x80000000 & test = llList2Integer(t, 1))
out += p = llList2String(spacers, ~test);
else
p = llList2String(separators, test);
src = llDeleteSubString(src, 0, ~(offset - (i += llStringLength(p))));
offset = i;
if(~(test = llSubStringIndex(src, p)))
keys = llListReplaceList(keys, (list)(test + offset), r, r);
else
keys = llDeleteSubList(keys, r, -~r);
}
}
if(src != "" || ParseStringKeepNulls)
return out + src;
return out;
}//Strife Onizuka