Import madtty, use it to deal with colors from now on as it needs to know what is...
[apps/madmutt.git] / copy.c
diff --git a/copy.c b/copy.c
index 0c5f8b4..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) &&
-          mutt_matches_ignore (buf, Ignore) &&
-          !mutt_matches_ignore (buf, UnIgnore))
-        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++) {
@@ -318,7 +345,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) |
@@ -329,12 +356,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);
-    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);
   }
@@ -494,7 +521,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;
@@ -514,7 +541,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] = '\"';
@@ -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;
@@ -794,7 +821,7 @@ 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);
@@ -826,85 +853,42 @@ static void format_address_header (char **h, address_t * a)
   m_strcat(*h, buflen, "\n");
 }
 
-static int address_header_decode (char **h)
+static int address_header_decode(char **h)
 {
-  char *s = *h;
-  int l;
+    address_t *a;
+    char *p, *s = *h;
 
-  address_t *a = NULL;
+    p = strchr(s, ':');
+    if (!p)
+        return 0;
 
-  switch (tolower ((unsigned char) *s)) {
-  case 'r':
-    {
-      if (ascii_strncasecmp (s, "return-path:", 12) == 0) {
-        l = 12;
-        break;
-      }
-      else if (ascii_strncasecmp (s, "reply-to:", 9) == 0) {
-        l = 9;
+    switch (mime_which_token(s, p - s)) {
+      case MIME_RETURN_PATH:
+      case MIME_REPLY_TO:
+      case MIME_FROM:
+      case MIME_CC:
+      case MIME_BCC:
+      case MIME_SENDER:
+      case MIME_TO:
+      case MIME_MAIL_FOLLOWUP_TO:
+        p++;
         break;
-      }
-      return 0;
-    }
-  case 'f':
-    {
-      if (ascii_strncasecmp (s, "from:", 5))
-        return 0;
-      l = 5;
-      break;
-    }
-  case 'c':
-    {
-      if (ascii_strncasecmp (s, "cc:", 3))
-        return 0;
-      l = 3;
-      break;
 
-    }
-  case 'b':
-    {
-      if (ascii_strncasecmp (s, "bcc:", 4))
+      default:
         return 0;
-      l = 4;
-      break;
-    }
-  case 's':
-    {
-      if (ascii_strncasecmp (s, "sender:", 7))
-        return 0;
-      l = 7;
-      break;
     }
-  case 't':
-    {
-      if (ascii_strncasecmp (s, "to:", 3))
-        return 0;
-      l = 3;
-      break;
-    }
-  case 'm':
-    {
-      if (ascii_strncasecmp (s, "mail-followup-to:", 17))
-        return 0;
-      l = 17;
-      break;
-    }
-  default:
-    return 0;
-  }
 
-  if ((a = rfc822_parse_adrlist (a, s + l)) == NULL)
-    return 0;
-
-  mutt_addrlist_to_local (a);
-  rfc2047_decode_adrlist (a);
-
-  *h = p_dupstr(s, l + 1);
+    a = rfc822_parse_adrlist(NULL, p);
+    if (!a)
+        return 0;
 
-  format_address_header (h, a);
+    mutt_addrlist_to_local(a);
+    rfc2047_decode_adrlist(a);
 
-  address_list_wipe(&a);
+    *h = p_dupstr(s, p - s);
+    format_address_header(h, a);
+    address_list_wipe(&a);
 
-  p_delete(&s);
-  return 1;
+    p_delete(&s);
+    return 1;
 }