# HG changeset patch # User Timo Sirainen # Date 1204430978 -7200 # Node ID 3765f80f4d2930f48915f5f91f5a25f4d3620be0 # Parent ff7b11c64321727e52e007b1ff72e017e3b6a9f6 imap_match(): "foo/bar/%" pattern matching to "foo/" should return CHILDREN instead of NO. diff -r ff7b11c64321 -r 3765f80f4d29 src/lib-imap/imap-match.c --- 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 == '%') {