📄 pre.l
字号:
} } //outputChar('\n'); g_lastGuardName.resize(0); BEGIN(Start); } }<DefineArg>","{B}* { g_defArgsStr+=yytext; }<DefineArg>"("{B}* { g_defArgsStr+=yytext; }<DefineArg>{B}*")"{B}* { g_defArgsStr+=yytext; QCString tmp=(QCString)"#define "+g_defName+g_defArgsStr; outputArray(tmp.data(),tmp.length()); g_quoteArg=FALSE; BEGIN(DefineText); }<DefineArg>{ID}{B}*("..."?) { //printf("Define addArg(%s)\n",yytext); QCString argName=yytext; g_defVarArgs = yytext[yyleng-1]=='.'; if (g_defVarArgs) // strip ellipsis { argName=argName.left(argName.length()-3); } argName = argName.stripWhiteSpace(); g_defArgsStr+=yytext; g_argDict->insert(argName,new int(g_defArgs)); g_defArgs++; }<DefineText>"/*" { outputChar('/');outputChar('*'); g_defText+=' '; g_defLitText+=' '; g_lastCContext=YY_START; BEGIN(SkipCComment); }<DefineText>"//" { outputChar('/');outputChar('/'); g_lastCPPContext=YY_START; g_defLitText+=' '; BEGIN(SkipCPPComment); }<SkipCComment>"*/" { outputChar('*');outputChar('/'); BEGIN(g_lastCContext); }<SkipCComment>"//" { outputChar('/');outputChar('/'); }<SkipCComment>"/*" { outputChar('/');outputChar('*'); }<SkipCComment>[^*\n]+ { outputArray(yytext,yyleng); }<SkipCComment>\n { g_yyLineNr++; outputChar('\n'); }<SkipCComment>. { outputChar(*yytext); }<RemoveCComment>"*/" { BEGIN(g_lastCContext); }<RemoveCComment>"//" <RemoveCComment>"/*"<RemoveCComment>[^*\n]+<RemoveCComment>\n { g_yyLineNr++; outputChar('\n'); }<RemoveCComment>. <SkipCPPComment,RemoveCPPComment>\n { unput(*yytext); BEGIN(g_lastCPPContext); }<SkipCPPComment>"/*" { outputChar('/');outputChar('*'); }<SkipCPPComment>"//" { outputChar('/');outputChar('/'); }<SkipCPPComment>[^\n]+ { outputArray(yytext,yyleng); }<SkipCPPComment>. { outputChar(*yytext); }<RemoveCPPComment>"/*"<RemoveCPPComment>"//"<RemoveCPPComment>[^\n]+<RemoveCPPComment>.<DefineText>"#" { g_quoteArg=TRUE; g_defLitText+=yytext; }<DefineText>{ID} { g_defLitText+=yytext; if (g_quoteArg) { g_defText+="\""; } if (g_defArgs>0) { int *n; if ((n=(*g_argDict)[yytext])) { //if (!g_quoteArg) g_defText+=' '; g_defText+='@'; QCString numStr; numStr.sprintf("%d",*n); g_defText+=numStr; //if (!g_quoteArg) g_defText+=' '; } else { g_defText+=yytext; } } else { g_defText+=yytext; } if (g_quoteArg) { g_defText+="\""; } g_quoteArg=FALSE; }<DefineText>\\[\r]?\n { g_defLitText+=yytext; outputChar('\n'); g_defText += ' '; g_yyLineNr++; }<DefineText>\n { g_defLitText+=yytext; outputChar('\n'); Define *def=0; //printf("Define name=`%s' text=`%s' litTexti=`%s'\n",g_defName.data(),g_defText.data(),g_defLitText.data()); if (g_includeStack.isEmpty() || g_curlyCount>0) { addDefine(); } def=g_fileDefineDict->find(g_defName); if (def==0) // new define { //printf("new define!\n"); g_fileDefineDict->insert(g_defName,newDefine()); } else if (def)// name already exists { //printf("existing define!\n"); //printf("define found\n"); if (def->undef) // undefined name { def->undef = FALSE; def->name = g_defName; def->definition = g_defText.stripWhiteSpace(); def->nargs = g_defArgs; def->fileName = g_yyFileName.copy(); def->lineNr = g_yyLineNr; } else { //printf("Error: define %s is defined more than once!\n",g_defName.data()); } } delete g_argDict; g_argDict=0; g_yyLineNr++; g_lastGuardName.resize(0); BEGIN(Start); }<DefineText>{B}* { g_defText += ' '; g_defLitText+=yytext; }<DefineText>{B}*"##"{B}* { g_defText += "##"; g_defLitText+=yytext; }<DefineText>"@" { g_defText += "@@"; g_defLitText+=yytext; }<DefineText>\" { g_defText += *yytext; g_defLitText+=yytext; BEGIN(SkipDoubleQuote); }<DefineText>\' { g_defText += *yytext; g_defLitText+=yytext; BEGIN(SkipSingleQuote); }<SkipDoubleQuote>"//" { g_defText += yytext; g_defLitText+=yytext; }<SkipDoubleQuote>"/*" { g_defText += yytext; g_defLitText+=yytext; }<SkipDoubleQuote>\" { g_defText += *yytext; g_defLitText+=yytext; BEGIN(DefineText); }<SkipSingleQuote,SkipDoubleQuote>\\. { g_defText += yytext; g_defLitText+=yytext; }<SkipSingleQuote>\' { g_defText += *yytext; g_defLitText+=yytext; BEGIN(DefineText); }<SkipDoubleQuote>. { g_defText += *yytext; g_defLitText+=yytext; }<SkipSingleQuote>. { g_defText += *yytext; g_defLitText+=yytext; }<DefineText>. { g_defText += *yytext; g_defLitText+=yytext; }<<EOF>> { //printf("End of include file\n"); //printf("Include stack depth=%d\n",g_includeStack.count()); if (g_includeStack.isEmpty()) { //printf("Terminating scanner!\n"); yyterminate(); } else { FileState *fs=g_includeStack.pop(); //fileDefineCache->merge(g_yyFileName,fs->fileName); if (Config_getString("INPUT_FILTER").isEmpty()) fclose(fs->filePtr); else pclose(fs->filePtr); YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER; yy_switch_to_buffer( fs->bufState ); yy_delete_buffer( oldBuf ); g_yyLineNr=fs->lineNr; setFileName(fs->fileName.copy()); //printf("######## FileName %s\n",g_yyFileName.data()); // TODO: Enable this to deal with file changes due to // #include's within { .. } blocks //QCString lineStr; //lineStr.sprintf("# %d \"%s\" 2",g_yyLineNr,g_yyFileName.data()); //outputArray(lineStr.data(),lineStr.length()); delete fs; fs=0; } }<*>"/*" { outputChar('/');outputChar('*'); g_lastCContext=YY_START; BEGIN(SkipCComment); }<*>"//" { outputChar('/');outputChar('/'); g_lastCPPContext=YY_START; BEGIN(SkipCPPComment); }<*>\n { outputChar('\n'); g_yyLineNr++; }<*>. { outputChar(*yytext); }%%/*@ ---------------------------------------------------------------------------- */static int getNextChar(const QCString &expr,QCString *rest,uint &pos){ //printf("getNextChar(%s,%s,%d)\n",expr.data(),rest ? rest->data() : 0,pos); if (pos<expr.length()) { //printf("%c=expr()\n",expr.at(pos)); return expr.at(pos++); } else if (rest && !rest->isEmpty()) { int cc=rest->at(0); *rest=rest->right(rest->length()-1); //printf("%c=rest\n",cc); return cc; } else { int cc=yyinput(); //printf("%c=yyinput()\n",cc); return cc; }} static int getCurrentChar(const QCString &expr,QCString *rest,uint pos){ //printf("getCurrentChar(%s,%s,%d)\n",expr.data(),rest ? rest->data() : 0,pos); if (pos<expr.length()) { //printf("%c=expr()\n",expr.at(pos)); return expr.at(pos); } else if (rest && !rest->isEmpty()) { int cc=rest->at(0); //printf("%c=rest\n",cc); return cc; } else { int cc=yyinput();unput(cc); //printf("%c=yyinput()\n",cc); return cc; }}static void unputChar(const QCString &expr,QCString *rest,uint &pos,char c){ //printf("unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c); if (pos<expr.length()) { pos++; } else if (rest) { //printf("Prepending to rest!\n"); char cs[2];cs[0]=c;cs[1]='\0'; rest->prepend(cs); } else { unput(c); } //printf("result: unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c);}void addSearchDir(const char *dir){ QFileInfo fi(dir); if (fi.isDir()) g_pathList->append(fi.absFilePath());} void initPreprocessor(){ g_pathList = new QStrList; addSearchDir("."); //defineNameList.setAutoDelete(TRUE); //defineNameList.clear(); //defineDict.clear(); //fileDefineCache = new DefineCache(1009); g_expandedDict = new DefineDict(17); g_fileDefineDict = new DefineDict(1009);}void cleanupPreprocessor(){ //delete fileDefineCache; delete g_fileDefineDict; g_fileDefineDict=0; delete g_expandedDict; g_expandedDict=0; delete g_pathList; g_pathList=0;}void preprocessFile(const char *fileName,BufStr &output){ uint orgOffset=output.curPos(); g_macroExpansion = Config_getBool("MACRO_EXPANSION"); g_expandOnlyPredef = Config_getBool("EXPAND_ONLY_PREDEF"); g_curlyCount=0; g_nospaces=FALSE; g_outputBuf=&output; g_includeStack.setAutoDelete(TRUE); g_includeStack.clear(); g_fileDefineDict->setAutoDelete(TRUE); g_fileDefineDict->clear(); g_expandedDict->setAutoDelete(FALSE); g_expandedDict->clear(); // add predefined macros char *defStr = Config_getList("PREDEFINED").first(); while (defStr) { //printf("Predefined: `%s'\n",defStr); QCString ds = defStr; int i_equals=ds.find('='); int i_obrace=ds.find('('); int i_cbrace=ds.find(')'); bool nonRecursive = i_equals>0 && ds.at(i_equals-1)==':'; if (i_obrace==0) continue; // no define name if (i_obrace<i_equals && i_cbrace<i_equals && i_obrace!=-1 && i_cbrace!=-1 && i_obrace<i_cbrace ) // predefined function macro definition { QRegExp reId("[a-z_A-Z][a-z_A-Z0-9]*"); // regexp matching an id QDict<int> argDict(17); argDict.setAutoDelete(TRUE); int i=i_obrace+1,p,l,count=0; // gather the formal arguments in a dictionary while (i<i_cbrace && (p=reId.match(ds,i,&l))) { argDict.insert(ds.mid(p,l),new int(count++)); i=p+l; } // strip definition part QCString tmp=ds.right(ds.length()-i_equals-1); QCString definition; i=0; // substitute all occurrences of formal arguments by their // corresponding markers while ((p=reId.match(tmp,i,&l))!=-1) { if (p>i) definition+=tmp.mid(i,p-i); int *argIndex; if ((argIndex=argDict[tmp.mid(p,l)])!=0) { QCString marker; marker.sprintf(" @%d ",*argIndex); definition+=marker; } else { definition+=tmp.mid(p,l); } i=p+l; } if (i<(int)tmp.length()) definition+=tmp.mid(i,tmp.length()-i); // add define definition to the dictionary of defines for this file Define *def = new Define; def->name = ds.left(i_obrace); def->definition = definition; def->nargs = count; def->isPredefined = TRUE; def->nonRecursive = nonRecursive; g_fileDefineDict->insert(def->name,def); //printf("#define `%s' `%s' #nargs=%d\n", // def->name.data(),def->definition.data(),def->nargs); } else if ((i_obrace==-1 || i_obrace>i_equals) && (i_cbrace==-1 || i_cbrace>i_equals) && !ds.isEmpty() && (int)ds.length()>i_equals ) // predefined non-function macro definition { Define *def = new Define; if (i_equals==-1) // simple define without argument { def->name = ds; def->definition = "1"; // substitute occurrences by 1 (true) } else // simple define with argument { int ine=i_equals - (nonRecursive ? 1 : 0); def->name = ds.left(ine); def->definition = ds.right(ds.length()-i_equals-1); } def->nargs = -1; def->isPredefined = TRUE; def->nonRecursive = nonRecursive; g_fileDefineDict->insert(def->name,def); //printf("#define `%s' `%s' #nargs=%d\n", // def->name.data(),def->definition.data(),def->nargs); } defStr=Config_getList("PREDEFINED").next(); } QCString &inputFilter = Config_getString("INPUT_FILTER"); if (inputFilter.isEmpty()) { preYYin = fopen(fileName,"r"); if (!preYYin) { err("Error: could not open file %s\n",fileName); return; } } else { QCString cmd = inputFilter+" "+fileName; preYYin = popen(cmd,"r"); if (!preYYin) { err("Error: could not execute filter %s\n",cmd.data()); return; } } g_yyLineNr = 1; g_level = 0; g_ifcount = 0; setFileName(fileName); BEGIN( Start ); g_lastGuardName.resize(0); g_guardExpr.resize(0); preYYlex(); if (inputFilter.isEmpty()) fclose(preYYin); else pclose(preYYin); if (Debug::isFlagSet(Debug::Preprocessor)) { char *orgPos=output.data()+orgOffset; char *newPos=output.data()+output.curPos(); msg("Preprocessor output (size: %d bytes):\n",newPos-orgPos); int line=1; msg("---------\n00001 "); while (orgPos<newPos) { putchar(*orgPos); if (*orgPos=='\n') printf("%05d ",++line); orgPos++; } msg("\n---------\n"); }}extern "C" { // some bogus code to keep the compiler happy// int preYYwrap() { return 1 ; } void preYYdummy() { yy_flex_realloc(0,0); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -