changeset 599:46ff12cfeed0

farray.sh: farray_find(): Fixes in "start" and "end" param evaluation. Now also works with somewhat generalized indices.
author Franz Glasner <fzglas.hg@dom66.de>
date Wed, 18 Sep 2024 21:20:13 +0200
parents a7054c8ed13a
children 77abb0adccaf
files share/local-bsdtools/farray.sh tests/farray-array.t
diffstat 2 files changed, 65 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/share/local-bsdtools/farray.sh	Wed Sep 18 17:10:43 2024 +0200
+++ b/share/local-bsdtools/farray.sh	Wed Sep 18 21:20:13 2024 +0200
@@ -889,8 +889,11 @@
 #:   $1 (str): The name of a variable where to put the found index into
 #:   $2 (str): The name of an existing array
 #:   $3: The value to search for
-#:   $4 (int, optional): The start index to search for (inclusive)
-#:   $5 (int, optional):  The index to stop (inclusive)
+#:   $4 (int, nuĺl, optional): The start index to search for (inclusive).
+#:                             If not given or `null` then `1` is used.
+#:   $5 (int, null, optional):  The index to stop (inclusive).
+#:                              If not given or `null` then the length of
+#:                              `$2` is used.
 #:
 #: Returns:
 #:   - 0 (truish) if the argument value is found within the given array
@@ -914,10 +917,15 @@
     [ -z "${__farr_searched_value}" ] && _farr_fatal "no search value given"
     __farr_searched_value="$2"
 
-    __farr_start=$((${4-1} + 0))
+    __farr_start="${3-}"
+    [ -z "${__farr_start}" ] && __farr_start=1
+    _farr_make_index __farr_start "${__farr_start}" "${__farr_len}"
     [ ${__farr_start} -lt 1 ] && _farr_fatal "start index must be >= 1"
-    __farr_end=$((${5-${__farr_len}} + 0))
+    __farr_end="${4-}"
+    [ -z "${__farr_end}" ] && __farr_end="${__farr_len}"
+    _farr_make_index __farr_end "${__farr_end}" "${__farr_len}"
     [ ${__farr_end} -lt 1 ] && _farr_fatal "end index must be >= 1"
+    [ ${__farr_end} -gt "${__farr_len}" ] && _farr_fatal "end index exceeds array length"    
 
     __farr_cur_idx=${__farr_start}
     while [ ${__farr_cur_idx} -le ${__farr_end} ]; do
--- a/tests/farray-array.t	Wed Sep 18 17:10:43 2024 +0200
+++ b/tests/farray-array.t	Wed Sep 18 21:20:13 2024 +0200
@@ -851,3 +851,56 @@
   $ farray_destroy INSERTED
   $ farray_destroy TEST
   $ check_no_array_artifacts
+
+
+Searching
+=========
+
+  $ farray_create TEST 0 1 2 '3  4   5' $'" 678" \\\'910 ' 11
+
+  $ farray_find _var TEST 0
+  $ echo $_var
+  1
+  $ farray_find _var TEST $'" 678" \\\'910 '
+  $ echo $_var
+  5
+  $ farray_find _var TEST '11'
+  $ echo $_var
+  6
+  $ farray_find _var TEST $'" 678" \\\'910 ' "" ""
+  $ echo $_var
+  5
+  $ farray_find _var TEST '11' 1 5
+  [1]
+
+  $ farray_find _var TEST '11' 7
+  [1]
+
+  $ farray_find _var TEST '11' 7 6
+  [1]
+
+  $ farray_find _var TEST '11' 1 ""
+  $ echo $_var
+  6
+
+  $ ( farray_find _var TEST '11' 1 7 )
+  ERROR: end index exceeds array length
+  [70]
+
+  $ ( farray_find _var TEST '11' -6 )
+  ERROR: start index must be >= 1
+  [70]
+
+  $ ( farray_find _var TEST '11' 1 -6 )
+  ERROR: end index must be >= 1
+  [70]
+
+  $ farray_contains TEST '0'
+  $ farray_contains TEST $'" 678" \\\'910 '
+  $ farray_contains TEST '11'
+
+  $ farray_contains TEST '0 '
+  [1]
+
+  $ farray_destroy TEST
+  $ check_no_array_artifacts