xref: /OK3568_Linux_fs/external/xserver/hw/xfree86/parser/InputClass.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2009 Dan Nicholson
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person
5*4882a593Smuzhiyun  * obtaining a copy of this software and associated documentation
6*4882a593Smuzhiyun  * files (the "Software"), to deal in the Software without
7*4882a593Smuzhiyun  * restriction, including without limitation the rights to use,
8*4882a593Smuzhiyun  * copy, modify, merge, publish, distribute, sublicense, and/or sell
9*4882a593Smuzhiyun  * copies of the Software, and to permit persons to whom the
10*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following
11*4882a593Smuzhiyun  * conditions:
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * The above copyright notice and this permission notice shall be
14*4882a593Smuzhiyun  * included in all copies or substantial portions of the Software.
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17*4882a593Smuzhiyun  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18*4882a593Smuzhiyun  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19*4882a593Smuzhiyun  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20*4882a593Smuzhiyun  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21*4882a593Smuzhiyun  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22*4882a593Smuzhiyun  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23*4882a593Smuzhiyun  * OTHER DEALINGS IN THE SOFTWARE.
24*4882a593Smuzhiyun  */
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #ifdef HAVE_XORG_CONFIG_H
27*4882a593Smuzhiyun #include <xorg-config.h>
28*4882a593Smuzhiyun #endif
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #include <string.h>
31*4882a593Smuzhiyun #include "os.h"
32*4882a593Smuzhiyun #include "xf86Parser.h"
33*4882a593Smuzhiyun #include "xf86tokens.h"
34*4882a593Smuzhiyun #include "Configint.h"
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun static const xf86ConfigSymTabRec InputClassTab[] = {
38*4882a593Smuzhiyun     {ENDSECTION, "endsection"},
39*4882a593Smuzhiyun     {IDENTIFIER, "identifier"},
40*4882a593Smuzhiyun     {OPTION, "option"},
41*4882a593Smuzhiyun     {DRIVER, "driver"},
42*4882a593Smuzhiyun     {MATCH_PRODUCT, "matchproduct"},
43*4882a593Smuzhiyun     {MATCH_VENDOR, "matchvendor"},
44*4882a593Smuzhiyun     {MATCH_DEVICE_PATH, "matchdevicepath"},
45*4882a593Smuzhiyun     {MATCH_OS, "matchos"},
46*4882a593Smuzhiyun     {MATCH_PNPID, "matchpnpid"},
47*4882a593Smuzhiyun     {MATCH_USBID, "matchusbid"},
48*4882a593Smuzhiyun     {MATCH_DRIVER, "matchdriver"},
49*4882a593Smuzhiyun     {MATCH_TAG, "matchtag"},
50*4882a593Smuzhiyun     {MATCH_LAYOUT, "matchlayout"},
51*4882a593Smuzhiyun     {MATCH_IS_KEYBOARD, "matchiskeyboard"},
52*4882a593Smuzhiyun     {MATCH_IS_POINTER, "matchispointer"},
53*4882a593Smuzhiyun     {MATCH_IS_JOYSTICK, "matchisjoystick"},
54*4882a593Smuzhiyun     {MATCH_IS_TABLET, "matchistablet"},
55*4882a593Smuzhiyun     {MATCH_IS_TABLET_PAD, "matchistabletpad"},
56*4882a593Smuzhiyun     {MATCH_IS_TOUCHPAD, "matchistouchpad"},
57*4882a593Smuzhiyun     {MATCH_IS_TOUCHSCREEN, "matchistouchscreen"},
58*4882a593Smuzhiyun     {NOMATCH_PRODUCT, "nomatchproduct"},
59*4882a593Smuzhiyun     {NOMATCH_VENDOR, "nomatchvendor"},
60*4882a593Smuzhiyun     {NOMATCH_DEVICE_PATH, "nomatchdevicepath"},
61*4882a593Smuzhiyun     {NOMATCH_OS, "nomatchos"},
62*4882a593Smuzhiyun     {NOMATCH_PNPID, "nomatchpnpid"},
63*4882a593Smuzhiyun     {NOMATCH_USBID, "nomatchusbid"},
64*4882a593Smuzhiyun     {NOMATCH_DRIVER, "nomatchdriver"},
65*4882a593Smuzhiyun     {NOMATCH_TAG, "nomatchtag"},
66*4882a593Smuzhiyun     {NOMATCH_LAYOUT, "nomatchlayout"},
67*4882a593Smuzhiyun     {-1, ""},
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun static void
xf86freeInputClassList(XF86ConfInputClassPtr ptr)71*4882a593Smuzhiyun xf86freeInputClassList(XF86ConfInputClassPtr ptr)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun     XF86ConfInputClassPtr prev;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun     while (ptr) {
76*4882a593Smuzhiyun         xf86MatchGroup *group, *next;
77*4882a593Smuzhiyun         char **list;
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun         TestFree(ptr->identifier);
80*4882a593Smuzhiyun         TestFree(ptr->driver);
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun         xorg_list_for_each_entry_safe(group, next, &ptr->match_product, entry) {
83*4882a593Smuzhiyun             xorg_list_del(&group->entry);
84*4882a593Smuzhiyun             for (list = group->values; *list; list++)
85*4882a593Smuzhiyun                 free(*list);
86*4882a593Smuzhiyun             free(group);
87*4882a593Smuzhiyun         }
88*4882a593Smuzhiyun         xorg_list_for_each_entry_safe(group, next, &ptr->match_vendor, entry) {
89*4882a593Smuzhiyun             xorg_list_del(&group->entry);
90*4882a593Smuzhiyun             for (list = group->values; *list; list++)
91*4882a593Smuzhiyun                 free(*list);
92*4882a593Smuzhiyun             free(group);
93*4882a593Smuzhiyun         }
94*4882a593Smuzhiyun         xorg_list_for_each_entry_safe(group, next, &ptr->match_device, entry) {
95*4882a593Smuzhiyun             xorg_list_del(&group->entry);
96*4882a593Smuzhiyun             for (list = group->values; *list; list++)
97*4882a593Smuzhiyun                 free(*list);
98*4882a593Smuzhiyun             free(group);
99*4882a593Smuzhiyun         }
100*4882a593Smuzhiyun         xorg_list_for_each_entry_safe(group, next, &ptr->match_os, entry) {
101*4882a593Smuzhiyun             xorg_list_del(&group->entry);
102*4882a593Smuzhiyun             for (list = group->values; *list; list++)
103*4882a593Smuzhiyun                 free(*list);
104*4882a593Smuzhiyun             free(group);
105*4882a593Smuzhiyun         }
106*4882a593Smuzhiyun         xorg_list_for_each_entry_safe(group, next, &ptr->match_pnpid, entry) {
107*4882a593Smuzhiyun             xorg_list_del(&group->entry);
108*4882a593Smuzhiyun             for (list = group->values; *list; list++)
109*4882a593Smuzhiyun                 free(*list);
110*4882a593Smuzhiyun             free(group);
111*4882a593Smuzhiyun         }
112*4882a593Smuzhiyun         xorg_list_for_each_entry_safe(group, next, &ptr->match_usbid, entry) {
113*4882a593Smuzhiyun             xorg_list_del(&group->entry);
114*4882a593Smuzhiyun             for (list = group->values; *list; list++)
115*4882a593Smuzhiyun                 free(*list);
116*4882a593Smuzhiyun             free(group);
117*4882a593Smuzhiyun         }
118*4882a593Smuzhiyun         xorg_list_for_each_entry_safe(group, next, &ptr->match_driver, entry) {
119*4882a593Smuzhiyun             xorg_list_del(&group->entry);
120*4882a593Smuzhiyun             for (list = group->values; *list; list++)
121*4882a593Smuzhiyun                 free(*list);
122*4882a593Smuzhiyun             free(group);
123*4882a593Smuzhiyun         }
124*4882a593Smuzhiyun         xorg_list_for_each_entry_safe(group, next, &ptr->match_tag, entry) {
125*4882a593Smuzhiyun             xorg_list_del(&group->entry);
126*4882a593Smuzhiyun             for (list = group->values; *list; list++)
127*4882a593Smuzhiyun                 free(*list);
128*4882a593Smuzhiyun             free(group);
129*4882a593Smuzhiyun         }
130*4882a593Smuzhiyun         xorg_list_for_each_entry_safe(group, next, &ptr->match_layout, entry) {
131*4882a593Smuzhiyun             xorg_list_del(&group->entry);
132*4882a593Smuzhiyun             for (list = group->values; *list; list++)
133*4882a593Smuzhiyun                 free(*list);
134*4882a593Smuzhiyun             free(group);
135*4882a593Smuzhiyun         }
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun         TestFree(ptr->comment);
138*4882a593Smuzhiyun         xf86optionListFree(ptr->option_lst);
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun         prev = ptr;
141*4882a593Smuzhiyun         ptr = ptr->list.next;
142*4882a593Smuzhiyun         free(prev);
143*4882a593Smuzhiyun     }
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun #define CLEANUP xf86freeInputClassList
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun #define TOKEN_SEP "|"
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun enum MatchType {
151*4882a593Smuzhiyun     MATCH_NORMAL,
152*4882a593Smuzhiyun     MATCH_NEGATED,
153*4882a593Smuzhiyun };
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun static void
add_group_entry(struct xorg_list * head,char ** values,enum MatchType type)156*4882a593Smuzhiyun add_group_entry(struct xorg_list *head, char **values, enum MatchType type)
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun     xf86MatchGroup *group;
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun     group = malloc(sizeof(*group));
161*4882a593Smuzhiyun     if (group) {
162*4882a593Smuzhiyun         group->is_negated = (type == MATCH_NEGATED);
163*4882a593Smuzhiyun         group->values = values;
164*4882a593Smuzhiyun         xorg_list_add(&group->entry, head);
165*4882a593Smuzhiyun     }
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun XF86ConfInputClassPtr
xf86parseInputClassSection(void)169*4882a593Smuzhiyun xf86parseInputClassSection(void)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun     int has_ident = FALSE;
172*4882a593Smuzhiyun     int token;
173*4882a593Smuzhiyun     enum MatchType matchtype;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun     parsePrologue(XF86ConfInputClassPtr, XF86ConfInputClassRec)
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun     /* Initialize MatchGroup lists */
178*4882a593Smuzhiyun     xorg_list_init(&ptr->match_product);
179*4882a593Smuzhiyun     xorg_list_init(&ptr->match_vendor);
180*4882a593Smuzhiyun     xorg_list_init(&ptr->match_device);
181*4882a593Smuzhiyun     xorg_list_init(&ptr->match_os);
182*4882a593Smuzhiyun     xorg_list_init(&ptr->match_pnpid);
183*4882a593Smuzhiyun     xorg_list_init(&ptr->match_usbid);
184*4882a593Smuzhiyun     xorg_list_init(&ptr->match_driver);
185*4882a593Smuzhiyun     xorg_list_init(&ptr->match_tag);
186*4882a593Smuzhiyun     xorg_list_init(&ptr->match_layout);
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun     while ((token = xf86getToken(InputClassTab)) != ENDSECTION) {
189*4882a593Smuzhiyun         matchtype = MATCH_NORMAL;
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun         switch (token) {
192*4882a593Smuzhiyun         case COMMENT:
193*4882a593Smuzhiyun             ptr->comment = xf86addComment(ptr->comment, xf86_lex_val.str);
194*4882a593Smuzhiyun             break;
195*4882a593Smuzhiyun         case IDENTIFIER:
196*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
197*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Identifier");
198*4882a593Smuzhiyun             if (has_ident == TRUE)
199*4882a593Smuzhiyun                 Error(MULTIPLE_MSG, "Identifier");
200*4882a593Smuzhiyun             ptr->identifier = xf86_lex_val.str;
201*4882a593Smuzhiyun             has_ident = TRUE;
202*4882a593Smuzhiyun             break;
203*4882a593Smuzhiyun         case DRIVER:
204*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
205*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Driver");
206*4882a593Smuzhiyun             if (strcmp(xf86_lex_val.str, "keyboard") == 0) {
207*4882a593Smuzhiyun                 ptr->driver = strdup("kbd");
208*4882a593Smuzhiyun                 free(xf86_lex_val.str);
209*4882a593Smuzhiyun             }
210*4882a593Smuzhiyun             else
211*4882a593Smuzhiyun                 ptr->driver = xf86_lex_val.str;
212*4882a593Smuzhiyun             break;
213*4882a593Smuzhiyun         case OPTION:
214*4882a593Smuzhiyun             ptr->option_lst = xf86parseOption(ptr->option_lst);
215*4882a593Smuzhiyun             break;
216*4882a593Smuzhiyun         case NOMATCH_PRODUCT:
217*4882a593Smuzhiyun             matchtype = MATCH_NEGATED;
218*4882a593Smuzhiyun             /* fallthrough */
219*4882a593Smuzhiyun         case MATCH_PRODUCT:
220*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
221*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchProduct");
222*4882a593Smuzhiyun             add_group_entry(&ptr->match_product,
223*4882a593Smuzhiyun                             xstrtokenize(xf86_lex_val.str, TOKEN_SEP),
224*4882a593Smuzhiyun                             matchtype);
225*4882a593Smuzhiyun             free(xf86_lex_val.str);
226*4882a593Smuzhiyun             break;
227*4882a593Smuzhiyun         case NOMATCH_VENDOR:
228*4882a593Smuzhiyun             matchtype = MATCH_NEGATED;
229*4882a593Smuzhiyun             /* fallthrough */
230*4882a593Smuzhiyun         case MATCH_VENDOR:
231*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
232*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchVendor");
233*4882a593Smuzhiyun             add_group_entry(&ptr->match_vendor,
234*4882a593Smuzhiyun                             xstrtokenize(xf86_lex_val.str, TOKEN_SEP),
235*4882a593Smuzhiyun                             matchtype);
236*4882a593Smuzhiyun             free(xf86_lex_val.str);
237*4882a593Smuzhiyun             break;
238*4882a593Smuzhiyun         case NOMATCH_DEVICE_PATH:
239*4882a593Smuzhiyun             matchtype = MATCH_NEGATED;
240*4882a593Smuzhiyun             /* fallthrough */
241*4882a593Smuzhiyun         case MATCH_DEVICE_PATH:
242*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
243*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchDevicePath");
244*4882a593Smuzhiyun             add_group_entry(&ptr->match_device,
245*4882a593Smuzhiyun                             xstrtokenize(xf86_lex_val.str, TOKEN_SEP),
246*4882a593Smuzhiyun                             matchtype);
247*4882a593Smuzhiyun             free(xf86_lex_val.str);
248*4882a593Smuzhiyun             break;
249*4882a593Smuzhiyun         case NOMATCH_OS:
250*4882a593Smuzhiyun             matchtype = MATCH_NEGATED;
251*4882a593Smuzhiyun             /* fallthrough */
252*4882a593Smuzhiyun         case MATCH_OS:
253*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
254*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchOS");
255*4882a593Smuzhiyun             add_group_entry(&ptr->match_os, xstrtokenize(xf86_lex_val.str,
256*4882a593Smuzhiyun                                                          TOKEN_SEP),
257*4882a593Smuzhiyun                             matchtype);
258*4882a593Smuzhiyun             free(xf86_lex_val.str);
259*4882a593Smuzhiyun             break;
260*4882a593Smuzhiyun         case NOMATCH_PNPID:
261*4882a593Smuzhiyun             matchtype = MATCH_NEGATED;
262*4882a593Smuzhiyun             /* fallthrough */
263*4882a593Smuzhiyun         case MATCH_PNPID:
264*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
265*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchPnPID");
266*4882a593Smuzhiyun             add_group_entry(&ptr->match_pnpid,
267*4882a593Smuzhiyun                             xstrtokenize(xf86_lex_val.str, TOKEN_SEP),
268*4882a593Smuzhiyun                             matchtype);
269*4882a593Smuzhiyun             free(xf86_lex_val.str);
270*4882a593Smuzhiyun             break;
271*4882a593Smuzhiyun         case NOMATCH_USBID:
272*4882a593Smuzhiyun             matchtype = MATCH_NEGATED;
273*4882a593Smuzhiyun             /* fallthrough */
274*4882a593Smuzhiyun         case MATCH_USBID:
275*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
276*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchUSBID");
277*4882a593Smuzhiyun             add_group_entry(&ptr->match_usbid,
278*4882a593Smuzhiyun                             xstrtokenize(xf86_lex_val.str, TOKEN_SEP),
279*4882a593Smuzhiyun                             matchtype);
280*4882a593Smuzhiyun             free(xf86_lex_val.str);
281*4882a593Smuzhiyun             break;
282*4882a593Smuzhiyun         case NOMATCH_DRIVER:
283*4882a593Smuzhiyun             matchtype = MATCH_NEGATED;
284*4882a593Smuzhiyun             /* fallthrough */
285*4882a593Smuzhiyun         case MATCH_DRIVER:
286*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
287*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchDriver");
288*4882a593Smuzhiyun             add_group_entry(&ptr->match_driver,
289*4882a593Smuzhiyun                             xstrtokenize(xf86_lex_val.str, TOKEN_SEP),
290*4882a593Smuzhiyun                             matchtype);
291*4882a593Smuzhiyun             free(xf86_lex_val.str);
292*4882a593Smuzhiyun             break;
293*4882a593Smuzhiyun         case NOMATCH_TAG:
294*4882a593Smuzhiyun             matchtype = MATCH_NEGATED;
295*4882a593Smuzhiyun             /* fallthrough */
296*4882a593Smuzhiyun         case MATCH_TAG:
297*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
298*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchTag");
299*4882a593Smuzhiyun             add_group_entry(&ptr->match_tag, xstrtokenize(xf86_lex_val.str,
300*4882a593Smuzhiyun                                                           TOKEN_SEP),
301*4882a593Smuzhiyun                             matchtype);
302*4882a593Smuzhiyun             free(xf86_lex_val.str);
303*4882a593Smuzhiyun             break;
304*4882a593Smuzhiyun         case NOMATCH_LAYOUT:
305*4882a593Smuzhiyun             matchtype = MATCH_NEGATED;
306*4882a593Smuzhiyun             /* fallthrough */
307*4882a593Smuzhiyun         case MATCH_LAYOUT:
308*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
309*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchLayout");
310*4882a593Smuzhiyun             add_group_entry(&ptr->match_layout,
311*4882a593Smuzhiyun                             xstrtokenize(xf86_lex_val.str, TOKEN_SEP),
312*4882a593Smuzhiyun                             matchtype);
313*4882a593Smuzhiyun             free(xf86_lex_val.str);
314*4882a593Smuzhiyun             break;
315*4882a593Smuzhiyun         case MATCH_IS_KEYBOARD:
316*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
317*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchIsKeyboard");
318*4882a593Smuzhiyun             ptr->is_keyboard.set = xf86getBoolValue(&ptr->is_keyboard.val,
319*4882a593Smuzhiyun                                                     xf86_lex_val.str);
320*4882a593Smuzhiyun             free(xf86_lex_val.str);
321*4882a593Smuzhiyun             if (!ptr->is_keyboard.set)
322*4882a593Smuzhiyun                 Error(BOOL_MSG, "MatchIsKeyboard");
323*4882a593Smuzhiyun             break;
324*4882a593Smuzhiyun         case MATCH_IS_POINTER:
325*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
326*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchIsPointer");
327*4882a593Smuzhiyun             ptr->is_pointer.set = xf86getBoolValue(&ptr->is_pointer.val,
328*4882a593Smuzhiyun                                                    xf86_lex_val.str);
329*4882a593Smuzhiyun             free(xf86_lex_val.str);
330*4882a593Smuzhiyun             if (!ptr->is_pointer.set)
331*4882a593Smuzhiyun                 Error(BOOL_MSG, "MatchIsPointer");
332*4882a593Smuzhiyun             break;
333*4882a593Smuzhiyun         case MATCH_IS_JOYSTICK:
334*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
335*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchIsJoystick");
336*4882a593Smuzhiyun             ptr->is_joystick.set = xf86getBoolValue(&ptr->is_joystick.val,
337*4882a593Smuzhiyun                                                     xf86_lex_val.str);
338*4882a593Smuzhiyun             free(xf86_lex_val.str);
339*4882a593Smuzhiyun             if (!ptr->is_joystick.set)
340*4882a593Smuzhiyun                 Error(BOOL_MSG, "MatchIsJoystick");
341*4882a593Smuzhiyun             break;
342*4882a593Smuzhiyun         case MATCH_IS_TABLET:
343*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
344*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchIsTablet");
345*4882a593Smuzhiyun             ptr->is_tablet.set = xf86getBoolValue(&ptr->is_tablet.val, xf86_lex_val.str);
346*4882a593Smuzhiyun             free(xf86_lex_val.str);
347*4882a593Smuzhiyun             if (!ptr->is_tablet.set)
348*4882a593Smuzhiyun                 Error(BOOL_MSG, "MatchIsTablet");
349*4882a593Smuzhiyun             break;
350*4882a593Smuzhiyun         case MATCH_IS_TABLET_PAD:
351*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
352*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchIsTabletPad");
353*4882a593Smuzhiyun             ptr->is_tablet_pad.set = xf86getBoolValue(&ptr->is_tablet_pad.val, xf86_lex_val.str);
354*4882a593Smuzhiyun             free(xf86_lex_val.str);
355*4882a593Smuzhiyun             if (!ptr->is_tablet_pad.set)
356*4882a593Smuzhiyun                 Error(BOOL_MSG, "MatchIsTabletPad");
357*4882a593Smuzhiyun             break;
358*4882a593Smuzhiyun         case MATCH_IS_TOUCHPAD:
359*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
360*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchIsTouchpad");
361*4882a593Smuzhiyun             ptr->is_touchpad.set = xf86getBoolValue(&ptr->is_touchpad.val,
362*4882a593Smuzhiyun                                                     xf86_lex_val.str);
363*4882a593Smuzhiyun             free(xf86_lex_val.str);
364*4882a593Smuzhiyun             if (!ptr->is_touchpad.set)
365*4882a593Smuzhiyun                 Error(BOOL_MSG, "MatchIsTouchpad");
366*4882a593Smuzhiyun             break;
367*4882a593Smuzhiyun         case MATCH_IS_TOUCHSCREEN:
368*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->comment)) != STRING)
369*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchIsTouchscreen");
370*4882a593Smuzhiyun             ptr->is_touchscreen.set = xf86getBoolValue(&ptr->is_touchscreen.val,
371*4882a593Smuzhiyun                                                        xf86_lex_val.str);
372*4882a593Smuzhiyun             free(xf86_lex_val.str);
373*4882a593Smuzhiyun             if (!ptr->is_touchscreen.set)
374*4882a593Smuzhiyun                 Error(BOOL_MSG, "MatchIsTouchscreen");
375*4882a593Smuzhiyun             break;
376*4882a593Smuzhiyun         case EOF_TOKEN:
377*4882a593Smuzhiyun             Error(UNEXPECTED_EOF_MSG);
378*4882a593Smuzhiyun             break;
379*4882a593Smuzhiyun         default:
380*4882a593Smuzhiyun             Error(INVALID_KEYWORD_MSG, xf86tokenString());
381*4882a593Smuzhiyun             break;
382*4882a593Smuzhiyun         }
383*4882a593Smuzhiyun     }
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun     if (!has_ident)
386*4882a593Smuzhiyun         Error(NO_IDENT_MSG);
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun #ifdef DEBUG
389*4882a593Smuzhiyun     printf("InputClass section parsed\n");
390*4882a593Smuzhiyun #endif
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun     return ptr;
393*4882a593Smuzhiyun }
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun void
xf86printInputClassSection(FILE * cf,XF86ConfInputClassPtr ptr)396*4882a593Smuzhiyun xf86printInputClassSection(FILE * cf, XF86ConfInputClassPtr ptr)
397*4882a593Smuzhiyun {
398*4882a593Smuzhiyun     const xf86MatchGroup *group;
399*4882a593Smuzhiyun     char *const *cur;
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun     while (ptr) {
402*4882a593Smuzhiyun         fprintf(cf, "Section \"InputClass\"\n");
403*4882a593Smuzhiyun         if (ptr->comment)
404*4882a593Smuzhiyun             fprintf(cf, "%s", ptr->comment);
405*4882a593Smuzhiyun         if (ptr->identifier)
406*4882a593Smuzhiyun             fprintf(cf, "\tIdentifier      \"%s\"\n", ptr->identifier);
407*4882a593Smuzhiyun         if (ptr->driver)
408*4882a593Smuzhiyun             fprintf(cf, "\tDriver          \"%s\"\n", ptr->driver);
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun         xorg_list_for_each_entry(group, &ptr->match_product, entry) {
411*4882a593Smuzhiyun             fprintf(cf, "\tMatchProduct    \"");
412*4882a593Smuzhiyun             for (cur = group->values; *cur; cur++)
413*4882a593Smuzhiyun                 fprintf(cf, "%s%s", cur == group->values ? "" : TOKEN_SEP,
414*4882a593Smuzhiyun                         *cur);
415*4882a593Smuzhiyun             fprintf(cf, "\"\n");
416*4882a593Smuzhiyun         }
417*4882a593Smuzhiyun         xorg_list_for_each_entry(group, &ptr->match_vendor, entry) {
418*4882a593Smuzhiyun             fprintf(cf, "\tMatchVendor     \"");
419*4882a593Smuzhiyun             for (cur = group->values; *cur; cur++)
420*4882a593Smuzhiyun                 fprintf(cf, "%s%s", cur == group->values ? "" : TOKEN_SEP,
421*4882a593Smuzhiyun                         *cur);
422*4882a593Smuzhiyun             fprintf(cf, "\"\n");
423*4882a593Smuzhiyun         }
424*4882a593Smuzhiyun         xorg_list_for_each_entry(group, &ptr->match_device, entry) {
425*4882a593Smuzhiyun             fprintf(cf, "\tMatchDevicePath \"");
426*4882a593Smuzhiyun             for (cur = group->values; *cur; cur++)
427*4882a593Smuzhiyun                 fprintf(cf, "%s%s", cur == group->values ? "" : TOKEN_SEP,
428*4882a593Smuzhiyun                         *cur);
429*4882a593Smuzhiyun             fprintf(cf, "\"\n");
430*4882a593Smuzhiyun         }
431*4882a593Smuzhiyun         xorg_list_for_each_entry(group, &ptr->match_os, entry) {
432*4882a593Smuzhiyun             fprintf(cf, "\tMatchOS         \"");
433*4882a593Smuzhiyun             for (cur = group->values; *cur; cur++)
434*4882a593Smuzhiyun                 fprintf(cf, "%s%s", cur == group->values ? "" : TOKEN_SEP,
435*4882a593Smuzhiyun                         *cur);
436*4882a593Smuzhiyun             fprintf(cf, "\"\n");
437*4882a593Smuzhiyun         }
438*4882a593Smuzhiyun         xorg_list_for_each_entry(group, &ptr->match_pnpid, entry) {
439*4882a593Smuzhiyun             fprintf(cf, "\tMatchPnPID      \"");
440*4882a593Smuzhiyun             for (cur = group->values; *cur; cur++)
441*4882a593Smuzhiyun                 fprintf(cf, "%s%s", cur == group->values ? "" : TOKEN_SEP,
442*4882a593Smuzhiyun                         *cur);
443*4882a593Smuzhiyun             fprintf(cf, "\"\n");
444*4882a593Smuzhiyun         }
445*4882a593Smuzhiyun         xorg_list_for_each_entry(group, &ptr->match_usbid, entry) {
446*4882a593Smuzhiyun             fprintf(cf, "\tMatchUSBID      \"");
447*4882a593Smuzhiyun             for (cur = group->values; *cur; cur++)
448*4882a593Smuzhiyun                 fprintf(cf, "%s%s", cur == group->values ? "" : TOKEN_SEP,
449*4882a593Smuzhiyun                         *cur);
450*4882a593Smuzhiyun             fprintf(cf, "\"\n");
451*4882a593Smuzhiyun         }
452*4882a593Smuzhiyun         xorg_list_for_each_entry(group, &ptr->match_driver, entry) {
453*4882a593Smuzhiyun             fprintf(cf, "\tMatchDriver     \"");
454*4882a593Smuzhiyun             for (cur = group->values; *cur; cur++)
455*4882a593Smuzhiyun                 fprintf(cf, "%s%s", cur == group->values ? "" : TOKEN_SEP,
456*4882a593Smuzhiyun                         *cur);
457*4882a593Smuzhiyun             fprintf(cf, "\"\n");
458*4882a593Smuzhiyun         }
459*4882a593Smuzhiyun         xorg_list_for_each_entry(group, &ptr->match_tag, entry) {
460*4882a593Smuzhiyun             fprintf(cf, "\tMatchTag        \"");
461*4882a593Smuzhiyun             for (cur = group->values; *cur; cur++)
462*4882a593Smuzhiyun                 fprintf(cf, "%s%s", cur == group->values ? "" : TOKEN_SEP,
463*4882a593Smuzhiyun                         *cur);
464*4882a593Smuzhiyun             fprintf(cf, "\"\n");
465*4882a593Smuzhiyun         }
466*4882a593Smuzhiyun         xorg_list_for_each_entry(group, &ptr->match_layout, entry) {
467*4882a593Smuzhiyun             fprintf(cf, "\tMatchLayout     \"");
468*4882a593Smuzhiyun             for (cur = group->values; *cur; cur++)
469*4882a593Smuzhiyun                 fprintf(cf, "%s%s", cur == group->values ? "" : TOKEN_SEP,
470*4882a593Smuzhiyun                         *cur);
471*4882a593Smuzhiyun             fprintf(cf, "\"\n");
472*4882a593Smuzhiyun         }
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun         if (ptr->is_keyboard.set)
475*4882a593Smuzhiyun             fprintf(cf, "\tIsKeyboard      \"%s\"\n",
476*4882a593Smuzhiyun                     ptr->is_keyboard.val ? "yes" : "no");
477*4882a593Smuzhiyun         if (ptr->is_pointer.set)
478*4882a593Smuzhiyun             fprintf(cf, "\tIsPointer       \"%s\"\n",
479*4882a593Smuzhiyun                     ptr->is_pointer.val ? "yes" : "no");
480*4882a593Smuzhiyun         if (ptr->is_joystick.set)
481*4882a593Smuzhiyun             fprintf(cf, "\tIsJoystick      \"%s\"\n",
482*4882a593Smuzhiyun                     ptr->is_joystick.val ? "yes" : "no");
483*4882a593Smuzhiyun         if (ptr->is_tablet.set)
484*4882a593Smuzhiyun             fprintf(cf, "\tIsTablet        \"%s\"\n",
485*4882a593Smuzhiyun                     ptr->is_tablet.val ? "yes" : "no");
486*4882a593Smuzhiyun         if (ptr->is_tablet_pad.set)
487*4882a593Smuzhiyun             fprintf(cf, "\tIsTabletPad     \"%s\"\n",
488*4882a593Smuzhiyun                     ptr->is_tablet_pad.val ? "yes" : "no");
489*4882a593Smuzhiyun         if (ptr->is_touchpad.set)
490*4882a593Smuzhiyun             fprintf(cf, "\tIsTouchpad      \"%s\"\n",
491*4882a593Smuzhiyun                     ptr->is_touchpad.val ? "yes" : "no");
492*4882a593Smuzhiyun         if (ptr->is_touchscreen.set)
493*4882a593Smuzhiyun             fprintf(cf, "\tIsTouchscreen   \"%s\"\n",
494*4882a593Smuzhiyun                     ptr->is_touchscreen.val ? "yes" : "no");
495*4882a593Smuzhiyun         xf86printOptionList(cf, ptr->option_lst, 1);
496*4882a593Smuzhiyun         fprintf(cf, "EndSection\n\n");
497*4882a593Smuzhiyun         ptr = ptr->list.next;
498*4882a593Smuzhiyun     }
499*4882a593Smuzhiyun }
500