1 /* Copyright 2007-2012 Fredrik Wikstrom. All rights reserved.
3 ** Redistribution and use in source and binary forms, with or without
4 ** modification, are permitted provided that the following conditions
7 ** 1. Redistributions of source code must retain the above copyright
8 ** notice, this list of conditions and the following disclaimer.
10 ** 2. Redistributions in binary form must reproduce the above copyright
11 ** notice, this list of conditions and the following disclaimer in the
12 ** documentation and/or other materials provided with the distribution.
14 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
15 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 ** POSSIBILITY OF SUCH DAMAGE.
30 static BOOL
inline is_base64 (const TEXT c
) {
31 if ((c
>= 'A' && c
<= 'Z') ||
32 (c
>= 'a' && c
<= 'z') ||
33 (c
>= '0' && c
<= '9') ||
34 c
== '+' || c
== '/' || c
== '=')
40 void cleanup_base64 (STRPTR src
) {
43 if (is_base64(*src
)) {
52 static inline UBYTE
decode_base64_char (const TEXT c
) {
53 if (c
>= 'A' && c
<= 'Z') return c
- 'A';
54 if (c
>= 'a' && c
<= 'z') return c
- 'a' + 26;
55 if (c
>= '0' && c
<= '9') return c
- '0' + 52;
56 if (c
== '+') return 62;
57 if (c
== '/') return 63;
61 ULONG
decode_base64(CONST_STRPTR src
, STRPTR dst
) {
64 cnt
= strlen(src
) >> 2;
67 c0
= decode_base64_char(*src
++);
68 c1
= decode_base64_char(*src
++);
69 c2
= decode_base64_char(*src
++);
70 c3
= decode_base64_char(*src
++);
71 *dst
++ = (c0
<< 2)|(c1
>> 4);
72 *dst
++ = (c1
<< 4)|(c2
>> 2);
73 *dst
++ = (c2
<< 6)|c3
;
75 while (*--src
== '=' && dlen
) dlen
--;