generalize the idea of tokens a bit more, don't restrict it to the rfc822
[apps/madmutt.git] / lib-mime / rfc822parse.c
index 70f405e..40414d9 100644 (file)
@@ -162,40 +162,44 @@ LIST *mutt_parse_references(char *s, int in_reply_to)
 
 int mutt_check_encoding(const char *s)
 {
-#define COMPARE(tok, value)                             \
-    if (!ascii_strncasecmp(tok, s, sizeof(tok) - 1)) {  \
-        return value;                                   \
+    int tok = mime_which_token(s, -1);
+    switch (tok) {
+      case MIME_7BIT:
+        return ENC7BIT;
+      case MIME_8BIT:
+        return ENC8BIT;
+      case MIME_BINARY:
+        return ENCBINARY;
+      case MIME_QUOTED_PRINTABLE:
+        return ENCQUOTEDPRINTABLE;
+      case MIME_BASE64:
+        return ENCBASE64;
+      case MIME_X_UUENCODE:
+        return ENCUUENCODED;
+      default:
+        return ENCOTHER;
     }
-    COMPARE("7bit", ENC7BIT);
-    COMPARE("8bit", ENC8BIT);
-    COMPARE("binary", ENCBINARY);
-    COMPARE("quoted-printable", ENCQUOTEDPRINTABLE);
-    COMPARE("base64", ENCBASE64);
-    COMPARE("x-uuencode", ENCUUENCODED);
-#undef COMPARE
-
-    return ENCOTHER;
 }
 
 int mutt_check_mime_type(const char *s)
 {
-#define COMPARE(tok, value)                             \
-    if (!ascii_strncasecmp(tok, s, sizeof(tok) - 1)) {  \
-        return value;                                   \
+    int tok;
+
+    if (!m_strcmp(s, "*") || !m_strcmp(s, ".*"))
+        return TYPEANY;
+
+    tok = mime_which_token(s, -1);
+    switch (tok) {
+      case MIME_TEXT:        return TYPETEXT;
+      case MIME_MULTIPART:   return TYPEMULTIPART;
+      case MIME_APPLICATION: return TYPEAPPLICATION;
+      case MIME_MESSAGE:     return TYPEMESSAGE;
+      case MIME_IMAGE:       return TYPEIMAGE;
+      case MIME_AUDIO:       return TYPEAUDIO;
+      case MIME_VIDEO:       return TYPEVIDEO;
+      case MIME_MODEL:       return TYPEMODEL;
+      default:               return TYPEOTHER;
     }
-  COMPARE("text", TYPETEXT);
-  COMPARE("multipart", TYPEMULTIPART);
-  COMPARE("application", TYPEAPPLICATION);
-  COMPARE("message", TYPEMESSAGE);
-  COMPARE("image", TYPEIMAGE);
-  COMPARE("audio", TYPEAUDIO);
-  COMPARE("video", TYPEVIDEO);
-  COMPARE("model", TYPEMODEL);
-  COMPARE("*",  TYPEANY);
-  COMPARE(".*", TYPEANY);
-#undef COMPARE
-
-  return TYPEOTHER;
 }
 
 static PARAMETER *parse_parameters(const char *s)
@@ -403,17 +407,25 @@ BODY *mutt_read_mime_header(FILE *fp, int digest)
             break;
         }
 
-        if (!ascii_strncasecmp(line, "content-", 8)) {
-            if (!ascii_strcasecmp("type", line + 8))
-                mutt_parse_content_type (p, body);
-            else if (!ascii_strcasecmp ("transfer-encoding", line + 8))
-                body->encoding = mutt_check_encoding (p);
-            else if (!ascii_strcasecmp ("disposition", line + 8))
-                parse_content_disposition(p, body);
-            else if (!ascii_strcasecmp ("description", line + 8)) {
-                m_strreplace(&body->description, p);
-                rfc2047_decode(&body->description);
-            }
+        switch (mime_which_token(line, -1)) {
+          case MIME_CONTENT_TYPE:
+            mutt_parse_content_type (p, body);
+            break;
+
+          case MIME_CONTENT_TRANSFER_ENCODING:
+            body->encoding = mutt_check_encoding (p);
+            break;
+
+          case MIME_CONTENT_DISPOSITION:
+            parse_content_disposition(p, body);
+            break;
+
+          case MIME_CONTENT_DESCRIPTION:
+            m_strreplace(&body->description, p);
+            rfc2047_decode(&body->description);
+            break;
+
+          default: break;
         }
     }
 
@@ -438,7 +450,7 @@ void mutt_parse_part(FILE *fp, BODY *b)
         bound = mutt_get_parameter("boundary", b->parameter);
         fseeko(fp, b->offset, SEEK_SET);
         b->parts = mutt_parse_multipart(fp, bound, b->offset + b->length,
-                           !ascii_strcasecmp("digest", b->subtype));
+                                        mime_which_token(b->subtype, -1) == MIME_DIGEST);
         break;
 
       case TYPEMESSAGE:
