18b9c8063d0cae8e28ef95ef5b182921d38f5cc9
[shellsnippets/shellsnippets.git] / mksh / base64
1 # $MirOS: src/bin/mksh/dot.mkshrc,v 1.59 2011/02/09 19:32:35 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 # base64 encoder (not NUL safe) and decoder (NUL safe), RFC compliant
22 function Lb64decode {
23         [[ -o utf8-mode ]]; typeset u=$?
24         set +U
25         typeset c s="$*" t=
26         [[ -n $s ]] || { s=$(cat;print x); s=${s%x}; }
27         typeset -i i=0 n=${#s} p=0 v x
28         typeset -i16 o
29
30         while (( i < n )); do
31                 c=${s:(i++):1}
32                 case $c {
33                 (=)     break ;;
34                 ([A-Z]) (( v = 1#$c - 65 )) ;;
35                 ([a-z]) (( v = 1#$c - 71 )) ;;
36                 ([0-9]) (( v = 1#$c + 4 )) ;;
37                 (+)     v=62 ;;
38                 (/)     v=63 ;;
39                 (*)     continue ;;
40                 }
41                 (( x = (x << 6) | v ))
42                 case $((p++)) {
43                 (0)     continue ;;
44                 (1)     (( o = (x >> 4) & 255 )) ;;
45                 (2)     (( o = (x >> 2) & 255 )) ;;
46                 (3)     (( o = x & 255 ))
47                         p=0
48                         ;;
49                 }
50                 t=$t\\x${o#16#}
51         done
52         print -n $t
53         (( u )) || set -U
54 }
55
56 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 \
57     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 + /
58 function Lb64encode {
59         [[ -o utf8-mode ]]; typeset u=$?
60         set +U
61         typeset c s="$*" t
62         [[ -n $s ]] || { s=$(cat;print x); s=${s%x}; }
63         typeset -i i=0 n=${#s} j v
64
65         while (( i < n )); do
66                 c=${s:(i++):1}
67                 (( v = 1#$c << 16 ))
68                 c=${s:(i++):1}
69                 (( j = ${#c} ? 1#$c : 0 ))
70                 (( v |= j << 8 ))
71                 c=${s:(i++):1}
72                 (( j = ${#c} ? 1#$c : 0 ))
73                 (( v |= j ))
74                 t=$t${Lb64encode_code[v >> 18]}${Lb64encode_code[v >> 12 & 63]}
75                 c=${Lb64encode_code[v >> 6 & 63]}
76                 if (( i <= n )); then
77                         t=$t$c${Lb64encode_code[v & 63]}
78                 elif (( i == n + 1 )); then
79                         t=$t$c=
80                 else
81                         t=$t==
82                 fi
83                 if (( ${#t} == 76 || i >= n )); then
84                         print $t
85                         t=
86                 fi
87         done
88         (( u )) || set -U
89 }