changeset 716:36d953791e0c

farray.sh: The token values are prepended by a type-specific prefix: can now easily determine whether it is an array or alist from the value in its name
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 04 Oct 2024 15:45:51 +0200
parents 684bacac299c
children f4725ad5cd21
files share/local-bsdtools/farray.sh tests/farray-alist.t tests/farray-array.t
diffstat 3 files changed, 102 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/share/local-bsdtools/farray.sh	Thu Oct 03 21:16:57 2024 +0200
+++ b/share/local-bsdtools/farray.sh	Fri Oct 04 15:45:51 2024 +0200
@@ -25,6 +25,7 @@
 #: - The array with name NAME is associated with a primary global or local
 #:   shell variable with the same name. It contains a token TOKEN that is
 #:   used in variable names that make up the backing store of the array.
+#:   The value of this variable has the form ``_farr_A*_<TOKEN>``.
 #: - Array elements for array NAME that has associated TOKEN are stored in
 #:   global variables named ``_farr_A_<TOKEN>_<index-number>`` (values)
 #:   and ``_farr_A_<TOKEN>__`` (length).
@@ -48,6 +49,7 @@
 #: - The alist with name NAME is associated with a primary global or local
 #:   shell variable with the same name. It contains a token TOKEN that is
 #:   used in variable names that make up the backing stores of the alist.
+#:   The value of this variable is of the form ``_farr_KV*_<TOKEN>``.
 #: - The length of the alist is stored in a global ``_farr_KV_<token>__``.
 #: - Every key-value pair is stored at an INDEX.
 #: - Keys are stored in an associated global ``_farr_K_<TOKEN>_<INDEX>``.
@@ -90,7 +92,9 @@
 #:
 
 
+_farr_array_token_prefix='_farr_A*_'
 _farr_array_prefix=_farr_A_
+_farr_alist_token_prefix='_farr_KV*_'
 _farr_alist_prefix=_farr_KV_
 _farr_alist_key_prefix=_farr_K_
 _farr_alist_value_prefix=_farr_V_
@@ -374,7 +378,7 @@
     __farr_name="${1-}"
     [ -z "${__farr_name}" ] && _farr_fatal "missing farray name"
     eval __farr_token=\"\$\{"${__farr_name}"-\}\"
-    [ -n "${__farr_token}" ] && _farr_fatal "object \`${__farr_name}' already created (token \`${__farr_token}')"
+    [ -n "${__farr_token}" ] && _farr_fatal "object \`${__farr_name}' already created (value \`${__farr_token}')"
 
     __farr_token="$(/usr/bin/hexdump -v -e '/1 "%02x"' -n 16 '/dev/urandom')"
 
@@ -388,7 +392,7 @@
     # Really create the storage by initializing its length
     eval ${__farr_gvrname}__=0
     # And associate the token with the array name
-    eval "${__farr_name}"="${__farr_token}"
+    eval "${__farr_name}=\"\${_farr_array_token_prefix}\${__farr_token}\""
 
     if [ $# -gt 0 ]; then
 	farray_append "${__farr_name}" "$@"
@@ -415,7 +419,18 @@
     __farr_name="${1-}"
     [ -z "${__farr_name}" ] && _farr_fatal "missing farray name"
     eval __farr_token=\"\$\{"${__farr_name}"-\}\"
-    [ -z "${__farr_token}" ] && _farr_fatal "farray \`${__farr_name}' not created properly: token empty"
+    case "${__farr_token}" in
+        '')
+            _farr_fatal "object \`${__farr_name}' not created properly: token empty"
+            ;;
+
+        "${_farr_array_token_prefix}"*)
+            __farr_token="${__farr_token#"${_farr_array_token_prefix}"}"
+            ;;
+        *)
+            _farr_fatal "object \`${__farr_name}' is not an array"
+            ;;
+    esac
     __farr_gvrname="${_farr_array_prefix}${__farr_token}"
 
     eval __farr_len=\$\{${__farr_gvrname}__:+SET\}
