[vlc-devel] commit: Sort hotkeys per key code and use binary search ( Rémi Denis-Courmont )

git version control git at videolan.org
Sun Jan 3 15:47:42 CET 2010


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Jan  3 16:46:50 2010 +0200| [54335f5e2a620b11c3d15775787686d368785a47] | committer: Rémi Denis-Courmont 

Sort hotkeys per key code and use binary search

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=54335f5e2a620b11c3d15775787686d368785a47
---

 src/misc/action.c |   28 +++++++++++++++++++---------
 1 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/misc/action.c b/src/misc/action.c
index de943c9..92f8b97 100644
--- a/src/misc/action.c
+++ b/src/misc/action.c
@@ -27,6 +27,17 @@
 #include "../libvlc.h"
 #include <vlc_keys.h>
 #include <stdlib.h>
+#include <limits.h>
+
+static int keycmp (const void *a, const void *b)
+{
+    const struct hotkey *ka = a, *kb = b;
+#if (INT_MAX >= 0x7fffffff)
+    return ka->i_key - kb->i_key;
+#else
+    return (ka->i_key < kb->i_key) ? -1 : (ka->i_key > kb->i_key) ? +1 : 0;
+#endif
+}
 
 /**
  * Get the action associated with a VLC key code, if any.
@@ -34,15 +45,12 @@
 static
 vlc_key_t vlc_TranslateKey (const vlc_object_t *obj, uint_fast32_t keycode)
 {
-    /* TODO: search should be O(log n), not O(n) */
-    for (const struct hotkey *key = obj->p_libvlc->p_hotkeys;
-         key->psz_action != NULL;
-         key++)
-    {
-        if (key->i_key == keycode)
-            return key->i_action;
-    }
-    return ACTIONID_NONE;
+    struct hotkey k = { .psz_action = NULL, .i_key = keycode, .i_action = 0 };
+    const struct hotkey *key;
+
+    key = bsearch (&k, obj->p_libvlc->p_hotkeys, libvlc_actions_count,
+                   sizeof (*key), keycmp);
+    return (key != NULL) ? key->i_action : ACTIONID_NONE;
 }
 
 static int vlc_key_to_action (vlc_object_t *libvlc, const char *varname,
@@ -89,6 +97,8 @@ int vlc_InitActions (libvlc_int_t *libvlc)
         }
 #endif
     }
+    qsort (keys, libvlc_actions_count, sizeof (*keys), keycmp);
+
     keys[libvlc_actions_count].psz_action = NULL;
     keys[libvlc_actions_count].i_key = 0;
     keys[libvlc_actions_count].i_action = 0;




More information about the vlc-devel mailing list