[dovecot-cvs] dovecot/src/lib-storage/index index-search.c,1.66,1.67
cras at procontrol.fi
cras at procontrol.fi
Sat Feb 1 13:24:20 EET 2003
Update of /home/cvs/dovecot/src/lib-storage/index
In directory danu:/tmp/cvs-serv21475/lib-storage/index
Modified Files:
index-search.c
Log Message:
Several search fixes, mostly related to matching multiple conditions.
Index: index-search.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/index-search.c,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -d -r1.66 -r1.67
--- index-search.c 1 Feb 2003 10:12:23 -0000 1.66
+++ index-search.c 1 Feb 2003 11:24:17 -0000 1.67
@@ -19,12 +19,6 @@
#include <stdlib.h>
#include <ctype.h>
-#define ARG_SET_RESULT(arg, res) \
- STMT_START { \
- (arg)->result = !(arg)->not ? (res) : \
- (res) == -1 ? -1 : !(res); \
- } STMT_END
-
#define TXT_UNKNOWN_CHARSET "[BADCHARSET] Unknown charset"
#define TXT_INVALID_SEARCH_KEY "Invalid search key"
@@ -211,7 +205,7 @@
/* unknown */
break;
case 0:
- ARG_SET_RESULT(arg, -1);
+ ARG_SET_RESULT(arg, 0);
break;
default:
ARG_SET_RESULT(arg, 1);
@@ -280,7 +274,7 @@
/* unknown */
break;
case 0:
- ARG_SET_RESULT(arg, -1);
+ ARG_SET_RESULT(arg, 0);
break;
default:
ARG_SET_RESULT(arg, 1);
@@ -450,7 +444,7 @@
/* unknown */
break;
case 0:
- ARG_SET_RESULT(arg, -1);
+ ARG_SET_RESULT(arg, 0);
break;
default:
ARG_SET_RESULT(arg, 1);
@@ -543,7 +537,28 @@
t_pop();
}
- ARG_SET_RESULT(arg, ret);
+ if (ret == 1 ||
+ (arg->type != SEARCH_TEXT && arg->type != SEARCH_HEADER)) {
+ /* set only when we definitely know if it's a match */
+ ARG_SET_RESULT(arg, ret);
+ }
+}
+
+static void search_header_unmatch(struct mail_search_arg *arg,
+ void *context __attr_unused__)
+{
+ switch (arg->type) {
+ case SEARCH_FROM:
+ case SEARCH_TO:
+ case SEARCH_CC:
+ case SEARCH_BCC:
+ case SEARCH_SUBJECT:
+ case SEARCH_HEADER:
+ ARG_SET_RESULT(arg, 0);
+ break;
+ default:
+ break;
+ }
}
static void search_header(struct message_part *part,
@@ -570,6 +585,9 @@
ctx->custom_header = FALSE;
mail_search_args_foreach(ctx->args, search_header_arg, ctx);
+ } else if (name_len == 0) {
+ /* last header, mark all unknown SEARCH_HEADERs unmatched */
+ mail_search_args_foreach(ctx->args, search_header_unmatch, ctx);
}
}
More information about the dovecot-cvs
mailing list