Mercurial > libpst
comparison src/libstrfunc.c @ 16:c508ee15dfca
switch to automake/autoconf
author | carl |
---|---|
date | Sun, 19 Feb 2006 18:47:46 -0800 |
parents | |
children | b88ceb81dba2 |
comparison
equal
deleted
inserted
replaced
15:ac98f448b6ab | 16:c508ee15dfca |
---|---|
1 | |
2 /* Taken from LibStrfunc v7.3 */ | |
3 | |
4 #include <stdio.h> | |
5 #include <ctype.h> | |
6 #include <stdlib.h> | |
7 #include "libstrfunc.h" | |
8 | |
9 char *_sf_b64_buf=NULL; | |
10 size_t _sf_b64_len=0; | |
11 | |
12 | |
13 static unsigned char _sf_uc_ib[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=="; | |
14 | |
15 char * | |
16 base64_encode(void *data, size_t size) { | |
17 char *output; | |
18 register char *ou; | |
19 register unsigned char *p=(unsigned char *)data; | |
20 #ifdef __LINUX__ | |
21 register void * dte = ((char*)data + size); | |
22 #endif | |
23 | |
24 #ifndef __LINUX__ | |
25 register void * dte = (void*)((char*)data + size); | |
26 #endif | |
27 //register void *dte=data + size; | |
28 register int nc=0; | |
29 | |
30 if(data == NULL) | |
31 return NULL; | |
32 | |
33 ou=output=(char *)malloc(size / 3 * 4 + (size / 50) + 5); | |
34 if(!output) | |
35 return NULL; | |
36 | |
37 while((char *)dte - (char *)p >= 3) { | |
38 *ou = _sf_uc_ib[ *p >> 2 ]; | |
39 ou[1] = _sf_uc_ib[ ((*p & 0x03) << 4) | (p[1] >> 4) ]; | |
40 ou[2] = _sf_uc_ib[ ((p[1] & 0x0F) << 2) | (p[2] >> 6) ]; | |
41 ou[3] = _sf_uc_ib[ p[2] & 0x3F ]; | |
42 | |
43 p+=3; | |
44 ou+=4; | |
45 | |
46 nc+=4; | |
47 if(!(nc % 76)) *ou++='\n'; | |
48 }; | |
49 if((char *)dte - (char *)p == 2) { | |
50 *ou++ = _sf_uc_ib[ *p >> 2 ]; | |
51 *ou++ = _sf_uc_ib[ ((*p & 0x03) << 4) | (p[1] >> 4) ]; | |
52 *ou++ = _sf_uc_ib[ ((p[1] & 0x0F) << 2) ]; | |
53 *ou++ = '='; | |
54 } else if((char *)dte - (char *)p == 1) { | |
55 *ou++ = _sf_uc_ib[ *p >> 2 ]; | |
56 *ou++ = _sf_uc_ib[ ((*p & 0x03) << 4) ]; | |
57 *ou++ = '='; | |
58 *ou++ = '='; | |
59 }; | |
60 | |
61 *ou=0; | |
62 | |
63 _sf_b64_len = (ou - output); | |
64 | |
65 if(_sf_b64_buf) | |
66 free(_sf_b64_buf); | |
67 return _sf_b64_buf=output; | |
68 }; | |
69 |