77 lines
1.5 KiB
C
77 lines
1.5 KiB
C
/*
|
|
** Copyright 1998 - 1999 Double Precision, Inc. See COPYING for
|
|
** distribution information.
|
|
*/
|
|
|
|
/*
|
|
** $Id$
|
|
*/
|
|
#include "rfc2045.h"
|
|
|
|
static unsigned char base64buf[57];
|
|
/* When encoded this becomes 76 characters */
|
|
static int base64cnt;
|
|
|
|
static void (*output_func)(const char *, size_t);
|
|
|
|
void rfc2045_base64encode_start( void (*func)(const char *, size_t))
|
|
{
|
|
output_func=func;
|
|
base64cnt=0;
|
|
}
|
|
|
|
void rfc2045_base64encode(const char *buf, size_t n)
|
|
{
|
|
while (n)
|
|
{
|
|
size_t i;
|
|
|
|
if (base64cnt == sizeof(base64buf))
|
|
{
|
|
rfc2045_base64encode_end();
|
|
base64cnt=0;
|
|
}
|
|
i=n;
|
|
if (i > sizeof(base64buf) - base64cnt)
|
|
i=sizeof(base64buf) - base64cnt;
|
|
memcpy(base64buf + base64cnt, buf, i);
|
|
base64cnt += i;
|
|
buf += i;
|
|
n -= i;
|
|
}
|
|
}
|
|
|
|
static const char base64tab[]=
|
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
|
|
void rfc2045_base64encode_end()
|
|
{
|
|
int a=0,b=0,c=0;
|
|
int i, j;
|
|
int d, e, f, g;
|
|
char output_buf[ sizeof(base64buf) / 3 * 4+1];
|
|
|
|
if (base64cnt == 0) return;
|
|
|
|
for (j=i=0; i<base64cnt; i += 3)
|
|
{
|
|
a=base64buf[i];
|
|
b= i+1 < base64cnt ? base64buf[i+1]:0;
|
|
c= i+2 < base64cnt ? base64buf[i+2]:0;
|
|
|
|
d=base64tab[ a >> 2 ];
|
|
e=base64tab[ ((a & 3 ) << 4) | (b >> 4)];
|
|
f=base64tab[ ((b & 15) << 2) | (c >> 6)];
|
|
g=base64tab[ c & 63 ];
|
|
if (i + 1 >= base64cnt) f='=';
|
|
if (i + 2 >= base64cnt) g='=';
|
|
output_buf[j++]=d;
|
|
output_buf[j++]=e;
|
|
output_buf[j++]=f;
|
|
output_buf[j++]=g;
|
|
}
|
|
|
|
output_buf[j++]='\n';
|
|
(*output_func)(output_buf, j);
|
|
}
|