workaround a stupid issue in how decoding is performed in mutt *sigh*
[apps/madmutt.git] / copy.c
diff --git a/copy.c b/copy.c
index 55dd192..a52a4eb 100644 (file)
--- a/copy.c
+++ b/copy.c
 #include <lib-lib/lib-lib.h>
 
 #include <lib-mime/mime.h>
+#include <lib-ui/lib-ui.h>
 #include <lib-mx/mx.h>
 
 #include "mutt.h"
 #include "handler.h"
 #include "copy.h"
-#include <lib-crypt/crypt.h>
-#include <lib-ui/curses.h>
+#include "crypt.h"
 #include "mutt_idna.h"
 
 static int address_header_decode (char **str);
@@ -76,20 +76,32 @@ mutt_copy_hdr (FILE* in, FILE* out, off_t off_start, off_t off_end,
         else if (buf[0] == '\n' || (buf[0] == '\r' && buf[1] == '\n'))
           break;                /* end of header */
 
-        if ((flags & (CH_UPDATE | CH_XMIT | CH_NOSTATUS)) &&
-            (ascii_strncasecmp ("Status:", buf, 7) == 0 ||
-             ascii_strncasecmp ("X-Status:", buf, 9) == 0))
-          continue;
-        if ((flags & (CH_UPDATE_LEN | CH_XMIT | CH_NOLEN)) &&
-            (ascii_strncasecmp ("Content-Length:", buf, 15) == 0 ||
-             ascii_strncasecmp ("Lines:", buf, 6) == 0))
-          continue;
-        if ((flags & CH_UPDATE_REFS) &&
-            ascii_strncasecmp ("References:", buf, 11) == 0)
-          continue;
-        if ((flags & CH_UPDATE_IRT) &&
-            ascii_strncasecmp ("In-Reply-To:", buf, 12) == 0)
-          continue;
+        switch (mime_which_token(buf, (strchr(buf, ':') ?: buf) - buf)) {
+          case MIME_STATUS:
+          case MIME_X_STATUS:
+            if (flags & (CH_UPDATE | CH_XMIT | CH_NOSTATUS))
+              continue;
+            break;
+
+          case MIME_CONTENT_LENGTH:
+          case MIME_LINES:
+            if (flags & (CH_UPDATE_LEN | CH_XMIT | CH_NOLEN))
+              continue;
+            break;
+
+          case MIME_REFERENCES:
+            if (flags & CH_UPDATE_REFS)
+              continue;
+            break;
+
+          case MIME_IN_REPLY_TO:
+            if (flags & CH_UPDATE_IRT)
+              continue;
+            break;
+
+          default:
+            break;
+        }
         ignore = 0;
       }
 
@@ -162,34 +174,49 @@ 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) &&
-          string_list_contains(Ignore, buf, "*") &&
-          !string_list_contains(UnIgnore, buf, "*"))
-        continue;
-      if ((flags & CH_WEED_DELIVERED) &&
-          ascii_strncasecmp ("Delivered-To:", buf, 13) == 0)
-        continue;
-      if ((flags & (CH_UPDATE | CH_XMIT | CH_NOSTATUS)) &&
-          (ascii_strncasecmp ("Status:", buf, 7) == 0 ||
-           ascii_strncasecmp ("X-Status:", buf, 9) == 0))
-        continue;
-      if ((flags & (CH_UPDATE_LEN | CH_XMIT | CH_NOLEN)) &&
-          (ascii_strncasecmp ("Content-Length:", buf, 15) == 0 ||
-           ascii_strncasecmp ("Lines:", buf, 6) == 0))
-        continue;
-      if ((flags & CH_MIME) &&
-          ((ascii_strncasecmp ("content-", buf, 8) == 0 &&
-            (ascii_strncasecmp ("transfer-encoding:", buf + 8, 18) == 0 ||
-             ascii_strncasecmp ("type:", buf + 8, 5) == 0)) ||
-           ascii_strncasecmp ("mime-version:", buf, 13) == 0))
-        continue;
-      if ((flags & CH_UPDATE_REFS) &&
-          ascii_strncasecmp ("References:", buf, 11) == 0)
-        continue;
-      if ((flags & CH_UPDATE_IRT) &&
-          ascii_strncasecmp ("In-Reply-To:", buf, 12) == 0)
+          (flags & CH_WEED) && string_list_contains(Ignore, buf, "*")
+          && !string_list_contains(UnIgnore, buf, "*"))
         continue;
 
