📄 code.l
字号:
cd=getResolvedClass(g_currentDefinition,g_classScope+"::"+clName); } if (cd==0) { cd=getResolvedClass(g_currentDefinition,clName); } //printf("stripClass trying `%s' = %p\n",clName.data(),cd); if (cd) { return cd; } } return 0;}static MemberDef *setCallContextForVar(const QCString &name){ if (name.isEmpty()) return 0; //printf("setCallContextForVar(%s)\n",name.data()); int scopeEnd = name.findRev("::"); if (scopeEnd!=-1) // name with explicit scope { QCString scope = name.left(scopeEnd); QCString locName = name.right(name.length()-scopeEnd-2); //printf("name=%s scope=%s\n",locName.data(),scope.data()); ClassDef *mcd = getClass(scope); // TODO: check namespace as well if (mcd && !locName.isEmpty()) { MemberDef *md=mcd->getMemberByName(locName); if (md) { //printf("name=%s scope=%s\n",locName.data(),scope.data()); g_theCallContext.setClass(stripClassName(md->typeString())); return md; } } } MemberName *mn; ClassDef *mcd = g_theVarContext.findVariable(name); if (mcd) // local variable { //printf("local var `%s'\n",name.data()); g_theCallContext.setClass(mcd); return 0; } // look for a class member mcd = getClass(g_classScope); if (mcd) { MemberDef *md=mcd->getMemberByName(name); if (md) { g_theCallContext.setClass(stripClassName(md->typeString())); return md; } } // look for a global member if ((mn=Doxygen::functionNameSDict[name])) { //printf("global var `%s'\n",name.data()); if (mn->count()==1) // global defined only once { MemberDef *md=mn->getFirst(); if (!md->isStatic() || md->getBodyDef()==g_sourceFileDef) { g_theCallContext.setClass(stripClassName(md->typeString())); return md; } return 0; } else if (mn->count()>1) // global defined more than once { MemberDef *md=mn->first(); while (md) { //printf("mn=%p md=%p md->getBodyDef()=%p g_sourceFileDef=%p\n", // mn,md, // md->getBodyDef(),g_sourceFileDef); if (md->getBodyDef()==g_sourceFileDef) { g_theCallContext.setClass(stripClassName(md->typeString())); return md; } md=mn->next(); } return 0; } } return 0;}static void generateClassOrGlobalLink(OutputDocInterface &ol,char *clName,int *clNameLen=0){ int i=0; if (*clName=='~') // correct for matching negated values i.s.o. destructors. { g_code->codify("~"); clName++; } QCString className=clName; if (clNameLen) *clNameLen=0; if (className.isEmpty()) return; ClassDef *cd=0; if (!g_theVarContext.findVariable(className)) // not a local variable { cd = getResolvedClass(g_currentDefinition,className); if (cd==0 && (i=className.find('<'))!=-1) { cd=getResolvedClass(g_currentDefinition,className.left(i)); } } if (cd && cd->isLinkable()) // is it a linkable class { if (g_exampleBlock) { QCString anchor; anchor.sprintf("_a%d",g_anchorCount); //printf("addExampleClass(%s,%s,%s)\n",anchor.data(),g_exampleName.data(), // g_exampleFile.data()); if (cd->addExample(anchor,g_exampleName,g_exampleFile)) { ol.pushGeneratorState(); ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::RTF); ol.writeAnchor(0,anchor); ol.popGeneratorState(); g_anchorCount++; } } writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),0,className); if (clNameLen) *clNameLen=className.length()-i-1; } else { if (cd==0) // not a class, see if it is a global enum/variable/typedef. { MemberDef *md = setCallContextForVar(clName); if (md) { Definition *d = md->getOuterScope()==Doxygen::globalScope ? md->getBodyDef() : md->getOuterScope(); if (d && d->isLinkable() && md->isLinkable()) { writeMultiLineCodeLink(ol,d->getReference(),d->getOutputFileBase(),md->getBodyAnchor(),clName); if (g_currentMemberDef) { if (Config_getBool("REFERENCED_BY_RELATION") && g_currentMemberDef->isFunction()) { md->addSourceReferencedBy(g_currentMemberDef); } if (Config_getBool("REFERENCES_RELATION") && g_currentMemberDef->isFunction()) { g_currentMemberDef->addSourceReferences(md); } } return; } } } codifyLines(clName); if (clNameLen) *clNameLen=className.length()-1; }}static bool getLink(const char *className, const char *memberName,OutputDocInterface &result, const char *text=0){ MemberDef *md; ClassDef *cd; FileDef *fd; NamespaceDef *nd; GroupDef *gd; QCString m=removeRedundantWhiteSpace(memberName); QCString c=className; //printf("Trying `%s'::`%s'\n",c.data(),m.data()); if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) && md->isLinkable()) { //printf("Found!\n"); if (g_exampleBlock) { QCString anchor; anchor.sprintf("a%d",g_anchorCount); //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(), // g_exampleFile.data()); if (md->addExample(anchor,g_exampleName,g_exampleFile)) { //bool latexEnabled = result.isEnabled(OutputGenerator::Latex); result.pushGeneratorState(); //if (latexEnabled) result.disable(OutputGenerator::Latex); result.disable(OutputGenerator::Latex); result.writeAnchor(0,anchor); result.popGeneratorState(); //if (latexEnabled) result.enable(OutputGenerator::Latex); g_anchorCount++; } } Definition *d=0; if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd; if (d && d->isLinkable()) { g_theCallContext.setClass(stripClassName(md->typeString())); if (g_currentDefinition && g_currentMemberDef && md!=g_currentMemberDef && g_insideBody) { if (Config_getBool("REFERENCED_BY_RELATION") && g_currentMemberDef->isFunction()) { md->addSourceReferencedBy(g_currentMemberDef); } if (Config_getBool("REFERENCES_RELATION") && g_currentMemberDef->isFunction()) { g_currentMemberDef->addSourceReferences(md); } } //printf("d->getOutputBase()=`%s' name=`%s' member name=`%s'\n",d->getOutputFileBase().data(),d->name().data(),md->name().data()); writeMultiLineCodeLink(result,d->getReference(),d->getOutputFileBase(), md->getBodyAnchor(),text ? text : memberName); return TRUE; } } return FALSE;}static bool generateClassMemberLink(OutputDocInterface &ol,ClassDef *mcd,const char *memName){ if (mcd) { MemberDef *xmd = mcd->getMemberByName(memName); //printf("generateClassMemberLink(class=%s,member=%s)=%p\n",mcd->name().data(),memName,xmd); if (xmd) { // extract class definition of the return type in order to resolve // a->b()->c() like call chains //printf("type=`%s' args=`%s' class=%s\n", // xmd->typeString(),xmd->argsString(), // xmd->getClassDef()->name().data()); g_theCallContext.setClass(stripClassName(xmd->typeString())); Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ? xmd->getBodyDef() : xmd->getOuterScope(); if (xd) { // add usage reference if (g_currentDefinition && g_currentMemberDef && xmd!=g_currentMemberDef && g_insideBody) { if (Config_getBool("REFERENCED_BY_RELATION") && g_currentMemberDef->isFunction()) { xmd->addSourceReferencedBy(g_currentMemberDef); } if (Config_getBool("REFERENCES_RELATION") && g_currentMemberDef->isFunction()) { g_currentMemberDef->addSourceReferences(xmd); } } // write the actual link writeMultiLineCodeLink(ol,xd->getReference(), xd->getOutputFileBase(),xmd->getBodyAnchor(),memName); return TRUE; } } } return FALSE;}static void generateMemberLink(OutputDocInterface &ol,const QCString &varName, char *memName){ //printf("generateMemberLink(object=%s,mem=%s) classScope=%s\n", // varName.data(),memName,g_classScope.data()); if (varName.isEmpty()) return; // look for the variable in the current context ClassDef *vcd = g_theVarContext.findVariable(varName); if (vcd) { //printf("Class found!\n"); OutputDocInterface *result = ol.clone(); if (getLink(vcd->name(),memName,*result)) { //printf("Found result!\n"); ol.append(result); delete result; return; } BaseClassListIterator bcli(*vcd->baseClasses()); for ( ; bcli.current() ; ++bcli) { OutputDocInterface *result = ol.clone(); if (getLink(bcli.current()->classDef->name(),memName,*result)) { //printf("Found result!\n"); ol.append(result); delete result; return; } } } else // variable not in current context, maybe it is { vcd = getResolvedClass(g_currentDefinition,g_classScope); if (vcd && vcd->isLinkable()) { //printf("Found class %s for variable `%s'\n",g_classScope.data(),varName.data()); MemberName *vmn=Doxygen::memberNameSDict[varName]; if (vmn==0) { int vi; QCString vn=varName; QCString scope; if ((vi=vn.findRev("::"))!=-1) // explicit scope A::b(), probably static member { ClassDef *jcd = getClass(vn.left(vi)); vn=vn.right(vn.length()-vi-2); vmn=Doxygen::memberNameSDict[vn]; //printf("Trying name `%s' scope=%s\n",vn.data(),scope.data()); if (vmn) { MemberNameIterator vmni(*vmn); MemberDef *vmd; for (;(vmd=vmni.current());++vmni) { if (/*(vmd->isVariable() || vmd->isFunction()) && */ vmd->getClassDef()==jcd) { //printf("Found variable type=%s\n",vmd->typeString()); ClassDef *mcd=stripClassName(vmd->typeString()); if (mcd && mcd->isLinkable()) { if (generateClassMemberLink(ol,mcd,memName)) return; } } } } } } if (vmn) { //printf("There is a variable with name `%s'\n",varName); MemberNameIterator vmni(*vmn); MemberDef *vmd; for (;(vmd=vmni.current());++vmni) { if (/*(vmd->isVariable() || vmd->isFunction()) && */ vmd->getClassDef()==vcd) { //printf("Found variable type=%s\n",vmd->typeString()); ClassDef *mcd=stripClassName(vmd->typeString()); if (mcd && mcd->isLinkable()) { if (generateClassMemberLink(ol,mcd,memName)) return; } } } } } } codifyLines(memName); return;}static void generateFunctionLink(OutputDocInterface &ol,char *funcName){ OutputDocInterface *result = ol.clone(); //CodeClassDef *ccd=0; ClassDef *ccd=0; QCString locScope=g_classScope.copy(); QCString locFunc=removeRedundantWhiteSpace(funcName); int i=locFunc.findRev("::"); if (i>0) { locScope=locFunc.left(i); locFunc=locFunc.right(locFunc.length()-i-2).stripWhiteSpace(); int ts=locScope.find('<'); // start of template int te=locScope.findRev('>'); // end of template //printf("ts=%d te=%d\n",ts,te); if (ts!=-1 && te!=-1 && te>ts) { // remove template from scope locScope=locScope.left(ts)+locScope.right(locScope.length()-te-1); } } //printf("generateFunctionLink(%s) classScope=`%s'\n",locFunc.data(),locScope.data()); if (!locScope.isEmpty() && (ccd=g_codeClassSDict[locScope])) { //printf("using classScope %s\n",g_classScope.data()); BaseClassListIterator bcli(*ccd->baseClasses()); for ( ; bcli.current() ; ++bcli) { if (getLink(bcli.current()->classDef->name(),locFunc,*result,funcName)) { ol.append(result); delete result; return; } } } if (getLink(locScope,locFunc,*result,funcName)) { ol.append(result); } else { //codifyLines(funcName); generateClassOrGlobalLink(ol,funcName); } delete result; return;}/*! counts the number of lines in the input */static int countLines(){ const char *p=g_inputString; char c; int count=1; while ((c=*p++)) if (c=='\n') count++; return count;}static void endFontClass(){ if (g_currentFontClass) { g_code->endFontClass(); g_currentFontClass=0; }}static void startFontClass(const char *s){ endFontClass(); g_code->startFontClass(s); g_currentFontClass=s;}/* ----------------------------------------------------------------- */#undef YY_INPUT#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);static int yyread(char *buf,int max_size){ int c=0; while( c < max_size && g_inputString[g_inputPosition] ) { *buf = g_inputString[g_inputPosition++] ; c++; buf++; } return c;}%}B [ \t]BN [ \t\n\r]ID [a-z_A-Z][a-z_A-Z0-9]*SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID})SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*"::"{BN}*)+KEYWORD ("asm"|"auto"|"class"|"const"|"const_cast"|"delete"|"dynamic_cast"|"enum"|"explicit"|"extern"|"false"|"friend"|"inline"|"mutable"|"namespace"|"new"|"operator"|"private"|"protected"|"public"|"register"|"reinterpret_cast"|"sizeof"|"static"|"static_cast"|"struct"|"template"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile")FLOWKW ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"for"|"goto"|"if"|"return"|"switch"|"throw"|"try"|"while")TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"|"void"|"wchar_t")%option noyywrap%x SkipString%x SkipCPP%x SkipComment%x SkipCxxComment%x RemoveSpecialCComment%x StripSpecialCComment%x Body%x FuncCall%x MemberCall%x MemberCall2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -