]> granicus.if.org Git - neomutt/commitdiff
Use AddressList in mutt_addr_remove_xrefs
authorPietro Cerutti <gahr@gahr.ch>
Mon, 13 May 2019 12:12:07 +0000 (12:12 +0000)
committerRichard Russon <rich@flatcap.org>
Thu, 23 May 2019 10:57:09 +0000 (11:57 +0100)
address/address.c
address/address.h

index e424fed66c54ff8a6b5121d0f8228683b39e0171..cb0215fcbd210beca807fe53b20c50ea22d91618 100644 (file)
@@ -1393,45 +1393,31 @@ struct Address *mutt_addrlist_dedupe(struct Address *addr)
  *
  * Remove addresses from "b" which are contained in "a"
  */
-struct Address *mutt_addr_remove_xrefs(struct Address *a, struct Address *b)
+struct Address *mutt_addr_remove_xrefs(const struct Address *a, struct Address *b)
 {
   if (!a || !b)
     return NULL;
 
-  struct Address *p = NULL, *prev = NULL;
+  struct AddressList *ala = mutt_addr_to_addresslist((struct Address *) a);
+  struct AddressList *alb = mutt_addr_to_addresslist(b);
+  struct AddressNode *ana, *anb, *tmp;
 
-  struct Address *top = b;
-  while (b)
+  TAILQ_FOREACH_SAFE(anb, alb, entries, tmp)
   {
-    for (p = a; p; p = p->next)
-    {
-      if (mutt_addr_cmp(p, b))
-        break;
-    }
-    if (p)
+    TAILQ_FOREACH(ana, ala, entries)
     {
-      if (prev)
-      {
-        prev->next = b->next;
-        b->next = NULL;
-        mutt_addr_free(&b);
-        b = prev;
-      }
-      else
+      if (mutt_addr_cmp(ana->addr, anb->addr))
       {
-        top = top->next;
-        b->next = NULL;
-        mutt_addr_free(&b);
-        b = top;
+        mutt_addresslist_free_one(alb, anb);
+        break;
       }
     }
-    else
-    {
-      prev = b;
-      b = b->next;
-    }
   }
-  return top;
+
+  b = mutt_addresslist_to_addr(alb);
+  FREE(&ala);
+  FREE(&alb);
+  return b;
 }
 
 /**
index 7bf34949676780a0d55ab14cc98385a227c7c791..4801b2292c00ca1a0b7107c07b5bc9aa6eb27715 100644 (file)
@@ -83,7 +83,7 @@ struct Address *mutt_addr_parse_list(struct Address *top, const char *s);
 struct Address *mutt_addr_parse_list2(struct Address *p, const char *s);
 void            mutt_addr_qualify(struct Address *addr, const char *host);
 int             mutt_addr_remove_from_list(struct Address **a, const char *mailbox);
-struct Address *mutt_addr_remove_xrefs(struct Address *a, struct Address *b);
+struct Address *mutt_addr_remove_xrefs(const struct Address *a, struct Address *b);
 bool            mutt_addr_search(struct Address *a, struct Address *lst);
 void            mutt_addr_set_intl(struct Address *a, char *intl_mailbox);
 void            mutt_addr_set_local(struct Address *a, char *local_mailbox);