From 089f1e45535d1004ea87c2d3b9317ac85b833860 Mon Sep 17 00:00:00 2001 From: Dale Woolridge Date: Sun, 4 Sep 2005 19:28:18 +0000 Subject: [PATCH] Unfold message headers before performing ~h search. Closes: #1865. --- parse.c | 6 +++--- pattern.c | 20 +++++++++++++++----- protos.h | 1 + 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/parse.c b/parse.c index 16473bd0..e9c12a57 100644 --- 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; diff --git a/pattern.c b/pattern.c index 59a2b6cc..25200074 100644 --- 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)); diff --git a/protos.h b/protos.h index faa6a2fa..3f75fd6e 100644 --- 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 *); -- 2.40.0