use internal functions to speed up, not too effective in reading tho…
[shellsnippets/shellsnippets.git] / mksh / any2utf8
1 #!/bin/mksh
2 # $Id: any2utf8.sh 624 2009-09-03 09:47:20Z tglase $
3 #-
4 # Derived from code with the following licence:
5 # Copyright (c) 2008
6 #       Thorsten Glaser <tg@mirbsd.org>
7 #
8 # Provided that these terms and disclaimer and all copyright notices
9 # are retained or reproduced in an accompanying document, permission
10 # is granted to deal in this work without restriction, including un-
11 # limited rights to use, publicly perform, distribute, sell, modify,
12 # merge, give away, or sublicence.
13 #
14 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
15 # the utmost extent permitted by applicable law, neither express nor
16 # implied; without malicious intent or gross negligence. In no event
17 # may a licensor, author or contributor be held liable for indirect,
18 # direct, other damage, loss, or other issues arising in any way out
19 # of dealing in the work, even if advised of the possibility of such
20 # damage or existence of a defect, except proven that it results out
21 # of said person's immediate fault when using the work as intended.
22 #
23 # The author reserves the right to steward the OPTU encoding forms.
24
25 x=${KSH_VERSION}
26 x=${x##*MIRBSD KSH R}
27 x=${x%% *}
28 if (( x < 38 )); then
29         print -u2 Error: your mksh is too old, you need R38 or up.
30         exit 1
31 fi
32
33 set -U
34
35 set -A vistable \
36         0x20AC 0x278A 0x201A 0x0192 0x201E 0x2026 0x2020 0x2021 \
37         0x02C6 0x2030 0x0160 0x2039 0x0152 0x278B 0x017D 0x278C \
38         0x278D 0x2018 0x2019 0x201C 0x201D 0x2022 0x2013 0x2014 \
39         0x02DC 0x2122 0x0161 0x203A 0x0153 0x278E 0x017E 0x0178
40
41 typeset -i1 wc
42 typeset -i lpos
43
44 while IFS= read -r line; do
45         lpos=0
46         outs=
47         while (( lpos < ${#line} )); do
48                 wc=1#${line:(lpos++):1}
49                 (( (wc & 0xFF80) == 0xEF80 )) && (( wc &= 0x00FF ))
50                 (( wc > 0x7F && wc < 0xA0 )) && (( wc = vistable[wc & 0x1F] ))
51                 outs=$outs${wc#1#}
52         done
53         print -r -- "$outs"
54 done
55 exit 0