static bool CheckGroupField(struct xkb_keymap *keymap, unsigned action, const ExprDef *value, enum xkb_action_flags *flags_inout, xkb_layout_index_t *grp_rtrn) { const ExprDef *spec; if (value->expr.op == EXPR_NEGATE || value->expr.op == EXPR_UNARY_PLUS) { *flags_inout &= ~ACTION_ABSOLUTE_SWITCH; spec = value->unary.child; } else { *flags_inout |= ACTION_ABSOLUTE_SWITCH; spec = value; } if (!ExprResolveGroup(keymap->ctx, spec, grp_rtrn)) return ReportMismatch(keymap, action, ACTION_FIELD_GROUP, "integer (range 1..8)"); if (value->expr.op == EXPR_NEGATE) *grp_rtrn = -*grp_rtrn; else if (value->expr.op != EXPR_UNARY_PLUS) (*grp_rtrn)--; return true; }
static bool CheckGroupField(struct xkb_context *ctx, enum xkb_action_type action, const ExprDef *array_ndx, const ExprDef *value, enum xkb_action_flags *flags_inout, int32_t *group_rtrn) { const ExprDef *spec; xkb_layout_index_t idx; enum xkb_action_flags flags = *flags_inout; if (array_ndx) return ReportActionNotArray(ctx, action, ACTION_FIELD_GROUP); if (value->expr.op == EXPR_NEGATE || value->expr.op == EXPR_UNARY_PLUS) { flags &= ~ACTION_ABSOLUTE_SWITCH; spec = value->unary.child; } else { flags |= ACTION_ABSOLUTE_SWITCH; spec = value; } if (!ExprResolveGroup(ctx, spec, &idx)) return ReportMismatch(ctx, action, ACTION_FIELD_GROUP, "integer (range 1..8)"); /* +n, -n are relative, n is absolute. */ if (value->expr.op == EXPR_NEGATE || value->expr.op == EXPR_UNARY_PLUS) { *group_rtrn = (int32_t) idx; if (value->expr.op == EXPR_NEGATE) *group_rtrn = -*group_rtrn; } else { *group_rtrn = (int32_t) (idx - 1); } *flags_inout = flags; return true; }