Use good m_ functions, because it smell like a flower, version 2.
[apps/madmutt.git] / copy.c
diff --git a/copy.c b/copy.c
index 97b73c0..0c5f8b4 100644 (file)
--- a/copy.c
+++ b/copy.c
@@ -7,32 +7,18 @@
  * please see the file GPL in the top level source directory.
  */
 
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <lib-lib/macros.h>
-#include <lib-lib/mem.h>
-#include <lib-lib/str.h>
-#include <lib-lib/file.h>
-#include <lib-lib/ascii.h>
+#include <lib-lib/lib-lib.h>
 
 #include <lib-mime/mime.h>
+#include <lib-mx/mx.h>
 
 #include "mutt.h"
 #include "handler.h"
-#include "mx.h"
 #include "copy.h"
 #include <lib-crypt/crypt.h>
+#include <lib-ui/curses.h>
 #include "mutt_idna.h"
 
-#include "lib/debug.h"
-
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <unistd.h>             /* needed for SEEK_SET under SunOS 4.1.4 */
-
 static int address_header_decode (char **str);
 static int copy_delete_attach (BODY * b, FILE * fpin, FILE * fpout,
                                char *date);
@@ -47,12 +33,13 @@ mutt_copy_hdr (FILE* in, FILE* out, off_t off_start, off_t off_end,
   int this_is_from;
   int ignore = 0;
   char buf[STRING];             /* should be long enough to get most fields in one pass */
-  char *nl;
-  LIST *t;
+  char *eol;
+  string_list_t *t;
   char **headers;
   int hdr_count;
   int x;
   char *this_one = NULL;
+  ssize_t this_one_len = 0, headers_len = 0;
   int error;
   int curline = 0;
 
@@ -69,13 +56,13 @@ mutt_copy_hdr (FILE* in, FILE* out, off_t off_start, off_t off_end,
      * we can do a more efficient line to line copying
      */
     while (ftello (in) < off_end) {
-      nl = strchr (buf, '\n');
+      eol = strchr (buf, '\n');
 
       if ((fgets (buf, sizeof (buf), in)) == NULL)
         break;
 
       /* Is it the begining of a header? */
-      if (nl && buf[0] != ' ' && buf[0] != '\t') {
+      if (eol && buf[0] != ' ' && buf[0] != '\t') {
         ignore = 1;
         if (!from && m_strncmp("From ", buf, 5) == 0) {
           if ((flags & CH_FROM) == 0)
@@ -122,30 +109,27 @@ mutt_copy_hdr (FILE* in, FILE* out, off_t off_start, off_t off_end,
    */
   if (flags & CH_REORDER) {
     for (t = HeaderOrderList; t; t = t->next) {
-      debug_print (1, ("Reorder list: %s\n", t->data));
       hdr_count++;
     }
   }
 
-  debug_print (1, ("WEED is %s\n", (flags & CH_WEED) ? "Set" : "Not"));
-
   headers = p_new(char *, hdr_count);
 
   /* Read all the headers into the array */
   while (ftello (in) < off_end) {
-    nl = strchr (buf, '\n');
+    eol = strchr (buf, '\n');
 
     /* Read a line */
     if ((fgets (buf, sizeof (buf), in)) == NULL)
       break;
 
     /* Is it the begining of a header? */
-    if (nl && buf[0] != ' ' && buf[0] != '\t') {
+    if (eol && buf[0] != ' ' && buf[0] != '\t') {
 
       /* set curline to 1 for To:/Cc:/Bcc: and 0 otherwise */
-      curline = (flags & CH_WEED) && (ascii_strncmp ("To:", buf, 3) == 0 ||
-                                      ascii_strncmp ("Cc:", buf, 3) == 0 ||
-                                      ascii_strncmp ("Bcc:", buf, 4) == 0);
+      curline = (flags & CH_WEED) && (m_strncmp("To:", buf, 3) == 0 ||
+                                      m_strncmp("Cc:", buf, 3) == 0 ||
+                                      m_strncmp("Bcc:", buf, 4) == 0);
 
       /* Do we have anything pending? */
       if (this_one) {
@@ -157,8 +141,9 @@ mutt_copy_hdr (FILE* in, FILE* out, off_t off_start, off_t off_end,
         if (!headers[x])
           headers[x] = this_one;
         else {
-          p_realloc(&headers[x], m_strlen(headers[x]) + m_strlen(this_one) + 1);
-          strcat(headers[x], this_one);        /* __STRCAT_CHECKED__ */
+          headers_len =  m_strlen(headers[x]) + m_strlen(this_one) + 1;
+          p_realloc(&headers[x], headers_len);
+          m_strcat(headers[x], headers_len, this_one);
           p_delete(&this_one);
         }
 
@@ -209,7 +194,6 @@ mutt_copy_hdr (FILE* in, FILE* out, off_t off_start, off_t off_end,
       if (flags & CH_REORDER) {
         for (t = HeaderOrderList, x = 0; (t); t = t->next, x++) {
           if (!ascii_strncasecmp (buf, t->data, m_strlen(t->data))) {
-            debug_print (2, ("Reorder: %s matches %s\n", t->data, buf));
             break;
           }
         }
@@ -219,20 +203,21 @@ mutt_copy_hdr (FILE* in, FILE* out, off_t off_start, off_t off_end,
     }                           /* If beginning of header */
 
     if (!ignore) {
-      debug_print (2, ("Reorder: x = %d; hdr_count = %d\n", x, hdr_count));
       if (!this_one)
         this_one = m_strdup(buf);
       /* we do want to see all lines if this header doesn't feature
        * abbreviations (curline is 0), $max_display_recips is 0 and
        * while the number hasn't reached $max_display_recips yet */
       else if (curline == 0 || MaxDispRecips == 0 || ++curline <= MaxDispRecips) {
-        p_realloc(&this_one, m_strlen(this_one) + m_strlen(buf) + 1);
-        strcat (this_one, buf); /* __STRCAT_CHECKED__ */
+        this_one_len = m_strlen(this_one) + m_strlen(buf) + 1;
+        p_realloc(&this_one, this_one_len);
+        m_strcat(this_one, this_one_len, buf);
       /* only for the first line which doesn't exeeds
        * $max_display_recips: abbreviate it */
       } else if (curline == MaxDispRecips+1) {
-        p_realloc(&this_one, m_strlen(this_one) + 5);
-        strcat (this_one, " ...");
+        this_one_len = m_strlen(this_one) + 5;
+        p_realloc(&this_one, this_one_len);
+        m_strcat(this_one, this_one_len, " ...");
       }
     }
   }                             /* while (ftello (in) < off_end) */
@@ -247,8 +232,9 @@ mutt_copy_hdr (FILE* in, FILE* out, off_t off_start, off_t off_end,
     if (!headers[x])
       headers[x] = this_one;
     else {
-      p_realloc(&headers[x], m_strlen(headers[x]) + m_strlen(this_one) + 1);
-      strcat (headers[x], this_one);    /* __STRCAT_CHECKED__ */
+      headers_len = m_strlen(headers[x]) + m_strlen(this_one) + 1;
+      p_realloc(&headers[x], headers_len);
+      m_strcat(headers[x], headers_len, this_one);
       p_delete(&this_one);
     }
 
@@ -258,11 +244,6 @@ mutt_copy_hdr (FILE* in, FILE* out, off_t off_start, off_t off_end,
   /* Now output the headers in order */
   for (x = 0; x < hdr_count; x++) {
     if (headers[x]) {
-#if 0
-      if (flags & CH_DECODE)
-        rfc2047_decode (&headers[x]);
-#endif
-
       /* We couldn't do the prefixing when reading because RFC 2047
        * decoding may have concatenated lines.
        */
@@ -353,8 +334,7 @@ mutt_copy_header (FILE * in, HEADER * h, FILE * out, int flags,
     fputs ("MIME-Version: 1.0\n", out);
     fputs ("Content-Transfer-Encoding: 8bit\n", out);
     fputs ("Content-Type: text/plain; charset=", out);
-    mutt_canonical_charset (chsbuf, sizeof (chsbuf),
-                            Charset ? Charset : "us-ascii");
+    charset_canonicalize(chsbuf, sizeof (chsbuf), Charset);
     rfc822_strcpy(buffer, sizeof(buffer), chsbuf, MimeSpecials);
     fputs (buffer, out);
     fputc ('\n', out);
@@ -367,7 +347,7 @@ mutt_copy_header (FILE * in, HEADER * h, FILE * out, int flags,
   if (flags & CH_UPDATE) {
     if ((flags & CH_NOSTATUS) == 0) {
       if (h->env->irt_changed && h->env->in_reply_to) {
-        LIST *listp = h->env->in_reply_to;
+        string_list_t *listp = h->env->in_reply_to;
 
         if (fputs ("In-Reply-To: ", out) == EOF)
           return (-1);
@@ -381,7 +361,7 @@ mutt_copy_header (FILE * in, HEADER * h, FILE * out, int flags,
       }
 
       if (h->env->refs_changed && h->env->references) {
-        LIST *listp = h->env->references, *refs = NULL, *t;
+        string_list_t *listp = h->env->references, *refs = NULL, *t;
 
         if (fputs ("References: ", out) == EOF)
           return (-1);
@@ -389,7 +369,7 @@ mutt_copy_header (FILE * in, HEADER * h, FILE * out, int flags,
         /* Mutt stores references in reverse order, thus we create
          * a reordered refs list that we can put in the headers */
         for (; listp; listp = listp->next, refs = t) {
-          t = p_new(LIST, 1);
+          t = p_new(string_list_t, 1);
           t->data = listp->data;
           t->next = refs;
         }
@@ -562,18 +542,6 @@ _mutt_copy_message (FILE * fpout, FILE * fpin, HEADER * hdr, BODY * body,
       if (copy_delete_attach (body, fpin, fpout, date))
         return -1;
 
-#ifdef DEBUG
-      {
-        off_t fail = ((ftello (fpout) - new_offset) - new_length);
-
-        if (fail) {
-          mutt_error ("The length calculation was wrong by %ld bytes", fail);
-          new_length += fail;
-          mutt_sleep (1);
-        }
-      }
-#endif
-
       /* Update original message if we are sync'ing a mailfolder */
       if (flags & M_CM_UPDATE) {
         hdr->attach_del = 0;
@@ -590,7 +558,7 @@ _mutt_copy_message (FILE * fpout, FILE * fpin, HEADER * hdr, BODY * body,
           Context->vsize -= body->length - new_length;
 
         body->length = new_length;
-        mutt_free_body (&body->parts);
+        body_list_wipe(&body->parts);
       }
 
       return 0;
@@ -648,12 +616,12 @@ _mutt_copy_message (FILE * fpout, FILE * fpin, HEADER * hdr, BODY * body,
 
     fseeko (fp, cur->offset, 0);
     if (mutt_copy_bytes (fp, fpout, cur->length) == -1) {
-      fclose (fp);
-      mutt_free_body (&cur);
+      m_fclose(&fp);
+      body_list_wipe(&cur);
       return (-1);
     }
-    mutt_free_body (&cur);
-    fclose (fp);
+    body_list_wipe(&cur);
+    m_fclose(&fp);
   }
   else {
     fseeko (fpin, body->offset, 0);
@@ -677,7 +645,7 @@ _mutt_copy_message (FILE * fpout, FILE * fpin, HEADER * hdr, BODY * body,
   if ((flags & M_CM_UPDATE) && (flags & M_CM_NOHEADER) == 0
       && new_offset != -1) {
     body->offset = new_offset;
-    mutt_free_body (&body->parts);
+    body_list_wipe(&body->parts);
   }
 
   return rc;
@@ -696,7 +664,6 @@ mutt_copy_message (FILE * fpout, CONTEXT * src, HEADER * hdr, int flags,
        _mutt_copy_message (fpout, msg->fp, hdr, hdr->content, flags,
                            chflags)) == 0 && (ferror (fpout)
                                               || feof (fpout))) {
-    debug_print (1, ("_mutt_copy_message failed to detect EOF!\n"));
     r = -1;
   }
   mx_close_message (&msg);
@@ -832,12 +799,12 @@ static void format_address_header (char **h, address_t * a)
 
     l = m_strlen(buf);
     if (count && linelen + l > 74) {
-      strcpy (cbuf, "\n\t");    /* __STRCPY_CHECKED__ */
+      m_strcpy(cbuf, sizeof(cbuf), "\n\t");
       linelen = l + 8;
     }
     else {
       if (a->mailbox) {
-        strcpy (cbuf, " ");     /* __STRCPY_CHECKED__ */
+        m_strcpy(cbuf, sizeof(cbuf), " ");
         linelen++;
       }
       linelen += l;
@@ -845,18 +812,18 @@ static void format_address_header (char **h, address_t * a)
     if (!a->group && a->next && a->next->mailbox) {
       linelen++;
       buflen++;
-      strcpy (c2buf, ",");      /* __STRCPY_CHECKED__ */
+      m_strcpy(c2buf, sizeof(c2buf), ",");
     }
 
     buflen += l + m_strlen(cbuf) + m_strlen(c2buf);
     p_realloc(h, buflen);
-    strcat (*h, cbuf);          /* __STRCAT_CHECKED__ */
-    strcat (*h, buf);           /* __STRCAT_CHECKED__ */
-    strcat (*h, c2buf);         /* __STRCAT_CHECKED__ */
+    m_strcat(*h, buflen, cbuf);
+    m_strcat(*h, buflen, buf);
+    m_strcat(*h, buflen, c2buf);
   }
 
   /* Space for this was allocated in the beginning of this function. */
-  strcat (*h, "\n");            /* __STRCAT_CHECKED__ */
+  m_strcat(*h, buflen, "\n");
 }
 
 static int address_header_decode (char **h)
@@ -936,7 +903,7 @@ static int address_header_decode (char **h)
 
   format_address_header (h, a);
 
-  address_delete (&a);
+  address_list_wipe(&a);
 
   p_delete(&s);
   return 1;