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
  |