'LibPst'
libstrfunc.c
Go to the documentation of this file.
1 
2 /* Taken from LibStrfunc v7.3 */
3 
4 #include "define.h"
5 
6 
7 static char base64_code_chars[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/==";
8 
9 static void base64_append(char **ou, int *line_count, char data);
10 static void base64_append(char **ou, int *line_count, char data)
11 {
12  if (*line_count == 76) {
13  *(*ou)++ = '\n';
14  *line_count = 0;
15  }
16  *(*ou)++ = data;
17  if (*line_count >= 0) (*line_count)++;
18 }
19 
20 
21 char *pst_base64_encode(void *data, size_t size)
22 {
23  int line_count = 0;
24  return pst_base64_encode_multiple(data, size, &line_count);
25 }
26 
27 
28 char *pst_base64_encode_single(void *data, size_t size)
29 {
30  int line_count = -1;
31  return pst_base64_encode_multiple(data, size, &line_count);
32 }
33 
34 
35 char *pst_base64_encode_multiple(void *data, size_t size, int *line_count)
36 {
37  char *output;
38  char *ou;
39  unsigned char *p = (unsigned char *)data;
40  unsigned char *dte = p + size;
41 
42  if (data == NULL || size == 0) return NULL;
43 
44  ou = output = (char *)malloc(size / 3 * 4 + (size / 57) + 6);
45  if (!output) return NULL;
46 
47  while((dte-p) >= 3) {
48  unsigned char x = p[0];
49  unsigned char y = p[1];
50  unsigned char z = p[2];
51  base64_append(&ou, line_count, base64_code_chars[ x >> 2 ]);
52  base64_append(&ou, line_count, base64_code_chars[ ((x & 0x03) << 4) | (y >> 4) ]);
53  base64_append(&ou, line_count, base64_code_chars[ ((y & 0x0F) << 2) | (z >> 6) ]);
54  base64_append(&ou, line_count, base64_code_chars[ z & 0x3F ]);
55  p+=3;
56  };
57  if ((dte-p) == 2) {
58  base64_append(&ou, line_count, base64_code_chars[ *p >> 2 ]);
59  base64_append(&ou, line_count, base64_code_chars[ ((*p & 0x03) << 4) | (p[1] >> 4) ]);
60  base64_append(&ou, line_count, base64_code_chars[ ((p[1] & 0x0F) << 2) ]);
61  base64_append(&ou, line_count, '=');
62  } else if ((dte-p) == 1) {
63  base64_append(&ou, line_count, base64_code_chars[ *p >> 2 ]);
64  base64_append(&ou, line_count, base64_code_chars[ ((*p & 0x03) << 4) ]);
65  base64_append(&ou, line_count, '=');
66  base64_append(&ou, line_count, '=');
67  };
68 
69  *ou=0;
70  return output;
71 };
72 
73 
static void base64_append(char **ou, int *line_count, char data)
Definition: libstrfunc.c:10
char * pst_base64_encode(void *data, size_t size)
Definition: libstrfunc.c:21
char * pst_base64_encode_single(void *data, size_t size)
Definition: libstrfunc.c:28
char * pst_base64_encode_multiple(void *data, size_t size, int *line_count)
Definition: libstrfunc.c:35
static char base64_code_chars[]
Definition: libstrfunc.c:7