blob: 62a2c3cf95dbd7644dd63d959d7e7ff78c2e2984 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#! /bin/sh
set -euf
stty cbreak -echo
go() {
state=$1
wr 7
wr "[1;70H " >&2
wr "[1;70Hstate=$state" >&2
wr 8
$1
}
rd() {
dd bs=1 count=1 2>/dev/null
}
bufrd() {
buf="`rd`"
bufinfowr
}
bufrda() {
buf="$buf`rd`"
bufinfowr
}
bufinfowr() {
wr 7
wr "[2;70H " >&2
wr "[3;70H " >&2
case "$buf" in
() wr '[2;70H[35m^[[m' >&2;;
(*) wr "[2;70H$buf" >&2;;
esac
wr "[3;70H`wr "$buf" | xxd -p`" >&2
wr 8
}
wr() {
echo -n "$1"
}
C0="`echo C0 | xxd -r -p`"; DF="`echo DF | xxd -r -p`"
E0="`echo E0 | xxd -r -p`"; EF="`echo EF | xxd -r -p`"
F0="`echo F0 | xxd -r -p`"; F7="`echo F7 | xxd -r -p`"
S() {
bufrd
case "$buf" in
() go ESC;;
() wr '[D [D'; go S;;
([$C0-$DF]) go U1;;
([$E0-$EF]) go U2;;
([$F0-$F7]) go U3;;
(*) wr "$buf"; go S;;
esac
}
U1() { buf="$buf`rd`"; wr "$buf"; go S; }
U2() { buf="$buf`rd`"; go U1; }
U3() { buf="$buf`rd`"; go U2; }
ESC() {
bufrda
case "$buf" in
('[') go ESC_OSQRB;;
(*)
wr '[35m^[[m'
go S
;;
esac
}
ESC_OSQRB() {
bufrda
case "$buf" in
('[A'|'[B'|'[C'|'[D') wr "$buf"; go S;;
(*)
wr '[35m^[[m['
go S
;;
esac
}
wr 'c'
go S
|