]> granicus.if.org Git - mutt/commitdiff
Unfold message headers before performing ~h search. Closes: #1865.
authorDale Woolridge <dale-list-mutt-dev-2@woolridge.org>
Sun, 4 Sep 2005 19:28:18 +0000 (19:28 +0000)
committerDale Woolridge <dale-list-mutt-dev-2@woolridge.org>
Sun, 4 Sep 2005 19:28:18 +0000 (19:28 +0000)
parse.c
pattern.c
protos.h

diff --git a/parse.c b/parse.c
index 16473bd03dda7ad726f2f360e3dc52314ee4c6f3..e9c12a57bf96c680d4ebba27eb3ca8acdabd08f3 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -38,7 +38,7 @@
  * lines.  ``line'' must point to a dynamically allocated string; it is
  * increased if more space is required to fit the whole line.
  */
-static char *read_rfc822_line (FILE *f, char *line, size_t *linelen)
+char *mutt_read_rfc822_line (FILE *f, char *line, size_t *linelen)
 {
   char *buf = line;
   char ch;
@@ -433,7 +433,7 @@ BODY *mutt_read_mime_header (FILE *fp, int digest)
   p->type        = digest ? TYPEMESSAGE : TYPETEXT;
   p->disposition = DISPINLINE;
   
-  while (*(line = read_rfc822_line (fp, line, &linelen)) != 0)
+  while (*(line = mutt_read_rfc822_line (fp, line, &linelen)) != 0)
   {
     /* Find the value of the current header */
     if ((c = strchr (line, ':')))
@@ -1317,7 +1317,7 @@ ENVELOPE *mutt_read_rfc822_header (FILE *f, HEADER *hdr, short user_hdrs,
   }
 
   while ((loc = ftell (f)),
-         *(line = read_rfc822_line (f, line, &linelen)) != 0)
+         *(line = mutt_read_rfc822_line (f, line, &linelen)) != 0)
   {
     matched = 0;
 
index 59a2b6ccb294d5df186eff0b7163f76526fdaceb..25200074d721c696a6764f56c2f958d6f89d7cba 100644 (file)
--- a/pattern.c
+++ b/pattern.c
@@ -136,7 +136,7 @@ int mutt_which_case (const char *s)
 }
 
 static int
-msg_search (CONTEXT *ctx, regex_t *rx, char *buf, size_t blen, int op, int msgno)
+msg_search (CONTEXT *ctx, regex_t *rx, int op, int msgno)
 {
   char tempfile[_POSIX_PATH_MAX];
   MESSAGE *msg = NULL;
@@ -146,6 +146,8 @@ msg_search (CONTEXT *ctx, regex_t *rx, char *buf, size_t blen, int op, int msgno
   long lng = 0;
   int match = 0;
   HEADER *h = ctx->hdrs[msgno];
+  char *buf;
+  size_t blen;
 
   if ((msg = mx_open_message (ctx, msgno)) != NULL)
   {
@@ -208,10 +210,18 @@ msg_search (CONTEXT *ctx, regex_t *rx, char *buf, size_t blen, int op, int msgno
       }
     }
 
+    blen = STRING;
+    buf = safe_malloc (blen);
+
     /* search the file "fp" */
     while (lng > 0)
     {
-      if (fgets (buf, blen - 1, fp) == NULL)
+      if (op == M_HEADER)
+      {
+       if (*(buf = mutt_read_rfc822_line (fp, buf, &blen)) == '\0')
+         break;
+      }
+      else if (fgets (buf, blen - 1, fp) == NULL)
        break; /* don't loop forever */
       if (regexec (rx, buf, 0, NULL, 0) == 0)
       {
@@ -220,6 +230,8 @@ msg_search (CONTEXT *ctx, regex_t *rx, char *buf, size_t blen, int op, int msgno
       }
       lng -= mutt_strlen (buf);
     }
+
+    FREE (&buf);
     
     mx_close_message (&msg);
 
@@ -963,8 +975,6 @@ static int match_user (int alladdr, ADDRESS *a1, ADDRESS *a2)
 int
 mutt_pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx, HEADER *h)
 {
-  char buf[STRING];
-
   switch (pat->op)
   {
     case M_AND:
@@ -1003,7 +1013,7 @@ mutt_pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx,
     case M_BODY:
     case M_HEADER:
     case M_WHOLE_MSG:
-      return (pat->not ^ msg_search (ctx, pat->rx, buf, sizeof (buf), pat->op, h->msgno));
+      return (pat->not ^ msg_search (ctx, pat->rx, pat->op, h->msgno));
     case M_SENDER:
       return (pat->not ^ match_adrlist (pat->rx, flags & M_MATCH_FULL_ADDRESS,
                                        pat->alladdr, 1, h->env->sender));
index faa6a2fa009568ee24a1caf003ee207a952fc19e..3f75fd6ee13b3a98b3687df427744d645b9945dc 100644 (file)
--- a/protos.h
+++ b/protos.h
@@ -103,6 +103,7 @@ HASH *mutt_make_subj_hash (CONTEXT *);
 
 LIST *mutt_make_references(ENVELOPE *e);
 
+char *mutt_read_rfc822_line (FILE *, char *, size_t *);
 ENVELOPE *mutt_read_rfc822_header (FILE *, HEADER *, short, short);
 HEADER *mutt_dup_header (HEADER *);