merge current assockit from CVS, not yet enough
[shellsnippets/shellsnippets.git] / mksh / bin2print
1 #!/bin/mksh
2 # $MirOS: contrib/hosted/tg/bin2print,v 1.1 2013/04/09 23:02:12 tg Exp $
3 #-
4 # Copyright © 2013
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 # Converts stdin to an mksh print statement producing identical, NUL
23 # safe, output for embedding (statement is not UTF-8 clean).
24
25 set +U
26 read -arN -1 line || exit 1
27 typeset -Uui16 -Z5 hv
28 typeset -i1 ch
29 imax=${#line[*]}
30 i=0
31 s="print -n -- '"
32 while (( i < imax )); do
33         hv=${line[i++]}
34         if (( hv == 92 )); then
35                 s+='\\'
36         elif (( hv == 39 || hv == 126 )); then
37                 s+='\x'${hv#16#}
38         elif (( hv > 31 )); then
39                 let ch=hv
40                 s+=${ch#1#}
41         elif (( !hv )); then
42                 s+='\x00'
43         elif (( hv == 7 )); then
44                 s+='\a'
45         elif (( hv == 8 )); then
46                 s+='\b'
47         elif (( hv == 12 )); then
48                 s+='\f'
49         elif (( hv == 10 )); then
50                 s+='\n'
51         elif (( hv == 13 )); then
52                 s+='\r'
53         elif (( hv == 9 )); then
54                 s+='\t'
55         elif (( hv == 11 )); then
56                 s+='\v'
57         else
58                 s+='\x'${hv#16#}
59         fi
60 done
61 print -r -- "$s'" | sed 's/\\x00\([^0-9A-Fa-f]\)/\\0\1/g'