Mercurial > dovecot > original-hg > dovecot-1.2
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 == '%') {