diff options
Diffstat (limited to 'src/3rdparty/xkbcommon/src/xkbcomp')
26 files changed, 0 insertions, 13852 deletions
diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/action.c b/src/3rdparty/xkbcommon/src/xkbcomp/action.c deleted file mode 100644 index f99a850083..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/action.c +++ /dev/null @@ -1,871 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -/* - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone <daniel@fooishbar.org> - * Ran Benita <ran234@gmail.com> - */ - -#include "xkbcomp-priv.h" -#include "text.h" -#include "expr.h" -#include "action.h" - -static const ExprBoolean constTrue = { - .expr = { - .common = { .type = STMT_EXPR, .next = NULL }, - .op = EXPR_VALUE, - .value_type = EXPR_TYPE_BOOLEAN, - }, - .set = true, -}; - -static const ExprBoolean constFalse = { - .expr = { - .common = { .type = STMT_EXPR, .next = NULL }, - .op = EXPR_VALUE, - .value_type = EXPR_TYPE_BOOLEAN, - }, - .set = false, -}; - -enum action_field { - ACTION_FIELD_CLEAR_LOCKS, - ACTION_FIELD_LATCH_TO_LOCK, - ACTION_FIELD_GEN_KEY_EVENT, - ACTION_FIELD_REPORT, - ACTION_FIELD_DEFAULT, - ACTION_FIELD_AFFECT, - ACTION_FIELD_INCREMENT, - ACTION_FIELD_MODIFIERS, - ACTION_FIELD_GROUP, - ACTION_FIELD_X, - ACTION_FIELD_Y, - ACTION_FIELD_ACCEL, - ACTION_FIELD_BUTTON, - ACTION_FIELD_VALUE, - ACTION_FIELD_CONTROLS, - ACTION_FIELD_TYPE, - ACTION_FIELD_COUNT, - ACTION_FIELD_SCREEN, - ACTION_FIELD_SAME, - ACTION_FIELD_DATA, - ACTION_FIELD_DEVICE, - ACTION_FIELD_KEYCODE, - ACTION_FIELD_MODS_TO_CLEAR, -}; - -ActionsInfo * -NewActionsInfo(void) -{ - enum xkb_action_type type; - ActionsInfo *info; - - info = calloc(1, sizeof(*info)); - if (!info) - return NULL; - - for (type = 0; type < _ACTION_TYPE_NUM_ENTRIES; type++) - info->actions[type].type = type; - - /* Apply some "factory defaults". */ - - /* Increment default button. */ - info->actions[ACTION_TYPE_PTR_DEFAULT].dflt.flags = 0; - info->actions[ACTION_TYPE_PTR_DEFAULT].dflt.value = 1; - info->actions[ACTION_TYPE_PTR_MOVE].ptr.flags = ACTION_ACCEL; - info->actions[ACTION_TYPE_SWITCH_VT].screen.flags = ACTION_SAME_SCREEN; - - return info; -} - -void -FreeActionsInfo(ActionsInfo *info) -{ - free(info); -} - -static const LookupEntry fieldStrings[] = { - { "clearLocks", ACTION_FIELD_CLEAR_LOCKS }, - { "latchToLock", ACTION_FIELD_LATCH_TO_LOCK }, - { "genKeyEvent", ACTION_FIELD_GEN_KEY_EVENT }, - { "generateKeyEvent", ACTION_FIELD_GEN_KEY_EVENT }, - { "report", ACTION_FIELD_REPORT }, - { "default", ACTION_FIELD_DEFAULT }, - { "affect", ACTION_FIELD_AFFECT }, - { "increment", ACTION_FIELD_INCREMENT }, - { "modifiers", ACTION_FIELD_MODIFIERS }, - { "mods", ACTION_FIELD_MODIFIERS }, - { "group", ACTION_FIELD_GROUP }, - { "x", ACTION_FIELD_X }, - { "y", ACTION_FIELD_Y }, - { "accel", ACTION_FIELD_ACCEL }, - { "accelerate", ACTION_FIELD_ACCEL }, - { "repeat", ACTION_FIELD_ACCEL }, - { "button", ACTION_FIELD_BUTTON }, - { "value", ACTION_FIELD_VALUE }, - { "controls", ACTION_FIELD_CONTROLS }, - { "ctrls", ACTION_FIELD_CONTROLS }, - { "type", ACTION_FIELD_TYPE }, - { "count", ACTION_FIELD_COUNT }, - { "screen", ACTION_FIELD_SCREEN }, - { "same", ACTION_FIELD_SAME }, - { "sameServer", ACTION_FIELD_SAME }, - { "data", ACTION_FIELD_DATA }, - { "device", ACTION_FIELD_DEVICE }, - { "dev", ACTION_FIELD_DEVICE }, - { "key", ACTION_FIELD_KEYCODE }, - { "keycode", ACTION_FIELD_KEYCODE }, - { "kc", ACTION_FIELD_KEYCODE }, - { "clearmods", ACTION_FIELD_MODS_TO_CLEAR }, - { "clearmodifiers", ACTION_FIELD_MODS_TO_CLEAR }, - { NULL, 0 } -}; - -static bool -stringToAction(const char *str, enum xkb_action_type *type_rtrn) -{ - return LookupString(actionTypeNames, str, type_rtrn); -} - -static bool -stringToField(const char *str, enum action_field *field_rtrn) -{ - return LookupString(fieldStrings, str, field_rtrn); -} - -static const char * -fieldText(enum action_field field) -{ - return LookupValue(fieldStrings, field); -} - -/***====================================================================***/ - -static inline bool -ReportMismatch(struct xkb_context *ctx, enum xkb_action_type action, - enum action_field field, const char *type) -{ - log_err(ctx, - "Value of %s field must be of type %s; " - "Action %s definition ignored\n", - fieldText(field), type, ActionTypeText(action)); - return false; -} - -static inline bool -ReportIllegal(struct xkb_context *ctx, enum xkb_action_type action, - enum action_field field) -{ - log_err(ctx, - "Field %s is not defined for an action of type %s; " - "Action definition ignored\n", - fieldText(field), ActionTypeText(action)); - return false; -} - -static inline bool -ReportActionNotArray(struct xkb_context *ctx, enum xkb_action_type action, - enum action_field field) -{ - log_err(ctx, - "The %s field in the %s action is not an array; " - "Action definition ignored\n", - fieldText(field), ActionTypeText(action)); - return false; -} - -static bool -HandleNoAction(struct xkb_context *ctx, const struct xkb_mod_set *mods, - union xkb_action *action, enum action_field field, - const ExprDef *array_ndx, const ExprDef *value) - -{ - return true; -} - -static bool -CheckBooleanFlag(struct xkb_context *ctx, enum xkb_action_type action, - enum action_field field, enum xkb_action_flags flag, - const ExprDef *array_ndx, const ExprDef *value, - enum xkb_action_flags *flags_inout) -{ - bool set; - - if (array_ndx) - return ReportActionNotArray(ctx, action, field); - - if (!ExprResolveBoolean(ctx, value, &set)) - return ReportMismatch(ctx, action, field, "boolean"); - - if (set) - *flags_inout |= flag; - else - *flags_inout &= ~flag; - - return true; -} - -static bool -CheckModifierField(struct xkb_context *ctx, const struct xkb_mod_set *mods, - enum xkb_action_type action, const ExprDef *array_ndx, - const ExprDef *value, enum xkb_action_flags *flags_inout, - xkb_mod_mask_t *mods_rtrn) -{ - if (array_ndx) - return ReportActionNotArray(ctx, action, ACTION_FIELD_MODIFIERS); - - if (value->expr.op == EXPR_IDENT) { - const char *valStr; - valStr = xkb_atom_text(ctx, value->ident.ident); - if (valStr && (istreq(valStr, "usemodmapmods") || - istreq(valStr, "modmapmods"))) { - *mods_rtrn = 0; - *flags_inout |= ACTION_MODS_LOOKUP_MODMAP; - return true; - } - } - - if (!ExprResolveModMask(ctx, value, MOD_BOTH, mods, mods_rtrn)) - return ReportMismatch(ctx, action, - ACTION_FIELD_MODIFIERS, "modifier mask"); - - *flags_inout &= ~ACTION_MODS_LOOKUP_MODMAP; - return true; -} - -static const LookupEntry lockWhich[] = { - { "both", 0 }, - { "lock", ACTION_LOCK_NO_UNLOCK }, - { "neither", (ACTION_LOCK_NO_LOCK | ACTION_LOCK_NO_UNLOCK) }, - { "unlock", ACTION_LOCK_NO_LOCK }, - { NULL, 0 } -}; - -static bool -CheckAffectField(struct xkb_context *ctx, enum xkb_action_type action, - const ExprDef *array_ndx, const ExprDef *value, - enum xkb_action_flags *flags_inout) -{ - enum xkb_action_flags flags; - - if (array_ndx) - return ReportActionNotArray(ctx, action, ACTION_FIELD_AFFECT); - - if (!ExprResolveEnum(ctx, value, &flags, lockWhich)) - return ReportMismatch(ctx, action, ACTION_FIELD_AFFECT, - "lock, unlock, both, neither"); - - *flags_inout &= ~(ACTION_LOCK_NO_LOCK | ACTION_LOCK_NO_UNLOCK); - *flags_inout |= flags; - return true; -} - -static bool -HandleSetLatchLockMods(struct xkb_context *ctx, const struct xkb_mod_set *mods, - union xkb_action *action, enum action_field field, - const ExprDef *array_ndx, const ExprDef *value) -{ - struct xkb_mod_action *act = &action->mods; - const enum xkb_action_type type = action->type; - - if (field == ACTION_FIELD_MODIFIERS) - return CheckModifierField(ctx, mods, action->type, array_ndx, value, - &act->flags, &act->mods.mods); - if ((type == ACTION_TYPE_MOD_SET || type == ACTION_TYPE_MOD_LATCH) && - field == ACTION_FIELD_CLEAR_LOCKS) - return CheckBooleanFlag(ctx, action->type, field, - ACTION_LOCK_CLEAR, array_ndx, value, - &act->flags); - if (type == ACTION_TYPE_MOD_LATCH && - field == ACTION_FIELD_LATCH_TO_LOCK) - return CheckBooleanFlag(ctx, action->type, field, - ACTION_LATCH_TO_LOCK, array_ndx, value, - &act->flags); - if (type == ACTION_TYPE_MOD_LOCK && - field == ACTION_FIELD_AFFECT) - return CheckAffectField(ctx, action->type, array_ndx, value, - &act->flags); - - return ReportIllegal(ctx, action->type, field); -} - -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; -} - -static bool -HandleSetLatchLockGroup(struct xkb_context *ctx, const struct xkb_mod_set *mods, - union xkb_action *action, enum action_field field, - const ExprDef *array_ndx, const ExprDef *value) -{ - struct xkb_group_action *act = &action->group; - const enum xkb_action_type type = action->type; - - if (field == ACTION_FIELD_GROUP) - return CheckGroupField(ctx, action->type, array_ndx, value, - &act->flags, &act->group); - if ((type == ACTION_TYPE_GROUP_SET || type == ACTION_TYPE_GROUP_LATCH) && - field == ACTION_FIELD_CLEAR_LOCKS) - return CheckBooleanFlag(ctx, action->type, field, - ACTION_LOCK_CLEAR, array_ndx, value, - &act->flags); - if (type == ACTION_TYPE_GROUP_LATCH && - field == ACTION_FIELD_LATCH_TO_LOCK) - return CheckBooleanFlag(ctx, action->type, field, - ACTION_LATCH_TO_LOCK, array_ndx, value, - &act->flags); - - return ReportIllegal(ctx, action->type, field); -} - -static bool -HandleMovePtr(struct xkb_context *ctx, const struct xkb_mod_set *mods, - union xkb_action *action, enum action_field field, - const ExprDef *array_ndx, const ExprDef *value) -{ - struct xkb_pointer_action *act = &action->ptr; - - if (field == ACTION_FIELD_X || field == ACTION_FIELD_Y) { - int val; - const bool absolute = (value->expr.op != EXPR_NEGATE && - value->expr.op != EXPR_UNARY_PLUS); - - if (array_ndx) - return ReportActionNotArray(ctx, action->type, field); - - if (!ExprResolveInteger(ctx, value, &val)) - return ReportMismatch(ctx, action->type, field, "integer"); - - if (val < INT16_MIN || val > INT16_MAX) { - log_err(ctx, - "The %s field in the %s action must be in range %d..%d; " - "Action definition ignored\n", - fieldText(field), ActionTypeText(action->type), - INT16_MIN, INT16_MAX); - return false; - } - - if (field == ACTION_FIELD_X) { - if (absolute) - act->flags |= ACTION_ABSOLUTE_X; - act->x = (int16_t) val; - } - else { - if (absolute) - act->flags |= ACTION_ABSOLUTE_Y; - act->y = (int16_t) val; - } - - return true; - } - else if (field == ACTION_FIELD_ACCEL) { - return CheckBooleanFlag(ctx, action->type, field, - ACTION_ACCEL, array_ndx, value, &act->flags); - } - - return ReportIllegal(ctx, action->type, field); -} - -static bool -HandlePtrBtn(struct xkb_context *ctx, const struct xkb_mod_set *mods, - union xkb_action *action, enum action_field field, - const ExprDef *array_ndx, const ExprDef *value) -{ - struct xkb_pointer_button_action *act = &action->btn; - - if (field == ACTION_FIELD_BUTTON) { - int btn; - - if (array_ndx) - return ReportActionNotArray(ctx, action->type, field); - - if (!ExprResolveButton(ctx, value, &btn)) - return ReportMismatch(ctx, action->type, field, - "integer (range 1..5)"); - - if (btn < 0 || btn > 5) { - log_err(ctx, - "Button must specify default or be in the range 1..5; " - "Illegal button value %d ignored\n", btn); - return false; - } - - act->button = btn; - return true; - } - else if (action->type == ACTION_TYPE_PTR_LOCK && - field == ACTION_FIELD_AFFECT) { - return CheckAffectField(ctx, action->type, array_ndx, value, - &act->flags); - } - else if (field == ACTION_FIELD_COUNT) { - int val; - - if (array_ndx) - return ReportActionNotArray(ctx, action->type, field); - - if (!ExprResolveInteger(ctx, value, &val)) - return ReportMismatch(ctx, action->type, field, "integer"); - - if (val < 0 || val > 255) { - log_err(ctx, - "The count field must have a value in the range 0..255; " - "Illegal count %d ignored\n", val); - return false; - } - - act->count = (uint8_t) val; - return true; - } - - return ReportIllegal(ctx, action->type, field); -} - -static const LookupEntry ptrDflts[] = { - { "dfltbtn", 1 }, - { "defaultbutton", 1 }, - { "button", 1 }, - { NULL, 0 } -}; - -static bool -HandleSetPtrDflt(struct xkb_context *ctx, const struct xkb_mod_set *mods, - union xkb_action *action, enum action_field field, - const ExprDef *array_ndx, const ExprDef *value) -{ - struct xkb_pointer_default_action *act = &action->dflt; - - if (field == ACTION_FIELD_AFFECT) { - unsigned int val; - - if (array_ndx) - return ReportActionNotArray(ctx, action->type, field); - - if (!ExprResolveEnum(ctx, value, &val, ptrDflts)) - return ReportMismatch(ctx, action->type, field, - "pointer component"); - return true; - } - else if (field == ACTION_FIELD_BUTTON || field == ACTION_FIELD_VALUE) { - const ExprDef *button; - int btn; - - if (array_ndx) - return ReportActionNotArray(ctx, action->type, field); - - if (value->expr.op == EXPR_NEGATE || - value->expr.op == EXPR_UNARY_PLUS) { - act->flags &= ~ACTION_ABSOLUTE_SWITCH; - button = value->unary.child; - } - else { - act->flags |= ACTION_ABSOLUTE_SWITCH; - button = value; - } - - if (!ExprResolveButton(ctx, button, &btn)) - return ReportMismatch(ctx, action->type, field, - "integer (range 1..5)"); - - if (btn < 0 || btn > 5) { - log_err(ctx, - "New default button value must be in the range 1..5; " - "Illegal default button value %d ignored\n", btn); - return false; - } - if (btn == 0) { - log_err(ctx, - "Cannot set default pointer button to \"default\"; " - "Illegal default button setting ignored\n"); - return false; - } - - act->value = (value->expr.op == EXPR_NEGATE ? -btn: btn); - return true; - } - - return ReportIllegal(ctx, action->type, field); -} - -static bool -HandleSwitchScreen(struct xkb_context *ctx, const struct xkb_mod_set *mods, - union xkb_action *action, enum action_field field, - const ExprDef *array_ndx, const ExprDef *value) -{ - struct xkb_switch_screen_action *act = &action->screen; - - if (field == ACTION_FIELD_SCREEN) { - const ExprDef *scrn; - int val; - - if (array_ndx) - return ReportActionNotArray(ctx, action->type, field); - - if (value->expr.op == EXPR_NEGATE || - value->expr.op == EXPR_UNARY_PLUS) { - act->flags &= ~ACTION_ABSOLUTE_SWITCH; - scrn = value->unary.child; - } - else { - act->flags |= ACTION_ABSOLUTE_SWITCH; - scrn = value; - } - - if (!ExprResolveInteger(ctx, scrn, &val)) - return ReportMismatch(ctx, action->type, field, - "integer (0..255)"); - - if (val < 0 || val > 255) { - log_err(ctx, - "Screen index must be in the range 1..255; " - "Illegal screen value %d ignored\n", val); - return false; - } - - act->screen = (value->expr.op == EXPR_NEGATE ? -val : val); - return true; - } - else if (field == ACTION_FIELD_SAME) { - return CheckBooleanFlag(ctx, action->type, field, - ACTION_SAME_SCREEN, array_ndx, value, - &act->flags); - } - - return ReportIllegal(ctx, action->type, field); -} - -static bool -HandleSetLockControls(struct xkb_context *ctx, const struct xkb_mod_set *mods, - union xkb_action *action, enum action_field field, - const ExprDef *array_ndx, const ExprDef *value) -{ - struct xkb_controls_action *act = &action->ctrls; - - if (field == ACTION_FIELD_CONTROLS) { - enum xkb_action_controls mask; - - if (array_ndx) - return ReportActionNotArray(ctx, action->type, field); - - if (!ExprResolveMask(ctx, value, &mask, ctrlMaskNames)) - return ReportMismatch(ctx, action->type, field, - "controls mask"); - - act->ctrls = mask; - return true; - } - else if (field == ACTION_FIELD_AFFECT) { - return CheckAffectField(ctx, action->type, array_ndx, value, - &act->flags); - } - - return ReportIllegal(ctx, action->type, field); -} - -static bool -HandlePrivate(struct xkb_context *ctx, const struct xkb_mod_set *mods, - union xkb_action *action, enum action_field field, - const ExprDef *array_ndx, const ExprDef *value) -{ - struct xkb_private_action *act = &action->priv; - - if (field == ACTION_FIELD_TYPE) { - int type; - - if (array_ndx) - return ReportActionNotArray(ctx, action->type, field); - - if (!ExprResolveInteger(ctx, value, &type)) - return ReportMismatch(ctx, ACTION_TYPE_PRIVATE, field, "integer"); - - if (type < 0 || type > 255) { - log_err(ctx, - "Private action type must be in the range 0..255; " - "Illegal type %d ignored\n", type); - return false; - } - - /* - * It's possible for someone to write something like this: - * actions = [ Private(type=3,data[0]=1,data[1]=3,data[2]=3) ] - * where the type refers to some existing action type, e.g. LockMods. - * This assumes that this action's struct is laid out in memory - * exactly as described in the XKB specification and libraries. - * We, however, have changed these structs in various ways, so this - * assumption is no longer true. Since this is a lousy "feature", we - * make actions like these no-ops for now. - */ - if (type < ACTION_TYPE_PRIVATE) { - log_info(ctx, - "Private actions of type %s are not supported; Ignored\n", - ActionTypeText(type)); - act->type = ACTION_TYPE_NONE; - } - else { - act->type = (enum xkb_action_type) type; - } - - return true; - } - else if (field == ACTION_FIELD_DATA) { - if (array_ndx == NULL) { - xkb_atom_t val; - const char *str; - size_t len; - - if (!ExprResolveString(ctx, value, &val)) - return ReportMismatch(ctx, action->type, field, "string"); - - str = xkb_atom_text(ctx, val); - len = strlen(str); - if (len < 1 || len > 7) { - log_warn(ctx, - "A private action has 7 data bytes; " - "Illegal data ignored\n"); - return false; - } - - /* act->data may not be null-terminated, this is intentional */ - strncpy((char *) act->data, str, sizeof(act->data)); - return true; - } - else { - int ndx, datum; - - if (!ExprResolveInteger(ctx, array_ndx, &ndx)) { - log_err(ctx, - "Array subscript must be integer; " - "Illegal subscript ignored\n"); - return false; - } - - if (ndx < 0 || (size_t) ndx >= sizeof(act->data)) { - log_err(ctx, - "The data for a private action is %lu bytes long; " - "Attempt to use data[%d] ignored\n", - (unsigned long) sizeof(act->data), ndx); - return false; - } - - if (!ExprResolveInteger(ctx, value, &datum)) - return ReportMismatch(ctx, act->type, field, "integer"); - - if (datum < 0 || datum > 255) { - log_err(ctx, - "All data for a private action must be 0..255; " - "Illegal datum %d ignored\n", datum); - return false; - } - - act->data[ndx] = (uint8_t) datum; - return true; - } - } - - return ReportIllegal(ctx, ACTION_TYPE_NONE, field); -} - -typedef bool (*actionHandler)(struct xkb_context *ctx, - const struct xkb_mod_set *mods, - union xkb_action *action, - enum action_field field, - const ExprDef *array_ndx, - const ExprDef *value); - -static const actionHandler handleAction[_ACTION_TYPE_NUM_ENTRIES] = { - [ACTION_TYPE_NONE] = HandleNoAction, - [ACTION_TYPE_MOD_SET] = HandleSetLatchLockMods, - [ACTION_TYPE_MOD_LATCH] = HandleSetLatchLockMods, - [ACTION_TYPE_MOD_LOCK] = HandleSetLatchLockMods, - [ACTION_TYPE_GROUP_SET] = HandleSetLatchLockGroup, - [ACTION_TYPE_GROUP_LATCH] = HandleSetLatchLockGroup, - [ACTION_TYPE_GROUP_LOCK] = HandleSetLatchLockGroup, - [ACTION_TYPE_PTR_MOVE] = HandleMovePtr, - [ACTION_TYPE_PTR_BUTTON] = HandlePtrBtn, - [ACTION_TYPE_PTR_LOCK] = HandlePtrBtn, - [ACTION_TYPE_PTR_DEFAULT] = HandleSetPtrDflt, - [ACTION_TYPE_TERMINATE] = HandleNoAction, - [ACTION_TYPE_SWITCH_VT] = HandleSwitchScreen, - [ACTION_TYPE_CTRL_SET] = HandleSetLockControls, - [ACTION_TYPE_CTRL_LOCK] = HandleSetLockControls, - [ACTION_TYPE_PRIVATE] = HandlePrivate, -}; - -/***====================================================================***/ - -bool -HandleActionDef(struct xkb_context *ctx, ActionsInfo *info, - const struct xkb_mod_set *mods, ExprDef *def, - union xkb_action *action) -{ - ExprDef *arg; - const char *str; - enum xkb_action_type handler_type; - - if (def->expr.op != EXPR_ACTION_DECL) { - log_err(ctx, "Expected an action definition, found %s\n", - expr_op_type_to_string(def->expr.op)); - return false; - } - - str = xkb_atom_text(ctx, def->action.name); - if (!stringToAction(str, &handler_type)) { - log_err(ctx, "Unknown action %s\n", str); - return false; - } - - /* - * Get the default values for this action type, as modified by - * statements such as: - * latchMods.clearLocks = True; - */ - *action = info->actions[handler_type]; - - /* - * Now change the action properties as specified for this - * particular instance, e.g. "modifiers" and "clearLocks" in: - * SetMods(modifiers=Alt,clearLocks); - */ - for (arg = def->action.args; arg != NULL; - arg = (ExprDef *) arg->common.next) { - const ExprDef *value; - ExprDef *field, *arrayRtrn; - const char *elemRtrn, *fieldRtrn; - enum action_field fieldNdx; - - if (arg->expr.op == EXPR_ASSIGN) { - field = arg->binary.left; - value = arg->binary.right; - } - else if (arg->expr.op == EXPR_NOT || arg->expr.op == EXPR_INVERT) { - field = arg->unary.child; - value = (const ExprDef *) &constFalse; - } - else { - field = arg; - value = (const ExprDef *) &constTrue; - } - - if (!ExprResolveLhs(ctx, field, &elemRtrn, &fieldRtrn, &arrayRtrn)) - return false; - - if (elemRtrn) { - log_err(ctx, - "Cannot change defaults in an action definition; " - "Ignoring attempt to change %s.%s\n", - elemRtrn, fieldRtrn); - return false; - } - - if (!stringToField(fieldRtrn, &fieldNdx)) { - log_err(ctx, "Unknown field name %s\n", fieldRtrn); - return false; - } - - if (!handleAction[handler_type](ctx, mods, action, fieldNdx, - arrayRtrn, value)) - return false; - } - - return true; -} - -bool -SetActionField(struct xkb_context *ctx, ActionsInfo *info, - struct xkb_mod_set *mods, const char *elem, - const char *field, ExprDef *array_ndx, ExprDef *value) -{ - enum xkb_action_type action; - enum action_field action_field; - - if (!stringToAction(elem, &action)) - return false; - - if (!stringToField(field, &action_field)) { - log_err(ctx, "\"%s\" is not a legal field name\n", field); - return false; - } - - return handleAction[action](ctx, mods, &info->actions[action], - action_field, array_ndx, value); -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/action.h b/src/3rdparty/xkbcommon/src/xkbcomp/action.h deleted file mode 100644 index 1f92e7b38e..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/action.h +++ /dev/null @@ -1,56 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#ifndef XKBCOMP_ACTION_H -#define XKBCOMP_ACTION_H - -/* - * This struct contains the default values which every new action - * (e.g. in an interpret statement) starts off with. It can be - * modified within the files (see calls to SetActionField). - */ -typedef struct { - union xkb_action actions[_ACTION_TYPE_NUM_ENTRIES]; -} ActionsInfo; - -ActionsInfo * -NewActionsInfo(void); - -void -FreeActionsInfo(ActionsInfo *info); - -bool -HandleActionDef(struct xkb_context *ctx, ActionsInfo *info, - const struct xkb_mod_set *mods, ExprDef *def, - union xkb_action *action); - -bool -SetActionField(struct xkb_context *ctx, ActionsInfo *info, - struct xkb_mod_set *mods, const char *elem, - const char *field, ExprDef *array_ndx, ExprDef *value); - - -#endif diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/ast-build.c b/src/3rdparty/xkbcommon/src/xkbcomp/ast-build.c deleted file mode 100644 index 365ff51c5f..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/ast-build.c +++ /dev/null @@ -1,806 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -/* - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone <daniel@fooishbar.org> - * Ran Benita <ran234@gmail.com> - */ - -#include "xkbcomp-priv.h" -#include "ast-build.h" -#include "include.h" - -ParseCommon * -AppendStmt(ParseCommon *to, ParseCommon *append) -{ - ParseCommon *iter; - - if (!to) - return append; - - for (iter = to; iter->next; iter = iter->next); - - iter->next = append; - return to; -} - -static ExprDef * -ExprCreate(enum expr_op_type op, enum expr_value_type type, size_t size) -{ - ExprDef *expr = malloc(size); - if (!expr) - return NULL; - - expr->common.type = STMT_EXPR; - expr->common.next = NULL; - expr->expr.op = op; - expr->expr.value_type = type; - - return expr; -} - -#define EXPR_CREATE(type_, name_, op_, value_type_) \ - ExprDef *name_ = ExprCreate(op_, value_type_, sizeof(type_)); \ - if (!name_) \ - return NULL; - -ExprDef * -ExprCreateString(xkb_atom_t str) -{ - EXPR_CREATE(ExprString, expr, EXPR_VALUE, EXPR_TYPE_STRING); - expr->string.str = str; - return expr; -} - -ExprDef * -ExprCreateInteger(int ival) -{ - EXPR_CREATE(ExprInteger, expr, EXPR_VALUE, EXPR_TYPE_INT); - expr->integer.ival = ival; - return expr; -} - -ExprDef * -ExprCreateFloat(void) -{ - EXPR_CREATE(ExprFloat, expr, EXPR_VALUE, EXPR_TYPE_FLOAT); - return expr; -} - -ExprDef * -ExprCreateBoolean(bool set) -{ - EXPR_CREATE(ExprBoolean, expr, EXPR_VALUE, EXPR_TYPE_BOOLEAN); - expr->boolean.set = set; - return expr; -} - -ExprDef * -ExprCreateKeyName(xkb_atom_t key_name) -{ - EXPR_CREATE(ExprKeyName, expr, EXPR_VALUE, EXPR_TYPE_KEYNAME); - expr->key_name.key_name = key_name; - return expr; -} - -ExprDef * -ExprCreateIdent(xkb_atom_t ident) -{ - EXPR_CREATE(ExprIdent, expr, EXPR_IDENT, EXPR_TYPE_UNKNOWN); - expr->ident.ident = ident; - return expr; -} - -ExprDef * -ExprCreateUnary(enum expr_op_type op, enum expr_value_type type, - ExprDef *child) -{ - EXPR_CREATE(ExprUnary, expr, op, type); - expr->unary.child = child; - return expr; -} - -ExprDef * -ExprCreateBinary(enum expr_op_type op, ExprDef *left, ExprDef *right) -{ - EXPR_CREATE(ExprBinary, expr, op, EXPR_TYPE_UNKNOWN); - - if (op == EXPR_ASSIGN || left->expr.value_type == EXPR_TYPE_UNKNOWN) - expr->expr.value_type = right->expr.value_type; - else if (left->expr.value_type == right->expr.value_type || - right->expr.value_type == EXPR_TYPE_UNKNOWN) - expr->expr.value_type = left->expr.value_type; - expr->binary.left = left; - expr->binary.right = right; - - return expr; -} - -ExprDef * -ExprCreateFieldRef(xkb_atom_t element, xkb_atom_t field) -{ - EXPR_CREATE(ExprFieldRef, expr, EXPR_FIELD_REF, EXPR_TYPE_UNKNOWN); - expr->field_ref.element = element; - expr->field_ref.field = field; - return expr; -} - -ExprDef * -ExprCreateArrayRef(xkb_atom_t element, xkb_atom_t field, ExprDef *entry) -{ - EXPR_CREATE(ExprArrayRef, expr, EXPR_ARRAY_REF, EXPR_TYPE_UNKNOWN); - expr->array_ref.element = element; - expr->array_ref.field = field; - expr->array_ref.entry = entry; - return expr; -} - -ExprDef * -ExprCreateAction(xkb_atom_t name, ExprDef *args) -{ - EXPR_CREATE(ExprAction, expr, EXPR_ACTION_DECL, EXPR_TYPE_UNKNOWN); - expr->action.name = name; - expr->action.args = args; - return expr; -} - -ExprDef * -ExprCreateKeysymList(xkb_keysym_t sym) -{ - EXPR_CREATE(ExprKeysymList, expr, EXPR_KEYSYM_LIST, EXPR_TYPE_SYMBOLS); - - darray_init(expr->keysym_list.syms); - darray_init(expr->keysym_list.symsMapIndex); - darray_init(expr->keysym_list.symsNumEntries); - - darray_append(expr->keysym_list.syms, sym); - darray_append(expr->keysym_list.symsMapIndex, 0); - darray_append(expr->keysym_list.symsNumEntries, 1); - - return expr; -} - -ExprDef * -ExprCreateMultiKeysymList(ExprDef *expr) -{ - unsigned nLevels = darray_size(expr->keysym_list.symsMapIndex); - - darray_resize(expr->keysym_list.symsMapIndex, 1); - darray_resize(expr->keysym_list.symsNumEntries, 1); - darray_item(expr->keysym_list.symsMapIndex, 0) = 0; - darray_item(expr->keysym_list.symsNumEntries, 0) = nLevels; - - return expr; -} - -ExprDef * -ExprAppendKeysymList(ExprDef *expr, xkb_keysym_t sym) -{ - unsigned nSyms = darray_size(expr->keysym_list.syms); - - darray_append(expr->keysym_list.symsMapIndex, nSyms); - darray_append(expr->keysym_list.symsNumEntries, 1); - darray_append(expr->keysym_list.syms, sym); - - return expr; -} - -ExprDef * -ExprAppendMultiKeysymList(ExprDef *expr, ExprDef *append) -{ - unsigned nSyms = darray_size(expr->keysym_list.syms); - unsigned numEntries = darray_size(append->keysym_list.syms); - - darray_append(expr->keysym_list.symsMapIndex, nSyms); - darray_append(expr->keysym_list.symsNumEntries, numEntries); - darray_concat(expr->keysym_list.syms, append->keysym_list.syms); - - FreeStmt((ParseCommon *) append); - - return expr; -} - -KeycodeDef * -KeycodeCreate(xkb_atom_t name, int64_t value) -{ - KeycodeDef *def = malloc(sizeof(*def)); - if (!def) - return NULL; - - def->common.type = STMT_KEYCODE; - def->common.next = NULL; - def->name = name; - def->value = value; - - return def; -} - -KeyAliasDef * -KeyAliasCreate(xkb_atom_t alias, xkb_atom_t real) -{ - KeyAliasDef *def = malloc(sizeof(*def)); - if (!def) - return NULL; - - def->common.type = STMT_ALIAS; - def->common.next = NULL; - def->alias = alias; - def->real = real; - - return def; -} - -VModDef * -VModCreate(xkb_atom_t name, ExprDef *value) -{ - VModDef *def = malloc(sizeof(*def)); - if (!def) - return NULL; - - def->common.type = STMT_VMOD; - def->common.next = NULL; - def->name = name; - def->value = value; - - return def; -} - -VarDef * -VarCreate(ExprDef *name, ExprDef *value) -{ - VarDef *def = malloc(sizeof(*def)); - if (!def) - return NULL; - - def->common.type = STMT_VAR; - def->common.next = NULL; - def->name = name; - def->value = value; - - return def; -} - -VarDef * -BoolVarCreate(xkb_atom_t ident, bool set) -{ - ExprDef *name, *value; - VarDef *def; - if (!(name = ExprCreateIdent(ident))) { - return NULL; - } - if (!(value = ExprCreateBoolean(set))) { - FreeStmt((ParseCommon *) name); - return NULL; - } - if (!(def = VarCreate(name, value))) { - FreeStmt((ParseCommon *) name); - FreeStmt((ParseCommon *) value); - return NULL; - } - return def; -} - -InterpDef * -InterpCreate(xkb_keysym_t sym, ExprDef *match) -{ - InterpDef *def = malloc(sizeof(*def)); - if (!def) - return NULL; - - def->common.type = STMT_INTERP; - def->common.next = NULL; - def->sym = sym; - def->match = match; - def->def = NULL; - - return def; -} - -KeyTypeDef * -KeyTypeCreate(xkb_atom_t name, VarDef *body) -{ - KeyTypeDef *def = malloc(sizeof(*def)); - if (!def) - return NULL; - - def->common.type = STMT_TYPE; - def->common.next = NULL; - def->merge = MERGE_DEFAULT; - def->name = name; - def->body = body; - - return def; -} - -SymbolsDef * -SymbolsCreate(xkb_atom_t keyName, VarDef *symbols) -{ - SymbolsDef *def = malloc(sizeof(*def)); - if (!def) - return NULL; - - def->common.type = STMT_SYMBOLS; - def->common.next = NULL; - def->merge = MERGE_DEFAULT; - def->keyName = keyName; - def->symbols = symbols; - - return def; -} - -GroupCompatDef * -GroupCompatCreate(unsigned group, ExprDef *val) -{ - GroupCompatDef *def = malloc(sizeof(*def)); - if (!def) - return NULL; - - def->common.type = STMT_GROUP_COMPAT; - def->common.next = NULL; - def->merge = MERGE_DEFAULT; - def->group = group; - def->def = val; - - return def; -} - -ModMapDef * -ModMapCreate(xkb_atom_t modifier, ExprDef *keys) -{ - ModMapDef *def = malloc(sizeof(*def)); - if (!def) - return NULL; - - def->common.type = STMT_MODMAP; - def->common.next = NULL; - def->merge = MERGE_DEFAULT; - def->modifier = modifier; - def->keys = keys; - - return def; -} - -LedMapDef * -LedMapCreate(xkb_atom_t name, VarDef *body) -{ - LedMapDef *def = malloc(sizeof(*def)); - if (!def) - return NULL; - - def->common.type = STMT_LED_MAP; - def->common.next = NULL; - def->merge = MERGE_DEFAULT; - def->name = name; - def->body = body; - - return def; -} - -LedNameDef * -LedNameCreate(unsigned ndx, ExprDef *name, bool virtual) -{ - LedNameDef *def = malloc(sizeof(*def)); - if (!def) - return NULL; - - def->common.type = STMT_LED_NAME; - def->common.next = NULL; - def->merge = MERGE_DEFAULT; - def->ndx = ndx; - def->name = name; - def->virtual = virtual; - - return def; -} - -static void -FreeInclude(IncludeStmt *incl); - -IncludeStmt * -IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge) -{ - IncludeStmt *incl, *first; - char *file, *map, *stmt, *tmp, *extra_data; - char nextop; - - incl = first = NULL; - file = map = NULL; - tmp = str; - stmt = strdup_safe(str); - while (tmp && *tmp) - { - if (!ParseIncludeMap(&tmp, &file, &map, &nextop, &extra_data)) - goto err; - - /* - * Given an RMLVO (here layout) like 'us,,fr', the rules parser - * will give out something like 'pc+us+:2+fr:3+inet(evdev)'. - * We should just skip the ':2' in this case and leave it to the - * appropriate section to deal with the empty group. - */ - if (isempty(file)) { - free(file); - free(map); - free(extra_data); - continue; - } - - if (first == NULL) { - first = incl = malloc(sizeof(*first)); - } else { - incl->next_incl = malloc(sizeof(*first)); - incl = incl->next_incl; - } - - if (!incl) - break; - - incl->common.type = STMT_INCLUDE; - incl->common.next = NULL; - incl->merge = merge; - incl->stmt = NULL; - incl->file = file; - incl->map = map; - incl->modifier = extra_data; - incl->next_incl = NULL; - - if (nextop == '|') - merge = MERGE_AUGMENT; - else - merge = MERGE_OVERRIDE; - } - - if (first) - first->stmt = stmt; - else - free(stmt); - - return first; - -err: - log_err(ctx, "Illegal include statement \"%s\"; Ignored\n", stmt); - FreeInclude(first); - free(stmt); - return NULL; -} - -XkbFile * -XkbFileCreate(enum xkb_file_type type, char *name, ParseCommon *defs, - enum xkb_map_flags flags) -{ - XkbFile *file; - - file = calloc(1, sizeof(*file)); - if (!file) - return NULL; - - XkbEscapeMapName(name); - file->file_type = type; - file->name = name ? name : strdup("(unnamed)"); - file->defs = defs; - file->flags = flags; - - return file; -} - -XkbFile * -XkbFileFromComponents(struct xkb_context *ctx, - const struct xkb_component_names *kkctgs) -{ - char *const components[] = { - kkctgs->keycodes, kkctgs->types, - kkctgs->compat, kkctgs->symbols, - }; - enum xkb_file_type type; - IncludeStmt *include = NULL; - XkbFile *file = NULL; - ParseCommon *defs = NULL; - - for (type = FIRST_KEYMAP_FILE_TYPE; type <= LAST_KEYMAP_FILE_TYPE; type++) { - include = IncludeCreate(ctx, components[type], MERGE_DEFAULT); - if (!include) - goto err; - - file = XkbFileCreate(type, NULL, (ParseCommon *) include, 0); - if (!file) { - FreeInclude(include); - goto err; - } - - defs = AppendStmt(defs, &file->common); - } - - file = XkbFileCreate(FILE_TYPE_KEYMAP, NULL, defs, 0); - if (!file) - goto err; - - return file; - -err: - FreeXkbFile((XkbFile *) defs); - return NULL; -} - -static void -FreeExpr(ExprDef *expr) -{ - if (!expr) - return; - - switch (expr->expr.op) { - case EXPR_ACTION_LIST: - case EXPR_NEGATE: - case EXPR_UNARY_PLUS: - case EXPR_NOT: - case EXPR_INVERT: - FreeStmt((ParseCommon *) expr->unary.child); - break; - - case EXPR_DIVIDE: - case EXPR_ADD: - case EXPR_SUBTRACT: - case EXPR_MULTIPLY: - case EXPR_ASSIGN: - FreeStmt((ParseCommon *) expr->binary.left); - FreeStmt((ParseCommon *) expr->binary.right); - break; - - case EXPR_ACTION_DECL: - FreeStmt((ParseCommon *) expr->action.args); - break; - - case EXPR_ARRAY_REF: - FreeStmt((ParseCommon *) expr->array_ref.entry); - break; - - case EXPR_KEYSYM_LIST: - darray_free(expr->keysym_list.syms); - darray_free(expr->keysym_list.symsMapIndex); - darray_free(expr->keysym_list.symsNumEntries); - break; - - default: - break; - } -} - -static void -FreeInclude(IncludeStmt *incl) -{ - IncludeStmt *next; - - while (incl) - { - next = incl->next_incl; - - free(incl->file); - free(incl->map); - free(incl->modifier); - free(incl->stmt); - - free(incl); - incl = next; - } -} - -void -FreeStmt(ParseCommon *stmt) -{ - ParseCommon *next; - - while (stmt) - { - next = stmt->next; - - switch (stmt->type) { - case STMT_INCLUDE: - FreeInclude((IncludeStmt *) stmt); - /* stmt is already free'd here. */ - stmt = NULL; - break; - case STMT_EXPR: - FreeExpr((ExprDef *) stmt); - break; - case STMT_VAR: - FreeStmt((ParseCommon *) ((VarDef *) stmt)->name); - FreeStmt((ParseCommon *) ((VarDef *) stmt)->value); - break; - case STMT_TYPE: - FreeStmt((ParseCommon *) ((KeyTypeDef *) stmt)->body); - break; - case STMT_INTERP: - FreeStmt((ParseCommon *) ((InterpDef *) stmt)->match); - FreeStmt((ParseCommon *) ((InterpDef *) stmt)->def); - break; - case STMT_VMOD: - FreeStmt((ParseCommon *) ((VModDef *) stmt)->value); - break; - case STMT_SYMBOLS: - FreeStmt((ParseCommon *) ((SymbolsDef *) stmt)->symbols); - break; - case STMT_MODMAP: - FreeStmt((ParseCommon *) ((ModMapDef *) stmt)->keys); - break; - case STMT_GROUP_COMPAT: - FreeStmt((ParseCommon *) ((GroupCompatDef *) stmt)->def); - break; - case STMT_LED_MAP: - FreeStmt((ParseCommon *) ((LedMapDef *) stmt)->body); - break; - case STMT_LED_NAME: - FreeStmt((ParseCommon *) ((LedNameDef *) stmt)->name); - break; - default: - break; - } - - free(stmt); - stmt = next; - } -} - -void -FreeXkbFile(XkbFile *file) -{ - XkbFile *next; - - while (file) - { - next = (XkbFile *) file->common.next; - - switch (file->file_type) { - case FILE_TYPE_KEYMAP: - FreeXkbFile((XkbFile *) file->defs); - break; - - case FILE_TYPE_TYPES: - case FILE_TYPE_COMPAT: - case FILE_TYPE_SYMBOLS: - case FILE_TYPE_KEYCODES: - case FILE_TYPE_GEOMETRY: - FreeStmt(file->defs); - break; - - default: - break; - } - - free(file->name); - free(file); - file = next; - } -} - -static const char *xkb_file_type_strings[_FILE_TYPE_NUM_ENTRIES] = { - [FILE_TYPE_KEYCODES] = "xkb_keycodes", - [FILE_TYPE_TYPES] = "xkb_types", - [FILE_TYPE_COMPAT] = "xkb_compatibility", - [FILE_TYPE_SYMBOLS] = "xkb_symbols", - [FILE_TYPE_GEOMETRY] = "xkb_geometry", - [FILE_TYPE_KEYMAP] = "xkb_keymap", - [FILE_TYPE_RULES] = "rules", -}; - -const char * -xkb_file_type_to_string(enum xkb_file_type type) -{ - if (type >= _FILE_TYPE_NUM_ENTRIES) - return "unknown"; - return xkb_file_type_strings[type]; -} - -static const char *stmt_type_strings[_STMT_NUM_VALUES] = { - [STMT_UNKNOWN] = "unknown statement", - [STMT_INCLUDE] = "include statement", - [STMT_KEYCODE] = "key name definition", - [STMT_ALIAS] = "key alias definition", - [STMT_EXPR] = "expression", - [STMT_VAR] = "variable definition", - [STMT_TYPE] = "key type definition", - [STMT_INTERP] = "symbol interpretation definition", - [STMT_VMOD] = "virtual modifiers definition", - [STMT_SYMBOLS] = "key symbols definition", - [STMT_MODMAP] = "modifier map declaration", - [STMT_GROUP_COMPAT] = "group declaration", - [STMT_LED_MAP] = "indicator map declaration", - [STMT_LED_NAME] = "indicator name declaration", -}; - -const char * -stmt_type_to_string(enum stmt_type type) -{ - if (type >= _STMT_NUM_VALUES) - return NULL; - return stmt_type_strings[type]; -} - -static const char *expr_op_type_strings[_EXPR_NUM_VALUES] = { - [EXPR_VALUE] = "literal", - [EXPR_IDENT] = "identifier", - [EXPR_ACTION_DECL] = "action declaration", - [EXPR_FIELD_REF] = "field reference", - [EXPR_ARRAY_REF] = "array reference", - [EXPR_KEYSYM_LIST] = "list of keysyms", - [EXPR_ACTION_LIST] = "list of actions", - [EXPR_ADD] = "addition", - [EXPR_SUBTRACT] = "subtraction", - [EXPR_MULTIPLY] = "multiplication", - [EXPR_DIVIDE] = "division", - [EXPR_ASSIGN] = "assignment", - [EXPR_NOT] = "logical negation", - [EXPR_NEGATE] = "arithmetic negation", - [EXPR_INVERT] = "bitwise inversion", - [EXPR_UNARY_PLUS] = "unary plus", -}; - -const char * -expr_op_type_to_string(enum expr_op_type type) -{ - if (type >= _EXPR_NUM_VALUES) - return NULL; - return expr_op_type_strings[type]; -} - -static const char *expr_value_type_strings[_EXPR_TYPE_NUM_VALUES] = { - [EXPR_TYPE_UNKNOWN] = "unknown", - [EXPR_TYPE_BOOLEAN] = "boolean", - [EXPR_TYPE_INT] = "int", - [EXPR_TYPE_FLOAT] = "float", - [EXPR_TYPE_STRING] = "string", - [EXPR_TYPE_ACTION] = "action", - [EXPR_TYPE_KEYNAME] = "keyname", - [EXPR_TYPE_SYMBOLS] = "symbols", -}; - -const char * -expr_value_type_to_string(enum expr_value_type type) -{ - if (type >= _EXPR_TYPE_NUM_VALUES) - return NULL; - return expr_value_type_strings[type]; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/ast-build.h b/src/3rdparty/xkbcommon/src/xkbcomp/ast-build.h deleted file mode 100644 index 6c76f381ac..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/ast-build.h +++ /dev/null @@ -1,125 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#ifndef XKBCOMP_AST_BUILD_H -#define XKBCOMP_AST_BUILD_H - -ParseCommon * -AppendStmt(ParseCommon *to, ParseCommon *append); - -ExprDef * -ExprCreateString(xkb_atom_t str); - -ExprDef * -ExprCreateInteger(int ival); - -ExprDef * -ExprCreateFloat(void); - -ExprDef * -ExprCreateBoolean(bool set); - -ExprDef * -ExprCreateKeyName(xkb_atom_t key_name); - -ExprDef * -ExprCreateIdent(xkb_atom_t ident); - -ExprDef * -ExprCreateUnary(enum expr_op_type op, enum expr_value_type type, - ExprDef *child); - -ExprDef * -ExprCreateBinary(enum expr_op_type op, ExprDef *left, ExprDef *right); - -ExprDef * -ExprCreateFieldRef(xkb_atom_t element, xkb_atom_t field); - -ExprDef * -ExprCreateArrayRef(xkb_atom_t element, xkb_atom_t field, ExprDef *entry); - -ExprDef * -ExprCreateAction(xkb_atom_t name, ExprDef *args); - -ExprDef * -ExprCreateMultiKeysymList(ExprDef *list); - -ExprDef * -ExprCreateKeysymList(xkb_keysym_t sym); - -ExprDef * -ExprAppendMultiKeysymList(ExprDef *list, ExprDef *append); - -ExprDef * -ExprAppendKeysymList(ExprDef *list, xkb_keysym_t sym); - -KeycodeDef * -KeycodeCreate(xkb_atom_t name, int64_t value); - -KeyAliasDef * -KeyAliasCreate(xkb_atom_t alias, xkb_atom_t real); - -VModDef * -VModCreate(xkb_atom_t name, ExprDef *value); - -VarDef * -VarCreate(ExprDef *name, ExprDef *value); - -VarDef * -BoolVarCreate(xkb_atom_t ident, bool set); - -InterpDef * -InterpCreate(xkb_keysym_t sym, ExprDef *match); - -KeyTypeDef * -KeyTypeCreate(xkb_atom_t name, VarDef *body); - -SymbolsDef * -SymbolsCreate(xkb_atom_t keyName, VarDef *symbols); - -GroupCompatDef * -GroupCompatCreate(unsigned group, ExprDef *def); - -ModMapDef * -ModMapCreate(xkb_atom_t modifier, ExprDef *keys); - -LedMapDef * -LedMapCreate(xkb_atom_t name, VarDef *body); - -LedNameDef * -LedNameCreate(unsigned ndx, ExprDef *name, bool virtual); - -IncludeStmt * -IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge); - -XkbFile * -XkbFileCreate(enum xkb_file_type type, char *name, ParseCommon *defs, - enum xkb_map_flags flags); - -void -FreeStmt(ParseCommon *stmt); - -#endif diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/ast.h b/src/3rdparty/xkbcommon/src/xkbcomp/ast.h deleted file mode 100644 index 49c5ada457..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/ast.h +++ /dev/null @@ -1,353 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -/* - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef XKBCOMP_AST_H -#define XKBCOMP_AST_H - -enum xkb_file_type { - /* Component files, by order of compilation. */ - FILE_TYPE_KEYCODES = 0, - FILE_TYPE_TYPES = 1, - FILE_TYPE_COMPAT = 2, - FILE_TYPE_SYMBOLS = 3, - /* Geometry is not compiled any more. */ - FILE_TYPE_GEOMETRY = 4, - - /* A top level file which includes the above files. */ - FILE_TYPE_KEYMAP, - -/* File types which must be found in a keymap file. */ -#define FIRST_KEYMAP_FILE_TYPE FILE_TYPE_KEYCODES -#define LAST_KEYMAP_FILE_TYPE FILE_TYPE_SYMBOLS - - /* This one doesn't mix with the others, but useful here as well. */ - FILE_TYPE_RULES, - - _FILE_TYPE_NUM_ENTRIES -}; - -enum stmt_type { - STMT_UNKNOWN = 0, - STMT_INCLUDE, - STMT_KEYCODE, - STMT_ALIAS, - STMT_EXPR, - STMT_VAR, - STMT_TYPE, - STMT_INTERP, - STMT_VMOD, - STMT_SYMBOLS, - STMT_MODMAP, - STMT_GROUP_COMPAT, - STMT_LED_MAP, - STMT_LED_NAME, - - _STMT_NUM_VALUES -}; - -enum expr_value_type { - EXPR_TYPE_UNKNOWN = 0, - EXPR_TYPE_BOOLEAN, - EXPR_TYPE_INT, - EXPR_TYPE_FLOAT, - EXPR_TYPE_STRING, - EXPR_TYPE_ACTION, - EXPR_TYPE_KEYNAME, - EXPR_TYPE_SYMBOLS, - - _EXPR_TYPE_NUM_VALUES -}; - -enum expr_op_type { - EXPR_VALUE, - EXPR_IDENT, - EXPR_ACTION_DECL, - EXPR_FIELD_REF, - EXPR_ARRAY_REF, - EXPR_KEYSYM_LIST, - EXPR_ACTION_LIST, - EXPR_ADD, - EXPR_SUBTRACT, - EXPR_MULTIPLY, - EXPR_DIVIDE, - EXPR_ASSIGN, - EXPR_NOT, - EXPR_NEGATE, - EXPR_INVERT, - EXPR_UNARY_PLUS, - - _EXPR_NUM_VALUES -}; - -enum merge_mode { - MERGE_DEFAULT, - MERGE_AUGMENT, - MERGE_OVERRIDE, - MERGE_REPLACE, -}; - -const char * -xkb_file_type_to_string(enum xkb_file_type type); - -const char * -stmt_type_to_string(enum stmt_type type); - -const char * -expr_op_type_to_string(enum expr_op_type type); - -const char * -expr_value_type_to_string(enum expr_value_type type); - -typedef struct _ParseCommon { - struct _ParseCommon *next; - enum stmt_type type; -} ParseCommon; - -typedef struct _IncludeStmt { - ParseCommon common; - enum merge_mode merge; - char *stmt; - char *file; - char *map; - char *modifier; - struct _IncludeStmt *next_incl; -} IncludeStmt; - -typedef struct { - ParseCommon common; - enum expr_op_type op; - enum expr_value_type value_type; -} ExprCommon; - -typedef union ExprDef ExprDef; - -typedef struct { - ExprCommon expr; - xkb_atom_t ident; -} ExprIdent; - -typedef struct { - ExprCommon expr; - xkb_atom_t str; -} ExprString; - -typedef struct { - ExprCommon expr; - bool set; -} ExprBoolean; - -typedef struct { - ExprCommon expr; - int ival; -} ExprInteger; - -typedef struct { - ExprCommon expr; - /* We don't support floats, but we still represnt them in the AST, in - * order to provide proper error messages. */ -} ExprFloat; - -typedef struct { - ExprCommon expr; - xkb_atom_t key_name; -} ExprKeyName; - -typedef struct { - ExprCommon expr; - ExprDef *left; - ExprDef *right; -} ExprBinary; - -typedef struct { - ExprCommon expr; - ExprDef *child; -} ExprUnary; - -typedef struct { - ExprCommon expr; - xkb_atom_t element; - xkb_atom_t field; -} ExprFieldRef; - -typedef struct { - ExprCommon expr; - xkb_atom_t element; - xkb_atom_t field; - ExprDef *entry; -} ExprArrayRef; - -typedef struct { - ExprCommon expr; - xkb_atom_t name; - ExprDef *args; -} ExprAction; - -typedef struct { - ExprCommon expr; - darray(xkb_keysym_t) syms; - darray(unsigned int) symsMapIndex; - darray(unsigned int) symsNumEntries; -} ExprKeysymList; - -union ExprDef { - ParseCommon common; - /* Maybe someday we can use C11 anonymous struct for ExprCommon here. */ - ExprCommon expr; - ExprIdent ident; - ExprString string; - ExprBoolean boolean; - ExprInteger integer; - ExprKeyName key_name; - ExprBinary binary; - ExprUnary unary; - ExprFieldRef field_ref; - ExprArrayRef array_ref; - ExprAction action; - ExprKeysymList keysym_list; -}; - -typedef struct { - ParseCommon common; - enum merge_mode merge; - ExprDef *name; - ExprDef *value; -} VarDef; - -typedef struct { - ParseCommon common; - enum merge_mode merge; - xkb_atom_t name; - ExprDef *value; -} VModDef; - -typedef struct { - ParseCommon common; - enum merge_mode merge; - xkb_atom_t name; - int64_t value; -} KeycodeDef; - -typedef struct { - ParseCommon common; - enum merge_mode merge; - xkb_atom_t alias; - xkb_atom_t real; -} KeyAliasDef; - -typedef struct { - ParseCommon common; - enum merge_mode merge; - xkb_atom_t name; - VarDef *body; -} KeyTypeDef; - -typedef struct { - ParseCommon common; - enum merge_mode merge; - xkb_atom_t keyName; - VarDef *symbols; -} SymbolsDef; - -typedef struct { - ParseCommon common; - enum merge_mode merge; - xkb_atom_t modifier; - ExprDef *keys; -} ModMapDef; - -typedef struct { - ParseCommon common; - enum merge_mode merge; - unsigned group; - ExprDef *def; -} GroupCompatDef; - -typedef struct { - ParseCommon common; - enum merge_mode merge; - xkb_keysym_t sym; - ExprDef *match; - VarDef *def; -} InterpDef; - -typedef struct { - ParseCommon common; - enum merge_mode merge; - unsigned ndx; - ExprDef *name; - bool virtual; -} LedNameDef; - -typedef struct { - ParseCommon common; - enum merge_mode merge; - xkb_atom_t name; - VarDef *body; -} LedMapDef; - -enum xkb_map_flags { - MAP_IS_DEFAULT = (1 << 0), - MAP_IS_PARTIAL = (1 << 1), - MAP_IS_HIDDEN = (1 << 2), - MAP_HAS_ALPHANUMERIC = (1 << 3), - MAP_HAS_MODIFIER = (1 << 4), - MAP_HAS_KEYPAD = (1 << 5), - MAP_HAS_FN = (1 << 6), - MAP_IS_ALTGR = (1 << 7), -}; - -typedef struct { - ParseCommon common; - enum xkb_file_type file_type; - char *name; - ParseCommon *defs; - enum xkb_map_flags flags; -} XkbFile; - -#endif diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/compat.c b/src/3rdparty/xkbcommon/src/xkbcomp/compat.c deleted file mode 100644 index bd587c8db9..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/compat.c +++ /dev/null @@ -1,932 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -/* - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "xkbcomp-priv.h" -#include "text.h" -#include "expr.h" -#include "action.h" -#include "vmod.h" -#include "include.h" - -enum si_field { - SI_FIELD_VIRTUAL_MOD = (1 << 0), - SI_FIELD_ACTION = (1 << 1), - SI_FIELD_AUTO_REPEAT = (1 << 2), - SI_FIELD_LEVEL_ONE_ONLY = (1 << 3), -}; - -typedef struct { - enum si_field defined; - enum merge_mode merge; - - struct xkb_sym_interpret interp; -} SymInterpInfo; - -enum led_field { - LED_FIELD_MODS = (1 << 0), - LED_FIELD_GROUPS = (1 << 1), - LED_FIELD_CTRLS = (1 << 2), -}; - -typedef struct { - enum led_field defined; - enum merge_mode merge; - - struct xkb_led led; -} LedInfo; - -typedef struct { - char *name; - int errorCount; - SymInterpInfo default_interp; - darray(SymInterpInfo) interps; - LedInfo default_led; - LedInfo leds[XKB_MAX_LEDS]; - unsigned int num_leds; - ActionsInfo *actions; - struct xkb_mod_set mods; - - struct xkb_context *ctx; -} CompatInfo; - -static const char * -siText(SymInterpInfo *si, CompatInfo *info) -{ - char *buf = xkb_context_get_buffer(info->ctx, 128); - - if (si == &info->default_interp) - return "default"; - - snprintf(buf, 128, "%s+%s(%s)", - KeysymText(info->ctx, si->interp.sym), - SIMatchText(si->interp.match), - ModMaskText(info->ctx, &info->mods, si->interp.mods)); - - return buf; -} - -static inline bool -ReportSINotArray(CompatInfo *info, SymInterpInfo *si, const char *field) -{ - return ReportNotArray(info->ctx, "symbol interpretation", field, - siText(si, info)); -} - -static inline bool -ReportSIBadType(CompatInfo *info, SymInterpInfo *si, const char *field, - const char *wanted) -{ - return ReportBadType(info->ctx, "symbol interpretation", field, - siText(si, info), wanted); -} - -static inline bool -ReportLedBadType(CompatInfo *info, LedInfo *ledi, const char *field, - const char *wanted) -{ - return ReportBadType(info->ctx, "indicator map", field, - xkb_atom_text(info->ctx, ledi->led.name), - wanted); -} - -static inline bool -ReportLedNotArray(CompatInfo *info, LedInfo *ledi, const char *field) -{ - return ReportNotArray(info->ctx, "indicator map", field, - xkb_atom_text(info->ctx, ledi->led.name)); -} - -static void -InitCompatInfo(CompatInfo *info, struct xkb_context *ctx, - ActionsInfo *actions, const struct xkb_mod_set *mods) -{ - memset(info, 0, sizeof(*info)); - info->ctx = ctx; - info->actions = actions; - info->mods = *mods; - info->default_interp.merge = MERGE_OVERRIDE; - info->default_interp.interp.virtual_mod = XKB_MOD_INVALID; - info->default_led.merge = MERGE_OVERRIDE; -} - -static void -ClearCompatInfo(CompatInfo *info) -{ - free(info->name); - darray_free(info->interps); -} - -static SymInterpInfo * -FindMatchingInterp(CompatInfo *info, SymInterpInfo *new) -{ - SymInterpInfo *old; - - darray_foreach(old, info->interps) - if (old->interp.sym == new->interp.sym && - old->interp.mods == new->interp.mods && - old->interp.match == new->interp.match) - return old; - - return NULL; -} - -static bool -UseNewInterpField(enum si_field field, SymInterpInfo *old, SymInterpInfo *new, - bool report, enum si_field *collide) -{ - if (!(old->defined & field)) - return true; - - if (new->defined & field) { - if (report) - *collide |= field; - - if (new->merge != MERGE_AUGMENT) - return true; - } - - return false; -} - -static bool -AddInterp(CompatInfo *info, SymInterpInfo *new, bool same_file) -{ - SymInterpInfo *old = FindMatchingInterp(info, new); - if (old) { - const int verbosity = xkb_context_get_log_verbosity(info->ctx); - const bool report = (same_file && verbosity > 0) || verbosity > 9; - enum si_field collide = 0; - - if (new->merge == MERGE_REPLACE) { - if (report) - log_warn(info->ctx, - "Multiple definitions for \"%s\"; " - "Earlier interpretation ignored\n", - siText(new, info)); - *old = *new; - return true; - } - - if (UseNewInterpField(SI_FIELD_VIRTUAL_MOD, old, new, report, - &collide)) { - old->interp.virtual_mod = new->interp.virtual_mod; - old->defined |= SI_FIELD_VIRTUAL_MOD; - } - if (UseNewInterpField(SI_FIELD_ACTION, old, new, report, - &collide)) { - old->interp.action = new->interp.action; - old->defined |= SI_FIELD_ACTION; - } - if (UseNewInterpField(SI_FIELD_AUTO_REPEAT, old, new, report, - &collide)) { - old->interp.repeat = new->interp.repeat; - old->defined |= SI_FIELD_AUTO_REPEAT; - } - if (UseNewInterpField(SI_FIELD_LEVEL_ONE_ONLY, old, new, report, - &collide)) { - old->interp.level_one_only = new->interp.level_one_only; - old->defined |= SI_FIELD_LEVEL_ONE_ONLY; - } - - if (collide) { - log_warn(info->ctx, - "Multiple interpretations of \"%s\"; " - "Using %s definition for duplicate fields\n", - siText(new, info), - (new->merge != MERGE_AUGMENT ? "last" : "first")); - } - - return true; - } - - darray_append(info->interps, *new); - return true; -} - -/***====================================================================***/ - -static bool -ResolveStateAndPredicate(ExprDef *expr, enum xkb_match_operation *pred_rtrn, - xkb_mod_mask_t *mods_rtrn, CompatInfo *info) -{ - if (expr == NULL) { - *pred_rtrn = MATCH_ANY_OR_NONE; - *mods_rtrn = MOD_REAL_MASK_ALL; - return true; - } - - *pred_rtrn = MATCH_EXACTLY; - if (expr->expr.op == EXPR_ACTION_DECL) { - const char *pred_txt = xkb_atom_text(info->ctx, expr->action.name); - if (!LookupString(symInterpretMatchMaskNames, pred_txt, pred_rtrn) || - !expr->action.args) { - log_err(info->ctx, - "Illegal modifier predicate \"%s\"; Ignored\n", pred_txt); - return false; - } - expr = expr->action.args; - } - else if (expr->expr.op == EXPR_IDENT) { - const char *pred_txt = xkb_atom_text(info->ctx, expr->ident.ident); - if (pred_txt && istreq(pred_txt, "any")) { - *pred_rtrn = MATCH_ANY; - *mods_rtrn = MOD_REAL_MASK_ALL; - return true; - } - } - - return ExprResolveModMask(info->ctx, expr, MOD_REAL, &info->mods, - mods_rtrn); -} - -/***====================================================================***/ - -static bool -UseNewLEDField(enum led_field field, LedInfo *old, LedInfo *new, - bool report, enum led_field *collide) -{ - if (!(old->defined & field)) - return true; - - if (new->defined & field) { - if (report) - *collide |= field; - - if (new->merge != MERGE_AUGMENT) - return true; - } - - return false; -} - -static bool -AddLedMap(CompatInfo *info, LedInfo *new, bool same_file) -{ - enum led_field collide; - const int verbosity = xkb_context_get_log_verbosity(info->ctx); - const bool report = (same_file && verbosity > 0) || verbosity > 9; - - for (xkb_led_index_t i = 0; i < info->num_leds; i++) { - LedInfo *old = &info->leds[i]; - - if (old->led.name != new->led.name) - continue; - - if (old->led.mods.mods == new->led.mods.mods && - old->led.groups == new->led.groups && - old->led.ctrls == new->led.ctrls && - old->led.which_mods == new->led.which_mods && - old->led.which_groups == new->led.which_groups) { - old->defined |= new->defined; - return true; - } - - if (new->merge == MERGE_REPLACE) { - if (report) - log_warn(info->ctx, - "Map for indicator %s redefined; " - "Earlier definition ignored\n", - xkb_atom_text(info->ctx, old->led.name)); - *old = *new; - return true; - } - - collide = 0; - if (UseNewLEDField(LED_FIELD_MODS, old, new, report, &collide)) { - old->led.which_mods = new->led.which_mods; - old->led.mods = new->led.mods; - old->defined |= LED_FIELD_MODS; - } - if (UseNewLEDField(LED_FIELD_GROUPS, old, new, report, &collide)) { - old->led.which_groups = new->led.which_groups; - old->led.groups = new->led.groups; - old->defined |= LED_FIELD_GROUPS; - } - if (UseNewLEDField(LED_FIELD_CTRLS, old, new, report, &collide)) { - old->led.ctrls = new->led.ctrls; - old->defined |= LED_FIELD_CTRLS; - } - - if (collide) { - log_warn(info->ctx, - "Map for indicator %s redefined; " - "Using %s definition for duplicate fields\n", - xkb_atom_text(info->ctx, old->led.name), - (new->merge == MERGE_AUGMENT ? "first" : "last")); - } - - return true; - } - - if (info->num_leds >= XKB_MAX_LEDS) { - log_err(info->ctx, - "Too many LEDs defined (maximum %d)\n", - XKB_MAX_LEDS); - return false; - } - info->leds[info->num_leds++] = *new; - return true; -} - -static void -MergeIncludedCompatMaps(CompatInfo *into, CompatInfo *from, - enum merge_mode merge) -{ - if (from->errorCount > 0) { - into->errorCount += from->errorCount; - return; - } - - into->mods = from->mods; - - if (into->name == NULL) { - into->name = from->name; - from->name = NULL; - } - - if (darray_empty(into->interps)) { - into->interps = from->interps; - darray_init(from->interps); - } - else { - SymInterpInfo *si; - darray_foreach(si, from->interps) { - si->merge = (merge == MERGE_DEFAULT ? si->merge : merge); - if (!AddInterp(into, si, false)) - into->errorCount++; - } - } - - if (into->num_leds == 0) { - memcpy(into->leds, from->leds, sizeof(*from->leds) * from->num_leds); - into->num_leds = from->num_leds; - from->num_leds = 0; - } - else { - for (xkb_led_index_t i = 0; i < from->num_leds; i++) { - LedInfo *ledi = &from->leds[i]; - ledi->merge = (merge == MERGE_DEFAULT ? ledi->merge : merge); - if (!AddLedMap(into, ledi, false)) - into->errorCount++; - } - } -} - -static void -HandleCompatMapFile(CompatInfo *info, XkbFile *file, enum merge_mode merge); - -static bool -HandleIncludeCompatMap(CompatInfo *info, IncludeStmt *include) -{ - CompatInfo included; - - InitCompatInfo(&included, info->ctx, info->actions, &info->mods); - included.name = include->stmt; - include->stmt = NULL; - - for (IncludeStmt *stmt = include; stmt; stmt = stmt->next_incl) { - CompatInfo next_incl; - XkbFile *file; - - file = ProcessIncludeFile(info->ctx, stmt, FILE_TYPE_COMPAT); - if (!file) { - info->errorCount += 10; - ClearCompatInfo(&included); - return false; - } - - InitCompatInfo(&next_incl, info->ctx, info->actions, &included.mods); - next_incl.default_interp = info->default_interp; - next_incl.default_interp.merge = stmt->merge; - next_incl.default_led = info->default_led; - next_incl.default_led.merge = stmt->merge; - - HandleCompatMapFile(&next_incl, file, MERGE_OVERRIDE); - - MergeIncludedCompatMaps(&included, &next_incl, stmt->merge); - - ClearCompatInfo(&next_incl); - FreeXkbFile(file); - } - - MergeIncludedCompatMaps(info, &included, include->merge); - ClearCompatInfo(&included); - - return (info->errorCount == 0); -} - -static bool -SetInterpField(CompatInfo *info, SymInterpInfo *si, const char *field, - ExprDef *arrayNdx, ExprDef *value) -{ - xkb_mod_index_t ndx; - - if (istreq(field, "action")) { - if (arrayNdx) - return ReportSINotArray(info, si, field); - - if (!HandleActionDef(info->ctx, info->actions, &info->mods, - value, &si->interp.action)) - return false; - - si->defined |= SI_FIELD_ACTION; - } - else if (istreq(field, "virtualmodifier") || - istreq(field, "virtualmod")) { - if (arrayNdx) - return ReportSINotArray(info, si, field); - - if (!ExprResolveMod(info->ctx, value, MOD_VIRT, &info->mods, &ndx)) - return ReportSIBadType(info, si, field, "virtual modifier"); - - si->interp.virtual_mod = ndx; - si->defined |= SI_FIELD_VIRTUAL_MOD; - } - else if (istreq(field, "repeat")) { - bool set; - - if (arrayNdx) - return ReportSINotArray(info, si, field); - - if (!ExprResolveBoolean(info->ctx, value, &set)) - return ReportSIBadType(info, si, field, "boolean"); - - si->interp.repeat = set; - - si->defined |= SI_FIELD_AUTO_REPEAT; - } - else if (istreq(field, "locking")) { - log_dbg(info->ctx, - "The \"locking\" field in symbol interpretation is unsupported; " - "Ignored\n"); - } - else if (istreq(field, "usemodmap") || - istreq(field, "usemodmapmods")) { - unsigned int val; - - if (arrayNdx) - return ReportSINotArray(info, si, field); - - if (!ExprResolveEnum(info->ctx, value, &val, useModMapValueNames)) - return ReportSIBadType(info, si, field, "level specification"); - - si->interp.level_one_only = val; - si->defined |= SI_FIELD_LEVEL_ONE_ONLY; - } - else { - return ReportBadField(info->ctx, "symbol interpretation", field, - siText(si, info)); - } - - return true; -} - -static bool -SetLedMapField(CompatInfo *info, LedInfo *ledi, const char *field, - ExprDef *arrayNdx, ExprDef *value) -{ - bool ok = true; - - if (istreq(field, "modifiers") || istreq(field, "mods")) { - if (arrayNdx) - return ReportLedNotArray(info, ledi, field); - - if (!ExprResolveModMask(info->ctx, value, MOD_BOTH, - &info->mods, &ledi->led.mods.mods)) - return ReportLedBadType(info, ledi, field, "modifier mask"); - - ledi->defined |= LED_FIELD_MODS; - } - else if (istreq(field, "groups")) { - unsigned int mask; - - if (arrayNdx) - return ReportLedNotArray(info, ledi, field); - - if (!ExprResolveMask(info->ctx, value, &mask, groupMaskNames)) - return ReportLedBadType(info, ledi, field, "group mask"); - - ledi->led.groups = mask; - ledi->defined |= LED_FIELD_GROUPS; - } - else if (istreq(field, "controls") || istreq(field, "ctrls")) { - unsigned int mask; - - if (arrayNdx) - return ReportLedNotArray(info, ledi, field); - - if (!ExprResolveMask(info->ctx, value, &mask, ctrlMaskNames)) - return ReportLedBadType(info, ledi, field, "controls mask"); - - ledi->led.ctrls = mask; - ledi->defined |= LED_FIELD_CTRLS; - } - else if (istreq(field, "allowexplicit")) { - log_dbg(info->ctx, - "The \"allowExplicit\" field in indicator statements is unsupported; " - "Ignored\n"); - } - else if (istreq(field, "whichmodstate") || - istreq(field, "whichmodifierstate")) { - unsigned int mask; - - if (arrayNdx) - return ReportLedNotArray(info, ledi, field); - - if (!ExprResolveMask(info->ctx, value, &mask, - modComponentMaskNames)) - return ReportLedBadType(info, ledi, field, - "mask of modifier state components"); - - ledi->led.which_mods = mask; - } - else if (istreq(field, "whichgroupstate")) { - unsigned mask; - - if (arrayNdx) - return ReportLedNotArray(info, ledi, field); - - if (!ExprResolveMask(info->ctx, value, &mask, - groupComponentMaskNames)) - return ReportLedBadType(info, ledi, field, - "mask of group state components"); - - ledi->led.which_groups = mask; - } - else if (istreq(field, "driveskbd") || - istreq(field, "driveskeyboard") || - istreq(field, "leddriveskbd") || - istreq(field, "leddriveskeyboard") || - istreq(field, "indicatordriveskbd") || - istreq(field, "indicatordriveskeyboard")) { - log_dbg(info->ctx, - "The \"%s\" field in indicator statements is unsupported; " - "Ignored\n", field); - } - else if (istreq(field, "index")) { - /* Users should see this, it might cause unexpected behavior. */ - log_err(info->ctx, - "The \"index\" field in indicator statements is unsupported; " - "Ignored\n"); - } - else { - log_err(info->ctx, - "Unknown field %s in map for %s indicator; " - "Definition ignored\n", - field, xkb_atom_text(info->ctx, ledi->led.name)); - ok = false; - } - - return ok; -} - -static bool -HandleGlobalVar(CompatInfo *info, VarDef *stmt) -{ - const char *elem, *field; - ExprDef *ndx; - bool ret; - - if (!ExprResolveLhs(info->ctx, stmt->name, &elem, &field, &ndx)) - ret = false; - else if (elem && istreq(elem, "interpret")) - ret = SetInterpField(info, &info->default_interp, field, ndx, - stmt->value); - else if (elem && istreq(elem, "indicator")) - ret = SetLedMapField(info, &info->default_led, field, ndx, - stmt->value); - else - ret = SetActionField(info->ctx, info->actions, &info->mods, - elem, field, ndx, stmt->value); - return ret; -} - -static bool -HandleInterpBody(CompatInfo *info, VarDef *def, SymInterpInfo *si) -{ - bool ok = true; - const char *elem, *field; - ExprDef *arrayNdx; - - for (; def; def = (VarDef *) def->common.next) { - if (def->name && def->name->expr.op == EXPR_FIELD_REF) { - log_err(info->ctx, - "Cannot set a global default value from within an interpret statement; " - "Move statements to the global file scope\n"); - ok = false; - continue; - } - - ok = ExprResolveLhs(info->ctx, def->name, &elem, &field, &arrayNdx); - if (!ok) - continue; - - ok = SetInterpField(info, si, field, arrayNdx, def->value); - } - - return ok; -} - -static bool -HandleInterpDef(CompatInfo *info, InterpDef *def, enum merge_mode merge) -{ - enum xkb_match_operation pred; - xkb_mod_mask_t mods; - SymInterpInfo si; - - if (!ResolveStateAndPredicate(def->match, &pred, &mods, info)) { - log_err(info->ctx, - "Couldn't determine matching modifiers; " - "Symbol interpretation ignored\n"); - return false; - } - - si = info->default_interp; - si.merge = merge = (def->merge == MERGE_DEFAULT ? merge : def->merge); - si.interp.sym = def->sym; - si.interp.match = pred; - si.interp.mods = mods; - - if (!HandleInterpBody(info, def->def, &si)) { - info->errorCount++; - return false; - } - - if (!AddInterp(info, &si, true)) { - info->errorCount++; - return false; - } - - return true; -} - -static bool -HandleLedMapDef(CompatInfo *info, LedMapDef *def, enum merge_mode merge) -{ - LedInfo ledi; - VarDef *var; - bool ok; - - if (def->merge != MERGE_DEFAULT) - merge = def->merge; - - ledi = info->default_led; - ledi.merge = merge; - ledi.led.name = def->name; - - ok = true; - for (var = def->body; var != NULL; var = (VarDef *) var->common.next) { - const char *elem, *field; - ExprDef *arrayNdx; - if (!ExprResolveLhs(info->ctx, var->name, &elem, &field, &arrayNdx)) { - ok = false; - continue; - } - - if (elem) { - log_err(info->ctx, - "Cannot set defaults for \"%s\" element in indicator map; " - "Assignment to %s.%s ignored\n", elem, elem, field); - ok = false; - } - else { - ok = SetLedMapField(info, &ledi, field, arrayNdx, var->value) && ok; - } - } - - if (ok) - return AddLedMap(info, &ledi, true); - - return false; -} - -static void -HandleCompatMapFile(CompatInfo *info, XkbFile *file, enum merge_mode merge) -{ - bool ok; - - merge = (merge == MERGE_DEFAULT ? MERGE_AUGMENT : merge); - - free(info->name); - info->name = strdup_safe(file->name); - - for (ParseCommon *stmt = file->defs; stmt; stmt = stmt->next) { - switch (stmt->type) { - case STMT_INCLUDE: - ok = HandleIncludeCompatMap(info, (IncludeStmt *) stmt); - break; - case STMT_INTERP: - ok = HandleInterpDef(info, (InterpDef *) stmt, merge); - break; - case STMT_GROUP_COMPAT: - log_dbg(info->ctx, - "The \"group\" statement in compat is unsupported; " - "Ignored\n"); - ok = true; - break; - case STMT_LED_MAP: - ok = HandleLedMapDef(info, (LedMapDef *) stmt, merge); - break; - case STMT_VAR: - ok = HandleGlobalVar(info, (VarDef *) stmt); - break; - case STMT_VMOD: - ok = HandleVModDef(info->ctx, &info->mods, (VModDef *) stmt, merge); - break; - default: - log_err(info->ctx, - "Compat files may not include other types; " - "Ignoring %s\n", stmt_type_to_string(stmt->type)); - ok = false; - break; - } - - if (!ok) - info->errorCount++; - - if (info->errorCount > 10) { - log_err(info->ctx, - "Abandoning compatibility map \"%s\"\n", file->name); - break; - } - } -} - -/* Temporary struct for CopyInterps. */ -struct collect { - darray(struct xkb_sym_interpret) sym_interprets; -}; - -static void -CopyInterps(CompatInfo *info, bool needSymbol, enum xkb_match_operation pred, - struct collect *collect) -{ - SymInterpInfo *si; - - darray_foreach(si, info->interps) - if (si->interp.match == pred && - (si->interp.sym != XKB_KEY_NoSymbol) == needSymbol) - darray_append(collect->sym_interprets, si->interp); -} - -static void -CopyLedMapDefsToKeymap(struct xkb_keymap *keymap, CompatInfo *info) -{ - for (xkb_led_index_t idx = 0; idx < info->num_leds; idx++) { - LedInfo *ledi = &info->leds[idx]; - xkb_led_index_t i; - struct xkb_led *led; - - /* - * Find the LED with the given name, if it was already declared - * in keycodes. - */ - xkb_leds_enumerate(i, led, keymap) - if (led->name == ledi->led.name) - break; - - /* Not previously declared; create it with next free index. */ - if (i >= keymap->num_leds) { - log_dbg(keymap->ctx, - "Indicator name \"%s\" was not declared in the keycodes section; " - "Adding new indicator\n", - xkb_atom_text(keymap->ctx, ledi->led.name)); - - xkb_leds_enumerate(i, led, keymap) - if (led->name == XKB_ATOM_NONE) - break; - - if (i >= keymap->num_leds) { - /* Not place to put it; ignore. */ - if (i >= XKB_MAX_LEDS) { - log_err(keymap->ctx, - "Too many indicators (maximum is %d); " - "Indicator name \"%s\" ignored\n", - XKB_MAX_LEDS, - xkb_atom_text(keymap->ctx, ledi->led.name)); - continue; - } - - /* Add a new LED. */ - led = &keymap->leds[keymap->num_leds++]; - } - } - - *led = ledi->led; - if (led->groups != 0 && led->which_groups == 0) - led->which_groups = XKB_STATE_LAYOUT_EFFECTIVE; - if (led->mods.mods != 0 && led->which_mods == 0) - led->which_mods = XKB_STATE_MODS_EFFECTIVE; - } -} - -static bool -CopyCompatToKeymap(struct xkb_keymap *keymap, CompatInfo *info) -{ - keymap->compat_section_name = strdup_safe(info->name); - XkbEscapeMapName(keymap->compat_section_name); - - keymap->mods = info->mods; - - if (!darray_empty(info->interps)) { - struct collect collect; - darray_init(collect.sym_interprets); - - /* Most specific to least specific. */ - CopyInterps(info, true, MATCH_EXACTLY, &collect); - CopyInterps(info, true, MATCH_ALL, &collect); - CopyInterps(info, true, MATCH_NONE, &collect); - CopyInterps(info, true, MATCH_ANY, &collect); - CopyInterps(info, true, MATCH_ANY_OR_NONE, &collect); - CopyInterps(info, false, MATCH_EXACTLY, &collect); - CopyInterps(info, false, MATCH_ALL, &collect); - CopyInterps(info, false, MATCH_NONE, &collect); - CopyInterps(info, false, MATCH_ANY, &collect); - CopyInterps(info, false, MATCH_ANY_OR_NONE, &collect); - - darray_steal(collect.sym_interprets, - &keymap->sym_interprets, &keymap->num_sym_interprets); - } - - CopyLedMapDefsToKeymap(keymap, info); - - return true; -} - -bool -CompileCompatMap(XkbFile *file, struct xkb_keymap *keymap, - enum merge_mode merge) -{ - CompatInfo info; - ActionsInfo *actions; - - actions = NewActionsInfo(); - if (!actions) - return false; - - InitCompatInfo(&info, keymap->ctx, actions, &keymap->mods); - info.default_interp.merge = merge; - info.default_led.merge = merge; - - HandleCompatMapFile(&info, file, merge); - if (info.errorCount != 0) - goto err_info; - - if (!CopyCompatToKeymap(keymap, &info)) - goto err_info; - - ClearCompatInfo(&info); - FreeActionsInfo(actions); - return true; - -err_info: - ClearCompatInfo(&info); - FreeActionsInfo(actions); - return false; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/expr.c b/src/3rdparty/xkbcommon/src/xkbcomp/expr.c deleted file mode 100644 index b2567de3eb..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/expr.c +++ /dev/null @@ -1,686 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#include "xkbcomp-priv.h" -#include "text.h" -#include "expr.h" - -typedef bool (*IdentLookupFunc)(struct xkb_context *ctx, const void *priv, - xkb_atom_t field, enum expr_value_type type, - unsigned int *val_rtrn); - -bool -ExprResolveLhs(struct xkb_context *ctx, const ExprDef *expr, - const char **elem_rtrn, const char **field_rtrn, - ExprDef **index_rtrn) -{ - switch (expr->expr.op) { - case EXPR_IDENT: - *elem_rtrn = NULL; - *field_rtrn = xkb_atom_text(ctx, expr->ident.ident); - *index_rtrn = NULL; - return (*field_rtrn != NULL); - case EXPR_FIELD_REF: - *elem_rtrn = xkb_atom_text(ctx, expr->field_ref.element); - *field_rtrn = xkb_atom_text(ctx, expr->field_ref.field); - *index_rtrn = NULL; - return (*elem_rtrn != NULL && *field_rtrn != NULL); - case EXPR_ARRAY_REF: - *elem_rtrn = xkb_atom_text(ctx, expr->array_ref.element); - *field_rtrn = xkb_atom_text(ctx, expr->array_ref.field); - *index_rtrn = expr->array_ref.entry; - if (expr->array_ref.element != XKB_ATOM_NONE && *elem_rtrn == NULL) - return false; - if (*field_rtrn == NULL) - return false; - return true; - default: - break; - } - log_wsgo(ctx, "Unexpected operator %d in ResolveLhs\n", expr->expr.op); - return false; -} - -static bool -SimpleLookup(struct xkb_context *ctx, const void *priv, xkb_atom_t field, - enum expr_value_type type, unsigned int *val_rtrn) -{ - const LookupEntry *entry; - const char *str; - - if (!priv || field == XKB_ATOM_NONE || type != EXPR_TYPE_INT) - return false; - - str = xkb_atom_text(ctx, field); - for (entry = priv; entry && entry->name; entry++) { - if (istreq(str, entry->name)) { - *val_rtrn = entry->value; - return true; - } - } - - return false; -} - -/* Data passed in the *priv argument for LookupModMask. */ -typedef struct { - const struct xkb_mod_set *mods; - enum mod_type mod_type; -} LookupModMaskPriv; - -static bool -LookupModMask(struct xkb_context *ctx, const void *priv, xkb_atom_t field, - enum expr_value_type type, xkb_mod_mask_t *val_rtrn) -{ - const char *str; - xkb_mod_index_t ndx; - const LookupModMaskPriv *arg = priv; - const struct xkb_mod_set *mods = arg->mods; - enum mod_type mod_type = arg->mod_type; - - if (type != EXPR_TYPE_INT) - return false; - - str = xkb_atom_text(ctx, field); - if (!str) - return false; - - if (istreq(str, "all")) { - *val_rtrn = MOD_REAL_MASK_ALL; - return true; - } - - if (istreq(str, "none")) { - *val_rtrn = 0; - return true; - } - - ndx = XkbModNameToIndex(mods, field, mod_type); - if (ndx == XKB_MOD_INVALID) - return false; - - *val_rtrn = (1u << ndx); - return true; -} - -bool -ExprResolveBoolean(struct xkb_context *ctx, const ExprDef *expr, - bool *set_rtrn) -{ - bool ok = false; - const char *ident; - - switch (expr->expr.op) { - case EXPR_VALUE: - if (expr->expr.value_type != EXPR_TYPE_BOOLEAN) { - log_err(ctx, - "Found constant of type %s where boolean was expected\n", - expr_value_type_to_string(expr->expr.value_type)); - return false; - } - *set_rtrn = expr->boolean.set; - return true; - - case EXPR_IDENT: - ident = xkb_atom_text(ctx, expr->ident.ident); - if (ident) { - if (istreq(ident, "true") || - istreq(ident, "yes") || - istreq(ident, "on")) { - *set_rtrn = true; - return true; - } - else if (istreq(ident, "false") || - istreq(ident, "no") || - istreq(ident, "off")) { - *set_rtrn = false; - return true; - } - } - log_err(ctx, "Identifier \"%s\" of type boolean is unknown\n", ident); - return false; - - case EXPR_FIELD_REF: - log_err(ctx, "Default \"%s.%s\" of type boolean is unknown\n", - xkb_atom_text(ctx, expr->field_ref.element), - xkb_atom_text(ctx, expr->field_ref.field)); - return false; - - case EXPR_INVERT: - case EXPR_NOT: - ok = ExprResolveBoolean(ctx, expr->unary.child, set_rtrn); - if (ok) - *set_rtrn = !*set_rtrn; - return ok; - case EXPR_ADD: - case EXPR_SUBTRACT: - case EXPR_MULTIPLY: - case EXPR_DIVIDE: - case EXPR_ASSIGN: - case EXPR_NEGATE: - case EXPR_UNARY_PLUS: - log_err(ctx, "%s of boolean values not permitted\n", - expr_op_type_to_string(expr->expr.op)); - break; - - default: - log_wsgo(ctx, "Unknown operator %d in ResolveBoolean\n", - expr->expr.op); - break; - } - - return false; -} - -bool -ExprResolveKeyCode(struct xkb_context *ctx, const ExprDef *expr, - xkb_keycode_t *kc) -{ - xkb_keycode_t leftRtrn, rightRtrn; - - switch (expr->expr.op) { - case EXPR_VALUE: - if (expr->expr.value_type != EXPR_TYPE_INT) { - log_err(ctx, - "Found constant of type %s where an int was expected\n", - expr_value_type_to_string(expr->expr.value_type)); - return false; - } - - *kc = (xkb_keycode_t) expr->integer.ival; - return true; - - case EXPR_ADD: - case EXPR_SUBTRACT: - case EXPR_MULTIPLY: - case EXPR_DIVIDE: - if (!ExprResolveKeyCode(ctx, expr->binary.left, &leftRtrn) || - !ExprResolveKeyCode(ctx, expr->binary.right, &rightRtrn)) - return false; - - switch (expr->expr.op) { - case EXPR_ADD: - *kc = leftRtrn + rightRtrn; - break; - case EXPR_SUBTRACT: - *kc = leftRtrn - rightRtrn; - break; - case EXPR_MULTIPLY: - *kc = leftRtrn * rightRtrn; - break; - case EXPR_DIVIDE: - if (rightRtrn == 0) { - log_err(ctx, "Cannot divide by zero: %d / %d\n", - leftRtrn, rightRtrn); - return false; - } - - *kc = leftRtrn / rightRtrn; - break; - default: - break; - } - - return true; - - case EXPR_NEGATE: - if (!ExprResolveKeyCode(ctx, expr->unary.child, &leftRtrn)) - return false; - - *kc = ~leftRtrn; - return true; - - case EXPR_UNARY_PLUS: - return ExprResolveKeyCode(ctx, expr->unary.child, kc); - - default: - log_wsgo(ctx, "Unknown operator %d in ResolveKeyCode\n", - expr->expr.op); - break; - } - - return false; -} - -/** - * This function returns ... something. It's a bit of a guess, really. - * - * If an integer is given in value ctx, it will be returned in ival. - * If an ident or field reference is given, the lookup function (if given) - * will be called. At the moment, only SimpleLookup use this, and they both - * return the results in uval. And don't support field references. - * - * Cool. - */ -static bool -ExprResolveIntegerLookup(struct xkb_context *ctx, const ExprDef *expr, - int *val_rtrn, IdentLookupFunc lookup, - const void *lookupPriv) -{ - bool ok = false; - int l, r; - unsigned u; - ExprDef *left, *right; - - switch (expr->expr.op) { - case EXPR_VALUE: - if (expr->expr.value_type != EXPR_TYPE_INT) { - log_err(ctx, - "Found constant of type %s where an int was expected\n", - expr_value_type_to_string(expr->expr.value_type)); - return false; - } - - *val_rtrn = expr->integer.ival; - return true; - - case EXPR_IDENT: - if (lookup) - ok = lookup(ctx, lookupPriv, expr->ident.ident, EXPR_TYPE_INT, &u); - - if (!ok) - log_err(ctx, "Identifier \"%s\" of type int is unknown\n", - xkb_atom_text(ctx, expr->ident.ident)); - else - *val_rtrn = (int) u; - - return ok; - - case EXPR_FIELD_REF: - log_err(ctx, "Default \"%s.%s\" of type int is unknown\n", - xkb_atom_text(ctx, expr->field_ref.element), - xkb_atom_text(ctx, expr->field_ref.field)); - return false; - - case EXPR_ADD: - case EXPR_SUBTRACT: - case EXPR_MULTIPLY: - case EXPR_DIVIDE: - left = expr->binary.left; - right = expr->binary.right; - if (!ExprResolveIntegerLookup(ctx, left, &l, lookup, lookupPriv) || - !ExprResolveIntegerLookup(ctx, right, &r, lookup, lookupPriv)) - return false; - - switch (expr->expr.op) { - case EXPR_ADD: - *val_rtrn = l + r; - break; - case EXPR_SUBTRACT: - *val_rtrn = l - r; - break; - case EXPR_MULTIPLY: - *val_rtrn = l * r; - break; - case EXPR_DIVIDE: - if (r == 0) { - log_err(ctx, "Cannot divide by zero: %d / %d\n", l, r); - return false; - } - *val_rtrn = l / r; - break; - default: - log_err(ctx, "%s of integers not permitted\n", - expr_op_type_to_string(expr->expr.op)); - return false; - } - - return true; - - case EXPR_ASSIGN: - log_wsgo(ctx, "Assignment operator not implemented yet\n"); - break; - - case EXPR_NOT: - log_err(ctx, "The ! operator cannot be applied to an integer\n"); - return false; - - case EXPR_INVERT: - case EXPR_NEGATE: - left = expr->unary.child; - if (!ExprResolveIntegerLookup(ctx, left, &l, lookup, lookupPriv)) - return false; - - *val_rtrn = (expr->expr.op == EXPR_NEGATE ? -l : ~l); - return true; - - case EXPR_UNARY_PLUS: - left = expr->unary.child; - return ExprResolveIntegerLookup(ctx, left, val_rtrn, lookup, - lookupPriv); - - default: - log_wsgo(ctx, "Unknown operator %d in ResolveInteger\n", - expr->expr.op); - break; - } - - return false; -} - -bool -ExprResolveInteger(struct xkb_context *ctx, const ExprDef *expr, - int *val_rtrn) -{ - return ExprResolveIntegerLookup(ctx, expr, val_rtrn, NULL, NULL); -} - -bool -ExprResolveGroup(struct xkb_context *ctx, const ExprDef *expr, - xkb_layout_index_t *group_rtrn) -{ - bool ok; - int result; - - ok = ExprResolveIntegerLookup(ctx, expr, &result, SimpleLookup, - groupNames); - if (!ok) - return false; - - if (result <= 0 || result > XKB_MAX_GROUPS) { - log_err(ctx, "Group index %u is out of range (1..%d)\n", - result, XKB_MAX_GROUPS); - return false; - } - - *group_rtrn = (xkb_layout_index_t) result; - return true; -} - -bool -ExprResolveLevel(struct xkb_context *ctx, const ExprDef *expr, - xkb_level_index_t *level_rtrn) -{ - bool ok; - int result; - - ok = ExprResolveIntegerLookup(ctx, expr, &result, SimpleLookup, - levelNames); - if (!ok) - return false; - - if (result < 1) { - log_err(ctx, "Shift level %d is out of range\n", result); - return false; - } - - /* Level is zero-indexed from now on. */ - *level_rtrn = (unsigned int) (result - 1); - return true; -} - -bool -ExprResolveButton(struct xkb_context *ctx, const ExprDef *expr, int *btn_rtrn) -{ - return ExprResolveIntegerLookup(ctx, expr, btn_rtrn, SimpleLookup, - buttonNames); -} - -bool -ExprResolveString(struct xkb_context *ctx, const ExprDef *expr, - xkb_atom_t *val_rtrn) -{ - switch (expr->expr.op) { - case EXPR_VALUE: - if (expr->expr.value_type != EXPR_TYPE_STRING) { - log_err(ctx, "Found constant of type %s, expected a string\n", - expr_value_type_to_string(expr->expr.value_type)); - return false; - } - - *val_rtrn = expr->string.str; - return true; - - case EXPR_IDENT: - log_err(ctx, "Identifier \"%s\" of type string not found\n", - xkb_atom_text(ctx, expr->ident.ident)); - return false; - - case EXPR_FIELD_REF: - log_err(ctx, "Default \"%s.%s\" of type string not found\n", - xkb_atom_text(ctx, expr->field_ref.element), - xkb_atom_text(ctx, expr->field_ref.field)); - return false; - - case EXPR_ADD: - case EXPR_SUBTRACT: - case EXPR_MULTIPLY: - case EXPR_DIVIDE: - case EXPR_ASSIGN: - case EXPR_NEGATE: - case EXPR_INVERT: - case EXPR_NOT: - case EXPR_UNARY_PLUS: - log_err(ctx, "%s of strings not permitted\n", - expr_op_type_to_string(expr->expr.op)); - return false; - - default: - log_wsgo(ctx, "Unknown operator %d in ResolveString\n", - expr->expr.op); - break; - } - return false; -} - -bool -ExprResolveEnum(struct xkb_context *ctx, const ExprDef *expr, - unsigned int *val_rtrn, const LookupEntry *values) -{ - if (expr->expr.op != EXPR_IDENT) { - log_err(ctx, "Found a %s where an enumerated value was expected\n", - expr_op_type_to_string(expr->expr.op)); - return false; - } - - if (!SimpleLookup(ctx, values, expr->ident.ident, EXPR_TYPE_INT, - val_rtrn)) { - log_err(ctx, "Illegal identifier %s; expected one of:\n", - xkb_atom_text(ctx, expr->ident.ident)); - while (values && values->name) - { - log_err(ctx, "\t%s\n", values->name); - values++; - } - return false; - } - - return true; -} - -static bool -ExprResolveMaskLookup(struct xkb_context *ctx, const ExprDef *expr, - unsigned int *val_rtrn, IdentLookupFunc lookup, - const void *lookupPriv) -{ - bool ok = false; - unsigned int l = 0, r = 0; - int v; - ExprDef *left, *right; - const char *bogus = NULL; - - switch (expr->expr.op) { - case EXPR_VALUE: - if (expr->expr.value_type != EXPR_TYPE_INT) { - log_err(ctx, - "Found constant of type %s where a mask was expected\n", - expr_value_type_to_string(expr->expr.value_type)); - return false; - } - *val_rtrn = (unsigned int) expr->integer.ival; - return true; - - case EXPR_IDENT: - ok = lookup(ctx, lookupPriv, expr->ident.ident, EXPR_TYPE_INT, - val_rtrn); - if (!ok) - log_err(ctx, "Identifier \"%s\" of type int is unknown\n", - xkb_atom_text(ctx, expr->ident.ident)); - return ok; - - case EXPR_FIELD_REF: - log_err(ctx, "Default \"%s.%s\" of type int is unknown\n", - xkb_atom_text(ctx, expr->field_ref.element), - xkb_atom_text(ctx, expr->field_ref.field)); - return false; - - case EXPR_ARRAY_REF: - bogus = "array reference"; - /* fallthrough */ - case EXPR_ACTION_DECL: - if (bogus == NULL) - bogus = "function use"; - log_err(ctx, - "Unexpected %s in mask expression; Expression Ignored\n", - bogus); - return false; - - case EXPR_ADD: - case EXPR_SUBTRACT: - case EXPR_MULTIPLY: - case EXPR_DIVIDE: - left = expr->binary.left; - right = expr->binary.right; - if (!ExprResolveMaskLookup(ctx, left, &l, lookup, lookupPriv) || - !ExprResolveMaskLookup(ctx, right, &r, lookup, lookupPriv)) - return false; - - switch (expr->expr.op) { - case EXPR_ADD: - *val_rtrn = l | r; - break; - case EXPR_SUBTRACT: - *val_rtrn = l & (~r); - break; - case EXPR_MULTIPLY: - case EXPR_DIVIDE: - log_err(ctx, "Cannot %s masks; Illegal operation ignored\n", - (expr->expr.op == EXPR_DIVIDE ? "divide" : "multiply")); - return false; - default: - break; - } - - return true; - - case EXPR_ASSIGN: - log_wsgo(ctx, "Assignment operator not implemented yet\n"); - break; - - case EXPR_INVERT: - left = expr->unary.child; - if (!ExprResolveIntegerLookup(ctx, left, &v, lookup, lookupPriv)) - return false; - - *val_rtrn = ~v; - return true; - - case EXPR_UNARY_PLUS: - case EXPR_NEGATE: - case EXPR_NOT: - left = expr->unary.child; - if (!ExprResolveIntegerLookup(ctx, left, &v, lookup, lookupPriv)) - log_err(ctx, "The %s operator cannot be used with a mask\n", - (expr->expr.op == EXPR_NEGATE ? "-" : "!")); - return false; - - default: - log_wsgo(ctx, "Unknown operator %d in ResolveMask\n", - expr->expr.op); - break; - } - - return false; -} - -bool -ExprResolveMask(struct xkb_context *ctx, const ExprDef *expr, - unsigned int *mask_rtrn, const LookupEntry *values) -{ - return ExprResolveMaskLookup(ctx, expr, mask_rtrn, SimpleLookup, values); -} - -bool -ExprResolveModMask(struct xkb_context *ctx, const ExprDef *expr, - enum mod_type mod_type, const struct xkb_mod_set *mods, - xkb_mod_mask_t *mask_rtrn) -{ - LookupModMaskPriv priv = { .mods = mods, .mod_type = mod_type }; - return ExprResolveMaskLookup(ctx, expr, mask_rtrn, LookupModMask, &priv); -} - -bool -ExprResolveKeySym(struct xkb_context *ctx, const ExprDef *expr, - xkb_keysym_t *sym_rtrn) -{ - int val; - - if (expr->expr.op == EXPR_IDENT) { - const char *str = xkb_atom_text(ctx, expr->ident.ident); - *sym_rtrn = xkb_keysym_from_name(str, 0); - if (*sym_rtrn != XKB_KEY_NoSymbol) - return true; - } - - if (!ExprResolveInteger(ctx, expr, &val)) - return false; - - if (val < 0 || val >= 10) - return false; - - *sym_rtrn = XKB_KEY_0 + (xkb_keysym_t) val; - return true; -} - -bool -ExprResolveMod(struct xkb_context *ctx, const ExprDef *def, - enum mod_type mod_type, const struct xkb_mod_set *mods, - xkb_mod_index_t *ndx_rtrn) -{ - xkb_mod_index_t ndx; - xkb_atom_t name; - - if (def->expr.op != EXPR_IDENT) { - log_err(ctx, - "Cannot resolve virtual modifier: " - "found %s where a virtual modifier name was expected\n", - expr_op_type_to_string(def->expr.op)); - return false; - } - - name = def->ident.ident; - ndx = XkbModNameToIndex(mods, name, mod_type); - if (ndx == XKB_MOD_INVALID) { - log_err(ctx, - "Cannot resolve virtual modifier: " - "\"%s\" was not previously declared\n", - xkb_atom_text(ctx, name)); - return false; - } - - *ndx_rtrn = ndx; - return true; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/expr.h b/src/3rdparty/xkbcommon/src/xkbcomp/expr.h deleted file mode 100644 index 9882b8cce5..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/expr.h +++ /dev/null @@ -1,85 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#ifndef XKBCOMP_EXPR_H -#define XKBCOMP_EXPR_H - -bool -ExprResolveLhs(struct xkb_context *ctx, const ExprDef *expr, - const char **elem_rtrn, const char **field_rtrn, - ExprDef **index_rtrn); - -bool -ExprResolveModMask(struct xkb_context *ctx, const ExprDef *expr, - enum mod_type mod_type, const struct xkb_mod_set *mods, - xkb_mod_mask_t *mask_rtrn); - -bool -ExprResolveMod(struct xkb_context *ctx, const ExprDef *def, - enum mod_type mod_type, const struct xkb_mod_set *mods, - xkb_mod_index_t *ndx_rtrn); - -bool -ExprResolveBoolean(struct xkb_context *ctx, const ExprDef *expr, - bool *set_rtrn); - -bool -ExprResolveKeyCode(struct xkb_context *ctx, const ExprDef *expr, - xkb_keycode_t *kc); - -bool -ExprResolveInteger(struct xkb_context *ctx, const ExprDef *expr, - int *val_rtrn); - -bool -ExprResolveLevel(struct xkb_context *ctx, const ExprDef *expr, - xkb_level_index_t *level_rtrn); - -bool -ExprResolveGroup(struct xkb_context *ctx, const ExprDef *expr, - xkb_layout_index_t *group_rtrn); - -bool -ExprResolveButton(struct xkb_context *ctx, const ExprDef *expr, - int *btn_rtrn); - -bool -ExprResolveString(struct xkb_context *ctx, const ExprDef *expr, - xkb_atom_t *val_rtrn); - -bool -ExprResolveEnum(struct xkb_context *ctx, const ExprDef *expr, - unsigned int *val_rtrn, const LookupEntry *values); - -bool -ExprResolveMask(struct xkb_context *ctx, const ExprDef *expr, - unsigned int *mask_rtrn, const LookupEntry *values); - -bool -ExprResolveKeySym(struct xkb_context *ctx, const ExprDef *expr, - xkb_keysym_t *sym_rtrn); - -#endif diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/include.c b/src/3rdparty/xkbcommon/src/xkbcomp/include.c deleted file mode 100644 index dc3f1e49bd..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/include.c +++ /dev/null @@ -1,309 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -/* - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include <errno.h> -#include <limits.h> -#include <stdio.h> - -#include "xkbcomp-priv.h" -#include "include.h" - -/** - * Parse an include statement. Each call returns a file name, along with - * (possibly) a specific map in the file, an explicit group designator, and - * the separator from the next file, used to determine the merge mode. - * - * @param str_inout Input statement, modified in-place. Should be passed in - * repeatedly. If str_inout is NULL, the parsing has completed. - * - * @param file_rtrn Set to the name of the include file to be used. Combined - * with an enum xkb_file_type, this determines which file to look for in the - * include path. - * - * @param map_rtrn Set to the string between '(' and ')', if any. This will - * result in the compilation of a specific named map within the file (e.g. - * xkb_symbols "basic" { ... }) , as opposed to the default map of the file. - * - * @param nextop_rtrn Set to the next operation in the complete statement, - * which is '\0' if it's the last file or '+' or '|' if there are more. - * Separating the files with '+' sets the merge mode to MERGE_MODE_OVERRIDE, - * while '|' sets the merge mode to MERGE_MODE_AUGMENT. - * - * @param extra_data Set to the string after ':', if any. Currently the - * extra data is only used for setting an explicit group index for a symbols - * file. - * - * @return true if parsing was successful, false for an illegal string. - * - * Example: "evdev+aliases(qwerty):2" - * str_inout = "aliases(qwerty):2" - * file_rtrn = "evdev" - * map_rtrn = NULL - * nextop_retrn = "+" - * extra_data = NULL - * - * 2nd run with "aliases(qwerty):2" - * str_inout = NULL - * file_rtrn = "aliases" - * map_rtrn = "qwerty" - * nextop_retrn = "" - * extra_data = "2" - * - */ -bool -ParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn, - char *nextop_rtrn, char **extra_data) -{ - char *tmp, *str, *next; - - str = *str_inout; - - /* - * Find the position in the string where the next file is included, - * if there is more than one left in the statement. - */ - next = strpbrk(str, "|+"); - if (next) { - /* Got more files, this function will be called again. */ - *nextop_rtrn = *next; - /* Separate the string, for strchr etc. to work on this file only. */ - *next++ = '\0'; - } - else { - /* This is the last file in this statement, won't be called again. */ - *nextop_rtrn = '\0'; - next = NULL; - } - - /* - * Search for the explicit group designator, if any. If it's there, - * it goes after the file name and map. - */ - tmp = strchr(str, ':'); - if (tmp != NULL) { - *tmp++ = '\0'; - *extra_data = strdup(tmp); - } - else { - *extra_data = NULL; - } - - /* Look for a map, if any. */ - tmp = strchr(str, '('); - if (tmp == NULL) { - /* No map. */ - *file_rtrn = strdup(str); - *map_rtrn = NULL; - } - else if (str[0] == '(') { - /* Map without file - invalid. */ - free(*extra_data); - return false; - } - else { - /* Got a map; separate the file and the map for the strdup's. */ - *tmp++ = '\0'; - *file_rtrn = strdup(str); - str = tmp; - tmp = strchr(str, ')'); - if (tmp == NULL || tmp[1] != '\0') { - free(*file_rtrn); - free(*extra_data); - return false; - } - *tmp++ = '\0'; - *map_rtrn = strdup(str); - } - - /* Set up the next file for the next call, if any. */ - if (*nextop_rtrn == '\0') - *str_inout = NULL; - else if (*nextop_rtrn == '|' || *nextop_rtrn == '+') - *str_inout = next; - else - return false; - - return true; -} - -static const char *xkb_file_type_include_dirs[_FILE_TYPE_NUM_ENTRIES] = { - [FILE_TYPE_KEYCODES] = "keycodes", - [FILE_TYPE_TYPES] = "types", - [FILE_TYPE_COMPAT] = "compat", - [FILE_TYPE_SYMBOLS] = "symbols", - [FILE_TYPE_GEOMETRY] = "geometry", - [FILE_TYPE_KEYMAP] = "keymap", - [FILE_TYPE_RULES] = "rules", -}; - -/** - * Return the xkb directory based on the type. - */ -static const char * -DirectoryForInclude(enum xkb_file_type type) -{ - if (type >= _FILE_TYPE_NUM_ENTRIES) - return ""; - return xkb_file_type_include_dirs[type]; -} - -FILE * -FindFileInXkbPath(struct xkb_context *ctx, const char *name, - enum xkb_file_type type, char **pathRtrn) -{ - unsigned int i; - FILE *file = NULL; - char *buf = NULL; - const char *typeDir; - size_t buf_size = 0, typeDirLen, name_len; - - typeDir = DirectoryForInclude(type); - typeDirLen = strlen(typeDir); - name_len = strlen(name); - - for (i = 0; i < xkb_context_num_include_paths(ctx); i++) { - size_t new_buf_size = strlen(xkb_context_include_path_get(ctx, i)) + - typeDirLen + name_len + 3; - int ret; - if (new_buf_size > buf_size) { - void *buf_new = realloc(buf, new_buf_size); - if (buf_new) { - buf_size = new_buf_size; - buf = buf_new; - } else { - log_err(ctx, "Cannot realloc for name (%s/%s/%s)\n", - xkb_context_include_path_get(ctx, i), typeDir, name); - continue; - } - } - ret = snprintf(buf, buf_size, "%s/%s/%s", - xkb_context_include_path_get(ctx, i), - typeDir, name); - if (ret < 0) { - log_err(ctx, "snprintf error (%s/%s/%s)\n", - xkb_context_include_path_get(ctx, i), typeDir, name); - continue; - } - - file = fopen(buf, "r"); - if (file) - break; - } - - if (!file) { - log_err(ctx, "Couldn't find file \"%s/%s\" in include paths\n", - typeDir, name); - - if (xkb_context_num_include_paths(ctx) > 0) { - log_err(ctx, "%d include paths searched:\n", - xkb_context_num_include_paths(ctx)); - for (i = 0; i < xkb_context_num_include_paths(ctx); i++) - log_err(ctx, "\t%s\n", - xkb_context_include_path_get(ctx, i)); - } - else { - log_err(ctx, "There are no include paths to search\n"); - } - - if (xkb_context_num_failed_include_paths(ctx) > 0) { - log_err(ctx, "%d include paths could not be added:\n", - xkb_context_num_failed_include_paths(ctx)); - for (i = 0; i < xkb_context_num_failed_include_paths(ctx); i++) - log_err(ctx, "\t%s\n", - xkb_context_failed_include_path_get(ctx, i)); - } - - free(buf); - return NULL; - } - - if (pathRtrn) - *pathRtrn = buf; - else - free(buf); - return file; -} - -XkbFile * -ProcessIncludeFile(struct xkb_context *ctx, IncludeStmt *stmt, - enum xkb_file_type file_type) -{ - FILE *file; - XkbFile *xkb_file; - - file = FindFileInXkbPath(ctx, stmt->file, file_type, NULL); - if (!file) - return false; - - xkb_file = XkbParseFile(ctx, file, stmt->file, stmt->map); - fclose(file); - if (!xkb_file) { - if (stmt->map) - log_err(ctx, "Couldn't process include statement for '%s(%s)'\n", - stmt->file, stmt->map); - else - log_err(ctx, "Couldn't process include statement for '%s'\n", - stmt->file); - return NULL; - } - - if (xkb_file->file_type != file_type) { - log_err(ctx, - "Include file of wrong type (expected %s, got %s); " - "Include file \"%s\" ignored\n", - xkb_file_type_to_string(file_type), - xkb_file_type_to_string(xkb_file->file_type), stmt->file); - FreeXkbFile(xkb_file); - return NULL; - } - - /* FIXME: we have to check recursive includes here (or somewhere) */ - - return xkb_file; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/include.h b/src/3rdparty/xkbcommon/src/xkbcomp/include.h deleted file mode 100644 index 03e76ed5ce..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/include.h +++ /dev/null @@ -1,42 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#ifndef XKBCOMP_INCLUDE_H -#define XKBCOMP_INCLUDE_H - -bool -ParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn, - char *nextop_rtrn, char **extra_data); - -FILE * -FindFileInXkbPath(struct xkb_context *ctx, const char *name, - enum xkb_file_type type, char **pathRtrn); - -XkbFile * -ProcessIncludeFile(struct xkb_context *ctx, IncludeStmt *stmt, - enum xkb_file_type file_type); - -#endif diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/keycodes.c b/src/3rdparty/xkbcommon/src/xkbcomp/keycodes.c deleted file mode 100644 index 491da51067..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/keycodes.c +++ /dev/null @@ -1,668 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#include "xkbcomp-priv.h" -#include "text.h" -#include "expr.h" -#include "include.h" - -typedef struct { - enum merge_mode merge; - - xkb_atom_t alias; - xkb_atom_t real; -} AliasInfo; - -typedef struct { - enum merge_mode merge; - - xkb_atom_t name; -} LedNameInfo; - -typedef struct { - char *name; - int errorCount; - - xkb_keycode_t min_key_code; - xkb_keycode_t max_key_code; - darray(xkb_atom_t) key_names; - LedNameInfo led_names[XKB_MAX_LEDS]; - unsigned int num_led_names; - darray(AliasInfo) aliases; - - struct xkb_context *ctx; -} KeyNamesInfo; - -/***====================================================================***/ - -static void -InitAliasInfo(AliasInfo *info, enum merge_mode merge, - xkb_atom_t alias, xkb_atom_t real) -{ - memset(info, 0, sizeof(*info)); - info->merge = merge; - info->alias = alias; - info->real = real; -} - -static LedNameInfo * -FindLedByName(KeyNamesInfo *info, xkb_atom_t name, - xkb_led_index_t *idx_out) -{ - for (xkb_led_index_t idx = 0; idx < info->num_led_names; idx++) { - LedNameInfo *ledi = &info->led_names[idx]; - if (ledi->name == name) { - *idx_out = idx; - return ledi; - } - } - - return NULL; -} - -static bool -AddLedName(KeyNamesInfo *info, enum merge_mode merge, bool same_file, - LedNameInfo *new, xkb_led_index_t new_idx) -{ - xkb_led_index_t old_idx; - LedNameInfo *old; - const int verbosity = xkb_context_get_log_verbosity(info->ctx); - const bool report = (same_file && verbosity > 0) || verbosity > 9; - const bool replace = (merge == MERGE_REPLACE || merge == MERGE_OVERRIDE); - - /* LED with the same name already exists. */ - old = FindLedByName(info, new->name, &old_idx); - if (old) { - if (old_idx == new_idx) { - log_warn(info->ctx, - "Multiple indicators named \"%s\"; " - "Identical definitions ignored\n", - xkb_atom_text(info->ctx, new->name)); - return true; - } - - if (report) { - xkb_led_index_t use = (replace ? new_idx + 1 : old_idx + 1); - xkb_led_index_t ignore = (replace ? old_idx + 1 : new_idx + 1); - log_warn(info->ctx, - "Multiple indicators named %s; Using %d, ignoring %d\n", - xkb_atom_text(info->ctx, new->name), use, ignore); - } - - if (replace) - *old = *new; - - return true; - } - - if (new_idx >= info->num_led_names) - info->num_led_names = new_idx + 1; - - /* LED with the same index already exists. */ - old = &info->led_names[new_idx]; - if (old->name != XKB_ATOM_NONE) { - if (report) { - const xkb_atom_t use = (replace ? new->name : old->name); - const xkb_atom_t ignore = (replace ? old->name : new->name); - log_warn(info->ctx, "Multiple names for indicator %d; " - "Using %s, ignoring %s\n", new_idx + 1, - xkb_atom_text(info->ctx, use), - xkb_atom_text(info->ctx, ignore)); - } - - if (replace) - *old = *new; - - return true; - } - - *old = *new; - return true; -} - -static void -ClearKeyNamesInfo(KeyNamesInfo *info) -{ - free(info->name); - darray_free(info->key_names); - darray_free(info->aliases); -} - -static void -InitKeyNamesInfo(KeyNamesInfo *info, struct xkb_context *ctx) -{ - memset(info, 0, sizeof(*info)); - info->ctx = ctx; - info->min_key_code = XKB_KEYCODE_INVALID; -#if XKB_KEYCODE_INVALID < XKB_KEYCODE_MAX -#error "Hey, you can't be changing stuff like that." -#endif -} - -static xkb_keycode_t -FindKeyByName(KeyNamesInfo *info, xkb_atom_t name) -{ - xkb_keycode_t i; - - for (i = info->min_key_code; i <= info->max_key_code; i++) - if (darray_item(info->key_names, i) == name) - return i; - - return XKB_KEYCODE_INVALID; -} - -static bool -AddKeyName(KeyNamesInfo *info, xkb_keycode_t kc, xkb_atom_t name, - enum merge_mode merge, bool same_file, bool report) -{ - xkb_atom_t old_name; - xkb_keycode_t old_kc; - const int verbosity = xkb_context_get_log_verbosity(info->ctx); - - report = report && ((same_file && verbosity > 0) || verbosity > 7); - - if (kc >= darray_size(info->key_names)) - darray_resize0(info->key_names, kc + 1); - - info->min_key_code = MIN(info->min_key_code, kc); - info->max_key_code = MAX(info->max_key_code, kc); - - /* There's already a key with this keycode. */ - old_name = darray_item(info->key_names, kc); - if (old_name != XKB_ATOM_NONE) { - const char *lname = KeyNameText(info->ctx, old_name); - const char *kname = KeyNameText(info->ctx, name); - - if (old_name == name) { - if (report) - log_warn(info->ctx, - "Multiple identical key name definitions; " - "Later occurrences of \"%s = %d\" ignored\n", - lname, kc); - return true; - } - else if (merge == MERGE_AUGMENT) { - if (report) - log_warn(info->ctx, - "Multiple names for keycode %d; " - "Using %s, ignoring %s\n", kc, lname, kname); - return true; - } - else { - if (report) - log_warn(info->ctx, - "Multiple names for keycode %d; " - "Using %s, ignoring %s\n", kc, kname, lname); - darray_item(info->key_names, kc) = XKB_ATOM_NONE; - } - } - - /* There's already a key with this name. */ - old_kc = FindKeyByName(info, name); - if (old_kc != XKB_KEYCODE_INVALID && old_kc != kc) { - const char *kname = KeyNameText(info->ctx, name); - - if (merge == MERGE_OVERRIDE) { - darray_item(info->key_names, old_kc) = XKB_ATOM_NONE; - if (report) - log_warn(info->ctx, - "Key name %s assigned to multiple keys; " - "Using %d, ignoring %d\n", kname, kc, old_kc); - } - else { - if (report) - log_vrb(info->ctx, 3, - "Key name %s assigned to multiple keys; " - "Using %d, ignoring %d\n", kname, old_kc, kc); - return true; - } - } - - darray_item(info->key_names, kc) = name; - return true; -} - -/***====================================================================***/ - -static bool -HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge); - -static void -MergeIncludedKeycodes(KeyNamesInfo *into, KeyNamesInfo *from, - enum merge_mode merge) -{ - if (from->errorCount > 0) { - into->errorCount += from->errorCount; - return; - } - - if (into->name == NULL) { - into->name = from->name; - from->name = NULL; - } - - /* Merge key names. */ - if (darray_empty(into->key_names)) { - into->key_names = from->key_names; - darray_init(from->key_names); - into->min_key_code = from->min_key_code; - into->max_key_code = from->max_key_code; - } - else { - if (darray_size(into->key_names) < darray_size(from->key_names)) - darray_resize0(into->key_names, darray_size(from->key_names)); - - for (unsigned i = from->min_key_code; i <= from->max_key_code; i++) { - xkb_atom_t name = darray_item(from->key_names, i); - if (name == XKB_ATOM_NONE) - continue; - - if (!AddKeyName(into, i, name, merge, true, false)) - into->errorCount++; - } - } - - /* Merge key aliases. */ - if (darray_empty(into->aliases)) { - into->aliases = from->aliases; - darray_init(from->aliases); - } - else { - AliasInfo *alias; - - darray_foreach(alias, from->aliases) { - KeyAliasDef def; - - def.merge = (merge == MERGE_DEFAULT ? alias->merge : merge); - def.alias = alias->alias; - def.real = alias->real; - - if (!HandleAliasDef(into, &def, def.merge)) - into->errorCount++; - } - } - - /* Merge LED names. */ - if (into->num_led_names == 0) { - memcpy(into->led_names, from->led_names, - sizeof(*from->led_names) * from->num_led_names); - into->num_led_names = from->num_led_names; - from->num_led_names = 0; - } - else { - for (xkb_led_index_t idx = 0; idx < from->num_led_names; idx++) { - LedNameInfo *ledi = &from->led_names[idx]; - - if (ledi->name == XKB_ATOM_NONE) - continue; - - ledi->merge = (merge == MERGE_DEFAULT ? ledi->merge : merge); - if (!AddLedName(into, ledi->merge, false, ledi, idx)) - into->errorCount++; - } - } -} - -static void -HandleKeycodesFile(KeyNamesInfo *info, XkbFile *file, enum merge_mode merge); - -static bool -HandleIncludeKeycodes(KeyNamesInfo *info, IncludeStmt *include) -{ - KeyNamesInfo included; - - InitKeyNamesInfo(&included, info->ctx); - included.name = include->stmt; - include->stmt = NULL; - - for (IncludeStmt *stmt = include; stmt; stmt = stmt->next_incl) { - KeyNamesInfo next_incl; - XkbFile *file; - - file = ProcessIncludeFile(info->ctx, stmt, FILE_TYPE_KEYCODES); - if (!file) { - info->errorCount += 10; - ClearKeyNamesInfo(&included); - return false; - } - - InitKeyNamesInfo(&next_incl, info->ctx); - - HandleKeycodesFile(&next_incl, file, MERGE_OVERRIDE); - - MergeIncludedKeycodes(&included, &next_incl, stmt->merge); - - ClearKeyNamesInfo(&next_incl); - FreeXkbFile(file); - } - - MergeIncludedKeycodes(info, &included, include->merge); - ClearKeyNamesInfo(&included); - - return (info->errorCount == 0); -} - -static bool -HandleKeycodeDef(KeyNamesInfo *info, KeycodeDef *stmt, enum merge_mode merge) -{ - if (stmt->merge != MERGE_DEFAULT) { - if (stmt->merge == MERGE_REPLACE) - merge = MERGE_OVERRIDE; - else - merge = stmt->merge; - } - - if (stmt->value < 0 || stmt->value > XKB_KEYCODE_MAX) { - log_err(info->ctx, - "Illegal keycode %lld: must be between 0..%u; " - "Key ignored\n", (long long) stmt->value, XKB_KEYCODE_MAX); - return false; - } - - return AddKeyName(info, stmt->value, stmt->name, merge, false, true); -} - -static bool -HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge) -{ - AliasInfo *old, new; - - darray_foreach(old, info->aliases) { - if (old->alias == def->alias) { - if (def->real == old->real) { - log_vrb(info->ctx, 1, - "Alias of %s for %s declared more than once; " - "First definition ignored\n", - KeyNameText(info->ctx, def->alias), - KeyNameText(info->ctx, def->real)); - } - else { - xkb_atom_t use, ignore; - - use = (merge == MERGE_AUGMENT ? old->real : def->real); - ignore = (merge == MERGE_AUGMENT ? def->real : old->real); - - log_warn(info->ctx, - "Multiple definitions for alias %s; " - "Using %s, ignoring %s\n", - KeyNameText(info->ctx, old->alias), - KeyNameText(info->ctx, use), - KeyNameText(info->ctx, ignore)); - - old->real = use; - } - - old->merge = merge; - return true; - } - } - - InitAliasInfo(&new, merge, def->alias, def->real); - darray_append(info->aliases, new); - return true; -} - -static bool -HandleKeyNameVar(KeyNamesInfo *info, VarDef *stmt) -{ - const char *elem, *field; - ExprDef *arrayNdx; - - if (!ExprResolveLhs(info->ctx, stmt->name, &elem, &field, &arrayNdx)) - return false; - - if (elem) { - log_err(info->ctx, "Unknown element %s encountered; " - "Default for field %s ignored\n", elem, field); - return false; - } - - if (!istreq(field, "minimum") && !istreq(field, "maximum")) { - log_err(info->ctx, "Unknown field encountered; " - "Assignment to field %s ignored\n", field); - return false; - } - - /* We ignore explicit min/max statements, we always use computed. */ - return true; -} - -static bool -HandleLedNameDef(KeyNamesInfo *info, LedNameDef *def, - enum merge_mode merge) -{ - LedNameInfo ledi; - xkb_atom_t name; - - if (def->ndx < 1 || def->ndx > XKB_MAX_LEDS) { - info->errorCount++; - log_err(info->ctx, - "Illegal indicator index (%d) specified; must be between 1 .. %d; " - "Ignored\n", def->ndx, XKB_MAX_LEDS); - return false; - } - - if (!ExprResolveString(info->ctx, def->name, &name)) { - char buf[20]; - snprintf(buf, sizeof(buf), "%u", def->ndx); - info->errorCount++; - return ReportBadType(info->ctx, "indicator", "name", buf, "string"); - } - - ledi.merge = merge; - ledi.name = name; - return AddLedName(info, merge, true, &ledi, def->ndx - 1); -} - -static void -HandleKeycodesFile(KeyNamesInfo *info, XkbFile *file, enum merge_mode merge) -{ - bool ok; - - free(info->name); - info->name = strdup_safe(file->name); - - for (ParseCommon *stmt = file->defs; stmt; stmt = stmt->next) { - switch (stmt->type) { - case STMT_INCLUDE: - ok = HandleIncludeKeycodes(info, (IncludeStmt *) stmt); - break; - case STMT_KEYCODE: - ok = HandleKeycodeDef(info, (KeycodeDef *) stmt, merge); - break; - case STMT_ALIAS: - ok = HandleAliasDef(info, (KeyAliasDef *) stmt, merge); - break; - case STMT_VAR: - ok = HandleKeyNameVar(info, (VarDef *) stmt); - break; - case STMT_LED_NAME: - ok = HandleLedNameDef(info, (LedNameDef *) stmt, merge); - break; - default: - log_err(info->ctx, - "Keycode files may define key and indicator names only; " - "Ignoring %s\n", stmt_type_to_string(stmt->type)); - ok = false; - break; - } - - if (!ok) - info->errorCount++; - - if (info->errorCount > 10) { - log_err(info->ctx, "Abandoning keycodes file \"%s\"\n", - file->name); - break; - } - } -} - -/***====================================================================***/ - -static bool -CopyKeyNamesToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) -{ - struct xkb_key *keys; - xkb_keycode_t min_key_code, max_key_code, kc; - - min_key_code = info->min_key_code; - max_key_code = info->max_key_code; - /* If the keymap has no keys, let's just use the safest pair we know. */ - if (min_key_code == XKB_KEYCODE_INVALID) { - min_key_code = 8; - max_key_code = 255; - } - - keys = calloc(max_key_code + 1, sizeof(*keys)); - if (!keys) - return false; - - for (kc = min_key_code; kc <= max_key_code; kc++) - keys[kc].keycode = kc; - - for (kc = info->min_key_code; kc <= info->max_key_code; kc++) - keys[kc].name = darray_item(info->key_names, kc); - - keymap->min_key_code = min_key_code; - keymap->max_key_code = max_key_code; - keymap->keys = keys; - return true; -} - -static bool -CopyKeyAliasesToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) -{ - AliasInfo *alias; - unsigned i, num_key_aliases; - struct xkb_key_alias *key_aliases; - - /* - * Do some sanity checking on the aliases. We can't do it before - * because keys and their aliases may be added out-of-order. - */ - num_key_aliases = 0; - darray_foreach(alias, info->aliases) { - /* Check that ->real is a key. */ - if (!XkbKeyByName(keymap, alias->real, false)) { - log_vrb(info->ctx, 5, - "Attempt to alias %s to non-existent key %s; Ignored\n", - KeyNameText(info->ctx, alias->alias), - KeyNameText(info->ctx, alias->real)); - alias->real = XKB_ATOM_NONE; - continue; - } - - /* Check that ->alias is not a key. */ - if (XkbKeyByName(keymap, alias->alias, false)) { - log_vrb(info->ctx, 5, - "Attempt to create alias with the name of a real key; " - "Alias \"%s = %s\" ignored\n", - KeyNameText(info->ctx, alias->alias), - KeyNameText(info->ctx, alias->real)); - alias->real = XKB_ATOM_NONE; - continue; - } - - num_key_aliases++; - } - - /* Copy key aliases. */ - key_aliases = NULL; - if (num_key_aliases > 0) { - key_aliases = calloc(num_key_aliases, sizeof(*key_aliases)); - if (!key_aliases) - return false; - - i = 0; - darray_foreach(alias, info->aliases) { - if (alias->real != XKB_ATOM_NONE) { - key_aliases[i].alias = alias->alias; - key_aliases[i].real = alias->real; - i++; - } - } - } - - keymap->num_key_aliases = num_key_aliases; - keymap->key_aliases = key_aliases; - return true; -} - -static bool -CopyLedNamesToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) -{ - keymap->num_leds = info->num_led_names; - for (xkb_led_index_t idx = 0; idx < info->num_led_names; idx++) { - LedNameInfo *ledi = &info->led_names[idx]; - - if (ledi->name == XKB_ATOM_NONE) - continue; - - keymap->leds[idx].name = ledi->name; - } - - return true; -} - -static bool -CopyKeyNamesInfoToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) -{ - /* This function trashes keymap on error, but that's OK. */ - if (!CopyKeyNamesToKeymap(keymap, info) || - !CopyKeyAliasesToKeymap(keymap, info) || - !CopyLedNamesToKeymap(keymap, info)) - return false; - - keymap->keycodes_section_name = strdup_safe(info->name); - XkbEscapeMapName(keymap->keycodes_section_name); - return true; -} - -/***====================================================================***/ - -bool -CompileKeycodes(XkbFile *file, struct xkb_keymap *keymap, - enum merge_mode merge) -{ - KeyNamesInfo info; - - InitKeyNamesInfo(&info, keymap->ctx); - - HandleKeycodesFile(&info, file, merge); - if (info.errorCount != 0) - goto err_info; - - if (!CopyKeyNamesInfoToKeymap(keymap, &info)) - goto err_info; - - ClearKeyNamesInfo(&info); - return true; - -err_info: - ClearKeyNamesInfo(&info); - return false; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/keymap-dump.c b/src/3rdparty/xkbcommon/src/xkbcomp/keymap-dump.c deleted file mode 100644 index 2ed591c661..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/keymap-dump.c +++ /dev/null @@ -1,664 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -/* - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone <daniel@fooishbar.org> - */ - -#include "xkbcomp-priv.h" -#include "text.h" - -#define BUF_CHUNK_SIZE 4096 - -struct buf { - char *buf; - size_t size; - size_t alloc; -}; - -static bool -do_realloc(struct buf *buf, size_t at_least) -{ - char *new; - - buf->alloc += BUF_CHUNK_SIZE; - if (at_least >= BUF_CHUNK_SIZE) - buf->alloc += at_least; - - new = realloc(buf->buf, buf->alloc); - if (!new) - return false; - - buf->buf = new; - return true; -} - -ATTR_PRINTF(2, 3) static bool -check_write_buf(struct buf *buf, const char *fmt, ...) -{ - va_list args; - int printed; - size_t available; - - available = buf->alloc - buf->size; - va_start(args, fmt); - printed = vsnprintf(buf->buf + buf->size, available, fmt, args); - va_end(args); - - if (printed < 0) - goto err; - - if ((size_t) printed >= available) - if (!do_realloc(buf, printed)) - goto err; - - /* The buffer has enough space now. */ - - available = buf->alloc - buf->size; - va_start(args, fmt); - printed = vsnprintf(buf->buf + buf->size, available, fmt, args); - va_end(args); - - if (printed < 0 || (size_t) printed >= available) - goto err; - - buf->size += printed; - return true; - -err: - free(buf->buf); - buf->buf = NULL; - return false; -} - -#define write_buf(buf, ...) do { \ - if (!check_write_buf(buf, __VA_ARGS__)) \ - return false; \ -} while (0) - -static bool -write_vmods(struct xkb_keymap *keymap, struct buf *buf) -{ - const struct xkb_mod *mod; - xkb_mod_index_t num_vmods = 0; - - xkb_mods_foreach(mod, &keymap->mods) { - if (mod->type != MOD_VIRT) - continue; - - if (num_vmods == 0) - write_buf(buf, "\tvirtual_modifiers "); - else - write_buf(buf, ","); - write_buf(buf, "%s", xkb_atom_text(keymap->ctx, mod->name)); - num_vmods++; - } - - if (num_vmods > 0) - write_buf(buf, ";\n\n"); - - return true; -} - -static bool -write_keycodes(struct xkb_keymap *keymap, struct buf *buf) -{ - const struct xkb_key *key; - xkb_led_index_t idx; - const struct xkb_led *led; - - if (keymap->keycodes_section_name) - write_buf(buf, "xkb_keycodes \"%s\" {\n", - keymap->keycodes_section_name); - else - write_buf(buf, "xkb_keycodes {\n"); - - /* xkbcomp and X11 really want to see keymaps with a minimum of 8, and - * a maximum of at least 255, else XWayland really starts hating life. - * If this is a problem and people really need strictly bounded keymaps, - * we should probably control this with a flag. */ - write_buf(buf, "\tminimum = %u;\n", min(keymap->min_key_code, 8)); - write_buf(buf, "\tmaximum = %u;\n", max(keymap->max_key_code, 255)); - - xkb_keys_foreach(key, keymap) { - if (key->name == XKB_ATOM_NONE) - continue; - - write_buf(buf, "\t%-20s = %u;\n", - KeyNameText(keymap->ctx, key->name), key->keycode); - } - - xkb_leds_enumerate(idx, led, keymap) - if (led->name != XKB_ATOM_NONE) - write_buf(buf, "\tindicator %u = \"%s\";\n", - idx + 1, xkb_atom_text(keymap->ctx, led->name)); - - - for (unsigned i = 0; i < keymap->num_key_aliases; i++) - write_buf(buf, "\talias %-14s = %s;\n", - KeyNameText(keymap->ctx, keymap->key_aliases[i].alias), - KeyNameText(keymap->ctx, keymap->key_aliases[i].real)); - - write_buf(buf, "};\n\n"); - return true; -} - -static bool -write_types(struct xkb_keymap *keymap, struct buf *buf) -{ - if (keymap->types_section_name) - write_buf(buf, "xkb_types \"%s\" {\n", - keymap->types_section_name); - else - write_buf(buf, "xkb_types {\n"); - - write_vmods(keymap, buf); - - for (unsigned i = 0; i < keymap->num_types; i++) { - const struct xkb_key_type *type = &keymap->types[i]; - - write_buf(buf, "\ttype \"%s\" {\n", - xkb_atom_text(keymap->ctx, type->name)); - - write_buf(buf, "\t\tmodifiers= %s;\n", - ModMaskText(keymap->ctx, &keymap->mods, type->mods.mods)); - - for (unsigned j = 0; j < type->num_entries; j++) { - const char *str; - const struct xkb_key_type_entry *entry = &type->entries[j]; - - /* - * Printing level 1 entries is redundant, it's the default, - * unless there's preserve info. - */ - if (entry->level == 0 && entry->preserve.mods == 0) - continue; - - str = ModMaskText(keymap->ctx, &keymap->mods, entry->mods.mods); - write_buf(buf, "\t\tmap[%s]= Level%u;\n", - str, entry->level + 1); - - if (entry->preserve.mods) - write_buf(buf, "\t\tpreserve[%s]= %s;\n", - str, ModMaskText(keymap->ctx, &keymap->mods, - entry->preserve.mods)); - } - - for (xkb_level_index_t n = 0; n < type->num_level_names; n++) - if (type->level_names[n]) - write_buf(buf, "\t\tlevel_name[Level%u]= \"%s\";\n", n + 1, - xkb_atom_text(keymap->ctx, type->level_names[n])); - - write_buf(buf, "\t};\n"); - } - - write_buf(buf, "};\n\n"); - return true; -} - -static bool -write_led_map(struct xkb_keymap *keymap, struct buf *buf, - const struct xkb_led *led) -{ - write_buf(buf, "\tindicator \"%s\" {\n", - xkb_atom_text(keymap->ctx, led->name)); - - if (led->which_groups) { - if (led->which_groups != XKB_STATE_LAYOUT_EFFECTIVE) { - write_buf(buf, "\t\twhichGroupState= %s;\n", - LedStateMaskText(keymap->ctx, led->which_groups)); - } - write_buf(buf, "\t\tgroups= 0x%02x;\n", - led->groups); - } - - if (led->which_mods) { - if (led->which_mods != XKB_STATE_MODS_EFFECTIVE) { - write_buf(buf, "\t\twhichModState= %s;\n", - LedStateMaskText(keymap->ctx, led->which_mods)); - } - write_buf(buf, "\t\tmodifiers= %s;\n", - ModMaskText(keymap->ctx, &keymap->mods, led->mods.mods)); - } - - if (led->ctrls) { - write_buf(buf, "\t\tcontrols= %s;\n", - ControlMaskText(keymap->ctx, led->ctrls)); - } - - write_buf(buf, "\t};\n"); - return true; -} - -static const char * -affect_lock_text(enum xkb_action_flags flags) -{ - switch (flags & (ACTION_LOCK_NO_LOCK | ACTION_LOCK_NO_UNLOCK)) { - case ACTION_LOCK_NO_UNLOCK: - return ",affect=lock"; - case ACTION_LOCK_NO_LOCK: - return ",affect=unlock"; - case ACTION_LOCK_NO_LOCK | ACTION_LOCK_NO_UNLOCK: - return ",affect=neither"; - } - return ""; -} - -static bool -write_action(struct xkb_keymap *keymap, struct buf *buf, - const union xkb_action *action, - const char *prefix, const char *suffix) -{ - const char *type; - const char *args = NULL; - - if (!prefix) - prefix = ""; - if (!suffix) - suffix = ""; - - type = ActionTypeText(action->type); - - switch (action->type) { - case ACTION_TYPE_MOD_SET: - case ACTION_TYPE_MOD_LATCH: - case ACTION_TYPE_MOD_LOCK: - if (action->mods.flags & ACTION_MODS_LOOKUP_MODMAP) - args = "modMapMods"; - else - args = ModMaskText(keymap->ctx, &keymap->mods, - action->mods.mods.mods); - write_buf(buf, "%s%s(modifiers=%s%s%s%s)%s", prefix, type, args, - (action->type != ACTION_TYPE_MOD_LOCK && (action->mods.flags & ACTION_LOCK_CLEAR)) ? ",clearLocks" : "", - (action->type != ACTION_TYPE_MOD_LOCK && (action->mods.flags & ACTION_LATCH_TO_LOCK)) ? ",latchToLock" : "", - (action->type == ACTION_TYPE_MOD_LOCK) ? affect_lock_text(action->mods.flags) : "", - suffix); - break; - - case ACTION_TYPE_GROUP_SET: - case ACTION_TYPE_GROUP_LATCH: - case ACTION_TYPE_GROUP_LOCK: - write_buf(buf, "%s%s(group=%s%d%s%s)%s", prefix, type, - (!(action->group.flags & ACTION_ABSOLUTE_SWITCH) && action->group.group > 0) ? "+" : "", - (action->group.flags & ACTION_ABSOLUTE_SWITCH) ? action->group.group + 1 : action->group.group, - (action->type != ACTION_TYPE_GROUP_LOCK && (action->group.flags & ACTION_LOCK_CLEAR)) ? ",clearLocks" : "", - (action->type != ACTION_TYPE_GROUP_LOCK && (action->group.flags & ACTION_LATCH_TO_LOCK)) ? ",latchToLock" : "", - suffix); - break; - - case ACTION_TYPE_TERMINATE: - write_buf(buf, "%s%s()%s", prefix, type, suffix); - break; - - case ACTION_TYPE_PTR_MOVE: - write_buf(buf, "%s%s(x=%s%d,y=%s%d%s)%s", prefix, type, - (!(action->ptr.flags & ACTION_ABSOLUTE_X) && action->ptr.x >= 0) ? "+" : "", - action->ptr.x, - (!(action->ptr.flags & ACTION_ABSOLUTE_Y) && action->ptr.y >= 0) ? "+" : "", - action->ptr.y, - (action->ptr.flags & ACTION_ACCEL) ? "" : ",!accel", - suffix); - break; - - case ACTION_TYPE_PTR_LOCK: - args = affect_lock_text(action->btn.flags); - /* fallthrough */ - case ACTION_TYPE_PTR_BUTTON: - write_buf(buf, "%s%s(button=", prefix, type); - if (action->btn.button > 0 && action->btn.button <= 5) - write_buf(buf, "%d", action->btn.button); - else - write_buf(buf, "default"); - if (action->btn.count) - write_buf(buf, ",count=%d", action->btn.count); - if (args) - write_buf(buf, "%s", args); - write_buf(buf, ")%s", suffix); - break; - - case ACTION_TYPE_PTR_DEFAULT: - write_buf(buf, "%s%s(", prefix, type); - write_buf(buf, "affect=button,button=%s%d", - (!(action->dflt.flags & ACTION_ABSOLUTE_SWITCH) && action->dflt.value >= 0) ? "+" : "", - action->dflt.value); - write_buf(buf, ")%s", suffix); - break; - - case ACTION_TYPE_SWITCH_VT: - write_buf(buf, "%s%s(screen=%s%d,%ssame)%s", prefix, type, - (!(action->screen.flags & ACTION_ABSOLUTE_SWITCH) && action->screen.screen >= 0) ? "+" : "", - action->screen.screen, - (action->screen.flags & ACTION_SAME_SCREEN) ? "" : "!", - suffix); - break; - - case ACTION_TYPE_CTRL_SET: - case ACTION_TYPE_CTRL_LOCK: - write_buf(buf, "%s%s(controls=%s%s)%s", prefix, type, - ControlMaskText(keymap->ctx, action->ctrls.ctrls), - (action->type == ACTION_TYPE_CTRL_LOCK) ? affect_lock_text(action->ctrls.flags) : "", - suffix); - break; - - case ACTION_TYPE_NONE: - write_buf(buf, "%sNoAction()%s", prefix, suffix); - break; - - default: - write_buf(buf, - "%s%s(type=0x%02x,data[0]=0x%02x,data[1]=0x%02x,data[2]=0x%02x,data[3]=0x%02x,data[4]=0x%02x,data[5]=0x%02x,data[6]=0x%02x)%s", - prefix, type, action->type, action->priv.data[0], - action->priv.data[1], action->priv.data[2], - action->priv.data[3], action->priv.data[4], - action->priv.data[5], action->priv.data[6], - suffix); - break; - } - - return true; -} - -static bool -write_compat(struct xkb_keymap *keymap, struct buf *buf) -{ - const struct xkb_led *led; - - if (keymap->compat_section_name) - write_buf(buf, "xkb_compatibility \"%s\" {\n", - keymap->compat_section_name); - else - write_buf(buf, "xkb_compatibility {\n"); - - write_vmods(keymap, buf); - - write_buf(buf, "\tinterpret.useModMapMods= AnyLevel;\n"); - write_buf(buf, "\tinterpret.repeat= False;\n"); - - for (unsigned i = 0; i < keymap->num_sym_interprets; i++) { - const struct xkb_sym_interpret *si = &keymap->sym_interprets[i]; - - write_buf(buf, "\tinterpret %s+%s(%s) {\n", - si->sym ? KeysymText(keymap->ctx, si->sym) : "Any", - SIMatchText(si->match), - ModMaskText(keymap->ctx, &keymap->mods, si->mods)); - - if (si->virtual_mod != XKB_MOD_INVALID) - write_buf(buf, "\t\tvirtualModifier= %s;\n", - ModIndexText(keymap->ctx, &keymap->mods, - si->virtual_mod)); - - if (si->level_one_only) - write_buf(buf, "\t\tuseModMapMods=level1;\n"); - - if (si->repeat) - write_buf(buf, "\t\trepeat= True;\n"); - - write_action(keymap, buf, &si->action, "\t\taction= ", ";\n"); - write_buf(buf, "\t};\n"); - } - - xkb_leds_foreach(led, keymap) - if (led->which_groups || led->groups || led->which_mods || - led->mods.mods || led->ctrls) - write_led_map(keymap, buf, led); - - write_buf(buf, "};\n\n"); - - return true; -} - -static bool -write_keysyms(struct xkb_keymap *keymap, struct buf *buf, - const struct xkb_key *key, xkb_layout_index_t group) -{ - for (xkb_level_index_t level = 0; level < XkbKeyNumLevels(key, group); - level++) { - const xkb_keysym_t *syms; - int num_syms; - - if (level != 0) - write_buf(buf, ", "); - - num_syms = xkb_keymap_key_get_syms_by_level(keymap, key->keycode, - group, level, &syms); - if (num_syms == 0) { - write_buf(buf, "%15s", "NoSymbol"); - } - else if (num_syms == 1) { - write_buf(buf, "%15s", KeysymText(keymap->ctx, syms[0])); - } - else { - write_buf(buf, "{ "); - for (int s = 0; s < num_syms; s++) { - if (s != 0) - write_buf(buf, ", "); - write_buf(buf, "%s", KeysymText(keymap->ctx, syms[s])); - } - write_buf(buf, " }"); - } - } - - return true; -} - -static bool -write_key(struct xkb_keymap *keymap, struct buf *buf, - const struct xkb_key *key) -{ - xkb_layout_index_t group; - bool simple = true; - bool explicit_types = false; - bool multi_type = false; - bool show_actions; - - write_buf(buf, "\tkey %-20s {", KeyNameText(keymap->ctx, key->name)); - - for (group = 0; group < key->num_groups; group++) { - if (key->groups[group].explicit_type) - explicit_types = true; - - if (group != 0 && key->groups[group].type != key->groups[0].type) - multi_type = true; - } - - if (explicit_types) { - const struct xkb_key_type *type; - simple = false; - - if (multi_type) { - for (group = 0; group < key->num_groups; group++) { - if (!key->groups[group].explicit_type) - continue; - - type = key->groups[group].type; - write_buf(buf, "\n\t\ttype[group%u]= \"%s\",", - group + 1, - xkb_atom_text(keymap->ctx, type->name)); - } - } - else { - type = key->groups[0].type; - write_buf(buf, "\n\t\ttype= \"%s\",", - xkb_atom_text(keymap->ctx, type->name)); - } - } - - if (key->explicit & EXPLICIT_REPEAT) { - if (key->repeats) - write_buf(buf, "\n\t\trepeat= Yes,"); - else - write_buf(buf, "\n\t\trepeat= No,"); - simple = false; - } - - if (key->vmodmap && (key->explicit & EXPLICIT_VMODMAP)) - write_buf(buf, "\n\t\tvirtualMods= %s,", - ModMaskText(keymap->ctx, &keymap->mods, key->vmodmap)); - - switch (key->out_of_range_group_action) { - case RANGE_SATURATE: - write_buf(buf, "\n\t\tgroupsClamp,"); - break; - - case RANGE_REDIRECT: - write_buf(buf, "\n\t\tgroupsRedirect= Group%u,", - key->out_of_range_group_number + 1); - break; - - default: - break; - } - - show_actions = (key->explicit & EXPLICIT_INTERP); - - if (key->num_groups > 1 || show_actions) - simple = false; - - if (simple) { - write_buf(buf, "\t[ "); - if (!write_keysyms(keymap, buf, key, 0)) - return false; - write_buf(buf, " ] };\n"); - } - else { - xkb_level_index_t level; - - for (group = 0; group < key->num_groups; group++) { - if (group != 0) - write_buf(buf, ","); - write_buf(buf, "\n\t\tsymbols[Group%u]= [ ", group + 1); - if (!write_keysyms(keymap, buf, key, group)) - return false; - write_buf(buf, " ]"); - if (show_actions) { - write_buf(buf, ",\n\t\tactions[Group%u]= [ ", group + 1); - for (level = 0; level < XkbKeyNumLevels(key, group); level++) { - if (level != 0) - write_buf(buf, ", "); - write_action(keymap, buf, - &key->groups[group].levels[level].action, - NULL, NULL); - } - write_buf(buf, " ]"); - } - } - write_buf(buf, "\n\t};\n"); - } - - return true; -} - -static bool -write_symbols(struct xkb_keymap *keymap, struct buf *buf) -{ - const struct xkb_key *key; - xkb_layout_index_t group; - xkb_mod_index_t i; - const struct xkb_mod *mod; - - if (keymap->symbols_section_name) - write_buf(buf, "xkb_symbols \"%s\" {\n", - keymap->symbols_section_name); - else - write_buf(buf, "xkb_symbols {\n"); - - for (group = 0; group < keymap->num_group_names; group++) - if (keymap->group_names[group]) - write_buf(buf, - "\tname[group%u]=\"%s\";\n", group + 1, - xkb_atom_text(keymap->ctx, keymap->group_names[group])); - if (group > 0) - write_buf(buf, "\n"); - - xkb_keys_foreach(key, keymap) - if (key->num_groups > 0) - write_key(keymap, buf, key); - - xkb_mods_enumerate(i, mod, &keymap->mods) { - bool had_any = false; - xkb_keys_foreach(key, keymap) { - if (key->modmap & (1u << i)) { - if (!had_any) - write_buf(buf, "\tmodifier_map %s { ", - xkb_atom_text(keymap->ctx, mod->name)); - write_buf(buf, "%s%s", - had_any ? ", " : "", - KeyNameText(keymap->ctx, key->name)); - had_any = true; - } - } - if (had_any) - write_buf(buf, " };\n"); - } - - write_buf(buf, "};\n\n"); - return true; -} - -static bool -write_keymap(struct xkb_keymap *keymap, struct buf *buf) -{ - return (check_write_buf(buf, "xkb_keymap {\n") && - write_keycodes(keymap, buf) && - write_types(keymap, buf) && - write_compat(keymap, buf) && - write_symbols(keymap, buf) && - check_write_buf(buf, "};\n")); -} - -char * -text_v1_keymap_get_as_string(struct xkb_keymap *keymap) -{ - struct buf buf = { NULL, 0, 0 }; - - if (!write_keymap(keymap, &buf)) { - free(buf.buf); - return NULL; - } - - return buf.buf; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/keywords.c b/src/3rdparty/xkbcommon/src/xkbcomp/keywords.c deleted file mode 100644 index abab7fe266..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/keywords.c +++ /dev/null @@ -1,348 +0,0 @@ -/* ANSI-C code produced by gperf version 3.0.4 */ -/* Command-line: gperf */ -/* Computed positions: -k'1-2,5' */ - -#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ - && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ - && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ - && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ - && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ - && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ - && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ - && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ - && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ - && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ - && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ - && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ - && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ - && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ - && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ - && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ - && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ - && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ - && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ - && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ - && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ - && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ - && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) -/* The character set is not based on ISO-646. */ -#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>." -#endif - - -#include "xkbcomp-priv.h" -#include "parser-priv.h" - -static unsigned int -keyword_gperf_hash(const char *str, unsigned int len); - -static const struct keyword_tok * -keyword_gperf_lookup(const char *str, unsigned int len); -struct keyword_tok { int name; int tok; }; -#include <string.h> -/* maximum key range = 70, duplicates = 0 */ - -#ifndef GPERF_DOWNCASE -#define GPERF_DOWNCASE 1 -static unsigned char gperf_downcase[256] = - { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255 - }; -#endif - -#ifndef GPERF_CASE_STRCMP -#define GPERF_CASE_STRCMP 1 -static int -gperf_case_strcmp (register const char *s1, register const char *s2) -{ - for (;;) - { - unsigned char c1 = gperf_downcase[(unsigned char)*s1++]; - unsigned char c2 = gperf_downcase[(unsigned char)*s2++]; - if (c1 != 0 && c1 == c2) - continue; - return (int)c1 - (int)c2; - } -} -#endif - -#ifdef __GNUC__ -__inline -#else -#ifdef __cplusplus -inline -#endif -#endif -static unsigned int -keyword_gperf_hash (register const char *str, register unsigned int len) -{ - static const unsigned char asso_values[] = - { - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 0, 73, 5, 36, 0, - 10, 1, 15, 15, 73, 0, 10, 20, 35, 20, - 50, 73, 10, 10, 5, 0, 15, 73, 0, 15, - 73, 73, 73, 73, 73, 73, 73, 0, 73, 5, - 36, 0, 10, 1, 15, 15, 73, 0, 10, 20, - 35, 20, 50, 73, 10, 10, 5, 0, 15, 73, - 0, 15, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73 - }; - register int hval = len; - - switch (hval) - { - default: - hval += asso_values[(unsigned char)str[4]]; - /*FALLTHROUGH*/ - case 4: - case 3: - case 2: - hval += asso_values[(unsigned char)str[1]]; - /*FALLTHROUGH*/ - case 1: - hval += asso_values[(unsigned char)str[0]]; - break; - } - return hval; -} - -struct stringpool_t - { - char stringpool_str3[sizeof("key")]; - char stringpool_str4[sizeof("keys")]; - char stringpool_str7[sizeof("augment")]; - char stringpool_str9[sizeof("text")]; - char stringpool_str10[sizeof("xkb_keymap")]; - char stringpool_str11[sizeof("keypad_keys")]; - char stringpool_str12[sizeof("xkb_keycodes")]; - char stringpool_str13[sizeof("xkb_geometry")]; - char stringpool_str14[sizeof("xkb_types")]; - char stringpool_str15[sizeof("xkb_compat")]; - char stringpool_str17[sizeof("replace")]; - char stringpool_str19[sizeof("xkb_compat_map")]; - char stringpool_str20[sizeof("xkb_layout")]; - char stringpool_str21[sizeof("xkb_symbols")]; - char stringpool_str22[sizeof("xkb_compatibility")]; - char stringpool_str23[sizeof("xkb_semantics")]; - char stringpool_str24[sizeof("type")]; - char stringpool_str25[sizeof("alias")]; - char stringpool_str26[sizeof("xkb_compatibility_map")]; - char stringpool_str27[sizeof("alphanumeric_keys")]; - char stringpool_str28[sizeof("function_keys")]; - char stringpool_str29[sizeof("alternate")]; - char stringpool_str30[sizeof("shape")]; - char stringpool_str31[sizeof("action")]; - char stringpool_str32[sizeof("section")]; - char stringpool_str33[sizeof("row")]; - char stringpool_str34[sizeof("logo")]; - char stringpool_str35[sizeof("alternate_group")]; - char stringpool_str36[sizeof("hidden")]; - char stringpool_str37[sizeof("virtual")]; - char stringpool_str42[sizeof("outline")]; - char stringpool_str43[sizeof("default")]; - char stringpool_str46[sizeof("modmap")]; - char stringpool_str47[sizeof("virtual_modifiers")]; - char stringpool_str52[sizeof("overlay")]; - char stringpool_str53[sizeof("override")]; - char stringpool_str57[sizeof("include")]; - char stringpool_str62[sizeof("modifier_map")]; - char stringpool_str63[sizeof("modifier_keys")]; - char stringpool_str64[sizeof("indicator")]; - char stringpool_str66[sizeof("group")]; - char stringpool_str67[sizeof("mod_map")]; - char stringpool_str69[sizeof("interpret")]; - char stringpool_str71[sizeof("solid")]; - char stringpool_str72[sizeof("partial")]; - }; -static const struct stringpool_t stringpool_contents = - { - "key", - "keys", - "augment", - "text", - "xkb_keymap", - "keypad_keys", - "xkb_keycodes", - "xkb_geometry", - "xkb_types", - "xkb_compat", - "replace", - "xkb_compat_map", - "xkb_layout", - "xkb_symbols", - "xkb_compatibility", - "xkb_semantics", - "type", - "alias", - "xkb_compatibility_map", - "alphanumeric_keys", - "function_keys", - "alternate", - "shape", - "action", - "section", - "row", - "logo", - "alternate_group", - "hidden", - "virtual", - "outline", - "default", - "modmap", - "virtual_modifiers", - "overlay", - "override", - "include", - "modifier_map", - "modifier_keys", - "indicator", - "group", - "mod_map", - "interpret", - "solid", - "partial" - }; -#define stringpool ((const char *) &stringpool_contents) -#ifdef __GNUC__ -__inline -#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ -__attribute__ ((__gnu_inline__)) -#endif -#endif -const struct keyword_tok * -keyword_gperf_lookup (register const char *str, register unsigned int len) -{ - enum - { - TOTAL_KEYWORDS = 45, - MIN_WORD_LENGTH = 3, - MAX_WORD_LENGTH = 21, - MIN_HASH_VALUE = 3, - MAX_HASH_VALUE = 72 - }; - - static const struct keyword_tok wordlist[] = - { - {-1}, {-1}, {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str3, KEY}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str4, KEYS}, - {-1}, {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str7, AUGMENT}, - {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str9, TEXT}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str10, XKB_KEYMAP}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str11, KEYPAD_KEYS}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str12, XKB_KEYCODES}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str13, XKB_GEOMETRY}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str14, XKB_TYPES}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str15, XKB_COMPATMAP}, - {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str17, REPLACE}, - {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str19, XKB_COMPATMAP}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str20, XKB_LAYOUT}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str21, XKB_SYMBOLS}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str22, XKB_COMPATMAP}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str23, XKB_SEMANTICS}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str24, TYPE}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str25, ALIAS}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str26, XKB_COMPATMAP}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str27, ALPHANUMERIC_KEYS}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str28, FUNCTION_KEYS}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str29, ALTERNATE}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str30, SHAPE}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str31, ACTION_TOK}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str32, SECTION}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str33, ROW}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str34, LOGO}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str35, ALTERNATE_GROUP}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str36, HIDDEN}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str37, VIRTUAL}, - {-1}, {-1}, {-1}, {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str42, OUTLINE}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str43, DEFAULT}, - {-1}, {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str46, MODIFIER_MAP}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str47, VIRTUAL_MODS}, - {-1}, {-1}, {-1}, {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str52, OVERLAY}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str53, OVERRIDE}, - {-1}, {-1}, {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str57, INCLUDE}, - {-1}, {-1}, {-1}, {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str62, MODIFIER_MAP}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str63, MODIFIER_KEYS}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str64, INDICATOR}, - {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str66, GROUP}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str67, MODIFIER_MAP}, - {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str69, INTERPRET}, - {-1}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str71, SOLID}, - {(int)(long)&((struct stringpool_t *)0)->stringpool_str72, PARTIAL} - }; - - if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) - { - register int key = keyword_gperf_hash (str, len); - - if (key <= MAX_HASH_VALUE && key >= 0) - { - register int o = wordlist[key].name; - if (o >= 0) - { - register const char *s = o + stringpool; - - if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strcmp (str, s)) - return &wordlist[key]; - } - } - } - return 0; -} - - -int -keyword_to_token(const char *string, unsigned int len) -{ - const struct keyword_tok *kt = keyword_gperf_lookup(string, len); - if (!kt) - return -1; - return kt->tok; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/parser-priv.h b/src/3rdparty/xkbcommon/src/xkbcomp/parser-priv.h deleted file mode 100644 index 76b5047eb6..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/parser-priv.h +++ /dev/null @@ -1,44 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#ifndef XKBCOMP_PARSER_PRIV_H -#define XKBCOMP_PARSER_PRIV_H - -struct parser_param; -struct scanner; - -#include "parser.h" - -int -_xkbcommon_lex(YYSTYPE *yylval, struct scanner *scanner); - -XkbFile * -parse(struct xkb_context *ctx, struct scanner *scanner, const char *map); - -int -keyword_to_token(const char *string, unsigned int len); - -#endif diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/parser.h b/src/3rdparty/xkbcommon/src/xkbcomp/parser.h deleted file mode 100644 index 655eca3133..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/parser.h +++ /dev/null @@ -1,157 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.0.4. */ - -/* Bison interface for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -#ifndef YY__XKBCOMMON_XKBCOMMON_INTERNAL_STA_PARSER_H_INCLUDED -# define YY__XKBCOMMON_XKBCOMMON_INTERNAL_STA_PARSER_H_INCLUDED -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int _xkbcommon_debug; -#endif - -/* Token type. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - enum yytokentype - { - END_OF_FILE = 0, - ERROR_TOK = 255, - XKB_KEYMAP = 1, - XKB_KEYCODES = 2, - XKB_TYPES = 3, - XKB_SYMBOLS = 4, - XKB_COMPATMAP = 5, - XKB_GEOMETRY = 6, - XKB_SEMANTICS = 7, - XKB_LAYOUT = 8, - INCLUDE = 10, - OVERRIDE = 11, - AUGMENT = 12, - REPLACE = 13, - ALTERNATE = 14, - VIRTUAL_MODS = 20, - TYPE = 21, - INTERPRET = 22, - ACTION_TOK = 23, - KEY = 24, - ALIAS = 25, - GROUP = 26, - MODIFIER_MAP = 27, - INDICATOR = 28, - SHAPE = 29, - KEYS = 30, - ROW = 31, - SECTION = 32, - OVERLAY = 33, - TEXT = 34, - OUTLINE = 35, - SOLID = 36, - LOGO = 37, - VIRTUAL = 38, - EQUALS = 40, - PLUS = 41, - MINUS = 42, - DIVIDE = 43, - TIMES = 44, - OBRACE = 45, - CBRACE = 46, - OPAREN = 47, - CPAREN = 48, - OBRACKET = 49, - CBRACKET = 50, - DOT = 51, - COMMA = 52, - SEMI = 53, - EXCLAM = 54, - INVERT = 55, - STRING = 60, - INTEGER = 61, - FLOAT = 62, - IDENT = 63, - KEYNAME = 64, - PARTIAL = 70, - DEFAULT = 71, - HIDDEN = 72, - ALPHANUMERIC_KEYS = 73, - MODIFIER_KEYS = 74, - KEYPAD_KEYS = 75, - FUNCTION_KEYS = 76, - ALTERNATE_GROUP = 77 - }; -#endif - -/* Value type. */ -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED - -union YYSTYPE -{ -#line 162 "../src/xkbcomp/parser.y" /* yacc.c:1909 */ - - int ival; - int64_t num; - enum xkb_file_type file_type; - char *str; - xkb_atom_t atom; - enum merge_mode merge; - enum xkb_map_flags mapFlags; - xkb_keysym_t keysym; - ParseCommon *any; - ExprDef *expr; - VarDef *var; - VModDef *vmod; - InterpDef *interp; - KeyTypeDef *keyType; - SymbolsDef *syms; - ModMapDef *modMask; - GroupCompatDef *groupCompat; - LedMapDef *ledMap; - LedNameDef *ledName; - KeycodeDef *keyCode; - KeyAliasDef *keyAlias; - void *geom; - XkbFile *file; - -#line 146 "xkbcommon-internal@sta/parser.h" /* yacc.c:1909 */ -}; - -typedef union YYSTYPE YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define YYSTYPE_IS_DECLARED 1 -#endif - - - -int _xkbcommon_parse (struct parser_param *param); - -#endif /* !YY__XKBCOMMON_XKBCOMMON_INTERNAL_STA_PARSER_H_INCLUDED */ diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/rules.c b/src/3rdparty/xkbcommon/src/xkbcomp/rules.c deleted file mode 100644 index 2a364c8aed..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/rules.c +++ /dev/null @@ -1,1037 +0,0 @@ -/************************************************************ - * Copyright (c) 1996 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -/* - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "xkbcomp-priv.h" -#include "rules.h" -#include "include.h" -#include "scanner-utils.h" - -/* Scanner / Lexer */ - -/* Values returned with some tokens, like yylval. */ -union lvalue { - struct sval string; -}; - -enum rules_token { - TOK_END_OF_FILE = 0, - TOK_END_OF_LINE, - TOK_IDENTIFIER, - TOK_GROUP_NAME, - TOK_BANG, - TOK_EQUALS, - TOK_STAR, - TOK_ERROR -}; - -static inline bool -is_ident(char ch) -{ - return is_graph(ch) && ch != '\\'; -} - -static enum rules_token -lex(struct scanner *s, union lvalue *val) -{ -skip_more_whitespace_and_comments: - /* Skip spaces. */ - while (chr(s, ' ') || chr(s, '\t')); - - /* Skip comments. */ - if (lit(s, "//")) { - skip_to_eol(s); - } - - /* New line. */ - if (eol(s)) { - while (eol(s)) next(s); - return TOK_END_OF_LINE; - } - - /* Escaped line continuation. */ - if (chr(s, '\\')) { - if (!eol(s)) { - scanner_err(s, "illegal new line escape; must appear at end of line"); - return TOK_ERROR; - } - next(s); - goto skip_more_whitespace_and_comments; - } - - /* See if we're done. */ - if (eof(s)) return TOK_END_OF_FILE; - - /* New token. */ - s->token_line = s->line; - s->token_column = s->column; - - /* Operators and punctuation. */ - if (chr(s, '!')) return TOK_BANG; - if (chr(s, '=')) return TOK_EQUALS; - if (chr(s, '*')) return TOK_STAR; - - /* Group name. */ - if (chr(s, '$')) { - val->string.start = s->s + s->pos; - val->string.len = 0; - while (is_ident(peek(s))) { - next(s); - val->string.len++; - } - if (val->string.len == 0) { - scanner_err(s, "unexpected character after \'$\'; expected name"); - return TOK_ERROR; - } - return TOK_GROUP_NAME; - } - - /* Identifier. */ - if (is_ident(peek(s))) { - val->string.start = s->s + s->pos; - val->string.len = 0; - while (is_ident(peek(s))) { - next(s); - val->string.len++; - } - return TOK_IDENTIFIER; - } - - scanner_err(s, "unrecognized token"); - return TOK_ERROR; -} - -/***====================================================================***/ - -enum rules_mlvo { - MLVO_MODEL, - MLVO_LAYOUT, - MLVO_VARIANT, - MLVO_OPTION, - _MLVO_NUM_ENTRIES -}; - -#define SVAL_LIT(literal) { literal, sizeof(literal) - 1 } - -static const struct sval rules_mlvo_svals[_MLVO_NUM_ENTRIES] = { - [MLVO_MODEL] = SVAL_LIT("model"), - [MLVO_LAYOUT] = SVAL_LIT("layout"), - [MLVO_VARIANT] = SVAL_LIT("variant"), - [MLVO_OPTION] = SVAL_LIT("option"), -}; - -enum rules_kccgst { - KCCGST_KEYCODES, - KCCGST_TYPES, - KCCGST_COMPAT, - KCCGST_SYMBOLS, - KCCGST_GEOMETRY, - _KCCGST_NUM_ENTRIES -}; - -static const struct sval rules_kccgst_svals[_KCCGST_NUM_ENTRIES] = { - [KCCGST_KEYCODES] = SVAL_LIT("keycodes"), - [KCCGST_TYPES] = SVAL_LIT("types"), - [KCCGST_COMPAT] = SVAL_LIT("compat"), - [KCCGST_SYMBOLS] = SVAL_LIT("symbols"), - [KCCGST_GEOMETRY] = SVAL_LIT("geometry"), -}; - -/* We use this to keep score whether an mlvo was matched or not; if not, - * we warn the user that his preference was ignored. */ -struct matched_sval { - struct sval sval; - bool matched; -}; -typedef darray(struct matched_sval) darray_matched_sval; - -/* - * A broken-down version of xkb_rule_names (without the rules, - * obviously). - */ -struct rule_names { - struct matched_sval model; - darray_matched_sval layouts; - darray_matched_sval variants; - darray_matched_sval options; -}; - -struct group { - struct sval name; - darray_sval elements; -}; - -struct mapping { - int mlvo_at_pos[_MLVO_NUM_ENTRIES]; - unsigned int num_mlvo; - unsigned int defined_mlvo_mask; - xkb_layout_index_t layout_idx, variant_idx; - int kccgst_at_pos[_KCCGST_NUM_ENTRIES]; - unsigned int num_kccgst; - unsigned int defined_kccgst_mask; - bool skip; -}; - -enum mlvo_match_type { - MLVO_MATCH_NORMAL = 0, - MLVO_MATCH_WILDCARD, - MLVO_MATCH_GROUP, -}; - -struct rule { - struct sval mlvo_value_at_pos[_MLVO_NUM_ENTRIES]; - enum mlvo_match_type match_type_at_pos[_MLVO_NUM_ENTRIES]; - unsigned int num_mlvo_values; - struct sval kccgst_value_at_pos[_KCCGST_NUM_ENTRIES]; - unsigned int num_kccgst_values; - bool skip; -}; - -/* - * This is the main object used to match a given RMLVO against a rules - * file and aggragate the results in a KcCGST. It goes through a simple - * matching state machine, with tokens as transitions (see - * matcher_match()). - */ -struct matcher { - struct xkb_context *ctx; - /* Input.*/ - struct rule_names rmlvo; - union lvalue val; - struct scanner scanner; - darray(struct group) groups; - /* Current mapping. */ - struct mapping mapping; - /* Current rule. */ - struct rule rule; - /* Output. */ - darray_char kccgst[_KCCGST_NUM_ENTRIES]; -}; - -static struct sval -strip_spaces(struct sval v) -{ - while (v.len > 0 && is_space(v.start[0])) { v.len--; v.start++; } - while (v.len > 0 && is_space(v.start[v.len - 1])) v.len--; - return v; -} - -static darray_matched_sval -split_comma_separated_mlvo(const char *s) -{ - darray_matched_sval arr = darray_new(); - - /* - * Make sure the array returned by this function always includes at - * least one value, e.g. "" -> { "" } and "," -> { "", "" }. - */ - - if (!s) { - struct matched_sval val = { .sval = { NULL, 0 } }; - darray_append(arr, val); - return arr; - } - - while (true) { - struct matched_sval val = { .sval = { s, 0 } }; - while (*s != '\0' && *s != ',') { s++; val.sval.len++; } - val.sval = strip_spaces(val.sval); - darray_append(arr, val); - if (*s == '\0') break; - if (*s == ',') s++; - } - - return arr; -} - -static struct matcher * -matcher_new(struct xkb_context *ctx, - const struct xkb_rule_names *rmlvo) -{ - struct matcher *m = calloc(1, sizeof(*m)); - if (!m) - return NULL; - - m->ctx = ctx; - m->rmlvo.model.sval.start = rmlvo->model; - m->rmlvo.model.sval.len = strlen_safe(rmlvo->model); - m->rmlvo.layouts = split_comma_separated_mlvo(rmlvo->layout); - m->rmlvo.variants = split_comma_separated_mlvo(rmlvo->variant); - m->rmlvo.options = split_comma_separated_mlvo(rmlvo->options); - - return m; -} - -static void -matcher_free(struct matcher *m) -{ - struct group *group; - if (!m) - return; - darray_free(m->rmlvo.layouts); - darray_free(m->rmlvo.variants); - darray_free(m->rmlvo.options); - darray_foreach(group, m->groups) - darray_free(group->elements); - for (int i = 0; i < _KCCGST_NUM_ENTRIES; i++) - darray_free(m->kccgst[i]); - darray_free(m->groups); - free(m); -} - -#define matcher_err(matcher, fmt, ...) \ - scanner_err(&(matcher)->scanner, fmt, ## __VA_ARGS__) - -static void -matcher_group_start_new(struct matcher *m, struct sval name) -{ - struct group group = { .name = name, .elements = darray_new() }; - darray_append(m->groups, group); -} - -static void -matcher_group_add_element(struct matcher *m, struct sval element) -{ - darray_append(darray_item(m->groups, darray_size(m->groups) - 1).elements, - element); -} - -static void -matcher_mapping_start_new(struct matcher *m) -{ - for (unsigned i = 0; i < _MLVO_NUM_ENTRIES; i++) - m->mapping.mlvo_at_pos[i] = -1; - for (unsigned i = 0; i < _KCCGST_NUM_ENTRIES; i++) - m->mapping.kccgst_at_pos[i] = -1; - m->mapping.layout_idx = m->mapping.variant_idx = XKB_LAYOUT_INVALID; - m->mapping.num_mlvo = m->mapping.num_kccgst = 0; - m->mapping.defined_mlvo_mask = 0; - m->mapping.defined_kccgst_mask = 0; - m->mapping.skip = false; -} - -static int -extract_layout_index(const char *s, size_t max_len, xkb_layout_index_t *out) -{ - /* This function is pretty stupid, but works for now. */ - *out = XKB_LAYOUT_INVALID; - if (max_len < 3) - return -1; - if (s[0] != '[' || !is_digit(s[1]) || s[2] != ']') - return -1; - if (s[1] - '0' < 1 || s[1] - '0' > XKB_MAX_GROUPS) - return -1; - /* To zero-based index. */ - *out = s[1] - '0' - 1; - return 3; -} - -static void -matcher_mapping_set_mlvo(struct matcher *m, struct sval ident) -{ - enum rules_mlvo mlvo; - struct sval mlvo_sval; - - for (mlvo = 0; mlvo < _MLVO_NUM_ENTRIES; mlvo++) { - mlvo_sval = rules_mlvo_svals[mlvo]; - - if (svaleq_prefix(mlvo_sval, ident)) - break; - } - - /* Not found. */ - if (mlvo >= _MLVO_NUM_ENTRIES) { - matcher_err(m, "invalid mapping: %.*s is not a valid value here; ignoring rule set", - ident.len, ident.start); - m->mapping.skip = true; - return; - } - - if (m->mapping.defined_mlvo_mask & (1u << mlvo)) { - matcher_err(m, "invalid mapping: %.*s appears twice on the same line; ignoring rule set", - mlvo_sval.len, mlvo_sval.start); - m->mapping.skip = true; - return; - } - - /* If there are leftovers still, it must be an index. */ - if (mlvo_sval.len < ident.len) { - xkb_layout_index_t idx; - int consumed = extract_layout_index(ident.start + mlvo_sval.len, - ident.len - mlvo_sval.len, &idx); - if ((int) (ident.len - mlvo_sval.len) != consumed) { - matcher_err(m, "invalid mapping: \"%.*s\" may only be followed by a valid group index; ignoring rule set", - mlvo_sval.len, mlvo_sval.start); - m->mapping.skip = true; - return; - } - - if (mlvo == MLVO_LAYOUT) { - m->mapping.layout_idx = idx; - } - else if (mlvo == MLVO_VARIANT) { - m->mapping.variant_idx = idx; - } - else { - matcher_err(m, "invalid mapping: \"%.*s\" cannot be followed by a group index; ignoring rule set", - mlvo_sval.len, mlvo_sval.start); - m->mapping.skip = true; - return; - } - } - - m->mapping.mlvo_at_pos[m->mapping.num_mlvo] = mlvo; - m->mapping.defined_mlvo_mask |= 1u << mlvo; - m->mapping.num_mlvo++; -} - -static void -matcher_mapping_set_kccgst(struct matcher *m, struct sval ident) -{ - enum rules_kccgst kccgst; - struct sval kccgst_sval; - - for (kccgst = 0; kccgst < _KCCGST_NUM_ENTRIES; kccgst++) { - kccgst_sval = rules_kccgst_svals[kccgst]; - - if (svaleq(rules_kccgst_svals[kccgst], ident)) - break; - } - - /* Not found. */ - if (kccgst >= _KCCGST_NUM_ENTRIES) { - matcher_err(m, "invalid mapping: %.*s is not a valid value here; ignoring rule set", - ident.len, ident.start); - m->mapping.skip = true; - return; - } - - if (m->mapping.defined_kccgst_mask & (1u << kccgst)) { - matcher_err(m, "invalid mapping: %.*s appears twice on the same line; ignoring rule set", - kccgst_sval.len, kccgst_sval.start); - m->mapping.skip = true; - return; - } - - m->mapping.kccgst_at_pos[m->mapping.num_kccgst] = kccgst; - m->mapping.defined_kccgst_mask |= 1u << kccgst; - m->mapping.num_kccgst++; -} - -static void -matcher_mapping_verify(struct matcher *m) -{ - if (m->mapping.num_mlvo == 0) { - matcher_err(m, "invalid mapping: must have at least one value on the left hand side; ignoring rule set"); - goto skip; - } - - if (m->mapping.num_kccgst == 0) { - matcher_err(m, "invalid mapping: must have at least one value on the right hand side; ignoring rule set"); - goto skip; - } - - /* - * This following is very stupid, but this is how it works. - * See the "Notes" section in the overview above. - */ - - if (m->mapping.defined_mlvo_mask & (1u << MLVO_LAYOUT)) { - if (m->mapping.layout_idx == XKB_LAYOUT_INVALID) { - if (darray_size(m->rmlvo.layouts) > 1) - goto skip; - } - else { - if (darray_size(m->rmlvo.layouts) == 1 || - m->mapping.layout_idx >= darray_size(m->rmlvo.layouts)) - goto skip; - } - } - - if (m->mapping.defined_mlvo_mask & (1u << MLVO_VARIANT)) { - if (m->mapping.variant_idx == XKB_LAYOUT_INVALID) { - if (darray_size(m->rmlvo.variants) > 1) - goto skip; - } - else { - if (darray_size(m->rmlvo.variants) == 1 || - m->mapping.variant_idx >= darray_size(m->rmlvo.variants)) - goto skip; - } - } - - return; - -skip: - m->mapping.skip = true; -} - -static void -matcher_rule_start_new(struct matcher *m) -{ - memset(&m->rule, 0, sizeof(m->rule)); - m->rule.skip = m->mapping.skip; -} - -static void -matcher_rule_set_mlvo_common(struct matcher *m, struct sval ident, - enum mlvo_match_type match_type) -{ - if (m->rule.num_mlvo_values + 1 > m->mapping.num_mlvo) { - matcher_err(m, "invalid rule: has more values than the mapping line; ignoring rule"); - m->rule.skip = true; - return; - } - m->rule.match_type_at_pos[m->rule.num_mlvo_values] = match_type; - m->rule.mlvo_value_at_pos[m->rule.num_mlvo_values] = ident; - m->rule.num_mlvo_values++; -} - -static void -matcher_rule_set_mlvo_wildcard(struct matcher *m) -{ - struct sval dummy = { NULL, 0 }; - matcher_rule_set_mlvo_common(m, dummy, MLVO_MATCH_WILDCARD); -} - -static void -matcher_rule_set_mlvo_group(struct matcher *m, struct sval ident) -{ - matcher_rule_set_mlvo_common(m, ident, MLVO_MATCH_GROUP); -} - -static void -matcher_rule_set_mlvo(struct matcher *m, struct sval ident) -{ - matcher_rule_set_mlvo_common(m, ident, MLVO_MATCH_NORMAL); -} - -static void -matcher_rule_set_kccgst(struct matcher *m, struct sval ident) -{ - if (m->rule.num_kccgst_values + 1 > m->mapping.num_kccgst) { - matcher_err(m, "invalid rule: has more values than the mapping line; ignoring rule"); - m->rule.skip = true; - return; - } - m->rule.kccgst_value_at_pos[m->rule.num_kccgst_values] = ident; - m->rule.num_kccgst_values++; -} - -static bool -match_group(struct matcher *m, struct sval group_name, struct sval to) -{ - struct group *group; - struct sval *element; - bool found = false; - - darray_foreach(group, m->groups) { - if (svaleq(group->name, group_name)) { - found = true; - break; - } - } - - if (!found) { - /* - * rules/evdev intentionally uses some undeclared group names - * in rules (e.g. commented group definitions which may be - * uncommented if needed). So we continue silently. - */ - return false; - } - - darray_foreach(element, group->elements) - if (svaleq(to, *element)) - return true; - - return false; -} - -static bool -match_value(struct matcher *m, struct sval val, struct sval to, - enum mlvo_match_type match_type) -{ - if (match_type == MLVO_MATCH_WILDCARD) - return true; - if (match_type == MLVO_MATCH_GROUP) - return match_group(m, val, to); - return svaleq(val, to); -} - -static bool -match_value_and_mark(struct matcher *m, struct sval val, - struct matched_sval *to, enum mlvo_match_type match_type) -{ - bool matched = match_value(m, val, to->sval, match_type); - if (matched) - to->matched = true; - return matched; -} - -/* - * This function performs %-expansion on @value (see overview above), - * and appends the result to @to. - */ -static bool -append_expanded_kccgst_value(struct matcher *m, darray_char *to, - struct sval value) -{ - const char *s = value.start; - darray_char expanded = darray_new(); - char ch; - bool expanded_plus, to_plus; - - /* - * Some ugly hand-lexing here, but going through the scanner is more - * trouble than it's worth, and the format is ugly on its own merit. - */ - for (unsigned i = 0; i < value.len; ) { - enum rules_mlvo mlv; - xkb_layout_index_t idx; - char pfx, sfx; - struct matched_sval *expanded_value; - - /* Check if that's a start of an expansion. */ - if (s[i] != '%') { - /* Just a normal character. */ - darray_appends_nullterminate(expanded, &s[i++], 1); - continue; - } - if (++i >= value.len) goto error; - - pfx = sfx = 0; - - /* Check for prefix. */ - if (s[i] == '(' || s[i] == '+' || s[i] == '|' || - s[i] == '_' || s[i] == '-') { - pfx = s[i]; - if (s[i] == '(') sfx = ')'; - if (++i >= value.len) goto error; - } - - /* Mandatory model/layout/variant specifier. */ - switch (s[i++]) { - case 'm': mlv = MLVO_MODEL; break; - case 'l': mlv = MLVO_LAYOUT; break; - case 'v': mlv = MLVO_VARIANT; break; - default: goto error; - } - - /* Check for index. */ - idx = XKB_LAYOUT_INVALID; - if (i < value.len && s[i] == '[') { - int consumed; - - if (mlv != MLVO_LAYOUT && mlv != MLVO_VARIANT) { - matcher_err(m, "invalid index in %%-expansion; may only index layout or variant"); - goto error; - } - - consumed = extract_layout_index(s + i, value.len - i, &idx); - if (consumed == -1) goto error; - i += consumed; - } - - /* Check for suffix, if there supposed to be one. */ - if (sfx != 0) { - if (i >= value.len) goto error; - if (s[i++] != sfx) goto error; - } - - /* Get the expanded value. */ - expanded_value = NULL; - - if (mlv == MLVO_LAYOUT) { - if (idx != XKB_LAYOUT_INVALID && - idx < darray_size(m->rmlvo.layouts) && - darray_size(m->rmlvo.layouts) > 1) - expanded_value = &darray_item(m->rmlvo.layouts, idx); - else if (idx == XKB_LAYOUT_INVALID && - darray_size(m->rmlvo.layouts) == 1) - expanded_value = &darray_item(m->rmlvo.layouts, 0); - } - else if (mlv == MLVO_VARIANT) { - if (idx != XKB_LAYOUT_INVALID && - idx < darray_size(m->rmlvo.variants) && - darray_size(m->rmlvo.variants) > 1) - expanded_value = &darray_item(m->rmlvo.variants, idx); - else if (idx == XKB_LAYOUT_INVALID && - darray_size(m->rmlvo.variants) == 1) - expanded_value = &darray_item(m->rmlvo.variants, 0); - } - else if (mlv == MLVO_MODEL) { - expanded_value = &m->rmlvo.model; - } - - /* If we didn't get one, skip silently. */ - if (!expanded_value || expanded_value->sval.len == 0) - continue; - - if (pfx != 0) - darray_appends_nullterminate(expanded, &pfx, 1); - darray_appends_nullterminate(expanded, - expanded_value->sval.start, - expanded_value->sval.len); - if (sfx != 0) - darray_appends_nullterminate(expanded, &sfx, 1); - expanded_value->matched = true; - } - - /* - * Appending bar to foo -> foo (not an error if this happens) - * Appending +bar to foo -> foo+bar - * Appending bar to +foo -> bar+foo - * Appending +bar to +foo -> +foo+bar - */ - - ch = (darray_empty(expanded) ? '\0' : darray_item(expanded, 0)); - expanded_plus = (ch == '+' || ch == '|'); - ch = (darray_empty(*to) ? '\0' : darray_item(*to, 0)); - to_plus = (ch == '+' || ch == '|'); - - if (expanded_plus || darray_empty(*to)) - darray_appends_nullterminate(*to, expanded.item, expanded.size); - else if (to_plus) - darray_prepends_nullterminate(*to, expanded.item, expanded.size); - - darray_free(expanded); - return true; - -error: - darray_free(expanded); - matcher_err(m, "invalid %%-expansion in value; not used"); - return false; -} - -static void -matcher_rule_verify(struct matcher *m) -{ - if (m->rule.num_mlvo_values != m->mapping.num_mlvo || - m->rule.num_kccgst_values != m->mapping.num_kccgst) { - matcher_err(m, "invalid rule: must have same number of values as mapping line; ignoring rule"); - m->rule.skip = true; - } -} - -static void -matcher_rule_apply_if_matches(struct matcher *m) -{ - for (unsigned i = 0; i < m->mapping.num_mlvo; i++) { - enum rules_mlvo mlvo = m->mapping.mlvo_at_pos[i]; - struct sval value = m->rule.mlvo_value_at_pos[i]; - enum mlvo_match_type match_type = m->rule.match_type_at_pos[i]; - struct matched_sval *to; - bool matched = false; - - if (mlvo == MLVO_MODEL) { - to = &m->rmlvo.model; - matched = match_value_and_mark(m, value, to, match_type); - } - else if (mlvo == MLVO_LAYOUT) { - xkb_layout_index_t idx = m->mapping.layout_idx; - idx = (idx == XKB_LAYOUT_INVALID ? 0 : idx); - to = &darray_item(m->rmlvo.layouts, idx); - matched = match_value_and_mark(m, value, to, match_type); - } - else if (mlvo == MLVO_VARIANT) { - xkb_layout_index_t idx = m->mapping.layout_idx; - idx = (idx == XKB_LAYOUT_INVALID ? 0 : idx); - to = &darray_item(m->rmlvo.variants, idx); - matched = match_value_and_mark(m, value, to, match_type); - } - else if (mlvo == MLVO_OPTION) { - darray_foreach(to, m->rmlvo.options) { - matched = match_value_and_mark(m, value, to, match_type); - if (matched) - break; - } - } - - if (!matched) - return; - } - - for (unsigned i = 0; i < m->mapping.num_kccgst; i++) { - enum rules_kccgst kccgst = m->mapping.kccgst_at_pos[i]; - struct sval value = m->rule.kccgst_value_at_pos[i]; - append_expanded_kccgst_value(m, &m->kccgst[kccgst], value); - } - - /* - * If a rule matches in a rule set, the rest of the set should be - * skipped. However, rule sets matching against options may contain - * several legitimate rules, so they are processed entirely. - */ - if (!(m->mapping.defined_mlvo_mask & (1 << MLVO_OPTION))) - m->mapping.skip = true; -} - -static enum rules_token -gettok(struct matcher *m) -{ - return lex(&m->scanner, &m->val); -} - -static bool -matcher_match(struct matcher *m, const char *string, size_t len, - const char *file_name, struct xkb_component_names *out) -{ - enum rules_token tok; - struct matched_sval *mval; - - if (!m) - return false; - - scanner_init(&m->scanner, m->ctx, string, len, file_name, NULL); - -initial: - switch (tok = gettok(m)) { - case TOK_BANG: - goto bang; - case TOK_END_OF_LINE: - goto initial; - case TOK_END_OF_FILE: - goto finish; - default: - goto unexpected; - } - -bang: - switch (tok = gettok(m)) { - case TOK_GROUP_NAME: - matcher_group_start_new(m, m->val.string); - goto group_name; - case TOK_IDENTIFIER: - matcher_mapping_start_new(m); - matcher_mapping_set_mlvo(m, m->val.string); - goto mapping_mlvo; - default: - goto unexpected; - } - -group_name: - switch (tok = gettok(m)) { - case TOK_EQUALS: - goto group_element; - default: - goto unexpected; - } - -group_element: - switch (tok = gettok(m)) { - case TOK_IDENTIFIER: - matcher_group_add_element(m, m->val.string); - goto group_element; - case TOK_END_OF_LINE: - goto initial; - default: - goto unexpected; - } - -mapping_mlvo: - switch (tok = gettok(m)) { - case TOK_IDENTIFIER: - if (!m->mapping.skip) - matcher_mapping_set_mlvo(m, m->val.string); - goto mapping_mlvo; - case TOK_EQUALS: - goto mapping_kccgst; - default: - goto unexpected; - } - -mapping_kccgst: - switch (tok = gettok(m)) { - case TOK_IDENTIFIER: - if (!m->mapping.skip) - matcher_mapping_set_kccgst(m, m->val.string); - goto mapping_kccgst; - case TOK_END_OF_LINE: - if (!m->mapping.skip) - matcher_mapping_verify(m); - goto rule_mlvo_first; - default: - goto unexpected; - } - -rule_mlvo_first: - switch (tok = gettok(m)) { - case TOK_BANG: - goto bang; - case TOK_END_OF_LINE: - goto rule_mlvo_first; - case TOK_END_OF_FILE: - goto finish; - default: - matcher_rule_start_new(m); - goto rule_mlvo_no_tok; - } - -rule_mlvo: - tok = gettok(m); -rule_mlvo_no_tok: - switch (tok) { - case TOK_IDENTIFIER: - if (!m->rule.skip) - matcher_rule_set_mlvo(m, m->val.string); - goto rule_mlvo; - case TOK_STAR: - if (!m->rule.skip) - matcher_rule_set_mlvo_wildcard(m); - goto rule_mlvo; - case TOK_GROUP_NAME: - if (!m->rule.skip) - matcher_rule_set_mlvo_group(m, m->val.string); - goto rule_mlvo; - case TOK_EQUALS: - goto rule_kccgst; - default: - goto unexpected; - } - -rule_kccgst: - switch (tok = gettok(m)) { - case TOK_IDENTIFIER: - if (!m->rule.skip) - matcher_rule_set_kccgst(m, m->val.string); - goto rule_kccgst; - case TOK_END_OF_LINE: - if (!m->rule.skip) - matcher_rule_verify(m); - if (!m->rule.skip) - matcher_rule_apply_if_matches(m); - goto rule_mlvo_first; - default: - goto unexpected; - } - -unexpected: - switch (tok) { - case TOK_ERROR: - goto error; - default: - goto state_error; - } - -finish: - if (darray_empty(m->kccgst[KCCGST_KEYCODES]) || - darray_empty(m->kccgst[KCCGST_TYPES]) || - darray_empty(m->kccgst[KCCGST_COMPAT]) || - /* darray_empty(m->kccgst[KCCGST_GEOMETRY]) || */ - darray_empty(m->kccgst[KCCGST_SYMBOLS])) - goto error; - - darray_steal(m->kccgst[KCCGST_KEYCODES], &out->keycodes, NULL); - darray_steal(m->kccgst[KCCGST_TYPES], &out->types, NULL); - darray_steal(m->kccgst[KCCGST_COMPAT], &out->compat, NULL); - darray_steal(m->kccgst[KCCGST_SYMBOLS], &out->symbols, NULL); - darray_free(m->kccgst[KCCGST_GEOMETRY]); - - - mval = &m->rmlvo.model; - if (!mval->matched && mval->sval.len > 0) - log_err(m->ctx, "Unrecognized RMLVO model \"%.*s\" was ignored\n", - mval->sval.len, mval->sval.start); - darray_foreach(mval, m->rmlvo.layouts) - if (!mval->matched && mval->sval.len > 0) - log_err(m->ctx, "Unrecognized RMLVO layout \"%.*s\" was ignored\n", - mval->sval.len, mval->sval.start); - darray_foreach(mval, m->rmlvo.variants) - if (!mval->matched && mval->sval.len > 0) - log_err(m->ctx, "Unrecognized RMLVO variant \"%.*s\" was ignored\n", - mval->sval.len, mval->sval.start); - darray_foreach(mval, m->rmlvo.options) - if (!mval->matched && mval->sval.len > 0) - log_err(m->ctx, "Unrecognized RMLVO option \"%.*s\" was ignored\n", - mval->sval.len, mval->sval.start); - - return true; - -state_error: - matcher_err(m, "unexpected token"); -error: - return false; -} - -bool -xkb_components_from_rules(struct xkb_context *ctx, - const struct xkb_rule_names *rmlvo, - struct xkb_component_names *out) -{ - bool ret = false; - FILE *file; - char *path; - char *string; - size_t size; - struct matcher *matcher; - - file = FindFileInXkbPath(ctx, rmlvo->rules, FILE_TYPE_RULES, &path); - if (!file) - goto err_out; - - ret = map_file(file, &string, &size); - if (!ret) { - log_err(ctx, "Couldn't read rules file \"%s\": %s\n", - path, strerror(errno)); - goto err_file; - } - - matcher = matcher_new(ctx, rmlvo); - ret = matcher_match(matcher, string, size, path, out); - if (!ret) - log_err(ctx, "No components returned from XKB rules \"%s\"\n", path); - matcher_free(matcher); - - unmap_file(string, size); -err_file: - free(path); - fclose(file); -err_out: - return ret; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/rules.h b/src/3rdparty/xkbcommon/src/xkbcomp/rules.h deleted file mode 100644 index 5381b1562f..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/rules.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright © 2009 Dan Nicholson - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef XKBCOMP_RULES_H -#define XKBCOMP_RULES_H - -bool -xkb_components_from_rules(struct xkb_context *ctx, - const struct xkb_rule_names *rmlvo, - struct xkb_component_names *out); - -#endif diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/scanner.c b/src/3rdparty/xkbcommon/src/xkbcomp/scanner.c deleted file mode 100644 index 1ce6137bf3..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/scanner.c +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include "xkbcomp-priv.h" -#include "parser-priv.h" -#include "scanner-utils.h" - -static bool -number(struct scanner *s, int64_t *out, int *out_tok) -{ - bool is_float = false, is_hex = false; - const char *start = s->s + s->pos; - char *end; - - if (lit(s, "0x")) { - while (is_xdigit(peek(s))) next(s); - is_hex = true; - } - else { - while (is_digit(peek(s))) next(s); - is_float = chr(s, '.'); - while (is_digit(peek(s))) next(s); - } - if (s->s + s->pos == start) - return false; - - errno = 0; - if (is_hex) - *out = strtoul(start, &end, 16); - else if (is_float) - *out = strtod(start, &end); - else - *out = strtoul(start, &end, 10); - if (errno != 0 || s->s + s->pos != end) - *out_tok = ERROR_TOK; - else - *out_tok = (is_float ? FLOAT : INTEGER); - return true; -} - -int -_xkbcommon_lex(YYSTYPE *yylval, struct scanner *s) -{ - int tok; - -skip_more_whitespace_and_comments: - /* Skip spaces. */ - while (is_space(peek(s))) next(s); - - /* Skip comments. */ - if (lit(s, "//") || chr(s, '#')) { - skip_to_eol(s); - goto skip_more_whitespace_and_comments; - } - - /* See if we're done. */ - if (eof(s)) return END_OF_FILE; - - /* New token. */ - s->token_line = s->line; - s->token_column = s->column; - s->buf_pos = 0; - - /* String literal. */ - if (chr(s, '\"')) { - while (!eof(s) && !eol(s) && peek(s) != '\"') { - if (chr(s, '\\')) { - uint8_t o; - if (chr(s, '\\')) buf_append(s, '\\'); - else if (chr(s, 'n')) buf_append(s, '\n'); - else if (chr(s, 't')) buf_append(s, '\t'); - else if (chr(s, 'r')) buf_append(s, '\r'); - else if (chr(s, 'b')) buf_append(s, '\b'); - else if (chr(s, 'f')) buf_append(s, '\f'); - else if (chr(s, 'v')) buf_append(s, '\v'); - else if (chr(s, 'e')) buf_append(s, '\033'); - else if (oct(s, &o)) buf_append(s, (char) o); - else { - scanner_warn(s, "unknown escape sequence in string literal"); - /* Ignore. */ - } - } else { - buf_append(s, next(s)); - } - } - if (!buf_append(s, '\0') || !chr(s, '\"')) { - scanner_err(s, "unterminated string literal"); - return ERROR_TOK; - } - yylval->str = strdup(s->buf); - if (!yylval->str) - return ERROR_TOK; - return STRING; - } - - /* Key name literal. */ - if (chr(s, '<')) { - while (is_graph(peek(s)) && peek(s) != '>') - buf_append(s, next(s)); - if (!buf_append(s, '\0') || !chr(s, '>')) { - scanner_err(s, "unterminated key name literal"); - return ERROR_TOK; - } - /* Empty key name literals are allowed. */ - yylval->atom = xkb_atom_intern(s->ctx, s->buf, s->buf_pos - 1); - return KEYNAME; - } - - /* Operators and punctuation. */ - if (chr(s, ';')) return SEMI; - if (chr(s, '{')) return OBRACE; - if (chr(s, '}')) return CBRACE; - if (chr(s, '=')) return EQUALS; - if (chr(s, '[')) return OBRACKET; - if (chr(s, ']')) return CBRACKET; - if (chr(s, '(')) return OPAREN; - if (chr(s, ')')) return CPAREN; - if (chr(s, '.')) return DOT; - if (chr(s, ',')) return COMMA; - if (chr(s, '+')) return PLUS; - if (chr(s, '-')) return MINUS; - if (chr(s, '*')) return TIMES; - if (chr(s, '/')) return DIVIDE; - if (chr(s, '!')) return EXCLAM; - if (chr(s, '~')) return INVERT; - - /* Identifier. */ - if (is_alpha(peek(s)) || peek(s) == '_') { - s->buf_pos = 0; - while (is_alnum(peek(s)) || peek(s) == '_') - buf_append(s, next(s)); - if (!buf_append(s, '\0')) { - scanner_err(s, "identifier too long"); - return ERROR_TOK; - } - - /* Keyword. */ - tok = keyword_to_token(s->buf, s->buf_pos - 1); - if (tok != -1) return tok; - - yylval->str = strdup(s->buf); - if (!yylval->str) - return ERROR_TOK; - return IDENT; - } - - /* Number literal (hexadecimal / decimal / float). */ - if (number(s, &yylval->num, &tok)) { - if (tok == ERROR_TOK) { - scanner_err(s, "malformed number literal"); - return ERROR_TOK; - } - return tok; - } - - scanner_err(s, "unrecognized token"); - return ERROR_TOK; -} - -XkbFile * -XkbParseString(struct xkb_context *ctx, const char *string, size_t len, - const char *file_name, const char *map) -{ - struct scanner scanner; - scanner_init(&scanner, ctx, string, len, file_name, NULL); - return parse(ctx, &scanner, map); -} - -XkbFile * -XkbParseFile(struct xkb_context *ctx, FILE *file, - const char *file_name, const char *map) -{ - bool ok; - XkbFile *xkb_file; - char *string; - size_t size; - - ok = map_file(file, &string, &size); - if (!ok) { - log_err(ctx, "Couldn't read XKB file %s: %s\n", - file_name, strerror(errno)); - return NULL; - } - - xkb_file = XkbParseString(ctx, string, size, file_name, map); - unmap_file(string, size); - return xkb_file; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/symbols.c b/src/3rdparty/xkbcommon/src/xkbcomp/symbols.c deleted file mode 100644 index 9b05ec924f..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/symbols.c +++ /dev/null @@ -1,1595 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -/* - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone <daniel@fooishbar.org> - * Ran Benita <ran234@gmail.com> - */ - -#include "xkbcomp-priv.h" -#include "text.h" -#include "expr.h" -#include "action.h" -#include "vmod.h" -#include "include.h" -#include "keysym.h" - -enum key_repeat { - KEY_REPEAT_UNDEFINED = 0, - KEY_REPEAT_YES = 1, - KEY_REPEAT_NO = 2, -}; - -enum group_field { - GROUP_FIELD_SYMS = (1 << 0), - GROUP_FIELD_ACTS = (1 << 1), - GROUP_FIELD_TYPE = (1 << 2), -}; - -enum key_field { - KEY_FIELD_REPEAT = (1 << 0), - KEY_FIELD_DEFAULT_TYPE = (1 << 1), - KEY_FIELD_GROUPINFO = (1 << 2), - KEY_FIELD_VMODMAP = (1 << 3), -}; - -typedef struct { - enum group_field defined; - darray(struct xkb_level) levels; - xkb_atom_t type; -} GroupInfo; - -typedef struct { - enum key_field defined; - enum merge_mode merge; - - xkb_atom_t name; - - darray(GroupInfo) groups; - - enum key_repeat repeat; - xkb_mod_mask_t vmodmap; - xkb_atom_t default_type; - - enum xkb_range_exceed_type out_of_range_group_action; - xkb_layout_index_t out_of_range_group_number; -} KeyInfo; - -static void -ClearLevelInfo(struct xkb_level *leveli) -{ - if (leveli->num_syms > 1) - free(leveli->u.syms); -} - -static void -InitGroupInfo(GroupInfo *groupi) -{ - memset(groupi, 0, sizeof(*groupi)); -} - -static void -ClearGroupInfo(GroupInfo *groupi) -{ - struct xkb_level *leveli; - darray_foreach(leveli, groupi->levels) - ClearLevelInfo(leveli); - darray_free(groupi->levels); -} - -static void -CopyGroupInfo(GroupInfo *to, const GroupInfo *from) -{ - to->defined = from->defined; - to->type = from->type; - darray_init(to->levels); - darray_copy(to->levels, from->levels); - for (xkb_level_index_t j = 0; j < darray_size(to->levels); j++) - if (darray_item(from->levels, j).num_syms > 1) - darray_item(to->levels, j).u.syms = - memdup(darray_item(from->levels, j).u.syms, - darray_item(from->levels, j).num_syms, - sizeof(xkb_keysym_t)); -} - -static void -InitKeyInfo(struct xkb_context *ctx, KeyInfo *keyi) -{ - memset(keyi, 0, sizeof(*keyi)); - keyi->merge = MERGE_OVERRIDE; - keyi->name = xkb_atom_intern_literal(ctx, "*"); - keyi->out_of_range_group_action = RANGE_WRAP; -} - -static void -ClearKeyInfo(KeyInfo *keyi) -{ - GroupInfo *groupi; - darray_foreach(groupi, keyi->groups) - ClearGroupInfo(groupi); - darray_free(keyi->groups); -} - -/***====================================================================***/ - -typedef struct { - enum merge_mode merge; - bool haveSymbol; - xkb_mod_index_t modifier; - union { - xkb_atom_t keyName; - xkb_keysym_t keySym; - } u; -} ModMapEntry; - -typedef struct { - char *name; /* e.g. pc+us+inet(evdev) */ - int errorCount; - enum merge_mode merge; - xkb_layout_index_t explicit_group; - darray(KeyInfo) keys; - KeyInfo default_key; - ActionsInfo *actions; - darray(xkb_atom_t) group_names; - darray(ModMapEntry) modmaps; - struct xkb_mod_set mods; - - struct xkb_context *ctx; - /* Needed for AddKeySymbols. */ - const struct xkb_keymap *keymap; -} SymbolsInfo; - -static void -InitSymbolsInfo(SymbolsInfo *info, const struct xkb_keymap *keymap, - ActionsInfo *actions, const struct xkb_mod_set *mods) -{ - memset(info, 0, sizeof(*info)); - info->ctx = keymap->ctx; - info->keymap = keymap; - info->merge = MERGE_OVERRIDE; - InitKeyInfo(keymap->ctx, &info->default_key); - info->actions = actions; - info->mods = *mods; - info->explicit_group = XKB_LAYOUT_INVALID; -} - -static void -ClearSymbolsInfo(SymbolsInfo *info) -{ - KeyInfo *keyi; - free(info->name); - darray_foreach(keyi, info->keys) - ClearKeyInfo(keyi); - darray_free(info->keys); - darray_free(info->group_names); - darray_free(info->modmaps); - ClearKeyInfo(&info->default_key); -} - -static const char * -KeyInfoText(SymbolsInfo *info, KeyInfo *keyi) -{ - return KeyNameText(info->ctx, keyi->name); -} - -static bool -MergeGroups(SymbolsInfo *info, GroupInfo *into, GroupInfo *from, bool clobber, - bool report, xkb_layout_index_t group, xkb_atom_t key_name) -{ - xkb_level_index_t i, levels_in_both; - struct xkb_level *level; - - /* First find the type of the merged group. */ - if (into->type != from->type) { - if (from->type == XKB_ATOM_NONE) { - } - else if (into->type == XKB_ATOM_NONE) { - into->type = from->type; - } - else { - xkb_atom_t use = (clobber ? from->type : into->type); - xkb_atom_t ignore = (clobber ? into->type : from->type); - - if (report) - log_warn(info->ctx, - "Multiple definitions for group %d type of key %s; " - "Using %s, ignoring %s\n", - group + 1, KeyNameText(info->ctx, key_name), - xkb_atom_text(info->ctx, use), - xkb_atom_text(info->ctx, ignore)); - - into->type = use; - } - } - into->defined |= (from->defined & GROUP_FIELD_TYPE); - - /* Now look at the levels. */ - - if (darray_empty(from->levels)) { - InitGroupInfo(from); - return true; - } - - if (darray_empty(into->levels)) { - from->type = into->type; - *into = *from; - InitGroupInfo(from); - return true; - } - - /* Merge the actions and syms. */ - levels_in_both = MIN(darray_size(into->levels), darray_size(from->levels)); - for (i = 0; i < levels_in_both; i++) { - struct xkb_level *intoLevel = &darray_item(into->levels, i); - struct xkb_level *fromLevel = &darray_item(from->levels, i); - - if (fromLevel->action.type == ACTION_TYPE_NONE) { - } - else if (intoLevel->action.type == ACTION_TYPE_NONE) { - intoLevel->action = fromLevel->action; - } - else { - union xkb_action *use, *ignore; - use = (clobber ? &fromLevel->action : &intoLevel->action); - ignore = (clobber ? &intoLevel->action : &fromLevel->action); - - if (report) - log_warn(info->ctx, - "Multiple actions for level %d/group %u on key %s; " - "Using %s, ignoring %s\n", - i + 1, group + 1, KeyNameText(info->ctx, key_name), - ActionTypeText(use->type), - ActionTypeText(ignore->type)); - - intoLevel->action = *use; - } - - if (fromLevel->num_syms == 0) { - } - else if (intoLevel->num_syms == 0) { - intoLevel->num_syms = fromLevel->num_syms; - if (fromLevel->num_syms > 1) - intoLevel->u.syms = fromLevel->u.syms; - else - intoLevel->u.sym = fromLevel->u.sym; - fromLevel->num_syms = 0; - } - else if (!XkbLevelsSameSyms(fromLevel, intoLevel)) { - if (report) - log_warn(info->ctx, - "Multiple symbols for level %d/group %u on key %s; " - "Using %s, ignoring %s\n", - i + 1, group + 1, KeyNameText(info->ctx, key_name), - (clobber ? "from" : "to"), - (clobber ? "to" : "from")); - - if (clobber) { - ClearLevelInfo(intoLevel); - intoLevel->num_syms = fromLevel->num_syms; - if (fromLevel->num_syms > 1) - intoLevel->u.syms = fromLevel->u.syms; - else - intoLevel->u.sym = fromLevel->u.sym; - fromLevel->num_syms = 0; - } - } - } - /* If @from has extra levels, get them as well. */ - darray_foreach_from(level, from->levels, levels_in_both) { - darray_append(into->levels, *level); - level->num_syms = 0; - } - into->defined |= (from->defined & GROUP_FIELD_ACTS); - into->defined |= (from->defined & GROUP_FIELD_SYMS); - - return true; -} - -static bool -UseNewKeyField(enum key_field field, enum key_field old, enum key_field new, - bool clobber, bool report, enum key_field *collide) -{ - if (!(old & field)) - return (new & field); - - if (new & field) { - if (report) - *collide |= field; - - if (clobber) - return true; - } - - return false; -} - -static bool -MergeKeys(SymbolsInfo *info, KeyInfo *into, KeyInfo *from, bool same_file) -{ - xkb_layout_index_t i; - xkb_layout_index_t groups_in_both; - enum key_field collide = 0; - const int verbosity = xkb_context_get_log_verbosity(info->ctx); - const bool clobber = (from->merge != MERGE_AUGMENT); - const bool report = (same_file && verbosity > 0) || verbosity > 9; - - if (from->merge == MERGE_REPLACE) { - ClearKeyInfo(into); - *into = *from; - InitKeyInfo(info->ctx, from); - return true; - } - - groups_in_both = MIN(darray_size(into->groups), darray_size(from->groups)); - for (i = 0; i < groups_in_both; i++) - MergeGroups(info, - &darray_item(into->groups, i), - &darray_item(from->groups, i), - clobber, report, i, into->name); - /* If @from has extra groups, just move them to @into. */ - for (i = groups_in_both; i < darray_size(from->groups); i++) { - darray_append(into->groups, darray_item(from->groups, i)); - InitGroupInfo(&darray_item(from->groups, i)); - } - - if (UseNewKeyField(KEY_FIELD_VMODMAP, into->defined, from->defined, - clobber, report, &collide)) { - into->vmodmap = from->vmodmap; - into->defined |= KEY_FIELD_VMODMAP; - } - if (UseNewKeyField(KEY_FIELD_REPEAT, into->defined, from->defined, - clobber, report, &collide)) { - into->repeat = from->repeat; - into->defined |= KEY_FIELD_REPEAT; - } - if (UseNewKeyField(KEY_FIELD_DEFAULT_TYPE, into->defined, from->defined, - clobber, report, &collide)) { - into->default_type = from->default_type; - into->defined |= KEY_FIELD_DEFAULT_TYPE; - } - if (UseNewKeyField(KEY_FIELD_GROUPINFO, into->defined, from->defined, - clobber, report, &collide)) { - into->out_of_range_group_action = from->out_of_range_group_action; - into->out_of_range_group_number = from->out_of_range_group_number; - into->defined |= KEY_FIELD_GROUPINFO; - } - - if (collide) - log_warn(info->ctx, - "Symbol map for key %s redefined; " - "Using %s definition for conflicting fields\n", - KeyNameText(info->ctx, into->name), - (clobber ? "first" : "last")); - - ClearKeyInfo(from); - InitKeyInfo(info->ctx, from); - return true; -} - -/* TODO: Make it so this function doesn't need the entire keymap. */ -static bool -AddKeySymbols(SymbolsInfo *info, KeyInfo *keyi, bool same_file) -{ - xkb_atom_t real_name; - KeyInfo *iter; - - /* - * Don't keep aliases in the keys array; this guarantees that - * searching for keys to merge with by straight comparison (see the - * following loop) is enough, and we won't get multiple KeyInfo's - * for the same key because of aliases. - */ - real_name = XkbResolveKeyAlias(info->keymap, keyi->name); - if (real_name != XKB_ATOM_NONE) - keyi->name = real_name; - - darray_foreach(iter, info->keys) - if (iter->name == keyi->name) - return MergeKeys(info, iter, keyi, same_file); - - darray_append(info->keys, *keyi); - InitKeyInfo(info->ctx, keyi); - return true; -} - -static bool -AddModMapEntry(SymbolsInfo *info, ModMapEntry *new) -{ - ModMapEntry *old; - bool clobber = (new->merge != MERGE_AUGMENT); - - darray_foreach(old, info->modmaps) { - xkb_mod_index_t use, ignore; - - if ((new->haveSymbol != old->haveSymbol) || - (new->haveSymbol && new->u.keySym != old->u.keySym) || - (!new->haveSymbol && new->u.keyName != old->u.keyName)) - continue; - - if (new->modifier == old->modifier) - return true; - - use = (clobber ? new->modifier : old->modifier); - ignore = (clobber ? old->modifier : new->modifier); - - if (new->haveSymbol) - log_err(info->ctx, - "Symbol \"%s\" added to modifier map for multiple modifiers; " - "Using %s, ignoring %s\n", - KeysymText(info->ctx, new->u.keySym), - ModIndexText(info->ctx, &info->mods, use), - ModIndexText(info->ctx, &info->mods, ignore)); - else - log_err(info->ctx, - "Key \"%s\" added to modifier map for multiple modifiers; " - "Using %s, ignoring %s\n", - KeyNameText(info->ctx, new->u.keyName), - ModIndexText(info->ctx, &info->mods, use), - ModIndexText(info->ctx, &info->mods, ignore)); - - old->modifier = use; - return true; - } - - darray_append(info->modmaps, *new); - return true; -} - -/***====================================================================***/ - -static void -MergeIncludedSymbols(SymbolsInfo *into, SymbolsInfo *from, - enum merge_mode merge) -{ - xkb_atom_t *group_name; - xkb_layout_index_t group_names_in_both; - - if (from->errorCount > 0) { - into->errorCount += from->errorCount; - return; - } - - into->mods = from->mods; - - if (into->name == NULL) { - into->name = from->name; - from->name = NULL; - } - - group_names_in_both = MIN(darray_size(into->group_names), - darray_size(from->group_names)); - for (xkb_layout_index_t i = 0; i < group_names_in_both; i++) { - if (!darray_item(from->group_names, i)) - continue; - - if (merge == MERGE_AUGMENT && darray_item(into->group_names, i)) - continue; - - darray_item(into->group_names, i) = darray_item(from->group_names, i); - } - /* If @from has more, get them as well. */ - darray_foreach_from(group_name, from->group_names, group_names_in_both) - darray_append(into->group_names, *group_name); - - if (darray_empty(into->keys)) { - into->keys = from->keys; - darray_init(from->keys); - } - else { - KeyInfo *keyi; - darray_foreach(keyi, from->keys) { - keyi->merge = (merge == MERGE_DEFAULT ? keyi->merge : merge); - if (!AddKeySymbols(into, keyi, false)) - into->errorCount++; - } - } - - if (darray_empty(into->modmaps)) { - into->modmaps = from->modmaps; - darray_init(from->modmaps); - } - else { - ModMapEntry *mm; - darray_foreach(mm, from->modmaps) { - mm->merge = (merge == MERGE_DEFAULT ? mm->merge : merge); - if (!AddModMapEntry(into, mm)) - into->errorCount++; - } - } -} - -static void -HandleSymbolsFile(SymbolsInfo *info, XkbFile *file, enum merge_mode merge); - -static bool -HandleIncludeSymbols(SymbolsInfo *info, IncludeStmt *include) -{ - SymbolsInfo included; - - InitSymbolsInfo(&included, info->keymap, info->actions, &info->mods); - included.name = include->stmt; - include->stmt = NULL; - - for (IncludeStmt *stmt = include; stmt; stmt = stmt->next_incl) { - SymbolsInfo next_incl; - XkbFile *file; - - file = ProcessIncludeFile(info->ctx, stmt, FILE_TYPE_SYMBOLS); - if (!file) { - info->errorCount += 10; - ClearSymbolsInfo(&included); - return false; - } - - InitSymbolsInfo(&next_incl, info->keymap, info->actions, - &included.mods); - if (stmt->modifier) { - next_incl.explicit_group = atoi(stmt->modifier) - 1; - if (next_incl.explicit_group >= XKB_MAX_GROUPS) { - log_err(info->ctx, - "Cannot set explicit group to %d - must be between 1..%d; " - "Ignoring group number\n", - next_incl.explicit_group + 1, XKB_MAX_GROUPS); - next_incl.explicit_group = info->explicit_group; - } - } - else { - next_incl.explicit_group = info->explicit_group; - } - - HandleSymbolsFile(&next_incl, file, MERGE_OVERRIDE); - - MergeIncludedSymbols(&included, &next_incl, stmt->merge); - - ClearSymbolsInfo(&next_incl); - FreeXkbFile(file); - } - - MergeIncludedSymbols(info, &included, include->merge); - ClearSymbolsInfo(&included); - - return (info->errorCount == 0); -} - -#define SYMBOLS 1 -#define ACTIONS 2 - -static bool -GetGroupIndex(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, - unsigned what, xkb_layout_index_t *ndx_rtrn) -{ - const char *name = (what == SYMBOLS ? "symbols" : "actions"); - - if (arrayNdx == NULL) { - xkb_layout_index_t i; - GroupInfo *groupi; - enum group_field field = (what == SYMBOLS ? - GROUP_FIELD_SYMS : GROUP_FIELD_ACTS); - - darray_enumerate(i, groupi, keyi->groups) { - if (!(groupi->defined & field)) { - *ndx_rtrn = i; - return true; - } - } - - if (i >= XKB_MAX_GROUPS) { - log_err(info->ctx, - "Too many groups of %s for key %s (max %u); " - "Ignoring %s defined for extra groups\n", - name, KeyInfoText(info, keyi), XKB_MAX_GROUPS, name); - return false; - } - - darray_resize0(keyi->groups, darray_size(keyi->groups) + 1); - *ndx_rtrn = darray_size(keyi->groups) - 1; - return true; - } - - if (!ExprResolveGroup(info->ctx, arrayNdx, ndx_rtrn)) { - log_err(info->ctx, - "Illegal group index for %s of key %s\n" - "Definition with non-integer array index ignored\n", - name, KeyInfoText(info, keyi)); - return false; - } - - (*ndx_rtrn)--; - if (*ndx_rtrn >= darray_size(keyi->groups)) - darray_resize0(keyi->groups, *ndx_rtrn + 1); - - return true; -} - -static bool -AddSymbolsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, - ExprDef *value) -{ - xkb_layout_index_t ndx; - GroupInfo *groupi; - xkb_level_index_t nLevels; - - if (!GetGroupIndex(info, keyi, arrayNdx, SYMBOLS, &ndx)) - return false; - - groupi = &darray_item(keyi->groups, ndx); - - if (value == NULL) { - groupi->defined |= GROUP_FIELD_SYMS; - return true; - } - - if (value->expr.op != EXPR_KEYSYM_LIST) { - log_err(info->ctx, - "Expected a list of symbols, found %s; " - "Ignoring symbols for group %u of %s\n", - expr_op_type_to_string(value->expr.op), ndx + 1, - KeyInfoText(info, keyi)); - return false; - } - - if (groupi->defined & GROUP_FIELD_SYMS) { - log_err(info->ctx, - "Symbols for key %s, group %u already defined; " - "Ignoring duplicate definition\n", - KeyInfoText(info, keyi), ndx + 1); - return false; - } - - nLevels = darray_size(value->keysym_list.symsMapIndex); - if (darray_size(groupi->levels) < nLevels) - darray_resize0(groupi->levels, nLevels); - - groupi->defined |= GROUP_FIELD_SYMS; - - for (xkb_level_index_t i = 0; i < nLevels; i++) { - unsigned int sym_index; - struct xkb_level *leveli = &darray_item(groupi->levels, i); - - sym_index = darray_item(value->keysym_list.symsMapIndex, i); - leveli->num_syms = darray_item(value->keysym_list.symsNumEntries, i); - if (leveli->num_syms > 1) - leveli->u.syms = calloc(leveli->num_syms, sizeof(*leveli->u.syms)); - - for (unsigned j = 0; j < leveli->num_syms; j++) { - xkb_keysym_t keysym = darray_item(value->keysym_list.syms, - sym_index + j); - - if (leveli->num_syms == 1) { - if (keysym == XKB_KEY_NoSymbol) - leveli->num_syms = 0; - else - leveli->u.sym = keysym; - } - else if (leveli->num_syms > 1) { - leveli->u.syms[j] = keysym; - } - } - } - - return true; -} - -static bool -AddActionsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, - ExprDef *value) -{ - xkb_layout_index_t ndx; - GroupInfo *groupi; - unsigned int nActs; - ExprDef *act; - - if (!GetGroupIndex(info, keyi, arrayNdx, ACTIONS, &ndx)) - return false; - - groupi = &darray_item(keyi->groups, ndx); - - if (value == NULL) { - groupi->defined |= GROUP_FIELD_ACTS; - return true; - } - - if (value->expr.op != EXPR_ACTION_LIST) { - log_wsgo(info->ctx, - "Bad expression type (%d) for action list value; " - "Ignoring actions for group %u of %s\n", - value->expr.op, ndx, KeyInfoText(info, keyi)); - return false; - } - - if (groupi->defined & GROUP_FIELD_ACTS) { - log_wsgo(info->ctx, - "Actions for key %s, group %u already defined\n", - KeyInfoText(info, keyi), ndx); - return false; - } - - nActs = 0; - for (act = value->unary.child; act; act = (ExprDef *) act->common.next) - nActs++; - - if (darray_size(groupi->levels) < nActs) - darray_resize0(groupi->levels, nActs); - - groupi->defined |= GROUP_FIELD_ACTS; - - act = value->unary.child; - for (unsigned i = 0; i < nActs; i++) { - union xkb_action *toAct = &darray_item(groupi->levels, i).action; - - if (!HandleActionDef(info->ctx, info->actions, &info->mods, act, toAct)) - log_err(info->ctx, - "Illegal action definition for %s; " - "Action for group %u/level %u ignored\n", - KeyInfoText(info, keyi), ndx + 1, i + 1); - - act = (ExprDef *) act->common.next; - } - - return true; -} - -static const LookupEntry repeatEntries[] = { - { "true", KEY_REPEAT_YES }, - { "yes", KEY_REPEAT_YES }, - { "on", KEY_REPEAT_YES }, - { "false", KEY_REPEAT_NO }, - { "no", KEY_REPEAT_NO }, - { "off", KEY_REPEAT_NO }, - { "default", KEY_REPEAT_UNDEFINED }, - { NULL, 0 } -}; - -static bool -SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field, - ExprDef *arrayNdx, ExprDef *value) -{ - if (istreq(field, "type")) { - xkb_layout_index_t ndx; - xkb_atom_t val; - - if (!ExprResolveString(info->ctx, value, &val)) { - log_err(info->ctx, - "The type field of a key symbol map must be a string; " - "Ignoring illegal type definition\n"); - return false; - } - - if (!arrayNdx) { - keyi->default_type = val; - keyi->defined |= KEY_FIELD_DEFAULT_TYPE; - } - else if (!ExprResolveGroup(info->ctx, arrayNdx, &ndx)) { - log_err(info->ctx, - "Illegal group index for type of key %s; " - "Definition with non-integer array index ignored\n", - KeyInfoText(info, keyi)); - return false; - } - else { - ndx--; - if (ndx >= darray_size(keyi->groups)) - darray_resize0(keyi->groups, ndx + 1); - darray_item(keyi->groups, ndx).type = val; - darray_item(keyi->groups, ndx).defined |= GROUP_FIELD_TYPE; - } - } - else if (istreq(field, "symbols")) { - return AddSymbolsToKey(info, keyi, arrayNdx, value); - } - else if (istreq(field, "actions")) { - return AddActionsToKey(info, keyi, arrayNdx, value); - } - else if (istreq(field, "vmods") || - istreq(field, "virtualmods") || - istreq(field, "virtualmodifiers")) { - xkb_mod_mask_t mask; - - if (!ExprResolveModMask(info->ctx, value, MOD_VIRT, &info->mods, - &mask)) { - log_err(info->ctx, - "Expected a virtual modifier mask, found %s; " - "Ignoring virtual modifiers definition for key %s\n", - expr_op_type_to_string(value->expr.op), - KeyInfoText(info, keyi)); - return false; - } - - keyi->vmodmap = mask; - keyi->defined |= KEY_FIELD_VMODMAP; - } - else if (istreq(field, "locking") || - istreq(field, "lock") || - istreq(field, "locks")) { - log_vrb(info->ctx, 1, - "Key behaviors not supported; " - "Ignoring locking specification for key %s\n", - KeyInfoText(info, keyi)); - } - else if (istreq(field, "radiogroup") || - istreq(field, "permanentradiogroup") || - istreq(field, "allownone")) { - log_vrb(info->ctx, 1, - "Radio groups not supported; " - "Ignoring radio group specification for key %s\n", - KeyInfoText(info, keyi)); - } - else if (istreq_prefix("overlay", field) || - istreq_prefix("permanentoverlay", field)) { - log_vrb(info->ctx, 1, - "Overlays not supported; " - "Ignoring overlay specification for key %s\n", - KeyInfoText(info, keyi)); - } - else if (istreq(field, "repeating") || - istreq(field, "repeats") || - istreq(field, "repeat")) { - unsigned int val; - - if (!ExprResolveEnum(info->ctx, value, &val, repeatEntries)) { - log_err(info->ctx, - "Illegal repeat setting for %s; " - "Non-boolean repeat setting ignored\n", - KeyInfoText(info, keyi)); - return false; - } - - keyi->repeat = val; - keyi->defined |= KEY_FIELD_REPEAT; - } - else if (istreq(field, "groupswrap") || - istreq(field, "wrapgroups")) { - bool set; - - if (!ExprResolveBoolean(info->ctx, value, &set)) { - log_err(info->ctx, - "Illegal groupsWrap setting for %s; " - "Non-boolean value ignored\n", - KeyInfoText(info, keyi)); - return false; - } - - keyi->out_of_range_group_action = (set ? RANGE_WRAP : RANGE_SATURATE); - keyi->defined |= KEY_FIELD_GROUPINFO; - } - else if (istreq(field, "groupsclamp") || - istreq(field, "clampgroups")) { - bool set; - - if (!ExprResolveBoolean(info->ctx, value, &set)) { - log_err(info->ctx, - "Illegal groupsClamp setting for %s; " - "Non-boolean value ignored\n", - KeyInfoText(info, keyi)); - return false; - } - - keyi->out_of_range_group_action = (set ? RANGE_SATURATE : RANGE_WRAP); - keyi->defined |= KEY_FIELD_GROUPINFO; - } - else if (istreq(field, "groupsredirect") || - istreq(field, "redirectgroups")) { - xkb_layout_index_t grp; - - if (!ExprResolveGroup(info->ctx, value, &grp)) { - log_err(info->ctx, - "Illegal group index for redirect of key %s; " - "Definition with non-integer group ignored\n", - KeyInfoText(info, keyi)); - return false; - } - - keyi->out_of_range_group_action = RANGE_REDIRECT; - keyi->out_of_range_group_number = grp - 1; - keyi->defined |= KEY_FIELD_GROUPINFO; - } - else { - log_err(info->ctx, - "Unknown field %s in a symbol interpretation; " - "Definition ignored\n", - field); - return false; - } - - return true; -} - -static bool -SetGroupName(SymbolsInfo *info, ExprDef *arrayNdx, ExprDef *value) -{ - xkb_layout_index_t group, group_to_use; - xkb_atom_t name; - - if (!arrayNdx) { - log_vrb(info->ctx, 1, - "You must specify an index when specifying a group name; " - "Group name definition without array subscript ignored\n"); - return false; - } - - if (!ExprResolveGroup(info->ctx, arrayNdx, &group)) { - log_err(info->ctx, - "Illegal index in group name definition; " - "Definition with non-integer array index ignored\n"); - return false; - } - - if (!ExprResolveString(info->ctx, value, &name)) { - log_err(info->ctx, - "Group name must be a string; " - "Illegal name for group %d ignored\n", group); - return false; - } - - if (info->explicit_group == XKB_LAYOUT_INVALID) { - group_to_use = group - 1; - } - else if (group - 1 == 0) { - group_to_use = info->explicit_group; - } - else { - log_warn(info->ctx, - "An explicit group was specified for the '%s' map, " - "but it provides a name for a group other than Group1 (%d); " - "Ignoring group name '%s'\n", - info->name, group, - xkb_atom_text(info->ctx, name)); - return false; - } - - if (group_to_use >= darray_size(info->group_names)) - darray_resize0(info->group_names, group_to_use + 1); - darray_item(info->group_names, group_to_use) = name; - - return true; -} - -static bool -HandleGlobalVar(SymbolsInfo *info, VarDef *stmt) -{ - const char *elem, *field; - ExprDef *arrayNdx; - bool ret; - - if (!ExprResolveLhs(info->ctx, stmt->name, &elem, &field, &arrayNdx)) - return false; - - if (elem && istreq(elem, "key")) { - ret = SetSymbolsField(info, &info->default_key, field, arrayNdx, - stmt->value); - } - else if (!elem && (istreq(field, "name") || - istreq(field, "groupname"))) { - ret = SetGroupName(info, arrayNdx, stmt->value); - } - else if (!elem && (istreq(field, "groupswrap") || - istreq(field, "wrapgroups"))) { - log_err(info->ctx, - "Global \"groupswrap\" not supported; Ignored\n"); - ret = true; - } - else if (!elem && (istreq(field, "groupsclamp") || - istreq(field, "clampgroups"))) { - log_err(info->ctx, - "Global \"groupsclamp\" not supported; Ignored\n"); - ret = true; - } - else if (!elem && (istreq(field, "groupsredirect") || - istreq(field, "redirectgroups"))) { - log_err(info->ctx, - "Global \"groupsredirect\" not supported; Ignored\n"); - ret = true; - } - else if (!elem && istreq(field, "allownone")) { - log_err(info->ctx, - "Radio groups not supported; " - "Ignoring \"allownone\" specification\n"); - ret = true; - } - else { - ret = SetActionField(info->ctx, info->actions, &info->mods, - elem, field, arrayNdx, stmt->value); - } - - return ret; -} - -static bool -HandleSymbolsBody(SymbolsInfo *info, VarDef *def, KeyInfo *keyi) -{ - bool ok = true; - const char *elem, *field; - ExprDef *arrayNdx; - - for (; def; def = (VarDef *) def->common.next) { - if (def->name && def->name->expr.op == EXPR_FIELD_REF) { - log_err(info->ctx, - "Cannot set a global default value from within a key statement; " - "Move statements to the global file scope\n"); - continue; - } - - if (!def->name) { - if (!def->value || def->value->expr.op == EXPR_KEYSYM_LIST) - field = "symbols"; - else - field = "actions"; - arrayNdx = NULL; - } - else { - ok = ExprResolveLhs(info->ctx, def->name, &elem, &field, - &arrayNdx); - } - - if (ok) - ok = SetSymbolsField(info, keyi, field, arrayNdx, def->value); - } - - return ok; -} - -static bool -SetExplicitGroup(SymbolsInfo *info, KeyInfo *keyi) -{ - xkb_layout_index_t i; - GroupInfo *groupi; - bool warn = false; - - if (info->explicit_group == XKB_LAYOUT_INVALID) - return true; - - darray_enumerate_from(i, groupi, keyi->groups, 1) { - if (groupi->defined) { - warn = true; - ClearGroupInfo(groupi); - InitGroupInfo(groupi); - } - } - - if (warn) - log_warn(info->ctx, - "For the map %s an explicit group specified, " - "but key %s has more than one group defined; " - "All groups except first one will be ignored\n", - info->name, KeyInfoText(info, keyi)); - - darray_resize0(keyi->groups, info->explicit_group + 1); - if (info->explicit_group > 0) { - darray_item(keyi->groups, info->explicit_group) = - darray_item(keyi->groups, 0); - InitGroupInfo(&darray_item(keyi->groups, 0)); - } - - return true; -} - -static bool -HandleSymbolsDef(SymbolsInfo *info, SymbolsDef *stmt) -{ - KeyInfo keyi; - - keyi = info->default_key; - darray_init(keyi.groups); - darray_copy(keyi.groups, info->default_key.groups); - for (xkb_layout_index_t i = 0; i < darray_size(keyi.groups); i++) - CopyGroupInfo(&darray_item(keyi.groups, i), - &darray_item(info->default_key.groups, i)); - keyi.merge = stmt->merge; - keyi.name = stmt->keyName; - - if (!HandleSymbolsBody(info, stmt->symbols, &keyi)) { - info->errorCount++; - return false; - } - - if (!SetExplicitGroup(info, &keyi)) { - info->errorCount++; - return false; - } - - if (!AddKeySymbols(info, &keyi, true)) { - info->errorCount++; - return false; - } - - return true; -} - -static bool -HandleModMapDef(SymbolsInfo *info, ModMapDef *def) -{ - ModMapEntry tmp; - xkb_mod_index_t ndx; - bool ok; - struct xkb_context *ctx = info->ctx; - - ndx = XkbModNameToIndex(&info->mods, def->modifier, MOD_REAL); - if (ndx == XKB_MOD_INVALID) { - log_err(info->ctx, - "Illegal modifier map definition; " - "Ignoring map for non-modifier \"%s\"\n", - xkb_atom_text(ctx, def->modifier)); - return false; - } - - ok = true; - tmp.modifier = ndx; - tmp.merge = def->merge; - - for (ExprDef *key = def->keys; key; key = (ExprDef *) key->common.next) { - xkb_keysym_t sym; - - if (key->expr.op == EXPR_VALUE && - key->expr.value_type == EXPR_TYPE_KEYNAME) { - tmp.haveSymbol = false; - tmp.u.keyName = key->key_name.key_name; - } - else if (ExprResolveKeySym(ctx, key, &sym)) { - tmp.haveSymbol = true; - tmp.u.keySym = sym; - } - else { - log_err(info->ctx, - "Modmap entries may contain only key names or keysyms; " - "Illegal definition for %s modifier ignored\n", - ModIndexText(info->ctx, &info->mods, tmp.modifier)); - continue; - } - - ok = AddModMapEntry(info, &tmp) && ok; - } - return ok; -} - -static void -HandleSymbolsFile(SymbolsInfo *info, XkbFile *file, enum merge_mode merge) -{ - bool ok; - - free(info->name); - info->name = strdup_safe(file->name); - - for (ParseCommon *stmt = file->defs; stmt; stmt = stmt->next) { - switch (stmt->type) { - case STMT_INCLUDE: - ok = HandleIncludeSymbols(info, (IncludeStmt *) stmt); - break; - case STMT_SYMBOLS: - ok = HandleSymbolsDef(info, (SymbolsDef *) stmt); - break; - case STMT_VAR: - ok = HandleGlobalVar(info, (VarDef *) stmt); - break; - case STMT_VMOD: - ok = HandleVModDef(info->ctx, &info->mods, (VModDef *) stmt, merge); - break; - case STMT_MODMAP: - ok = HandleModMapDef(info, (ModMapDef *) stmt); - break; - default: - log_err(info->ctx, - "Symbols files may not include other types; " - "Ignoring %s\n", stmt_type_to_string(stmt->type)); - ok = false; - break; - } - - if (!ok) - info->errorCount++; - - if (info->errorCount > 10) { - log_err(info->ctx, "Abandoning symbols file \"%s\"\n", - file->name); - break; - } - } -} - -/** - * Given a keysym @sym, return a key which generates it, or NULL. - * This is used for example in a modifier map definition, such as: - * modifier_map Lock { Caps_Lock }; - * where we want to add the Lock modifier to the modmap of the key - * which matches the keysym Caps_Lock. - * Since there can be many keys which generates the keysym, the key - * is chosen first by lowest group in which the keysym appears, than - * by lowest level and than by lowest key code. - */ -static struct xkb_key * -FindKeyForSymbol(struct xkb_keymap *keymap, xkb_keysym_t sym) -{ - struct xkb_key *key; - xkb_layout_index_t group; - bool got_one_group, got_one_level; - - group = 0; - do { - xkb_level_index_t level = 0; - got_one_group = false; - do { - got_one_level = false; - xkb_keys_foreach(key, keymap) { - if (group < key->num_groups && - level < XkbKeyNumLevels(key, group)) { - got_one_group = got_one_level = true; - if (key->groups[group].levels[level].num_syms == 1 && - key->groups[group].levels[level].u.sym == sym) - return key; - } - } - level++; - } while (got_one_level); - group++; - } while (got_one_group); - - return NULL; -} - -/* - * Find an appropriate type for a group and return its name. - * - * Simple recipe: - * - ONE_LEVEL for width 0/1 - * - ALPHABETIC for 2 shift levels, with lower/upercase keysyms - * - KEYPAD for keypad keys. - * - TWO_LEVEL for other 2 shift level keys. - * and the same for four level keys. - * - * FIXME: Decide how to handle multiple-syms-per-level, and do it. - */ -static xkb_atom_t -FindAutomaticType(struct xkb_context *ctx, GroupInfo *groupi) -{ - xkb_keysym_t sym0, sym1; - const xkb_level_index_t width = darray_size(groupi->levels); - -#define GET_SYM(level) \ - (darray_item(groupi->levels, level).num_syms == 0 ? \ - XKB_KEY_NoSymbol : \ - darray_item(groupi->levels, level).num_syms == 1 ? \ - darray_item(groupi->levels, level).u.sym : \ - /* num_syms > 1 */ \ - darray_item(groupi->levels, level).u.syms[0]) - - if (width == 1 || width <= 0) - return xkb_atom_intern_literal(ctx, "ONE_LEVEL"); - - sym0 = GET_SYM(0); - sym1 = GET_SYM(1); - - if (width == 2) { - if (xkb_keysym_is_lower(sym0) && xkb_keysym_is_upper(sym1)) - return xkb_atom_intern_literal(ctx, "ALPHABETIC"); - - if (xkb_keysym_is_keypad(sym0) || xkb_keysym_is_keypad(sym1)) - return xkb_atom_intern_literal(ctx, "KEYPAD"); - - return xkb_atom_intern_literal(ctx, "TWO_LEVEL"); - } - - if (width <= 4) { - if (xkb_keysym_is_lower(sym0) && xkb_keysym_is_upper(sym1)) { - xkb_keysym_t sym2, sym3; - sym2 = GET_SYM(2); - sym3 = (width == 4 ? GET_SYM(3) : XKB_KEY_NoSymbol); - - if (xkb_keysym_is_lower(sym2) && xkb_keysym_is_upper(sym3)) - return xkb_atom_intern_literal(ctx, "FOUR_LEVEL_ALPHABETIC"); - - return xkb_atom_intern_literal(ctx, "FOUR_LEVEL_SEMIALPHABETIC"); - } - - if (xkb_keysym_is_keypad(sym0) || xkb_keysym_is_keypad(sym1)) - return xkb_atom_intern_literal(ctx, "FOUR_LEVEL_KEYPAD"); - - return xkb_atom_intern_literal(ctx, "FOUR_LEVEL"); - } - - return XKB_ATOM_NONE; - -#undef GET_SYM -} - -static const struct xkb_key_type * -FindTypeForGroup(struct xkb_keymap *keymap, KeyInfo *keyi, - xkb_layout_index_t group, bool *explicit_type) -{ - unsigned int i; - GroupInfo *groupi = &darray_item(keyi->groups, group); - xkb_atom_t type_name = groupi->type; - - *explicit_type = true; - - if (type_name == XKB_ATOM_NONE) { - if (keyi->default_type != XKB_ATOM_NONE) { - type_name = keyi->default_type; - } - else { - type_name = FindAutomaticType(keymap->ctx, groupi); - if (type_name != XKB_ATOM_NONE) - *explicit_type = false; - } - } - - if (type_name == XKB_ATOM_NONE) { - log_warn(keymap->ctx, - "Couldn't find an automatic type for key '%s' group %d with %lu levels; " - "Using the default type\n", - KeyNameText(keymap->ctx, keyi->name), group + 1, - (unsigned long) darray_size(groupi->levels)); - goto use_default; - } - - for (i = 0; i < keymap->num_types; i++) - if (keymap->types[i].name == type_name) - break; - - if (i >= keymap->num_types) { - log_warn(keymap->ctx, - "The type \"%s\" for key '%s' group %d was not previously defined; " - "Using the default type\n", - xkb_atom_text(keymap->ctx, type_name), - KeyNameText(keymap->ctx, keyi->name), group + 1); - goto use_default; - } - - return &keymap->types[i]; - -use_default: - /* - * Index 0 is guaranteed to contain something, usually - * ONE_LEVEL or at least some default one-level type. - */ - return &keymap->types[0]; -} - -static bool -CopySymbolsDefToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info, - KeyInfo *keyi) -{ - struct xkb_key *key; - GroupInfo *groupi; - const GroupInfo *group0; - xkb_layout_index_t i; - - /* - * The name is guaranteed to be real and not an alias (see - * AddKeySymbols), so 'false' is safe here. - */ - key = XkbKeyByName(keymap, keyi->name, false); - if (!key) { - log_vrb(info->ctx, 5, - "Key %s not found in keycodes; Symbols ignored\n", - KeyInfoText(info, keyi)); - return false; - } - - /* Find the range of groups we need. */ - key->num_groups = 0; - darray_enumerate(i, groupi, keyi->groups) - if (groupi->defined) - key->num_groups = i + 1; - - if (key->num_groups <= 0) - return false; /* WSGO */ - - darray_resize(keyi->groups, key->num_groups); - - /* - * If there are empty groups between non-empty ones, fill them with data - * from the first group. - * We can make a wrong assumption here. But leaving gaps is worse. - */ - group0 = &darray_item(keyi->groups, 0); - darray_foreach_from(groupi, keyi->groups, 1) { - if (groupi->defined) - continue; - - CopyGroupInfo(groupi, group0); - } - - key->groups = calloc(key->num_groups, sizeof(*key->groups)); - - /* Find and assign the groups' types in the keymap. */ - darray_enumerate(i, groupi, keyi->groups) { - const struct xkb_key_type *type; - bool explicit_type; - - type = FindTypeForGroup(keymap, keyi, i, &explicit_type); - - /* Always have as many levels as the type specifies. */ - if (type->num_levels < darray_size(groupi->levels)) { - struct xkb_level *leveli; - - log_vrb(info->ctx, 1, - "Type \"%s\" has %d levels, but %s has %d levels; " - "Ignoring extra symbols\n", - xkb_atom_text(keymap->ctx, type->name), type->num_levels, - KeyInfoText(info, keyi), - (int) darray_size(groupi->levels)); - - darray_foreach_from(leveli, groupi->levels, type->num_levels) - ClearLevelInfo(leveli); - } - darray_resize0(groupi->levels, type->num_levels); - - key->groups[i].explicit_type = explicit_type; - key->groups[i].type = type; - } - - /* Copy levels. */ - darray_enumerate(i, groupi, keyi->groups) - darray_steal(groupi->levels, &key->groups[i].levels, NULL); - - key->out_of_range_group_number = keyi->out_of_range_group_number; - key->out_of_range_group_action = keyi->out_of_range_group_action; - - if (keyi->defined & KEY_FIELD_VMODMAP) { - key->vmodmap = keyi->vmodmap; - key->explicit |= EXPLICIT_VMODMAP; - } - - if (keyi->repeat != KEY_REPEAT_UNDEFINED) { - key->repeats = (keyi->repeat == KEY_REPEAT_YES); - key->explicit |= EXPLICIT_REPEAT; - } - - darray_foreach(groupi, keyi->groups) { - if (groupi->defined & GROUP_FIELD_ACTS) { - key->explicit |= EXPLICIT_INTERP; - break; - } - } - - return true; -} - -static bool -CopyModMapDefToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info, - ModMapEntry *entry) -{ - struct xkb_key *key; - - if (!entry->haveSymbol) { - key = XkbKeyByName(keymap, entry->u.keyName, true); - if (!key) { - log_vrb(info->ctx, 5, - "Key %s not found in keycodes; " - "Modifier map entry for %s not updated\n", - KeyNameText(info->ctx, entry->u.keyName), - ModIndexText(info->ctx, &info->mods, entry->modifier)); - return false; - } - } - else { - key = FindKeyForSymbol(keymap, entry->u.keySym); - if (!key) { - log_vrb(info->ctx, 5, - "Key \"%s\" not found in symbol map; " - "Modifier map entry for %s not updated\n", - KeysymText(info->ctx, entry->u.keySym), - ModIndexText(info->ctx, &info->mods, entry->modifier)); - return false; - } - } - - key->modmap |= (1u << entry->modifier); - return true; -} - -static bool -CopySymbolsToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info) -{ - KeyInfo *keyi; - ModMapEntry *mm; - - keymap->symbols_section_name = strdup_safe(info->name); - XkbEscapeMapName(keymap->symbols_section_name); - - keymap->mods = info->mods; - - darray_steal(info->group_names, - &keymap->group_names, &keymap->num_group_names); - - darray_foreach(keyi, info->keys) - if (!CopySymbolsDefToKeymap(keymap, info, keyi)) - info->errorCount++; - - if (xkb_context_get_log_verbosity(keymap->ctx) > 3) { - struct xkb_key *key; - - xkb_keys_foreach(key, keymap) { - if (key->name == XKB_ATOM_NONE) - continue; - - if (key->num_groups < 1) - log_info(info->ctx, - "No symbols defined for %s\n", - KeyNameText(info->ctx, key->name)); - } - } - - darray_foreach(mm, info->modmaps) - if (!CopyModMapDefToKeymap(keymap, info, mm)) - info->errorCount++; - - /* XXX: If we don't ignore errorCount, things break. */ - return true; -} - -bool -CompileSymbols(XkbFile *file, struct xkb_keymap *keymap, - enum merge_mode merge) -{ - SymbolsInfo info; - ActionsInfo *actions; - - actions = NewActionsInfo(); - if (!actions) - return false; - - InitSymbolsInfo(&info, keymap, actions, &keymap->mods); - info.default_key.merge = merge; - - HandleSymbolsFile(&info, file, merge); - - if (info.errorCount != 0) - goto err_info; - - if (!CopySymbolsToKeymap(keymap, &info)) - goto err_info; - - ClearSymbolsInfo(&info); - FreeActionsInfo(actions); - return true; - -err_info: - FreeActionsInfo(actions); - ClearSymbolsInfo(&info); - return false; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/types.c b/src/3rdparty/xkbcommon/src/xkbcomp/types.c deleted file mode 100644 index e85b67e893..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/types.c +++ /dev/null @@ -1,742 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#include "xkbcomp-priv.h" -#include "text.h" -#include "vmod.h" -#include "expr.h" -#include "include.h" - -enum type_field { - TYPE_FIELD_MASK = (1 << 0), - TYPE_FIELD_MAP = (1 << 1), - TYPE_FIELD_PRESERVE = (1 << 2), - TYPE_FIELD_LEVEL_NAME = (1 << 3), -}; - -typedef struct { - enum type_field defined; - enum merge_mode merge; - - xkb_atom_t name; - xkb_mod_mask_t mods; - xkb_level_index_t num_levels; - darray(struct xkb_key_type_entry) entries; - darray(xkb_atom_t) level_names; -} KeyTypeInfo; - -typedef struct { - char *name; - int errorCount; - - darray(KeyTypeInfo) types; - struct xkb_mod_set mods; - - struct xkb_context *ctx; -} KeyTypesInfo; - -/***====================================================================***/ - -static inline const char * -MapEntryTxt(KeyTypesInfo *info, struct xkb_key_type_entry *entry) -{ - return ModMaskText(info->ctx, &info->mods, entry->mods.mods); -} - -static inline const char * -TypeTxt(KeyTypesInfo *info, KeyTypeInfo *type) -{ - return xkb_atom_text(info->ctx, type->name); -} - -static inline const char * -TypeMaskTxt(KeyTypesInfo *info, KeyTypeInfo *type) -{ - return ModMaskText(info->ctx, &info->mods, type->mods); -} - -static inline bool -ReportTypeShouldBeArray(KeyTypesInfo *info, KeyTypeInfo *type, - const char *field) -{ - return ReportShouldBeArray(info->ctx, "key type", field, - TypeTxt(info, type)); -} - -static inline bool -ReportTypeBadType(KeyTypesInfo *info, KeyTypeInfo *type, - const char *field, const char *wanted) -{ - return ReportBadType(info->ctx, "key type", field, - TypeTxt(info, type), wanted); -} - -/***====================================================================***/ - -static void -InitKeyTypesInfo(KeyTypesInfo *info, struct xkb_context *ctx, - const struct xkb_mod_set *mods) -{ - memset(info, 0, sizeof(*info)); - info->ctx = ctx; - info->mods = *mods; -} - -static void -ClearKeyTypeInfo(KeyTypeInfo *type) -{ - darray_free(type->entries); - darray_free(type->level_names); -} - -static void -ClearKeyTypesInfo(KeyTypesInfo *info) -{ - free(info->name); - darray_free(info->types); -} - -static KeyTypeInfo * -FindMatchingKeyType(KeyTypesInfo *info, xkb_atom_t name) -{ - KeyTypeInfo *old; - - darray_foreach(old, info->types) - if (old->name == name) - return old; - - return NULL; -} - -static bool -AddKeyType(KeyTypesInfo *info, KeyTypeInfo *new, bool same_file) -{ - KeyTypeInfo *old; - const int verbosity = xkb_context_get_log_verbosity(info->ctx); - - old = FindMatchingKeyType(info, new->name); - if (old) { - if (new->merge == MERGE_REPLACE || new->merge == MERGE_OVERRIDE) { - if ((same_file && verbosity > 0) || verbosity > 9) { - log_warn(info->ctx, - "Multiple definitions of the %s key type; " - "Earlier definition ignored\n", - xkb_atom_text(info->ctx, new->name)); - } - - ClearKeyTypeInfo(old); - *old = *new; - darray_init(new->entries); - darray_init(new->level_names); - return true; - } - - if (same_file) - log_vrb(info->ctx, 4, - "Multiple definitions of the %s key type; " - "Later definition ignored\n", - xkb_atom_text(info->ctx, new->name)); - - ClearKeyTypeInfo(new); - return true; - } - - darray_append(info->types, *new); - return true; -} - -/***====================================================================***/ - -static void -MergeIncludedKeyTypes(KeyTypesInfo *into, KeyTypesInfo *from, - enum merge_mode merge) -{ - if (from->errorCount > 0) { - into->errorCount += from->errorCount; - return; - } - - into->mods = from->mods; - - if (into->name == NULL) { - into->name = from->name; - from->name = NULL; - } - - if (darray_empty(into->types)) { - into->types = from->types; - darray_init(from->types); - } - else { - KeyTypeInfo *type; - darray_foreach(type, from->types) { - type->merge = (merge == MERGE_DEFAULT ? type->merge : merge); - if (!AddKeyType(into, type, false)) - into->errorCount++; - } - } -} - -static void -HandleKeyTypesFile(KeyTypesInfo *info, XkbFile *file, enum merge_mode merge); - -static bool -HandleIncludeKeyTypes(KeyTypesInfo *info, IncludeStmt *include) -{ - KeyTypesInfo included; - - InitKeyTypesInfo(&included, info->ctx, &info->mods); - included.name = include->stmt; - include->stmt = NULL; - - for (IncludeStmt *stmt = include; stmt; stmt = stmt->next_incl) { - KeyTypesInfo next_incl; - XkbFile *file; - - file = ProcessIncludeFile(info->ctx, stmt, FILE_TYPE_TYPES); - if (!file) { - info->errorCount += 10; - ClearKeyTypesInfo(&included); - return false; - } - - InitKeyTypesInfo(&next_incl, info->ctx, &included.mods); - - HandleKeyTypesFile(&next_incl, file, stmt->merge); - - MergeIncludedKeyTypes(&included, &next_incl, stmt->merge); - - ClearKeyTypesInfo(&next_incl); - FreeXkbFile(file); - } - - MergeIncludedKeyTypes(info, &included, include->merge); - ClearKeyTypesInfo(&included); - - return (info->errorCount == 0); -} - -/***====================================================================***/ - -static bool -SetModifiers(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, - ExprDef *value) -{ - xkb_mod_mask_t mods; - - if (arrayNdx) - log_warn(info->ctx, - "The modifiers field of a key type is not an array; " - "Illegal array subscript ignored\n"); - - if (!ExprResolveModMask(info->ctx, value, MOD_BOTH, &info->mods, &mods)) { - log_err(info->ctx, - "Key type mask field must be a modifier mask; " - "Key type definition ignored\n"); - return false; - } - - if (type->defined & TYPE_FIELD_MASK) { - log_warn(info->ctx, - "Multiple modifier mask definitions for key type %s; " - "Using %s, ignoring %s\n", - xkb_atom_text(info->ctx, type->name), - TypeMaskTxt(info, type), - ModMaskText(info->ctx, &info->mods, mods)); - return false; - } - - type->mods = mods; - return true; -} - -/***====================================================================***/ - -static struct xkb_key_type_entry * -FindMatchingMapEntry(KeyTypeInfo *type, xkb_mod_mask_t mods) -{ - struct xkb_key_type_entry *entry; - - darray_foreach(entry, type->entries) - if (entry->mods.mods == mods) - return entry; - - return NULL; -} - -static bool -AddMapEntry(KeyTypesInfo *info, KeyTypeInfo *type, - struct xkb_key_type_entry *new, bool clobber, bool report) -{ - struct xkb_key_type_entry *old; - - old = FindMatchingMapEntry(type, new->mods.mods); - if (old) { - if (report && old->level != new->level) { - log_warn(info->ctx, - "Multiple map entries for %s in %s; " - "Using %d, ignoring %d\n", - MapEntryTxt(info, new), TypeTxt(info, type), - (clobber ? new->level : old->level) + 1, - (clobber ? old->level : new->level) + 1); - } - else { - log_vrb(info->ctx, 10, - "Multiple occurrences of map[%s]= %d in %s; Ignored\n", - MapEntryTxt(info, new), new->level + 1, - TypeTxt(info, type)); - return true; - } - - if (clobber) { - if (new->level >= type->num_levels) - type->num_levels = new->level + 1; - old->level = new->level; - } - - return true; - } - - if (new->level >= type->num_levels) - type->num_levels = new->level + 1; - - darray_append(type->entries, *new); - return true; -} - -static bool -SetMapEntry(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, - ExprDef *value) -{ - struct xkb_key_type_entry entry; - - if (arrayNdx == NULL) - return ReportTypeShouldBeArray(info, type, "map entry"); - - if (!ExprResolveModMask(info->ctx, arrayNdx, MOD_BOTH, &info->mods, - &entry.mods.mods)) - return ReportTypeBadType(info, type, "map entry", "modifier mask"); - - if (entry.mods.mods & (~type->mods)) { - log_vrb(info->ctx, 1, - "Map entry for unused modifiers in %s; " - "Using %s instead of %s\n", - TypeTxt(info, type), - ModMaskText(info->ctx, &info->mods, - entry.mods.mods & type->mods), - MapEntryTxt(info, &entry)); - entry.mods.mods &= type->mods; - } - - if (!ExprResolveLevel(info->ctx, value, &entry.level)) { - log_err(info->ctx, - "Level specifications in a key type must be integer; " - "Ignoring malformed level specification\n"); - return false; - } - - entry.preserve.mods = 0; - - return AddMapEntry(info, type, &entry, true, true); -} - -/***====================================================================***/ - -static bool -AddPreserve(KeyTypesInfo *info, KeyTypeInfo *type, - xkb_mod_mask_t mods, xkb_mod_mask_t preserve_mods) -{ - struct xkb_key_type_entry *entry; - struct xkb_key_type_entry new; - - darray_foreach(entry, type->entries) { - if (entry->mods.mods != mods) - continue; - - /* Map exists without previous preserve (or "None"); override. */ - if (entry->preserve.mods == 0) { - entry->preserve.mods = preserve_mods; - return true; - } - - /* Map exists with same preserve; do nothing. */ - if (entry->preserve.mods == preserve_mods) { - log_vrb(info->ctx, 10, - "Identical definitions for preserve[%s] in %s; " - "Ignored\n", - ModMaskText(info->ctx, &info->mods, mods), - TypeTxt(info, type)); - return true; - } - - /* Map exists with different preserve; latter wins. */ - log_vrb(info->ctx, 1, - "Multiple definitions for preserve[%s] in %s; " - "Using %s, ignoring %s\n", - ModMaskText(info->ctx, &info->mods, mods), - TypeTxt(info, type), - ModMaskText(info->ctx, &info->mods, preserve_mods), - ModMaskText(info->ctx, &info->mods, entry->preserve.mods)); - - entry->preserve.mods = preserve_mods; - return true; - } - - /* - * Map does not exist, i.e. preserve[] came before map[]. - * Create a map with the specified mask mapping to Level1. The level - * may be overridden later with an explicit map[] statement. - */ - new.level = 0; - new.mods.mods = mods; - new.preserve.mods = preserve_mods; - darray_append(type->entries, new); - return true; -} - -static bool -SetPreserve(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, - ExprDef *value) -{ - xkb_mod_mask_t mods, preserve_mods; - - if (arrayNdx == NULL) - return ReportTypeShouldBeArray(info, type, "preserve entry"); - - if (!ExprResolveModMask(info->ctx, arrayNdx, MOD_BOTH, &info->mods, &mods)) - return ReportTypeBadType(info, type, "preserve entry", - "modifier mask"); - - if (mods & ~type->mods) { - const char *before, *after; - - before = ModMaskText(info->ctx, &info->mods, mods); - mods &= type->mods; - after = ModMaskText(info->ctx, &info->mods, mods); - - log_vrb(info->ctx, 1, - "Preserve for modifiers not used by the %s type; " - "Index %s converted to %s\n", - TypeTxt(info, type), before, after); - } - - if (!ExprResolveModMask(info->ctx, value, MOD_BOTH, &info->mods, - &preserve_mods)) { - log_err(info->ctx, - "Preserve value in a key type is not a modifier mask; " - "Ignoring preserve[%s] in type %s\n", - ModMaskText(info->ctx, &info->mods, mods), - TypeTxt(info, type)); - return false; - } - - if (preserve_mods & ~mods) { - const char *before, *after; - - before = ModMaskText(info->ctx, &info->mods, preserve_mods); - preserve_mods &= mods; - after = ModMaskText(info->ctx, &info->mods, preserve_mods); - - log_vrb(info->ctx, 1, - "Illegal value for preserve[%s] in type %s; " - "Converted %s to %s\n", - ModMaskText(info->ctx, &info->mods, mods), - TypeTxt(info, type), before, after); - } - - return AddPreserve(info, type, mods, preserve_mods); -} - -/***====================================================================***/ - -static bool -AddLevelName(KeyTypesInfo *info, KeyTypeInfo *type, - xkb_level_index_t level, xkb_atom_t name, bool clobber) -{ - /* New name. */ - if (level >= darray_size(type->level_names)) { - darray_resize0(type->level_names, level + 1); - goto finish; - } - - /* Same level, same name. */ - if (darray_item(type->level_names, level) == name) { - log_vrb(info->ctx, 10, - "Duplicate names for level %d of key type %s; Ignored\n", - level + 1, TypeTxt(info, type)); - return true; - } - - /* Same level, different name. */ - if (darray_item(type->level_names, level) != XKB_ATOM_NONE) { - const char *old, *new; - old = xkb_atom_text(info->ctx, - darray_item(type->level_names, level)); - new = xkb_atom_text(info->ctx, name); - log_vrb(info->ctx, 1, - "Multiple names for level %d of key type %s; " - "Using %s, ignoring %s\n", - level + 1, TypeTxt(info, type), - (clobber ? new : old), (clobber ? old : new)); - - if (!clobber) - return true; - } - - /* XXX: What about different level, same name? */ - -finish: - darray_item(type->level_names, level) = name; - return true; -} - -static bool -SetLevelName(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, - ExprDef *value) -{ - xkb_level_index_t level; - xkb_atom_t level_name; - - if (arrayNdx == NULL) - return ReportTypeShouldBeArray(info, type, "level name"); - - if (!ExprResolveLevel(info->ctx, arrayNdx, &level)) - return ReportTypeBadType(info, type, "level name", "integer"); - - if (!ExprResolveString(info->ctx, value, &level_name)) { - log_err(info->ctx, - "Non-string name for level %d in key type %s; " - "Ignoring illegal level name definition\n", - level + 1, xkb_atom_text(info->ctx, type->name)); - return false; - } - - return AddLevelName(info, type, level, level_name, true); -} - -/***====================================================================***/ - -static bool -SetKeyTypeField(KeyTypesInfo *info, KeyTypeInfo *type, - const char *field, ExprDef *arrayNdx, ExprDef *value) -{ - bool ok = false; - enum type_field type_field = 0; - - if (istreq(field, "modifiers")) { - type_field = TYPE_FIELD_MASK; - ok = SetModifiers(info, type, arrayNdx, value); - } - else if (istreq(field, "map")) { - type_field = TYPE_FIELD_MAP; - ok = SetMapEntry(info, type, arrayNdx, value); - } - else if (istreq(field, "preserve")) { - type_field = TYPE_FIELD_PRESERVE; - ok = SetPreserve(info, type, arrayNdx, value); - } - else if (istreq(field, "levelname") || istreq(field, "level_name")) { - type_field = TYPE_FIELD_LEVEL_NAME; - ok = SetLevelName(info, type, arrayNdx, value); - } else { - log_err(info->ctx, - "Unknown field %s in key type %s; Definition ignored\n", - field, TypeTxt(info, type)); - } - - type->defined |= type_field; - return ok; -} - -static bool -HandleKeyTypeBody(KeyTypesInfo *info, VarDef *def, KeyTypeInfo *type) -{ - bool ok = true; - const char *elem, *field; - ExprDef *arrayNdx; - - for (; def; def = (VarDef *) def->common.next) { - ok = ExprResolveLhs(info->ctx, def->name, &elem, &field, - &arrayNdx); - if (!ok) - continue; - - if (elem && istreq(elem, "type")) { - log_err(info->ctx, - "Support for changing the default type has been removed; " - "Statement ignored\n"); - continue; - } - - ok = SetKeyTypeField(info, type, field, arrayNdx, def->value); - } - - return ok; -} - -static bool -HandleKeyTypeDef(KeyTypesInfo *info, KeyTypeDef *def, enum merge_mode merge) -{ - KeyTypeInfo type = { - .defined = 0, - .merge = (def->merge == MERGE_DEFAULT ? merge : def->merge), - .name = def->name, - .mods = 0, - .num_levels = 1, - .entries = darray_new(), - .level_names = darray_new(), - }; - - if (!HandleKeyTypeBody(info, def->body, &type)) { - info->errorCount++; - return false; - } - - if (!AddKeyType(info, &type, true)) { - info->errorCount++; - return false; - } - - return true; -} - -static void -HandleKeyTypesFile(KeyTypesInfo *info, XkbFile *file, enum merge_mode merge) -{ - bool ok; - - free(info->name); - info->name = strdup_safe(file->name); - - for (ParseCommon *stmt = file->defs; stmt; stmt = stmt->next) { - switch (stmt->type) { - case STMT_INCLUDE: - ok = HandleIncludeKeyTypes(info, (IncludeStmt *) stmt); - break; - case STMT_TYPE: - ok = HandleKeyTypeDef(info, (KeyTypeDef *) stmt, merge); - break; - case STMT_VAR: - log_err(info->ctx, - "Support for changing the default type has been removed; " - "Statement ignored\n"); - ok = true; - break; - case STMT_VMOD: - ok = HandleVModDef(info->ctx, &info->mods, (VModDef *) stmt, merge); - break; - default: - log_err(info->ctx, - "Key type files may not include other declarations; " - "Ignoring %s\n", stmt_type_to_string(stmt->type)); - ok = false; - break; - } - - if (!ok) - info->errorCount++; - - if (info->errorCount > 10) { - log_err(info->ctx, - "Abandoning keytypes file \"%s\"\n", file->name); - break; - } - } -} - -/***====================================================================***/ - -static bool -CopyKeyTypesToKeymap(struct xkb_keymap *keymap, KeyTypesInfo *info) -{ - unsigned num_types; - struct xkb_key_type *types; - - num_types = darray_empty(info->types) ? 1 : darray_size(info->types); - types = calloc(num_types, sizeof(*types)); - if (!types) - return false; - - /* - * If no types were specified, a default unnamed one-level type is - * used for all keys. - */ - if (darray_empty(info->types)) { - struct xkb_key_type *type = &types[0]; - - type->mods.mods = 0; - type->num_levels = 1; - type->entries = NULL; - type->num_entries = 0; - type->name = xkb_atom_intern_literal(keymap->ctx, "default"); - type->level_names = NULL; - type->num_level_names = 0; - } - else { - for (unsigned i = 0; i < num_types; i++) { - KeyTypeInfo *def = &darray_item(info->types, i); - struct xkb_key_type *type = &types[i]; - - type->name = def->name; - type->mods.mods = def->mods; - type->num_levels = def->num_levels; - darray_steal(def->level_names, &type->level_names, &type->num_level_names); - darray_steal(def->entries, &type->entries, &type->num_entries); - } - } - - keymap->types_section_name = strdup_safe(info->name); - XkbEscapeMapName(keymap->types_section_name); - keymap->num_types = num_types; - keymap->types = types; - keymap->mods = info->mods; - return true; -} - -/***====================================================================***/ - -bool -CompileKeyTypes(XkbFile *file, struct xkb_keymap *keymap, - enum merge_mode merge) -{ - KeyTypesInfo info; - - InitKeyTypesInfo(&info, keymap->ctx, &keymap->mods); - - HandleKeyTypesFile(&info, file, merge); - if (info.errorCount != 0) - goto err_info; - - if (!CopyKeyTypesToKeymap(keymap, &info)) - goto err_info; - - ClearKeyTypesInfo(&info); - return true; - -err_info: - ClearKeyTypesInfo(&info); - return false; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/vmod.c b/src/3rdparty/xkbcommon/src/xkbcomp/vmod.c deleted file mode 100644 index a0b029af4f..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/vmod.c +++ /dev/null @@ -1,105 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#include "xkbcomp-priv.h" -#include "text.h" -#include "expr.h" -#include "vmod.h" - -bool -HandleVModDef(struct xkb_context *ctx, struct xkb_mod_set *mods, - VModDef *stmt, enum merge_mode merge) -{ - xkb_mod_index_t i; - struct xkb_mod *mod; - xkb_mod_mask_t mapping; - - merge = (merge == MERGE_DEFAULT ? stmt->merge : merge); - - if (stmt->value) { - /* - * This is a statement such as 'virtualModifiers NumLock = Mod1'; - * it sets the vmod-to-real-mod[s] mapping directly instead of going - * through modifier_map or some such. - */ - if (!ExprResolveModMask(ctx, stmt->value, MOD_REAL, mods, &mapping)) { - log_err(ctx, - "Declaration of %s ignored\n", - xkb_atom_text(ctx, stmt->name)); - return false; - } - } - else { - mapping = 0; - } - - xkb_mods_enumerate(i, mod, mods) { - if (mod->name == stmt->name) { - if (mod->type != MOD_VIRT) { - log_err(ctx, - "Can't add a virtual modifier named \"%s\"; " - "there is already a non-virtual modifier with this name! Ignored\n", - xkb_atom_text(ctx, mod->name)); - return false; - } - - if (mod->mapping == mapping) - return true; - - if (mod->mapping != 0) { - xkb_mod_mask_t use, ignore; - - use = (merge == MERGE_OVERRIDE ? mapping : mod->mapping); - ignore = (merge == MERGE_OVERRIDE ? mod->mapping : mapping); - - log_warn(ctx, - "Virtual modifier %s defined multiple times; " - "Using %s, ignoring %s\n", - xkb_atom_text(ctx, stmt->name), - ModMaskText(ctx, mods, use), - ModMaskText(ctx, mods, ignore)); - - mapping = use; - } - - mod->mapping = mapping; - return true; - } - } - - if (mods->num_mods >= XKB_MAX_MODS) { - log_err(ctx, - "Too many modifiers defined (maximum %d)\n", - XKB_MAX_MODS); - return false; - } - - mods->mods[mods->num_mods].name = stmt->name; - mods->mods[mods->num_mods].type = MOD_VIRT; - mods->mods[mods->num_mods].mapping = mapping; - mods->num_mods++; - return true; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/vmod.h b/src/3rdparty/xkbcommon/src/xkbcomp/vmod.h deleted file mode 100644 index 546cf7ee42..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/vmod.h +++ /dev/null @@ -1,34 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#ifndef XKBCOMP_VMOD_H -#define XKBCOMP_VMOD_H - -bool -HandleVModDef(struct xkb_context *ctx, struct xkb_mod_set *mods, - VModDef *stmt, enum merge_mode merge); - -#endif diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp-keymap.c b/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp-keymap.c deleted file mode 100644 index e95e50c371..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp-keymap.c +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Copyright © 2009 Dan Nicholson - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Dan Nicholson <dbn.lists@gmail.com> - * Daniel Stone <daniel@fooishbar.org> - * Ran Benita <ran234@gmail.com> - */ - -#include "xkbcomp-priv.h" - -static void -ComputeEffectiveMask(struct xkb_keymap *keymap, struct xkb_mods *mods) -{ - mods->mask = mod_mask_get_effective(keymap, mods->mods); -} - -static void -UpdateActionMods(struct xkb_keymap *keymap, union xkb_action *act, - xkb_mod_mask_t modmap) -{ - switch (act->type) { - case ACTION_TYPE_MOD_SET: - case ACTION_TYPE_MOD_LATCH: - case ACTION_TYPE_MOD_LOCK: - if (act->mods.flags & ACTION_MODS_LOOKUP_MODMAP) - act->mods.mods.mods = modmap; - ComputeEffectiveMask(keymap, &act->mods.mods); - break; - default: - break; - } -} - -static const struct xkb_sym_interpret default_interpret = { - .sym = XKB_KEY_NoSymbol, - .repeat = true, - .match = MATCH_ANY_OR_NONE, - .mods = 0, - .virtual_mod = XKB_MOD_INVALID, - .action = { .type = ACTION_TYPE_NONE }, -}; - -/** - * Find an interpretation which applies to this particular level, either by - * finding an exact match for the symbol and modifier combination, or a - * generic XKB_KEY_NoSymbol match. - */ -static const struct xkb_sym_interpret * -FindInterpForKey(struct xkb_keymap *keymap, const struct xkb_key *key, - xkb_layout_index_t group, xkb_level_index_t level) -{ - const xkb_keysym_t *syms; - int num_syms; - - num_syms = xkb_keymap_key_get_syms_by_level(keymap, key->keycode, group, - level, &syms); - if (num_syms == 0) - return NULL; - - /* - * There may be multiple matchings interprets; we should always return - * the most specific. Here we rely on compat.c to set up the - * sym_interprets array from the most specific to the least specific, - * such that when we find a match we return immediately. - */ - for (unsigned i = 0; i < keymap->num_sym_interprets; i++) { - const struct xkb_sym_interpret *interp = &keymap->sym_interprets[i]; - - xkb_mod_mask_t mods; - bool found = false; - - if ((num_syms > 1 || interp->sym != syms[0]) && - interp->sym != XKB_KEY_NoSymbol) - continue; - - if (interp->level_one_only && level != 0) - mods = 0; - else - mods = key->modmap; - - switch (interp->match) { - case MATCH_NONE: - found = !(interp->mods & mods); - break; - case MATCH_ANY_OR_NONE: - found = (!mods || (interp->mods & mods)); - break; - case MATCH_ANY: - found = (interp->mods & mods); - break; - case MATCH_ALL: - found = ((interp->mods & mods) == interp->mods); - break; - case MATCH_EXACTLY: - found = (interp->mods == mods); - break; - } - - if (found) - return interp; - } - - return &default_interpret; -} - -static bool -ApplyInterpsToKey(struct xkb_keymap *keymap, struct xkb_key *key) -{ - xkb_mod_mask_t vmodmap = 0; - xkb_layout_index_t group; - xkb_level_index_t level; - - /* If we've been told not to bind interps to this key, then don't. */ - if (key->explicit & EXPLICIT_INTERP) - return true; - - for (group = 0; group < key->num_groups; group++) { - for (level = 0; level < XkbKeyNumLevels(key, group); level++) { - const struct xkb_sym_interpret *interp; - - interp = FindInterpForKey(keymap, key, group, level); - if (!interp) - continue; - - /* Infer default key behaviours from the base level. */ - if (group == 0 && level == 0) - if (!(key->explicit & EXPLICIT_REPEAT) && interp->repeat) - key->repeats = true; - - if ((group == 0 && level == 0) || !interp->level_one_only) - if (interp->virtual_mod != XKB_MOD_INVALID) - vmodmap |= (1u << interp->virtual_mod); - - if (interp->action.type != ACTION_TYPE_NONE) - key->groups[group].levels[level].action = interp->action; - } - } - - if (!(key->explicit & EXPLICIT_VMODMAP)) - key->vmodmap = vmodmap; - - return true; -} - -/** - * This collects a bunch of disparate functions which was done in the server - * at various points that really should've been done within xkbcomp. Turns out - * your actions and types are a lot more useful when any of your modifiers - * other than Shift actually do something ... - */ -static bool -UpdateDerivedKeymapFields(struct xkb_keymap *keymap) -{ - struct xkb_key *key; - struct xkb_mod *mod; - struct xkb_led *led; - unsigned int i, j; - - /* Find all the interprets for the key and bind them to actions, - * which will also update the vmodmap. */ - xkb_keys_foreach(key, keymap) - if (!ApplyInterpsToKey(keymap, key)) - return false; - - /* Update keymap->mods, the virtual -> real mod mapping. */ - xkb_keys_foreach(key, keymap) - xkb_mods_enumerate(i, mod, &keymap->mods) - if (key->vmodmap & (1u << i)) - mod->mapping |= key->modmap; - - /* Now update the level masks for all the types to reflect the vmods. */ - for (i = 0; i < keymap->num_types; i++) { - ComputeEffectiveMask(keymap, &keymap->types[i].mods); - - for (j = 0; j < keymap->types[i].num_entries; j++) { - ComputeEffectiveMask(keymap, &keymap->types[i].entries[j].mods); - ComputeEffectiveMask(keymap, &keymap->types[i].entries[j].preserve); - } - } - - /* Update action modifiers. */ - xkb_keys_foreach(key, keymap) - for (i = 0; i < key->num_groups; i++) - for (j = 0; j < XkbKeyNumLevels(key, i); j++) - UpdateActionMods(keymap, &key->groups[i].levels[j].action, - key->modmap); - - /* Update vmod -> led maps. */ - xkb_leds_foreach(led, keymap) - ComputeEffectiveMask(keymap, &led->mods); - - /* Find maximum number of groups out of all keys in the keymap. */ - xkb_keys_foreach(key, keymap) - keymap->num_groups = MAX(keymap->num_groups, key->num_groups); - - return true; -} - -typedef bool (*compile_file_fn)(XkbFile *file, - struct xkb_keymap *keymap, - enum merge_mode merge); - -static const compile_file_fn compile_file_fns[LAST_KEYMAP_FILE_TYPE + 1] = { - [FILE_TYPE_KEYCODES] = CompileKeycodes, - [FILE_TYPE_TYPES] = CompileKeyTypes, - [FILE_TYPE_COMPAT] = CompileCompatMap, - [FILE_TYPE_SYMBOLS] = CompileSymbols, -}; - -bool -CompileKeymap(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge) -{ - bool ok; - XkbFile *files[LAST_KEYMAP_FILE_TYPE + 1] = { NULL }; - enum xkb_file_type type; - struct xkb_context *ctx = keymap->ctx; - - /* Collect section files and check for duplicates. */ - for (file = (XkbFile *) file->defs; file; - file = (XkbFile *) file->common.next) { - if (file->file_type < FIRST_KEYMAP_FILE_TYPE || - file->file_type > LAST_KEYMAP_FILE_TYPE) { - if (file->file_type == FILE_TYPE_GEOMETRY) { - log_vrb(ctx, 1, - "Geometry sections are not supported; ignoring\n"); - } else { - log_err(ctx, "Cannot define %s in a keymap file\n", - xkb_file_type_to_string(file->file_type)); - } - continue; - } - - if (files[file->file_type]) { - log_err(ctx, - "More than one %s section in keymap file; " - "All sections after the first ignored\n", - xkb_file_type_to_string(file->file_type)); - continue; - } - - files[file->file_type] = file; - } - - /* - * Check that all required section were provided. - * Report everything before failing. - */ - ok = true; - for (type = FIRST_KEYMAP_FILE_TYPE; - type <= LAST_KEYMAP_FILE_TYPE; - type++) { - if (files[type] == NULL) { - log_err(ctx, "Required section %s missing from keymap\n", - xkb_file_type_to_string(type)); - ok = false; - } - } - if (!ok) - return false; - - /* Compile sections. */ - for (type = FIRST_KEYMAP_FILE_TYPE; - type <= LAST_KEYMAP_FILE_TYPE; - type++) { - log_dbg(ctx, "Compiling %s \"%s\"\n", - xkb_file_type_to_string(type), files[type]->name); - - ok = compile_file_fns[type](files[type], keymap, merge); - if (!ok) { - log_err(ctx, "Failed to compile %s\n", - xkb_file_type_to_string(type)); - return false; - } - } - - return UpdateDerivedKeymapFields(keymap); -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp-parser.c b/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp-parser.c deleted file mode 100644 index 520cc5b9c5..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp-parser.c +++ /dev/null @@ -1,3392 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.0.4. */ - -/* Bison implementation for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "3.0.4" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 1 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - - -/* Substitute the variable and function names. */ -#define yyparse _xkbcommon_parse -#define yylex _xkbcommon_lex -#define yyerror _xkbcommon_error -#define yydebug _xkbcommon_debug -#define yynerrs _xkbcommon_nerrs - - -/* Copy the first part of user declarations. */ -#line 33 "../src/xkbcomp/parser.y" /* yacc.c:339 */ - -#include "xkbcomp/xkbcomp-priv.h" -#include "xkbcomp/ast-build.h" -#include "xkbcomp/parser-priv.h" -#include "scanner-utils.h" - -struct parser_param { - struct xkb_context *ctx; - struct scanner *scanner; - XkbFile *rtrn; - bool more_maps; -}; - -#define parser_err(param, fmt, ...) \ - scanner_err((param)->scanner, fmt, ##__VA_ARGS__) - -#define parser_warn(param, fmt, ...) \ - scanner_warn((param)->scanner, fmt, ##__VA_ARGS__) - -static void -_xkbcommon_error(struct parser_param *param, const char *msg) -{ - parser_err(param, "%s", msg); -} - -static bool -resolve_keysym(const char *name, xkb_keysym_t *sym_rtrn) -{ - xkb_keysym_t sym; - - if (!name || istreq(name, "any") || istreq(name, "nosymbol")) { - *sym_rtrn = XKB_KEY_NoSymbol; - return true; - } - - if (istreq(name, "none") || istreq(name, "voidsymbol")) { - *sym_rtrn = XKB_KEY_VoidSymbol; - return true; - } - - sym = xkb_keysym_from_name(name, XKB_KEYSYM_NO_FLAGS); - if (sym != XKB_KEY_NoSymbol) { - *sym_rtrn = sym; - return true; - } - - return false; -} - -#define param_scanner param->scanner - -#line 124 "xkbcommon-internal@sta/parser.c" /* yacc.c:339 */ - -# ifndef YY_NULLPTR -# if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULLPTR nullptr -# else -# define YY_NULLPTR 0 -# endif -# endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* In a future release of Bison, this section will be replaced - by #include "parser.h". */ -#ifndef YY__XKBCOMMON_XKBCOMMON_INTERNAL_STA_PARSER_H_INCLUDED -# define YY__XKBCOMMON_XKBCOMMON_INTERNAL_STA_PARSER_H_INCLUDED -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int _xkbcommon_debug; -#endif - -/* Token type. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - enum yytokentype - { - END_OF_FILE = 0, - ERROR_TOK = 255, - XKB_KEYMAP = 1, - XKB_KEYCODES = 2, - XKB_TYPES = 3, - XKB_SYMBOLS = 4, - XKB_COMPATMAP = 5, - XKB_GEOMETRY = 6, - XKB_SEMANTICS = 7, - XKB_LAYOUT = 8, - INCLUDE = 10, - OVERRIDE = 11, - AUGMENT = 12, - REPLACE = 13, - ALTERNATE = 14, - VIRTUAL_MODS = 20, - TYPE = 21, - INTERPRET = 22, - ACTION_TOK = 23, - KEY = 24, - ALIAS = 25, - GROUP = 26, - MODIFIER_MAP = 27, - INDICATOR = 28, - SHAPE = 29, - KEYS = 30, - ROW = 31, - SECTION = 32, - OVERLAY = 33, - TEXT = 34, - OUTLINE = 35, - SOLID = 36, - LOGO = 37, - VIRTUAL = 38, - EQUALS = 40, - PLUS = 41, - MINUS = 42, - DIVIDE = 43, - TIMES = 44, - OBRACE = 45, - CBRACE = 46, - OPAREN = 47, - CPAREN = 48, - OBRACKET = 49, - CBRACKET = 50, - DOT = 51, - COMMA = 52, - SEMI = 53, - EXCLAM = 54, - INVERT = 55, - STRING = 60, - INTEGER = 61, - FLOAT = 62, - IDENT = 63, - KEYNAME = 64, - PARTIAL = 70, - DEFAULT = 71, - HIDDEN = 72, - ALPHANUMERIC_KEYS = 73, - MODIFIER_KEYS = 74, - KEYPAD_KEYS = 75, - FUNCTION_KEYS = 76, - ALTERNATE_GROUP = 77 - }; -#endif - -/* Value type. */ -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED - -union YYSTYPE -{ -#line 162 "../src/xkbcomp/parser.y" /* yacc.c:355 */ - - int ival; - int64_t num; - enum xkb_file_type file_type; - char *str; - xkb_atom_t atom; - enum merge_mode merge; - enum xkb_map_flags mapFlags; - xkb_keysym_t keysym; - ParseCommon *any; - ExprDef *expr; - VarDef *var; - VModDef *vmod; - InterpDef *interp; - KeyTypeDef *keyType; - SymbolsDef *syms; - ModMapDef *modMask; - GroupCompatDef *groupCompat; - LedMapDef *ledMap; - LedNameDef *ledName; - KeycodeDef *keyCode; - KeyAliasDef *keyAlias; - void *geom; - XkbFile *file; - -#line 256 "xkbcommon-internal@sta/parser.c" /* yacc.c:355 */ -}; - -typedef union YYSTYPE YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define YYSTYPE_IS_DECLARED 1 -#endif - - - -int _xkbcommon_parse (struct parser_param *param); - -#endif /* !YY__XKBCOMMON_XKBCOMMON_INTERNAL_STA_PARSER_H_INCLUDED */ - -/* Copy the second part of user declarations. */ - -#line 272 "xkbcommon-internal@sta/parser.c" /* yacc.c:358 */ - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#else -typedef signed char yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T -# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if defined YYENABLE_NLS && YYENABLE_NLS -# if ENABLE_NLS -# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ -# define YY_(Msgid) dgettext ("bison-runtime", Msgid) -# endif -# endif -# ifndef YY_ -# define YY_(Msgid) Msgid -# endif -#endif - -#ifndef YY_ATTRIBUTE -# if (defined __GNUC__ \ - && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ - || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C -# define YY_ATTRIBUTE(Spec) __attribute__(Spec) -# else -# define YY_ATTRIBUTE(Spec) /* empty */ -# endif -#endif - -#ifndef YY_ATTRIBUTE_PURE -# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) -#endif - -#ifndef YY_ATTRIBUTE_UNUSED -# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) -#endif - -#if !defined _Noreturn \ - && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) -# if defined _MSC_VER && 1200 <= _MSC_VER -# define _Noreturn __declspec (noreturn) -# else -# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(E) ((void) (E)) -#else -# define YYUSE(E) /* empty */ -#endif - -#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ -/* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ - _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") -# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ - _Pragma ("GCC diagnostic pop") -#else -# define YY_INITIAL_VALUE(Value) Value -#endif -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END -#endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ -#endif - - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include <alloca.h> /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include <malloc.h> /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS -# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ - /* Use EXIT_SUCCESS as a witness for stdlib.h. */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's 'empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined EXIT_SUCCESS \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss_alloc; - YYSTYPE yyvs_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -# define YYCOPY_NEEDED 1 - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (0) - -#endif - -#if defined YYCOPY_NEEDED && YYCOPY_NEEDED -/* Copy COUNT objects from SRC to DST. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(Dst, Src, Count) \ - __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) -# else -# define YYCOPY(Dst, Src, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (Dst)[yyi] = (Src)[yyi]; \ - } \ - while (0) -# endif -# endif -#endif /* !YYCOPY_NEEDED */ - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 16 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 735 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 65 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 72 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 184 -/* YYNSTATES -- Number of states. */ -#define YYNSTATES 334 - -/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned - by yylex, with out-of-bounds checking. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 257 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM - as returned by yylex, without out-of-bounds checking. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 4, 5, 6, 7, 8, 9, 10, 11, 2, - 12, 13, 14, 15, 16, 2, 2, 2, 2, 2, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 2, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 2, 2, 2, 2, - 52, 53, 54, 55, 56, 2, 2, 2, 2, 2, - 57, 58, 59, 60, 61, 62, 63, 64, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 1, 2 -}; - -#if YYDEBUG - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 241, 241, 243, 245, 249, 255, 256, 257, 260, - 268, 272, 280, 281, 282, 283, 284, 287, 288, 291, - 292, 295, 296, 297, 298, 299, 300, 301, 302, 305, - 307, 310, 315, 320, 325, 330, 335, 340, 345, 350, - 355, 360, 365, 366, 367, 368, 375, 377, 379, 383, - 387, 391, 395, 398, 402, 404, 408, 414, 416, 420, - 423, 427, 433, 439, 442, 444, 447, 448, 449, 450, - 451, 454, 456, 460, 464, 468, 472, 474, 478, 480, - 484, 488, 489, 492, 494, 496, 498, 500, 504, 505, - 508, 509, 513, 514, 517, 519, 523, 527, 528, 531, - 534, 536, 540, 542, 544, 548, 550, 554, 558, 562, - 563, 564, 565, 568, 569, 572, 574, 576, 578, 580, - 582, 584, 586, 588, 590, 592, 596, 597, 600, 601, - 602, 603, 604, 614, 615, 618, 621, 625, 627, 629, - 631, 633, 635, 639, 641, 643, 645, 647, 649, 651, - 653, 657, 660, 664, 668, 670, 672, 674, 678, 680, - 682, 684, 688, 689, 692, 694, 696, 698, 702, 706, - 712, 713, 733, 734, 737, 738, 741, 744, 747, 750, - 751, 754, 757, 758, 761 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || 0 -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "END_OF_FILE", "error", "$undefined", "ERROR_TOK", "XKB_KEYMAP", - "XKB_KEYCODES", "XKB_TYPES", "XKB_SYMBOLS", "XKB_COMPATMAP", - "XKB_GEOMETRY", "XKB_SEMANTICS", "XKB_LAYOUT", "INCLUDE", "OVERRIDE", - "AUGMENT", "REPLACE", "ALTERNATE", "VIRTUAL_MODS", "TYPE", "INTERPRET", - "ACTION_TOK", "KEY", "ALIAS", "GROUP", "MODIFIER_MAP", "INDICATOR", - "SHAPE", "KEYS", "ROW", "SECTION", "OVERLAY", "TEXT", "OUTLINE", "SOLID", - "LOGO", "VIRTUAL", "EQUALS", "PLUS", "MINUS", "DIVIDE", "TIMES", - "OBRACE", "CBRACE", "OPAREN", "CPAREN", "OBRACKET", "CBRACKET", "DOT", - "COMMA", "SEMI", "EXCLAM", "INVERT", "STRING", "INTEGER", "FLOAT", - "IDENT", "KEYNAME", "PARTIAL", "DEFAULT", "HIDDEN", "ALPHANUMERIC_KEYS", - "MODIFIER_KEYS", "KEYPAD_KEYS", "FUNCTION_KEYS", "ALTERNATE_GROUP", - "$accept", "XkbFile", "XkbCompositeMap", "XkbCompositeType", - "XkbMapConfigList", "XkbMapConfig", "FileType", "OptFlags", "Flags", - "Flag", "DeclList", "Decl", "VarDecl", "KeyNameDecl", "KeyAliasDecl", - "VModDecl", "VModDefList", "VModDef", "InterpretDecl", "InterpretMatch", - "VarDeclList", "KeyTypeDecl", "SymbolsDecl", "SymbolsBody", - "SymbolsVarDecl", "ArrayInit", "GroupCompatDecl", "ModMapDecl", - "LedMapDecl", "LedNameDecl", "ShapeDecl", "SectionDecl", "SectionBody", - "SectionBodyItem", "RowBody", "RowBodyItem", "Keys", "Key", - "OverlayDecl", "OverlayKeyList", "OverlayKey", "OutlineList", - "OutlineInList", "CoordList", "Coord", "DoodadDecl", "DoodadType", - "FieldSpec", "Element", "OptMergeMode", "MergeMode", "OptExprList", - "ExprList", "Expr", "Term", "ActionList", "Action", "Lhs", "Terminal", - "OptKeySymList", "KeySymList", "KeySyms", "KeySym", "SignedNumber", - "Number", "Float", "Integer", "KeyCode", "Ident", "String", "OptMapName", - "MapName", YY_NULLPTR -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[NUM] -- (External) token number corresponding to the - (internal) symbol number NUM (which must be that of a token). */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 255, 1, 2, 3, 4, 5, 6, - 7, 8, 10, 11, 12, 13, 14, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 60, 61, 62, 63, 64, 70, 71, 72, - 73, 74, 75, 76, 77 -}; -# endif - -#define YYPACT_NINF -182 - -#define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-182))) - -#define YYTABLE_NINF -180 - -#define yytable_value_is_error(Yytable_value) \ - 0 - - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -static const yytype_int16 yypact[] = -{ - 176, -182, -182, -182, -182, -182, -182, -182, -182, -182, - 6, -182, -182, 271, 227, -182, -182, -182, -182, -182, - -182, -182, -182, -182, -182, -38, -38, -182, -182, -24, - -182, 33, 227, -182, 210, -182, 353, 44, 5, -182, - -182, -182, -182, -182, -182, 32, -182, 13, 41, -182, - -182, -48, 55, 11, -182, 79, 87, 58, -48, -2, - 55, -182, 55, 72, -182, -182, -182, 107, -48, -182, - 110, -182, -182, -182, -182, -182, -182, -182, -182, -182, - -182, -182, -182, -182, -182, -182, 55, -18, -182, 127, - 121, -182, 66, -182, 138, -182, 136, -182, -182, -182, - 144, 147, -182, 152, 180, 182, 178, 184, 187, 188, - 190, 58, 198, 201, 214, 367, 677, 367, -182, -48, - -182, 367, 663, 663, 367, 494, 200, 367, 367, 367, - 663, 68, 449, 223, -182, -182, 212, 663, -182, -182, - -182, -182, -182, -182, -182, -182, -182, 367, 367, 367, - 367, 367, -182, -182, 57, 157, -182, 224, -182, -182, - -182, -182, -182, 218, 91, -182, 333, -182, 509, 537, - 333, 552, -48, 1, -182, -182, 228, 40, 216, 143, - 70, 333, 150, 593, 247, -30, 97, -182, 105, -182, - 261, 55, 259, 55, -182, -182, 408, -182, -182, -182, - 367, -182, 608, -182, -182, -182, 287, -182, -182, 367, - 367, 367, 367, 367, -182, 367, 367, -182, 252, -182, - 253, 264, 24, 269, 272, 163, -182, 273, 270, -182, - -182, -182, 280, 494, 285, -182, -182, 283, 367, -182, - 284, 112, 8, -182, -182, 294, -182, 299, -36, 304, - 247, 326, 649, 279, 307, -182, 204, 316, -182, 322, - 320, 111, 111, -182, -182, 333, 211, -182, -182, 116, - 367, -182, 677, -182, 24, -182, -182, -182, 333, -182, - 333, -182, -182, -182, -30, -182, -182, -182, -182, 247, - 333, 334, -182, 466, -182, 318, -182, -182, -182, -182, - -182, -182, 339, -182, -182, -182, 343, 120, 14, 345, - -182, 361, 124, -182, -182, -182, -182, 367, -182, 131, - -182, -182, 344, 350, 318, 166, 352, 14, -182, -182, - -182, -182, -182, -182 -}; - - /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE does not specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 18, 4, 21, 22, 23, 24, 25, 26, 27, 28, - 0, 2, 3, 0, 17, 20, 1, 6, 12, 13, - 15, 14, 16, 7, 8, 183, 183, 19, 184, 0, - 182, 0, 18, 30, 18, 10, 0, 127, 0, 9, - 128, 130, 129, 131, 132, 0, 29, 0, 126, 5, - 11, 0, 117, 116, 115, 118, 0, 119, 120, 121, - 122, 123, 124, 125, 110, 111, 112, 0, 0, 179, - 0, 180, 31, 34, 35, 32, 33, 36, 37, 39, - 38, 40, 41, 42, 43, 44, 0, 154, 114, 0, - 113, 45, 0, 53, 54, 181, 0, 170, 177, 169, - 0, 58, 171, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, - 51, 0, 0, 0, 0, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 48, 178, 0, 0, 117, 116, - 118, 119, 120, 121, 122, 124, 125, 0, 0, 0, - 0, 0, 176, 161, 154, 0, 142, 147, 149, 160, - 159, 113, 158, 155, 0, 52, 55, 60, 0, 0, - 57, 163, 0, 0, 64, 70, 0, 113, 0, 0, - 0, 136, 0, 0, 0, 0, 0, 101, 0, 106, - 0, 121, 123, 0, 84, 86, 0, 82, 87, 85, - 0, 49, 0, 144, 147, 143, 0, 145, 146, 134, - 0, 0, 0, 0, 156, 0, 0, 46, 0, 59, - 0, 170, 0, 169, 0, 0, 152, 0, 162, 167, - 166, 69, 0, 0, 0, 50, 73, 0, 0, 76, - 0, 0, 0, 175, 174, 0, 173, 0, 0, 0, - 0, 0, 0, 0, 0, 81, 0, 0, 150, 0, - 133, 138, 139, 137, 140, 141, 0, 61, 56, 0, - 134, 72, 0, 71, 0, 62, 63, 67, 66, 74, - 135, 75, 102, 172, 0, 78, 100, 79, 105, 0, - 104, 0, 91, 0, 89, 0, 80, 77, 108, 148, - 157, 168, 0, 151, 165, 164, 0, 0, 0, 0, - 88, 0, 0, 98, 153, 107, 103, 0, 94, 0, - 93, 83, 0, 0, 0, 0, 0, 0, 99, 96, - 97, 95, 90, 92 -}; - - /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -182, -182, -182, -182, -182, 181, -182, 402, -182, 389, - -182, -182, -35, -182, -182, -182, -182, 288, -182, -182, - -50, -182, -182, -182, 173, 174, -182, -182, 362, -182, - -182, -182, -182, 215, -182, 119, -182, 86, -182, -182, - 90, -182, 167, -181, 185, 369, -182, -27, -182, -182, - -182, 154, -126, 83, 76, -182, 158, -31, -182, -182, - 221, 170, -52, 161, 205, -182, -44, -182, -47, -34, - 420, -182 -}; - - /* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 10, 11, 25, 34, 12, 26, 36, 14, 15, - 37, 46, 167, 73, 74, 75, 92, 93, 76, 100, - 168, 77, 78, 173, 174, 175, 79, 80, 195, 82, - 83, 84, 196, 197, 293, 294, 319, 320, 198, 312, - 313, 186, 187, 188, 189, 199, 86, 154, 88, 47, - 48, 259, 260, 181, 156, 225, 226, 157, 158, 227, - 228, 229, 230, 245, 246, 159, 160, 136, 161, 162, - 29, 30 -}; - - /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule whose - number is the opposite. If YYTABLE_NINF, syntax error. */ -static const yytype_int16 yytable[] = -{ - 90, 101, 180, 241, 94, 184, 16, 69, 242, 102, - 71, 106, 72, 105, 28, 107, 89, 32, 96, 69, - 87, 112, 71, 243, 244, 108, 109, 115, 110, 116, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 97, 61, 62, 232, 63, 64, 65, 66, 67, 233, - 95, 98, 114, 97, 49, 317, 40, 41, 42, 43, - 44, 243, 244, 68, 98, 222, 99, 133, 69, 70, - 318, 71, 94, 169, 33, 90, 90, 98, 177, 99, - 183, 50, -68, 90, 190, 90, 45, 202, -68, 163, - 90, 89, 89, 91, 176, 87, 87, 194, 87, 89, - 209, 89, 115, 87, 116, 87, 89, 95, 307, 184, - 87, 98, 237, 185, 119, 120, 204, 204, 238, 204, - 204, 90, 90, 69, -109, 231, 71, 102, 210, 211, - 212, 213, 111, 219, 219, 103, 90, 89, 89, 247, - 217, 87, 87, 104, 224, 248, 113, 249, 219, 90, - 212, 213, 89, 250, 282, 90, 87, 108, 301, 253, - 250, 194, 316, 117, 274, 89, 323, 219, 250, 87, - 118, 89, 324, 326, 121, 87, 1, 122, 102, 327, - 210, 211, 212, 213, 124, 123, 177, 210, 211, 212, - 213, 325, 236, 125, 210, 211, 212, 213, 155, 239, - 164, 190, 176, 214, 166, 90, 87, 170, 331, 271, - 179, 272, 182, 35, 238, 39, 126, 292, 127, 128, - 129, 89, 305, 203, 205, 87, 207, 208, 130, 131, - 102, 132, 206, 2, 3, 4, 5, 6, 7, 8, - 9, 210, 211, 212, 213, 224, 90, 134, 210, 211, - 212, 213, 38, 297, 135, 137, 178, 300, 292, 200, - 215, 201, 89, 216, 234, 235, 87, 2, 3, 4, - 5, 6, 7, 8, 9, 17, 18, 19, 20, 21, - 22, 23, 24, 256, 2, 3, 4, 5, 6, 7, - 8, 9, 185, 261, 262, 263, 264, 251, 265, 266, - 252, 267, 268, 138, 139, 54, 140, -124, 141, 142, - 143, 144, -179, 61, 145, 270, 146, 278, 274, 273, - 295, 280, 147, 148, 210, 211, 212, 213, 149, 275, - 171, 258, 279, 281, 290, 150, 151, 95, 98, 152, - 69, 153, 284, 71, 138, 139, 54, 140, 285, 141, - 142, 143, 144, 287, 61, 145, 296, 146, 18, 19, - 20, 21, 22, 147, 148, 298, 299, 289, 238, 149, - 210, 211, 212, 213, 311, 308, 150, 151, 95, 98, - 152, 69, 153, 314, 71, 138, 139, 54, 140, 315, - 141, 142, 143, 144, 321, 61, 145, 322, 146, 329, - 328, 332, 13, 27, 147, 148, 276, 165, 277, 81, - 149, 255, 310, 333, 330, 286, 85, 150, 151, 95, - 98, 152, 69, 153, 302, 71, 138, 139, 54, 140, - 303, 141, 142, 191, 144, 288, 192, 145, 193, 63, - 64, 65, 66, 269, 304, 306, 31, 283, 0, 0, - 254, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 0, 69, 0, 0, 71, 138, 139, 54, - 140, 0, 141, 142, 191, 144, 0, 192, 145, 193, - 63, 64, 65, 66, 138, 139, 54, 140, 0, 141, - 142, 143, 144, 291, 61, 145, 0, 146, 0, 68, - 0, 0, 0, 0, 69, 0, 0, 71, 309, 0, - 0, 0, 138, 139, 54, 140, 68, 141, 142, 143, - 144, 69, 61, 145, 71, 146, 0, 138, 139, 54, - 140, 0, 141, 142, 143, 144, 0, 61, 145, 171, - 146, 0, 0, 0, 172, 0, 0, 0, 0, 69, - 0, 218, 71, 0, 0, 138, 139, 54, 140, 68, - 141, 142, 143, 144, 69, 61, 145, 71, 146, 0, - 138, 139, 54, 140, 0, 141, 142, 143, 144, 220, - 61, 221, 0, 146, 0, 0, 0, 68, 0, 0, - 0, 0, 69, 222, 0, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 98, 0, 223, 0, 0, - 71, 138, 139, 54, 140, 0, 141, 142, 143, 144, - 0, 61, 145, 0, 146, 0, 138, 139, 54, 140, - 0, 141, 142, 143, 144, 240, 61, 145, 0, 146, - 0, 0, 0, 68, 0, 0, 0, 0, 69, 0, - 257, 71, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 0, 69, 0, 0, 71, 138, 139, 54, - 140, 0, 141, 142, 143, 144, 291, 61, 145, 0, - 146, 138, 139, 54, 140, 0, 141, 142, 143, 144, - 0, 61, 145, 0, 146, 138, 139, 54, 140, 68, - 141, 142, 143, 144, 69, 61, 145, 71, 146, 0, - 0, 0, 0, 68, 0, 0, 0, 0, 69, 0, - 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 69, 0, 0, 71 -}; - -static const yytype_int16 yycheck[] = -{ - 47, 53, 128, 184, 51, 41, 0, 55, 38, 53, - 58, 58, 47, 57, 52, 59, 47, 41, 52, 55, - 47, 68, 58, 53, 54, 59, 60, 45, 62, 47, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 29, 28, 29, 42, 31, 32, 33, 34, 35, 48, - 52, 53, 86, 29, 49, 41, 12, 13, 14, 15, - 16, 53, 54, 50, 53, 41, 55, 111, 55, 56, - 56, 58, 119, 123, 41, 122, 123, 53, 125, 55, - 130, 49, 42, 130, 131, 132, 42, 137, 48, 116, - 137, 122, 123, 52, 125, 122, 123, 132, 125, 130, - 43, 132, 45, 130, 47, 132, 137, 52, 289, 41, - 137, 53, 42, 45, 48, 49, 147, 148, 48, 150, - 151, 168, 169, 55, 52, 172, 58, 171, 37, 38, - 39, 40, 25, 168, 169, 56, 183, 168, 169, 42, - 49, 168, 169, 56, 171, 48, 36, 42, 183, 196, - 39, 40, 183, 48, 42, 202, 183, 191, 42, 193, - 48, 196, 42, 36, 48, 196, 42, 202, 48, 196, - 49, 202, 48, 42, 36, 202, 0, 41, 222, 48, - 37, 38, 39, 40, 37, 41, 233, 37, 38, 39, - 40, 317, 49, 41, 37, 38, 39, 40, 115, 49, - 117, 248, 233, 46, 121, 252, 233, 124, 42, 46, - 127, 48, 129, 32, 48, 34, 36, 252, 36, 41, - 36, 252, 274, 147, 148, 252, 150, 151, 41, 41, - 274, 41, 149, 57, 58, 59, 60, 61, 62, 63, - 64, 37, 38, 39, 40, 272, 293, 49, 37, 38, - 39, 40, 42, 49, 53, 41, 56, 46, 293, 36, - 36, 49, 293, 45, 36, 49, 293, 57, 58, 59, - 60, 61, 62, 63, 64, 4, 5, 6, 7, 8, - 9, 10, 11, 200, 57, 58, 59, 60, 61, 62, - 63, 64, 45, 210, 211, 212, 213, 36, 215, 216, - 41, 49, 49, 18, 19, 20, 21, 43, 23, 24, - 25, 26, 43, 28, 29, 43, 31, 234, 48, 46, - 41, 238, 37, 38, 37, 38, 39, 40, 43, 49, - 45, 44, 49, 49, 251, 50, 51, 52, 53, 54, - 55, 56, 48, 58, 18, 19, 20, 21, 49, 23, - 24, 25, 26, 49, 28, 29, 49, 31, 5, 6, - 7, 8, 9, 37, 38, 49, 44, 41, 48, 43, - 37, 38, 39, 40, 56, 41, 50, 51, 52, 53, - 54, 55, 56, 44, 58, 18, 19, 20, 21, 46, - 23, 24, 25, 26, 49, 28, 29, 36, 31, 49, - 56, 49, 0, 14, 37, 38, 233, 119, 234, 47, - 43, 196, 293, 327, 324, 248, 47, 50, 51, 52, - 53, 54, 55, 56, 270, 58, 18, 19, 20, 21, - 272, 23, 24, 25, 26, 250, 28, 29, 30, 31, - 32, 33, 34, 222, 274, 284, 26, 242, -1, -1, - 42, -1, -1, -1, -1, -1, -1, -1, 50, -1, - -1, -1, -1, 55, -1, -1, 58, 18, 19, 20, - 21, -1, 23, 24, 25, 26, -1, 28, 29, 30, - 31, 32, 33, 34, 18, 19, 20, 21, -1, 23, - 24, 25, 26, 27, 28, 29, -1, 31, -1, 50, - -1, -1, -1, -1, 55, -1, -1, 58, 42, -1, - -1, -1, 18, 19, 20, 21, 50, 23, 24, 25, - 26, 55, 28, 29, 58, 31, -1, 18, 19, 20, - 21, -1, 23, 24, 25, 26, -1, 28, 29, 45, - 31, -1, -1, -1, 50, -1, -1, -1, -1, 55, - -1, 42, 58, -1, -1, 18, 19, 20, 21, 50, - 23, 24, 25, 26, 55, 28, 29, 58, 31, -1, - 18, 19, 20, 21, -1, 23, 24, 25, 26, 42, - 28, 29, -1, 31, -1, -1, -1, 50, -1, -1, - -1, -1, 55, 41, -1, 58, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 53, -1, 55, -1, -1, - 58, 18, 19, 20, 21, -1, 23, 24, 25, 26, - -1, 28, 29, -1, 31, -1, 18, 19, 20, 21, - -1, 23, 24, 25, 26, 42, 28, 29, -1, 31, - -1, -1, -1, 50, -1, -1, -1, -1, 55, -1, - 42, 58, -1, -1, -1, -1, -1, -1, 50, -1, - -1, -1, -1, 55, -1, -1, 58, 18, 19, 20, - 21, -1, 23, 24, 25, 26, 27, 28, 29, -1, - 31, 18, 19, 20, 21, -1, 23, 24, 25, 26, - -1, 28, 29, -1, 31, 18, 19, 20, 21, 50, - 23, 24, 25, 26, 55, 28, 29, 58, 31, -1, - -1, -1, -1, 50, -1, -1, -1, -1, 55, -1, - -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 55, -1, -1, 58 -}; - - /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 0, 57, 58, 59, 60, 61, 62, 63, 64, - 66, 67, 70, 72, 73, 74, 0, 4, 5, 6, - 7, 8, 9, 10, 11, 68, 71, 74, 52, 135, - 136, 135, 41, 41, 69, 70, 72, 75, 42, 70, - 12, 13, 14, 15, 16, 42, 76, 114, 115, 49, - 49, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 28, 29, 31, 32, 33, 34, 35, 50, 55, - 56, 58, 77, 78, 79, 80, 83, 86, 87, 91, - 92, 93, 94, 95, 96, 110, 111, 112, 113, 122, - 133, 52, 81, 82, 133, 52, 134, 29, 53, 55, - 84, 127, 131, 56, 56, 131, 133, 131, 134, 134, - 134, 25, 133, 36, 134, 45, 47, 36, 49, 48, - 49, 36, 41, 41, 37, 41, 36, 36, 41, 36, - 41, 41, 41, 131, 49, 53, 132, 41, 18, 19, - 21, 23, 24, 25, 26, 29, 31, 37, 38, 43, - 50, 51, 54, 56, 112, 118, 119, 122, 123, 130, - 131, 133, 134, 112, 118, 82, 118, 77, 85, 85, - 118, 45, 50, 88, 89, 90, 122, 133, 56, 118, - 117, 118, 118, 85, 41, 45, 106, 107, 108, 109, - 133, 25, 28, 30, 77, 93, 97, 98, 103, 110, - 36, 49, 85, 119, 122, 119, 118, 119, 119, 43, - 37, 38, 39, 40, 46, 36, 45, 49, 42, 77, - 42, 29, 41, 55, 112, 120, 121, 124, 125, 126, - 127, 133, 42, 48, 36, 49, 49, 42, 48, 49, - 42, 108, 38, 53, 54, 128, 129, 42, 48, 42, - 48, 36, 41, 134, 42, 98, 118, 42, 44, 116, - 117, 118, 118, 118, 118, 118, 118, 49, 49, 125, - 43, 46, 48, 46, 48, 49, 89, 90, 118, 49, - 118, 49, 42, 129, 48, 49, 107, 49, 109, 41, - 118, 27, 77, 99, 100, 41, 49, 49, 49, 44, - 46, 42, 116, 121, 126, 127, 128, 108, 41, 42, - 100, 56, 104, 105, 44, 46, 42, 41, 56, 101, - 102, 49, 36, 42, 48, 117, 42, 48, 56, 49, - 105, 42, 49, 102 -}; - - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 65, 66, 66, 66, 67, 68, 68, 68, 69, - 69, 70, 71, 71, 71, 71, 71, 72, 72, 73, - 73, 74, 74, 74, 74, 74, 74, 74, 74, 75, - 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 77, 77, 77, 78, - 79, 80, 81, 81, 82, 82, 83, 84, 84, 85, - 85, 86, 87, 88, 88, 88, 89, 89, 89, 89, - 89, 90, 90, 91, 92, 93, 94, 94, 95, 95, - 96, 97, 97, 98, 98, 98, 98, 98, 99, 99, - 100, 100, 101, 101, 102, 102, 103, 104, 104, 105, - 106, 106, 107, 107, 107, 108, 108, 109, 110, 111, - 111, 111, 111, 112, 112, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 114, 114, 115, 115, - 115, 115, 115, 116, 116, 117, 117, 118, 118, 118, - 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, - 119, 120, 120, 121, 122, 122, 122, 122, 123, 123, - 123, 123, 124, 124, 125, 125, 125, 125, 126, 127, - 127, 127, 128, 128, 129, 129, 130, 131, 132, 133, - 133, 134, 135, 135, 136 -}; - - /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 1, 1, 1, 7, 1, 1, 1, 2, - 1, 7, 1, 1, 1, 1, 1, 1, 0, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 4, 2, 3, 4, - 5, 3, 3, 1, 1, 3, 6, 3, 1, 2, - 1, 6, 6, 3, 1, 0, 3, 3, 1, 2, - 1, 3, 3, 5, 6, 6, 5, 6, 6, 6, - 6, 2, 1, 5, 1, 1, 1, 1, 2, 1, - 5, 1, 3, 1, 1, 3, 6, 3, 1, 3, - 3, 1, 3, 5, 3, 3, 1, 5, 6, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 0, 3, 1, 3, 3, 3, - 3, 3, 1, 2, 2, 2, 2, 1, 4, 1, - 3, 3, 1, 4, 1, 3, 4, 6, 1, 1, - 1, 1, 1, 0, 3, 3, 1, 1, 3, 1, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1 -}; - - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - YYPOPSTACK (yylen); \ - yystate = *yyssp; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (param, YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (0) - -/* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 - - - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) - -/* This macro is provided for backward compatibility. */ -#ifndef YY_LOCATION_PRINT -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -#endif - - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value, param); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (0) - - -/*----------------------------------------. -| Print this symbol's value on YYOUTPUT. | -`----------------------------------------*/ - -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, struct parser_param *param) -{ - FILE *yyo = yyoutput; - YYUSE (yyo); - YYUSE (param); - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# endif - YYUSE (yytype); -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, struct parser_param *param) -{ - YYFPRINTF (yyoutput, "%s %s (", - yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); - - yy_symbol_value_print (yyoutput, yytype, yyvaluep, param); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -static void -yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -{ - YYFPRINTF (stderr, "Stack now"); - for (; yybottom <= yytop; yybottom++) - { - int yybot = *yybottom; - YYFPRINTF (stderr, " %d", yybot); - } - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (0) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -static void -yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, struct parser_param *param) -{ - unsigned long int yylno = yyrline[yyrule]; - int yynrhs = yyr2[yyrule]; - int yyi; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, - yystos[yyssp[yyi + 1 - yynrhs]], - &(yyvsp[(yyi + 1) - (yynrhs)]) - , param); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyssp, yyvsp, Rule, param); \ -} while (0) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -static YYSIZE_T -yystrlen (const char *yystr) -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -static char * -yystpcpy (char *yydest, const char *yysrc) -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message - about the unexpected token YYTOKEN for the state stack whose top is - YYSSP. - - Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is - not large enough to hold the message. In that case, also set - *YYMSG_ALLOC to the required number of bytes. Return 2 if the - required number of bytes is too large to store. */ -static int -yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, - yytype_int16 *yyssp, int yytoken) -{ - YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); - YYSIZE_T yysize = yysize0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - /* Internationalized format string. */ - const char *yyformat = YY_NULLPTR; - /* Arguments of yyformat. */ - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - /* Number of reported tokens (one for the "unexpected", one per - "expected"). */ - int yycount = 0; - - /* There are many possibilities here to consider: - - If this state is a consistent state with a default action, then - the only way this function was invoked is if the default action - is an error action. In that case, don't check for expected - tokens because there are none. - - The only way there can be no lookahead present (in yychar) is if - this state is a consistent state with a default action. Thus, - detecting the absence of a lookahead is sufficient to determine - that there is no unexpected or expected token to report. In that - case, just report a simple "syntax error". - - Don't assume there isn't a lookahead just because this state is a - consistent state with a default action. There might have been a - previous inconsistent state, consistent state with a non-default - action, or user semantic action that manipulated yychar. - - Of course, the expected token list depends on states to have - correct lookahead information, and it depends on the parser not - to perform extra reductions after fetching a lookahead from the - scanner and before detecting a syntax error. Thus, state merging - (from LALR or IELR) and default reductions corrupt the expected - token list. However, the list is correct for canonical LR with - one exception: it will still contain any token that will not be - accepted due to an error action in a later state. - */ - if (yytoken != YYEMPTY) - { - int yyn = yypact[*yyssp]; - yyarg[yycount++] = yytname[yytoken]; - if (!yypact_value_is_default (yyn)) - { - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. In other words, skip the first -YYN actions for - this state because they are default actions. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yyx; - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR - && !yytable_value_is_error (yytable[yyx + yyn])) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - break; - } - yyarg[yycount++] = yytname[yyx]; - { - YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); - if (! (yysize <= yysize1 - && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } - } - } - } - - switch (yycount) - { -# define YYCASE_(N, S) \ - case N: \ - yyformat = S; \ - break - YYCASE_(0, YY_("syntax error")); - YYCASE_(1, YY_("syntax error, unexpected %s")); - YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); - YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); - YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); - YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); -# undef YYCASE_ - } - - { - YYSIZE_T yysize1 = yysize + yystrlen (yyformat); - if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } - - if (*yymsg_alloc < yysize) - { - *yymsg_alloc = 2 * yysize; - if (! (yysize <= *yymsg_alloc - && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) - *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; - return 1; - } - - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - { - char *yyp = *yymsg; - int yyi = 0; - while ((*yyp = *yyformat) != '\0') - if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyformat += 2; - } - else - { - yyp++; - yyformat++; - } - } - return 0; -} -#endif /* YYERROR_VERBOSE */ - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, struct parser_param *param) -{ - YYUSE (yyvaluep); - YYUSE (param); - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - switch (yytype) - { - case 52: /* STRING */ -#line 225 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { free(((*yyvaluep).str)); } -#line 1429 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 55: /* IDENT */ -#line 225 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { free(((*yyvaluep).str)); } -#line 1435 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 66: /* XkbFile */ -#line 224 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { if (!param->rtrn) FreeXkbFile(((*yyvaluep).file)); } -#line 1441 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 67: /* XkbCompositeMap */ -#line 224 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { if (!param->rtrn) FreeXkbFile(((*yyvaluep).file)); } -#line 1447 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 69: /* XkbMapConfigList */ -#line 224 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { if (!param->rtrn) FreeXkbFile(((*yyvaluep).file)); } -#line 1453 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 70: /* XkbMapConfig */ -#line 224 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { if (!param->rtrn) FreeXkbFile(((*yyvaluep).file)); } -#line 1459 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 75: /* DeclList */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).any)); } -#line 1465 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 76: /* Decl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).any)); } -#line 1471 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 77: /* VarDecl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).var)); } -#line 1477 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 78: /* KeyNameDecl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).keyCode)); } -#line 1483 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 79: /* KeyAliasDecl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).keyAlias)); } -#line 1489 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 80: /* VModDecl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).vmod)); } -#line 1495 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 81: /* VModDefList */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).vmod)); } -#line 1501 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 82: /* VModDef */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).vmod)); } -#line 1507 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 83: /* InterpretDecl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).interp)); } -#line 1513 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 84: /* InterpretMatch */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).interp)); } -#line 1519 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 85: /* VarDeclList */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).var)); } -#line 1525 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 86: /* KeyTypeDecl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).keyType)); } -#line 1531 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 87: /* SymbolsDecl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).syms)); } -#line 1537 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 88: /* SymbolsBody */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).var)); } -#line 1543 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 89: /* SymbolsVarDecl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).var)); } -#line 1549 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 90: /* ArrayInit */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1555 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 91: /* GroupCompatDecl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).groupCompat)); } -#line 1561 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 92: /* ModMapDecl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).modMask)); } -#line 1567 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 93: /* LedMapDecl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).ledMap)); } -#line 1573 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 94: /* LedNameDecl */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).ledName)); } -#line 1579 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 108: /* CoordList */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1585 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 109: /* Coord */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1591 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 116: /* OptExprList */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1597 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 117: /* ExprList */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1603 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 118: /* Expr */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1609 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 119: /* Term */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1615 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 120: /* ActionList */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1621 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 121: /* Action */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1627 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 122: /* Lhs */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1633 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 123: /* Terminal */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1639 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 124: /* OptKeySymList */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1645 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 125: /* KeySymList */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1651 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 126: /* KeySyms */ -#line 219 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { FreeStmt((ParseCommon *) ((*yyvaluep).expr)); } -#line 1657 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 135: /* OptMapName */ -#line 225 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { free(((*yyvaluep).str)); } -#line 1663 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - case 136: /* MapName */ -#line 225 "../src/xkbcomp/parser.y" /* yacc.c:1257 */ - { free(((*yyvaluep).str)); } -#line 1669 "xkbcommon-internal@sta/parser.c" /* yacc.c:1257 */ - break; - - - default: - break; - } - YY_IGNORE_MAYBE_UNINITIALIZED_END -} - - - - -/*----------. -| yyparse. | -`----------*/ - -int -yyparse (struct parser_param *param) -{ -/* The lookahead symbol. */ -int yychar; - - -/* The semantic value of the lookahead symbol. */ -/* Default value used for initialization, for pacifying older GCCs - or non-GCC compilers. */ -YY_INITIAL_VALUE (static YYSTYPE yyval_default;) -YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); - - /* Number of syntax errors so far. */ - int yynerrs; - - int yystate; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - - /* The stacks and their tools: - 'yyss': related to states. - 'yyvs': related to semantic values. - - Refer to the stacks through separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; - - YYSIZE_T yystacksize; - - int yyn; - int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken = 0; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - yyssp = yyss = yyssa; - yyvsp = yyvs = yyvsa; - yystacksize = YYINITDEPTH; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - if (yystate == YYFINAL) - YYACCEPT; - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. */ - yyn = yypact[yystate]; - if (yypact_value_is_default (yyn)) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = yylex (&yylval, param_scanner); - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yytable_value_is_error (yyn)) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token. */ - yychar = YYEMPTY; - - yystate = yyn; - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - '$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 2: -#line 242 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file) = param->rtrn = (yyvsp[0].file); param->more_maps = !!param->rtrn; } -#line 1937 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 3: -#line 244 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file) = param->rtrn = (yyvsp[0].file); param->more_maps = !!param->rtrn; YYACCEPT; } -#line 1943 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 4: -#line 246 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file) = param->rtrn = NULL; param->more_maps = false; } -#line 1949 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 5: -#line 252 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file) = XkbFileCreate((yyvsp[-5].file_type), (yyvsp[-4].str), (ParseCommon *) (yyvsp[-2].file), (yyvsp[-6].mapFlags)); } -#line 1955 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 6: -#line 255 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file_type) = FILE_TYPE_KEYMAP; } -#line 1961 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 7: -#line 256 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file_type) = FILE_TYPE_KEYMAP; } -#line 1967 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 8: -#line 257 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file_type) = FILE_TYPE_KEYMAP; } -#line 1973 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 9: -#line 261 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - if (!(yyvsp[0].file)) - (yyval.file) = (yyvsp[-1].file); - else - (yyval.file) = (XkbFile *) AppendStmt((ParseCommon *) (yyvsp[-1].file), - (ParseCommon *) (yyvsp[0].file)); - } -#line 1985 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 10: -#line 269 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file) = (yyvsp[0].file); } -#line 1991 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 11: -#line 275 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyval.file) = XkbFileCreate((yyvsp[-5].file_type), (yyvsp[-4].str), (yyvsp[-2].any), (yyvsp[-6].mapFlags)); - } -#line 1999 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 12: -#line 280 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file_type) = FILE_TYPE_KEYCODES; } -#line 2005 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 13: -#line 281 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file_type) = FILE_TYPE_TYPES; } -#line 2011 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 14: -#line 282 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file_type) = FILE_TYPE_COMPAT; } -#line 2017 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 15: -#line 283 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file_type) = FILE_TYPE_SYMBOLS; } -#line 2023 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 16: -#line 284 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.file_type) = FILE_TYPE_GEOMETRY; } -#line 2029 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 17: -#line 287 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.mapFlags) = (yyvsp[0].mapFlags); } -#line 2035 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 18: -#line 288 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.mapFlags) = 0; } -#line 2041 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 19: -#line 291 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.mapFlags) = ((yyvsp[-1].mapFlags) | (yyvsp[0].mapFlags)); } -#line 2047 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 20: -#line 292 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.mapFlags) = (yyvsp[0].mapFlags); } -#line 2053 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 21: -#line 295 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.mapFlags) = MAP_IS_PARTIAL; } -#line 2059 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 22: -#line 296 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.mapFlags) = MAP_IS_DEFAULT; } -#line 2065 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 23: -#line 297 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.mapFlags) = MAP_IS_HIDDEN; } -#line 2071 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 24: -#line 298 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.mapFlags) = MAP_HAS_ALPHANUMERIC; } -#line 2077 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 25: -#line 299 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.mapFlags) = MAP_HAS_MODIFIER; } -#line 2083 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 26: -#line 300 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.mapFlags) = MAP_HAS_KEYPAD; } -#line 2089 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 27: -#line 301 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.mapFlags) = MAP_HAS_FN; } -#line 2095 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 28: -#line 302 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.mapFlags) = MAP_IS_ALTGR; } -#line 2101 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 29: -#line 306 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.any) = AppendStmt((yyvsp[-1].any), (yyvsp[0].any)); } -#line 2107 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 30: -#line 307 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.any) = NULL; } -#line 2113 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 31: -#line 311 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyvsp[0].var)->merge = (yyvsp[-1].merge); - (yyval.any) = (ParseCommon *) (yyvsp[0].var); - } -#line 2122 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 32: -#line 316 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyvsp[0].vmod)->merge = (yyvsp[-1].merge); - (yyval.any) = (ParseCommon *) (yyvsp[0].vmod); - } -#line 2131 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 33: -#line 321 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyvsp[0].interp)->merge = (yyvsp[-1].merge); - (yyval.any) = (ParseCommon *) (yyvsp[0].interp); - } -#line 2140 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 34: -#line 326 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyvsp[0].keyCode)->merge = (yyvsp[-1].merge); - (yyval.any) = (ParseCommon *) (yyvsp[0].keyCode); - } -#line 2149 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 35: -#line 331 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyvsp[0].keyAlias)->merge = (yyvsp[-1].merge); - (yyval.any) = (ParseCommon *) (yyvsp[0].keyAlias); - } -#line 2158 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 36: -#line 336 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyvsp[0].keyType)->merge = (yyvsp[-1].merge); - (yyval.any) = (ParseCommon *) (yyvsp[0].keyType); - } -#line 2167 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 37: -#line 341 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyvsp[0].syms)->merge = (yyvsp[-1].merge); - (yyval.any) = (ParseCommon *) (yyvsp[0].syms); - } -#line 2176 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 38: -#line 346 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyvsp[0].modMask)->merge = (yyvsp[-1].merge); - (yyval.any) = (ParseCommon *) (yyvsp[0].modMask); - } -#line 2185 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 39: -#line 351 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyvsp[0].groupCompat)->merge = (yyvsp[-1].merge); - (yyval.any) = (ParseCommon *) (yyvsp[0].groupCompat); - } -#line 2194 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 40: -#line 356 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyvsp[0].ledMap)->merge = (yyvsp[-1].merge); - (yyval.any) = (ParseCommon *) (yyvsp[0].ledMap); - } -#line 2203 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 41: -#line 361 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyvsp[0].ledName)->merge = (yyvsp[-1].merge); - (yyval.any) = (ParseCommon *) (yyvsp[0].ledName); - } -#line 2212 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 42: -#line 365 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.any) = NULL; } -#line 2218 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 43: -#line 366 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.any) = NULL; } -#line 2224 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 44: -#line 367 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.any) = NULL; } -#line 2230 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 45: -#line 369 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - (yyval.any) = (ParseCommon *) IncludeCreate(param->ctx, (yyvsp[0].str), (yyvsp[-1].merge)); - free((yyvsp[0].str)); - } -#line 2239 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 46: -#line 376 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = VarCreate((yyvsp[-3].expr), (yyvsp[-1].expr)); } -#line 2245 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 47: -#line 378 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = BoolVarCreate((yyvsp[-1].atom), true); } -#line 2251 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 48: -#line 380 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = BoolVarCreate((yyvsp[-1].atom), false); } -#line 2257 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 49: -#line 384 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.keyCode) = KeycodeCreate((yyvsp[-3].atom), (yyvsp[-1].num)); } -#line 2263 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 50: -#line 388 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.keyAlias) = KeyAliasCreate((yyvsp[-3].atom), (yyvsp[-1].atom)); } -#line 2269 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 51: -#line 392 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.vmod) = (yyvsp[-1].vmod); } -#line 2275 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 52: -#line 396 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.vmod) = (VModDef *) AppendStmt((ParseCommon *) (yyvsp[-2].vmod), - (ParseCommon *) (yyvsp[0].vmod)); } -#line 2282 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 53: -#line 399 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.vmod) = (yyvsp[0].vmod); } -#line 2288 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 54: -#line 403 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.vmod) = VModCreate((yyvsp[0].atom), NULL); } -#line 2294 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 55: -#line 405 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.vmod) = VModCreate((yyvsp[-2].atom), (yyvsp[0].expr)); } -#line 2300 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 56: -#line 411 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyvsp[-4].interp)->def = (yyvsp[-2].var); (yyval.interp) = (yyvsp[-4].interp); } -#line 2306 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 57: -#line 415 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.interp) = InterpCreate((yyvsp[-2].keysym), (yyvsp[0].expr)); } -#line 2312 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 58: -#line 417 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.interp) = InterpCreate((yyvsp[0].keysym), NULL); } -#line 2318 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 59: -#line 421 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = (VarDef *) AppendStmt((ParseCommon *) (yyvsp[-1].var), - (ParseCommon *) (yyvsp[0].var)); } -#line 2325 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 60: -#line 424 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = (yyvsp[0].var); } -#line 2331 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 61: -#line 430 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.keyType) = KeyTypeCreate((yyvsp[-4].atom), (yyvsp[-2].var)); } -#line 2337 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 62: -#line 436 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.syms) = SymbolsCreate((yyvsp[-4].atom), (yyvsp[-2].var)); } -#line 2343 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 63: -#line 440 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = (VarDef *) AppendStmt((ParseCommon *) (yyvsp[-2].var), - (ParseCommon *) (yyvsp[0].var)); } -#line 2350 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 64: -#line 443 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = (yyvsp[0].var); } -#line 2356 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 65: -#line 444 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = NULL; } -#line 2362 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 66: -#line 447 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = VarCreate((yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2368 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 67: -#line 448 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = VarCreate((yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2374 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 68: -#line 449 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = BoolVarCreate((yyvsp[0].atom), true); } -#line 2380 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 69: -#line 450 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = BoolVarCreate((yyvsp[0].atom), false); } -#line 2386 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 70: -#line 451 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.var) = VarCreate(NULL, (yyvsp[0].expr)); } -#line 2392 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 71: -#line 455 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = (yyvsp[-1].expr); } -#line 2398 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 72: -#line 457 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateUnary(EXPR_ACTION_LIST, EXPR_TYPE_ACTION, (yyvsp[-1].expr)); } -#line 2404 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 73: -#line 461 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.groupCompat) = GroupCompatCreate((yyvsp[-3].ival), (yyvsp[-1].expr)); } -#line 2410 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 74: -#line 465 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.modMask) = ModMapCreate((yyvsp[-4].atom), (yyvsp[-2].expr)); } -#line 2416 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 75: -#line 469 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ledMap) = LedMapCreate((yyvsp[-4].atom), (yyvsp[-2].var)); } -#line 2422 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 76: -#line 473 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ledName) = LedNameCreate((yyvsp[-3].ival), (yyvsp[-1].expr), false); } -#line 2428 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 77: -#line 475 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ledName) = LedNameCreate((yyvsp[-3].ival), (yyvsp[-1].expr), true); } -#line 2434 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 78: -#line 479 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2440 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 79: -#line 481 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (void) (yyvsp[-2].expr); (yyval.geom) = NULL; } -#line 2446 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 80: -#line 485 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2452 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 81: -#line 488 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL;} -#line 2458 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 82: -#line 489 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2464 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 83: -#line 493 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2470 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 84: -#line 495 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { FreeStmt((ParseCommon *) (yyvsp[0].var)); (yyval.geom) = NULL; } -#line 2476 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 85: -#line 497 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2482 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 86: -#line 499 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { FreeStmt((ParseCommon *) (yyvsp[0].ledMap)); (yyval.geom) = NULL; } -#line 2488 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 87: -#line 501 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2494 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 88: -#line 504 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL;} -#line 2500 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 89: -#line 505 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2506 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 90: -#line 508 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2512 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 91: -#line 510 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { FreeStmt((ParseCommon *) (yyvsp[0].var)); (yyval.geom) = NULL; } -#line 2518 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 92: -#line 513 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2524 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 93: -#line 514 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2530 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 94: -#line 518 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2536 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 95: -#line 520 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { FreeStmt((ParseCommon *) (yyvsp[-1].expr)); (yyval.geom) = NULL; } -#line 2542 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 96: -#line 524 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2548 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 97: -#line 527 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2554 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 98: -#line 528 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2560 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 99: -#line 531 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2566 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 100: -#line 535 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL;} -#line 2572 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 101: -#line 537 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.geom) = NULL; } -#line 2578 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 102: -#line 541 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (void) (yyvsp[-1].expr); (yyval.geom) = NULL; } -#line 2584 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 103: -#line 543 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (void) (yyvsp[-1].expr); (yyval.geom) = NULL; } -#line 2590 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 104: -#line 545 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { FreeStmt((ParseCommon *) (yyvsp[0].expr)); (yyval.geom) = NULL; } -#line 2596 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 105: -#line 549 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (void) (yyvsp[-2].expr); (void) (yyvsp[0].expr); (yyval.expr) = NULL; } -#line 2602 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 106: -#line 551 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (void) (yyvsp[0].expr); (yyval.expr) = NULL; } -#line 2608 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 107: -#line 555 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = NULL; } -#line 2614 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 108: -#line 559 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { FreeStmt((ParseCommon *) (yyvsp[-2].var)); (yyval.geom) = NULL; } -#line 2620 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 109: -#line 562 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ival) = 0; } -#line 2626 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 110: -#line 563 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ival) = 0; } -#line 2632 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 111: -#line 564 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ival) = 0; } -#line 2638 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 112: -#line 565 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ival) = 0; } -#line 2644 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 113: -#line 568 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = (yyvsp[0].atom); } -#line 2650 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 114: -#line 569 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = (yyvsp[0].atom); } -#line 2656 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 115: -#line 573 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "action"); } -#line 2662 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 116: -#line 575 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "interpret"); } -#line 2668 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 117: -#line 577 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "type"); } -#line 2674 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 118: -#line 579 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "key"); } -#line 2680 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 119: -#line 581 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "group"); } -#line 2686 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 120: -#line 583 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - {(yyval.atom) = xkb_atom_intern_literal(param->ctx, "modifier_map");} -#line 2692 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 121: -#line 585 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "indicator"); } -#line 2698 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 122: -#line 587 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "shape"); } -#line 2704 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 123: -#line 589 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "row"); } -#line 2710 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 124: -#line 591 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "section"); } -#line 2716 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 125: -#line 593 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "text"); } -#line 2722 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 126: -#line 596 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.merge) = (yyvsp[0].merge); } -#line 2728 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 127: -#line 597 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.merge) = MERGE_DEFAULT; } -#line 2734 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 128: -#line 600 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.merge) = MERGE_DEFAULT; } -#line 2740 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 129: -#line 601 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.merge) = MERGE_AUGMENT; } -#line 2746 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 130: -#line 602 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.merge) = MERGE_OVERRIDE; } -#line 2752 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 131: -#line 603 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.merge) = MERGE_REPLACE; } -#line 2758 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 132: -#line 605 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - /* - * This used to be MERGE_ALT_FORM. This functionality was - * unused and has been removed. - */ - (yyval.merge) = MERGE_DEFAULT; - } -#line 2770 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 133: -#line 614 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = (yyvsp[0].expr); } -#line 2776 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 134: -#line 615 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = NULL; } -#line 2782 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 135: -#line 619 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = (ExprDef *) AppendStmt((ParseCommon *) (yyvsp[-2].expr), - (ParseCommon *) (yyvsp[0].expr)); } -#line 2789 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 136: -#line 622 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = (yyvsp[0].expr); } -#line 2795 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 137: -#line 626 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateBinary(EXPR_DIVIDE, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2801 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 138: -#line 628 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateBinary(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2807 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 139: -#line 630 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateBinary(EXPR_SUBTRACT, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2813 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 140: -#line 632 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateBinary(EXPR_MULTIPLY, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2819 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 141: -#line 634 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateBinary(EXPR_ASSIGN, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2825 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 142: -#line 636 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = (yyvsp[0].expr); } -#line 2831 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 143: -#line 640 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateUnary(EXPR_NEGATE, (yyvsp[0].expr)->expr.value_type, (yyvsp[0].expr)); } -#line 2837 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 144: -#line 642 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateUnary(EXPR_UNARY_PLUS, (yyvsp[0].expr)->expr.value_type, (yyvsp[0].expr)); } -#line 2843 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 145: -#line 644 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateUnary(EXPR_NOT, EXPR_TYPE_BOOLEAN, (yyvsp[0].expr)); } -#line 2849 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 146: -#line 646 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateUnary(EXPR_INVERT, (yyvsp[0].expr)->expr.value_type, (yyvsp[0].expr)); } -#line 2855 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 147: -#line 648 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = (yyvsp[0].expr); } -#line 2861 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 148: -#line 650 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateAction((yyvsp[-3].atom), (yyvsp[-1].expr)); } -#line 2867 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 149: -#line 652 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = (yyvsp[0].expr); } -#line 2873 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 150: -#line 654 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = (yyvsp[-1].expr); } -#line 2879 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 151: -#line 658 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = (ExprDef *) AppendStmt((ParseCommon *) (yyvsp[-2].expr), - (ParseCommon *) (yyvsp[0].expr)); } -#line 2886 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 152: -#line 661 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = (yyvsp[0].expr); } -#line 2892 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 153: -#line 665 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateAction((yyvsp[-3].atom), (yyvsp[-1].expr)); } -#line 2898 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 154: -#line 669 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateIdent((yyvsp[0].atom)); } -#line 2904 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 155: -#line 671 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateFieldRef((yyvsp[-2].atom), (yyvsp[0].atom)); } -#line 2910 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 156: -#line 673 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateArrayRef(XKB_ATOM_NONE, (yyvsp[-3].atom), (yyvsp[-1].expr)); } -#line 2916 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 157: -#line 675 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateArrayRef((yyvsp[-5].atom), (yyvsp[-3].atom), (yyvsp[-1].expr)); } -#line 2922 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 158: -#line 679 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateString((yyvsp[0].atom)); } -#line 2928 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 159: -#line 681 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateInteger((yyvsp[0].ival)); } -#line 2934 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 160: -#line 683 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateFloat(/* Discard $1 */); } -#line 2940 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 161: -#line 685 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateKeyName((yyvsp[0].atom)); } -#line 2946 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 162: -#line 688 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = (yyvsp[0].expr); } -#line 2952 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 163: -#line 689 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = NULL; } -#line 2958 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 164: -#line 693 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprAppendKeysymList((yyvsp[-2].expr), (yyvsp[0].keysym)); } -#line 2964 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 165: -#line 695 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprAppendMultiKeysymList((yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2970 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 166: -#line 697 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateKeysymList((yyvsp[0].keysym)); } -#line 2976 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 167: -#line 699 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = ExprCreateMultiKeysymList((yyvsp[0].expr)); } -#line 2982 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 168: -#line 703 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.expr) = (yyvsp[-1].expr); } -#line 2988 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 169: -#line 707 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - if (!resolve_keysym((yyvsp[0].str), &(yyval.keysym))) - parser_warn(param, "unrecognized keysym \"%s\"", (yyvsp[0].str)); - free((yyvsp[0].str)); - } -#line 2998 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 170: -#line 712 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.keysym) = XKB_KEY_section; } -#line 3004 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 171: -#line 714 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { - if ((yyvsp[0].ival) < 0) { - parser_warn(param, "unrecognized keysym \"%d\"", (yyvsp[0].ival)); - (yyval.keysym) = XKB_KEY_NoSymbol; - } - else if ((yyvsp[0].ival) < 10) { /* XKB_KEY_0 .. XKB_KEY_9 */ - (yyval.keysym) = XKB_KEY_0 + (xkb_keysym_t) (yyvsp[0].ival); - } - else { - char buf[17]; - snprintf(buf, sizeof(buf), "0x%x", (yyvsp[0].ival)); - if (!resolve_keysym(buf, &(yyval.keysym))) { - parser_warn(param, "unrecognized keysym \"%s\"", buf); - (yyval.keysym) = XKB_KEY_NoSymbol; - } - } - } -#line 3026 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 172: -#line 733 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ival) = -(yyvsp[0].ival); } -#line 3032 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 173: -#line 734 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ival) = (yyvsp[0].ival); } -#line 3038 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 174: -#line 737 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ival) = (yyvsp[0].num); } -#line 3044 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 175: -#line 738 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ival) = (yyvsp[0].num); } -#line 3050 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 176: -#line 741 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ival) = 0; } -#line 3056 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 177: -#line 744 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.ival) = (yyvsp[0].num); } -#line 3062 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 178: -#line 747 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.num) = (yyvsp[0].num); } -#line 3068 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 179: -#line 750 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_steal(param->ctx, (yyvsp[0].str)); } -#line 3074 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 180: -#line 751 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_intern_literal(param->ctx, "default"); } -#line 3080 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 181: -#line 754 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.atom) = xkb_atom_steal(param->ctx, (yyvsp[0].str)); } -#line 3086 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 182: -#line 757 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.str) = (yyvsp[0].str); } -#line 3092 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 183: -#line 758 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.str) = NULL; } -#line 3098 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - case 184: -#line 761 "../src/xkbcomp/parser.y" /* yacc.c:1646 */ - { (yyval.str) = (yyvsp[0].str); } -#line 3104 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - break; - - -#line 3108 "xkbcommon-internal@sta/parser.c" /* yacc.c:1646 */ - default: break; - } - /* User semantic actions sometimes alter yychar, and that requires - that yytoken be updated with the new translation. We take the - approach of translating immediately before every use of yytoken. - One alternative is translating here after every semantic action, - but that translation would be missed if the semantic action invokes - YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or - if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an - incorrect destructor might then be invoked immediately. In the - case of YYERROR or YYBACKUP, subsequent parser actions might lead - to an incorrect destructor call or verbose syntax error message - before the lookahead is translated. */ - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - /* Now 'shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*--------------------------------------. -| yyerrlab -- here on detecting error. | -`--------------------------------------*/ -yyerrlab: - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); - - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (param, YY_("syntax error")); -#else -# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ - yyssp, yytoken) - { - char const *yymsgp = YY_("syntax error"); - int yysyntax_error_status; - yysyntax_error_status = YYSYNTAX_ERROR; - if (yysyntax_error_status == 0) - yymsgp = yymsg; - else if (yysyntax_error_status == 1) - { - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); - if (!yymsg) - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - yysyntax_error_status = 2; - } - else - { - yysyntax_error_status = YYSYNTAX_ERROR; - yymsgp = yymsg; - } - } - yyerror (param, yymsgp); - if (yysyntax_error_status == 2) - goto yyexhaustedlab; - } -# undef YYSYNTAX_ERROR -#endif - } - - - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval, param); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule whose action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (!yypact_value_is_default (yyn)) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - - yydestruct ("Error: popping", - yystos[yystate], yyvsp, param); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#if !defined yyoverflow || YYERROR_VERBOSE -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (param, YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEMPTY) - { - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = YYTRANSLATE (yychar); - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval, param); - } - /* Do not reclaim the symbols of the rule whose action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp, param); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - return yyresult; -} -#line 764 "../src/xkbcomp/parser.y" /* yacc.c:1906 */ - - -XkbFile * -parse(struct xkb_context *ctx, struct scanner *scanner, const char *map) -{ - int ret; - XkbFile *first = NULL; - struct parser_param param = { - .scanner = scanner, - .ctx = ctx, - .rtrn = NULL, - .more_maps = false, - }; - - /* - * If we got a specific map, we look for it exclusively and return - * immediately upon finding it. Otherwise, we need to get the - * default map. If we find a map marked as default, we return it - * immediately. If there are no maps marked as default, we return - * the first map in the file. - */ - - while ((ret = yyparse(¶m)) == 0 && param.more_maps) { - if (map) { - if (streq_not_null(map, param.rtrn->name)) - return param.rtrn; - else - FreeXkbFile(param.rtrn); - } - else { - if (param.rtrn->flags & MAP_IS_DEFAULT) { - FreeXkbFile(first); - return param.rtrn; - } - else if (!first) { - first = param.rtrn; - } - else { - FreeXkbFile(param.rtrn); - } - } - param.rtrn = NULL; - } - - if (ret != 0) { - FreeXkbFile(first); - return NULL; - } - - if (first) - log_vrb(ctx, 5, - "No map in include statement, but \"%s\" contains several; " - "Using first defined map, \"%s\"\n", - scanner->file_name, first->name); - - return first; -} diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp-priv.h b/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp-priv.h deleted file mode 100644 index 6cb774da17..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp-priv.h +++ /dev/null @@ -1,124 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#ifndef XKBCOMP_PRIV_H -#define XKBCOMP_PRIV_H - -#include "keymap.h" -#include "ast.h" - -struct xkb_component_names { - char *keycodes; - char *types; - char *compat; - char *symbols; -}; - -char * -text_v1_keymap_get_as_string(struct xkb_keymap *keymap); - -XkbFile * -XkbParseFile(struct xkb_context *ctx, FILE *file, - const char *file_name, const char *map); - -XkbFile * -XkbParseString(struct xkb_context *ctx, - const char *string, size_t len, - const char *file_name, const char *map); - -void -FreeXkbFile(XkbFile *file); - -XkbFile * -XkbFileFromComponents(struct xkb_context *ctx, - const struct xkb_component_names *kkctgs); - -bool -CompileKeycodes(XkbFile *file, struct xkb_keymap *keymap, - enum merge_mode merge); - -bool -CompileKeyTypes(XkbFile *file, struct xkb_keymap *keymap, - enum merge_mode merge); - -bool -CompileCompatMap(XkbFile *file, struct xkb_keymap *keymap, - enum merge_mode merge); - -bool -CompileSymbols(XkbFile *file, struct xkb_keymap *keymap, - enum merge_mode merge); - -bool -CompileKeymap(XkbFile *file, struct xkb_keymap *keymap, - enum merge_mode merge); - -/***====================================================================***/ - -static inline bool -ReportNotArray(struct xkb_context *ctx, const char *type, const char *field, - const char *name) -{ - log_err(ctx, - "The %s %s field is not an array; " - "Ignoring illegal assignment in %s\n", - type, field, name); - return false; -} - -static inline bool -ReportShouldBeArray(struct xkb_context *ctx, const char *type, - const char *field, const char *name) -{ - log_err(ctx, - "Missing subscript for %s %s; " - "Ignoring illegal assignment in %s\n", - type, field, name); - return false; -} - -static inline bool -ReportBadType(struct xkb_context *ctx, const char *type, const char *field, - const char *name, const char *wanted) -{ - log_err(ctx, "The %s %s field must be a %s; " - "Ignoring illegal assignment in %s\n", - type, field, wanted, name); - return false; -} - -static inline bool -ReportBadField(struct xkb_context *ctx, const char *type, const char *field, - const char *name) -{ - log_err(ctx, - "Unknown %s field %s in %s; " - "Ignoring assignment to unknown field in %s\n", - type, field, name, name); - return false; -} - -#endif diff --git a/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp.c b/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp.c deleted file mode 100644 index 007e3f73e8..0000000000 --- a/src/3rdparty/xkbcommon/src/xkbcomp/xkbcomp.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright © 2009 Dan Nicholson - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita <ran234@gmail.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: Dan Nicholson <dbn.lists@gmail.com> - * Ran Benita <ran234@gmail.com> - * Daniel Stone <daniel@fooishbar.org> - */ - -#include "xkbcomp-priv.h" -#include "rules.h" - -static bool -compile_keymap_file(struct xkb_keymap *keymap, XkbFile *file) -{ - if (file->file_type != FILE_TYPE_KEYMAP) { - log_err(keymap->ctx, - "Cannot compile a %s file alone into a keymap\n", - xkb_file_type_to_string(file->file_type)); - return false; - } - - if (!CompileKeymap(file, keymap, MERGE_OVERRIDE)) { - log_err(keymap->ctx, - "Failed to compile keymap\n"); - return false; - } - - return true; -} - -static bool -text_v1_keymap_new_from_names(struct xkb_keymap *keymap, - const struct xkb_rule_names *rmlvo) -{ - bool ok; - struct xkb_component_names kccgst; - XkbFile *file; - - log_dbg(keymap->ctx, - "Compiling from RMLVO: rules '%s', model '%s', layout '%s', " - "variant '%s', options '%s'\n", - rmlvo->rules, rmlvo->model, rmlvo->layout, rmlvo->variant, - rmlvo->options); - - ok = xkb_components_from_rules(keymap->ctx, rmlvo, &kccgst); - if (!ok) { - log_err(keymap->ctx, - "Couldn't look up rules '%s', model '%s', layout '%s', " - "variant '%s', options '%s'\n", - rmlvo->rules, rmlvo->model, rmlvo->layout, rmlvo->variant, - rmlvo->options); - return false; - } - - log_dbg(keymap->ctx, - "Compiling from KcCGST: keycodes '%s', types '%s', " - "compat '%s', symbols '%s'\n", - kccgst.keycodes, kccgst.types, kccgst.compat, kccgst.symbols); - - file = XkbFileFromComponents(keymap->ctx, &kccgst); - - free(kccgst.keycodes); - free(kccgst.types); - free(kccgst.compat); - free(kccgst.symbols); - - if (!file) { - log_err(keymap->ctx, - "Failed to generate parsed XKB file from components\n"); - return false; - } - - ok = compile_keymap_file(keymap, file); - FreeXkbFile(file); - return ok; -} - -static bool -text_v1_keymap_new_from_string(struct xkb_keymap *keymap, - const char *string, size_t len) -{ - bool ok; - XkbFile *xkb_file; - - xkb_file = XkbParseString(keymap->ctx, string, len, "(input string)", NULL); - if (!xkb_file) { - log_err(keymap->ctx, "Failed to parse input xkb string\n"); - return NULL; - } - - ok = compile_keymap_file(keymap, xkb_file); - FreeXkbFile(xkb_file); - return ok; -} - -static bool -text_v1_keymap_new_from_file(struct xkb_keymap *keymap, FILE *file) -{ - bool ok; - XkbFile *xkb_file; - - xkb_file = XkbParseFile(keymap->ctx, file, "(unknown file)", NULL); - if (!xkb_file) { - log_err(keymap->ctx, "Failed to parse input xkb file\n"); - return false; - } - - ok = compile_keymap_file(keymap, xkb_file); - FreeXkbFile(xkb_file); - return ok; -} - -const struct xkb_keymap_format_ops text_v1_keymap_format_ops = { - .keymap_new_from_names = text_v1_keymap_new_from_names, - .keymap_new_from_string = text_v1_keymap_new_from_string, - .keymap_new_from_file = text_v1_keymap_new_from_file, - .keymap_get_as_string = text_v1_keymap_get_as_string, -}; |