Files.c revision 35c4bbdf
1/*
2 * Copyright (c) 1997  Metro Link Incorporated
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17 * THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 * SOFTWARE.
21 *
22 * Except as contained in this notice, the name of the Metro Link shall not be
23 * used in advertising or otherwise to promote the sale, use or other dealings
24 * in this Software without prior written authorization from Metro Link.
25 *
26 */
27/*
28 * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
29 *
30 * Permission is hereby granted, free of charge, to any person obtaining a
31 * copy of this software and associated documentation files (the "Software"),
32 * to deal in the Software without restriction, including without limitation
33 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
34 * and/or sell copies of the Software, and to permit persons to whom the
35 * Software is furnished to do so, subject to the following conditions:
36 *
37 * The above copyright notice and this permission notice shall be included in
38 * all copies or substantial portions of the Software.
39 *
40 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
41 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
42 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
43 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
44 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
45 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
46 * OTHER DEALINGS IN THE SOFTWARE.
47 *
48 * Except as contained in this notice, the name of the copyright holder(s)
49 * and author(s) shall not be used in advertising or otherwise to promote
50 * the sale, use or other dealings in this Software without prior written
51 * authorization from the copyright holder(s) and author(s).
52 */
53
54#ifdef HAVE_XORG_CONFIG_H
55#include <xorg-config.h>
56#endif
57
58#include <X11/Xos.h>
59#include "xf86Parser.h"
60#include "xf86tokens.h"
61#include "Configint.h"
62
63
64static xf86ConfigSymTabRec FilesTab[] = {
65    {ENDSECTION, "endsection"},
66    {FONTPATH, "fontpath"},
67    {MODULEPATH, "modulepath"},
68    {LOGFILEPATH, "logfile"},
69    {XKBDIR, "xkbdir"},
70    /* Obsolete keywords that aren't used but shouldn't cause errors: */
71    {OBSOLETE_TOKEN, "rgbpath"},
72    {OBSOLETE_TOKEN, "inputdevices"},
73    {-1, ""},
74};
75
76#define CLEANUP xf86freeFiles
77
78XF86ConfFilesPtr
79xf86parseFilesSection(void)
80{
81    int i, j;
82    int k, l;
83    char *str;
84    int token;
85
86    parsePrologue(XF86ConfFilesPtr, XF86ConfFilesRec)
87
88        while ((token = xf86getToken(FilesTab)) != ENDSECTION) {
89        switch (token) {
90        case COMMENT:
91            ptr->file_comment = xf86addComment(ptr->file_comment, xf86_lex_val.str);
92            break;
93        case FONTPATH:
94            if (xf86getSubToken(&(ptr->file_comment)) != STRING)
95                Error(QUOTE_MSG, "FontPath");
96            j = FALSE;
97            str = xf86_lex_val.str;
98            if (ptr->file_fontpath == NULL) {
99                ptr->file_fontpath = calloc(1, 1);
100                i = strlen(str) + 1;
101            }
102            else {
103                i = strlen(ptr->file_fontpath) + strlen(str) + 1;
104                if (ptr->file_fontpath[strlen(ptr->file_fontpath) - 1] != ',') {
105                    i++;
106                    j = TRUE;
107                }
108            }
109            ptr->file_fontpath = realloc(ptr->file_fontpath, i);
110            if (j)
111                strcat(ptr->file_fontpath, ",");
112
113            strcat(ptr->file_fontpath, str);
114            free(xf86_lex_val.str);
115            break;
116        case MODULEPATH:
117            if (xf86getSubToken(&(ptr->file_comment)) != STRING)
118                Error(QUOTE_MSG, "ModulePath");
119            l = FALSE;
120            str = xf86_lex_val.str;
121            if (ptr->file_modulepath == NULL) {
122                ptr->file_modulepath = malloc(1);
123                ptr->file_modulepath[0] = '\0';
124                k = strlen(str) + 1;
125            }
126            else {
127                k = strlen(ptr->file_modulepath) + strlen(str) + 1;
128                if (ptr->file_modulepath[strlen(ptr->file_modulepath) - 1] !=
129                    ',') {
130                    k++;
131                    l = TRUE;
132                }
133            }
134            ptr->file_modulepath = realloc(ptr->file_modulepath, k);
135            if (l)
136                strcat(ptr->file_modulepath, ",");
137
138            strcat(ptr->file_modulepath, str);
139            free(xf86_lex_val.str);
140            break;
141        case LOGFILEPATH:
142            if (xf86getSubToken(&(ptr->file_comment)) != STRING)
143                Error(QUOTE_MSG, "LogFile");
144            ptr->file_logfile = xf86_lex_val.str;
145            break;
146        case XKBDIR:
147            if (xf86getSubToken(&(ptr->file_xkbdir)) != STRING)
148                Error(QUOTE_MSG, "XkbDir");
149            ptr->file_xkbdir = xf86_lex_val.str;
150            break;
151        case EOF_TOKEN:
152            Error(UNEXPECTED_EOF_MSG);
153            break;
154        case OBSOLETE_TOKEN:
155            xf86parseError(OBSOLETE_MSG, xf86tokenString());
156            xf86getSubToken(&(ptr->file_comment));
157            break;
158        default:
159            Error(INVALID_KEYWORD_MSG, xf86tokenString());
160            break;
161        }
162    }
163
164#ifdef DEBUG
165    printf("File section parsed\n");
166#endif
167
168    return ptr;
169}
170
171#undef CLEANUP
172
173void
174xf86printFileSection(FILE * cf, XF86ConfFilesPtr ptr)
175{
176    char *p, *s;
177
178    if (ptr == NULL)
179        return;
180
181    if (ptr->file_comment)
182        fprintf(cf, "%s", ptr->file_comment);
183    if (ptr->file_logfile)
184        fprintf(cf, "\tLogFile      \"%s\"\n", ptr->file_logfile);
185    if (ptr->file_modulepath) {
186        s = ptr->file_modulepath;
187        p = index(s, ',');
188        while (p) {
189            *p = '\000';
190            fprintf(cf, "\tModulePath   \"%s\"\n", s);
191            *p = ',';
192            s = p;
193            s++;
194            p = index(s, ',');
195        }
196        fprintf(cf, "\tModulePath   \"%s\"\n", s);
197    }
198    if (ptr->file_fontpath) {
199        s = ptr->file_fontpath;
200        p = index(s, ',');
201        while (p) {
202            *p = '\000';
203            fprintf(cf, "\tFontPath     \"%s\"\n", s);
204            *p = ',';
205            s = p;
206            s++;
207            p = index(s, ',');
208        }
209        fprintf(cf, "\tFontPath     \"%s\"\n", s);
210    }
211    if (ptr->file_xkbdir)
212        fprintf(cf, "\tXkbDir		\"%s\"\n", ptr->file_xkbdir);
213}
214
215void
216xf86freeFiles(XF86ConfFilesPtr p)
217{
218    if (p == NULL)
219        return;
220
221    TestFree(p->file_logfile);
222    TestFree(p->file_modulepath);
223    TestFree(p->file_fontpath);
224    TestFree(p->file_comment);
225    TestFree(p->file_xkbdir);
226
227    free(p);
228}
229