drop str_[n]cat.
[apps/madmutt.git] / compose.c
index a511eb4..a0eb9ac 100644 (file)
--- a/compose.c
+++ b/compose.c
 # include "config.h"
 #endif
 
+#include <lib-lib/mem.h>
+#include <lib-lib/str.h>
+#include <lib-lib/macros.h>
+#include <lib-lib/file.h>
+
 #include "mutt.h"
+#include "enter.h"
 #include "mutt_curses.h"
 #include "mutt_idna.h"
 #include "mutt_menu.h"
 #include "rfc1524.h"
 #include "mime.h"
 #include "attach.h"
+#include "recvattach.h"
 #include "mapping.h"
-#include "mailbox.h"
 #include "sort.h"
 #include "charset.h"
 #include "mx.h"
+#include "buffy.h"
 #include "compose.h"
 
 #ifdef MIXMASTER
@@ -37,9 +44,6 @@
 #include "nntp.h"
 #endif
 
-#include "lib/mem.h"
-#include "lib/intl.h"
-#include "lib/str.h"
 
 #include <errno.h>
 #include <string.h>
@@ -83,11 +87,12 @@ enum {
 #endif
 };
 
-#define HDR_XOFFSET 14
-#define TITLE_FMT "%14s"        /* Used for Prompts, which are ASCII */
-#define W (COLS - HDR_XOFFSET - SidebarWidth)
+#define HDR_XOFFSET     14
+#define TITLE_FMT       "%14s"        /* Used for Prompts, which are ASCII */
+#define SW              (option(OPTMBOXPANE)?SidebarWidth:0)
+#define W               (COLS - HDR_XOFFSET - SW)
 
