]> git.wh0rd.org Git - nano.git/commitdiff
Uppercasing only the first two or three characters of a key name,
authorBenno Schulenberg <bensberg@justemail.net>
Tue, 8 Apr 2014 11:43:50 +0000 (11:43 +0000)
committerBenno Schulenberg <bensberg@justemail.net>
Tue, 8 Apr 2014 11:43:50 +0000 (11:43 +0000)
in order to preserve ^Space and M-Space, so these can be unbound.

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4747 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/rcfile.c

index 9a112b4986792a6bdffe00812f79df4c658da1b5..998cb2b417a710c2349ed5a533d178193490bdb9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,9 @@
 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.
+       * src/rcfile.c (parse_binding): Uppercase only the first two or three
+       characters of the key name, in order to preserve ^Space and M-Space,
+       so they can be unbound.  Fixes Savannah bug #41940.
 
 2014-04-07  Benno Schulenberg  <bensberg@justemail.net>
        * src/{proto.h,global.c,text.c}: Keep a pointer to the Uncut item in
index 4d58890613d52e27c438846f353f9ae296393b06..317321e37b49740ebb052245e40abeb647d6b813 100644 (file)
@@ -462,11 +462,12 @@ int check_bad_binding(sc *s)
     return 0;
 }
 
+/* Bind or unbind a key combo, to or from a function. */
 void parse_binding(char *ptr, bool dobind)
 {
     char *keyptr = NULL, *keycopy = NULL, *funcptr = NULL, *menuptr = NULL;
     sc *s, *newsc = NULL;
-    int i, menu;
+    int menu;
 
     assert(ptr != NULL);
 
@@ -482,12 +483,26 @@ void parse_binding(char *ptr, bool dobind)
     keyptr = ptr;
     ptr = parse_next_word(ptr);
     keycopy = mallocstrcpy(NULL, keyptr);
-    for (i = 0; i < strlen(keycopy); i++)
-       keycopy[i] = toupper(keycopy[i]);
+
+    if (strlen(keycopy) < 2) {
+       rcfile_error(N_("Key name is too short"));
+       return;
+    }
+
+    /* Uppercase only the first two or three characters of the key name. */
+    keycopy[0] = toupper(keycopy[0]);
+    keycopy[1] = toupper(keycopy[1]);
+    if (keycopy[0] == 'M' && keycopy[1] == '-') {
+       if (strlen(keycopy) > 2)
+           keycopy[2] = toupper(keycopy[2]);
+       else {
+           rcfile_error(N_("Key name is too short"));
+           return;
+       }
+    }
 
     if (keycopy[0] != 'M' && keycopy[0] != '^' && keycopy[0] != 'F' && keycopy[0] != 'K') {
-       rcfile_error(
-               N_("Keybindings must begin with \"^\", \"M\", or \"F\""));
+       rcfile_error(N_("Key name must begin with \"^\", \"M\", or \"F\""));
        return;
     }
 
@@ -505,28 +520,25 @@ void parse_binding(char *ptr, bool dobind)
     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\")"));
+       /* TRANSLATORS: do not translate the word "all". */
+       rcfile_error(N_("Must specify menu in which to bind/unbind key (or \"all\")"));
        return;
     }
 
     menu = strtomenu(menuptr);
+    if (menu < 1) {
+       rcfile_error(N_("Cannot map name \"%s\" to a menu"), menuptr);
+       return;
+    }
 
     if (dobind) {
        newsc = strtosc(menu, funcptr);
        if (newsc == NULL) {
-           rcfile_error(N_("Could not map name \"%s\" to a function"), funcptr);
+           rcfile_error(N_("Cannot map name \"%s\" to a function"), funcptr);
            return;
        }
     }
 
-    if (menu < 1) {
-       rcfile_error(
-               N_("Could not map name \"%s\" to a menu"), menuptr);
-       return;
-    }
-
 #ifdef DEBUG
     if (dobind)
        fprintf(stderr, "newsc now address %d, func assigned = %d, menu = %x\n",