Mercurial > hgrepos > FreeBSD > ports > sysutils > local-bsdtools
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
