xref: /OK3568_Linux_fs/external/xserver/hw/xfree86/parser/Monitor.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright (c) 1997  Metro Link Incorporated
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
6*4882a593Smuzhiyun  * copy of this software and associated documentation files (the "Software"),
7*4882a593Smuzhiyun  * to deal in the Software without restriction, including without limitation
8*4882a593Smuzhiyun  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*4882a593Smuzhiyun  * and/or sell copies of the Software, and to permit persons to whom the
10*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following conditions:
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  * The above copyright notice and this permission notice shall be included in
13*4882a593Smuzhiyun  * all copies or substantial portions of the Software.
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*4882a593Smuzhiyun  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*4882a593Smuzhiyun  * THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19*4882a593Smuzhiyun  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
20*4882a593Smuzhiyun  * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*4882a593Smuzhiyun  * SOFTWARE.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * Except as contained in this notice, the name of the Metro Link shall not be
24*4882a593Smuzhiyun  * used in advertising or otherwise to promote the sale, use or other dealings
25*4882a593Smuzhiyun  * in this Software without prior written authorization from Metro Link.
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  */
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun  * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
30*4882a593Smuzhiyun  *
31*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
32*4882a593Smuzhiyun  * copy of this software and associated documentation files (the "Software"),
33*4882a593Smuzhiyun  * to deal in the Software without restriction, including without limitation
34*4882a593Smuzhiyun  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
35*4882a593Smuzhiyun  * and/or sell copies of the Software, and to permit persons to whom the
36*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following conditions:
37*4882a593Smuzhiyun  *
38*4882a593Smuzhiyun  * The above copyright notice and this permission notice shall be included in
39*4882a593Smuzhiyun  * all copies or substantial portions of the Software.
40*4882a593Smuzhiyun  *
41*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
42*4882a593Smuzhiyun  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
43*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
44*4882a593Smuzhiyun  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
45*4882a593Smuzhiyun  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
46*4882a593Smuzhiyun  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
47*4882a593Smuzhiyun  * OTHER DEALINGS IN THE SOFTWARE.
48*4882a593Smuzhiyun  *
49*4882a593Smuzhiyun  * Except as contained in this notice, the name of the copyright holder(s)
50*4882a593Smuzhiyun  * and author(s) shall not be used in advertising or otherwise to promote
51*4882a593Smuzhiyun  * the sale, use or other dealings in this Software without prior written
52*4882a593Smuzhiyun  * authorization from the copyright holder(s) and author(s).
53*4882a593Smuzhiyun  */
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #ifdef HAVE_XORG_CONFIG_H
56*4882a593Smuzhiyun #include <xorg-config.h>
57*4882a593Smuzhiyun #endif
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #include "xf86Parser.h"
60*4882a593Smuzhiyun #include "xf86tokens.h"
61*4882a593Smuzhiyun #include "Configint.h"
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun static const xf86ConfigSymTabRec MonitorTab[] = {
65*4882a593Smuzhiyun     {ENDSECTION, "endsection"},
66*4882a593Smuzhiyun     {IDENTIFIER, "identifier"},
67*4882a593Smuzhiyun     {VENDOR, "vendorname"},
68*4882a593Smuzhiyun     {MODEL, "modelname"},
69*4882a593Smuzhiyun     {USEMODES, "usemodes"},
70*4882a593Smuzhiyun     {MODELINE, "modeline"},
71*4882a593Smuzhiyun     {DISPLAYSIZE, "displaysize"},
72*4882a593Smuzhiyun     {HORIZSYNC, "horizsync"},
73*4882a593Smuzhiyun     {VERTREFRESH, "vertrefresh"},
74*4882a593Smuzhiyun     {MODE, "mode"},
75*4882a593Smuzhiyun     {GAMMA, "gamma"},
76*4882a593Smuzhiyun     {OPTION, "option"},
77*4882a593Smuzhiyun     {-1, ""},
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun static const xf86ConfigSymTabRec ModesTab[] = {
81*4882a593Smuzhiyun     {ENDSECTION, "endsection"},
82*4882a593Smuzhiyun     {IDENTIFIER, "identifier"},
83*4882a593Smuzhiyun     {MODELINE, "modeline"},
84*4882a593Smuzhiyun     {MODE, "mode"},
85*4882a593Smuzhiyun     {-1, ""},
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun static const xf86ConfigSymTabRec TimingTab[] = {
89*4882a593Smuzhiyun     {TT_INTERLACE, "interlace"},
90*4882a593Smuzhiyun     {TT_PHSYNC, "+hsync"},
91*4882a593Smuzhiyun     {TT_NHSYNC, "-hsync"},
92*4882a593Smuzhiyun     {TT_PVSYNC, "+vsync"},
93*4882a593Smuzhiyun     {TT_NVSYNC, "-vsync"},
94*4882a593Smuzhiyun     {TT_CSYNC, "composite"},
95*4882a593Smuzhiyun     {TT_PCSYNC, "+csync"},
96*4882a593Smuzhiyun     {TT_NCSYNC, "-csync"},
97*4882a593Smuzhiyun     {TT_DBLSCAN, "doublescan"},
98*4882a593Smuzhiyun     {TT_HSKEW, "hskew"},
99*4882a593Smuzhiyun     {TT_BCAST, "bcast"},
100*4882a593Smuzhiyun     {TT_VSCAN, "vscan"},
101*4882a593Smuzhiyun     {-1, ""},
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun static const xf86ConfigSymTabRec ModeTab[] = {
105*4882a593Smuzhiyun     {DOTCLOCK, "dotclock"},
106*4882a593Smuzhiyun     {HTIMINGS, "htimings"},
107*4882a593Smuzhiyun     {VTIMINGS, "vtimings"},
108*4882a593Smuzhiyun     {FLAGS, "flags"},
109*4882a593Smuzhiyun     {HSKEW, "hskew"},
110*4882a593Smuzhiyun     {BCAST, "bcast"},
111*4882a593Smuzhiyun     {VSCAN, "vscan"},
112*4882a593Smuzhiyun     {ENDMODE, "endmode"},
113*4882a593Smuzhiyun     {-1, ""},
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #define CLEANUP xf86freeModeLineList
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun static void
xf86freeModeLineList(XF86ConfModeLinePtr ptr)119*4882a593Smuzhiyun xf86freeModeLineList(XF86ConfModeLinePtr ptr)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun     XF86ConfModeLinePtr prev;
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun     while (ptr) {
124*4882a593Smuzhiyun         TestFree(ptr->ml_identifier);
125*4882a593Smuzhiyun         TestFree(ptr->ml_comment);
126*4882a593Smuzhiyun         prev = ptr;
127*4882a593Smuzhiyun         ptr = ptr->list.next;
128*4882a593Smuzhiyun         free(prev);
129*4882a593Smuzhiyun     }
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun static XF86ConfModeLinePtr
xf86parseModeLine(void)133*4882a593Smuzhiyun xf86parseModeLine(void)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun     int token;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun     parsePrologue(XF86ConfModeLinePtr, XF86ConfModeLineRec)
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun         /* Identifier */
140*4882a593Smuzhiyun         if (xf86getSubToken(&(ptr->ml_comment)) != STRING)
141*4882a593Smuzhiyun         Error("ModeLine identifier expected");
142*4882a593Smuzhiyun     ptr->ml_identifier = xf86_lex_val.str;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun     /* DotClock */
145*4882a593Smuzhiyun     if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
146*4882a593Smuzhiyun         Error("ModeLine dotclock expected");
147*4882a593Smuzhiyun     ptr->ml_clock = (int) (xf86_lex_val.realnum * 1000.0 + 0.5);
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun     /* HDisplay */
150*4882a593Smuzhiyun     if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
151*4882a593Smuzhiyun         Error("ModeLine Hdisplay expected");
152*4882a593Smuzhiyun     ptr->ml_hdisplay = xf86_lex_val.num;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun     /* HSyncStart */
155*4882a593Smuzhiyun     if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
156*4882a593Smuzhiyun         Error("ModeLine HSyncStart expected");
157*4882a593Smuzhiyun     ptr->ml_hsyncstart = xf86_lex_val.num;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun     /* HSyncEnd */
160*4882a593Smuzhiyun     if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
161*4882a593Smuzhiyun         Error("ModeLine HSyncEnd expected");
162*4882a593Smuzhiyun     ptr->ml_hsyncend = xf86_lex_val.num;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun     /* HTotal */
165*4882a593Smuzhiyun     if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
166*4882a593Smuzhiyun         Error("ModeLine HTotal expected");
167*4882a593Smuzhiyun     ptr->ml_htotal = xf86_lex_val.num;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun     /* VDisplay */
170*4882a593Smuzhiyun     if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
171*4882a593Smuzhiyun         Error("ModeLine Vdisplay expected");
172*4882a593Smuzhiyun     ptr->ml_vdisplay = xf86_lex_val.num;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun     /* VSyncStart */
175*4882a593Smuzhiyun     if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
176*4882a593Smuzhiyun         Error("ModeLine VSyncStart expected");
177*4882a593Smuzhiyun     ptr->ml_vsyncstart = xf86_lex_val.num;
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun     /* VSyncEnd */
180*4882a593Smuzhiyun     if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
181*4882a593Smuzhiyun         Error("ModeLine VSyncEnd expected");
182*4882a593Smuzhiyun     ptr->ml_vsyncend = xf86_lex_val.num;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun     /* VTotal */
185*4882a593Smuzhiyun     if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
186*4882a593Smuzhiyun         Error("ModeLine VTotal expected");
187*4882a593Smuzhiyun     ptr->ml_vtotal = xf86_lex_val.num;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun     token = xf86getSubTokenWithTab(&(ptr->ml_comment), TimingTab);
190*4882a593Smuzhiyun     while ((token == TT_INTERLACE) || (token == TT_PHSYNC) ||
191*4882a593Smuzhiyun            (token == TT_NHSYNC) || (token == TT_PVSYNC) ||
192*4882a593Smuzhiyun            (token == TT_NVSYNC) || (token == TT_CSYNC) ||
193*4882a593Smuzhiyun            (token == TT_PCSYNC) || (token == TT_NCSYNC) ||
194*4882a593Smuzhiyun            (token == TT_DBLSCAN) || (token == TT_HSKEW) ||
195*4882a593Smuzhiyun            (token == TT_VSCAN) || (token == TT_BCAST)) {
196*4882a593Smuzhiyun         switch (token) {
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun         case TT_INTERLACE:
199*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_INTERLACE;
200*4882a593Smuzhiyun             break;
201*4882a593Smuzhiyun         case TT_PHSYNC:
202*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_PHSYNC;
203*4882a593Smuzhiyun             break;
204*4882a593Smuzhiyun         case TT_NHSYNC:
205*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_NHSYNC;
206*4882a593Smuzhiyun             break;
207*4882a593Smuzhiyun         case TT_PVSYNC:
208*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_PVSYNC;
209*4882a593Smuzhiyun             break;
210*4882a593Smuzhiyun         case TT_NVSYNC:
211*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_NVSYNC;
212*4882a593Smuzhiyun             break;
213*4882a593Smuzhiyun         case TT_CSYNC:
214*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_CSYNC;
215*4882a593Smuzhiyun             break;
216*4882a593Smuzhiyun         case TT_PCSYNC:
217*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_PCSYNC;
218*4882a593Smuzhiyun             break;
219*4882a593Smuzhiyun         case TT_NCSYNC:
220*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_NCSYNC;
221*4882a593Smuzhiyun             break;
222*4882a593Smuzhiyun         case TT_DBLSCAN:
223*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_DBLSCAN;
224*4882a593Smuzhiyun             break;
225*4882a593Smuzhiyun         case TT_HSKEW:
226*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
227*4882a593Smuzhiyun                 Error(NUMBER_MSG, "Hskew");
228*4882a593Smuzhiyun             ptr->ml_hskew = xf86_lex_val.num;
229*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_HSKEW;
230*4882a593Smuzhiyun             break;
231*4882a593Smuzhiyun         case TT_BCAST:
232*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_BCAST;
233*4882a593Smuzhiyun             break;
234*4882a593Smuzhiyun         case TT_VSCAN:
235*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
236*4882a593Smuzhiyun                 Error(NUMBER_MSG, "Vscan");
237*4882a593Smuzhiyun             ptr->ml_vscan = xf86_lex_val.num;
238*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_VSCAN;
239*4882a593Smuzhiyun             break;
240*4882a593Smuzhiyun         case EOF_TOKEN:
241*4882a593Smuzhiyun             Error(UNEXPECTED_EOF_MSG);
242*4882a593Smuzhiyun             break;
243*4882a593Smuzhiyun         default:
244*4882a593Smuzhiyun             Error(INVALID_KEYWORD_MSG, xf86tokenString());
245*4882a593Smuzhiyun             break;
246*4882a593Smuzhiyun         }
247*4882a593Smuzhiyun         token = xf86getSubTokenWithTab(&(ptr->ml_comment), TimingTab);
248*4882a593Smuzhiyun     }
249*4882a593Smuzhiyun     xf86unGetToken(token);
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun #ifdef DEBUG
252*4882a593Smuzhiyun     printf("ModeLine parsed\n");
253*4882a593Smuzhiyun #endif
254*4882a593Smuzhiyun     return ptr;
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun static XF86ConfModeLinePtr
xf86parseVerboseMode(void)258*4882a593Smuzhiyun xf86parseVerboseMode(void)
259*4882a593Smuzhiyun {
260*4882a593Smuzhiyun     int token, token2;
261*4882a593Smuzhiyun     int had_dotclock = 0, had_htimings = 0, had_vtimings = 0;
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun     parsePrologue(XF86ConfModeLinePtr, XF86ConfModeLineRec)
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun         if (xf86getSubToken(&(ptr->ml_comment)) != STRING)
266*4882a593Smuzhiyun         Error("Mode name expected");
267*4882a593Smuzhiyun     ptr->ml_identifier = xf86_lex_val.str;
268*4882a593Smuzhiyun     while ((token = xf86getToken(ModeTab)) != ENDMODE) {
269*4882a593Smuzhiyun         switch (token) {
270*4882a593Smuzhiyun         case COMMENT:
271*4882a593Smuzhiyun             ptr->ml_comment = xf86addComment(ptr->ml_comment, xf86_lex_val.str);
272*4882a593Smuzhiyun             break;
273*4882a593Smuzhiyun         case DOTCLOCK:
274*4882a593Smuzhiyun             if ((token = xf86getSubToken(&(ptr->ml_comment))) != NUMBER)
275*4882a593Smuzhiyun                 Error(NUMBER_MSG, "DotClock");
276*4882a593Smuzhiyun             ptr->ml_clock = (int) (xf86_lex_val.realnum * 1000.0 + 0.5);
277*4882a593Smuzhiyun             had_dotclock = 1;
278*4882a593Smuzhiyun             break;
279*4882a593Smuzhiyun         case HTIMINGS:
280*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->ml_comment)) == NUMBER)
281*4882a593Smuzhiyun                 ptr->ml_hdisplay = xf86_lex_val.num;
282*4882a593Smuzhiyun             else
283*4882a593Smuzhiyun                 Error("Horizontal display expected");
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->ml_comment)) == NUMBER)
286*4882a593Smuzhiyun                 ptr->ml_hsyncstart = xf86_lex_val.num;
287*4882a593Smuzhiyun             else
288*4882a593Smuzhiyun                 Error("Horizontal sync start expected");
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->ml_comment)) == NUMBER)
291*4882a593Smuzhiyun                 ptr->ml_hsyncend = xf86_lex_val.num;
292*4882a593Smuzhiyun             else
293*4882a593Smuzhiyun                 Error("Horizontal sync end expected");
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->ml_comment)) == NUMBER)
296*4882a593Smuzhiyun                 ptr->ml_htotal = xf86_lex_val.num;
297*4882a593Smuzhiyun             else
298*4882a593Smuzhiyun                 Error("Horizontal total expected");
299*4882a593Smuzhiyun             had_htimings = 1;
300*4882a593Smuzhiyun             break;
301*4882a593Smuzhiyun         case VTIMINGS:
302*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->ml_comment)) == NUMBER)
303*4882a593Smuzhiyun                 ptr->ml_vdisplay = xf86_lex_val.num;
304*4882a593Smuzhiyun             else
305*4882a593Smuzhiyun                 Error("Vertical display expected");
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->ml_comment)) == NUMBER)
308*4882a593Smuzhiyun                 ptr->ml_vsyncstart = xf86_lex_val.num;
309*4882a593Smuzhiyun             else
310*4882a593Smuzhiyun                 Error("Vertical sync start expected");
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->ml_comment)) == NUMBER)
313*4882a593Smuzhiyun                 ptr->ml_vsyncend = xf86_lex_val.num;
314*4882a593Smuzhiyun             else
315*4882a593Smuzhiyun                 Error("Vertical sync end expected");
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->ml_comment)) == NUMBER)
318*4882a593Smuzhiyun                 ptr->ml_vtotal = xf86_lex_val.num;
319*4882a593Smuzhiyun             else
320*4882a593Smuzhiyun                 Error("Vertical total expected");
321*4882a593Smuzhiyun             had_vtimings = 1;
322*4882a593Smuzhiyun             break;
323*4882a593Smuzhiyun         case FLAGS:
324*4882a593Smuzhiyun             token = xf86getSubToken(&(ptr->ml_comment));
325*4882a593Smuzhiyun             if (token != STRING)
326*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Flags");
327*4882a593Smuzhiyun             while (token == STRING) {
328*4882a593Smuzhiyun                 token2 = xf86getStringToken(TimingTab);
329*4882a593Smuzhiyun                 switch (token2) {
330*4882a593Smuzhiyun                 case TT_INTERLACE:
331*4882a593Smuzhiyun                     ptr->ml_flags |= XF86CONF_INTERLACE;
332*4882a593Smuzhiyun                     break;
333*4882a593Smuzhiyun                 case TT_PHSYNC:
334*4882a593Smuzhiyun                     ptr->ml_flags |= XF86CONF_PHSYNC;
335*4882a593Smuzhiyun                     break;
336*4882a593Smuzhiyun                 case TT_NHSYNC:
337*4882a593Smuzhiyun                     ptr->ml_flags |= XF86CONF_NHSYNC;
338*4882a593Smuzhiyun                     break;
339*4882a593Smuzhiyun                 case TT_PVSYNC:
340*4882a593Smuzhiyun                     ptr->ml_flags |= XF86CONF_PVSYNC;
341*4882a593Smuzhiyun                     break;
342*4882a593Smuzhiyun                 case TT_NVSYNC:
343*4882a593Smuzhiyun                     ptr->ml_flags |= XF86CONF_NVSYNC;
344*4882a593Smuzhiyun                     break;
345*4882a593Smuzhiyun                 case TT_CSYNC:
346*4882a593Smuzhiyun                     ptr->ml_flags |= XF86CONF_CSYNC;
347*4882a593Smuzhiyun                     break;
348*4882a593Smuzhiyun                 case TT_PCSYNC:
349*4882a593Smuzhiyun                     ptr->ml_flags |= XF86CONF_PCSYNC;
350*4882a593Smuzhiyun                     break;
351*4882a593Smuzhiyun                 case TT_NCSYNC:
352*4882a593Smuzhiyun                     ptr->ml_flags |= XF86CONF_NCSYNC;
353*4882a593Smuzhiyun                     break;
354*4882a593Smuzhiyun                 case TT_DBLSCAN:
355*4882a593Smuzhiyun                     ptr->ml_flags |= XF86CONF_DBLSCAN;
356*4882a593Smuzhiyun                     break;
357*4882a593Smuzhiyun                 case EOF_TOKEN:
358*4882a593Smuzhiyun                     Error(UNEXPECTED_EOF_MSG);
359*4882a593Smuzhiyun                     break;
360*4882a593Smuzhiyun                 default:
361*4882a593Smuzhiyun                     Error("Unknown flag string");
362*4882a593Smuzhiyun                     break;
363*4882a593Smuzhiyun                 }
364*4882a593Smuzhiyun                 token = xf86getSubToken(&(ptr->ml_comment));
365*4882a593Smuzhiyun             }
366*4882a593Smuzhiyun             xf86unGetToken(token);
367*4882a593Smuzhiyun             break;
368*4882a593Smuzhiyun         case HSKEW:
369*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
370*4882a593Smuzhiyun                 Error("Horizontal skew expected");
371*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_HSKEW;
372*4882a593Smuzhiyun             ptr->ml_hskew = xf86_lex_val.num;
373*4882a593Smuzhiyun             break;
374*4882a593Smuzhiyun         case VSCAN:
375*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->ml_comment)) != NUMBER)
376*4882a593Smuzhiyun                 Error("Vertical scan count expected");
377*4882a593Smuzhiyun             ptr->ml_flags |= XF86CONF_VSCAN;
378*4882a593Smuzhiyun             ptr->ml_vscan = xf86_lex_val.num;
379*4882a593Smuzhiyun             break;
380*4882a593Smuzhiyun         case EOF_TOKEN:
381*4882a593Smuzhiyun             Error(UNEXPECTED_EOF_MSG);
382*4882a593Smuzhiyun             break;
383*4882a593Smuzhiyun         default:
384*4882a593Smuzhiyun             Error("Unexepcted token in verbose \"Mode\" entry\n");
385*4882a593Smuzhiyun         }
386*4882a593Smuzhiyun     }
387*4882a593Smuzhiyun     if (!had_dotclock)
388*4882a593Smuzhiyun         Error("the dotclock is missing");
389*4882a593Smuzhiyun     if (!had_htimings)
390*4882a593Smuzhiyun         Error("the horizontal timings are missing");
391*4882a593Smuzhiyun     if (!had_vtimings)
392*4882a593Smuzhiyun         Error("the vertical timings are missing");
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun #ifdef DEBUG
395*4882a593Smuzhiyun     printf("Verbose Mode parsed\n");
396*4882a593Smuzhiyun #endif
397*4882a593Smuzhiyun     return ptr;
398*4882a593Smuzhiyun }
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun #undef CLEANUP
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun #define CLEANUP xf86freeMonitorList
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun XF86ConfMonitorPtr
xf86parseMonitorSection(void)405*4882a593Smuzhiyun xf86parseMonitorSection(void)
406*4882a593Smuzhiyun {
407*4882a593Smuzhiyun     int has_ident = FALSE;
408*4882a593Smuzhiyun     int token;
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun     parsePrologue(XF86ConfMonitorPtr, XF86ConfMonitorRec)
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun         while ((token = xf86getToken(MonitorTab)) != ENDSECTION) {
413*4882a593Smuzhiyun         switch (token) {
414*4882a593Smuzhiyun         case COMMENT:
415*4882a593Smuzhiyun             ptr->mon_comment = xf86addComment(ptr->mon_comment, xf86_lex_val.str);
416*4882a593Smuzhiyun             break;
417*4882a593Smuzhiyun         case IDENTIFIER:
418*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->mon_comment)) != STRING)
419*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Identifier");
420*4882a593Smuzhiyun             if (has_ident == TRUE)
421*4882a593Smuzhiyun                 Error(MULTIPLE_MSG, "Identifier");
422*4882a593Smuzhiyun             ptr->mon_identifier = xf86_lex_val.str;
423*4882a593Smuzhiyun             has_ident = TRUE;
424*4882a593Smuzhiyun             break;
425*4882a593Smuzhiyun         case VENDOR:
426*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->mon_comment)) != STRING)
427*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Vendor");
428*4882a593Smuzhiyun             ptr->mon_vendor = xf86_lex_val.str;
429*4882a593Smuzhiyun             break;
430*4882a593Smuzhiyun         case MODEL:
431*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->mon_comment)) != STRING)
432*4882a593Smuzhiyun                 Error(QUOTE_MSG, "ModelName");
433*4882a593Smuzhiyun             ptr->mon_modelname = xf86_lex_val.str;
434*4882a593Smuzhiyun             break;
435*4882a593Smuzhiyun         case MODE:
436*4882a593Smuzhiyun             HANDLE_LIST(mon_modeline_lst, xf86parseVerboseMode,
437*4882a593Smuzhiyun                         XF86ConfModeLinePtr);
438*4882a593Smuzhiyun             break;
439*4882a593Smuzhiyun         case MODELINE:
440*4882a593Smuzhiyun             HANDLE_LIST(mon_modeline_lst, xf86parseModeLine,
441*4882a593Smuzhiyun                         XF86ConfModeLinePtr);
442*4882a593Smuzhiyun             break;
443*4882a593Smuzhiyun         case DISPLAYSIZE:
444*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->mon_comment)) != NUMBER)
445*4882a593Smuzhiyun                 Error(DISPLAYSIZE_MSG);
446*4882a593Smuzhiyun             ptr->mon_width = xf86_lex_val.realnum;
447*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->mon_comment)) != NUMBER)
448*4882a593Smuzhiyun                 Error(DISPLAYSIZE_MSG);
449*4882a593Smuzhiyun             ptr->mon_height = xf86_lex_val.realnum;
450*4882a593Smuzhiyun             break;
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun         case HORIZSYNC:
453*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->mon_comment)) != NUMBER)
454*4882a593Smuzhiyun                 Error(HORIZSYNC_MSG);
455*4882a593Smuzhiyun             do {
456*4882a593Smuzhiyun                 if (ptr->mon_n_hsync >= CONF_MAX_HSYNC)
457*4882a593Smuzhiyun                     Error("Sorry. Too many horizontal sync intervals.");
458*4882a593Smuzhiyun                 ptr->mon_hsync[ptr->mon_n_hsync].lo = xf86_lex_val.realnum;
459*4882a593Smuzhiyun                 switch (token = xf86getSubToken(&(ptr->mon_comment))) {
460*4882a593Smuzhiyun                 case COMMA:
461*4882a593Smuzhiyun                     ptr->mon_hsync[ptr->mon_n_hsync].hi =
462*4882a593Smuzhiyun                         ptr->mon_hsync[ptr->mon_n_hsync].lo;
463*4882a593Smuzhiyun                     break;
464*4882a593Smuzhiyun                 case DASH:
465*4882a593Smuzhiyun                     if (xf86getSubToken(&(ptr->mon_comment)) != NUMBER ||
466*4882a593Smuzhiyun                         (float) xf86_lex_val.realnum <
467*4882a593Smuzhiyun                         ptr->mon_hsync[ptr->mon_n_hsync].lo)
468*4882a593Smuzhiyun                         Error(HORIZSYNC_MSG);
469*4882a593Smuzhiyun                     ptr->mon_hsync[ptr->mon_n_hsync].hi = xf86_lex_val.realnum;
470*4882a593Smuzhiyun                     if ((token = xf86getSubToken(&(ptr->mon_comment))) == COMMA)
471*4882a593Smuzhiyun                         break;
472*4882a593Smuzhiyun                     ptr->mon_n_hsync++;
473*4882a593Smuzhiyun                     goto HorizDone;
474*4882a593Smuzhiyun                 default:
475*4882a593Smuzhiyun                     /* We cannot currently know if a '\n' was found,
476*4882a593Smuzhiyun                      * or this is a real error
477*4882a593Smuzhiyun                      */
478*4882a593Smuzhiyun                     ptr->mon_hsync[ptr->mon_n_hsync].hi =
479*4882a593Smuzhiyun                         ptr->mon_hsync[ptr->mon_n_hsync].lo;
480*4882a593Smuzhiyun                     ptr->mon_n_hsync++;
481*4882a593Smuzhiyun                     goto HorizDone;
482*4882a593Smuzhiyun                 }
483*4882a593Smuzhiyun                 ptr->mon_n_hsync++;
484*4882a593Smuzhiyun             } while ((token = xf86getSubToken(&(ptr->mon_comment))) == NUMBER);
485*4882a593Smuzhiyun  HorizDone:
486*4882a593Smuzhiyun             xf86unGetToken(token);
487*4882a593Smuzhiyun             break;
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun         case VERTREFRESH:
490*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->mon_comment)) != NUMBER)
491*4882a593Smuzhiyun                 Error(VERTREFRESH_MSG);
492*4882a593Smuzhiyun             do {
493*4882a593Smuzhiyun                 ptr->mon_vrefresh[ptr->mon_n_vrefresh].lo = xf86_lex_val.realnum;
494*4882a593Smuzhiyun                 switch (token = xf86getSubToken(&(ptr->mon_comment))) {
495*4882a593Smuzhiyun                 case COMMA:
496*4882a593Smuzhiyun                     ptr->mon_vrefresh[ptr->mon_n_vrefresh].hi =
497*4882a593Smuzhiyun                         ptr->mon_vrefresh[ptr->mon_n_vrefresh].lo;
498*4882a593Smuzhiyun                     break;
499*4882a593Smuzhiyun                 case DASH:
500*4882a593Smuzhiyun                     if (xf86getSubToken(&(ptr->mon_comment)) != NUMBER ||
501*4882a593Smuzhiyun                         (float) xf86_lex_val.realnum <
502*4882a593Smuzhiyun                         ptr->mon_vrefresh[ptr->mon_n_vrefresh].lo)
503*4882a593Smuzhiyun                         Error(VERTREFRESH_MSG);
504*4882a593Smuzhiyun                     ptr->mon_vrefresh[ptr->mon_n_vrefresh].hi = xf86_lex_val.realnum;
505*4882a593Smuzhiyun                     if ((token = xf86getSubToken(&(ptr->mon_comment))) == COMMA)
506*4882a593Smuzhiyun                         break;
507*4882a593Smuzhiyun                     ptr->mon_n_vrefresh++;
508*4882a593Smuzhiyun                     goto VertDone;
509*4882a593Smuzhiyun                 default:
510*4882a593Smuzhiyun                     /* We cannot currently know if a '\n' was found,
511*4882a593Smuzhiyun                      * or this is a real error
512*4882a593Smuzhiyun                      */
513*4882a593Smuzhiyun                     ptr->mon_vrefresh[ptr->mon_n_vrefresh].hi =
514*4882a593Smuzhiyun                         ptr->mon_vrefresh[ptr->mon_n_vrefresh].lo;
515*4882a593Smuzhiyun                     ptr->mon_n_vrefresh++;
516*4882a593Smuzhiyun                     goto VertDone;
517*4882a593Smuzhiyun                 }
518*4882a593Smuzhiyun                 if (ptr->mon_n_vrefresh >= CONF_MAX_VREFRESH)
519*4882a593Smuzhiyun                     Error("Sorry. Too many vertical refresh intervals.");
520*4882a593Smuzhiyun                 ptr->mon_n_vrefresh++;
521*4882a593Smuzhiyun             } while ((token = xf86getSubToken(&(ptr->mon_comment))) == NUMBER);
522*4882a593Smuzhiyun  VertDone:
523*4882a593Smuzhiyun             xf86unGetToken(token);
524*4882a593Smuzhiyun             break;
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun         case GAMMA:
527*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->mon_comment)) != NUMBER) {
528*4882a593Smuzhiyun                 Error(INVALID_GAMMA_MSG);
529*4882a593Smuzhiyun             }
530*4882a593Smuzhiyun             else {
531*4882a593Smuzhiyun                 ptr->mon_gamma_red = ptr->mon_gamma_green =
532*4882a593Smuzhiyun                     ptr->mon_gamma_blue = xf86_lex_val.realnum;
533*4882a593Smuzhiyun                 if (xf86getSubToken(&(ptr->mon_comment)) == NUMBER) {
534*4882a593Smuzhiyun                     ptr->mon_gamma_green = xf86_lex_val.realnum;
535*4882a593Smuzhiyun                     if (xf86getSubToken(&(ptr->mon_comment)) == NUMBER) {
536*4882a593Smuzhiyun                         ptr->mon_gamma_blue = xf86_lex_val.realnum;
537*4882a593Smuzhiyun                     }
538*4882a593Smuzhiyun                     else {
539*4882a593Smuzhiyun                         Error(INVALID_GAMMA_MSG);
540*4882a593Smuzhiyun                     }
541*4882a593Smuzhiyun                 }
542*4882a593Smuzhiyun                 else
543*4882a593Smuzhiyun                     xf86unGetToken(token);
544*4882a593Smuzhiyun             }
545*4882a593Smuzhiyun             break;
546*4882a593Smuzhiyun         case OPTION:
547*4882a593Smuzhiyun             ptr->mon_option_lst = xf86parseOption(ptr->mon_option_lst);
548*4882a593Smuzhiyun             break;
549*4882a593Smuzhiyun         case USEMODES:
550*4882a593Smuzhiyun         {
551*4882a593Smuzhiyun             XF86ConfModesLinkPtr mptr;
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun             if ((token = xf86getSubToken(&(ptr->mon_comment))) != STRING)
554*4882a593Smuzhiyun                 Error(QUOTE_MSG, "UseModes");
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun             /* add to the end of the list of modes sections
557*4882a593Smuzhiyun                referenced here */
558*4882a593Smuzhiyun             mptr = calloc(1, sizeof(XF86ConfModesLinkRec));
559*4882a593Smuzhiyun             mptr->list.next = NULL;
560*4882a593Smuzhiyun             mptr->ml_modes_str = xf86_lex_val.str;
561*4882a593Smuzhiyun             mptr->ml_modes = NULL;
562*4882a593Smuzhiyun             ptr->mon_modes_sect_lst = (XF86ConfModesLinkPtr)
563*4882a593Smuzhiyun                 xf86addListItem((GenericListPtr) ptr->mon_modes_sect_lst,
564*4882a593Smuzhiyun                                 (GenericListPtr) mptr);
565*4882a593Smuzhiyun         }
566*4882a593Smuzhiyun             break;
567*4882a593Smuzhiyun         case EOF_TOKEN:
568*4882a593Smuzhiyun             Error(UNEXPECTED_EOF_MSG);
569*4882a593Smuzhiyun             break;
570*4882a593Smuzhiyun         default:
571*4882a593Smuzhiyun             xf86parseError(INVALID_KEYWORD_MSG, xf86tokenString());
572*4882a593Smuzhiyun             CLEANUP(ptr);
573*4882a593Smuzhiyun             return NULL;
574*4882a593Smuzhiyun             break;
575*4882a593Smuzhiyun         }
576*4882a593Smuzhiyun     }
577*4882a593Smuzhiyun 
578*4882a593Smuzhiyun     if (!has_ident)
579*4882a593Smuzhiyun         Error(NO_IDENT_MSG);
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun #ifdef DEBUG
582*4882a593Smuzhiyun     printf("Monitor section parsed\n");
583*4882a593Smuzhiyun #endif
584*4882a593Smuzhiyun     return ptr;
585*4882a593Smuzhiyun }
586*4882a593Smuzhiyun 
587*4882a593Smuzhiyun #undef CLEANUP
588*4882a593Smuzhiyun #define CLEANUP xf86freeModesList
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun XF86ConfModesPtr
xf86parseModesSection(void)591*4882a593Smuzhiyun xf86parseModesSection(void)
592*4882a593Smuzhiyun {
593*4882a593Smuzhiyun     int has_ident = FALSE;
594*4882a593Smuzhiyun     int token;
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun     parsePrologue(XF86ConfModesPtr, XF86ConfModesRec)
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun         while ((token = xf86getToken(ModesTab)) != ENDSECTION) {
599*4882a593Smuzhiyun         switch (token) {
600*4882a593Smuzhiyun         case COMMENT:
601*4882a593Smuzhiyun             ptr->modes_comment = xf86addComment(ptr->modes_comment, xf86_lex_val.str);
602*4882a593Smuzhiyun             break;
603*4882a593Smuzhiyun         case IDENTIFIER:
604*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->modes_comment)) != STRING)
605*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Identifier");
606*4882a593Smuzhiyun             if (has_ident == TRUE)
607*4882a593Smuzhiyun                 Error(MULTIPLE_MSG, "Identifier");
608*4882a593Smuzhiyun             ptr->modes_identifier = xf86_lex_val.str;
609*4882a593Smuzhiyun             has_ident = TRUE;
610*4882a593Smuzhiyun             break;
611*4882a593Smuzhiyun         case MODE:
612*4882a593Smuzhiyun             HANDLE_LIST(mon_modeline_lst, xf86parseVerboseMode,
613*4882a593Smuzhiyun                         XF86ConfModeLinePtr);
614*4882a593Smuzhiyun             break;
615*4882a593Smuzhiyun         case MODELINE:
616*4882a593Smuzhiyun             HANDLE_LIST(mon_modeline_lst, xf86parseModeLine,
617*4882a593Smuzhiyun                         XF86ConfModeLinePtr);
618*4882a593Smuzhiyun             break;
619*4882a593Smuzhiyun         default:
620*4882a593Smuzhiyun             xf86parseError(INVALID_KEYWORD_MSG, xf86tokenString());
621*4882a593Smuzhiyun             CLEANUP(ptr);
622*4882a593Smuzhiyun             return NULL;
623*4882a593Smuzhiyun             break;
624*4882a593Smuzhiyun         }
625*4882a593Smuzhiyun     }
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun     if (!has_ident)
628*4882a593Smuzhiyun         Error(NO_IDENT_MSG);
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun #ifdef DEBUG
631*4882a593Smuzhiyun     printf("Modes section parsed\n");
632*4882a593Smuzhiyun #endif
633*4882a593Smuzhiyun     return ptr;
634*4882a593Smuzhiyun }
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun #undef CLEANUP
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun void
xf86printMonitorSection(FILE * cf,XF86ConfMonitorPtr ptr)639*4882a593Smuzhiyun xf86printMonitorSection(FILE * cf, XF86ConfMonitorPtr ptr)
640*4882a593Smuzhiyun {
641*4882a593Smuzhiyun     int i;
642*4882a593Smuzhiyun     XF86ConfModeLinePtr mlptr;
643*4882a593Smuzhiyun     XF86ConfModesLinkPtr mptr;
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun     while (ptr) {
646*4882a593Smuzhiyun         mptr = ptr->mon_modes_sect_lst;
647*4882a593Smuzhiyun         fprintf(cf, "Section \"Monitor\"\n");
648*4882a593Smuzhiyun         if (ptr->mon_comment)
649*4882a593Smuzhiyun             fprintf(cf, "%s", ptr->mon_comment);
650*4882a593Smuzhiyun         if (ptr->mon_identifier)
651*4882a593Smuzhiyun             fprintf(cf, "\tIdentifier   \"%s\"\n", ptr->mon_identifier);
652*4882a593Smuzhiyun         if (ptr->mon_vendor)
653*4882a593Smuzhiyun             fprintf(cf, "\tVendorName   \"%s\"\n", ptr->mon_vendor);
654*4882a593Smuzhiyun         if (ptr->mon_modelname)
655*4882a593Smuzhiyun             fprintf(cf, "\tModelName    \"%s\"\n", ptr->mon_modelname);
656*4882a593Smuzhiyun         while (mptr) {
657*4882a593Smuzhiyun             fprintf(cf, "\tUseModes     \"%s\"\n", mptr->ml_modes_str);
658*4882a593Smuzhiyun             mptr = mptr->list.next;
659*4882a593Smuzhiyun         }
660*4882a593Smuzhiyun         if (ptr->mon_width)
661*4882a593Smuzhiyun             fprintf(cf, "\tDisplaySize  %d\t%d\n",
662*4882a593Smuzhiyun                     ptr->mon_width, ptr->mon_height);
663*4882a593Smuzhiyun         for (i = 0; i < ptr->mon_n_hsync; i++) {
664*4882a593Smuzhiyun             fprintf(cf, "\tHorizSync    %2.1f - %2.1f\n",
665*4882a593Smuzhiyun                     ptr->mon_hsync[i].lo, ptr->mon_hsync[i].hi);
666*4882a593Smuzhiyun         }
667*4882a593Smuzhiyun         for (i = 0; i < ptr->mon_n_vrefresh; i++) {
668*4882a593Smuzhiyun             fprintf(cf, "\tVertRefresh  %2.1f - %2.1f\n",
669*4882a593Smuzhiyun                     ptr->mon_vrefresh[i].lo, ptr->mon_vrefresh[i].hi);
670*4882a593Smuzhiyun         }
671*4882a593Smuzhiyun         if (ptr->mon_gamma_red) {
672*4882a593Smuzhiyun             if (ptr->mon_gamma_red == ptr->mon_gamma_green
673*4882a593Smuzhiyun                 && ptr->mon_gamma_red == ptr->mon_gamma_blue) {
674*4882a593Smuzhiyun                 fprintf(cf, "\tGamma        %.4g\n", ptr->mon_gamma_red);
675*4882a593Smuzhiyun             }
676*4882a593Smuzhiyun             else {
677*4882a593Smuzhiyun                 fprintf(cf, "\tGamma        %.4g %.4g %.4g\n",
678*4882a593Smuzhiyun                         ptr->mon_gamma_red,
679*4882a593Smuzhiyun                         ptr->mon_gamma_green, ptr->mon_gamma_blue);
680*4882a593Smuzhiyun             }
681*4882a593Smuzhiyun         }
682*4882a593Smuzhiyun         for (mlptr = ptr->mon_modeline_lst; mlptr; mlptr = mlptr->list.next) {
683*4882a593Smuzhiyun             fprintf(cf, "\tModeLine     \"%s\" %2.1f ",
684*4882a593Smuzhiyun                     mlptr->ml_identifier, mlptr->ml_clock / 1000.0);
685*4882a593Smuzhiyun             fprintf(cf, "%d %d %d %d %d %d %d %d",
686*4882a593Smuzhiyun                     mlptr->ml_hdisplay, mlptr->ml_hsyncstart,
687*4882a593Smuzhiyun                     mlptr->ml_hsyncend, mlptr->ml_htotal,
688*4882a593Smuzhiyun                     mlptr->ml_vdisplay, mlptr->ml_vsyncstart,
689*4882a593Smuzhiyun                     mlptr->ml_vsyncend, mlptr->ml_vtotal);
690*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_PHSYNC)
691*4882a593Smuzhiyun                 fprintf(cf, " +hsync");
692*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_NHSYNC)
693*4882a593Smuzhiyun                 fprintf(cf, " -hsync");
694*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_PVSYNC)
695*4882a593Smuzhiyun                 fprintf(cf, " +vsync");
696*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_NVSYNC)
697*4882a593Smuzhiyun                 fprintf(cf, " -vsync");
698*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_INTERLACE)
699*4882a593Smuzhiyun                 fprintf(cf, " interlace");
700*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_CSYNC)
701*4882a593Smuzhiyun                 fprintf(cf, " composite");
702*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_PCSYNC)
703*4882a593Smuzhiyun                 fprintf(cf, " +csync");
704*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_NCSYNC)
705*4882a593Smuzhiyun                 fprintf(cf, " -csync");
706*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_DBLSCAN)
707*4882a593Smuzhiyun                 fprintf(cf, " doublescan");
708*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_HSKEW)
709*4882a593Smuzhiyun                 fprintf(cf, " hskew %d", mlptr->ml_hskew);
710*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_BCAST)
711*4882a593Smuzhiyun                 fprintf(cf, " bcast");
712*4882a593Smuzhiyun             fprintf(cf, "\n");
713*4882a593Smuzhiyun         }
714*4882a593Smuzhiyun         xf86printOptionList(cf, ptr->mon_option_lst, 1);
715*4882a593Smuzhiyun         fprintf(cf, "EndSection\n\n");
716*4882a593Smuzhiyun         ptr = ptr->list.next;
717*4882a593Smuzhiyun     }
718*4882a593Smuzhiyun }
719*4882a593Smuzhiyun 
720*4882a593Smuzhiyun void
xf86printModesSection(FILE * cf,XF86ConfModesPtr ptr)721*4882a593Smuzhiyun xf86printModesSection(FILE * cf, XF86ConfModesPtr ptr)
722*4882a593Smuzhiyun {
723*4882a593Smuzhiyun     XF86ConfModeLinePtr mlptr;
724*4882a593Smuzhiyun 
725*4882a593Smuzhiyun     while (ptr) {
726*4882a593Smuzhiyun         fprintf(cf, "Section \"Modes\"\n");
727*4882a593Smuzhiyun         if (ptr->modes_comment)
728*4882a593Smuzhiyun             fprintf(cf, "%s", ptr->modes_comment);
729*4882a593Smuzhiyun         if (ptr->modes_identifier)
730*4882a593Smuzhiyun             fprintf(cf, "\tIdentifier     \"%s\"\n", ptr->modes_identifier);
731*4882a593Smuzhiyun         for (mlptr = ptr->mon_modeline_lst; mlptr; mlptr = mlptr->list.next) {
732*4882a593Smuzhiyun             fprintf(cf, "\tModeLine     \"%s\" %2.1f ",
733*4882a593Smuzhiyun                     mlptr->ml_identifier, mlptr->ml_clock / 1000.0);
734*4882a593Smuzhiyun             fprintf(cf, "%d %d %d %d %d %d %d %d",
735*4882a593Smuzhiyun                     mlptr->ml_hdisplay, mlptr->ml_hsyncstart,
736*4882a593Smuzhiyun                     mlptr->ml_hsyncend, mlptr->ml_htotal,
737*4882a593Smuzhiyun                     mlptr->ml_vdisplay, mlptr->ml_vsyncstart,
738*4882a593Smuzhiyun                     mlptr->ml_vsyncend, mlptr->ml_vtotal);
739*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_PHSYNC)
740*4882a593Smuzhiyun                 fprintf(cf, " +hsync");
741*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_NHSYNC)
742*4882a593Smuzhiyun                 fprintf(cf, " -hsync");
743*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_PVSYNC)
744*4882a593Smuzhiyun                 fprintf(cf, " +vsync");
745*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_NVSYNC)
746*4882a593Smuzhiyun                 fprintf(cf, " -vsync");
747*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_INTERLACE)
748*4882a593Smuzhiyun                 fprintf(cf, " interlace");
749*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_CSYNC)
750*4882a593Smuzhiyun                 fprintf(cf, " composite");
751*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_PCSYNC)
752*4882a593Smuzhiyun                 fprintf(cf, " +csync");
753*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_NCSYNC)
754*4882a593Smuzhiyun                 fprintf(cf, " -csync");
755*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_DBLSCAN)
756*4882a593Smuzhiyun                 fprintf(cf, " doublescan");
757*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_HSKEW)
758*4882a593Smuzhiyun                 fprintf(cf, " hskew %d", mlptr->ml_hskew);
759*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_VSCAN)
760*4882a593Smuzhiyun                 fprintf(cf, " vscan %d", mlptr->ml_vscan);
761*4882a593Smuzhiyun             if (mlptr->ml_flags & XF86CONF_BCAST)
762*4882a593Smuzhiyun                 fprintf(cf, " bcast");
763*4882a593Smuzhiyun             if (mlptr->ml_comment)
764*4882a593Smuzhiyun                 fprintf(cf, "%s", mlptr->ml_comment);
765*4882a593Smuzhiyun             else
766*4882a593Smuzhiyun                 fprintf(cf, "\n");
767*4882a593Smuzhiyun         }
768*4882a593Smuzhiyun         fprintf(cf, "EndSection\n\n");
769*4882a593Smuzhiyun         ptr = ptr->list.next;
770*4882a593Smuzhiyun     }
771*4882a593Smuzhiyun }
772*4882a593Smuzhiyun 
773*4882a593Smuzhiyun void
xf86freeMonitorList(XF86ConfMonitorPtr ptr)774*4882a593Smuzhiyun xf86freeMonitorList(XF86ConfMonitorPtr ptr)
775*4882a593Smuzhiyun {
776*4882a593Smuzhiyun     XF86ConfMonitorPtr prev;
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun     while (ptr) {
779*4882a593Smuzhiyun         TestFree(ptr->mon_identifier);
780*4882a593Smuzhiyun         TestFree(ptr->mon_vendor);
781*4882a593Smuzhiyun         TestFree(ptr->mon_modelname);
782*4882a593Smuzhiyun         TestFree(ptr->mon_comment);
783*4882a593Smuzhiyun         xf86optionListFree(ptr->mon_option_lst);
784*4882a593Smuzhiyun         xf86freeModeLineList(ptr->mon_modeline_lst);
785*4882a593Smuzhiyun         prev = ptr;
786*4882a593Smuzhiyun         ptr = ptr->list.next;
787*4882a593Smuzhiyun         free(prev);
788*4882a593Smuzhiyun     }
789*4882a593Smuzhiyun }
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun void
xf86freeModesList(XF86ConfModesPtr ptr)792*4882a593Smuzhiyun xf86freeModesList(XF86ConfModesPtr ptr)
793*4882a593Smuzhiyun {
794*4882a593Smuzhiyun     XF86ConfModesPtr prev;
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun     while (ptr) {
797*4882a593Smuzhiyun         TestFree(ptr->modes_identifier);
798*4882a593Smuzhiyun         TestFree(ptr->modes_comment);
799*4882a593Smuzhiyun         xf86freeModeLineList(ptr->mon_modeline_lst);
800*4882a593Smuzhiyun         prev = ptr;
801*4882a593Smuzhiyun         ptr = ptr->list.next;
802*4882a593Smuzhiyun         free(prev);
803*4882a593Smuzhiyun     }
804*4882a593Smuzhiyun }
805*4882a593Smuzhiyun 
806*4882a593Smuzhiyun XF86ConfMonitorPtr
xf86findMonitor(const char * ident,XF86ConfMonitorPtr p)807*4882a593Smuzhiyun xf86findMonitor(const char *ident, XF86ConfMonitorPtr p)
808*4882a593Smuzhiyun {
809*4882a593Smuzhiyun     while (p) {
810*4882a593Smuzhiyun         if (xf86nameCompare(ident, p->mon_identifier) == 0)
811*4882a593Smuzhiyun             return p;
812*4882a593Smuzhiyun 
813*4882a593Smuzhiyun         p = p->list.next;
814*4882a593Smuzhiyun     }
815*4882a593Smuzhiyun     return NULL;
816*4882a593Smuzhiyun }
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun XF86ConfModesPtr
xf86findModes(const char * ident,XF86ConfModesPtr p)819*4882a593Smuzhiyun xf86findModes(const char *ident, XF86ConfModesPtr p)
820*4882a593Smuzhiyun {
821*4882a593Smuzhiyun     while (p) {
822*4882a593Smuzhiyun         if (xf86nameCompare(ident, p->modes_identifier) == 0)
823*4882a593Smuzhiyun             return p;
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun         p = p->list.next;
826*4882a593Smuzhiyun     }
827*4882a593Smuzhiyun     return NULL;
828*4882a593Smuzhiyun }
829*4882a593Smuzhiyun 
830*4882a593Smuzhiyun XF86ConfModeLinePtr
xf86findModeLine(const char * ident,XF86ConfModeLinePtr p)831*4882a593Smuzhiyun xf86findModeLine(const char *ident, XF86ConfModeLinePtr p)
832*4882a593Smuzhiyun {
833*4882a593Smuzhiyun     while (p) {
834*4882a593Smuzhiyun         if (xf86nameCompare(ident, p->ml_identifier) == 0)
835*4882a593Smuzhiyun             return p;
836*4882a593Smuzhiyun 
837*4882a593Smuzhiyun         p = p->list.next;
838*4882a593Smuzhiyun     }
839*4882a593Smuzhiyun     return NULL;
840*4882a593Smuzhiyun }
841*4882a593Smuzhiyun 
842*4882a593Smuzhiyun int
xf86validateMonitor(XF86ConfigPtr p,XF86ConfScreenPtr screen)843*4882a593Smuzhiyun xf86validateMonitor(XF86ConfigPtr p, XF86ConfScreenPtr screen)
844*4882a593Smuzhiyun {
845*4882a593Smuzhiyun     XF86ConfMonitorPtr monitor = screen->scrn_monitor;
846*4882a593Smuzhiyun     XF86ConfModesLinkPtr modeslnk = monitor->mon_modes_sect_lst;
847*4882a593Smuzhiyun     XF86ConfModesPtr modes;
848*4882a593Smuzhiyun 
849*4882a593Smuzhiyun     while (modeslnk) {
850*4882a593Smuzhiyun         modes = xf86findModes(modeslnk->ml_modes_str, p->conf_modes_lst);
851*4882a593Smuzhiyun         if (!modes) {
852*4882a593Smuzhiyun             xf86validationError(UNDEFINED_MODES_MSG,
853*4882a593Smuzhiyun                                 modeslnk->ml_modes_str,
854*4882a593Smuzhiyun                                 screen->scrn_identifier);
855*4882a593Smuzhiyun             return FALSE;
856*4882a593Smuzhiyun         }
857*4882a593Smuzhiyun         modeslnk->ml_modes = modes;
858*4882a593Smuzhiyun         modeslnk = modeslnk->list.next;
859*4882a593Smuzhiyun     }
860*4882a593Smuzhiyun     return TRUE;
861*4882a593Smuzhiyun }
862