updates from MirBSD CVS
[shellsnippets/shellsnippets.git] / mksh / hexpad.sh
1 #!/bin/mksh
2 # $MirOS: contrib/fonts/unifont/hexpad.sh,v 1.4 2012/09/01 20:57:15 tg Exp $
3 #-
4 # Copyright © 2012
5 #       Thorsten Glaser <tg@mirbsd.org>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un‐
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person’s immediate fault when using the work as intended.
21 #-
22 # Read unifont.hex and remove glyphs from blanks.hex and rc-priv.hex
23 # then pad 8x16 to 9x18 and 16x16 to 18x18 and output them into bdfc
24 # stub files, separate by glyph width if character width matches it.
25 # (Theoretically, we should allow ${%s} == -1 for halfwidth, but all
26 # occurrences in GNU Unifont are fullwidth.)
27
28 set -U
29
30 set -A skip
31 integer skip
32 # pure awkwardness later
33 skip[0]=1
34 # invalid codepoints
35 skip[0xFFFE]=1
36 skip[0xFFFF]=1
37 # surrogates
38 c=0xD800
39 while (( c <= 0xDFFF )); do
40         skip[c++]=1
41 done
42 while IFS=: read i data rest; do
43         if [[ $data = 00542A542A542A542A542A542A542A00 ]]; then
44                 skip[0x$i]=1
45         else
46                 print -ru2 E: unknown blanks line "$i:$data:$rest"
47                 exit 1
48         fi
49 done <blanks.hex
50 while IFS=: read i data rest; do
51         if [[ $data = FFB9C5EDD5D5D5D5D5D5D5D5EDB991FF ]]; then
52                 skip[0x$i]=1
53         else
54                 print -ru2 E: unknown rc-priv line "$i:$data:$rest"
55                 exit 1
56         fi
57 done <rc-priv.hex
58
59 function check_hw {
60         typeset -Uui16 -Z5 q
61
62         q=0x${data: 30:2}
63         (( top = (q != 0) ))
64 }
65
66 function check_fw {
67         typeset -Uui16 -Z5 q r
68
69         q=0x${data: 0:4}
70         r=0x${data: 60:4}
71         (( top = (q || r) ))
72         if [[ $data = @(AAAA00018000*5555|555580000001*AAAA) ]]; then
73                 top=0
74                 odd=0
75         fi
76 }
77
78 function merge_hw {
79         typeset -Uui16 -Z5 q
80
81         q=0x${data: j*2:2}
82         (( odd |= (q & 1) ))
83         l+=${q#16#}00:
84 }
85
86 function merge_fw {
87         typeset -Uui16 -Z9 q
88
89         q=0x${data: j*4:4}
90         (( odd |= (q & 1) ))
91         (( q <<= 7 ))
92         l+=${q#16#}:
93 }
94
95 exec 4>unihalf9x18.bdfc 5>unihalf18x18.bdfc
96
97 print -ru4 -- =bdfc 1
98 print -ru4 -- C
99 print -ru4 -- d 540 0 9 0 0 -4
100
101 print -ru5 -- =bdfc 1
102 print -ru5 -- C
103 print -ru5 -- d 1080 0 18 0 0 -3
104
105 typeset -i1 ch
106 while IFS=: read i data rest; do
107         if (( skip[(ch = 0x$i)] )); then
108                 print SKIP $i
109                 continue
110         fi
111         s=${ch#1#}
112         if (( ${#data} == 32 )); then
113                 if (( ${%s} != 1 && ${%s} != 0 )); then
114                         print NOTH $i
115                         continue
116                 fi
117                 ofd=4
118                 nulls=0000
119                 sz=hw
120                 l="c $i 9 "
121         elif (( ${#data} == 64 )); then
122                 if (( ${%s} != 2 && ${%s} != 0 )); then
123                         print NOTF $i
124                         continue
125                 fi
126                 ofd=5
127                 nulls=000000
128                 sz=fw
129                 l="c $i 18 $nulls:"
130         else
131                 print E:UW $i ${#data}
132                 continue
133         fi
134         odd=0 top=0
135         j=-1
136         while (( ++j < 16 )); do
137                 eval merge_$sz
138         done
139         if [[ $sz = fw ]]; then
140                 l+=$nulls
141         else
142                 l+=$nulls:$nulls
143         fi
144         print -ru$ofd -- $l
145         eval check_$sz
146         (( odd )) && print HORZ $i
147         (( top )) && print VERT $i
148 done <unifont.hex | tee hexpad.log
149
150 print -u4 .
151 print -u5 .
152 exec 4>&- 5>&-
153
154 if [[ -s ../9x18.lst && -s ../18x18ko.lst ]]; then
155         set -A known
156         for x in $(<../9x18.lst) $(<../18x18ko.lst); do
157                 known[0x$x]=1
158         done
159
160         while read a b; do
161                 [[ $a = HORZ || $a = VERT ]] || continue
162                 (( known[0x$b] )) && continue
163                 print $a $b
164         done <hexpad.log >hexpad.chk
165 fi
166
167 print DONE