1 /************************************************************
2 * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
4 * Permission to use, copy, modify, and distribute this
5 * software and its documentation for any purpose and without
6 * fee is hereby granted, provided that the above copyright
7 * notice appear in all copies and that both that copyright
8 * notice and this permission notice appear in supporting
9 * documentation, and that the name of Silicon Graphics not be
10 * used in advertising or publicity pertaining to distribution
11 * of the software without specific prior written permission.
12 * Silicon Graphics makes no representation about the suitability
13 * of this software for any purpose. It is provided "as is"
14 * without any express or implied warranty.
16 * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18 * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19 * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
23 * THE USE OR PERFORMANCE OF THIS SOFTWARE.
25 ********************************************************/
28 * Copyright © 2012 Intel Corporation
29 * Copyright © 2012 Ran Benita <ran234@gmail.com>
31 * Permission is hereby granted, free of charge, to any person obtaining a
32 * copy of this software and associated documentation files (the "Software"),
33 * to deal in the Software without restriction, including without limitation
34 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
35 * and/or sell copies of the Software, and to permit persons to whom the
36 * Software is furnished to do so, subject to the following conditions:
38 * The above copyright notice and this permission notice (including the next
39 * paragraph) shall be included in all copies or substantial portions of the
42 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
43 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
44 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
45 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
46 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
47 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
48 * DEALINGS IN THE SOFTWARE.
50 * Author: Daniel Stone <daniel@fooishbar.org>
51 * Ran Benita <ran234@gmail.com>
54 #include "xkbcomp-priv.h"
55 #include "ast-build.h"
56 #include "parser-priv.h"
60 AppendStmt(ParseCommon *to, ParseCommon *append)
67 for (iter = to; iter->next; iter = iter->next);
74 ExprCreate(enum expr_op_type op, enum expr_value_type type)
76 ExprDef *expr = malloc(sizeof(*expr));
80 expr->common.type = STMT_EXPR;
81 expr->common.next = NULL;
83 expr->value_type = type;
89 ExprCreateString(xkb_atom_t str)
91 ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_STRING);
95 expr->value.str = str;
101 ExprCreateInteger(int ival)
103 ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_INT);
107 expr->value.ival = ival;
113 ExprCreateBoolean(bool set)
115 ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_BOOLEAN);
119 expr->value.set = set;
125 ExprCreateKeyName(xkb_atom_t key_name)
127 ExprDef *expr = ExprCreate(EXPR_VALUE, EXPR_TYPE_KEYNAME);
131 expr->value.keyName = key_name;
137 ExprCreateIdent(xkb_atom_t ident)
139 ExprDef *expr = ExprCreate(EXPR_IDENT, EXPR_TYPE_UNKNOWN);
143 expr->value.ident = ident;
149 ExprCreateUnary(enum expr_op_type op, enum expr_value_type type,
152 ExprDef *expr = ExprCreate(op, type);
156 expr->value.child = child;
162 ExprCreateBinary(enum expr_op_type op, ExprDef *left, ExprDef *right)
164 ExprDef *expr = ExprCreate(op, EXPR_TYPE_UNKNOWN);
168 if (op == EXPR_ASSIGN || left->value_type == EXPR_TYPE_UNKNOWN)
169 expr->value_type = right->value_type;
170 else if (left->value_type == right->value_type ||
171 right->value_type == EXPR_TYPE_UNKNOWN)
172 expr->value_type = left->value_type;
173 expr->value.binary.left = left;
174 expr->value.binary.right = right;
180 ExprCreateFieldRef(xkb_atom_t element, xkb_atom_t field)
182 ExprDef *expr = ExprCreate(EXPR_FIELD_REF, EXPR_TYPE_UNKNOWN);
186 expr->value.field.element = element;
187 expr->value.field.field = field;
193 ExprCreateArrayRef(xkb_atom_t element, xkb_atom_t field, ExprDef *entry)
195 ExprDef *expr = ExprCreate(EXPR_ARRAY_REF, EXPR_TYPE_UNKNOWN);
199 expr->value.array.element = element;
200 expr->value.array.field = field;
201 expr->value.array.entry = entry;
207 KeycodeCreate(xkb_atom_t name, int64_t value)
209 KeycodeDef *def = malloc(sizeof(*def));
213 def->common.type = STMT_KEYCODE;
214 def->common.next = NULL;
222 KeyAliasCreate(xkb_atom_t alias, xkb_atom_t real)
224 KeyAliasDef *def = malloc(sizeof(*def));
228 def->common.type = STMT_ALIAS;
229 def->common.next = NULL;
237 VModCreate(xkb_atom_t name, ExprDef *value)
239 VModDef *def = malloc(sizeof(*def));
243 def->common.type = STMT_VMOD;
244 def->common.next = NULL;
252 VarCreate(ExprDef *name, ExprDef *value)
254 VarDef *def = malloc(sizeof(*def));
258 def->common.type = STMT_VAR;
259 def->common.next = NULL;
267 BoolVarCreate(xkb_atom_t ident, bool set)
269 return VarCreate(ExprCreateIdent(ident),
270 ExprCreateBoolean(set));
274 InterpCreate(xkb_keysym_t sym, ExprDef *match)
276 InterpDef *def = malloc(sizeof(*def));
280 def->common.type = STMT_INTERP;
281 def->common.next = NULL;
289 KeyTypeCreate(xkb_atom_t name, VarDef *body)
291 KeyTypeDef *def = malloc(sizeof(*def));
295 def->common.type = STMT_TYPE;
296 def->common.next = NULL;
297 def->merge = MERGE_DEFAULT;
305 SymbolsCreate(xkb_atom_t keyName, VarDef *symbols)
307 SymbolsDef *def = malloc(sizeof(*def));
311 def->common.type = STMT_SYMBOLS;
312 def->common.next = NULL;
313 def->merge = MERGE_DEFAULT;
314 def->keyName = keyName;
315 def->symbols = symbols;
321 GroupCompatCreate(int group, ExprDef *val)
323 GroupCompatDef *def = malloc(sizeof(*def));
327 def->common.type = STMT_GROUP_COMPAT;
328 def->common.next = NULL;
329 def->merge = MERGE_DEFAULT;
337 ModMapCreate(uint32_t modifier, ExprDef *keys)
339 ModMapDef *def = malloc(sizeof(*def));
343 def->common.type = STMT_MODMAP;
344 def->common.next = NULL;
345 def->merge = MERGE_DEFAULT;
346 def->modifier = modifier;
353 LedMapCreate(xkb_atom_t name, VarDef *body)
355 LedMapDef *def = malloc(sizeof(*def));
359 def->common.type = STMT_LED_MAP;
360 def->common.next = NULL;
361 def->merge = MERGE_DEFAULT;
369 LedNameCreate(int ndx, ExprDef *name, bool virtual)
371 LedNameDef *def = malloc(sizeof(*def));
375 def->common.type = STMT_LED_NAME;
376 def->common.next = NULL;
377 def->merge = MERGE_DEFAULT;
380 def->virtual = virtual;
386 ActionCreate(xkb_atom_t name, ExprDef *args)
388 ExprDef *act = ExprCreate(EXPR_ACTION_DECL, EXPR_TYPE_UNKNOWN);
392 act->value.action.name = name;
393 act->value.action.args = args;
399 CreateKeysymList(xkb_keysym_t sym)
401 ExprDef *def = ExprCreate(EXPR_KEYSYM_LIST, EXPR_TYPE_SYMBOLS);
405 darray_init(def->value.list.syms);
406 darray_init(def->value.list.symsMapIndex);
407 darray_init(def->value.list.symsNumEntries);
409 darray_append(def->value.list.syms, sym);
410 darray_append(def->value.list.symsMapIndex, 0);
411 darray_append(def->value.list.symsNumEntries, 1);
417 CreateMultiKeysymList(ExprDef *list)
419 size_t nLevels = darray_size(list->value.list.symsMapIndex);
421 darray_resize(list->value.list.symsMapIndex, 1);
422 darray_resize(list->value.list.symsNumEntries, 1);
423 darray_item(list->value.list.symsMapIndex, 0) = 0;
424 darray_item(list->value.list.symsNumEntries, 0) = nLevels;
430 AppendKeysymList(ExprDef *list, xkb_keysym_t sym)
432 size_t nSyms = darray_size(list->value.list.syms);
434 darray_append(list->value.list.symsMapIndex, nSyms);
435 darray_append(list->value.list.symsNumEntries, 1);
436 darray_append(list->value.list.syms, sym);
442 AppendMultiKeysymList(ExprDef *list, ExprDef *append)
444 size_t nSyms = darray_size(list->value.list.syms);
445 size_t numEntries = darray_size(append->value.list.syms);
447 darray_append(list->value.list.symsMapIndex, nSyms);
448 darray_append(list->value.list.symsNumEntries, numEntries);
449 darray_append_items(list->value.list.syms,
450 darray_mem(append->value.list.syms, 0),
453 darray_resize(append->value.list.syms, 0);
454 FreeStmt(&append->common);
460 FreeInclude(IncludeStmt *incl);
463 IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge)
465 IncludeStmt *incl, *first;
466 char *file, *map, *stmt, *tmp, *extra_data;
472 stmt = strdup_safe(str);
475 if (!ParseIncludeMap(&tmp, &file, &map, &nextop, &extra_data))
479 * Given an RMLVO (here layout) like 'us,,fr', the rules parser
480 * will give out something like 'pc+us+:2+fr:3+inet(evdev)'.
481 * We should just skip the ':2' in this case and leave it to the
482 * appropriate section to deal with the empty group.
492 first = incl = malloc(sizeof(*first));
494 incl->next_incl = malloc(sizeof(*first));
495 incl = incl->next_incl;
500 "Allocation failure in IncludeCreate; "
501 "Using only part of the include\n");
505 incl->common.type = STMT_INCLUDE;
506 incl->common.next = NULL;
511 incl->modifier = extra_data;
512 incl->next_incl = NULL;
515 merge = MERGE_AUGMENT;
517 merge = MERGE_OVERRIDE;
528 log_err(ctx, "Illegal include statement \"%s\"; Ignored\n", stmt);
535 XkbEscapeMapName(char *name)
538 * All latin-1 alphanumerics, plus parens, slash, minus, underscore and
541 static const unsigned char legal[] = {
542 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0xff, 0x83,
543 0xfe, 0xff, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07,
544 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
545 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff
552 if (!(legal[*name / 8] & (1 << (*name % 8))))
559 XkbFileCreate(struct xkb_context *ctx, enum xkb_file_type type, char *name,
560 ParseCommon *defs, enum xkb_map_flags flags)
564 file = calloc(1, sizeof(*file));
568 XkbEscapeMapName(name);
569 file->file_type = type;
570 file->topName = strdup_safe(name);
579 XkbFileFromComponents(struct xkb_context *ctx,
580 const struct xkb_component_names *kkctgs)
582 char *const components[] = {
583 kkctgs->keycodes, kkctgs->types,
584 kkctgs->compat, kkctgs->symbols,
586 enum xkb_file_type type;
587 IncludeStmt *include = NULL;
588 XkbFile *file = NULL;
589 ParseCommon *defs = NULL;
591 for (type = FIRST_KEYMAP_FILE_TYPE; type <= LAST_KEYMAP_FILE_TYPE; type++) {
592 include = IncludeCreate(ctx, components[type], MERGE_DEFAULT);
596 file = XkbFileCreate(ctx, type, NULL, &include->common, 0);
598 FreeInclude(include);
602 defs = AppendStmt(defs, &file->common);
605 file = XkbFileCreate(ctx, FILE_TYPE_KEYMAP, NULL, defs, 0);
612 FreeXkbFile((XkbFile *) defs);
617 FreeExpr(ExprDef *expr)
623 case EXPR_ACTION_LIST:
625 case EXPR_UNARY_PLUS:
628 FreeStmt(&expr->value.child->common);
636 FreeStmt(&expr->value.binary.left->common);
637 FreeStmt(&expr->value.binary.right->common);
640 case EXPR_ACTION_DECL:
641 FreeStmt(&expr->value.action.args->common);
645 FreeStmt(&expr->value.array.entry->common);
648 case EXPR_KEYSYM_LIST:
649 darray_free(expr->value.list.syms);
650 darray_free(expr->value.list.symsMapIndex);
651 darray_free(expr->value.list.symsNumEntries);
660 FreeInclude(IncludeStmt *incl)
666 next = incl->next_incl;
670 free(incl->modifier);
679 FreeStmt(ParseCommon *stmt)
689 switch (stmt->type) {
691 FreeInclude((IncludeStmt *) stmt);
692 /* stmt is already free'd here. */
699 FreeStmt(&u.var->name->common);
700 FreeStmt(&u.var->value->common);
703 FreeStmt(&u.keyType->body->common);
706 FreeStmt(&u.interp->match->common);
707 FreeStmt(&u.interp->def->common);
710 FreeStmt(&u.vmod->value->common);
713 FreeStmt(&u.syms->symbols->common);
716 FreeStmt(&u.modMask->keys->common);
718 case STMT_GROUP_COMPAT:
719 FreeStmt(&u.groupCompat->def->common);
722 FreeStmt(&u.ledMap->body->common);
725 FreeStmt(&u.ledName->name->common);
737 FreeXkbFile(XkbFile *file)
743 next = (XkbFile *) file->common.next;
745 switch (file->file_type) {
746 case FILE_TYPE_KEYMAP:
747 FreeXkbFile((XkbFile *) file->defs);
750 case FILE_TYPE_TYPES:
751 case FILE_TYPE_COMPAT:
752 case FILE_TYPE_SYMBOLS:
753 case FILE_TYPE_KEYCODES:
754 case FILE_TYPE_GEOMETRY:
755 FreeStmt(file->defs);
769 static const char *xkb_file_type_strings[_FILE_TYPE_NUM_ENTRIES] = {
770 [FILE_TYPE_KEYCODES] = "xkb_keycodes",
771 [FILE_TYPE_TYPES] = "xkb_types",
772 [FILE_TYPE_COMPAT] = "xkb_compatibility",
773 [FILE_TYPE_SYMBOLS] = "xkb_symbols",
774 [FILE_TYPE_GEOMETRY] = "xkb_geometry",
775 [FILE_TYPE_KEYMAP] = "xkb_keymap",
776 [FILE_TYPE_RULES] = "rules",
780 xkb_file_type_to_string(enum xkb_file_type type)
782 if (type > _FILE_TYPE_NUM_ENTRIES)
784 return xkb_file_type_strings[type];
787 static const char *stmt_type_strings[_STMT_NUM_VALUES] = {
788 [STMT_UNKNOWN] = "unknown statement",
789 [STMT_INCLUDE] = "include statement",
790 [STMT_KEYCODE] = "key name definition",
791 [STMT_ALIAS] = "key alias definition",
792 [STMT_EXPR] = "expression",
793 [STMT_VAR] = "variable definition",
794 [STMT_TYPE] = "key type definition",
795 [STMT_INTERP] = "symbol interpretation definition",
796 [STMT_VMOD] = "virtual modifiers definition",
797 [STMT_SYMBOLS] = "key symbols definition",
798 [STMT_MODMAP] = "modifier map declaration",
799 [STMT_GROUP_COMPAT] = "group declaration",
800 [STMT_LED_MAP] = "indicator map declaration",
801 [STMT_LED_NAME] = "indicator name declaration",
805 stmt_type_to_string(enum stmt_type type)
807 if (type >= _STMT_NUM_VALUES)
809 return stmt_type_strings[type];
812 static const char *expr_op_type_strings[_EXPR_NUM_VALUES] = {
813 [EXPR_VALUE] = "literal",
814 [EXPR_IDENT] = "identifier",
815 [EXPR_ACTION_DECL] = "action declaration",
816 [EXPR_FIELD_REF] = "field reference",
817 [EXPR_ARRAY_REF] = "array reference",
818 [EXPR_KEYSYM_LIST] = "list of keysyms",
819 [EXPR_ACTION_LIST] = "list of actions",
820 [EXPR_ADD] = "addition",
821 [EXPR_SUBTRACT] = "subtraction",
822 [EXPR_MULTIPLY] = "multiplication",
823 [EXPR_DIVIDE] = "division",
824 [EXPR_ASSIGN] = "assignment",
825 [EXPR_NOT] = "logical negation",
826 [EXPR_NEGATE] = "arithmetic negation",
827 [EXPR_INVERT] = "bitwise inversion",
828 [EXPR_UNARY_PLUS] = "unary plus",
832 expr_op_type_to_string(enum expr_op_type type)
834 if (type >= _EXPR_NUM_VALUES)
836 return expr_op_type_strings[type];
839 static const char *expr_value_type_strings[_EXPR_TYPE_NUM_VALUES] = {
840 [EXPR_TYPE_UNKNOWN] = "unknown",
841 [EXPR_TYPE_BOOLEAN] = "boolean",
842 [EXPR_TYPE_INT] = "int",
843 [EXPR_TYPE_STRING] = "string",
844 [EXPR_TYPE_ACTION] = "action",
845 [EXPR_TYPE_KEYNAME] = "keyname",
846 [EXPR_TYPE_SYMBOLS] = "symbols",
850 expr_value_type_to_string(enum expr_value_type type)
852 if (type >= _EXPR_TYPE_NUM_VALUES)
854 return expr_value_type_strings[type];