# HG changeset patch # User Franz Glasner # Date 1726769009 -7200 # Node ID 17194ffe363813578fa8516f1b073de6707722f7 # Parent c9ef2339618d83d752de5f71b24130440604e6bc farray.sh: falist_create() and falist_set() now accept a sequence of key-value pairs. This sequence may be empty. diff -r c9ef2339618d -r 17194ffe3638 share/local-bsdtools/farray.sh --- a/share/local-bsdtools/farray.sh Thu Sep 19 18:29:57 2024 +0200 +++ b/share/local-bsdtools/farray.sh Thu Sep 19 20:03:29 2024 +0200 @@ -1265,6 +1265,8 @@ #: Args: #: $1 (str): The name of the alist. #: Must conform to shell variable naming conventions. +#: $2, $3 ... (optional): A sequence of key-value pairs the alist will be +#: populated with. #: #: Exit: #: Iff the alist already exists. @@ -1294,6 +1296,15 @@ # And associate the token with the array name eval "${__farr_name}"="${__farr_token}" + + # + # When there are key-value pairs populate the alist with. + # Note that the alist's name is not shifted away yet and must be taken + # into account. It is also needed for `falist_set`. + # + if [ $# -gt 2 ]; then + falist_set "$@" + fi } @@ -1491,8 +1502,8 @@ #: #: Args: #: $1 (str): The name of an existing alist. -#: $2: The key. -#: $3: The value. +#: $2, $3 ... (optional): A sequence of key-value pairs the alist will be +#: populated with. #: #: Exit: #: If one of the underlying arrays that implement the alist does not exist @@ -1505,36 +1516,41 @@ local __farr_idx __farr_elkey _farr_alist_get_meta "$@" - [ $# -lt 2 ] && _farr_fatal "missing key" - __farr_key="$2" - [ $# -lt 3 ] && _farr_fatal "missing value" - __farr_value="$3" + shift + + while [ $# -ne 0 ]; do + [ $# -lt 1 ] && _farr_fatal "missing key" + __farr_key="$1" + [ $# -lt 2 ] && _farr_fatal "missing value" + __farr_value="$2" - __farr_idx=1 - while [ ${__farr_idx} -le ${__farr_len} ]; do - eval __farr_elkey=\"\$\{${__farr_keyname}_${__farr_idx}+SET\}\" - if [ -n "${__farr_elkey}" ]; then - eval __farr_elkey=\"\$\{${__farr_keyname}_${__farr_idx}\}\" - if [ "${__farr_elkey}" = "${__farr_key}" ]; then - eval ${__farr_valname}_${__farr_idx}="$(_farr_quote_for_eval "${__farr_value}")" - return 0 + __farr_idx=1 + while [ ${__farr_idx} -le ${__farr_len} ]; do + eval __farr_elkey=\"\$\{${__farr_keyname}_${__farr_idx}+SET\}\" + if [ -n "${__farr_elkey}" ]; then + eval __farr_elkey=\"\$\{${__farr_keyname}_${__farr_idx}\}\" + if [ "${__farr_elkey}" = "${__farr_key}" ]; then + eval ${__farr_valname}_${__farr_idx}="$(_farr_quote_for_eval "${__farr_value}")" + return 0 + fi + else + _farr_fatal "key unexpectedly unset (index ${__farr_idx})" fi - else - _farr_fatal "key unexpectedly unset (index ${__farr_idx})" - fi - __farr_idx=$((__farr_idx + 1)) + __farr_idx=$((__farr_idx + 1)) + done + # + # Not yet found: "append" .. + # + # NOTE: __farr_idx already the new correct length + # + __farr_len=${__farr_idx} + # ... the key/value pairs to storage + eval ${__farr_keyname}_${__farr_len}="$(_farr_quote_for_eval "${__farr_key}")" + eval ${__farr_valname}_${__farr_len}="$(_farr_quote_for_eval "${__farr_value}")" + # ... the new length + eval ${__farr_objname}__=${__farr_len} + shift 2 done - # - # Not yet found: "append" .. - # - # NOTE: __farr_idx already the new correct length - # - __farr_len=${__farr_idx} - # ... the key/value pairs to storage - eval ${__farr_keyname}_${__farr_len}="$(_farr_quote_for_eval "${__farr_key}")" - eval ${__farr_valname}_${__farr_len}="$(_farr_quote_for_eval "${__farr_value}")" - # ... the new length - eval ${__farr_objname}__=${__farr_len} return 0 } diff -r c9ef2339618d -r 17194ffe3638 tests/farray-alist.t --- a/tests/farray-alist.t Thu Sep 19 18:29:57 2024 +0200 +++ b/tests/farray-alist.t Thu Sep 19 20:03:29 2024 +0200 @@ -230,21 +230,29 @@ Compare ======= - $ falist_create LIST1 - $ falist_set LIST1 K1 V1 - $ falist_set LIST1 K2 V2 + $ falist_create LIST1 K1 V1 K2 V2 + $ falist_debug LIST1 + DEBUG: alist `LIST1' has length 2 + DEBUG: `K1' -> `V1' + DEBUG: `K2' -> `V2' - $ falist_create LIST2 - $ falist_set LIST2 K2 V2 - $ falist_set LIST2 K1 V1 + $ falist_create LIST2 K2 V2 K1 V1 + $ falist_debug LIST2 + DEBUG: alist `LIST2' has length 2 + DEBUG: `K2' -> `V2' + DEBUG: `K1' -> `V1' - $ falist_create LIST3 - $ falist_set LIST3 K1 V1 - $ falist_set LIST3 K2 V2 + $ falist_create LIST3 K1 V1 K2 V2 + $ falist_debug LIST3 + DEBUG: alist `LIST3' has length 2 + DEBUG: `K1' -> `V1' + DEBUG: `K2' -> `V2' - $ falist_create LIST4 - $ falist_set LIST4 K1 V1 - $ falist_set LIST4 K2 V2-4 + $ falist_create LIST4 K1 V1 K2 V2-4 + $ falist_debug LIST4 + DEBUG: alist `LIST4' has length 2 + DEBUG: `K1' -> `V1' + DEBUG: `K2' -> `V2-4' $ falist_are_equal LIST1 LIST2 $ falist_are_equal LIST1 LIST4