⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vcc_yacc.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    } lexBuf;static void lexPushMode(enum LexMode mode)    {    if (lexBuf.lexModeStackTop == (MAX_LEX_MODE_STACK_SIZE-1))	yyerror("lexical context stack overflow");    else {	lexBuf.lexModeStack[++lexBuf.lexModeStackTop] = mode;	}    }static void lexPopMode(int top)    {    /* special case of pop for ease of error recovery -- this	version will never underflow */    if (top)	lexBuf.lexModeStackTop = 0;    else	if (lexBuf.lexModeStackTop > 0) lexBuf.lexModeStackTop--;    }static int lexWithinMode(enum LexMode mode) {    unsigned long i;    for (i=0;i<lexBuf.lexModeStackTop;i++)	if (mode == lexBuf.lexModeStack[i]) return 1;    return 0;    }static int lexGetc_()    {    /* get next char from input, no buffering. */    if (lexBuf.curPos == lexBuf.inputLen)	return EOF;    else if (lexBuf.inputString)	return *(lexBuf.inputString + lexBuf.curPos++);    else {#ifdef INCLUDEMFC	char result;	return lexBuf.inputFile->Read(&result, 1) == 1 ? result : EOF;#else	return fgetc(lexBuf.inputFile);#endif	}    }static int lexGeta()    {    ++lexBuf.len;    return (lexBuf.buf[lexBuf.getPtr] = lexGetc_());    }static int lexGeta_(int i)    {    ++lexBuf.len;    return (lexBuf.buf[(lexBuf.getPtr+i)%MAX_LEX_LOOKAHEAD] = lexGetc_());    }static void lexSkipLookahead() {    if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {	/* don't skip EOF. */        lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;	lexBuf.len--;        }    }static int lexLookahead() {    int c = (lexBuf.len)?	lexBuf.buf[lexBuf.getPtr]:	lexGeta();    /* do the \r\n -> \n or \r -> \n translation here */    if (c == '\r') {	int a = (lexBuf.len>1)?	    lexBuf.buf[(lexBuf.getPtr+1)%MAX_LEX_LOOKAHEAD]:	    lexGeta_(1);	if (a == '\n') {	    lexSkipLookahead();	    }	lexBuf.buf[lexBuf.getPtr] = c = '\n';	}    else if (c == '\n') {	int a = (lexBuf.len>1)?	    lexBuf.buf[lexBuf.getPtr+1]:	    lexGeta_(1);	if (a == '\r') {	    lexSkipLookahead();	    }	lexBuf.buf[lexBuf.getPtr] = '\n';	}    return c;    }static int lexGetc() {    int c = lexLookahead();    if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {	/* EOF will remain in lookahead buffer */        lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;	lexBuf.len--;        }    return c;    }static void lexSkipLookaheadWord() {    if (lexBuf.strsLen <= lexBuf.len) {	lexBuf.len -= lexBuf.strsLen;	lexBuf.getPtr = (lexBuf.getPtr + lexBuf.strsLen) % MAX_LEX_LOOKAHEAD;	}    }static void lexClearToken()    {    lexBuf.strsLen = 0;    }static void lexAppendc(int c)    {    lexBuf.strs[lexBuf.strsLen] = c;    /* append up to zero termination */    if (c == 0) return;    lexBuf.strsLen++;    if (lexBuf.strsLen > lexBuf.maxToken) {	/* double the token string size */	lexBuf.maxToken <<= 1;	lexBuf.strs = (char*) realloc(lexBuf.strs,(size_t)lexBuf.maxToken);	}    }static char* lexStr() {    return dupStr(lexBuf.strs,(size_t)lexBuf.strsLen+1);    }static void lexSkipWhite() {    int c = lexLookahead();    while (c == ' ' || c == '\t') {	lexSkipLookahead();	c = lexLookahead();	}    }static char* lexGetWord() {    int c;    lexSkipWhite();    lexClearToken();    c = lexLookahead();    while (c != EOF && !strchr("\t\n ;:=",c)) {	lexAppendc(c);	lexSkipLookahead();	c = lexLookahead();	}    lexAppendc(0);    return lexStr();    }static char* lexGetParamWord(){    int c;    lexClearToken();    c = lexLookahead();    while (c >= ' ' && c < 127 && !strchr("[]:=,.;",c)) {	lexAppendc(c);	lexSkipLookahead();	c = lexLookahead();    }    lexAppendc(0);    return lexStr();}static void lexPushLookaheadc(int c) {    int putptr;    /* can't putback EOF, because it never leaves lookahead buffer */    if (c == EOF) return;    putptr = (int)lexBuf.getPtr - 1;    if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD;    lexBuf.getPtr = putptr;    lexBuf.buf[putptr] = c;    lexBuf.len += 1;    }static char* lexLookaheadWord() {    /* this function can lookahead word with max size of MAX_LEX_LOOKAHEAD_0     /  and thing bigger than that will stop the lookahead and return 0;     / leading white spaces are not recoverable.     */    int c;    int len = 0;    int curgetptr = 0;    lexSkipWhite();    lexClearToken();    curgetptr = (int)lexBuf.getPtr;	// remember!    while (len < (MAX_LEX_LOOKAHEAD_0)) {	c = lexGetc();	len++;	if (c == EOF || strchr("\t\n ;:=", c)) {	    lexAppendc(0);	    /* restore lookahead buf. */	    lexBuf.len += len;	    lexBuf.getPtr = curgetptr;	    return lexStr();	    }        else	    lexAppendc(c);	}    lexBuf.len += len;	/* char that has been moved to lookahead buffer */    lexBuf.getPtr = curgetptr;    return 0;    }#ifdef _SUPPORT_LINE_FOLDINGstatic void handleMoreRFC822LineBreak(int c) {    /* suport RFC 822 line break in cases like     *	ADR: foo;     *    morefoo;     *    more foo;     */    if (c == ';') {	int a;	lexSkipLookahead();	/* skip white spaces */	a = lexLookahead();	while (a == ' ' || a == '\t') {	    lexSkipLookahead();	    a = lexLookahead();	    }	if (a == '\n') {	    lexSkipLookahead();	    a = lexLookahead();	    if (a == ' ' || a == '\t') {		/* continuation, throw away all the \n and spaces read so		 * far		 */		lexSkipWhite();		lexPushLookaheadc(';');		}	    else {		lexPushLookaheadc('\n');		lexPushLookaheadc(';');		}	    }	else {	    lexPushLookaheadc(';');	    }	}    }static char* lexGet1Value() {    int c;    lexSkipWhite();    c = lexLookahead();    lexClearToken();    while (c != EOF && (c != ';' || !fieldedProp)) {	if (c == '\\' ) {	    int a;	    lexSkipLookahead();	    a = lexLookahead();	    if ( a == ';' ) {		lexAppendc( ';' );		lexSkipLookahead();	    } else if ( a == '\n' ) {		lexAppendc( '\n' );		lexSkipLookahead();	    } else if ( a == '\\' ) {		lexAppendc( '\\' );		lexSkipLookahead();	    } else {		lexAppendc('\\');	    }	} else if (c == '\n') {	    int a;	    lexSkipLookahead();	    a  = lexLookahead();	    if (a == ' ' || a == '\t') {		lexAppendc(' ');		lexSkipLookahead();		}	    else {		lexPushLookaheadc('\n');		break;		}	    }	else {	    lexAppendc(c);	    lexSkipLookahead();	    }	c = lexLookahead();	}    lexAppendc(0);    handleMoreRFC822LineBreak(c);    return c==EOF?0:lexStr();    }#endifstatic int match_begin_name(int end) {    char *n = lexLookaheadWord();    int token = ID;    if (n) {	if (!qstricmp(n,"vcard")) token = end?END_VCARD:BEGIN_VCARD;	else if (!qstricmp(n,"vcalendar")) token = end?END_VCAL:BEGIN_VCAL;	else if (!qstricmp(n,"vevent")) token = end?END_VEVENT:BEGIN_VEVENT;	else if (!qstricmp(n,"vtodo")) token = end?END_VTODO:BEGIN_VTODO;	deleteStr(n);	return token;	}    return 0;    }#ifdef INCLUDEMFCvoid initLex(const char *inputstring, unsigned long inputlen, CFile *inputfile)#elsevoid initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile)#endif    {    // initialize lex mode stack    lexBuf.lexModeStack[lexBuf.lexModeStackTop=0] = L_NORMAL;    // iniatialize lex buffer.    lexBuf.inputString = (char*) inputstring;    lexBuf.inputLen = inputlen;    lexBuf.curPos = 0;    lexBuf.inputFile = inputfile;    lexBuf.len = 0;    lexBuf.getPtr = 0;    lexBuf.maxToken = MAXTOKEN;    lexBuf.strs = (char*)malloc(MAXTOKEN);    lexBuf.strsLen = 0;    }static void finiLex() {    free(lexBuf.strs);    }/*-----------------------------------*//* This parses and converts the base64 format for binary encoding into * a decoded buffer (allocated with new).  See RFC 1521. */static int lexGetDataFromBase64()    {    unsigned long bytesLen = 0, bytesMax = 0;    int quadIx = 0, pad = 0;    unsigned long trip = 0;    unsigned char b;    int c;    unsigned char *bytes = NULL;    unsigned char *oldBytes = NULL;    DBG_(("db: lexGetDataFromBase64\n"));    while (1) {	c = lexGetc();	lexSkipWhite();	if (c == '\n') {	    ++mime_lineNum;	    if (lexLookahead() == '\n') {		/* a '\n' character by itself means end of data */		break;		}	    else continue; /* ignore '\n' */	    }	else {	    if ((c >= 'A') && (c <= 'Z'))		b = (unsigned char)(c - 'A');	    else if ((c >= 'a') && (c <= 'z'))		b = (unsigned char)(c - 'a') + 26;	    else if ((c >= '0') && (c <= '9'))		b = (unsigned char)(c - '0') + 52;	    else if (c == '+')		b = 62;	    else if (c == '/')		b = 63;	    else if (c == '=') {		b = 0;		pad++;	    } else { /* error condition */		if (bytes) free(bytes);		else if (oldBytes) free(oldBytes);		// error recovery: skip until 2 adjacent newlines.		DBG_(("db: invalid character 0x%x '%c'\n", c,c));		if (c != EOF)  {		    c = lexGetc();		    while (c != EOF) {			if (c == '\n') {			    lexSkipWhite();			    if(lexLookahead() == '\n') {				++mime_lineNum;				break;				}			    }			c = lexGetc();			}		    }		return c != EOF;		}	    trip = (trip << 6) | b;	    if (++quadIx == 4) {		unsigned char outBytes[3];		int numOut;		int i;		for (i = 0; i < 3; i++) {		    outBytes[2-i] = (unsigned char)(trip & 0xFF);		    trip >>= 8;		    }		numOut = 3 - pad;		if (bytesLen + numOut > bytesMax) {		    if (!bytes) {			bytesMax = 1024;			bytes = (unsigned char*)malloc((size_t)bytesMax);			}		    else {			bytesMax <<= 2;			oldBytes = bytes;			bytes = (unsigned char*)realloc(bytes,(size_t)bytesMax);			}		    if (bytes == 0) {			mime_error("out of memory while processing BASE64 data\n");			}		    }		if (bytes) {		    memcpy(bytes + bytesLen, outBytes, numOut);		    bytesLen += numOut;		    }		trip = 0;		quadIx = 0;		}	    }	} /* while */    DBG_(("db: bytesLen = %d\n",  bytesLen));    /* kludge: all this won't be necessary if we have tree form	representation */    if (bytes) {	setValueWithSize(curProp,bytes,(unsigned int)bytesLen);	free(bytes);	}    else if (oldBytes) {	setValueWithSize(curProp,oldBytes,(unsigned int)bytesLen);	free(oldBytes);	}    return bytesLen;    }static int match_begin_end_name(int end) {    int token;    lexSkipWhite();    if (lexLookahead() != ':') return ID;    lexSkipLookahead();    lexSkipWhite();    token = match_begin_name(end);    if (token == ID) {	lexPushLookaheadc(':');	DBG_(("db: ID '%s'\n", yylval.str));	return ID;	}    else if (token != 0) {	lexSkipLookaheadWord();	deleteStr(yylval.str);	DBG_(("db: begin/end %d\n", token));	return token;	}    return 0;    }static char* lexGetQuotedPrintable(){    int c;    lexSkipWhite();    c = lexLookahead();    lexClearToken();    while (c != EOF && (c != ';' || !fieldedProp)) {	if (c == '\n') {	    // break, leave '\n' on remaining chars.	    break;	} else if (c == '=') {	    int cur = 0;	    int next;	    lexSkipLookahead(); // skip '='	    next = lexLookahead();	    if (next == '\n') {		// skip and only skip the \n		lexSkipLookahead(); 		c = lexLookahead();		++mime_lineNum; // aid in error reporting		continue;	    } else if (next >= '0' && next <= '9') {		cur = next - '0';	    } else if (next >= 'A' && next <= 'F') {		cur = next - 'A' + 10;	    } else {		// we have been sent buggy stuff. doesn't matter		// what we do so long as we keep going.		// should probably spit an error here		lexSkipLookahead(); 		c = lexLookahead();		continue;	    }	    lexSkipLookahead(); // skip A-Z0-9	    next = lexLookahead();	    cur = cur * 16;	    // this time really just expecting 0-9A-F	    if (next >= '0' && next <= '9') {		cur += next - '0';	    } else if (next >= 'A' && next <= 'F') {		cur += next - 'A' + 10;	    } else {		// we have been sent buggy stuff. doesn't matter		// what we do so long as we keep going.		// should probably spit an error here		lexSkipLookahead(); 		c = lexLookahead();		continue;	    }	    // got a valid escaped =.  append it.	    lexSkipLookahead(); // skip second 0-9A-F	    lexAppendc(cur);	} else {	    lexSkipLookahead(); // skip whatever we just read.	    lexAppendc(c); // and append it.	}	c = lexLookahead();    }    lexAppendc(0);    return c==EOF?0:lexStr();}static int yylex() {    int lexmode = LEXMODE();    if (lexmode == L_VALUES) {	int c = lexGetc();	int c2;	if (c == ';' && fieldedProp) {	    DBG_(("db: SEMICOLON\n"));	    lexPushLookaheadc(c);	    handleMoreRFC822LineBreak(c);	    lexSkipLookahead();	    return SEMICOLON;	    }	else if (strchr("\n",c) && (c2 = lexLookahead()) != ' ' && c2 != '\t') {	    ++mime_lineNum;	    /* consume all line separator(s) adjacent to each other */	    while (strchr("\n",c2)) {		lexSkipLookahead();		c2 = lexLookahead();		++mime_lineNum;		}	    DBG_(("db: LINESEP\n"));	    return LINESEP;	    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -