#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;
+
+ for (; addr; addr = addr->next) {
+ if (!addr->group && addr->mailbox && strchr(addr->mailbox, '@') == NULL) {
+ p = p_new(char, m_strlen(addr->mailbox) + m_strlen(host) + 2);
+ sprintf(p, "%s@%s", addr->mailbox, host); /* __SPRINTF_CHECKED__ */
+ p_delete(&addr->mailbox);
+ addr->mailbox = p;
+ }
+ }
+}
+
+address_t *address_dup(address_t *addr)
+{
+ address_t *res = address_new();
+
+ res->personal = m_strdup(addr->personal);
+ res->mailbox = m_strdup(addr->mailbox);
+ res->group = addr->group;
+ return res;
+}
+
+address_t *address_list_dup(address_t *addr)
+{
+ address_t *res = NULL, **resp = &res;
+
+ for (; addr; addr = addr->next) {
+ *resp = address_dup(addr);
+ resp = &(*resp)->next;
+ }
+
+ return res;
+}
#define terminate_string(a, b, c) do { if ((b) < (c)) a[(b)] = 0; else \
a[(c)] = 0; } while (0)
*w = 0;
}
-void rfc822_free_address (ADDRESS ** p)
-{
- ADDRESS *t;
-
- while (*p) {
- t = *p;
- *p = (*p)->next;
- p_delete(&t->personal);
- p_delete(&t->mailbox);
- p_delete(&t);
- }
-}
-
static const char *parse_comment (const char *s,
char *comment, size_t * commentlen,
size_t commentmax)
char *token, size_t * tokenlen,
size_t tokenmax, char *comment,
size_t * commentlen, size_t commentmax,
- ADDRESS * addr)
+ address_t * addr)
{
s = parse_mailboxdomain (s, ".\"(\\",
token, tokenlen, tokenmax,
static const char *parse_route_addr (const char *s,
char *comment, size_t * commentlen,
- size_t commentmax, ADDRESS * addr)
+ size_t commentmax, address_t * addr)
{
char token[STRING];
size_t tokenlen = 0;
static const char *parse_addr_spec (const char *s,
char *comment, size_t * commentlen,
- size_t commentmax, ADDRESS * addr)
+ size_t commentmax, address_t * addr)
{
char token[STRING];
size_t tokenlen = 0;
}
static void
-add_addrspec (ADDRESS ** top, ADDRESS ** last, const char *phrase,
+add_addrspec (address_t ** top, address_t ** last, const char *phrase,
char *comment, size_t * commentlen, size_t commentmax)
{
- ADDRESS *cur = rfc822_new_address ();
+ address_t *cur = address_new ();
if (parse_addr_spec (phrase, comment, commentlen, commentmax, cur) == NULL) {
- rfc822_free_address (&cur);
+ address_delete (&cur);
return;
}
*last = cur;
}
-ADDRESS *rfc822_parse_adrlist (ADDRESS * top, const char *s)
+address_t *rfc822_parse_adrlist (address_t * top, const char *s)
{
int ws_pending;
const char *begin, *ps;
char comment[STRING], phrase[STRING];
size_t phraselen = 0, commentlen = 0;
- ADDRESS *cur, *last = NULL;
+ address_t *cur, *last = NULL;
RFC822Error = 0;
if ((ps =
next_token (s, comment, &commentlen,
sizeof (comment) - 1)) == NULL) {
- rfc822_free_address (&top);
+ address_delete (&top);
return NULL;
}
s = ps;
}
else if (*s == ':') {
- cur = rfc822_new_address ();
+ cur = address_new ();
terminate_buffer (phrase, phraselen);
cur->mailbox = m_strdup(phrase);
cur->group = 1;
}
/* add group terminator */
- cur = rfc822_new_address ();
+ cur = address_new ();
if (last) {
last->next = cur;
last = cur;
}
else if (*s == '<') {
terminate_buffer (phrase, phraselen);
- cur = rfc822_new_address ();
+ cur = address_new ();
if (phraselen) {
if (cur->personal)
p_delete(&cur->personal);
if ((ps =
parse_route_addr (s + 1, comment, &commentlen,
sizeof (comment) - 1, cur)) == NULL) {
- rfc822_free_address (&top);
- rfc822_free_address (&cur);
+ address_delete (&top);
+ address_delete (&cur);
return NULL;
}
phrase[phraselen++] = ' ';
if ((ps =
next_token (s, phrase, &phraselen, sizeof (phrase) - 1)) == NULL) {
- rfc822_free_address (&top);
+ address_delete (&top);
return NULL;
}
s = ps;
return top;
}
-void rfc822_qualify (ADDRESS * addr, const char *host)
-{
- char *p;
-
- for (; addr; addr = addr->next)
- if (!addr->group && addr->mailbox && strchr (addr->mailbox, '@') == NULL) {
- p = p_new(char, m_strlen(addr->mailbox) + m_strlen(host) + 2);
- sprintf (p, "%s@%s", addr->mailbox, host); /* __SPRINTF_CHECKED__ */
- p_delete(&addr->mailbox);
- addr->mailbox = p;
- }
-}
-
void
rfc822_cat (char *buf, size_t buflen, const char *value, const char *specials)
{
m_strcpy(buf, buflen, value);
}
-void rfc822_write_address_single (char *buf, size_t buflen, ADDRESS * addr,
+void rfc822_write_address_single (char *buf, size_t buflen, address_t * addr,
int display)
{
size_t len;
}
/* note: it is assumed that `buf' is nul terminated! */
-void rfc822_write_address (char *buf, size_t buflen, ADDRESS * addr,
+void rfc822_write_address (char *buf, size_t buflen, address_t * addr,
int display)
{
char *pbuf = buf;
*pbuf = 0;
}
-/* this should be rfc822_cpy_adr */
-ADDRESS *rfc822_cpy_adr_real (ADDRESS * addr)
-{
- ADDRESS *p = rfc822_new_address ();
-
- p->personal = m_strdup(addr->personal);
- p->mailbox = m_strdup(addr->mailbox);
- p->group = addr->group;
- return p;
-}
-
-/* this should be rfc822_cpy_adrlist */
-ADDRESS *rfc822_cpy_adr (ADDRESS * addr)
-{
- ADDRESS *top = NULL, *last = NULL;
-
- for (; addr; addr = addr->next) {
- if (last) {
- last->next = rfc822_cpy_adr_real (addr);
- last = last->next;
- }
- else
- top = last = rfc822_cpy_adr_real (addr);
- }
- return top;
-}
-
-/* append list 'b' to list 'a' and return the last element in the new list */
-ADDRESS *rfc822_append (ADDRESS ** a, ADDRESS * b)
-{
- ADDRESS *tmp = *a;
-
- while (tmp && tmp->next)
- tmp = tmp->next;
- if (!b)
- return tmp;
- if (tmp)
- tmp->next = rfc822_cpy_adr (b);
- else
- tmp = *a = rfc822_cpy_adr (b);
- while (tmp && tmp->next)
- tmp = tmp->next;
- return tmp;
-}