Rocco Rutte:
[apps/madmutt.git] / muttlib.c
index ca6ddb7..9a781dd 100644 (file)
--- a/muttlib.c
+++ b/muttlib.c
@@ -22,6 +22,7 @@
 
 #ifdef USE_IMAP
 #include "imap.h"
+#include "imap/mx_imap.h"
 #endif
 
 #include "mutt_crypt.h"
@@ -29,6 +30,7 @@
 #include "lib/mem.h"
 #include "lib/intl.h"
 #include "lib/str.h"
+#include "lib/debug.h"
 
 #include <string.h>
 #include <ctype.h>
@@ -84,7 +86,7 @@ void mutt_adv_mktemp (char *s, size_t l)
     mktemp (s);
     if (period != NULL) {
       *period = '.';
-      sl = safe_strlen (s);
+      sl = mutt_strlen (s);
       strfcpy (s + sl, period, l - sl);
     }
   }
@@ -169,13 +171,11 @@ void mutt_free_body (BODY ** p)
     if (b->parameter)
       mutt_free_parameter (&b->parameter);
     if (b->unlink && b->filename) {
-      dprint (1, (debugfile, "mutt_free_body: Unlinking %s.\n", b->filename));
+      debug_print (1, ("unlinking %s.\n", b->filename));
       unlink (b->filename);
     }
     else if (b->filename)
-      dprint (1,
-              (debugfile, "mutt_free_body: Not unlinking %s.\n",
-               b->filename));
+      debug_print (1, ("not unlinking %s.\n", b->filename));
 
     FREE (&b->filename);
     FREE (&b->content);