@@ -451,10 +466,20 @@
     __farr_gvrname=''
     __farr_len=''
     eval __farr_token=\"\$\{"${__farr_name}"-\}\"
-    if [ -z "${__farr_token}" ]; then
-        _farr_err "farray \`${__farr_name}' not created properly: token empty"
-        return 1;
-    fi
+    case "${__farr_token}" in
+        '')
+            _farr_err "object \`${__farr_name}' not created properly: token empty"
+            return 1
+            ;;
+
+        "${_farr_array_token_prefix}"*)
+            __farr_token="${__farr_token#"${_farr_array_token_prefix}"}"
+            ;;
+        *)
+            _farr_err "object \`${__farr_name}' is not an array"
+            return 1
+            ;;
+    esac
     __farr_gvrname="${_farr_array_prefix}${__farr_token}"
 
     eval __farr_len=\$\{${__farr_gvrname}__:+SET\}
@@ -498,7 +523,18 @@
     __farr_name="${1-}"
     [ -z "${__farr_name}" ] && return 1
     eval __farr_token=\"\$\{"${__farr_name}"-\}\"
-    [ -z "${__farr_token}" ]  && return 1
+    case "${__farr_token}" in
+        '')
+            return 1
+            ;;
+
+        "${_farr_array_token_prefix}"*)
+            __farr_token="${__farr_token#"${_farr_array_token_prefix}"}"
+            ;;
+        *)
+            return 1
+            ;;
+    esac
     __farr_gvrname="${_farr_array_prefix}${__farr_token}"
     eval __farr_len=\$\{${__farr_gvrname}__:+SET\}
     [ -z "${__farr_len}" ] && return 1
@@ -1374,7 +1410,7 @@
     __farr_name="${1-}"
     [ -z "${__farr_name}" ] && _farr_fatal "missing falist name"
     eval __farr_token=\"\$\{"${__farr_name}"-\}\"
-    [ -n "${__farr_token}" ] && _farr_fatal "object \`${__farr_name}' already created (token \`${__farr_token}')"
+    [ -n "${__farr_token}" ] && _farr_fatal "object \`${__farr_name}' already created (value \`${__farr_token}')"
 
     __farr_token="$(/usr/bin/hexdump -v -e '/1 "%02x"' -n 16 '/dev/urandom')"
 
@@ -1390,7 +1426,7 @@
     eval ${__farr_objname}__=0
 
     # And associate the token with the array name
-    eval "${__farr_name}"="${__farr_token}"
+    eval "${__farr_name}=\"\${_farr_alist_token_prefix}\${__farr_token}\""
 
     #
     # When there are key-value pairs populate the alist with.
@@ -1424,7 +1460,18 @@
     __farr_name="${1-}"
     [ -z "${__farr_name}" ] && _farr_fatal "missing farray name"
     eval __farr_token=\"\$\{"${__farr_name}"-\}\"
-    [ -z "${__farr_token}" ] && _farr_fatal "falist \`${__farr_name}' not created properly: token empty"
+    case "${__farr_token}" in
+        '')
+            _farr_fatal "object \`${__farr_name}' not created properly: token empty"
+            ;;
+
+        "${_farr_alist_token_prefix}"*)
+            __farr_token="${__farr_token#"${_farr_alist_token_prefix}"}"
+            ;;
+        *)
+            _farr_fatal "object \`${__farr_name}' is not an alist"
+            ;;
+    esac
 
     __farr_objname="${_farr_alist_prefix}${__farr_token}"
     __farr_keyname=${_farr_alist_key_prefix}${__farr_token}
@@ -1467,10 +1514,20 @@
     __farr_valname=""
     __farr_len=""
     eval __farr_token=\"\$\{"${__farr_name}"-\}\"
