XF86ConfMonitorPtr xf86parseMonitorSection (void) { int has_ident = FALSE; int token; parsePrologue (XF86ConfMonitorPtr, XF86ConfMonitorRec) while ((token = xf86getToken (MonitorTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->mon_comment = xf86addComment(ptr->mon_comment, val.str); break; case IDENTIFIER: if (xf86getSubToken (&(ptr->mon_comment)) != STRING) Error (QUOTE_MSG, "Identifier"); if (has_ident == TRUE) Error (MULTIPLE_MSG, "Identifier"); ptr->mon_identifier = xf86configStrdup(val.str); has_ident = TRUE; break; case VENDOR: if (xf86getSubToken (&(ptr->mon_comment)) != STRING) Error (QUOTE_MSG, "Vendor"); ptr->mon_vendor = xf86configStrdup(val.str); break; case MODEL: if (xf86getSubToken (&(ptr->mon_comment)) != STRING) Error (QUOTE_MSG, "ModelName"); ptr->mon_modelname = xf86configStrdup(val.str); break; case MODE: HANDLE_LIST (mon_modeline_lst, xf86parseVerboseMode, XF86ConfModeLinePtr); break; case MODELINE: HANDLE_LIST (mon_modeline_lst, xf86parseModeLine, XF86ConfModeLinePtr); break; case DISPLAYSIZE: if (xf86getSubToken (&(ptr->mon_comment)) != NUMBER) Error (DISPLAYSIZE_MSG, NULL); ptr->mon_width = val.realnum; if (xf86getSubToken (&(ptr->mon_comment)) != NUMBER) Error (DISPLAYSIZE_MSG, NULL); ptr->mon_height = val.realnum; break; case HORIZSYNC: if (xf86getSubToken (&(ptr->mon_comment)) != NUMBER) Error (HORIZSYNC_MSG, NULL); do { ptr->mon_hsync[ptr->mon_n_hsync].lo = val.realnum; switch (token = xf86getSubToken (&(ptr->mon_comment))) { case COMMA: ptr->mon_hsync[ptr->mon_n_hsync].hi = ptr->mon_hsync[ptr->mon_n_hsync].lo; break; case DASH: if (xf86getSubToken (&(ptr->mon_comment)) != NUMBER || (float)val.realnum < ptr->mon_hsync[ptr->mon_n_hsync].lo) Error (HORIZSYNC_MSG, NULL); ptr->mon_hsync[ptr->mon_n_hsync].hi = val.realnum; if ((token = xf86getSubToken (&(ptr->mon_comment))) == COMMA) break; ptr->mon_n_hsync++; goto HorizDone; default: /* We cannot currently know if a '\n' was found, * or this is a real error */ ptr->mon_hsync[ptr->mon_n_hsync].hi = ptr->mon_hsync[ptr->mon_n_hsync].lo; ptr->mon_n_hsync++; goto HorizDone; } if (ptr->mon_n_hsync >= CONF_MAX_HSYNC) Error ("Sorry. Too many horizontal sync intervals.", NULL); ptr->mon_n_hsync++; } while ((token = xf86getSubToken (&(ptr->mon_comment))) == NUMBER); HorizDone: xf86unGetToken (token); break; case VERTREFRESH: if (xf86getSubToken (&(ptr->mon_comment)) != NUMBER) Error (VERTREFRESH_MSG, NULL); do { ptr->mon_vrefresh[ptr->mon_n_vrefresh].lo = val.realnum; switch (token = xf86getSubToken (&(ptr->mon_comment))) { case COMMA: ptr->mon_vrefresh[ptr->mon_n_vrefresh].hi = ptr->mon_vrefresh[ptr->mon_n_vrefresh].lo; break; case DASH: if (xf86getSubToken (&(ptr->mon_comment)) != NUMBER || (float)val.realnum < ptr->mon_vrefresh[ptr->mon_n_vrefresh].lo) Error (VERTREFRESH_MSG, NULL); ptr->mon_vrefresh[ptr->mon_n_vrefresh].hi = val.realnum; if ((token = xf86getSubToken (&(ptr->mon_comment))) == COMMA) break; ptr->mon_n_vrefresh++; goto VertDone; default: /* We cannot currently know if a '\n' was found, * or this is a real error */ ptr->mon_vrefresh[ptr->mon_n_vrefresh].hi = ptr->mon_vrefresh[ptr->mon_n_vrefresh].lo; ptr->mon_n_vrefresh++; goto VertDone; } if (ptr->mon_n_vrefresh >= CONF_MAX_VREFRESH) Error ("Sorry. Too many vertical refresh intervals.", NULL); ptr->mon_n_vrefresh++; } while ((token = xf86getSubToken (&(ptr->mon_comment))) == NUMBER); VertDone: xf86unGetToken (token); break; case GAMMA: if( xf86getSubToken (&(ptr->mon_comment)) != NUMBER ) { Error (INVALID_GAMMA_MSG, NULL); } else { ptr->mon_gamma_red = ptr->mon_gamma_green = ptr->mon_gamma_blue = val.realnum; if( xf86getSubToken (&(ptr->mon_comment)) == NUMBER ) { ptr->mon_gamma_green = val.realnum; if( xf86getSubToken (&(ptr->mon_comment)) == NUMBER ) { ptr->mon_gamma_blue = val.realnum; } else { Error (INVALID_GAMMA_MSG, NULL); } } else xf86unGetToken (token); } break; case OPTION: ptr->mon_option_lst = xf86parseOption(ptr->mon_option_lst); break; case USEMODES: { XF86ConfModesLinkPtr mptr; if ((token = xf86getSubToken (&(ptr->mon_comment))) != STRING) Error (QUOTE_MSG, "UseModes"); /* add to the end of the list of modes sections referenced here */ mptr = xf86confcalloc (1, sizeof (XF86ConfModesLinkRec)); mptr->list.next = NULL; mptr->ml_modes_str = xf86configStrdup(val.str); mptr->ml_modes = NULL; ptr->mon_modes_sect_lst = (XF86ConfModesLinkPtr) xf86addListItem((GenericListPtr)ptr->mon_modes_sect_lst, (GenericListPtr)mptr); } break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: xf86parseError (INVALID_KEYWORD_MSG, xf86tokenString ()); CLEANUP (ptr); return NULL; } } if (!has_ident) Error (NO_IDENT_MSG, NULL); #ifdef DEBUG printf ("Monitor section parsed\n"); #endif return ptr; }
XF86ConfigPtr xf86parseConfigFile (XF86ConfigPtr ptr) { int token; if (!ptr) { if ((ptr = xf86confcalloc (1, sizeof (XF86ConfigRec))) == NULL) { return NULL; } memset (ptr, 0, sizeof (XF86ConfigRec)); } while ((token = xf86getToken (TopLevelTab)) != EOF_TOKEN) { switch (token) { case COMMENT: ptr->conf_comment = xf86addComment(ptr->conf_comment, val.str); break; case SECTION: if (xf86getSubToken (&(ptr->conf_comment)) != STRING) { xf86parseError (QUOTE_MSG, "Section"); CLEANUP (ptr); return (NULL); } xf86setSection (val.str); if (xf86nameCompare (val.str, "files") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_files_lst, xf86parseFilesSection, XF86ConfFilesPtr); } else if (xf86nameCompare (val.str, "serverflags") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_flags_lst, xf86parseFlagsSection, XF86ConfFlagsPtr); } else if (xf86nameCompare (val.str, "keyboard") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_input_lst, xf86parseKeyboardSection, XF86ConfInputPtr); } else if (xf86nameCompare (val.str, "pointer") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_input_lst, xf86parsePointerSection, XF86ConfInputPtr); } else if (xf86nameCompare (val.str, "videoadaptor") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_videoadaptor_lst, xf86parseVideoAdaptorSection, XF86ConfVideoAdaptorPtr); } else if (xf86nameCompare (val.str, "device") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_device_lst, xf86parseDeviceSection, XF86ConfDevicePtr); } else if (xf86nameCompare (val.str, "monitor") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_monitor_lst, xf86parseMonitorSection, XF86ConfMonitorPtr); } else if (xf86nameCompare (val.str, "modes") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_modes_lst, xf86parseModesSection, XF86ConfModesPtr); } else if (xf86nameCompare (val.str, "screen") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_screen_lst, xf86parseScreenSection, XF86ConfScreenPtr); } else if (xf86nameCompare(val.str, "inputdevice") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_input_lst, xf86parseInputSection, XF86ConfInputPtr); } else if (xf86nameCompare (val.str, "module") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_modules_lst, xf86parseModuleSection, XF86ConfModulePtr); } else if (xf86nameCompare (val.str, "serverlayout") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_layout_lst, xf86parseLayoutSection, XF86ConfLayoutPtr); } else if (xf86nameCompare (val.str, "vendor") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_vendor_lst, xf86parseVendorSection, XF86ConfVendorPtr); } else if (xf86nameCompare (val.str, "dri") == 0) { xf86conffree(val.str); val.str = NULL; HANDLE_LIST (conf_dri_lst, xf86parseDRISection, XF86ConfDRIPtr); } else { Error (INVALID_SECTION_MSG, xf86tokenString ()); xf86conffree(val.str); val.str = NULL; } break; default: Error (INVALID_KEYWORD_MSG, xf86tokenString ()); xf86conffree(val.str); val.str = NULL; } } return ptr; }
XF86ConfLayoutPtr xf86parseLayoutSection (void) { int has_ident = FALSE; int token; parsePrologue (XF86ConfLayoutPtr, XF86ConfLayoutRec) while ((token = xf86getToken (LayoutTab)) != ENDSECTION) { switch (token) { case COMMENT: ptr->lay_comment = xf86addComment(ptr->lay_comment, val.str); break; case IDENTIFIER: if (xf86getSubToken (&(ptr->lay_comment)) != STRING) Error (QUOTE_MSG, "Identifier"); if (has_ident == TRUE) Error (MULTIPLE_MSG, "Identifier"); ptr->lay_identifier = val.str; has_ident = TRUE; break; case INACTIVE: { XF86ConfInactivePtr iptr; iptr = xf86confcalloc (1, sizeof (XF86ConfInactiveRec)); iptr->list.next = NULL; if (xf86getSubToken (&(ptr->lay_comment)) != STRING) { xf86conffree (iptr); Error (INACTIVE_MSG, NULL); } iptr->inactive_device_str = val.str; ptr->lay_inactive_lst = (XF86ConfInactivePtr) xf86addListItem ((glp) ptr->lay_inactive_lst, (glp) iptr); } break; case SCREEN: { XF86ConfAdjacencyPtr aptr; int absKeyword = 0; aptr = xf86confcalloc (1, sizeof (XF86ConfAdjacencyRec)); aptr->list.next = NULL; aptr->adj_scrnum = -1; aptr->adj_where = CONF_ADJ_OBSOLETE; aptr->adj_x = 0; aptr->adj_y = 0; aptr->adj_refscreen = NULL; if ((token = xf86getSubToken (&(ptr->lay_comment))) == NUMBER) aptr->adj_scrnum = val.num; else xf86unGetToken (token); token = xf86getSubToken(&(ptr->lay_comment)); if (token != STRING) { xf86conffree(aptr); Error (SCREEN_MSG, NULL); } aptr->adj_screen_str = val.str; token = xf86getSubTokenWithTab(&(ptr->lay_comment), AdjTab); switch (token) { case RIGHTOF: aptr->adj_where = CONF_ADJ_RIGHTOF; break; case LEFTOF: aptr->adj_where = CONF_ADJ_LEFTOF; break; case ABOVE: aptr->adj_where = CONF_ADJ_ABOVE; break; case BELOW: aptr->adj_where = CONF_ADJ_BELOW; break; case RELATIVE: aptr->adj_where = CONF_ADJ_RELATIVE; break; case ABSOLUTE: aptr->adj_where = CONF_ADJ_ABSOLUTE; absKeyword = 1; break; case EOF_TOKEN: xf86conffree(aptr); Error (UNEXPECTED_EOF_MSG, NULL); break; default: xf86unGetToken (token); token = xf86getSubToken(&(ptr->lay_comment)); if (token == STRING) aptr->adj_where = CONF_ADJ_OBSOLETE; else aptr->adj_where = CONF_ADJ_ABSOLUTE; } switch (aptr->adj_where) { case CONF_ADJ_ABSOLUTE: if (absKeyword) token = xf86getSubToken(&(ptr->lay_comment)); if (token == NUMBER) { aptr->adj_x = val.num; token = xf86getSubToken(&(ptr->lay_comment)); if (token != NUMBER) { xf86conffree(aptr); Error(INVALID_SCR_MSG, NULL); } aptr->adj_y = val.num; } else { if (absKeyword) { xf86conffree(aptr); Error(INVALID_SCR_MSG, NULL); } else xf86unGetToken (token); } break; case CONF_ADJ_RIGHTOF: case CONF_ADJ_LEFTOF: case CONF_ADJ_ABOVE: case CONF_ADJ_BELOW: case CONF_ADJ_RELATIVE: token = xf86getSubToken(&(ptr->lay_comment)); if (token != STRING) { xf86conffree(aptr); Error(INVALID_SCR_MSG, NULL); } aptr->adj_refscreen = val.str; if (aptr->adj_where == CONF_ADJ_RELATIVE) { token = xf86getSubToken(&(ptr->lay_comment)); if (token != NUMBER) { xf86conffree(aptr); Error(INVALID_SCR_MSG, NULL); } aptr->adj_x = val.num; token = xf86getSubToken(&(ptr->lay_comment)); if (token != NUMBER) { xf86conffree(aptr); Error(INVALID_SCR_MSG, NULL); } aptr->adj_y = val.num; } break; case CONF_ADJ_OBSOLETE: /* top */ aptr->adj_top_str = val.str; /* bottom */ if (xf86getSubToken (&(ptr->lay_comment)) != STRING) { xf86conffree(aptr); Error (SCREEN_MSG, NULL); } aptr->adj_bottom_str = val.str; /* left */ if (xf86getSubToken (&(ptr->lay_comment)) != STRING) { xf86conffree(aptr); Error (SCREEN_MSG, NULL); } aptr->adj_left_str = val.str; /* right */ if (xf86getSubToken (&(ptr->lay_comment)) != STRING) { xf86conffree(aptr); Error (SCREEN_MSG, NULL); } aptr->adj_right_str = val.str; } ptr->lay_adjacency_lst = (XF86ConfAdjacencyPtr) xf86addListItem ((glp) ptr->lay_adjacency_lst, (glp) aptr); } break; case INPUTDEVICE: { XF86ConfInputrefPtr iptr; iptr = xf86confcalloc (1, sizeof (XF86ConfInputrefRec)); iptr->list.next = NULL; iptr->iref_option_lst = NULL; if (xf86getSubToken (&(ptr->lay_comment)) != STRING) { xf86conffree(iptr); Error (INPUTDEV_MSG, NULL); } iptr->iref_inputdev_str = val.str; while ((token = xf86getSubToken (&(ptr->lay_comment))) == STRING) { iptr->iref_option_lst = xf86addNewOption (iptr->iref_option_lst, val.str, NULL); } xf86unGetToken (token); ptr->lay_input_lst = (XF86ConfInputrefPtr) xf86addListItem ((glp) ptr->lay_input_lst, (glp) iptr); } break; case OPTION: ptr->lay_option_lst = xf86parseOption(ptr->lay_option_lst); break; case EOF_TOKEN: Error (UNEXPECTED_EOF_MSG, NULL); break; default: Error (INVALID_KEYWORD_MSG, xf86tokenString ()); break; } } if (!has_ident) Error (NO_IDENT_MSG, NULL); #ifdef DEBUG printf ("Layout section parsed\n"); #endif return ptr; }