private LSL_List ParseString2List(string src, LSL_List separators, LSL_List spacers, bool keepNulls)
{
int srclen = src.Length;
int seplen = separators.Length;
object[] separray = separators.Data;
int spclen = spacers.Length;
object[] spcarray = spacers.Data;
int dellen = 0;
string[] delarray = new string[seplen+spclen];
int outlen = 0;
string[] outarray = new string[srclen*2+1];
int i, j;
string d;
m_host.AddScriptLPS(1);
/*
* Convert separator and spacer lists to C# strings.
* Also filter out null strings so we don't hang.
*/
for (i = 0; i < seplen; i ++)
{
d = separray[i].ToString();
if (d.Length > 0)
{
delarray[dellen++] = d;
}
}
seplen = dellen;
for (i = 0; i < spclen; i ++)
{
d = spcarray[i].ToString();
if (d.Length > 0)
{
delarray[dellen++] = d;
}
}
/*
* Scan through source string from beginning to end.
*/
for (i = 0;;)
{
/*
* Find earliest delimeter in src starting at i (if any).
*/
int earliestDel = -1;
int earliestSrc = srclen;
string earliestStr = null;
for (j = 0; j < dellen; j ++)
{
d = delarray[j];
if (d != null)
{
int index = src.IndexOf(d, i);
if (index < 0)
{
delarray[j] = null; // delim nowhere in src, don't check it anymore
}
else if (index < earliestSrc)
{
earliestSrc = index; // where delimeter starts in source string
earliestDel = j; // where delimeter is in delarray[]
earliestStr = d; // the delimeter string from delarray[]
if (index == i) break; // can't do any better than found at beg of string
}
}
}
/*
* Output source string starting at i through start of earliest delimeter.
*/
if (keepNulls || (earliestSrc > i))
{
outarray[outlen++] = src.Substring(i, earliestSrc - i);
}
/*
* If no delimeter found at or after i, we're done scanning.
*/
if (earliestDel < 0) break;
/*
* If delimeter was a spacer, output the spacer.
*/
if (earliestDel >= seplen)
{
outarray[outlen++] = earliestStr;
}
/*
* Look at rest of src string following delimeter.
*/
i = earliestSrc + earliestStr.Length;
}
/*
* Make up an exact-sized output array suitable for an LSL_List object.
*/
object[] outlist = new object[outlen];
for (i = 0; i < outlen; i ++)
{
outlist[i] = new LSL_String(outarray[i]);
}
return new LSL_List(outlist);
}