From: Ammon Riley Date: Fri, 27 Apr 2018 01:00:00 +0000 (-0700) Subject: Add ~M pattern to match mime Content-Types. X-Git-Tag: mutt-1-10-rel~19 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=974235c78f0fa4ea738574f0d4f06c2fd1352be8;p=mutt Add ~M pattern to match mime Content-Types. --- diff --git a/doc/manual.xml.head b/doc/manual.xml.head index 92f6df89..1bff0d17 100644 --- a/doc/manual.xml.head +++ b/doc/manual.xml.head @@ -5203,6 +5203,7 @@ shows several ways to select messages. %L GROUPmessage either originated or received by any member of GROUP ~lmessages addressed to a known mailing list ~m [MIN]-[MAX]messages in the range MIN to MAX *) +~M EXPRmessages which contain a mime Content-Type matching EXPR ~n [MIN]-[MAX]messages with a score in the range MIN to MAX *) ~Nnew messages ~Oold messages diff --git a/doc/muttrc.man.head b/doc/muttrc.man.head index 28591f07..f73e5cf2 100644 --- a/doc/muttrc.man.head +++ b/doc/muttrc.man.head @@ -575,6 +575,9 @@ messages either originated or received by any member of \fIGROUP\fP ~m \fIMIN\fP-\fIMAX\fP message in the range \fIMIN\fP to \fIMAX\fP .TP +~M \fIEXPR\fP +messages which contain a mime Content-Type matching \fIEXPR\fP +.TP ~n \fIMIN\fP-\fIMAX\fP messages with a score in the range \fIMIN\fP to \fIMAX\fP .TP diff --git a/mutt.h b/mutt.h index 7c5af173..663beb4f 100644 --- a/mutt.h +++ b/mutt.h @@ -253,6 +253,7 @@ enum MUTT_PGP_KEY, MUTT_XLABEL, MUTT_MIMEATTACH, + MUTT_MIMETYPE, /* Options for Mailcap lookup */ MUTT_EDIT, diff --git a/pattern.c b/pattern.c index 285cbfa6..7ce968ab 100644 --- a/pattern.c +++ b/pattern.c @@ -25,6 +25,7 @@ #include "keymap.h" #include "mailbox.h" #include "copy.h" +#include "mime.h" #include #include @@ -76,6 +77,7 @@ Flags[] = { 'l', MUTT_LIST, 0, NULL }, { 'L', MUTT_ADDRESS, 0, eat_regexp }, { 'm', MUTT_MESSAGE, 0, eat_range }, + { 'M', MUTT_MIMETYPE, MUTT_FULL_MSG, eat_regexp }, { 'n', MUTT_SCORE, 0, eat_range }, { 'N', MUTT_NEW, 0, NULL }, { 'O', MUTT_OLD, 0, NULL }, @@ -1138,6 +1140,28 @@ static int match_threadchildren(struct pattern_t *pat, pattern_exec_flag flags, return 0; } +static int match_content_type(const pattern_t* pat, BODY *b) +{ + char buffer[STRING]; + if (!b) + return 0; + + snprintf (buffer, STRING, "%s/%s", TYPE (b), b->subtype); + + if (patmatch (pat, buffer) == 0) + return 1; + if (match_content_type (pat, b->parts)) + return 1; + if (match_content_type (pat, b->next)) + return 1; + return 0; +} + +static int match_mime_content_type(const pattern_t *pat, CONTEXT *ctx, HEADER *hdr) +{ + mutt_parse_mime_message(ctx, hdr); + return match_content_type(pat, hdr->content); +} /* Sets a value in the pattern_cache_t cache entry. * Normalizes the "true" value to 2. */ @@ -1338,6 +1362,10 @@ mutt_pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx, return (pat->not ^ (count >= pat->min && (pat->max == MUTT_MAXRANGE || count <= pat->max))); } + case MUTT_MIMETYPE: + if (!ctx) + return 0; + return (pat->not ^ match_mime_content_type (pat, ctx, h)); case MUTT_UNREFERENCED: return (pat->not ^ (h->thread && !h->thread->child)); }