break;
case 'r':
adr[0] = '\0';
- rfc822_write_address(adr, sizeof(adr), alias->addr, 1);
+ mutt_addr_write(adr, sizeof(adr), alias->addr, true);
snprintf(fmt, sizeof(fmt), "%%%ss", prec);
snprintf(buf, buflen, fmt, adr);
break;
{
if (AliasTable[i]->tagged)
{
- rfc822_write_address(buf, buflen, AliasTable[i]->addr, 1);
+ mutt_addr_write(buf, buflen, AliasTable[i]->addr, true);
t = -1;
}
}
if (t != -1)
{
- rfc822_write_address(buf, buflen, AliasTable[t]->addr, 1);
+ mutt_addr_write(buf, buflen, AliasTable[t]->addr, true);
}
mutt_pop_current_menu(menu);
* | mutt_addr_set_intl() | Mark an Address as having IDN components
* | mutt_addr_set_local() | Mark an Address as having NO IDN components
* | mutt_addr_valid_msgid() | Is this a valid Message ID?
+ * | mutt_addr_write() | Write an Address to a buffer
+ * | mutt_addr_write_single() | Write a single Address to a buffer
*/
#include "config.h"
FREE(&local_mailbox);
return buf;
}
+
+/**
+ * mutt_addr_write_single - Write a single Address to a buffer
+ * @param buf Buffer for the Address
+ * @param buflen Length of the buffer
+ * @param addr Address to display
+ * @param display This address will be displayed to the user
+ *
+ * If 'display' is set, then it doesn't matter if the transformation isn't
+ * reversible.
+ */
+void mutt_addr_write_single(char *buf, size_t buflen, struct Address *addr, bool display)
+{
+ size_t len;
+ char *pbuf = buf;
+ char *pc = NULL;
+
+ if (!addr)
+ return;
+
+ buflen--; /* save room for the terminal nul */
+
+ if (addr->personal)
+ {
+ if (strpbrk(addr->personal, AddressSpecials))
+ {
+ if (!buflen)
+ goto done;
+ *pbuf++ = '"';
+ buflen--;
+ for (pc = addr->personal; *pc && buflen > 0; pc++)
+ {
+ if (*pc == '"' || *pc == '\\')
+ {
+ *pbuf++ = '\\';
+ buflen--;
+ }
+ if (!buflen)
+ goto done;
+ *pbuf++ = *pc;
+ buflen--;
+ }
+ if (!buflen)
+ goto done;
+ *pbuf++ = '"';
+ buflen--;
+ }
+ else
+ {
+ if (!buflen)
+ goto done;
+ mutt_str_strfcpy(pbuf, addr->personal, buflen);
+ len = mutt_str_strlen(pbuf);
+ pbuf += len;
+ buflen -= len;
+ }
+
+ if (!buflen)
+ goto done;
+ *pbuf++ = ' ';
+ buflen--;
+ }
+
+ if (addr->personal || (addr->mailbox && *addr->mailbox == '@'))
+ {
+ if (!buflen)
+ goto done;
+ *pbuf++ = '<';
+ buflen--;
+ }
+
+ if (addr->mailbox)
+ {
+ if (!buflen)
+ goto done;
+ if ((mutt_str_strcmp(addr->mailbox, "@") != 0) && !display)
+ {
+ mutt_str_strfcpy(pbuf, addr->mailbox, buflen);
+ len = mutt_str_strlen(pbuf);
+ }
+ else if ((mutt_str_strcmp(addr->mailbox, "@") != 0) && display)
+ {
+ mutt_str_strfcpy(pbuf, mutt_addr_for_display(addr), buflen);
+ len = mutt_str_strlen(pbuf);
+ }
+ else
+ {
+ *pbuf = '\0';
+ len = 0;
+ }
+ pbuf += len;
+ buflen -= len;
+
+ if (addr->personal || (addr->mailbox && *addr->mailbox == '@'))
+ {
+ if (!buflen)
+ goto done;
+ *pbuf++ = '>';
+ buflen--;
+ }
+
+ if (addr->group)
+ {
+ if (!buflen)
+ goto done;
+ *pbuf++ = ':';
+ buflen--;
+ if (!buflen)
+ goto done;
+ *pbuf++ = ' ';
+ buflen--;
+ }
+ }
+ else
+ {
+ if (!buflen)
+ goto done;
+ *pbuf++ = ';';
+ buflen--;
+ }
+done:
+ /* no need to check for length here since we already save space at the
+ beginning of this routine */
+ *pbuf = 0;
+}
+
+/**
+ * mutt_addr_write - Write an Address to a buffer
+ * @param buf Buffer for the Address
+ * @param buflen Length of the buffer
+ * @param addr Address to display
+ * @param display This address will be displayed to the user
+ *
+ * If 'display' is set, then it doesn't matter if the transformation isn't
+ * reversible.
+ *
+ * @note It is assumed that `buf` is nul terminated!
+ */
+size_t mutt_addr_write(char *buf, size_t buflen, struct Address *addr, bool display)
+{
+ char *pbuf = buf;
+ size_t len = mutt_str_strlen(buf);
+
+ buflen--; /* save room for the terminal nul */
+
+ if (len > 0)
+ {
+ if (len > buflen)
+ return 0; /* safety check for bogus arguments */
+
+ pbuf += len;
+ buflen -= len;
+ if (!buflen)
+ goto done;
+ *pbuf++ = ',';
+ buflen--;
+ if (!buflen)
+ goto done;
+ *pbuf++ = ' ';
+ buflen--;
+ }
+
+ for (; addr && buflen > 0; addr = addr->next)
+ {
+ /* use buflen+1 here because we already saved space for the trailing
+ nul char, and the subroutine can make use of it */
+ mutt_addr_write_single(pbuf, buflen + 1, addr, display);
+
+ /* this should be safe since we always have at least 1 char passed into
+ the above call, which means `pbuf' should always be nul terminated */
+ len = mutt_str_strlen(pbuf);
+ pbuf += len;
+ buflen -= len;
+
+ /* if there is another address, and it's not a group mailbox name or
+ group terminator, add a comma to separate the addresses */
+ if (addr->next && addr->next->mailbox && !addr->group)
+ {
+ if (!buflen)
+ goto done;
+ *pbuf++ = ',';
+ buflen--;
+ if (!buflen)
+ goto done;
+ *pbuf++ = ' ';
+ buflen--;
+ }
+ }
+done:
+ *pbuf = 0;
+ return pbuf - buf;
+}
void mutt_addr_set_intl(struct Address *a, char *intl_mailbox);
void mutt_addr_set_local(struct Address *a, char *local_mailbox);
bool mutt_addr_valid_msgid(const char *msgid);
+size_t mutt_addr_write(char *buf, size_t buflen, struct Address *addr, bool display);
+void mutt_addr_write_single(char *buf, size_t buflen, struct Address *addr, bool display);
#endif /* _MUTT_ADDRESS_H */
new->addr->personal = mutt_str_strdup(buf);
buf[0] = '\0';
- rfc822_write_address(buf, sizeof(buf), new->addr, 1);
+ mutt_addr_write(buf, sizeof(buf), new->addr, true);
snprintf(prompt, sizeof(prompt), _("[%s = %s] Accept?"), new->name, buf);
if (mutt_yesorno(prompt, MUTT_YES) != MUTT_YES)
{
recode_buf(buf, sizeof(buf));
fprintf(rc, "alias %s ", buf);
buf[0] = '\0';
- rfc822_write_address(buf, sizeof(buf), new->addr, 0);
+ mutt_addr_write(buf, sizeof(buf), new->addr, false);
recode_buf(buf, sizeof(buf));
write_safe_address(rc, buf);
fputc('\n', rc);
}
buf[0] = '\0';
- rfc822_write_address(buf, sizeof(buf), adr, 1);
+ mutt_addr_write(buf, sizeof(buf), adr, true);
#define EXTRA_SPACE (15 + 7 + 2)
snprintf(scratch, sizeof(scratch),
*/
buf[0] = '\0';
- rfc822_write_address(buf, sizeof(buf), adr, 0);
+ mutt_addr_write(buf, sizeof(buf), adr, false);
mutt_message("%s: %s", pfx, buf);
}
char buf[LONG_STRING];
buf[0] = 0;
- rfc822_write_address(buf, sizeof(buf), addr, 1);
+ mutt_addr_write(buf, sizeof(buf), addr, true);
SETCOLOR(MT_COLOR_COMPOSE_HEADER);
mutt_window_mvprintw(MuttIndexWindow, line, 0, "%*s", HeaderPadding[line],
_(Prompts[line]));
char *err = NULL;
mutt_addrlist_to_local(*addr);
- rfc822_write_address(buf, sizeof(buf), *addr, 0);
+ mutt_addr_write(buf, sizeof(buf), *addr, false);
if (mutt_get_field(_(Prompts[line]), buf, sizeof(buf), MUTT_ALIAS) == 0)
{
mutt_addr_free(addr);
/* redraw the expanded list so the user can see the result */
buf[0] = 0;
- rfc822_write_address(buf, sizeof(buf), *addr, 1);
+ mutt_addr_write(buf, sizeof(buf), *addr, true);
mutt_window_move(MuttIndexWindow, line, HDR_XOFFSET);
mutt_paddstr(W, buf);
}
struct Address *tmp = a->next;
a->next = NULL;
*buf = *cbuf = *c2buf = '\0';
- l = rfc822_write_address(buf, sizeof(buf), a, 0);
+ l = mutt_addr_write(buf, sizeof(buf), a, false);
a->next = tmp;
if (count && linelen + l > 74)
{
addstr("To: ");
tmp[0] = '\0';
- rfc822_write_address(tmp, sizeof(tmp), env->to, 1);
+ mutt_addr_write(tmp, sizeof(tmp), env->to, true);
addstr(tmp);
addch('\n');
}
{
addstr("Cc: ");
tmp[0] = '\0';
- rfc822_write_address(tmp, sizeof(tmp), env->cc, 1);
+ mutt_addr_write(tmp, sizeof(tmp), env->cc, true);
addstr(tmp);
addch('\n');
}
{
addstr("Bcc: ");
tmp[0] = '\0';
- rfc822_write_address(tmp, sizeof(tmp), env->bcc, 1);
+ mutt_addr_write(tmp, sizeof(tmp), env->bcc, true);
addstr(tmp);
addch('\n');
}
addstr("To: ");
tmp[0] = '\0';
mutt_addrlist_to_local(e->to);
- rfc822_write_address(tmp, sizeof(tmp), e->to, 0);
+ mutt_addr_write(tmp, sizeof(tmp), e->to, false);
if (!e->to || force)
{
if (mutt_enter_string(tmp, sizeof(tmp), 4, 0) == 0)
e->to = mutt_expand_aliases(e->to);
mutt_addrlist_to_intl(e->to, NULL); /* XXX - IDNA error reporting? */
tmp[0] = '\0';
- rfc822_write_address(tmp, sizeof(tmp), e->to, 1);
+ mutt_addr_write(tmp, sizeof(tmp), e->to, true);
mutt_window_mvaddstr(MuttMessageWindow, 0, 4, tmp);
}
}
addstr("Cc: ");
tmp[0] = '\0';
mutt_addrlist_to_local(e->cc);
- rfc822_write_address(tmp, sizeof(tmp), e->cc, 0);
+ mutt_addr_write(tmp, sizeof(tmp), e->cc, false);
if (mutt_enter_string(tmp, sizeof(tmp), 4, 0) == 0)
{
mutt_addr_free(&e->cc);
e->cc = mutt_expand_aliases(e->cc);
tmp[0] = '\0';
mutt_addrlist_to_intl(e->cc, NULL);
- rfc822_write_address(tmp, sizeof(tmp), e->cc, 1);
+ mutt_addr_write(tmp, sizeof(tmp), e->cc, true);
mutt_window_mvaddstr(MuttMessageWindow, 0, 4, tmp);
}
else
addstr("Bcc: ");
tmp[0] = '\0';
mutt_addrlist_to_local(e->bcc);
- rfc822_write_address(tmp, sizeof(tmp), e->bcc, 0);
+ mutt_addr_write(tmp, sizeof(tmp), e->bcc, false);
if (mutt_enter_string(tmp, sizeof(tmp), 5, 0) == 0)
{
mutt_addr_free(&e->bcc);
e->bcc = mutt_expand_aliases(e->bcc);
mutt_addrlist_to_intl(e->bcc, NULL);
tmp[0] = '\0';
- rfc822_write_address(tmp, sizeof(tmp), e->bcc, 1);
+ mutt_addr_write(tmp, sizeof(tmp), e->bcc, true);
mutt_window_mvaddstr(MuttMessageWindow, 0, 5, tmp);
}
else
case 'f':
tmp[0] = 0;
- rfc822_write_address(tmp, sizeof(tmp), hdr->env->from, 1);
+ mutt_addr_write(tmp, sizeof(tmp), hdr->env->from, true);
mutt_format_s(buf, buflen, prec, tmp);
break;
case 'r':
tmp[0] = 0;
- rfc822_write_address(tmp, sizeof(tmp), hdr->env->to, 1);
+ mutt_addr_write(tmp, sizeof(tmp), hdr->env->to, true);
if (optional && tmp[0] == '\0')
optional = 0;
mutt_format_s(buf, buflen, prec, tmp);
case 'R':
tmp[0] = 0;
- rfc822_write_address(tmp, sizeof(tmp), hdr->env->cc, 1);
+ mutt_addr_write(tmp, sizeof(tmp), hdr->env->cc, true);
if (optional && tmp[0] == '\0')
optional = 0;
mutt_format_s(buf, buflen, prec, tmp);
{
char tmp[HUGE_STRING];
*tmp = '\0';
- rfc822_write_address(tmp, sizeof(tmp), *((struct Address **) p->var), 0);
+ mutt_addr_write(tmp, sizeof(tmp), *((struct Address **) p->var), false);
p->initial = (unsigned long) mutt_str_strdup(tmp);
}
break;
else if (DTYPE(MuttVars[idx].type) == DT_ADDRESS)
{
tmp2[0] = '\0';
- rfc822_write_address(tmp2, sizeof(tmp2),
- *((struct Address **) MuttVars[idx].var), 0);
+ mutt_addr_write(tmp2, sizeof(tmp2),
+ *((struct Address **) MuttVars[idx].var), false);
val = tmp2;
}
else if (DTYPE(MuttVars[idx].type) == DT_PATH)
}
else if (DTYPE(MuttVars[idx].type) == DT_ADDRESS)
{
- rfc822_write_address(tmp, sizeof(tmp), *((struct Address **) MuttVars[idx].var), 0);
+ mutt_addr_write(tmp, sizeof(tmp), *((struct Address **) MuttVars[idx].var), false);
}
else if (DTYPE(MuttVars[idx].type) == DT_QUAD)
mutt_str_strfcpy(tmp, vals[*(unsigned char *) MuttVars[idx].var], sizeof(tmp));
return 0;
}
-
-void rfc822_write_address_single(char *buf, size_t buflen, struct Address *addr, int display)
-{
- size_t len;
- char *pbuf = buf;
- char *pc = NULL;
-
- if (!addr)
- return;
-
- buflen--; /* save room for the terminal nul */
-
- if (addr->personal)
- {
- if (strpbrk(addr->personal, AddressSpecials))
- {
- if (!buflen)
- goto done;
- *pbuf++ = '"';
- buflen--;
- for (pc = addr->personal; *pc && buflen > 0; pc++)
- {
- if (*pc == '"' || *pc == '\\')
- {
- *pbuf++ = '\\';
- buflen--;
- }
- if (!buflen)
- goto done;
- *pbuf++ = *pc;
- buflen--;
- }
- if (!buflen)
- goto done;
- *pbuf++ = '"';
- buflen--;
- }
- else
- {
- if (!buflen)
- goto done;
- mutt_str_strfcpy(pbuf, addr->personal, buflen);
- len = mutt_str_strlen(pbuf);
- pbuf += len;
- buflen -= len;
- }
-
- if (!buflen)
- goto done;
- *pbuf++ = ' ';
- buflen--;
- }
-
- if (addr->personal || (addr->mailbox && *addr->mailbox == '@'))
- {
- if (!buflen)
- goto done;
- *pbuf++ = '<';
- buflen--;
- }
-
- if (addr->mailbox)
- {
- if (!buflen)
- goto done;
- if ((mutt_str_strcmp(addr->mailbox, "@") != 0) && !display)
- {
- mutt_str_strfcpy(pbuf, addr->mailbox, buflen);
- len = mutt_str_strlen(pbuf);
- }
- else if ((mutt_str_strcmp(addr->mailbox, "@") != 0) && display)
- {
- mutt_str_strfcpy(pbuf, mutt_addr_for_display(addr), buflen);
- len = mutt_str_strlen(pbuf);
- }
- else
- {
- *pbuf = '\0';
- len = 0;
- }
- pbuf += len;
- buflen -= len;
-
- if (addr->personal || (addr->mailbox && *addr->mailbox == '@'))
- {
- if (!buflen)
- goto done;
- *pbuf++ = '>';
- buflen--;
- }
-
- if (addr->group)
- {
- if (!buflen)
- goto done;
- *pbuf++ = ':';
- buflen--;
- if (!buflen)
- goto done;
- *pbuf++ = ' ';
- buflen--;
- }
- }
- else
- {
- if (!buflen)
- goto done;
- *pbuf++ = ';';
- buflen--;
- }
-done:
- /* no need to check for length here since we already save space at the
- beginning of this routine */
- *pbuf = 0;
-}
-
-/**
- * rfc822_write_address - Write an address to a buffer
- *
- * Note: it is assumed that `buf' is nul terminated!
- */
-size_t rfc822_write_address(char *buf, size_t buflen, struct Address *addr, int display)
-{
- char *pbuf = buf;
- size_t len = mutt_str_strlen(buf);
-
- buflen--; /* save room for the terminal nul */
-
- if (len > 0)
- {
- if (len > buflen)
- return 0; /* safety check for bogus arguments */
-
- pbuf += len;
- buflen -= len;
- if (!buflen)
- goto done;
- *pbuf++ = ',';
- buflen--;
- if (!buflen)
- goto done;
- *pbuf++ = ' ';
- buflen--;
- }
-
- for (; addr && buflen > 0; addr = addr->next)
- {
- /* use buflen+1 here because we already saved space for the trailing
- nul char, and the subroutine can make use of it */
- rfc822_write_address_single(pbuf, buflen + 1, addr, display);
-
- /* this should be safe since we always have at least 1 char passed into
- the above call, which means `pbuf' should always be nul terminated */
- len = mutt_str_strlen(pbuf);
- pbuf += len;
- buflen -= len;
-
- /* if there is another address, and it's not a group mailbox name or
- group terminator, add a comma to separate the addresses */
- if (addr->next && addr->next->mailbox && !addr->group)
- {
- if (!buflen)
- goto done;
- *pbuf++ = ',';
- buflen--;
- if (!buflen)
- goto done;
- *pbuf++ = ' ';
- buflen--;
- }
- }
-done:
- *pbuf = 0;
- return pbuf - buf;
-}
case DT_ADDRESS:
{
char value[LONG_STRING] = "";
- rfc822_write_address(value, LONG_STRING, *((struct Address **) opt.var), 0);
+ mutt_addr_write(value, LONG_STRING, *((struct Address **) opt.var), false);
lua_pushstring(l, value);
return 1;
}
*tmp = '\0';
mutt_addrlist_to_local(addr);
- rfc822_write_address_single(tmp, sizeof(tmp), addr, 0);
+ mutt_addr_write_single(tmp, sizeof(tmp), addr, false);
mutt_file_quote_filename(buf, sizeof(buf), tmp);
addr->personal = personal;
void mutt_update_encoding(struct Body *a);
void mutt_version(void);
void mutt_view_attachments(struct Header *hdr);
-void mutt_write_address_list(struct Address *adr, FILE *fp, int linelen, int display);
+void mutt_write_address_list(struct Address *adr, FILE *fp, int linelen, bool display);
bool mutt_addr_is_user(struct Address *addr);
int mutt_addwch(wchar_t wc);
int mutt_alias_complete(char *s, size_t buflen);
int mutt_addrlist_to_intl(struct Address *a, char **err);
int mutt_env_to_intl(struct Envelope *env, char **tag, char **err);
void mutt_env_to_local(struct Envelope *e);
-size_t rfc822_write_address(char *buf, size_t buflen, struct Address *addr, int display);
-void rfc822_write_address_single(char *buf, size_t buflen, struct Address *addr, int display);
#endif /* _MUTT_PROTOS_H */
switch (op)
{
case 'a':
- rfc822_write_address(tmp, sizeof(tmp), query->addr, 1);
+ mutt_addr_write(tmp, sizeof(tmp), query->addr, true);
snprintf(fmt, sizeof(fmt), "%%%ss", prec);
snprintf(buf, buflen, fmt, tmp);
break;
struct Address *tmpa = result_to_addr(QueryTable[i].data);
mutt_addrlist_to_local(tmpa);
tagged = true;
- rfc822_write_address(buf, buflen, tmpa, 0);
+ mutt_addr_write(buf, buflen, tmpa, false);
curpos = mutt_str_strlen(buf);
mutt_addr_free(&tmpa);
}
struct Address *tmpa = result_to_addr(QueryTable[i].data);
mutt_addrlist_to_local(tmpa);
strcat(buf, ", ");
- rfc822_write_address((char *) buf + curpos + 1, buflen - curpos - 1, tmpa, 0);
+ mutt_addr_write((char *) buf + curpos + 1, buflen - curpos - 1, tmpa, false);
curpos = mutt_str_strlen(buf);
mutt_addr_free(&tmpa);
}
{
struct Address *tmpa = result_to_addr(QueryTable[menu->current].data);
mutt_addrlist_to_local(tmpa);
- rfc822_write_address(buf, buflen, tmpa, 0);
+ mutt_addr_write(buf, buflen, tmpa, false);
mutt_addr_free(&tmpa);
}
}
tmpa = result_to_addr(results);
mutt_addrlist_to_local(tmpa);
buf[0] = '\0';
- rfc822_write_address(buf, buflen, tmpa, 0);
+ mutt_addr_write(buf, buflen, tmpa, false);
mutt_addr_free(&tmpa);
free_query(&results);
mutt_clear_error();
}
buf[0] = 0;
- rfc822_write_address(buf, sizeof(buf), adr, 1);
+ mutt_addr_write(buf, sizeof(buf), adr, true);
#define EXTRA_SPACE (15 + 7 + 2)
/*
{
buf[0] = 0;
mutt_addrlist_to_local(*a);
- rfc822_write_address(buf, sizeof(buf), *a, 0);
+ mutt_addr_write(buf, sizeof(buf), *a, false);
if (mutt_get_field(field, buf, sizeof(buf), MUTT_ALIAS) != 0)
return -1;
mutt_addr_free(a);
* So we can handle very large recipient lists without needing a huge temporary
* buffer in memory
*/
-void mutt_write_address_list(struct Address *adr, FILE *fp, int linelen, int display)
+void mutt_write_address_list(struct Address *adr, FILE *fp, int linelen, bool display)
{
struct Address *tmp = NULL;
char buf[LONG_STRING];
tmp = adr->next;
adr->next = NULL;
buf[0] = 0;
- rfc822_write_address(buf, sizeof(buf), adr, display);
+ mutt_addr_write(buf, sizeof(buf), adr, display);
len = mutt_str_strlen(buf);
if (count && linelen + len > 74)
{
if (env->from && !privacy)
{
buffer[0] = 0;
- rfc822_write_address(buffer, sizeof(buffer), env->from, 0);
+ mutt_addr_write(buffer, sizeof(buffer), env->from, false);
fprintf(fp, "From: %s\n", buffer);
}
if (env->sender && !privacy)
{
buffer[0] = 0;
- rfc822_write_address(buffer, sizeof(buffer), env->sender, 0);
+ mutt_addr_write(buffer, sizeof(buffer), env->sender, false);
fprintf(fp, "Sender: %s\n", buffer);
}
mutt_addr_free(&from);
return -1;
}
- rfc822_write_address(resent_from, sizeof(resent_from), from, 0);
+ mutt_addr_write(resent_from, sizeof(resent_from), from, false);
#ifdef USE_NNTP
OPT_NEWS_SEND = false;