]> granicus.if.org Git - neomutt/commitdiff
Add functions to convert to/from Address/AddressList
authorPietro Cerutti <gahr@gahr.ch>
Fri, 10 May 2019 15:52:53 +0000 (15:52 +0000)
committerRichard Russon <rich@flatcap.org>
Thu, 23 May 2019 10:57:09 +0000 (11:57 +0100)
address/address.c
address/address.h

index ffb99ed369bee5e7aaab606ebcc5f467c9aed372..793a550c2361fbee5c198227aaaf83411b485736 100644 (file)
@@ -28,6 +28,7 @@
  */
 
 #include "config.h"
+#include <assert.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <string.h>
@@ -463,6 +464,26 @@ void mutt_addr_free(struct Address **p)
   }
 }
 
+/**
+ * mutt_addresslist_free - Free an AddressList
+ */
+void mutt_addresslist_free(struct AddressList **al)
+{
+  if (!al)
+    return;
+
+  struct AddressNode *np = TAILQ_FIRST(*al), *next = NULL;
+  while (np)
+  {
+    next = TAILQ_NEXT(np, entries);
+    free_address(&np->addr);
+    FREE(&np);
+    np = next;
+  }
+  TAILQ_INIT(*al);
+  FREE(al);
+}
+
 /**
  * mutt_addr_parse_list - Parse a list of email addresses
  * @param top List to append addresses
@@ -1406,3 +1427,61 @@ struct Address *mutt_addr_remove_xrefs(struct Address *a, struct Address *b)
   }
   return top;
 }
+
+/**
+ * mutt_addresslist_append - Append an address to an AddressList
+ * @param al AddressList
+ * @param a  Address
+ */
+void mutt_addresslist_append(struct AddressList *al, struct Address *a)
+{
+  struct AddressNode *anode = mutt_mem_calloc(1, sizeof(struct AddressNode));
+  anode->addr = a;
+  TAILQ_INSERT_TAIL(al, anode, entries);
+}
+
+/**
+ * mutt_addr_to_addresslist - Convert a raw list of Address into an AddressList
+ * @param a Raw list of Address
+ * @retval ptr AddressList
+ *
+ * The Address members are shared between the input argument and the return
+ * value.
+ */
+struct AddressList *mutt_addr_to_addresslist(struct Address *a)
+{
+  struct AddressList *al = mutt_mem_calloc(1, sizeof(struct AddressList));
+  TAILQ_INIT(al);
+
+  while (a)
+  {
+    struct Address *next = a->next;
+    a->next = NULL; /* canary */
+    mutt_addresslist_append(al, a);
+    a = next;
+  }
+  return al;
+}
+
+/**
+ * mutt_addresslist_to_addr - Convert an AddressList into a raw list of Address
+ * @param a Reference list an AddressList 
+ * @retval ptr Raw list of Address
+ *
+ * The Address members are shared between the input argument and the return
+ * value.
+ */
+struct Address *mutt_addresslist_to_addr(struct AddressList *al)
+{
+  struct Address *a = NULL;
+  struct AddressNode *an, *tmp;
+  TAILQ_FOREACH_REVERSE_SAFE(an, al, AddressList, entries, tmp)
+  {
+    assert(an->addr->next == NULL); /* canary */
+    an->addr->next = a;
+    a = an->addr;
+    TAILQ_REMOVE(al, an, entries);
+    FREE(&an);
+  }
+  return a;
+}
index 6f69851ddb0a70ba3885a54924262ded524c94cc..009506da725cc699347c86aee0d552916f320909 100644 (file)
@@ -94,4 +94,9 @@ struct Address *mutt_addrlist_dedupe(struct Address *addr);
 int             mutt_addrlist_to_intl(struct Address *a, char **err);
 int             mutt_addrlist_to_local(struct Address *a);
 
+struct AddressList *mutt_addr_to_addresslist(struct Address *a);
+struct Address     *mutt_addresslist_to_addr(struct AddressList *alist);
+void                mutt_addresslist_append(struct AddressList *al, struct Address *a);
+void                mutt_addresslist_free(struct AddressList **alist);
+
 #endif /* MUTT_EMAIL_ADDRESS_H */