1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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
|