simplify some mime things
[apps/madmutt.git] / lib-mime / rfc822parse.c
index 3eafd9e..fa0beaa 100644 (file)
  * please see the file GPL in the top level source directory.
  */
 
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-
-#include <lib-lib/mem.h>
-#include <lib-lib/str.h>
-#include <lib-lib/ascii.h>
-#include <lib-lib/macros.h>
-#include <lib-lib/buffer.h>
-#include <lib-lib/date.h>
-#include <lib-lib/url.h>
+#include <lib-lib/lib-lib.h>
 
 #include "recvattach.h"
-
 #include "charset.h"
 #include "mime.h"
 
@@ -129,8 +116,8 @@ string_list_t *mutt_parse_references(char *s, int in_reply_to)
                 o = NULL;
             } else {
                 new = p_new(char, n + m + 1);
-                strcpy(new, o);
-                strcpy(new + n, s);
+                m_strcpy(new, n + m + 1, o);
+                m_strcpy(new + n, m + 1, s);
             }
         }
 
@@ -201,14 +188,14 @@ int mutt_check_mime_type(const char *s)
     }
 }
 
-static PARAMETER *parse_parameters(const char *s)
+static parameter_t *parse_parameters(const char *s)
 {
-    PARAMETER *res = NULL;
-    PARAMETER **list = &res;
+    parameter_t *res = NULL;
+    parameter_t **list = &res;
 
     while (*s) {
         const char *p;
-        PARAMETER *new;
+        parameter_t *new;
         int i;
 
         s = skipspaces(s);
@@ -240,12 +227,10 @@ static PARAMETER *parse_parameters(const char *s)
 
             s++;
             for (i = 0; *s && i < ssizeof(buffer) - 1; i++, s++) {
-                if (!option(OPTSTRICTMIME)) {
-                    /* As iso-2022-* has a characer of '"' with non-ascii state,
-                     * ignore it. */
-                    if (*s == 0x1b && i < ssizeof(buffer) - 2) {
-                        state_ascii = s[1] == '(' && (s[2] == 'B' || s[2] == 'J');
-                    }
+                /* As iso-2022-* has a characer of '"' with non-ascii state,
+                 * ignore it. */
+                if (*s == 0x1b && i < ssizeof(buffer) - 2) {
+                    state_ascii = s[1] == '(' && (s[2] == 'B' || s[2] == 'J');
                 }
                 if (state_ascii && *s == '"')
                     break;
@@ -291,7 +276,7 @@ void mutt_parse_content_type(char *s, BODY *ct)
         /* Some pre-RFC1521 gateways still use the "name=filename" convention,
          * but if a filename has already been set in the content-disposition,
          * let that take precedence, and don't set it here */
-        pc = mutt_get_parameter("name", ct->parameter);
+        pc = parameter_getval(ct->parameter, "name");
         if (pc && !ct->filename)
             ct->filename = m_strdup(pc);
     }
@@ -315,7 +300,7 @@ void mutt_parse_content_type(char *s, BODY *ct)
          * field, so we can attempt to convert the type to BODY here.
          */
         switch (ct->type) {
-            char buffer[SHORT_STRING];
+            char buffer[STRING];
 
           case TYPETEXT:
             ct->subtype = m_strdup("plain");
@@ -343,17 +328,15 @@ void mutt_parse_content_type(char *s, BODY *ct)
 
     /* Default character set for text types. */
     if (ct->type == TYPETEXT) {
-        pc = mutt_get_parameter("charset", ct->parameter);
+        pc = parameter_getval(ct->parameter, "charset");
         if (!pc) {
-            mutt_set_parameter("charset",
-                               option(OPTSTRICTMIME) ? "us-ascii" :
-                               charset_getfirst(AssumedCharset),
-                               &ct->parameter);
+            parameter_setval(&ct->parameter, "charset",
+                             charset_getfirst(MCharset.assumed_charset));
         }
     }
 }
 
-static void parse_content_disposition(char *s, BODY *ct)
+static void parse_content_disposition(const char *s, BODY *ct)
 {
     if (!ascii_strncasecmp(s, "inline", 6)) {
         ct->disposition = DISPINLINE;
@@ -365,11 +348,11 @@ static void parse_content_disposition(char *s, BODY *ct)
 
     /* Check to see if a default filename was given */
     if ((s = strchr (s, ';'))) {
-        PARAMETER *parms = parse_parameters(vskipspaces(s));
+        parameter_t *parms = parse_parameters(vskipspaces(s));
 
-        if ((s = mutt_get_parameter("filename", parms)))
+        if ((s = parameter_getval(parms, "filename")))
             m_strreplace(&ct->filename, s);
-        if ((s = mutt_get_parameter ("name", parms)))
+        if ((s = parameter_getval(parms, "name")))
             ct->form_name = m_strdup(s);
 
         parameter_list_wipe(&parms);
@@ -384,7 +367,7 @@ static void parse_content_disposition(char *s, BODY *ct)
  */
 BODY *mutt_read_mime_header(FILE *fp, int digest)
 {
-    BODY *body = mutt_new_body ();
+    BODY *body = body_new();
     char *line = p_new(char, LONG_STRING);
     ssize_t linelen = LONG_STRING;
     char *p;
@@ -445,7 +428,7 @@ void mutt_parse_part(FILE *fp, BODY *b)
 
     switch (b->type) {
       case TYPEMULTIPART:
-        bound = mutt_get_parameter("boundary", b->parameter);
+        bound = parameter_getval(b->parameter, "boundary");
         fseeko(fp, b->offset, SEEK_SET);
         b->parts = mutt_parse_multipart(fp, bound, b->offset + b->length,
                                         mime_which_token(b->subtype, -1) == MIME_DIGEST);
@@ -455,7 +438,7 @@ void mutt_parse_part(FILE *fp, BODY *b)
         if (b->subtype) {
             fseeko(fp, b->offset, SEEK_SET);
 
-            if (mutt_is_message_type(b->type, b->subtype)) {
+            if (mutt_is_message_type(b)) {
                 b->parts = mutt_parse_messageRFC822(fp, b);
             } else
             if (mime_which_token(b->subtype, -1) == MIME_EXTERNAL_BODY) {
@@ -573,7 +556,7 @@ mutt_parse_multipart(FILE *fp, const char *bound, off_t end_off, int digest)
                  */
 
                 if (new->offset > end_off) {
-                    mutt_free_body(&new);
+                    body_list_wipe(&new);
                     break;
                 }
 
@@ -625,7 +608,7 @@ uncomment_timezone(char *buf, size_t buflen, const char *tz)
 time_t mutt_parse_date(const char *s, HEADER *h)
 {
     int zhours = 0, zminutes = 0, zoccident = 0;
-    char scratch[SHORT_STRING];
+    char scratch[STRING];
     struct tm tm;
     int count = 0;
     char *p;
@@ -642,7 +625,7 @@ time_t mutt_parse_date(const char *s, HEADER *h)
     p_clear(&tm, 1);
 
     while ((p = strtok (p, " \t")) != NULL) {
-        char tzstr[SHORT_STRING];
+        char tzstr[STRING];
         const char *ptz;
 
         switch (count) {
@@ -812,7 +795,7 @@ string_list_t **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, cha
 
       case MIME_LIST_POST:
         /* RFC 2369.  FIXME: We should ignore whitespace, but don't. */
-        if (strncmp(p, "NO", 2)) {
+        if (m_strncmp(p, "NO", 2)) {
             char *beg, *end;
 
             for (beg = strchr (p, '<'); beg; beg = strchr (end, ',')) {
@@ -974,8 +957,8 @@ string_list_t **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, cha
         /* restore the original line */
         line[m_strlen(line)] = ':';
 
-        if (weed && option(OPTWEED) && mutt_matches_ignore(line, Ignore)
-        && !mutt_matches_ignore(line, UnIgnore)) {
+        if (weed && string_list_contains(Ignore, line, "*")
+        && !string_list_contains(UnIgnore, line, "*")) {
             break;
         }
 
@@ -1018,7 +1001,7 @@ mutt_read_rfc822_header(FILE *f, HEADER *hdr, short user_hdrs, short weed)
     off_t loc;
 
     if (hdr && !hdr->content) {
-        hdr->content = mutt_new_body ();
+        hdr->content = body_new();
 
         /* set the defaults from RFC1521 */
         hdr->content->type     = TYPETEXT;
@@ -1038,46 +1021,29 @@ mutt_read_rfc822_header(FILE *f, HEADER *hdr, short user_hdrs, short weed)
 
         p = strpbrk(line, ": \t");
         if (!p || *p != ':') {
-            char return_path[LONG_STRING];
-            time_t t;
-
             /* some bogus MTAs will quote the original "From " line */
-            if (!m_strncmp(">From ", line, 6))
+            if (!m_strncmp(">From ", line, 6) || !m_strncmp("From ", line, 5))
                 continue;               /* just ignore */
 
-            if (is_from(line, return_path, sizeof(return_path), &t)) {
-                /* MH somtimes has the From_ line in the middle of the header! */
-                if (hdr && !hdr->received)
-                    hdr->received = t - mutt_local_tz(t);
-                continue;
-            }
-
             fseeko(f, loc, 0);
             break;                    /* end of header */
         }
 
-        if (mutt_match_spam_list(line, SpamList, buf, sizeof(buf))) {
-            if (!rx_list_match(NoSpamList, line)) {
-                /* if spam tag already exists, figure out how to amend it */
-                if (e->spam && *buf) {
-                    if (SpamSep) {
-                        /* If SpamSep defined, append with separator */
-                        mutt_buffer_addstr(e->spam, SpamSep);
-                        mutt_buffer_addstr(e->spam, buf);
-                    } else {
-                        /* else overwrite */
-                        mutt_buffer_reset(e->spam);
-                        mutt_buffer_addstr(e->spam, buf);
-                    }
-                }
-                else if (!e->spam && *buf) {
-                    /* spam tag is new, and match expr is non-empty; copy */
-                    e->spam = mutt_buffer_from(NULL, buf);
-                }
-                else if (!e->spam) {
-                    /* match expr is empty; plug in null string if no existing tag */
-                    e->spam = mutt_buffer_from(NULL, "");
+        if (rx_list_match2(SpamList, line, buf, sizeof(buf))
+        && !rx_list_match(NoSpamList, line))
+        {
+            /* if spam tag already exists, figure out how to amend it */
+            if (e->spam && *buf) {
+                if (Mime.spam_separator) {
+                    mutt_buffer_addstr(e->spam, Mime.spam_separator);
+                } else {
+                    mutt_buffer_reset(e->spam);
                 }
+                mutt_buffer_addstr(e->spam, buf);
+            }
+
+            if (!e->spam) {
+                e->spam = mutt_buffer_from(NULL, buf);
             }
         }
 
@@ -1178,9 +1144,6 @@ static int count_body_parts (BODY *body, int flags)
 
 int mutt_count_body_parts(HEADER *hdr, int flags)
 {
-    if (!option(OPTCOUNTATTACH))
-        return 0;
-
     if (hdr->attach_valid && !(flags & M_PARTS_RECOUNT))
         return hdr->attach_total;