Code

Fixed test so works on MacOSX (use /bin/sh instead of /bin/grep).
[nagiosplug.git] / lib / base64.c
1 /****************************************************************************
2 * Function to encode in Base64
3 *
4 * Written by Lauri Alanko
5 *
6 *****************************************************************************/
8 #include "common.h"
9 #include "base64.h"
11 char *
12 base64 (const char *bin, size_t len)
13 {
15         char *buf = (char *) malloc ((len + 2) / 3 * 4 + 1);
16         size_t i = 0, j = 0;
18         char BASE64_END = '=';
19         char base64_table[64];
20         strncpy (base64_table, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 64);
22         while (j < len - 2) {
23                 buf[i++] = base64_table[bin[j] >> 2];
24                 buf[i++] = base64_table[((bin[j] & 3) << 4) | (bin[j + 1] >> 4)];
25                 buf[i++] = base64_table[((bin[j + 1] & 15) << 2) | (bin[j + 2] >> 6)];
26                 buf[i++] = base64_table[bin[j + 2] & 63];
27                 j += 3;
28         }
30         switch (len - j) {
31         case 1:
32                 buf[i++] = base64_table[bin[j] >> 2];
33                 buf[i++] = base64_table[(bin[j] & 3) << 4];
34                 buf[i++] = BASE64_END;
35                 buf[i++] = BASE64_END;
36                 break;
37         case 2:
38                 buf[i++] = base64_table[bin[j] >> 2];
39                 buf[i++] = base64_table[((bin[j] & 3) << 4) | (bin[j + 1] >> 4)];
40                 buf[i++] = base64_table[(bin[j + 1] & 15) << 2];
41                 buf[i++] = BASE64_END;
42                 break;
43         case 0:
44                 break;
45         }
47         buf[i] = '\0';
48         return buf;
49 }