-    if [ -z "${__farr_token}" ]; then
-        _farr_err "falist \`${__farr_name}' not created properly: token empty"
-        return 1;
-    fi
+    case "${__farr_token}" in
+        '')
+            _farr_err "object \`${__farr_name}' not created properly: token empty"
+            return 1
+            ;;
+
+        "${_farr_alist_token_prefix}"*)
+            __farr_token="${__farr_token#"${_farr_alist_token_prefix}"}"
+            ;;
+        *)
+            _farr_err "object \`${__farr_name}' not an alist"
+            return 1
+            ;;
+    esac
 
     __farr_objname="${_farr_alist_prefix}${__farr_token}"
     __farr_keyname=${_farr_alist_key_prefix}${__farr_token}
--- a/tests/farray-alist.t	Thu Oct 03 21:16:57 2024 +0200
+++ b/tests/farray-alist.t	Fri Oct 04 15:45:51 2024 +0200
@@ -32,7 +32,7 @@
 
   $ falist_destroy LIST
   $ ( falist_destroy LIST )
-  ERROR: falist `LIST' not created properly: token empty
+  ERROR: object `LIST' not created properly: token empty
   [1]
 
   $ check_no_alist_artifacts
@@ -68,7 +68,7 @@
 
   $ falist_destroy LIST
   $ falist_istrue LIST
-  ERROR: falist `LIST' not created properly: token empty
+  ERROR: object `LIST' not created properly: token empty
   [1]
   $ check_no_alist_artifacts
 
@@ -114,7 +114,7 @@
   $ falist_tryget _i LIST K
   [1]
   $ _var="$(falist_print_length NON_EXISTING_LIST)"
-  ERROR: falist `NON_EXISTING_LIST' not created properly: token empty
+  ERROR: object `NON_EXISTING_LIST' not created properly: token empty
   $ echo "${_var}"
   -1
 
@@ -166,7 +166,7 @@
   $ falist_clear LIST
   $ falist_destroy LIST
   $ falist_destroy LIST
-  ERROR: falist `LIST' not created properly: token empty
+  ERROR: object `LIST' not created properly: token empty
   [1]
 
   $ check_no_alist_artifacts
@@ -362,4 +362,14 @@
   $ farray_destroy ITEMS
 
   $ check_no_alist_artifacts
-  $ check_no_array_artifacts
+
+
+Cross Type Checks
+=================
+
+  $ falist_create LIST
+  $ (farray_append LIST value)
+  ERROR: object `LIST' is not an array
+  [70]
+  $ falist_destroy LIST
+  $ check_no_alist_artifacts
--- a/tests/farray-array.t	Thu Oct 03 21:16:57 2024 +0200
+++ b/tests/farray-array.t	Fri Oct 04 15:45:51 2024 +0200
@@ -73,7 +73,7 @@
   $ test ${_var} -eq 0
   $ farray_destroy TEST
   $ farray_istrue TEST
-  ERROR: farray `TEST' not created properly: token empty
+  ERROR: object `TEST' not created properly: token empty
   [1]
   $ check_no_array_artifacts
 
@@ -82,7 +82,7 @@
   $ farray_create TEST 1 2 3
   $ farray_destroy TEST
   $ farray_destroy TEST
-  ERROR: farray `TEST' not created properly: token empty
+  ERROR: object `TEST' not created properly: token empty
   [1]
   $ check_no_array_artifacts
 
@@ -995,14 +995,14 @@
 
   $ TEST=''
   $ (farray_append TEST)
-  ERROR: farray `TEST' not created properly: token empty
+  ERROR: object `TEST' not created properly: token empty
   [70]
 
   $ check_no_array_artifacts
 
   $ farray_create DUP
   $ (farray_create DUP)
-  ERROR: object `DUP' already created \(token `[a-f0-9]+'\) (re)
+  ERROR: object `DUP' already created \(value `_farr_A\*_[a-f0-9]+'\) (re)
   [70]
 
   $ check_no_array_artifacts
@@ -1011,3 +1011,14 @@
 
   $ farray_destroy DUP
   $ check_no_array_artifacts
+
+
+Cross Type Checks
+=================
+
+  $ farray_create TEST
+  $ (falist_set TEST key value)
+  ERROR: object `TEST' is not an alist
+  [70]
+  $ farray_destroy TEST
+  $ check_no_array_artifacts