changeset 615:454ce7fa25c8

farray.sh: Implement falist_items(), falist_keys() and falist_values()
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 20 Sep 2024 00:24:09 +0200
parents 62fbc4316d97
children 8841503a30f7
files share/local-bsdtools/farray.sh tests/farray-alist.t
diffstat 2 files changed, 189 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/share/local-bsdtools/farray.sh	Thu Sep 19 22:20:02 2024 +0200
+++ b/share/local-bsdtools/farray.sh	Fri Sep 20 00:24:09 2024 +0200
@@ -2109,6 +2109,157 @@
 
 
 #:
+#: Get all keys from the alist and put it into an array.
+#:
+#: Args:
+#:   $1 (str): The name of the target array where the keys are appended to.
+#:   $2 (str): The name of the alist from where to get the keys.
+#:
+falist_keys() {
+    local _farr_l_name __farr_r_name
+
+    local __farr_r_token __farr_r_objname __farr_r_keyname __farr_r_valname __farr_r_len
+    local __farr_l_token __farr_l_gvrname __farr_l_len
+
+    local __farr_name __farr_token __farr_gvrname __farr_objname
+    local __farr_keyname __farr_valname __farr_len
+    local __farr_idx __farr_key
+
+    # Try to get the array metadata here to provide an early error message
+    [ $# -lt 1 ] && _ferr_fatal "missing target array"
+    _farr_array_get_meta "$1"
+    __farr_l_name="${__farr_name}"
+    __farr_l_token="${__farr_token}"
+    __farr_l_gvrname="${__farr_gvrname}"
+    __farr_l_len="${__farr_len}"
+    [ $# -lt 2 ] && _farr_fatal "missing alist"
+    _farr_alist_get_meta "$2"
+    __farr_r_name="${__farr_name}"
+    __farr_r_token="${__farr_token}"
+    __farr_r_objname="${__farr_objname}"
+    __farr_r_keyname="${__farr_keyname}"
+    __farr_r_valname="${__farr_valname}"
+    __farr_r_len="${__farr_len}"
+
+    __farr_idx=1
+    while [ ${__farr_idx} -le ${__farr_r_len} ]; do
+        eval __farr_key=\"\$\{${__farr_r_keyname}_${__farr_idx}+SET\}\"
+        if [ -n "${__farr_key}" ]; then
+            eval __farr_key=\"\$\{${__farr_r_keyname}_${__farr_idx}\}\"
+            farray_append "${__farr_l_name}" "${__farr_key}"
+        else
+            _farr_fatal "alist \`${__farr_r_name}': missing key index"
+        fi
+        __farr_idx=$((__farr_idx + 1))
+    done
+    return 0
+}
+
+
+#:
+#: Get all values from the alist and put it into an array.
+#:
+#: Args:
+#:   $1 (str): The name of the target array where values are appended to.
+#:   $2 (str): The name of the alist from where to get the values.
+#:
+falist_values() {
+    local _farr_l_name __farr_r_name
+
+    local __farr_r_token __farr_r_objname __farr_r_keyname __farr_r_valname __farr_r_len
+    local __farr_l_token __farr_l_gvrname __farr_l_len
+
+    local __farr_name __farr_token __farr_gvrname __farr_objname
+    local __farr_keyname __farr_valname __farr_len
+    local __farr_idx __farr_value
+
+    # Try to get the array metadata here to provide an early error message
+    [ $# -lt 1 ] && _ferr_fatal "missing target array"
+    _farr_array_get_meta "$1"
+    __farr_l_name="${__farr_name}"
+    __farr_l_token="${__farr_token}"
+    __farr_l_gvrname="${__farr_gvrname}"
+    __farr_l_len="${__farr_len}"
+    [ $# -lt 2 ] && _farr_fatal "missing alist"
+    _farr_alist_get_meta "$2"
+    __farr_r_name="${__farr_name}"
+    __farr_r_token="${__farr_token}"
+    __farr_r_objname="${__farr_objname}"
+    __farr_r_keyname="${__farr_keyname}"
+    __farr_r_valname="${__farr_valname}"
+    __farr_r_len="${__farr_len}"
+
+    __farr_idx=1
+    while [ ${__farr_idx} -le ${__farr_r_len} ]; do
+        eval __farr_value=\"\$\{${__farr_r_valname}_${__farr_idx}+SET\}\"
+        if [ -n "${__farr_value}" ]; then
+            eval __farr_value=\"\$\{${__farr_r_valname}_${__farr_idx}\}\"
+            farray_append "${__farr_l_name}" "${__farr_value}"
+        else
+            _farr_fatal "alist \`${__farr_r_name}': missing value index"
+        fi
+        __farr_idx=$((__farr_idx + 1))
+    done
+    return 0
+}
+
+
+#:
+#: Get all items (key-value pairs) from the alist and put it into an array.
+#:
+#: Args:
+#:   $1 (str): The name of the target array where the sequence of
+#:             key-value pairs are to be appended to.
+#:   $2 (str): The name of the alist from where to get the items.
+#:
+falist_items() {
+    local _farr_l_name __farr_r_name
+
+    local __farr_r_token __farr_r_objname __farr_r_keyname __farr_r_valname __farr_r_len
+    local __farr_l_token __farr_l_gvrname __farr_l_len
+
+    local __farr_name __farr_token __farr_gvrname __farr_objname
+    local __farr_keyname __farr_valname __farr_len
+    local __farr_idx __farr_key __farr_value
+
+    # Try to get the array metadata here to provide an early error message
+    [ $# -lt 1 ] && _ferr_fatal "missing target array"
+    _farr_array_get_meta "$1"
+    __farr_l_name="${__farr_name}"
+    __farr_l_token="${__farr_token}"
+    __farr_l_gvrname="${__farr_gvrname}"
+    __farr_l_len="${__farr_len}"
+    [ $# -lt 2 ] && _farr_fatal "missing alist"
+    _farr_alist_get_meta "$2"
+    __farr_r_name="${__farr_name}"
+    __farr_r_token="${__farr_token}"
+    __farr_r_objname="${__farr_objname}"
+    __farr_r_keyname="${__farr_keyname}"
+    __farr_r_valname="${__farr_valname}"
+    __farr_r_len="${__farr_len}"
+
+    __farr_idx=1
+    while [ ${__farr_idx} -le ${__farr_r_len} ]; do
+        eval __farr_key=\"\$\{${__farr_r_keyname}_${__farr_idx}+SET\}\"
+        if [ -n "${__farr_key}" ]; then
+            eval __farr_key=\"\$\{${__farr_r_keyname}_${__farr_idx}\}\"
+            eval __farr_value=\"\$\{${__farr_r_valname}_${__farr_idx}+SET\}\"
+            if [ -n "${__farr_value}" ]; then
+                eval __farr_value=\"\$\{${__farr_r_valname}_${__farr_idx}\}\"
+                farray_append "${__farr_l_name}" "${__farr_key}" "${__farr_value}"
+            else
+                _farr_fatal "alist \`${__farr_r_name}': missing value index"
+            fi
+        else
+            _farr_fatal "alist \`${__farr_r_name}': missing key index"
+        fi
+        __farr_idx=$((__farr_idx + 1))
+    done
+    return 0
+}
+
+
+#:
 #: Call a function for every key-value pair in an alist starting in index order.
 #:
 #: The function to be called must accept three or four arguments:
--- a/tests/farray-alist.t	Thu Sep 19 22:20:02 2024 +0200
+++ b/tests/farray-alist.t	Fri Sep 20 00:24:09 2024 +0200
@@ -315,4 +315,41 @@
   $ falist_destroy UPDATE2
   $ falist_destroy EMPTY
 
-  $ check_no_alist_artifacts
\ No newline at end of file
+  $ check_no_alist_artifacts
+
+
+Items / Keys / Values
+=====================
+
+  $ farray_create KEYS
+  $ farray_create VALUES
+  $ farray_create ITEMS
+  $ falist_create LIST "Key 1" "Value 1" "Key 2" 'Value 2 '\'''
+  $ falist_items ITEMS LIST
+  $ farray_debug ITEMS
+  DEBUG: array `ITEMS' has length 4
+  DEBUG:   its contents:
+  DEBUG:     1: `Key 1'
+  DEBUG:     2: `Value 1'
+  DEBUG:     3: `Key 2'
+  DEBUG:     4: `Value 2 ''
+  $ falist_keys KEYS LIST
+  $ farray_debug KEYS
+  DEBUG: array `KEYS' has length 2
+  DEBUG:   its contents:
+  DEBUG:     1: `Key 1'
+  DEBUG:     2: `Key 2'
+  $ falist_values VALUES LIST
+  $ farray_debug VALUES
+  DEBUG: array `VALUES' has length 2
+  DEBUG:   its contents:
+  DEBUG:     1: `Value 1'
+  DEBUG:     2: `Value 2 ''
+
+  $ falist_destroy LIST
+  $ farray_destroy KEYS
+  $ farray_destroy VALUES
+  $ farray_destroy ITEMS
+
+  $ check_no_alist_artifacts
+  $ check_no_array_artifacts