annotate src/libstrfunc.c @ 110:7133b39975f7 stable-0-6-22

patch from David Cuadrado to process emails with type PST_TYPE_OTHER base64_encode_multiple() may insert newline, needs larger malloc subject lines shorter than 2 bytes could segfault
author Carl Byington <carl@five-ten-sg.com>
date Fri, 28 Nov 2008 11:36:53 -0800
parents 997cf1373f9e
children ab2a11e72250
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
1
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
2 /* Taken from LibStrfunc v7.3 */
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
3
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
4 #include <stdio.h>
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
5 #include <ctype.h>
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
6 #include <stdlib.h>
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
7 #include "libstrfunc.h"
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
8
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
9
94
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
10 static char base64_code_chars[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/==";
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
11
94
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
12 void base64_append(char **ou, int *line_count, char data)
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
13 {
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
14 if (*line_count == 76) {
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
15 *(*ou)++ = '\n';
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
16 *line_count = 0;
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
17 }
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
18 *(*ou)++ = data;
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
19 (*line_count)++;
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
20 }
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
21
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
22
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
23 char *base64_encode(void *data, size_t size)
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
24 {
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
25 int line_count = 0;
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
26 return base64_encode_multiple(data, size, &line_count);
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
27 }
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
28
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
29
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
30 char *base64_encode_multiple(void *data, size_t size, int *line_count)
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
31 {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
32 char *output;
94
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
33 char *ou;
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
34 unsigned char *p = (unsigned char *)data;
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
35 unsigned char *dte = p + size;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
36
94
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
37 if (data == NULL || size == 0) return NULL;
36
6fe121a971c9 valgrind fixes
carl
parents: 31
diff changeset
38
110
7133b39975f7 patch from David Cuadrado to process emails with type PST_TYPE_OTHER
Carl Byington <carl@five-ten-sg.com>
parents: 94
diff changeset
39 ou = output = (char *)malloc(size / 3 * 4 + (size / 57) + 6);
94
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
40 if (!output) return NULL;
36
6fe121a971c9 valgrind fixes
carl
parents: 31
diff changeset
41
94
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
42 while((dte-p) >= 3) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
43 unsigned char x = p[0];
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
44 unsigned char y = p[1];
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
45 unsigned char z = p[2];
94
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
46 base64_append(&ou, line_count, base64_code_chars[ x >> 2 ]);
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
47 base64_append(&ou, line_count, base64_code_chars[ ((x & 0x03) << 4) | (y >> 4) ]);
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
48 base64_append(&ou, line_count, base64_code_chars[ ((y & 0x0F) << 2) | (z >> 6) ]);
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
49 base64_append(&ou, line_count, base64_code_chars[ z & 0x3F ]);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
50 p+=3;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
51 };
94
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
52 if ((dte-p) == 2) {
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
53 base64_append(&ou, line_count, base64_code_chars[ *p >> 2 ]);
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
54 base64_append(&ou, line_count, base64_code_chars[ ((*p & 0x03) << 4) | (p[1] >> 4) ]);
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
55 base64_append(&ou, line_count, base64_code_chars[ ((p[1] & 0x0F) << 2) ]);
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
56 base64_append(&ou, line_count, '=');
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
57 } else if ((dte-p) == 1) {
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
58 base64_append(&ou, line_count, base64_code_chars[ *p >> 2 ]);
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
59 base64_append(&ou, line_count, base64_code_chars[ ((*p & 0x03) << 4) ]);
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
60 base64_append(&ou, line_count, '=');
997cf1373f9e fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents: 43
diff changeset
61 base64_append(&ou, line_count, '=');
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
62 };
36
6fe121a971c9 valgrind fixes
carl
parents: 31
diff changeset
63
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
64 *ou=0;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
65 return output;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
66 };
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
67
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
68
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
69 void hexdump(char *hbuf, int start, int stop, int ascii) /* {{{ HexDump all or a part of some buffer */
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
70 {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
71 char c;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
72 int diff,i;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
73
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
74 while (start < stop ) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
75 diff = stop - start;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
76 if (diff > 16) diff = 16;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
77
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
78 fprintf(stderr, ":%08X ",start);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
79
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
80 for (i = 0; i < diff; i++) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
81 if( 8 == i ) fprintf( stderr, " " );
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
82 fprintf(stderr, "%02X ",(unsigned char)*(hbuf+start+i));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
83 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
84 if (ascii) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
85 for (i = diff; i < 16; i++) fprintf(stderr, " ");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
86 for (i = 0; i < diff; i++) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
87 c = *(hbuf+start+i);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
88 fprintf(stderr, "%c", isprint(c) ? c : '.');
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
89 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
90 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
91 fprintf(stderr, "\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
92 start += 16;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
93 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 36
diff changeset
94 }