1 /************************************************************
2  * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
3  *
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.
15  *
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.
24  *
25  ********************************************************/
26 
27 /*
28  * Copyright © 2012 Ran Benita <ran234@gmail.com>
29  *
30  * Permission is hereby granted, free of charge, to any person obtaining a
31  * copy of this software and associated documentation files (the "Software"),
32  * to deal in the Software without restriction, including without limitation
33  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
34  * and/or sell copies of the Software, and to permit persons to whom the
35  * Software is furnished to do so, subject to the following conditions:
36  *
37  * The above copyright notice and this permission notice (including the next
38  * paragraph) shall be included in all copies or substantial portions of the
39  * Software.
40  *
41  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
42  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
43  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
44  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
45  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
46  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
47  * DEALINGS IN THE SOFTWARE.
48  */
49 
50 #ifndef XKBCOMP_AST_H
51 #define XKBCOMP_AST_H
52 
53 enum xkb_file_type {
54     /* Component files, by order of compilation. */
55     FILE_TYPE_KEYCODES = 0,
56     FILE_TYPE_TYPES = 1,
57     FILE_TYPE_COMPAT = 2,
58     FILE_TYPE_SYMBOLS = 3,
59     /* Geometry is not compiled any more. */
60     FILE_TYPE_GEOMETRY = 4,
61 
62     /* A top level file which includes the above files. */
63     FILE_TYPE_KEYMAP,
64 
65 /* File types which must be found in a keymap file. */
66 #define FIRST_KEYMAP_FILE_TYPE FILE_TYPE_KEYCODES
67 #define LAST_KEYMAP_FILE_TYPE  FILE_TYPE_SYMBOLS
68 
69     /* This one doesn't mix with the others, but useful here as well. */
70     FILE_TYPE_RULES,
71 
72     _FILE_TYPE_NUM_ENTRIES
73 };
74 
75 enum stmt_type {
76     STMT_UNKNOWN = 0,
77     STMT_INCLUDE,
78     STMT_KEYCODE,
79     STMT_ALIAS,
80     STMT_EXPR,
81     STMT_VAR,
82     STMT_TYPE,
83     STMT_INTERP,
84     STMT_VMOD,
85     STMT_SYMBOLS,
86     STMT_MODMAP,
87     STMT_GROUP_COMPAT,
88     STMT_LED_MAP,
89     STMT_LED_NAME,
90 
91     _STMT_NUM_VALUES
92 };
93 
94 enum expr_value_type {
95     EXPR_TYPE_UNKNOWN = 0,
96     EXPR_TYPE_BOOLEAN,
97     EXPR_TYPE_INT,
98     EXPR_TYPE_STRING,
99     EXPR_TYPE_ACTION,
100     EXPR_TYPE_KEYNAME,
101     EXPR_TYPE_SYMBOLS,
102 
103     _EXPR_TYPE_NUM_VALUES
104 };
105 
106 enum expr_op_type {
107     EXPR_VALUE,
108     EXPR_IDENT,
109     EXPR_ACTION_DECL,
110     EXPR_FIELD_REF,
111     EXPR_ARRAY_REF,
112     EXPR_KEYSYM_LIST,
113     EXPR_ACTION_LIST,
114     EXPR_ADD,
115     EXPR_SUBTRACT,
116     EXPR_MULTIPLY,
117     EXPR_DIVIDE,
118     EXPR_ASSIGN,
119     EXPR_NOT,
120     EXPR_NEGATE,
121     EXPR_INVERT,
122     EXPR_UNARY_PLUS,
123 
124     _EXPR_NUM_VALUES
125 };
126 
127 enum merge_mode {
128     MERGE_DEFAULT,
129     MERGE_AUGMENT,
130     MERGE_OVERRIDE,
131     MERGE_REPLACE,
132 };
133 
134 const char *
135 xkb_file_type_to_string(enum xkb_file_type type);
136 
137 const char *
138 stmt_type_to_string(enum stmt_type type);
139 
140 const char *
141 expr_op_type_to_string(enum expr_op_type type);
142 
143 const char *
144 expr_value_type_to_string(enum expr_value_type type);
145 
146 typedef struct _ParseCommon  {
147     struct _ParseCommon *next;
148     enum stmt_type type;
149 } ParseCommon;
150 
151 typedef struct _IncludeStmt {
152     ParseCommon common;
153     enum merge_mode merge;
154     char *stmt;
155     char *file;
156     char *map;
157     char *modifier;
158     struct _IncludeStmt *next_incl;
159 } IncludeStmt;
160 
161 typedef struct {
162     ParseCommon common;
163     enum expr_op_type op;
164     enum expr_value_type value_type;
165 } ExprCommon;
166 
167 typedef union ExprDef ExprDef;
168 
169 typedef struct {
170     ExprCommon expr;
171     xkb_atom_t ident;
172 } ExprIdent;
173 
174 typedef struct {
175     ExprCommon expr;
176     xkb_atom_t str;
177 } ExprString;
178 
179 typedef struct {
180     ExprCommon expr;
181     bool set;
182 } ExprBoolean;
183 
184 typedef struct {
185     ExprCommon expr;
186     int ival;
187 } ExprInteger;
188 
189 typedef struct {
190     ExprCommon expr;
191     xkb_atom_t key_name;
192 } ExprKeyName;
193 
194 typedef struct {
195     ExprCommon expr;
196     ExprDef *left;
197     ExprDef *right;
198 } ExprBinary;
199 
200 typedef struct {
201     ExprCommon expr;
202     ExprDef *child;
203 } ExprUnary;
204 
205 typedef struct {
206     ExprCommon expr;
207     xkb_atom_t element;
208     xkb_atom_t field;
209 } ExprFieldRef;
210 
211 typedef struct {
212     ExprCommon expr;
213     xkb_atom_t element;
214     xkb_atom_t field;
215     ExprDef *entry;
216 } ExprArrayRef;
217 
218 typedef struct {
219     ExprCommon expr;
220     xkb_atom_t name;
221     ExprDef *args;
222 } ExprAction;
223 
224 typedef struct {
225     ExprCommon expr;
226     darray(xkb_keysym_t) syms;
227     darray(unsigned int) symsMapIndex;
228     darray(unsigned int) symsNumEntries;
229 } ExprKeysymList;
230 
231 union ExprDef {
232     ParseCommon common;
233     /* Maybe someday we can use C11 anonymous struct for ExprCommon here. */
234     ExprCommon expr;
235     ExprIdent ident;
236     ExprString string;
237     ExprBoolean boolean;
238     ExprInteger integer;
239     ExprKeyName key_name;
240     ExprBinary binary;
241     ExprUnary unary;
242     ExprFieldRef field_ref;
243     ExprArrayRef array_ref;
244     ExprAction action;
245     ExprKeysymList keysym_list;
246 };
247 
248 typedef struct {
249     ParseCommon common;
250     enum merge_mode merge;
251     ExprDef *name;
252     ExprDef *value;
253 } VarDef;
254 
255 typedef struct {
256     ParseCommon common;
257     enum merge_mode merge;
258     xkb_atom_t name;
259     ExprDef *value;
260 } VModDef;
261 
262 typedef struct {
263     ParseCommon common;
264     enum merge_mode merge;
265     xkb_atom_t name;
266     int64_t value;
267 } KeycodeDef;
268 
269 typedef struct {
270     ParseCommon common;
271     enum merge_mode merge;
272     xkb_atom_t alias;
273     xkb_atom_t real;
274 } KeyAliasDef;
275 
276 typedef struct {
277     ParseCommon common;
278     enum merge_mode merge;
279     xkb_atom_t name;
280     VarDef *body;
281 } KeyTypeDef;
282 
283 typedef struct {
284     ParseCommon common;
285     enum merge_mode merge;
286     xkb_atom_t keyName;
287     VarDef *symbols;
288 } SymbolsDef;
289 
290 typedef struct {
291     ParseCommon common;
292     enum merge_mode merge;
293     xkb_atom_t modifier;
294     ExprDef *keys;
295 } ModMapDef;
296 
297 typedef struct {
298     ParseCommon common;
299     enum merge_mode merge;
300     unsigned group;
301     ExprDef *def;
302 } GroupCompatDef;
303 
304 typedef struct {
305     ParseCommon common;
306     enum merge_mode merge;
307     xkb_keysym_t sym;
308     ExprDef *match;
309     VarDef *def;
310 } InterpDef;
311 
312 typedef struct {
313     ParseCommon common;
314     enum merge_mode merge;
315     unsigned ndx;
316     ExprDef *name;
317     bool virtual;
318 } LedNameDef;
319 
320 typedef struct {
321     ParseCommon common;
322     enum merge_mode merge;
323     xkb_atom_t name;
324     VarDef *body;
325 } LedMapDef;
326 
327 enum xkb_map_flags {
328     MAP_IS_DEFAULT = (1 << 0),
329     MAP_IS_PARTIAL = (1 << 1),
330     MAP_IS_HIDDEN = (1 << 2),
331     MAP_HAS_ALPHANUMERIC = (1 << 3),
332     MAP_HAS_MODIFIER = (1 << 4),
333     MAP_HAS_KEYPAD = (1 << 5),
334     MAP_HAS_FN = (1 << 6),
335     MAP_IS_ALTGR = (1 << 7),
336 };
337 
338 typedef struct {
339     ParseCommon common;
340     enum xkb_file_type file_type;
341     char *topName;
342     char *name;
343     ParseCommon *defs;
344     enum xkb_map_flags flags;
345 } XkbFile;
346 
347 #endif
348