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

📄 code.l

📁 doxygen(一个自动从源代码生成文档的工具)的源代码
💻 L
📖 第 1 页 / 共 4 页
字号:
      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 + -