diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/code.l | 2 | ||||
-rw-r--r-- | src/doc.l | 3 | ||||
-rw-r--r-- | src/doxygen.cpp | 92 | ||||
-rw-r--r-- | src/htmlgen.h | 8 | ||||
-rw-r--r-- | src/memberdef.cpp | 22 | ||||
-rw-r--r-- | src/memberdef.h | 2 | ||||
-rw-r--r-- | src/scanner.l | 24 | ||||
-rw-r--r-- | src/tagreader.cpp | 15 |
8 files changed, 86 insertions, 82 deletions
@@ -1170,7 +1170,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" <Body>[0-9]+ { g_code->codify(yytext); } -<Body>[0-9]+[xX][0-9A-F]+ { +<Body>[0-9]+[xX][0-9A-Fa-f]+ { g_code->codify(yytext); } <MemberCall2,FuncCall>{KEYWORD}/([^a-z_A-Z0-9]) { @@ -1786,6 +1786,9 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG}) } <DocScan>("http:"|"https:"|"ftp:"|"file:"){URLMASK} { outDoc->writeHtmlLink(yytext,yytext); } <DocScan>[a-zA-Z_0-9\.\-]+"@"[0-9a-z_A-Z\.\-]+ { outDoc->writeMailLink(yytext); } +<DocScan>{FILESCHAR}*{FILEECHAR}+/".\\n" { // special exception that is otherwise matches by FILEMASK + generateRef(*outDoc,className,yytext,inSeeBlock); + } <DocScan>{FILEMASK} { generateFileRef(*outDoc,yytext); } diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 8d11d8e..dc95b83 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -424,8 +424,8 @@ static void buildGroupList(Entry *root) static void buildFileList(Entry *root) { if (((root->section==Entry::FILEDOC_SEC) || - ((root->section & Entry::FILE_MASK) && Config::extractAllFlag)) && - !root->name.isEmpty() + ((root->section & Entry::FILE_MASK) && Config::extractAllFlag)) && + !root->name.isEmpty() && !root->tagInfo // skip any file coming from tag files ) { bool ambig; @@ -436,10 +436,10 @@ static void buildFileList(Entry *root) (!root->brief.isEmpty() && !fd->briefDescription().isEmpty())) { warn( - root->fileName,root->startLine, - "Warning: file %s already documented. " - "Skipping documentation.", - root->name.data() + root->fileName,root->startLine, + "Warning: file %s already documented. " + "Skipping documentation.", + root->name.data() ); } else @@ -469,15 +469,15 @@ static void buildFileList(Entry *root) const char *fn = root->fileName.data(); QCString text; text.sprintf("Warning: the name `%s' supplied as " - "the second argument in the \\file statement ", - root->name.data() + "the second argument in the \\file statement ", + root->name.data() ); if (ambig) // name is ambigious { text+="matches the following input files:\n"; text+=showFileDefMatches(Doxygen::inputNameDict,root->name); text+="Please use a more specific name by " - "including a (larger) part of the path!"; + "including a (larger) part of the path!"; } else // name is not an input file { @@ -811,7 +811,7 @@ static void buildNamespaceList(Entry *root) //printf("Found namespace %s in %s at line %d\n",root->name.data(), // root->fileName.data(), root->startLine); NamespaceDef *nd; - if ((nd=Doxygen::namespaceDict[fullName])) + if ((nd=Doxygen::namespaceDict[fullName])) // existing namespace { if (!root->doc.isEmpty() || !root->brief.isEmpty()) // block contains docs { @@ -852,11 +852,7 @@ static void buildNamespaceList(Entry *root) addNamespaceToGroups(root,nd); nd->setRefItems(root->todoId,root->testId,root->bugId); } - else /* if (!root->doc.isEmpty() || - !root->brief.isEmpty() || - Config::extractAllFlag - ) - */ + else // fresh namespace { QCString tagName; if (root->tagInfo) @@ -1390,16 +1386,17 @@ static MemberDef *addVariableToFile( * \returns -1 if this is not a function pointer variable or * the index at which the brace of (...*name) was found. */ -static int findFunctionPtr(const QCString &type) +static int findFunctionPtr(const QCString &type,int *pLength=0) { - static const QRegExp re("([^)]*)"); - int i=-1; + static const QRegExp re("([^)]*"); + int i=-1,l; if (!type.isEmpty() && // return type is non-empty - (i=type.find(re,0))!=-1 && // contains a (* + (i=re.match(type,0,&l))!=-1 && // contains a (* type.find("operator")==-1 && // not an operator type.find(")(")==-1 // not a function pointer return type ) { + if (pLength) *pLength=l; return i; } else @@ -1414,18 +1411,13 @@ static int findFunctionPtr(const QCString &type) void buildVarList(Entry *root) { - int i=-1; if (!root->name.isEmpty() && (root->type.isEmpty() || compoundKeywordDict.find(root->type)==0) && ( (root->section==Entry::VARIABLE_SEC // it's a variable ) || (root->section==Entry::FUNCTION_SEC && // or maybe a function pointer variable - (i=findFunctionPtr(root->type))!=-1 - //!root->type.isEmpty() && // return type is non-empty - // root->type.find(re,0)!=-1 && // contains a (* - // /root->type.find("operator")==-1 && // not an operator - // root->type.find(")(")==-1 // not a function pointer return type + findFunctionPtr(root->type)!=-1 ) ) ) // documented variable @@ -1444,11 +1436,14 @@ void buildVarList(Entry *root) if (root->type.isEmpty() && root->name.find("operator")==-1 && (root->name.find('*')!=-1 || root->name.find('&')!=-1)) { - // recover from parse error caused by redundant braces + // recover from parse error caused by redundant braces + // like in "int *(var[10]);", which is parsed as + // type="" name="int *" args="(var[10])" + root->type=root->name; static const QRegExp reName("[a-z_A-Z][a-z_A-Z0-9]*"); int l; - i=root->args.isEmpty() ? -1 : reName.match(root->args,0,&l); + int i=root->args.isEmpty() ? -1 : reName.match(root->args,0,&l); root->name=root->args.mid(i,l); root->args=root->args.mid(i+l,root->args.find(')',i+l)-i-l); //printf("new: type=`%s' name=`%s' args=`%s'\n", @@ -1456,6 +1451,7 @@ void buildVarList(Entry *root) } else { + int i=findFunctionPtr(root->type); if (i!=-1) // function pointer { int ai = root->type.find('[',i); @@ -1464,7 +1460,7 @@ void buildVarList(Entry *root) root->args.prepend(root->type.right(root->type.length()-ai)); root->type=root->type.left(ai); } - else + else if (root->type.find(')',i)!=-1) // function ptr, not variable like "int (*bla)[10]" { root->type=root->type.left(root->type.length()-1); root->args.prepend(")"); @@ -1473,12 +1469,6 @@ void buildVarList(Entry *root) } QCString scope,name=root->name.copy(); - //int si; - //if ((si=name.findRev("::"))!=-1) - //{ - // scope=name.left(si); - // name=name.right(name.length()-si-2); - //} // find the scope of this variable Entry *p = root->parent; @@ -3781,31 +3771,26 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl static void findMemberDocumentation(Entry *root) { int i=-1,l; - //QRegExp re("([a-z_A-Z0-9: ]*\\*+[ \\*]*"); Debug::print(Debug::FindMembers,0, "root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->memSpec=%d root->mGrpId=%d\n", root->type.data(),root->inside.data(),root->name.data(),root->args.data(),root->section,root->memSpec,root->mGrpId ); bool isFunc=TRUE; - if ( - findFunctionPtr(root->type)!=-1 // func variable/typedef to func ptr - //!root->type.isEmpty() && (i=re.match(root->type,0,&l))!=-1 + if ( // detect func variable/typedef to func ptr + (i=findFunctionPtr(root->type,&l))!=-1 ) { + // fix type and argument root->args+=root->type.right(root->type.length()-i-l); root->type=root->type.left(i+l); isFunc=FALSE; } - //else if (root->name.find(re)!=-1 && root->name.find("operator")==-1) - // // func ptr entered with \fn, \var or \typedef - //{ - // isFunc=FALSE; - //} - else if ((root->type.isEmpty() && root->name.left(8)=="typedef ") - || root->args.find('(')==-1) + else if ((root->type.left(8)=="typedef " && root->args.find('(')!=-1)) + // detect function types marked as functions { isFunc=FALSE; } + //printf("Member %s isFunc=%d\n",root->name.data(),isFunc); if (root->section==Entry::MEMBERDOC_SEC) { @@ -3820,15 +3805,18 @@ static void findMemberDocumentation(Entry *root) findMember(root,root->name,root->relates,TRUE,isFunc); } else if - ((root->section==Entry::FUNCTION_SEC // function + ((root->section==Entry::FUNCTION_SEC // function || - (root->section==Entry::VARIABLE_SEC && // variable - !root->type.isEmpty() && /*root->type.left(8)!="typedef " &&*/ - compoundKeywordDict.find(root->type)==0 + (root->section==Entry::VARIABLE_SEC && // variable + !root->type.isEmpty() && // with a type + compoundKeywordDict.find(root->type)==0 // that is not a keyword + // (to skip forward declaration of class etc.) ) - ) && !root->stat && - (!root->doc.isEmpty() || !root->brief.isEmpty() || /*root->bodyLine!=-1 ||*/ - (root->memSpec&Entry::Inline) || root->mGrpId!=-1 + ) && !root->stat && // not static + (!root->doc.isEmpty() || // has detailed docs + !root->brief.isEmpty() || // has brief docs + (root->memSpec&Entry::Inline) || // is inline + root->mGrpId!=-1 // is part of a group ) ) { diff --git a/src/htmlgen.h b/src/htmlgen.h index c0fb455..baa73a3 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -115,13 +115,7 @@ class HtmlGenerator : public OutputGenerator void writeAnchor(const char *,const char *name) { t << "<a name=\"" << name <<"\"></a>"; } void startCodeFragment() { t << "<div class=\"fragment\"><pre>"; } - void endCodeFragment() { t << "</div></pre>"; } // <- I know this is - // ordered the wrong - // way, but it is - // the only way I know - // to prevent an extra - // blank line - // (with netscape) + void endCodeFragment() { t << "</pre></div>"; } void startPreFragment() { t << "<pre>"; } void endPreFragment() { t << "</pre>"; } void startCodeLine() { col=0; } diff --git a/src/memberdef.cpp b/src/memberdef.cpp index a48f284..1756970 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -1475,17 +1475,17 @@ QCString MemberDef::getScopeString() const } -Definition *MemberDef::getCompoundDef() const -{ - NamespaceDef *nd=getNamespaceDef(); - ClassDef *cd=getClassDef(); - FileDef *fd=getFileDef(); - GroupDef *gd=getGroupDef(); - Definition *d = 0; - if (cd) d=cd; else if (nd) d=nd; else if (gd) d=gd; else d=fd; - ASSERT(d!=0); - return d; -} +//Definition *MemberDef::getCompoundDef() const +//{ +// NamespaceDef *nd=getNamespaceDef(); +// ClassDef *cd=getClassDef(); +// FileDef *fd=getFileDef(); +// GroupDef *gd=getGroupDef(); +// Definition *d = 0; +// if (cd) d=cd; else if (nd) d=nd; else if (gd) d=gd; else d=fd; +// ASSERT(d!=0); +// return d; +//} QCString MemberDef::anchor() const { diff --git a/src/memberdef.h b/src/memberdef.h index a939853..ee60338 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -88,7 +88,7 @@ class MemberDef : public Definition GroupDef *getGroupDef() const { return group; } FileDef *getFileDef() const { return fileDef; } NamespaceDef* getNamespaceDef() const { return nspace; } - Definition *getCompoundDef() const; + //Definition *getCompoundDef() const; // direct kind info Protection protection() const { return prot; } diff --git a/src/scanner.l b/src/scanner.l index 72cee53..5bd5c0b 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -1136,7 +1136,9 @@ TITLE [tT][iI][tT][lL][eE] } <DefineEnd>. -<FindMembers>[*&]+ { current->name += yytext ; } +<FindMembers>[*&]+ { current->name += yytext ; + addType( current ); + } <FindMembers,MemberSpec,Function,NextSemi,BitFields,ReadInitializer>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" { lineCount(); if (current->bodyLine==-1) @@ -1677,7 +1679,7 @@ TITLE [tT][iI][tT][lL][eE] } <ReadBody>. { current->program += yytext ; } -<FindMembers>"("({BN}*{ID}{BN}*"::")*({BN}*"*"{BN}*)+ { +<FindMembers>("("({BN}*{ID}{BN}*"::")*({BN}*"*"{BN}*)+)+ { current->bodyLine = yyLineNr; lineCount(); addType(current); @@ -1769,13 +1771,17 @@ TITLE [tT][iI][tT][lL][eE] <FuncFuncType>. { current->type += *yytext; } -<FindMembers>"(" { current->args = yytext; - current->bodyLine = yyLineNr; - currentArgumentContext = FuncQual; - fullArgString=current->args.copy(); - copyArgString=¤t->args; - BEGIN( ReadFuncArgType ) ; - //printf(">>> Read function arguments!\n"); +<FindMembers>"(" { + if (!current->name.isEmpty()) + { + current->args = yytext; + current->bodyLine = yyLineNr; + currentArgumentContext = FuncQual; + fullArgString=current->args.copy(); + copyArgString=¤t->args; + BEGIN( ReadFuncArgType ) ; + //printf(">>> Read function arguments!\n"); + } } /* <FindMembers>"("{BN}*("void"{BN}*)?")" { diff --git a/src/tagreader.cpp b/src/tagreader.cpp index 9070103..bb9e76d 100644 --- a/src/tagreader.cpp +++ b/src/tagreader.cpp @@ -857,6 +857,19 @@ void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members) } } +static QString stripPath(const QString &s) +{ + int i=s.findRev('/'); + if (i!=-1) + { + return s.right(s.length()-i-1); + } + else + { + return s; + } +} + void TagFileParser::buildLists(Entry *root) { // build class list @@ -902,7 +915,7 @@ void TagFileParser::buildLists(Entry *root) ti->fileName = tfi->filename; fe->tagInfo = ti; - QString fullName = m_tagName+":"+tfi->path+tfi->name; + QString fullName = m_tagName+":"+tfi->path+stripPath(tfi->name); fe->fileName = fullName; FileDef *fd = new FileDef(m_tagName+":"+tfi->path,tfi->name,m_tagName); FileName *mn; |