dovecot-1.1: SEARCH SUBJECT now changes LWSP to spaces to match ...
dovecot at dovecot.org
dovecot at dovecot.org
Thu Feb 21 22:51:11 EET 2008
details: http://hg.dovecot.org/dovecot-1.1/rev/346d4a44c2f4
changeset: 7284:346d4a44c2f4
user: Timo Sirainen <tss at iki.fi>
date: Thu Feb 21 22:52:38 2008 +0200
description:
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
diffstat:
4 files changed, 50 insertions(+), 22 deletions(-)
src/imap/imap-search.c | 2 -
src/lib-storage/index/index-search.c | 68 +++++++++++++++++++++++-----------
src/lib-storage/mail-search.c | 1
src/lib-storage/mail-search.h | 1
diffs (140 lines):
diff -r f70c4d501251 -r 346d4a44c2f4 src/imap/imap-search.c
--- a/src/imap/imap-search.c Thu Feb 21 22:44:19 2008 +0200
+++ b/src/imap/imap-search.c Thu Feb 21 22:52:38 2008 +0200
@@ -408,7 +408,7 @@ static bool search_arg_build(struct sear
return ARG_NEW_FLAGS(MAIL_SEEN);
else if (strcmp(str, "SUBJECT") == 0) {
/* <string> */
- return ARG_NEW_HEADER(SEARCH_HEADER, str);
+ return ARG_NEW_HEADER(SEARCH_HEADER_COMPRESS_LWSP, str);
} else if (strcmp(str, "SENTBEFORE") == 0) {
/* <date> */
return ARG_NEW_DATE(SEARCH_SENTBEFORE);
diff -r f70c4d501251 -r 346d4a44c2f4 src/lib-storage/index/index-search.c
--- a/src/lib-storage/index/index-search.c Thu Feb 21 22:44:19 2008 +0200
+++ b/src/lib-storage/index/index-search.c Thu Feb 21 22:52:38 2008 +0200
@@ -328,6 +328,25 @@ msg_search_arg_context(struct index_sear
return NULL;
}
+static void compress_lwsp(string_t *dest, const unsigned char *src,
+ unsigned int src_len)
+{
+ unsigned int i;
+ bool prev_lwsp = TRUE;
+
+ for (i = 0; i < src_len; i++) {
+ if (IS_LWSP(src[i])) {
+ if (!prev_lwsp) {
+ prev_lwsp = TRUE;
+ str_append_c(dest, ' ');
+ }
+ } else {
+ prev_lwsp = FALSE;
+ str_append_c(dest, src[i]);
+ }
+ }
+}
+
static void search_header_arg(struct mail_search_arg *arg,
struct search_header_context *ctx)
{
@@ -335,7 +354,6 @@ static void search_header_arg(struct mai
struct message_block block;
struct message_header_line hdr;
int ret;
- bool match;
/* first check that the field name matches to argument. */
switch (arg->type) {
@@ -357,6 +375,7 @@ static void search_header_arg(struct mai
case SEARCH_HEADER:
case SEARCH_HEADER_ADDRESS:
+ case SEARCH_HEADER_COMPRESS_LWSP:
ctx->custom_header = TRUE;
if (strcasecmp(ctx->hdr->name, arg->hdr_field_name) != 0)
@@ -388,13 +407,18 @@ static void search_header_arg(struct mai
msg_search_ctx = msg_search_arg_context(ctx->index_context, arg);
if (msg_search_ctx == NULL)
- match = FALSE;
- else if (arg->type == SEARCH_HEADER_ADDRESS) {
- /* we have to match against normalized address */
- T_BEGIN {
- struct message_address *addr;
- string_t *str;
-
+ return;
+
+ T_BEGIN {
+ struct message_address *addr;
+ string_t *str;
+
+ switch (arg->type) {
+ case SEARCH_HEADER:
+ /* simple match */
+ break;
+ case SEARCH_HEADER_ADDRESS:
+ /* we have to match against normalized address */
addr = message_address_parse(pool_datastack_create(),
ctx->hdr->full_value,
ctx->hdr->full_value_len,
@@ -403,19 +427,21 @@ static void search_header_arg(struct mai
message_address_write(str, addr);
hdr.value = hdr.full_value = str_data(str);
hdr.value_len = hdr.full_value_len = str_len(str);
- match = message_search_more(msg_search_ctx, &block);
- } T_END;
- } else {
- match = message_search_more(msg_search_ctx, &block);
- }
-
- if (match ||
- (arg->type != SEARCH_HEADER &&
- arg->type != SEARCH_HEADER_ADDRESS)) {
- /* set only when we definitely know if it's a match */
- ret = match ? 1 : 0;
- ARG_SET_RESULT(arg, ret);
- }
+ break;
+ case SEARCH_HEADER_COMPRESS_LWSP:
+ /* convert LWSP to single spaces */
+ str = t_str_new(hdr.full_value_len);
+ compress_lwsp(str, hdr.full_value, hdr.full_value_len);
+ hdr.value = hdr.full_value = str_data(str);
+ hdr.value_len = hdr.full_value_len = str_len(str);
+ break;
+ default:
+ i_unreached();
+ }
+ ret = message_search_more(msg_search_ctx, &block) ? 1 : 0;
+ } T_END;
+
+ ARG_SET_RESULT(arg, ret);
}
static void search_header_unmatch(struct mail_search_arg *arg,
diff -r f70c4d501251 -r 346d4a44c2f4 src/lib-storage/mail-search.c
--- a/src/lib-storage/mail-search.c Thu Feb 21 22:44:19 2008 +0200
+++ b/src/lib-storage/mail-search.c Thu Feb 21 22:52:38 2008 +0200
@@ -139,6 +139,7 @@ search_arg_analyze(struct mail_search_ar
break;
case SEARCH_HEADER:
case SEARCH_HEADER_ADDRESS:
+ case SEARCH_HEADER_COMPRESS_LWSP:
buffer_append(headers, &arg->hdr_field_name,
sizeof(const char *));
break;
diff -r f70c4d501251 -r 346d4a44c2f4 src/lib-storage/mail-search.h
--- a/src/lib-storage/mail-search.h Thu Feb 21 22:44:19 2008 +0200
+++ b/src/lib-storage/mail-search.h Thu Feb 21 22:52:38 2008 +0200
@@ -30,6 +30,7 @@ enum mail_search_arg_type {
/* headers */
SEARCH_HEADER,
SEARCH_HEADER_ADDRESS,
+ SEARCH_HEADER_COMPRESS_LWSP,
/* body */
SEARCH_BODY,
More information about the dovecot-cvs
mailing list