xref: /aosp_15_r20/external/libxkbcommon/src/xkbcomp/parser.y (revision 2b949d0487e80d67f1fda82db69e101e761f8064)
1*2b949d04SAndroid Build Coastguard Worker /************************************************************
2*2b949d04SAndroid Build Coastguard Worker  Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
3*2b949d04SAndroid Build Coastguard Worker 
4*2b949d04SAndroid Build Coastguard Worker  Permission to use, copy, modify, and distribute this
5*2b949d04SAndroid Build Coastguard Worker  software and its documentation for any purpose and without
6*2b949d04SAndroid Build Coastguard Worker  fee is hereby granted, provided that the above copyright
7*2b949d04SAndroid Build Coastguard Worker  notice appear in all copies and that both that copyright
8*2b949d04SAndroid Build Coastguard Worker  notice and this permission notice appear in supporting
9*2b949d04SAndroid Build Coastguard Worker  documentation, and that the name of Silicon Graphics not be
10*2b949d04SAndroid Build Coastguard Worker  used in advertising or publicity pertaining to distribution
11*2b949d04SAndroid Build Coastguard Worker  of the software without specific prior written permission.
12*2b949d04SAndroid Build Coastguard Worker  Silicon Graphics makes no representation about the suitability
13*2b949d04SAndroid Build Coastguard Worker  of this software for any purpose. It is provided "as is"
14*2b949d04SAndroid Build Coastguard Worker  without any express or implied warranty.
15*2b949d04SAndroid Build Coastguard Worker 
16*2b949d04SAndroid Build Coastguard Worker  SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17*2b949d04SAndroid Build Coastguard Worker  SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18*2b949d04SAndroid Build Coastguard Worker  AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19*2b949d04SAndroid Build Coastguard Worker  GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20*2b949d04SAndroid Build Coastguard Worker  DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21*2b949d04SAndroid Build Coastguard Worker  DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22*2b949d04SAndroid Build Coastguard Worker  OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
23*2b949d04SAndroid Build Coastguard Worker  THE USE OR PERFORMANCE OF THIS SOFTWARE.
24*2b949d04SAndroid Build Coastguard Worker 
25*2b949d04SAndroid Build Coastguard Worker  ********************************************************/
26*2b949d04SAndroid Build Coastguard Worker 
27*2b949d04SAndroid Build Coastguard Worker /*
28*2b949d04SAndroid Build Coastguard Worker  * The parser should work with reasonably recent versions of either
29*2b949d04SAndroid Build Coastguard Worker  * bison or byacc.  So if you make changes, try to make sure it works
30*2b949d04SAndroid Build Coastguard Worker  * in both!
31*2b949d04SAndroid Build Coastguard Worker  */
32*2b949d04SAndroid Build Coastguard Worker 
33*2b949d04SAndroid Build Coastguard Worker %{
34*2b949d04SAndroid Build Coastguard Worker #include "config.h"
35*2b949d04SAndroid Build Coastguard Worker 
36*2b949d04SAndroid Build Coastguard Worker #include "xkbcomp/xkbcomp-priv.h"
37*2b949d04SAndroid Build Coastguard Worker #include "xkbcomp/ast-build.h"
38*2b949d04SAndroid Build Coastguard Worker #include "xkbcomp/parser-priv.h"
39*2b949d04SAndroid Build Coastguard Worker #include "scanner-utils.h"
40*2b949d04SAndroid Build Coastguard Worker 
41*2b949d04SAndroid Build Coastguard Worker struct parser_param {
42*2b949d04SAndroid Build Coastguard Worker     struct xkb_context *ctx;
43*2b949d04SAndroid Build Coastguard Worker     struct scanner *scanner;
44*2b949d04SAndroid Build Coastguard Worker     XkbFile *rtrn;
45*2b949d04SAndroid Build Coastguard Worker     bool more_maps;
46*2b949d04SAndroid Build Coastguard Worker };
47*2b949d04SAndroid Build Coastguard Worker 
48*2b949d04SAndroid Build Coastguard Worker #define parser_err(param, fmt, ...) \
49*2b949d04SAndroid Build Coastguard Worker     scanner_err((param)->scanner, fmt, ##__VA_ARGS__)
50*2b949d04SAndroid Build Coastguard Worker 
51*2b949d04SAndroid Build Coastguard Worker #define parser_warn(param, fmt, ...) \
52*2b949d04SAndroid Build Coastguard Worker     scanner_warn((param)->scanner, fmt, ##__VA_ARGS__)
53*2b949d04SAndroid Build Coastguard Worker 
54*2b949d04SAndroid Build Coastguard Worker static void
_xkbcommon_error(struct parser_param * param,const char * msg)55*2b949d04SAndroid Build Coastguard Worker _xkbcommon_error(struct parser_param *param, const char *msg)
56*2b949d04SAndroid Build Coastguard Worker {
57*2b949d04SAndroid Build Coastguard Worker     parser_err(param, "%s", msg);
58*2b949d04SAndroid Build Coastguard Worker }
59*2b949d04SAndroid Build Coastguard Worker 
60*2b949d04SAndroid Build Coastguard Worker static bool
resolve_keysym(const char * name,xkb_keysym_t * sym_rtrn)61*2b949d04SAndroid Build Coastguard Worker resolve_keysym(const char *name, xkb_keysym_t *sym_rtrn)
62*2b949d04SAndroid Build Coastguard Worker {
63*2b949d04SAndroid Build Coastguard Worker     xkb_keysym_t sym;
64*2b949d04SAndroid Build Coastguard Worker 
65*2b949d04SAndroid Build Coastguard Worker     if (!name || istreq(name, "any") || istreq(name, "nosymbol")) {
66*2b949d04SAndroid Build Coastguard Worker         *sym_rtrn = XKB_KEY_NoSymbol;
67*2b949d04SAndroid Build Coastguard Worker         return true;
68*2b949d04SAndroid Build Coastguard Worker     }
69*2b949d04SAndroid Build Coastguard Worker 
70*2b949d04SAndroid Build Coastguard Worker     if (istreq(name, "none") || istreq(name, "voidsymbol")) {
71*2b949d04SAndroid Build Coastguard Worker         *sym_rtrn = XKB_KEY_VoidSymbol;
72*2b949d04SAndroid Build Coastguard Worker         return true;
73*2b949d04SAndroid Build Coastguard Worker     }
74*2b949d04SAndroid Build Coastguard Worker 
75*2b949d04SAndroid Build Coastguard Worker     sym = xkb_keysym_from_name(name, XKB_KEYSYM_NO_FLAGS);
76*2b949d04SAndroid Build Coastguard Worker     if (sym != XKB_KEY_NoSymbol) {
77*2b949d04SAndroid Build Coastguard Worker         *sym_rtrn = sym;
78*2b949d04SAndroid Build Coastguard Worker         return true;
79*2b949d04SAndroid Build Coastguard Worker     }
80*2b949d04SAndroid Build Coastguard Worker 
81*2b949d04SAndroid Build Coastguard Worker     return false;
82*2b949d04SAndroid Build Coastguard Worker }
83*2b949d04SAndroid Build Coastguard Worker 
84*2b949d04SAndroid Build Coastguard Worker #define param_scanner param->scanner
85*2b949d04SAndroid Build Coastguard Worker %}
86*2b949d04SAndroid Build Coastguard Worker 
87*2b949d04SAndroid Build Coastguard Worker %pure-parser
88*2b949d04SAndroid Build Coastguard Worker %lex-param      { struct scanner *param_scanner }
89*2b949d04SAndroid Build Coastguard Worker %parse-param    { struct parser_param *param }
90*2b949d04SAndroid Build Coastguard Worker 
91*2b949d04SAndroid Build Coastguard Worker %token
92*2b949d04SAndroid Build Coastguard Worker         END_OF_FILE     0
93*2b949d04SAndroid Build Coastguard Worker         ERROR_TOK       255
94*2b949d04SAndroid Build Coastguard Worker         XKB_KEYMAP      1
95*2b949d04SAndroid Build Coastguard Worker         XKB_KEYCODES    2
96*2b949d04SAndroid Build Coastguard Worker         XKB_TYPES       3
97*2b949d04SAndroid Build Coastguard Worker         XKB_SYMBOLS     4
98*2b949d04SAndroid Build Coastguard Worker         XKB_COMPATMAP   5
99*2b949d04SAndroid Build Coastguard Worker         XKB_GEOMETRY    6
100*2b949d04SAndroid Build Coastguard Worker         XKB_SEMANTICS   7
101*2b949d04SAndroid Build Coastguard Worker         XKB_LAYOUT      8
102*2b949d04SAndroid Build Coastguard Worker         INCLUDE         10
103*2b949d04SAndroid Build Coastguard Worker         OVERRIDE        11
104*2b949d04SAndroid Build Coastguard Worker         AUGMENT         12
105*2b949d04SAndroid Build Coastguard Worker         REPLACE         13
106*2b949d04SAndroid Build Coastguard Worker         ALTERNATE       14
107*2b949d04SAndroid Build Coastguard Worker         VIRTUAL_MODS    20
108*2b949d04SAndroid Build Coastguard Worker         TYPE            21
109*2b949d04SAndroid Build Coastguard Worker         INTERPRET       22
110*2b949d04SAndroid Build Coastguard Worker         ACTION_TOK      23
111*2b949d04SAndroid Build Coastguard Worker         KEY             24
112*2b949d04SAndroid Build Coastguard Worker         ALIAS           25
113*2b949d04SAndroid Build Coastguard Worker         GROUP           26
114*2b949d04SAndroid Build Coastguard Worker         MODIFIER_MAP    27
115*2b949d04SAndroid Build Coastguard Worker         INDICATOR       28
116*2b949d04SAndroid Build Coastguard Worker         SHAPE           29
117*2b949d04SAndroid Build Coastguard Worker         KEYS            30
118*2b949d04SAndroid Build Coastguard Worker         ROW             31
119*2b949d04SAndroid Build Coastguard Worker         SECTION         32
120*2b949d04SAndroid Build Coastguard Worker         OVERLAY         33
121*2b949d04SAndroid Build Coastguard Worker         TEXT            34
122*2b949d04SAndroid Build Coastguard Worker         OUTLINE         35
123*2b949d04SAndroid Build Coastguard Worker         SOLID           36
124*2b949d04SAndroid Build Coastguard Worker         LOGO            37
125*2b949d04SAndroid Build Coastguard Worker         VIRTUAL         38
126*2b949d04SAndroid Build Coastguard Worker         EQUALS          40
127*2b949d04SAndroid Build Coastguard Worker         PLUS            41
128*2b949d04SAndroid Build Coastguard Worker         MINUS           42
129*2b949d04SAndroid Build Coastguard Worker         DIVIDE          43
130*2b949d04SAndroid Build Coastguard Worker         TIMES           44
131*2b949d04SAndroid Build Coastguard Worker         OBRACE          45
132*2b949d04SAndroid Build Coastguard Worker         CBRACE          46
133*2b949d04SAndroid Build Coastguard Worker         OPAREN          47
134*2b949d04SAndroid Build Coastguard Worker         CPAREN          48
135*2b949d04SAndroid Build Coastguard Worker         OBRACKET        49
136*2b949d04SAndroid Build Coastguard Worker         CBRACKET        50
137*2b949d04SAndroid Build Coastguard Worker         DOT             51
138*2b949d04SAndroid Build Coastguard Worker         COMMA           52
139*2b949d04SAndroid Build Coastguard Worker         SEMI            53
140*2b949d04SAndroid Build Coastguard Worker         EXCLAM          54
141*2b949d04SAndroid Build Coastguard Worker         INVERT          55
142*2b949d04SAndroid Build Coastguard Worker         STRING          60
143*2b949d04SAndroid Build Coastguard Worker         INTEGER         61
144*2b949d04SAndroid Build Coastguard Worker         FLOAT           62
145*2b949d04SAndroid Build Coastguard Worker         IDENT           63
146*2b949d04SAndroid Build Coastguard Worker         KEYNAME         64
147*2b949d04SAndroid Build Coastguard Worker         PARTIAL         70
148*2b949d04SAndroid Build Coastguard Worker         DEFAULT         71
149*2b949d04SAndroid Build Coastguard Worker         HIDDEN          72
150*2b949d04SAndroid Build Coastguard Worker         ALPHANUMERIC_KEYS       73
151*2b949d04SAndroid Build Coastguard Worker         MODIFIER_KEYS           74
152*2b949d04SAndroid Build Coastguard Worker         KEYPAD_KEYS             75
153*2b949d04SAndroid Build Coastguard Worker         FUNCTION_KEYS           76
154*2b949d04SAndroid Build Coastguard Worker         ALTERNATE_GROUP         77
155*2b949d04SAndroid Build Coastguard Worker 
156*2b949d04SAndroid Build Coastguard Worker %right  EQUALS
157*2b949d04SAndroid Build Coastguard Worker %left   PLUS MINUS
158*2b949d04SAndroid Build Coastguard Worker %left   TIMES DIVIDE
159*2b949d04SAndroid Build Coastguard Worker %left   EXCLAM INVERT
160*2b949d04SAndroid Build Coastguard Worker %left   OPAREN
161*2b949d04SAndroid Build Coastguard Worker 
162*2b949d04SAndroid Build Coastguard Worker %start  XkbFile
163*2b949d04SAndroid Build Coastguard Worker 
164*2b949d04SAndroid Build Coastguard Worker %union  {
165*2b949d04SAndroid Build Coastguard Worker         int64_t          num;
166*2b949d04SAndroid Build Coastguard Worker         enum xkb_file_type file_type;
167*2b949d04SAndroid Build Coastguard Worker         char            *str;
168*2b949d04SAndroid Build Coastguard Worker         xkb_atom_t      atom;
169*2b949d04SAndroid Build Coastguard Worker         enum merge_mode merge;
170*2b949d04SAndroid Build Coastguard Worker         enum xkb_map_flags mapFlags;
171*2b949d04SAndroid Build Coastguard Worker         xkb_keysym_t    keysym;
172*2b949d04SAndroid Build Coastguard Worker         ParseCommon     *any;
173*2b949d04SAndroid Build Coastguard Worker         struct { ParseCommon *head; ParseCommon *last; } anyList;
174*2b949d04SAndroid Build Coastguard Worker         ExprDef         *expr;
175*2b949d04SAndroid Build Coastguard Worker         struct { ExprDef *head; ExprDef *last; } exprList;
176*2b949d04SAndroid Build Coastguard Worker         VarDef          *var;
177*2b949d04SAndroid Build Coastguard Worker         struct { VarDef *head; VarDef *last; } varList;
178*2b949d04SAndroid Build Coastguard Worker         VModDef         *vmod;
179*2b949d04SAndroid Build Coastguard Worker         struct { VModDef *head; VModDef *last; } vmodList;
180*2b949d04SAndroid Build Coastguard Worker         InterpDef       *interp;
181*2b949d04SAndroid Build Coastguard Worker         KeyTypeDef      *keyType;
182*2b949d04SAndroid Build Coastguard Worker         SymbolsDef      *syms;
183*2b949d04SAndroid Build Coastguard Worker         ModMapDef       *modMask;
184*2b949d04SAndroid Build Coastguard Worker         GroupCompatDef  *groupCompat;
185*2b949d04SAndroid Build Coastguard Worker         LedMapDef       *ledMap;
186*2b949d04SAndroid Build Coastguard Worker         LedNameDef      *ledName;
187*2b949d04SAndroid Build Coastguard Worker         KeycodeDef      *keyCode;
188*2b949d04SAndroid Build Coastguard Worker         KeyAliasDef     *keyAlias;
189*2b949d04SAndroid Build Coastguard Worker         void            *geom;
190*2b949d04SAndroid Build Coastguard Worker         XkbFile         *file;
191*2b949d04SAndroid Build Coastguard Worker         struct { XkbFile *head; XkbFile *last; } fileList;
192*2b949d04SAndroid Build Coastguard Worker }
193*2b949d04SAndroid Build Coastguard Worker 
194*2b949d04SAndroid Build Coastguard Worker %type <num>     INTEGER FLOAT
195*2b949d04SAndroid Build Coastguard Worker %type <str>     IDENT STRING
196*2b949d04SAndroid Build Coastguard Worker %type <atom>    KEYNAME
197*2b949d04SAndroid Build Coastguard Worker %type <num>     KeyCode Number Integer Float SignedNumber DoodadType
198*2b949d04SAndroid Build Coastguard Worker %type <merge>   MergeMode OptMergeMode
199*2b949d04SAndroid Build Coastguard Worker %type <file_type> XkbCompositeType FileType
200*2b949d04SAndroid Build Coastguard Worker %type <mapFlags> Flag Flags OptFlags
201*2b949d04SAndroid Build Coastguard Worker %type <str>     MapName OptMapName
202*2b949d04SAndroid Build Coastguard Worker %type <atom>    FieldSpec Ident Element String
203*2b949d04SAndroid Build Coastguard Worker %type <keysym>  KeySym
204*2b949d04SAndroid Build Coastguard Worker %type <any>     Decl
205*2b949d04SAndroid Build Coastguard Worker %type <anyList> DeclList
206*2b949d04SAndroid Build Coastguard Worker %type <expr>    Expr Term Lhs Terminal ArrayInit KeySyms
207*2b949d04SAndroid Build Coastguard Worker %type <expr>    OptKeySymList KeySymList Action Coord CoordList
208*2b949d04SAndroid Build Coastguard Worker %type <exprList> OptExprList ExprList ActionList
209*2b949d04SAndroid Build Coastguard Worker %type <var>     VarDecl SymbolsVarDecl
210*2b949d04SAndroid Build Coastguard Worker %type <varList> VarDeclList SymbolsBody
211*2b949d04SAndroid Build Coastguard Worker %type <vmod>    VModDef
212*2b949d04SAndroid Build Coastguard Worker %type <vmodList> VModDefList VModDecl
213*2b949d04SAndroid Build Coastguard Worker %type <interp>  InterpretDecl InterpretMatch
214*2b949d04SAndroid Build Coastguard Worker %type <keyType> KeyTypeDecl
215*2b949d04SAndroid Build Coastguard Worker %type <syms>    SymbolsDecl
216*2b949d04SAndroid Build Coastguard Worker %type <modMask> ModMapDecl
217*2b949d04SAndroid Build Coastguard Worker %type <groupCompat> GroupCompatDecl
218*2b949d04SAndroid Build Coastguard Worker %type <ledMap>  LedMapDecl
219*2b949d04SAndroid Build Coastguard Worker %type <ledName> LedNameDecl
220*2b949d04SAndroid Build Coastguard Worker %type <keyCode> KeyNameDecl
221*2b949d04SAndroid Build Coastguard Worker %type <keyAlias> KeyAliasDecl
222*2b949d04SAndroid Build Coastguard Worker %type <geom>    ShapeDecl SectionDecl SectionBody SectionBodyItem RowBody RowBodyItem
223*2b949d04SAndroid Build Coastguard Worker %type <geom>    Keys Key OverlayDecl OverlayKeyList OverlayKey OutlineList OutlineInList
224*2b949d04SAndroid Build Coastguard Worker %type <geom>    DoodadDecl
225*2b949d04SAndroid Build Coastguard Worker %type <file>    XkbFile XkbMapConfig
226*2b949d04SAndroid Build Coastguard Worker %type <fileList> XkbMapConfigList
227*2b949d04SAndroid Build Coastguard Worker %type <file>    XkbCompositeMap
228*2b949d04SAndroid Build Coastguard Worker 
229*2b949d04SAndroid Build Coastguard Worker %destructor { FreeStmt((ParseCommon *) $$); }
230*2b949d04SAndroid Build Coastguard Worker     <any> <expr> <var> <vmod> <interp> <keyType> <syms> <modMask> <groupCompat>
231*2b949d04SAndroid Build Coastguard Worker     <ledMap> <ledName> <keyCode> <keyAlias>
232*2b949d04SAndroid Build Coastguard Worker %destructor { FreeStmt((ParseCommon *) $$.head); }
233*2b949d04SAndroid Build Coastguard Worker     <anyList> <exprList> <varList> <vmodList>
234*2b949d04SAndroid Build Coastguard Worker /* The destructor also runs on the start symbol when the parser *succeeds*.
235*2b949d04SAndroid Build Coastguard Worker  * The `if` here catches this case. */
236*2b949d04SAndroid Build Coastguard Worker %destructor { if (!param->rtrn) FreeXkbFile($$); } <file>
237*2b949d04SAndroid Build Coastguard Worker %destructor { FreeXkbFile($$.head); } <fileList>
238*2b949d04SAndroid Build Coastguard Worker %destructor { free($$); } <str>
239*2b949d04SAndroid Build Coastguard Worker 
240*2b949d04SAndroid Build Coastguard Worker %%
241*2b949d04SAndroid Build Coastguard Worker 
242*2b949d04SAndroid Build Coastguard Worker /*
243*2b949d04SAndroid Build Coastguard Worker  * An actual file may contain more than one map. However, if we do things
244*2b949d04SAndroid Build Coastguard Worker  * in the normal yacc way, i.e. aggregate all of the maps into a list and
245*2b949d04SAndroid Build Coastguard Worker  * let the caller find the map it wants, we end up scanning and parsing a
246*2b949d04SAndroid Build Coastguard Worker  * lot of unneeded maps (in the end we always just need one).
247*2b949d04SAndroid Build Coastguard Worker  * Instead of doing that, we make yyparse return one map at a time, and
248*2b949d04SAndroid Build Coastguard Worker  * then call it repeatedly until we find the map we need. Once we find it,
249*2b949d04SAndroid Build Coastguard Worker  * we don't need to parse everything that follows in the file.
250*2b949d04SAndroid Build Coastguard Worker  * This does mean that if we e.g. always use the first map, the file may
251*2b949d04SAndroid Build Coastguard Worker  * contain complete garbage after that. But it's worth it.
252*2b949d04SAndroid Build Coastguard Worker  */
253*2b949d04SAndroid Build Coastguard Worker 
254*2b949d04SAndroid Build Coastguard Worker XkbFile         :       XkbCompositeMap
255*2b949d04SAndroid Build Coastguard Worker                         { $$ = param->rtrn = $1; param->more_maps = !!param->rtrn; }
256*2b949d04SAndroid Build Coastguard Worker                 |       XkbMapConfig
257*2b949d04SAndroid Build Coastguard Worker                         { $$ = param->rtrn = $1; param->more_maps = !!param->rtrn; YYACCEPT; }
258*2b949d04SAndroid Build Coastguard Worker                 |       END_OF_FILE
259*2b949d04SAndroid Build Coastguard Worker                         { $$ = param->rtrn = NULL; param->more_maps = false; }
260*2b949d04SAndroid Build Coastguard Worker                 ;
261*2b949d04SAndroid Build Coastguard Worker 
262*2b949d04SAndroid Build Coastguard Worker XkbCompositeMap :       OptFlags XkbCompositeType OptMapName OBRACE
263*2b949d04SAndroid Build Coastguard Worker                             XkbMapConfigList
264*2b949d04SAndroid Build Coastguard Worker                         CBRACE SEMI
265*2b949d04SAndroid Build Coastguard Worker                         { $$ = XkbFileCreate($2, $3, (ParseCommon *) $5.head, $1); }
266*2b949d04SAndroid Build Coastguard Worker                 ;
267*2b949d04SAndroid Build Coastguard Worker 
268*2b949d04SAndroid Build Coastguard Worker XkbCompositeType:       XKB_KEYMAP      { $$ = FILE_TYPE_KEYMAP; }
269*2b949d04SAndroid Build Coastguard Worker                 |       XKB_SEMANTICS   { $$ = FILE_TYPE_KEYMAP; }
270*2b949d04SAndroid Build Coastguard Worker                 |       XKB_LAYOUT      { $$ = FILE_TYPE_KEYMAP; }
271*2b949d04SAndroid Build Coastguard Worker                 ;
272*2b949d04SAndroid Build Coastguard Worker 
273*2b949d04SAndroid Build Coastguard Worker XkbMapConfigList :      XkbMapConfigList XkbMapConfig
274*2b949d04SAndroid Build Coastguard Worker                         { $$.head = $1.head; $$.last->common.next = &$2->common; $$.last = $2; }
275*2b949d04SAndroid Build Coastguard Worker                 |       XkbMapConfig
276*2b949d04SAndroid Build Coastguard Worker                         { $$.head = $$.last = $1; }
277*2b949d04SAndroid Build Coastguard Worker                 ;
278*2b949d04SAndroid Build Coastguard Worker 
279*2b949d04SAndroid Build Coastguard Worker XkbMapConfig    :       OptFlags FileType OptMapName OBRACE
280*2b949d04SAndroid Build Coastguard Worker                             DeclList
281*2b949d04SAndroid Build Coastguard Worker                         CBRACE SEMI
282*2b949d04SAndroid Build Coastguard Worker                         {
283*2b949d04SAndroid Build Coastguard Worker                             $$ = XkbFileCreate($2, $3, $5.head, $1);
284*2b949d04SAndroid Build Coastguard Worker                         }
285*2b949d04SAndroid Build Coastguard Worker                 ;
286*2b949d04SAndroid Build Coastguard Worker 
287*2b949d04SAndroid Build Coastguard Worker FileType        :       XKB_KEYCODES            { $$ = FILE_TYPE_KEYCODES; }
288*2b949d04SAndroid Build Coastguard Worker                 |       XKB_TYPES               { $$ = FILE_TYPE_TYPES; }
289*2b949d04SAndroid Build Coastguard Worker                 |       XKB_COMPATMAP           { $$ = FILE_TYPE_COMPAT; }
290*2b949d04SAndroid Build Coastguard Worker                 |       XKB_SYMBOLS             { $$ = FILE_TYPE_SYMBOLS; }
291*2b949d04SAndroid Build Coastguard Worker                 |       XKB_GEOMETRY            { $$ = FILE_TYPE_GEOMETRY; }
292*2b949d04SAndroid Build Coastguard Worker                 ;
293*2b949d04SAndroid Build Coastguard Worker 
294*2b949d04SAndroid Build Coastguard Worker OptFlags        :       Flags                   { $$ = $1; }
295*2b949d04SAndroid Build Coastguard Worker                 |                               { $$ = 0; }
296*2b949d04SAndroid Build Coastguard Worker                 ;
297*2b949d04SAndroid Build Coastguard Worker 
298*2b949d04SAndroid Build Coastguard Worker Flags           :       Flags Flag              { $$ = ($1 | $2); }
299*2b949d04SAndroid Build Coastguard Worker                 |       Flag                    { $$ = $1; }
300*2b949d04SAndroid Build Coastguard Worker                 ;
301*2b949d04SAndroid Build Coastguard Worker 
302*2b949d04SAndroid Build Coastguard Worker Flag            :       PARTIAL                 { $$ = MAP_IS_PARTIAL; }
303*2b949d04SAndroid Build Coastguard Worker                 |       DEFAULT                 { $$ = MAP_IS_DEFAULT; }
304*2b949d04SAndroid Build Coastguard Worker                 |       HIDDEN                  { $$ = MAP_IS_HIDDEN; }
305*2b949d04SAndroid Build Coastguard Worker                 |       ALPHANUMERIC_KEYS       { $$ = MAP_HAS_ALPHANUMERIC; }
306*2b949d04SAndroid Build Coastguard Worker                 |       MODIFIER_KEYS           { $$ = MAP_HAS_MODIFIER; }
307*2b949d04SAndroid Build Coastguard Worker                 |       KEYPAD_KEYS             { $$ = MAP_HAS_KEYPAD; }
308*2b949d04SAndroid Build Coastguard Worker                 |       FUNCTION_KEYS           { $$ = MAP_HAS_FN; }
309*2b949d04SAndroid Build Coastguard Worker                 |       ALTERNATE_GROUP         { $$ = MAP_IS_ALTGR; }
310*2b949d04SAndroid Build Coastguard Worker                 ;
311*2b949d04SAndroid Build Coastguard Worker 
312*2b949d04SAndroid Build Coastguard Worker DeclList        :       DeclList Decl
313*2b949d04SAndroid Build Coastguard Worker                         {
314*2b949d04SAndroid Build Coastguard Worker                             if ($2) {
315*2b949d04SAndroid Build Coastguard Worker                                 if ($1.head) {
316*2b949d04SAndroid Build Coastguard Worker                                     $$.head = $1.head; $1.last->next = $2; $$.last = $2;
317*2b949d04SAndroid Build Coastguard Worker                                 } else {
318*2b949d04SAndroid Build Coastguard Worker                                     $$.head = $$.last = $2;
319*2b949d04SAndroid Build Coastguard Worker                                 }
320*2b949d04SAndroid Build Coastguard Worker                             }
321*2b949d04SAndroid Build Coastguard Worker                         }
322*2b949d04SAndroid Build Coastguard Worker                         /*
323*2b949d04SAndroid Build Coastguard Worker                          * VModDecl is "inlined" directly into DeclList, i.e.
324*2b949d04SAndroid Build Coastguard Worker                          * each VModDef in the VModDecl is a separate Decl in
325*2b949d04SAndroid Build Coastguard Worker                          * the File.
326*2b949d04SAndroid Build Coastguard Worker                          */
327*2b949d04SAndroid Build Coastguard Worker                 |       DeclList OptMergeMode VModDecl
328*2b949d04SAndroid Build Coastguard Worker                         {
329*2b949d04SAndroid Build Coastguard Worker                             for (VModDef *vmod = $3.head; vmod; vmod = (VModDef *) vmod->common.next)
330*2b949d04SAndroid Build Coastguard Worker                                 vmod->merge = $2;
331*2b949d04SAndroid Build Coastguard Worker                             if ($1.head) {
332*2b949d04SAndroid Build Coastguard Worker                                 $$.head = $1.head; $1.last->next = &$3.head->common; $$.last = &$3.last->common;
333*2b949d04SAndroid Build Coastguard Worker                             } else {
334*2b949d04SAndroid Build Coastguard Worker                                 $$.head = &$3.head->common; $$.last = &$3.last->common;
335*2b949d04SAndroid Build Coastguard Worker                             }
336*2b949d04SAndroid Build Coastguard Worker                         }
337*2b949d04SAndroid Build Coastguard Worker                 |       { $$.head = $$.last = NULL; }
338*2b949d04SAndroid Build Coastguard Worker                 ;
339*2b949d04SAndroid Build Coastguard Worker 
340*2b949d04SAndroid Build Coastguard Worker Decl            :       OptMergeMode VarDecl
341*2b949d04SAndroid Build Coastguard Worker                         {
342*2b949d04SAndroid Build Coastguard Worker                             $2->merge = $1;
343*2b949d04SAndroid Build Coastguard Worker                             $$ = (ParseCommon *) $2;
344*2b949d04SAndroid Build Coastguard Worker                         }
345*2b949d04SAndroid Build Coastguard Worker                 /*      OptMergeMode VModDecl - see above. */
346*2b949d04SAndroid Build Coastguard Worker                 |       OptMergeMode InterpretDecl
347*2b949d04SAndroid Build Coastguard Worker                         {
348*2b949d04SAndroid Build Coastguard Worker                             $2->merge = $1;
349*2b949d04SAndroid Build Coastguard Worker                             $$ = (ParseCommon *) $2;
350*2b949d04SAndroid Build Coastguard Worker                         }
351*2b949d04SAndroid Build Coastguard Worker                 |       OptMergeMode KeyNameDecl
352*2b949d04SAndroid Build Coastguard Worker                         {
353*2b949d04SAndroid Build Coastguard Worker                             $2->merge = $1;
354*2b949d04SAndroid Build Coastguard Worker                             $$ = (ParseCommon *) $2;
355*2b949d04SAndroid Build Coastguard Worker                         }
356*2b949d04SAndroid Build Coastguard Worker                 |       OptMergeMode KeyAliasDecl
357*2b949d04SAndroid Build Coastguard Worker                         {
358*2b949d04SAndroid Build Coastguard Worker                             $2->merge = $1;
359*2b949d04SAndroid Build Coastguard Worker                             $$ = (ParseCommon *) $2;
360*2b949d04SAndroid Build Coastguard Worker                         }
361*2b949d04SAndroid Build Coastguard Worker                 |       OptMergeMode KeyTypeDecl
362*2b949d04SAndroid Build Coastguard Worker                         {
363*2b949d04SAndroid Build Coastguard Worker                             $2->merge = $1;
364*2b949d04SAndroid Build Coastguard Worker                             $$ = (ParseCommon *) $2;
365*2b949d04SAndroid Build Coastguard Worker                         }
366*2b949d04SAndroid Build Coastguard Worker                 |       OptMergeMode SymbolsDecl
367*2b949d04SAndroid Build Coastguard Worker                         {
368*2b949d04SAndroid Build Coastguard Worker                             $2->merge = $1;
369*2b949d04SAndroid Build Coastguard Worker                             $$ = (ParseCommon *) $2;
370*2b949d04SAndroid Build Coastguard Worker                         }
371*2b949d04SAndroid Build Coastguard Worker                 |       OptMergeMode ModMapDecl
372*2b949d04SAndroid Build Coastguard Worker                         {
373*2b949d04SAndroid Build Coastguard Worker                             $2->merge = $1;
374*2b949d04SAndroid Build Coastguard Worker                             $$ = (ParseCommon *) $2;
375*2b949d04SAndroid Build Coastguard Worker                         }
376*2b949d04SAndroid Build Coastguard Worker                 |       OptMergeMode GroupCompatDecl
377*2b949d04SAndroid Build Coastguard Worker                         {
378*2b949d04SAndroid Build Coastguard Worker                             $2->merge = $1;
379*2b949d04SAndroid Build Coastguard Worker                             $$ = (ParseCommon *) $2;
380*2b949d04SAndroid Build Coastguard Worker                         }
381*2b949d04SAndroid Build Coastguard Worker                 |       OptMergeMode LedMapDecl
382*2b949d04SAndroid Build Coastguard Worker                         {
383*2b949d04SAndroid Build Coastguard Worker                             $2->merge = $1;
384*2b949d04SAndroid Build Coastguard Worker                             $$ = (ParseCommon *) $2;
385*2b949d04SAndroid Build Coastguard Worker                         }
386*2b949d04SAndroid Build Coastguard Worker                 |       OptMergeMode LedNameDecl
387*2b949d04SAndroid Build Coastguard Worker                         {
388*2b949d04SAndroid Build Coastguard Worker                             $2->merge = $1;
389*2b949d04SAndroid Build Coastguard Worker                             $$ = (ParseCommon *) $2;
390*2b949d04SAndroid Build Coastguard Worker                         }
391*2b949d04SAndroid Build Coastguard Worker                 |       OptMergeMode ShapeDecl          { $$ = NULL; }
392*2b949d04SAndroid Build Coastguard Worker                 |       OptMergeMode SectionDecl        { $$ = NULL; }
393*2b949d04SAndroid Build Coastguard Worker                 |       OptMergeMode DoodadDecl         { $$ = NULL; }
394*2b949d04SAndroid Build Coastguard Worker                 |       MergeMode STRING
395*2b949d04SAndroid Build Coastguard Worker                         {
396*2b949d04SAndroid Build Coastguard Worker                             $$ = (ParseCommon *) IncludeCreate(param->ctx, $2, $1);
397*2b949d04SAndroid Build Coastguard Worker                             free($2);
398*2b949d04SAndroid Build Coastguard Worker                         }
399*2b949d04SAndroid Build Coastguard Worker                 ;
400*2b949d04SAndroid Build Coastguard Worker 
401*2b949d04SAndroid Build Coastguard Worker VarDecl         :       Lhs EQUALS Expr SEMI
402*2b949d04SAndroid Build Coastguard Worker                         { $$ = VarCreate($1, $3); }
403*2b949d04SAndroid Build Coastguard Worker                 |       Ident SEMI
404*2b949d04SAndroid Build Coastguard Worker                         { $$ = BoolVarCreate($1, true); }
405*2b949d04SAndroid Build Coastguard Worker                 |       EXCLAM Ident SEMI
406*2b949d04SAndroid Build Coastguard Worker                         { $$ = BoolVarCreate($2, false); }
407*2b949d04SAndroid Build Coastguard Worker                 ;
408*2b949d04SAndroid Build Coastguard Worker 
409*2b949d04SAndroid Build Coastguard Worker KeyNameDecl     :       KEYNAME EQUALS KeyCode SEMI
410*2b949d04SAndroid Build Coastguard Worker                         { $$ = KeycodeCreate($1, $3); }
411*2b949d04SAndroid Build Coastguard Worker                 ;
412*2b949d04SAndroid Build Coastguard Worker 
413*2b949d04SAndroid Build Coastguard Worker KeyAliasDecl    :       ALIAS KEYNAME EQUALS KEYNAME SEMI
414*2b949d04SAndroid Build Coastguard Worker                         { $$ = KeyAliasCreate($2, $4); }
415*2b949d04SAndroid Build Coastguard Worker                 ;
416*2b949d04SAndroid Build Coastguard Worker 
417*2b949d04SAndroid Build Coastguard Worker VModDecl        :       VIRTUAL_MODS VModDefList SEMI
418*2b949d04SAndroid Build Coastguard Worker                         { $$ = $2; }
419*2b949d04SAndroid Build Coastguard Worker                 ;
420*2b949d04SAndroid Build Coastguard Worker 
421*2b949d04SAndroid Build Coastguard Worker VModDefList     :       VModDefList COMMA VModDef
422*2b949d04SAndroid Build Coastguard Worker                         { $$.head = $1.head; $$.last->common.next = &$3->common; $$.last = $3; }
423*2b949d04SAndroid Build Coastguard Worker                 |       VModDef
424*2b949d04SAndroid Build Coastguard Worker                         { $$.head = $$.last = $1; }
425*2b949d04SAndroid Build Coastguard Worker                 ;
426*2b949d04SAndroid Build Coastguard Worker 
427*2b949d04SAndroid Build Coastguard Worker VModDef         :       Ident
428*2b949d04SAndroid Build Coastguard Worker                         { $$ = VModCreate($1, NULL); }
429*2b949d04SAndroid Build Coastguard Worker                 |       Ident EQUALS Expr
430*2b949d04SAndroid Build Coastguard Worker                         { $$ = VModCreate($1, $3); }
431*2b949d04SAndroid Build Coastguard Worker                 ;
432*2b949d04SAndroid Build Coastguard Worker 
433*2b949d04SAndroid Build Coastguard Worker InterpretDecl   :       INTERPRET InterpretMatch OBRACE
434*2b949d04SAndroid Build Coastguard Worker                             VarDeclList
435*2b949d04SAndroid Build Coastguard Worker                         CBRACE SEMI
436*2b949d04SAndroid Build Coastguard Worker                         { $2->def = $4.head; $$ = $2; }
437*2b949d04SAndroid Build Coastguard Worker                 ;
438*2b949d04SAndroid Build Coastguard Worker 
439*2b949d04SAndroid Build Coastguard Worker InterpretMatch  :       KeySym PLUS Expr
440*2b949d04SAndroid Build Coastguard Worker                         { $$ = InterpCreate($1, $3); }
441*2b949d04SAndroid Build Coastguard Worker                 |       KeySym
442*2b949d04SAndroid Build Coastguard Worker                         { $$ = InterpCreate($1, NULL); }
443*2b949d04SAndroid Build Coastguard Worker                 ;
444*2b949d04SAndroid Build Coastguard Worker 
445*2b949d04SAndroid Build Coastguard Worker VarDeclList     :       VarDeclList VarDecl
446*2b949d04SAndroid Build Coastguard Worker                         { $$.head = $1.head; $$.last->common.next = &$2->common; $$.last = $2; }
447*2b949d04SAndroid Build Coastguard Worker                 |       VarDecl
448*2b949d04SAndroid Build Coastguard Worker                         { $$.head = $$.last = $1; }
449*2b949d04SAndroid Build Coastguard Worker                 ;
450*2b949d04SAndroid Build Coastguard Worker 
451*2b949d04SAndroid Build Coastguard Worker KeyTypeDecl     :       TYPE String OBRACE
452*2b949d04SAndroid Build Coastguard Worker                             VarDeclList
453*2b949d04SAndroid Build Coastguard Worker                         CBRACE SEMI
454*2b949d04SAndroid Build Coastguard Worker                         { $$ = KeyTypeCreate($2, $4.head); }
455*2b949d04SAndroid Build Coastguard Worker                 ;
456*2b949d04SAndroid Build Coastguard Worker 
457*2b949d04SAndroid Build Coastguard Worker SymbolsDecl     :       KEY KEYNAME OBRACE
458*2b949d04SAndroid Build Coastguard Worker                             SymbolsBody
459*2b949d04SAndroid Build Coastguard Worker                         CBRACE SEMI
460*2b949d04SAndroid Build Coastguard Worker                         { $$ = SymbolsCreate($2, $4.head); }
461*2b949d04SAndroid Build Coastguard Worker                 ;
462*2b949d04SAndroid Build Coastguard Worker 
463*2b949d04SAndroid Build Coastguard Worker SymbolsBody     :       SymbolsBody COMMA SymbolsVarDecl
464*2b949d04SAndroid Build Coastguard Worker                         { $$.head = $1.head; $$.last->common.next = &$3->common; $$.last = $3; }
465*2b949d04SAndroid Build Coastguard Worker                 |       SymbolsVarDecl
466*2b949d04SAndroid Build Coastguard Worker                         { $$.head = $$.last = $1; }
467*2b949d04SAndroid Build Coastguard Worker                 |       { $$.head = $$.last = NULL; }
468*2b949d04SAndroid Build Coastguard Worker                 ;
469*2b949d04SAndroid Build Coastguard Worker 
470*2b949d04SAndroid Build Coastguard Worker SymbolsVarDecl  :       Lhs EQUALS Expr         { $$ = VarCreate($1, $3); }
471*2b949d04SAndroid Build Coastguard Worker                 |       Lhs EQUALS ArrayInit    { $$ = VarCreate($1, $3); }
472*2b949d04SAndroid Build Coastguard Worker                 |       Ident                   { $$ = BoolVarCreate($1, true); }
473*2b949d04SAndroid Build Coastguard Worker                 |       EXCLAM Ident            { $$ = BoolVarCreate($2, false); }
474*2b949d04SAndroid Build Coastguard Worker                 |       ArrayInit               { $$ = VarCreate(NULL, $1); }
475*2b949d04SAndroid Build Coastguard Worker                 ;
476*2b949d04SAndroid Build Coastguard Worker 
477*2b949d04SAndroid Build Coastguard Worker ArrayInit       :       OBRACKET OptKeySymList CBRACKET
478*2b949d04SAndroid Build Coastguard Worker                         { $$ = $2; }
479*2b949d04SAndroid Build Coastguard Worker                 |       OBRACKET ActionList CBRACKET
480*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateActionList($2.head); }
481*2b949d04SAndroid Build Coastguard Worker                 ;
482*2b949d04SAndroid Build Coastguard Worker 
483*2b949d04SAndroid Build Coastguard Worker GroupCompatDecl :       GROUP Integer EQUALS Expr SEMI
484*2b949d04SAndroid Build Coastguard Worker                         { $$ = GroupCompatCreate($2, $4); }
485*2b949d04SAndroid Build Coastguard Worker                 ;
486*2b949d04SAndroid Build Coastguard Worker 
487*2b949d04SAndroid Build Coastguard Worker ModMapDecl      :       MODIFIER_MAP Ident OBRACE ExprList CBRACE SEMI
488*2b949d04SAndroid Build Coastguard Worker                         { $$ = ModMapCreate($2, $4.head); }
489*2b949d04SAndroid Build Coastguard Worker                 ;
490*2b949d04SAndroid Build Coastguard Worker 
491*2b949d04SAndroid Build Coastguard Worker LedMapDecl:             INDICATOR String OBRACE VarDeclList CBRACE SEMI
492*2b949d04SAndroid Build Coastguard Worker                         { $$ = LedMapCreate($2, $4.head); }
493*2b949d04SAndroid Build Coastguard Worker                 ;
494*2b949d04SAndroid Build Coastguard Worker 
495*2b949d04SAndroid Build Coastguard Worker LedNameDecl:            INDICATOR Integer EQUALS Expr SEMI
496*2b949d04SAndroid Build Coastguard Worker                         { $$ = LedNameCreate($2, $4, false); }
497*2b949d04SAndroid Build Coastguard Worker                 |       VIRTUAL INDICATOR Integer EQUALS Expr SEMI
498*2b949d04SAndroid Build Coastguard Worker                         { $$ = LedNameCreate($3, $5, true); }
499*2b949d04SAndroid Build Coastguard Worker                 ;
500*2b949d04SAndroid Build Coastguard Worker 
501*2b949d04SAndroid Build Coastguard Worker ShapeDecl       :       SHAPE String OBRACE OutlineList CBRACE SEMI
502*2b949d04SAndroid Build Coastguard Worker                         { $$ = NULL; }
503*2b949d04SAndroid Build Coastguard Worker                 |       SHAPE String OBRACE CoordList CBRACE SEMI
504*2b949d04SAndroid Build Coastguard Worker                         { (void) $4; $$ = NULL; }
505*2b949d04SAndroid Build Coastguard Worker                 ;
506*2b949d04SAndroid Build Coastguard Worker 
507*2b949d04SAndroid Build Coastguard Worker SectionDecl     :       SECTION String OBRACE SectionBody CBRACE SEMI
508*2b949d04SAndroid Build Coastguard Worker                         { $$ = NULL; }
509*2b949d04SAndroid Build Coastguard Worker                 ;
510*2b949d04SAndroid Build Coastguard Worker 
511*2b949d04SAndroid Build Coastguard Worker SectionBody     :       SectionBody SectionBodyItem     { $$ = NULL;}
512*2b949d04SAndroid Build Coastguard Worker                 |       SectionBodyItem                 { $$ = NULL; }
513*2b949d04SAndroid Build Coastguard Worker                 ;
514*2b949d04SAndroid Build Coastguard Worker 
515*2b949d04SAndroid Build Coastguard Worker SectionBodyItem :       ROW OBRACE RowBody CBRACE SEMI
516*2b949d04SAndroid Build Coastguard Worker                         { $$ = NULL; }
517*2b949d04SAndroid Build Coastguard Worker                 |       VarDecl
518*2b949d04SAndroid Build Coastguard Worker                         { FreeStmt((ParseCommon *) $1); $$ = NULL; }
519*2b949d04SAndroid Build Coastguard Worker                 |       DoodadDecl
520*2b949d04SAndroid Build Coastguard Worker                         { $$ = NULL; }
521*2b949d04SAndroid Build Coastguard Worker                 |       LedMapDecl
522*2b949d04SAndroid Build Coastguard Worker                         { FreeStmt((ParseCommon *) $1); $$ = NULL; }
523*2b949d04SAndroid Build Coastguard Worker                 |       OverlayDecl
524*2b949d04SAndroid Build Coastguard Worker                         { $$ = NULL; }
525*2b949d04SAndroid Build Coastguard Worker                 ;
526*2b949d04SAndroid Build Coastguard Worker 
527*2b949d04SAndroid Build Coastguard Worker RowBody         :       RowBody RowBodyItem     { $$ = NULL;}
528*2b949d04SAndroid Build Coastguard Worker                 |       RowBodyItem             { $$ = NULL; }
529*2b949d04SAndroid Build Coastguard Worker                 ;
530*2b949d04SAndroid Build Coastguard Worker 
531*2b949d04SAndroid Build Coastguard Worker RowBodyItem     :       KEYS OBRACE Keys CBRACE SEMI { $$ = NULL; }
532*2b949d04SAndroid Build Coastguard Worker                 |       VarDecl
533*2b949d04SAndroid Build Coastguard Worker                         { FreeStmt((ParseCommon *) $1); $$ = NULL; }
534*2b949d04SAndroid Build Coastguard Worker                 ;
535*2b949d04SAndroid Build Coastguard Worker 
536*2b949d04SAndroid Build Coastguard Worker Keys            :       Keys COMMA Key          { $$ = NULL; }
537*2b949d04SAndroid Build Coastguard Worker                 |       Key                     { $$ = NULL; }
538*2b949d04SAndroid Build Coastguard Worker                 ;
539*2b949d04SAndroid Build Coastguard Worker 
540*2b949d04SAndroid Build Coastguard Worker Key             :       KEYNAME
541*2b949d04SAndroid Build Coastguard Worker                         { $$ = NULL; }
542*2b949d04SAndroid Build Coastguard Worker                 |       OBRACE ExprList CBRACE
543*2b949d04SAndroid Build Coastguard Worker                         { FreeStmt((ParseCommon *) $2.head); $$ = NULL; }
544*2b949d04SAndroid Build Coastguard Worker                 ;
545*2b949d04SAndroid Build Coastguard Worker 
546*2b949d04SAndroid Build Coastguard Worker OverlayDecl     :       OVERLAY String OBRACE OverlayKeyList CBRACE SEMI
547*2b949d04SAndroid Build Coastguard Worker                         { $$ = NULL; }
548*2b949d04SAndroid Build Coastguard Worker                 ;
549*2b949d04SAndroid Build Coastguard Worker 
550*2b949d04SAndroid Build Coastguard Worker OverlayKeyList  :       OverlayKeyList COMMA OverlayKey { $$ = NULL; }
551*2b949d04SAndroid Build Coastguard Worker                 |       OverlayKey                      { $$ = NULL; }
552*2b949d04SAndroid Build Coastguard Worker                 ;
553*2b949d04SAndroid Build Coastguard Worker 
554*2b949d04SAndroid Build Coastguard Worker OverlayKey      :       KEYNAME EQUALS KEYNAME          { $$ = NULL; }
555*2b949d04SAndroid Build Coastguard Worker                 ;
556*2b949d04SAndroid Build Coastguard Worker 
557*2b949d04SAndroid Build Coastguard Worker OutlineList     :       OutlineList COMMA OutlineInList
558*2b949d04SAndroid Build Coastguard Worker                         { $$ = NULL;}
559*2b949d04SAndroid Build Coastguard Worker                 |       OutlineInList
560*2b949d04SAndroid Build Coastguard Worker                         { $$ = NULL; }
561*2b949d04SAndroid Build Coastguard Worker                 ;
562*2b949d04SAndroid Build Coastguard Worker 
563*2b949d04SAndroid Build Coastguard Worker OutlineInList   :       OBRACE CoordList CBRACE
564*2b949d04SAndroid Build Coastguard Worker                         { (void) $2; $$ = NULL; }
565*2b949d04SAndroid Build Coastguard Worker                 |       Ident EQUALS OBRACE CoordList CBRACE
566*2b949d04SAndroid Build Coastguard Worker                         { (void) $4; $$ = NULL; }
567*2b949d04SAndroid Build Coastguard Worker                 |       Ident EQUALS Expr
568*2b949d04SAndroid Build Coastguard Worker                         { FreeStmt((ParseCommon *) $3); $$ = NULL; }
569*2b949d04SAndroid Build Coastguard Worker                 ;
570*2b949d04SAndroid Build Coastguard Worker 
571*2b949d04SAndroid Build Coastguard Worker CoordList       :       CoordList COMMA Coord
572*2b949d04SAndroid Build Coastguard Worker                         { (void) $1; (void) $3; $$ = NULL; }
573*2b949d04SAndroid Build Coastguard Worker                 |       Coord
574*2b949d04SAndroid Build Coastguard Worker                         { (void) $1; $$ = NULL; }
575*2b949d04SAndroid Build Coastguard Worker                 ;
576*2b949d04SAndroid Build Coastguard Worker 
577*2b949d04SAndroid Build Coastguard Worker Coord           :       OBRACKET SignedNumber COMMA SignedNumber CBRACKET
578*2b949d04SAndroid Build Coastguard Worker                         { $$ = NULL; }
579*2b949d04SAndroid Build Coastguard Worker                 ;
580*2b949d04SAndroid Build Coastguard Worker 
581*2b949d04SAndroid Build Coastguard Worker DoodadDecl      :       DoodadType String OBRACE VarDeclList CBRACE SEMI
582*2b949d04SAndroid Build Coastguard Worker                         { FreeStmt((ParseCommon *) $4.head); $$ = NULL; }
583*2b949d04SAndroid Build Coastguard Worker                 ;
584*2b949d04SAndroid Build Coastguard Worker 
585*2b949d04SAndroid Build Coastguard Worker DoodadType      :       TEXT    { $$ = 0; }
586*2b949d04SAndroid Build Coastguard Worker                 |       OUTLINE { $$ = 0; }
587*2b949d04SAndroid Build Coastguard Worker                 |       SOLID   { $$ = 0; }
588*2b949d04SAndroid Build Coastguard Worker                 |       LOGO    { $$ = 0; }
589*2b949d04SAndroid Build Coastguard Worker                 ;
590*2b949d04SAndroid Build Coastguard Worker 
591*2b949d04SAndroid Build Coastguard Worker FieldSpec       :       Ident   { $$ = $1; }
592*2b949d04SAndroid Build Coastguard Worker                 |       Element { $$ = $1; }
593*2b949d04SAndroid Build Coastguard Worker                 ;
594*2b949d04SAndroid Build Coastguard Worker 
595*2b949d04SAndroid Build Coastguard Worker Element         :       ACTION_TOK
596*2b949d04SAndroid Build Coastguard Worker                         { $$ = xkb_atom_intern_literal(param->ctx, "action"); }
597*2b949d04SAndroid Build Coastguard Worker                 |       INTERPRET
598*2b949d04SAndroid Build Coastguard Worker                         { $$ = xkb_atom_intern_literal(param->ctx, "interpret"); }
599*2b949d04SAndroid Build Coastguard Worker                 |       TYPE
600*2b949d04SAndroid Build Coastguard Worker                         { $$ = xkb_atom_intern_literal(param->ctx, "type"); }
601*2b949d04SAndroid Build Coastguard Worker                 |       KEY
602*2b949d04SAndroid Build Coastguard Worker                         { $$ = xkb_atom_intern_literal(param->ctx, "key"); }
603*2b949d04SAndroid Build Coastguard Worker                 |       GROUP
604*2b949d04SAndroid Build Coastguard Worker                         { $$ = xkb_atom_intern_literal(param->ctx, "group"); }
605*2b949d04SAndroid Build Coastguard Worker                 |       MODIFIER_MAP
606*2b949d04SAndroid Build Coastguard Worker                         {$$ = xkb_atom_intern_literal(param->ctx, "modifier_map");}
607*2b949d04SAndroid Build Coastguard Worker                 |       INDICATOR
608*2b949d04SAndroid Build Coastguard Worker                         { $$ = xkb_atom_intern_literal(param->ctx, "indicator"); }
609*2b949d04SAndroid Build Coastguard Worker                 |       SHAPE
610*2b949d04SAndroid Build Coastguard Worker                         { $$ = xkb_atom_intern_literal(param->ctx, "shape"); }
611*2b949d04SAndroid Build Coastguard Worker                 |       ROW
612*2b949d04SAndroid Build Coastguard Worker                         { $$ = xkb_atom_intern_literal(param->ctx, "row"); }
613*2b949d04SAndroid Build Coastguard Worker                 |       SECTION
614*2b949d04SAndroid Build Coastguard Worker                         { $$ = xkb_atom_intern_literal(param->ctx, "section"); }
615*2b949d04SAndroid Build Coastguard Worker                 |       TEXT
616*2b949d04SAndroid Build Coastguard Worker                         { $$ = xkb_atom_intern_literal(param->ctx, "text"); }
617*2b949d04SAndroid Build Coastguard Worker                 ;
618*2b949d04SAndroid Build Coastguard Worker 
619*2b949d04SAndroid Build Coastguard Worker OptMergeMode    :       MergeMode       { $$ = $1; }
620*2b949d04SAndroid Build Coastguard Worker                 |                       { $$ = MERGE_DEFAULT; }
621*2b949d04SAndroid Build Coastguard Worker                 ;
622*2b949d04SAndroid Build Coastguard Worker 
623*2b949d04SAndroid Build Coastguard Worker MergeMode       :       INCLUDE         { $$ = MERGE_DEFAULT; }
624*2b949d04SAndroid Build Coastguard Worker                 |       AUGMENT         { $$ = MERGE_AUGMENT; }
625*2b949d04SAndroid Build Coastguard Worker                 |       OVERRIDE        { $$ = MERGE_OVERRIDE; }
626*2b949d04SAndroid Build Coastguard Worker                 |       REPLACE         { $$ = MERGE_REPLACE; }
627*2b949d04SAndroid Build Coastguard Worker                 |       ALTERNATE
628*2b949d04SAndroid Build Coastguard Worker                 {
629*2b949d04SAndroid Build Coastguard Worker                     /*
630*2b949d04SAndroid Build Coastguard Worker                      * This used to be MERGE_ALT_FORM. This functionality was
631*2b949d04SAndroid Build Coastguard Worker                      * unused and has been removed.
632*2b949d04SAndroid Build Coastguard Worker                      */
633*2b949d04SAndroid Build Coastguard Worker                     $$ = MERGE_DEFAULT;
634*2b949d04SAndroid Build Coastguard Worker                 }
635*2b949d04SAndroid Build Coastguard Worker                 ;
636*2b949d04SAndroid Build Coastguard Worker 
637*2b949d04SAndroid Build Coastguard Worker OptExprList     :       ExprList        { $$ = $1; }
638*2b949d04SAndroid Build Coastguard Worker                 |                       { $$.head = $$.last = NULL; }
639*2b949d04SAndroid Build Coastguard Worker                 ;
640*2b949d04SAndroid Build Coastguard Worker 
641*2b949d04SAndroid Build Coastguard Worker ExprList        :       ExprList COMMA Expr
642*2b949d04SAndroid Build Coastguard Worker                         { $$.head = $1.head; $$.last->common.next = &$3->common; $$.last = $3; }
643*2b949d04SAndroid Build Coastguard Worker                 |       Expr
644*2b949d04SAndroid Build Coastguard Worker                         { $$.head = $$.last = $1; }
645*2b949d04SAndroid Build Coastguard Worker                 ;
646*2b949d04SAndroid Build Coastguard Worker 
647*2b949d04SAndroid Build Coastguard Worker Expr            :       Expr DIVIDE Expr
648*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateBinary(EXPR_DIVIDE, $1, $3); }
649*2b949d04SAndroid Build Coastguard Worker                 |       Expr PLUS Expr
650*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateBinary(EXPR_ADD, $1, $3); }
651*2b949d04SAndroid Build Coastguard Worker                 |       Expr MINUS Expr
652*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateBinary(EXPR_SUBTRACT, $1, $3); }
653*2b949d04SAndroid Build Coastguard Worker                 |       Expr TIMES Expr
654*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateBinary(EXPR_MULTIPLY, $1, $3); }
655*2b949d04SAndroid Build Coastguard Worker                 |       Lhs EQUALS Expr
656*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateBinary(EXPR_ASSIGN, $1, $3); }
657*2b949d04SAndroid Build Coastguard Worker                 |       Term
658*2b949d04SAndroid Build Coastguard Worker                         { $$ = $1; }
659*2b949d04SAndroid Build Coastguard Worker                 ;
660*2b949d04SAndroid Build Coastguard Worker 
661*2b949d04SAndroid Build Coastguard Worker Term            :       MINUS Term
662*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateUnary(EXPR_NEGATE, $2->expr.value_type, $2); }
663*2b949d04SAndroid Build Coastguard Worker                 |       PLUS Term
664*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateUnary(EXPR_UNARY_PLUS, $2->expr.value_type, $2); }
665*2b949d04SAndroid Build Coastguard Worker                 |       EXCLAM Term
666*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateUnary(EXPR_NOT, EXPR_TYPE_BOOLEAN, $2); }
667*2b949d04SAndroid Build Coastguard Worker                 |       INVERT Term
668*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateUnary(EXPR_INVERT, $2->expr.value_type, $2); }
669*2b949d04SAndroid Build Coastguard Worker                 |       Lhs
670*2b949d04SAndroid Build Coastguard Worker                         { $$ = $1;  }
671*2b949d04SAndroid Build Coastguard Worker                 |       FieldSpec OPAREN OptExprList CPAREN %prec OPAREN
672*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateAction($1, $3.head); }
673*2b949d04SAndroid Build Coastguard Worker                 |       Terminal
674*2b949d04SAndroid Build Coastguard Worker                         { $$ = $1;  }
675*2b949d04SAndroid Build Coastguard Worker                 |       OPAREN Expr CPAREN
676*2b949d04SAndroid Build Coastguard Worker                         { $$ = $2;  }
677*2b949d04SAndroid Build Coastguard Worker                 ;
678*2b949d04SAndroid Build Coastguard Worker 
679*2b949d04SAndroid Build Coastguard Worker ActionList      :       ActionList COMMA Action
680*2b949d04SAndroid Build Coastguard Worker                         { $$.head = $1.head; $$.last->common.next = &$3->common; $$.last = $3; }
681*2b949d04SAndroid Build Coastguard Worker                 |       Action
682*2b949d04SAndroid Build Coastguard Worker                         { $$.head = $$.last = $1; }
683*2b949d04SAndroid Build Coastguard Worker                 ;
684*2b949d04SAndroid Build Coastguard Worker 
685*2b949d04SAndroid Build Coastguard Worker Action          :       FieldSpec OPAREN OptExprList CPAREN
686*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateAction($1, $3.head); }
687*2b949d04SAndroid Build Coastguard Worker                 ;
688*2b949d04SAndroid Build Coastguard Worker 
689*2b949d04SAndroid Build Coastguard Worker Lhs             :       FieldSpec
690*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateIdent($1); }
691*2b949d04SAndroid Build Coastguard Worker                 |       FieldSpec DOT FieldSpec
692*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateFieldRef($1, $3); }
693*2b949d04SAndroid Build Coastguard Worker                 |       FieldSpec OBRACKET Expr CBRACKET
694*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateArrayRef(XKB_ATOM_NONE, $1, $3); }
695*2b949d04SAndroid Build Coastguard Worker                 |       FieldSpec DOT FieldSpec OBRACKET Expr CBRACKET
696*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateArrayRef($1, $3, $5); }
697*2b949d04SAndroid Build Coastguard Worker                 ;
698*2b949d04SAndroid Build Coastguard Worker 
699*2b949d04SAndroid Build Coastguard Worker Terminal        :       String
700*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateString($1); }
701*2b949d04SAndroid Build Coastguard Worker                 |       Integer
702*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateInteger($1); }
703*2b949d04SAndroid Build Coastguard Worker                 |       Float
704*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateFloat(/* Discard $1 */); }
705*2b949d04SAndroid Build Coastguard Worker                 |       KEYNAME
706*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateKeyName($1); }
707*2b949d04SAndroid Build Coastguard Worker                 ;
708*2b949d04SAndroid Build Coastguard Worker 
709*2b949d04SAndroid Build Coastguard Worker OptKeySymList   :       KeySymList      { $$ = $1; }
710*2b949d04SAndroid Build Coastguard Worker                 |                       { $$ = NULL; }
711*2b949d04SAndroid Build Coastguard Worker                 ;
712*2b949d04SAndroid Build Coastguard Worker 
713*2b949d04SAndroid Build Coastguard Worker KeySymList      :       KeySymList COMMA KeySym
714*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprAppendKeysymList($1, $3); }
715*2b949d04SAndroid Build Coastguard Worker                 |       KeySymList COMMA KeySyms
716*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprAppendMultiKeysymList($1, $3); }
717*2b949d04SAndroid Build Coastguard Worker                 |       KeySym
718*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateKeysymList($1); }
719*2b949d04SAndroid Build Coastguard Worker                 |       KeySyms
720*2b949d04SAndroid Build Coastguard Worker                         { $$ = ExprCreateMultiKeysymList($1); }
721*2b949d04SAndroid Build Coastguard Worker                 ;
722*2b949d04SAndroid Build Coastguard Worker 
723*2b949d04SAndroid Build Coastguard Worker KeySyms         :       OBRACE KeySymList CBRACE
724*2b949d04SAndroid Build Coastguard Worker                         { $$ = $2; }
725*2b949d04SAndroid Build Coastguard Worker                 ;
726*2b949d04SAndroid Build Coastguard Worker 
727*2b949d04SAndroid Build Coastguard Worker KeySym          :       IDENT
728*2b949d04SAndroid Build Coastguard Worker                         {
729*2b949d04SAndroid Build Coastguard Worker                             if (!resolve_keysym($1, &$$)) {
730*2b949d04SAndroid Build Coastguard Worker                                 parser_warn(param, "unrecognized keysym \"%s\"", $1);
731*2b949d04SAndroid Build Coastguard Worker                                 $$ = XKB_KEY_NoSymbol;
732*2b949d04SAndroid Build Coastguard Worker                             }
733*2b949d04SAndroid Build Coastguard Worker                             free($1);
734*2b949d04SAndroid Build Coastguard Worker                         }
735*2b949d04SAndroid Build Coastguard Worker                 |       SECTION { $$ = XKB_KEY_section; }
736*2b949d04SAndroid Build Coastguard Worker                 |       Integer
737*2b949d04SAndroid Build Coastguard Worker                         {
738*2b949d04SAndroid Build Coastguard Worker                             if ($1 < 0) {
739*2b949d04SAndroid Build Coastguard Worker                                 parser_warn(param, "unrecognized keysym \"%"PRId64"\"", $1);
740*2b949d04SAndroid Build Coastguard Worker                                 $$ = XKB_KEY_NoSymbol;
741*2b949d04SAndroid Build Coastguard Worker                             }
742*2b949d04SAndroid Build Coastguard Worker                             else if ($1 < 10) {      /* XKB_KEY_0 .. XKB_KEY_9 */
743*2b949d04SAndroid Build Coastguard Worker                                 $$ = XKB_KEY_0 + (xkb_keysym_t) $1;
744*2b949d04SAndroid Build Coastguard Worker                             }
745*2b949d04SAndroid Build Coastguard Worker                             else {
746*2b949d04SAndroid Build Coastguard Worker                                 char buf[32];
747*2b949d04SAndroid Build Coastguard Worker                                 snprintf(buf, sizeof(buf), "0x%"PRIx64, $1);
748*2b949d04SAndroid Build Coastguard Worker                                 if (!resolve_keysym(buf, &$$)) {
749*2b949d04SAndroid Build Coastguard Worker                                     parser_warn(param, "unrecognized keysym \"%s\"", buf);
750*2b949d04SAndroid Build Coastguard Worker                                     $$ = XKB_KEY_NoSymbol;
751*2b949d04SAndroid Build Coastguard Worker                                 }
752*2b949d04SAndroid Build Coastguard Worker                             }
753*2b949d04SAndroid Build Coastguard Worker                         }
754*2b949d04SAndroid Build Coastguard Worker                 ;
755*2b949d04SAndroid Build Coastguard Worker 
756*2b949d04SAndroid Build Coastguard Worker SignedNumber    :       MINUS Number    { $$ = -$2; }
757*2b949d04SAndroid Build Coastguard Worker                 |       Number          { $$ = $1; }
758*2b949d04SAndroid Build Coastguard Worker                 ;
759*2b949d04SAndroid Build Coastguard Worker 
760*2b949d04SAndroid Build Coastguard Worker Number          :       FLOAT   { $$ = $1; }
761*2b949d04SAndroid Build Coastguard Worker                 |       INTEGER { $$ = $1; }
762*2b949d04SAndroid Build Coastguard Worker                 ;
763*2b949d04SAndroid Build Coastguard Worker 
764*2b949d04SAndroid Build Coastguard Worker Float           :       FLOAT   { $$ = 0; }
765*2b949d04SAndroid Build Coastguard Worker                 ;
766*2b949d04SAndroid Build Coastguard Worker 
767*2b949d04SAndroid Build Coastguard Worker Integer         :       INTEGER { $$ = $1; }
768*2b949d04SAndroid Build Coastguard Worker                 ;
769*2b949d04SAndroid Build Coastguard Worker 
770*2b949d04SAndroid Build Coastguard Worker KeyCode         :       INTEGER { $$ = $1; }
771*2b949d04SAndroid Build Coastguard Worker                 ;
772*2b949d04SAndroid Build Coastguard Worker 
773*2b949d04SAndroid Build Coastguard Worker Ident           :       IDENT   { $$ = xkb_atom_intern(param->ctx, $1, strlen($1)); free($1); }
774*2b949d04SAndroid Build Coastguard Worker                 |       DEFAULT { $$ = xkb_atom_intern_literal(param->ctx, "default"); }
775*2b949d04SAndroid Build Coastguard Worker                 ;
776*2b949d04SAndroid Build Coastguard Worker 
777*2b949d04SAndroid Build Coastguard Worker String          :       STRING  { $$ = xkb_atom_intern(param->ctx, $1, strlen($1)); free($1); }
778*2b949d04SAndroid Build Coastguard Worker                 ;
779*2b949d04SAndroid Build Coastguard Worker 
780*2b949d04SAndroid Build Coastguard Worker OptMapName      :       MapName { $$ = $1; }
781*2b949d04SAndroid Build Coastguard Worker                 |               { $$ = NULL; }
782*2b949d04SAndroid Build Coastguard Worker                 ;
783*2b949d04SAndroid Build Coastguard Worker 
784*2b949d04SAndroid Build Coastguard Worker MapName         :       STRING  { $$ = $1; }
785*2b949d04SAndroid Build Coastguard Worker                 ;
786*2b949d04SAndroid Build Coastguard Worker 
787*2b949d04SAndroid Build Coastguard Worker %%
788*2b949d04SAndroid Build Coastguard Worker 
789*2b949d04SAndroid Build Coastguard Worker XkbFile *
790*2b949d04SAndroid Build Coastguard Worker parse(struct xkb_context *ctx, struct scanner *scanner, const char *map)
791*2b949d04SAndroid Build Coastguard Worker {
792*2b949d04SAndroid Build Coastguard Worker     int ret;
793*2b949d04SAndroid Build Coastguard Worker     XkbFile *first = NULL;
794*2b949d04SAndroid Build Coastguard Worker     struct parser_param param = {
795*2b949d04SAndroid Build Coastguard Worker         .scanner = scanner,
796*2b949d04SAndroid Build Coastguard Worker         .ctx = ctx,
797*2b949d04SAndroid Build Coastguard Worker         .rtrn = NULL,
798*2b949d04SAndroid Build Coastguard Worker         .more_maps = false,
799*2b949d04SAndroid Build Coastguard Worker     };
800*2b949d04SAndroid Build Coastguard Worker 
801*2b949d04SAndroid Build Coastguard Worker     /*
802*2b949d04SAndroid Build Coastguard Worker      * If we got a specific map, we look for it exclusively and return
803*2b949d04SAndroid Build Coastguard Worker      * immediately upon finding it. Otherwise, we need to get the
804*2b949d04SAndroid Build Coastguard Worker      * default map. If we find a map marked as default, we return it
805*2b949d04SAndroid Build Coastguard Worker      * immediately. If there are no maps marked as default, we return
806*2b949d04SAndroid Build Coastguard Worker      * the first map in the file.
807*2b949d04SAndroid Build Coastguard Worker      */
808*2b949d04SAndroid Build Coastguard Worker 
809*2b949d04SAndroid Build Coastguard Worker     while ((ret = yyparse(&param)) == 0 && param.more_maps) {
810*2b949d04SAndroid Build Coastguard Worker         if (map) {
811*2b949d04SAndroid Build Coastguard Worker             if (streq_not_null(map, param.rtrn->name))
812*2b949d04SAndroid Build Coastguard Worker                 return param.rtrn;
813*2b949d04SAndroid Build Coastguard Worker             else
814*2b949d04SAndroid Build Coastguard Worker                 FreeXkbFile(param.rtrn);
815*2b949d04SAndroid Build Coastguard Worker         }
816*2b949d04SAndroid Build Coastguard Worker         else {
817*2b949d04SAndroid Build Coastguard Worker             if (param.rtrn->flags & MAP_IS_DEFAULT) {
818*2b949d04SAndroid Build Coastguard Worker                 FreeXkbFile(first);
819*2b949d04SAndroid Build Coastguard Worker                 return param.rtrn;
820*2b949d04SAndroid Build Coastguard Worker             }
821*2b949d04SAndroid Build Coastguard Worker             else if (!first) {
822*2b949d04SAndroid Build Coastguard Worker                 first = param.rtrn;
823*2b949d04SAndroid Build Coastguard Worker             }
824*2b949d04SAndroid Build Coastguard Worker             else {
825*2b949d04SAndroid Build Coastguard Worker                 FreeXkbFile(param.rtrn);
826*2b949d04SAndroid Build Coastguard Worker             }
827*2b949d04SAndroid Build Coastguard Worker         }
828*2b949d04SAndroid Build Coastguard Worker         param.rtrn = NULL;
829*2b949d04SAndroid Build Coastguard Worker     }
830*2b949d04SAndroid Build Coastguard Worker 
831*2b949d04SAndroid Build Coastguard Worker     if (ret != 0) {
832*2b949d04SAndroid Build Coastguard Worker         FreeXkbFile(first);
833*2b949d04SAndroid Build Coastguard Worker         return NULL;
834*2b949d04SAndroid Build Coastguard Worker     }
835*2b949d04SAndroid Build Coastguard Worker 
836*2b949d04SAndroid Build Coastguard Worker     if (first)
837*2b949d04SAndroid Build Coastguard Worker         log_vrb(ctx, 5,
838*2b949d04SAndroid Build Coastguard Worker                 "No map in include statement, but \"%s\" contains several; "
839*2b949d04SAndroid Build Coastguard Worker                 "Using first defined map, \"%s\"\n",
840*2b949d04SAndroid Build Coastguard Worker                 scanner->file_name, first->name);
841*2b949d04SAndroid Build Coastguard Worker 
842*2b949d04SAndroid Build Coastguard Worker     return first;
843*2b949d04SAndroid Build Coastguard Worker }
844