From: Pietro Cerutti Date: Fri, 10 May 2019 15:52:53 +0000 (+0000) Subject: Add functions to convert to/from Address/AddressList X-Git-Tag: 2019-10-25~200^2~77 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e6e783b27ca40ca28aa728d0a1c94f6fdc39e4d;p=neomutt Add functions to convert to/from Address/AddressList --- diff --git a/address/address.c b/address/address.c index ffb99ed36..793a550c2 100644 --- a/address/address.c +++ b/address/address.c @@ -28,6 +28,7 @@ */ #include "config.h" +#include #include #include #include @@ -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; +} diff --git a/address/address.h b/address/address.h index 6f69851dd..009506da7 100644 --- a/address/address.h +++ b/address/address.h @@ -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 */