Introduce ExprResolveVModMask

Which is just a slightly more typesafe wrapper around the chained
ExprResolveModMask everyone was using earlier.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
master
Daniel Stone 2012-02-20 13:32:09 +00:00
parent fbb82199ee
commit 67605d2c90
7 changed files with 27 additions and 8 deletions

View File

@ -383,7 +383,7 @@ CheckModifierField(struct xkb_desc * xkb,
return True; return True;
} }
} }
if (!ExprResolveModMask(value, &rtrn, LookupVModMask, (char *) xkb)) if (!ExprResolveVModMask(value, &rtrn, xkb))
return ReportMismatch(action, F_Modifiers, "modifier mask"); return ReportMismatch(action, F_Modifiers, "modifier mask");
*mods_rtrn = rtrn.uval; *mods_rtrn = rtrn.uval;
*flags_inout &= ~XkbSA_UseModMapMods; *flags_inout &= ~XkbSA_UseModMapMods;

View File

@ -711,7 +711,7 @@ HandleGroupCompatDef(GroupCompatDef * def,
} }
tmp.fileID = info->fileID; tmp.fileID = info->fileID;
tmp.merge = merge; tmp.merge = merge;
if (!ExprResolveModMask(def->def, &val, LookupVModMask, (char *) xkb)) if (!ExprResolveVModMask(def->def, &val, xkb))
{ {
ERROR("Expected a modifier mask in group compatibility definition\n"); ERROR("Expected a modifier mask in group compatibility definition\n");
ACTION("Ignoring illegal compatibility map for group %d\n", ACTION("Ignoring illegal compatibility map for group %d\n",

View File

@ -28,6 +28,7 @@
#include "xkbmisc.h" #include "xkbmisc.h"
#include "tokens.h" #include "tokens.h"
#include "expr.h" #include "expr.h"
#include "vmod.h"
#include <ctype.h> #include <ctype.h>
@ -276,6 +277,19 @@ ExprResolveModMask(ExprDef * expr,
return ExprResolveMask(expr, val_rtrn, LookupModMask, (char *) & priv); return ExprResolveMask(expr, val_rtrn, LookupModMask, (char *) & priv);
} }
int
ExprResolveVModMask(ExprDef * expr,
ExprResult * val_rtrn,
struct xkb_desc *xkb)
{
LookupPriv priv;
priv.priv = NULL;
priv.chain = LookupVModMask;
priv.chainPriv = (char *) xkb;
return ExprResolveMask(expr, val_rtrn, LookupModMask, (char *) & priv);
}
int int
ExprResolveBoolean(ExprDef * expr, ExprResolveBoolean(ExprDef * expr,
ExprResult * val_rtrn, ExprResult * val_rtrn,

View File

@ -99,6 +99,11 @@ extern int ExprResolveModMask(ExprDef * /* expr */ ,
char * /* priv */ char * /* priv */
); );
extern int ExprResolveVModMask(ExprDef * /* expr */ ,
ExprResult * /* val_rtrn */ ,
struct xkb_desc * /* xkb */
);
extern int ExprResolveBoolean(ExprDef * /* expr */ , extern int ExprResolveBoolean(ExprDef * /* expr */ ,
ExprResult * /* val_rtrn */ , ExprResult * /* val_rtrn */ ,
IdentLookupFunc /* lookup */ , IdentLookupFunc /* lookup */ ,

View File

@ -211,7 +211,7 @@ SetIndicatorMapField(LEDInfo * led,
{ {
if (arrayNdx != NULL) if (arrayNdx != NULL)
return ReportIndicatorNotArray(led, field); return ReportIndicatorNotArray(led, field);
if (!ExprResolveModMask(value, &rtrn, LookupVModMask, (char *) xkb)) if (!ExprResolveVModMask(value, &rtrn, xkb))
return ReportIndicatorBadType(led, field, "modifier mask"); return ReportIndicatorBadType(led, field, "modifier mask");
led->real_mods = rtrn.uval & 0xff; led->real_mods = rtrn.uval & 0xff;
led->vmods = (rtrn.uval >> 8) & 0xff; led->vmods = (rtrn.uval >> 8) & 0xff;

View File

@ -666,7 +666,7 @@ SetMapEntry(KeyTypeInfo * type,
if (arrayNdx == NULL) if (arrayNdx == NULL)
return ReportTypeShouldBeArray(type, "map entry"); return ReportTypeShouldBeArray(type, "map entry");
if (!ExprResolveModMask(arrayNdx, &rtrn, LookupVModMask, (char *) xkb)) if (!ExprResolveVModMask(arrayNdx, &rtrn, xkb))
return ReportTypeBadType(type, "map entry", "modifier mask"); return ReportTypeBadType(type, "map entry", "modifier mask");
entry.mods.real_mods = rtrn.uval & 0xff; /* modifiers < 512 */ entry.mods.real_mods = rtrn.uval & 0xff; /* modifiers < 512 */
entry.mods.vmods = (rtrn.uval >> 8) & 0xffff; /* modifiers > 512 */ entry.mods.vmods = (rtrn.uval >> 8) & 0xffff; /* modifiers > 512 */
@ -712,7 +712,7 @@ SetPreserve(KeyTypeInfo * type,
if (arrayNdx == NULL) if (arrayNdx == NULL)
return ReportTypeShouldBeArray(type, "preserve entry"); return ReportTypeShouldBeArray(type, "preserve entry");
if (!ExprResolveModMask(arrayNdx, &rtrn, LookupVModMask, (char *) xkb)) if (!ExprResolveVModMask(arrayNdx, &rtrn, xkb))
return ReportTypeBadType(type, "preserve entry", "modifier mask"); return ReportTypeBadType(type, "preserve entry", "modifier mask");
new.defs = type->defs; new.defs = type->defs;
new.defs.next = NULL; new.defs.next = NULL;
@ -731,7 +731,7 @@ SetPreserve(KeyTypeInfo * type,
if (warningLevel > 0) if (warningLevel > 0)
INFO("%s\n", PreserveIndexTxt(xkb, &new)); INFO("%s\n", PreserveIndexTxt(xkb, &new));
} }
if (!ExprResolveModMask(value, &rtrn, LookupVModMask, (char *) xkb)) if (!ExprResolveVModMask(value, &rtrn, xkb))
{ {
ERROR("Preserve value in a key type is not a modifier mask\n"); ERROR("Preserve value in a key type is not a modifier mask\n");
ACTION("Ignoring preserve[%s] in type %s\n", ACTION("Ignoring preserve[%s] in type %s\n",
@ -869,7 +869,7 @@ SetKeyTypeField(KeyTypeInfo * type,
ACTION("Illegal array subscript ignored\n"); ACTION("Illegal array subscript ignored\n");
} }
/* get modifier mask for current type */ /* get modifier mask for current type */
if (!ExprResolveModMask(value, &tmp, LookupVModMask, (char *) xkb)) if (!ExprResolveVModMask(value, &tmp, xkb))
{ {
ERROR("Key type mask field must be a modifier mask\n"); ERROR("Key type mask field must be a modifier mask\n");
ACTION("Key type definition ignored\n"); ACTION("Key type definition ignored\n");

View File

@ -1175,7 +1175,7 @@ SetSymbolsField(KeyInfo * key,
(uStrCaseCmp(field, "virtualmods") == 0) || (uStrCaseCmp(field, "virtualmods") == 0) ||
(uStrCaseCmp(field, "virtualmodifiers") == 0)) (uStrCaseCmp(field, "virtualmodifiers") == 0))
{ {
ok = ExprResolveModMask(value, &tmp, LookupVModMask, (char *) xkb); ok = ExprResolveVModMask(value, &tmp, xkb);
if (ok) if (ok)
{ {
key->vmodmap = (tmp.uval >> 8); key->vmodmap = (tmp.uval >> 8);