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); | ||
|  | } |