Overwrite the core version of the string parsing method with ours

avinationmerge
Melanie 2010-09-17 22:20:20 +01:00
parent bdd4dcf69b
commit 3a760ad12b
1 changed files with 37 additions and 60 deletions

View File

@ -5949,6 +5949,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
ScriptSleep(5000); ScriptSleep(5000);
} }
public LSL_List llParseString2List(string str, LSL_List separators, LSL_List in_spacers)
{
return ParseString2List(str, separators, in_spacers, false);
}
public LSL_Integer llOverMyLand(string id) public LSL_Integer llOverMyLand(string id)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
@ -8931,7 +8936,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// garbage generation. // garbage generation.
// </remarks> // </remarks>
private LSL_List ParseString(string src, LSL_List separators, LSL_List spacers, bool keepNulls) public LSL_List llParseStringKeepNulls(string src, LSL_List separators, LSL_List spacers)
{ {
return ParseString2List(src, separators, spacers, true); return ParseString2List(src, separators, spacers, true);
} }
@ -8952,19 +8957,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
int i, j; int i, j;
string d; string d;
// All entries are initially valid m_host.AddScriptLPS(1);
for (int i = 0; i < mlen; i++) /*
active[i] = true; * Convert separator and spacer lists to C# strings.
* Also filter out null strings so we don't hang.
offset[mlen] = srclen; */
for (i = 0; i < seplen; i ++) {
while (beginning < srclen) d = separray[i].ToString();
{ if (d.Length > 0) {
delarray[dellen++] = d;
best = mlen; // as bad as it gets }
}
// Scan for separators seplen = dellen;
for (i = 0; i < spclen; i ++) { for (i = 0; i < spclen; i ++) {
d = spcarray[i].ToString(); d = spcarray[i].ToString();
@ -8999,45 +9004,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
} }
// This is the normal exit from the scanning loop /*
* Output source string starting at i through start of earliest delimeter.
if (best == mlen) */
{ if (keepNulls || (earliestSrc > i)) {
// no markers were found on this pass outarray[outlen++] = src.Substring(i, earliestSrc - i);
// so we're pretty much done
if ((keepNulls) || ((!keepNulls) && (srclen - beginning) > 0))
tokens.Add(new LSL_String(src.Substring(beginning, srclen - beginning)));
break;
} }
// Otherwise we just add the newly delimited token /*
// and recalculate where the search should continue. * If no delimeter found at or after i, we're done scanning.
if ((keepNulls) || ((!keepNulls) && (offset[best] - beginning) > 0)) */
tokens.Add(new LSL_String(src.Substring(beginning,offset[best]-beginning))); if (earliestDel < 0) break;
if (best < seplen) /*
{ * If delimeter was a spacer, output the spacer.
beginning = offset[best] + (separray[best].ToString()).Length; */
if (earliestDel >= seplen) {
outarray[outlen++] = earliestStr;
} }
else
{
beginning = offset[best] + (spcarray[best - seplen].ToString()).Length;
string str = spcarray[best - seplen].ToString();
if ((keepNulls) || ((!keepNulls) && (str.Length > 0)))
tokens.Add(new LSL_String(str));
}
}
// This an awkward an not very intuitive boundary case. If the /*
// last substring is a tokenizer, then there is an implied trailing * Look at rest of src string following delimeter.
// null list entry. Hopefully the single comparison will not be too */
// arduous. Alternatively the 'break' could be replced with a return i = earliestSrc + earliestStr.Length;
// but that's shabby programming.
if ((beginning == srclen) && (keepNulls))
{
if (srclen != 0)
tokens.Add(new LSL_String(""));
} }
/* /*
@ -9049,19 +9038,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
return new LSL_List(outlist); return new LSL_List(outlist);
} }
public LSL_List llParseString2List(string src, LSL_List separators, LSL_List spacers)
{
m_host.AddScriptLPS(1);
return this.ParseString(src, separators, spacers, false);
}
public LSL_List llParseStringKeepNulls(string src, LSL_List separators, LSL_List spacers)
{
m_host.AddScriptLPS(1);
return this.ParseString(src, separators, spacers, true);
}
public LSL_Integer llGetObjectPermMask(int mask) public LSL_Integer llGetObjectPermMask(int mask)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);