Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-imap/imap-utf7.c @ 9595:166a188f9165 HEAD
mbox: Fields weren't being added to cache file during message saving.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 30 Jul 2010 16:55:58 +0100 |
parents | 00cd9aacd03c |
children |
rev | line source |
---|---|
9532
00cd9aacd03c
Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1 /* Copyright (c) 2008-2010 Dovecot authors, see the included COPYING file */ |
8381
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "str.h" |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "unichar.h" |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "imap-utf7.h" |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 static const char imap_b64enc[] = |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,"; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #define XX 0xff |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 static const unsigned char imap_b64dec[256] = { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,62, 63,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 52,53,54,55, 56,57,58,59, 60,61,XX,XX, XX,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 XX, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 15,16,17,18, 19,20,21,22, 23,24,25,XX, XX,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 XX,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 41,42,43,44, 45,46,47,48, 49,50,51,XX, XX,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 }; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 static void |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 mbase64_encode(string_t *dest, const unsigned char *in, unsigned int len) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 str_append_c(dest, '&'); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 while (len >= 3) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 str_append_c(dest, imap_b64enc[in[0] >> 2]); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 str_append_c(dest, imap_b64enc[((in[0] & 3) << 4) | |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 (in[1] >> 4)]); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 str_append_c(dest, imap_b64enc[((in[1] & 0x0f) << 2) | |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 ((in[2] & 0xc0) >> 6)]); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 str_append_c(dest, imap_b64enc[in[2] & 0x3f]); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 in += 3; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 len -= 3; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 if (len > 0) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 str_append_c(dest, imap_b64enc[in[0] >> 2]); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 if (len == 1) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 str_append_c(dest, imap_b64enc[(in[0] & 0x03) << 4]); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 else { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 str_append_c(dest, imap_b64enc[((in[0] & 0x03) << 4) | |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 (in[1] >> 4)]); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 str_append_c(dest, imap_b64enc[(in[1] & 0x0f) << 2]); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 str_append_c(dest, '-'); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 int imap_utf8_to_utf7(const char *src, string_t *dest) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 const char *p; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 unichar_t chr; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 uint8_t *utf16, *u; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 uint16_t u16; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 for (p = src; *p != '\0'; p++) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 if (*p == '&' || (unsigned char)*p >= 0x80) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 break; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 if (*p == '\0') { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 /* no ASCII characters that need to be encoded */ |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 str_append(dest, src); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 return 0; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 /* at least one encoded character */ |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 str_append_n(dest, src, p-src); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 utf16 = t_malloc(strlen(p)*2); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 while (*p != '\0') { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 if (*p == '&') { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 str_append(dest, "&-"); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 p++; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 continue; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 if ((unsigned char)*p < 0x80) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 str_append_c(dest, *p); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 p++; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 continue; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 u = utf16; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 while ((unsigned char)*p >= 0x80) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 if (uni_utf8_get_char(p, &chr) <= 0) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 /* @UNSAFE */ |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 if (chr < UTF16_SURROGATE_BASE) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 *u++ = chr >> 8; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 *u++ = chr & 0xff; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 } else { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 u16 = UTF16_SURROGATE_HIGH(chr); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 *u++ = u16 >> 8; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 *u++ = u16 & 0xff; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 u16 = UTF16_SURROGATE_LOW(chr); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 *u++ = u16 >> 8; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 *u++ = u16 & 0xff; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 p += uni_utf8_char_bytes(*p); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 mbase64_encode(dest, utf16, u-utf16); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 return 0; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 static int utf16buf_to_utf8(string_t *dest, const unsigned char output[4], |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 unsigned int *_pos, unsigned int len) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 unsigned int pos = *_pos; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 uint16_t high, low; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 unichar_t chr; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 if (len % 2 != 0) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 high = (output[pos % 4] << 8) | output[(pos+1) % 4]; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 if (high < UTF16_SURROGATE_HIGH_FIRST || |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 high > UTF16_SURROGATE_HIGH_MAX) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 /* single byte */ |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 uni_ucs4_to_utf8_c(high, dest); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 *_pos = (pos + 2) % 4; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 return 0; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 if (high > UTF16_SURROGATE_HIGH_LAST) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 if (len != 4) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 /* missing the second character */ |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 low = (output[(pos+2)%4] << 8) | output[(pos+3) % 4]; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 if (low < UTF16_SURROGATE_LOW_FIRST || low > UTF16_SURROGATE_LOW_LAST) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 chr = UTF16_SURROGATE_BASE + |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 (((high & UTF16_SURROGATE_MASK) << UTF16_SURROGATE_SHIFT) | |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 (low & UTF16_SURROGATE_MASK)); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 uni_ucs4_to_utf8_c(chr, dest); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 return 0; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 static int mbase64_decode_to_utf8(string_t *dest, const char **_src) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 const char *src = *_src; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 unsigned char input[4], output[4]; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 unsigned int outstart = 0, outpos = 0; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 while (*src != '-') { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 input[0] = imap_b64dec[(uint8_t)src[0]]; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 input[1] = imap_b64dec[(uint8_t)src[1]]; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 if (input[0] == 0xff || input[1] == 0xff) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 output[outpos % 4] = (input[0] << 2) | (input[1] >> 4); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 if (++outpos % 4 == outstart) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 if (utf16buf_to_utf8(dest, output, &outstart, 4) < 0) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 input[2] = imap_b64dec[(uint8_t)src[2]]; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 if (input[2] == 0xff) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 if (src[2] != '-') |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 src += 2; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 break; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 output[outpos % 4] = (input[1] << 4) | (input[2] >> 2); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 if (++outpos % 4 == outstart) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 if (utf16buf_to_utf8(dest, output, &outstart, 4) < 0) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 input[3] = imap_b64dec[(uint8_t)src[3]]; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 if (input[3] == 0xff) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 if (src[3] != '-') |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 src += 3; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 break; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 output[outpos % 4] = ((input[2] << 6) & 0xc0) | input[3]; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 if (++outpos % 4 == outstart) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 if (utf16buf_to_utf8(dest, output, &outstart, 4) < 0) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 src += 4; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 if (outstart != outpos % 4) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 if (utf16buf_to_utf8(dest, output, &outstart, |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 (4 + outpos - outstart) % 4) < 0) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 /* found ending '-' */ |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 *_src = src + 1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 return 0; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 int imap_utf7_to_utf8(const char *src, string_t *dest) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 const char *p; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 for (p = src; *p != '\0'; p++) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 if (*p == '&' || (unsigned char)*p >= 0x80) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 break; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 if (*p == '\0') { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 /* no IMAP-UTF-7 encoded characters */ |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 str_append(dest, src); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 return 0; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 if ((unsigned char)*p >= 0x80) { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 /* 8bit characters - the input is broken */ |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 /* at least one encoded character */ |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 str_append_n(dest, src, p-src); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 while (*p != '\0') { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 if (*p == '&') { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 if (*++p == '-') { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 str_append_c(dest, '&'); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 p++; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 } else { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 if (mbase64_decode_to_utf8(dest, &p) < 0) |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 if (p[0] == '&' && p[1] != '-') { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 /* &...-& */ |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 return -1; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 } else { |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 str_append_c(dest, *p++); |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 } |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 return 0; |
81c0fe5bd635
Added code for encoding and decoding IMAP's modified-UTF7 strings.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 } |