diff options
Diffstat (limited to 'cholerab')
-rwxr-xr-x | cholerab/live.sh | 112 |
1 files changed, 62 insertions, 50 deletions
diff --git a/cholerab/live.sh b/cholerab/live.sh index 8328ea07..62a2c3cf 100755 --- a/cholerab/live.sh +++ b/cholerab/live.sh @@ -2,75 +2,87 @@ set -euf stty cbreak -echo -getc() { - echo -n "7[1;70H 8" >&2 - echo -n "7[1;70Hstate=$state8" >&2 - set -- "`dd bs=1 count=1 2>/dev/null`" - set -- "$1" "`echo -n "$1" | od -An -tx | tr -d "[$IFS]"`" - char="$1" - odchar="$2" - echo -n "$1" +go() { + state=$1 + wr 7 + wr "[1;70H " >&2 + wr "[1;70Hstate=$state" >&2 + wr 8 + $1 } -state() { - state="$1" - echo -n "7[1;70H 8" >&2 - echo -n "7[1;70Hstate=$state8" >&2 - char="`dd bs=1 count=1 2>/dev/null`" - odchar="`echo -n "$char" | od -An -tx | tr -d "[$IFS]"`" - history="$odchar [10D[B${history-}" - echo -n "7[2;70H 8" >&2 - echo -n "7[3;70H 8" >&2 - echo -n "7[4;70H`echo -n "$history"`8" >&2 +rd() { + dd bs=1 count=1 2>/dev/null } +bufrd() { + buf="`rd`" + bufinfowr +} -S() { - state S - case "$char" in - () ESC "$char";; - () echo -n '[D [D'; S;; - (*) - echo -n "$char" - S - ;; +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 } -ESC() { - state ESC - case "$char" in - ('[') ESC_OSQRB "$1$char";; - (*) - echo -n '[35m^[[m' - S - ;; +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 } -ESC_OSQRB() { - state ESC_OSQRB - case "$char" in - (A|B|C|D) echo -n "$1$char"; S;; - ('[') ESC_OSQRB2 "$1$char";; +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;; (*) - echo -n '[35m^[[m[' - S + wr '[35m^[[m' + go S ;; esac } -ESC_OSQRB2() { - state ESC_OSQRB2 - case "$char" in - (A|B|C|D) echo -n "$1$char"; S;; +ESC_OSQRB() { + bufrda + case "$buf" in + ('[A'|'[B'|'[C'|'[D') wr "$buf"; go S;; (*) - echo -n '[35m^[[m[[' - S + wr '[35m^[[m[' + go S ;; esac } -echo -n 'c' -S +wr 'c' +go S |