1f46a6179Smrg/************************************************************
2f46a6179Smrg Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
3f46a6179Smrg
4f46a6179Smrg Permission to use, copy, modify, and distribute this
5f46a6179Smrg software and its documentation for any purpose and without
6f46a6179Smrg fee is hereby granted, provided that the above copyright
7f46a6179Smrg notice appear in all copies and that both that copyright
8f46a6179Smrg notice and this permission notice appear in supporting
9bfe6082cSmrg documentation, and that the name of Silicon Graphics not be
10bfe6082cSmrg used in advertising or publicity pertaining to distribution
11f46a6179Smrg of the software without specific prior written permission.
12bfe6082cSmrg Silicon Graphics makes no representation about the suitability
13f46a6179Smrg of this software for any purpose. It is provided "as is"
14f46a6179Smrg without any express or implied warranty.
15bfe6082cSmrg
16bfe6082cSmrg SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17bfe6082cSmrg SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18f46a6179Smrg AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19bfe6082cSmrg GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20bfe6082cSmrg DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21bfe6082cSmrg DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22f46a6179Smrg OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
23f46a6179Smrg THE USE OR PERFORMANCE OF THIS SOFTWARE.
24f46a6179Smrg
25f46a6179Smrg ********************************************************/
26f46a6179Smrg
27f46a6179Smrg#ifndef XKBCOMP_H
28f46a6179Smrg#define	XKBCOMP_H 1
29f46a6179Smrg
30f46a6179Smrg#ifndef DEBUG_VAR
31f46a6179Smrg#define	DEBUG_VAR debugFlags
32f46a6179Smrg#endif
33f46a6179Smrg
346930ead5Smrg#ifdef HAVE_CONFIG_H
356930ead5Smrg#include "config.h"
366930ead5Smrg#endif
376930ead5Smrg
38f46a6179Smrg#include <X11/Xlib.h>
39f46a6179Smrg#include <X11/XKBlib.h>
40f46a6179Smrg
41f46a6179Smrg#include "utils.h"
42f46a6179Smrg
43f46a6179Smrg#include <X11/extensions/XKM.h>
44f46a6179Smrg#include <X11/extensions/XKBfile.h>
45f46a6179Smrg
46f46a6179Smrgextern char *scanFile;
47f46a6179Smrg
48f46a6179Smrg#define	TypeUnknown	0
49f46a6179Smrg#define	TypeBoolean	1
50f46a6179Smrg#define	TypeInt		2
51f46a6179Smrg#define	TypeFloat	3
52f46a6179Smrg#define	TypeString	4
53f46a6179Smrg#define	TypeAction	5
54f46a6179Smrg#define	TypeKeyName	6
55f46a6179Smrg#define	TypeSymbols	7
56f46a6179Smrg
57f46a6179Smrg#define	StmtUnknown		0
58f46a6179Smrg#define	StmtInclude		1
59f46a6179Smrg#define	StmtKeycodeDef		2
60f46a6179Smrg#define	StmtKeyAliasDef		3
61f46a6179Smrg#define	StmtExpr		4
62f46a6179Smrg#define	StmtVarDef		5
63f46a6179Smrg#define	StmtKeyTypeDef		6
64f46a6179Smrg#define	StmtInterpDef		7
65f46a6179Smrg#define	StmtVModDef		8
66f46a6179Smrg#define	StmtSymbolsDef		9
67f46a6179Smrg#define	StmtModMapDef		10
68f46a6179Smrg#define	StmtGroupCompatDef 	11
69f46a6179Smrg#define	StmtIndicatorMapDef	12
70f46a6179Smrg#define	StmtIndicatorNameDef	13
71f46a6179Smrg#define	StmtOutlineDef		14
72f46a6179Smrg#define	StmtShapeDef		15
73f46a6179Smrg#define	StmtKeyDef		16
74f46a6179Smrg#define	StmtRowDef		17
75f46a6179Smrg#define	StmtSectionDef		18
76f46a6179Smrg#define	StmtOverlayKeyDef	19
77f46a6179Smrg#define	StmtOverlayDef		20
78f46a6179Smrg#define	StmtDoodadDef		21
79f46a6179Smrg
80f46a6179Smrg#define	FileSymInterp	100
81f46a6179Smrg
8234345a63Smrgtypedef struct _ParseCommon
8334345a63Smrg{
8434345a63Smrg    unsigned stmtType;
8534345a63Smrg    struct _ParseCommon *next;
86f46a6179Smrg} ParseCommon;
87f46a6179Smrg
88f46a6179Smrg#define	ExprValue	0
89f46a6179Smrg#define	ExprIdent	1
90f46a6179Smrg#define	ExprActionDecl	2
91f46a6179Smrg#define	ExprFieldRef	3
92f46a6179Smrg#define	ExprArrayRef	4
93f46a6179Smrg#define	ExprKeysymList	5
94f46a6179Smrg#define	ExprActionList	6
95f46a6179Smrg#define	ExprCoord	7
96f46a6179Smrg
97f46a6179Smrg#define	OpAdd		20
98f46a6179Smrg#define	OpSubtract	21
99f46a6179Smrg#define	OpMultiply	22
100f46a6179Smrg#define	OpDivide	23
101f46a6179Smrg#define	OpAssign	24
102f46a6179Smrg#define	OpNot		25
103f46a6179Smrg#define	OpNegate	26
104f46a6179Smrg#define	OpInvert	27
105f46a6179Smrg#define	OpUnaryPlus	28
106f46a6179Smrg
107f46a6179Smrg#define	MergeDefault	0
108f46a6179Smrg#define	MergeAugment	1
109f46a6179Smrg#define	MergeOverride	2
110f46a6179Smrg#define	MergeReplace	3
111f46a6179Smrg#define	MergeAltForm	4
112f46a6179Smrg
113f46a6179Smrg#define	AutoKeyNames	(1L <<  0)
114f46a6179Smrg#define	CreateKeyNames(x)	((x)->flags&AutoKeyNames)
115f46a6179Smrg
11634345a63Smrgextern unsigned warningLevel;
11734345a63Smrg
11834345a63Smrgtypedef struct _IncludeStmt
11934345a63Smrg{
12034345a63Smrg    ParseCommon common;
12134345a63Smrg    unsigned merge;
12234345a63Smrg    char *stmt;
12334345a63Smrg    char *file;
12434345a63Smrg    char *map;
12534345a63Smrg    char *modifier;
12634345a63Smrg    char *path;
12734345a63Smrg    struct _IncludeStmt *next;
128f46a6179Smrg} IncludeStmt;
129f46a6179Smrg
13034345a63Smrgtypedef struct _Expr
13134345a63Smrg{
13234345a63Smrg    ParseCommon common;
13334345a63Smrg    unsigned op;
13434345a63Smrg    unsigned type;
13534345a63Smrg    union
13634345a63Smrg    {
13734345a63Smrg        struct
13834345a63Smrg        {
13934345a63Smrg            struct _Expr *left;
14034345a63Smrg            struct _Expr *right;
14134345a63Smrg        } binary;
14234345a63Smrg        struct
14334345a63Smrg        {
14434345a63Smrg            Atom element;
14534345a63Smrg            Atom field;
14634345a63Smrg        } field;
14734345a63Smrg        struct
14834345a63Smrg        {
14934345a63Smrg            Atom element;
15034345a63Smrg            Atom field;
15134345a63Smrg            struct _Expr *entry;
15234345a63Smrg        } array;
15334345a63Smrg        struct
15434345a63Smrg        {
15534345a63Smrg            Atom name;
15634345a63Smrg            struct _Expr *args;
15734345a63Smrg        } action;
15834345a63Smrg        struct
15934345a63Smrg        {
16034345a63Smrg            int nSyms;
16134345a63Smrg            int szSyms;
16283e5f723Smrg            char **syms;
16334345a63Smrg        } list;
16434345a63Smrg        struct
16534345a63Smrg        {
16634345a63Smrg            int x;
16734345a63Smrg            int y;
16834345a63Smrg        } coord;
16934345a63Smrg        struct _Expr *child;
17034345a63Smrg        Atom str;
17134345a63Smrg        unsigned uval;
17234345a63Smrg        int ival;
17334345a63Smrg        char keyName[5];
1746930ead5Smrg        void *ptr;
175f46a6179Smrg    } value;
176f46a6179Smrg} ExprDef;
177f46a6179Smrg
17834345a63Smrgtypedef struct _VarDef
17934345a63Smrg{
18034345a63Smrg    ParseCommon common;
18134345a63Smrg    unsigned merge;
18234345a63Smrg    ExprDef *name;
18334345a63Smrg    ExprDef *value;
184f46a6179Smrg} VarDef;
185f46a6179Smrg
18634345a63Smrgtypedef struct _VModDef
18734345a63Smrg{
18834345a63Smrg    ParseCommon common;
18934345a63Smrg    unsigned merge;
19034345a63Smrg    Atom name;
19134345a63Smrg    ExprDef *value;
192f46a6179Smrg} VModDef;
193f46a6179Smrg
19434345a63Smrgtypedef struct _KeycodeDef
19534345a63Smrg{
19634345a63Smrg    ParseCommon common;
19734345a63Smrg    unsigned merge;
19834345a63Smrg    char name[5];
19934345a63Smrg    ExprDef *value;
200f46a6179Smrg} KeycodeDef;
201f46a6179Smrg
20234345a63Smrgtypedef struct _KeyAliasDef
20334345a63Smrg{
20434345a63Smrg    ParseCommon common;
20534345a63Smrg    unsigned merge;
20634345a63Smrg    char alias[5];
20734345a63Smrg    char real[5];
208f46a6179Smrg} KeyAliasDef;
209f46a6179Smrg
21034345a63Smrgtypedef struct _KeyTypeDef
21134345a63Smrg{
21234345a63Smrg    ParseCommon common;
21334345a63Smrg    unsigned merge;
21434345a63Smrg    Atom name;
21534345a63Smrg    VarDef *body;
216f46a6179Smrg} KeyTypeDef;
217f46a6179Smrg
21834345a63Smrgtypedef struct _SymbolsDef
21934345a63Smrg{
22034345a63Smrg    ParseCommon common;
22134345a63Smrg    unsigned merge;
22234345a63Smrg    char keyName[5];
22334345a63Smrg    ExprDef *symbols;
224f46a6179Smrg} SymbolsDef;
225f46a6179Smrg
22634345a63Smrgtypedef struct _ModMapDef
22734345a63Smrg{
22834345a63Smrg    ParseCommon common;
22934345a63Smrg    unsigned merge;
23034345a63Smrg    Atom modifier;
23134345a63Smrg    ExprDef *keys;
232f46a6179Smrg} ModMapDef;
233f46a6179Smrg
23434345a63Smrgtypedef struct _GroupCompatDef
23534345a63Smrg{
23634345a63Smrg    ParseCommon common;
23734345a63Smrg    unsigned merge;
23834345a63Smrg    int group;
23934345a63Smrg    ExprDef *def;
240f46a6179Smrg} GroupCompatDef;
241f46a6179Smrg
24234345a63Smrgtypedef struct _InterpDef
24334345a63Smrg{
24434345a63Smrg    ParseCommon common;
24534345a63Smrg    unsigned merge;
24634345a63Smrg    KeySym sym;
24734345a63Smrg    ExprDef *match;
24834345a63Smrg    VarDef *def;
249690143ccSmrg    Bool ignore;
250f46a6179Smrg} InterpDef;
251f46a6179Smrg
25234345a63Smrgtypedef struct _IndicatorNameDef
25334345a63Smrg{
25434345a63Smrg    ParseCommon common;
25534345a63Smrg    unsigned merge;
25634345a63Smrg    int ndx;
25734345a63Smrg    ExprDef *name;
25834345a63Smrg    Bool virtual;
259f46a6179Smrg} IndicatorNameDef;
260f46a6179Smrg
26134345a63Smrgtypedef struct _OutlineDef
26234345a63Smrg{
26334345a63Smrg    ParseCommon common;
26434345a63Smrg    Atom field;
26534345a63Smrg    int nPoints;
26634345a63Smrg    ExprDef *points;
267f46a6179Smrg} OutlineDef;
268f46a6179Smrg
26934345a63Smrgtypedef struct _ShapeDef
27034345a63Smrg{
27134345a63Smrg    ParseCommon common;
27234345a63Smrg    unsigned merge;
27334345a63Smrg    Atom name;
27434345a63Smrg    int nOutlines;
27534345a63Smrg    OutlineDef *outlines;
276f46a6179Smrg} ShapeDef;
277f46a6179Smrg
27834345a63Smrgtypedef struct _KeyDef
27934345a63Smrg{
28034345a63Smrg    ParseCommon common;
28134345a63Smrg    unsigned defined;
28234345a63Smrg    char *name;
28334345a63Smrg    ExprDef *expr;
284f46a6179Smrg} KeyDef;
285f46a6179Smrg
28634345a63Smrgtypedef struct _RowDef
28734345a63Smrg{
28834345a63Smrg    ParseCommon common;
28934345a63Smrg    int nKeys;
29034345a63Smrg    KeyDef *keys;
291f46a6179Smrg} RowDef;
292f46a6179Smrg
29334345a63Smrgtypedef struct _SectionDef
29434345a63Smrg{
29534345a63Smrg    ParseCommon common;
29634345a63Smrg    unsigned merge;
29734345a63Smrg    Atom name;
29834345a63Smrg    int nRows;
29934345a63Smrg    RowDef *rows;
300f46a6179Smrg} SectionDef;
301f46a6179Smrg
30234345a63Smrgtypedef struct _OverlayKeyDef
30334345a63Smrg{
30434345a63Smrg    ParseCommon common;
30534345a63Smrg    char over[5];
30634345a63Smrg    char under[5];
307f46a6179Smrg} OverlayKeyDef;
308f46a6179Smrg
30934345a63Smrgtypedef struct _OverlayDef
31034345a63Smrg{
31134345a63Smrg    ParseCommon common;
31234345a63Smrg    unsigned merge;
31334345a63Smrg    Atom name;
31434345a63Smrg    int nKeys;
31534345a63Smrg    OverlayKeyDef *keys;
316f46a6179Smrg} OverlayDef;
317f46a6179Smrg
31834345a63Smrgtypedef struct _DoodadDef
31934345a63Smrg{
32034345a63Smrg    ParseCommon common;
32134345a63Smrg    unsigned merge;
32234345a63Smrg    unsigned type;
32334345a63Smrg    Atom name;
32434345a63Smrg    VarDef *body;
325f46a6179Smrg} DoodadDef;
326f46a6179Smrg
327f46a6179Smrg/* IndicatorMapDef doesn't use the type field, but the rest of the fields
328f46a6179Smrg   need to be at the same offsets as in DoodadDef.  Use #define to avoid
329f46a6179Smrg   any strict aliasing problems.  */
330f46a6179Smrg#define IndicatorMapDef DoodadDef
331f46a6179Smrg
33234345a63Smrgtypedef struct _XkbFile
33334345a63Smrg{
33434345a63Smrg    ParseCommon common;
33534345a63Smrg    int type;
33634345a63Smrg    char *topName;
33734345a63Smrg    char *name;
33834345a63Smrg    ParseCommon *defs;
33934345a63Smrg    int id;
34034345a63Smrg    unsigned flags;
34134345a63Smrg    Bool compiled;
342f46a6179Smrg} XkbFile;
343f46a6179Smrg
34434345a63Smrgextern Bool CompileKeymap(XkbFile * /* file */ ,
34534345a63Smrg                          XkbFileInfo * /* result */ ,
34634345a63Smrg                          unsigned      /* merge */
34734345a63Smrg    );
34834345a63Smrg
34934345a63Smrgextern Bool CompileKeycodes(XkbFile * /* file */ ,
35034345a63Smrg                            XkbFileInfo * /* result */ ,
35134345a63Smrg                            unsigned    /* merge */
35234345a63Smrg    );
35334345a63Smrg
35434345a63Smrgextern Bool CompileGeometry(XkbFile * /* file */ ,
35534345a63Smrg                            XkbFileInfo * /* result */ ,
35634345a63Smrg                            unsigned    /* merge */
35734345a63Smrg    );
35834345a63Smrg
35934345a63Smrgextern Bool CompileKeyTypes(XkbFile * /* file */ ,
36034345a63Smrg                            XkbFileInfo * /* result */ ,
36134345a63Smrg                            unsigned    /* merge */
36234345a63Smrg    );
363f46a6179Smrg
364f46a6179Smrgtypedef struct _LEDInfo *LEDInfoPtr;
365f46a6179Smrg
3666930ead5Smrgextern Bool CompileCompatMap(const XkbFile * /* file */ ,
36734345a63Smrg                             XkbFileInfo * /* result */ ,
36834345a63Smrg                             unsigned /* merge */ ,
36934345a63Smrg                             LEDInfoPtr *       /* unboundLEDs */
37034345a63Smrg    );
371f46a6179Smrg
37234345a63Smrgextern Bool CompileSymbols(XkbFile * /* file */ ,
37334345a63Smrg                           XkbFileInfo * /* result */ ,
37434345a63Smrg                           unsigned     /* merge */
37534345a63Smrg    );
376f46a6179Smrg
377f46a6179Smrg#define	WantLongListing	(1<<0)
378f46a6179Smrg#define	WantPartialMaps	(1<<1)
379f46a6179Smrg#define	WantHiddenMaps	(1<<2)
380f46a6179Smrg#define	WantFullNames	(1<<3)
381f46a6179Smrg#define	ListRecursive	(1<<4)
382f46a6179Smrg
383f46a6179Smrgextern unsigned verboseLevel;
38434345a63Smrgextern unsigned dirsToStrip;
385f46a6179Smrg
38634345a63Smrgextern Bool AddMatchingFiles(char *     /* head_in */
38734345a63Smrg    );
388f46a6179Smrg
38934345a63Smrgextern int AddMapOnly(char *    /* map */
39034345a63Smrg    );
391f46a6179Smrg
3926930ead5Smrgextern int GenerateListing(const char * /* filename */
39334345a63Smrg    );
394f46a6179Smrg
395f46a6179Smrg#endif /* XKBCOMP_H */
396