summaryrefslogtreecommitdiffstats
path: root/.graveyard/cholerab-live/live.sh
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 "             " >&2
  wr "state=$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
  wr "          " >&2
  case "$buf" in
    () wr '^[' >&2;;
    (*) wr "$buf" >&2;;
  esac
  wr "`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 ' '; 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 '^['
      go S
      ;;
  esac
}

ESC_OSQRB() {
  bufrda
  case "$buf" in
    (''|''|''|'') wr "$buf"; go S;;
    (*)
      wr '^[['
      go S
      ;;
  esac
}


wr 'c'
go S