diff options
author | Charles Krinke | 2008-08-16 02:39:46 +0000 |
---|---|---|
committer | Charles Krinke | 2008-08-16 02:39:46 +0000 |
commit | 5ed5d0788b339978e28e1be1682a9c8282297c67 (patch) | |
tree | 8c5e06c85e707bd47a15c11e120934d9492386ad /OpenSim/Region | |
parent | Mantis#1964. Thank you kindly, BlueWall for a patch that: (diff) | |
download | opensim-SC-5ed5d0788b339978e28e1be1682a9c8282297c67.zip opensim-SC-5ed5d0788b339978e28e1be1682a9c8282297c67.tar.gz opensim-SC-5ed5d0788b339978e28e1be1682a9c8282297c67.tar.bz2 opensim-SC-5ed5d0788b339978e28e1be1682a9c8282297c67.tar.xz |
Mantis#1890. Thank you kindly, Godfrey, for a patch that addresses:
llListSort() sorts integers and floats in ASCII order rather than numeric order
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/LSL_Types.cs | 96 |
1 files changed, 94 insertions, 2 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Common/LSL_Types.cs index 4fff717..3b2594d 100644 --- a/OpenSim/Region/ScriptEngine/Common/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Common/LSL_Types.cs | |||
@@ -634,6 +634,98 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
634 | } | 634 | } |
635 | } | 635 | } |
636 | 636 | ||
637 | private class AlphanumComparatorFast : IComparer | ||
638 | { | ||
639 | public int Compare(object x, object y) | ||
640 | { | ||
641 | string s1 = x as string; | ||
642 | if (s1 == null) | ||
643 | { | ||
644 | return 0; | ||
645 | } | ||
646 | string s2 = y as string; | ||
647 | if (s2 == null) | ||
648 | { | ||
649 | return 0; | ||
650 | } | ||
651 | |||
652 | int len1 = s1.Length; | ||
653 | int len2 = s2.Length; | ||
654 | int marker1 = 0; | ||
655 | int marker2 = 0; | ||
656 | |||
657 | // Walk through two the strings with two markers. | ||
658 | while (marker1 < len1 && marker2 < len2) | ||
659 | { | ||
660 | char ch1 = s1[marker1]; | ||
661 | char ch2 = s2[marker2]; | ||
662 | |||
663 | // Some buffers we can build up characters in for each chunk. | ||
664 | char[] space1 = new char[len1]; | ||
665 | int loc1 = 0; | ||
666 | char[] space2 = new char[len2]; | ||
667 | int loc2 = 0; | ||
668 | |||
669 | // Walk through all following characters that are digits or | ||
670 | // characters in BOTH strings starting at the appropriate marker. | ||
671 | // Collect char arrays. | ||
672 | do | ||
673 | { | ||
674 | space1[loc1++] = ch1; | ||
675 | marker1++; | ||
676 | |||
677 | if (marker1 < len1) | ||
678 | { | ||
679 | ch1 = s1[marker1]; | ||
680 | } | ||
681 | else | ||
682 | { | ||
683 | break; | ||
684 | } | ||
685 | } while (char.IsDigit(ch1) == char.IsDigit(space1[0])); | ||
686 | |||
687 | do | ||
688 | { | ||
689 | space2[loc2++] = ch2; | ||
690 | marker2++; | ||
691 | |||
692 | if (marker2 < len2) | ||
693 | { | ||
694 | ch2 = s2[marker2]; | ||
695 | } | ||
696 | else | ||
697 | { | ||
698 | break; | ||
699 | } | ||
700 | } while (char.IsDigit(ch2) == char.IsDigit(space2[0])); | ||
701 | |||
702 | // If we have collected numbers, compare them numerically. | ||
703 | // Otherwise, if we have strings, compare them alphabetically. | ||
704 | string str1 = new string(space1); | ||
705 | string str2 = new string(space2); | ||
706 | |||
707 | int result; | ||
708 | |||
709 | if (char.IsDigit(space1[0]) && char.IsDigit(space2[0])) | ||
710 | { | ||
711 | int thisNumericChunk = int.Parse(str1); | ||
712 | int thatNumericChunk = int.Parse(str2); | ||
713 | result = thisNumericChunk.CompareTo(thatNumericChunk); | ||
714 | } | ||
715 | else | ||
716 | { | ||
717 | result = str1.CompareTo(str2); | ||
718 | } | ||
719 | |||
720 | if (result != 0) | ||
721 | { | ||
722 | return result; | ||
723 | } | ||
724 | } | ||
725 | return len1 - len2; | ||
726 | } | ||
727 | } | ||
728 | |||
637 | public list Sort(int stride, int ascending) | 729 | public list Sort(int stride, int ascending) |
638 | { | 730 | { |
639 | if (Data.Length == 0) | 731 | if (Data.Length == 0) |
@@ -652,7 +744,7 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
652 | for (int k = 0; k < Data.Length; k++) | 744 | for (int k = 0; k < Data.Length; k++) |
653 | keys[k] = Data[k].ToString(); | 745 | keys[k] = Data[k].ToString(); |
654 | 746 | ||
655 | Array.Sort(keys, ret); | 747 | Array.Sort( keys, ret, new AlphanumComparatorFast() ); |
656 | 748 | ||
657 | if (ascending == 0) | 749 | if (ascending == 0) |
658 | Array.Reverse(ret); | 750 | Array.Reverse(ret); |
@@ -688,7 +780,7 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
688 | vals[idx]=o; | 780 | vals[idx]=o; |
689 | } | 781 | } |
690 | 782 | ||
691 | Array.Sort(keys, vals); | 783 | Array.Sort(keys, vals, new AlphanumComparatorFast()); |
692 | if (ascending == 0) | 784 | if (ascending == 0) |
693 | { | 785 | { |
694 | Array.Reverse(vals); | 786 | Array.Reverse(vals); |