diff options
Diffstat (limited to 'cholerab')
| -rwxr-xr-x | cholerab/live.sh | 88 | ||||
| -rwxr-xr-x | cholerab/max_dirty_hack.sh | 102 | ||||
| -rwxr-xr-x | cholerab/ttycnser | 27 | 
3 files changed, 217 insertions, 0 deletions
| diff --git a/cholerab/live.sh b/cholerab/live.sh new file mode 100755 index 00000000..62a2c3cf --- /dev/null +++ b/cholerab/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 diff --git a/cholerab/max_dirty_hack.sh b/cholerab/max_dirty_hack.sh new file mode 100755 index 00000000..7183a760 --- /dev/null +++ b/cholerab/max_dirty_hack.sh @@ -0,0 +1,102 @@ +#!/bin/sh +stty -echo cbreak -ofdel +x_max=90 +y_max=10 +x_cur=1 +y_cur=1 +y= +t=1 +outputfile=/tmp/cholerab_out +inputfile=/tmp/cholerab_in +echo -n "c" + +while [ $t -lt $(( y_max+2 )) ];do +    echo -e "[$t;$(( x_max+1 ))Hx" +    t=$(( t+1 )) +done +t=1 +while [ $t -lt $(( x_max+2 )) ];do +    echo -e "[$(( y_max+1 ));${t}Hx" +    t=$(( t+1 )) +done + +echo -n "[$y_cur;${x_cur}H" +#Main Loop +while x="`dd bs=1 count=1 2>/dev/null`"; do +    y="$y$x" +    case "$y" in +        (*"[A") +            if [[ $y_cur -le 1 ]];then +                y_cur=$y_max +                echo -n "[$y_cur;${x_cur}H" +            else +                echo -n "[A" +                y_cur=$(( y_cur-1 )) +            fi +            y= +            ;; +        (*"[B") +            if [[ $y_cur -ge $y_max ]];then +                y_cur=1 +                echo -n "[$y_cur;${x_cur}H" +            else +                echo -n "[B" +                y_cur=$(( y_cur+1 )) +            fi +            y= +            ;; +        (*"[C") +            if [[ $x_cur -ge $x_max ]];then +                x_cur=1 +                echo -n "[$y_cur;${x_cur}H" +            else +                echo -n "[C" +                x_cur=$(( x_cur+1 )) +            fi +            y= +            ;; +        (*"[D") +            if [[ $x_cur -le 1 ]];then +                x_cur=$x_max +                echo -n "[$y_cur;${x_cur}H" +            else +                echo -n "[D" +                x_cur=$(( x_cur-1 )) +            fi +            y= +            ;; +        (*"") +            if [[ $x_cur -le 1 ]];then +                x_cur=$x_max +                echo -n "[$y_cur;${x_cur}H" +            else +                echo -n "[D [D" +                x_cur=$(( x_cur-1 )) +            fi +            y= +            ;; +        (|\[) +            : +            ;; +        (*) +            if [[ $x_cur -ge $x_max ]];then +                x_cur=1 +                echo -n "[$y_cur;${x_cur}H" +            else +                echo -n "$x" +                echo "<0 $x $x_cur $y_cur>" >> $outputfile +                x_cur=$(( x_cur+1 )) +            fi +            y= +            ;; +    esac +    while [[ -s $inputfile ]]; do +        cat $inputfile | head -n 1 | sed 's,[<>],,g' | { read MODE CHAR XN YN ; echo -n "7[$YN;${XN}H$CHAR8"; } +        sed -i -e "1d" $inputfile +    done + +    state=`echo -n "$x" | od -An -tx | tr -d "[$IFS]"` +    echo -n "7[1;$(( x_max+2 ))H$state8" +    echo -n "7[2;$(( x_max+2 ))H             8" +    echo -n "7[2;$(( x_max+2 ))H$x_cur:$y_cur8" +done diff --git a/cholerab/ttycnser b/cholerab/ttycnser new file mode 100755 index 00000000..0972dbbb --- /dev/null +++ b/cholerab/ttycnser @@ -0,0 +1,27 @@ +#! /bin/sh +set -euf + +tty="${TMPDIR-/tmp}/ttycnser.$LOGNAME.tty" + +case "${mode-server}" in +  (server) +    host=0.0.0.0 +    port=8080 +    export mode=client +    echo "ttycnser @ $host $port" >&2 +    exec tcpserver $host $port "$0" +  ;; +  (client) +    line="`read line && echo "$line"`" +    echo -n '7[2;1H[2K[33;1m>>>> '"$line"'8' > "$tty" +  ;; +  (install) +    # TODO tell the user to do something like +    # PROMPT_COMMAND="`mode=install ~/p/krebscode/painload/cholerab/ttycnser`" +    echo "ln -snf '`tty`' '$tty'" +  ;; +  (*) +    echo 'Error 1: You are made of stupid!' >&2 +    exit 23 +  ;; +esac | 
