X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=alias.c;h=835d55a4af6747829b9a98702712022ff6eaaa7c;hp=5a584492b7cd9203f2764f11cff7085340925c14;hb=91d0c04349c9345f0ee29a61cc18dfc144b60edc;hpb=ba5e3af4ea19e1d20c80941c077039871ec84258 diff --git a/alias.c b/alias.c index 5a58449..835d55a 100644 --- a/alias.c +++ b/alias.c @@ -11,25 +11,43 @@ # include "config.h" #endif +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "lib/rx.h" +#include "lib/debug.h" + #include "mutt.h" +#include "enter.h" #include "mutt_curses.h" #include "mutt_idna.h" +#include "mutt_menu.h" +#include "sort.h" -#include "lib/mem.h" -#include "lib/intl.h" -#include "lib/str.h" -#include "lib/rx.h" -#include "lib/debug.h" +#define RSORT(x) (SortAlias & SORT_REVERSE) ? -x : x -#include -#include +static struct mapping_t AliasHelp[] = { + {N_("Exit"), OP_EXIT}, + {N_("Del"), OP_DELETE}, + {N_("Undel"), OP_UNDELETE}, + {N_("Select"), OP_GENERIC_SELECT_ENTRY}, + {N_("Help"), OP_HELP}, + {NULL, OP_NULL} +}; ADDRESS *mutt_lookup_alias (const char *s) { ALIAS *t = Aliases; for (; t; t = t->next) - if (!str_casecmp (s, t->name)) + if (!m_strcasecmp(s, t->name)) return (t->addr); return (NULL); /* no such alias */ } @@ -49,7 +67,7 @@ static ADDRESS *mutt_expand_aliases_r (ADDRESS * a, LIST ** expn) if (t) { i = 0; for (u = *expn; u; u = u->next) { - if (str_cmp (a->mailbox, u->data) == 0) { /* alias already found */ + if (m_strcmp(a->mailbox, u->data) == 0) { /* alias already found */ debug_print(1, ("loop in alias found for '%s'\n", a->mailbox)); i = 1; break; @@ -57,8 +75,8 @@ static ADDRESS *mutt_expand_aliases_r (ADDRESS * a, LIST ** expn) } if (!i) { - u = mem_malloc (sizeof (LIST)); - u->data = str_dup (a->mailbox); + u = p_new(LIST, 1); + u->data = m_strdup(a->mailbox); u->next = *expn; *expn = u; w = rfc822_cpy_adr (t); @@ -158,10 +176,10 @@ static void write_safe_address (FILE * fp, char *s) } } -ADDRESS *mutt_get_address (ENVELOPE * env, char **pfxp) +ADDRESS *mutt_get_address (ENVELOPE * env, const char **pfxp) { ADDRESS *adr; - char *pfx = NULL; + const char *pfx = NULL; if (mutt_addr_is_user (env->from)) { if (env->to && !mutt_is_mail_list (env->to)) { @@ -205,7 +223,7 @@ void mutt_create_alias (ENVELOPE * cur, ADDRESS * iadr) } if (adr && adr->mailbox) { - strfcpy (buf, adr->mailbox, sizeof (buf)); + m_strcpy(buf, sizeof(buf), adr->mailbox); if ((pc = strchr (buf, '@'))) *pc = 0; } @@ -231,21 +249,21 @@ retry_name: switch (mutt_yesorno (_("Warning: This alias name may not work. Fix it?"), M_YES)) { case M_YES: - strfcpy (buf, fixed, sizeof (buf)); + m_strcpy(buf, sizeof(buf), fixed); goto retry_name; case -1: return; } } - new = mem_calloc (1, sizeof (ALIAS)); + new = p_new(ALIAS, 1); new->self = new; - new->name = str_dup (buf); + new->name = m_strdup(buf); mutt_addrlist_to_local (adr); if (adr) - strfcpy (buf, adr->mailbox, sizeof (buf)); + m_strcpy(buf, sizeof(buf), adr->mailbox); else buf[0] = 0; @@ -267,8 +285,8 @@ retry_name: } while (new->addr == NULL); - if (adr && adr->personal && !mutt_is_mail_list (adr)) - strfcpy (buf, adr->personal, sizeof (buf)); + if (adr && adr->personal && !mutt_is_mail_list(adr)) + m_strcpy(buf, sizeof(buf), adr->personal); else buf[0] = 0; @@ -276,7 +294,7 @@ retry_name: mutt_free_alias (&new); return; } - new->addr->personal = str_dup (buf); + new->addr->personal = m_strdup(buf); buf[0] = 0; rfc822_write_address (buf, sizeof (buf), new->addr, 1); @@ -294,15 +312,15 @@ retry_name: else Aliases = new; - strfcpy (buf, NONULL (AliasFile), sizeof (buf)); + m_strcpy(buf, sizeof(buf), NONULL(AliasFile)); if (mutt_get_field (_("Save to file: "), buf, sizeof (buf), M_FILE) != 0) return; mutt_expand_path (buf, sizeof (buf)); if ((rc = safe_fopen (buf, "a"))) { if (mutt_check_alias_name (new->name, NULL)) - mutt_quote_filename (buf, sizeof (buf), new->name); + mutt_quote_filename(buf, sizeof(buf), new->name); else - strfcpy (buf, new->name, sizeof (buf)); + m_strcpy(buf, sizeof(buf), new->name); fprintf (rc, "alias %s ", buf); buf[0] = 0; rfc822_write_address (buf, sizeof (buf), new->addr, 0); @@ -386,13 +404,13 @@ int mutt_alias_complete (char *s, size_t buflen) #define min(a,b) ((aname && strstr (a->name, s) == a->name) { if (!bestname[0]) /* init */ - strfcpy (bestname, a->name, - min (str_len (a->name) + 1, sizeof (bestname))); + m_strcpy(bestname, MIN(m_strlen(a->name) + 1, sizeof(bestname)), + a->name); else { for (i = 0; a->name[i] && a->name[i] == bestname[i]; i++); bestname[i] = 0; @@ -402,9 +420,9 @@ int mutt_alias_complete (char *s, size_t buflen) } if (bestname[0] != 0) { - if (str_cmp (bestname, s) != 0) { + if (m_strcmp(bestname, s) != 0) { /* we are adding something to the completion */ - strfcpy (s, bestname, str_len (bestname) + 1); + m_strcpy(s, m_strlen(bestname) + 1, bestname); return 1; } @@ -414,9 +432,9 @@ int mutt_alias_complete (char *s, size_t buflen) while (a) { if (a->name && (strstr (a->name, s) == a->name)) { if (!a_list) /* init */ - a_cur = a_list = (ALIAS *) mem_malloc (sizeof (ALIAS)); + a_cur = a_list = p_new(ALIAS, 1); else { - a_cur->next = (ALIAS *) mem_malloc (sizeof (ALIAS)); + a_cur->next = p_new(ALIAS, 1); a_cur = a_cur->next; } memcpy (a_cur, a, sizeof (ALIAS)); @@ -430,13 +448,13 @@ int mutt_alias_complete (char *s, size_t buflen) bestname[0] = 0; mutt_alias_menu (bestname, sizeof (bestname), a_list ? a_list : Aliases); if (bestname[0] != 0) - strfcpy (s, bestname, buflen); + m_strcpy(s, buflen, bestname); /* free the alias list */ while (a_list) { a_cur = a_list; a_list = a_list->next; - mem_free (&a_cur); + p_delete(&a_cur); } /* remove any aliases marked for deletion */ @@ -522,3 +540,198 @@ int mutt_addr_is_user (ADDRESS * addr) debug_print(5, ("no, all failed.\n")); return 0; } + +static const char *alias_format_str (char *dest, size_t destlen, char op, + const char *src, const char *fmt, + const char *ifstring, + const char *elsestring, + unsigned long data, format_flag flags) +{ + char tmp[SHORT_STRING], adr[SHORT_STRING]; + ALIAS *alias = (ALIAS *) data; + + switch (op) { + case 'f': + snprintf (tmp, sizeof (tmp), "%%%ss", fmt); + snprintf (dest, destlen, tmp, alias->del ? "D" : " "); + break; + case 'a': + mutt_format_s (dest, destlen, fmt, alias->name); + break; + case 'r': + adr[0] = 0; + rfc822_write_address (adr, sizeof (adr), alias->addr, 1); + snprintf (tmp, sizeof (tmp), "%%%ss", fmt); + snprintf (dest, destlen, tmp, adr); + break; + case 'n': + snprintf (tmp, sizeof (tmp), "%%%sd", fmt); + snprintf (dest, destlen, tmp, alias->num + 1); + break; + case 't': + dest[0] = alias->tagged ? '*' : ' '; + dest[1] = 0; + break; + } + + return (src); +} + +static void alias_entry (char *s, size_t slen, MUTTMENU * m, int num) +{ + mutt_FormatString (s, slen, NONULL (AliasFmt), alias_format_str, + (unsigned long) ((ALIAS **) m->data)[num], + M_FORMAT_ARROWCURSOR); +} + +static int alias_tag (MUTTMENU * menu, int n, int m) +{ + ALIAS *cur = ((ALIAS **) menu->data)[n]; + int ot = cur->tagged; + + cur->tagged = (m >= 0 ? m : !cur->tagged); + + return cur->tagged - ot; +} + +static int alias_SortAlias (const void *a, const void *b) +{ + ALIAS *pa = *(ALIAS **) a; + ALIAS *pb = *(ALIAS **) b; + int r = m_strcasecmp(pa->name, pb->name); + + return (RSORT (r)); +} + +static int alias_SortAddress (const void *a, const void *b) +{ + ADDRESS *pa = (*(ALIAS **) a)->addr; + ADDRESS *pb = (*(ALIAS **) b)->addr; + int r; + + if (pa == pb) + r = 0; + else if (pa == NULL) + r = -1; + else if (pb == NULL) + r = 1; + else if (pa->personal) { + if (pb->personal) + r = m_strcasecmp(pa->personal, pb->personal); + else + r = 1; + } + else if (pb->personal) + r = -1; + else + r = ascii_strcasecmp (pa->mailbox, pb->mailbox); + return (RSORT (r)); +} + +void mutt_alias_menu (char *buf, size_t buflen, ALIAS * aliases) +{ + ALIAS *aliasp; + MUTTMENU *menu; + ALIAS **AliasTable = NULL; + int t = -1; + int i, done = 0; + int op; + char helpstr[SHORT_STRING]; + + int omax; + + if (!aliases) { + mutt_error _("You have no aliases!"); + + return; + } + + /* tell whoever called me to redraw the screen when I return */ + set_option (OPTNEEDREDRAW); + + menu = mutt_new_menu (); + menu->make_entry = alias_entry; + menu->tag = alias_tag; + menu->menu = MENU_ALIAS; + menu->title = _("Aliases"); + menu->help = + mutt_compile_help (helpstr, sizeof (helpstr), MENU_ALIAS, AliasHelp); + +new_aliases: + + omax = menu->max; + + /* count the number of aliases */ + for (aliasp = aliases; aliasp; aliasp = aliasp->next) { + aliasp->self->del = 0; + aliasp->self->tagged = 0; + menu->max++; + } + + p_realloc(&AliasTable, menu->max); + menu->data = AliasTable; + + for (i = omax, aliasp = aliases; aliasp; aliasp = aliasp->next, i++) { + AliasTable[i] = aliasp->self; + aliases = aliasp; + } + + if ((SortAlias & SORT_MASK) != SORT_ORDER) { + qsort (AliasTable, i, sizeof (ALIAS *), + (SortAlias & SORT_MASK) == + SORT_ADDRESS ? alias_SortAddress : alias_SortAlias); + } + + for (i = 0; i < menu->max; i++) + AliasTable[i]->num = i; + + while (!done) { + if (aliases->next) { + menu->redraw |= REDRAW_FULL; + aliases = aliases->next; + goto new_aliases; + } + + switch ((op = mutt_menuLoop (menu))) { + case OP_DELETE: + case OP_UNDELETE: + if (menu->tagprefix) { + for (i = 0; i < menu->max; i++) + if (AliasTable[i]->tagged) + AliasTable[i]->del = (op == OP_DELETE) ? 1 : 0; + menu->redraw |= REDRAW_INDEX; + } + else { + AliasTable[menu->current]->self->del = (op == OP_DELETE) ? 1 : 0; + menu->redraw |= REDRAW_CURRENT; + if (option (OPTRESOLVE) && menu->current < menu->max - 1) { + menu->current++; + menu->redraw |= REDRAW_INDEX; + } + } + break; + case OP_GENERIC_SELECT_ENTRY: + t = menu->current; + case OP_EXIT: + done = 1; + break; + } + } + + for (i = 0; i < menu->max; i++) { + if (AliasTable[i]->tagged) { + mutt_addrlist_to_local (AliasTable[i]->addr); + rfc822_write_address (buf, buflen, AliasTable[i]->addr, 0); + t = -1; + } + } + + if (t != -1) { + mutt_addrlist_to_local (AliasTable[t]->addr); + rfc822_write_address (buf, buflen, AliasTable[t]->addr, 0); + } + + mutt_menuDestroy (&menu); + p_delete(&AliasTable); + +}