comparison libstrfunc.c @ 0:6b1b602514db libpst_0_5

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