Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-imap/imap-quote.c @ 898:0d5be52d7131 HEAD
Use unsigned char* when accessing non-NUL terminating strings. Compiler
warnings would then notify about accidentally passing them to functions which
require them NUL-terminated. Changed a few functions to use void* to avoid
unneeded casting.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 04 Jan 2003 19:26:29 +0200 |
parents | 41ec8cadd238 |
children | fd8888f6f037 |
rev | line source |
---|---|
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2002 Timo Sirainen */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
4 #include "str.h" |
579
e524da896d92
Several minor fixes: signess, casting away const, missing static, etc.
Timo Sirainen <tss@iki.fi>
parents:
339
diff
changeset
|
5 #include "imap-quote.h" |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #define IS_BREAK_CHAR(c) \ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 ((c) == ' ' || (c) == '\t' || \ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 (c) == ',' || (c) == ':' || (c) == ';' || (c) == '@' || \ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 (c) == '<' || (c) == '>' || (c) == '(' || (c) == ')' || \ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 (c) == '[' || (c) == ']' || (c) == '=') |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #define IS_BREAK_OR_CRLF_CHAR(c) \ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 (IS_BREAK_CHAR(c) || (c) == '\r' || (c) == '\n') |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
16 static size_t next_token_quoted(const unsigned char *value, size_t len, |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 int *need_qp, int *quoted) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 size_t i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 *need_qp = FALSE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 *quoted = TRUE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 for (i = *quoted ? 0 : 1; i < len; i++) { |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
25 if (value[i] & 0x80) |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 *need_qp = TRUE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 if (value[i] == '"' || value[i] == '\r' || value[i] == '\n') { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 i++; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 *quoted = value[i] == '"'; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 break; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 return i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
38 static size_t next_token(const unsigned char *value, size_t len, |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 int *need_qp, int *quoted, int qp_on) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 size_t i = 0; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 if (value[0] == '"' || *quoted) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 return next_token_quoted(value, len, need_qp, quoted); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 *need_qp = FALSE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 if (qp_on) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 /* skip spaces, so we don't end up QP'ing word at a time */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 for (i = 0; i < len; i++) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 if (value[i] != ' ') |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 break; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 if (i == len) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 return i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 if (IS_BREAK_OR_CRLF_CHAR(value[i])) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 /* return all break-chars in one token */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 for (i++; i < len; i++) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 if (!IS_BREAK_CHAR(value[i])) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 break; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 return i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 /* then stop at break-char */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 for (; i < len; i++) { |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
71 if (value[i] & 0x80) |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 *need_qp = TRUE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 if (IS_BREAK_OR_CRLF_CHAR(value[i])) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 break; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 return i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
81 static void append_quoted_qp(String *str, const unsigned char *value, |
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
82 size_t len) |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 size_t i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 unsigned char c; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 /* do this the easy way, it's already broken behaviour to leave the |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 8bit text in mailbox, so we shouldn't need to try too hard to make |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 it readable. Keep 'A'..'Z', 'a'..'z' and '0'..'9', QP rest */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 for (i = 0; i < len; i++) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 if (value[i] == ' ') |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
93 str_append_c(str, '_'); |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 else if ((value[i] >= 'A' && value[i] <= 'Z') || |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 (value[i] >= 'a' && value[i] <= 'z') || |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 (value[i] >= '0' && value[i] <= '9')) { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
97 str_append_c(str, value[i]); |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 } else { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
99 str_append_c(str, '='); |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
100 c = value[i] >> 4; |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
101 str_append_c(str, c < 10 ? (c+'0') : (c-10+'A')); |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
102 c = value[i] & 0x0f; |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
103 str_append_c(str, c < 10 ? (c+'0') : (c-10+'A')); |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
108 static void append_quoted(String *str, const unsigned char *value, size_t len) |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 size_t i; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 for (i = 0; i < len; i++) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 if (value[i] == '\\' || value[i] == '"') |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
114 str_append_c(str, '\\'); |
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
115 str_append_c(str, value[i]); |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 /* does two things: 1) escape '\' and '"' characters, 2) 8bit text -> QP */ |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
120 static String *get_quoted_str(const unsigned char *value, size_t value_len) |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
122 String *str; |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 size_t token_len; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 int qp, need_qp, quoted; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
126 str = t_str_new(value_len * 2); |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 qp = FALSE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 quoted = FALSE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
130 str_append_c(str, '"'); |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 while (value_len > 0) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 token_len = next_token(value, value_len, &need_qp, "ed, qp); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 i_assert(token_len > 0 && token_len <= value_len); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 /* header may be split to multiple lines, we don't want them */ |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 while (token_len > 0 && (value[0] == '\r' || |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 value[0] == '\n')) { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 value++; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 token_len--; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 value_len--; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 if (need_qp && !qp) { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
144 str_append(str, "=?x-unknown?Q?"); |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 qp = TRUE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 } else if (!need_qp && qp) { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
147 str_append(str, "?="); |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 qp = FALSE; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 if (need_qp) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 append_quoted_qp(str, value, token_len); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 else |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 append_quoted(str, value, token_len); |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 value += token_len; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 value_len -= token_len; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
160 if (qp) str_append(str, "?="); |
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
161 str_append_c(str, '"'); |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 return str; |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 const char *imap_quote_str_nil(const char *value) |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 { |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 return value == NULL ? "NIL" : |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
169 str_c(get_quoted_str((const unsigned char *) value, |
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
170 strlen(value))); |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 } |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
173 char *imap_quote_value(Pool pool, const unsigned char *value, size_t value_len) |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 { |
833
41ec8cadd238
Replaced TempString with a String which can use any memory pool and uses
Timo Sirainen <tss@iki.fi>
parents:
579
diff
changeset
|
175 String *str; |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 |
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 str = get_quoted_str(value, value_len); |
898
0d5be52d7131
Use unsigned char* when accessing non-NUL terminating strings. Compiler
Timo Sirainen <tss@iki.fi>
parents:
833
diff
changeset
|
178 return p_strndup(pool, str_data(str), str_len(str)); |
339
6f4eeb6a0a0d
Several fields in BODY were unquoted.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 } |