+++ /dev/null
-diff -pruN2 mutt-1.3.27.orig/Makefile.am mutt-1.3.27/Makefile.am
---- mutt-1.3.27.orig/Makefile.am Fri Nov 9 01:18:28 2001
-+++ mutt-1.3.27/Makefile.am Wed Jan 23 22:35:32 2002
-@@ -25,5 +25,5 @@ mutt_SOURCES = $(BUILT_SOURCES) \
- postpone.c query.c recvattach.c recvcmd.c \
- rfc822.c rfc1524.c rfc2047.c rfc2231.c \
-- score.c send.c sendlib.c signal.c sort.c \
-+ score.c send.c sendlib.c signal.c signature.c sort.c \
- status.c system.c thread.c charset.c history.c lib.c \
- muttlib.c editmsg.c utf8.c mbyte.c wcwidth.c \
-diff -pruN2 mutt-1.3.27.orig/OPS mutt-1.3.27/OPS
---- mutt-1.3.27.orig/OPS Tue Sep 11 12:50:50 2001
-+++ mutt-1.3.27/OPS Wed Jan 23 22:35:32 2002
-@@ -37,4 +37,5 @@ OP_COMPOSE_POSTPONE_MESSAGE "save this m
- OP_COMPOSE_RENAME_FILE "rename/move an attached file"
- OP_COMPOSE_SEND_MESSAGE "send the message"
-+OP_COMPOSE_SIG "choose a signature"
- OP_COMPOSE_TOGGLE_DISPOSITION "toggle disposition between inline/attachment"
- OP_COMPOSE_TOGGLE_UNLINK "toggle whether to delete file after sending it"
-@@ -126,4 +127,5 @@ OP_NEXT_ENTRY "move to the next entry"
- OP_NEXT_LINE "scroll down one line"
- OP_NEXT_PAGE "move to the next page"
-+OP_NEXT_SIG "move to the next signature"
- OP_PAGER_BOTTOM "jump to the bottom of the message"
- OP_PAGER_HIDE_QUOTED "toggle display of quoted text"
-@@ -134,9 +136,11 @@ OP_PREV_ENTRY "move to the previous entr
- OP_PREV_LINE "scroll up one line"
- OP_PREV_PAGE "move to the previous page"
-+OP_PREV_SIG "move to the previous signature"
- OP_PRINT "print the current entry"
- OP_PURGE_MESSAGE "really delete the current entry, bypassing the trash folder"
- OP_QUERY "query external program for addresses"
- OP_QUERY_APPEND "append new query results to current results"
- OP_QUIT "save changes to mailbox and quit"
-+OP_RANDOM_SIG "pick a signature at random"
- OP_RECALL_MESSAGE "recall a postponed message"
- OP_REDRAW "clear and redraw the screen"
-@@ -150,4 +154,5 @@ OP_SEARCH_OPPOSITE "search for next matc
- OP_SEARCH_TOGGLE "toggle search pattern coloring"
- OP_SHELL_ESCAPE "invoke a command in a subshell"
-+OP_SIG_SEARCH "search signatures matching a pattern"
- OP_SORT "sort messages"
- OP_SORT_REVERSE "sort messages in reverse order"
-diff -pruN2 mutt-1.3.27.orig/compose.c mutt-1.3.27/compose.c
---- mutt-1.3.27.orig/compose.c Mon Dec 3 11:17:57 2001
-+++ mutt-1.3.27/compose.c Wed Jan 23 22:35:32 2002
-@@ -1103,4 +1103,10 @@ int mutt_compose_menu (HEADER *msg, /*
- break;
-
-+ case OP_COMPOSE_SIG:
-+ mutt_signature(msg->content->filename);
-+ MAYBE_REDRAW (menu->redraw);
-+ mutt_update_encoding (msg->content);
-+ break;
-+
- case OP_PIPE:
- case OP_FILTER:
-diff -pruN2 mutt-1.3.27.orig/doc/manual.sgml.head mutt-1.3.27/doc/manual.sgml.head
---- mutt-1.3.27.orig/doc/manual.xml.head Sat Jan 12 12:35:43 2002
-+++ mutt-1.3.27/doc/manual.xml.head Wed Jan 23 22:35:32 2002
-@@ -526,4 +526,5 @@ c edit-cc edit the
- b edit-bcc edit the Bcc field
- y send-message send the message
-+ESC s signature-menu select a signature and append it to your mail
- s edit-subject edit the Subject
- f edit-fcc specify an ``Fcc'' mailbox
-diff -pruN2 mutt-1.3.27.orig/functions.h mutt-1.3.27/functions.h
---- mutt-1.3.27.orig/functions.h Tue Sep 11 12:51:39 2001
-+++ mutt-1.3.27/functions.h Wed Jan 23 22:35:32 2002
-@@ -309,4 +309,5 @@ struct binding_t OpCompose[] = {
- { "send-message", OP_COMPOSE_SEND_MESSAGE, "y" },
- { "pipe-entry", OP_PIPE, "|" },
-+ { "signature-menu", OP_COMPOSE_SIG, "\033s" },
-
- #ifdef HAVE_PGP
-@@ -363,4 +364,17 @@ struct binding_t OpQuery[] = {
- { "query", OP_QUERY, "Q" },
- { "query-append", OP_QUERY_APPEND, "A" },
-+ { NULL, 0, NULL }
-+};
-+
-+/* Signature Menu */
-+struct binding_t OpSig[] = {
-+ { "next-sig", OP_NEXT_SIG, "j" },
-+ { "previous-sig", OP_PREV_SIG, "k" },
-+ { "random-sig", OP_RANDOM_SIG, "r" },
-+ { NULL, 0, NULL }
-+};
-+
-+struct binding_t OpSigDir[] = {
-+ { "search-sig", OP_SIG_SEARCH, "/" },
- { NULL, 0, NULL }
- };
-diff -pruN2 mutt-1.3.27.orig/globals.h mutt-1.3.27/globals.h
---- mutt-1.3.27.orig/globals.h Thu Jan 3 21:56:46 2002
-+++ mutt-1.3.27/globals.h Wed Jan 23 22:35:32 2002
-@@ -100,4 +100,5 @@ WHERE char *Sendmail;
- WHERE char *Shell;
- WHERE char *Signature;
-+WHERE char *SigDirectory;
- WHERE char *SimpleSearch;
- WHERE char *Spoolfile;
-diff -pruN2 mutt-1.3.27.orig/init.h mutt-1.3.27/init.h
---- mutt-1.3.27.orig/init.h Mon Dec 10 11:09:03 2001
-+++ mutt-1.3.27/init.h Wed Jan 23 22:35:32 2002
-@@ -1954,4 +1954,12 @@ struct option_t MuttVars[] = {
- ** its stdout.
- */
-+ { "signatures_directory", DT_PATH, R_NONE, UL &SigDirectory, UL "" },
-+ /*
-+ ** .pp
-+ ** Specifies the path where your signatures are located. In the files of
-+ ** this directory, the signatures are separated by blank lines and/or
-+ ** sig_dashes (``-- '').
-+ ** You can choose between these signatures from the compose menu.
-+ */
- { "simple_search", DT_STR, R_NONE, UL &SimpleSearch, UL "~f %s | ~s %s" },
- /*
-diff -pruN2 mutt-1.3.27.orig/keymap.c mutt-1.3.27/keymap.c
---- mutt-1.3.27.orig/keymap.c Tue Oct 16 16:29:02 2001
-+++ mutt-1.3.27/keymap.c Wed Jan 23 22:35:32 2002
-@@ -50,4 +50,6 @@ struct mapping_t Menus[] = {
-
- { "query", MENU_QUERY },
-+ { "signature", MENU_SIG },
-+ { "sig_directory", MENU_SIG_DIR },
- { "generic", MENU_GENERIC },
- { NULL, 0 }
-@@ -528,4 +530,6 @@ void km_init (void)
- create_bindings (OpQuery, MENU_QUERY);
- create_bindings (OpAlias, MENU_ALIAS);
-+ create_bindings (OpSig, MENU_SIG);
-+ create_bindings (OpSigDir, MENU_SIG_DIR);
-
-
-@@ -619,4 +623,7 @@ void km_init (void)
- km_bindkey ("<enter>", MENU_COMPOSE, OP_VIEW_ATTACH);
-
-+ km_bindkey ("<up>", MENU_SIG, OP_PREV_SIG);
-+ km_bindkey ("<down>", MENU_SIG, OP_NEXT_SIG);
-+
- /* edit-to (default "t") hides generic tag-entry in Compose menu
- This will bind tag-entry to "T" in the Compose menu */
-@@ -739,4 +746,8 @@ struct binding_t *km_get_table (int menu
- case MENU_QUERY:
- return OpQuery;
-+ case MENU_SIG:
-+ return OpSig;
-+ case MENU_SIG_DIR:
-+ return OpSigDir;
-
-
-diff -pruN2 mutt-1.3.27.orig/keymap.h mutt-1.3.27/keymap.h
---- mutt-1.3.27.orig/keymap.h Tue Sep 11 12:50:12 2001
-+++ mutt-1.3.27/keymap.h Wed Jan 23 22:35:32 2002
-@@ -60,4 +60,6 @@ enum
- MENU_POST,
- MENU_QUERY,
-+ MENU_SIG,
-+ MENU_SIG_DIR,
-
-
-@@ -102,4 +104,6 @@ extern struct binding_t OpEditor[];
- extern struct binding_t OpQuery[];
- extern struct binding_t OpAlias[];
-+extern struct binding_t OpSig[];
-+extern struct binding_t OpSigDir[];
-
- #ifdef HAVE_PGP
-diff -pruN2 mutt-1.3.27.orig/protos.h mutt-1.3.27/protos.h
---- mutt-1.3.27.orig/protos.h Wed Jan 16 21:43:58 2002
-+++ mutt-1.3.27/protos.h Wed Jan 23 22:35:32 2002
-@@ -225,4 +225,5 @@ void mutt_shell_escape (void);
- void mutt_show_error (void);
- void mutt_signal_init (void);
-+void mutt_signature (char *);
- void mutt_stamp_attachment (BODY *a);
- void mutt_tabs_to_spaces (char *);
-diff -pruN2 mutt-1.3.27.orig/signature.c mutt-1.3.27/signature.c
---- mutt-1.3.27.orig/signature.c Thu Jan 1 01:00:00 1970
-+++ mutt-1.3.27/signature.c Wed Jan 23 22:35:32 2002
-@@ -0,0 +1,505 @@
-+/*
-+ * Copyright (C) 2001 Cedric Duval <cedricduval@free.fr>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
-+ */
-+
-+#if HAVE_CONFIG_H
-+# include "config.h"
-+#endif
-+
-+#include "mutt.h"
-+#include "mutt_menu.h"
-+#include "mapping.h"
-+#include "mutt_curses.h"
-+
-+#include <stdio.h>
-+#include <string.h>
-+#include <stdlib.h>
-+#include <dirent.h>
-+#include <sys/stat.h>
-+
-+#define SIG_DISPLAY_LINES 4
-+#define SEPARATOR(x) ((*x == '\n') || (mutt_strcmp (x, "-- \n") == 0))
-+#define SIG_ADD_LINE(x,y) mutt_add_list (x, strtok (y, "\n"))
-+
-+typedef struct sig_list
-+{
-+ struct sig_list *next;
-+ LIST *sig;
-+} SIG_LIST;
-+
-+typedef struct sig_dir
-+{
-+ struct sig_dir *next;
-+ char *name;
-+} SIG_DIR;
-+
-+typedef LIST * ENTRY;
-+
-+typedef struct entry_dir
-+{
-+ int tagged;
-+ SIG_DIR *data;
-+} ENTRY_DIR;
-+
-+static struct mapping_t SigHelp[] = {
-+ { N_("Exit"), OP_EXIT },
-+ { N_("Search"), OP_SEARCH },
-+ { N_("Random"), OP_RANDOM_SIG },
-+ { N_("Help"), OP_HELP },
-+ { NULL }
-+};
-+
-+static struct mapping_t SigDirHelp[] = {
-+ { N_("Exit"), OP_EXIT },
-+ { N_("Search signature"), OP_SIG_SEARCH },
-+ { N_("Help"), OP_HELP },
-+ { NULL }
-+};
-+
-+void menu_next_entry (MUTTMENU *menu);
-+void menu_prev_entry (MUTTMENU *menu);
-+
-+
-+static int sig_match (LIST *s, regex_t *re)
-+{
-+ while (s)
-+ {
-+ if (regexec (re, s->data, (size_t)0, NULL, (int)0) == 0)
-+ return 1;
-+ s = s->next;
-+ }
-+ return 0;
-+}
-+
-+static void read_sig_file (char *name, SIG_LIST **begin, regex_t *re)
-+{
-+ FILE *fp;
-+ char buf[STRING];
-+ LIST *sig = NULL;
-+ SIG_LIST *first, *cur;
-+ int append = 0;
-+
-+ if (!(fp = safe_fopen (name, "r")))
-+ {
-+ mutt_error (_("Can't open signature file %s"), name);
-+ return;
-+ }
-+
-+ for (first = *begin; first && first->next; first = first->next, append++)
-+ ; /* append results to an existing list */
-+ cur = first;
-+
-+ while (fgets (buf, sizeof (buf), fp))
-+ {
-+ if (buf[0] && !SEPARATOR (buf))
-+ {
-+ sig = SIG_ADD_LINE (NULL, buf);
-+
-+ while (fgets (buf, sizeof (buf), fp) && buf[0] && !SEPARATOR (buf))
-+ SIG_ADD_LINE (sig, buf);
-+
-+ if (re && !sig_match (sig, re))
-+ mutt_free_list (&sig); /* previous sig didn't match the regexp */
-+ else
-+ {
-+ /* add signature */
-+ if (first == NULL)
-+ first = cur = (SIG_LIST *) safe_calloc (1, sizeof (SIG_LIST));
-+ else
-+ {
-+ cur->next = (SIG_LIST *) safe_calloc (1, sizeof (SIG_LIST));
-+ cur = cur->next;
-+ }
-+
-+ cur->sig = sig;
-+ cur->next = NULL;
-+ }
-+ }
-+ }
-+
-+ if (!append)
-+ *begin = first;
-+
-+ safe_fclose (&fp);
-+}
-+
-+static void sig_make_entry (char *s, size_t slen, MUTTMENU *menu, int num)
-+{
-+ ENTRY *table = (ENTRY *) menu->data;
-+
-+ snprintf (s, slen, "%3d %s",
-+ num + 1,
-+ table[num]->data);
-+}
-+
-+static int sig_menu_search (MUTTMENU *menu, regex_t *re, int num)
-+{
-+ return (sig_match (((ENTRY *)menu->data)[num], re) ? 0 : REG_NOMATCH);
-+}
-+
-+static void draw_sig_frame (LIST *s)
-+{
-+ int i;
-+
-+ for (i = 1; i <= SIG_DISPLAY_LINES; i++)
-+ {
-+ if (s)
-+ {
-+ mvaddstr (i, 0, s->data);
-+ s = s->next;
-+ }
-+ else
-+ move (i, 0);
-+
-+ clrtoeol ();
-+ }
-+
-+ SETCOLOR (MT_COLOR_STATUS);
-+ mvaddstr (SIG_DISPLAY_LINES + 1, 0, _("-- Signature"));
-+ BKGDSET (MT_COLOR_STATUS);
-+ clrtoeol ();
-+
-+ BKGDSET (MT_COLOR_NORMAL);
-+ SETCOLOR (MT_COLOR_NORMAL);
-+}
-+
-+static void free_sig_list (SIG_LIST **sigs)
-+{
-+ SIG_LIST *cur;
-+
-+ while (*sigs)
-+ {
-+ cur = *sigs;
-+ *sigs = (*sigs)->next;
-+ mutt_free_list (&cur->sig);
-+ safe_free ((void **)&cur);
-+ }
-+}
-+
-+static void append_signature (char *msg_file, LIST *s)
-+{
-+ FILE *fp;
-+
-+ if ((fp = safe_fopen (msg_file, "a")) == 0)
-+ mutt_perror (msg_file);
-+ else
-+ {
-+ if (option (OPTSIGDASHES))
-+ fputs ("\n-- \n", fp);
-+
-+ for (; s; s = s->next)
-+ fprintf (fp, "%s\n", s->data);
-+
-+ mutt_message (_("Signature appended to your mail"));
-+ safe_fclose (&fp);
-+ }
-+}
-+
-+static LIST *sig_list_menu (char *file, SIG_LIST *list)
-+{
-+ LIST *result = NULL;
-+ SIG_LIST *sigl;
-+ MUTTMENU *menu;
-+ ENTRY *SigTable;
-+ char helpstr[SHORT_STRING], title[SHORT_STRING];
-+ int i, done = 0;
-+
-+ snprintf (title, sizeof (title), _("Signature : %s"), file);
-+
-+ menu = mutt_new_menu (MENU_SIG);
-+ menu->make_entry = sig_make_entry;
-+ menu->tag = NULL;
-+ menu->search = sig_menu_search;
-+ menu->title = title;
-+ menu->help = mutt_compile_help (helpstr, sizeof (helpstr),
-+ MENU_SIG, SigHelp);
-+ menu->offset = SIG_DISPLAY_LINES + 2;
-+ menu->pagelen = LINES - SIG_DISPLAY_LINES - 4;
-+
-+ for (sigl = list; sigl; sigl = sigl->next)
-+ menu->max++;
-+
-+ menu->data = SigTable = (ENTRY *) safe_calloc (menu->max, sizeof (ENTRY));
-+
-+ for (i = 0, sigl = list; sigl; i++, sigl = sigl->next)
-+ SigTable[i] = sigl->sig;
-+
-+ while (!done)
-+ {
-+ switch (mutt_menuLoop (menu))
-+ {
-+ case OP_GENERIC_SELECT_ENTRY:
-+ result = SigTable[menu->current];
-+ done = 1;
-+ break;
-+
-+ case OP_PREV_SIG:
-+ menu_prev_entry (menu);
-+ draw_sig_frame (SigTable[menu->current]);
-+ break;
-+
-+ case OP_NEXT_SIG:
-+ menu_next_entry (menu);
-+ draw_sig_frame (SigTable[menu->current]);
-+ break;
-+
-+ case OP_REDRAW:
-+ menu->offset = SIG_DISPLAY_LINES + 2;
-+ menu->pagelen = LINES - SIG_DISPLAY_LINES - 4;
-+ draw_sig_frame (SigTable[menu->current]);
-+ break;
-+
-+ case OP_RANDOM_SIG:
-+ menu->current = LRAND () % menu->max;
-+ draw_sig_frame (SigTable[menu->current]);
-+ menu->redraw |= REDRAW_MOTION;
-+ break;
-+
-+ case OP_EXIT:
-+ set_option (OPTNEEDREDRAW);
-+ done = 1;
-+ break;
-+ }
-+ }
-+
-+ mutt_menuDestroy (&menu);
-+ safe_free ((void **)&SigTable);
-+ return result;
-+}
-+
-+extern char* SearchBuffers[MENU_MAX];
-+
-+static SIG_LIST *sig_search_filter (MUTTMENU *menu, char *path)
-+{
-+ regex_t re;
-+ char buf[STRING];
-+ SIG_LIST *result = NULL;
-+ int i;
-+ char* searchBuf = menu->menu >= 0 && menu->menu < MENU_MAX ?
-+ SearchBuffers[menu->menu] : NULL;
-+
-+ snprintf (buf, sizeof(buf), searchBuf ? searchBuf : "");
-+ if (mutt_get_field (_("Search for: "), buf,
-+ sizeof (buf), M_CLEAR) != 0 || !buf[0])
-+ return (NULL);
-+ if (menu->menu >= 0 && menu->menu < MENU_MAX)
-+ {
-+ mutt_str_replace (&SearchBuffers[menu->menu], buf);
-+ searchBuf = SearchBuffers[menu->menu];
-+ }
-+
-+ if ((i = regcomp (&re, searchBuf, REG_NOSUB | REG_EXTENDED | REG_WORDS
-+ | mutt_which_case (searchBuf))) != 0)
-+ {
-+ regerror (i, &re, buf, sizeof (buf));
-+ regfree (&re);
-+ mutt_error ("%s", buf);
-+ return (NULL);
-+ }
-+
-+ /* building list of sigs matching the regexp */
-+ for (i = 0; i < menu->max; i++)
-+ {
-+ /* search in every file if none is tagged */
-+ if (((ENTRY_DIR *) menu->data)[i].tagged || (menu->tagged == 0))
-+ {
-+ snprintf (buf, sizeof (buf), "%s/%s", path,
-+ ((ENTRY_DIR *) menu->data)[i].data->name);
-+ read_sig_file (buf, &result, &re);
-+ }
-+ }
-+
-+ regfree (&re);
-+ if (!result)
-+ mutt_error (_("Not found."));
-+
-+ return (result);
-+}
-+
-+/* returns the list of files in this directory */
-+static SIG_DIR *sig_directory (char *path)
-+{
-+ DIR *dp;
-+ struct dirent *de;
-+ struct stat s;
-+ SIG_DIR *first = NULL, *cur = NULL;
-+ char file[_POSIX_PATH_MAX + SHORT_STRING];
-+
-+ if ((dp = opendir (path)) == NULL)
-+ {
-+ mutt_perror (path);
-+ return (NULL);
-+ }
-+
-+ while ((de = readdir (dp)))
-+ {
-+ if ((de->d_name)[0] == '.') /* no hidden files */
-+ continue;
-+
-+ snprintf (file, sizeof (file), "%s/%s", path, de->d_name);
-+ if (lstat (file, &s) == -1)
-+ continue;
-+
-+ if ((!S_ISREG (s.st_mode)) && (!S_ISLNK (s.st_mode)))
-+ continue;
-+
-+ if (first == NULL)
-+ cur = first = safe_calloc (1, sizeof (SIG_DIR));
-+ else
-+ {
-+ cur->next = safe_calloc (1, sizeof (SIG_DIR));
-+ cur = cur->next;
-+ }
-+ cur->name = safe_strdup (de->d_name);
-+ cur->next = NULL;
-+ }
-+ closedir (dp);
-+ return first;
-+}
-+
-+static void sig_dir_make_entry (char *s, size_t slen, MUTTMENU *menu, int num)
-+{
-+ ENTRY_DIR *table = (ENTRY_DIR *) menu->data;
-+
-+ snprintf (s, slen, "%c %3d - %s",
-+ table[num].tagged ? '*' : ' ',
-+ num + 1,
-+ table[num].data->name);
-+}
-+
-+static int sig_dir_tag (MUTTMENU *menu, int n, int m)
-+{
-+ ENTRY_DIR *cur = &((ENTRY_DIR *) menu->data)[n];
-+ int ot = cur->tagged;
-+
-+ cur->tagged = m >= 0 ? m : !cur->tagged;
-+ return cur->tagged - ot;
-+
-+}
-+
-+static int sig_dir_sort (const void *a, const void *b)
-+{
-+ ENTRY_DIR *pa = (ENTRY_DIR *) a;
-+ ENTRY_DIR *pb = (ENTRY_DIR *) b;
-+
-+ return (mutt_strcmp (pa->data->name, pb->data->name));
-+}
-+
-+static int sig_dir_menu (char *path, char *msg_file)
-+{
-+ MUTTMENU *menu;
-+ SIG_LIST *sigl;
-+ LIST *result = NULL;
-+ ENTRY_DIR *FileTable;
-+ SIG_DIR *list, *files;
-+ char buf[STRING], helpstr[SHORT_STRING], title[SHORT_STRING];
-+ int i, done = 0;
-+
-+ if ((list = sig_directory (path)) == NULL)
-+ return -1;
-+
-+ snprintf (title, sizeof (title), "Signature directory : %s", path);
-+
-+ menu = mutt_new_menu (MENU_SIG_DIR);
-+ menu->make_entry = sig_dir_make_entry;
-+ menu->search = NULL; /* search within files with sig_search_filter() */
-+ menu->tag = sig_dir_tag;
-+ menu->title = title;
-+ menu->help = mutt_compile_help (helpstr, sizeof (helpstr),
-+ MENU_SIG_DIR, SigDirHelp);
-+
-+ for (files = list; files; files = files->next)
-+ menu->max++;
-+
-+ menu->data = FileTable = (ENTRY_DIR *) safe_calloc (menu->max,
-+ sizeof (ENTRY_DIR));
-+
-+ for (i = 0, files = list; files; i++, files = files->next)
-+ FileTable[i].data = files;
-+
-+ qsort (FileTable, menu->max, sizeof (ENTRY_DIR), sig_dir_sort);
-+
-+ while (!done)
-+ {
-+ switch (mutt_menuLoop (menu))
-+ {
-+ case OP_SIG_SEARCH:
-+ sigl = sig_search_filter (menu, path);
-+
-+ if (sigl)
-+ {
-+ if ((result = sig_list_menu (_("query results"), sigl)) != NULL)
-+ {
-+ append_signature (msg_file, result);
-+ done = 1;
-+ }
-+
-+ MAYBE_REDRAW (menu->redraw);
-+ free_sig_list (&sigl);
-+ }
-+ break;
-+
-+ case OP_GENERIC_SELECT_ENTRY:
-+ snprintf (buf, sizeof (buf), "%s/%s", path,
-+ FileTable[menu->current].data->name);
-+ sigl = NULL;
-+ read_sig_file (buf, &sigl, NULL);
-+
-+ if (sigl)
-+ {
-+ if ((result = sig_list_menu (buf, sigl)) != NULL)
-+ {
-+ append_signature (msg_file, result);
-+ done = 1;
-+ }
-+
-+ MAYBE_REDRAW (menu->redraw);
-+ free_sig_list (&sigl);
-+ }
-+ break;
-+
-+ case OP_EXIT:
-+ done = 1;
-+ break;
-+ }
-+ }
-+
-+ while (list)
-+ {
-+ safe_free ((void **)&list->name);
-+ files = list;
-+ list = list->next;
-+ safe_free ((void **)&files);
-+ }
-+ safe_free ((void **)&FileTable);
-+ mutt_menuDestroy (&menu);
-+ return 0;
-+}
-+
-+void mutt_signature (char *msg_file)
-+{
-+ if (!SigDirectory)
-+ {
-+ mutt_error (_("variable 'signatures_directory' is unset"));
-+ return;
-+ }
-+
-+ if (sig_dir_menu (SigDirectory, msg_file) == -1)
-+ mutt_error (_("%s: no files in this directory"), SigDirectory);
-+ else
-+ set_option (OPTNEEDREDRAW);
-+}
-diff -pruN mutt-1.3.27.orig/PATCHES mutt-1.3.27/PATCHES
---- mutt-1.3.27.orig/PATCHES Mon Nov 26 20:16:52 2001
-+++ mutt-1.3.27/PATCHES Thu Dec 6 16:27:55 2001
-@@ -1,0 +1 @@
-+patch-1.3.27.cd.signatures_menu.2.1
-diff --git a/menu.c b/menu.c
---- a/menu.c
-+++ b/menu.c
-@@ -642,7 +640,7 @@
- mutt_error _("No entries.");
- }
-
--static void menu_next_entry (MUTTMENU *menu)
-+void menu_next_entry (MUTTMENU *menu)
- {
- if (menu->current < menu->max - 1)
- {
-@@ -653,7 +651,7 @@
- mutt_error _("You are on the last entry.");
- }
-
--static void menu_prev_entry (MUTTMENU *menu)
-+void menu_prev_entry (MUTTMENU *menu)
- {
- if (menu->current)
- {