make address functions a lot better, and less error prone.
[apps/madmutt.git] / lib-mime / rfc822.c
index 82c3e7c..e73b408 100644 (file)
 
 #include "mutt_idna.h"
 
+void address_wipe(address_t *addr)
+{
+    p_delete(&addr->personal);
+    p_delete(&addr->mailbox);
+    address_delete(&addr->next);
+}
+
+
+void rfc822_qualify(address_t *addr, const char *host)
+{
+    char *p;
+
+    for (; addr; addr = addr->next) {
+        if (!addr->group && addr->mailbox && strchr(addr->mailbox, '@') == NULL) {
+            p = p_new(char, m_strlen(addr->mailbox) + m_strlen(host) + 2);
+            sprintf(p, "%s@%s", addr->mailbox, host);        /* __SPRINTF_CHECKED__ */
+            p_delete(&addr->mailbox);
+            addr->mailbox = p;
+        }
+    }
+}
+
+address_t *address_dup(address_t *addr)
+{
+    address_t *res = address_new();
+
+    res->personal = m_strdup(addr->personal);
+    res->mailbox  = m_strdup(addr->mailbox);
+    res->group    = addr->group;
+    return res;
+}
+
+address_t *address_list_dup(address_t *addr)
+{
+    address_t *res = NULL, **resp = &res;
+
+    for (; addr; addr = addr->next) {
+        *resp = address_dup(addr);
+        resp = &(*resp)->next;
+    }
+
+    return res;
+}
 
 #define terminate_string(a, b, c) do { if ((b) < (c)) a[(b)] = 0; else \
        a[(c)] = 0; } while (0)
@@ -79,19 +122,6 @@ void rfc822_dequote_comment (char *s)
   *w = 0;
 }
 
-void rfc822_free_address (ADDRESS ** p)
-{
-  ADDRESS *t;
-
-  while (*p) {
-    t = *p;
-    *p = (*p)->next;
-    p_delete(&t->personal);
-    p_delete(&t->mailbox);
-    p_delete(&t);
-  }
-}
-
 static const char *parse_comment (const char *s,
                                   char *comment, size_t * commentlen,
                                   size_t commentmax)
