diff options
author | Haoran S. Diao (刁浩然) <0@hairydiode.xyz> | 2023-06-30 01:25:17 -0700 |
---|---|---|
committer | Haoran S. Diao (刁浩然) <0@hairydiode.xyz> | 2023-06-30 01:25:17 -0700 |
commit | 703ece1f7dc40975b69e1ef52367e86e6561474b (patch) | |
tree | 2873df789bcd6eccf2ebf79c33fbbc892c58e900 /bbrll |
Initial Commit
Diffstat (limited to 'bbrll')
-rwxr-xr-x | bbrll | 117 |
1 files changed, 117 insertions, 0 deletions
@@ -0,0 +1,117 @@ +#!/bin/bash +#NOTE, because bash arrays are just string delimited by space, we will not be +#using space as our empty character but . +rawbuff=() +function load_raw () { + while read -r line; do + if [ "$line" = "END_RAW" ]; then + return + else + rawbuff=("${rawbuff[@]}" "$line") + fi + done +} +function load_point() { + read -r x + read -r y + read -r c + line=${rawbuff[$y]} + #construct a sed prompt that replaces the xth character + prompt="s/^\(.\{$x\}\).\(.*\)$/\1$c\2/" + rawbuff[$y]=$(echo "$line" | sed "$prompt") +} +function print_raw () { + for line in "${rawbuff[@]}"; do + echo "$line" + done +} +function canvas() { + read -r w + read -r h + ln="" + i=0 + while [ $i -lt $w ];do + ln="$ln." + i=$(($i + 1)) + done + j=0 + while [ $j -lt $h ]; do + rawbuff=("${rawbuff[@]}" "$ln") + j=$(($j+1)) + done +} + +#prints a single braille at $1=x $2=y +function print_sin_braille() { +#bit to braille +# +#0 3 +#1 4 +#2 5 +#6 7 +#reverse +#(1,3)(0,3)(1,2)(1,1)(1,0)(0,2)(0,1)(0,0) + #converts anything other than ., and empty string, or space into 1, else + #0 + prompt='s/[^\. ]/1/;s/^[^1]*$/0/' + + b0=$( echo ${rawbuff[((0+4*$2))]:((0+2*$1)):1} | sed "$prompt" ) + b1=$( echo ${rawbuff[((1+4*$2))]:((0+2*$1)):1} | sed "$prompt" ) + b2=$( echo ${rawbuff[((2+4*$2))]:((0+2*$1)):1} | sed "$prompt" ) + b3=$( echo ${rawbuff[((0+4*$2))]:((1+2*$1)):1} | sed "$prompt" ) + b4=$( echo ${rawbuff[((1+4*$2))]:((1+2*$1)):1} | sed "$prompt" ) + b5=$( echo ${rawbuff[((2+4*$2))]:((1+2*$1)):1} | sed "$prompt" ) + b6=$( echo ${rawbuff[((3+4*$2))]:((0+2*$1)):1} | sed "$prompt" ) + b7=$( echo ${rawbuff[((3+4*$2))]:((1+2*$1)):1} | sed "$prompt" ) + #echo "2#$b7$b600$b5$b4$b3$b2$b1$b0" + #the two spaces assume aht the encoding is utf-8, convoluted bitwise OR + #and coversion between character and number stuff + echo "obase=16;$(( 2#$b7${b6}00$b5$b4$b3$b2$b1$b0 | 0x$(echo -n ⠀ |xxd -p -u)))" |bc | xxd --reverse -ps +} + +function print_braille() { + #I do the lazy thing and just test the first line + w=${#rawbuff[0]} + h=${#rawbuff[@]} + #conver to braille coords, since bash rounds down, account for when + #there a braille character that will not be completely filled(it can + #handle this fine because of how the sed pattern was constructed in + #print_sin_braille) + if [ $((w % 2)) -gt 0 ]; then + w=$((w/2+1)) + else + w=$((w/2)) + fi + if [ $((h % 4)) -gt 0 ]; then + h=$((h/4+1)) + else + h=$((h/4)) + fi + i=0 + j=0 + while [ $i -lt $h ]; do + j=0 + while [ $j -lt $w ]; do + print_sin_braille $j $i + j=$(($j+1)) + done + #just want a new line + echo + i=$(($i+1)) + done +} +while read -r line; do + if [ "$line" = "LOAD_RAW" ]; then + load_raw + elif [ "$line" = "LOAD_POINT" ]; then + load_point + elif [ "$line" = "PRINT_RAW" ]; then + print_raw + elif [ "$line" = "CANVAS" ]; then + canvas + elif [ "$line" = "PRINT_BRAILLE" ]; then + print_braille + elif [ "$line" = "END" ]; then + exit + fi +done |