Introduce ExprResolveLevel helper
authorDaniel Stone <daniel@fooishbar.org>
Mon, 20 Feb 2012 15:37:53 +0000 (15:37 +0000)
committerDaniel Stone <daniel@fooishbar.org>
Mon, 20 Feb 2012 15:37:53 +0000 (15:37 +0000)
Which returns an integer representing the level number represented by
the given expression.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
src/xkbcomp/expr.c
src/xkbcomp/expr.h
src/xkbcomp/keytypes.c

index 217656c..d266334 100644 (file)
@@ -658,6 +658,26 @@ ExprResolveRadioGroup(ExprDef * expr,
 }
 
 int
+ExprResolveLevel(ExprDef * expr,
+                 ExprResult * val_rtrn)
+{
+    static LookupEntry level_names[] = {
+        { "level1", 1 },
+        { "level2", 2 },
+        { "level3", 3 },
+        { "level4", 4 },
+        { "level5", 5 },
+        { "level6", 6 },
+        { "level7", 7 },
+        { "level8", 8 },
+        { NULL, 0 }
+    };
+
+    return ExprResolveInteger(expr, val_rtrn, SimpleLookup,
+                              (char *) level_names);
+}
+
+int
 ExprResolveString(ExprDef * expr,
                   ExprResult * val_rtrn)
 {
index 4aca3d4..f11d9ea 100644 (file)
@@ -120,6 +120,10 @@ extern int ExprResolveRadioGroup(ExprDef * /* expr */ ,
                                  ExprResult * /* val_rtrn */
     );
 
+extern int ExprResolveLevel(ExprDef * /* expr */ ,
+                            ExprResult * /* val_rtrn */
+    );
+
 extern int ExprResolveFloat(ExprDef * /* expr */ ,
                             ExprResult * /* val_rtrn */
     );
index 3dcceda..57164d2 100644 (file)
@@ -645,18 +645,6 @@ AddMapEntry(struct xkb_desc * xkb,
     return True;
 }
 
-static LookupEntry lnames[] = {
-    {"level1", 1},
-    {"level2", 2},
-    {"level3", 3},
-    {"level4", 4},
-    {"level5", 5},
-    {"level6", 6},
-    {"level7", 7},
-    {"level8", 8},
-    {NULL, 0}
-};
-
 static Bool
 SetMapEntry(KeyTypeInfo * type,
             struct xkb_desc * xkb, ExprDef * arrayNdx, ExprDef * value)
@@ -685,7 +673,7 @@ SetMapEntry(KeyTypeInfo * type,
         entry.mods.real_mods &= type->mask;
         entry.mods.vmods &= type->vmask;
     }
-    if (!ExprResolveInteger(value, &rtrn, SimpleLookup, (char *) lnames))
+    if (!ExprResolveLevel(value, &rtrn))
     {
         ERROR("Level specifications in a key type must be integer\n");
         ACTION("Ignoring malformed level specification\n");
@@ -821,7 +809,7 @@ SetLevelName(KeyTypeInfo * type, ExprDef * arrayNdx, ExprDef * value)
 
     if (arrayNdx == NULL)
         return ReportTypeShouldBeArray(type, "level name");
-    if (!ExprResolveInteger(arrayNdx, &rtrn, SimpleLookup, (char *) lnames))
+    if (!ExprResolveLevel(arrayNdx, &rtrn))
         return ReportTypeBadType(type, "level name", "integer");
     if ((rtrn.ival < 1) || (rtrn.ival > XkbMaxShiftLevel + 1))
     {