]> git.wh0rd.org Git - nano.git/commitdiff
Melting the binding and unbinding code into a single function.
authorBenno Schulenberg <bensberg@justemail.net>
Tue, 8 Apr 2014 11:22:41 +0000 (11:22 +0000)
committerBenno Schulenberg <bensberg@justemail.net>
Tue, 8 Apr 2014 11:22:41 +0000 (11:22 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4746 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/rcfile.c

index 449860e023bcb8e80a75a51a6a45e2ee41becde1..9a112b4986792a6bdffe00812f79df4c658da1b5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2014-04-08  Benno Schulenberg  <bensberg@justemail.net>
+       * src/rcfile.c (parse_binding): Melt the binding and unbinding code,
+       which are very similar, into a single function.
+
 2014-04-07  Benno Schulenberg  <bensberg@justemail.net>
        * src/{proto.h,global.c,text.c}: Keep a pointer to the Uncut item in
        the functions list, to be able to change its description to Unjustify
index 5777ee75d3a1e90ece2b60ca7ca20d941b875f20..4d58890613d52e27c438846f353f9ae296393b06 100644 (file)
@@ -462,14 +462,18 @@ int check_bad_binding(sc *s)
     return 0;
 }
 
-void parse_keybinding(char *ptr)
+void parse_binding(char *ptr, bool dobind)
 {
     char *keyptr = NULL, *keycopy = NULL, *funcptr = NULL, *menuptr = NULL;
-    sc *s, *newsc;
+    sc *s, *newsc = NULL;
     int i, menu;
 
     assert(ptr != NULL);
 
+#ifdef DEBUG
+    fprintf(stderr, "Starting the rebinding code...\n");
+#endif
+
     if (*ptr == '\0') {
        rcfile_error(N_("Missing key name"));
        return;
@@ -487,13 +491,14 @@ void parse_keybinding(char *ptr)
        return;
     }
 
-    funcptr = ptr;
-    ptr = parse_next_word(ptr);
+    if (dobind) {
+       funcptr = ptr;
+       ptr = parse_next_word(ptr);
 
-    if (!strcmp(funcptr, "")) {
-       rcfile_error(
-               N_("Must specify function to bind key to"));
-       return;
+       if (!strcmp(funcptr, "")) {
+           rcfile_error(N_("Must specify function to bind key to"));
+           return;
+       }
     }
 
     menuptr = ptr;
@@ -507,11 +512,13 @@ void parse_keybinding(char *ptr)
     }
 
     menu = strtomenu(menuptr);
-    newsc = strtosc(menu, funcptr);
-    if (newsc == NULL) {
-       rcfile_error(
-               N_("Could not map name \"%s\" to a function"), funcptr);
-       return;
+
+    if (dobind) {
+       newsc = strtosc(menu, funcptr);
+       if (newsc == NULL) {
+           rcfile_error(N_("Could not map name \"%s\" to a function"), funcptr);
+           return;
+       }
     }
 
     if (menu < 1) {
@@ -521,99 +528,44 @@ void parse_keybinding(char *ptr)
     }
 
 #ifdef DEBUG
-    fprintf(stderr, "newsc now address %d, func assigned = %d, menu = %x\n",
-       &newsc, newsc->scfunc, menu);
+    if (dobind)
+       fprintf(stderr, "newsc now address %d, func assigned = %d, menu = %x\n",
+           &newsc, newsc->scfunc, menu);
+   else
+       fprintf(stderr, "unbinding \"%s\" from menu %x\n", keycopy, menu);
 #endif
 
-    newsc->keystr = keycopy;
-    newsc->menu = menu;
-    newsc->type = strtokeytype(newsc->keystr);
-    assign_keyinfo(newsc);
+    if (dobind) {
+       newsc->keystr = keycopy;
+       newsc->menu = menu;
+       newsc->type = strtokeytype(newsc->keystr);
+       assign_keyinfo(newsc);
 #ifdef DEBUG
-    fprintf(stderr, "s->keystr = \"%s\"\n", newsc->keystr);
-    fprintf(stderr, "s->seq = \"%d\"\n", newsc->seq);
+       fprintf(stderr, "s->keystr = \"%s\"\n", newsc->keystr);
+       fprintf(stderr, "s->seq = \"%d\"\n", newsc->seq);
 #endif
 
-    if (check_bad_binding(newsc)) {
-       rcfile_error(
-               N_("Sorry, keystr \"%s\" is an illegal binding"), newsc->keystr);
-       return;
-    }
-
-    /* Now let's have some fun.  Try and delete the other entries
-       we found for the same menu, then make this the new beginning. */
-    for (s = sclist; s != NULL; s = s->next) {
-        if (((s->menu & newsc->menu)) && s->seq == newsc->seq) {
-#ifdef DEBUG
-           fprintf(stderr, "replacing entry in menu %x\n", s->menu);
-#endif
-           s->menu &= ~newsc->menu;
+       if (check_bad_binding(newsc)) {
+           rcfile_error(N_("Sorry, keystr \"%s\" is an illegal binding"), newsc->keystr);
+           return;
        }
     }
-    newsc->next = sclist;
-    sclist = newsc;
-}
-
-/* Let the user unbind a sequence from a given (or all) menus. */
-void parse_unbinding(char *ptr)
-{
-    char *keyptr = NULL, *keycopy = NULL, *menuptr = NULL;
-    sc *s;
-    int i, menu;
-
-    assert(ptr != NULL);
-
-    if (*ptr == '\0') {
-       rcfile_error(N_("Missing key name"));
-       return;
-    }
-
-    keyptr = ptr;
-    ptr = parse_next_word(ptr);
-    keycopy = mallocstrcpy(NULL, keyptr);
-    for (i = 0; i < strlen(keycopy); i++)
-       keycopy[i] = toupper(keycopy[i]);
-
-#ifdef DEBUG
-    fprintf(stderr, "Starting the unbinding code...\n");
-#endif
-
-    if (keycopy[0] != 'M' && keycopy[0] != '^' && keycopy[0] != 'F' && keycopy[0] != 'K') {
-       rcfile_error(
-               N_("Keybindings must begin with \"^\", \"M\", or \"F\""));
-       return;
-    }
 
-    menuptr = ptr;
-    ptr = parse_next_word(ptr);
-
-    if (!strcmp(menuptr, "")) {
-       rcfile_error(
-               /* TRANSLATORS: do not translate the word "all". */
-               N_("Must specify menu to bind key to (or \"all\")"));
-       return;
-    }
-
-    menu = strtomenu(menuptr);
-    if (menu < 1) {
-       rcfile_error(
-               N_("Could not map name \"%s\" to a menu"), menuptr);
-       return;
-    }
-
-#ifdef DEBUG
-    fprintf(stderr, "unbinding \"%s\" from menu %x\n", keycopy, menu);
-#endif
-
-    /* Now find the appropriate entries in the menu to delete. */
+    /* Now find and delete any existing same shortcut in the menu(s). */
     for (s = sclist; s != NULL; s = s->next) {
-        if (((s->menu & menu)) && !strcmp(s->keystr,keycopy)) {
+        if (((s->menu & menu)) && !strcmp(s->keystr, keycopy)) {
 #ifdef DEBUG
            fprintf(stderr, "deleting entry from menu %x\n", s->menu);
 #endif
            s->menu &= ~menu;
        }
     }
+
+    if (dobind) {
+       /* Add the new shortcut at the start of the list. */
+       newsc->next = sclist;
+       sclist = newsc;
+    }
 }
 
 
@@ -1118,9 +1070,9 @@ void parse_rcfile(FILE *rcstream
            parse_linter(ptr);
 #endif /* !DISABLE_COLOR */
        else if (strcasecmp(keyword, "bind") == 0)
-           parse_keybinding(ptr);
+           parse_binding(ptr, TRUE);
        else if (strcasecmp(keyword, "unbind") == 0)
-           parse_unbinding(ptr);
+           parse_binding(ptr, FALSE);
        else
            rcfile_error(N_("Command \"%s\" not understood"), keyword);