Files.c revision 58cf2af7
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 const 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            free(xf86_lex_val.str);
93            xf86_lex_val.str = NULL;
94            break;
95        case FONTPATH:
96            if (xf86getSubToken(&(ptr->file_comment)) != STRING)
97                Error(QUOTE_MSG, "FontPath");
98            j = FALSE;
99            str = xf86_lex_val.str;
100            if (ptr->file_fontpath == NULL) {
101                ptr->file_fontpath = calloc(1, 1);
102                i = strlen(str) + 1;
103            }
104            else {
105                i = strlen(ptr->file_fontpath) + strlen(str) + 1;
106                if (ptr->file_fontpath[strlen(ptr->file_fontpath) - 1] != ',') {
107                    i++;
108                    j = TRUE;
109                }
110            }
111            ptr->file_fontpath = realloc(ptr->file_fontpath, i);
112            if (j)
113                strcat(ptr->file_fontpath, ",");
114
115            strcat(ptr->file_fontpath, str);
116            free(xf86_lex_val.str);
117            break;
118        case MODULEPATH:
119            if (xf86getSubToken(&(ptr->file_comment)) != STRING)
120                Error(QUOTE_MSG, "ModulePath");
121            l = FALSE;
122            str = xf86_lex_val.str;
123            if (ptr->file_modulepath == NULL) {
124                ptr->file_modulepath = malloc(1);
125                ptr->file_modulepath[0] = '\0';
126                k = strlen(str) + 1;
127            }
128            else {
129                k = strlen(ptr->file_modulepath) + strlen(str) + 1;
130                if (ptr->file_modulepath[strlen(ptr->file_modulepath) - 1] !=
131                    ',') {
132                    k++;
133                    l = TRUE;
134                }
135            }
136            ptr->file_modulepath = realloc(ptr->file_modulepath, k);
137            if (l)
138                strcat(ptr->file_modulepath, ",");
139
140            strcat(ptr->file_modulepath, str);
141            free(xf86_lex_val.str);
142            break;
143        case LOGFILEPATH:
144            if (xf86getSubToken(&(ptr->file_comment)) != STRING)
145                Error(QUOTE_MSG, "LogFile");
146            ptr->file_logfile = xf86_lex_val.str;
147            break;
148        case XKBDIR:
149            if (xf86getSubToken(&(ptr->file_xkbdir)) != STRING)
150                Error(QUOTE_MSG, "XkbDir");
151            ptr->file_xkbdir = xf86_lex_val.str;
152            break;
153        case EOF_TOKEN:
154            Error(UNEXPECTED_EOF_MSG);
155            break;
156        case OBSOLETE_TOKEN:
157            xf86parseError(OBSOLETE_MSG, xf86tokenString());
158            xf86getSubToken(&(ptr->file_comment));
159            break;
160        default:
161            Error(INVALID_KEYWORD_MSG, xf86tokenString());
162            break;
163        }
164    }
165
166#ifdef DEBUG
167    printf("File section parsed\n");
168#endif
169
170    return ptr;
171}
172
173#undef CLEANUP
174
175void
176xf86printFileSection(FILE * cf, XF86ConfFilesPtr ptr)
177{
178    char *p, *s;
179
180    if (ptr == NULL)
181        return;
182
183    if (ptr->file_comment)
184        fprintf(cf, "%s", ptr->file_comment);
185    if (ptr->file_logfile)
186        fprintf(cf, "\tLogFile      \"%s\"\n", ptr->file_logfile);
187    if (ptr->file_modulepath) {
188        s = ptr->file_modulepath;
189        p = index(s, ',');
190        while (p) {
191            *p = '\000';
192            fprintf(cf, "\tModulePath   \"%s\"\n", s);
193            *p = ',';
194            s = p;
195            s++;
196            p = index(s, ',');
197        }
198        fprintf(cf, "\tModulePath   \"%s\"\n", s);
199    }
200    if (ptr->file_fontpath) {
201        s = ptr->file_fontpath;
202        p = index(s, ',');
203        while (p) {
204            *p = '\000';
205            fprintf(cf, "\tFontPath     \"%s\"\n", s);
206            *p = ',';
207            s = p;
208            s++;
209            p = index(s, ',');
210        }
211        fprintf(cf, "\tFontPath     \"%s\"\n", s);
212    }
213    if (ptr->file_xkbdir)
214        fprintf(cf, "\tXkbDir		\"%s\"\n", ptr->file_xkbdir);
215}
216
217void
218xf86freeFiles(XF86ConfFilesPtr p)
219{
220    if (p == NULL)
221        return;
222
223    TestFree(p->file_logfile);
224    TestFree(p->file_modulepath);
225    TestFree(p->file_fontpath);
226    TestFree(p->file_comment);
227    TestFree(p->file_xkbdir);
228
229    free(p);
230}
231