Difference between revisions of "ParseString2List"
Jump to navigation
Jump to search
(forgot that nuking a collision might result in the wrong result.) |
|||
Line 38: | Line 38: | ||
out += p; | out += p; | ||
} | } | ||
out = []; | list t = out = []; | ||
offset = 0; | offset = 0; | ||
while(keys) | while(keys) | ||
{ | { | ||
if(0x80000000 & test = llList2Integer(t = llList2List(llListSort(keys, 2, TRUE), 0, 1), 1)) | |||
p = llList2String(spacers, test); | |||
else | else | ||
p = llList2String(separators, ~test); | |||
if(offset <= (i = llList2Integer(t, 0))) | |||
{ | { | ||
if(offset | if(offset ^ i || ParseStringKeepNulls) | ||
out += llDeleteSubString(src, i - offset, -1); | out += llDeleteSubString(src, i - offset, -1); | ||
if(0x80000000 & test | if(0x80000000 & test) | ||
out += p | out += p; | ||
src = llDeleteSubString(src, 0, ~(offset - (i += llStringLength(p)))); | src = llDeleteSubString(src, 0, ~(offset - (i += llStringLength(p)))); | ||
offset = i; | offset = i; | ||
} | } | ||
i = llListFindList(keys, t); | |||
if(~(test = llSubStringIndex(src, p))) | |||
keys = llListReplaceList(keys, (list)(test + offset), i, i); | |||
else | |||
keys = llDeleteSubList(keys, i, -~i); | |||
} | } | ||
if(src != "" || ParseStringKeepNulls) | if(src != "" || ParseStringKeepNulls) |
Revision as of 22:14, 18 September 2007
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 = ~(separators != []); integer offset; integer test; 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(~(test = llSubStringIndex(src, p))) { keys = (keys + test) + i; out += p; } list t = out = []; offset = 0; while(keys) { if(0x80000000 & test = llList2Integer(t = llList2List(llListSort(keys, 2, TRUE), 0, 1), 1)) p = llList2String(spacers, test); else p = llList2String(separators, ~test); if(offset <= (i = llList2Integer(t, 0))) { if(offset ^ i || ParseStringKeepNulls) out += llDeleteSubString(src, i - offset, -1); if(0x80000000 & test) out += p; src = llDeleteSubString(src, 0, ~(offset - (i += llStringLength(p)))); offset = i; } i = llListFindList(keys, t); if(~(test = llSubStringIndex(src, p))) keys = llListReplaceList(keys, (list)(test + offset), i, i); else keys = llDeleteSubList(keys, i, -~i); } if(src != "" || ParseStringKeepNulls) return 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()); } }