📄 vcc_yacc.cpp
字号:
else { char *p = 0; lexPushLookaheadc(c); if (lexWithinMode(L_BASE64)) { /* get each char and convert to bin on the fly... */ yylval.str = NULL; return lexGetDataFromBase64() ? STRING : 0; } else if (lexWithinMode(L_QUOTED_PRINTABLE)) { p = lexGetQuotedPrintable(); } else {#ifdef _SUPPORT_LINE_FOLDING p = lexGet1Value();#else p = lexGetStrUntil(";\n");#endif } if (p) { DBG_(("db: STRING: '%s'\n", p)); yylval.str = p; return STRING; } else return 0; } } else if (lexmode == L_PARAMWORD) { yylval.str = lexGetParamWord(); return ID; } else { /* normal mode */ while (1) { int c = lexGetc(); switch(c) { case ':': { /* consume all line separator(s) adjacent to each other */ /* ignoring linesep immediately after colon. */ /* I don't see this in the spec, and it breaks null values -- WA c = lexLookahead(); while (strchr("\n",c)) { lexSkipLookahead(); c = lexLookahead(); ++mime_lineNum; } */ DBG_(("db: COLON\n")); return COLON; } case ';': DBG_(("db: SEMICOLON\n")); return SEMICOLON; case '=': DBG_(("db: EQ\n")); return EQ; /* ignore whitespace in this mode */ case '\t': case ' ': continue; case '\n': { ++mime_lineNum; continue; } case EOF: return 0; break; default: { lexPushLookaheadc(c); if (isalnum(c)) { char *t = lexGetWord(); yylval.str = t; if (!qstricmp(t, "begin")) { return match_begin_end_name(0); } else if (!qstricmp(t,"end")) { return match_begin_end_name(1); } else { DBG_(("db: ID '%s'\n", t)); return ID; } } else { /* unknow token */ return 0; } break; } } } } return 0; }/***************************************************************************//*** Public Functions ****//***************************************************************************/static VObject* Parse_MIMEHelper() { ObjStackTop = -1; mime_numErrors = 0; mime_lineNum = 1; vObjList = 0; curObj = 0; if (yyparse() != 0) return 0; finiLex(); return vObjList; }/*--------------------------------------------*/DLLEXPORT(VObject*) Parse_MIME(const char *input, unsigned long len) { initLex(input, len, 0); return Parse_MIMEHelper(); }#if INCLUDEMFCDLLEXPORT(VObject*) Parse_MIME_FromFile(CFile *file) { unsigned long startPos; VObject *result; initLex(0,-1,file); startPos = file->GetPosition(); if (!(result = Parse_MIMEHelper())) file->Seek(startPos, CFile::begin); return result; }#elseVObject* Parse_MIME_FromFile(FILE *file) { VObject *result; long startPos; initLex(0,(unsigned long)-1,file); startPos = ftell(file); if (!(result = Parse_MIMEHelper())) { fseek(file,startPos,SEEK_SET); } return result; }DLLEXPORT(VObject*) Parse_MIME_FromFileName(char *fname) { FILE *fp = fopen(fname,"r"); if (fp) { VObject* o = Parse_MIME_FromFile(fp); fclose(fp); return o; } else { char msg[80]; sprintf(msg, "can't open file '%s' for reading\n", fname); mime_error_(msg); return 0; } }#endif/*-------------------------------------*/static MimeErrorHandler mimeErrorHandler;DLLEXPORT(void) registerMimeErrorHandler(MimeErrorHandler me) { mimeErrorHandler = me; }void mime_error(char *s) { char msg[256]; if (mimeErrorHandler) { sprintf(msg,"%s at line %d", s, mime_lineNum); mimeErrorHandler(msg); } }void mime_error_(char *s) { if (mimeErrorHandler) { mimeErrorHandler(s); } }#line 1265 "y.tab.c"#define YYABORT goto yyabort#define YYREJECT goto yyabort#define YYACCEPT goto yyaccept#define YYERROR goto yyerrlabint#if defined(__STDC__)yyparse(void)#elseyyparse()#endif{ register int yym, yyn, yystate;#if YYDEBUG register char *yys; extern char *getenv(); if (yys = getenv("YYDEBUG")) { yyn = *yys; if (yyn >= '0' && yyn <= '9') yydebug = yyn - '0'; }#endif yynerrs = 0; yyerrflag = 0; yychar = (-1); yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0;yyloop: if ((yyn = yydefred[yystate]) != 0) goto yyreduce; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0;#if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, yystate, yychar, yys); }#endif } if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) {#if YYDEBUG if (yydebug) printf("%sdebug: state %d, shifting to state %d\n", YYPREFIX, yystate, yytable[yyn]);#endif if (yyssp >= yyss + yystacksize - 1) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; yychar = (-1); if (yyerrflag > 0) --yyerrflag; goto yyloop; } if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { yyn = yytable[yyn]; goto yyreduce; } if (yyerrflag) goto yyinrecovery; yyerror("syntax error");#ifdef lint goto yyerrlab;#endifyyerrlab: ++yynerrs;yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) {#if YYDEBUG if (yydebug) printf("%sdebug: state %d, error recovery shifting\ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);#endif if (yyssp >= yyss + yystacksize - 1) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; goto yyloop; } else {#if YYDEBUG if (yydebug) printf("%sdebug: error recovery discarding state %d\n", YYPREFIX, *yyssp);#endif if (yyssp <= yyss) goto yyabort; --yyssp; --yyvsp; } } } else { if (yychar == 0) goto yyabort;#if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, error recovery discards token %d (%s)\n", YYPREFIX, yystate, yychar, yys); }#endif yychar = (-1); goto yyloop; }yyreduce:#if YYDEBUG if (yydebug) printf("%sdebug: state %d, reducing by rule %d (%s)\n", YYPREFIX, yystate, yyn, yyrule[yyn]);#endif yym = yylen[yyn]; yyval = yyvsp[1-yym]; switch (yyn) {case 2:#line 223 "backend/vcc.y"{ addList(&vObjList, yyvsp[0].vobj); curObj = 0; }break;case 3:#line 225 "backend/vcc.y"{ addList(&vObjList, yyvsp[0].vobj); curObj = 0; }break;case 6:#line 234 "backend/vcc.y"{ lexPushMode(L_VCARD); if (!pushVObject(VCCardProp)) YYERROR; }break;case 7:#line 239 "backend/vcc.y"{ lexPopMode(0); yyval.vobj = popVObject(); }break;case 8:#line 244 "backend/vcc.y"{ lexPushMode(L_VCARD); if (!pushVObject(VCCardProp)) YYERROR; }break;case 9:#line 249 "backend/vcc.y"{ lexPopMode(0); yyval.vobj = popVObject(); }break;case 12:#line 260 "backend/vcc.y"{ lexPushMode(L_VALUES); }break;case 13:#line 264 "backend/vcc.y"{ if (lexWithinMode(L_BASE64) || lexWithinMode(L_QUOTED_PRINTABLE)) lexPopMode(0); lexPopMode(0); }break;case 15:#line 273 "backend/vcc.y"{ enterProps(yyvsp[0].str); }break;case 17:#line 278 "backend/vcc.y"{ enterProps(yyvsp[0].str); }break;case 21:#line 291 "backend/vcc.y"{ enterAttr(yyvsp[0].str,0); }break;case 22:#line 295 "backend/vcc.y"{ lexPushMode(L_PARAMWORD); }break;case 23:#line 299 "backend/vcc.y"{ lexPopMode(0); enterAttr(yyvsp[-3].str,yyvsp[0].str); }break;case 25:#line 308 "backend/vcc.y"{ enterValues(yyvsp[-1].str); }break;case 27:#line 310 "backend/vcc.y"{ enterValues(yyvsp[0].str); }break;case 29:#line 315 "backend/vcc.y"{ yyval.str = 0; }break;case 30:#line 320 "backend/vcc.y"{ if (!pushVObject(VCCalProp)) YYERROR; }break;case 31:#line 323 "backend/vcc.y"{ yyval.vobj = popVObject(); }break;case 32:#line 325 "backend/vcc.y"{ if (!pushVObject(VCCalProp)) YYERROR; }break;case 33:#line 327 "backend/vcc.y"{ yyval.vobj = popVObject(); }break;case 39:#line 342 "backend/vcc.y"{ lexPushMode(L_VEVENT); if (!pushVObject(VCEventProp)) YYERROR; }break;case 40:#line 348 "backend/vcc.y"{ lexPopMode(0); popVObject(); }break;case 41:#line 353 "backend/vcc.y"{ lexPushMode(L_VEVENT); if (!pushVObject(VCEventProp)) YYERROR; }break;case 42:#line 358 "backend/vcc.y"{ lexPopMode(0); popVObject(); }break;case 43:#line 366 "backend/vcc.y"{ lexPushMode(L_VTODO); if (!pushVObject(VCTodoProp)) YYERROR; }break;case 44:#line 372 "backend/vcc.y"{ lexPopMode(0); popVObject(); }break;case 45:#line 377 "backend/vcc.y"{ lexPushMode(L_VTODO); if (!pushVObject(VCTodoProp)) YYERROR; }break;case 46:#line 382 "backend/vcc.y"{ lexPopMode(0); popVObject(); }break;#line 1571 "y.tab.c" } yyssp -= yym; yystate = *yyssp; yyvsp -= yym; yym = yylhs[yyn]; if (yystate == 0 && yym == 0) {#if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state 0 to\ state %d\n", YYPREFIX, YYFINAL);#endif yystate = YYFINAL; *++yyssp = YYFINAL; *++yyvsp = yyval; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0;#if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, YYFINAL, yychar, yys); }#endif } if (yychar == 0) goto yyaccept; goto yyloop; } if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yystate) yystate = yytable[yyn]; else yystate = yydgoto[yym];#if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state %d \to state %d\n", YYPREFIX, *yyssp, yystate);#endif if (yyssp >= yyss + yystacksize - 1) { goto yyoverflow; } *++yyssp = yystate; *++yyvsp = yyval; goto yyloop;yyoverflow: yyerror("yacc stack overflow");yyabort: return (1);yyaccept: return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -