vmod: remove support for resolving integer to virtual modifier
authorRan Benita <ran234@gmail.com>
Wed, 15 Aug 2012 19:07:37 +0000 (22:07 +0300)
committerRan Benita <ran234@gmail.com>
Sun, 2 Sep 2012 16:17:09 +0000 (19:17 +0300)
This is only relevant to the virtualModifier= statement in interpret
statements in xkb_compat. The current code allows to write e.g.
    virtualModifier = 4
to get the virtual modifier whose index happens to be 4 (possibly
declared in other files or sections, i.e. xkb_types). Doing this is
undeterministic, will break without notice, and not used anywhere.
Don't allow it.

Signed-off-by: Ran Benita <ran234@gmail.com>
src/utils.h
src/xkbcomp/vmod.c

index 0f7a384..3fda939 100644 (file)
@@ -44,6 +44,14 @@ streq(const char *s1, const char *s2)
 }
 
 static inline bool
+streq_not_null(const char *s1, const char *s2)
+{
+    if (!s1 || !s2)
+        return false;
+    return streq(s1, s2);
+}
+
+static inline bool
 istreq(const char *s1, const char *s2)
 {
     return strcasecmp(s1, s2) == 0;
index 7ce943c..de5647d 100644 (file)
@@ -173,32 +173,29 @@ bool
 ResolveVirtualModifier(ExprDef *def, struct xkb_keymap *keymap,
                        xkb_mod_index_t *ndx_rtrn, VModInfo *info)
 {
-    int val;
-
-    if (def->op == EXPR_IDENT) {
-        xkb_mod_index_t i;
-        xkb_mod_mask_t bit;
-        const char *name = xkb_atom_text(keymap->ctx, def->value.str);
-
-        for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) {
-            if ((info->available & bit) && keymap->vmod_names[i] &&
-                streq(keymap->vmod_names[i], name)) {
-                *ndx_rtrn = i;
-                return true;
-            }
-        }
-    }
-
-    if (!ExprResolveInteger(keymap->ctx, def, &val))
-        return false;
+    xkb_mod_index_t i;
+    const char *name;
 
-    if (val < 0 || val >= XkbNumVirtualMods) {
+    if (def->op != EXPR_IDENT) {
         log_err(keymap->ctx,
-                "Illegal virtual modifier %d (must be 0..%d inclusive)\n",
-                val, XkbNumVirtualMods - 1);
+                "Cannot resolve virtual modifier: "
+                "found %s where a virtual modifier name was expected\n",
+                expr_op_type_to_string(def->op));
         return false;
     }
 
-    *ndx_rtrn = (xkb_mod_index_t) val;
-    return true;
+    name = xkb_atom_text(keymap->ctx, def->value.str);
+
+    for (i = 0; i < XkbNumVirtualMods; i++) {
+        if ((info->available & (1 << i)) &&
+            streq_not_null(keymap->vmod_names[i], name)) {
+            *ndx_rtrn = i;
+            return true;
+        }
+    }
+
+    log_err(keymap->ctx,
+            "Cannot resolve virtual modifier: "
+            "\"%s\" was not previously declared\n", name);
+    return false;
 }