Skip to content

Commit

Permalink
decode (rlfunc): work around incomplete bytes in keyseq
Browse files Browse the repository at this point in the history
  • Loading branch information
akinomyoga committed May 19, 2021
1 parent 59ede5c commit 948a38d
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 39 deletions.
2 changes: 2 additions & 0 deletions src/decode.sh
Expand Up @@ -2427,6 +2427,7 @@ function ble/builtin/bind/option:m {
## keyseq:command の形式の文字列を keyseq と command に分離します。
## @var[out] keyseq value
function ble/builtin/bind/.decompose-pair {
local LC_ALL= LC_CTYPE=C
local ret; ble/string#trim "$1"
local spec=$ret ifs=$' \t\n' q=\' Q="'\''"

Expand Down Expand Up @@ -2462,6 +2463,7 @@ function ble/builtin/bind/.decompose-pair {
return 0
fi
}
ble/function#suppress-stderr ble/builtin/bind/.decompose-pair
## 関数 ble/builtin/bind/.parse-keyname keyname
## @var[out] chars
function ble/builtin/bind/.parse-keyname {
Expand Down
80 changes: 41 additions & 39 deletions src/util.sh
Expand Up @@ -3454,48 +3454,50 @@ function ble/util/chars2keyseq {
## 関数 ble/util/keyseq2chars keyseq
## @arr[out] ret
function ble/util/keyseq2chars {
local keyseq=$1 chars
local rex='^([^\]*)\\([0-7]{1,3}|x[0-9a-fA-F]{1,2}|(C-(\\M-)?|M-(\\C-)?)*.)'
chars=()
while [[ $keyseq =~ $rex ]]; do
local text=${BASH_REMATCH[1]} esc=${BASH_REMATCH[2]}
keyseq=${keyseq:${#BASH_REMATCH}}
ble/util/s2chars "$text"
ble/array#push chars "${ret[@]}"

local mflags=
case $esc in
(x?*) ble/array#push chars $((16#${esc#x}));;
([0-7]*) ble/array#push chars $((8#$esc)) ;;
(a) ble/array#push chars 7 ;;
(b) ble/array#push chars 8 ;;
(t) ble/array#push chars 9 ;;
(n) ble/array#push chars 10 ;;
(v) ble/array#push chars 11 ;;
(f) ble/array#push chars 12 ;;
(r) ble/array#push chars 13 ;;
(e) ble/array#push chars 27 ;;
(d) ble/array#push chars 127 ;;
('C-?') ble/array#push chars 127 ;;
('M-\C-?') ble/array#push chars 255 ;;
('C-'?) mflags=sc ;;
('C-\M-'?) mflags=sec ;;
('M-'?) mflags=sm ;;
('M-\C-'?) mflags=scm ;;
(*) mflags=s ;;
esac

if [[ $mflags == *s* ]]; then
ble/util/s2c "${esc:${#esc}-1}"; local key=$ret
[[ $mflags == *e* ]] && ble/array#push chars 27
[[ $mflags == *c* ]] && ((key&=0x1F))
[[ $mflags == *m* ]] && ((key|=0x80))
ble/array#push chars "$key"
local keyseq=$1
local -a chars=()
local mods=
local rex='^([^\]+)|^\\([CM]-|[0-7]{1,3}|x[0-9a-fA-F]{1,2}|.)?'
while [[ $keyseq ]]; do
local text=${keyseq::1}
[[ $keyseq =~ $rex ]] &&
text=${BASH_REMATCH[1]} esc=${BASH_REMATCH[2]}

if [[ $text ]]; then
keyseq=${keyseq:${#text}}
ble/util/s2chars "$text"
else
keyseq=${keyseq:1+${#esc}}
ret=()
case $esc in
([CM]-) mods=$mods${esc::1}; continue ;;
(x?*) ret=$((16#${esc#x})) ;;
([0-7]*) ret=$((8#$esc)) ;;
(a) ret=7 ;;
(b) ret=8 ;;
(t) ret=9 ;;
(n) ret=10 ;;
(v) ret=11 ;;
(f) ret=12 ;;
(r) ret=13 ;;
(e) ret=27 ;;
(d) ret=127 ;;
(*) ble/util/s2c "$esc" ;;
esac
fi

[[ $mods == *C* ]] && ((ret=ret==63?127:(ret&0x1F)))
[[ $mods == *M* ]] && ble/array#push chars 27
#[[ $mods == *M* ]] && ((ret|=0x80))
mods=
ble/array#push chars "${ret[@]}"
done

ble/util/s2chars "$keyseq"
ble/array#push chars "${ret[@]}"
if [[ $mods ]]; then
[[ $mods == *M* ]] && ble/array#push chars 27
ble/array#push chars 0
fi

ret=("${chars[@]}")
}

Expand Down

0 comments on commit 948a38d

Please sign in to comment.