annotate src/lib-imap/imap-base-subject.c @ 9532:00cd9aacd03c HEAD

Updated copyright notices to include year 2010.
author Timo Sirainen <tss@iki.fi>
date Mon, 25 Jan 2010 01:18:58 +0200
parents b9faf4db2a9f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9532
00cd9aacd03c Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
1 /* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
924
4f697dde0fca THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
3 /* Implementated against draft-ietf-imapext-sort-10 and
4f697dde0fca THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
4 draft-ietf-imapext-thread-12 */
4f697dde0fca THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
5
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "lib.h"
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "buffer.h"
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "charset-utf8.h"
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "message-header-decode.h"
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "imap-base-subject.h"
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
12 static void pack_whitespace(buffer_t *buf)
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 {
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 char *data, *dest;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
15 bool last_lwsp;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
17 data = buffer_get_modifiable_data(buf, NULL);
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 /* check if we need to do anything */
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 while (*data != '\0') {
985
961617a56fb9 Strip CR and LF characters too.
Timo Sirainen <tss@iki.fi>
parents: 959
diff changeset
21 if (*data == '\t' || *data == '\n' || *data == '\r' ||
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 (*data == ' ' && (data[1] == ' ' || data[1] == '\t')))
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 break;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 data++;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 if (*data == '\0')
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 return;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 /* @UNSAFE: convert/pack the whitespace */
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 dest = data; last_lwsp = FALSE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 while (*data != '\0') {
985
961617a56fb9 Strip CR and LF characters too.
Timo Sirainen <tss@iki.fi>
parents: 959
diff changeset
33 if (*data == '\t' || *data == ' ' ||
961617a56fb9 Strip CR and LF characters too.
Timo Sirainen <tss@iki.fi>
parents: 959
diff changeset
34 *data == '\r' || *data == '\n') {
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 if (!last_lwsp) {
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 *dest++ = ' ';
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 last_lwsp = TRUE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 } else {
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 *dest++ = *data;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 last_lwsp = FALSE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 data++;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 *dest = '\0';
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
47 data = buffer_get_modifiable_data(buf, NULL);
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 buffer_set_used_size(buf, (size_t) (dest - data)+1);
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
51 static void remove_subj_trailers(buffer_t *buf, size_t start_pos,
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
52 bool *is_reply_or_forward_r)
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 {
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 const char *data;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 size_t orig_size, size;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 /* subj-trailer = "(fwd)" / WSP */
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 data = buffer_get_data(buf, &orig_size);
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
7856
3c8736e8f08d imap_get_base_subject_cased(): Subject trailers weren't removed correctly.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
60 if (orig_size < 1) /* size includes trailing \0 */
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 return;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
7856
3c8736e8f08d imap_get_base_subject_cased(): Subject trailers weren't removed correctly.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
63 for (size = orig_size-1; size > start_pos; ) {
3c8736e8f08d imap_get_base_subject_cased(): Subject trailers weren't removed correctly.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
64 if (data[size-1] == ' ')
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 size--;
924
4f697dde0fca THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
66 else if (size >= 5 &&
7856
3c8736e8f08d imap_get_base_subject_cased(): Subject trailers weren't removed correctly.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
67 memcmp(data + size - 5, "(FWD)", 5) == 0) {
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
68 if (is_reply_or_forward_r != NULL)
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
69 *is_reply_or_forward_r = TRUE;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 size -= 5;
924
4f697dde0fca THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
71 } else {
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 break;
924
4f697dde0fca THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
73 }
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
7856
3c8736e8f08d imap_get_base_subject_cased(): Subject trailers weren't removed correctly.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
76 if (size != orig_size-1) {
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 buffer_set_used_size(buf, size);
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 buffer_append_c(buf, '\0');
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
82 static bool remove_blob(const char **datap)
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 {
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 const char *data = *datap;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 if (*data != '[')
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 return FALSE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88
959
f66455b629cd Blobs weren't removed correctly, resulting in incorrect SORT SUBJECT and
Timo Sirainen <tss@iki.fi>
parents: 924
diff changeset
89 data++;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 while (*data != '\0' && *data != '[' && *data != ']')
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 data++;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 if (*data != ']')
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 return FALSE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 data++;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 if (*data == ' ')
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 data++;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 *datap = data;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 return TRUE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
104 static bool remove_subj_leader(buffer_t *buf, size_t *start_pos,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
105 bool *is_reply_or_forward_r)
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 {
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 const char *data, *orig_data;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
108 bool ret = FALSE;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 /* subj-leader = (*subj-blob subj-refwd) / WSP
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 subj-blob = "[" *BLOBCHAR "]" *WSP
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 subj-refwd = ("re" / ("fw" ["d"])) *WSP [subj-blob] ":"
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 BLOBCHAR = %x01-5a / %x5c / %x5e-7f
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 ; any CHAR except '[' and ']' */
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
117 orig_data = buffer_get_data(buf, NULL);
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
118 orig_data += *start_pos;
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
119 data = orig_data;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 if (*data == ' ') {
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 /* independent from checks below - always removed */
2526
da6b2e4a8b3a Parsing fix
Timo Sirainen <tss@iki.fi>
parents: 2411
diff changeset
123 data++; orig_data++;
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
124 *start_pos += 1;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 ret = TRUE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 while (*data == '[') {
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 if (!remove_blob(&data))
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 return ret;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132
7856
3c8736e8f08d imap_get_base_subject_cased(): Subject trailers weren't removed correctly.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
133 if (strncmp(data, "RE", 2) == 0)
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 data += 2;
7856
3c8736e8f08d imap_get_base_subject_cased(): Subject trailers weren't removed correctly.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
135 else if (strncmp(data, "FWD", 3) == 0)
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 data += 3;
7856
3c8736e8f08d imap_get_base_subject_cased(): Subject trailers weren't removed correctly.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
137 else if (strncmp(data, "FW", 2) == 0)
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 data += 2;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 else
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 return ret;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 if (*data == ' ')
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 data++;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 if (*data == '[' && !remove_blob(&data))
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 return ret;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 if (*data != ':')
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 return ret;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 data++;
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
152 *start_pos += (size_t)(data - orig_data);
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
153 if (is_reply_or_forward_r != NULL)
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
154 *is_reply_or_forward_r = TRUE;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 return TRUE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
158 static bool remove_blob_when_nonempty(buffer_t *buf, size_t *start_pos)
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 {
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 const char *data, *orig_data;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
162 orig_data = buffer_get_data(buf, NULL);
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
163 orig_data += *start_pos;
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
164 data = orig_data;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 if (*data == '[' && remove_blob(&data) && *data != '\0') {
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
166 *start_pos += (size_t)(data - orig_data);
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 return TRUE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 return FALSE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
173 static bool remove_subj_fwd_hdr(buffer_t *buf, size_t *start_pos,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
174 bool *is_reply_or_forward_r)
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 {
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 const char *data;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 size_t size;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 /* subj-fwd = subj-fwd-hdr subject subj-fwd-trl
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 subj-fwd-hdr = "[fwd:"
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 subj-fwd-trl = "]" */
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 data = buffer_get_data(buf, &size);
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183
7856
3c8736e8f08d imap_get_base_subject_cased(): Subject trailers weren't removed correctly.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
184 if (strncmp(data + *start_pos, "[FWD:", 5) != 0)
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 return FALSE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 if (data[size-2] != ']')
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 return FALSE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
190 if (is_reply_or_forward_r != NULL)
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
191 *is_reply_or_forward_r = TRUE;
924
4f697dde0fca THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
192
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 buffer_set_used_size(buf, size-2);
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 buffer_append_c(buf, '\0');
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
196 *start_pos += 5;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 return TRUE;
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 }
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199
924
4f697dde0fca THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
200 const char *imap_get_base_subject_cased(pool_t pool, const char *subject,
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
201 bool *is_reply_or_forward_r)
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 898
diff changeset
203 buffer_t *buf;
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
204 size_t start_pos, subject_len;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
205 bool found;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
207 if (is_reply_or_forward_r != NULL)
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
208 *is_reply_or_forward_r = FALSE;
924
4f697dde0fca THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
209
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 subject_len = strlen(subject);
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2526
diff changeset
211 buf = buffer_create_dynamic(pool, subject_len);
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 /* (1) Convert any RFC 2047 encoded-words in the subject to
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 UTF-8. Convert all tabs and continuations to space.
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 Convert all multiple spaces to a single space. */
6119
9607369b6bce Use message_header_decode_utf8() instead of implementing our own.
Timo Sirainen <tss@iki.fi>
parents: 6112
diff changeset
216 message_header_decode_utf8((const unsigned char *)subject, subject_len,
9607369b6bce Use message_header_decode_utf8() instead of implementing our own.
Timo Sirainen <tss@iki.fi>
parents: 6112
diff changeset
217 buf, TRUE);
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 buffer_append_c(buf, '\0');
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 pack_whitespace(buf);
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
222 start_pos = 0;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 do {
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 /* (2) Remove all trailing text of the subject that matches
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 the subj-trailer ABNF, repeat until no more matches are
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 possible. */
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
227 remove_subj_trailers(buf, start_pos, is_reply_or_forward_r);
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 do {
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 /* (3) Remove all prefix text of the subject that
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 matches the subj-leader ABNF. */
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
232 found = remove_subj_leader(buf, &start_pos,
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
233 is_reply_or_forward_r);
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 /* (4) If there is prefix text of the subject that
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 matches the subj-blob ABNF, and removing that prefix
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 leaves a non-empty subj-base, then remove the prefix
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 text. */
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
239 found = remove_blob_when_nonempty(buf, &start_pos) ||
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
240 found;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 /* (5) Repeat (3) and (4) until no matches remain. */
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 } while (found);
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 /* (6) If the resulting text begins with the subj-fwd-hdr ABNF
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 and ends with the subj-fwd-trl ABNF, remove the
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 subj-fwd-hdr and subj-fwd-trl and repeat from step (2). */
2411
c8fa857c4e08 Drop using buffer_set_start_pos(). Also some coding style cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1797
diff changeset
248 } while (remove_subj_fwd_hdr(buf, &start_pos, is_reply_or_forward_r));
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 /* (7) The resulting text is the "base subject" used in the
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 SORT. */
7856
3c8736e8f08d imap_get_base_subject_cased(): Subject trailers weren't removed correctly.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
252 return (const char *)buf->data + start_pos;
793
ab093fefe04b Forgot from last SORT commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 }