diff options
-rw-r--r-- | bos-namespaces.sh | 41 |
1 files changed, 22 insertions, 19 deletions
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 |