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

📄 pre.cpp

📁 doxygen(一个自动从源代码生成文档的工具)的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	    { 	      term=c; 	    }	  }	  if (term=='\0' && c==')')	  {	    level--;	    arg+=c;	    if (level==0) break;	  }	  else if (term=='\0' && c=='(')	  {	    level++;	    arg+=c;	  }	  else	    arg+=c;	}      }      else if (c==')' || c==',') // last or next argument found      {	if (c==',' && argCount==def->nargs-1 && def->varArgs)	{	  arg=arg.stripWhiteSpace();	  arg+=',';	}	else	{	  QCString argKey;	  argKey.sprintf("@%d",argCount++); // key name	  arg=arg.stripWhiteSpace();	  // add argument to the lookup table	  argTable.insert(argKey, new QCString(arg));	  arg.resize(0);	  if (c==')') // end of the argument list	  {	    done=TRUE;	  }	}      }       else if (c=='\"') // append literal strings      {	arg+=c; 	bool found=FALSE;	while (!found && (cc=getNextChar(expr,rest,j))!=EOF)	{	  found = cc=='"';	  if (cc=='\\')	  {	    c=(char)cc;	  	    arg+=c;	    if ((cc=getNextChar(expr,rest,j))==EOF) break;	  }	  c=(char)cc;	  	  arg+=c;	}      }      else if (c=='\'') // append literal characters      {	arg+=c;	bool found=FALSE;	while (!found && (cc=getNextChar(expr,rest,j))!=EOF)	{	  found = cc=='\'';	  if (cc=='\\')	  {	    c=(char)cc;	  	    arg+=c;	    if ((cc=getNextChar(expr,rest,j))==EOF) break;	  }	  c=(char)cc;	  arg+=c;	}      }	          else // append other characters      {	arg+=c;      }    }  }  // PHASE 2: apply the macro function  if (argCount==def->nargs ||       (argCount>def->nargs && def->varArgs)) // matching parameters lists  {    uint k=0;    // substitution of all formal arguments    QCString resExpr;    const QCString d=def->definition.stripWhiteSpace();    bool inString=FALSE;    while (k<d.length())    {      if (d.at(k)=='@') // maybe a marker, otherwise an escaped @      {	if (d.at(k+1)=='@') // escaped @ => copy it (is unescaped later)	{	  k+=2;	  resExpr+="@@"; // we unescape these later	}	else if (d.at(k+1)=='-') // no-rescan marker	{	  k+=2;	  resExpr+="@-";	}	else // argument marker => read the argument number	{	  QCString key="@";	  QCString *subst=0;	  bool hash=FALSE;	  int l=k-1;	  // search for ## backward	  if (l>=0 && d.at(l)=='"') l--;	  while (l>=0 && d.at(l)==' ') l--;	  if (l>0 && d.at(l)=='#' && d.at(l-1)=='#') hash=TRUE;	  k++;	  // scan the number	  while (k<d.length() && d.at(k)>='0' && d.at(k)<='9') key+=d.at(k++);	  if (!hash) 	  {	    // search for ## forward	    l=k;	    if (l<(int)d.length() && d.at(l)=='"') l++;	    while (l<(int)d.length() && d.at(l)==' ') l++;	    if (l<(int)d.length()-1 && d.at(l)=='#' && d.at(l+1)=='#') hash=TRUE;	  }	  //printf("request key %s result %s\n",key.data(),argTable[key]->data());	  if (key.length()>1 && (subst=argTable[key])) 	  {	    QCString substArg=*subst;	    //printf("substArg=`%s'\n",substArg.data());	    // only if no ## operator is before or after the argument	    // marker we do macro expansion.	    if (!hash) expandExpression(substArg,0,0);	    if (inString)	    {	      //printf("`%s'=stringize(`%s')\n",stringize(*subst).data(),subst->data());	      // if the marker is inside a string (because a # was put 	      // before the macro name) we must escape " and \ characters	      resExpr+=stringize(substArg);	    }	    else	    {	      if (g_nospaces)	      {	        resExpr+=substArg;	      }	      else	      {	        resExpr+=" "+substArg+" ";	      }	    }	  }	}      }      else // no marker, just copy      {	if (!inString && d.at(k)=='\"') 	{	  inString=TRUE; // entering a literal string	}	else if (inString && d.at(k)=='\"' && d.at(k-1)!='\\')	{	  inString=FALSE; // leaving a literal string	}	resExpr+=d.at(k++);      }    }    len=j-pos;    result=resExpr;    //printf("result after substitution `%s' expr=`%s'\n",    //       result.data(),expr.mid(pos,len).data());    return TRUE;  }  else  {    return FALSE;  }}/*! returns the next identifier in string \a expr by starting at position \a p. * The position of the identifier is returned (or -1 if nothing is found) * and \a l is its length. Any quoted strings are skipping during the search. */static int getNextId(const QCString &expr,int p,int *l){  int n;  while (p<(int)expr.length())  {    char c=expr.at(p++);    if (isalpha(c) || c=='_') // read id    {      n=p-1;      while (p<(int)expr.length() && isId(expr.at(p))	    ) p++;      *l=p-n;      return n;     }    else if (c=='"') // skip string    {      char pc=c;      if (p<(int)expr.length()) c=expr.at(p);      while (p<(int)expr.length() && (c!='"' || pc=='\\'))       {	pc=c;	c=expr.at(p);	p++;      }    }  }  return -1;}/*! preforms recursive macro expansion on the string \a expr *  starting at position \a pos. *  May read additional characters from the input while re-scanning! *  If \a expandAll is \c TRUE then all macros in the expression are *  expanded, otherwise only the first is expanded. */static void expandExpression(QCString &expr,QCString *rest,int pos){  //printf("expandExpression(%s,%s)\n",expr.data(),rest ? rest->data() : 0);  QCString macroName;  QCString expMacro;  int i=pos,l,p,len;  while ((p=getNextId(expr,i,&l))!=-1) // search for an macro name  {    bool replaced=FALSE;    macroName=expr.mid(p,l);    //printf("macroName %s found\n",macroName.data());    if (p<2 || !(expr.at(p-2)=='@' && expr.at(p-1)=='-')) // no-rescan marker?    {      if (g_expandedDict->find(macroName)==0) // expand macro      {	Define *def=isDefined(macroName);	if (def && def->nargs==-1) // simple macro	{	  // substitute the definition of the macro	  //printf("macro `%s'->`%s'\n",macroName.data(),def->definition.data());	  if (g_nospaces)	  {	    expMacro=def->definition.stripWhiteSpace();	  }	  else	  {	    expMacro=" "+def->definition.stripWhiteSpace()+" ";	  }	  //expMacro=def->definition.stripWhiteSpace();	  replaced=TRUE;	  len=l;	  //printf("simple macro expansion=`%s'->`%s'\n",macroName.data(),expMacro.data());	}	else if (def && def->nargs>=0) // function macro	{	  replaced=replaceFunctionMacro(expr,rest,p+l,len,def,expMacro);	  len+=l;	}	if (replaced) // expand the macro and rescan the expression	{	    	  //printf("replacing `%s'->`%s'\n",expr.mid(p,len).data(),expMacro.data());	  QCString resultExpr=expMacro;	  QCString restExpr=expr.right(expr.length()-len-p);	  processConcatOperators(resultExpr);	  if (!def->nonRecursive)	  {	    g_expandedDict->insert(macroName,def);	    expandExpression(resultExpr,&restExpr,0);	    g_expandedDict->remove(macroName);	  }	  expr=expr.left(p)+resultExpr+restExpr;	  i=p;	  //printf("new expression: %s\n",expr.data());	}	else // move to the next macro name	{	  //printf("moving to the next macro old=%d new=%d\n",i,p+l);	  i=p+l;	}      }      else // move to the next macro name      {	expr=expr.left(p)+"@-"+expr.right(expr.length()-p);	//printf("macro already expanded, moving to the next macro expr=%s\n",expr.data());	i=p+l+2;	//i=p+l;      }    }    else // no re-scan marker found, skip the macro name    {      //printf("skipping marked macro\n");      i=p+l;    }  }}/*! replaces all occurrences of @@ in \a s by @ *  All identifiers found are replaced by 0L *  \par assumption:  *   \a s only contains pairs of @@'s. */QCString removeIdsAndMarkers(const char *s){  //printf("removeIdsAndMarkers(%s)\n",s);  const char *p=s;  char c;  bool inNum=FALSE;  QCString result;  if (p)  {    while ((c=*p))    {      if (c=='@') // replace @@ with @      {	if (*(p+1)=='@')	{	  result+=c; 	}	p+=2;      }      else if (isdigit(c)) // number      {	result+=c;	p++;        inNum=TRUE;	      }      else if (c=='d') // identifier starting with a `d'      {	if (strncmp(p,"defined ",8)==0 || strncmp(p,"defined(",8)==0) 	           // defined keyword	{	  p+=7; // skip defined	}	else	{	  result+="0L";	  p++;	  while ((c=*p) && isId(c)) p++;	}      }      else if ((isalpha(c) || c=='_') && !inNum) // replace identifier with 0L      {	result+="0L";	p++;	while ((c=*p) && isId(c)) p++;      }   

⌨️ 快捷键说明

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