llParseString2List("Blah||Foo", ["|"], []) = ["Blah", "Foo"] llParseStringKeepNulls("Blah||Foo", ["|"], []) = ["Blah", "", "Foo"]
list parseStringKeepNulls(string src, list seperators, list spacers) { if (llGetListLength(seperators) <= 8 && llGetListLength(spacers) <= 8) return llParseStringKeepNulls(src, seperators, spacers); list ret; list delimeters = seperators + spacers; integer len = llGetListLength(delimeters); integer delimeterFound = FALSE; // TRUE when a delimeter exists in src. do { delimeterFound = FALSE; integer closestIndex = -1; string closestDelimeter = ""; integer i; for (i = 0; i < len; i++) { string delimeter = llList2String(delimeters, i); integer index = llSubStringIndex(src, delimeter); integer found = index != -1; if (found) { if (closestIndex > index || closestIndex == -1) { closestIndex = index; closestDelimeter = delimeter; } } // If this delimeter was found, // it marks delimeterFound as TRUE // if not, it leaves it alone. delimeterFound = delimeterFound || found; } if (closestIndex != -1) { string element; if (closestIndex > 0) element = llGetSubString(src, 0, closestIndex - 1); ret += element; if (llListFindList(spacers, [closestDelimeter]) != -1) ret += closestDelimeter; src = llDeleteSubString(src, 0, closestIndex + llStringLength(closestDelimeter) - 1); } } while (delimeterFound); ret += src; return ret; }