#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include <X11/Xos.h>
#include "xf86Parser.h"
#include "xf86tokens.h"
#include "Configint.h"
extern LexRec val;
static xf86ConfigSymTabRec FilesTab[] =
{
{ENDSECTION, "endsection"},
{FONTPATH, "fontpath"},
{MODULEPATH, "modulepath"},
{INPUTDEVICES, "inputdevices"},
{LOGFILEPATH, "logfile"},
{XKBDIR, "xkbdir"},
{OBSOLETE_TOKEN, "rgbpath"},
{-1, ""},
};
#define CLEANUP xf86freeFiles
XF86ConfFilesPtr
xf86parseFilesSection (void)
{
int i, j;
int k, l;
char *str;
int token;
parsePrologue (XF86ConfFilesPtr, XF86ConfFilesRec)
while ((token = xf86getToken (FilesTab)) != ENDSECTION)
{
switch (token)
{
case COMMENT:
ptr->file_comment = xf86addComment(ptr->file_comment, val.str);
break;
case FONTPATH:
if (xf86getSubToken (&(ptr->file_comment)) != STRING)
Error (QUOTE_MSG, "FontPath");
j = FALSE;
str = val.str;
if (ptr->file_fontpath == NULL)
{
ptr->file_fontpath = xf86confmalloc (1);
ptr->file_fontpath[0] = '\0';
i = strlen (str) + 1;
}
else
{
i = strlen (ptr->file_fontpath) + strlen (str) + 1;
if (ptr->file_fontpath[strlen (ptr->file_fontpath) - 1] != ',')
{
i++;
j = TRUE;
}
}
ptr->file_fontpath =
xf86confrealloc (ptr->file_fontpath, i);
if (j)
strcat (ptr->file_fontpath, ",");
strcat (ptr->file_fontpath, str);
xf86conffree (val.str);
break;
case MODULEPATH:
if (xf86getSubToken (&(ptr->file_comment)) != STRING)
Error (QUOTE_MSG, "ModulePath");
l = FALSE;
str = val.str;
if (ptr->file_modulepath == NULL)
{
ptr->file_modulepath = xf86confmalloc (1);
ptr->file_modulepath[0] = '\0';
k = strlen (str) + 1;
}
else
{
k = strlen (ptr->file_modulepath) + strlen (str) + 1;
if (ptr->file_modulepath[strlen (ptr->file_modulepath) - 1] != ',')
{
k++;
l = TRUE;
}
}
ptr->file_modulepath = xf86confrealloc (ptr->file_modulepath, k);
if (l)
strcat (ptr->file_modulepath, ",");
strcat (ptr->file_modulepath, str);
xf86conffree (val.str);
break;
case INPUTDEVICES:
if (xf86getSubToken (&(ptr->file_comment)) != STRING)
Error (QUOTE_MSG, "InputDevices");
l = FALSE;
str = val.str;
if (ptr->file_inputdevs == NULL)
{
ptr->file_inputdevs = xf86confmalloc (1);
ptr->file_inputdevs[0] = '\0';
k = strlen (str) + 1;
}
else
{
k = strlen (ptr->file_inputdevs) + strlen (str) + 1;
if (ptr->file_inputdevs[strlen (ptr->file_inputdevs) - 1] != ',')
{
k++;
l = TRUE;
}
}
ptr->file_inputdevs = xf86confrealloc (ptr->file_inputdevs, k);
if (l)
strcat (ptr->file_inputdevs, ",");
strcat (ptr->file_inputdevs, str);
xf86conffree (val.str);
break;
case LOGFILEPATH:
if (xf86getSubToken (&(ptr->file_comment)) != STRING)
Error (QUOTE_MSG, "LogFile");
ptr->file_logfile = val.str;
break;
case XKBDIR:
if (xf86getSubToken (&(ptr->file_xkbdir)) != STRING)
Error (QUOTE_MSG, "XkbDir");
ptr->file_xkbdir = val.str;
break;
case EOF_TOKEN:
Error (UNEXPECTED_EOF_MSG, NULL);
break;
case OBSOLETE_TOKEN:
xf86parseError (OBSOLETE_MSG, xf86tokenString ());
xf86getSubToken (&(ptr->file_comment));
break;
default:
Error (INVALID_KEYWORD_MSG, xf86tokenString ());
break;
}
}
#ifdef DEBUG
printf ("File section parsed\n");
#endif
return ptr;
}
#undef CLEANUP
void
xf86printFileSection (FILE * cf, XF86ConfFilesPtr ptr)
{
char *p, *s;
if (ptr == NULL)
return;
if (ptr->file_comment)
fprintf (cf, "%s", ptr->file_comment);
if (ptr->file_logfile)
fprintf (cf, "\tLogFile \"%s\"\n", ptr->file_logfile);
if (ptr->file_modulepath)
{
s = ptr->file_modulepath;
p = index (s, ',');
while (p)
{
*p = '\000';
fprintf (cf, "\tModulePath \"%s\"\n", s);
*p = ',';
s = p;
s++;
p = index (s, ',');
}
fprintf (cf, "\tModulePath \"%s\"\n", s);
}
if (ptr->file_inputdevs)
{
s = ptr->file_inputdevs;
p = index (s, ',');
while (p)
{
*p = '\000';
fprintf (cf, "\tInputDevices \"%s\"\n", s);
*p = ',';
s = p;
s++;
p = index (s, ',');
}
fprintf (cf, "\tInputDevices \"%s\"\n", s);
}
if (ptr->file_fontpath)
{
s = ptr->file_fontpath;
p = index (s, ',');
while (p)
{
*p = '\000';
fprintf (cf, "\tFontPath \"%s\"\n", s);
*p = ',';
s = p;
s++;
p = index (s, ',');
}
fprintf (cf, "\tFontPath \"%s\"\n", s);
}
if (ptr->file_xkbdir)
fprintf (cf, "\tXkbDir \"%s\"\n", ptr->file_xkbdir);
}
void
xf86freeFiles (XF86ConfFilesPtr p)
{
if (p == NULL)
return;
TestFree (p->file_logfile);
TestFree (p->file_modulepath);
TestFree (p->file_inputdevs);
TestFree (p->file_fontpath);
TestFree (p->file_comment);
TestFree (p->file_xkbdir);
xf86conffree (p);
}