diff options
Diffstat (limited to 'src/XF86Config-parser/DRI.c')
-rw-r--r-- | src/XF86Config-parser/DRI.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/XF86Config-parser/DRI.c b/src/XF86Config-parser/DRI.c new file mode 100644 index 0000000..9936830 --- /dev/null +++ b/src/XF86Config-parser/DRI.c @@ -0,0 +1,152 @@ +/* DRI.c -- DRI Section in XF86Config file + * Created: Fri Mar 19 08:40:22 1999 by faith@precisioninsight.com + * Revised: Thu Jun 17 16:08:05 1999 by faith@precisioninsight.com + * + * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#include "xf86Parser.h" +#include "xf86tokens.h" +#include "Configint.h" + +extern LexRec val; + +static XConfigSymTabRec DRITab[] = +{ + {ENDSECTION, "endsection"}, + {GROUP, "group"}, + {BUFFERS, "buffers"}, + {MODE, "mode"}, + {-1, ""}, +}; + +#define CLEANUP xconfigFreeBuffersList + +XConfigBuffersPtr +xconfigParseBuffers (void) +{ + int token; + PARSE_PROLOGUE (XConfigBuffersPtr, XConfigBuffersRec) + + if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) + Error("Buffers count expected", NULL); + ptr->count = val.num; + + if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) + Error("Buffers size expected", NULL); + ptr->size = val.num; + + if ((token = xconfigGetSubToken (&(ptr->comment))) == STRING) { + ptr->flags = val.str; + if ((token = xconfigGetToken (NULL)) == COMMENT) + ptr->comment = xconfigAddComment(ptr->comment, val.str); + else + xconfigUnGetToken(token); + } + + return ptr; +} + +#undef CLEANUP + +#define CLEANUP xconfigFreeDRI + +XConfigDRIPtr +xconfigParseDRISection (void) +{ + int token; + PARSE_PROLOGUE (XConfigDRIPtr, XConfigDRIRec); + + /* Zero is a valid value for this. */ + ptr->group = -1; + while ((token = xconfigGetToken (DRITab)) != ENDSECTION) { + switch (token) + { + case GROUP: + if ((token = xconfigGetSubToken (&(ptr->comment))) == STRING) + ptr->group_name = val.str; + else if (token == NUMBER) + ptr->group = val.num; + else + Error (GROUP_MSG, NULL); + break; + case MODE: + if (xconfigGetSubToken (&(ptr->comment)) != NUMBER) + Error (NUMBER_MSG, "Mode"); + ptr->mode = val.num; + break; + case BUFFERS: + HANDLE_LIST (buffers, xconfigParseBuffers, + XConfigBuffersPtr); + break; + case EOF_TOKEN: + Error (UNEXPECTED_EOF_MSG, NULL); + break; + case COMMENT: + ptr->comment = xconfigAddComment(ptr->comment, val.str); + break; + default: + Error (INVALID_KEYWORD_MSG, xconfigTokenString ()); + break; + } + } + + return ptr; +} + +#undef CLEANUP + +void +xconfigPrintDRISection (FILE * cf, XConfigDRIPtr ptr) +{ + /* we never need the DRI section for the NVIDIA driver */ + + return; +} + +void +xconfigFreeDRI (XConfigDRIPtr ptr) +{ + if (ptr == NULL) + return; + + xconfigFreeBuffersList (ptr->buffers); + TEST_FREE (ptr->comment); + free (ptr); +} + +void +xconfigFreeBuffersList (XConfigBuffersPtr ptr) +{ + XConfigBuffersPtr prev; + + while (ptr) { + TEST_FREE (ptr->flags); + TEST_FREE (ptr->comment); + prev = ptr; + ptr = ptr->next; + free (prev); + } +} + |