Simplications go on.
[apps/madmutt.git] / url.c
diff --git a/url.c b/url.c
index 405ed23..39bbec8 100644 (file)
--- a/url.c
+++ b/url.c
 # include "config.h"
 #endif
 
+#include <lib-lib/mem.h>
+#include <lib-lib/ascii.h>
+#include <lib-lib/mapping.h>
+
+#include <lib-mime/mime.h>
+
 #include "mutt.h"
-#include "mapping.h"
 #include "url.h"
 
-#include "mime.h"
 
 #include <ctype.h>
 
@@ -30,6 +34,7 @@ static struct mapping_t UrlMap[] = {
   {"pop", U_POP},
   {"pops", U_POPS},
   {"nntp", U_NNTP},
+  {"news", U_NNTP},
   {"nntps", U_NNTPS},
   {"snews", U_NNTPS},
   {"mailto", U_MAILTO},
@@ -45,10 +50,7 @@ static void url_pct_decode (char *s)
     return;
 
   for (d = s; *s; s++) {
-    if (*s == '%' && s[1] && s[2] &&
-        isxdigit ((unsigned char) s[1]) &&
-        isxdigit ((unsigned char) s[2]) &&
-        hexval (s[1]) >= 0 && hexval (s[2]) >= 0) {
+    if (*s == '%' && hexval (s[1]) >= 0 && hexval (s[2]) >= 0) {
       *d++ = (hexval (s[1]) << 4) | (hexval (s[2]));
       s += 2;
     }
@@ -69,7 +71,7 @@ url_scheme_t url_check_scheme (const char *s)
   if ((t - s) + 1 >= sizeof (sbuf))
     return U_UNKNOWN;
 
-  strfcpy (sbuf, s, t - s + 1);
+  m_strcpy(sbuf, t - s + 1, s);
   for (t = sbuf; *t; t++)
     *t = ascii_tolower (*t);
 
@@ -86,7 +88,7 @@ int url_parse_file (char *d, const char *src, size_t dl)
   else if (!ascii_strncasecmp (src, "file://", 7))      /* we don't support remote files */
     return -1;
   else
-    strfcpy (d, src + 5, dl);
+    m_strcpy(d, dl, src + 5);
 
   url_pct_decode (d);
   return 0;
@@ -169,8 +171,8 @@ int url_ciss_tostring (ciss_url_t * ciss, char *dest, size_t len, int flags)
   snprintf (dest, len, "%s:", mutt_getnamebyvalue (ciss->scheme, UrlMap));
 
   if (ciss->host) {
-    safe_strcat (dest, len, "//");
-    len -= (l = mutt_strlen (dest));
+    m_strcat(dest, len, "//");
+    len -= (l = m_strlen(dest));
     dest += l;
 
     if (ciss->user) {
@@ -179,7 +181,7 @@ int url_ciss_tostring (ciss_url_t * ciss, char *dest, size_t len, int flags)
       else
         snprintf (dest, len, "%s@", ciss->user);
 
-      len -= (l = mutt_strlen (dest));
+      len -= (l = m_strlen(dest));
       dest += l;
     }
 
@@ -190,7 +192,7 @@ int url_ciss_tostring (ciss_url_t * ciss, char *dest, size_t len, int flags)
   }
 
   if (ciss->path)
-    safe_strcat (dest, len, ciss->path);
+    m_strcat(dest, len, ciss->path);
 
   return 0;
 }
@@ -205,12 +207,12 @@ int url_parse_mailto (ENVELOPE * e, char **body, const char *src)
 
   int taglen;
 
-  LIST *last = NULL;
+  LIST **last = &e->userhdrs;
 
   if (!(t = strchr (src, ':')))
     return -1;
 
-  if ((tmp = safe_strdup (t + 1)) == NULL)
+  if ((tmp = m_strdup(t + 1)) == NULL)
     return -1;
 
   if ((headers = strchr (tmp, '?')))
@@ -232,19 +234,26 @@ int url_parse_mailto (ENVELOPE * e, char **body, const char *src)
 
     if (!ascii_strcasecmp (tag, "body")) {
       if (body)
-        mutt_str_replace (body, value);
+        m_strreplace(body, value);
     }
     else {
-      taglen = mutt_strlen (tag);
+#define SAFEPFX (option (OPTSTRICTMAILTO) ? "" : "X-Mailto-")
+      taglen = m_strlen(tag) + m_strlen(SAFEPFX);
       /* mutt_parse_rfc822_line makes some assumptions */
-      snprintf (scratch, sizeof (scratch), "%s: %s", tag, value);
+      snprintf (scratch, sizeof (scratch), "%s%s: %s", SAFEPFX, tag, value);
+#undef SAVEPFX
       scratch[taglen] = '\0';
-      value = &scratch[taglen + 1];
-      SKIPWS (value);
-      mutt_parse_rfc822_line (e, NULL, scratch, value, 1, 0, 0, &last);
+      value = vskipspaces(&scratch[taglen + 1]);
+      last = mutt_parse_rfc822_line (e, NULL, scratch, value, 0, 0, last);
+      /* if $strict_mailto is set, force editing headers to let
+       * users have a look at what we got */
+      if (!option (OPTSTRICTMAILTO)) {
+        set_option (OPTXMAILTO);
+        set_option (OPTEDITHDRS);
+      }
     }
   }
 
-  FREE (&tmp);
+  p_delete(&tmp);
   return 0;
 }