]> git.sur5r.net Git - i3/i3/commitdiff
Fix TODO by replacing atoi by strtol 1768/head
authorhwangcc23 <hwangcc@csie.nctu.edu.tw>
Thu, 25 Jun 2015 14:33:50 +0000 (22:33 +0800)
committerhwangcc23 <hwangcc@csie.nctu.edu.tw>
Tue, 30 Jun 2015 14:22:56 +0000 (22:22 +0800)
Fix TODO in bindings.c.
There is no problem to use atoi here since either keycode 0 or button0 is invalid.
But strtol is more flexible and is recommanded for conversion.

src/bindings.c

index 5815908c46ece42c3ba524d71e8210f274fc3ac4..63ca0836a352a784f1c3de7da12bb71d61a8a85d 100644 (file)
@@ -63,10 +63,11 @@ Binding *configure_binding(const char *bindtype, const char *modifiers, const ch
 
         new_binding->symbol = sstrdup(input_code);
     } else {
-        // TODO: strtol with proper error handling
-        new_binding->keycode = atoi(input_code);
+        char *endptr;
+        long keycode = strtol(input_code, &endptr, 10);
+        new_binding->keycode = keycode;
         new_binding->input_type = B_KEYBOARD;
-        if (new_binding->keycode == 0) {
+        if (keycode == LONG_MAX || keycode == LONG_MIN || keycode < 0 || *endptr != '\0' || endptr == input_code) {
             ELOG("Could not parse \"%s\" as an input code, ignoring this binding.\n", input_code);
             FREE(new_binding);
             return NULL;
@@ -256,10 +257,11 @@ void translate_keysyms(void) {
 
     TAILQ_FOREACH(bind, bindings, bindings) {
         if (bind->input_type == B_MOUSE) {
-            int button = atoi(bind->symbol + (sizeof("button") - 1));
+            char *endptr;
+            long button = strtol(bind->symbol + (sizeof("button") - 1), &endptr, 10);
             bind->keycode = button;
 
-            if (button < 1)
+            if (button == LONG_MAX || button == LONG_MIN || button < 0 || *endptr != '\0' || endptr == bind->symbol)
                 ELOG("Could not translate string to button: \"%s\"\n", bind->symbol);
 
             continue;