diff options
author | makefu <github@syntax-fehler.de> | 2013-06-07 00:46:36 +0200 |
---|---|---|
committer | makefu <github@syntax-fehler.de> | 2013-06-07 00:46:36 +0200 |
commit | 83baf76c734a5c9471fd9ab4dd90c952aba4e6a0 (patch) | |
tree | f2c429cb79f7f3937e43130a50241a2e7c81950b /cholerab/too_old/live.sh | |
parent | b0273180da89e11cd6a7346ed1a72e9f17fbf230 (diff) | |
parent | 5a428d4646b73f16b890f6c089a67dbc710df533 (diff) |
Merge branch 'master' of github.com:krebscode/painload
Diffstat (limited to 'cholerab/too_old/live.sh')
-rwxr-xr-x | cholerab/too_old/live.sh | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/cholerab/too_old/live.sh b/cholerab/too_old/live.sh new file mode 100755 index 00000000..62a2c3cf --- /dev/null +++ b/cholerab/too_old/live.sh @@ -0,0 +1,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 |