changeset 7314:3765f80f4d29 HEAD

imap_match(): "foo/bar/%" pattern matching to "foo/" should return CHILDREN instead of NO.
author Timo Sirainen <tss@iki.fi>
date Sun, 02 Mar 2008 06:09:38 +0200
parents ff7b11c64321
children 3f53f528d338
files src/lib-imap/imap-match.c
diffstat 1 files changed, 16 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-imap/imap-match.c	Sun Mar 02 06:08:18 2008 +0200
+++ b/src/lib-imap/imap-match.c	Sun Mar 02 06:09:38 2008 +0200
@@ -185,16 +185,27 @@
 	  const char **pattern_p)
 {
 	enum imap_match_result ret, match;
+	unsigned int i;
 	const char *data = *data_p, *pattern = *pattern_p;
 
 	/* match all non-wildcards */
-	while (*pattern != '\0' && *pattern != '*' && *pattern != '%') {
-		if (!CMP_CUR_CHR(ctx, data, pattern)) {
-			return *data == '\0' && *pattern == ctx->sep ?
-				IMAP_MATCH_CHILDREN : IMAP_MATCH_NO;
+	i = 0;
+	while (pattern[i] != '\0' && pattern[i] != '*' && pattern[i] != '%') {
+		if (!CMP_CUR_CHR(ctx, data+i, pattern+i)) {
+			if (data[i] != '\0')
+				return IMAP_MATCH_NO;
+			if (pattern[i] == ctx->sep)
+				return IMAP_MATCH_CHILDREN;
+			if (i > 0 && pattern[i-1] == ctx->sep) {
+				/* data="foo/" pattern = "foo/bar/%" */
+				return IMAP_MATCH_CHILDREN;
+			}
+			return IMAP_MATCH_NO;
 		}
-		data++; pattern++;
+		i++;
 	}
+	data += i;
+	pattern += i;
 
         match = IMAP_MATCH_NO;
 	while (*pattern == '%') {