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 ********************************************************/
27 #include "parseutils.h"
31 AppendStmt(ParseCommon * to, ParseCommon * append)
33 ParseCommon *start = to;
37 while ((to != NULL) && (to->next != NULL))
50 ExprCreate(unsigned op, unsigned type)
53 expr = uTypedAlloc(ExprDef);
56 expr->common.stmtType = StmtExpr;
57 expr->common.next = NULL;
63 FATAL("Couldn't allocate expression in parser\n");
70 ExprCreateUnary(unsigned op, unsigned type, ExprDef * child)
73 expr = uTypedAlloc(ExprDef);
76 expr->common.stmtType = StmtExpr;
77 expr->common.next = NULL;
80 expr->value.child = child;
84 FATAL("Couldn't allocate expression in parser\n");
91 ExprCreateBinary(unsigned op, ExprDef * left, ExprDef * right)
94 expr = uTypedAlloc(ExprDef);
97 expr->common.stmtType = StmtExpr;
98 expr->common.next = NULL;
100 if ((op == OpAssign) || (left->type == TypeUnknown))
101 expr->type = right->type;
102 else if ((left->type == right->type) || (right->type == TypeUnknown))
103 expr->type = left->type;
105 expr->type = TypeUnknown;
106 expr->value.binary.left = left;
107 expr->value.binary.right = right;
111 FATAL("Couldn't allocate expression in parser\n");
118 KeycodeCreate(const char *name, unsigned long value)
122 def = uTypedAlloc(KeycodeDef);
125 def->common.stmtType = StmtKeycodeDef;
126 def->common.next = NULL;
127 strncpy(def->name, name, XkbKeyNameLength);
128 def->name[XkbKeyNameLength] = '\0';
133 FATAL("Couldn't allocate key name definition in parser\n");
140 KeyAliasCreate(const char *alias, const char *real)
144 def = uTypedAlloc(KeyAliasDef);
147 def->common.stmtType = StmtKeyAliasDef;
148 def->common.next = NULL;
149 strncpy(def->alias, alias, XkbKeyNameLength);
150 def->alias[XkbKeyNameLength] = '\0';
151 strncpy(def->real, real, XkbKeyNameLength);
152 def->real[XkbKeyNameLength] = '\0';
156 FATAL("Couldn't allocate key alias definition in parser\n");
163 VModCreate(xkb_atom_t name, ExprDef * value)
166 def = uTypedAlloc(VModDef);
169 def->common.stmtType = StmtVModDef;
170 def->common.next = NULL;
176 FATAL("Couldn't allocate variable definition in parser\n");
183 VarCreate(ExprDef * name, ExprDef * value)
186 def = uTypedAlloc(VarDef);
189 def->common.stmtType = StmtVarDef;
190 def->common.next = NULL;
196 FATAL("Couldn't allocate variable definition in parser\n");
203 BoolVarCreate(xkb_atom_t nameToken, unsigned set)
205 ExprDef *name, *value;
207 name = ExprCreate(ExprIdent, TypeUnknown);
208 name->value.str = nameToken;
209 value = ExprCreate(ExprValue, TypeBoolean);
210 value->value.uval = set;
211 return VarCreate(name, value);
215 InterpCreate(char *sym, ExprDef * match)
219 def = uTypedAlloc(InterpDef);
222 def->common.stmtType = StmtInterpDef;
223 def->common.next = NULL;
229 FATAL("Couldn't allocate interp definition in parser\n");
236 KeyTypeCreate(xkb_atom_t name, VarDef * body)
240 def = uTypedAlloc(KeyTypeDef);
243 def->common.stmtType = StmtKeyTypeDef;
244 def->common.next = NULL;
245 def->merge = MergeDefault;
251 FATAL("Couldn't allocate key type definition in parser\n");
258 SymbolsCreate(const char *keyName, ExprDef *symbols)
262 def = uTypedAlloc(SymbolsDef);
265 def->common.stmtType = StmtSymbolsDef;
266 def->common.next = NULL;
267 def->merge = MergeDefault;
268 memset(def->keyName, 0, 5);
269 strncpy(def->keyName, keyName, 4);
270 def->symbols = symbols;
274 FATAL("Couldn't allocate symbols definition in parser\n");
281 GroupCompatCreate(int group, ExprDef * val)
285 def = uTypedAlloc(GroupCompatDef);
288 def->common.stmtType = StmtGroupCompatDef;
289 def->common.next = NULL;
290 def->merge = MergeDefault;
296 FATAL("Couldn't allocate group compat definition in parser\n");
303 ModMapCreate(uint32_t modifier, ExprDef * keys)
307 def = uTypedAlloc(ModMapDef);
310 def->common.stmtType = StmtModMapDef;
311 def->common.next = NULL;
312 def->merge = MergeDefault;
313 def->modifier = modifier;
318 FATAL("Couldn't allocate mod mask definition in parser\n");
325 IndicatorMapCreate(xkb_atom_t name, VarDef * body)
327 IndicatorMapDef *def;
329 def = uTypedAlloc(IndicatorMapDef);
332 def->common.stmtType = StmtIndicatorMapDef;
333 def->common.next = NULL;
334 def->merge = MergeDefault;
340 FATAL("Couldn't allocate indicator map definition in parser\n");
347 IndicatorNameCreate(int ndx, ExprDef * name, bool virtual)
349 IndicatorNameDef *def;
351 def = uTypedAlloc(IndicatorNameDef);
354 def->common.stmtType = StmtIndicatorNameDef;
355 def->common.next = NULL;
356 def->merge = MergeDefault;
359 def->virtual = virtual;
363 FATAL("Couldn't allocate indicator index definition in parser\n");
370 ActionCreate(xkb_atom_t name, ExprDef * args)
374 act = uTypedAlloc(ExprDef);
377 act->common.stmtType = StmtExpr;
378 act->common.next = NULL;
379 act->op = ExprActionDecl;
380 act->value.action.name = name;
381 act->value.action.args = args;
384 FATAL("Couldn't allocate ActionDef in parser\n");
389 ResizeKeysymList(ExprDef *list, unsigned int extra)
393 if (list->value.list.nSyms + extra > list->value.list.szSyms)
395 list->value.list.szSyms *= 2;
396 list->value.list.szSyms += extra;
397 if (list->value.list.szSyms == 1)
398 list->value.list.szSyms = 4;
399 list->value.list.syms = uTypedRecalloc(list->value.list.syms,
400 list->value.list.nSyms,
401 list->value.list.szSyms,
403 if (list->value.list.syms == NULL)
405 FATAL("Couldn't resize list of symbols for append\n");
409 if (list->value.list.nLevels >= list->value.list.szLevels)
411 list->value.list.szLevels *= 2;
412 if (list->value.list.szLevels == 0)
413 list->value.list.szLevels = 4;
414 list->value.list.symsMapIndex =
415 uTypedRecalloc(list->value.list.symsMapIndex,
416 list->value.list.nLevels,
417 list->value.list.szLevels,
419 if (list->value.list.symsMapIndex == NULL)
421 FATAL("Couldn't resize keysym index map for append\n");
424 list->value.list.symsNumEntries =
425 uTypedRecalloc(list->value.list.symsNumEntries,
426 list->value.list.nLevels,
427 list->value.list.szLevels,
429 if (list->value.list.symsNumEntries == NULL)
431 FATAL("Couldn't resize num keysym entries for append\n");
434 for (i = list->value.list.nLevels; i < list->value.list.szLevels; i++)
435 list->value.list.symsMapIndex[i] = -1;
442 CreateKeysymList(char *sym)
446 def = ExprCreate(ExprKeysymList, TypeSymbols);
449 FATAL("Couldn't allocate expression for keysym list in parser\n");
453 def->value.list.nSyms = 0;
454 def->value.list.szSyms = 0;
455 def->value.list.nLevels = 0;
456 def->value.list.szLevels = 0;
457 def->value.list.syms = NULL;
458 def->value.list.symsMapIndex = NULL;
459 def->value.list.symsNumEntries = NULL;
461 if (!ResizeKeysymList(def, 1))
463 FreeStmt(&def->common);
467 def->value.list.syms[0] = sym;
468 def->value.list.symsMapIndex[0] = 0;
469 def->value.list.symsNumEntries[0] = 1;
470 def->value.list.nLevels = 1;
471 def->value.list.nSyms = 1;
477 CreateMultiKeysymList(ExprDef *list)
481 for (i = 1; i < list->value.list.szLevels; i++)
483 list->value.list.symsMapIndex[i] = -1;
484 list->value.list.symsNumEntries[i] = 0;
486 list->value.list.symsMapIndex[0] = 0;
487 list->value.list.symsNumEntries[0] = list->value.list.nLevels;
488 list->value.list.nLevels = 1;
494 AppendKeysymList(ExprDef * list, char *sym)
496 if (!ResizeKeysymList(list, 1))
499 list->value.list.symsMapIndex[list->value.list.nLevels] =
500 list->value.list.nSyms;
501 list->value.list.symsNumEntries[list->value.list.nLevels] = 1;
502 list->value.list.syms[list->value.list.nSyms++] = sym;
503 list->value.list.nLevels++;
508 AppendMultiKeysymList(ExprDef * list, ExprDef * append)
512 if (!ResizeKeysymList(list, append->value.list.nSyms))
515 list->value.list.symsMapIndex[list->value.list.nLevels] =
516 list->value.list.nSyms;
517 list->value.list.symsNumEntries[list->value.list.nLevels] =
518 append->value.list.nSyms;
519 for (i = 0; i < append->value.list.nSyms; i++) {
520 list->value.list.syms[list->value.list.nSyms++] =
521 append->value.list.syms[i];
522 append->value.list.syms[i] = NULL;
524 list->value.list.nLevels++;
526 FreeStmt(&append->common);
532 LookupKeysym(const char *str, xkb_keysym_t *sym_rtrn)
536 if ((!str) || (strcasecmp(str, "any") == 0) ||
537 (strcasecmp(str, "nosymbol") == 0))
539 *sym_rtrn = XKB_KEY_NoSymbol;
542 else if ((strcasecmp(str, "none") == 0) ||
543 (strcasecmp(str, "voidsymbol") == 0))
545 *sym_rtrn = XKB_KEY_VoidSymbol;
548 sym = xkb_keysym_from_name(str);
549 if (sym != XKB_KEY_NoSymbol)
558 FreeInclude(IncludeStmt *incl);
561 IncludeCreate(char *str, unsigned merge)
563 IncludeStmt *incl, *first;
564 char *file, *map, *stmt, *tmp, *extra_data;
572 stmt = uDupString(str);
573 while ((tmp) && (*tmp))
575 if (XkbParseIncludeMap(&tmp, &file, &map, &nextop, &extra_data))
577 if ((file == NULL) && (map == NULL))
584 first = incl = uTypedAlloc(IncludeStmt);
587 incl->next = uTypedAlloc(IncludeStmt);
592 incl->common.stmtType = StmtInclude;
593 incl->common.next = NULL;
598 incl->modifier = extra_data;
604 WSGO("Allocation failure in IncludeCreate\n");
605 ACTION("Using only part of the include\n");
609 merge = MergeAugment;
611 merge = MergeOverride;
625 ERROR("Illegal include statement \"%s\"\n", stmt);
633 CheckDefaultMap(XkbFile * maps, const char *fileName)
638 for (tmp = maps, dflt = NULL; tmp != NULL;
639 tmp = (XkbFile *) tmp->common.next)
641 if (tmp->flags & XkbLC_Default)
647 if (warningLevel > 2)
649 WARN("Multiple default components in %s\n",
650 (fileName ? fileName : "(unknown)"));
651 ACTION("Using %s, ignoring %s\n",
652 (dflt->name ? dflt->name : "(first)"),
653 (tmp->name ? tmp->name : "(subsequent)"));
655 tmp->flags &= (~XkbLC_Default);
662 * All latin-1 alphanumerics, plus parens, slash, minus, underscore and
665 static const unsigned char componentSpecLegal[] = {
666 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0xff, 0x83,
667 0xfe, 0xff, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07,
668 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
669 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff
673 EnsureSafeMapName(char *name)
678 while (*name!='\0') {
679 if ((componentSpecLegal[(*name) / 8] & (1 << ((*name) % 8))) == 0)
686 CreateXKBFile(struct xkb_context *ctx, int type, char *name,
687 ParseCommon *defs, unsigned flags)
691 file = uTypedAlloc(XkbFile);
694 EnsureSafeMapName(name);
695 memset(file, 0, sizeof(XkbFile));
697 file->topName = uDupString(name);
700 file->id = xkb_context_take_file_id(ctx);
707 StmtSetMerge(ParseCommon * stmt, unsigned merge, struct YYLTYPE *loc, void *scanner)
709 if ((merge == MergeAltForm) && (stmt->stmtType != StmtKeycodeDef))
711 yyerror(loc, scanner, "illegal use of 'alternate' merge mode");
712 merge = MergeDefault;
718 FreeExpr(ExprDef *expr)
732 FreeStmt(&expr->value.child->common);
739 FreeStmt(&expr->value.binary.left->common);
740 FreeStmt(&expr->value.binary.right->common);
743 FreeStmt(&expr->value.action.args->common);
746 FreeStmt(&expr->value.array.entry->common);
749 for (i = 0; i < expr->value.list.nSyms; i++)
750 free(expr->value.list.syms[i]);
751 free(expr->value.list.syms);
752 free(expr->value.list.symsMapIndex);
753 free(expr->value.list.symsNumEntries);
761 FreeInclude(IncludeStmt *incl)
771 free(incl->modifier);
781 FreeStmt(ParseCommon *stmt)
791 switch (stmt->stmtType)
794 FreeInclude((IncludeStmt *)stmt);
795 /* stmt is already free'd here. */
802 FreeStmt(&u.var->name->common);
803 FreeStmt(&u.var->value->common);
806 FreeStmt(&u.keyType->body->common);
810 FreeStmt(&u.interp->match->common);
811 FreeStmt(&u.interp->def->common);
814 FreeStmt(&u.vmod->value->common);
817 FreeStmt(&u.syms->symbols->common);
820 FreeStmt(&u.modMask->keys->common);
822 case StmtGroupCompatDef:
823 FreeStmt(&u.groupCompat->def->common);
825 case StmtIndicatorMapDef:
826 FreeStmt(&u.ledMap->body->common);
828 case StmtIndicatorNameDef:
829 FreeStmt(&u.ledName->name->common);
841 FreeXKBFile(XkbFile *file)
847 next = (XkbFile *)file->common.next;
852 FreeXKBFile((XkbFile *)file->defs);
855 case XkmCompatMapIndex:
856 case XkmSymbolsIndex:
857 case XkmKeyNamesIndex:
858 case XkmGeometryIndex:
859 FreeStmt(file->defs);