Make the sections array local to the keymap compiling function
[profile/ivi/libxkbcommon.git] / src / xkbcomp / keymap.c
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 #include "xkbcomp.h"
28 #include "xkbmisc.h"
29 #include "expr.h"
30 #include "vmod.h"
31 #include "action.h"
32 #include "misc.h"
33 #include "indicators.h"
34
35 #define KEYCODES        0
36 #define GEOMETRY        1
37 #define TYPES           2
38 #define COMPAT          3
39 #define SYMBOLS         4
40 #define MAX_SECTIONS    5
41
42 /**
43  * Compile the given file and store the output in xkb.
44  * @param file A list of XkbFiles, each denoting one type (e.g.
45  * XkmKeyNamesIdx, etc.)
46  */
47 Bool
48 CompileKeymap(XkbFile *file, struct xkb_desc * xkb, unsigned merge)
49 {
50     unsigned have;
51     Bool ok;
52     unsigned required, legal;
53     unsigned mainType;
54     char *mainName;
55     LEDInfo *unbound = NULL;
56     XkbFile *sections[MAX_SECTIONS];
57
58     memset(sections, 0, sizeof(sections));
59     mainType = file->type;
60     mainName = file->name;
61     switch (mainType)
62     {
63     case XkmSemanticsFile:
64         required = XkmSemanticsRequired;
65         legal = XkmSemanticsLegal;
66         break;
67     case XkmLayoutFile:        /* standard type  if setxkbmap -print */
68         required = XkmLayoutRequired;
69         legal = XkmKeymapLegal;
70         break;
71     case XkmKeymapFile:
72         required = XkmKeymapRequired;
73         legal = XkmKeymapLegal;
74         break;
75     default:
76         ERROR("Cannot compile %s alone into an XKM file\n",
77                XkbcConfigText(mainType));
78         return False;
79     }
80     have = 0;
81     ok = 1;
82     file = (XkbFile *) file->defs;
83     /* Check for duplicate entries in the input file */
84     while ((file) && (ok))
85     {
86         file->topName = mainName;
87         if ((have & (1 << file->type)) != 0)
88         {
89             ERROR("More than one %s section in a %s file\n",
90                    XkbcConfigText(file->type), XkbcConfigText(mainType));
91             ACTION("All sections after the first ignored\n");
92             ok = False;
93         }
94         else if ((1 << file->type) & (~legal))
95         {
96             ERROR("Cannot define %s in a %s file\n",
97                    XkbcConfigText(file->type), XkbcConfigText(mainType));
98             ok = False;
99         }
100         else
101             switch (file->type)
102             {
103             case XkmSemanticsFile:
104             case XkmLayoutFile:
105             case XkmKeymapFile:
106                 WSGO("Illegal %s configuration in a %s file\n",
107                       XkbcConfigText(file->type), XkbcConfigText(mainType));
108                 ACTION("Ignored\n");
109                 ok = False;
110                 break;
111             case XkmKeyNamesIndex:
112                 sections[KEYCODES] = file;
113                 break;
114             case XkmTypesIndex:
115                 sections[TYPES] = file;
116                 break;
117             case XkmSymbolsIndex:
118                 sections[SYMBOLS] = file;
119                 break;
120             case XkmCompatMapIndex:
121                 sections[COMPAT] = file;
122                 break;
123             case XkmGeometryIndex:
124             case XkmGeometryFile:
125                 sections[GEOMETRY] = file;
126                 break;
127             case XkmVirtualModsIndex:
128             case XkmIndicatorsIndex:
129                 WSGO("Found an isolated %s section\n",
130                       XkbcConfigText(file->type));
131                 break;
132             default:
133                 WSGO("Unknown file type %d\n", file->type);
134                 break;
135             }
136         if (ok)
137             have |= (1 << file->type);
138         file = (XkbFile *) file->common.next;
139     }
140     /* compile the sections we have in the file one-by-one, or fail. */
141     if (ok)
142     {
143         if (ok && (sections[KEYCODES] != NULL))
144             ok = CompileKeycodes(sections[KEYCODES], xkb, MergeOverride);
145         if (ok && (sections[GEOMETRY] != NULL))
146             ok = CompileGeometry(sections[GEOMETRY], xkb, MergeOverride);
147         if (ok && (sections[TYPES] != NULL))
148             ok = CompileKeyTypes(sections[TYPES], xkb, MergeOverride);
149         if (ok && (sections[COMPAT] != NULL))
150             ok = CompileCompatMap(sections[COMPAT], xkb, MergeOverride,
151                                   &unbound);
152         if (ok && (sections[SYMBOLS] != NULL))
153             ok = CompileSymbols(sections[SYMBOLS], xkb, MergeOverride);
154     }
155     if (!ok)
156         return False;
157     xkb->defined = have;
158     if (required & (~have))
159     {
160         int i, bit;
161         unsigned missing;
162         missing = required & (~have);
163         for (i = 0, bit = 1; missing != 0; i++, bit <<= 1)
164         {
165             if (missing & bit)
166             {
167                 ERROR("Missing %s section in a %s file\n",
168                        XkbcConfigText(i), XkbcConfigText(mainType));
169                 missing &= ~bit;
170             }
171         }
172         ACTION("Description of %s not compiled\n",
173                 XkbcConfigText(mainType));
174         return False;
175     }
176     ok = BindIndicators(xkb, True, unbound, NULL);
177     return ok;
178 }