@@ -202,7 +232,7 @@ static const char *parse_address (const char *s,
                                   char *token, size_t * tokenlen,
                                   size_t tokenmax, char *comment,
                                   size_t * commentlen, size_t commentmax,
-                                  ADDRESS * addr)
+                                  address_t * addr)
 {
   s = parse_mailboxdomain (s, ".\"(\\",
                            token, tokenlen, tokenmax,
@@ -233,7 +263,7 @@ static const char *parse_address (const char *s,
 
 static const char *parse_route_addr (const char *s,
                                      char *comment, size_t * commentlen,
-                                     size_t commentmax, ADDRESS * addr)
+                                     size_t commentmax, address_t * addr)
 {
   char token[STRING];
   size_t tokenlen = 0;
@@ -278,7 +308,7 @@ static const char *parse_route_addr (const char *s,
 
 static const char *parse_addr_spec (const char *s,
                                     char *comment, size_t * commentlen,
-                                    size_t commentmax, ADDRESS * addr)
+                                    size_t commentmax, address_t * addr)
 {
   char token[STRING];
   size_t tokenlen = 0;
@@ -294,13 +324,13 @@ static const char *parse_addr_spec (const char *s,
 }
 
 static void
-add_addrspec (ADDRESS ** top, ADDRESS ** last, const char *phrase,
+add_addrspec (address_t ** top, address_t ** last, const char *phrase,
               char *comment, size_t * commentlen, size_t commentmax)
 {
-  ADDRESS *cur = rfc822_new_address ();
+  address_t *cur = address_new ();
 
   if (parse_addr_spec (phrase, comment, commentlen, commentmax, cur) == NULL) {
-    rfc822_free_address (&cur);
+    address_delete (&cur);
     return;
   }
 
@@ -311,13 +341,13 @@ add_addrspec (ADDRESS ** top, ADDRESS ** last, const char *phrase,
   *last = cur;
 }
 
-ADDRESS *rfc822_parse_adrlist (ADDRESS * top, const char *s)
+address_t *rfc822_parse_adrlist (address_t * top, const char *s)
 {
   int ws_pending;
   const char *begin, *ps;
   char comment[STRING], phrase[STRING];
   size_t phraselen = 0, commentlen = 0;
-  ADDRESS *cur, *last = NULL;
+  address_t *cur, *last = NULL;
 
   RFC822Error = 0;
 
@@ -351,13 +381,13 @@ ADDRESS *rfc822_parse_adrlist (ADDRESS * top, const char *s)
       if ((ps =
            next_token (s, comment, &commentlen,
                        sizeof (comment) - 1)) == NULL) {
-        rfc822_free_address (&top);
+        address_delete (&top);
         return NULL;
       }
       s = ps;
     }
     else if (*s == ':') {
-      cur = rfc822_new_address ();
+      cur = address_new ();
       terminate_buffer (phrase, phraselen);
       cur->mailbox = m_strdup(phrase);
       cur->group = 1;
@@ -385,7 +415,7 @@ ADDRESS *rfc822_parse_adrlist (ADDRESS * top, const char *s)
       }
 
       /* add group terminator */
-      cur = rfc822_new_address ();
+      cur = address_new ();
       if (last) {
         last->next = cur;
         last = cur;
@@ -398,7 +428,7 @@ ADDRESS *rfc822_parse_adrlist (ADDRESS * top, const char *s)
     }
     else if (*s == '<') {
       terminate_buffer (phrase, phraselen);
-      cur = rfc822_new_address ();
+      cur = address_new ();
       if (phraselen) {
         if (cur->personal)
           p_delete(&cur->personal);
@@ -409,8 +439,8 @@ ADDRESS *rfc822_parse_adrlist (ADDRESS * top, const char *s)
       if ((ps =
            parse_route_addr (s + 1, comment, &commentlen,
                              sizeof (comment) - 1, cur)) == NULL) {
-        rfc822_free_address (&top);
-        rfc822_free_address (&cur);
+        address_delete (&top);
+        address_delete (&cur);
         return NULL;
       }
 
@@ -429,7 +459,7 @@ ADDRESS *rfc822_parse_adrlist (ADDRESS * top, const char *s)
         phrase[phraselen++] = ' ';
       if ((ps =
            next_token (s, phrase, &phraselen, sizeof (phrase) - 1)) == NULL) {
-        rfc822_free_address (&top);
+        address_delete (&top);
         return NULL;
       }
       s = ps;
@@ -452,19 +482,6 @@ ADDRESS *rfc822_parse_adrlist (ADDRESS * top, const char *s)
   return top;
 }
 
-void rfc822_qualify (ADDRESS * addr, const char *host)
-{
-  char *p;
-
-  for (; addr; addr = addr->next)
-    if (!addr->group && addr->mailbox && strchr (addr->mailbox, '@') == NULL) {
-      p = p_new(char, m_strlen(addr->mailbox) + m_strlen(host) + 2);
-      sprintf (p, "%s@%s", addr->mailbox, host);        /* __SPRINTF_CHECKED__ */
-      p_delete(&addr->mailbox);
-      addr->mailbox = p;
-    }
-}
-
 void
 rfc822_cat (char *buf, size_t buflen, const char *value, const char *specials)
 {
@@ -489,7 +506,7 @@ rfc822_cat (char *buf, size_t buflen, const char *value, const char *specials)
     m_strcpy(buf, buflen, value);
 }
 
-void rfc822_write_address_single (char *buf, size_t buflen, ADDRESS * addr,
+void rfc822_write_address_single (char *buf, size_t buflen, address_t * addr,
                                   int display)
 {
   size_t len;
@@ -595,7 +612,7 @@ done:
 }
 
 /* note: it is assumed that `buf' is nul terminated! */
-void rfc822_write_address (char *buf, size_t buflen, ADDRESS * addr,
+void rfc822_write_address (char *buf, size_t buflen, address_t * addr,
                            int display)
 {
   char *pbuf = buf;
@@ -647,47 +664,3 @@ done:
   *pbuf = 0;
 }
 
-/* this should be rfc822_cpy_adr */
-ADDRESS *rfc822_cpy_adr_real (ADDRESS * addr)
-{
-  ADDRESS *p = rfc822_new_address ();
-
-  p->personal = m_strdup(addr->personal);
-  p->mailbox = m_strdup(addr->mailbox);
-  p->group = addr->group;
-  return p;
-}
-
-/* this should be rfc822_cpy_adrlist */
-ADDRESS *rfc822_cpy_adr (ADDRESS * addr)
-{
-  ADDRESS *top = NULL, *last = NULL;
-
-  for (; addr; addr = addr->next) {
-    if (last) {
-      last->next = rfc822_cpy_adr_real (addr);
-      last = last->next;
-    }
-    else
-      top = last = rfc822_cpy_adr_real (addr);
-  }
-  return top;
-}
-
-/* append list 'b' to list 'a' and return the last element in the new list */
-ADDRESS *rfc822_append (ADDRESS ** a, ADDRESS * b)
-{
-  ADDRESS *tmp = *a;
-
-  while (tmp && tmp->next)
-    tmp = tmp->next;
-  if (!b)
-    return tmp;
-  if (tmp)
-    tmp->next = rfc822_cpy_adr (b);
-  else
-    tmp = *a = rfc822_cpy_adr (b);
-  while (tmp && tmp->next)
-    tmp = tmp->next;
-  return tmp;
-}