@@ -276,7 +276,7 @@ void mutt_free_header (HEADER ** h)
 int mutt_matches_ignore (const char *s, LIST * t)
 {
   for (; t; t = t->next) {
-    if (!ascii_strncasecmp (s, t->data, safe_strlen (t->data))
+    if (!ascii_strncasecmp (s, t->data, mutt_strlen (t->data))
         || *t->data == '*')
       return 1;
   }
@@ -362,10 +362,9 @@ char *_mutt_expand_path (char *s, size_t slen, int rx)
     case '+':
       {
 #ifdef USE_IMAP
-        /* if folder = {host} or imap[s]://host/: don't append slash */
-        if (mx_is_imap (NONULL (Maildir)) &&
-            (Maildir[safe_strlen (Maildir) - 1] == '}' ||
-             Maildir[safe_strlen (Maildir) - 1] == '/'))
+        /* if folder = imap[s]://host/: don't append slash */
+        if (imap_is_magic (NONULL (Maildir), NULL) == M_IMAP && 
+            Maildir[mutt_strlen (Maildir) - 1] == '/')
           strfcpy (p, NONULL (Maildir), sizeof (p));
         else
 #endif
@@ -457,13 +456,6 @@ char *_mutt_expand_path (char *s, size_t slen, int rx)
   }
   while (recurse);
 
-#ifdef USE_IMAP
-  /* Rewrite IMAP path in canonical form - aids in string comparisons of
-   * folders. May possibly fail, in which case s should be the same. */
-  if (mx_is_imap (s))
-    imap_expand_path (s, slen);
-#endif
-
   return (s);
 }
 
@@ -497,7 +489,7 @@ char *mutt_gecos_name (char *dest, size_t destlen, struct passwd *pw)
   else
     strfcpy (dest, pw->pw_gecos, destlen);
 
-  pwnl = safe_strlen (pw->pw_name);
+  pwnl = mutt_strlen (pw->pw_name);
 
   for (idx = 0; dest[idx]; idx++) {
     if (dest[idx] == '&') {
@@ -645,12 +637,53 @@ void mutt_free_envelope (ENVELOPE ** p)
   FREE (p);
 }
 
+/* move all the headers from extra not present in base into base */
+void mutt_merge_envelopes(ENVELOPE* base, ENVELOPE** extra)
+{
+  /* copies each existing element if necessary, and sets the element
+  * to NULL in the source so that mutt_free_envelope doesn't leave us
+  * with dangling pointers. */
+#define MOVE_ELEM(h) if (!base->h) { base->h = (*extra)->h; (*extra)->h = NULL; }
+  MOVE_ELEM(return_path);
+  MOVE_ELEM(from);
+  MOVE_ELEM(to);
+  MOVE_ELEM(cc);
+  MOVE_ELEM(bcc);
+  MOVE_ELEM(sender);
+  MOVE_ELEM(reply_to);
+  MOVE_ELEM(mail_followup_to);
+  MOVE_ELEM(list_post);
+  MOVE_ELEM(message_id);
+  MOVE_ELEM(supersedes);
+  MOVE_ELEM(date);
+  MOVE_ELEM(x_label);
+  MOVE_ELEM(references);
+  MOVE_ELEM(in_reply_to);
+  /* real_subj is subordinate to subject */
+  if (!base->subject) {
+    base->subject = (*extra)->subject;
+    base->real_subj = (*extra)->real_subj;
+    (*extra)->subject = NULL;
+    (*extra)->real_subj = NULL;
+  }
+  /* spam and user headers should never be hashed, and the new envelope may
+   * have better values. Use new versions regardless. */
+  mutt_buffer_free (&base->spam);
+  mutt_free_list (&base->userhdrs);
+  MOVE_ELEM(spam);
+  MOVE_ELEM(userhdrs);
+#undef MOVE_ELEM
+  
+  mutt_free_envelope(extra);
+}
+
 void _mutt_mktemp (char *s, const char *src, int line)
 {
-  snprintf (s, _POSIX_PATH_MAX, "%s/muttng-%s-%d-%d-%d", NONULL (Tempdir),
-            NONULL (Hostname), (int) getuid (), (int) getpid (), Counter++);
-  dprint (1,
-          (debugfile, "%s:%d: mutt_mktemp returns \"%s\".\n", src, line, s));
+
+  snprintf (s, _POSIX_PATH_MAX, "%s/muttng-%s-%d-%d-%d-%x%x", NONULL (Tempdir),
+            NONULL (Hostname), (int) getuid (), (int) getpid (), Counter++, 
+            (unsigned int) rand(), (unsigned int) rand());
+  debug_print (1, ("%s:%d: mutt_mktemp returns \"%s\".\n", src, line, s));
   unlink (s);
 }
 
@@ -708,15 +741,15 @@ void mutt_pretty_mailbox (char *s)
   }
   *q = 0;
 
-  if (safe_strncmp (s, Maildir, (len = safe_strlen (Maildir))) == 0 &&
+  if (safe_strncmp (s, Maildir, (len = mutt_strlen (Maildir))) == 0 &&
       s[len] == '/') {
     *s++ = '=';
-    memmove (s, s + len, safe_strlen (s + len) + 1);
+    memmove (s, s + len, mutt_strlen (s + len) + 1);
   }
-  else if (safe_strncmp (s, Homedir, (len = safe_strlen (Homedir))) == 0 &&
+  else if (safe_strncmp (s, Homedir, (len = mutt_strlen (Homedir))) == 0 &&
            s[len] == '/') {
     *s++ = '~';
-    memmove (s, s + len - 1, safe_strlen (s + len - 1) + 1);
+    memmove (s, s + len - 1, mutt_strlen (s + len - 1) + 1);
   }
 }
 
@@ -756,7 +789,7 @@ void mutt_expand_fmt (char *dest, size_t destlen, const char *fmt,
   size_t slen;
   int found = 0;
 
-  slen = safe_strlen (src);
+  slen = mutt_strlen (src);
   destlen--;
 
   for (p = fmt, d = dest; destlen && *p; p++) {
@@ -908,7 +941,7 @@ int mutt_skipchars (const char *s, const char *c)
     ret++;
     s++;
   }
-  return (safe_strlen (p));
+  return (mutt_strlen (p));
 }
 
 void mutt_FormatString (char *dest,     /* output buffer */
@@ -1008,7 +1041,7 @@ void mutt_FormatString (char *dest,     /* output buffer */
         if (count > col) {
           count -= col;         /* how many columns left on this line */
           mutt_FormatString (buf, sizeof (buf), src, callback, data, flags);
-          wid = safe_strlen (buf);
+          wid = mutt_strlen (buf);
           if (count > wid) {
             count -= wid;       /* how many chars to pad */
             memset (wptr, ch, count);
@@ -1066,7 +1099,7 @@ void mutt_FormatString (char *dest,     /* output buffer */
               *p = '_';
         }
 
-        if ((len = safe_strlen (buf)) + wlen > destlen)
+        if ((len = mutt_strlen (buf)) + wlen > destlen)
           len = (destlen - wlen > 0) ? (destlen - wlen) : 0;
 
         memcpy (wptr, buf, len);
@@ -1137,7 +1170,7 @@ FILE *mutt_open_read (const char *path, pid_t * thepid)
   FILE *f;
   struct stat s;
 
-  int len = safe_strlen (path);
+  int len = mutt_strlen (path);
 
   if (path[len - 1] == '|') {
     /* read from a pipe */
@@ -1195,7 +1228,7 @@ int mutt_save_confirm (const char *s, struct stat *st)
     }
 
     if (option (OPTCONFIRMAPPEND) &&
-        (!TrashPath || (safe_strcmp (s, TrashPath) != 0)))
+        (!TrashPath || (mutt_strcmp (s, TrashPath) != 0)))
       /* if we're appending to the trash, there's no point in asking */
     {
       snprintf (tmp, sizeof (tmp), _("Append messages to %s?"), s);
@@ -1238,7 +1271,7 @@ void state_prefix_putc (char c, STATE * s)
   if (s->flags & M_PENDINGPREFIX) {
     int i;
 
-    i = safe_strlen (Quotebuf);
+    i = mutt_strlen (Quotebuf);
     Quotebuf[i++] = c;
     Quotebuf[i] = '\0';
     if (i == sizeof (Quotebuf) - 1 || c == '\n') {
@@ -1292,7 +1325,7 @@ int state_printf (STATE * s, const char *fmt, ...)
 
 void state_mark_attach (STATE * s)
 {
-  if ((s->flags & M_DISPLAY) && !safe_strcmp (Pager, "builtin"))
+  if ((s->flags & M_DISPLAY) && !mutt_strcmp (Pager, "builtin"))
     state_puts (AttachmentMarker, s);
 }
 
@@ -1360,14 +1393,14 @@ BUFFER *mutt_buffer_from (BUFFER * b, char *seed)
 
   b = mutt_buffer_init (b);
   b->data = safe_strdup (seed);
-  b->dsize = safe_strlen (seed);
+  b->dsize = mutt_strlen (seed);
   b->dptr = (char *) b->data + b->dsize;
   return b;
 }
 
 void mutt_buffer_addstr (BUFFER * buf, const char *s)
 {
-  mutt_buffer_add (buf, s, safe_strlen (s));
+  mutt_buffer_add (buf, s, mutt_strlen (s));
 }
 
 void mutt_buffer_addch (BUFFER * buf, char c)
@@ -1431,7 +1464,7 @@ const char *mutt_make_version (void)
 {
   static char vstring[STRING];
 
-  snprintf (vstring, sizeof (vstring), "Mutt-ng %s (%s)",
+  snprintf (vstring, sizeof (vstring), "Mutt-ng %s (%s) based on Mutt 1.5.9",
             MUTT_VERSION, ReleaseDate);
   return vstring;
 }
@@ -1474,12 +1507,7 @@ int mutt_match_spam_list (const char *s, SPAM_LIST * l, char *text, int x)
     if (regexec
         (l->rx->rx, s, (size_t) l->nmatch, (regmatch_t *) pmatch,
          (int) 0) == 0) {
-      dprint (5,
-              (debugfile, "mutt_match_spam_list: %s matches %s\n", s,
-               l->rx->pattern));
-      dprint (5,
-              (debugfile, "mutt_match_spam_list: %d subs\n",
-               l->rx->rx->re_nsub));
+      debug_print (5, ("%s matches %s\n%d subst", s, l->rx->pattern, l->rx->rx->re_nsub));
 
       /* Copy template into text, with substitutions. */
       for (p = l->template; *p;) {
@@ -1495,7 +1523,7 @@ int mutt_match_spam_list (const char *s, SPAM_LIST * l, char *text, int x)
         }
       }
       text[tlen] = '\0';
-      dprint (5, (debugfile, "mutt_match_spam_list: \"%s\"\n", text));
+      debug_print (5, ("\"%s\"\n", text));
       return 1;
     }
   }