@@ -448,7 +460,7 @@ void mutt_parse_part(FILE *fp, BODY *b)
             if (mutt_is_message_type(b->type, b->subtype)) {
                 b->parts = mutt_parse_messageRFC822(fp, b);
             } else
-            if (!ascii_strcasecmp(b->subtype, "external-body") == 0) {
+            if (mime_which_token(b->subtype, -1) == MIME_EXTERNAL_BODY) {
                 b->parts = mutt_read_mime_header(fp, 0);
             } else {
                 return;
@@ -783,70 +795,68 @@ time_t mutt_parse_date(const char *s, HEADER *h)
     return mutt_mktime(&tm, 0) + (zoccident ? 1 : -1) * (zhours * 3600 + zminutes * 60);
 }
 
-#include "rfc822hdrs.h"
-
 LIST **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, char *p,
                               short weed, short do_2047, LIST **user_hdrs)
 {
-    switch (rfc822_well_known(line)) {
-      case HDR_APPARENTLY_FROM:
+    switch (mime_which_token(line, -1)) {
+      case MIME_APPARENTLY_FROM:
         e->from = rfc822_parse_adrlist (e->from, p);
         break;
 
-      case HDR_APPARENTLY_TO:
+      case MIME_APPARENTLY_TO:
         e->to = rfc822_parse_adrlist (e->to, p);
         break;
 
-      case HDR_BCC:
+      case MIME_BCC:
         e->bcc = rfc822_parse_adrlist (e->bcc, p);
         break;
 
-      case HDR_CC:
+      case MIME_CC:
         e->cc = rfc822_parse_adrlist (e->cc, p);
         break;
 
-      case HDR_CONTENT_DESCRIPTION:
+      case MIME_CONTENT_DESCRIPTION:
         if (hdr) {
             m_strreplace(&hdr->content->description, p);
             rfc2047_decode(&hdr->content->description);
         }
         break;
 
-      case HDR_CONTENT_DISPOSITION:
+      case MIME_CONTENT_DISPOSITION:
         if (hdr)
             parse_content_disposition(p, hdr->content);
         break;
 
-      case HDR_CONTENT_LENGTH:
+      case MIME_CONTENT_LENGTH:
         if (hdr) {
             if ((hdr->content->length = atoi(p)) < 0)
                 hdr->content->length = -1;
         }
         break;
 
-      case HDR_CONTENT_TRANSFER_ENCODING:
+      case MIME_CONTENT_TRANSFER_ENCODING:
         if (hdr)
             hdr->content->encoding = mutt_check_encoding(p);
         break;
 
-      case HDR_CONTENT_TYPE:
+      case MIME_CONTENT_TYPE:
         if (hdr)
             mutt_parse_content_type (p, hdr->content);
         break;
 
-      case HDR_DATE:
+      case MIME_DATE:
         m_strreplace(&e->date, p);
         if (hdr)
             hdr->date_sent = mutt_parse_date (p, hdr);
         break;
 
-      case HDR_EXPIRES:
+      case MIME_EXPIRES:
         if (hdr && mutt_parse_date (p, NULL) < time (NULL))
             hdr->expired = 1;
         break;
 
 #ifdef USE_NNTP
-      case HDR_FOLLOWUP_TO:
+      case MIME_FOLLOWUP_TO:
         if (!e->followup_to) {
             m_strrtrim(p);
             e->followup_to = m_strdup(skipspaces(p));
@@ -854,7 +864,7 @@ LIST **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, char *p,
         break;
 #endif
 
-      case HDR_FROM:
+      case MIME_FROM:
         e->from = rfc822_parse_adrlist(e->from, p);
         /* don't leave from info NULL if there's an invalid address (or
          * whatever) in From: field; mutt would just display it as empty
@@ -866,12 +876,12 @@ LIST **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, char *p,
         }
         break;
 
-      case HDR_IN_REPLY_TO:
+      case MIME_IN_REPLY_TO:
         mutt_free_list(&e->in_reply_to);
         e->in_reply_to = mutt_parse_references(p, 1);
         break;
 
-      case HDR_LINES:
+      case MIME_LINES:
         if (hdr) {
             /* HACK - mutt has, for a very short time, produced negative
                Lines header values.  Ignore them. */
@@ -879,7 +889,7 @@ LIST **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, char *p,
         }
         break;
 
-      case HDR_LIST_POST:
+      case MIME_LIST_POST:
         /* RFC 2369.  FIXME: We should ignore whitespace, but don't. */
         if (strncmp(p, "NO", 2)) {
             char *beg, *end;
@@ -899,16 +909,16 @@ LIST **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, char *p,
         }
         break;
 
-      case HDR_MAIL_FOLLOWUP_TO:
+      case MIME_MAIL_FOLLOWUP_TO:
         e->mail_followup_to = rfc822_parse_adrlist(e->mail_followup_to, p);
         break;
 
-      case HDR_MAIL_REPLY_TO:
+      case MIME_MAIL_REPLY_TO:
         address_delete (&e->reply_to);
         e->reply_to = rfc822_parse_adrlist(e->reply_to, p);
         break;
 
-      case HDR_MESSAGE_ID:
+      case MIME_MESSAGE_ID:
         {
             const char *beg, *end;
 
@@ -920,25 +930,25 @@ LIST **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, char *p,
         }
         break;
 
-      case HDR_MIME_VERSION:
+      case MIME_MIME_VERSION:
         if (hdr)
             hdr->mime = 1;
         break;
 
 #ifdef USE_NNTP
-      case HDR_NEWSGROUPS:
+      case MIME_NEWSGROUPS:
         p_delete(&e->newsgroups);
         m_strrtrim(p);
         e->newsgroups = m_strdup(skipspaces(p));
         break;
 #endif
 
-      case HDR_ORGANIZATION:
-        if (!e->organization && m_strcasecmp(p, "unknown"))
+      case MIME_ORGANIZATION:
+        if (!e->organization && mime_which_token(p, -1) == MIME_UNKNOWN)
             e->organization = m_strdup(p);
         break;
 
-      case HDR_RECEIVED:
+      case MIME_RECEIVED:
         if (hdr && !hdr->received) {
             char *d = strchr(p, ';');
             if (d)
@@ -946,24 +956,24 @@ LIST **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, char *p,
         }
         break;
 
-      case HDR_REFERENCES:
+      case MIME_REFERENCES:
         mutt_free_list(&e->references);
         e->references = mutt_parse_references(p, 0);
         break;
 
-      case HDR_REPLY_TO:
+      case MIME_REPLY_TO:
         e->reply_to = rfc822_parse_adrlist(e->reply_to, p);
         break;
 
-      case HDR_RETURN_PATH:
+      case MIME_RETURN_PATH:
         e->return_path = rfc822_parse_adrlist(e->return_path, p);
         break;
 
-      case HDR_SENDER:
+      case MIME_SENDER:
         e->sender = rfc822_parse_adrlist (e->sender, p);
         break;
 
-      case HDR_STATUS:
+      case MIME_STATUS:
         if (hdr) {
             while (*p) {
                 switch (*p) {
@@ -982,40 +992,40 @@ LIST **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, char *p,
         }
         break;
 
-      case HDR_SUBJECT:
+      case MIME_SUBJECT:
         if (!e->subject)
             e->subject = m_strdup(p);
         break;
 
-      case HDR_SUPERCEDES:
-      case HDR_SUPERSEDES:
+      case MIME_SUPERCEDES:
+      case MIME_SUPERSEDES:
         if (hdr)
             e->supersedes = m_strdup(p);
         break;
 
-      case HDR_TO:
+      case MIME_TO:
         e->to = rfc822_parse_adrlist(e->to, p);
         break;
 
 #ifdef USE_NNTP
-      case HDR_X_COMMENT_TO:
+      case MIME_X_COMMENT_TO:
         if (!e->x_comment_to)
             e->x_comment_to = m_strdup(p);
         break;
 #endif
 
-      case HDR_X_LABEL:
+      case MIME_X_LABEL:
         e->x_label = m_strdup(p);
         break;
 
 #ifdef USE_NNTP
-      case HDR_XREF:
+      case MIME_XREF:
         if (!e->xref)
             e->xref = m_strdup(p);
         break;
 #endif
 
-      case HDR_X_STATUS:
+      case MIME_X_STATUS:
         if (hdr) {
             while (*p) {
                 switch (*p) {
@@ -1221,7 +1231,7 @@ int count_body_parts (BODY *body, int flags) {
       shallrecurse = 1;
 
       /* If it's an external body pointer, don't recurse it. */
-      if (!ascii_strcasecmp (bp->subtype, "external-body"))
+      if (mime_which_token(bp->subtype, -1) == MIME_EXTERNAL_BODY)
         shallrecurse = 0;
 
       /* Don't count containers if they're top-level. */
@@ -1230,7 +1240,7 @@ int count_body_parts (BODY *body, int flags) {
     } else if (bp->type == TYPEMULTIPART) {
       /* Always recurse multiparts, except multipart/alternative. */
       shallrecurse = 1;
-      if (!m_strcasecmp(bp->subtype, "alternative"))
+      if (mime_which_token(bp->subtype, -1) == MIME_ALTERNATIVE)
         shallrecurse = 0;
 
       /* Don't count containers if they're top-level. */