From d6e1d8c85c2cd2d1942bb1af7a57dd7a083677a7 Mon Sep 17 00:00:00 2001 From: tv Date: Thu, 21 Jul 2011 02:35:39 +0200 Subject: cholerab live.sh: shasmfuftw! --- cholerab/live.sh | 112 ++++++++++++++++++++++++++++++------------------------- 1 file 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 8" >&2 - echo -n "7state=$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 " " >&2 + wr "state=$state" >&2 + wr 8 + $1 } -state() { - state="$1" - echo -n "7 8" >&2 - echo -n "7state=$state8" >&2 - char="`dd bs=1 count=1 2>/dev/null`" - odchar="`echo -n "$char" | od -An -tx | tr -d "[$IFS]"`" - history="$odchar ${history-}" - echo -n "7 8" >&2 - echo -n "7 8" >&2 - echo -n "7`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 ' '; S;; - (*) - echo -n "$char" - S - ;; +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 } -ESC() { - state ESC - case "$char" in - ('[') ESC_OSQRB "$1$char";; - (*) - echo -n '^[' - 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 ' '; 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 '^[[' - S + wr '^[' + 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 + (''|''|''|'') wr "$buf"; go S;; (*) - echo -n '^[[[' - S + wr '^[[' + go S ;; esac } -echo -n 'c' -S +wr 'c' +go S -- cgit v1.2.3