[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