imap-match.c revision 5254d77805cd35b9356d072ba325c356c43b0d51
/* Copyright (C) 2002 Timo Sirainen
imap_match_init() logic originates from Cyrus, but the code is fully
rewritten.
*/
#include "lib.h"
#include "imap-match.h"
#include <ctype.h>
struct _ImapMatchGlob {
int inboxcase;
const char *inboxcase_end;
char sep_char;
char mask[1];
};
/* name of "INBOX" - must not have repeated substrings */
static const char inbox[] = "INBOX";
{
const char *p, *inboxp;
char *dst;
/* +1 from struct */
/* @UNSAFE: compress the mask */
while (*mask != '\0') {
/* remove duplicate hierarchy wildcards */
/* "%*" -> "*" */
if (*mask == '*') {
/* remove duplicate wildcards */
mask++;
*dst++ = '*';
} else {
*dst++ = '%';
}
} else {
}
}
*dst++ = '\0';
if (inboxcase) {
/* check if we could be comparing INBOX. */
if (*p != '%') {
break;
}
if (*++inboxp == '\0') {
/* now check that it doesn't end with
any invalid chars */
if (*++p == '%') p++;
if (*p != '\0' && *p != '*' &&
break;
}
}
}
}
return glob;
}
{
}
const char **mask_p)
{
0 : -1;
}
}
best_ret = -1;
while (*mask == '%') {
mask++;
if (*mask == '\0') {
data++;
break;
}
while (*data != '\0') {
if (ret > 0)
break;
if (ret == 0)
best_ret = 0;
}
break;
data++;
}
}
if (*mask != '*') {
if (*data != '\0')
return best_ret;
}
return 1;
}
{
const char *mask;
int ret;
else
if (*mask != '*') {
return ret;
if (*mask == '\0')
return 1;
}
while (*mask == '*') {
mask++;
if (*mask == '\0')
return 1;
while (*data != '\0') {
break;
}
data++;
}
}
}