<<< Date Index >>>     <<< Thread Index >>>

Re: Having . span newlines in a regexp



On  5-Feb-2004 18:49 Mike Schiraldi wrote:
| There's some discussion going on over at mutt-users regarding the behavior
| of . in mutt regular expressions. Specifically, my pattern of:

This is related to the problem that msg_search() just scans its (file) input
line by line, so multiple lines are never presented to the regex.

Attached is a patch which uses read_rfc822_line() for grabbing lines
on header operations (M_HEADER) msg_search().

Since mutt_read_rfc822_line() is used, there are no newlines within
the string to match anymore, so your original expression will work.
--
-dale
--- PATCHES Dec 2002 17:44:54 -0000     3.6
+++ PATCHES Feb 2004 12:34:29 -0000
@@ -0,0 +1 @@
+patch-1.5.6.dw.pattern-header.1
--- parse.c Sep 2003 13:03:26 -0000     3.10
+++ parse.c Feb 2004 12:34:33 -0000
@@ -33,7 +33,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;
@@ -428,7 +428,7 @@ BODY *mutt_read_mime_header (FILE *fp, i
   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, ':')))
@@ -1286,7 +1286,7 @@ ENVELOPE *mutt_read_rfc822_header (FILE 
   }
 
   while ((loc = ftell (f)),
-         *(line = read_rfc822_line (f, line, &linelen)) != 0)
+         *(line = mutt_read_rfc822_line (f, line, &linelen)) != 0)
   {
     matched = 0;
 
--- pattern.c Jul 2003 18:40:50 -0000   3.10
+++ pattern.c Feb 2004 12:34:33 -0000
@@ -129,7 +129,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;
@@ -139,6 +139,8 @@ msg_search (CONTEXT *ctx, regex_t *rx, c
   long lng = 0;
   int match = 0;
   HEADER *h = ctx->hdrs[msgno];
+  char *mline = safe_malloc (LONG_STRING);
+  size_t mlen = LONG_STRING;
 
   if ((msg = mx_open_message (ctx, msgno)) != NULL)
   {
@@ -204,14 +206,23 @@ msg_search (CONTEXT *ctx, regex_t *rx, c
     /* search the file "fp" */
     while (lng > 0)
     {
-      if (fgets (buf, blen - 1, fp) == NULL)
-       break; /* don't loop forever */
-      if (regexec (rx, buf, 0, NULL, 0) == 0)
+      if (op == M_HEADER)
+      {
+       if (*(mline = mutt_read_rfc822_line (fp, mline, &mlen)) == 0)
+         break; /* don't loop forever */
+      }
+      else
+      {
+       if (fgets (mline, mlen - 1, fp) == NULL)
+         break; /* don't loop forever */
+      }
+
+      if (regexec (rx, mline, 0, NULL, 0) == 0)
       {
        match = 1;
        break;
       }
-      lng -= mutt_strlen (buf);
+      lng -= mutt_strlen (mline);
     }
     
     mx_close_message (&msg);
@@ -223,6 +234,8 @@ msg_search (CONTEXT *ctx, regex_t *rx, c
     }
   }
 
+  FREE (&mline);
+
   return match;
 }
 
@@ -948,8 +961,6 @@ static int match_user (int alladdr, ADDR
 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:
@@ -988,7 +999,7 @@ mutt_pattern_exec (struct pattern_t *pat
     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));
--- protos.h Feb 2004 17:10:43 -0000    3.19
+++ protos.h Feb 2004 12:34:33 -0000
@@ -96,6 +96,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 *);
 

Attachment: pgpWSk0HtYuY1.pgp
Description: PGP signature