xf86dcconf.c
来自「基于组件方式开发操作系统的OSKIT源代码」· C语言 代码 · 共 311 行
C
311 行
/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86DCConf.c,v 3.2 1997/01/05 11:58:05 dawes Exp $ */#ifndef X_NOT_STDC_ENV#include <stdlib.h>#elseextern double atof();#endif#include "X.h"#include "Xproto.h"#include "Xmd.h"#ifndef OSKIT#include "input.h"#include "servermd.h"#endif /* !OSKIT */#include "scrnintstr.h"#include "compiler.h"#include "xf86Procs.h"#include "xf86_OSlib.h"#include "xf86.h"#include "xf86_Config.h"#define DCConfig#include "xf86DCConf.h"static char *configPath;static char *configBuf;static char *configRBuf;static int configStart, configPos, configLineNo ;#define CONFIG_BUF_LEN 1024/* * 3 functions to aid the drivers interpreting the driver config * areas. xf86DCGetToken() works the same way as xf86GetToken(). * It has to be called by the device driver with three arguments: * 1. a pointer to the area containing the config strings, * 2. a table containing the tokens recognized by the driver, * 3. a table containing the tokens for the specific section which * have already been interpreted in xf86Config.c. * XF86DCGetOption() will return a pointer of type OFlagSet. All the * Flags contained in pointer and specified in tab will be set. * Both functions will free the memory areas pointed to by pointer * when end mark (EOF) is encountered. * xf86DCConfigError() replaces xf86ConfigError(). */intxf86DCGetToken(Pointer, tab, otab)char* Pointer;SymTabRec tab[];SymTabRec otab[];{ int c, i; static int pos = 0; char *currpointer; char dummy ='\0'; int token = 0; Bool err = FALSE; if(Pointer == NULL) return(EOF); if(!pos){ /* first time: initialize */ configPath = Pointer; pos = strlen(configPath) + 1; DCpushToken = LOCK_TOKEN; configRBuf = (char*)xalloc(CONFIG_BUF_LEN); configPos = 0; /* reset counter */ configBuf = &dummy; /* invalidize buffer */ } /* * Our strategy is simple: find next token, see if we have a token * already interpreted in xf86Config if yes ignore it as well as * any subsequent STRING, NUMBER, DASH, COMMA tokens until we encounter * a new token. */ do{ token = 0; if (DCpushToken == EOF) return(EOF); /* handle EOF */ else if (DCpushToken == LOCK_TOKEN) /* handle push token */ { c = configBuf[configPos]; do { /* get next token */ if (!c) { currpointer = Pointer + pos; /* locate current position */ if(* currpointer == EOF){ /* handle EOF */ xfree(Pointer); xfree(configRBuf); pos = 0; return( DCpushToken = EOF ); } memcpy(&configLineNo, currpointer, sizeof(int)); currpointer += sizeof(int); pos += (sizeof(int) + strlen(currpointer) + 1); configBuf = currpointer; /* copy line */ configStart = configPos = 0;#ifdef DEBUG ErrorF("line: %i: %s",configLineNo,configBuf);#endif }#ifndef __EMX__ while (((c=configBuf[configPos++])==' ') || ( c=='\t') || ( c=='\n'));#else while (((c=configBuf[configPos++])==' ') || ( c=='\t') || ( c=='\n') || (c=='\r'));#endif if (c == '#') c = '\0'; /* ignore comments */ } while (!c); /* handle '-' and ',' */ if ( (c == ',') && !isalpha(configBuf[configPos]) ) { configStart = configPos; token = COMMA; } else if ( (c == '-') && !isalpha(configBuf[configPos]) ) { configStart = configPos; token = DASH; } else { configStart = configPos; if (isdigit(c)) /* Numbers */ { int base; if (c == '0') if ((configBuf[configPos] == 'x') || (configBuf[configPos] == 'X')) base = 16; else base = 8; else base = 10; configRBuf[0] = c; i = 1; while (isdigit(c = configBuf[configPos++]) || (c == '.') || (c == 'x') || ((base == 16) && (((c >= 'a') && (c <= 'f')) || ((c >= 'A') && (c <= 'F'))))) configRBuf[i++] = c; configPos--; /* GJA -- one too far */ configRBuf[i] = '\0'; DCval.num = StrToUL(configRBuf); DCval.realnum = atof(configRBuf); token = NUMBER; } else if (c == '\"') /* Strings */ { i = -1; do { configRBuf[++i] = (c = configBuf[configPos++]);#ifndef __EMX__ } while ((c != '\"') && (c != '\n') && (c != '\0'));#else } while ((c != '\"') && (c != '\n') && (c != '\r') && (c != '\0'));#endif configRBuf[i] = '\0'; DCval.str = (char *)xalloc(strlen(configRBuf) + 1); strcpy(DCval.str, configRBuf); /* private copy ! */ token = STRING; } else { /* ... and now we MUST have a valid token. */ configRBuf[0] = c; i = 0; do { configRBuf[++i] = (c = configBuf[configPos++]);;#ifndef __EMX__ } while ((c != ' ') && (c != '\t') && (c != '\n') && (c != '\0'));#else } while ((c != ' ') && (c != '\t') && (c != '\n') && (c != '\r') && (c != '\0') );#endif configRBuf[i] = '\0'; i=0; } } } else { /* pushed tokens */ int temp = DCpushToken; DCpushToken = LOCK_TOKEN; if (temp == COMMA || temp == DASH) { token = temp; } else if (temp == NUMBER || temp == STRING) { token = temp; } } /* look up tokens */ if (tab && !token) /* see if token is in tab */ { i = 0; while (tab[i].token != -1) if (StrCaseCmp(configRBuf,tab[i].name) == 0){ token = tab[i].token; err = FALSE; /* ok, this is a valid token */ break; } else i++; }/* we got a token _and_ it isn't a STRING, NUMBER, DASH, COMMA * following a otab[] token */if(!err && token){#ifdef DEBUG switch(token){ case DASH: ErrorF("Token: DASH\n"); break; case COMMA: ErrorF("Token: COMMA\n"); break; case NUMBER: ErrorF("Token: NUMBER = %i, %f\n", DCval.num, DCval.realnum); break; case STRING: ErrorF("Token: STRING = %s\n",DCval.str); break; default: ErrorF("Token: TOKEN = %s\n",configRBuf); }#endif return (token); };/* still no token - see if this was interpreted already in xf86Config.c: *//* if so eat it up including any subsequent STRING, NUMBER, DASH, COMMA */if(otab && !token) { err = FALSE; /* assume unknown token */ i = 0;while ( otab[i].token != -1) if (StrCaseCmp(configRBuf,otab[i].name) == 0){ err = TRUE; /* found it: earmark to skip it */ break; } else i++; } } while(err == TRUE); /* skip any unwanted tokens */ return(ERROR_TOKEN); /* Error catcher */}OFlagSet *xf86DCGetOption(Pointer, tab)char* Pointer;OptFlagRec tab[]; { char *currpointer; OFlagSet *Flag; int addlen; int pos = 0; char *configPath; int lineno; int i; Flag = (OFlagSet *)xalloc(sizeof(OFlagSet)); OFLG_ZERO(Flag); if (Pointer == NULL) return(Flag); configPath = Pointer; pos = strlen(configPath) + 1; while(1) { currpointer = Pointer + pos; if (* currpointer == EOF) break; lineno = *(int *)currpointer; currpointer += sizeof(int); addlen = sizeof(int) + strlen(currpointer) + 1; i = 0; while (tab && tab[i].token != -1) { if (StrCaseCmp(currpointer, tab[i].name) == 0) { OFLG_SET(tab[i].token, Flag); break; } i++; }#ifdef DEBUG ErrorF("line: %i token: %i ;%s\n",lineno,tab[i].token,currpointer);#endif if (!tab || tab[i].token == -1) ErrorF("\nConfig Error: %s:%i:\n Unknown option string: \"%s\"\n", configPath,lineno,currpointer); pos += addlen; }; xfree(Pointer); return(Flag); }void xf86DCConfigError(msg) char *msg;{ int i,j; ErrorF( "\nConfig Error: %s:%d\n\n%s", configPath, configLineNo, configBuf); for (i = 1, j = 1; i < configStart; i++, j++) if (configBuf[i-1] != '\t') ErrorF(" "); else do ErrorF(" "); while (((j++)%8) != 0); for (i = configStart; i <= configPos; i++) ErrorF("^"); ErrorF("\n%s\n", msg); return;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?