remaining tweaks; untested, of course…
authormirabilos <m@mirbsd.org>
Sun, 29 Nov 2015 20:39:25 +0000 (20:39 +0000)
committermirabilos <m@mirbsd.org>
Sun, 29 Nov 2015 20:39:25 +0000 (20:39 +0000)
mksh/assockit.ksh
mksh/assoldap.ksh

index ea1ba8e..b43c4e6 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/hosted/tg/assockit.ksh,v 1.6+wip 2014/11/02 18:05:19 tg Exp $
+# $MirOS: contrib/hosted/tg/assockit.ksh,v 1.7 2015/11/29 20:24:19 tg Exp $
 # -*- mode: sh -*-
 #-
 # Copyright © 2011, 2013, 2015
 # -*- mode: sh -*-
 #-
 # Copyright © 2011, 2013, 2015
@@ -161,7 +161,7 @@ function asso_loadk {
        asso__lookup 0 "$@" || return 1
        (( (asso_f & ASSO_MASK_ARR) == ASSO_MASK_ARR )) || return 1
        nameref _keys=${asso_b}${asso_k#16#}_k
        asso__lookup 0 "$@" || return 1
        (( (asso_f & ASSO_MASK_ARR) == ASSO_MASK_ARR )) || return 1
        nameref _keys=${asso_b}${asso_k#16#}_k
-       set -A asso_y -- "${_keys[@]}"
+       set -sA asso_y -- "${_keys[@]}"
 }
 
 # set a string value
 }
 
 # set a string value
index 152906a..40dfec6 100644 (file)
 # contract: path to this script is in $PATH
 [[ -n $ASSO_VAL ]] || . assockit.ksh
 
 # contract: path to this script is in $PATH
 [[ -n $ASSO_VAL ]] || . assockit.ksh
 
+asso_x=${KSH_VERSION#????MIRBSD KSH R}
+asso_x=${asso_x%% *}
+if (( asso_x < 51 )); then
+       alias asso_ustore='[[ -o utf8-mode ]]; local u=$?'
+       alias asso_urestore='(( u )) || set -U'
+else
+       alias asso_ustore=
+       alias asso_urestore=
+fi
+
 # not NUL-safe
 set -A Tb64decode_tbl -- \
     -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 \
 # not NUL-safe
 set -A Tb64decode_tbl -- \
     -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 \
@@ -45,8 +55,9 @@ set -A Tb64decode_tbl -- \
     -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 \
     -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 function Tb64decode {
     -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 \
     -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 function Tb64decode {
-       [[ -o utf8-mode ]]; local u=$? s
+       asso_ustore
        set +U
        set +U
+       local s
        read -raN-1 s <<<"$*"
        local -i i=0 n=${#s[*]} v x
        unset s[--n]
        read -raN-1 s <<<"$*"
        local -i i=0 n=${#s[*]} v x
        unset s[--n]
@@ -56,7 +67,7 @@ function Tb64decode {
                (( (x = Tb64decode_tbl[s[i++]]) == -1 )) && continue
                while (( (v = Tb64decode_tbl[s[i++]]) == -1 )); do
                        if (( i > n )); then
                (( (x = Tb64decode_tbl[s[i++]]) == -1 )) && continue
                while (( (v = Tb64decode_tbl[s[i++]]) == -1 )); do
                        if (( i > n )); then
-                               (( u )) || set -U
+                               asso_urestore
                                return 0
                        fi
                done
                                return 0
                        fi
                done
@@ -64,7 +75,7 @@ function Tb64decode {
                REPLY+=${o#1#}
                while (( (v = Tb64decode_tbl[s[i++]]) == -1 )); do
                        if (( i > n )); then
                REPLY+=${o#1#}
                while (( (v = Tb64decode_tbl[s[i++]]) == -1 )); do
                        if (( i > n )); then
-                               (( u )) || set -U
+                               asso_urestore
                                return 0
                        fi
                done
                                return 0
                        fi
                done
@@ -72,15 +83,17 @@ function Tb64decode {
                REPLY+=${o#1#}
                while (( (v = Tb64decode_tbl[s[i++]]) == -1 )); do
                        if (( i > n )); then
                REPLY+=${o#1#}
                while (( (v = Tb64decode_tbl[s[i++]]) == -1 )); do
                        if (( i > n )); then
-                               (( u )) || set -U
+                               asso_urestore
                                return 0
                        fi
                done
                (( o = ((x << 6) | v) & 255 ))
                REPLY+=${o#1#}
        done
                                return 0
                        fi
                done
                (( o = ((x << 6) | v) & 255 ))
                REPLY+=${o#1#}
        done
-       (( u )) || set -U
+       asso_urestore
 }
 }
+unalias asso_ustore
+unalias asso_urestore
 
 # Syntax: asso_setldap arrayname index ... -- ldapsearch-options
 function asso_setldap_plain {
 
 # Syntax: asso_setldap arrayname index ... -- ldapsearch-options
 function asso_setldap_plain {
@@ -116,9 +129,10 @@ function asso_setldap_sasl {
        asso_setldap_internal "${opts[@]}"
 }
 function asso_setldap_internal {
        asso_setldap_internal "${opts[@]}"
 }
 function asso_setldap_internal {
-       # parse options
-       local arrpath ldapopts x i=0 T found=0
+       local arrpath ldapopts x i=0 T found=0 do_free
        set -A arrpath
        set -A arrpath
+
+       # parse options
        while (( $# )); do
                [[ $1 = -[-+] ]] && break
                arrpath[i++]=$1
        while (( $# )); do
                [[ $1 = -[-+] ]] && break
                arrpath[i++]=$1