projects
/
apps
/
madmutt.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Rocco Rutte:
[apps/madmutt.git]
/
pattern.c
diff --git
a/pattern.c
b/pattern.c
index
53cce82
..
7f5fd51
100644
(file)
--- a/
pattern.c
+++ b/
pattern.c
@@
-95,6
+95,7
@@
struct pattern_flags {
#endif
{
'x', M_REFERENCE, 0, eat_regexp}, {
#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}, {
'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 (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;
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));
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 (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, "|[{.*+?^$"))
#if 0
/* If there are no RE metacharacters, use simple search anyway */
if (!pat->stringmatch && !strpbrk (buf.data, "|[{.*+?^$"))
@@
-698,7
+705,6
@@
pattern_t *mutt_pattern_comp ( /* const */ char *s, int flags, BUFFER * err)
pattern_t *last = NULL;
int not = 0;
int alladdr = 0;
pattern_t *last = NULL;
int not = 0;
int alladdr = 0;
- int stringmatch = 0;
int or = 0;
int implicit = 1; /* used to detect logical AND operator */
struct pattern_flags *entry;
int or = 0;
int implicit = 1; /* used to detect logical AND operator */
struct pattern_flags *entry;
@@
-744,10
+750,8
@@
pattern_t *mutt_pattern_comp ( /* const */ char *s, int flags, BUFFER * err)
implicit = 0;
not = 0;
alladdr = 0;
implicit = 0;
not = 0;
alladdr = 0;
- stringmatch = 0;
break;
case '=':
break;
case '=':
- stringmatch = 1;
/* fallthrough */
case '~':
if (implicit && or) {
/* fallthrough */
case '~':
if (implicit && or) {
@@
-763,10
+767,9
@@
pattern_t *mutt_pattern_comp ( /* const */ char *s, int flags, BUFFER * err)
tmp = new_pattern ();
tmp->not = not;
tmp->alladdr = alladdr;
tmp = new_pattern ();
tmp->not = not;
tmp->alladdr = alladdr;
- tmp->stringmatch =
stringmatch
;
+ tmp->stringmatch =
(*ps.dptr == '=') ? 1 : 0
;
not = 0;
alladdr = 0;
not = 0;
alladdr = 0;
- stringmatch = 0;
if (last)
last->next = tmp;
if (last)
last->next = tmp;
@@
-999,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 */
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));
return (h->matched);
#endif
return (pat->not ^ msg_search (ctx, pat, h->msgno));
@@
-1092,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));
&& 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:
case M_UNREFERENCED:
return (pat->not ^ (h->thread && !h->thread->child));
case M_MULTIPART: