xref: /OK3568_Linux_fs/external/xserver/hw/xfree86/common/xf86Option.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 1998-2003 by The XFree86 Project, Inc.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
5*4882a593Smuzhiyun  * copy of this software and associated documentation files (the "Software"),
6*4882a593Smuzhiyun  * to deal in the Software without restriction, including without limitation
7*4882a593Smuzhiyun  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*4882a593Smuzhiyun  * and/or sell copies of the Software, and to permit persons to whom the
9*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following conditions:
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * The above copyright notice and this permission notice shall be included in
12*4882a593Smuzhiyun  * all copies or substantial portions of the Software.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*4882a593Smuzhiyun  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*4882a593Smuzhiyun  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*4882a593Smuzhiyun  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*4882a593Smuzhiyun  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*4882a593Smuzhiyun  * OTHER DEALINGS IN THE SOFTWARE.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  * Except as contained in this notice, the name of the copyright holder(s)
23*4882a593Smuzhiyun  * and author(s) shall not be used in advertising or otherwise to promote
24*4882a593Smuzhiyun  * the sale, use or other dealings in this Software without prior written
25*4882a593Smuzhiyun  * authorization from the copyright holder(s) and author(s).
26*4882a593Smuzhiyun  */
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun  * Author: David Dawes <dawes@xfree86.org>
30*4882a593Smuzhiyun  *
31*4882a593Smuzhiyun  * This file includes public option handling functions.
32*4882a593Smuzhiyun  */
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #ifdef HAVE_XORG_CONFIG_H
35*4882a593Smuzhiyun #include <xorg-config.h>
36*4882a593Smuzhiyun #endif
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #include <stdlib.h>
39*4882a593Smuzhiyun #include <ctype.h>
40*4882a593Smuzhiyun #include <X11/X.h>
41*4882a593Smuzhiyun #include "os.h"
42*4882a593Smuzhiyun #include "xf86.h"
43*4882a593Smuzhiyun #include "xf86Opt.h"
44*4882a593Smuzhiyun #include "xf86Xinput.h"
45*4882a593Smuzhiyun #include "xf86Optrec.h"
46*4882a593Smuzhiyun #include "xf86Parser.h"
47*4882a593Smuzhiyun #include "xf86platformBus.h" /* For OutputClass functions */
48*4882a593Smuzhiyun #include "optionstr.h"
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun static Bool ParseOptionValue(int scrnIndex, XF86OptionPtr options,
51*4882a593Smuzhiyun                              OptionInfoPtr p, Bool markUsed);
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /*
54*4882a593Smuzhiyun  * xf86CollectOptions collects the options from each of the config file
55*4882a593Smuzhiyun  * sections used by the screen and puts the combined list in pScrn->options.
56*4882a593Smuzhiyun  * This function requires that the following have been initialised:
57*4882a593Smuzhiyun  *
58*4882a593Smuzhiyun  *	pScrn->confScreen
59*4882a593Smuzhiyun  *	pScrn->Entities[i]->device
60*4882a593Smuzhiyun  *	pScrn->display
61*4882a593Smuzhiyun  *	pScrn->monitor
62*4882a593Smuzhiyun  *
63*4882a593Smuzhiyun  * The extraOpts parameter may optionally contain a list of additional options
64*4882a593Smuzhiyun  * to include.
65*4882a593Smuzhiyun  *
66*4882a593Smuzhiyun  * The order of precedence for options is:
67*4882a593Smuzhiyun  *
68*4882a593Smuzhiyun  *   extraOpts, display, confScreen, monitor, device, outputClassOptions
69*4882a593Smuzhiyun  */
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun void
xf86CollectOptions(ScrnInfoPtr pScrn,XF86OptionPtr extraOpts)72*4882a593Smuzhiyun xf86CollectOptions(ScrnInfoPtr pScrn, XF86OptionPtr extraOpts)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun     XF86OptionPtr tmp;
75*4882a593Smuzhiyun     XF86OptionPtr extras = (XF86OptionPtr) extraOpts;
76*4882a593Smuzhiyun     GDevPtr device;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun     int i;
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun     pScrn->options = NULL;
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun     for (i = pScrn->numEntities - 1; i >= 0; i--) {
83*4882a593Smuzhiyun         xf86MergeOutputClassOptions(pScrn->entityList[i], &pScrn->options);
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun         device = xf86GetDevFromEntity(pScrn->entityList[i],
86*4882a593Smuzhiyun                                       pScrn->entityInstanceList[i]);
87*4882a593Smuzhiyun         if (device && device->options) {
88*4882a593Smuzhiyun             tmp = xf86optionListDup(device->options);
89*4882a593Smuzhiyun             if (pScrn->options)
90*4882a593Smuzhiyun                 pScrn->options = xf86optionListMerge(pScrn->options, tmp);
91*4882a593Smuzhiyun             else
92*4882a593Smuzhiyun                 pScrn->options = tmp;
93*4882a593Smuzhiyun         }
94*4882a593Smuzhiyun     }
95*4882a593Smuzhiyun     if (pScrn->monitor->options) {
96*4882a593Smuzhiyun         tmp = xf86optionListDup(pScrn->monitor->options);
97*4882a593Smuzhiyun         if (pScrn->options)
98*4882a593Smuzhiyun             pScrn->options = xf86optionListMerge(pScrn->options, tmp);
99*4882a593Smuzhiyun         else
100*4882a593Smuzhiyun             pScrn->options = tmp;
101*4882a593Smuzhiyun     }
102*4882a593Smuzhiyun     if (pScrn->confScreen->options) {
103*4882a593Smuzhiyun         tmp = xf86optionListDup(pScrn->confScreen->options);
104*4882a593Smuzhiyun         if (pScrn->options)
105*4882a593Smuzhiyun             pScrn->options = xf86optionListMerge(pScrn->options, tmp);
106*4882a593Smuzhiyun         else
107*4882a593Smuzhiyun             pScrn->options = tmp;
108*4882a593Smuzhiyun     }
109*4882a593Smuzhiyun     if (pScrn->display->options) {
110*4882a593Smuzhiyun         tmp = xf86optionListDup(pScrn->display->options);
111*4882a593Smuzhiyun         if (pScrn->options)
112*4882a593Smuzhiyun             pScrn->options = xf86optionListMerge(pScrn->options, tmp);
113*4882a593Smuzhiyun         else
114*4882a593Smuzhiyun             pScrn->options = tmp;
115*4882a593Smuzhiyun     }
116*4882a593Smuzhiyun     if (extras) {
117*4882a593Smuzhiyun         tmp = xf86optionListDup(extras);
118*4882a593Smuzhiyun         if (pScrn->options)
119*4882a593Smuzhiyun             pScrn->options = xf86optionListMerge(pScrn->options, tmp);
120*4882a593Smuzhiyun         else
121*4882a593Smuzhiyun             pScrn->options = tmp;
122*4882a593Smuzhiyun     }
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun /*
126*4882a593Smuzhiyun  * xf86CollectInputOptions collects extra options for an InputDevice (other
127*4882a593Smuzhiyun  * than those added by the config backend).
128*4882a593Smuzhiyun  * The options are merged into the existing ones and thus take precedence
129*4882a593Smuzhiyun  * over the others.
130*4882a593Smuzhiyun  */
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun void
xf86CollectInputOptions(InputInfoPtr pInfo,const char ** defaultOpts)133*4882a593Smuzhiyun xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun     if (defaultOpts) {
136*4882a593Smuzhiyun         XF86OptionPtr tmp = xf86optionListCreate(defaultOpts, -1, 0);
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun         if (pInfo->options)
139*4882a593Smuzhiyun             pInfo->options = xf86optionListMerge(tmp, pInfo->options);
140*4882a593Smuzhiyun         else
141*4882a593Smuzhiyun             pInfo->options = tmp;
142*4882a593Smuzhiyun     }
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun /**
146*4882a593Smuzhiyun  * Duplicate the option list passed in. The returned pointer will be a newly
147*4882a593Smuzhiyun  * allocated option list and must be freed by the caller.
148*4882a593Smuzhiyun  */
149*4882a593Smuzhiyun XF86OptionPtr
xf86OptionListDuplicate(XF86OptionPtr options)150*4882a593Smuzhiyun xf86OptionListDuplicate(XF86OptionPtr options)
151*4882a593Smuzhiyun {
152*4882a593Smuzhiyun     XF86OptionPtr o = NULL;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun     while (options) {
155*4882a593Smuzhiyun         o = xf86AddNewOption(o, xf86OptionName(options),
156*4882a593Smuzhiyun                              xf86OptionValue(options));
157*4882a593Smuzhiyun         options = xf86nextOption(options);
158*4882a593Smuzhiyun     }
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun     return o;
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun /* Created for new XInput stuff -- essentially extensions to the parser	*/
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun static int
LookupIntOption(XF86OptionPtr optlist,const char * name,int deflt,Bool markUsed)166*4882a593Smuzhiyun LookupIntOption(XF86OptionPtr optlist, const char *name, int deflt,
167*4882a593Smuzhiyun                 Bool markUsed)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun     OptionInfoRec o;
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun     o.name = name;
172*4882a593Smuzhiyun     o.type = OPTV_INTEGER;
173*4882a593Smuzhiyun     if (ParseOptionValue(-1, optlist, &o, markUsed))
174*4882a593Smuzhiyun         deflt = o.value.num;
175*4882a593Smuzhiyun     return deflt;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun static double
LookupRealOption(XF86OptionPtr optlist,const char * name,double deflt,Bool markUsed)179*4882a593Smuzhiyun LookupRealOption(XF86OptionPtr optlist, const char *name, double deflt,
180*4882a593Smuzhiyun                  Bool markUsed)
181*4882a593Smuzhiyun {
182*4882a593Smuzhiyun     OptionInfoRec o;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun     o.name = name;
185*4882a593Smuzhiyun     o.type = OPTV_REAL;
186*4882a593Smuzhiyun     if (ParseOptionValue(-1, optlist, &o, markUsed))
187*4882a593Smuzhiyun         deflt = o.value.realnum;
188*4882a593Smuzhiyun     return deflt;
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun static char *
LookupStrOption(XF86OptionPtr optlist,const char * name,const char * deflt,Bool markUsed)192*4882a593Smuzhiyun LookupStrOption(XF86OptionPtr optlist, const char *name, const char *deflt,
193*4882a593Smuzhiyun                 Bool markUsed)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun     OptionInfoRec o;
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun     o.name = name;
198*4882a593Smuzhiyun     o.type = OPTV_STRING;
199*4882a593Smuzhiyun     if (ParseOptionValue(-1, optlist, &o, markUsed))
200*4882a593Smuzhiyun         deflt = o.value.str;
201*4882a593Smuzhiyun     if (deflt)
202*4882a593Smuzhiyun         return strdup(deflt);
203*4882a593Smuzhiyun     else
204*4882a593Smuzhiyun         return NULL;
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun static int
LookupBoolOption(XF86OptionPtr optlist,const char * name,int deflt,Bool markUsed)208*4882a593Smuzhiyun LookupBoolOption(XF86OptionPtr optlist, const char *name, int deflt,
209*4882a593Smuzhiyun                  Bool markUsed)
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun     OptionInfoRec o;
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun     o.name = name;
214*4882a593Smuzhiyun     o.type = OPTV_BOOLEAN;
215*4882a593Smuzhiyun     if (ParseOptionValue(-1, optlist, &o, markUsed))
216*4882a593Smuzhiyun         deflt = o.value.bool;
217*4882a593Smuzhiyun     return deflt;
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun static double
LookupPercentOption(XF86OptionPtr optlist,const char * name,double deflt,Bool markUsed)221*4882a593Smuzhiyun LookupPercentOption(XF86OptionPtr optlist, const char *name, double deflt,
222*4882a593Smuzhiyun                     Bool markUsed)
223*4882a593Smuzhiyun {
224*4882a593Smuzhiyun     OptionInfoRec o;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun     o.name = name;
227*4882a593Smuzhiyun     o.type = OPTV_PERCENT;
228*4882a593Smuzhiyun     if (ParseOptionValue(-1, optlist, &o, markUsed))
229*4882a593Smuzhiyun         deflt = o.value.realnum;
230*4882a593Smuzhiyun     return deflt;
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun /* These xf86Set* functions are intended for use by non-screen specific code */
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun int
xf86SetIntOption(XF86OptionPtr optlist,const char * name,int deflt)236*4882a593Smuzhiyun xf86SetIntOption(XF86OptionPtr optlist, const char *name, int deflt)
237*4882a593Smuzhiyun {
238*4882a593Smuzhiyun     return LookupIntOption(optlist, name, deflt, TRUE);
239*4882a593Smuzhiyun }
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun double
xf86SetRealOption(XF86OptionPtr optlist,const char * name,double deflt)242*4882a593Smuzhiyun xf86SetRealOption(XF86OptionPtr optlist, const char *name, double deflt)
243*4882a593Smuzhiyun {
244*4882a593Smuzhiyun     return LookupRealOption(optlist, name, deflt, TRUE);
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun char *
xf86SetStrOption(XF86OptionPtr optlist,const char * name,const char * deflt)248*4882a593Smuzhiyun xf86SetStrOption(XF86OptionPtr optlist, const char *name, const char *deflt)
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun     return LookupStrOption(optlist, name, deflt, TRUE);
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun int
xf86SetBoolOption(XF86OptionPtr optlist,const char * name,int deflt)254*4882a593Smuzhiyun xf86SetBoolOption(XF86OptionPtr optlist, const char *name, int deflt)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun     return LookupBoolOption(optlist, name, deflt, TRUE);
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun double
xf86SetPercentOption(XF86OptionPtr optlist,const char * name,double deflt)260*4882a593Smuzhiyun xf86SetPercentOption(XF86OptionPtr optlist, const char *name, double deflt)
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun     return LookupPercentOption(optlist, name, deflt, TRUE);
263*4882a593Smuzhiyun }
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun /*
266*4882a593Smuzhiyun  * These are like the Set*Option functions, but they don't mark the options
267*4882a593Smuzhiyun  * as used.
268*4882a593Smuzhiyun  */
269*4882a593Smuzhiyun int
xf86CheckIntOption(XF86OptionPtr optlist,const char * name,int deflt)270*4882a593Smuzhiyun xf86CheckIntOption(XF86OptionPtr optlist, const char *name, int deflt)
271*4882a593Smuzhiyun {
272*4882a593Smuzhiyun     return LookupIntOption(optlist, name, deflt, FALSE);
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun double
xf86CheckRealOption(XF86OptionPtr optlist,const char * name,double deflt)276*4882a593Smuzhiyun xf86CheckRealOption(XF86OptionPtr optlist, const char *name, double deflt)
277*4882a593Smuzhiyun {
278*4882a593Smuzhiyun     return LookupRealOption(optlist, name, deflt, FALSE);
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun char *
xf86CheckStrOption(XF86OptionPtr optlist,const char * name,const char * deflt)282*4882a593Smuzhiyun xf86CheckStrOption(XF86OptionPtr optlist, const char *name, const char *deflt)
283*4882a593Smuzhiyun {
284*4882a593Smuzhiyun     return LookupStrOption(optlist, name, deflt, FALSE);
285*4882a593Smuzhiyun }
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun int
xf86CheckBoolOption(XF86OptionPtr optlist,const char * name,int deflt)288*4882a593Smuzhiyun xf86CheckBoolOption(XF86OptionPtr optlist, const char *name, int deflt)
289*4882a593Smuzhiyun {
290*4882a593Smuzhiyun     return LookupBoolOption(optlist, name, deflt, FALSE);
291*4882a593Smuzhiyun }
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun double
xf86CheckPercentOption(XF86OptionPtr optlist,const char * name,double deflt)294*4882a593Smuzhiyun xf86CheckPercentOption(XF86OptionPtr optlist, const char *name, double deflt)
295*4882a593Smuzhiyun {
296*4882a593Smuzhiyun     return LookupPercentOption(optlist, name, deflt, FALSE);
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun /*
300*4882a593Smuzhiyun  * xf86AddNewOption() has the required property of replacing the option value
301*4882a593Smuzhiyun  * if the option is already present.
302*4882a593Smuzhiyun  */
303*4882a593Smuzhiyun XF86OptionPtr
xf86ReplaceIntOption(XF86OptionPtr optlist,const char * name,const int val)304*4882a593Smuzhiyun xf86ReplaceIntOption(XF86OptionPtr optlist, const char *name, const int val)
305*4882a593Smuzhiyun {
306*4882a593Smuzhiyun     char tmp[16];
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun     snprintf(tmp, sizeof(tmp), "%i", val);
309*4882a593Smuzhiyun     return xf86AddNewOption(optlist, name, tmp);
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun XF86OptionPtr
xf86ReplaceRealOption(XF86OptionPtr optlist,const char * name,const double val)313*4882a593Smuzhiyun xf86ReplaceRealOption(XF86OptionPtr optlist, const char *name, const double val)
314*4882a593Smuzhiyun {
315*4882a593Smuzhiyun     char tmp[32];
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun     snprintf(tmp, sizeof(tmp), "%f", val);
318*4882a593Smuzhiyun     return xf86AddNewOption(optlist, name, tmp);
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun XF86OptionPtr
xf86ReplaceBoolOption(XF86OptionPtr optlist,const char * name,const Bool val)322*4882a593Smuzhiyun xf86ReplaceBoolOption(XF86OptionPtr optlist, const char *name, const Bool val)
323*4882a593Smuzhiyun {
324*4882a593Smuzhiyun     return xf86AddNewOption(optlist, name, val ? "True" : "False");
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun XF86OptionPtr
xf86ReplacePercentOption(XF86OptionPtr optlist,const char * name,const double val)328*4882a593Smuzhiyun xf86ReplacePercentOption(XF86OptionPtr optlist, const char *name,
329*4882a593Smuzhiyun                          const double val)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun     char tmp[16];
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun     snprintf(tmp, sizeof(tmp), "%lf%%", val);
334*4882a593Smuzhiyun     return xf86AddNewOption(optlist, name, tmp);
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun XF86OptionPtr
xf86ReplaceStrOption(XF86OptionPtr optlist,const char * name,const char * val)338*4882a593Smuzhiyun xf86ReplaceStrOption(XF86OptionPtr optlist, const char *name, const char *val)
339*4882a593Smuzhiyun {
340*4882a593Smuzhiyun     return xf86AddNewOption(optlist, name, val);
341*4882a593Smuzhiyun }
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun XF86OptionPtr
xf86AddNewOption(XF86OptionPtr head,const char * name,const char * val)344*4882a593Smuzhiyun xf86AddNewOption(XF86OptionPtr head, const char *name, const char *val)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun     /* XXX These should actually be allocated in the parser library. */
347*4882a593Smuzhiyun     char *tmp = val ? strdup(val) : NULL;
348*4882a593Smuzhiyun     char *tmp_name = strdup(name);
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun     return xf86addNewOption(head, tmp_name, tmp);
351*4882a593Smuzhiyun }
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun XF86OptionPtr
xf86NewOption(char * name,char * value)354*4882a593Smuzhiyun xf86NewOption(char *name, char *value)
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun     return xf86newOption(name, value);
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun XF86OptionPtr
xf86NextOption(XF86OptionPtr list)360*4882a593Smuzhiyun xf86NextOption(XF86OptionPtr list)
361*4882a593Smuzhiyun {
362*4882a593Smuzhiyun     return xf86nextOption(list);
363*4882a593Smuzhiyun }
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun XF86OptionPtr
xf86OptionListCreate(const char ** options,int count,int used)366*4882a593Smuzhiyun xf86OptionListCreate(const char **options, int count, int used)
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun     return xf86optionListCreate(options, count, used);
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun XF86OptionPtr
xf86OptionListMerge(XF86OptionPtr head,XF86OptionPtr tail)372*4882a593Smuzhiyun xf86OptionListMerge(XF86OptionPtr head, XF86OptionPtr tail)
373*4882a593Smuzhiyun {
374*4882a593Smuzhiyun     return xf86optionListMerge(head, tail);
375*4882a593Smuzhiyun }
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun void
xf86OptionListFree(XF86OptionPtr opt)378*4882a593Smuzhiyun xf86OptionListFree(XF86OptionPtr opt)
379*4882a593Smuzhiyun {
380*4882a593Smuzhiyun     xf86optionListFree(opt);
381*4882a593Smuzhiyun }
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun char *
xf86OptionName(XF86OptionPtr opt)384*4882a593Smuzhiyun xf86OptionName(XF86OptionPtr opt)
385*4882a593Smuzhiyun {
386*4882a593Smuzhiyun     return xf86optionName(opt);
387*4882a593Smuzhiyun }
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun char *
xf86OptionValue(XF86OptionPtr opt)390*4882a593Smuzhiyun xf86OptionValue(XF86OptionPtr opt)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun     return xf86optionValue(opt);
393*4882a593Smuzhiyun }
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun void
xf86OptionListReport(XF86OptionPtr parm)396*4882a593Smuzhiyun xf86OptionListReport(XF86OptionPtr parm)
397*4882a593Smuzhiyun {
398*4882a593Smuzhiyun     XF86OptionPtr opts = parm;
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun     while (opts) {
401*4882a593Smuzhiyun         if (xf86optionValue(opts))
402*4882a593Smuzhiyun             xf86ErrorFVerb(5, "\tOption \"%s\" \"%s\"\n",
403*4882a593Smuzhiyun                            xf86optionName(opts), xf86optionValue(opts));
404*4882a593Smuzhiyun         else
405*4882a593Smuzhiyun             xf86ErrorFVerb(5, "\tOption \"%s\"\n", xf86optionName(opts));
406*4882a593Smuzhiyun         opts = xf86nextOption(opts);
407*4882a593Smuzhiyun     }
408*4882a593Smuzhiyun }
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun /* End of XInput-caused section	*/
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun XF86OptionPtr
xf86FindOption(XF86OptionPtr options,const char * name)413*4882a593Smuzhiyun xf86FindOption(XF86OptionPtr options, const char *name)
414*4882a593Smuzhiyun {
415*4882a593Smuzhiyun     return xf86findOption(options, name);
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun const char *
xf86FindOptionValue(XF86OptionPtr options,const char * name)419*4882a593Smuzhiyun xf86FindOptionValue(XF86OptionPtr options, const char *name)
420*4882a593Smuzhiyun {
421*4882a593Smuzhiyun     return xf86findOptionValue(options, name);
422*4882a593Smuzhiyun }
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun void
xf86MarkOptionUsed(XF86OptionPtr option)425*4882a593Smuzhiyun xf86MarkOptionUsed(XF86OptionPtr option)
426*4882a593Smuzhiyun {
427*4882a593Smuzhiyun     if (option != NULL)
428*4882a593Smuzhiyun         option->opt_used = TRUE;
429*4882a593Smuzhiyun }
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun void
xf86MarkOptionUsedByName(XF86OptionPtr options,const char * name)432*4882a593Smuzhiyun xf86MarkOptionUsedByName(XF86OptionPtr options, const char *name)
433*4882a593Smuzhiyun {
434*4882a593Smuzhiyun     XF86OptionPtr opt;
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun     opt = xf86findOption(options, name);
437*4882a593Smuzhiyun     if (opt != NULL)
438*4882a593Smuzhiyun         opt->opt_used = TRUE;
439*4882a593Smuzhiyun }
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun Bool
xf86CheckIfOptionUsed(XF86OptionPtr option)442*4882a593Smuzhiyun xf86CheckIfOptionUsed(XF86OptionPtr option)
443*4882a593Smuzhiyun {
444*4882a593Smuzhiyun     if (option != NULL)
445*4882a593Smuzhiyun         return option->opt_used;
446*4882a593Smuzhiyun     else
447*4882a593Smuzhiyun         return FALSE;
448*4882a593Smuzhiyun }
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun Bool
xf86CheckIfOptionUsedByName(XF86OptionPtr options,const char * name)451*4882a593Smuzhiyun xf86CheckIfOptionUsedByName(XF86OptionPtr options, const char *name)
452*4882a593Smuzhiyun {
453*4882a593Smuzhiyun     XF86OptionPtr opt;
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun     opt = xf86findOption(options, name);
456*4882a593Smuzhiyun     if (opt != NULL)
457*4882a593Smuzhiyun         return opt->opt_used;
458*4882a593Smuzhiyun     else
459*4882a593Smuzhiyun         return FALSE;
460*4882a593Smuzhiyun }
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun void
xf86ShowUnusedOptions(int scrnIndex,XF86OptionPtr opt)463*4882a593Smuzhiyun xf86ShowUnusedOptions(int scrnIndex, XF86OptionPtr opt)
464*4882a593Smuzhiyun {
465*4882a593Smuzhiyun     while (opt) {
466*4882a593Smuzhiyun         if (opt->opt_name && !opt->opt_used) {
467*4882a593Smuzhiyun             xf86DrvMsg(scrnIndex, X_WARNING, "Option \"%s\" is not used\n",
468*4882a593Smuzhiyun                        opt->opt_name);
469*4882a593Smuzhiyun         }
470*4882a593Smuzhiyun         opt = opt->list.next;
471*4882a593Smuzhiyun     }
472*4882a593Smuzhiyun }
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun static Bool
GetBoolValue(OptionInfoPtr p,const char * s)475*4882a593Smuzhiyun GetBoolValue(OptionInfoPtr p, const char *s)
476*4882a593Smuzhiyun {
477*4882a593Smuzhiyun     return xf86getBoolValue(&p->value.bool, s);
478*4882a593Smuzhiyun }
479*4882a593Smuzhiyun 
480*4882a593Smuzhiyun static Bool
ParseOptionValue(int scrnIndex,XF86OptionPtr options,OptionInfoPtr p,Bool markUsed)481*4882a593Smuzhiyun ParseOptionValue(int scrnIndex, XF86OptionPtr options, OptionInfoPtr p,
482*4882a593Smuzhiyun                  Bool markUsed)
483*4882a593Smuzhiyun {
484*4882a593Smuzhiyun     const char *s;
485*4882a593Smuzhiyun     char *end;
486*4882a593Smuzhiyun     Bool wasUsed = FALSE;
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun     if ((s = xf86findOptionValue(options, p->name)) != NULL) {
489*4882a593Smuzhiyun         if (markUsed) {
490*4882a593Smuzhiyun             wasUsed = xf86CheckIfOptionUsedByName(options, p->name);
491*4882a593Smuzhiyun             xf86MarkOptionUsedByName(options, p->name);
492*4882a593Smuzhiyun         }
493*4882a593Smuzhiyun         switch (p->type) {
494*4882a593Smuzhiyun         case OPTV_INTEGER:
495*4882a593Smuzhiyun             if (*s == '\0') {
496*4882a593Smuzhiyun                 if (markUsed) {
497*4882a593Smuzhiyun                     xf86DrvMsg(scrnIndex, X_WARNING,
498*4882a593Smuzhiyun                                "Option \"%s\" requires an integer value\n",
499*4882a593Smuzhiyun                                p->name);
500*4882a593Smuzhiyun                 }
501*4882a593Smuzhiyun                 p->found = FALSE;
502*4882a593Smuzhiyun             }
503*4882a593Smuzhiyun             else {
504*4882a593Smuzhiyun                 p->value.num = strtoul(s, &end, 0);
505*4882a593Smuzhiyun                 if (*end == '\0') {
506*4882a593Smuzhiyun                     p->found = TRUE;
507*4882a593Smuzhiyun                 }
508*4882a593Smuzhiyun                 else {
509*4882a593Smuzhiyun                     if (markUsed) {
510*4882a593Smuzhiyun                         xf86DrvMsg(scrnIndex, X_WARNING,
511*4882a593Smuzhiyun                                    "Option \"%s\" requires an integer value\n",
512*4882a593Smuzhiyun                                    p->name);
513*4882a593Smuzhiyun                     }
514*4882a593Smuzhiyun                     p->found = FALSE;
515*4882a593Smuzhiyun                 }
516*4882a593Smuzhiyun             }
517*4882a593Smuzhiyun             break;
518*4882a593Smuzhiyun         case OPTV_STRING:
519*4882a593Smuzhiyun             if (*s == '\0') {
520*4882a593Smuzhiyun                 if (markUsed) {
521*4882a593Smuzhiyun                     xf86DrvMsg(scrnIndex, X_WARNING,
522*4882a593Smuzhiyun                                "Option \"%s\" requires a string value\n",
523*4882a593Smuzhiyun                                p->name);
524*4882a593Smuzhiyun                 }
525*4882a593Smuzhiyun                 p->found = FALSE;
526*4882a593Smuzhiyun             }
527*4882a593Smuzhiyun             else {
528*4882a593Smuzhiyun                 p->value.str = s;
529*4882a593Smuzhiyun                 p->found = TRUE;
530*4882a593Smuzhiyun             }
531*4882a593Smuzhiyun             break;
532*4882a593Smuzhiyun         case OPTV_ANYSTR:
533*4882a593Smuzhiyun             p->value.str = s;
534*4882a593Smuzhiyun             p->found = TRUE;
535*4882a593Smuzhiyun             break;
536*4882a593Smuzhiyun         case OPTV_REAL:
537*4882a593Smuzhiyun             if (*s == '\0') {
538*4882a593Smuzhiyun                 if (markUsed) {
539*4882a593Smuzhiyun                     xf86DrvMsg(scrnIndex, X_WARNING,
540*4882a593Smuzhiyun                                "Option \"%s\" requires a floating point "
541*4882a593Smuzhiyun                                "value\n", p->name);
542*4882a593Smuzhiyun                 }
543*4882a593Smuzhiyun                 p->found = FALSE;
544*4882a593Smuzhiyun             }
545*4882a593Smuzhiyun             else {
546*4882a593Smuzhiyun                 p->value.realnum = strtod(s, &end);
547*4882a593Smuzhiyun                 if (*end == '\0') {
548*4882a593Smuzhiyun                     p->found = TRUE;
549*4882a593Smuzhiyun                 }
550*4882a593Smuzhiyun                 else {
551*4882a593Smuzhiyun                     if (markUsed) {
552*4882a593Smuzhiyun                         xf86DrvMsg(scrnIndex, X_WARNING,
553*4882a593Smuzhiyun                                    "Option \"%s\" requires a floating point "
554*4882a593Smuzhiyun                                    "value\n", p->name);
555*4882a593Smuzhiyun                     }
556*4882a593Smuzhiyun                     p->found = FALSE;
557*4882a593Smuzhiyun                 }
558*4882a593Smuzhiyun             }
559*4882a593Smuzhiyun             break;
560*4882a593Smuzhiyun         case OPTV_BOOLEAN:
561*4882a593Smuzhiyun             if (GetBoolValue(p, s)) {
562*4882a593Smuzhiyun                 p->found = TRUE;
563*4882a593Smuzhiyun             }
564*4882a593Smuzhiyun             else {
565*4882a593Smuzhiyun                 if (markUsed) {
566*4882a593Smuzhiyun                     xf86DrvMsg(scrnIndex, X_WARNING,
567*4882a593Smuzhiyun                                "Option \"%s\" requires a boolean value\n",
568*4882a593Smuzhiyun                                p->name);
569*4882a593Smuzhiyun                 }
570*4882a593Smuzhiyun                 p->found = FALSE;
571*4882a593Smuzhiyun             }
572*4882a593Smuzhiyun             break;
573*4882a593Smuzhiyun         case OPTV_PERCENT:
574*4882a593Smuzhiyun         {
575*4882a593Smuzhiyun             char tmp = 0;
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun             /* awkward match, but %% doesn't increase the match counter,
578*4882a593Smuzhiyun              * hence 100 looks the same as 100% to the caller of sccanf
579*4882a593Smuzhiyun              */
580*4882a593Smuzhiyun             if (sscanf(s, "%lf%c", &p->value.realnum, &tmp) != 2 || tmp != '%') {
581*4882a593Smuzhiyun                 if (markUsed) {
582*4882a593Smuzhiyun                     xf86DrvMsg(scrnIndex, X_WARNING,
583*4882a593Smuzhiyun                                "Option \"%s\" requires a percent value\n",
584*4882a593Smuzhiyun                                p->name);
585*4882a593Smuzhiyun                 }
586*4882a593Smuzhiyun                 p->found = FALSE;
587*4882a593Smuzhiyun             }
588*4882a593Smuzhiyun             else {
589*4882a593Smuzhiyun                 p->found = TRUE;
590*4882a593Smuzhiyun             }
591*4882a593Smuzhiyun         }
592*4882a593Smuzhiyun             break;
593*4882a593Smuzhiyun         case OPTV_FREQ:
594*4882a593Smuzhiyun             if (*s == '\0') {
595*4882a593Smuzhiyun                 if (markUsed) {
596*4882a593Smuzhiyun                     xf86DrvMsg(scrnIndex, X_WARNING,
597*4882a593Smuzhiyun                                "Option \"%s\" requires a frequency value\n",
598*4882a593Smuzhiyun                                p->name);
599*4882a593Smuzhiyun                 }
600*4882a593Smuzhiyun                 p->found = FALSE;
601*4882a593Smuzhiyun             }
602*4882a593Smuzhiyun             else {
603*4882a593Smuzhiyun                 double freq = strtod(s, &end);
604*4882a593Smuzhiyun                 int units = 0;
605*4882a593Smuzhiyun 
606*4882a593Smuzhiyun                 if (end != s) {
607*4882a593Smuzhiyun                     p->found = TRUE;
608*4882a593Smuzhiyun                     if (!xf86NameCmp(end, "Hz"))
609*4882a593Smuzhiyun                         units = 1;
610*4882a593Smuzhiyun                     else if (!xf86NameCmp(end, "kHz") || !xf86NameCmp(end, "k"))
611*4882a593Smuzhiyun                         units = 1000;
612*4882a593Smuzhiyun                     else if (!xf86NameCmp(end, "MHz") || !xf86NameCmp(end, "M"))
613*4882a593Smuzhiyun                         units = 1000000;
614*4882a593Smuzhiyun                     else {
615*4882a593Smuzhiyun                         if (markUsed) {
616*4882a593Smuzhiyun                             xf86DrvMsg(scrnIndex, X_WARNING,
617*4882a593Smuzhiyun                                        "Option \"%s\" requires a frequency value\n",
618*4882a593Smuzhiyun                                        p->name);
619*4882a593Smuzhiyun                         }
620*4882a593Smuzhiyun                         p->found = FALSE;
621*4882a593Smuzhiyun                     }
622*4882a593Smuzhiyun                     if (p->found)
623*4882a593Smuzhiyun                         freq *= (double) units;
624*4882a593Smuzhiyun                 }
625*4882a593Smuzhiyun                 else {
626*4882a593Smuzhiyun                     if (markUsed) {
627*4882a593Smuzhiyun                         xf86DrvMsg(scrnIndex, X_WARNING,
628*4882a593Smuzhiyun                                    "Option \"%s\" requires a frequency value\n",
629*4882a593Smuzhiyun                                    p->name);
630*4882a593Smuzhiyun                     }
631*4882a593Smuzhiyun                     p->found = FALSE;
632*4882a593Smuzhiyun                 }
633*4882a593Smuzhiyun                 if (p->found) {
634*4882a593Smuzhiyun                     p->value.freq.freq = freq;
635*4882a593Smuzhiyun                     p->value.freq.units = units;
636*4882a593Smuzhiyun                 }
637*4882a593Smuzhiyun             }
638*4882a593Smuzhiyun             break;
639*4882a593Smuzhiyun         case OPTV_NONE:
640*4882a593Smuzhiyun             /* Should never get here */
641*4882a593Smuzhiyun             p->found = FALSE;
642*4882a593Smuzhiyun             break;
643*4882a593Smuzhiyun         }
644*4882a593Smuzhiyun         if (p->found && markUsed) {
645*4882a593Smuzhiyun             int verb = 2;
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun             if (wasUsed)
648*4882a593Smuzhiyun                 verb = 4;
649*4882a593Smuzhiyun             xf86DrvMsgVerb(scrnIndex, X_CONFIG, verb, "Option \"%s\"", p->name);
650*4882a593Smuzhiyun             if (!(p->type == OPTV_BOOLEAN && *s == 0)) {
651*4882a593Smuzhiyun                 xf86ErrorFVerb(verb, " \"%s\"", s);
652*4882a593Smuzhiyun             }
653*4882a593Smuzhiyun             xf86ErrorFVerb(verb, "\n");
654*4882a593Smuzhiyun         }
655*4882a593Smuzhiyun     }
656*4882a593Smuzhiyun     else if (p->type == OPTV_BOOLEAN) {
657*4882a593Smuzhiyun         /* Look for matches with options with or without a "No" prefix. */
658*4882a593Smuzhiyun         char *n, *newn;
659*4882a593Smuzhiyun         OptionInfoRec opt;
660*4882a593Smuzhiyun 
661*4882a593Smuzhiyun         n = xf86NormalizeName(p->name);
662*4882a593Smuzhiyun         if (!n) {
663*4882a593Smuzhiyun             p->found = FALSE;
664*4882a593Smuzhiyun             return FALSE;
665*4882a593Smuzhiyun         }
666*4882a593Smuzhiyun         if (strncmp(n, "no", 2) == 0) {
667*4882a593Smuzhiyun             newn = n + 2;
668*4882a593Smuzhiyun         }
669*4882a593Smuzhiyun         else {
670*4882a593Smuzhiyun             free(n);
671*4882a593Smuzhiyun             if (asprintf(&n, "No%s", p->name) == -1) {
672*4882a593Smuzhiyun                 p->found = FALSE;
673*4882a593Smuzhiyun                 return FALSE;
674*4882a593Smuzhiyun             }
675*4882a593Smuzhiyun             newn = n;
676*4882a593Smuzhiyun         }
677*4882a593Smuzhiyun         if ((s = xf86findOptionValue(options, newn)) != NULL) {
678*4882a593Smuzhiyun             if (markUsed)
679*4882a593Smuzhiyun                 xf86MarkOptionUsedByName(options, newn);
680*4882a593Smuzhiyun             if (GetBoolValue(&opt, s)) {
681*4882a593Smuzhiyun                 p->value.bool = !opt.value.bool;
682*4882a593Smuzhiyun                 p->found = TRUE;
683*4882a593Smuzhiyun             }
684*4882a593Smuzhiyun             else {
685*4882a593Smuzhiyun                 xf86DrvMsg(scrnIndex, X_WARNING,
686*4882a593Smuzhiyun                            "Option \"%s\" requires a boolean value\n", newn);
687*4882a593Smuzhiyun                 p->found = FALSE;
688*4882a593Smuzhiyun             }
689*4882a593Smuzhiyun         }
690*4882a593Smuzhiyun         else {
691*4882a593Smuzhiyun             p->found = FALSE;
692*4882a593Smuzhiyun         }
693*4882a593Smuzhiyun         if (p->found && markUsed) {
694*4882a593Smuzhiyun             xf86DrvMsgVerb(scrnIndex, X_CONFIG, 2, "Option \"%s\"", newn);
695*4882a593Smuzhiyun             if (*s != 0) {
696*4882a593Smuzhiyun                 xf86ErrorFVerb(2, " \"%s\"", s);
697*4882a593Smuzhiyun             }
698*4882a593Smuzhiyun             xf86ErrorFVerb(2, "\n");
699*4882a593Smuzhiyun         }
700*4882a593Smuzhiyun         free(n);
701*4882a593Smuzhiyun     }
702*4882a593Smuzhiyun     else {
703*4882a593Smuzhiyun         p->found = FALSE;
704*4882a593Smuzhiyun     }
705*4882a593Smuzhiyun     return p->found;
706*4882a593Smuzhiyun }
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun void
xf86ProcessOptions(int scrnIndex,XF86OptionPtr options,OptionInfoPtr optinfo)709*4882a593Smuzhiyun xf86ProcessOptions(int scrnIndex, XF86OptionPtr options, OptionInfoPtr optinfo)
710*4882a593Smuzhiyun {
711*4882a593Smuzhiyun     OptionInfoPtr p;
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun     for (p = optinfo; p->name != NULL; p++) {
714*4882a593Smuzhiyun         ParseOptionValue(scrnIndex, options, p, TRUE);
715*4882a593Smuzhiyun     }
716*4882a593Smuzhiyun }
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun OptionInfoPtr
xf86TokenToOptinfo(const OptionInfoRec * table,int token)719*4882a593Smuzhiyun xf86TokenToOptinfo(const OptionInfoRec * table, int token)
720*4882a593Smuzhiyun {
721*4882a593Smuzhiyun     const OptionInfoRec *p, *match = NULL, *set = NULL;
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun     if (!table) {
724*4882a593Smuzhiyun         ErrorF("xf86TokenToOptinfo: table is NULL\n");
725*4882a593Smuzhiyun         return NULL;
726*4882a593Smuzhiyun     }
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun     for (p = table; p->token >= 0; p++) {
729*4882a593Smuzhiyun         if (p->token == token) {
730*4882a593Smuzhiyun             match = p;
731*4882a593Smuzhiyun             if (p->found)
732*4882a593Smuzhiyun                 set = p;
733*4882a593Smuzhiyun         }
734*4882a593Smuzhiyun     }
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun     if (set)
737*4882a593Smuzhiyun         return (OptionInfoPtr) set;
738*4882a593Smuzhiyun     else if (match)
739*4882a593Smuzhiyun         return (OptionInfoPtr) match;
740*4882a593Smuzhiyun     else
741*4882a593Smuzhiyun         return NULL;
742*4882a593Smuzhiyun }
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun const char *
xf86TokenToOptName(const OptionInfoRec * table,int token)745*4882a593Smuzhiyun xf86TokenToOptName(const OptionInfoRec * table, int token)
746*4882a593Smuzhiyun {
747*4882a593Smuzhiyun     const OptionInfoRec *p;
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun     p = xf86TokenToOptinfo(table, token);
750*4882a593Smuzhiyun     return p ? p->name : NULL;
751*4882a593Smuzhiyun }
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun Bool
xf86IsOptionSet(const OptionInfoRec * table,int token)754*4882a593Smuzhiyun xf86IsOptionSet(const OptionInfoRec * table, int token)
755*4882a593Smuzhiyun {
756*4882a593Smuzhiyun     OptionInfoPtr p;
757*4882a593Smuzhiyun 
758*4882a593Smuzhiyun     p = xf86TokenToOptinfo(table, token);
759*4882a593Smuzhiyun     return p && p->found;
760*4882a593Smuzhiyun }
761*4882a593Smuzhiyun 
762*4882a593Smuzhiyun const char *
xf86GetOptValString(const OptionInfoRec * table,int token)763*4882a593Smuzhiyun xf86GetOptValString(const OptionInfoRec * table, int token)
764*4882a593Smuzhiyun {
765*4882a593Smuzhiyun     OptionInfoPtr p;
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun     p = xf86TokenToOptinfo(table, token);
768*4882a593Smuzhiyun     if (p && p->found)
769*4882a593Smuzhiyun         return p->value.str;
770*4882a593Smuzhiyun     else
771*4882a593Smuzhiyun         return NULL;
772*4882a593Smuzhiyun }
773*4882a593Smuzhiyun 
774*4882a593Smuzhiyun Bool
xf86GetOptValInteger(const OptionInfoRec * table,int token,int * value)775*4882a593Smuzhiyun xf86GetOptValInteger(const OptionInfoRec * table, int token, int *value)
776*4882a593Smuzhiyun {
777*4882a593Smuzhiyun     OptionInfoPtr p;
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun     p = xf86TokenToOptinfo(table, token);
780*4882a593Smuzhiyun     if (p && p->found) {
781*4882a593Smuzhiyun         *value = p->value.num;
782*4882a593Smuzhiyun         return TRUE;
783*4882a593Smuzhiyun     }
784*4882a593Smuzhiyun     else
785*4882a593Smuzhiyun         return FALSE;
786*4882a593Smuzhiyun }
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun Bool
xf86GetOptValULong(const OptionInfoRec * table,int token,unsigned long * value)789*4882a593Smuzhiyun xf86GetOptValULong(const OptionInfoRec * table, int token, unsigned long *value)
790*4882a593Smuzhiyun {
791*4882a593Smuzhiyun     OptionInfoPtr p;
792*4882a593Smuzhiyun 
793*4882a593Smuzhiyun     p = xf86TokenToOptinfo(table, token);
794*4882a593Smuzhiyun     if (p && p->found) {
795*4882a593Smuzhiyun         *value = p->value.num;
796*4882a593Smuzhiyun         return TRUE;
797*4882a593Smuzhiyun     }
798*4882a593Smuzhiyun     else
799*4882a593Smuzhiyun         return FALSE;
800*4882a593Smuzhiyun }
801*4882a593Smuzhiyun 
802*4882a593Smuzhiyun Bool
xf86GetOptValReal(const OptionInfoRec * table,int token,double * value)803*4882a593Smuzhiyun xf86GetOptValReal(const OptionInfoRec * table, int token, double *value)
804*4882a593Smuzhiyun {
805*4882a593Smuzhiyun     OptionInfoPtr p;
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun     p = xf86TokenToOptinfo(table, token);
808*4882a593Smuzhiyun     if (p && p->found) {
809*4882a593Smuzhiyun         *value = p->value.realnum;
810*4882a593Smuzhiyun         return TRUE;
811*4882a593Smuzhiyun     }
812*4882a593Smuzhiyun     else
813*4882a593Smuzhiyun         return FALSE;
814*4882a593Smuzhiyun }
815*4882a593Smuzhiyun 
816*4882a593Smuzhiyun Bool
xf86GetOptValFreq(const OptionInfoRec * table,int token,OptFreqUnits expectedUnits,double * value)817*4882a593Smuzhiyun xf86GetOptValFreq(const OptionInfoRec * table, int token,
818*4882a593Smuzhiyun                   OptFreqUnits expectedUnits, double *value)
819*4882a593Smuzhiyun {
820*4882a593Smuzhiyun     OptionInfoPtr p;
821*4882a593Smuzhiyun 
822*4882a593Smuzhiyun     p = xf86TokenToOptinfo(table, token);
823*4882a593Smuzhiyun     if (p && p->found) {
824*4882a593Smuzhiyun         if (p->value.freq.units > 0) {
825*4882a593Smuzhiyun             /* Units give, so the scaling is known. */
826*4882a593Smuzhiyun             switch (expectedUnits) {
827*4882a593Smuzhiyun             case OPTUNITS_HZ:
828*4882a593Smuzhiyun                 *value = p->value.freq.freq;
829*4882a593Smuzhiyun                 break;
830*4882a593Smuzhiyun             case OPTUNITS_KHZ:
831*4882a593Smuzhiyun                 *value = p->value.freq.freq / 1000.0;
832*4882a593Smuzhiyun                 break;
833*4882a593Smuzhiyun             case OPTUNITS_MHZ:
834*4882a593Smuzhiyun                 *value = p->value.freq.freq / 1000000.0;
835*4882a593Smuzhiyun                 break;
836*4882a593Smuzhiyun             }
837*4882a593Smuzhiyun         }
838*4882a593Smuzhiyun         else {
839*4882a593Smuzhiyun             /* No units given, so try to guess the scaling. */
840*4882a593Smuzhiyun             switch (expectedUnits) {
841*4882a593Smuzhiyun             case OPTUNITS_HZ:
842*4882a593Smuzhiyun                 *value = p->value.freq.freq;
843*4882a593Smuzhiyun                 break;
844*4882a593Smuzhiyun             case OPTUNITS_KHZ:
845*4882a593Smuzhiyun                 if (p->value.freq.freq > 1000.0)
846*4882a593Smuzhiyun                     *value = p->value.freq.freq / 1000.0;
847*4882a593Smuzhiyun                 else
848*4882a593Smuzhiyun                     *value = p->value.freq.freq;
849*4882a593Smuzhiyun                 break;
850*4882a593Smuzhiyun             case OPTUNITS_MHZ:
851*4882a593Smuzhiyun                 if (p->value.freq.freq > 1000000.0)
852*4882a593Smuzhiyun                     *value = p->value.freq.freq / 1000000.0;
853*4882a593Smuzhiyun                 else if (p->value.freq.freq > 1000.0)
854*4882a593Smuzhiyun                     *value = p->value.freq.freq / 1000.0;
855*4882a593Smuzhiyun                 else
856*4882a593Smuzhiyun                     *value = p->value.freq.freq;
857*4882a593Smuzhiyun             }
858*4882a593Smuzhiyun         }
859*4882a593Smuzhiyun         return TRUE;
860*4882a593Smuzhiyun     }
861*4882a593Smuzhiyun     else
862*4882a593Smuzhiyun         return FALSE;
863*4882a593Smuzhiyun }
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun Bool
xf86GetOptValBool(const OptionInfoRec * table,int token,Bool * value)866*4882a593Smuzhiyun xf86GetOptValBool(const OptionInfoRec * table, int token, Bool *value)
867*4882a593Smuzhiyun {
868*4882a593Smuzhiyun     OptionInfoPtr p;
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun     p = xf86TokenToOptinfo(table, token);
871*4882a593Smuzhiyun     if (p && p->found) {
872*4882a593Smuzhiyun         *value = p->value.bool;
873*4882a593Smuzhiyun         return TRUE;
874*4882a593Smuzhiyun     }
875*4882a593Smuzhiyun     else
876*4882a593Smuzhiyun         return FALSE;
877*4882a593Smuzhiyun }
878*4882a593Smuzhiyun 
879*4882a593Smuzhiyun Bool
xf86ReturnOptValBool(const OptionInfoRec * table,int token,Bool def)880*4882a593Smuzhiyun xf86ReturnOptValBool(const OptionInfoRec * table, int token, Bool def)
881*4882a593Smuzhiyun {
882*4882a593Smuzhiyun     OptionInfoPtr p;
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun     p = xf86TokenToOptinfo(table, token);
885*4882a593Smuzhiyun     if (p && p->found) {
886*4882a593Smuzhiyun         return p->value.bool;
887*4882a593Smuzhiyun     }
888*4882a593Smuzhiyun     else
889*4882a593Smuzhiyun         return def;
890*4882a593Smuzhiyun }
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun int
xf86NameCmp(const char * s1,const char * s2)893*4882a593Smuzhiyun xf86NameCmp(const char *s1, const char *s2)
894*4882a593Smuzhiyun {
895*4882a593Smuzhiyun     return xf86nameCompare(s1, s2);
896*4882a593Smuzhiyun }
897*4882a593Smuzhiyun 
898*4882a593Smuzhiyun char *
xf86NormalizeName(const char * s)899*4882a593Smuzhiyun xf86NormalizeName(const char *s)
900*4882a593Smuzhiyun {
901*4882a593Smuzhiyun     char *ret, *q;
902*4882a593Smuzhiyun     const char *p;
903*4882a593Smuzhiyun 
904*4882a593Smuzhiyun     if (s == NULL)
905*4882a593Smuzhiyun         return NULL;
906*4882a593Smuzhiyun 
907*4882a593Smuzhiyun     ret = malloc(strlen(s) + 1);
908*4882a593Smuzhiyun     for (p = s, q = ret; *p != 0; p++) {
909*4882a593Smuzhiyun         switch (*p) {
910*4882a593Smuzhiyun         case '_':
911*4882a593Smuzhiyun         case ' ':
912*4882a593Smuzhiyun         case '\t':
913*4882a593Smuzhiyun             continue;
914*4882a593Smuzhiyun         default:
915*4882a593Smuzhiyun             if (isupper(*p))
916*4882a593Smuzhiyun                 *q++ = tolower(*p);
917*4882a593Smuzhiyun             else
918*4882a593Smuzhiyun                 *q++ = *p;
919*4882a593Smuzhiyun         }
920*4882a593Smuzhiyun     }
921*4882a593Smuzhiyun     *q = '\0';
922*4882a593Smuzhiyun     return ret;
923*4882a593Smuzhiyun }
924