update from their respective sources
[shellsnippets/shellsnippets.git] / mksh / base64
1 # $MirOS: src/bin/mksh/dot.mkshrc,v 1.60 2011/05/29 02:18:49 tg Exp $
2 #-
3 # Copyright (c) 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011
4 #       Thorsten Glaser <tg@mirbsd.org>
5 #
6 # Provided that these terms and disclaimer and all copyright notices
7 # are retained or reproduced in an accompanying document, permission
8 # is granted to deal in this work without restriction, including un-
9 # limited rights to use, publicly perform, distribute, sell, modify,
10 # merge, give away, or sublicence.
11 #
12 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
13 # the utmost extent permitted by applicable law, neither express nor
14 # implied; without malicious intent or gross negligence. In no event
15 # may a licensor, author or contributor be held liable for indirect,
16 # direct, other damage, loss, or other issues arising in any way out
17 # of dealing in the work, even if advised of the possibility of such
18 # damage or existence of a defect, except proven that it results out
19 # of said person's immediate fault when using the work as intended.
20 #-
21 # RFC compliant base64 encoder and decoder
22
23 # NUL safe base64 decoder
24 function Lb64decode {
25         [[ -o utf8-mode ]]; typeset u=$?
26         set +U
27         typeset c s="$*" t=
28         [[ -n $s ]] || { s=$(cat;print x); s=${s%x}; }
29         typeset -i i=0 n=${#s} p=0 v x
30         typeset -i16 o
31
32         while (( i < n )); do
33                 c=${s:(i++):1}
34                 case $c {
35                 (=)     break ;;
36                 ([A-Z]) (( v = 1#$c - 65 )) ;;
37                 ([a-z]) (( v = 1#$c - 71 )) ;;
38                 ([0-9]) (( v = 1#$c + 4 )) ;;
39                 (+)     v=62 ;;
40                 (/)     v=63 ;;
41                 (*)     continue ;;
42                 }
43                 (( x = (x << 6) | v ))
44                 case $((p++)) {
45                 (0)     continue ;;
46                 (1)     (( o = (x >> 4) & 255 )) ;;
47                 (2)     (( o = (x >> 2) & 255 )) ;;
48                 (3)     (( o = x & 255 ))
49                         p=0
50                         ;;
51                 }
52                 t=$t\\x${o#16#}
53         done
54         print -n $t
55         (( u )) || set -U
56 }
57
58 set -A Lb64encode_code -- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \
59     a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 + /
60 if true; then
61 # not NUL safe base64 encoder
62 function Lb64encode {
63         [[ -o utf8-mode ]]; typeset u=$?
64         set +U
65         typeset c s="$*" t
66         [[ -n $s ]] || { s=$(cat;print x); s=${s%x}; }
67         typeset -i i=0 n=${#s} j v
68
69         while (( i < n )); do
70                 c=${s:(i++):1}
71                 (( v = 1#$c << 16 ))
72                 c=${s:(i++):1}
73                 (( j = ${#c} ? 1#$c : 0 ))
74                 (( v |= j << 8 ))
75                 c=${s:(i++):1}
76                 (( j = ${#c} ? 1#$c : 0 ))
77                 (( v |= j ))
78                 t=$t${Lb64encode_code[v >> 18]}${Lb64encode_code[v >> 12 & 63]}
79                 c=${Lb64encode_code[v >> 6 & 63]}
80                 if (( i <= n )); then
81                         t=$t$c${Lb64encode_code[v & 63]}
82                 elif (( i == n + 1 )); then
83                         t=$t$c=
84                 else
85                         t=$t==
86                 fi
87                 if (( ${#t} == 76 || i >= n )); then
88                         print $t
89                         t=
90                 fi
91         done
92         (( u )) || set -U
93 }
94 else
95 # NUL safe base64 encoder, needs mksh R40
96 function Lb64encode {
97         [[ -o utf8-mode ]]; typeset u=$?
98         set +U
99         typeset c s t
100         if (( $# )); then
101                 read -raN-1 s <<<"$*"
102                 unset s[${#s[*]}-1]
103         else
104                 read -raN-1 s
105         fi
106         typeset -i i=0 n=${#s[*]} j v
107
108         while (( i < n )); do
109                 (( v = s[i++] << 16 ))
110                 (( j = i < n ? s[i++] : 0 ))
111                 (( v |= j << 8 ))
112                 c=${s:(i++):1}
113                 (( j = i < n ? s[i++] : 0 ))
114                 (( v |= j ))
115                 t=$t${Lb64encode_code[v >> 18]}${Lb64encode_code[v >> 12 & 63]}
116                 c=${Lb64encode_code[v >> 6 & 63]}
117                 if (( i <= n )); then
118                         t=$t$c${Lb64encode_code[v & 63]}
119                 elif (( i == n + 1 )); then
120                         t=$t$c=
121                 else
122                         t=$t==
123                 fi
124                 if (( ${#t} == 76 || i >= n )); then
125                         print $t
126                         t=
127                 fi
128         done
129         (( u )) || set -U
130 }
131 fi