small reorg.
[apps/madmutt.git] / copy.c
diff --git a/copy.c b/copy.c
index d658ffc..bf080fd 100644 (file)
--- a/copy.c
+++ b/copy.c
@@ -7,28 +7,16 @@
  * please see the file GPL in the top level source directory.
  */
 
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <unistd.h>
-
-#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"
 
 static int address_header_decode (char **str);
@@ -45,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;
+  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;
 
@@ -67,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)
@@ -128,19 +117,19 @@ mutt_copy_hdr (FILE* in, FILE* out, off_t off_start, off_t off_end,
 
   /* 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) {
@@ -152,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);
         }
 
@@ -173,8 +163,8 @@ mutt_copy_hdr (FILE* in, FILE* out, off_t off_start, off_t off_end,
       /* note: CH_FROM takes precedence over header weeding. */
       if (!((flags & CH_FROM) && (flags & CH_FORCE_FROM) && this_is_from) &&
           (flags & CH_WEED) &&
-          mutt_matches_ignore (buf, Ignore) &&
-          !mutt_matches_ignore (buf, UnIgnore))
+          string_list_contains(Ignore, buf, "*") &&
+          !string_list_contains(UnIgnore, buf, "*"))
         continue;
       if ((flags & CH_WEED_DELIVERED) &&
           ascii_strncasecmp ("Delivered-To:", buf, 13) == 0)
@@ -219,13 +209,15 @@ mutt_copy_hdr (FILE* in, FILE* out, off_t off_start, off_t off_end,
        * 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) */
@@ -240,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);
     }
 
@@ -251,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.
        */
@@ -330,7 +318,7 @@ int
 mutt_copy_header (FILE * in, HEADER * h, FILE * out, int flags,
                   const char *prefix)
 {
-  char buffer[SHORT_STRING];
+  char buffer[STRING];
 
   if (h->env)
     flags |= (h->env->irt_changed ? CH_UPDATE_IRT : 0) |
@@ -341,13 +329,12 @@ mutt_copy_header (FILE * in, HEADER * h, FILE * out, int flags,
     return (-1);
 
   if (flags & CH_TXTPLAIN) {
-    char chsbuf[SHORT_STRING];
+    char chsbuf[STRING];
 
     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);
@@ -507,7 +494,7 @@ int
 _mutt_copy_message (FILE * fpout, FILE * fpin, HEADER * hdr, BODY * body,
                     int flags, int chflags)
 {
-  char prefix[SHORT_STRING];
+  char prefix[STRING];
   STATE s;
   off_t new_offset = -1;
   int rc = 0;
@@ -527,7 +514,7 @@ _mutt_copy_message (FILE * fpout, FILE * fpin, HEADER * hdr, BODY * body,
     else if (hdr->attach_del && (chflags & CH_UPDATE_LEN)) {
       int new_lines;
       off_t new_length = body->length;
-      char date[SHORT_STRING];
+      char date[STRING];
 
       mutt_make_date (date, sizeof (date));
       date[5] = date[m_strlen(date) - 1] = '\"';
@@ -571,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;
@@ -629,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);
@@ -658,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;
@@ -807,17 +794,17 @@ static void format_address_header (char **h, address_t * a)
 
     a->next = NULL;
     *buf = *cbuf = *c2buf = '\0';
-    rfc822_write_address (buf, sizeof (buf), a, 0);
+    rfc822_addrcat(buf, sizeof (buf), a, 0);
     a->next = tmp;
 
     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;
@@ -825,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)