-static char *Prompts[] = {
+static const char *Prompts[] = {
   "From: ",
   "To: ",
   "Cc: ",
@@ -112,7 +117,7 @@ static struct mapping_t ComposeHelp[] = {
   {N_("Attach file"), OP_COMPOSE_ATTACH_FILE},
   {N_("Descrip"), OP_COMPOSE_EDIT_DESCRIPTION},
   {N_("Help"), OP_HELP},
-  {NULL}
+  {NULL, OP_NULL}
 };
 
 #ifdef USE_NNTP
@@ -124,19 +129,17 @@ static struct mapping_t ComposeNewsHelp[] = {
   {N_("Attach file"), OP_COMPOSE_ATTACH_FILE},
   {N_("Descrip"), OP_COMPOSE_EDIT_DESCRIPTION},
   {N_("Help"), OP_HELP},
-  {NULL}
+  {NULL, OP_NULL}
 };
 #endif
 
-static void snd_entry (char *b, size_t blen, MUTTMENU * menu, int num)
-{
-  mutt_FormatString (b, blen, NONULL (AttachFormat), mutt_attach_fmt,
+static void snd_entry (char *b, size_t blen, MUTTMENU * menu, int num) {
+  int w=(COLS-SW)>blen?blen:COLS-SW;
+  mutt_FormatString (b, w, NONULL (AttachFormat), mutt_attach_fmt,
                      (unsigned long) (((ATTACHPTR **) menu->data)[num]),
                      M_FORMAT_STAT_FILE | M_FORMAT_ARROWCURSOR);
 }
 
-
-
 #include "mutt_crypt.h"
 
 static void redraw_crypt_lines (HEADER * msg)
@@ -145,16 +148,16 @@ static void redraw_crypt_lines (HEADER * msg)
 
   if ((WithCrypto & APPLICATION_PGP) && (WithCrypto & APPLICATION_SMIME)) {
     if (!msg->security)
-      mvaddstr (HDR_CRYPT, SidebarWidth, "    Security: ");
+      mvaddstr (HDR_CRYPT, SW, "    Security: ");
     else if (msg->security & APPLICATION_SMIME)
-      mvaddstr (HDR_CRYPT, SidebarWidth, "      S/MIME: ");
+      mvaddstr (HDR_CRYPT, SW, "      S/MIME: ");
     else if (msg->security & APPLICATION_PGP)
-      mvaddstr (HDR_CRYPT, SidebarWidth, "         PGP: ");
+      mvaddstr (HDR_CRYPT, SW, "         PGP: ");
   }
   else if ((WithCrypto & APPLICATION_SMIME))
-    mvaddstr (HDR_CRYPT, SidebarWidth, "      S/MIME: ");
+    mvaddstr (HDR_CRYPT, SW, "      S/MIME: ");
   else if ((WithCrypto & APPLICATION_PGP))
-    mvaddstr (HDR_CRYPT, SidebarWidth, "         PGP: ");
+    mvaddstr (HDR_CRYPT, SW, "         PGP: ");
   else
     return;
 
@@ -177,7 +180,7 @@ static void redraw_crypt_lines (HEADER * msg)
     }
   clrtoeol ();
 
-  move (HDR_CRYPTINFO, SidebarWidth);
+  move (HDR_CRYPTINFO, SW);
   clrtoeol ();
   if ((WithCrypto & APPLICATION_PGP)
       && msg->security & APPLICATION_PGP && msg->security & SIGN)
@@ -194,7 +197,7 @@ static void redraw_crypt_lines (HEADER * msg)
       && (msg->security & APPLICATION_SMIME)
       && (msg->security & ENCRYPT)
       && SmimeCryptAlg && *SmimeCryptAlg) {
-    mvprintw (HDR_CRYPTINFO, SidebarWidth + 40, "%s%s", _("Encrypt with: "),
+    mvprintw (HDR_CRYPTINFO, SW + 40, "%s%s", _("Encrypt with: "),
               NONULL (SmimeCryptAlg));
     off = 20;
   }
@@ -206,9 +209,9 @@ static void redraw_crypt_lines (HEADER * msg)
 static void redraw_mix_line (LIST * chain)
 {
   int c;
-  char *t;
+  const char *t;
 
-  mvaddstr (HDR_MIX, SidebarWidth, "         Mix: ");
+  mvaddstr (HDR_MIX, SW, "         Mix: ");
 
   if (!chain) {
     addstr ("<no chain defined>");
@@ -221,14 +224,14 @@ static void redraw_mix_line (LIST * chain)
     if (t && t[0] == '0' && t[1] == '\0')
       t = "<random>";
 
-    if (c + safe_strlen (t) + 2 >= COLS - SidebarWidth)
+    if (c + m_strlen(t) + 2 >= COLS - SW)
       break;
 
     addstr (NONULL (t));
     if (chain->next)
       addstr (", ");
 
-    c += safe_strlen (t) + 2;
+    c += m_strlen(t) + 2;
   }
 }
 #endif /* MIXMASTER */
@@ -268,7 +271,7 @@ static void draw_envelope_addr (int line, ADDRESS * addr)
 
   buf[0] = 0;
   rfc822_write_address (buf, sizeof (buf), addr, 1);
-  mvprintw (line, SidebarWidth, TITLE_FMT, Prompts[line - 1]);
+  mvprintw (line, SW, TITLE_FMT, Prompts[line - 1]);
   mutt_paddstr (W, buf);
 }
 
@@ -284,9 +287,9 @@ static void draw_envelope (HEADER * msg, char *fcc)
 #ifdef USE_NNTP
   }
   else {
-    mvprintw (HDR_TO, SidebarWidth, TITLE_FMT, Prompts[HDR_NEWSGROUPS - 1]);
+    mvprintw (HDR_TO, SW, TITLE_FMT, Prompts[HDR_NEWSGROUPS - 1]);
     mutt_paddstr (W, NONULL (msg->env->newsgroups));
-    mvprintw (HDR_CC, SidebarWidth, TITLE_FMT, Prompts[HDR_FOLLOWUPTO - 1]);
+    mvprintw (HDR_CC, SW, TITLE_FMT, Prompts[HDR_FOLLOWUPTO - 1]);
     mutt_paddstr (W, NONULL (msg->env->followup_to));
     if (option (OPTXCOMMENTTO)) {
       mvprintw (HDR_BCC, 0, TITLE_FMT, Prompts[HDR_XCOMMENTTO - 1]);
@@ -294,10 +297,10 @@ static void draw_envelope (HEADER * msg, char *fcc)
     }
   }
 #endif
-  mvprintw (HDR_SUBJECT, SidebarWidth, TITLE_FMT, Prompts[HDR_SUBJECT - 1]);
+  mvprintw (HDR_SUBJECT, SW, TITLE_FMT, Prompts[HDR_SUBJECT - 1]);
   mutt_paddstr (W, NONULL (msg->env->subject));
   draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to);
