Skip to content

Commit d1d256f

Browse files
authored
add sort_list_named to sort an array variable in-place via nameref. (#27)
This avoids the requirement of a global "list" variable.
1 parent f1b43f5 commit d1d256f

File tree

2 files changed

+42
-18
lines changed

2 files changed

+42
-18
lines changed

lib/sort.sh

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,44 @@
88
sort_list() {
99
(($# != 2)) && return 1
1010
typeset -i left=$1
11-
((left < 0)) || (( 0 == ${#list[@]})) && return 2
11+
((left < 0)) || ((0 == ${#list[@]})) && return 2
1212
typeset -i right=$2
1313
((right >= ${#list[@]})) && return 3
14-
typeset -i i=$left; typeset -i j=$right
15-
typeset -i mid; ((mid= (left+right) / 2))
16-
typeset partition_item; partition_item="${list[$mid]}"
14+
typeset -i i=$left
15+
typeset -i j=$right
16+
typeset -i mid
17+
((mid = (left + right) / 2))
18+
typeset partition_item
19+
partition_item="${list[$mid]}"
1720
typeset temp
18-
while ((j > i)) ; do
19-
item=${list[i]}
20-
while [[ "${list[$i]}" < "$partition_item" ]] ; do
21-
((i++))
22-
done
23-
while [[ "${list[$j]}" > "$partition_item" ]] ; do
24-
((j--))
25-
done
26-
if ((i <= j)) ; then
27-
temp="${list[$i]}"; list[$i]="${list[$j]}"; list[$j]="$temp"
28-
((i++))
29-
((j--))
30-
fi
21+
while ((j > i)); do
22+
item=${list[i]}
23+
while [[ "${list[$i]}" < "$partition_item" ]]; do
24+
((i++))
25+
done
26+
while [[ "${list[$j]}" > "$partition_item" ]]; do
27+
((j--))
28+
done
29+
if ((i <= j)); then
30+
temp="${list[$i]}"
31+
list[$i]="${list[$j]}"
32+
list[$j]="$temp"
33+
((i++))
34+
((j--))
35+
fi
3136
done
32-
((left < j)) && sort_list $left $j
37+
((left < j)) && sort_list $left $j
3338
((right > i)) && sort_list $i $right
3439
return 0
3540
}
3641

42+
# Sorts the array variable passed as 1st parameter from index $2 to index $3.
43+
sort_list_named() {
44+
(($# != 3)) && return 1
45+
typeset -n list="$1"
46+
sort_list "$2" "$3"
47+
}
48+
3749
if [[ $0 == *sorting.sh ]] ; then
3850
[[ -n $ZSH_VERSION ]] && setopt ksharrays
3951
typeset -a list

test/unit/test-sort.sh.in

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,18 @@ test_sort()
4545
assertNotEquals "0" "$?"
4646
}
4747

48+
test_sort_named() {
49+
local LC_ALL=C # for predictable sort order
50+
typeset -a my_expected=(1 2 3 A B X b y z)
51+
52+
typeset -a my_data=(z b y 2 3 1 X A B)
53+
sort_list_named my_data 0 ${#my_data[@]}-1
54+
assertEquals "sort_list_named must complete successfully" 0 $?
55+
56+
for ((i=0; i < ${#my_expected[@]}; i++)); do
57+
assertEquals "Expected sorted data at index $i." "${my_expected[i]}" "${my_data[i]}"
58+
done
59+
}
4860

4961
if [ '@abs_top_srcdir@' = '' ] ; then
5062
echo "Something is wrong abs_top_srcdir is not set."

0 commit comments

Comments
 (0)