+#include <lib-lib/mem.h>
+#include <lib-lib/ascii.h>
+#include <lib-lib/str.h>
+#include <lib-lib/macros.h>
+#include <lib-lib/file.h>
+#include <lib-lib/buffer.h>
+#include <lib-lib/mapping.h>
+
+#include <lib-mime/mime.h>
+
static int eat_regexp (pattern_t * pat, BUFFER *, BUFFER *);
static int eat_date (pattern_t * pat, BUFFER *, BUFFER *);
static int eat_regexp (pattern_t * pat, BUFFER *, BUFFER *);
static int eat_date (pattern_t * pat, BUFFER *, BUFFER *);
#endif
{
'x', M_REFERENCE, 0, eat_regexp}, {
#endif
{
'x', M_REFERENCE, 0, eat_regexp}, {
'y', M_XLABEL, 0, eat_regexp}, {
'z', M_SIZE, 0, eat_range}, {
'=', M_DUPLICATED, 0, NULL}, {
'$', M_UNREFERENCED, 0, NULL}, {
'*', M_REALNAME, 0, NULL}, {
'y', M_XLABEL, 0, eat_regexp}, {
'z', M_SIZE, 0, eat_range}, {
'=', M_DUPLICATED, 0, NULL}, {
'$', M_UNREFERENCED, 0, NULL}, {
'*', M_REALNAME, 0, NULL}, {
if ((msg = mx_open_message (ctx, msgno)) != NULL) {
if (option (OPTTHOROUGHSRC)) {
/* decode the header / body */
if ((msg = mx_open_message (ctx, msgno)) != NULL) {
if (option (OPTTHOROUGHSRC)) {
/* decode the header / body */
if (pat->op != M_HEADER) {
mutt_parse_mime_message (ctx, h);
if (pat->op != M_HEADER) {
mutt_parse_mime_message (ctx, h);
break; /* don't loop forever */
if (patmatch (pat, buf) == 0) {
match = 1;
break;
}
break; /* don't loop forever */
if (patmatch (pat, buf) == 0) {
match = 1;
break;
}
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 (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 0
/* If there are no RE metacharacters, use simple search anyway */
if (!pat->stringmatch && !strpbrk (buf.data, "|[{.*+?^$"))
#if 0
/* If there are no RE metacharacters, use simple search anyway */
if (!pat->stringmatch && !strpbrk (buf.data, "|[{.*+?^$"))
if (r) {
regerror (r, pat->rx, err->data, err->dsize);
regfree (pat->rx);
if (r) {
regerror (r, pat->rx, err->data, err->dsize);
regfree (pat->rx);
return regexec (pat->rx, buf, 0, NULL, 0);
}
return regexec (pat->rx, buf, 0, NULL, 0);
}
}
if ((flag & M_PDR_ERROR) && !(flag & M_PDR_ABSOLUTE)) { /* getDate has its own error message, don't overwrite it here */
snprintf (err->data, err->dsize, _("Invalid relative date: %s"), pc - 1);
}
if ((flag & M_PDR_ERROR) && !(flag & M_PDR_ABSOLUTE)) { /* getDate has its own error message, don't overwrite it here */
snprintf (err->data, err->dsize, _("Invalid relative date: %s"), pc - 1);
/* the `0' time is Jan 1, 1970 UTC, so in order to prevent a negative time
when doing timezone conversion, we use Jan 2, 1970 UTC as the base
here */
min.tm_mday = 2;
min.tm_year = 70;
/* the `0' time is Jan 1, 1970 UTC, so in order to prevent a negative time
when doing timezone conversion, we use Jan 2, 1970 UTC as the base
here */
min.tm_mday = 2;
min.tm_year = 70;
/* Arbitrary year in the future. Don't set this too high
or mutt_mktime() returns something larger than will
/* Arbitrary year in the future. Don't set this too high
or mutt_mktime() returns something larger than will
if (isdigit ((unsigned char) *pc)) {
/* mininum date specified */
if ((pc = getDate (pc, &min, err)) == NULL) {
if (isdigit ((unsigned char) *pc)) {
/* mininum date specified */
if ((pc = getDate (pc, &min, err)) == NULL) {
max.tm_mday = min.tm_mday;
if (!parse_date_range (pc, &min, &max, haveMin, &baseMin, err)) { /* bail out on any parsing error */
max.tm_mday = min.tm_mday;
if (!parse_date_range (pc, &min, &max, haveMin, &baseMin, err)) { /* bail out on any parsing error */
pat->min = mutt_mktime (&min, 1);
pat->max = mutt_mktime (&max, 1);
pat->min = mutt_mktime (&min, 1);
pat->max = mutt_mktime (&max, 1);
-static int match_adrlist (pattern_t* pat, int match_personal, int alladdr,
+static int match_adrlist (pattern_t* pat, int match_personal, int alladdr __attribute__ ((unused)),
if (pat->alladdr ^
((a->mailbox && patmatch (pat, a->mailbox) == 0) ||
(match_personal && a->personal &&
if (pat->alladdr ^
((a->mailbox && patmatch (pat, a->mailbox) == 0) ||
(match_personal && a->personal &&
return (pat->not ^ msg_search (ctx, pat, h->msgno));
case M_SENDER:
return (pat->not ^ match_adrlist (pat, flags & M_MATCH_FULL_ADDRESS,
return (pat->not ^ msg_search (ctx, pat, h->msgno));
case M_SENDER:
return (pat->not ^ match_adrlist (pat, flags & M_MATCH_FULL_ADDRESS,
&& patmatch (pat, h->env->spam->data) == 0));
case M_DUPLICATED:
return (pat->not ^ (h->thread && h->thread->duplicate_thread));
&& 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)));
+ }
+
if (!strchr (s, '~') && !strchr (s, '=')) { /* yup, so spoof a real request */
/* convert old tokens into the new format */
if (!strchr (s, '~') && !strchr (s, '=')) { /* yup, so spoof a real request */
/* convert old tokens into the new format */
- if (ascii_strcasecmp ("all", s) == 0 || !str_cmp ("^", s) || !str_cmp (".", s)) /* ~A is more efficient */
- strfcpy (s, "~A", len);
+ if (ascii_strcasecmp ("all", s) == 0 || !m_strcmp("^", s) || !m_strcmp(".", s)) /* ~A is more efficient */
+ m_strcpy(s, len, "~A");
else {
quote_simple (tmp, sizeof (tmp), s);
mutt_expand_fmt (s, len, simple, tmp);
else {
quote_simple (tmp, sizeof (tmp), s);
mutt_expand_fmt (s, len, simple, tmp);
- if (mutt_get_field (prompt, buf, sizeof (buf), M_PATTERN | M_CLEAR) != 0)
- return (-1);
- if (!buf[0]) {
- if (op == M_LIMIT)
- strncpy (buf, "~A", sizeof (buf));
- else
+ if (mutt_get_field (prompt, buf, sizeof (buf), M_PATTERN | M_CLEAR) != 0 || !buf[0])
mutt_check_simple (buf, sizeof (buf), NONULL (SimpleSearch));
err.data = error;
err.dsize = sizeof (error);
if ((pat = mutt_pattern_comp (buf, M_FULL_MSG, &err)) == NULL) {
mutt_check_simple (buf, sizeof (buf), NONULL (SimpleSearch));
err.data = error;
err.dsize = sizeof (error);
if ((pat = mutt_pattern_comp (buf, M_FULL_MSG, &err)) == NULL) {
if (Context->limit_pattern)
mutt_pattern_free (&Context->limit_pattern);
if (Context->msgcount && !Context->vcount) {
if (Context->limit_pattern)
mutt_pattern_free (&Context->limit_pattern);
if (Context->msgcount && !Context->vcount) {
Context->pattern = simple;
simple = NULL; /* don't clobber it */
Context->limit_pattern = mutt_pattern_comp (buf, M_FULL_MSG, &err);
}
}
Context->pattern = simple;
simple = NULL; /* don't clobber it */
Context->limit_pattern = mutt_pattern_comp (buf, M_FULL_MSG, &err);
}
}
if (mutt_get_field ((op == OP_SEARCH) ? _("Search for: ") :
_("Reverse search for: "), buf, sizeof (buf),
M_CLEAR | M_PATTERN) != 0 || !buf[0])
if (mutt_get_field ((op == OP_SEARCH) ? _("Search for: ") :
_("Reverse search for: "), buf, sizeof (buf),
M_CLEAR | M_PATTERN) != 0 || !buf[0])
/* compare the *expanded* version of the search pattern in case
$simple_search has changed while we were searching */
/* compare the *expanded* version of the search pattern in case
$simple_search has changed while we were searching */
if (option (OPTSEARCHINVALID)) {
for (i = 0; i < Context->msgcount; i++)
Context->hdrs[i]->searched = 0;
if (option (OPTSEARCHINVALID)) {
for (i = 0; i < Context->msgcount; i++)
Context->hdrs[i]->searched = 0;