From: Alan M Webb <awebb@vnet.ibm.com>
This provides fixed implementations for llListReplaceList and llList2CSV. llListReplaceList was broken except for simple indices. llList2CSV did not handle processing of an empty list.0.6.0-stable
parent
db9c919086
commit
15b36498be
|
@ -2549,16 +2549,32 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Process the supplied list and return the
|
||||||
|
/// content of the list formatted as a comma
|
||||||
|
/// separated list. There is a space after
|
||||||
|
/// each comma.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
public string llList2CSV(LSL_Types.list src)
|
public string llList2CSV(LSL_Types.list src)
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
|
||||||
string ret = String.Empty;
|
string ret = String.Empty;
|
||||||
foreach (object o in src.Data)
|
int x = 0;
|
||||||
|
|
||||||
|
m_host.AddScriptLPS(1);
|
||||||
|
|
||||||
|
if(src.Data.Length > 0)
|
||||||
{
|
{
|
||||||
ret = ret + o.ToString() + ", ";
|
ret = src.Data[x++].ToString();
|
||||||
|
for(;x<src.Data.Length;x++)
|
||||||
|
{
|
||||||
|
ret += ", "+src.Data[x].ToString();
|
||||||
}
|
}
|
||||||
ret = ret.Substring(0, ret.Length - 2);
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -4463,10 +4479,87 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// illListReplaceList removes the sub-list defined by the inclusive indices
|
||||||
|
/// start and end and inserts the src list in its place. The inclusive
|
||||||
|
/// nature of the indices means that at least one element must be deleted
|
||||||
|
/// if the indices are within the bounds of the existing list. I.e. 2,2
|
||||||
|
/// will remove the element at index 2 and replace it with the source
|
||||||
|
/// list. Both indices may be negative, with the usual interpretation. An
|
||||||
|
/// interesting case is where end is lower than start. As these indices
|
||||||
|
/// bound the list to be removed, then 0->end, and start->lim are removed
|
||||||
|
/// and the source list is added as a suffix.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end)
|
public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
LSL_Types.list pref = null;
|
||||||
|
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
return dest.GetSublist(0, start - 1) + src + dest.GetSublist(end + 1, -1);
|
|
||||||
|
// Note that although we have normalized, both
|
||||||
|
// indices could still be negative.
|
||||||
|
if(start < 0)
|
||||||
|
{
|
||||||
|
start = start+dest.Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(end < 0)
|
||||||
|
{
|
||||||
|
end = end+dest.Length;
|
||||||
|
}
|
||||||
|
// The comventional case, remove a sequence starting with
|
||||||
|
// start and ending with end. And then insert the source
|
||||||
|
// list.
|
||||||
|
if(start <= end)
|
||||||
|
{
|
||||||
|
// If greater than zero, then there is going to be a
|
||||||
|
// surviving prefix. Otherwise the inclusive nature
|
||||||
|
// of the indices mean that we're going to add the
|
||||||
|
// source list as a prefix.
|
||||||
|
if(start > 0)
|
||||||
|
{
|
||||||
|
pref = dest.GetSublist(0,start-1);
|
||||||
|
// Only add a suffix if there is something
|
||||||
|
// beyond the end index (it's inclusive too).
|
||||||
|
if(end+1 < dest.Length)
|
||||||
|
{
|
||||||
|
return pref + src + dest.GetSublist(end+1,-1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return pref + src;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If start is less than or equal to zero, then
|
||||||
|
// the new list is simply a prefix. We still need to
|
||||||
|
// figure out any necessary surgery to the destination
|
||||||
|
// based upon end. Note that if end exceeds the upper
|
||||||
|
// bound in this case, the entire destination list
|
||||||
|
// is removed.
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(end+1 < dest.Length)
|
||||||
|
{
|
||||||
|
return src + dest.GetSublist(end+1,-1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Finally, if start > end, we strip away a prefix and
|
||||||
|
// a suffix, to leave the list that sits <between> ens
|
||||||
|
// and start, and then tag on the src list. AT least
|
||||||
|
// that's my interpretation. We can get sublist to do
|
||||||
|
// this for us. Note that one, or both of the indices
|
||||||
|
// might have been negative.
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return dest.GetSublist(end+1,start-1)+src;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llLoadURL(string avatar_id, string message, string url)
|
public void llLoadURL(string avatar_id, string message, string url)
|
||||||
|
|
Loading…
Reference in New Issue