--- /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.sgml.head Sat Jan 12 12:35:43 2002
++++ mutt-1.3.27/doc/manual.sgml.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,495 @@
++/*
++ * 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.
++ */
++
++#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->make_entry = sig_make_entry;
++ menu->tag = NULL;
++ menu->search = sig_menu_search;
++ menu->menu = MENU_SIG;
++ 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;
++}
++
++static SIG_LIST *sig_search_filter (MUTTMENU *menu, char *path)
++{
++ regex_t re;
++ char buf[STRING];
++ SIG_LIST *result = NULL;
++ int i;
++
++ snprintf (buf, sizeof(buf), menu->searchBuf ? menu->searchBuf : "");
++ if (mutt_get_field (_("Search for: "), buf,
++ sizeof (buf), M_CLEAR) != 0 || !buf[0])
++ return (NULL);
++ mutt_str_replace (&menu->searchBuf, buf);
++
++ if ((i = regcomp (&re, menu->searchBuf, REG_NOSUB | REG_EXTENDED | REG_WORDS
++ | mutt_which_case (menu->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->make_entry = sig_dir_make_entry;
++ menu->search = NULL; /* search within files with sig_search_filter() */
++ menu->tag = sig_dir_tag;
++ menu->menu = MENU_SIG_DIR;
++ 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