+      switch (mime_which_token(buf, (strchr(buf, ':') ?: buf) - buf)) {
+        case MIME_DELIVERED_TO:
+          if (flags & CH_WEED_DELIVERED)
+            continue;
+          break;
+
+        case MIME_STATUS:
+        case MIME_X_STATUS:
+          if (flags & (CH_UPDATE | CH_XMIT | CH_NOSTATUS))
+            continue;
+          break;
+
+        case MIME_CONTENT_LENGTH:
+        case MIME_LINES:
+          if (flags & (CH_UPDATE_LEN | CH_XMIT | CH_NOLEN))
+            continue;
+          break;
+
+        case MIME_CONTENT_TRANSFER_ENCODING:
+        case MIME_CONTENT_TYPE:
+        case MIME_MIME_VERSION:
+          if (flags & CH_MIME)
+            continue;
+          break;
+
+        case MIME_REFERENCES:
+          if (flags & CH_UPDATE_REFS)
+            continue;
+          break;
+
+        case MIME_IN_REPLY_TO:
+          if (flags & CH_UPDATE_IRT)
+            continue;
+          break;
+
+        default:
+          break;
+      }
+
       /* Find x -- the array entry where this header is to be saved */
       if (flags & CH_REORDER) {
         for (t = HeaderOrderList, x = 0; (t); t = t->next, x++) {
@@ -334,7 +361,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);
-    charset_canonicalize(chsbuf, sizeof (chsbuf), Charset);
+    charset_canonicalize(chsbuf, sizeof (chsbuf), mod_cset.charset);
     rfc822_strcpy(buffer, sizeof(buffer), chsbuf, MimeSpecials);
     fputs (buffer, out);
     fputc ('\n', out);
@@ -424,7 +451,7 @@ mutt_copy_header (FILE * in, HEADER * h, FILE * out, int flags,
   }
 
   if (flags & CH_UPDATE_LEN && (flags & CH_NOLEN) == 0) {
-    fprintf (out, "Content-Length: %lld\n", h->content->length);
+    fprintf (out, "Content-Length: %zu\n", h->content->length);
     if (h->lines != 0 || h->content->length == 0)
       fprintf (out, "Lines: %d\n", h->lines);
   }
@@ -528,7 +555,7 @@ _mutt_copy_message (FILE * fpout, FILE * fpin, HEADER * hdr, BODY * body,
       if (mutt_copy_header (fpin, hdr, fpout,
                             chflags | CH_NOLEN | CH_NONEWLINE, NULL))
         return -1;
-      fprintf (fpout, "Content-Length: %lld\n", new_length);
+      fprintf (fpout, "Content-Length: %zu\n", new_length);
       if (new_lines <= 0)
         new_lines = 0;
       else
@@ -658,12 +685,12 @@ mutt_copy_message (FILE * fpout, CONTEXT * src, HEADER * hdr, int flags,
   MESSAGE *msg;
   int r;
 
-  if ((msg = mx_open_message (src, hdr->msgno)) == NULL)
+  if (!(msg = mx_open_message (src, hdr->msgno)))
     return -1;
-  if ((r =
-       _mutt_copy_message (fpout, msg->fp, hdr, hdr->content, flags,
-                           chflags)) == 0 && (ferror (fpout)
-                                              || feof (fpout))) {
+
+  r = _mutt_copy_message(fpout, msg->fp, hdr, hdr->content, flags,
+                         chflags);
+  if (!r && (ferror(fpout) || feof (fpout))) {
     r = -1;
   }
   mx_close_message (&msg);
@@ -693,7 +720,7 @@ _mutt_append_message (CONTEXT * dest, FILE * fpin, CONTEXT * src __attribute__ (
     return (-1);
   if ((msg = mx_open_new_message (dest, hdr, is_from (buf, NULL, 0, NULL) ? 0 : M_ADD_FROM)) == NULL)
     return (-1);
-  if (dest->magic == M_MBOX || dest->magic == M_MMDF)
+  if (dest->magic == M_MBOX)
     chflags |= CH_FROM | CH_FORCE_FROM;
   chflags |= (dest->magic == M_MAILDIR ? CH_NOSTATUS : CH_UPDATE);
   r = _mutt_copy_message (msg->fp, fpin, hdr, body, flags, chflags);
@@ -741,7 +768,7 @@ static int copy_delete_attach (BODY * b, FILE * fpin, FILE * fpout,
       if (part->deleted) {
         fprintf (fpout,
                  "Content-Type: message/external-body; access-type=x-mutt-deleted;\n"
-                 "\texpiration=%s; length=%lld\n"
+                 "\texpiration=%s; length=%zu\n"
                  "\n", date + 5, part->length);
         if (ferror (fpout))
           return -1;
@@ -851,7 +878,7 @@ static int address_header_decode(char **h)
         return 0;
     }
 
-    a = rfc822_parse_adrlist(a, p);
+    a = rfc822_parse_adrlist(NULL, p);
     if (!a)
         return 0;