-  mvprintw (HDR_FCC, SidebarWidth, TITLE_FMT, Prompts[HDR_FCC - 1]);
+  mvprintw (HDR_FCC, SW, TITLE_FMT, Prompts[HDR_FCC - 1]);
   mutt_paddstr (W, fcc);
 
   if (WithCrypto)
@@ -308,7 +311,7 @@ static void draw_envelope (HEADER * msg, char *fcc)
 #endif
 
   SETCOLOR (MT_COLOR_STATUS);
-  mvaddstr (HDR_ATTACH - 1, SidebarWidth, _("-- Attachments"));
+  mvaddstr (HDR_ATTACH - 1, SW, _("-- Attachments"));
   BKGDSET (MT_COLOR_STATUS);
   clrtoeol ();
 
@@ -337,13 +340,13 @@ static int edit_address_list (int line, ADDRESS ** addr)
   if (mutt_addrlist_to_idna (*addr, &err) != 0) {
     mutt_error (_("Warning: '%s' is a bad IDN."), err);
     mutt_refresh ();
-    FREE (&err);
+    p_delete(&err);
   }
 
   /* redraw the expanded list so the user can see the result */
   buf[0] = 0;
   rfc822_write_address (buf, sizeof (buf), *addr, 1);
-  move (line, HDR_XOFFSET + SidebarWidth);
+  move (line, HDR_XOFFSET + SW);
   mutt_paddstr (W, buf);
 
   return 0;
@@ -373,8 +376,8 @@ static int delete_attachment (MUTTMENU * menu, short *idxlen, int x)
   idx[x]->content->next = NULL;
   idx[x]->content->parts = NULL;
   mutt_free_body (&(idx[x]->content));
-  FREE (&idx[x]->tree);
-  FREE (&idx[x]);
+  p_delete(&idx[x]->tree);
+  p_delete(&idx[x]);
   for (; x < *idxlen - 1; x++)
     idx[x] = idx[x + 1];
   menu->max = --(*idxlen);
