]> granicus.if.org Git - neomutt/commitdiff
Detect missing function mapping
authorsomini <somini@users.noreply.github.com>
Mon, 24 Apr 2017 12:50:48 +0000 (13:50 +0100)
committerRichard Russon <rich@flatcap.org>
Thu, 11 May 2017 11:30:25 +0000 (12:30 +0100)
Move the missing function detection code into the `try_bind` function.
Improve the error message to include the menu name.

keymap.c

index 62cb300809ba3b7f24ce29b5fb7ade3e0136f600..880c87668c6af94e76b961e228f71a534bc75092 100644 (file)
--- a/keymap.c
+++ b/keymap.c
@@ -224,7 +224,7 @@ static int parsekeys(const char *str, keycode_t *d, int max)
 /* insert a key sequence into the specified map.  the map is sorted by ASCII
  * value (lowest to highest)
  */
-int km_bind_err (char *s, int menu, int op, char *macro, char *descr, BUFFER *err)
+int km_bind_err(char *s, int menu, int op, char *macro, char *descr, BUFFER *err)
 {
   int retval = 0;
   struct keymap_t *map = NULL, *tmp = NULL, *last = NULL, *next = NULL;
@@ -248,31 +248,36 @@ int km_bind_err (char *s, int menu, int op, char *macro, char *descr, BUFFER *er
       do
       {
         /* Don't warn on overwriting a 'noop' binding */
-        if (tmp->len != len && tmp->op != OP_NULL) {
+        if (tmp->len != len && tmp->op != OP_NULL)
+        {
           /* Overwrite with the different lengths, warn */
           /* TODO: MAX_SEQ here is wrong */
           char old_binding[MAX_SEQ];
           char new_binding[MAX_SEQ];
-          km_expand_key( old_binding, MAX_SEQ, map );
-          km_expand_key( new_binding, MAX_SEQ, tmp );
-          if (err) {
+          km_expand_key(old_binding, MAX_SEQ, map);
+          km_expand_key(new_binding, MAX_SEQ, tmp);
+          if (err)
+          {
             /* err was passed, put the string there */
-            snprintf (err->data, err->dsize, _("Binding '%s' will alias '%s'"), old_binding, new_binding);
+            snprintf(err->data, err->dsize, _("Binding '%s' will alias '%s'"),
+                     old_binding, new_binding);
           }
-          else {
-            mutt_error (_("Warning: For menu '%s', binding '%s' will alias '%s'"), mutt_getnamebyvalue(menu, Menus), old_binding, new_binding);
+          else
+          {
+            mutt_error(
+                _("Warning: For menu '%s', binding '%s' will alias '%s'"),
+                mutt_getnamebyvalue(menu, Menus), old_binding, new_binding);
           }
           retval = -2;
         }
         len = tmp->eq;
         next = tmp->next;
-        FREE (&tmp->macro);
-        FREE (&tmp->keys);
-        FREE (&tmp->descr);
-        FREE (&tmp);
+        FREE(&tmp->macro);
+        FREE(&tmp->keys);
+        FREE(&tmp->descr);
+        FREE(&tmp);
         tmp = next;
-      }
-      while (tmp && len >= pos);
+      } while (tmp && len >= pos);
       map->eq = len;
       break;
     }
@@ -300,26 +305,26 @@ int km_bind_err (char *s, int menu, int op, char *macro, char *descr, BUFFER *er
     last->next = map;
     last->eq = lastpos;
   }
-  else {
+  else
+  {
     Keymaps[menu] = map;
   }
 
   return retval;
 }
 
-int
-km_bind (char *s, int menu, int op, char *macro, char *descr)
+int km_bind(char *s, int menu, int op, char *macro, char *descr)
 {
-  return km_bind_err (s, menu, op, macro, descr, NULL);
+  return km_bind_err(s, menu, op, macro, descr, NULL);
 }
 
-static int km_bindkey_err (char *s, int menu, int op, BUFFER *err)
+static int km_bindkey_err(char *s, int menu, int op, BUFFER *err)
 {
-  return km_bind_err (s, menu, op, NULL, NULL, err);
+  return km_bind_err(s, menu, op, NULL, NULL, err);
 }
-static int km_bindkey (char *s, int menu, int op)
+static int km_bindkey(char *s, int menu, int op)
 {
-  return km_bindkey_err (s, menu, op, NULL);
+  return km_bindkey_err(s, menu, op, NULL);
 }
 
 static int get_op(const struct binding_t *bindings, const char *start, size_t len)
@@ -985,17 +990,22 @@ error:
   return NULL;
 }
 
-static int
-try_bind (char *key, int menu, char *func, const struct binding_t *bindings, BUFFER *err)
+static int try_bind(char *key, int menu, char *func,
+                    const struct binding_t *bindings, BUFFER *err)
 {
   int i;
 
   for (i = 0; bindings[i].name; i++)
+  {
     if (mutt_strcmp(func, bindings[i].name) == 0)
     {
-      return km_bindkey_err (key, menu, bindings[i].op, err);
+      return km_bindkey_err(key, menu, bindings[i].op, err);
     }
-  return -1;
+  }
+  snprintf(err->data, err->dsize,
+           _("Function '%s' not available for menu '%s'"), func,
+           mutt_getnamebyvalue(menu, Menus));
+  return -1; /* Couldn't find an existing function with this name */
 }
 
 const struct binding_t *km_get_table(int menu)
@@ -1072,20 +1082,18 @@ int mutt_parse_bind(BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
       /* Bind first on the generic (why?), except for this menus */
       if (menu[i] != MENU_PAGER || menu[i] != MENU_EDITOR || menu[i] != MENU_GENERIC)
       {
-        r = try_bind (key, menu[i], buf->data, OpGeneric, err);
+        r = try_bind(key, menu[i], buf->data, OpGeneric, err);
       }
-      else {
-        r = -1; /* If you don't bind on generic, bind on the actual menu*/
+      else
+      {
+        r = -2; /* If you don't bind on generic, bind on the actual menu*/
       }
       if (r != 0)
       {
-        bindings = km_get_table (menu[i]);
+        bindings = km_get_table(menu[i]);
         if (bindings)
         {
-          r = try_bind (key, menu[i], buf->data, bindings, err);
-          if (r == -1) {
-            snprintf (err->data, err->dsize, _("%s: no such function in map"), buf->data);
-          }
+          r = try_bind(key, menu[i], buf->data, bindings, err);
         }
       }
     }
@@ -1125,7 +1133,7 @@ int mutt_parse_macro(BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
       {
         for (i = 0; i < nummenus; ++i)
         {
-          r = km_bind (key, menu[i], OP_MACRO, seq, buf->data);
+          r = km_bind(key, menu[i], OP_MACRO, seq, buf->data);
         }
       }
 
@@ -1135,7 +1143,7 @@ int mutt_parse_macro(BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
     {
       for (i = 0; i < nummenus; ++i)
       {
-        r = km_bind (key, menu[i], OP_MACRO, buf->data, NULL);
+        r = km_bind(key, menu[i], OP_MACRO, buf->data, NULL);
       }
     }
   }