Rocco Rutte:
[apps/madmutt.git] / init.c
diff --git a/init.c b/init.c
index e8eabd3..0728ffe 100644 (file)
--- a/init.c
+++ b/init.c
  *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  */ 
 
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "mutt.h"
 #include "mapping.h"
 #include "mutt_curses.h"
@@ -502,12 +506,16 @@ static void remove_from_list (LIST **l, const char *str)
   }
 }
 
-static void remove_from_rx_list (RX_LIST **l, const char *str)
+static int remove_from_rx_list (RX_LIST **l, const char *str)
 {
   RX_LIST *p, *last = NULL;
+  int rv = -1;
 
   if (mutt_strcmp ("*", str) == 0)
+  {
     mutt_free_rx_list (l);    /* ``unCMD *'' means delete all current entries */
+    rv = 0;
+  }
   else
   {
     p = *l;
@@ -522,6 +530,7 @@ static void remove_from_rx_list (RX_LIST **l, const char *str)
        else
          (*l) = p->next;
        FREE (&p);
+       rv = 0;
       }
       else
       {
@@ -530,6 +539,75 @@ static void remove_from_rx_list (RX_LIST **l, const char *str)
       }
     }
   }
+  return (rv);
+}
+
+static int parse_ifdef (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err)
+{
+  int i, j, res = 0;
+  BUFFER token;
+
+  memset (&token, 0, sizeof (token));
+  mutt_extract_token (tmp, s, 0);
+
+  /* is the item defined as a variable or a function? */
+  if (!(res = (mutt_option_index (tmp->data) != -1)))
+    for (i = 0; !res && i < MENU_MAX; i++)
+    {
+      struct binding_t *b = km_get_table (Menus[i].value);
+
+      if (!b)
+       continue;
+
+      for (j = 0; b[j].name; j++)
+       if (!ascii_strncasecmp (tmp->data, b[j].name, mutt_strlen (tmp->data))
+             && (mutt_strlen (b[j].name) == mutt_strlen (tmp->data)))
+       {
+         res = 1;
+         break;
+       }
+    }
+  /* check for feature_* */
+  if (!res) {
+    char* p = NULL;
+    i = 0;
+    j = mutt_strlen (tmp->data);
+    /* need at least input of 'feature_X' */
+    if (j >= 7) {
+      p = tmp->data + 7;
+      j -= 7;
+      while (Features[i].name) {
+        if (mutt_strlen (Features[i].name) == j &&
+            ascii_strncasecmp (Features[i].name, p, j)) {
+          res = 1;
+          break;
+        }
+        i++;
+      }
+    }
+  }
+
+  if (!MoreArgs (s))
+  {
+    if (data)
+      snprintf (err->data, err->dsize, _("ifdef: too few arguments"));
+    else
+      snprintf (err->data, err->dsize, _("ifndef: too few arguments"));
+    return (-1);
+  }
+  mutt_extract_token (tmp, s, M_TOKEN_SPACE);
+
+  if ((data && res) || (!data && !res))
+  {
+    if (mutt_parse_rc_line (tmp->data, &token, err) == -1)
+    {
+      mutt_error ("Error: %s", err->data);
+      FREE (&token.data);
+      return (-1);
+    }
+    FREE (&token.data);
+  }
+  return 0;
 }
 
 static int parse_unignore (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
@@ -574,6 +652,7 @@ static int parse_list (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
   return 0;
 }
 
+#if 0
 static int _parse_rx_list (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err, int flags)
 {
   do 
@@ -609,6 +688,7 @@ static int parse_rx_unlist (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *
   
   return 0;
 }
+#endif
 
 static void _alternates_clean (void)
 {
@@ -623,13 +703,35 @@ static void _alternates_clean (void)
 static int parse_alternates (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
 {
   _alternates_clean();
-  return parse_rx_list (buf, s, data, err);
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+    remove_from_rx_list (&UnAlternates, buf->data);
+
+    if (add_to_rx_list (&Alternates, buf->data, REG_ICASE, err) != 0)
+      return -1;
+  }
+  while (MoreArgs (s));
+
+  return 0;
 }
 
 static int parse_unalternates (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
 {
   _alternates_clean();
-  return parse_rx_unlist (buf, s, data, err);
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+    remove_from_rx_list (&Alternates, buf->data);
+
+    if (mutt_strcmp (buf->data, "*") &&
+       add_to_rx_list (&UnAlternates, buf->data, REG_ICASE, err) != 0)
+      return -1;
+
+  }
+  while (MoreArgs (s));
+
+  return 0;
 }
 
 static int parse_spam_list (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
@@ -725,14 +827,32 @@ static int parse_unlist (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err
   return 0;
 }
 
+static int parse_lists (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
+{
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+    remove_from_rx_list (&UnMailLists, buf->data);
+    
+    if (add_to_rx_list (&MailLists, buf->data, REG_ICASE, err) != 0)
+      return -1;
+  }
+  while (MoreArgs (s));
+
+  return 0;
+}
 
 static int parse_unlists (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
 {
   do
   {
     mutt_extract_token (buf, s, 0);
-    remove_from_rx_list (&MailLists, buf->data);
     remove_from_rx_list (&SubscribedLists, buf->data);
+    remove_from_rx_list (&MailLists, buf->data);
+    
+    if (mutt_strcmp (buf->data, "*") && 
+       add_to_rx_list (&UnMailLists, buf->data, REG_ICASE, err) != 0)
+      return -1;
   }
   while (MoreArgs (s));
 
@@ -744,6 +864,9 @@ static int parse_subscribe (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *
   do
   {
     mutt_extract_token (buf, s, 0);
+    remove_from_rx_list (&UnMailLists, buf->data);
+    remove_from_rx_list (&UnSubscribedLists, buf->data);
+
     if (add_to_rx_list (&MailLists, buf->data, REG_ICASE, err) != 0)
       return -1;
     if (add_to_rx_list (&SubscribedLists, buf->data, REG_ICASE, err) != 0)
@@ -753,6 +876,22 @@ static int parse_subscribe (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *
 
   return 0;
 }
+
+static int parse_unsubscribe (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
+{
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+    remove_from_rx_list (&SubscribedLists, buf->data);
+    
+    if (mutt_strcmp (buf->data, "*") &&
+       add_to_rx_list (&UnSubscribedLists, buf->data, REG_ICASE, err) != 0)
+      return -1;
+  }
+  while (MoreArgs (s));
+
+  return 0;
+}
   
 static int parse_unalias (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
 {
@@ -2067,7 +2206,7 @@ static void start_debug (void)
   {
     t = time (0);
     setbuf (debugfile, NULL); /* don't buffer the debugging output! */
-    fprintf (debugfile, "Mutt %s started at %s.\nDebugging at level %d.\n\n",
+    fprintf (debugfile, "Mutt-ng %s started at %s.\nDebugging at level %d.\n\n",
             MUTT_VERSION, asctime (localtime (&t)), debuglevel);
   }
 }