@@ -477,8 +480,7 @@ static const char *compose_format_str (char *buf, size_t buflen, char op,
     break;
 
   case 'v':
-    snprintf (fmt, sizeof (fmt), "Mutt-ng %%s");
-    snprintf (buf, buflen, fmt, MUTT_VERSION);
+    m_strcpy(buf, buflen, mutt_make_version (0));
     break;
 
   case 0:
@@ -501,7 +503,8 @@ static const char *compose_format_str (char *buf, size_t buflen, char op,
 static void compose_status_line (char *buf, size_t buflen, MUTTMENU * menu,
                                  const char *p)
 {
-  mutt_FormatString (buf, buflen, p, compose_format_str,
+  int w=(COLS-SW)>buflen?buflen:(COLS-SW);
+  mutt_FormatString (buf, w, p, compose_format_str,
                      (unsigned long) menu, 0);
 }
 
@@ -563,7 +566,7 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
                          ComposeHelp);
 
   if (option (OPTMBOXPANE))
-    mutt_buffy_check (1);
+    buffy_check (0);
   while (loop) {
 #ifdef USE_NNTP
     unset_option (OPTNEWS);     /* for any case */
@@ -617,9 +620,9 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
           buf[0] = 0;
         if (mutt_get_field ("Newsgroups: ", buf, sizeof (buf), 0) == 0
             && buf[0]) {
-          FREE (&msg->env->newsgroups);
-          mutt_remove_trailing_ws (buf);
-          msg->env->newsgroups = safe_strdup (mutt_skip_whitespace (buf));
+          p_delete(&msg->env->newsgroups);
+          str_skip_trailws (buf);
+          msg->env->newsgroups = m_strdup(str_skip_initws (buf));
           move (HDR_TO, HDR_XOFFSET);
           clrtoeol ();
           if (msg->env->newsgroups)
@@ -635,9 +638,9 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
           strfcpy (buf, msg->env->followup_to, sizeof (buf));
         if (mutt_get_field ("Followup-To: ", buf, sizeof (buf), 0) == 0
             && buf[0]) {
-          FREE (&msg->env->followup_to);
-          mutt_remove_trailing_ws (buf);
-          msg->env->followup_to = safe_strdup (mutt_skip_whitespace (buf));
+          p_delete(&msg->env->followup_to);
+          str_skip_trailws (buf);
+          msg->env->followup_to = m_strdup(str_skip_initws (buf));
           move (HDR_CC, HDR_XOFFSET);
           clrtoeol ();
           if (msg->env->followup_to)
@@ -653,8 +656,8 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
           strfcpy (buf, msg->env->x_comment_to, sizeof (buf));
         if (mutt_get_field ("X-Comment-To: ", buf, sizeof (buf), 0) == 0
             && buf[0]) {
-          FREE (&msg->env->x_comment_to);
-          msg->env->x_comment_to = safe_strdup (buf);
+          p_delete(&msg->env->x_comment_to);
+          msg->env->x_comment_to = m_strdup(buf);
           move (HDR_BCC, HDR_XOFFSET);
           clrtoeol ();
           if (msg->env->x_comment_to)
@@ -670,7 +673,7 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
         buf[0] = 0;
       if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0) {
         str_replace (&msg->env->subject, buf);
-        move (HDR_SUBJECT, HDR_XOFFSET + SidebarWidth);
+        move (HDR_SUBJECT, HDR_XOFFSET + SW);
         clrtoeol ();
         if (msg->env->subject)
           mutt_paddstr (W, msg->env->subject);
@@ -686,7 +689,7 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
       if (mutt_get_field ("Fcc: ", buf, sizeof (buf), M_FILE | M_CLEAR) == 0) {
         strfcpy (fcc, buf, _POSIX_PATH_MAX);
         mutt_pretty_mailbox (fcc);
-        move (HDR_FCC, HDR_XOFFSET + SidebarWidth);
+        move (HDR_FCC, HDR_XOFFSET + SW);
         mutt_paddstr (W, fcc);
         fccSet = 1;
       }
@@ -694,7 +697,7 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
       mutt_message_hook (NULL, msg, M_SEND2HOOK);
       break;
     case OP_COMPOSE_EDIT_MESSAGE:
-      if (Editor && (safe_strcmp ("builtin", Editor) != 0)
+      if (Editor && (m_strcmp("builtin", Editor) != 0)
           && !option (OPTEDITHDRS)) {
         mutt_edit_file (Editor, msg->content->filename);
         mutt_update_encoding (msg->content);
@@ -704,17 +707,18 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
       }
       /* fall through */
     case OP_COMPOSE_EDIT_HEADERS:
-      if (safe_strcmp ("builtin", Editor) != 0 &&
+      if (m_strcmp("builtin", Editor) != 0 &&
           (op == OP_COMPOSE_EDIT_HEADERS ||
            (op == OP_COMPOSE_EDIT_MESSAGE && option (OPTEDITHDRS)))) {
-        char *tag = NULL, *err = NULL;
+        const char *tag = NULL;
+        char *err = NULL;
 
         mutt_env_to_local (msg->env);
         mutt_edit_headers (NONULL (Editor), msg->content->filename, msg,
                            fcc, fcclen);
         if (mutt_env_to_idna (msg->env, &tag, &err)) {
           mutt_error (_("Bad IDN in \"%s\": '%s'"), tag, err);
-          FREE (&err);
+          p_delete(&err);
         }
       }
       else {
@@ -729,7 +733,7 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
       /* attachments may have been added */
       if (idxlen && idx[idxlen - 1]->content->next) {
         for (i = 0; i < idxlen; i++)
-          FREE (&idx[i]);
+          p_delete(&idx[i]);
         idxlen = 0;
         idx =
           mutt_gen_attach_list (msg->content, -1, idx, &idxlen, &idxmax, 0,
@@ -748,18 +752,18 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
       if (!(WithCrypto & APPLICATION_PGP))
         break;
       if (idxlen == idxmax) {
-        safe_realloc (&idx, sizeof (ATTACHPTR *) * (idxmax += 5));
+        p_realloc(&idx, idxmax += 5);
         menu->data = idx;
       }
 
-      idx[idxlen] = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
+      idx[idxlen] = p_new(ATTACHPTR, 1);
       if ((idx[idxlen]->content =
            crypt_pgp_make_key_attachment (NULL)) != NULL) {
         update_idx (menu, idx, idxlen++);
         menu->redraw |= REDRAW_INDEX;
       }
       else
-        FREE (&idx[idxlen]);
+        p_delete(&idx[idxlen]);
 
       menu->redraw |= REDRAW_STATUS;
 
@@ -788,8 +792,7 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
           break;
 
         if (idxlen + numfiles >= idxmax) {
-          safe_realloc (&idx,
-                        sizeof (ATTACHPTR *) * (idxmax += 5 + numfiles));
+          p_realloc(&idx, idxmax += 5 + numfiles);
           menu->data = idx;
         }
 
@@ -800,18 +803,19 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
         for (i = 0; i < numfiles; i++) {
           char *att = files[i];
 
-          idx[idxlen] = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
+          idx[idxlen] = p_new(ATTACHPTR, 1);
+          idx[idxlen]->unowned = 1;
           idx[idxlen]->content = mutt_make_file_attach (att);
           if (idx[idxlen]->content != NULL)
             update_idx (menu, idx, idxlen++);
           else {
             error = 1;
             mutt_error (_("Unable to attach %s!"), att);
-            FREE (&idx[idxlen]);
+            p_delete(&idx[idxlen]);
           }
         }
 
-        FREE (&files);
+        p_delete(&files);
         if (!error)
           mutt_clear_error ();
 
@@ -863,13 +867,13 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
 #endif
           mutt_expand_path (fname, sizeof (fname));
 #ifdef USE_IMAP
-        if (!mx_is_imap (fname))
+        if (mx_get_magic (fname) != M_IMAP)
 #endif
 #ifdef USE_POP
-          if (!mx_is_pop (fname))
+          if (mx_get_magic (fname) != M_POP)
 #endif
 #ifdef USE_NNTP
-            if (!mx_is_nntp (fname) && !option (OPTNEWS))
+            if (mx_get_magic (fname) != M_NNTP && !option (OPTNEWS))
 #endif
               /* check to make sure the file exists and is readable */
               if (access (fname, R_OK) == -1) {
@@ -887,7 +891,7 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
 
         if (!ctx->msgcount) {
           mx_close_mailbox (ctx, NULL);
-          FREE (&ctx);
+          p_delete(&ctx);
           mutt_error _("No messages in that folder.");
 
           break;
@@ -915,23 +919,21 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
         }
 
         if (idxlen + Context->tagged >= idxmax) {
-          safe_realloc (&idx,
-                        sizeof (ATTACHPTR *) * (idxmax +=
-                                                5 + Context->tagged));
+          p_realloc(&idx, idxmax += 5 + Context->tagged);
           menu->data = idx;
         }
 
         for (i = 0; i < Context->msgcount; i++) {
           h = Context->hdrs[i];
           if (h->tagged) {
-            idx[idxlen] = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
+            idx[idxlen] = p_new(ATTACHPTR, 1);
             idx[idxlen]->content = mutt_make_message_attach (Context, h, 1);
             if (idx[idxlen]->content != NULL)
               update_idx (menu, idx, idxlen++);
             else {
               mutt_error _("Unable to attach!");
 
-              FREE (&idx[idxlen]);
+              p_delete(&idx[idxlen]);
             }
           }
         }
@@ -941,7 +943,7 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
           mx_close_mailbox (Context, NULL);
         else
           mx_fastclose_mailbox (Context);
-        FREE (&Context);
+        p_delete(&Context);
 
         /* go back to the folder we started from */
         Context = this;
@@ -954,6 +956,8 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
 
     case OP_DELETE:
       CHECK_COUNT;
+      if (idx[menu->current]->unowned)
+        idx[menu->current]->content->unlink = 0;
       if (delete_attachment (menu, &idxlen, menu->current) == -1)
         break;
       mutt_update_tree (idx, idxlen);
@@ -1187,15 +1191,15 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
           continue;
         }
         if (idxlen == idxmax) {
-          safe_realloc (&idx, sizeof (ATTACHPTR *) * (idxmax += 5));
+          p_realloc(&idx, idxmax += 5);
           menu->data = idx;
         }
 
-        idx[idxlen] = (ATTACHPTR *) safe_calloc (1, sizeof (ATTACHPTR));
+        idx[idxlen] = p_new(ATTACHPTR, 1);
         /* Touch the file */
         if (!(fp = safe_fopen (fname, "w"))) {
           mutt_error (_("Can't create file %s"), fname);
-          FREE (&idx[idxlen]);
+          p_delete(&idx[idxlen]);
           continue;
         }
         fclose (fp);
@@ -1278,11 +1282,13 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
           /* avoid freeing other attachments */
           idx[idxlen]->content->next = NULL;
           idx[idxlen]->content->parts = NULL;
+          if (idx[idxlen]->unowned)
+            idx[idxlen]->content->unlink = 0;
           mutt_free_body (&idx[idxlen]->content);
-          FREE (&idx[idxlen]->tree);
-          FREE (&idx[idxlen]);
+          p_delete(&idx[idxlen]->tree);
+          p_delete(&idx[idxlen]);
         }
-        FREE (&idx);
+        p_delete(&idx);
         idxlen = 0;
         idxmax = 0;
         r = -1;
@@ -1401,7 +1407,8 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
       compose_status_line (buf, sizeof (buf), menu, NONULL (ComposeFormat));
       CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES - 2);
       SETCOLOR (MT_COLOR_STATUS);
-      printw ("%-*.*s", COLS, COLS, buf);
+      move (option (OPTSTATUSONTOP) ? 0 : LINES - 2, SW);
+      printw ("%-*.*s", COLS-SW, COLS-SW, buf);
       SETCOLOR (MT_COLOR_NORMAL);
       menu->redraw &= ~REDRAW_STATUS;
     }
@@ -1413,13 +1420,13 @@ int mutt_compose_menu (HEADER * msg,    /* structure for new message */
     msg->content = idx[0]->content;
     for (i = 0; i < idxlen; i++) {
       idx[i]->content->aptr = NULL;
-      FREE (&idx[i]);
+      p_delete(&idx[i]);
     }
   }
   else
     msg->content = NULL;
 
-  FREE (&idx);
+  p_delete(&idx);
 
   return (r);
 }