# HG changeset patch # User Franz Glasner # Date 1725007211 -7200 # Node ID 39b771006a1564f38345f4ab83bc6fbb99bfb154 # Parent 833865e835e5fa9acab3e17db76146497c729ee3 - Use a common global prefix for all array variables ("_farr_") - Docs: document that arrays are global variables diff -r 833865e835e5 -r 39b771006a15 share/local-bsdtools/array.sh --- a/share/local-bsdtools/array.sh Thu Aug 29 19:44:19 2024 +0200 +++ b/share/local-bsdtools/array.sh Fri Aug 30 10:40:11 2024 +0200 @@ -21,15 +21,21 @@ #: #: - Every array has a NAME #: - One-based indexing is used -#: - Array elements are stored in a variable named _ -#: - The number of elements in the array ist stored in variable __ +#: - Array elements are stored in a global variable named +#: ``_farr__`` +#: - The number of elements in the array ist stored in the global +#: variable ``_farr___`` #: - An array name must conform to shell variable naming conventions #: - Currently the number of of elements of an array must be >= 0 -#: - An unset __ variable is a severe error and forces an immediate -#: error ``exit``. Exceptions to this rule are documented. +#: - An unset global variable ``_farr___`` variable is a severe +#: error normally and forces an immediate error ``exit``. +#: Exceptions to this rule are documented. #: +_farr_global_prefix="_farr_" + + #: #: Internal error for fatal errors #: @@ -55,18 +61,19 @@ array_create() { local _name - local _el _l + local _gvrname _el _l [ $# -lt 1 ] && _array_fatal "missing array name" _name=$1 + _gvrname=${_farr_global_prefix}$1 shift # Check whether the variable already exists - eval _l=\${${_name}__:-__UNSET__} + eval _l=\${${_gvrname}__:-__UNSET__} [ "${_l}" != "__UNSET__" ] && _array_fatal "array \`${_name}' already exists" # Really create - eval ${_name}__=0 + eval ${_gvrname}__=0 for _el in "$@"; do array_append ${_name} "${_el}" @@ -106,13 +113,14 @@ array_length() { local _name - local _l + local _gvrname _l [ $# -lt 1 ] && _array_fatal "missing array name" _name=$1 + _gvrname=${_farr_global_prefix}$1 # Check whether the variable already exists - eval _l=\${${_name}__:-__UNSET__} + eval _l=\${${_gvrname}__:-__UNSET__} if [ "${_l}" = "__UNSET__" ]; then printf "%s" "-1" @@ -133,23 +141,24 @@ array_append() { local _name _value - local _l _l1 + local _gvrname _l _l1 [ $# -lt 1 ] && _array_fatal "missing array name" _name=$1 + _gvrname=${_farr_global_prefix}$1 _value="${2-}" # Check whether the variable already exists - eval _l=\${${_name}__:-__UNSET__} + eval _l=\${${_gvrname}__:-__UNSET__} if [ "${_l}" = "__UNSET__" ]; then _array_fatal "array \`${_name}' does not exist" fi _l1=$((${_l} + 1)) # Set value - eval ${_name}_${_l1}="\"${_value}\"" + eval ${_gvrname}_${_l1}="\"${_value}\"" # Set new array length - eval ${_name}__=${_l1} + eval ${_gvrname}__=${_l1} } @@ -166,15 +175,16 @@ array_get() { local _name _index - local _l _value + local _gvrname _l _value [ $# -lt 1 ] && _array_fatal "missing array name" _name=$1 + _gvrname=${_farr_global_prefix}$1 [ $# -lt 2 ] && _array_fatal "missing array index" _index=$2 # Check whether the variable already exists - eval _l=\${${_name}__:-__UNSET__} + eval _l=\${${_gvrname}__:-__UNSET__} if [ "${_l}" = "__UNSET__" ]; then _array_fatal "array \`${_name}' does not exist" fi @@ -184,7 +194,7 @@ _array_fatal "array index out of bounds" fi - eval _value=\"\${${_name}_${_index}}\" + eval _value=\"\${${_gvrname}_${_index}}\" printf "%s" "${_value}" } @@ -198,25 +208,26 @@ array_clear() { local _name - local _l _idx + local _gvrname _l _idx [ $# -lt 1 ] && _array_fatal "missing array name" _name=$1 + _gvrname=${_farr_global_prefix}$1 # Check whether the variable already exists - eval _l=\${${_name}__:-__UNSET__} + eval _l=\${${_gvrname}__:-__UNSET__} if [ "${_l}" = "__UNSET__" ]; then _array_fatal "array \`${_name}' does not exist" fi _idx=1 while [ ${_idx} -le ${_l} ]; do - eval unset ${_name}_${_idx} + eval unset ${_gvrname}_${_idx} _idx=$((${_idx} + 1)) done # Length is now zero - eval ${_name}__=0 + eval ${_gvrname}__=0 } @@ -229,24 +240,25 @@ array_destroy() { local _name - local _l _idx + local _gvrname _l _idx [ $# -lt 1 ] && _array_fatal "missing array name" _name=$1 + _gvrname=${_farr_global_prefix}$1 # Handle non-existing array names - eval _l=\${${_name}__:-__UNSET__} + eval _l=\${${_gvrname}__:-__UNSET__} if [ "${_l}" = "__UNSET__" ]; then return 0 fi _idx=1 while [ ${_idx} -le ${_l} ]; do - eval unset ${_name}_${_idx} + eval unset ${_gvrname}_${_idx} _idx=$((${_idx} + 1)) done # Remove - eval unset ${_name}__ + eval unset ${_gvrname}__ } @@ -273,22 +285,23 @@ array_for_each() { local _name _cb - local _l _idx _value _rv + local _gvrname _l _idx _value _rv [ $# -lt 1 ] && _array_fatal "missing array name" _name=$1 + _gvrname=${_farr_global_prefix}$1 [ $# -lt 2 ] && _array_fatal "missing callback function name" _cb="$2" # Check whether the variable already exists - eval _l=\${${_name}__:-__UNSET__} + eval _l=\${${_gvrname}__:-__UNSET__} if [ "${_l}" = "__UNSET__" ]; then _array_fatal "array \`${_name}' does not exist" fi _idx=1 while [ ${_idx} -le ${_l} ]; do - eval "${_cb} ${_name} ${_idx} \"\${${_name}_${_idx}}\"" + eval "${_cb} ${_name} ${_idx} \"\${${_gvrname}_${_idx}}\"" _rv=$? [ ${_rv} -ne 0 ] && return ${_rv} _idx=$((${_idx} + 1)) @@ -304,22 +317,23 @@ array_reversed_for_each() { local _name _cb - local _l _idx _value _rv + local _gvrname _l _idx _value _rv [ $# -lt 1 ] && _array_fatal "missing array name" _name=$1 + _gvrname=${_farr_global_prefix}$1 [ $# -lt 2 ] && _array_fatal "missing callback function name" _cb="$2" # Check whether the variable already exists - eval _l=\${${_name}__:-__UNSET__} + eval _l=\${${_gvrname}__:-__UNSET__} if [ "${_l}" = "__UNSET__" ]; then _array_fatal "array \`${_name}' does not exist" fi _idx=${_l} while [ ${_idx} -gt 0 ]; do - eval "${_cb} ${_name} ${_idx} \"\${${_name}_${_idx}}\"" + eval "${_cb} ${_name} ${_idx} \"\${${_gvrname}_${_idx}}\"" _rv=$? [ ${_rv} -ne 0 ] && return ${_rv} _idx=$((${_idx} - 1))