diff options
author | Justin Clarke Casey | 2008-04-17 14:34:30 +0000 |
---|---|---|
committer | Justin Clarke Casey | 2008-04-17 14:34:30 +0000 |
commit | 15b36498be46412deb085e61538243219317e249 (patch) | |
tree | aa815b366df562bbbb51dbebbb437d77e2e9ba3d | |
parent | * Added "svn load" command to correspond "svn save". Will grab the latest rev... (diff) | |
download | opensim-SC_OLD-15b36498be46412deb085e61538243219317e249.zip opensim-SC_OLD-15b36498be46412deb085e61538243219317e249.tar.gz opensim-SC_OLD-15b36498be46412deb085e61538243219317e249.tar.bz2 opensim-SC_OLD-15b36498be46412deb085e61538243219317e249.tar.xz |
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.
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | 103 |
1 files changed, 98 insertions, 5 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs index 39d8473..d8ad914 100644 --- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs +++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | |||
@@ -2549,16 +2549,32 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
2549 | 2549 | ||
2550 | } | 2550 | } |
2551 | 2551 | ||
2552 | /// <summary> | ||
2553 | /// Process the supplied list and return the | ||
2554 | /// content of the list formatted as a comma | ||
2555 | /// separated list. There is a space after | ||
2556 | /// each comma. | ||
2557 | /// </summary> | ||
2558 | |||
2552 | public string llList2CSV(LSL_Types.list src) | 2559 | public string llList2CSV(LSL_Types.list src) |
2553 | { | 2560 | { |
2554 | m_host.AddScriptLPS(1); | 2561 | |
2555 | string ret = String.Empty; | 2562 | string ret = String.Empty; |
2556 | foreach (object o in src.Data) | 2563 | int x = 0; |
2564 | |||
2565 | m_host.AddScriptLPS(1); | ||
2566 | |||
2567 | if(src.Data.Length > 0) | ||
2557 | { | 2568 | { |
2558 | ret = ret + o.ToString() + ", "; | 2569 | ret = src.Data[x++].ToString(); |
2570 | for(;x<src.Data.Length;x++) | ||
2571 | { | ||
2572 | ret += ", "+src.Data[x].ToString(); | ||
2573 | } | ||
2559 | } | 2574 | } |
2560 | ret = ret.Substring(0, ret.Length - 2); | 2575 | |
2561 | return ret; | 2576 | return ret; |
2577 | |||
2562 | } | 2578 | } |
2563 | 2579 | ||
2564 | /// <summary> | 2580 | /// <summary> |
@@ -4463,10 +4479,87 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
4463 | return 0; | 4479 | return 0; |
4464 | } | 4480 | } |
4465 | 4481 | ||
4482 | /// <summary> | ||
4483 | /// illListReplaceList removes the sub-list defined by the inclusive indices | ||
4484 | /// start and end and inserts the src list in its place. The inclusive | ||
4485 | /// nature of the indices means that at least one element must be deleted | ||
4486 | /// if the indices are within the bounds of the existing list. I.e. 2,2 | ||
4487 | /// will remove the element at index 2 and replace it with the source | ||
4488 | /// list. Both indices may be negative, with the usual interpretation. An | ||
4489 | /// interesting case is where end is lower than start. As these indices | ||
4490 | /// bound the list to be removed, then 0->end, and start->lim are removed | ||
4491 | /// and the source list is added as a suffix. | ||
4492 | /// </summary> | ||
4493 | |||
4466 | public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end) | 4494 | public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end) |
4467 | { | 4495 | { |
4496 | |||
4497 | LSL_Types.list pref = null; | ||
4498 | |||
4468 | m_host.AddScriptLPS(1); | 4499 | m_host.AddScriptLPS(1); |
4469 | return dest.GetSublist(0, start - 1) + src + dest.GetSublist(end + 1, -1); | 4500 | |
4501 | // Note that although we have normalized, both | ||
4502 | // indices could still be negative. | ||
4503 | if(start < 0) | ||
4504 | { | ||
4505 | start = start+dest.Length; | ||
4506 | } | ||
4507 | |||
4508 | if(end < 0) | ||
4509 | { | ||
4510 | end = end+dest.Length; | ||
4511 | } | ||
4512 | // The comventional case, remove a sequence starting with | ||
4513 | // start and ending with end. And then insert the source | ||
4514 | // list. | ||
4515 | if(start <= end) | ||
4516 | { | ||
4517 | // If greater than zero, then there is going to be a | ||
4518 | // surviving prefix. Otherwise the inclusive nature | ||
4519 | // of the indices mean that we're going to add the | ||
4520 | // source list as a prefix. | ||
4521 | if(start > 0) | ||
4522 | { | ||
4523 | pref = dest.GetSublist(0,start-1); | ||
4524 | // Only add a suffix if there is something | ||
4525 | // beyond the end index (it's inclusive too). | ||
4526 | if(end+1 < dest.Length) | ||
4527 | { | ||
4528 | return pref + src + dest.GetSublist(end+1,-1); | ||
4529 | } | ||
4530 | else | ||
4531 | { | ||
4532 | return pref + src; | ||
4533 | } | ||
4534 | } | ||
4535 | // If start is less than or equal to zero, then | ||
4536 | // the new list is simply a prefix. We still need to | ||
4537 | // figure out any necessary surgery to the destination | ||
4538 | // based upon end. Note that if end exceeds the upper | ||
4539 | // bound in this case, the entire destination list | ||
4540 | // is removed. | ||
4541 | else | ||
4542 | { | ||
4543 | if(end+1 < dest.Length) | ||
4544 | { | ||
4545 | return src + dest.GetSublist(end+1,-1); | ||
4546 | } | ||
4547 | else | ||
4548 | { | ||
4549 | return src; | ||
4550 | } | ||
4551 | } | ||
4552 | } | ||
4553 | // Finally, if start > end, we strip away a prefix and | ||
4554 | // a suffix, to leave the list that sits <between> ens | ||
4555 | // and start, and then tag on the src list. AT least | ||
4556 | // that's my interpretation. We can get sublist to do | ||
4557 | // this for us. Note that one, or both of the indices | ||
4558 | // might have been negative. | ||
4559 | else | ||
4560 | { | ||
4561 | return dest.GetSublist(end+1,start-1)+src; | ||
4562 | } | ||
4470 | } | 4563 | } |
4471 | 4564 | ||
4472 | public void llLoadURL(string avatar_id, string message, string url) | 4565 | public void llLoadURL(string avatar_id, string message, string url) |