First import
[xorg_rtime.git] / xorg-server-1.4 / hw / xfree86 / parser / DRI.c
blob18644bcc7396afbecbd3f8a20bde0a163ed6481f
1 /* DRI.c -- DRI Section in XF86Config file
2 * Created: Fri Mar 19 08:40:22 1999 by faith@precisioninsight.com
3 * Revised: Thu Jun 17 16:08:05 1999 by faith@precisioninsight.com
5 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
6 * All Rights Reserved.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 * DEALINGS IN THE SOFTWARE.
30 #ifdef HAVE_XORG_CONFIG_H
31 #include <xorg-config.h>
32 #endif
34 #include "xf86Parser.h"
35 #include "xf86tokens.h"
36 #include "Configint.h"
38 extern LexRec val;
40 static xf86ConfigSymTabRec DRITab[] =
42 {ENDSECTION, "endsection"},
43 {GROUP, "group"},
44 {BUFFERS, "buffers"},
45 {MODE, "mode"},
46 {-1, ""},
49 #define CLEANUP xf86freeBuffersList
51 static void
52 xf86freeBuffersList (XF86ConfBuffersPtr ptr)
54 XF86ConfBuffersPtr prev;
56 while (ptr) {
57 TestFree (ptr->buf_flags);
58 TestFree (ptr->buf_comment);
59 prev = ptr;
60 ptr = ptr->list.next;
61 xf86conffree (prev);
65 static XF86ConfBuffersPtr
66 xf86parseBuffers (void)
68 int token;
69 parsePrologue (XF86ConfBuffersPtr, XF86ConfBuffersRec)
71 if (xf86getSubToken (&(ptr->buf_comment)) != NUMBER)
72 Error ("Buffers count expected", NULL);
73 ptr->buf_count = val.num;
75 if (xf86getSubToken (&(ptr->buf_comment)) != NUMBER)
76 Error ("Buffers size expected", NULL);
77 ptr->buf_size = val.num;
79 if ((token = xf86getSubToken (&(ptr->buf_comment))) == STRING) {
80 ptr->buf_flags = val.str;
81 if ((token = xf86getToken (NULL)) == COMMENT)
82 ptr->buf_comment = xf86addComment(ptr->buf_comment, val.str);
83 else
84 xf86unGetToken(token);
87 #ifdef DEBUG
88 printf ("Buffers parsed\n");
89 #endif
91 return ptr;
94 #undef CLEANUP
96 #define CLEANUP xf86freeDRI
98 XF86ConfDRIPtr
99 xf86parseDRISection (void)
101 int token;
102 parsePrologue (XF86ConfDRIPtr, XF86ConfDRIRec);
104 /* Zero is a valid value for this. */
105 ptr->dri_group = -1;
106 while ((token = xf86getToken (DRITab)) != ENDSECTION) {
107 switch (token)
109 case GROUP:
110 if ((token = xf86getSubToken (&(ptr->dri_comment))) == STRING)
111 ptr->dri_group_name = val.str;
112 else if (token == NUMBER)
113 ptr->dri_group = val.num;
114 else
115 Error (GROUP_MSG, NULL);
116 break;
117 case MODE:
118 if (xf86getSubToken (&(ptr->dri_comment)) != NUMBER)
119 Error (NUMBER_MSG, "Mode");
120 ptr->dri_mode = val.num;
121 break;
122 case BUFFERS:
123 HANDLE_LIST (dri_buffers_lst, xf86parseBuffers,
124 XF86ConfBuffersPtr);
125 break;
126 case EOF_TOKEN:
127 Error (UNEXPECTED_EOF_MSG, NULL);
128 break;
129 case COMMENT:
130 ptr->dri_comment = xf86addComment(ptr->dri_comment, val.str);
131 break;
132 default:
133 Error (INVALID_KEYWORD_MSG, xf86tokenString ());
134 break;
138 #ifdef DEBUG
139 ErrorF("DRI section parsed\n");
140 #endif
142 return ptr;
145 #undef CLEANUP
147 void
148 xf86printDRISection (FILE * cf, XF86ConfDRIPtr ptr)
150 XF86ConfBuffersPtr bufs;
152 if (ptr == NULL)
153 return;
155 fprintf (cf, "Section \"DRI\"\n");
156 if (ptr->dri_comment)
157 fprintf (cf, "%s", ptr->dri_comment);
158 if (ptr->dri_group_name)
159 fprintf (cf, "\tGroup \"%s\"\n", ptr->dri_group_name);
160 else if (ptr->dri_group >= 0)
161 fprintf (cf, "\tGroup %d\n", ptr->dri_group);
162 if (ptr->dri_mode)
163 fprintf (cf, "\tMode 0%o\n", ptr->dri_mode);
164 for (bufs = ptr->dri_buffers_lst; bufs; bufs = bufs->list.next) {
165 fprintf (cf, "\tBuffers %d %d",
166 bufs->buf_count, bufs->buf_size);
167 if (bufs->buf_flags) fprintf (cf, " \"%s\"", bufs->buf_flags);
168 if (bufs->buf_comment)
169 fprintf(cf, "%s", bufs->buf_comment);
170 else
171 fprintf (cf, "\n");
173 fprintf (cf, "EndSection\n\n");
176 void
177 xf86freeDRI (XF86ConfDRIPtr ptr)
179 if (ptr == NULL)
180 return;
182 xf86freeBuffersList (ptr->dri_buffers_lst);
183 TestFree (ptr->dri_comment);
184 xf86conffree (ptr);