changeset 490:39b771006a15

- Use a common global prefix for all array variables ("_farr_") - Docs: document that arrays are global variables
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 30 Aug 2024 10:40:11 +0200
parents 833865e835e5
children ae454a761fa3
files share/local-bsdtools/array.sh
diffstat 1 files changed, 44 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- 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 <NAME>_<index-number>
-#: - The number of elements in the array ist stored in variable <NAME>__
+#: - Array elements are stored in a global variable named
+#:   ``_farr_<NAME>_<index-number>``
+#: - The number of elements in the array ist stored in the global
+#:   variable ``_farr_<NAME>__``
 #: - An array name must conform to shell variable naming conventions
 #: - Currently the number of of elements of an array must be >= 0
-#: - An unset <NAME>__ variable is a severe error and forces an immediate
-#:   error ``exit``. Exceptions to this rule are documented.
+#: - An unset global variable ``_farr_<NAME>__`` 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))