From ea4b32cb910635a50467b02f36b5521337451cf0 Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Wed, 30 Apr 2003 19:40:09 +0000 Subject: Release-1.3-20030430 --- INSTALL | 4 +- README | 4 +- VERSION | 2 +- doc/config.doc | 8 ++ packages/rpm/doxygen.spec | 2 +- src/classdef.cpp | 35 ++++--- src/classdef.h | 7 ++ src/config.l | 9 ++ src/docparser.cpp | 50 +++++----- src/docparser.h | 5 +- src/doctokenizer.h | 3 +- src/doctokenizer.l | 10 +- src/dot.cpp | 38 +++++--- src/doxygen.cpp | 238 +++++++++++++++++++++++----------------------- src/doxygen.h | 4 +- src/filedef.cpp | 2 +- src/ftvhelp.cpp | 53 ++++++----- src/groupdef.cpp | 51 ++++++---- src/groupdef.h | 12 +-- src/htmldocvisitor.cpp | 17 ++-- src/htmlgen.cpp | 3 + src/index.cpp | 107 ++++++++++----------- src/latexgen.cpp | 20 ++-- src/memberdef.cpp | 2 +- src/membergroup.cpp | 2 +- src/namespacedef.cpp | 2 +- src/page.h | 3 +- src/pagedef.cpp | 13 +++ src/pagedef.h | 13 +++ src/perlmodgen.cpp | 32 ++++--- src/pre.l | 17 +++- src/rtfgen.cpp | 24 ++--- src/scanner.l | 6 +- src/util.cpp | 135 +++++++++++++++----------- src/util.h | 31 +++--- src/xmlgen.cpp | 68 +++++++------ 36 files changed, 575 insertions(+), 457 deletions(-) diff --git a/INSTALL b/INSTALL index c0d5680..e637c92 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ -DOXYGEN Version 1.3-20030421 +DOXYGEN Version 1.3-20030430 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (21 April 2003) +Dimitri van Heesch (30 April 2003) diff --git a/README b/README index f91006a..a772eec 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -DOXYGEN Version 1.3_20030421 +DOXYGEN Version 1.3_20030430 Please read INSTALL for compilation instructions. @@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. Enjoy, -Dimitri van Heesch (dimitri@stack.nl) (21 April 2003) +Dimitri van Heesch (dimitri@stack.nl) (30 April 2003) diff --git a/VERSION b/VERSION index e2f48aa..b5343c0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3-20030421 +1.3-20030430 diff --git a/doc/config.doc b/doc/config.doc index a5f8ae0..3a7c23e 100644 --- a/doc/config.doc +++ b/doc/config.doc @@ -203,6 +203,7 @@ followed by the descriptions of the tags grouped by category. \refitem cfg_warn_logfile WARN_LOGFILE \refitem cfg_warnings WARNINGS \refitem cfg_xml_dtd XML_DTD +\refitem cfg_xml_output XML_OUTPUT \refitem cfg_xml_schema XML_SCHEMA \endsecreflist @@ -1200,6 +1201,13 @@ EXTRA_PACKAGES = times generate an XML file that captures the structure of the code including all documentation. +\anchor cfg_xml_output +
\c XML_OUTPUT
+ \addindex XML_OUTPUT + The \c XML_OUTPUT tag is used to specify where the XML pages will be put. + If a relative path is entered the value of \c OUTPUT_DIRECTORY will be + put in front of it. If left blank \c xml will be used as the default path. + \anchor cfg_xml_schema
\c XML_SCHEMA
\addindex XML_SCHEMA diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec index ca0d710..7c70968 100644 --- a/packages/rpm/doxygen.spec +++ b/packages/rpm/doxygen.spec @@ -1,6 +1,6 @@ Summary: A documentation system for C/C++. Name: doxygen -Version: 1.3_20030421 +Version: 1.3_20030430 Release: 1 Epoch: 1 Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz diff --git a/src/classdef.cpp b/src/classdef.cpp index e7ff73d..6766c1f 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -36,15 +36,6 @@ #include "debug.h" #include "docparser.h" -static QCString stripExtension(const char *fName) -{ - QCString result=fName; - if (result.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension) - { - result=result.left(result.length()-Doxygen::htmlFileExtension.length()); - } - return result; -} // constructs a new class definition ClassDef::ClassDef( @@ -86,6 +77,7 @@ ClassDef::ClassDef( m_nspace=0; m_fileDef=0; m_usesImplClassDict=0; + m_usedByImplClassDict=0; m_usesIntfClassDict=0; memberGroupSDict = new MemberGroupSDict; memberGroupSDict->setAutoDelete(TRUE); @@ -120,6 +112,7 @@ ClassDef::~ClassDef() delete m_allMemberNameInfoSDict; delete m_exampleSDict; delete m_usesImplClassDict; + delete m_usedByImplClassDict; delete m_usesIntfClassDict; delete m_incInfo; delete memberGroupSDict; @@ -586,7 +579,7 @@ void ClassDef::distributeMemberGroupDocumentation() void ClassDef::findSectionsInDocumentation() { - docFindSections(documentation(),0,this,0,docFile()); + docFindSections(documentation(),this,0,docFile()); MemberGroupSDict::Iterator mgli(*memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) @@ -2043,17 +2036,35 @@ void ClassDef::addUsedClass(ClassDef *cd,const char *accessName) m_usesImplClassDict->setAutoDelete(TRUE); } UsesClassDef *ucd=m_usesImplClassDict->find(cd->name()); - if (ucd==0 /*|| ucd->templSpecifiers!=templSpec*/) + if (ucd==0) { ucd = new UsesClassDef(cd); m_usesImplClassDict->insert(cd->name(),ucd); - //ucd->templSpecifiers = templSpec; //printf("Adding used class %s to class %s\n", // cd->name().data(),name().data()); } ucd->addAccessor(accessName); } +void ClassDef::addUsedByClass(ClassDef *cd,const char *accessName) +{ + if (m_usedByImplClassDict==0) + { + m_usedByImplClassDict = new UsesClassDict(17); + m_usedByImplClassDict->setAutoDelete(TRUE); + } + UsesClassDef *ucd=m_usedByImplClassDict->find(cd->name()); + if (ucd==0) + { + ucd = new UsesClassDef(cd); + m_usedByImplClassDict->insert(cd->name(),ucd); + //printf("Adding used by class %s to class %s\n", + // cd->name().data(),name().data()); + } + ucd->addAccessor(accessName); +} + + #if 0 /*! Builds up a dictionary of all classes that are used by the state of this * class (the "implementation"). diff --git a/src/classdef.h b/src/classdef.h index 022309d..3259f44 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -164,6 +164,11 @@ class ClassDef : public Definition return m_usesImplClassDict; } + UsesClassDict *usedByImplementationClasses() const + { + return m_usedByImplClassDict; + } + UsesClassDict *usedInterfaceClasses() const { return m_usesIntfClassDict; @@ -270,6 +275,7 @@ class ClassDef : public Definition void setGroupDefForAllMembers(GroupDef *g,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs); void addInnerCompound(Definition *d); void addUsedClass(ClassDef *cd,const char *accessName); + void addUsedByClass(ClassDef *cd,const char *accessName); //void initTemplateMapping(); //void setTemplateArgumentMapping(const char *formal,const char *actual); //QCString getTemplateArgumentMapping(const char *formal) const; @@ -389,6 +395,7 @@ class ClassDef : public Definition /* classes for the collaboration diagram */ UsesClassDict *m_usesImplClassDict; + UsesClassDict *m_usedByImplClassDict; UsesClassDict *m_usesIntfClassDict; /*! Template instances that exists of this class, the key in the diff --git a/src/config.l b/src/config.l index 875f9e6..7516965 100644 --- a/src/config.l +++ b/src/config.l @@ -2226,6 +2226,15 @@ void Config::create() FALSE ); cs = addString( + "XML_OUTPUT", + "The XML_OUTPUT tag is used to specify where the XML pages will be put. \n" + "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n" + "put in front of it. If left blank `xml' will be used as the default path. \n" + ); + cs->setDefaultValue("xml"); + cs->setWidgetType(ConfigString::Dir); + cs->addDependency("GENERATE_XML"); + cs = addString( "XML_SCHEMA", "The XML_SCHEMA tag can be used to specify an XML schema, \n" "which can be used by a validating XML parser to check the \n" diff --git a/src/docparser.cpp b/src/docparser.cpp index 27c2d18..d4df2df 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -30,7 +30,7 @@ #include "doxygen.h" #include "debug.h" #include "util.h" -#include "page.h" +#include "pagedef.h" #include "docparser.h" #include "doctokenizer.h" @@ -447,7 +447,7 @@ static bool findDocsForMemberOrCompound(const char *commandName, FileDef *fd=0; NamespaceDef *nd=0; GroupDef *gd=0; - PageInfo *pi=0; + PageDef *pd=0; bool found = getDefs( g_context.find('.')==-1?g_context.latin1():"", // `find('.') is a hack to detect files name.latin1(), @@ -494,11 +494,11 @@ static bool findDocsForMemberOrCompound(const char *commandName, *pDef=gd; return TRUE; } - pi = Doxygen::pageSDict->find(cmdArg); - if (pi) // page + pd = Doxygen::pageSDict->find(cmdArg); + if (pd) // page { - *pDoc=pi->doc; - *pDef=(Definition *)pi; + *pDoc=pd->documentation(); + *pDef=pd; return TRUE; } bool ambig; @@ -1624,7 +1624,7 @@ DocRef::DocRef(DocNode *parent,const QString &target) : m_parent(parent), m_refToSection(FALSE), m_refToAnchor(FALSE) { Definition *compound = 0; - PageInfo *pageInfo = 0; + //PageInfo *pageInfo = 0; QCString anchor; ASSERT(!target.isEmpty()); SectionInfo *sec = Doxygen::sectionDict[target]; @@ -1639,16 +1639,17 @@ DocRef::DocRef(DocNode *parent,const QString &target) : m_refToAnchor = sec->type==SectionInfo::Anchor; m_refToSection = sec->type!=SectionInfo::Anchor; } - else if (resolveLink(g_context,target,TRUE,&compound,&pageInfo,anchor)) + else if (resolveLink(g_context,target,TRUE,&compound,/*&pageInfo,*/anchor)) { m_text = linkToText(target); m_anchor = anchor; - if (pageInfo) // ref to page - { - m_file = pageInfo->getOutputFileBase(); - m_ref = pageInfo->getReference(); - } - else if (compound) // ref to compound + //if (pageInfo) // ref to page + //{ + // m_file = pageInfo->getOutputFileBase(); + // m_ref = pageInfo->getReference(); + //} + //else + if (compound) // ref to compound { if (anchor.isEmpty() && /* compound link */ compound->definitionType()==Definition::TypeGroup && /* is group */ @@ -1713,7 +1714,7 @@ DocLink::DocLink(DocNode *parent,const QString &target) : m_parent(parent) { Definition *compound; - PageInfo *page; + //PageInfo *page; QCString anchor; m_refText = target; if (!m_refText.isEmpty() && m_refText.at(0)=='#') @@ -1721,7 +1722,7 @@ DocLink::DocLink(DocNode *parent,const QString &target) : m_refText = m_refText.right(m_refText.length()-1); } if (resolveLink(g_context,stripKnownExtensions(target),g_inSeeBlock, - &compound,&page,anchor)) + &compound,/*&page,*/anchor)) { m_anchor = anchor; if (compound) @@ -1729,11 +1730,11 @@ DocLink::DocLink(DocNode *parent,const QString &target) : m_file = compound->getOutputFileBase(); m_ref = compound->getReference(); } - else if (page) - { - m_file = page->getOutputFileBase(); - m_ref = page->getReference(); - } + //else if (page) + //{ + // m_file = page->getOutputFileBase(); + // m_ref = page->getReference(); + //} } else // oops, bogus target { @@ -4742,8 +4743,11 @@ DocNode *validatingParseText(const char *input) return txt; } -void docFindSections(const char *input,PageInfo *pi,Definition *d,MemberGroup *mg,const char *fileName) +void docFindSections(const char *input, + Definition *d, + MemberGroup *mg, + const char *fileName) { - doctokenizerYYFindSections(input,pi,d,mg,fileName); + doctokenizerYYFindSections(input,d,mg,fileName); } diff --git a/src/docparser.h b/src/docparser.h index d413a5a..4afafd8 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -63,7 +63,10 @@ DocNode *validatingParseDoc(const char *fileName,int startLine, DocNode *validatingParseText(const char *input); /*! Searches for section and anchor commands in the input */ -void docFindSections(const char *input,PageInfo *pi,Definition *d,MemberGroup *m,const char *fileName); +void docFindSections(const char *input, + Definition *d, + MemberGroup *m, + const char *fileName); //--------------------------------------------------------------------------- diff --git a/src/doctokenizer.h b/src/doctokenizer.h index c258ee1..ead3a3f 100644 --- a/src/doctokenizer.h +++ b/src/doctokenizer.h @@ -24,7 +24,6 @@ #include "htmlattrib.h" class Definition; -class PageInfo; class MemberGroup; enum Tokens @@ -110,7 +109,7 @@ extern FILE *doctokenizerYYin; const char *tokToString(int token); // operations on the scanner -void doctokenizerYYFindSections(const char *input,PageInfo *pi,Definition *d, +void doctokenizerYYFindSections(const char *input,Definition *d, MemberGroup *mg,const char *fileName); void doctokenizerYYinit(const char *input,const char *fileName); void doctokenizerYYcleanup(); diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 0ed018d..031d5ec 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -30,7 +30,7 @@ #include "section.h" #include "membergroup.h" #include "definition.h" -#include "page.h" +#include "doxygen.h" #define YY_NEVER_INTERACTIVE 1 @@ -45,7 +45,6 @@ static QString g_fileName; static bool g_insidePre; // context for section finding phase -static PageInfo *g_pageInfo; static Definition *g_definition; static MemberGroup *g_memberGroup; static QCString g_secLabel; @@ -217,10 +216,6 @@ static void processSection() { file = g_definition->getOutputFileBase(); } - else if (g_pageInfo) - { - file = g_pageInfo->getOutputFileBase(); - } else { warn(g_fileName,yylineno,"Found section/anchor %s without context\n",g_secLabel.data()); @@ -809,14 +804,13 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]* //-------------------------------------------------------------------------- -void doctokenizerYYFindSections(const char *input,PageInfo *pi,Definition *d, +void doctokenizerYYFindSections(const char *input,Definition *d, MemberGroup *mg,const char *fileName) { if (input==0) return; g_inputString = input; //printf("parsing --->`%s'<---\n",input); g_inputPos = 0; - g_pageInfo = pi; g_definition = d; g_memberGroup = mg; g_fileName = fileName; diff --git a/src/dot.cpp b/src/dot.cpp index 32a9841..110a86d 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -1086,31 +1086,47 @@ void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot, void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base) { + //printf("DocClassGraph::buildGraph(%s,distance=%d,base=%d)\n", + // cd->name().data(),distance,base); // ---- Add inheritance relations - BaseClassListIterator bcli(base ? *cd->baseClasses() : *cd->subClasses()); - BaseClassDef *bcd; - for ( ; (bcd=bcli.current()) ; ++bcli ) + if (m_graphType == Inheritance) { - //printf("-------- inheritance relation %s->%s templ=`%s'\n", - // cd->name().data(),bcd->classDef->name().data(),bcd->templSpecifiers.data()); - addClass(bcd->classDef,n,bcd->prot,0,distance,bcd->usedName, - bcd->templSpecifiers,base); + BaseClassListIterator bcli(base ? *cd->baseClasses() : *cd->subClasses()); + BaseClassDef *bcd; + for ( ; (bcd=bcli.current()) ; ++bcli ) + { + //printf("-------- inheritance relation %s->%s templ=`%s'\n", + // cd->name().data(),bcd->classDef->name().data(),bcd->templSpecifiers.data()); + addClass(bcd->classDef,n,bcd->prot,0,distance,bcd->usedName, + bcd->templSpecifiers,base); + } } - if (m_graphType != Inheritance) + else // m_graphType != Inheritance { + ASSERT(m_graphType==Implementation); // ---- Add usage relations UsesClassDict *dict = - m_graphType==Implementation ? cd->usedImplementationClasses() : - cd->usedInterfaceClasses(); + base ? cd->usedImplementationClasses() : + cd->usedByImplementationClasses() + ; if (dict) { UsesClassDictIterator ucdi(*dict); UsesClassDef *ucd; for (;(ucd=ucdi.current());++ucdi) { + //if (base) + //{ + // printf("%s uses %s\n",cd->name().data(),ucd->classDef->name().data()); + //} + //else + //{ + // printf("%s is used by %s\n",cd->name().data(),ucd->classDef->name().data()); + //} + //printf("drawing\n"); QCString label; QDictIterator dvi(*ucd->accessors); const char *s; @@ -1128,7 +1144,7 @@ void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base) } } addClass(ucd->classDef,n,EdgeInfo::Purple,label,distance,0, - ucd->templSpecifiers,base); + ucd->templSpecifiers,base); } } } diff --git a/src/doxygen.cpp b/src/doxygen.cpp index b3600f7..601ac2d 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -58,8 +58,7 @@ #include "defgen.h" #include "perlmodgen.h" #include "reflist.h" -#include "page.h" -//#include "packagedef.h" +#include "pagedef.h" #include "bufstr.h" #include "commentcnv.h" #include "cmdmapper.h" @@ -83,15 +82,12 @@ MemberNameSDict Doxygen::functionNameSDict(10000); FileNameList Doxygen::inputNameList; // all input files FileNameDict *Doxygen::inputNameDict; -//GroupList Doxygen::groupList; // all groups GroupSDict Doxygen::groupSDict(17); FormulaList Doxygen::formulaList; // all formulas FormulaDict Doxygen::formulaDict(1009); // all formulas FormulaDict Doxygen::formulaNameDict(1009); // the label name of all formulas -//PackageSDict Doxygen::packageDict(257); // java packages - PageSDict *Doxygen::pageSDict = new PageSDict(1009); // all doc pages PageSDict *Doxygen::exampleSDict = new PageSDict(1009); // all examples SectionDict Doxygen::sectionDict(257); // all page sections @@ -107,7 +103,7 @@ QDict Doxygen::expandAsDefinedDict(257); // all macros that should be e QIntDict Doxygen::memGrpInfoDict(1009); // dictionary of the member groups heading -PageInfo *Doxygen::mainPage = 0; +PageDef *Doxygen::mainPage = 0; bool Doxygen::insideMainPage = FALSE; // are we generating docs for the main page? QTextStream Doxygen::tagFile; NamespaceDef *Doxygen::globalScope = new NamespaceDef("",1,""); @@ -200,12 +196,12 @@ static void addRelatedPage(Entry *root) if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) break; } //printf("addRelatedPage() %s gd=%p\n",root->name.data(),gd); - PageInfo *pi = addRelatedPage(root->name,root->args,root->doc,root->anchors, + PageDef *pd = addRelatedPage(root->name,root->args,root->doc,root->anchors, root->fileName,root->startLine, root->sli, gd,root->tagInfo ); - if (pi) + if (pd) { // see if the function is inside a namespace Definition *ctx = 0; @@ -230,7 +226,9 @@ static void addRelatedPage(Entry *root) bool ambig; ctx=findFileDef(Doxygen::inputNameDict,root->fileName,ambig); } - pi->context = ctx; + pd->setOuterScope(ctx); + pd->addSectionsToDefinition(root->anchors); + //pi->context = ctx; } } @@ -277,11 +275,15 @@ static void buildGroupListFiltered(Entry *root,bool additional) } else { - gd = new GroupDef(root->fileName,root->startLine,root->name,root->type); if (root->tagInfo) { + gd = new GroupDef(root->fileName,root->startLine,root->name,root->type,root->tagInfo->fileName); gd->setReference(root->tagInfo->tagName); } + else + { + gd = new GroupDef(root->fileName,root->startLine,root->name,root->type); + } gd->setBriefDescription(root->brief,root->briefFile,root->briefLine); gd->setDocumentation(root->doc,root->docFile,root->docLine); gd->addSectionsToDefinition(root->anchors); @@ -798,21 +800,6 @@ static void addClassToContext(Entry *root) //printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data()); Doxygen::classSDict.append(fullName,cd); - // also add class to the correct structural context - //Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName); - //if (d==0) - //{ - // warn(root->fileName,root->startLine, - // "Warning: Internal inconsistency: scope for class %s not " - // "found!\n",fullName.data() - // ); - //} - //else - //{ - // //printf("****** adding %s to scope %s\n",cd->name().data(),d->name().data()); - // d->addInnerCompound(cd); - // cd->setOuterScope(d); - //} } } @@ -853,6 +840,9 @@ static void buildClassDocList(Entry *root) static void resolveClassNestingRelations() { + ClassSDict::Iterator cli(Doxygen::classSDict); + for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE; + int nestingLevel=0; bool done=FALSE; while (!done) @@ -864,10 +854,11 @@ static void resolveClassNestingRelations() ClassDef *cd=0; for (cli.toFirst();(cd=cli.current());++cli) { + //printf("nested relation for class %s\n",cd->name().data()); if (cd->name().contains("::")==nestingLevel) { + cd->visited=TRUE; //printf("Level=%d processing=%s\n",nestingLevel,cd->name().data()); - done=FALSE; // also add class to the correct structural context Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,cd->name()); if (d==0) @@ -884,8 +875,10 @@ static void resolveClassNestingRelations() cd->setOuterScope(d); } } + if (!cd->visited) done=FALSE; } nestingLevel++; + //printf("nestingLevel=%d\n",nestingLevel); } } @@ -2774,21 +2767,6 @@ static void transferRelatedFunctionDocumentation() } //---------------------------------------------------------------------- -static void replaceNamespaceAliases(QCString &scope,int i) -{ - //printf("replaceNamespaceAliases(%s,%d)\n",scope.data(),i); - while (i>0) - { - QCString *s = Doxygen::namespaceAliasDict[scope.left(i)]; - if (s) - { - scope=*s+scope.right(scope.length()-i); - i=s->length(); - } - i=scope.findRev("::",i-1); - } - //printf("replaceNamespaceAliases() result=%s\n",scope.data()); -} /*! make a dictionary of all template arguments of class cd * that are part of the base class name. @@ -3034,6 +3012,7 @@ static void findUsedClassesForClass(Entry *root, if (isArtificial) usedCd->setClassIsArtificial(); Debug::print(Debug::Classes,0," Adding used class `%s'\n", usedCd->name().data()); instanceCd->addUsedClass(usedCd,md->name()); + usedCd->addUsedByClass(instanceCd,md->name()); } } } @@ -3049,6 +3028,7 @@ static void findUsedClassesForClass(Entry *root, found=TRUE; Debug::print(Debug::Classes,0," Adding used class `%s'\n", usedCd->name().data()); instanceCd->addUsedClass(usedCd,md->name()); // class exists + usedCd->addUsedByClass(instanceCd,md->name()); } } if (delTempNames) @@ -3077,6 +3057,7 @@ static void findUsedClassesForClass(Entry *root, if (isArtificial) usedCd->setClassIsArtificial(); Debug::print(Debug::Classes,0," Adding used class `%s'\n", usedCd->name().data()); instanceCd->addUsedClass(usedCd,md->name()); + usedCd->addUsedByClass(instanceCd,md->name()); } } } @@ -3740,17 +3721,17 @@ static void addListReferences() gd->addListReferences(); } PageSDict::Iterator pdi(*Doxygen::pageSDict); - PageInfo *pi=0; - for (pdi.toFirst();(pi=pdi.current());++pdi) + PageDef *pd=0; + for (pdi.toFirst();(pd=pdi.current());++pdi) { - QCString name = pi->name; - if (pi->getGroupDef()) + QCString name = pd->name(); + if (pd->getGroupDef()) { - name = pi->getGroupDef()->getOutputFileBase().copy(); + name = pd->getGroupDef()->getOutputFileBase().copy(); } - addRefItem(pi->xrefListItems, + addRefItem(pd->xrefListItems(), theTranslator->trPage(TRUE,TRUE), - name,pi->title); + name,pd->title()); } } @@ -4026,7 +4007,9 @@ static bool findGlobalMember(Entry *root, // the same file. This is needed because static members with the same // name can be in different files. Thus it would be wrong to just // put the comment block at the first syntactically matching member. - if (matching && md->isStatic() && md->getDefFileName()!=root->fileName) + if (matching && md->isStatic() && + md->getDefFileName()!=root->fileName && + mn->count()>1) { matching = FALSE; } @@ -5869,10 +5852,10 @@ static void findSectionsInDocumentation() } // for each page PageSDict::Iterator pdi(*Doxygen::pageSDict); - PageInfo *pi=0; - for (pdi.toFirst();(pi=pdi.current());++pdi) + PageDef *pd=0; + for (pdi.toFirst();(pd=pdi.current());++pdi) { - pi->findSectionsInDocumentation(); + pd->findSectionsInDocumentation(); } if (Doxygen::mainPage) Doxygen::mainPage->findSectionsInDocumentation(); } @@ -6048,17 +6031,18 @@ static void findMainPage(Entry *root) //printf("Found main page! \n======\n%s\n=======\n",root->doc.data()); QCString title=root->args.stripWhiteSpace(); QCString indexName=Config_getBool("GENERATE_TREEVIEW")?"main":"index"; - Doxygen::mainPage = new PageInfo(root->fileName,root->startLine, + Doxygen::mainPage = new PageDef(root->fileName,root->startLine, indexName, root->doc,title); //setFileNameForSections(root->anchors,"index",Doxygen::mainPage); - Doxygen::mainPage->fileName = indexName; + Doxygen::mainPage->setFileName(indexName); + Doxygen::mainPage->addSectionsToDefinition(root->anchors); //Doxygen::mainPage->addSections(root->anchors); // a page name is a label as well! SectionInfo *si=new SectionInfo( indexName, - Doxygen::mainPage->name, - Doxygen::mainPage->title, + Doxygen::mainPage->name(), + Doxygen::mainPage->title(), SectionInfo::Section); Doxygen::sectionDict.insert(indexName,si); } @@ -6089,7 +6073,7 @@ static void resolveUserReferences() //printf("si->label=`%s' si->definition=%s si->fileName=`%s'\n", // si->label.data(),si->definition?si->definition->name().data():"", // si->fileName.data()); - PageInfo *pi=0; + PageDef *pd=0; // hack: the items of a todo/test/bug/deprecated list are all fragments from // different files, so the resulting section's all have the wrong file @@ -6115,10 +6099,10 @@ static void resolveUserReferences() // if this section is in a page and the page is in a group, then we // have to adjust the link file name to point to the group. if (!si->fileName.isEmpty() && - (pi=Doxygen::pageSDict->find(si->fileName)) && - pi->getGroupDef()) + (pd=Doxygen::pageSDict->find(si->fileName)) && + pd->getGroupDef()) { - si->fileName=pi->getGroupDef()->getOutputFileBase().copy(); + si->fileName=pd->getGroupDef()->getOutputFileBase().copy(); } if (si->definition) @@ -6156,20 +6140,20 @@ static void generatePageDocs() //printf("documentedPages=%d real=%d\n",documentedPages,Doxygen::pageSDict->count()); if (documentedPages==0) return; PageSDict::Iterator pdi(*Doxygen::pageSDict); - PageInfo *pi=0; - for (pdi.toFirst();(pi=pdi.current());++pdi) + PageDef *pd=0; + for (pdi.toFirst();(pd=pdi.current());++pdi) { - if (!pi->getGroupDef() && !pi->isReference()) + if (!pd->getGroupDef() && !pd->isReference()) { - msg("Generating docs for page %s...\n",pi->name.data()); + msg("Generating docs for page %s...\n",pd->name().data()); //outputList->disable(OutputGenerator::Man); QCString pageName; if (Config_getBool("CASE_SENSE_NAMES")) - pageName=pi->name.copy(); + pageName=pd->name(); else - pageName=pi->name.lower(); + pageName=pd->name().lower(); - startFile(*outputList,pageName,pageName,pi->title); + startFile(*outputList,pageName,pageName,pd->title()); // save old generator state and write title only to Man generator outputList->pushGeneratorState(); @@ -6179,8 +6163,8 @@ static void generatePageDocs() outputList->popGeneratorState(); SectionInfo *si=0; - if (!pi->title.isEmpty() && !pi->name.isEmpty() && - (si=Doxygen::sectionDict.find(pi->name))!=0) + if (!pd->title().isEmpty() && !pd->name().isEmpty() && + (si=Doxygen::sectionDict.find(pd->name()))!=0) { outputList->startSection(si->label,si->title,si->type); outputList->docify(si->title); @@ -6188,27 +6172,46 @@ static void generatePageDocs() } outputList->startTextBlock(); QCString scName; - if (pi->context && - (pi->context->definitionType()==Definition::TypeClass || - pi->context->definitionType()==Definition::TypeNamespace + if (pd->getOuterScope() && + (pd->getOuterScope()->definitionType()==Definition::TypeClass || + pd->getOuterScope()->definitionType()==Definition::TypeNamespace ) ) { - scName=pi->context->name(); + scName=pd->getOuterScope()->name(); } - outputList->parseDoc(pi->defFileName,pi->defLine,scName,0,pi->doc,FALSE,pi->sectionDict); + outputList->parseDoc(pd->docFile(), + pd->docLine(), + scName,0, + pd->documentation(), + FALSE + /*,pd->sectionDict*/); outputList->endTextBlock(); endFile(*outputList); //outputList->enable(OutputGenerator::Man); - if (!Config_getString("GENERATE_TAGFILE").isEmpty() && pi->name!="todo" && pi->name!="test") + if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { - Doxygen::tagFile << " " << endl; - Doxygen::tagFile << " " << pi->name << "" << endl; - Doxygen::tagFile << " " << pi->title << "" << endl; - Doxygen::tagFile << " " << pi->name << "" << endl; - pi->writeDocAnchorsToTagFile(); - Doxygen::tagFile << " " << endl; + bool found=FALSE; + QDictIterator rli(*Doxygen::xrefLists); + RefList *rl; + for (rli.toFirst();(rl=rli.current());++rli) + { + if (rl->listName()==pd->name()) + { + found=TRUE; + break; + } + } + if (!found) // not one of the generated related pages + { + Doxygen::tagFile << " " << endl; + Doxygen::tagFile << " " << pd->name() << "" << endl; + Doxygen::tagFile << " " << convertToXML(pd->title()) << "" << endl; + Doxygen::tagFile << " " << pd->getOutputFileBase() << "" << endl; + pd->writeDocAnchorsToTagFile(); + Doxygen::tagFile << " " << endl; + } } } } @@ -6233,13 +6236,14 @@ static void buildExampleList(Entry *root) } else { - PageInfo *pi=new PageInfo(root->fileName,root->startLine, + PageDef *pd=new PageDef(root->fileName,root->startLine, root->name,root->doc,root->args); - pi->fileName = convertNameToFile(pi->name+"-example"); + pd->setFileName(convertNameToFile(pd->name()+"-example")); + pd->addSectionsToDefinition(root->anchors); //pi->addSections(root->anchors); - Doxygen::exampleSDict->inSort(root->name,pi); - addExampleToGroups(root,pi); + Doxygen::exampleSDict->inSort(root->name,pd); + addExampleToGroups(root,pd); } } } @@ -6258,20 +6262,20 @@ static void generateExampleDocs() { outputList->disable(OutputGenerator::Man); PageSDict::Iterator pdi(*Doxygen::exampleSDict); - PageInfo *pi=0; - for (pdi.toFirst();(pi=pdi.current());++pdi) + PageDef *pd=0; + for (pdi.toFirst();(pd=pdi.current());++pdi) { - msg("Generating docs for example %s...\n",pi->name.data()); - QCString n=pi->fileName; + msg("Generating docs for example %s...\n",pd->name().data()); + QCString n=pd->getOutputFileBase(); startFile(*outputList,n,n,"Example Documentation"); startTitle(*outputList,n); - outputList->docify(pi->name); + outputList->docify(pd->name()); endTitle(*outputList,n,0); - outputList->parseDoc(pi->name, // file - pi->defLine, // startLine - pi->context?pi->context->name().data():0, // context + outputList->parseDoc(pd->docFile(), // file + pd->docLine(), // startLine + pd->getOuterScope()?pd->getOuterScope()->name().data():0, // context 0, // memberDef - pi->doc+"\n\\include "+pi->name, // docs + pd->documentation()+"\n\\include "+pd->name(), // docs TRUE // is example ); endFile(*outputList); @@ -7520,14 +7524,6 @@ void parseInput() s=imagePathList.next(); } - //QDictIterator fndi(*Doxygen::imageNameDict); - //FileName *fn; - //for (;(fn=fndi.current());++fndi) - //{ - // printf("File Name %s\n",fn->fileName()); - //} - - msg("Searching for dot files...\n"); QStrList &dotFileList=Config_getList("DOTFILE_DIRS"); s=dotFileList.first(); @@ -7735,6 +7731,25 @@ void parseInput() exit(1); } + QCString &xmlOutput = Config_getString("XML_OUTPUT"); + bool &generateXml = Config_getBool("GENERATE_XML"); + if (xmlOutput.isEmpty() && generateXml) + { + xmlOutput=outputDirectory+"/xml"; + } + else if (xmlOutput && xmlOutput[0]!='/' && xmlOutput[1]!=':') + { + xmlOutput.prepend(outputDirectory+'/'); + } + QDir xmlDir(xmlOutput); + if (generateXml && !xmlDir.exists() && !xmlDir.mkdir(xmlOutput)) + { + err("Could not create output directory %s\n",xmlOutput.data()); + delete root; + cleanUpDoxygen(); + exit(1); + } + QCString &latexOutput = Config_getString("LATEX_OUTPUT"); bool &generateLatex = Config_getBool("GENERATE_LATEX"); if (latexOutput.isEmpty() && generateLatex) @@ -7854,12 +7869,6 @@ void parseInput() msg("Creating members for template instances...\n"); createTemplateInstanceMembers(); - //if (Config_getBool("HAVE_DOT") && Config_getBool("COLLABORATION_GRAPH")) - //{ - // msg("Computing class implementation usage relations...\n"); - // computeClassImplUsageRelations(); - //} - msg("Computing class relations...\n"); computeTemplateClassRelations(); computeClassRelations(); @@ -7880,9 +7889,6 @@ void parseInput() msg("Building page list...\n"); buildPageList(root); - //msg("Building package list...\n"); - //buildPackageList(root); - msg("Search for main page...\n"); findMainPage(root); @@ -7898,15 +7904,9 @@ void parseInput() msg("Determining which enums are documented\n"); findDocumentedEnumValues(); - //msg("Computing member references...\n"); - //computeMemberReferences(); - msg("Computing member relations...\n"); computeMemberRelations(); - //msg("Adding classes to their packages...\n"); - //addClassesToPackages(); - msg("Building full member lists recursively...\n"); buildCompleteMemberLists(); @@ -8044,10 +8044,6 @@ void generateOutput() msg("Generating group index...\n"); writeGroupIndex(*outputList); - - //msg("Generating package index...\n"); - //generatePackageDocs(); - msg("Generating example index...\n"); writeExampleIndex(*outputList); diff --git a/src/doxygen.h b/src/doxygen.h index b35a04b..59c2f05 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -37,7 +37,7 @@ class PageSList; class PageSDict; -class PageInfo; +class PageDef; typedef QList StringList; typedef QDict FileDict; @@ -64,7 +64,7 @@ class Doxygen static ClassSDict hiddenClasses; static PageSDict *exampleSDict; static PageSDict *pageSDict; - static PageInfo *mainPage; + static PageDef *mainPage; static bool insideMainPage; static FileNameDict *includeNameDict; static FileNameDict *exampleNameDict; diff --git a/src/filedef.cpp b/src/filedef.cpp index 0849901..78710fc 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -105,7 +105,7 @@ void FileDef::distributeMemberGroupDocumentation() void FileDef::findSectionsInDocumentation() { - docFindSections(documentation(),0,this,0,docFile()); + docFindSections(documentation(),this,0,docFile()); MemberGroupSDict::Iterator mgli(*memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index 605181b..54514e6 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -5,8 +5,6 @@ * Modified by Dimitri van Heesch (c) 2003 * * Folder Tree View for offline help on browsers that do not support HTML Help. - * Uses the FTV structure from: - * http://www.geocities.com/Paris/LeftBank/2178/ftexample.html */ #include @@ -506,30 +504,37 @@ void FTVHelp::generateLink(QTextStream &t,FTVNode *n) QCString *dest; //printf("FTVHelp::generateLink(ref=%s,file=%s,anchor=%s\n", // n->ref.data(),n->file.data(),n->anchor.data()); - if (!n->ref.isEmpty()) // link to entity imported via tag file + if (n->file.isEmpty()) // no link { - t << "ref << ":"; - if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/"; - t << "\" "; + t << "" << n->name << ""; } - else // local link + else // link into other frame { - t << "ref.isEmpty()) - { - if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/"; - } - if (!n->file.isEmpty()) t << n->file << Doxygen::htmlFileExtension; - if (!n->anchor.isEmpty()) t << "#" << n->anchor; - t << "\" target=\"basefrm\">"; - t << n->name; - t << ""; - if (!n->ref.isEmpty()) - { - t << " [external]"; + if (!n->ref.isEmpty()) // link to entity imported via tag file + { + t << "ref << ":"; + if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/"; + t << "\" "; + } + else // local link + { + t << "ref.isEmpty()) + { + if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/"; + } + t << n->file << Doxygen::htmlFileExtension; + if (!n->anchor.isEmpty()) t << "#" << n->anchor; + t << "\" target=\"basefrm\">"; + t << n->name; + t << ""; + if (!n->ref.isEmpty()) + { + t << " [external]"; + } } } @@ -634,7 +639,7 @@ void FTVHelp::generateTreeView() t << cssfi.fileName(); } t << "\">" << endl; - t << " Test\n"; + t << " TreeView\n"; t << "