changeset 607:c450fd0eaddb

farray.sh: Generalized indices for falist_tryget_{item,key,value}_at_index()
author Franz Glasner <fzglas.hg@dom66.de>
date Thu, 19 Sep 2024 12:21:58 +0200
parents 0ad7b2120e74
children cd9d5127ade2
files share/local-bsdtools/farray.sh tests/farray-alist.t
diffstat 2 files changed, 42 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/share/local-bsdtools/farray.sh	Thu Sep 19 12:15:33 2024 +0200
+++ b/share/local-bsdtools/farray.sh	Thu Sep 19 12:21:58 2024 +0200
@@ -1602,8 +1602,9 @@
     [ -z "${__farr_varname}" ] && _farr_fatal "missing variable name"
     shift
     _farr_alist_get_meta "$@"
-    [ $# -lt 2 ] && _farr_fatal "missing index"
-    __farr_index=$(($2 + 0))
+    __farr_index="${2-}"
+    [ -z "${__farr_index}" ] && _farr_fatal "missing index"
+    _farr_make_index __farr_index "${__farr_index}" "${__farr_len}"
 
     if [ \( ${__farr_index} -ge 1 \) -a \( ${__farr_index} -le ${__farr_len} \) ]; then
         eval __farr_getikey=\"\$\{${__farr_keyname}_${__farr_index}+SET\}\"
@@ -1647,8 +1648,9 @@
     [ -z "${__farr_varname}" ] && _farr_fatal "missing variable name"
     shift
     _farr_alist_get_meta "$@"
-    [ $# -lt 2 ] && _farr_fatal "missing index"
-    __farr_index=$(($2 + 0))
+    __farr_index="${2-}"
+    [ -z "${__farr_index}" ] && _farr_fatal "missing index"
+    _farr_make_index __farr_index "${__farr_index}" "${__farr_len}"
 
     if [ \( ${__farr_index} -ge 1 \) -a \( ${__farr_index} -le ${__farr_len} \) ]; then
         eval __farr_getival=\"\$\{${__farr_valname}_${__farr_index}+SET\}\"
@@ -1696,8 +1698,9 @@
     [ -z "${__farr_value_varname}" ] && _farr_fatal "missing variable name for value"
     shift 2
     _farr_alist_get_meta "$@"
-    [ $# -lt 2 ] && _farr_fatal "missing index"
-    __farr_index=$(($2 + 0))
+    __farr_index="${2-}"
+    [ -z "${__farr_index}" ] && _farr_fatal "missing index"
+    _farr_make_index __farr_index "${__farr_index}" "${__farr_len}"
 
     if [ \( ${__farr_index} -ge 1 \) -a \( ${__farr_index} -le ${__farr_len} \) ]; then
         eval __farr_getikey=\"\$\{${__farr_keyname}_${__farr_index}+SET\}\"
--- a/tests/farray-alist.t	Thu Sep 19 12:15:33 2024 +0200
+++ b/tests/farray-alist.t	Thu Sep 19 12:21:58 2024 +0200
@@ -162,6 +162,39 @@
   $ check_no_alist_artifacts
 
 
+Valid and Invalid Indices
+
+  $ falist_create LIST
+  $ falist_set LIST 'KEY 1' 'VAL 1'
+  $ falist_set LIST 'KEY 2' 'VAL 2'
+  $ falist_set LIST 'KEY 3' 'VAL 3'
+
+  $ (falist_tryget_item_at_index _k _v LIST "")
+  ERROR: missing index
+  [70]
+
+  $ (falist_tryget_item_at_index _k _v LIST)
+  ERROR: missing index
+  [70]
+
+  $ falist_tryget_item_at_index _k _v LIST 4
+  [1]
+
+  $ falist_tryget_item_at_index _k _v LIST 0
+  $ printf '%s:%s' "$_k" "$_v"
+  KEY 3:VAL 3 (no-eol)
+
+  $ falist_tryget_item_at_index _k _v LIST -2
+  $ printf '%s:%s' "$_k" "$_v"
+  KEY 1:VAL 1 (no-eol)
+
+  $ falist_tryget_item_at_index _k _v LIST -3
+  [1]
+
+  $ falist_destroy LIST
+  $ check_no_alist_artifacts
+
+
 Deletion of keys
 ================