summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xcholerab/live.sh112
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 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