more charset improvements.
[apps/madmutt.git] / init.c
diff --git a/init.c b/init.c
index d0c25e1..583b02d 100644 (file)
--- a/init.c
+++ b/init.c
 # include "config.h"
 #endif
 
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/utsname.h>
+#include <errno.h>
+#include <sys/wait.h>
+
 #include <lib-lib/mem.h>
 #include <lib-lib/str.h>
 #include <lib-lib/file.h>
 #include <lib-lib/macros.h>
 #include <lib-lib/buffer.h>
 #include <lib-lib/mapping.h>
+#include <lib-lib/rx.h>
+
+#include <lib-sys/unix.h>
+#include <lib-sys/mutt_ssl.h>
+
+#include <lib-ui/curses.h>
+#include <lib-ui/history.h>
 
 #include "mutt.h"
-#include "mutt_curses.h"
-#include "history.h"
 #include "keymap.h"
-#include "mbyte.h"
 #include "charset.h"
 #include "thread.h"
-#include "mutt_crypt.h"
+#include <lib-crypt/crypt.h>
 #include "mutt_idna.h"
 
-#if defined(USE_SSL) || defined(USE_GNUTLS)
-#include "mutt_ssl.h"
-#endif
-
 #if defined (USE_LIBESMTP) && (defined (USE_SSL) || defined (USE_GNUTLS))
 #include "mutt_libesmtp.h"
 #endif
 
+#include "alias.h"
 #include "mx.h"
 #include "init.h"
 
-#include "lib/rx.h"
 #include "lib/list.h"
-#include "lib/debug.h"
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/utsname.h>
-#include <errno.h>
-#include <sys/wait.h>
 
 /*
  * prototypes
@@ -61,7 +60,7 @@
 static const struct mapping_t* get_sortmap (struct option_t* option);
 static int parse_sort (struct option_t* dst, const char *s,
                        const struct mapping_t *map,
-                       char* errbuf, size_t errlen);
+                       char* errbuf, ssize_t errlen);
 
 static HASH *ConfigOptions = NULL;
 
@@ -82,22 +81,18 @@ static int CurRCLine = 0;
 
 /* prototypes for checking for special vars */
 static int check_dsn_return (const char* option, unsigned long val,
-                             char* errbuf, size_t errlen);
+                             char* errbuf, ssize_t errlen);
 static int check_dsn_notify (const char* option, unsigned long val,
-                             char* errbuf, size_t errlen);
+                             char* errbuf, ssize_t errlen);
 static int check_history    (const char* option, unsigned long val,
-                             char* errbuf, size_t errlen);
+                             char* errbuf, ssize_t errlen);
 /* this checks that numbers are >= 0 */
 static int check_num        (const char* option, unsigned long val,
-                             char* errbuf, size_t errlen);
-#ifdef DEBUG
-static int check_debug      (const char* option, unsigned long val,
-                             char* errbuf, size_t errlen);
-#endif
+                             char* errbuf, ssize_t errlen);
 
 /* use this to check only */
 static int check_special (const char* option, unsigned long val,
-                          char* errbuf, size_t errlen);
+                          char* errbuf, ssize_t errlen);
 
 /* variable <-> sanity check function mappings
  * when changing these, make sure the proper _from_string handler
@@ -106,7 +101,7 @@ static int check_special (const char* option, unsigned long val,
 static struct {
   const char* name;
   int (*check) (const char* option, unsigned long val,
-                char* errbuf, size_t errlen);
+                char* errbuf, ssize_t errlen);
 } SpecialVars[] = {
   { "dsn_notify",               check_dsn_notify },
   { "dsn_return",               check_dsn_return },
@@ -115,52 +110,49 @@ static struct {
 #endif
   { "history",                  check_history },
   { "pager_index_lines",        check_num },
-#ifdef DEBUG
-  { "debug_level",              check_debug },
-#endif
   /* last */
   { NULL,         NULL }
 };
 
 /* protos for config type handles: convert value to string */
-static void bool_to_string  (char* dst, size_t dstlen, struct option_t* option);
-static void num_to_string   (char* dst, size_t dstlen, struct option_t* option);
-static void str_to_string   (char* dst, size_t dstlen, struct option_t* option);
-static void quad_to_string  (char* dst, size_t dstlen, struct option_t* option);
-static void sort_to_string  (char* dst, size_t dstlen, struct option_t* option);
-static void rx_to_string    (char* dst, size_t dstlen, struct option_t* option);
-static void magic_to_string (char* dst, size_t dstlen, struct option_t* option);
-static void addr_to_string  (char* dst, size_t dstlen, struct option_t* option);
-static void user_to_string  (char* dst, size_t dstlen, struct option_t* option);
-static void sys_to_string   (char* dst, size_t dstlen, struct option_t* option);
+static void bool_to_string  (char* dst, ssize_t dstlen, struct option_t* option);
+static void num_to_string   (char* dst, ssize_t dstlen, struct option_t* option);
+static void str_to_string   (char* dst, ssize_t dstlen, struct option_t* option);
+static void quad_to_string  (char* dst, ssize_t dstlen, struct option_t* option);
+static void sort_to_string  (char* dst, ssize_t dstlen, struct option_t* option);
+static void rx_to_string    (char* dst, ssize_t dstlen, struct option_t* option);
+static void magic_to_string (char* dst, ssize_t dstlen, struct option_t* option);
+static void addr_to_string  (char* dst, ssize_t dstlen, struct option_t* option);
+static void user_to_string  (char* dst, ssize_t dstlen, struct option_t* option);
+static void sys_to_string   (char* dst, ssize_t dstlen, struct option_t* option);
 
 /* protos for config type handles: convert to value from string */
 static int bool_from_string  (struct option_t* dst, const char* val,
-                              char* errbuf, size_t errlen);
+                              char* errbuf, ssize_t errlen);
 static int num_from_string   (struct option_t* dst, const char* val,
-                              char* errbuf, size_t errlen);
+                              char* errbuf, ssize_t errlen);
 static int str_from_string   (struct option_t* dst, const char* val,
-                              char* errbuf, size_t errlen);
+                              char* errbuf, ssize_t errlen);
 static int path_from_string  (struct option_t* dst, const char* val,
-                              char* errbuf, size_t errlen);
+                              char* errbuf, ssize_t errlen);
 static int quad_from_string  (struct option_t* dst, const char* val,
-                              char* errbuf, size_t errlen);
+                              char* errbuf, ssize_t errlen);
 static int sort_from_string  (struct option_t* dst, const char* val,
-                              char* errbuf, size_t errlen);
+                              char* errbuf, ssize_t errlen);
 static int rx_from_string    (struct option_t* dst, const char* val,
-                              char* errbuf, size_t errlen);
+                              char* errbuf, ssize_t errlen);
 static int magic_from_string (struct option_t* dst, const char* val,
-                              char* errbuf, size_t errlen);
+                              char* errbuf, ssize_t errlen);
 static int addr_from_string  (struct option_t* dst, const char* val,
-                              char* errbuf, size_t errlen);
+                              char* errbuf, ssize_t errlen);
 static int user_from_string  (struct option_t* dst, const char* val,
-                              char* errbuf, size_t errlen);
+                              char* errbuf, ssize_t errlen);
 
 static struct {
   unsigned short type;
-  void (*opt_to_string) (char* dst, size_t dstlen, struct option_t* option);
+  void (*opt_to_string) (char* dst, ssize_t dstlen, struct option_t* option);
   int (*opt_from_string) (struct option_t* dst, const char* val,
-                          char* errbuf, size_t errlen);
+                          char* errbuf, ssize_t errlen);
 } FuncTable[] = {
   { 0,          NULL,             NULL }, /* there's no DT_ type with 0 */
   { DT_BOOL,    bool_to_string,   bool_from_string },
@@ -179,7 +171,7 @@ static struct {
   { DT_SYS,     sys_to_string,    NULL },
 };
 
-static void bool_to_string (char* dst, size_t dstlen,
+static void bool_to_string (char* dst, ssize_t dstlen,
                             struct option_t* option) {
   snprintf (dst, dstlen, "%s=%s", option->option,
             option (option->data) ? "yes" : "no");
@@ -187,7 +179,7 @@ static void bool_to_string (char* dst, size_t dstlen,
 
 static int bool_from_string (struct option_t* dst, const char* val,
                              char* errbuf __attribute__ ((unused)),
-                             size_t errlen __attribute__ ((unused))) {
+                             ssize_t errlen __attribute__ ((unused))) {
   int flag = -1;
 
   if (!dst)
@@ -206,7 +198,7 @@ static int bool_from_string (struct option_t* dst, const char* val,
   return (1);
 }
 
-static void num_to_string (char* dst, size_t dstlen,
+static void num_to_string (char* dst, ssize_t dstlen,
                            struct option_t* option) {
   /* XXX puke */
   const char* fmt = (m_strcmp(option->option, "umask") == 0) ?
@@ -216,7 +208,7 @@ static void num_to_string (char* dst, size_t dstlen,
 }
 
 static int num_from_string (struct option_t* dst, const char* val,
-                            char* errbuf, size_t errlen) {
+                            char* errbuf, ssize_t errlen) {
   int num = 0, old = 0;
   char* t = NULL;
 
@@ -246,32 +238,32 @@ static int num_from_string (struct option_t* dst, const char* val,
   return (1);
 }
 
-static void str_to_string (char* dst, size_t dstlen,
+static void str_to_string (char* dst, ssize_t dstlen,
                            struct option_t* option) {
   snprintf (dst, dstlen, "%s=\"%s\"", option->option,
             NONULL (*((char**) option->data)));
 }
 
-static void user_to_string (char* dst, size_t dstlen,
+static void user_to_string (char* dst, ssize_t dstlen,
                             struct option_t* option) {
   snprintf (dst, dstlen, "%s=\"%s\"", option->option,
             NONULL (((char*) option->data)));
 }
 
-static void sys_to_string (char* dst, size_t dstlen,
+static void sys_to_string (char* dst, ssize_t dstlen,
                            struct option_t* option) {
   char *val = NULL, *t = NULL;
   int clean = 0;
 
-  /* get some $muttng_ values dynamically */
-  if (ascii_strcmp ("muttng_pwd", option->option) == 0) {
+  /* get some $madmutt_ values dynamically */
+  if (ascii_strcmp ("madmutt_pwd", option->option) == 0) {
     val = p_new(char, _POSIX_PATH_MAX);
     val = getcwd (val, _POSIX_PATH_MAX-1);
     clean = 1;
-  } else if (ascii_strcmp ("muttng_folder_path", option->option) == 0 &&
+  } else if (ascii_strcmp ("madmutt_folder_path", option->option) == 0 &&
              CurrentFolder && *CurrentFolder) {
     val = CurrentFolder;
-  } else if (ascii_strcmp ("muttng_folder_name", option->option) == 0 &&
+  } else if (ascii_strcmp ("madmutt_folder_name", option->option) == 0 &&
              CurrentFolder && *CurrentFolder) {
 
     ssize_t Maildirlength = m_strlen(Maildir);
@@ -302,7 +294,7 @@ static void sys_to_string (char* dst, size_t dstlen,
 }
 
 static int path_from_string (struct option_t* dst, const char* val,
-                             char* errbuf __attribute__ ((unused)), size_t errlen __attribute__ ((unused))) {
+                             char* errbuf __attribute__ ((unused)), ssize_t errlen __attribute__ ((unused))) {
   char path[_POSIX_PATH_MAX];
 
   if (!dst)
@@ -321,7 +313,7 @@ static int path_from_string (struct option_t* dst, const char* val,
 }
 
 static int str_from_string (struct option_t* dst, const char* val,
-                            char* errbuf, size_t errlen) {
+                            char* errbuf, ssize_t errlen) {
   if (!dst)
     return (0);
 
@@ -333,7 +325,7 @@ static int str_from_string (struct option_t* dst, const char* val,
 }
 
 static int user_from_string (struct option_t* dst, const char* val,
-                             char* errbuf __attribute__ ((unused)), size_t errlen __attribute__ ((unused))) {
+                             char* errbuf __attribute__ ((unused)), ssize_t errlen __attribute__ ((unused))) {
   /* if dst == NULL, we may get here in case the user did unset it,
    * see parse_set() where item is free()'d before coming here; so
    * just silently ignore it */
@@ -350,7 +342,7 @@ static int user_from_string (struct option_t* dst, const char* val,
   return (1);
 }
 
-static void quad_to_string (char* dst, size_t dstlen,
+static void quad_to_string (char* dst, ssize_t dstlen,
                             struct option_t* option) {
   const char *vals[] = { "no", "yes", "ask-no", "ask-yes" };
   snprintf (dst, dstlen, "%s=%s", option->option,
@@ -358,7 +350,7 @@ static void quad_to_string (char* dst, size_t dstlen,
 }
 
 static int quad_from_string (struct option_t* dst, const char* val,
-                             char* errbuf __attribute__ ((unused)), size_t errlen __attribute__ ((unused))) {
+                             char* errbuf __attribute__ ((unused)), ssize_t errlen __attribute__ ((unused))) {
   int flag = -1;
 
   if (!dst)
@@ -379,7 +371,7 @@ static int quad_from_string (struct option_t* dst, const char* val,
   return (1);
 }
 
-static void sort_to_string (char* dst, size_t dstlen,
+static void sort_to_string (char* dst, ssize_t dstlen,
                             struct option_t* option) {
   const struct mapping_t *map = get_sortmap (option);
   const char *p = NULL;
@@ -399,7 +391,7 @@ static void sort_to_string (char* dst, size_t dstlen,
 }
 
 static int sort_from_string (struct option_t* dst, const char* val,
-                             char* errbuf, size_t errlen) {
+                             char* errbuf, ssize_t errlen) {
   const struct mapping_t *map = NULL;
   if (!(map = get_sortmap (dst))) {
     if (errbuf)
@@ -412,7 +404,7 @@ static int sort_from_string (struct option_t* dst, const char* val,
   return (1);
 }
 
-static void rx_to_string (char* dst, size_t dstlen,
+static void rx_to_string (char* dst, ssize_t dstlen,
                           struct option_t* option) {
   rx_t* p = (rx_t*) option->data;
   snprintf (dst, dstlen, "%s=\"%s\"", option->option,
@@ -420,7 +412,7 @@ static void rx_to_string (char* dst, size_t dstlen,
 }
 
 static int rx_from_string (struct option_t* dst, const char* val,
-                           char* errbuf, size_t errlen) {
+                           char* errbuf, ssize_t errlen) {
   rx_t* p = NULL;
   regex_t* rx = NULL;
   int flags = 0, e = 0, not = 0;
@@ -478,7 +470,7 @@ static int rx_from_string (struct option_t* dst, const char* val,
   return (1);
 }
 
-static void magic_to_string (char* dst, size_t dstlen,
+static void magic_to_string (char* dst, ssize_t dstlen,
                              struct option_t* option) {
   const char* s = NULL;
   switch (option->data) {
@@ -492,7 +484,7 @@ static void magic_to_string (char* dst, size_t dstlen,
 }
 
 static int magic_from_string (struct option_t* dst, const char* val,
-                              char* errbuf __attribute__ ((unused)), size_t errlen __attribute__ ((unused))) {
+                              char* errbuf __attribute__ ((unused)), ssize_t errlen __attribute__ ((unused))) {
   int flag = -1;
 
   if (!dst || !val || !*val)
@@ -514,7 +506,7 @@ static int magic_from_string (struct option_t* dst, const char* val,
 
 }
 
-static void addr_to_string (char* dst, size_t dstlen,
+static void addr_to_string (char* dst, ssize_t dstlen,
                             struct option_t* option) {
   char s[HUGE_STRING];
   s[0] = '\0';
@@ -523,22 +515,21 @@ static void addr_to_string (char* dst, size_t dstlen,
 }
 
 static int addr_from_string (struct option_t* dst, const char* val,
-                             char* errbuf __attribute__ ((unused)), size_t errlen __attribute__ ((unused))) {
+                             char* errbuf __attribute__ ((unused)), ssize_t errlen __attribute__ ((unused))) {
   if (!dst)
     return (0);
-  address_delete ((address_t**) dst->data);
+  address_list_wipe((address_t**) dst->data);
   if (val && *val)
     *((address_t**) dst->data) = rfc822_parse_adrlist (NULL, val);
   return (1);
 }
 
-int mutt_option_value (const char* val, char* dst, size_t dstlen) {
+int mutt_option_value (const char* val, char* dst, ssize_t dstlen) {
   struct option_t* option = NULL;
   char* tmp = NULL, *t = NULL;
-  size_t l = 0;
+  ssize_t l = 0;
 
   if (!(option = hash_find (ConfigOptions, val))) {
-    debug_print (1, ("var '%s' not found\n", val));
     *dst = '\0';
     return (0);
   }
@@ -547,7 +538,6 @@ int mutt_option_value (const char* val, char* dst, size_t dstlen) {
 
   /* as we get things of type $var=value and don't want to bloat the
    * above "just" for expansion, we do the stripping here */
-  debug_print (1, ("orig == '%s'\n", tmp));
   t = strchr (tmp, '=');
   t++;
   l = m_strlen(t);
@@ -559,7 +549,6 @@ int mutt_option_value (const char* val, char* dst, size_t dstlen) {
   }
   memcpy (dst, t, l+1);
   p_delete(&tmp);
-  debug_print (1, ("stripped == '%s'\n", dst));
 
   return (1);
 }
@@ -623,9 +612,9 @@ int query_quadoption (int opt, const char *prompt)
   /* not reached */
 }
 
-static void add_to_list (LIST ** list, const char *str)
+static void add_to_list (string_list_t ** list, const char *str)
 {
-  LIST *t, *last = NULL;
+  string_list_t *t, *last = NULL;
 
   /* don't add a NULL or empty string to the list */
   if (!str || *str == '\0')
@@ -643,7 +632,7 @@ static void add_to_list (LIST ** list, const char *str)
   }
 
   if (!*list || last) {
-    t = p_new(LIST, 1);
+    t = p_new(string_list_t, 1);
     t->data = m_strdup(str);
     if (last) {
       last->next = t;
@@ -670,7 +659,7 @@ static int add_to_rx_list (list2_t** list, const char *s, int flags,
 
   i = rx_lookup ((*list), rx->pattern);
   if (i >= 0)
-    rx_free (&rx);
+    rx_delete(&rx);
   else
     list_push_back (list, rx);
   return 0;
@@ -753,7 +742,7 @@ static int remove_from_spam_list (SPAM_LIST ** list, const char *pat)
     return 0;
   if (spam->rx && !m_strcmp(spam->rx->pattern, pat)) {
     *list = spam->next;
-    rx_free (&spam->rx);
+    rx_delete(&spam->rx);
     p_delete(&spam->template);
     p_delete(&spam);
     return 1;
@@ -763,7 +752,7 @@ static int remove_from_spam_list (SPAM_LIST ** list, const char *pat)
   for (spam = prev->next; spam;) {
     if (!m_strcmp(spam->rx->pattern, pat)) {
       prev->next = spam->next;
-      rx_free (&spam->rx);
+      rx_delete(&spam->rx);
       p_delete(&spam->template);
       p_delete(&spam);
       spam = prev->next;
@@ -777,12 +766,12 @@ static int remove_from_spam_list (SPAM_LIST ** list, const char *pat)
 }
 
 
-static void remove_from_list (LIST ** l, const char *str)
+static void remove_from_list (string_list_t ** l, const char *str)
 {
-  LIST *p, *last = NULL;
+  string_list_t *p, *last = NULL;
 
   if (m_strcmp("*", str) == 0)
-    mutt_free_list (l);         /* ``unCMD *'' means delete all current entries */
+    string_list_wipe(l);         /* ``unCMD *'' means delete all current entries */
   else {
     p = *l;
     last = NULL;
@@ -808,14 +797,14 @@ static int remove_from_rx_list (list2_t** l, const char *str)
   int i = 0;
 
   if (m_strcmp("*", str) == 0) {
-    list_del (l, (list_del_t*) rx_free);
+    list_del (l, (list_del_t*) rx_delete);
     return (0);
   }
   else {
     i = rx_lookup ((*l), str);
     if (i >= 0) {
       rx_t* r = list_pop_idx ((*l), i);
-      rx_free (&r);
+      rx_delete(&r);
       return (0);
     }
   }
@@ -924,7 +913,7 @@ static int parse_list (BUFFER * buf, BUFFER * s,
 {
   do {
     mutt_extract_token (buf, s, 0);
-    add_to_list ((LIST **) data, buf->data);
+    add_to_list ((string_list_t **) data, buf->data);
   }
   while (MoreArgs (s));
 
@@ -1025,7 +1014,7 @@ static int parse_spam_list (BUFFER * buf, BUFFER * s, unsigned long data,
     /* "*" is a special case. */
     if (!m_strcmp(buf->data, "*")) {
       mutt_free_spam_list (&SpamList);
-      list_del (&NoSpamList, (list_del_t*) rx_free);
+      list_del (&NoSpamList, (list_del_t*) rx_delete);
       return 0;
     }
 
@@ -1054,10 +1043,10 @@ static int parse_unlist (BUFFER * buf, BUFFER * s, unsigned long data,
      * Check for deletion of entire list
      */
     if (m_strcmp(buf->data, "*") == 0) {
-      mutt_free_list ((LIST **) data);
+      string_list_wipe((string_list_t **) data);
       break;
     }
-    remove_from_list ((LIST **) data, buf->data);
+    remove_from_list ((string_list_t **) data, buf->data);
   }
   while (MoreArgs (s));
 
@@ -1089,21 +1078,18 @@ static void _attachments_clean (void) {
   }
 }
 
-static int parse_attach_list (BUFFER *buf, BUFFER *s, LIST **ldata,
+static int parse_attach_list (BUFFER *buf, BUFFER *s, string_list_t **ldata,
                               BUFFER *err __attribute__ ((unused))) {
   ATTACH_MATCH *a;
-  LIST *listp, *lastp;
+  string_list_t *listp, *lastp;
   char *p;
   char *tmpminor;
   int len;
 
   /* Find the last item in the list that data points to. */
   lastp = NULL;
-  debug_print (5, ("parse_attach_list: ldata = %p, *ldata = %p\n",
-                   ldata, *ldata));
   for (listp = *ldata; listp; listp = listp->next) {
     a = (ATTACH_MATCH *)listp->data;
-    debug_print (5, ("parse_attach_list: skipping %s/%s\n", a->major, a->minor));
     lastp = listp;
   }
 
@@ -1143,10 +1129,7 @@ static int parse_attach_list (BUFFER *buf, BUFFER *s, LIST **ldata,
 
     p_delete(&tmpminor);
 
-    debug_print (5, ("parse_attach_list: added %s/%s [%d]\n",
-                     a->major, a->minor, a->major_int));
-
-    listp = p_new(LIST, 1);
+    listp = p_new(string_list_t, 1);
     listp->data = (char *)a;
     listp->next = NULL;
     if (lastp) {
@@ -1162,10 +1145,10 @@ static int parse_attach_list (BUFFER *buf, BUFFER *s, LIST **ldata,
   return 0;
 }
 
-static int parse_unattach_list (BUFFER *buf, BUFFER *s, LIST **ldata,
+static int parse_unattach_list (BUFFER *buf, BUFFER *s, string_list_t **ldata,
                                 BUFFER *err __attribute__ ((unused))) {
   ATTACH_MATCH *a;
-  LIST *lp, *lastp, *newlp;
+  string_list_t *lp, *lastp, *newlp;
   char *tmp;
   int major;
   char *minor;
@@ -1189,15 +1172,11 @@ static int parse_unattach_list (BUFFER *buf, BUFFER *s, LIST **ldata,
     major = mutt_check_mime_type(tmp);
 
     /* We must do our own walk here because remove_from_list() will only
-     * remove the LIST->data, not anything pointed to by the LIST->data. */
+     * remove the string_list_t->data, not anything pointed to by the string_list_t->data. */
     lastp = NULL;
     for(lp = *ldata; lp; ) {
       a = (ATTACH_MATCH *)lp->data;
-      debug_print(5, ("parse_unattach_list: check %s/%s [%d] : %s/%s [%d]\n",
-                      a->major, a->minor, a->major_int, tmp, minor, major));
       if (a->major_int == major && !m_strcasecmp(minor, a->minor)) {
-        debug_print(5, ("parse_unattach_list: removed %s/%s [%d]\n",
-                        a->major, a->minor, a->major_int));
         regfree(&a->minor_rx);
         p_delete(&a->major);
 
@@ -1225,7 +1204,7 @@ static int parse_unattach_list (BUFFER *buf, BUFFER *s, LIST **ldata,
   return 0;
 }
 
-static int print_attach_list (LIST *lp, char op, const char *name) {
+static int print_attach_list (string_list_t *lp, char op, const char *name) {
   while (lp) {
     printf("attachments %c%s %s/%s\n", op, name,
            ((ATTACH_MATCH *)lp->data)->major,
@@ -1240,7 +1219,7 @@ static int parse_attachments (BUFFER *buf, BUFFER *s,
                               unsigned long data __attribute__ ((unused)),
                               BUFFER *err) {
   char op, *category;
-  LIST **listp;
+  string_list_t **listp;
 
   mutt_extract_token(buf, s, 0);
   if (!buf->data || *buf->data == '\0') {
@@ -1290,7 +1269,7 @@ static int parse_attachments (BUFFER *buf, BUFFER *s,
 
 static int parse_unattachments (BUFFER *buf, BUFFER *s, unsigned long data __attribute__ ((unused)), BUFFER *err) {
   char op, *p;
-  LIST **listp;
+  string_list_t **listp;
 
   mutt_extract_token(buf, s, 0);
   if (!buf->data || *buf->data == '\0') {
@@ -1381,7 +1360,7 @@ static int parse_unalias (BUFFER * buf, BUFFER * s,
                           unsigned long data __attribute__ ((unused)),
                           BUFFER * err __attribute__ ((unused)))
 {
-  ALIAS *tmp, *last = NULL;
+  alias_t *tmp, *last = NULL;
 
   do {
     mutt_extract_token (buf, s, 0);
@@ -1393,7 +1372,7 @@ static int parse_unalias (BUFFER * buf, BUFFER * s,
         set_option (OPTFORCEREDRAWINDEX);
       }
       else
-        mutt_free_alias (&Aliases);
+        alias_list_wipe(&Aliases);
       break;
     }
     else
@@ -1410,7 +1389,7 @@ static int parse_unalias (BUFFER * buf, BUFFER * s,
           else
             Aliases = tmp->next;
           tmp->next = NULL;
-          mutt_free_alias (&tmp);
+          alias_list_wipe(&tmp);
           break;
         }
         last = tmp;
@@ -1424,9 +1403,9 @@ static int parse_alias (BUFFER * buf, BUFFER * s,
                         unsigned long data __attribute__ ((unused)),
                         BUFFER * err)
 {
-  ALIAS *tmp = Aliases;
-  ALIAS *last = NULL;
-  char *estr = NULL;
+  alias_t *tmp = Aliases;
+  alias_t *last = NULL;
+  const char *estr = NULL;
 
   if (!MoreArgs (s)) {
     m_strcpy(err->data, err->dsize, _("alias: no address"));
@@ -1435,8 +1414,6 @@ static int parse_alias (BUFFER * buf, BUFFER * s,
 
   mutt_extract_token (buf, s, 0);
 
-  debug_print (2, ("first token is '%s'.\n", buf->data));
-
   /* check to see if an alias with this name already exists */
   for (; tmp; tmp = tmp->next) {
     if (!m_strcasecmp(tmp->name, buf->data))
@@ -1446,8 +1423,7 @@ static int parse_alias (BUFFER * buf, BUFFER * s,
 
   if (!tmp) {
     /* create a new alias */
-    tmp = p_new(ALIAS, 1);
-    tmp->self = tmp;
+    tmp = alias_new();
     tmp->name = m_strdup(buf->data);
     /* give the main addressbook code a chance */
     if (CurrentMenu == MENU_ALIAS)
@@ -1455,14 +1431,13 @@ static int parse_alias (BUFFER * buf, BUFFER * s,
   }
   else {
     /* override the previous value */
-    address_delete (&tmp->addr);
+    address_list_wipe(&tmp->addr);
     if (CurrentMenu == MENU_ALIAS)
       set_option (OPTFORCEREDRAWINDEX);
   }
 
   mutt_extract_token (buf, s,
                       M_TOKEN_QUOTE | M_TOKEN_SPACE | M_TOKEN_SEMICOLON);
-  debug_print (2, ("second token is '%s'.\n", buf->data));
   tmp->addr = mutt_parse_adrlist (tmp->addr, buf->data);
   if (last)
     last->next = tmp;
@@ -1473,19 +1448,7 @@ static int parse_alias (BUFFER * buf, BUFFER * s,
               _("Warning: Bad IDN '%s' in alias '%s'.\n"), estr, tmp->name);
     return -1;
   }
-#ifdef DEBUG
-  if (DebugLevel >= 2) {
-    address_t *a;
 
-    /* A group is terminated with an empty address, so check a->mailbox */
-    for (a = tmp->addr; a && a->mailbox; a = a->next) {
-      if (!a->group)
-        debug_print (2, ("%s\n", a->mailbox));
-      else
-        debug_print (2, ("group %s\n", a->mailbox));
-    }
-  }
-#endif
   return 0;
 }
 
@@ -1494,15 +1457,15 @@ parse_unmy_hdr (BUFFER * buf, BUFFER * s,
                 unsigned long data __attribute__ ((unused)),
                 BUFFER * err __attribute__ ((unused)))
 {
-  LIST *last = NULL;
-  LIST *tmp = UserHeader;
-  LIST *ptr;
-  size_t l;
+  string_list_t *last = NULL;
+  string_list_t *tmp = UserHeader;
+  string_list_t *ptr;
+  ssize_t l;
 
   do {
     mutt_extract_token (buf, s, 0);
     if (m_strcmp("*", buf->data) == 0)
-      mutt_free_list (&UserHeader);
+      string_list_wipe(&UserHeader);
     else {
       tmp = UserHeader;
       last = NULL;
@@ -1521,7 +1484,7 @@ parse_unmy_hdr (BUFFER * buf, BUFFER * s,
             UserHeader = tmp->next;
           tmp = tmp->next;
           ptr->next = NULL;
-          mutt_free_list (&ptr);
+          string_list_wipe(&ptr);
         }
         else {
           last = tmp;
@@ -1537,8 +1500,8 @@ parse_unmy_hdr (BUFFER * buf, BUFFER * s,
 static int parse_my_hdr (BUFFER * buf, BUFFER * s, unsigned long data __attribute__ ((unused)),
                          BUFFER * err)
 {
-  LIST *tmp;
-  size_t keylen;
+  string_list_t *tmp;
+  ssize_t keylen;
   char *p;
 
   mutt_extract_token (buf, s, M_TOKEN_SPACE | M_TOKEN_QUOTE);
@@ -1561,11 +1524,11 @@ static int parse_my_hdr (BUFFER * buf, BUFFER * s, unsigned long data __attribut
       if (!tmp->next)
         break;
     }
-    tmp->next = mutt_new_list ();
+    tmp->next = string_item_new();
     tmp = tmp->next;
   }
   else {
-    tmp = mutt_new_list ();
+    tmp = string_item_new();
     UserHeader = tmp;
   }
   tmp->data = buf->data;
@@ -1575,7 +1538,7 @@ static int parse_my_hdr (BUFFER * buf, BUFFER * s, unsigned long data __attribut
 
 static int
 parse_sort (struct option_t* dst, const char *s, const struct mapping_t *map,
-            char* errbuf, size_t errlen) {
+            char* errbuf, ssize_t errlen) {
   int i, flags = 0;
 
   if (m_strncmp("reverse-", s, 8) == 0) {
@@ -1621,8 +1584,6 @@ static struct option_t* add_option (const char* name, const char* init,
                                     short type, short dodup) {
   struct option_t* option = p_new(struct option_t, 1);
 
-  debug_print (1, ("adding $%s\n", name));
-
   option->option = m_strdup(name);
   option->type = type;
   if (init)
@@ -1639,7 +1600,6 @@ static struct option_t* add_user_option (const char* name) {
 static void del_option (void* p) {
   struct option_t *ptr = (struct option_t*) p;
   char* s = (char*) ptr->data;
-  debug_print (1, ("removing option '%s' from table\n", NONULL (ptr->option)));
   p_delete(&ptr->option);
   p_delete(&s);
   p_delete(&ptr->init);
@@ -1648,7 +1608,7 @@ static void del_option (void* p) {
 
 static int init_expand (char** dst, struct option_t* src) {
   BUFFER token, in;
-  size_t len = 0;
+  ssize_t len = 0;
 
   p_delete(dst);
 
@@ -1723,7 +1683,7 @@ static void mutt_restore_default (const char* name __attribute__ ((unused)),
 
 /* check whether value for $dsn_return would be valid */
 static int check_dsn_return (const char* option __attribute__ ((unused)), unsigned long p,
-                             char* errbuf, size_t errlen) {
+                             char* errbuf, ssize_t errlen) {
   char* val = (char*) p;
   if (val && *val && m_strncmp(val, "hdrs", 4) != 0 &&
       m_strncmp(val, "full", 4) != 0) {
@@ -1736,9 +1696,9 @@ static int check_dsn_return (const char* option __attribute__ ((unused)), unsign
 
 /* check whether value for $dsn_notify would be valid */
 static int check_dsn_notify (const char* option, unsigned long p,
-                             char* errbuf, size_t errlen) {
+                             char* errbuf, ssize_t errlen) {
   list2_t* list = NULL;
-  size_t i = 0;
+  ssize_t i = 0;
   int rc = 1;
   char* val = (char*) p;
 
@@ -1764,7 +1724,7 @@ static int check_dsn_notify (const char* option, unsigned long p,
 }
 
 static int check_num (const char* option, unsigned long p,
-                      char* errbuf, size_t errlen) {
+                      char* errbuf, ssize_t errlen) {
   if ((int) p < 0) {
     if (errbuf)
       snprintf (errbuf, errlen, _("'%d' is invalid for $%s"), (int) p, option);
@@ -1773,21 +1733,8 @@ static int check_num (const char* option, unsigned long p,
   return (1);
 }
 
-#ifdef DEBUG
-static int check_debug (const char* option, unsigned long p,
-                        char* errbuf, size_t errlen) {
-  if ((int) p <= DEBUG_MAX_LEVEL &&
-      (int) p >= DEBUG_MIN_LEVEL)
-    return (1);
-
-  if (errbuf)
-    snprintf (errbuf, errlen, _("'%d' is invalid for $%s"), (int) p, option);
-  return (0);
-}
-#endif
-
 static int check_history (const char* option __attribute__ ((unused)), unsigned long p,
-                          char* errbuf, size_t errlen) {
+                          char* errbuf, ssize_t errlen) {
   if (!check_num ("history", p, errbuf, errlen))
     return (0);
   mutt_init_history ();
@@ -1795,7 +1742,7 @@ static int check_history (const char* option __attribute__ ((unused)), unsigned
 }
 
 static int check_special (const char* name, unsigned long val,
-                          char* errbuf, size_t errlen) {
+                          char* errbuf, ssize_t errlen) {
   int i = 0;
 
   for (i = 0; SpecialVars[i].name; i++) {
@@ -1818,8 +1765,7 @@ static const struct mapping_t* get_sortmap (struct option_t* option) {
     map = SortBrowserMethods;
     break;
   case DT_SORT_KEYS:
-    if ((WithCrypto & APPLICATION_PGP))
-      map = SortKeyMethods;
+    map = SortKeyMethods;
     break;
   case DT_SORT_AUX:
     map = SortAuxMethods;
@@ -1886,7 +1832,6 @@ static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data,
       /* there's no option named like this yet so only add one
        * if the action isn't any of: reset, unset, query */
       if (!(reset || unset || query || *s->dptr != '=')) {
-        debug_print (1, ("adding user option '%s'\n", tmp->data));
         option = add_user_option (tmp->data);
         hash_insert (ConfigOptions, option->option, option, 0);
       }
@@ -1990,13 +1935,13 @@ static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data,
             r = -1;
             break;
           } else if (DTYPE (option->type) == DT_ADDR)
-            address_delete ((address_t **) option->data);
+            address_list_wipe((address_t **) option->data);
           else if (DTYPE (option->type) == DT_USER)
             /* to unset $user_ means remove */
             hash_delete (ConfigOptions, option->option,
                          option, del_option);
           else
-            p_delete((void **)&option->data);
+            p_delete((void **)(void *)&option->data);
           break;
         }
       }
@@ -2007,7 +1952,7 @@ static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data,
         break;
       }
 
-      /* the $muttng_ variables are read-only */
+      /* the $madmutt_ variables are read-only */
       if (!FuncTable[DTYPE (option->type)].opt_from_string) {
         snprintf (err->data, err->dsize, _("$%s is read-only"),
                   option->option);
@@ -2091,18 +2036,16 @@ static int source_rc (const char *rcfile, BUFFER * err)
   BUFFER token;
   char *linebuf = NULL;
   char *currentline = NULL;
-  size_t buflen;
+  ssize_t buflen;
   pid_t pid;
 
-  debug_print (2, ("reading configuration file '%s'.\n", rcfile));
-
   if ((f = mutt_open_read (rcfile, &pid)) == NULL) {
     snprintf (err->data, err->dsize, "%s: %s", rcfile, strerror (errno));
     return (-1);
   }
 
   p_clear(&token, 1);
-  while ((linebuf = mutt_read_line (linebuf, &buflen, f, &line)) != NULL) {
+  while ((linebuf = mutt_read_line(linebuf, &buflen, f, &line)) != NULL) {
     conv = ConfigCharset && (*ConfigCharset) && Charset;
     if (conv) {
       currentline = m_strdup(linebuf);
@@ -2193,8 +2136,6 @@ int mutt_parse_rc_line ( /* const */ char *line, BUFFER * token, BUFFER * err)
 
   *err->data = 0;
 
-  debug_print (1, ("expand '%s'\n", line));
-
   expn.dptr = vskipspaces(expn.dptr);
   while (*expn.dptr) {
     if (*expn.dptr == '#')
@@ -2257,7 +2198,7 @@ static void candidate (char *dest, char *try, const char *src, int len)
   }
 }
 
-int mutt_command_complete (char *buffer, size_t len, int pos, int numtabs)
+int mutt_command_complete (char *buffer, ssize_t len, int pos, int numtabs)
 {
   char *pt = buffer;
   int num;
@@ -2275,8 +2216,8 @@ int mutt_command_complete (char *buffer, size_t len, int pos, int numtabs)
     if (numtabs == 1) {
       Num_matched = 0;
       m_strcpy(User_typed, sizeof(User_typed), pt);
-      p_clear(Matches, sizeof(Matches));
-      p_clear(Completed, sizeof(Completed));
+      p_clear(Matches, countof(Matches));
+      p_clear(Completed, countof(Completed));
       for (num = 0; Commands[num].name; num++)
         candidate (Completed, User_typed, Commands[num].name,
                    sizeof(Completed));
@@ -2324,8 +2265,8 @@ int mutt_command_complete (char *buffer, size_t len, int pos, int numtabs)
     if (numtabs == 1) {
       Num_matched = 0;
       m_strcpy(User_typed, sizeof(User_typed), pt);
-      p_clear(Matches, sizeof(Matches));
-      p_clear(Completed, sizeof(Completed));
+      p_clear(Matches, countof(Matches));
+      p_clear(Completed, countof(Completed));
       for (num = 0; MuttVars[num].option; num++)
         candidate(Completed, User_typed, MuttVars[num].option,
                   sizeof(Completed));
@@ -2362,8 +2303,8 @@ int mutt_command_complete (char *buffer, size_t len, int pos, int numtabs)
     if (numtabs == 1) {
       Num_matched = 0;
       m_strcpy(User_typed, sizeof(User_typed), pt);
-      p_clear(Matches, sizeof(Matches));
-      p_clear(Completed, sizeof(Completed));
+      p_clear(Matches, countof(Matches));
+      p_clear(Completed, countof(Completed));
       for (num = 0; menu[num].name; num++)
         candidate (Completed, User_typed, menu[num].name, sizeof(Completed));
       /* try the generic menu */
@@ -2401,7 +2342,7 @@ int mutt_command_complete (char *buffer, size_t len, int pos, int numtabs)
   return 1;
 }
 
-int mutt_var_value_complete (char *buffer, size_t len, int pos)
+int mutt_var_value_complete (char *buffer, ssize_t len, int pos)
 {
   char var[STRING], *pt = buffer;
   int spaces;
@@ -2429,7 +2370,7 @@ int mutt_var_value_complete (char *buffer, size_t len, int pos)
     else {
       char tmp[LONG_STRING], tmp2[LONG_STRING];
       char *s, *d;
-      size_t dlen = buffer + len - pt - spaces;
+      ssize_t dlen = buffer + len - pt - spaces;
       const char *vals[] = { "no", "yes", "ask-no", "ask-yes" };
 
       tmp[0] = '\0';
@@ -2461,10 +2402,7 @@ int mutt_var_value_complete (char *buffer, size_t len, int pos)
           map = SortBrowserMethods;
           break;
         case DT_SORT_KEYS:
-          if ((WithCrypto & APPLICATION_PGP))
-            map = SortKeyMethods;
-          else
-            map = SortMethods;
+          map = SortKeyMethods;
           break;
         default:
           map = SortMethods;
@@ -2517,9 +2455,9 @@ int mutt_var_value_complete (char *buffer, size_t len, int pos)
 }
 
 /* Implement the -Q command line flag */
-int mutt_query_variables (LIST * queries)
+int mutt_query_variables (string_list_t * queries)
 {
-  LIST *p;
+  string_list_t *p;
 
   char errbuff[STRING];
   char command[STRING];
@@ -2546,7 +2484,7 @@ int mutt_query_variables (LIST * queries)
   return 0;
 }
 
-static int mutt_execute_commands (LIST * p)
+static int mutt_execute_commands (string_list_t * p)
 {
   BUFFER err, token;
   char errstr[SHORT_STRING];
@@ -2566,7 +2504,7 @@ static int mutt_execute_commands (LIST * p)
   return 0;
 }
 
-void mutt_init (int skip_sys_rc, LIST * commands)
+void mutt_init (int skip_sys_rc, string_list_t * commands)
 {
   struct passwd *pw;
   struct utsname utsname;
@@ -2611,7 +2549,8 @@ void mutt_init (int skip_sys_rc, LIST * commands)
     if (!Homedir)
       Homedir = m_strdup(pw->pw_dir);
 
-    Realname = m_strdup(mutt_gecos_name (rnbuf, sizeof(rnbuf), pw));
+    mutt_gecos_name(rnbuf, sizeof(rnbuf), pw, GecosMask.rx);
+    Realname = m_strdup(rnbuf);
     Shell = m_strdup(pw->pw_shell);
     endpwent ();
   }
@@ -2631,8 +2570,6 @@ void mutt_init (int skip_sys_rc, LIST * commands)
     Shell = m_strdup((p = getenv ("SHELL")) ? p : "/bin/sh");
   }
 
-  debug_start(Homedir);
-
   /* And about the host... */
   uname (&utsname);
   /* some systems report the FQDN instead of just the hostname */
@@ -2644,15 +2581,12 @@ void mutt_init (int skip_sys_rc, LIST * commands)
   else
     Hostname = m_strdup(utsname.nodename);
 
-#ifndef DOMAIN
-#define DOMAIN buffer
-  if (!p && getdnsdomainname (buffer, sizeof(buffer)) == -1)
+  if (!p && getdnsdomainname(buffer, sizeof(buffer)) == -1)
     Fqdn = m_strdup("@");
   else
-#endif /* DOMAIN */
-  if (*DOMAIN != '@') {
-    Fqdn = p_new(char, m_strlen(DOMAIN) + m_strlen(Hostname) + 2);
-    sprintf (Fqdn, "%s.%s", NONULL (Hostname), DOMAIN); /* __SPRINTF_CHECKED__ */
+  if (*buffer != '@') {
+    Fqdn = p_new(char, m_strlen(buffer) + m_strlen(Hostname) + 2);
+    sprintf (Fqdn, "%s.%s", NONULL(Hostname), buffer); /* __SPRINTF_CHECKED__ */
   }
   else
     Fqdn = m_strdup(NONULL (Hostname));
@@ -2709,7 +2643,6 @@ void mutt_init (int skip_sys_rc, LIST * commands)
       p = "vi";
   }
   Editor = m_strdup(p);
-  Visual = m_strdup(p);
 
   if ((p = getenv ("REPLYTO")) != NULL) {
     BUFFER buf, token;
@@ -2728,9 +2661,7 @@ void mutt_init (int skip_sys_rc, LIST * commands)
   if ((p = getenv ("EMAIL")) != NULL)
     From = rfc822_parse_adrlist (NULL, p);
 
-  mutt_set_langinfo_charset ();
-  mutt_set_charset (Charset);
-
+  charset_initialize();
 
   /* Set standard defaults */
   hash_map (ConfigOptions, mutt_set_default, 0);
@@ -2738,14 +2669,11 @@ void mutt_init (int skip_sys_rc, LIST * commands)
 
   CurrentMenu = MENU_MAIN;
 
-
-#ifndef LOCALES_HACK
   /* Do we have a locale definition? */
   if (((p = getenv ("LC_ALL")) != NULL && p[0]) ||
       ((p = getenv ("LANG")) != NULL && p[0]) ||
       ((p = getenv ("LC_CTYPE")) != NULL && p[0]))
     set_option (OPTLOCALES);
-#endif
 
 #ifdef HAVE_GETSID
   /* Unset suspend by default if we're the session leader */
@@ -2773,18 +2701,18 @@ void mutt_init (int skip_sys_rc, LIST * commands)
 
   if (!Muttrc) {
 #if 0
-    snprintf (buffer, sizeof(buffer), "%s/.muttngrc-%s", NONULL (Homedir),
+    snprintf (buffer, sizeof(buffer), "%s/.madmuttrc-%s", NONULL (Homedir),
               MUTT_VERSION);
     if (access (buffer, F_OK) == -1)
 #endif
-      snprintf (buffer, sizeof(buffer), "%s/.muttngrc", NONULL (Homedir));
+      snprintf (buffer, sizeof(buffer), "%s/.madmuttrc", NONULL (Homedir));
     if (access (buffer, F_OK) == -1)
 #if 0
-      snprintf (buffer, sizeof(buffer), "%s/.muttng/muttngrc-%s",
+      snprintf (buffer, sizeof(buffer), "%s/.madmutt/madmuttrc-%s",
                 NONULL (Homedir), MUTT_VERSION);
     if (access (buffer, F_OK) == -1)
 #endif
-      snprintf (buffer, sizeof(buffer), "%s/.muttng/muttngrc",
+      snprintf (buffer, sizeof(buffer), "%s/.madmutt/madmuttrc",
                 NONULL (Homedir));
 
     default_rc = 1;
@@ -2802,15 +2730,15 @@ void mutt_init (int skip_sys_rc, LIST * commands)
   /* Process the global rc file if it exists and the user hasn't explicity
      requested not to via "-n".  */
   if (!skip_sys_rc) {
-    snprintf (buffer, sizeof(buffer), "%s/Muttngrc-%s", SYSCONFDIR,
+    snprintf (buffer, sizeof(buffer), "%s/Madmuttrc-%s", SYSCONFDIR,
               MUTT_VERSION);
     if (access (buffer, F_OK) == -1)
-      snprintf (buffer, sizeof(buffer), "%s/Muttngrc", SYSCONFDIR);
+      snprintf (buffer, sizeof(buffer), "%s/Madmuttrc", SYSCONFDIR);
     if (access (buffer, F_OK) == -1)
-      snprintf (buffer, sizeof(buffer), "%s/Muttngrc-%s", PKGDATADIR,
+      snprintf (buffer, sizeof(buffer), "%s/Madmuttrc-%s", PKGDATADIR,
                 MUTT_VERSION);
     if (access (buffer, F_OK) == -1)
-      snprintf (buffer, sizeof(buffer), "%s/Muttngrc", PKGDATADIR);
+      snprintf (buffer, sizeof(buffer), "%s/Madmuttrc", PKGDATADIR);
     if (access (buffer, F_OK) != -1) {
       if (source_rc (buffer, &err) != 0) {
         fputs (err.data, stderr);
@@ -2916,7 +2844,7 @@ static void opt_sel_diff (const char* key __attribute__ ((unused)),
 
 /* dump out the value of all the variables we have */
 int mutt_dump_variables (int full) {
-  size_t i = 0;
+  ssize_t i = 0;
   char outbuf[STRING];
   list2_t* tmp = NULL;
   struct option_t* option = NULL;