From 197bdde98de4bb15dfa75d9c49824baac66e6486 Mon Sep 17 00:00:00 2001 From: Gianni Ceccarelli Date: Thu, 27 Jul 2023 16:04:22 +0100 Subject: more flexible namespaced stores now they're __-separated encoded strings --- bos-namespaces.sh | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) (limited to 'bos-namespaces.sh') diff --git a/bos-namespaces.sh b/bos-namespaces.sh index d36b87e..32be36d 100644 --- a/bos-namespaces.sh +++ b/bos-namespaces.sh @@ -2,38 +2,41 @@ ## namespace handling function bos-namespaces/encode-into() { - local -n result="$1" - local string="$2" + local -n result="$1"; shift local idx char tmp result='' - for (( idx=0 ; idx < "${#string}" ; ++idx )); do - char="${string:$idx:1}" - case "$char" in - [0-9A-Za-z]) tmp="$char";; - *) printf -v tmp _%02x "'$char" - esac - result+="$tmp" + while [[ "${#*}" -gt 0 ]]; do + for (( idx=0 ; idx < "${#1}" ; ++idx )); do + char="${1:$idx:1}" + case "$char" in + [0-9A-Za-z]) tmp="$char";; + *) printf -v tmp _%02x "'$char" + esac + result+="$tmp" + done + result+='__' + shift done } function bos-namespaces/store-scalar-for-into() { - local -n result="$1" - local name; bos-namespaces/encode-into name "bos_${3}_${2}" + local -n result="$1"; shift + local name; bos-namespaces/encode-into name "bos" "$@" declare -g "$name" result="$name" } function bos-namespaces/store-array-for-into() { - local -n result="$1" - local name; bos-namespaces/encode-into name "bos_${3}_${2}" + local -n result="$1"; shift + local name; bos-namespaces/encode-into name "bos" "$@" declare -ga "$name" result="$name" } -function bos-namespaces/store-dict-for-into() { - local -n result="$1" - local name; bos-namespaces/encode-into name "bos_${3}_${2}" +function bos-namespaces/store-assoc-for-into() { + local -n result="$1"; shift + local name; bos-namespaces/encode-into name "bos" "$@" declare -gA "$name" result="$name" } @@ -57,7 +60,7 @@ function bos-namespaces/pop() { # save all currently-visible functions in an associative array function bos-namespaces/save-funcs() { local namespace; bos-namespaces/current-namespace-into namespace - local ns_store; bos-namespaces/store-dict-for-into ns_store saved_funcs "$namespace" + local ns_store; bos-namespaces/store-assoc-for-into ns_store saved_funcs "$namespace" local -n saved_funcs="$ns_store" local _ funcname @@ -73,7 +76,7 @@ function bos-namespaces/save-funcs() { function bos-namespaces/list-new-funcs-into() { local -n result="$1" local namespace; bos-namespaces/current-namespace-into namespace - local ns_store; bos-namespaces/store-dict-for-into ns_store saved_funcs "$namespace" + local ns_store; bos-namespaces/store-assoc-for-into ns_store saved_funcs "$namespace" local -n saved_funcs="$ns_store" local _ funcname new_function @@ -96,7 +99,7 @@ function bos-namespaces/list-new-funcs-into() { # saved function of the same name, if it exists function bos-namespaces/qualify-funcs() { local namespace; bos-namespaces/current-namespace-into namespace - local ns_store; bos-namespaces/store-dict-for-into ns_store saved_funcs "$namespace" + local ns_store; bos-namespaces/store-assoc-for-into ns_store saved_funcs "$namespace" local -n saved_funcs="$ns_store" local _ funcname new_function -- cgit v1.2.3