]> granicus.if.org Git - mutt/commitdiff
Change helpers functions to pass actx. (see #3728)
authorKevin McCarthy <kevin@8t8.us>
Fri, 11 Aug 2017 01:18:19 +0000 (18:18 -0700)
committerKevin McCarthy <kevin@8t8.us>
Fri, 11 Aug 2017 01:18:19 +0000 (18:18 -0700)
Change the pager, compose, recvattach and recvcmd to pass the actx
instead of the individual idx and idxlen parameters.

Separate out the compose menu exit logic to first free the BODY data
and then call the shared actx free function at the bottom.

attach.c
attach.h
browser.c
compose.c
pager.c
pager.h
recvattach.c
recvcmd.c

index 2546e1177072eadcede7643eb7774dc141becd76..7a512419310789a54307f5947f69659d6cbdb525 100644 (file)
--- a/attach.c
+++ b/attach.c
@@ -330,7 +330,7 @@ void mutt_check_lookup_list (BODY *b, char *type, int len)
 
 /* returns -1 on error, 0 or the return code from mutt_do_pager() on success */
 int mutt_view_attachment (FILE *fp, BODY *a, int flag, HEADER *hdr,
-                         ATTACHPTR **idx, short idxlen)
+                         ATTACH_CONTEXT *actx)
 {
   char tempfile[_POSIX_PATH_MAX] = "";
   char pagerfile[_POSIX_PATH_MAX] = "";
@@ -571,8 +571,7 @@ int mutt_view_attachment (FILE *fp, BODY *a, int flag, HEADER *hdr,
     info.fp = fp;
     info.bdy = a;
     info.ctx = Context;
-    info.idx = idx;
-    info.idxlen = idxlen;
+    info.actx = actx;
     info.hdr = hdr;
 
     rc = mutt_do_pager (descrip, pagerfile,
@@ -1046,7 +1045,12 @@ int mutt_print_attachment (FILE *fp, BODY *a)
 void mutt_free_attach_context (ATTACH_CONTEXT **pactx)
 {
   int i;
-  ATTACH_CONTEXT *actx = *pactx;
+  ATTACH_CONTEXT *actx;
+
+  if (!pactx || !*pactx)
+    return;
+
+  actx = *pactx;
 
   for (i = 0; i < actx->idxlen; i++)
   {
index ac579b0a8c06e671a0b0380a8a4dc19725a5cd1a..e5b3a82d41ae162063d79b88cf50bf9e1e46816f 100644 (file)
--- a/attach.h
+++ b/attach.h
@@ -42,7 +42,7 @@ typedef struct attach_ctx
 
 void mutt_gen_attach_list (ATTACH_CONTEXT *, BODY *, int, int, int);
 void mutt_update_tree (ATTACH_CONTEXT *);
-int mutt_view_attachment (FILE*, BODY *, int, HEADER *, ATTACHPTR **, short);
+int mutt_view_attachment (FILE*, BODY *, int, HEADER *, ATTACH_CONTEXT *);
 
 int mutt_tag_attach (MUTTMENU *menu, int n, int m);
 int mutt_attach_display_loop (MUTTMENU *menu, int op, FILE *fp, HEADER *hdr,
@@ -54,10 +54,10 @@ void mutt_save_attachment_list (FILE *fp, int tag, BODY *top, HEADER *hdr, MUTTM
 void mutt_pipe_attachment_list (FILE *fp, int tag, BODY *top, int filter);
 void mutt_print_attachment_list (FILE *fp, int tag, BODY *top);
 
-void mutt_attach_bounce (FILE *, HEADER *, ATTACHPTR **, short, BODY *);
-void mutt_attach_resend (FILE *, HEADER *, ATTACHPTR **, short, BODY *);
-void mutt_attach_forward (FILE *, HEADER *, ATTACHPTR **, short, BODY *);
-void mutt_attach_reply (FILE *, HEADER *, ATTACHPTR **, short, BODY *, int);
+void mutt_attach_bounce (FILE *, HEADER *, ATTACH_CONTEXT *, BODY *);
+void mutt_attach_resend (FILE *, HEADER *, ATTACH_CONTEXT *, BODY *);
+void mutt_attach_forward (FILE *, HEADER *, ATTACH_CONTEXT *, BODY *);
+void mutt_attach_reply (FILE *, HEADER *, ATTACH_CONTEXT *, BODY *, int);
 
 void mutt_free_attach_context (ATTACH_CONTEXT **pactx);
 
index 03b1fc346073bda3ee90d355fd01dadd1c3abf5a..43546cf3bc5bd5024370139ad3c2b3cf9e5b98f5 100644 (file)
--- a/browser.c
+++ b/browser.c
@@ -1275,7 +1275,7 @@ void _mutt_select_file (char *f, size_t flen, int flags, char ***files, int *num
          b = mutt_make_file_attach (buf);
          if (b != NULL)
          {
-           mutt_view_attachment (NULL, b, MUTT_REGULAR, NULL, NULL, 0);
+           mutt_view_attachment (NULL, b, MUTT_REGULAR, NULL, NULL);
            mutt_free_body (&b);
            menu->redraw = REDRAW_FULL;
          }
index 2d84f0e3b6083c8bea912e677e257055b5fa16ab..183976e09872877d4cd1eeeed171c943f8b7cf76 100644 (file)
--- a/compose.c
+++ b/compose.c
@@ -1340,18 +1340,13 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
 
           if (!(flags & MUTT_COMPOSE_NOFREEHEADER))
           {
-            while (actx->idxlen-- > 0)
+            for (i = 0; i < actx->idxlen; i++)
             {
               /* avoid freeing other attachments */
-              actx->idx[actx->idxlen]->content->next = NULL;
-              actx->idx[actx->idxlen]->content->parts = NULL;
-              mutt_free_body (&actx->idx[actx->idxlen]->content);
-              FREE (&actx->idx[actx->idxlen]->tree);
-              FREE (&actx->idx[actx->idxlen]);
+              actx->idx[i]->content->next = NULL;
+              actx->idx[i]->content->parts = NULL;
+              mutt_free_body (&actx->idx[i]->content);
             }
-            FREE (&actx->idx);
-            actx->idxlen = 0;
-            actx->idxmax = 0;
           }
          r = -1;
          loop = 0;
@@ -1489,20 +1484,11 @@ int mutt_compose_menu (HEADER *msg,   /* structure for new message */
   mutt_menuDestroy (&menu);
 
   if (actx->idxlen)
-  {
     msg->content = actx->idx[0]->content;
-    for (i = 0; i < actx->idxlen; i++)
-    {
-      actx->idx[i]->content->aptr = NULL;
-      FREE (&actx->idx[i]->tree);
-      FREE (&actx->idx[i]);
-    }
-  }
   else
     msg->content = NULL;
 
-  FREE (&actx->idx);
-  FREE (&actx);
+  mutt_free_attach_context (&actx);
 
   return (r);
 }
diff --git a/pager.c b/pager.c
index 34b9c1fe84c431564e52dc1e4badf3df7df5131d..d435cf8f2040370d65f77c97a335fafa24cb50e4 100644 (file)
--- a/pager.c
+++ b/pager.c
@@ -2462,8 +2462,7 @@ search_next:
         CHECK_ATTACH;
         if (IsMsgAttach (extra))
          mutt_attach_bounce (extra->fp, extra->hdr,
-                             extra->idx, extra->idxlen,
-                             extra->bdy);
+                             extra->actx, extra->bdy);
         else
           ci_bounce_message (extra->hdr);
        break;
@@ -2473,8 +2472,7 @@ search_next:
         CHECK_ATTACH;
         if (IsMsgAttach (extra))
          mutt_attach_resend (extra->fp, extra->hdr,
-                             extra->idx, extra->idxlen,
-                             extra->bdy);
+                             extra->actx, extra->bdy);
         else
          mutt_resend_message (NULL, extra->ctx, extra->hdr);
         pager_menu->redraw = REDRAW_FULL;
@@ -2640,9 +2638,8 @@ search_next:
        CHECK_MODE(IsHeader (extra) || IsMsgAttach (extra));
         CHECK_ATTACH;      
         if (IsMsgAttach (extra)) 
-         mutt_attach_reply (extra->fp, extra->hdr, extra->idx,
-                            extra->idxlen, extra->bdy,
-                            SENDREPLY);
+         mutt_attach_reply (extra->fp, extra->hdr, extra->actx,
+                            extra->bdy, SENDREPLY);
        else
          ci_send_message (SENDREPLY, NULL, NULL, extra->ctx, extra->hdr);
        pager_menu->redraw = REDRAW_FULL;
@@ -2659,8 +2656,8 @@ search_next:
        CHECK_MODE(IsHeader (extra) || IsMsgAttach (extra));
         CHECK_ATTACH;
         if (IsMsgAttach (extra))
-         mutt_attach_reply (extra->fp, extra->hdr, extra->idx,
-                            extra->idxlen, extra->bdy, SENDREPLY|SENDGROUPREPLY);
+         mutt_attach_reply (extra->fp, extra->hdr, extra->actx,
+                            extra->bdy, SENDREPLY|SENDGROUPREPLY);
         else
          ci_send_message (SENDREPLY | SENDGROUPREPLY, NULL, NULL, extra->ctx, extra->hdr);
        pager_menu->redraw = REDRAW_FULL;
@@ -2670,8 +2667,8 @@ search_next:
        CHECK_MODE(IsHeader (extra) || IsMsgAttach (extra));
         CHECK_ATTACH;        
         if (IsMsgAttach (extra))
-         mutt_attach_reply (extra->fp, extra->hdr, extra->idx,
-                            extra->idxlen, extra->bdy, SENDREPLY|SENDLISTREPLY);
+         mutt_attach_reply (extra->fp, extra->hdr, extra->actx,
+                            extra->bdy, SENDREPLY|SENDLISTREPLY);
         else
          ci_send_message (SENDREPLY | SENDLISTREPLY, NULL, NULL, extra->ctx, extra->hdr);
        pager_menu->redraw = REDRAW_FULL;
@@ -2681,8 +2678,8 @@ search_next:
        CHECK_MODE(IsHeader (extra) || IsMsgAttach (extra));
         CHECK_ATTACH;
         if (IsMsgAttach (extra))
-         mutt_attach_forward (extra->fp, extra->hdr, extra->idx,
-                              extra->idxlen, extra->bdy);
+         mutt_attach_forward (extra->fp, extra->hdr, extra->actx,
+                              extra->bdy);
         else
          ci_send_message (SENDFORWARD, NULL, NULL, extra->ctx, extra->hdr);
        pager_menu->redraw = REDRAW_FULL;
diff --git a/pager.h b/pager.h
index 36c8725e2a60d7dd1988158f754b4d6f1f1e924c..f3fd1f1a0ac86d549043ea11bd4ba8fb97c7c71c 100644 (file)
--- a/pager.h
+++ b/pager.h
@@ -42,8 +42,7 @@ typedef struct
   HEADER *hdr; /* current message */
   BODY *bdy;   /* current attachment */
   FILE *fp;    /* source stream */
-  ATTACHPTR **idx;     /* attachment information */
-  short idxlen;
+  ATTACH_CONTEXT *actx;        /* attachment information */
 } pager_t;
 
 int mutt_do_pager (const char *, const char *, int, pager_t *);
index 2e09d8445de5008dcb2f845a435a3d7ccc2a527c..120f6bf4ae6d791001819324f321208d9899e0e6 100644 (file)
@@ -839,7 +839,7 @@ mutt_attach_display_loop (MUTTMENU *menu, int op, FILE *fp, HEADER *hdr,
 
       case OP_VIEW_ATTACH:
        op = mutt_view_attachment (fp, actx->idx[menu->current]->content, MUTT_REGULAR,
-                                  hdr, actx->idx, actx->idxlen);
+                                  hdr, actx);
        break;
 
       case OP_NEXT_ENTRY:
@@ -1037,13 +1037,13 @@ void mutt_view_attachments (HEADER *hdr)
     {
       case OP_ATTACH_VIEW_MAILCAP:
        mutt_view_attachment (fp, actx->idx[menu->current]->content, MUTT_MAILCAP,
-                             hdr, actx->idx, actx->idxlen);
+                             hdr, actx);
        menu->redraw = REDRAW_FULL;
        break;
 
       case OP_ATTACH_VIEW_TEXT:
        mutt_view_attachment (fp, actx->idx[menu->current]->content, MUTT_AS_TEXT,
-                             hdr, actx->idx, actx->idxlen);
+                             hdr, actx);
        menu->redraw = REDRAW_FULL;
        break;
 
@@ -1201,21 +1201,21 @@ void mutt_view_attachments (HEADER *hdr)
 
       case OP_RESEND:
         CHECK_ATTACH;
-        mutt_attach_resend (fp, hdr, actx->idx, actx->idxlen,
+        mutt_attach_resend (fp, hdr, actx,
                             menu->tagprefix ? NULL : actx->idx[menu->current]->content);
         menu->redraw = REDRAW_FULL;
        break;
       
       case OP_BOUNCE_MESSAGE:
         CHECK_ATTACH;
-        mutt_attach_bounce (fp, hdr, actx->idx, actx->idxlen,
+        mutt_attach_bounce (fp, hdr, actx,
                             menu->tagprefix ? NULL : actx->idx[menu->current]->content);
         menu->redraw = REDRAW_FULL;
        break;
 
       case OP_FORWARD_MESSAGE:
         CHECK_ATTACH;
-        mutt_attach_forward (fp, hdr, actx->idx, actx->idxlen,
+        mutt_attach_forward (fp, hdr, actx,
                             menu->tagprefix ? NULL : actx->idx[menu->current]->content);
         menu->redraw = REDRAW_FULL;
         break;
@@ -1229,7 +1229,7 @@ void mutt_view_attachments (HEADER *hdr)
         flags = SENDREPLY | 
          (op == OP_GROUP_REPLY ? SENDGROUPREPLY : 0) |
          (op == OP_LIST_REPLY ? SENDLISTREPLY : 0);
-        mutt_attach_reply (fp, hdr, actx->idx, actx->idxlen, 
+        mutt_attach_reply (fp, hdr, actx,
                           menu->tagprefix ? NULL : actx->idx[menu->current]->content, flags);
        menu->redraw = REDRAW_FULL;
        break;
index 0a5fb589204560914d8e67a5f5f25c6179a9770d..26a0c9cc4221947ea3cd0cf1eb785ab46bf7bc05 100644 (file)
--- a/recvcmd.c
+++ b/recvcmd.c
@@ -46,7 +46,7 @@ static short check_msg (BODY * b, short err)
   return 0;
 }
 
-static short check_all_msg (ATTACHPTR ** idx, short idxlen,
+static short check_all_msg (ATTACH_CONTEXT *actx,
                            BODY * cur, short err)
 {
   short i;
@@ -55,11 +55,11 @@ static short check_all_msg (ATTACHPTR ** idx, short idxlen,
     return -1;
   else if (!cur)
   {
-    for (i = 0; i < idxlen; i++)
+    for (i = 0; i < actx->idxlen; i++)
     {
-      if (idx[i]->content->tagged)
+      if (actx->idx[i]->content->tagged)
       {
-       if (check_msg (idx[i]->content, err) == -1)
+       if (check_msg (actx->idx[i]->content, err) == -1)
          return -1;
       }
     }
@@ -70,28 +70,27 @@ static short check_all_msg (ATTACHPTR ** idx, short idxlen,
 
 /* can we decode all tagged attachments? */
 
-static short check_can_decode (ATTACHPTR ** idx, short idxlen, 
-                             BODY * cur)
+static short check_can_decode (ATTACH_CONTEXT *actx, BODY * cur)
 {
   short i;
 
   if (cur)
     return mutt_can_decode (cur);
 
-  for (i = 0; i < idxlen; i++)
-    if (idx[i]->content->tagged && !mutt_can_decode (idx[i]->content))
+  for (i = 0; i < actx->idxlen; i++)
+    if (actx->idx[i]->content->tagged && !mutt_can_decode (actx->idx[i]->content))
       return 0;
 
   return 1;
 }
 
-static short count_tagged (ATTACHPTR **idx, short idxlen)
+static short count_tagged (ATTACH_CONTEXT *actx)
 {
   short count = 0;
   short i;
   
-  for (i = 0; i < idxlen; i++)
-    if (idx[i]->content->tagged)
+  for (i = 0; i < actx->idxlen; i++)
+    if (actx->idx[i]->content->tagged)
       count++;
   
   return count;
@@ -101,14 +100,13 @@ static short count_tagged (ATTACHPTR **idx, short idxlen)
  * attachment.
  */
 
-static short count_tagged_children (ATTACHPTR ** idx, 
-                                   short idxlen, short i)
+static short count_tagged_children (ATTACH_CONTEXT *actx, short i)
 {
-  short level = idx[i]->level;
+  short level = actx->idx[i]->level;
   short count = 0;
 
-  while ((++i < idxlen) && (level < idx[i]->level))
-    if (idx[i]->content->tagged)
+  while ((++i < actx->idxlen) && (level < actx->idx[i]->level))
+    if (actx->idx[i]->content->tagged)
       count++;
 
   return count;
@@ -122,8 +120,8 @@ static short count_tagged_children (ATTACHPTR ** idx,
  **
  **/
 
-void mutt_attach_bounce (FILE * fp, HEADER * hdr, 
-          ATTACHPTR ** idx, short idxlen, BODY * cur)
+void mutt_attach_bounce (FILE * fp, HEADER * hdr,
+          ATTACH_CONTEXT *actx, BODY * cur)
 {
   short i;
   char prompt[STRING];
@@ -133,11 +131,11 @@ void mutt_attach_bounce (FILE * fp, HEADER * hdr,
   int ret = 0;
   int p   = 0;
 
-  if (check_all_msg (idx, idxlen, cur, 1) == -1)
+  if (check_all_msg (actx, cur, 1) == -1)
     return;
 
   /* one or more messages? */
-  p = (cur || count_tagged (idx, idxlen) == 1);
+  p = (cur || count_tagged (actx) == 1);
 
   /* RfC 5322 mandates a From: header, so warn before bouncing
    * messages without one */
@@ -152,11 +150,11 @@ void mutt_attach_bounce (FILE * fp, HEADER * hdr,
   }
   else
   {
-    for (i = 0; i < idxlen; i++)
+    for (i = 0; i < actx->idxlen; i++)
     {
-      if (idx[i]->content->tagged)
+      if (actx->idx[i]->content->tagged)
       {
-       if (!idx[i]->content->hdr->env->from)
+       if (!actx->idx[i]->content->hdr->env->from)
        {
          mutt_error _("Warning: message contains no From: header");
          mutt_sleep (2);
@@ -227,10 +225,10 @@ void mutt_attach_bounce (FILE * fp, HEADER * hdr,
     ret = mutt_bounce_message (fp, cur->hdr, adr);
   else
   {
-    for (i = 0; i < idxlen; i++)
+    for (i = 0; i < actx->idxlen; i++)
     {
-      if (idx[i]->content->tagged)
-       if (mutt_bounce_message (fp, idx[i]->content->hdr, adr))
+      if (actx->idx[i]->content->tagged)
+       if (mutt_bounce_message (fp, actx->idx[i]->content->hdr, adr))
          ret = 1;
     }
   }
@@ -250,21 +248,21 @@ void mutt_attach_bounce (FILE * fp, HEADER * hdr,
  **
  **/
 
-void mutt_attach_resend (FILE * fp, HEADER * hdr, ATTACHPTR ** idx, 
-                        short idxlen, BODY * cur)
+void mutt_attach_resend (FILE * fp, HEADER * hdr, ATTACH_CONTEXT *actx,
+                        BODY * cur)
 {
   short i;
 
-  if (check_all_msg (idx, idxlen, cur, 1) == -1)
+  if (check_all_msg (actx, cur, 1) == -1)
     return;
 
   if (cur)
     mutt_resend_message (fp, Context, cur->hdr);
   else
   {
-    for (i = 0; i < idxlen; i++)
-      if (idx[i]->content->tagged)
-       mutt_resend_message (fp, Context, idx[i]->content->hdr);
+    for (i = 0; i < actx->idxlen; i++)
+      if (actx->idx[i]->content->tagged)
+       mutt_resend_message (fp, Context, actx->idx[i]->content->hdr);
   }
 }
 
@@ -277,23 +275,22 @@ void mutt_attach_resend (FILE * fp, HEADER * hdr, ATTACHPTR ** idx,
   
 /* try to find a common parent message for the tagged attachments. */
 
-static HEADER *find_common_parent (ATTACHPTR ** idx, short idxlen,
-                                  short nattach)
+static HEADER *find_common_parent (ATTACH_CONTEXT *actx, short nattach)
 {
   short i;
   short nchildren;
 
-  for (i = 0; i < idxlen; i++)
-    if (idx[i]->content->tagged)
+  for (i = 0; i < actx->idxlen; i++)
+    if (actx->idx[i]->content->tagged)
       break;
   
   while (--i >= 0)
   {
-    if (mutt_is_message_type (idx[i]->content->type, idx[i]->content->subtype))
+    if (mutt_is_message_type (actx->idx[i]->content->type, actx->idx[i]->content->subtype))
     {
-      nchildren = count_tagged_children (idx, idxlen, i);
+      nchildren = count_tagged_children (actx, i);
       if (nchildren == nattach)
-       return idx[i]->content->hdr;
+       return actx->idx[i]->content->hdr;
     }
   }
 
@@ -308,37 +305,37 @@ static HEADER *find_common_parent (ATTACHPTR ** idx, short idxlen,
  * bit.  For now, it's not worth the effort.
  */
 
-static int is_parent (short i, ATTACHPTR **idx, short idxlen, BODY *cur)
+static int is_parent (short i, ATTACH_CONTEXT *actx, BODY *cur)
 {
-  short level = idx[i]->level;
+  short level = actx->idx[i]->level;
 
-  while ((++i < idxlen) && idx[i]->level > level)
+  while ((++i < actx->idxlen) && actx->idx[i]->level > level)
   {
-    if (idx[i]->content == cur)
+    if (actx->idx[i]->content == cur)
       return 1;
   }
 
   return 0;
 }
 
-static HEADER *find_parent (ATTACHPTR **idx, short idxlen, BODY *cur, short nattach)
+static HEADER *find_parent (ATTACH_CONTEXT *actx, BODY *cur, short nattach)
 {
   short i;
   HEADER *parent = NULL;
   
   if (cur)
   {
-    for (i = 0; i < idxlen; i++)
+    for (i = 0; i < actx->idxlen; i++)
     {
-      if (mutt_is_message_type (idx[i]->content->type, idx[i]->content->subtype) 
-         && is_parent (i, idx, idxlen, cur))
-       parent = idx[i]->content->hdr;
-      if (idx[i]->content == cur)
+      if (mutt_is_message_type (actx->idx[i]->content->type, actx->idx[i]->content->subtype) 
+         && is_parent (i, actx, cur))
+       parent = actx->idx[i]->content->hdr;
+      if (actx->idx[i]->content == cur)
        break;
     }
   }
   else if (nattach)
-    parent = find_common_parent (idx, idxlen, nattach);
+    parent = find_common_parent (actx, nattach);
   
   return parent;
 }
@@ -374,18 +371,17 @@ static void include_header (int quote, FILE * ifp,
 
 static BODY ** copy_problematic_attachments (FILE *fp,
                                             BODY **last, 
-                                            ATTACHPTR **idx, 
-                                            short idxlen,
+                                            ATTACH_CONTEXT *actx,
                                             short force)
 {
   short i;
   
-  for (i = 0; i < idxlen; i++)
+  for (i = 0; i < actx->idxlen; i++)
   {
-    if (idx[i]->content->tagged && 
-       (force || !mutt_can_decode (idx[i]->content)))
+    if (actx->idx[i]->content->tagged && 
+       (force || !mutt_can_decode (actx->idx[i]->content)))
     {
-      if (mutt_copy_body (fp, last, idx[i]->content) == -1)
+      if (mutt_copy_body (fp, last, actx->idx[i]->content) == -1)
        return NULL;            /* XXXXX - may lead to crashes */
       last = &((*last)->next);
     }
@@ -399,7 +395,7 @@ static BODY ** copy_problematic_attachments (FILE *fp,
  */
 
 static void attach_forward_bodies (FILE * fp, HEADER * hdr,
-                                  ATTACHPTR ** idx, short idxlen,
+                                  ATTACH_CONTEXT *actx,
                                   BODY * cur,
                                   short nattach)
 {
@@ -425,7 +421,7 @@ static void attach_forward_bodies (FILE * fp, HEADER * hdr,
    */
 
 
-  parent = find_parent (idx, idxlen, cur, nattach);
+  parent = find_parent (actx, cur, nattach);
   
   if (parent == NULL)
     parent = hdr;
@@ -480,7 +476,7 @@ static void attach_forward_bodies (FILE * fp, HEADER * hdr,
    */
 
   if (!mime_fwd_all && !cur && (nattach > 1) 
-      && !check_can_decode (idx, idxlen, cur))
+      && !check_can_decode (actx, cur))
   {
     if ((rc = query_quadoption (OPT_MIMEFWDREST,
 _("Can't decode all tagged attachments.  MIME-forward the others?"))) == -1)
@@ -526,18 +522,18 @@ _("Can't decode all tagged attachments.  MIME-forward the others?"))) == -1)
 
     if (!mime_fwd_all)
     {
-      for (i = 0; i < idxlen; i++)
+      for (i = 0; i < actx->idxlen; i++)
       {
-       if (idx[i]->content->tagged && mutt_can_decode (idx[i]->content))
+       if (actx->idx[i]->content->tagged && mutt_can_decode (actx->idx[i]->content))
        {
-         mutt_body_handler (idx[i]->content, &st);
+         mutt_body_handler (actx->idx[i]->content, &st);
          state_putc ('\n', &st);
        }
       }
     }
 
     if (mime_fwd_any && 
-       copy_problematic_attachments (fp, last, idx, idxlen, mime_fwd_all) == NULL)
+       copy_problematic_attachments (fp, last, actx, mime_fwd_all) == NULL)
       goto bail;
   }
   
@@ -574,7 +570,7 @@ _("Can't decode all tagged attachments.  MIME-forward the others?"))) == -1)
  */
 
 static void attach_forward_msgs (FILE * fp, HEADER * hdr, 
-              ATTACHPTR ** idx, short idxlen, BODY * cur)
+              ATTACH_CONTEXT *actx, BODY * cur)
 {
   HEADER *curhdr = NULL;
   HEADER *tmphdr;
@@ -592,10 +588,10 @@ static void attach_forward_msgs (FILE * fp, HEADER * hdr,
     curhdr = cur->hdr;
   else
   {
-    for (i = 0; i < idxlen; i++)
-      if (idx[i]->content->tagged)
+    for (i = 0; i < actx->idxlen; i++)
+      if (actx->idx[i]->content->tagged)
       {
-       curhdr = idx[i]->content->hdr;
+       curhdr = actx->idx[i]->content->hdr;
        break;
       }
   }
@@ -647,15 +643,15 @@ static void attach_forward_msgs (FILE * fp, HEADER * hdr,
     }
     else
     {
-      for (i = 0; i < idxlen; i++)
+      for (i = 0; i < actx->idxlen; i++)
       {
-       if (idx[i]->content->tagged)
+       if (actx->idx[i]->content->tagged)
        {
          /* mutt_message_hook (idx[i]->content->hdr, MUTT_MESSAGEHOOK); */ 
-         mutt_forward_intro (Context, idx[i]->content->hdr, tmpfp);
-         _mutt_copy_message (tmpfp, fp, idx[i]->content->hdr,
-                             idx[i]->content->hdr->content, cmflags, chflags);
-         mutt_forward_trailer (Context, idx[i]->content->hdr, tmpfp);
+         mutt_forward_intro (Context, actx->idx[i]->content->hdr, tmpfp);
+         _mutt_copy_message (tmpfp, fp, actx->idx[i]->content->hdr,
+                             actx->idx[i]->content->hdr->content, cmflags, chflags);
+         mutt_forward_trailer (Context, actx->idx[i]->content->hdr, tmpfp);
        }
       }
     }
@@ -668,10 +664,10 @@ static void attach_forward_msgs (FILE * fp, HEADER * hdr,
       mutt_copy_body (fp, last, cur);
     else
     {
-      for (i = 0; i < idxlen; i++)
-       if (idx[i]->content->tagged)
+      for (i = 0; i < actx->idxlen; i++)
+       if (actx->idx[i]->content->tagged)
        {
-         mutt_copy_body (fp, last, idx[i]->content);
+         mutt_copy_body (fp, last, actx->idx[i]->content);
          last = &((*last)->next);
        }
     }
@@ -685,17 +681,17 @@ static void attach_forward_msgs (FILE * fp, HEADER * hdr,
 }
 
 void mutt_attach_forward (FILE * fp, HEADER * hdr, 
-                         ATTACHPTR ** idx, short idxlen, BODY * cur)
+                         ATTACH_CONTEXT *actx, BODY * cur)
 {
   short nattach;
   
 
-  if (check_all_msg (idx, idxlen, cur, 0) == 0)
-    attach_forward_msgs (fp, hdr, idx, idxlen, cur);
+  if (check_all_msg (actx, cur, 0) == 0)
+    attach_forward_msgs (fp, hdr, actx, cur);
   else
   {
-    nattach = count_tagged (idx, idxlen);
-    attach_forward_bodies (fp, hdr, idx, idxlen, cur, nattach);
+    nattach = count_tagged (actx);
+    attach_forward_bodies (fp, hdr, actx, cur, nattach);
   }
 }
 
@@ -722,7 +718,7 @@ void mutt_attach_forward (FILE * fp, HEADER * hdr,
  */
   
 static int
-attach_reply_envelope_defaults (ENVELOPE *env, ATTACHPTR **idx, short idxlen,
+attach_reply_envelope_defaults (ENVELOPE *env, ATTACH_CONTEXT *actx,
                                HEADER *parent, int flags)
 {
   ENVELOPE *curenv = NULL;
@@ -731,11 +727,11 @@ attach_reply_envelope_defaults (ENVELOPE *env, ATTACHPTR **idx, short idxlen,
   
   if (!parent)
   {
-    for (i = 0; i < idxlen; i++)
+    for (i = 0; i < actx->idxlen; i++)
     {
-      if (idx[i]->content->tagged)
+      if (actx->idx[i]->content->tagged)
       {
-       curhdr = idx[i]->content->hdr;
+       curhdr = actx->idx[i]->content->hdr;
        curenv = curhdr->env;
        break;
       }
@@ -760,10 +756,10 @@ attach_reply_envelope_defaults (ENVELOPE *env, ATTACHPTR **idx, short idxlen,
   }
   else
   {
-    for (i = 0; i < idxlen; i++)
+    for (i = 0; i < actx->idxlen; i++)
     {
-      if (idx[i]->content->tagged
-         && mutt_fetch_recips (env, idx[i]->content->hdr->env, flags) == -1)
+      if (actx->idx[i]->content->tagged
+         && mutt_fetch_recips (env, actx->idx[i]->content->hdr->env, flags) == -1)
        return -1;
     }
   }
@@ -783,10 +779,10 @@ attach_reply_envelope_defaults (ENVELOPE *env, ATTACHPTR **idx, short idxlen,
   {
     LIST **p = NULL, **q = NULL;
     
-    for (i = 0; i < idxlen; i++)
+    for (i = 0; i < actx->idxlen; i++)
     {
-      if (idx[i]->content->tagged)
-       mutt_add_to_reference_headers (env, idx[i]->content->hdr->env, &p, &q);
+      if (actx->idx[i]->content->tagged)
+       mutt_add_to_reference_headers (env, actx->idx[i]->content->hdr->env, &p, &q);
     }
   }
   
@@ -817,8 +813,8 @@ static void attach_include_reply (FILE *fp, FILE *tmpfp, HEADER *cur, int flags)
   mutt_make_post_indent (Context, cur, tmpfp);
 }
   
-void mutt_attach_reply (FILE * fp, HEADER * hdr, 
-                       ATTACHPTR ** idx, short idxlen, BODY * cur, 
+void mutt_attach_reply (FILE * fp, HEADER * hdr,
+                       ATTACH_CONTEXT *actx, BODY * cur,
                        int flags)
 {
   short mime_reply_any = 0;
@@ -835,14 +831,14 @@ void mutt_attach_reply (FILE * fp, HEADER * hdr,
   char prefix[SHORT_STRING];
   int rc;
   
-  if (check_all_msg (idx, idxlen, cur, 0) == -1)
+  if (check_all_msg (actx, cur, 0) == -1)
   {
-    nattach = count_tagged (idx, idxlen);
-    if ((parent = find_parent (idx, idxlen, cur, nattach)) == NULL)
+    nattach = count_tagged (actx);
+    if ((parent = find_parent (actx, cur, nattach)) == NULL)
       parent = hdr;
   }
 
-  if (nattach > 1 && !check_can_decode (idx, idxlen, cur))
+  if (nattach > 1 && !check_can_decode (actx, cur))
   {
     if ((rc = query_quadoption (OPT_MIMEFWDREST,
       _("Can't decode all tagged attachments.  MIME-encapsulate the others?"))) == -1)
@@ -856,7 +852,7 @@ void mutt_attach_reply (FILE * fp, HEADER * hdr,
   tmphdr = mutt_new_header ();
   tmphdr->env = mutt_new_envelope ();
 
-  if (attach_reply_envelope_defaults (tmphdr->env, idx, idxlen, 
+  if (attach_reply_envelope_defaults (tmphdr->env, actx,
                                      parent ? parent : (cur ? cur->hdr : NULL), flags) == -1)
   {
     mutt_free_header (&tmphdr);
@@ -877,10 +873,10 @@ void mutt_attach_reply (FILE * fp, HEADER * hdr,
       attach_include_reply (fp, tmpfp, cur->hdr, flags);
     else
     {
-      for (i = 0; i < idxlen; i++)
+      for (i = 0; i < actx->idxlen; i++)
       {
-       if (idx[i]->content->tagged)
-         attach_include_reply (fp, tmpfp, idx[i]->content->hdr, flags);
+       if (actx->idx[i]->content->tagged)
+         attach_include_reply (fp, tmpfp, actx->idx[i]->content->hdr, flags);
       }
     }
   }
@@ -919,11 +915,11 @@ void mutt_attach_reply (FILE * fp, HEADER * hdr,
     }
     else
     {
-      for (i = 0; i < idxlen; i++)
+      for (i = 0; i < actx->idxlen; i++)
       {
-       if (idx[i]->content->tagged && mutt_can_decode (idx[i]->content))
+       if (actx->idx[i]->content->tagged && mutt_can_decode (actx->idx[i]->content))
        {
-         mutt_body_handler (idx[i]->content, &st);
+         mutt_body_handler (actx->idx[i]->content, &st);
          state_putc ('\n', &st);
        }
       }
@@ -932,7 +928,7 @@ void mutt_attach_reply (FILE * fp, HEADER * hdr,
     mutt_make_post_indent (Context, parent, tmpfp);
 
     if (mime_reply_any && !cur && 
-       copy_problematic_attachments (fp, &tmphdr->content, idx, idxlen, 0) == NULL)
+       copy_problematic_attachments (fp, &tmphdr->content, actx, 0) == NULL)
     {
       mutt_free_header (&tmphdr);
       safe_fclose (&tmpfp);