1 %{
2 
3 /*
4  * +-------------------------------------------------------+
5  * |                                                       |
6  * |     videogen                                          |
7  * |                                                       |
8  * |     a simple XFree86 Modeline calculator              |
9  * |     (c) 1997-2003, Szabolcs Rumi                      |
10  * |                                                       |
11  * |     http://www.dynaweb.hu/opensource/videogen         |
12  * |                                                       |
13  * |     the videogen package is distributed under the     |
14  * |     GNU General Public License Version 2 (GPLv2)      |
15  * |                                                       |
16  * +-------------------------------------------------------+
17  */
18 
19 
20 
21 
22 
23 #include <stdio.h>
24 #include <stdlib.h>
25 
26 #include "config.h"
27 #include "videogen.h"
28 
29 
30 
31 extern unsigned int lexer_num_lines;	/* line counter */
32 extern int yylex (void);
33 void yyerror (char *errtext);
34 
35 
36 
37 
38 
39 %}
40 
41 
42 
43 
44 
45 %union {
46 	long int ival;		/* integer value */
47 	double fval;		/* floating point value */
48 	unsigned char bval;	/* boolean value */
49 }
50 
51 %token <ival> T_INTEGER
52 %token <fval> T_FLOAT
53 %token <bval> T_BOOLEAN
54 %token T_VERBOSE
55 %token T_FBSET
56 %token T_NVIDIA
57 %token T_MODE
58 %token T_MAX_DOTCLK
59 %token T_MAX_HFREQ
60 %token T_MAX_VFREQ
61 %token T_DESIRED_VFREQ
62 %token T_HVISIBLE
63 %token T_VVISIBLE
64 %token T_HFPORCH
65 %token T_HBPORCH
66 %token T_HSYNC
67 %token T_VFPORCH
68 %token T_VBPORCH
69 %token T_VSYNC
70 
71 
72 
73 
74 
75 %%
76 
77 
78 
79 
80 
81 input:		/* empty */				/* empty */
82 		| input line				/* empty */
83 		| input error				/* empty */
84 ;
85 
86 
87 
88 line:		'\n'					/* empty */
89 		| assignments '\n'			/* empty */
90 ;
91 
92 
93 
94 assignments:	';'					/* empty */
95 		| assignments ';' assignment		/* empty */
96 		| assignments ';' 			/* empty */
97 		| assignment				/* empty */
98 ;
99 
100 
101 
102 assignment:	T_VERBOSE '=' T_BOOLEAN			{
103 
104 	if ($3 > 0)
105 	{
106 		if (commit_verbose (CFG_PREC_CFGFILE, &verbose, 1) == 0) {
107 			pmsg (VL_DEBUG, "[cfgfile] line %u: verbose mode on\n", lexer_num_lines);
108 		}
109 	}
110 	else
111 	{
112 		if (commit_verbose (CFG_PREC_CFGFILE, &verbose, 0) == 0)
113 			pmsg (VL_DEBUG, "[cfgfile] line %u: verbose mode off\n", lexer_num_lines);
114 	}
115 
116 							}
117 
118 
119 
120 		| T_FBSET '=' T_BOOLEAN			{
121 
122 	if ($3 > 0)
123 	{
124 		if (commit_fbset (CFG_PREC_CFGFILE, &fbset, 1) == 0)
125 			pmsg (VL_DEBUG, "[cfgfile] line %u: fbset mode on\n", lexer_num_lines);
126 	}
127 	else
128 	{
129 		if (commit_fbset (CFG_PREC_CFGFILE, &fbset, 0) == 0)
130 			pmsg (VL_DEBUG, "[cfgfile] line %u: fbset mode off\n", lexer_num_lines);
131 	}
132 
133 							}
134 
135 
136 
137 		| T_NVIDIA '=' T_BOOLEAN		{
138 
139 	if ($3 > 0)
140 	{
141 		if (commit_nvidia (CFG_PREC_CFGFILE, &nvidia, 1) == 0)
142 			pmsg (VL_DEBUG, "[cfgfile] line %u: nvidia compatibility mode on\n", lexer_num_lines);
143 	}
144 	else
145 	{
146 		if (commit_nvidia (CFG_PREC_CFGFILE, &nvidia, 0) == 0)
147 			pmsg (VL_DEBUG, "[cfgfile] line %u: nvidia compatibility mode off\n", lexer_num_lines);
148 	}
149 
150 							}
151 
152 
153 
154 		| T_MODE T_INTEGER 'x' T_INTEGER	{
155 
156 	switch (commit_mode (CFG_PREC_CFGFILE, &modes, &num_modes, $2, $4))
157 	{
158 		case -1:	break;
159 
160 		case 0:	{
161 				pmsg (VL_DEBUG, "[cfgfile] line %u: added mode %lux%lu\n", lexer_num_lines, $2, $4);
162 				break;
163 			}
164 
165 		case 5: {
166 				pmsg (VL_DEBUG, "[cfgfile] line %u: too many modes, dropping %lux%lu\n", lexer_num_lines, $2, $4);
167 				pmsg (VL_VERBOSE, "no more than 256 modes are allowed, dropping %lux%lu\n", $2, $4);
168 				break;
169 			}
170 
171 		default: {
172 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter %lux%lu\n", lexer_num_lines, $2, $4);
173 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
174 				YYABORT;
175 			}
176 	}
177 
178 							}
179 
180 
181 
182 		| T_MAX_DOTCLK '=' T_INTEGER		{
183 
184 	switch (commit_max_dotclk (CFG_PREC_CFGFILE, &max_dotclk, $3))
185 	{
186 		case -1:	break;
187 
188 		case 0:	{
189 				pmsg (VL_DEBUG, "[cfgfile] line %u: max_dotclk = %lu MHz\n", lexer_num_lines, $3);
190 				break;
191 			}
192 
193 		default: {
194 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (max_dotclk = %lu MHz)\n", lexer_num_lines, $3);
195 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
196 				YYABORT;
197 			}
198 	}
199 
200 							}
201 
202 
203 
204 		| T_MAX_DOTCLK '=' T_FLOAT		{
205 
206 	switch (commit_max_dotclk (CFG_PREC_CFGFILE, &max_dotclk, $3))
207 	{
208 		case -1:	break;
209 
210 		case 0:	{
211 				pmsg (VL_DEBUG, "[cfgfile] line %u: max_dotclk = %f MHz\n", lexer_num_lines, $3);
212 				break;
213 			}
214 
215 		default: {
216 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (max_dotclk = %f MHz)\n", lexer_num_lines, $3);
217 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
218 				YYABORT;
219 			}
220 	}
221 
222 							}
223 
224 
225 
226 		| T_MAX_HFREQ '=' T_INTEGER		{
227 
228 	switch (commit_max_hfreq (CFG_PREC_CFGFILE, &max_hfreq, $3))
229 	{
230 		case -1:	break;
231 
232 		case 0:	{
233 				pmsg (VL_DEBUG, "[cfgfile] line %u: max_hfreq = %lu kHz\n", lexer_num_lines, $3);
234 				break;
235 			}
236 
237 		default: {
238 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (max_hfreq = %lu kHz)\n", lexer_num_lines, $3);
239 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
240 				YYABORT;
241 			}
242 	}
243 
244 							}
245 
246 
247 
248 		| T_MAX_HFREQ '=' T_FLOAT		{
249 
250 	switch (commit_max_hfreq (CFG_PREC_CFGFILE, &max_hfreq, $3))
251 	{
252 		case -1:	break;
253 
254 		case 0:	{
255 				pmsg (VL_DEBUG, "[cfgfile] line %u: max_hfreq = %f kHz\n", lexer_num_lines, $3);
256 				break;
257 			}
258 
259 		default: {
260 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (max_hfreq = %f kHz)\n", lexer_num_lines, $3);
261 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
262 				YYABORT;
263 			}
264 	}
265 
266 							}
267 
268 
269 
270 		| T_MAX_VFREQ '=' T_INTEGER		{
271 
272 	switch (commit_max_vfreq (CFG_PREC_CFGFILE, &max_vfreq, $3))
273 	{
274 		case -1:	break;
275 
276 		case 0:	{
277 				pmsg (VL_DEBUG, "[cfgfile] line %u: max_vfreq = %lu Hz\n", lexer_num_lines, $3);
278 				break;
279 			}
280 
281 		default: {
282 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (max_vfreq = %lu Hz)\n", lexer_num_lines, $3);
283 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
284 				YYABORT;
285 			}
286 	}
287 
288 							}
289 
290 
291 
292 		| T_MAX_VFREQ '=' T_FLOAT		{
293 
294 	switch (commit_max_vfreq (CFG_PREC_CFGFILE, &max_vfreq, $3))
295 	{
296 		case -1:	break;
297 
298 		case 0:	{
299 				pmsg (VL_DEBUG, "[cfgfile] line %u: max_vfreq = %f Hz\n", lexer_num_lines, $3);
300 				break;
301 			}
302 
303 		default: {
304 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (max_vfreq = %f Hz)\n", lexer_num_lines, $3);
305 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
306 				YYABORT;
307 			}
308 	}
309 
310 							}
311 
312 
313 
314 		| T_DESIRED_VFREQ '=' T_INTEGER		{
315 
316 	switch (commit_desired_vfreq (CFG_PREC_CFGFILE, &desired_vfreq, $3))
317 	{
318 		case -1:	break;
319 
320 		case 0:	{
321 				pmsg (VL_DEBUG, "[cfgfile] line %u: desired_vfreq = %lu Hz\n", lexer_num_lines, $3);
322 				break;
323 			}
324 
325 		default: {
326 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (desired_vfreq = %lu Hz)\n", lexer_num_lines, $3);
327 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
328 				YYABORT;
329 			}
330 	}
331 
332 							}
333 
334 
335 
336 		| T_DESIRED_VFREQ '=' T_FLOAT		{
337 
338 	switch (commit_desired_vfreq (CFG_PREC_CFGFILE, &desired_vfreq, $3))
339 	{
340 		case -1:	break;
341 
342 		case 0:	{
343 				pmsg (VL_DEBUG, "[cfgfile] line %u: desired_vfreq = %f Hz\n", lexer_num_lines, $3);
344 				break;
345 			}
346 
347 		default: {
348 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (desired_vfreq = %f Hz)\n", lexer_num_lines, $3);
349 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
350 				YYABORT;
351 			}
352 	}
353 
354 							}
355 
356 
357 
358 		| T_HVISIBLE '=' T_INTEGER		{
359 
360 	switch (commit_hvisible (CFG_PREC_CFGFILE, &hvisible, $3))
361 	{
362 		case -1:	break;
363 
364 		case 0:	{
365 				pmsg (VL_DEBUG, "[cfgfile] line %u: hvisible = %lu%%\n", lexer_num_lines, $3);
366 				break;
367 			}
368 
369 		default: {
370 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (hvisible = %lu%%)\n", lexer_num_lines, $3);
371 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
372 				YYABORT;
373 			}
374 	}
375 
376 							}
377 
378 
379 
380 		| T_HVISIBLE '=' T_FLOAT		{
381 
382 	switch (commit_hvisible (CFG_PREC_CFGFILE, &hvisible, $3))
383 	{
384 		case -1:	break;
385 
386 		case 0:	{
387 				pmsg (VL_DEBUG, "[cfgfile] line %u: hvisible = %.4g%%\n", lexer_num_lines, $3);
388 				break;
389 			}
390 
391 		default: {
392 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (hvisible = %.4g%%)\n", lexer_num_lines, $3);
393 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
394 				YYABORT;
395 			}
396 	}
397 
398 							}
399 
400 
401 
402 		| T_VVISIBLE '=' T_INTEGER		{
403 
404 	switch (commit_vvisible (CFG_PREC_CFGFILE, &vvisible, $3))
405 	{
406 		case -1:	break;
407 
408 		case 0:	{
409 				pmsg (VL_DEBUG, "[cfgfile] line %u: vvisible = %lu%%\n", lexer_num_lines, $3);
410 				break;
411 			}
412 
413 		default: {
414 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (vvisible = %lu%%)\n", lexer_num_lines, $3);
415 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
416 				YYABORT;
417 			}
418 	}
419 
420 							}
421 
422 
423 
424 		| T_VVISIBLE '=' T_FLOAT		{
425 
426 	switch (commit_vvisible (CFG_PREC_CFGFILE, &vvisible, $3))
427 	{
428 		case -1:	break;
429 
430 		case 0:	{
431 				pmsg (VL_DEBUG, "[cfgfile] line %u: vvisible = %.4g%%\n", lexer_num_lines, $3);
432 				break;
433 			}
434 
435 		default: {
436 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (vvisible = %.4g%%)\n", lexer_num_lines, $3);
437 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
438 				YYABORT;
439 			}
440 	}
441 
442 							}
443 
444 
445 
446 		| T_HFPORCH '=' T_INTEGER		{
447 
448 	switch (commit_hfporch (CFG_PREC_CFGFILE, &hfporch, $3))
449 	{
450 		case -1:	break;
451 
452 		case 0:	{
453 				pmsg (VL_DEBUG, "[cfgfile] line %u: hfporch = %lu ticks\n", lexer_num_lines, $3);
454 				break;
455 			}
456 
457 		default: {
458 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (hfporch = %lu ticks\n", lexer_num_lines, $3);
459 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
460 				YYABORT;
461 			}
462 	}
463 
464 							}
465 
466 
467 
468 		| T_HBPORCH '=' T_INTEGER		{
469 
470 	switch (commit_hbporch (CFG_PREC_CFGFILE, &hbporch, $3))
471 	{
472 		case -1:	break;
473 
474 		case 0:	{
475 				pmsg (VL_DEBUG, "[cfgfile] line %u: hbporch = %lu ticks\n", lexer_num_lines, $3);
476 				break;
477 			}
478 
479 		default: {
480 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (hbporch = %lu ticks\n", lexer_num_lines, $3);
481 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
482 				YYABORT;
483 			}
484 	}
485 
486 							}
487 
488 
489 
490 		| T_HSYNC '=' T_INTEGER			{
491 
492 	switch (commit_hsync (CFG_PREC_CFGFILE, &hsync, $3))
493 	{
494 		case -1:	break;
495 
496 		case 0:	{
497 				pmsg (VL_DEBUG, "[cfgfile] line %u: hsync = %lu us\n", lexer_num_lines, $3);
498 				break;
499 			}
500 
501 		default: {
502 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (hsync = %lu us\n", lexer_num_lines, $3);
503 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
504 				YYABORT;
505 			}
506 	}
507 
508 							}
509 
510 
511 
512 		| T_HSYNC '=' T_FLOAT			{
513 
514 	switch (commit_hsync (CFG_PREC_CFGFILE, &hsync, $3))
515 	{
516 		case -1:	break;
517 
518 		case 0:	{
519 				pmsg (VL_DEBUG, "[cfgfile] line %u: hsync = %.4g us\n", lexer_num_lines, $3);
520 				break;
521 			}
522 
523 		default: {
524 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (hsync = %.4g us\n", lexer_num_lines, $3);
525 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
526 				YYABORT;
527 			}
528 	}
529 
530 							}
531 
532 
533 
534 		| T_VFPORCH '=' T_INTEGER		{
535 
536 	switch (commit_vfporch (CFG_PREC_CFGFILE, &vfporch, $3))
537 	{
538 		case -1:	break;
539 
540 		case 0:	{
541 				pmsg (VL_DEBUG, "[cfgfile] line %u: vfporch = %lu ticks\n", lexer_num_lines, $3);
542 				break;
543 			}
544 
545 		default: {
546 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (vfporch = %lu ticks\n", lexer_num_lines, $3);
547 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
548 				YYABORT;
549 			}
550 	}
551 
552 							}
553 
554 
555 
556 		| T_VBPORCH '=' T_INTEGER		{
557 
558 	switch (commit_vbporch (CFG_PREC_CFGFILE, &vbporch, $3))
559 	{
560 		case -1:	break;
561 
562 		case 0:	{
563 				pmsg (VL_DEBUG, "[cfgfile] line %u: vbporch = %lu ticks\n", lexer_num_lines, $3);
564 				break;
565 			}
566 
567 		default: {
568 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (vbporch = %lu ticks\n", lexer_num_lines, $3);
569 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
570 				YYABORT;
571 			}
572 	}
573 
574 							}
575 
576 
577 
578 		| T_VSYNC '=' T_INTEGER			{
579 
580 	switch (commit_vsync (CFG_PREC_CFGFILE, &vsync, $3))
581 	{
582 		case -1:	break;
583 
584 		case 0:	{
585 				pmsg (VL_DEBUG, "[cfgfile] line %u: vsync = %lu us\n", lexer_num_lines, $3);
586 				break;
587 			}
588 
589 		default: {
590 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (vsync = %lu us\n", lexer_num_lines, $3);
591 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
592 				YYABORT;
593 			}
594 	}
595 
596 							}
597 
598 
599 
600 		| T_VSYNC '=' T_FLOAT			{
601 
602 	switch (commit_vsync (CFG_PREC_CFGFILE, &vsync, $3))
603 	{
604 		case -1:	break;
605 
606 		case 0:	{
607 				pmsg (VL_DEBUG, "[cfgfile] line %u: vsync = %.4g us\n", lexer_num_lines, $3);
608 				break;
609 			}
610 
611 		default: {
612 				pmsg (VL_DEBUG, "[cfgfile] line %u: invalid parameter (vsync = %.4g us\n", lexer_num_lines, $3);
613 				pmsg (VL_VERBOSE, "error at line %u: invalid parameter\n", lexer_num_lines);
614 				YYABORT;
615 			}
616 	}
617 
618 							}
619 
620 ;
621 
622 
623 
624 
625 
626 %%
627 
628 
629 
630 
631 
632 void
633 yyerror (char *errtext)
634 {
635 	pmsg (VL_DEBUG, "[cfgfile] parse error at line %u: %s\n", lexer_num_lines, errtext);
636 	pmsg (VL_VERBOSE, "error at line %u: %s\n", lexer_num_lines, errtext);
637 }
638 
639 
640 
641 
642 
643 /* EOF */
644