xref: /OK3568_Linux_fs/external/xserver/hw/xfree86/parser/Module.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  *
3  * Copyright (c) 1997  Metro Link Incorporated
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
20  * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  *
23  * Except as contained in this notice, the name of the Metro Link shall not be
24  * used in advertising or otherwise to promote the sale, use or other dealings
25  * in this Software without prior written authorization from Metro Link.
26  *
27  */
28 /*
29  * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
30  *
31  * Permission is hereby granted, free of charge, to any person obtaining a
32  * copy of this software and associated documentation files (the "Software"),
33  * to deal in the Software without restriction, including without limitation
34  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
35  * and/or sell copies of the Software, and to permit persons to whom the
36  * Software is furnished to do so, subject to the following conditions:
37  *
38  * The above copyright notice and this permission notice shall be included in
39  * all copies or substantial portions of the Software.
40  *
41  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
42  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
43  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
44  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
45  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
46  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
47  * OTHER DEALINGS IN THE SOFTWARE.
48  *
49  * Except as contained in this notice, the name of the copyright holder(s)
50  * and author(s) shall not be used in advertising or otherwise to promote
51  * the sale, use or other dealings in this Software without prior written
52  * authorization from the copyright holder(s) and author(s).
53  */
54 
55 #ifdef HAVE_XORG_CONFIG_H
56 #include <xorg-config.h>
57 #endif
58 
59 #include "xf86Parser.h"
60 #include "xf86tokens.h"
61 #include "Configint.h"
62 
63 
64 static const xf86ConfigSymTabRec SubModuleTab[] = {
65     {ENDSUBSECTION, "endsubsection"},
66     {OPTION, "option"},
67     {-1, ""},
68 };
69 
70 static const xf86ConfigSymTabRec ModuleTab[] = {
71     {ENDSECTION, "endsection"},
72     {LOAD, "load"},
73     {DISABLE, "disable"},
74     {LOAD_DRIVER, "loaddriver"},
75     {SUBSECTION, "subsection"},
76     {-1, ""},
77 };
78 
79 #define CLEANUP xf86freeModules
80 
81 static XF86LoadPtr
xf86parseModuleSubSection(XF86LoadPtr head,char * name)82 xf86parseModuleSubSection(XF86LoadPtr head, char *name)
83 {
84     int token;
85 
86     parsePrologue(XF86LoadPtr, XF86LoadRec)
87 
88         ptr->load_name = name;
89     ptr->load_type = XF86_LOAD_MODULE;
90     ptr->ignore = 0;
91     ptr->load_opt = NULL;
92     ptr->list.next = NULL;
93 
94     while ((token = xf86getToken(SubModuleTab)) != ENDSUBSECTION) {
95         switch (token) {
96         case COMMENT:
97             ptr->load_comment = xf86addComment(ptr->load_comment, xf86_lex_val.str);
98             break;
99         case OPTION:
100             ptr->load_opt = xf86parseOption(ptr->load_opt);
101             break;
102         case EOF_TOKEN:
103             xf86parseError(UNEXPECTED_EOF_MSG);
104             free(ptr);
105             return NULL;
106         default:
107             xf86parseError(INVALID_KEYWORD_MSG, xf86tokenString());
108             free(ptr);
109             return NULL;
110             break;
111         }
112 
113     }
114 
115     return ((XF86LoadPtr) xf86addListItem((glp) head, (glp) ptr));
116 }
117 
118 XF86ConfModulePtr
xf86parseModuleSection(void)119 xf86parseModuleSection(void)
120 {
121     int token;
122 
123     parsePrologue(XF86ConfModulePtr, XF86ConfModuleRec)
124 
125         while ((token = xf86getToken(ModuleTab)) != ENDSECTION) {
126         switch (token) {
127         case COMMENT:
128             ptr->mod_comment = xf86addComment(ptr->mod_comment, xf86_lex_val.str);
129             break;
130         case LOAD:
131             if (xf86getSubToken(&(ptr->mod_comment)) != STRING)
132                 Error(QUOTE_MSG, "Load");
133             ptr->mod_load_lst =
134                 xf86addNewLoadDirective(ptr->mod_load_lst, xf86_lex_val.str,
135                                         XF86_LOAD_MODULE, NULL);
136             break;
137         case DISABLE:
138             if (xf86getSubToken(&(ptr->mod_comment)) != STRING)
139                 Error(QUOTE_MSG, "Disable");
140             ptr->mod_disable_lst =
141                 xf86addNewLoadDirective(ptr->mod_disable_lst, xf86_lex_val.str,
142                                         XF86_DISABLE_MODULE, NULL);
143             break;
144         case LOAD_DRIVER:
145             if (xf86getSubToken(&(ptr->mod_comment)) != STRING)
146                 Error(QUOTE_MSG, "LoadDriver");
147             ptr->mod_load_lst =
148                 xf86addNewLoadDirective(ptr->mod_load_lst, xf86_lex_val.str,
149                                         XF86_LOAD_DRIVER, NULL);
150             break;
151         case SUBSECTION:
152             if (xf86getSubToken(&(ptr->mod_comment)) != STRING)
153                 Error(QUOTE_MSG, "SubSection");
154             ptr->mod_load_lst =
155                 xf86parseModuleSubSection(ptr->mod_load_lst, xf86_lex_val.str);
156             break;
157         case EOF_TOKEN:
158             Error(UNEXPECTED_EOF_MSG);
159             break;
160         default:
161             Error(INVALID_KEYWORD_MSG, xf86tokenString());
162             break;
163         }
164     }
165 
166 #ifdef DEBUG
167     printf("Module section parsed\n");
168 #endif
169 
170     return ptr;
171 }
172 
173 #undef CLEANUP
174 
175 void
xf86printModuleSection(FILE * cf,XF86ConfModulePtr ptr)176 xf86printModuleSection(FILE * cf, XF86ConfModulePtr ptr)
177 {
178     XF86LoadPtr lptr;
179 
180     if (ptr == NULL)
181         return;
182 
183     if (ptr->mod_comment)
184         fprintf(cf, "%s", ptr->mod_comment);
185     for (lptr = ptr->mod_load_lst; lptr; lptr = lptr->list.next) {
186         switch (lptr->load_type) {
187         case XF86_LOAD_MODULE:
188             if (lptr->load_opt == NULL) {
189                 fprintf(cf, "\tLoad  \"%s\"", lptr->load_name);
190                 if (lptr->load_comment)
191                     fprintf(cf, "%s", lptr->load_comment);
192                 else
193                     fputc('\n', cf);
194             }
195             else {
196                 fprintf(cf, "\tSubSection \"%s\"\n", lptr->load_name);
197                 if (lptr->load_comment)
198                     fprintf(cf, "%s", lptr->load_comment);
199                 xf86printOptionList(cf, lptr->load_opt, 2);
200                 fprintf(cf, "\tEndSubSection\n");
201             }
202             break;
203         case XF86_LOAD_DRIVER:
204             fprintf(cf, "\tLoadDriver  \"%s\"", lptr->load_name);
205             if (lptr->load_comment)
206                 fprintf(cf, "%s", lptr->load_comment);
207             else
208                 fputc('\n', cf);
209             break;
210 #if 0
211         default:
212             fprintf(cf, "#\tUnknown type  \"%s\"\n", lptr->load_name);
213             break;
214 #endif
215         }
216     }
217 }
218 
219 XF86LoadPtr
xf86addNewLoadDirective(XF86LoadPtr head,const char * name,int type,XF86OptionPtr opts)220 xf86addNewLoadDirective(XF86LoadPtr head, const char *name, int type,
221                         XF86OptionPtr opts)
222 {
223     XF86LoadPtr new;
224     int token;
225 
226     new = calloc(1, sizeof(XF86LoadRec));
227     new->load_name = name;
228     new->load_type = type;
229     new->load_opt = opts;
230     new->ignore = 0;
231     new->list.next = NULL;
232 
233     if ((token = xf86getToken(NULL)) == COMMENT)
234         new->load_comment = xf86addComment(new->load_comment, xf86_lex_val.str);
235     else
236         xf86unGetToken(token);
237 
238     return ((XF86LoadPtr) xf86addListItem((glp) head, (glp) new));
239 }
240 
241 void
xf86freeModules(XF86ConfModulePtr ptr)242 xf86freeModules(XF86ConfModulePtr ptr)
243 {
244     XF86LoadPtr lptr;
245     XF86LoadPtr prev;
246 
247     if (ptr == NULL)
248         return;
249     lptr = ptr->mod_load_lst;
250     while (lptr) {
251         TestFree(lptr->load_name);
252         TestFree(lptr->load_comment);
253         prev = lptr;
254         lptr = lptr->list.next;
255         free(prev);
256     }
257     lptr = ptr->mod_disable_lst;
258     while (lptr) {
259         TestFree(lptr->load_name);
260         TestFree(lptr->load_comment);
261         prev = lptr;
262         lptr = lptr->list.next;
263         free(prev);
264     }
265     TestFree(ptr->mod_comment);
266     free(ptr);
267 }
268