X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=pattern.c;h=7f5fd51ee94eadf9adb780f2b96d06135b20835b;hb=c8becc4d099cee8c18ebd967720ce7204311d817;hp=d7b274f52048e6f34b5f02c005780c724a032958;hpb=4f61fa445bff564984acf29fc91858af0ed2725e;p=apps%2Fmadmutt.git diff --git a/pattern.c b/pattern.c index d7b274f..7f5fd51 100644 --- a/pattern.c +++ b/pattern.c @@ -95,6 +95,7 @@ struct pattern_flags { #endif { 'x', M_REFERENCE, 0, eat_regexp}, { + 'X', M_MIMEATTACH, 0, eat_range}, { 'y', M_XLABEL, 0, eat_regexp}, { 'z', M_SIZE, 0, eat_range}, { '=', M_DUPLICATED, 0, NULL}, { @@ -218,7 +219,7 @@ msg_search (CONTEXT *ctx, pattern_t* pat, int msgno) if (pat->op == M_HEADER) { if (*(buf = mutt_read_rfc822_line (fp, buf, &blen)) == '\0') break; - } if (fgets (buf, blen - 1, fp) == NULL) + } else if (fgets (buf, blen - 1, fp) == NULL) break; /* don't loop forever */ if (patmatch (pat, buf) == 0) { match = 1; @@ -246,12 +247,18 @@ int eat_regexp (pattern_t * pat, BUFFER * s, BUFFER * err) int r; memset (&buf, 0, sizeof (buf)); + if (mutt_extract_token (&buf, s, M_TOKEN_PATTERN | M_TOKEN_COMMENT) != 0 || !buf.data) { snprintf (err->data, err->dsize, _("Error in expression: %s"), s->dptr); return (-1); } + if (!*buf.data) { + snprintf (err->data, err->dsize, _("Empty expression")); + return (-1); + } + #if 0 /* If there are no RE metacharacters, use simple search anyway */ if (!pat->stringmatch && !strpbrk (buf.data, "|[{.*+?^$")) @@ -995,7 +1002,7 @@ mutt_pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, case M_WHOLE_MSG: #ifdef USE_IMAP /* IMAP search sets h->matched at search compile time */ - if (Context->magic == M_IMAP && pat->stringmatch) + if (ctx->magic == M_IMAP && pat->stringmatch) return (h->matched); #endif return (pat->not ^ msg_search (ctx, pat, h->msgno)); @@ -1088,6 +1095,23 @@ mutt_pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, && patmatch (pat, h->env->spam->data) == 0)); case M_DUPLICATED: return (pat->not ^ (h->thread && h->thread->duplicate_thread)); + + case M_MIMEATTACH: + { + int count; + + if (h->content->parts) + count = mutt_count_body_parts(h, 0); + else { + mutt_parse_mime_message(ctx, h); + count = mutt_count_body_parts(h, 0); + mutt_free_body(&h->content->parts); + } + + return (pat->not ^ (count >= pat->min && (pat->max == M_MAXRANGE || + count <= pat->max))); + } + case M_UNREFERENCED: return (pat->not ^ (h->thread && !h->thread->child)); case M_MULTIPART: