[lua] make our modules be extensible (accept new values).
[apps/madmutt.git] / init.c
diff --git a/init.c b/init.c
index 8ac9bba..a04efbd 100644 (file)
--- a/init.c
+++ b/init.c
 #include "charset.h"
 #include "thread.h"
 #include "mutt_idna.h"
-
-#if defined (USE_LIBESMTP) && (defined (USE_SSL) || defined (USE_GNUTLS))
 #include "mutt_libesmtp.h"
-#endif
-
 #include "alias.h"
 #include "init.h"
 
@@ -96,57 +92,6 @@ static struct {
   { NULL,         NULL }
 };
 
-/* protos for config type handles: convert value to string */
-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);
-
-/* protos for config type handles: convert to value from string */
-static int bool_from_string  (struct option_t* dst, const char* val,
-                              char* errbuf, ssize_t errlen);
-static int num_from_string   (struct option_t* dst, const char* val,
-                              char* errbuf, ssize_t errlen);
-static int str_from_string   (struct option_t* dst, const char* val,
-                              char* errbuf, ssize_t errlen);
-static int path_from_string  (struct option_t* dst, const char* val,
-                              char* errbuf, ssize_t errlen);
-static int quad_from_string  (struct option_t* dst, const char* val,
-                              char* errbuf, ssize_t errlen);
-static int sort_from_string  (struct option_t* dst, const char* val,
-                              char* errbuf, ssize_t errlen);
-static int rx_from_string    (struct option_t* dst, const char* val,
-                              char* errbuf, ssize_t errlen);
-static int magic_from_string (struct option_t* dst, const char* val,
-                              char* errbuf, ssize_t errlen);
-static int addr_from_string  (struct option_t* dst, const char* val,
-                              char* errbuf, ssize_t errlen);
-
-static struct {
-  unsigned short type;
-  void (*opt_tostr) (char* dst, ssize_t dstlen, struct option_t* option);
-  int (*opt_fromstr) (struct option_t* dst, const char* val,
-                          char* errbuf, ssize_t errlen);
-} FuncTable[] = {
-  { 0,          NULL,             NULL }, /* there's no DT_ type with 0 */
-  { DT_BOOL,    bool_to_string,   bool_from_string },
-  { DT_NUM,     num_to_string,    num_from_string },
-  { DT_STR,     str_to_string,    str_from_string },
-  { DT_PATH,    str_to_string,    path_from_string },
-  { DT_QUAD,    quad_to_string,   quad_from_string },
-  { DT_SORT,    sort_to_string,   sort_from_string },
-  { DT_RX,      rx_to_string,     rx_from_string },
-  { DT_MAGIC,   magic_to_string,  magic_from_string },
-  /* synonyms should be resolved already so we don't need this
-   * but must define it as DT_ is used for indexing */
-  { DT_SYN,     NULL,             NULL },
-  { DT_ADDR,    addr_to_string,   addr_from_string },
-};
-
 static void bool_to_string (char* dst, ssize_t dstlen,
                             struct option_t* option) {
   snprintf (dst, dstlen, "%s=%s", option->option,
@@ -433,6 +378,25 @@ static int addr_from_string (struct option_t* dst, const char* val,
   return (1);
 }
 
+static struct {
+  unsigned short type;
+  void (*opt_tostr) (char* dst, ssize_t dstlen, struct option_t* option);
+  int (*opt_fromstr) (struct option_t* dst, const char* val,
+                          char* errbuf, ssize_t errlen);
+} FuncTable[] = {
+  { 0,          NULL,             NULL }, /* there's no DT_ type with 0 */
+  { DT_BOOL,    bool_to_string,   bool_from_string },
+  { DT_NUM,     num_to_string,    num_from_string },
+  { DT_STR,     str_to_string,    str_from_string },
+  { DT_PATH,    str_to_string,    path_from_string },
+  { DT_QUAD,    quad_to_string,   quad_from_string },
+  { DT_SORT,    sort_to_string,   sort_from_string },
+  { DT_RX,      rx_to_string,     rx_from_string },
+  { DT_MAGIC,   magic_to_string,  magic_from_string },
+  { DT_ADDR,    addr_to_string,   addr_from_string },
+};
+
+
 int mutt_option_value (const char* val, char* dst, ssize_t dstlen) {
   struct option_t* option = NULL;
   char* tmp = NULL, *t = NULL;
@@ -519,98 +483,6 @@ int query_quadoption (int opt, const char *prompt)
   /* not reached */
 }
 
-static void add_to_list(string_list_t **list, const char *str)
-{
-    /* don't add a NULL or empty string to the list */
-    if (m_strisempty(str))
-        return;
-
-    /* check to make sure the item is not already on this list */
-    while (*list) {
-        if (!ascii_strcasecmp(str, (*list)->data))
-            return;
-        list = &(*list)->next;
-    }
-
-    *list = p_new(string_list_t, 1);
-    (*list)->data = m_strdup(str);
-}
-
-static void remove_from_list(string_list_t **l, const char *str)
-{
-    if (!m_strcmp("*", str)) {
-        string_list_wipe(l);  /* ``unCMD *'' means delete all current entries */
-        return;
-    }
-
-    while (*l) {
-        if (!ascii_strcasecmp(str, (*l)->data)) {
-            string_list_t *it = string_list_pop(l);
-            string_item_delete(&it);
-        } else {
-            l = &(*l)->next;
-        }
-    }
-}
-
-static int parse_unignore (BUFFER * buf, BUFFER * s,
-                           unsigned long data __attribute__ ((unused)),
-                           BUFFER * err __attribute__ ((unused)))
-{
-  do {
-    mutt_extract_token (buf, s, 0);
-
-    /* don't add "*" to the unignore list */
-    if (m_strcmp (buf->data, "*"))
-      add_to_list (&UnIgnore, buf->data);
-
-    remove_from_list (&Ignore, buf->data);
-  } while (MoreArgs (s));
-
-  return 0;
-}
-
-static int parse_ignore (BUFFER * buf, BUFFER * s,
-                         unsigned long data __attribute__ ((unused)),
-                         BUFFER * err __attribute__ ((unused)))
-{
-  do {
-    mutt_extract_token (buf, s, 0);
-    remove_from_list (&UnIgnore, buf->data);
-    add_to_list (&Ignore, buf->data);
-  } while (MoreArgs(s));
-  return 0;
-}
-
-static int parse_list(BUFFER * buf, BUFFER * s, unsigned long data,
-                      BUFFER * err __attribute__ ((unused)))
-{
-  do {
-    mutt_extract_token (buf, s, 0);
-    add_to_list ((string_list_t **) data, buf->data);
-  } while (MoreArgs(s));
-  return 0;
-}
-
-static int parse_unlist (BUFFER * buf, BUFFER * s, unsigned long data,
-                         BUFFER * err __attribute__ ((unused)))
-{
-  do {
-    mutt_extract_token (buf, s, 0);
-    /*
-     * Check for deletion of entire list
-     */
-    if (m_strcmp(buf->data, "*") == 0) {
-      string_list_wipe((string_list_t **) data);
-      break;
-    }
-    remove_from_list ((string_list_t **) data, buf->data);
-  }
-  while (MoreArgs (s));
-
-  return 0;
-}
-
 /* always wise to do what someone else did before */
 static void _attachments_clean (void) {
   int i;
@@ -713,7 +585,7 @@ static int parse_unattach_list (BUFFER *buf, BUFFER *s, string_list_t **ldata,
     }
     major = mutt_check_mime_type(tmp);
 
-    /* We must do our own walk here because remove_from_list() will only
+    /* We must do our own walk here because string_list_remove() will only
      * remove the string_list_t->data, not anything pointed to by the string_list_t->data. */
     lastp = NULL;
     for(lp = *ldata; lp; ) {
@@ -1032,11 +904,6 @@ static void mutt_set_default(const char *name __attribute__ ((unused)), void* p,
     char buf[LONG_STRING];
     struct option_t *ptr = p;
 
-    if (DTYPE(ptr->type) == DT_SYN) {
-        if (!more)
-            return;
-        ptr = hash_find(ConfigOptions, (const char *)ptr->data);
-    }
     if (!ptr || *ptr->init || !FuncTable[DTYPE (ptr->type)].opt_fromstr)
         return;
 
@@ -1051,8 +918,7 @@ static int init_expand (char** dst, struct option_t* src) {
 
   p_delete(dst);
 
-  if (DTYPE(src->type) == DT_STR ||
-      DTYPE(src->type) == DT_PATH) {
+  if (DTYPE(src->type) == DT_STR || DTYPE(src->type) == DT_PATH) {
     /* only expand for string as it's the only place where
      * we want to expand vars right now */
     if (src->init && *src->init) {
@@ -1085,11 +951,6 @@ static void mutt_restore_default (const char* name __attribute__ ((unused)),
   struct option_t* ptr = (struct option_t*) p;
   char* init = NULL;
 
-  if (DTYPE (ptr->type) == DT_SYN) {
-    if (!more)
-      return;
-    ptr = hash_find (ConfigOptions, (char*) ptr->data);
-  }
   if (!ptr)
     return;
   if (FuncTable[DTYPE (ptr->type)].opt_fromstr) {
@@ -1215,21 +1076,7 @@ static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data,
 
     /* get the variable name */
     mutt_extract_token (tmp, s, M_TOKEN_EQUAL);
-
-    /* resolve synonyms */
-    if ((option = hash_find (ConfigOptions, tmp->data)) != NULL &&
-        DTYPE (option->type == DT_SYN))
-    {
-      struct option_t* newopt = hash_find (ConfigOptions, (char*) option->data);
-      syn_t* syn = syn_new();
-      syn->f = m_strdup(CurRCFile);
-      syn->l = CurRCLine;
-      syn->n = newopt;
-      syn->o = option;
-      syn_list_push(&Synonyms, syn);
-      option = newopt;
-    }
-
+    option = hash_find(ConfigOptions, tmp->data);
     if (!option && !(reset && m_strcmp("all", tmp->data) == 0)) {
       snprintf (err->data, err->dsize, _("%s: unknown variable"), tmp->data);
       return (-1);
@@ -1935,15 +1782,6 @@ void mutt_init (int skip_sys_rc, string_list_t * commands)
     Spoolfile = m_strdup(buffer);
   }
 
-  if ((p = getenv ("MAILCAPS")))
-    MailcapPath = m_strdup(p);
-  else {
-    /* Default search path from RFC1524 */
-    MailcapPath =
-      m_strdup("~/.mailcap:" PKGDATADIR "/mailcap:" SYSCONFDIR
-                   "/mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap");
-  }
-
   if ((p = getenv ("REPLYTO")) != NULL) {
     BUFFER buf, token;
 
@@ -2084,9 +1922,6 @@ int mutt_dump_variables (int full) {
         struct option_t *option = MuttVars + i;
         char buf[LONG_STRING];
 
-        if (DTYPE(option->type) == DT_SYN)
-            continue;
-
         if (!full) {
             mutt_option_value(option->option, buf, sizeof(buf));
             if (!m_strcmp(buf, option->init))