Mercurial > libpst
diff src/libstrfunc.c @ 16:c508ee15dfca
switch to automake/autoconf
author | carl |
---|---|
date | Sun, 19 Feb 2006 18:47:46 -0800 |
parents | |
children | b88ceb81dba2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/libstrfunc.c Sun Feb 19 18:47:46 2006 -0800 @@ -0,0 +1,69 @@ + +/* Taken from LibStrfunc v7.3 */ + +#include <stdio.h> +#include <ctype.h> +#include <stdlib.h> +#include "libstrfunc.h" + +char *_sf_b64_buf=NULL; +size_t _sf_b64_len=0; + + +static unsigned char _sf_uc_ib[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=="; + +char * +base64_encode(void *data, size_t size) { + char *output; + register char *ou; + register unsigned char *p=(unsigned char *)data; +#ifdef __LINUX__ + register void * dte = ((char*)data + size); +#endif + +#ifndef __LINUX__ + register void * dte = (void*)((char*)data + size); +#endif + //register void *dte=data + size; + register int nc=0; + + if(data == NULL) + return NULL; + + ou=output=(char *)malloc(size / 3 * 4 + (size / 50) + 5); + if(!output) + return NULL; + + while((char *)dte - (char *)p >= 3) { + *ou = _sf_uc_ib[ *p >> 2 ]; + ou[1] = _sf_uc_ib[ ((*p & 0x03) << 4) | (p[1] >> 4) ]; + ou[2] = _sf_uc_ib[ ((p[1] & 0x0F) << 2) | (p[2] >> 6) ]; + ou[3] = _sf_uc_ib[ p[2] & 0x3F ]; + + p+=3; + ou+=4; + + nc+=4; + if(!(nc % 76)) *ou++='\n'; + }; + if((char *)dte - (char *)p == 2) { + *ou++ = _sf_uc_ib[ *p >> 2 ]; + *ou++ = _sf_uc_ib[ ((*p & 0x03) << 4) | (p[1] >> 4) ]; + *ou++ = _sf_uc_ib[ ((p[1] & 0x0F) << 2) ]; + *ou++ = '='; + } else if((char *)dte - (char *)p == 1) { + *ou++ = _sf_uc_ib[ *p >> 2 ]; + *ou++ = _sf_uc_ib[ ((*p & 0x03) << 4) ]; + *ou++ = '='; + *ou++ = '='; + }; + + *ou=0; + + _sf_b64_len = (ou - output); + + if(_sf_b64_buf) + free(_sf_b64_buf); + return _sf_b64_buf=output; +}; +