*
* 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;
}
/**
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);