forked from Mirrors/freeswitch
50 lines
1.3 KiB
C
50 lines
1.3 KiB
C
#include <string.h>
|
|
|
|
#include "int.h"
|
|
#include "xmlrpc-c/base64_int.h"
|
|
|
|
|
|
|
|
void
|
|
xmlrpc_base64Encode(const char * const chars,
|
|
char * const base64) {
|
|
|
|
/* Conversion table. */
|
|
static char tbl[64] = {
|
|
'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','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','+','/'
|
|
};
|
|
|
|
unsigned int i;
|
|
uint32_t length;
|
|
char * p;
|
|
const char * s;
|
|
|
|
length = strlen(chars); /* initial value */
|
|
s = &chars[0]; /* initial value */
|
|
p = &base64[0]; /* initial value */
|
|
/* Transform the 3x8 bits to 4x6 bits, as required by base64. */
|
|
for (i = 0; i < length; i += 3) {
|
|
*p++ = tbl[s[0] >> 2];
|
|
*p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
|
|
*p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
|
|
*p++ = tbl[s[2] & 0x3f];
|
|
s += 3;
|
|
}
|
|
|
|
/* Pad the result if necessary... */
|
|
if (i == length + 1)
|
|
*(p - 1) = '=';
|
|
else if (i == length + 2)
|
|
*(p - 1) = *(p - 2) = '=';
|
|
|
|
/* ...and zero-terminate it. */
|
|
*p = '\0';
|
|
}
|