diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/classdef.cpp | 23 | ||||
-rw-r--r-- | src/classdef.h | 1 | ||||
-rw-r--r-- | src/code.l | 5 | ||||
-rw-r--r-- | src/config.l | 30 | ||||
-rw-r--r-- | src/doc.l | 2 | ||||
-rw-r--r-- | src/dot.cpp | 22 | ||||
-rw-r--r-- | src/doxygen.cpp | 301 | ||||
-rw-r--r-- | src/doxygen.h | 12 | ||||
-rw-r--r-- | src/filedef.cpp | 21 | ||||
-rw-r--r-- | src/filedef.h | 2 | ||||
-rw-r--r-- | src/groupdef.cpp | 37 | ||||
-rw-r--r-- | src/groupdef.h | 19 | ||||
-rw-r--r-- | src/index.cpp | 40 | ||||
-rw-r--r-- | src/latexgen.cpp | 19 | ||||
-rw-r--r-- | src/memberdef.cpp | 17 | ||||
-rw-r--r-- | src/memberdef.h | 1 | ||||
-rw-r--r-- | src/membergroup.cpp | 5 | ||||
-rw-r--r-- | src/membergroup.h | 1 | ||||
-rw-r--r-- | src/memberlist.cpp | 21 | ||||
-rw-r--r-- | src/memberlist.h | 1 | ||||
-rw-r--r-- | src/membername.h | 47 | ||||
-rw-r--r-- | src/namespacedef.cpp | 19 | ||||
-rw-r--r-- | src/namespacedef.h | 1 | ||||
-rw-r--r-- | src/page.h | 10 | ||||
-rw-r--r-- | src/pre.l | 8 | ||||
-rw-r--r-- | src/rtfgen.cpp | 86 | ||||
-rw-r--r-- | src/translator_en.h | 14 | ||||
-rw-r--r-- | src/util.cpp | 181 | ||||
-rw-r--r-- | src/util.h | 9 |
29 files changed, 561 insertions, 394 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp index 69d15ca..8111928 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -2354,3 +2354,26 @@ QCString ClassDef::className() const } return className; }; + +void ClassDef::addListReferences() +{ + addRefItem(todoId(),testId(),bugId(), + theTranslator->trClass(TRUE,TRUE), + getOutputFileBase(),name() + ); + MemberGroupListIterator mgli(*m_memberGroupList); + MemberGroup *mg; + for (;(mg=mgli.current());++mgli) + { + mg->addListReferences(this); + } + constructors.addListReferences(this); + typedefMembers.addListReferences(this); + enumMembers.addListReferences(this); + enumValMembers.addListReferences(this); + functionMembers.addListReferences(this); + relatedMembers.addListReferences(this); + variableMembers.addListReferences(this); + propertyMembers.addListReferences(this); +} + diff --git a/src/classdef.h b/src/classdef.h index 5756c9f..e42ef6b 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -272,6 +272,7 @@ class ClassDef : public Definition void addMembersToTemplateInstance(ClassDef *cd,const char *templSpec); void setClassIsArtificial() { m_artificial = TRUE; } void setIsStatic(bool b) { m_isStatic=b; } + void addListReferences(); /*! Creates a new compound definition. * \param outerScope class, file or namespace in which this class is @@ -1091,11 +1091,6 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" int s=0;while (!isId(yytext[s])) s++; int e=yyleng-1;while (!isId(yytext[e])) e--; QCString varname = ((QCString)yytext).mid(s,e-s+1); - //QCString text=yytext; - //QCString tmp=varname.copy(); - //g_code->codify(text.left(s+1)); - //generateClassLink(*g_code,tmp.data()); - //g_code->codify(text.right(yyleng-e-1)); addType(); g_name=varname; } diff --git a/src/config.l b/src/config.l index 006bd7e..456330b 100644 --- a/src/config.l +++ b/src/config.l @@ -1307,13 +1307,6 @@ void Config::create() FALSE ); cb = addBool( - "CLASS_DIAGRAMS", - "If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will \n" - "generate a class diagram (in Html and LaTeX) for classes with base or \n" - "super classes. Setting the tag to NO turns the diagrams off. \n", - TRUE - ); - cb = addBool( "SOURCE_BROWSER", "If the SOURCE_BROWSER tag is set to YES then a list of source files will \n" "be generated. Documented entities will be cross-referenced with these sources. \n", @@ -1717,8 +1710,10 @@ void Config::create() "If the GENERATE_TREEVIEW tag is set to YES, a side panel will be\n" "generated containing a tree-like index structure (just like the one that \n" "is generated for HTML Help). For this to work a browser that supports \n" - "JavaScript and frames is required (for instance Netscape 4.0+ \n" - "or Internet explorer 4.0+). ", + "JavaScript and frames is required (for instance Mozilla, Netscape 4.0+, \n" + "or Internet explorer 4.0+). Note that for large projects the tree generation \n" + "can take a very long time. In such cases it is better to disable this feature. \n" + "Windows users are probably better off using the HTML help feature. \n", FALSE ); cb->addDependency("GENERATE_HTML"); @@ -2021,6 +2016,15 @@ void Config::create() addInfo( "Dot","Configuration options related to the dot tool "); //----------------------------------------------------------------------------------------------- cb = addBool( + "CLASS_DIAGRAMS", + "If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will \n" + "generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or \n" + "super classes. Setting the tag to NO turns the diagrams off. Note that this \n" + "option is superceded by the HAVE_DOT option below. This is only a fallback. It is \n" + "recommended to install and use dot, since it yield more powerful graphs. \n", + TRUE + ); + cb = addBool( "HAVE_DOT", "If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is \n" "available from the path. This tool is part of Graphviz, a graph visualization \n" @@ -2054,6 +2058,14 @@ void Config::create() ); cb->addDependency("HAVE_DOT"); cb = addBool( + "HIDE_UNDOC_RELATIONS", + "If set to YES, the inheritance and collaboration graphs will hide \n" + "inheritance and usage relations if the target is undocumented \n" + "or is not a class. \n", + TRUE + ); + cb->addDependency("HAVE_DOT"); + cb = addBool( "INCLUDE_GRAPH", "If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT \n" "tags are set to YES then doxygen will generate a graph for each documented \n" @@ -2223,7 +2223,7 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG}) <DocScan>{CMD}("\\"|"@"|"<"|">"|"&"|"$"|"#"|"%") { outDoc->docify(&yytext[1]); } -<DocScan,DocEmphasis,DocBold,DocCode>"%"[a-zA-Z_0-9\-]+ { +<DocScan,DocEmphasis,DocBold,DocCode>"%"[a-z_A-Z][a-z_A-Z0-9:\-]* { outDoc->docify(yytext+1); } <DocEmphasis>{FILEMASK} { diff --git a/src/dot.cpp b/src/dot.cpp index 1b1bc96..48bf311 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -1530,6 +1530,7 @@ void generateGraphLegend(const char *path) return; } QTextStream dotText(&dotFile); +#if 0 dotText << "digraph inheritance\n"; dotText << "{\n"; dotText << " Node7 [shape=\"box\",label=\"Inherited\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\",color=\"black\",style=\"filled\" fontcolor=\"white\"];\n"; @@ -1546,6 +1547,27 @@ void generateGraphLegend(const char *path) dotText << " Node14 -> Node7 [dir=back,color=\"darkorchid3\",fontsize=10,style=\"dashed\",label=\"m_usedClass\",fontname=\"doxfont\"];\n"; dotText << " Node14 [shape=\"box\",label=\"Used\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\",color=\"black\",URL=\"$class_used.html\"];\n"; dotText << "}\n"; +#endif + dotText << "digraph inheritance\n"; + dotText << "{\n"; + dotText << " Node9 [shape=\"box\",label=\"Inherited\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\",color=\"black\",style=\"filled\" fontcolor=\"white\"];\n"; + dotText << " Node10 -> Node9 [dir=back,color=\"midnightblue\",fontsize=10,style=\"solid\",fontname=\"doxfont\"];\n"; + dotText << " Node10 [shape=\"box\",label=\"PublicBase\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\",color=\"black\",URL=\"$classPublicBase.html\"];\n"; + dotText << " Node11 -> Node10 [dir=back,color=\"midnightblue\",fontsize=10,style=\"solid\",fontname=\"doxfont\"];\n"; + dotText << " Node11 [shape=\"box\",label=\"Truncated\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\",color=\"red\",URL=\"$classTruncated.html\"];\n"; + dotText << " Node13 -> Node9 [dir=back,color=\"darkgreen\",fontsize=10,style=\"solid\",fontname=\"doxfont\"];\n"; + dotText << " Node13 [shape=\"box\",label=\"ProtectedBase\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\",color=\"black\",URL=\"$classProtectedBase.html\"];\n"; + dotText << " Node14 -> Node9 [dir=back,color=\"firebrick4\",fontsize=10,style=\"solid\",fontname=\"doxfont\"];\n"; + dotText << " Node14 [shape=\"box\",label=\"PrivateBase\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\",color=\"black\",URL=\"$classPrivateBase.html\"];\n"; + dotText << " Node15 -> Node9 [dir=back,color=\"midnightblue\",fontsize=10,style=\"solid\",fontname=\"doxfont\"];\n"; + dotText << " Node15 [shape=\"box\",label=\"Undocumented\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\",color=\"grey75\"];\n"; + dotText << " Node16 -> Node9 [dir=back,color=\"midnightblue\",fontsize=10,style=\"solid\",fontname=\"doxfont\"];\n"; + dotText << " Node16 [shape=\"box\",label=\"Templ< int >\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\",color=\"black\",URL=\"$classTempl.html\"];\n"; + dotText << " Node17 -> Node16 [dir=back,color=\"orange\",fontsize=10,style=\"dashed\",label=\"< int >\",fontname=\"doxfont\"];\n"; + dotText << " Node17 [shape=\"box\",label=\"Templ< T >\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\",color=\"black\",URL=\"$classTempl.html\"];\n"; + dotText << " Node18 -> Node9 [dir=back,color=\"darkorchid3\",fontsize=10,style=\"dashed\",label=\"m_usedClass\",fontname=\"doxfont\"];\n"; + dotText << " Node18 [shape=\"box\",label=\"Used\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\",color=\"black\",URL=\"$classUsed.html\"];\n"; + dotText << "}\n"; dotFile.close(); QDir d(path); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index cebde46..1605da3 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -85,8 +85,8 @@ MemberNameSDict Doxygen::functionNameSDict(10000); FileNameList Doxygen::inputNameList; // all input files FileNameDict *Doxygen::inputNameDict; -GroupList Doxygen::groupList; // all groups -GroupDict Doxygen::groupDict(257); +//GroupList Doxygen::groupList; // all groups +GroupSDict Doxygen::groupSDict(17); FormulaList Doxygen::formulaList; // all formulas FormulaDict Doxygen::formulaDict(1009); // all formulas @@ -132,7 +132,7 @@ void clearAll() //Doxygen::memberNameList.clear(); //Doxygen::functionNameList.clear(); Doxygen::inputNameList.clear(); - Doxygen::groupList.clear(); + //Doxygen::groupList.clear(); Doxygen::formulaList.clear(); Doxygen::classSDict.clear(); //Doxygen::memberNameDict.clear(); @@ -143,7 +143,7 @@ void clearAll() Doxygen::exampleNameDict->clear(); Doxygen::imageNameDict->clear(); Doxygen::dotFileNameDict->clear(); - Doxygen::groupDict.clear(); + //Doxygen::groupDict.clear(); Doxygen::formulaDict.clear(); Doxygen::formulaNameDict.clear(); Doxygen::tagDestinationDict.clear(); @@ -175,8 +175,8 @@ void statistics() //Doxygen::typedefDict.statistics(); fprintf(stderr,"--- namespaceAliasDict stats ----\n"); Doxygen::namespaceAliasDict.statistics(); - fprintf(stderr,"--- groupDict stats ----\n"); - Doxygen::groupDict.statistics(); + //fprintf(stderr,"--- groupDict stats ----\n"); + //Doxygen::groupDict.statistics(); fprintf(stderr,"--- formulaDict stats ----\n"); Doxygen::formulaDict.statistics(); fprintf(stderr,"--- formulaNameDict stats ----\n"); @@ -203,79 +203,6 @@ QCString spaces; //---------------------------------------------------------------------------- -static void addRelatedPage(const char *name,const QCString &ptitle, - const QCString &doc,QList<QCString> *anchors, - const char *fileName,int startLine, - int todoId,int testId,int bugId,GroupDef *gd=0, - TagInfo *tagInfo=0 - ) -{ - PageInfo *pi=0; - if ((pi=Doxygen::pageSDict->find(name)) && !tagInfo) - { - // append documentation block to the page. - pi->doc+="\n\n"+doc; - } - else // new page - { - QCString baseName=name; - if (baseName.right(4)==".tex") - baseName=baseName.left(baseName.length()-4); - else if (baseName.right(5)==".html") - baseName=baseName.left(baseName.length()-5); - - QCString title=ptitle.stripWhiteSpace(); - pi=new PageInfo(fileName,startLine,baseName,doc,title); - pi->todoId=todoId; - pi->testId=testId; - pi->bugId=bugId; - if (tagInfo) - { - pi->reference = tagInfo->tagName; - } - - QCString pageName; - if (Config_getBool("CASE_SENSE_NAMES")) - pageName=pi->name.copy(); - else - pageName=pi->name.lower(); - //setFileNameForSections(anchors,pageName,pi); - pi->fileName = pageName; - pi->addSections(anchors); - - Doxygen::pageSDict->append(baseName,pi); - - if (gd) gd->addPage(pi); - - if (!pi->title.isEmpty()) - { - //outputList->writeTitle(pi->name,pi->title); - - // a page name is a label as well! - SectionInfo *si=new SectionInfo( - pi->name,pi->title,SectionInfo::Section,pi->reference); - if (gd) - { - si->fileName=gd->getOutputFileBase(); - } - else if (pi->inGroup) - { - si->fileName=pi->inGroup->getOutputFileBase().copy(); - } - else - { - si->fileName=pageName; - } - //printf("si->label=`%s' si->definition=%s si->fileName=`%s'\n", - // si->label.data(),si->definition?si->definition->name().data():"<none>", - // si->fileName.data()); - //printf(" SectionInfo: sec=%p sec->fileName=%s\n",si,si->fileName.data()); - //printf("Adding section info %s\n",pi->name.data()); - Doxygen::sectionDict.insert(pageName,si); - } - } -} - static void addRelatedPage(Entry *root) { GroupDef *gd=0; @@ -283,7 +210,7 @@ static void addRelatedPage(Entry *root) Grouping *g; for (;(g=gli.current());++gli) { - if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname])) break; + if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) break; } addRelatedPage(root->name,root->args,root->doc,root->anchors, root->fileName,root->startLine,root->todoId, @@ -291,107 +218,6 @@ static void addRelatedPage(Entry *root) ); } -//---------------------------------------------------------------------------- - -static void addRefItem(int todoId,int testId,int bugId,const char *prefix, - const char *name,const char *title,const char *args=0) -{ - - //printf("addRefItem(%s) todoId=%d testId=%d bugId=%d\n",name,todoId,testId,bugId); - - //////////////////////////////////////////////////////////// - // add item to the todo list - //////////////////////////////////////////////////////////// - - if (todoId>0 && Config_getBool("GENERATE_TODOLIST")) - { - RefItem *item = todoList.getRefItem(todoId); - ASSERT(item!=0); - if (item->written) return; - - QCString doc; - doc += "<dl><dt>\\anchor "; - doc += item->listAnchor; - doc += "\n"; - doc += prefix; - doc += " \\_internalref "; - doc += name; - doc += " \""; - doc += title; - doc += "\""; - if (args) doc += args; - doc += "</dt>\n<dd>"; - doc += item->text; - doc += "</dd></dl>\n"; - //printf("Todo page: %s\n",doc.data()); - addRelatedPage("todo",theTranslator->trTodoList(),doc,0,"generated",1,0,0,0); - - item->written=TRUE; - } - - //////////////////////////////////////////////////////////// - // add item to the test list - //////////////////////////////////////////////////////////// - - if (testId>0 && Config_getBool("GENERATE_TESTLIST")) - { - RefItem *item = testList.getRefItem(testId); - ASSERT(item!=0); - if (item->written) return; - - QCString doc; - doc += "<dl><dt>\\anchor "; - doc += item->listAnchor; - doc += "\n"; - doc += prefix; - doc += " \\_internalref "; - doc += name; - doc += " \""; - doc += title; - doc += "\""; - if (args) doc += args; - doc += "</dt>\n<dd>"; - doc += item->text; - doc += "</dd></dl>\n"; - //printf("Test page: %s\n",doc.data()); - addRelatedPage("test",theTranslator->trTestList(),doc,0,"generated",1,0,0,0); - - item->written=TRUE; - } - - //////////////////////////////////////////////////////////// - // add item to the bug list - //////////////////////////////////////////////////////////// - - if (bugId>0 && Config_getBool("GENERATE_BUGLIST")) - { - RefItem *item = bugList.getRefItem(bugId); - ASSERT(item!=0); - if (item->written) return; - - QCString doc; - doc += "<dl><dt>\\anchor "; - doc += item->listAnchor; - doc += "\n"; - doc += prefix; - doc += " \\_internalref "; - doc += name; - doc += " \""; - doc += title; - doc += "\""; - if (args) doc += args; - doc += "</dt>\n<dd>"; - doc += item->text; - doc += "</dd></dl>\n"; - //printf("Bug page: %s\n",doc.data()); - addRelatedPage("bug",theTranslator->trBugList(),doc,0,"generated",1,0,0,0); - - item->written=TRUE; - } -} - -//---------------------------------------------------------------------------- - static void buildGroupList(Entry *root) { @@ -401,7 +227,7 @@ static void buildGroupList(Entry *root) GroupDef *gd; - if ((gd=Doxygen::groupDict[root->name])) + if ((gd=Doxygen::groupSDict[root->name])) { if ( root->groupdoctype==Entry::GROUPDOC_NORMAL ) { @@ -438,8 +264,9 @@ static void buildGroupList(Entry *root) gd->setBriefDescription(root->brief); gd->setDocumentation(root->doc); gd->addSectionsToDefinition(root->anchors); - Doxygen::groupList.append(gd); - Doxygen::groupDict.insert(root->name,gd); + //Doxygen::groupList.append(gd); + //Doxygen::groupDict.insert(root->name,gd); + Doxygen::groupSDict.append(root->name,gd); gd->setRefItems(root->todoId,root->testId,root->bugId); } } @@ -457,7 +284,7 @@ static void organizeSubGroups(Entry *root) { GroupDef *gd; - if ((gd=Doxygen::groupDict[root->name])) + if ((gd=Doxygen::groupSDict[root->name])) { addGroupToGroups(root,gd); } @@ -507,7 +334,7 @@ static void buildFileList(Entry *root) for (;(g=gli.current());++gli) { GroupDef *gd=0; - if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname])) + if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) { gd->addFile(fd); //printf("File %s: in group %s\n",fd->name().data(),s->data()); @@ -1158,7 +985,7 @@ static void findUsingDirectives(Entry *root) for (;(g=gli.current());++gli) { GroupDef *gd=0; - if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname])) + if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) gd->addNamespace(nd); } @@ -1500,7 +1327,7 @@ static MemberDef *addVariableToFile( // merge ingroup specifiers if (md->getGroupDef()==0 && root->groups->first()) { - GroupDef *gd=Doxygen::groupDict[root->groups->first()->groupname.data()]; + GroupDef *gd=Doxygen::groupSDict[root->groups->first()->groupname.data()]; md->setGroupDef(gd, root->groups->first()->pri, root->fileName, root->startLine, root->doc.length() != 0); } else if (md->getGroupDef()!=0 && root->groups->count()==0) @@ -2078,7 +1905,7 @@ static void buildFunctionList(Entry *root) // merge ingroup specifiers if (md->getGroupDef()==0 && root->groups->first()) { - GroupDef *gd=Doxygen::groupDict[root->groups->first()->groupname.data()]; + GroupDef *gd=Doxygen::groupSDict[root->groups->first()->groupname.data()]; md->setGroupDef(gd, root->groups->first()->pri, root->fileName, root->startLine, root->doc.length() != 0); } else if (md->getGroupDef()!=0 && root->groups->count()==0) @@ -2544,17 +2371,13 @@ static void findUsedClassesForClass(Entry *root, usedCd = new ClassDef( masterCd->getDefFileName(),masterCd->getDefLine(), usedName,ClassDef::Class); - //usedCd->setIsTemplateBaseClass(count); Doxygen::hiddenClasses.append(usedName,usedCd); } - if (isArtificial) usedCd->setClassIsArtificial(); - instanceCd->addUsedClass(usedCd,md->name()); - - //if (m_usesImplClassDict==0) m_usesImplClassDict = new UsesClassDict(257); - //UsesClassDef *ucd = new UsesClassDef(cd); - //m_usesImplClassDict->insert(cd->name(),ucd); - //ucd->templSpecifiers = templSpec; - //ucd->addAccessor(md->name()); + if (usedCd) + { + if (isArtificial) usedCd->setClassIsArtificial(); + instanceCd->addUsedClass(usedCd,md->name()); + } } } } @@ -2596,7 +2419,7 @@ static void findUsedClassesForClass(Entry *root, if (!found && !type.isEmpty()) // used class is not documented in any scope { ClassDef *usedCd = Doxygen::hiddenClasses.find(type); - if (usedCd==0) + if (usedCd==0 && !Config_getBool("HIDE_UNDOC_RELATIONS")) { Debug::print(Debug::Classes,0," New undocumented used class `%s'\n", type.data()); usedCd = new ClassDef( @@ -2604,8 +2427,11 @@ static void findUsedClassesForClass(Entry *root, type,ClassDef::Class); Doxygen::hiddenClasses.append(type,usedCd); } - if (isArtificial) usedCd->setClassIsArtificial(); - instanceCd->addUsedClass(usedCd,md->name()); + if (usedCd) + { + if (isArtificial) usedCd->setClassIsArtificial(); + instanceCd->addUsedClass(usedCd,md->name()); + } } } } @@ -2653,8 +2479,11 @@ static void findBaseClassesForClass( // find a documented base class in the correct scope if (!findClassRelation(root,instanceCd,&tbi,templateNames,DocumentedOnly,isArtificial)) { - // no documented base class -> try to find an undocumented one - findClassRelation(root,instanceCd,&tbi,templateNames,Undocumented,isArtificial); + if (!Config_getBool("HIDE_UNDOC_RELATIONS")) + { + // no documented base class -> try to find an undocumented one + findClassRelation(root,instanceCd,&tbi,templateNames,Undocumented,isArtificial); + } } } else if (mode==TemplateInstances) @@ -3233,16 +3062,17 @@ static void computeMemberReferences() { nd->computeAnchors(); } - GroupDef *gd=Doxygen::groupList.first(); - while (gd) + GroupSDict::Iterator gli(Doxygen::groupSDict); + GroupDef *gd; + for (gli.toFirst();(gd=gli.current());++gli) { gd->computeAnchors(); - gd=Doxygen::groupList.next(); } } //---------------------------------------------------------------------- +#if 0 static void addClassMemberTodoTestBugReferences(Definition *compound) { MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict); @@ -3308,8 +3138,9 @@ static void addFileMemberTodoTestBugReferences(Definition *compound) } } } +#endif -static void addTodoTestBugReferences() +static void addListReferences() { MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict); MemberName *mn=0; @@ -3337,11 +3168,7 @@ static void addTodoTestBugReferences() ClassDef *cd=0; for (cli.toFirst();(cd=cli.current());++cli) { - addRefItem(cd->todoId(),cd->testId(),cd->bugId(), - theTranslator->trClass(TRUE,TRUE), - cd->getOutputFileBase(),cd->name() - ); - addClassMemberTodoTestBugReferences(cd); + cd->addListReferences(); } FileName *fn=Doxygen::inputNameList.first(); while (fn) @@ -3349,10 +3176,7 @@ static void addTodoTestBugReferences() FileDef *fd=fn->first(); while (fd) { - addRefItem(fd->todoId(),fd->testId(),fd->bugId(), - theTranslator->trFile(TRUE,TRUE), - fd->getOutputFileBase(),fd->name()); - addFileMemberTodoTestBugReferences(fd); + fd->addListReferences(); fd=fn->next(); } fn=Doxygen::inputNameList.next(); @@ -3361,21 +3185,15 @@ static void addTodoTestBugReferences() NamespaceDef *nd=0; for (nli.toFirst();(nd=nli.current());++nli) { - addRefItem(nd->todoId(),nd->testId(),nd->bugId(), - theTranslator->trNamespace(TRUE,TRUE), - nd->getOutputFileBase(),nd->name()); - addFileMemberTodoTestBugReferences(nd); + nd->addListReferences(); } - GroupDef *gd=Doxygen::groupList.first(); - while (gd) + GroupSDict::Iterator gli(Doxygen::groupSDict); + GroupDef *gd; + for (gli.toFirst();(gd=gli.current());++gli) { - addRefItem(gd->todoId(),gd->testId(),gd->bugId(), - theTranslator->trGroup(TRUE,TRUE), - gd->getOutputFileBase(),gd->groupTitle()); - addFileMemberTodoTestBugReferences(gd); - gd=Doxygen::groupList.next(); + gd->addListReferences(); } - PageSDictIterator pdi(*Doxygen::pageSDict); + PageSDict::Iterator pdi(*Doxygen::pageSDict); PageInfo *pi=0; for (pdi.toFirst();(pi=pdi.current());++pdi) { @@ -3383,8 +3201,6 @@ static void addTodoTestBugReferences() theTranslator->trPage(TRUE,TRUE), pi->name,pi->title); } - addClassMemberTodoTestBugReferences(0); - addFileMemberTodoTestBugReferences(0); } //---------------------------------------------------------------------- @@ -5276,11 +5092,11 @@ static void addMembersToMemberGroup() nd->addMembersToMemberGroup(); } // for each group - GroupDef *gd=Doxygen::groupList.first(); - while (gd) + GroupSDict::Iterator gli(Doxygen::groupSDict); + GroupDef *gd; + for (gli.toFirst();(gd=gli.current());++gli) { gd->addMembersToMemberGroup(); - gd=Doxygen::groupList.next(); } } @@ -5315,11 +5131,11 @@ static void distributeMemberGroupDocumentation() nd->distributeMemberGroupDocumentation(); } // for each group - GroupDef *gd=Doxygen::groupList.first(); - while (gd) + GroupSDict::Iterator gli(Doxygen::groupSDict); + GroupDef *gd; + for (gli.toFirst();(gd=gli.current());++gli) { gd->distributeMemberGroupDocumentation(); - gd=Doxygen::groupList.next(); } } @@ -5640,7 +5456,7 @@ static void resolveUserReferences() static void generatePageDocs() { if (documentedPages==0) return; - PageSDictIterator pdi(*Doxygen::pageSDict); + PageSDict::Iterator pdi(*Doxygen::pageSDict); PageInfo *pi=0; for (pdi.toFirst();(pi=pdi.current());++pdi) { @@ -5733,7 +5549,7 @@ static void buildExampleList(Entry *root) static void generateExampleDocs() { outputList->disable(OutputGenerator::Man); - PageSDictIterator pdi(*Doxygen::exampleSDict); + PageSDict::Iterator pdi(*Doxygen::exampleSDict); PageInfo *pi=0; for (pdi.toFirst();(pi=pdi.current());++pdi) { @@ -5754,9 +5570,9 @@ static void generateExampleDocs() static void generateGroupDocs() { - GroupListIterator gli(Doxygen::groupList); + GroupSDict::Iterator gli(Doxygen::groupSDict); GroupDef *gd; - for (;(gd=gli.current());++gli) + for (gli.toFirst();(gd=gli.current());++gli) { if (!gd->isReference()) { @@ -6758,6 +6574,9 @@ void readConfiguration(int argc, char **argv) void parseInput() { + + Doxygen::classSDict.setAutoDelete(TRUE); + Doxygen::inputNameDict = new FileNameDict(1009); Doxygen::includeNameDict = new FileNameDict(1009); Doxygen::exampleNameDict = new FileNameDict(1009); @@ -7195,7 +7014,7 @@ void parseInput() addSourceReferences(); msg("Adding todo/test/bug list items...\n"); - addTodoTestBugReferences(); + addListReferences(); } diff --git a/src/doxygen.h b/src/doxygen.h index 913337c..af3d208 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -67,13 +67,10 @@ class Doxygen static FileNameDict *includeNameDict; static FileNameDict *exampleNameDict; static FileNameDict *inputNameDict; + static FileNameList inputNameList; static FileNameDict *imageNameDict; static FileNameDict *dotFileNameDict; static QStrList tagfileList; - //static MemberNameList memberNameList; - //static MemberNameList functionNameList; - //static MemberNameDict memberNameDict; - //static MemberNameDict functionNameDict; static MemberNameSDict memberNameSDict; static MemberNameSDict functionNameSDict; static FileList fileList; @@ -81,12 +78,9 @@ class Doxygen static ClassDef unrelatedClass; static QTextStream tagFile; static SectionDict sectionDict; - static FileNameList inputNameList; static StringDict namespaceAliasDict; - static GroupList groupList; - static GroupDict groupDict; - //static NamespaceList namespaceList; - //static NamespaceDict namespaceDict; + //static GroupList groupList; + static GroupSDict groupSDict; static NamespaceSDict namespaceSDict; static FormulaList formulaList; static FormulaDict formulaDict; diff --git a/src/filedef.cpp b/src/filedef.cpp index 37d6b20..9384952 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -654,3 +654,24 @@ bool FileDef::generateSourceFile() const extension!=".doc" && extension!=".txt" && extension!=".dox"; } + +void FileDef::addListReferences() +{ + addRefItem(todoId(),testId(),bugId(), + theTranslator->trFile(TRUE,TRUE), + getOutputFileBase(),name() + ); + MemberGroupListIterator mgli(*memberGroupList); + MemberGroup *mg; + for (;(mg=mgli.current());++mgli) + { + mg->addListReferences(this); + } + docDefineMembers.addListReferences(this); + docProtoMembers.addListReferences(this); + docTypedefMembers.addListReferences(this); + docEnumMembers.addListReferences(this); + docFuncMembers.addListReferences(this); + docVarMembers.addListReferences(this); +} + diff --git a/src/filedef.h b/src/filedef.h index 79525b0..77c8aa8 100644 --- a/src/filedef.h +++ b/src/filedef.h @@ -146,6 +146,8 @@ class FileDef : public Definition void addMembersToMemberGroup(); void distributeMemberGroupDocumentation(); + void addListReferences(); + //void generateXML(QTextStream &t); //void generateXMLSection(QTextStream &t,MemberList *ml,const char *type); diff --git a/src/groupdef.cpp b/src/groupdef.cpp index 3f21215..ec43b56 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -62,7 +62,6 @@ GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t) : docProtoMembers.setInGroup(TRUE); docTypedefMembers.setInGroup(TRUE); docEnumMembers.setInGroup(TRUE); - docEnumValMembers.setInGroup(TRUE); docFuncMembers.setInGroup(TRUE); docVarMembers.setInGroup(TRUE); @@ -290,8 +289,6 @@ void GroupDef::removeMember(MemberDef *md) docEnumMembers.remove(md); break; case MemberDef::EnumValue: - decEnumValMembers.remove(md); - docEnumValMembers.remove(md); break; case MemberDef::Prototype: decProtoMembers.remove(md); @@ -527,7 +524,7 @@ void GroupDef::writeDocumentation(OutputList &ol) } } PageInfo *pi=0; - PageSDictIterator pdi(*pageDict); + PageSDict::Iterator pdi(*pageDict); for (pdi.toFirst();(pi=pdi.current());++pdi) { if (!pi->isReference()) @@ -590,7 +587,7 @@ void addClassToGroups(Entry *root,ClassDef *cd) for (;(g=gli.current());++gli) { GroupDef *gd=0; - if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname])) + if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) { gd->addClass(cd); //printf("Compound %s: in group %s\n",cd->name().data(),s->data()); @@ -607,7 +604,7 @@ void addNamespaceToGroups(Entry *root,NamespaceDef *nd) { GroupDef *gd=0; //printf("group `%s'\n",s->data()); - if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname])) + if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) { gd->addNamespace(nd); //printf("Namespace %s: in group %s\n",nd->name().data(),s->data()); @@ -622,7 +619,7 @@ void addGroupToGroups(Entry *root,GroupDef *subGroup) for (;(g=gli.current());++gli) { GroupDef *gd=0; - if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname]) && + if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname]) && !gd->containsGroup(subGroup) ) { gd->addGroup(subGroup); @@ -645,7 +642,7 @@ void addMemberToGroups(Entry *root,MemberDef *md) { GroupDef *gd=0; if (!g->groupname.isEmpty() && - (gd=Doxygen::groupDict[g->groupname]) && + (gd=Doxygen::groupSDict[g->groupname]) && g->pri >= pri) { if( fgd && g->pri == pri ) { @@ -724,7 +721,7 @@ void addExampleToGroups(Entry *root,PageInfo *eg) for (;(g=gli.current());++gli) { GroupDef *gd=0; - if (!g->groupname.isEmpty() && (gd=Doxygen::groupDict[g->groupname])) + if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) { gd->addExample(eg); //printf("Example %s: in group %s\n",eg->name().data(),s->data()); @@ -736,3 +733,25 @@ QCString GroupDef::getOutputFileBase() const { return convertNameToFile(fileName); } + +void GroupDef::addListReferences() +{ + addRefItem(todoId(),testId(),bugId(), + theTranslator->trGroup(TRUE,TRUE), + getOutputFileBase(),name() + ); + MemberGroupListIterator mgli(*memberGroupList); + MemberGroup *mg; + for (;(mg=mgli.current());++mgli) + { + mg->addListReferences(this); + } + docDefineMembers.addListReferences(this); + docProtoMembers.addListReferences(this); + docTypedefMembers.addListReferences(this); + docEnumMembers.addListReferences(this); + docFuncMembers.addListReferences(this); + docVarMembers.addListReferences(this); +} + + diff --git a/src/groupdef.h b/src/groupdef.h index 0adc59d..458d314 100644 --- a/src/groupdef.h +++ b/src/groupdef.h @@ -19,8 +19,7 @@ #define GROUPDEF_H #include "qtbc.h" -#include <qlist.h> -#include <qdict.h> +#include "sortdict.h" #include "definition.h" #include "memberlist.h" #include "memberdef.h" @@ -76,6 +75,8 @@ class GroupDef : public Definition void addMembersToMemberGroup(); void distributeMemberGroupDocumentation(); + void addListReferences(); + bool visited; // number of times accessed for output - KPW friend void writeGroupTreeNode(OutputList&, GroupDef*,bool); @@ -91,8 +92,8 @@ class GroupDef : public Definition FileList *fileList; // list of files in the group ClassSDict *classSDict; // list of classes in the group NamespaceList *namespaceList; // list of namespaces in the group - GroupList *groupList; // list of sub groups. - GroupList *parentGroupList; // list of parent groups. + GroupList *groupList; // list of sub groups. + GroupList *parentGroupList; // list of parent groups. PageSDict *pageDict; // list of pages in the group PageSDict *exampleDict; // list of examples in the group @@ -113,7 +114,6 @@ class GroupDef : public Definition MemberList docProtoMembers; MemberList docTypedefMembers; MemberList docEnumMembers; - MemberList docEnumValMembers; MemberList docFuncMembers; MemberList docVarMembers; @@ -122,14 +122,15 @@ class GroupDef : public Definition MemberGroupDict *memberGroupDict; }; -class GroupList : public QList<GroupDef> +class GroupSDict : public SDict<GroupDef> { + public: + GroupSDict(uint size) : SDict<GroupDef>(size) {} + virtual ~GroupSDict() {} }; -class GroupListIterator : public QListIterator<GroupDef> +class GroupList : public QList<GroupDef> { - public: - GroupListIterator(const GroupList &l) : QListIterator<GroupDef>(l) {} }; void addClassToGroups(Entry *root,ClassDef *cd); diff --git a/src/index.cpp b/src/index.cpp index 5caca70..3a9fa12 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -350,10 +350,12 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level) { // UGLY HACK! ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Latex); + ol.disable(OutputGenerator::Man); + ol.disable(OutputGenerator::Html); if (level<6) ol.startIndexList(); ol.enableAll(); ol.disable(OutputGenerator::Latex); + ol.disable(OutputGenerator::RTF); ol.startItemList(); ol.popGeneratorState(); } @@ -408,10 +410,12 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level) { // UGLY HACK! ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Latex); + ol.disable(OutputGenerator::Man); + ol.disable(OutputGenerator::Html); if (level<6) ol.endIndexList(); ol.enableAll(); ol.disable(OutputGenerator::Latex); + ol.disable(OutputGenerator::RTF); ol.endItemList(); ol.popGeneratorState(); } @@ -571,10 +575,12 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started) { // UGLY HACK! ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Latex); + ol.disable(OutputGenerator::Html); + ol.disable(OutputGenerator::Man); ol.startIndexList(); ol.enableAll(); ol.disable(OutputGenerator::Latex); + ol.disable(OutputGenerator::RTF); ol.startItemList(); ol.popGeneratorState(); } @@ -651,10 +657,12 @@ void writeClassHierarchy(OutputList &ol) { // UGLY HACK! ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Latex); + ol.disable(OutputGenerator::Html); + ol.disable(OutputGenerator::Man); ol.endIndexList(); ol.enableAll(); ol.disable(OutputGenerator::Latex); + ol.disable(OutputGenerator::RTF); ol.endItemList(); ol.popGeneratorState(); } @@ -2025,7 +2033,7 @@ void writeExampleIndex(OutputList &ol) //ol.newParagraph(); ol.endTextBlock(); ol.startItemList(); - PageSDictIterator pdi(*Doxygen::exampleSDict); + PageSDict::Iterator pdi(*Doxygen::exampleSDict); PageInfo *pi=0; for (pdi.toFirst();(pi=pdi.current());++pdi) { @@ -2063,7 +2071,7 @@ void writeExampleIndex(OutputList &ol) void countRelatedPages(int &docPages,int &indexPages) { docPages=indexPages=0; - PageSDictIterator pdi(*Doxygen::pageSDict); + PageSDict::Iterator pdi(*Doxygen::pageSDict); PageInfo *pi=0; for (pdi.toFirst();(pi=pdi.current());++pdi) { @@ -2129,7 +2137,7 @@ void writePageIndex(OutputList &ol) //ol.newParagraph(); ol.endTextBlock(); ol.startItemList(); - PageSDictIterator pdi(*Doxygen::pageSDict); + PageSDict::Iterator pdi(*Doxygen::pageSDict); PageInfo *pi=0; for (pdi.toFirst();(pi=pdi.current());++pdi) { @@ -2180,9 +2188,9 @@ void writePageIndex(OutputList &ol) int countGroups() { int count=0; - GroupListIterator gli(Doxygen::groupList); + GroupSDict::Iterator gli(Doxygen::groupSDict); GroupDef *gd; - for (;(gd=gli.current());++gli) + for (gli.toFirst();(gd=gli.current());++gli) { if (!gd->isReference()) { @@ -2237,8 +2245,6 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,bool subLevel) ftvHelp = FTVHelp::getInstance(); } - GroupDef *subgd = 0; - GroupListIterator gli(*gd->groupList); if (!gd->visited && (!gd->isASubGroup() || subLevel)) { //printf("gd->name()=%s #members=%d\n",gd->name().data(),gd->countMembers()); @@ -2251,7 +2257,6 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,bool subLevel) numSubItems += gd->docDefineMembers.count(); numSubItems += gd->docTypedefMembers.count(); numSubItems += gd->docEnumMembers.count(); - numSubItems += gd->docEnumValMembers.count(); numSubItems += gd->docFuncMembers.count(); numSubItems += gd->docVarMembers.count(); numSubItems += gd->docProtoMembers.count(); @@ -2293,7 +2298,7 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,bool subLevel) //ol.writeEndAnnoItem(gd->getOutputFileBase()); // write pages - PageSDictIterator pli(*gd->pageDict); + PageSDict::Iterator pli(*gd->pageDict); PageInfo *pi = 0; for (pli.toFirst();(pi=pli.current());++pli) { @@ -2316,6 +2321,8 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,bool subLevel) if (hasSubGroups) { ol.startItemList(); + QListIterator<GroupDef> gli(*gd->groupList); + GroupDef *subgd = 0; for (gli.toLast();(subgd=gli.current());--gli) { writeGroupTreeNode(ol,subgd,TRUE); @@ -2338,7 +2345,6 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,bool subLevel) MemInfo(&gd->docDefineMembers, theTranslator->trDefines()), MemInfo(&gd->docTypedefMembers, theTranslator->trTypedefs()), MemInfo(&gd->docEnumMembers, theTranslator->trEnumerations()), - MemInfo(&gd->docEnumValMembers, theTranslator->trEnumerationValues()), MemInfo(&gd->docFuncMembers, theTranslator->trFunctions()), MemInfo(&gd->docVarMembers, theTranslator->trVariables()), MemInfo(&gd->docProtoMembers, theTranslator->trFuncProtos()), @@ -2491,7 +2497,7 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,bool subLevel) ftvHelp->incContentsDepth(); } - PageSDictIterator eli(*(gd->exampleDict)); + PageSDict::Iterator eli(*(gd->exampleDict)); PageInfo *pi=eli.toFirst(); while (pi) { @@ -2521,9 +2527,9 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,bool subLevel) void writeGroupHierarchy(OutputList &ol) { ol.startItemList(); - GroupListIterator gli(Doxygen::groupList); + GroupSDict::Iterator gli(Doxygen::groupSDict); GroupDef *gd; - for (;(gd=gli.current());++gli) + for (gli.toFirst();(gd=gli.current());++gli) { writeGroupTreeNode(ol,gd,FALSE); } diff --git a/src/latexgen.cpp b/src/latexgen.cpp index da50b21..1e42ee8 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -504,9 +504,10 @@ void LatexGenerator::startIndexSection(IndexSections is) break; case isModuleDocumentation: { - GroupDef *gd=Doxygen::groupList.first(); + GroupSDict::Iterator gli(Doxygen::groupSDict); + GroupDef *gd; bool found=FALSE; - while (gd && !found) + for (gli.toFirst();(gd=gli.current()) && !found;++gli) { if (!gd->isReference()) { @@ -514,7 +515,6 @@ void LatexGenerator::startIndexSection(IndexSections is) t << "{"; //Module Documentation}\n"; found=TRUE; } - gd=Doxygen::groupList.next(); } } break; @@ -659,25 +659,24 @@ void LatexGenerator::endIndexSection(IndexSections is) break; case isModuleDocumentation: { - GroupDef *gd=Doxygen::groupList.first(); + GroupSDict::Iterator gli(Doxygen::groupSDict); + GroupDef *gd; bool found=FALSE; - while (gd && !found) + for (gli.toFirst();(gd=gli.current()) && !found;++gli) { if (!gd->isReference()) { t << "}\n\\input{" << gd->getOutputFileBase() << "}\n"; found=TRUE; } - gd=Doxygen::groupList.next(); } - while (gd) + for (;(gd=gli.current());++gli) { if (!gd->isReference()) { if (compactLatex) t << "\\input"; else t << "\\include"; t << "{" << gd->getOutputFileBase() << "}\n"; } - gd=Doxygen::groupList.next(); } } break; @@ -759,7 +758,7 @@ void LatexGenerator::endIndexSection(IndexSections is) case isExampleDocumentation: { t << "}\n"; - PageSDictIterator pdi(*Doxygen::exampleSDict); + PageSDict::Iterator pdi(*Doxygen::exampleSDict); PageInfo *pi=pdi.toFirst(); if (pi) { @@ -775,7 +774,7 @@ void LatexGenerator::endIndexSection(IndexSections is) case isPageDocumentation: { t << "}\n"; - PageSDictIterator pdi(*Doxygen::pageSDict); + PageSDict::Iterator pdi(*Doxygen::pageSDict); PageInfo *pi=pdi.toFirst(); bool first=TRUE; for (pdi.toFirst();(pi=pdi.current());++pdi) diff --git a/src/memberdef.cpp b/src/memberdef.cpp index b7631f8..7b8245a 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -1675,3 +1675,20 @@ void MemberDef::setInitializer(const char *initializer) init=init.left(p+1); initLines=init.contains('\n'); } + +void MemberDef::addListReference(Definition *d) +{ + visited=TRUE; + QCString memLabel; + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + memLabel=theTranslator->trGlobal(TRUE,TRUE); + } + else + { + memLabel=theTranslator->trMember(TRUE,TRUE); + } + addRefItem(todoId(),testId(),bugId(),memLabel, + d->getOutputFileBase()+":"+anchor(),name(),argsString()); +} + diff --git a/src/memberdef.h b/src/memberdef.h index d81470c..64cb11f 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -230,6 +230,7 @@ class MemberDef : public Definition MemberDef *createTemplateInstanceMember(ArgumentList *formalArgs, ArgumentList *actualArgs); void setTemplateMaster(MemberDef *mt) { m_templateMaster=mt; } + void addListReference(Definition *d); bool visited; diff --git a/src/membergroup.cpp b/src/membergroup.cpp index 0ffe1b3..1f5dffd 100644 --- a/src/membergroup.cpp +++ b/src/membergroup.cpp @@ -204,3 +204,8 @@ void MemberGroup::setInGroup(bool b) { memberList->setInGroup(b); } + +void MemberGroup::addListReferences(Definition *def) +{ + memberList->addListReferences(def); +} diff --git a/src/membergroup.h b/src/membergroup.h index 833350e..63b047b 100644 --- a/src/membergroup.h +++ b/src/membergroup.h @@ -65,6 +65,7 @@ class MemberGroup /* : public Definition */ int numDecMembers() const; int numDocMembers() const; void setInGroup(bool b); + void addListReferences(Definition *d); private: MemberList *memberList; // list of all members in the group diff --git a/src/memberlist.cpp b/src/memberlist.cpp index bc9195b..77906f9 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -553,4 +553,25 @@ void MemberList::addMemberGroup(MemberGroup *mg) memberGroupList->append(mg); } +void MemberList::addListReferences(Definition *def) +{ + MemberListIterator mli(*this); + MemberDef *md; + for ( ; (md=mli.current()) ; ++mli) + { + if (md->getGroupDef()==0 || def->definitionType()==Definition::TypeGroup) + { + md->addListReference(def); + } + } + if (memberGroupList) + { + MemberGroupListIterator mgli(*memberGroupList); + MemberGroup *mg; + for (;(mg=mgli.current());++mgli) + { + mg->addListReferences(def); + } + } +} diff --git a/src/memberlist.h b/src/memberlist.h index 9b8410f..3dec524 100644 --- a/src/memberlist.h +++ b/src/memberlist.h @@ -54,6 +54,7 @@ class MemberList : public QList<MemberDef> Definition *container,const char *title); void addMemberGroup(MemberGroup *mg); void setInGroup(bool group) { m_inGroup=group; } + void addListReferences(Definition *def); private: int m_varCnt,m_funcCnt,m_enumCnt,m_enumValCnt,m_typeCnt; diff --git a/src/membername.h b/src/membername.h index b99b1da..3eabfe8 100644 --- a/src/membername.h +++ b/src/membername.h @@ -40,25 +40,6 @@ class MemberNameIterator : public QListIterator<MemberDef> MemberNameIterator( const MemberName &list); }; -#if 0 -class MemberNameList : public QList<MemberName> -{ - public: - MemberNameList(); - ~MemberNameList(); - - int compareItems(GCI item1,GCI item2); -}; - -class MemberNameListIterator : public QListIterator<MemberName> -{ - public: - MemberNameListIterator( const MemberNameList &list ); -}; - -typedef QDict<MemberName> MemberNameDict; -#endif - class MemberNameSDict : public SDict<MemberName> { public: @@ -100,34 +81,6 @@ class MemberNameInfoIterator : public QListIterator<MemberInfo> : QListIterator<MemberInfo>(mnii) {} }; -#if 0 -class MemberNameInfoList : public QList<MemberNameInfo> -{ - public: - ~MemberNameInfoList() {} - int compareItems(GCI item1,GCI item2) - { return stricmp( - ((MemberNameInfo *)item1)->memberName(), - ((MemberNameInfo *)item2)->memberName() - ); - } -}; - -class MemberNameInfoDict : public QDict<MemberNameInfo> -{ - public: - MemberNameInfoDict(int size) : QDict<MemberNameInfo>(size) {} - ~MemberNameInfoDict() {} -}; - -class MemberNameInfoListIterator : public QListIterator<MemberNameInfo> -{ - public: - MemberNameInfoListIterator(const MemberNameInfoList &mil) : - QListIterator<MemberNameInfo>(mil) {} -}; -#endif - class MemberNameInfoSDict : public SDict<MemberNameInfo> { diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index 72223f5..9e2692d 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -374,4 +374,23 @@ void NamespaceDef::addInnerCompound(Definition *d) m_innerCompounds->append(d->localName(),d); } +void NamespaceDef::addListReferences() +{ + addRefItem(todoId(),testId(),bugId(), + theTranslator->trNamespace(TRUE,TRUE), + getOutputFileBase(),name() + ); + MemberGroupListIterator mgli(*memberGroupList); + MemberGroup *mg; + for (;(mg=mgli.current());++mgli) + { + mg->addListReferences(this); + } + docDefineMembers.addListReferences(this); + docProtoMembers.addListReferences(this); + docTypedefMembers.addListReferences(this); + docEnumMembers.addListReferences(this); + docFuncMembers.addListReferences(this); + docVarMembers.addListReferences(this); +} diff --git a/src/namespacedef.h b/src/namespacedef.h index ab0393b..ef82d9c 100644 --- a/src/namespacedef.h +++ b/src/namespacedef.h @@ -73,6 +73,7 @@ class NamespaceDef : public Definition virtual Definition *findInnerCompound(const char *name); void addInnerCompound(Definition *d); + void addListReferences(); //protected: // void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const); @@ -108,13 +108,3 @@ class PageSDict : public SDict<PageInfo> } }; -// typedef is to get around Solaris compile problem -typedef SDict<PageInfo>::Iterator _SDictPageInfoIterator; - -class PageSDictIterator : public _SDictPageInfoIterator -{ - public: - PageSDictIterator(const PageSDict &d) : _SDictPageInfoIterator(d) {} - ~PageSDictIterator() {} -}; - @@ -1040,6 +1040,14 @@ BN [ \t\r\n] outputArray(yytext,yyleng); BEGIN(CopyLine); } +<Start>^{B}*[_A-Z][_A-Z0-9]*"("[^\)\n]*")"/{BN}{1,10}*[:{] { // constructors? + int i; + for (i=yyleng-1;i>=0;i--) + { + unput(yytext[i]); + } + BEGIN(CopyLine); + } <Start>^{B}*[_A-Z][_A-Z0-9]*"("[^\)\n]*")"{B}*\n { // function like macro static bool skipFuncMacros = Config_getBool("SKIP_FUNCTION_MACROS"); QCString name(yytext); diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index 338d889..1d992a4 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -969,16 +969,16 @@ void RTFGenerator::startIndexSection(IndexSections is) case isModuleDocumentation: { //Module Documentation - GroupDef *gd=Doxygen::groupList.first(); + GroupSDict::Iterator gli(Doxygen::groupSDict); + GroupDef *gd; bool found=FALSE; - while (gd && !found) + for (gli.toFirst();(gd=gli.current()) && !found;++gli) { if (!gd->isReference()) { beginRTFChapter(); found=TRUE; } - gd=Doxygen::groupList.next(); } } break; @@ -1185,9 +1185,10 @@ void RTFGenerator::endIndexSection(IndexSections is) break; case isModuleDocumentation: { - GroupDef *gd=Doxygen::groupList.first(); + GroupSDict::Iterator gli(Doxygen::groupSDict); + GroupDef *gd; t << "{\\tc \\v " << theTranslator->trModuleDocumentation() << "}"<< endl; - while (gd) + for (gli.toFirst();(gd=gli.current());++gli) { if (!gd->isReference()) { @@ -1196,7 +1197,6 @@ void RTFGenerator::endIndexSection(IndexSections is) t << gd->getOutputFileBase(); t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n"; } - gd=Doxygen::groupList.next(); } } break; @@ -1301,7 +1301,7 @@ void RTFGenerator::endIndexSection(IndexSections is) { //t << "}\n"; t << "{\\tc \\v " << theTranslator->trExampleDocumentation() << "}"<< endl; - PageSDictIterator pdi(*Doxygen::exampleSDict); + PageSDict::Iterator pdi(*Doxygen::exampleSDict); PageInfo *pi=pdi.toFirst(); if (pi) { @@ -1323,7 +1323,7 @@ void RTFGenerator::endIndexSection(IndexSections is) case isPageDocumentation: { t << "{\\tc \\v " << theTranslator->trPageDocumentation() << "}"<< endl; - PageSDictIterator pdi(*Doxygen::pageSDict); + PageSDict::Iterator pdi(*Doxygen::pageSDict); PageInfo *pi=pdi.toFirst(); bool first=TRUE; for (pdi.toFirst();(pi=pdi.current());++pdi) @@ -1960,9 +1960,10 @@ void RTFGenerator::endMemberDescription() void RTFGenerator::startDescList(SectionTypes) { DBG_RTF(t << "{\\comment (startDescList)}" << endl) - t << "{"; - newParagraph(); + t << "{"; // ends at endDescList + t << "{"; // ends at endDescTitle startBold(); + newParagraph(); } void RTFGenerator::endDescTitle() @@ -1978,25 +1979,23 @@ void RTFGenerator::endDescTitle() void RTFGenerator::writeDescItem() { DBG_RTF(t << "{\\comment (writeDescItem) }" << endl) - // incrementIndentLevel(); - //t << Rtf_Style_Reset << Rtf_CList_DepthStyle(); } void RTFGenerator::endDescList() { DBG_RTF(t << "{\\comment (endDescList)}" << endl) newParagraph(); - //t << "}"; decrementIndentLevel(); m_omitParagraph = TRUE; - //t << Rtf_Style_Reset << styleStack.top() << endl; - t << Rtf_Style_Reset << endl; + t << "}"; } void RTFGenerator::startParamList(ParamListTypes) { DBG_RTF(t << "{\\comment (startParamList)}" << endl) - t << "{"; + t << "{"; // ends at endParamList + t << "{"; // ends at endDescTitle + startBold(); newParagraph(); } @@ -2004,10 +2003,9 @@ void RTFGenerator::endParamList() { DBG_RTF(t << "{\\comment (endParamList)}" << endl) newParagraph(); - t << "}"; decrementIndentLevel(); m_omitParagraph = TRUE; - //t << Rtf_Style_Reset << styleStack.top() << endl; + t << "}"; } @@ -2295,7 +2293,7 @@ void RTFGenerator::endDotFile(bool) void RTFGenerator::startDescTable() { DBG_RTF(t << "{\\comment (startDescTable) }" << endl) - t << "{" << endl; + //t << "{" << endl; //incrementIndentLevel(); //t << Rtf_Style_Reset << Rtf_CList_DepthStyle(); } @@ -2304,7 +2302,7 @@ void RTFGenerator::endDescTable() { //decrementIndentLevel(); DBG_RTF(t << "{\\comment (endDescTable)}" << endl) - t << "}" << endl; + //t << "}" << endl; //t << Rtf_Style_Reset << styleStack.top(); } @@ -2327,12 +2325,14 @@ void RTFGenerator::endDescTableTitle() void RTFGenerator::startDescTableData() { DBG_RTF(t << "{\\comment (startDescTableData) }" << endl) + m_omitParagraph=FALSE; } void RTFGenerator::endDescTableData() { DBG_RTF(t << "{\\comment (endDescTableData) }" << endl) newParagraph(); + m_omitParagraph=TRUE; } // a style for list formatted as a "bulleted list" @@ -2661,6 +2661,50 @@ void RTFGenerator::endInclDepGraph(DotInclDepGraph &g) t << "}" << endl; } +/** Tests the integrity of the result by counting brackets. + * + */ +void testRTFOutput(const char *name) +{ + int bcount=0; + int line=1; + int c; + QFile f(name); + if (f.open(IO_ReadOnly)) + { + while ((c=f.getch())!=-1) + { + if (c=='\\') // escape char + { + c=f.getch(); + if (c==-1) break; + } + else if (c=='{') // open bracket + { + bcount++; + } + else if (c=='}') // close bracket + { + bcount--; + if (bcount<0) + { + goto err; + break; + } + } + else if (c=='\n') // newline + { + line++; + } + } + } + if (bcount==0) return; // file is OK. +err: + err("Error: RTF integrity test failed at line %d of %s due to a bracket mismatch.\n",line,name); + err(" Please try to create a small code example that produces this error \n" + " and send that to dimitri@stack.nl.\n"); +} + /** * This is an API to a VERY brittle RTF preprocessor that combines nested * RTF files. This version replaces the infile with the new file @@ -2708,6 +2752,8 @@ bool RTFGenerator::preProcessFileInplace(const char *path,const char *name) thisDir.remove(mainRTFName); thisDir.rename(combinedName,mainRTFName); + testRTFOutput(mainRTFName); + QDir::setCurrent(oldDir); return TRUE; } diff --git a/src/translator_en.h b/src/translator_en.h index 9e841e2..13062fe 100644 --- a/src/translator_en.h +++ b/src/translator_en.h @@ -1051,6 +1051,8 @@ class TranslatorEnglish : public Translator "class Undocumented { };\n\n" "/*! Class that is inherited using public inheritance */\n" "class PublicBase : public Truncated { };\n\n" + "/*! A template class */\n" + "template<class T> class Templ { };\n\n" "/*! Class that is inherited using protected inheritance */\n" "class ProtectedBase { };\n\n" "/*! Class that is inherited using private inheritance */\n" @@ -1062,13 +1064,14 @@ class TranslatorEnglish : public Translator " protected ProtectedBase,\n" " private PrivateBase,\n" " public Undocumented\n" + " public Templ<int>\n" "{\n" " private:\n" " Used *m_usedClass;\n" "};\n" "\\endcode\n" "If the \\c MAX_DOT_GRAPH_HEIGHT tag in the configuration file " - "is set to 200 this will result in the following graph:" + "is set to 240 this will result in the following graph:" "<p><center><img src=\"graph_legend.gif\"></center>\n" "<p>\n" "The boxes in the above graph have the following meaning:\n" @@ -1077,9 +1080,9 @@ class TranslatorEnglish : public Translator "graph is generated.\n" "<li>%A box with a black border denotes a documented struct or class.\n" "<li>%A box with a grey border denotes an undocumented struct or class.\n" - "<li>%A box with a red border denotes a documented struct or class for\n" + "<li>%A box with a red border denotes a documented struct or class for" "which not all inheritance/containment relations are shown. %A graph is " - "truncated if it does not fit within the specified boundaries." + "truncated if it does not fit within the specified boundaries.\n" "</ul>\n" "The arrows have the following meaning:\n" "<ul>\n" @@ -1089,7 +1092,10 @@ class TranslatorEnglish : public Translator "<li>%A dark red arrow is used for private inheritance.\n" "<li>%A purple dashed arrow is used if a class is contained or used " "by another class. The arrow is labeled with the variable(s) " - "through which the pointed class or struct is accessible. \n" + "through which the pointed class or struct is accessible.\n" + "<li>%A yellow dashed arrow denotes a relation between a template instance and " + "the template class it was instantiated from. The arrow is labeled with " + "the template parameters of the instance.\n" "</ul>\n"; } /*! text for the link to the legend page */ diff --git a/src/util.cpp b/src/util.cpp index 81c7916..f1fa9c6 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -40,7 +40,7 @@ #include "example.h" #include "version.h" #include "groupdef.h" -//#include "xml.h" +#include "reflist.h" #include "page.h" #ifndef _WIN32 @@ -2557,7 +2557,7 @@ bool generateRef(OutputDocInterface &od,const char *scName, } return TRUE; } - else if (inSeeBlock && !nameStr.isEmpty() && (gd=Doxygen::groupDict[nameStr])) + else if (inSeeBlock && !nameStr.isEmpty() && (gd=Doxygen::groupSDict[nameStr])) { // group link od.startTextLink(gd->getOutputFileBase(),0); if (rt) // explict link text @@ -2636,7 +2636,7 @@ bool generateLink(OutputDocInterface &od,const char *clName, } return TRUE; } - else if ((gd=Doxygen::groupDict[linkRef])) // link to a group + else if ((gd=Doxygen::groupSDict[linkRef])) // link to a group { od.startTextLink(gd->getOutputFileBase(),0); if (lt) @@ -3431,3 +3431,178 @@ found: return p; } +//---------------------------------------------------------------------------- + +void addRelatedPage(const char *name,const QCString &ptitle, + const QCString &doc,QList<QCString> *anchors, + const char *fileName,int startLine, + int todoId,int testId,int bugId,GroupDef *gd=0, + TagInfo *tagInfo=0 + ) +{ + PageInfo *pi=0; + if ((pi=Doxygen::pageSDict->find(name)) && !tagInfo) + { + // append documentation block to the page. + pi->doc+="\n\n"+doc; + } + else // new page + { + QCString baseName=name; + if (baseName.right(4)==".tex") + baseName=baseName.left(baseName.length()-4); + else if (baseName.right(5)==".html") + baseName=baseName.left(baseName.length()-5); + + QCString title=ptitle.stripWhiteSpace(); + pi=new PageInfo(fileName,startLine,baseName,doc,title); + pi->todoId=todoId; + pi->testId=testId; + pi->bugId=bugId; + if (tagInfo) + { + pi->reference = tagInfo->tagName; + } + + QCString pageName; + if (Config_getBool("CASE_SENSE_NAMES")) + pageName=pi->name.copy(); + else + pageName=pi->name.lower(); + //setFileNameForSections(anchors,pageName,pi); + pi->fileName = pageName; + pi->addSections(anchors); + + Doxygen::pageSDict->append(baseName,pi); + + if (gd) gd->addPage(pi); + + if (!pi->title.isEmpty()) + { + //outputList->writeTitle(pi->name,pi->title); + + // a page name is a label as well! + SectionInfo *si=new SectionInfo( + pi->name,pi->title,SectionInfo::Section,pi->reference); + if (gd) + { + si->fileName=gd->getOutputFileBase(); + } + else if (pi->inGroup) + { + si->fileName=pi->inGroup->getOutputFileBase().copy(); + } + else + { + si->fileName=pageName; + } + //printf("si->label=`%s' si->definition=%s si->fileName=`%s'\n", + // si->label.data(),si->definition?si->definition->name().data():"<none>", + // si->fileName.data()); + //printf(" SectionInfo: sec=%p sec->fileName=%s\n",si,si->fileName.data()); + //printf("Adding section info %s\n",pi->name.data()); + Doxygen::sectionDict.insert(pageName,si); + } + } +} + +//---------------------------------------------------------------------------- + +void addRefItem(int todoId,int testId,int bugId,const char *prefix, + const char *name,const char *title,const char *args=0) +{ + + //printf("addRefItem(%s) todoId=%d testId=%d bugId=%d\n",name,todoId,testId,bugId); + + //////////////////////////////////////////////////////////// + // add item to the todo list + //////////////////////////////////////////////////////////// + + if (todoId>0 && Config_getBool("GENERATE_TODOLIST")) + { + RefItem *item = todoList.getRefItem(todoId); + ASSERT(item!=0); + if (item->written) return; + + QCString doc; + doc += "<dl><dt>\\anchor "; + doc += item->listAnchor; + doc += "\n"; + doc += prefix; + doc += " \\_internalref "; + doc += name; + doc += " \""; + doc += title; + doc += "\""; + if (args) doc += args; + doc += "</dt>\n<dd>"; + doc += item->text; + doc += "</dd></dl>\n"; + //printf("Todo page: %s\n",doc.data()); + addRelatedPage("todo",theTranslator->trTodoList(),doc,0,"generated",1,0,0,0); + + item->written=TRUE; + } + + //////////////////////////////////////////////////////////// + // add item to the test list + //////////////////////////////////////////////////////////// + + if (testId>0 && Config_getBool("GENERATE_TESTLIST")) + { + RefItem *item = testList.getRefItem(testId); + ASSERT(item!=0); + if (item->written) return; + + QCString doc; + doc += "<dl><dt>\\anchor "; + doc += item->listAnchor; + doc += "\n"; + doc += prefix; + doc += " \\_internalref "; + doc += name; + doc += " \""; + doc += title; + doc += "\""; + if (args) doc += args; + doc += "</dt>\n<dd>"; + doc += item->text; + doc += "</dd></dl>\n"; + //printf("Test page: %s\n",doc.data()); + addRelatedPage("test",theTranslator->trTestList(),doc,0,"generated",1,0,0,0); + + item->written=TRUE; + } + + //////////////////////////////////////////////////////////// + // add item to the bug list + //////////////////////////////////////////////////////////// + + if (bugId>0 && Config_getBool("GENERATE_BUGLIST")) + { + RefItem *item = bugList.getRefItem(bugId); + ASSERT(item!=0); + if (item->written) return; + + QCString doc; + doc += "<dl><dt>\\anchor "; + doc += item->listAnchor; + doc += "\n"; + doc += prefix; + doc += " \\_internalref "; + doc += name; + doc += " \""; + doc += title; + doc += "\""; + if (args) doc += args; + doc += "</dt>\n<dd>"; + doc += item->text; + doc += "</dd></dl>\n"; + //printf("Bug page: %s\n",doc.data()); + addRelatedPage("bug",theTranslator->trBugList(),doc,0,"generated",1,0,0,0); + + item->written=TRUE; + } +} + + @@ -42,6 +42,7 @@ class ClassList; class MemberGroupList; class MemberGroupDict; class Definition; +class TagInfo; //-------------------------------------------------------------------- @@ -165,6 +166,14 @@ QCString resolveTypeDef(Definition *d,const QCString &name); QCString mergeScopes(const QCString &leftScope,const QCString &rightScope); int getScopeFragment(const QCString &s,int p,int *l); int filterCRLF(char *buf,int len); +void addRefItem(int todoId,int testId,int bugId,const char *prefix, + const char *name,const char *title,const char *args=0); +void addRelatedPage(const char *name,const QCString &ptitle, + const QCString &doc,QList<QCString> *anchors, + const char *fileName,int startLine, + int todoId,int testId,int bugId,GroupDef *gd=0, + TagInfo *tagInfo=0 + ); #endif |