# HG changeset patch # User Franz Glasner # Date 1728049551 -7200 # Node ID 36d953791e0ce7d6a2c199a32e64c6b68ff77770 # Parent 684bacac299c14650a1566562dbd2877f72163e1 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 diff -r 684bacac299c -r 36d953791e0c share/local-bsdtools/farray.sh --- 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*_``. #: - Array elements for array NAME that has associated TOKEN are stored in #: global variables named ``_farr_A__`` (values) #: and ``_farr_A___`` (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*_``. #: - The length of the alist is stored in a global ``_farr_KV___``. #: - Every key-value pair is stored at an INDEX. #: - Keys are stored in an associated global ``_farr_K__``. @@ -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} diff -r 684bacac299c -r 36d953791e0c tests/farray-alist.t --- 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 diff -r 684bacac299c -r 36d953791e0c tests/farray-array.t --- 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