* please see the file GPL in the top level source directory.
*/
-#include <string.h>
-#include <ctype.h>
-#include <stdlib.h>
-
-#include <lib-lib/mem.h>
-#include <lib-lib/str.h>
-#include <lib-lib/ascii.h>
-#include <lib-lib/macros.h>
+#include <lib-lib/lib-lib.h>
#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;
}
}
-address_t *address_dup(address_t *addr)
+address_t *address_dup(const address_t *addr)
{
address_t *res = address_new();
return res;
}
-address_t *address_list_dup(address_t *addr)
+address_t *address_list_dup(const address_t *addr)
{
address_t *res = NULL, **resp = &res;
return res;
}
+/* given a list of addresses, return a list of unique addresses */
+void address_list_uniq(address_t *a)
+{
+ for (; a; a = a->next) {
+ address_t **b = &a->next;
+
+ if (!a->mailbox)
+ continue;
+
+ while (*b) {
+ if ((*b)->mailbox && !ascii_strcasecmp((*b)->mailbox, a->mailbox))
+ {
+ address_t *pop = address_list_pop(b);
+ address_delete(&pop);
+ } else {
+ b = &(*b)->next;
+ }
+ }
+ }
+}
/****************************************************************************/
/* Parsing functions */
return s;
}
-address_t **rfc822_eotoken(address_t **last, static_buf *phrase, static_buf *comment)
+static address_t **rfc822_eotoken(address_t **last, static_buf *phrase, static_buf *comment)
{
if (phrase->len) {
const char *s;
s = parse_address(phrase->buf, comment, cur);
if (s && *s && *s != ',' && *s != ';') {
- address_delete(&cur);
+ address_list_wipe(&cur);
return last;
}
stbuf_append_sp(&phrase);
s = next_phrase(s, &phrase);
if (!s) {
- address_delete(&top);
+ address_list_wipe(&top);
return NULL;
}
continue;
stbuf_append_sp(&comment);
s = parse_comment(s + 1, &comment);
if (!s) {
- address_delete(&top);
+ address_list_wipe(&top);
return NULL;
}
continue;
s = parse_address(skipspaces(s + 1), &comment, cur);
if (!s || *s != '>' || !cur->mailbox) {
- address_delete(&top);
- address_delete(&cur);
+ address_list_wipe(&top);
+ address_list_wipe(&cur);
return NULL;
}
return pos;
}
+address_t *mutt_parse_adrlist(address_t *p, const char *s)
+{
+ /* check for a simple whitespace separated list of addresses */
+ char *q = strpbrk(s, "\"<>():;,\\");
+ char tmp[HUGE_STRING];
+
+ if (q)
+ return rfc822_parse_adrlist(p, s);
+
+ m_strcpy(tmp, sizeof(tmp), s);
+ q = tmp;
+ while ((q = strtok(q, " \t"))) {
+ p = rfc822_parse_adrlist(p, q);
+ q = NULL;
+ }
+
+ return p;
+}
+