105b261ecSmrg/* DRI.c -- DRI Section in XF86Config file
205b261ecSmrg * Created: Fri Mar 19 08:40:22 1999 by faith@precisioninsight.com
305b261ecSmrg * Revised: Thu Jun 17 16:08:05 1999 by faith@precisioninsight.com
405b261ecSmrg *
505b261ecSmrg * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
605b261ecSmrg * All Rights Reserved.
705b261ecSmrg *
805b261ecSmrg * Permission is hereby granted, free of charge, to any person obtaining a
905b261ecSmrg * copy of this software and associated documentation files (the "Software"),
1005b261ecSmrg * to deal in the Software without restriction, including without limitation
1105b261ecSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1205b261ecSmrg * and/or sell copies of the Software, and to permit persons to whom the
1305b261ecSmrg * Software is furnished to do so, subject to the following conditions:
1435c4bbdfSmrg *
1505b261ecSmrg * The above copyright notice and this permission notice (including the next
1605b261ecSmrg * paragraph) shall be included in all copies or substantial portions of the
1705b261ecSmrg * Software.
1835c4bbdfSmrg *
1905b261ecSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2005b261ecSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2105b261ecSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
2205b261ecSmrg * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
2305b261ecSmrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
2405b261ecSmrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2505b261ecSmrg * DEALINGS IN THE SOFTWARE.
2635c4bbdfSmrg *
2735c4bbdfSmrg *
2805b261ecSmrg */
2905b261ecSmrg
3005b261ecSmrg#ifdef HAVE_XORG_CONFIG_H
3105b261ecSmrg#include <xorg-config.h>
3205b261ecSmrg#endif
3305b261ecSmrg
3435c4bbdfSmrg#include "os.h"
3505b261ecSmrg#include "xf86Parser.h"
3605b261ecSmrg#include "xf86tokens.h"
3705b261ecSmrg#include "Configint.h"
3805b261ecSmrg
3905b261ecSmrg
401b5d61b8Smrgstatic const xf86ConfigSymTabRec DRITab[] = {
4105b261ecSmrg    {ENDSECTION, "endsection"},
4235c4bbdfSmrg    {GROUP, "group"},
4335c4bbdfSmrg    {MODE, "mode"},
4435c4bbdfSmrg    {-1, ""},
4505b261ecSmrg};
4605b261ecSmrg
4705b261ecSmrg#define CLEANUP xf86freeDRI
4805b261ecSmrg
4905b261ecSmrgXF86ConfDRIPtr
5035c4bbdfSmrgxf86parseDRISection(void)
5105b261ecSmrg{
5205b261ecSmrg    int token;
5335c4bbdfSmrg
5435c4bbdfSmrg    parsePrologue(XF86ConfDRIPtr, XF86ConfDRIRec);
5505b261ecSmrg
5605b261ecSmrg    /* Zero is a valid value for this. */
5705b261ecSmrg    ptr->dri_group = -1;
5835c4bbdfSmrg    while ((token = xf86getToken(DRITab)) != ENDSECTION) {
5935c4bbdfSmrg        switch (token) {
6035c4bbdfSmrg        case GROUP:
6135c4bbdfSmrg            if ((token = xf86getSubToken(&(ptr->dri_comment))) == STRING)
6235c4bbdfSmrg                ptr->dri_group_name = xf86_lex_val.str;
6335c4bbdfSmrg            else if (token == NUMBER)
6435c4bbdfSmrg                ptr->dri_group = xf86_lex_val.num;
6535c4bbdfSmrg            else
6635c4bbdfSmrg                Error(GROUP_MSG);
6735c4bbdfSmrg            break;
6835c4bbdfSmrg        case MODE:
6935c4bbdfSmrg            if (xf86getSubToken(&(ptr->dri_comment)) != NUMBER)
7035c4bbdfSmrg                Error(NUMBER_MSG, "Mode");
7135c4bbdfSmrg            if (xf86_lex_val.numType != PARSE_OCTAL)
7235c4bbdfSmrg                Error(MUST_BE_OCTAL_MSG, xf86_lex_val.num);
7335c4bbdfSmrg            ptr->dri_mode = xf86_lex_val.num;
7435c4bbdfSmrg            break;
7535c4bbdfSmrg        case EOF_TOKEN:
7635c4bbdfSmrg            Error(UNEXPECTED_EOF_MSG);
7735c4bbdfSmrg            break;
7835c4bbdfSmrg        case COMMENT:
7935c4bbdfSmrg            ptr->dri_comment = xf86addComment(ptr->dri_comment, xf86_lex_val.str);
8058cf2af7Smrg            free(xf86_lex_val.str);
8158cf2af7Smrg            xf86_lex_val.str = NULL;
8235c4bbdfSmrg            break;
8335c4bbdfSmrg        default:
8435c4bbdfSmrg            Error(INVALID_KEYWORD_MSG, xf86tokenString());
8535c4bbdfSmrg            break;
8635c4bbdfSmrg        }
8705b261ecSmrg    }
8835c4bbdfSmrg
8905b261ecSmrg#ifdef DEBUG
9005b261ecSmrg    ErrorF("DRI section parsed\n");
9105b261ecSmrg#endif
9235c4bbdfSmrg
9305b261ecSmrg    return ptr;
9405b261ecSmrg}
9505b261ecSmrg
9605b261ecSmrg#undef CLEANUP
9705b261ecSmrg
9805b261ecSmrgvoid
9935c4bbdfSmrgxf86printDRISection(FILE * cf, XF86ConfDRIPtr ptr)
10005b261ecSmrg{
10105b261ecSmrg    if (ptr == NULL)
10235c4bbdfSmrg        return;
10335c4bbdfSmrg
10435c4bbdfSmrg    fprintf(cf, "Section \"DRI\"\n");
10505b261ecSmrg    if (ptr->dri_comment)
10635c4bbdfSmrg        fprintf(cf, "%s", ptr->dri_comment);
10705b261ecSmrg    if (ptr->dri_group_name)
10835c4bbdfSmrg        fprintf(cf, "\tGroup        \"%s\"\n", ptr->dri_group_name);
10905b261ecSmrg    else if (ptr->dri_group >= 0)
11035c4bbdfSmrg        fprintf(cf, "\tGroup        %d\n", ptr->dri_group);
11105b261ecSmrg    if (ptr->dri_mode)
11235c4bbdfSmrg        fprintf(cf, "\tMode         0%o\n", ptr->dri_mode);
11335c4bbdfSmrg    fprintf(cf, "EndSection\n\n");
11405b261ecSmrg}
11505b261ecSmrg
11605b261ecSmrgvoid
11735c4bbdfSmrgxf86freeDRI(XF86ConfDRIPtr ptr)
11805b261ecSmrg{
11905b261ecSmrg    if (ptr == NULL)
12035c4bbdfSmrg        return;
12135c4bbdfSmrg
12235c4bbdfSmrg    TestFree(ptr->dri_comment);
12335c4bbdfSmrg    free(ptr);
12405b261ecSmrg}
125