Commit 367c98ad authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.1.3

parent 59bbbf50
DOXYGEN Version 1.1.2-20000430 DOXYGEN Version 1.1.3
CONTENTS CONTENTS
-------- --------
...@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX: ...@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
1. Unpack the archive, unless you already have: 1. Unpack the archive, unless you already have:
gunzip doxygen-1.1.2-20000430.src.tar.gz # uncompress the archive gunzip doxygen-1.1.3.src.tar.gz # uncompress the archive
tar xf doxygen-1.1.2-20000430.src.tar # unpack it tar xf doxygen-1.1.3.src.tar # unpack it
2. Run the configure script: 2. Run the configure script:
...@@ -252,4 +252,4 @@ The latest version of doxygen can be obtained at ...@@ -252,4 +252,4 @@ The latest version of doxygen can be obtained at
Enjoy, Enjoy,
Dimitri van Heesch (30 April 2000) Dimitri van Heesch (08 May 2000)
DOXYGEN Version 1.1.2-20000430 DOXYGEN Version 1.1.3
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at ...@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
Enjoy, Enjoy,
Dimitri van Heesch (30 April 2000) Dimitri van Heesch (08 May 2000)
1.1.2-20000430 1.1.3
...@@ -1427,6 +1427,16 @@ void init() ...@@ -1427,6 +1427,16 @@ void init()
"toolkit from AT&T and Lucent Bell Labs. The other options in this section \n" "toolkit from AT&T and Lucent Bell Labs. The other options in this section \n"
"have no effect if this option is set to NO (the default) \n" "have no effect if this option is set to NO (the default) \n"
); );
ConfigBool::add( "classGraphFlag",
"CLASS_GRAPH",
"TRUE",
"class graph",
"If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
"will generate a graph for each documented class showing the direct and \n"
"indirect inheritance relations. Setting this tag to YES will force the \n"
"the CLASS_DIAGRAMS tag to NO.\n"
);
addDependency("classGraphFlag","haveDotFlag");
ConfigBool::add( "collGraphFlag", ConfigBool::add( "collGraphFlag",
"COLLABORATION_GRAPH", "COLLABORATION_GRAPH",
"TRUE", "TRUE",
......
...@@ -85,6 +85,7 @@ documentation: ...@@ -85,6 +85,7 @@ documentation:
<li> \refitem cmdline \line <li> \refitem cmdline \line
<li> \refitem cmdlink \link <li> \refitem cmdlink \link
<li> \refitem cmdmainpage \mainpage <li> \refitem cmdmainpage \mainpage
<li> \refitem cmdname \name
<li> \refitem cmdnamespace \namespace <li> \refitem cmdnamespace \namespace
<li> \refitem cmdoverload \overload <li> \refitem cmdoverload \overload
<li> \refitem cmdpage \page <li> \refitem cmdpage \page
...@@ -186,20 +187,13 @@ Doxygen. Unrecognized commands are treated as normal text. ...@@ -186,20 +187,13 @@ Doxygen. Unrecognized commands are treated as normal text.
\addindex \defgroup \addindex \defgroup
Indicates that a comment block contains documentation for a Indicates that a comment block contains documentation for a
group of classes, files or namespaces. This can be used to \ref modules "group" of classes, files or namespaces. This can be used to
categorize classes, files or namespaces, and document those categorize classes, files or namespaces, and document those
categories. categories. You can also uses groups as members of other groups,
thus building a hierarchy of groups.
The \<name\> argument should an single word identifier. The \<name\> argument should an single word identifier.
\par Example:
\verbinclude group.cpp
\htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/group/html/modules.html">here</a>
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
\sa section \ref cmdingroup "\\ingroup" \sa section \ref cmdingroup "\\ingroup"
<hr> <hr>
...@@ -354,6 +348,17 @@ Doxygen. Unrecognized commands are treated as normal text. ...@@ -354,6 +348,17 @@ Doxygen. Unrecognized commands are treated as normal text.
section \ref cmdsubsection "\\subsection" and section \ref cmdsubsection "\\subsection" and
section \ref cmdpage "\\page". section \ref cmdpage "\\page".
<hr>
\subsection cmdname \name (header)
This command turns a comment block into a header
definition of a member group. The
comment block should be followed by a
<code>//@{ ... //@}</code> block containing the
members of the group.
See section \ref memgroup for an example.
<hr> <hr>
\subsection cmdnamespace \namespace <name> \subsection cmdnamespace \namespace <name>
......
...@@ -60,6 +60,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -60,6 +60,7 @@ followed by the descriptions of the tags grouped by category.
<li> \refitem cfg_cgi_name CGI_NAME <li> \refitem cfg_cgi_name CGI_NAME
<li> \refitem cfg_cgi_url CGI_URL <li> \refitem cfg_cgi_url CGI_URL
<li> \refitem cfg_class_diagrams CLASS_DIAGRAMS <li> \refitem cfg_class_diagrams CLASS_DIAGRAMS
<li> \refitem cfg_class_graph CLASS_GRAPH
<li> \refitem cfg_collaboration_graph COLLABORATION_GRAPH <li> \refitem cfg_collaboration_graph COLLABORATION_GRAPH
<li> \refitem cfg_cols_in_alpha_index COLS_IN_ALPHA_INDEX <li> \refitem cfg_cols_in_alpha_index COLS_IN_ALPHA_INDEX
<li> \refitem cfg_compact_latex COMPACT_LATEX <li> \refitem cfg_compact_latex COMPACT_LATEX
...@@ -115,6 +116,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -115,6 +116,7 @@ followed by the descriptions of the tags grouped by category.
<li> \refitem cfg_output_directory OUTPUT_DIRECTORY <li> \refitem cfg_output_directory OUTPUT_DIRECTORY
<li> \refitem cfg_output_language OUTPUT_LANGUAGE <li> \refitem cfg_output_language OUTPUT_LANGUAGE
<li> \refitem cfg_paper_type PAPER_TYPE <li> \refitem cfg_paper_type PAPER_TYPE
<li> \refitem cfg_pdf_hyperlinks PDF_HYPERLINKS
<li> \refitem cfg_perl_path PERL_PATH <li> \refitem cfg_perl_path PERL_PATH
<li> \refitem cfg_predefined PREDEFINED <li> \refitem cfg_predefined PREDEFINED
<li> \refitem cfg_project_name PROJECT_NAME <li> \refitem cfg_project_name PROJECT_NAME
...@@ -704,6 +706,15 @@ EXTRA_PACKAGES = times ...@@ -704,6 +706,15 @@ EXTRA_PACKAGES = times
the version number of doxygen, the project name (see PROJECT_NAME), or the the version number of doxygen, the project name (see PROJECT_NAME), or the
project number (see PROJECT_NUMBER). project number (see PROJECT_NUMBER).
\anchor cfg_pdf_hyperlinks
<dt>\c PDF_HYPERLINKS <dd>
\addindex PDF_HYPERLINKS
If the \c PDF_HYPERLINKS tag is set to \c YES, the LaTeX that is generated
is prepared for conversion to pdf (using ps2pdf). The pdf file will
contain links (just like the HTML output) instead of page references
This makes the output suitable for online browsing using a pdf viewer.
\anchor cfg_latex_batchmode \anchor cfg_latex_batchmode
<dt>\c LATEX_BATCHMODE <dd> <dt>\c LATEX_BATCHMODE <dd>
\addindex LATEX_BATCHMODE \addindex LATEX_BATCHMODE
...@@ -890,6 +901,14 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre> ...@@ -890,6 +901,14 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
visualization toolkit from AT&T and Lucent Bell Labs. The other options in visualization toolkit from AT&T and Lucent Bell Labs. The other options in
this section have no effect if this option is set to \c NO (the default) this section have no effect if this option is set to \c NO (the default)
\anchor cfg_class_graph
<dt>\c CLASS_GRAPH <dd>
\addindex CLASS_GRAPH
If the \c CLASS_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen
will generate a graph for each documented class showing the direct and
indirect inheritance relations. Setting this tag to \c YES will force the
the \c CLASS_DIAGRAMS tag to NO.
\anchor cfg_collaboration_graph \anchor cfg_collaboration_graph
<dt>\c COLLABORATION_GRAPH <dd> <dt>\c COLLABORATION_GRAPH <dd>
\addindex COLLABORATION_GRAPH \addindex COLLABORATION_GRAPH
......
...@@ -47,6 +47,7 @@ Written by Dimitri van Heesch\\[2ex] ...@@ -47,6 +47,7 @@ Written by Dimitri van Heesch\\[2ex]
\input{install} \input{install}
\input{starting} \input{starting}
\input{docblocks} \input{docblocks}
\input{grouping}
\input{formulas} \input{formulas}
\input{diagrams} \input{diagrams}
\input{preprocessing} \input{preprocessing}
......
...@@ -35,7 +35,7 @@ You should use the \\mainpage command inside a comment block like this: ...@@ -35,7 +35,7 @@ You should use the \\mainpage command inside a comment block like this:
*/ */
\endverbatim \endverbatim
<li><b>When I set EXTRACT_ALL to NO non of my function are shown in the documentation.</b></li> <li><b>When I set EXTRACT_ALL to NO non of my functions are shown in the documentation.</b></li>
In order for global functions, variables, enums, typedefs, and defines In order for global functions, variables, enums, typedefs, and defines
to be documented you should document the file in which these commands are to be documented you should document the file in which these commands are
...@@ -147,6 +147,11 @@ QTime and QIODevice classes. ...@@ -147,6 +147,11 @@ QTime and QIODevice classes.
Another reason is for the nice and bug free utility classes, like QList, Another reason is for the nice and bug free utility classes, like QList,
QDict, QString, QArray, QTextStream, QRegExp etc. QDict, QString, QArray, QTextStream, QRegExp etc.
<li><b>Can use doxygen on my Java code?</b>
No, at the moment there is no support for Java. I suggest to
use Sun's JavaDoc instead.
</ol> </ol>
\htmlonly \htmlonly
......
...@@ -47,23 +47,33 @@ Documents produced by Doxygen are derivative works derived from the ...@@ -47,23 +47,33 @@ Documents produced by Doxygen are derivative works derived from the
input used in their production; they are not affected by this license. input used in their production; they are not affected by this license.
<h2>Introduction</h2> <h2>Introduction</h2>
Doxygen is a documentation system for C, C++ and IDL. It can generate an Doxygen is a documentation system for C++, IDL (Corba and Microsoft flavors)
on-line class browser (in HTML) and/or an off-line reference manual and C.
(in \f$\mbox{\LaTeX}\f$) from a set
of documented source files. There is also support for generating It can help you in three ways:
man pages and for converting the generated output into <ol>
Postscript, hyperlinked PDF or compressed HTML. <li> It can generate an on-line documentation browser (in HTML) and/or an
The documentation is extracted directly from the off-line reference manual (in \f$\mbox{\LaTeX}\f$) from a set
sources. Doxygen is developed on <a href="http://www.linux.org">Linux</a>, of documented source files.
but it runs on most other UNIX flavors as well. There is also support for generating output in RTF (MS-Word),
An executable for Windows 9x/NT is also available. Postscript, hyperlinked PDF, compressed HTML, and Unix man pages.
The documentation is extracted directly from the sources, which
Doxygen can also be configured to extract the code-structure from undocumented makes it much easier to keep the documentation consistent with the
source files. This can be very useful to quickly find your way in large source code.
source distributions. <li> Doxygen can be configured to extract the code structure
from undocumented source files. This can be very useful to quickly
You can even `abuse' doxygen for creating normal documentation (as I did find your way in large source distributions.
for this manual). The relations between the various elements are be visualized
by means of include dependency graphs, inheritance diagrams,
and collaboration diagrams, which are all generated automatically.
<li> You can even `abuse' doxygen for creating normal documentation (as I did
for this manual).
</ol>
Doxygen is developed on <a href="http://www.linux.org">Linux</a>,
but is set-up to be highly portable. As a result, it runs on most
other UNIX flavors as well. Furthermore, an executable for
Windows 9x/NT is also available.
This manual is divided into two parts, each of which is divided into several This manual is divided into two parts, each of which is divided into several
sections. sections.
...@@ -77,6 +87,7 @@ The first part forms a user manual: ...@@ -77,6 +87,7 @@ The first part forms a user manual:
documentation quickly. documentation quickly.
<li>Section \ref docblocks demonstrates the various ways that code can <li>Section \ref docblocks demonstrates the various ways that code can
be documented. be documented.
<li>Section \ref grouping shows how to group things together.
<li>Section \ref formulas shows how to insert formulas in the documentation. <li>Section \ref formulas shows how to insert formulas in the documentation.
<li>Section \ref diagrams describes the diagrams and graphs that doxygen can generate. <li>Section \ref diagrams describes the diagrams and graphs that doxygen can generate.
<li>Section \ref preprocessing explains how doxygen deals with macro definitions. <li>Section \ref preprocessing explains how doxygen deals with macro definitions.
...@@ -112,13 +123,13 @@ The second part forms a reference manual: ...@@ -112,13 +123,13 @@ The second part forms a reference manual:
<h2>Projects using doxygen</h2> <h2>Projects using doxygen</h2>
I have compiled a small I have compiled a
\htmlonly \htmlonly
<a href="http://www.stack.nl/~dimitri/doxygen/projects.html">list of projects</a> <a href="http://www.stack.nl/~dimitri/doxygen/projects.html">list of projects</a>
that use doxygen that use doxygen.
\endhtmlonly \endhtmlonly
\latexonly \latexonly
list of projects that use doxygen (see {\tt http://www.stack.nl/$\sim$dimitri/doxygen/projects.html}) list of projects that use doxygen (see {\tt http://www.stack.nl/$\sim$dimitri/doxygen/projects.html}).
\endlatexonly \endlatexonly
If you know other projects, let me know and I'll add them. If you know other projects, let me know and I'll add them.
...@@ -143,13 +154,13 @@ Thanks go to: ...@@ -143,13 +154,13 @@ Thanks go to:
Although I have rewritten practically all code since then, DOC++ has still Although I have rewritten practically all code since then, DOC++ has still
given me a good start in writing Doxygen. given me a good start in writing Doxygen.
<li>All people at Troll Tech, for creating a beautiful GUI Toolkit <li>All people at Troll Tech, for creating a beautiful GUI Toolkit
(which is even useful for GUI-less applications like doxygen :-) (which is very useful as a Windows/Unix platform abstraction layer :-)
<li>My brother <a href="http://www.stack.nl/~fidget/index.html">Frank</a> <li>My brother <a href="http://www.stack.nl/~fidget/index.html">Frank</a>
for rendering the logos. for rendering the logos.
<li>Harm van der Heijden for adding HTML help support. <li>Harm van der Heijden for adding HTML help support.
<li>Parker Waerchter for adding the RTF output generator. <li>Parker Waerchter for adding the RTF output generator.
<li>Joerg Baumann, for adding conditional documentation blocks, and <li>Joerg Baumann, for adding conditional documentation blocks,
PDF links. PDF links, and the configuration generator.
<li>Matthias Andree for providing a .spec script for building rpms from the <li>Matthias Andree for providing a .spec script for building rpms from the
sources. sources.
<li>Jens Breitenstein, Christophe Bordeaux, Samuel Hägglund, Xet Erixon, <li>Jens Breitenstein, Christophe Bordeaux, Samuel Hägglund, Xet Erixon,
......
This diff is collapsed.
...@@ -20,12 +20,14 @@ all: class/html/index.html \ ...@@ -20,12 +20,14 @@ all: class/html/index.html \
template/html/index.html \ template/html/index.html \
tag/html/index.html \ tag/html/index.html \
group/html/index.html \ group/html/index.html \
diagrams/html/index.html diagrams/html/index.html \
memgrp/html/index.html
clean: clean:
rm -rf class define enum file func page relates author \ rm -rf class define enum file func page relates author \
par overload example include qtstyle jdstyle structcmd \ par overload example include qtstyle jdstyle structcmd \
autolink tag restypedef afterdoc template tag group diagrams autolink tag restypedef afterdoc template tag group diagrams \
memgrp
class/html/index.html: class.h class.cfg class/html/index.html: class.h class.cfg
$(DOXYGEN)/bin/doxygen class.cfg $(DOXYGEN)/bin/doxygen class.cfg
...@@ -92,6 +94,9 @@ template/html/index.html: templ.cpp templ.cfg ...@@ -92,6 +94,9 @@ template/html/index.html: templ.cpp templ.cfg
group/html/index.html: group.cpp group.cfg group/html/index.html: group.cpp group.cfg
$(DOXYGEN)/bin/doxygen group.cfg $(DOXYGEN)/bin/doxygen group.cfg
memgrp/html/index.html: memgrp.cpp memgrp.cfg
$(DOXYGEN)/bin/doxygen memgrp.cfg
diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg
ifneq ($(HAVE_DOT),) ifneq ($(HAVE_DOT),)
$(DOXYGEN)/bin/doxygen diagrams.cfg $(DOXYGEN)/bin/doxygen diagrams.cfg
......
...@@ -21,14 +21,15 @@ all: class/html/index.html \ ...@@ -21,14 +21,15 @@ all: class/html/index.html \
template/html/index.html \ template/html/index.html \
tag/html/index.html \ tag/html/index.html \
group/html/index.html \ group/html/index.html \
diagrams/html/index.html diagrams/html/index.html \
memgrp/html/index.html
clean: clean:
deltree /y class define enum file deltree /y class define enum file
deltree /y func page relates author deltree /y func page relates author
deltree /y par overload example include qtstyle deltree /y par overload example include qtstyle
deltree /y jdstyle structcmd autolink resdefine deltree /y jdstyle structcmd autolink resdefine
deltree /y restypedef afterdoc template tag group diagrams deltree /y restypedef afterdoc template tag group diagrams memgrp
class/html/index.html: class.h class.cfg class/html/index.html: class.h class.cfg
$(DOXYDIR)\doxygen class.cfg $(DOXYDIR)\doxygen class.cfg
...@@ -97,5 +98,8 @@ template/html/index.html: templ.cpp templ.cfg ...@@ -97,5 +98,8 @@ template/html/index.html: templ.cpp templ.cfg
group/html/index.html: group.cpp group.cfg group/html/index.html: group.cpp group.cfg
$(DOXYDIR)\doxygen group.cfg $(DOXYDIR)\doxygen group.cfg
memgrp/html/index.html: memgrp.cpp memgrp.cfg
$(DOXYDIR)\doxygen memgrp.cfg
diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg
$(DOXYDIR)\doxygen diagrams.cfg $(DOXYDIR)\doxygen diagrams.cfg
...@@ -10,6 +10,11 @@ ...@@ -10,6 +10,11 @@
* This is the third group * This is the third group
*/ */
/*! \defgroup group4 The Fourth Group
* \ingroup group3
* Group 4 is a subgroup of group 3
*/
/*! \ingroup group1 /*! \ingroup group1
* \brief class C1 in group 1 * \brief class C1 in group 1
*/ */
...@@ -35,11 +40,11 @@ class C4 {}; ...@@ -35,11 +40,11 @@ class C4 {};
*/ */
class C5 {}; class C5 {};
/*! \ingroup group1 group2 group3 /*! \ingroup group1 group2 group3 group4
* \brief class C6 in all groups * namespace N1 is in all groups
* \sa \link group1 The first group\endlink, group2, group3 * \sa \link group1 The first group\endlink, group2, group3, group4
*/ */
class C6 {}; namespace N1 {};
/*! \file /*! \file
* \ingroup group3 * \ingroup group3
......
PROJECT_NAME = "Member Grouping"
OUTPUT_DIRECTORY = memgrp
GENERATE_LATEX = NO
GENERATE_MAN = NO
INPUT = memgrp.cpp
QUIET = YES
/** A class. Details */
class Test
{
public:
/** @name Group1
*/
//@{
/** Function 1 in group 1. Details. */
void func1InGroup1();
void func2InGroup1();
//@}
/** Function without group. Details. */
void ungroupedFunction();
void func1InGroup2();
protected:
void func2InGroup2();
};
void Test::func1InGroup1() {}
void Test::func2InGroup1() {}
/** @name Group2
* Description of group 2.
*/
//@{
/** Function 2 in group 2. Details. */
void Test::func2InGroup2() {}
/** Function 1 in group 2. Details. */
void Test::func1InGroup2() {}
//@}
...@@ -7,8 +7,8 @@ type makeconfig Makefile.win.in >Makefile ...@@ -7,8 +7,8 @@ type makeconfig Makefile.win.in >Makefile
type makeconfig src\Makefile.in >src\Makefile type makeconfig src\Makefile.in >src\Makefile
type makeconfig examples\Makefile.win.in >examples\Makefile type makeconfig examples\Makefile.win.in >examples\Makefile
type makeconfig doc\Makefile.win.in >doc\Makefile type makeconfig doc\Makefile.win.in >doc\Makefile
copy src\doxygen.pro.in src\doxygen.pro type src\doxygen.pro.in | sed "s/\$extraopts/release/g" >src\doxygen.pro
copy src\doxytag.pro.in src\doxytag.pro type src\doxytag.pro.in | sed "s/\$extraopts/release/g" >src\doxytag.pro
copy src\doxysearch.pro.in src\doxysearch.pro type src\doxysearch.pro.in | sed "s/\$extraopts/release/g" >src\doxysearch.pro
nmake nmake
Name: doxygen Name: doxygen
Version: 1.1.2-20000430 Version: 1.1.3
Summary: documentation system for C, C++ and IDL Summary: documentation system for C, C++ and IDL
Release: 1 Release: 1
Source0: doxygen-%{version}.src.tar.gz Source0: doxygen-%{version}.src.tar.gz
...@@ -24,7 +24,7 @@ BuildPrereq: perl tetex ...@@ -24,7 +24,7 @@ BuildPrereq: perl tetex
%build %build
CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix %{prefix} CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix %{prefix} --with-doxywizard
make make
%install %install
...@@ -36,6 +36,9 @@ make INSTALL=$RPM_BUILD_ROOT%{prefix} install ...@@ -36,6 +36,9 @@ make INSTALL=$RPM_BUILD_ROOT%{prefix} install
( cd $RPM_BUILD_ROOT ( cd $RPM_BUILD_ROOT
mkdir -p ./usr/doc/packages mkdir -p ./usr/doc/packages
mv .%{prefix}/doc/doxygen ./usr/doc/packages/doxygen mv .%{prefix}/doc/doxygen ./usr/doc/packages/doxygen
mv .%{prefix}/doc/doxysearch ./usr/doc/packages/doxysearch
mv .%{prefix}/doc/doxytag ./usr/doc/packages/doxytag
mv .%{prefix}/doc/doxywizard ./usr/doc/packages/doxywizard
) )
%files %files
......
...@@ -243,7 +243,7 @@ void ClassDef::insertMember(MemberDef *md,int groupId) ...@@ -243,7 +243,7 @@ void ClassDef::insertMember(MemberDef *md,int groupId)
break; break;
} }
} }
else if (md->isTypedef() || md->isEnumerate()) else if (md->isTypedef() || md->isEnumerate() || md->isEnumValue())
{ {
switch (md->protection()) switch (md->protection())
{ {
...@@ -675,8 +675,25 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -675,8 +675,25 @@ void ClassDef::writeDocumentation(OutputList &ol)
if ( icd->isVisibleInHierarchy()) count++; if ( icd->isVisibleInHierarchy()) count++;
ibcd=inherits->next(); ibcd=inherits->next();
} }
if (Config::classDiagramFlag && count>0)
// write class diagram
if (Config::haveDotFlag && Config::classGraphFlag)
// write class diagram using dot
{
DotClassGraph inheritanceGraph(this,DotClassGraph::Inheritance);
if (!inheritanceGraph.isTrivial())
{
ol.pushGeneratorState();
ol.disable(OutputGenerator::Latex);
ol.disable(OutputGenerator::Man);
ol.startDotGraph();
parseText(ol,theTranslator->trClassDiagram(name()));
ol.endDotGraph(inheritanceGraph);
ol.popGeneratorState();
}
}
else if (Config::classDiagramFlag && count>0)
// write class diagram using build-in generator
{ {
ClassDiagram diagram(this); // create a diagram of this class. ClassDiagram diagram(this); // create a diagram of this class.
ol.startClassDiagram(); ol.startClassDiagram();
...@@ -688,20 +705,16 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -688,20 +705,16 @@ void ClassDef::writeDocumentation(OutputList &ol)
if (Config::haveDotFlag && Config::collGraphFlag) if (Config::haveDotFlag && Config::collGraphFlag)
{ {
DotGfxUsageGraph usageImplGraph(this,TRUE); DotClassGraph usageImplGraph(this,DotClassGraph::Implementation);
if (!usageImplGraph.isTrivial()) if (!usageImplGraph.isTrivial())
{ {
ol.pushGeneratorState();
ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::Latex);
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
ol.startCollaborationDiagram(); ol.startDotGraph();
parseText(ol,theTranslator->trCollaborationDiagram(name())); parseText(ol,theTranslator->trCollaborationDiagram(name()));
//usageImplGraph.writeGraph(Config::htmlOutputDir); ol.endDotGraph(usageImplGraph);
//ol.writeString((QCString)"<p>Interface collaboration diagram for " ol.popGeneratorState();
// "<a href=\"usage_intf_graph_"+name()+".html\">here</a>");
//ol.writeString((QCString)"<p>Implementation collaboration diagram for "
// "<a href=\"usage_impl_graph_"+name()+".html\">here</a>");
ol.endCollaborationDiagram(usageImplGraph);
ol.enableAll();
} }
} }
...@@ -1616,6 +1629,7 @@ void ClassDef::determineImplUsageRelation() ...@@ -1616,6 +1629,7 @@ void ClassDef::determineImplUsageRelation()
if (md->isVariable()) // for each member variable in this class if (md->isVariable()) // for each member variable in this class
{ {
QCString type=md->typeString(); QCString type=md->typeString();
int typeLen=type.length();
static const QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*"); static const QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*");
//printf("in class %s found var type=`%s' name=`%s'\n", //printf("in class %s found var type=`%s' name=`%s'\n",
// name().data(),type.data(),md->name().data()); // name().data(),type.data(),md->name().data());
...@@ -1623,17 +1637,35 @@ void ClassDef::determineImplUsageRelation() ...@@ -1623,17 +1637,35 @@ void ClassDef::determineImplUsageRelation()
bool found=FALSE; bool found=FALSE;
while ((i=re.match(type,p,&l))!=-1 && !found) // for each class name in the type while ((i=re.match(type,p,&l))!=-1 && !found) // for each class name in the type
{ {
int ts=p+l;
int te=ts;
while (type.at(ts)==' ' && ts<typeLen) ts++; // skip any whitespace
if (type.at(ts)=='<') // assume template instance
{
// locate end of template
te=ts+1;
int brCount=1;
while (te<typeLen && brCount!=0)
{
if (type.at(te)=='<') brCount++;
if (type.at(te)=='>') brCount--;
te++;
}
}
QCString templSpec;
if (te>ts) templSpec = type.mid(ts,te-ts);
ClassDef *cd=getResolvedClass(name()+"::"+type.mid(i,l)); ClassDef *cd=getResolvedClass(name()+"::"+type.mid(i,l));
if (cd==0) cd=getResolvedClass(type.mid(i,l)); // TODO: also try inbetween scopes! if (cd==0) cd=getResolvedClass(type.mid(i,l)); // TODO: also try inbetween scopes!
if (cd /*&& cd->isLinkable()*/) // class exists and is linkable if (cd) // class exists
{ {
found=TRUE; found=TRUE;
if (usesImplClassDict==0) usesImplClassDict = new UsesClassDict(257); if (usesImplClassDict==0) usesImplClassDict = new UsesClassDict(257);
UsesClassDef *ucd=usesImplClassDict->find(cd->name()); UsesClassDef *ucd=usesImplClassDict->find(cd->name());
if (ucd==0) if (ucd==0 || ucd->templSpecifiers!=templSpec)
{ {
ucd = new UsesClassDef(cd); ucd = new UsesClassDef(cd);
usesImplClassDict->insert(cd->name(),ucd); usesImplClassDict->insert(cd->name(),ucd);
ucd->templSpecifiers = templSpec;
//printf("Adding used class %s to class %s\n", //printf("Adding used class %s to class %s\n",
// cd->name().data(),name().data()); // cd->name().data(),name().data());
} }
......
...@@ -198,6 +198,7 @@ struct UsesClassDef ...@@ -198,6 +198,7 @@ struct UsesClassDef
} }
ClassDef *classDef; ClassDef *classDef;
QDict<void> *accessors; QDict<void> *accessors;
QCString templSpecifiers;
}; };
class UsesClassDict : public QDict<UsesClassDef> class UsesClassDict : public QDict<UsesClassDef>
......
...@@ -965,7 +965,15 @@ TYPEKW ("bool"|"char"|"const"|"double"|"float"|"int"|"long"|"short"|"signed"|"u ...@@ -965,7 +965,15 @@ TYPEKW ("bool"|"char"|"const"|"double"|"float"|"int"|"long"|"short"|"signed"|"u
{ {
startCodeLine(*g_code); startCodeLine(*g_code);
} }
BEGIN(g_lastSpecialCContext); if (g_lastSpecialCContext==SkipCxxComment)
{ // force end of C++ comment here
endFontClass();
BEGIN( g_lastCContext ) ;
}
else
{
BEGIN(g_lastSpecialCContext);
}
} }
<RemoveSpecialCComment>"*/" { <RemoveSpecialCComment>"*/" {
BEGIN(g_lastSpecialCContext); BEGIN(g_lastSpecialCContext);
......
...@@ -106,6 +106,7 @@ struct Config ...@@ -106,6 +106,7 @@ struct Config
static bool allExtFlag; // include all external classes flag static bool allExtFlag; // include all external classes flag
static QCString perlPath; // the absolute path to perl static QCString perlPath; // the absolute path to perl
static bool haveDotFlag; // indicates wether or not dot is present static bool haveDotFlag; // indicates wether or not dot is present
static bool classGraphFlag; // class graph
static bool collGraphFlag; // collaboration graph static bool collGraphFlag; // collaboration graph
static bool includeGraphFlag; // include graph static bool includeGraphFlag; // include graph
static bool gfxHierarchyFlag; // flag to enable graphical hierarchy static bool gfxHierarchyFlag; // flag to enable graphical hierarchy
......
...@@ -138,6 +138,7 @@ QCString Config::genTagFile; ...@@ -138,6 +138,7 @@ QCString Config::genTagFile;
bool Config::allExtFlag = FALSE; bool Config::allExtFlag = FALSE;
QCString Config::perlPath = "/usr/bin/perl"; QCString Config::perlPath = "/usr/bin/perl";
bool Config::haveDotFlag = FALSE; bool Config::haveDotFlag = FALSE;
bool Config::classGraphFlag = TRUE;
bool Config::collGraphFlag = TRUE; bool Config::collGraphFlag = TRUE;
bool Config::includeGraphFlag = TRUE; bool Config::includeGraphFlag = TRUE;
bool Config::gfxHierarchyFlag = TRUE; bool Config::gfxHierarchyFlag = TRUE;
...@@ -275,6 +276,7 @@ static int yyread(char *buf,int max_size) ...@@ -275,6 +276,7 @@ static int yyread(char *buf,int max_size)
<Start>"ALLEXTERNALS"[ \t]*"=" { BEGIN(GetBool); b=&Config::allExtFlag; } <Start>"ALLEXTERNALS"[ \t]*"=" { BEGIN(GetBool); b=&Config::allExtFlag; }
<Start>"PERL_PATH"[ \t]*"=" { BEGIN(GetString); s=&Config::perlPath; s->resize(0); } <Start>"PERL_PATH"[ \t]*"=" { BEGIN(GetString); s=&Config::perlPath; s->resize(0); }
<Start>"HAVE_DOT"[ \t]*"=" { BEGIN(GetBool); b=&Config::haveDotFlag; } <Start>"HAVE_DOT"[ \t]*"=" { BEGIN(GetBool); b=&Config::haveDotFlag; }
<Start>"CLASS_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::classGraphFlag; }
<Start>"COLLABORATION_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::collGraphFlag; } <Start>"COLLABORATION_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::collGraphFlag; }
<Start>"INCLUDE_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::includeGraphFlag; } <Start>"INCLUDE_GRAPH"[ \t]*"=" { BEGIN(GetBool); b=&Config::includeGraphFlag; }
<Start>"GRAPHICAL_HIERARCHY"[ \t]*"=" { BEGIN(GetBool); b=&Config::gfxHierarchyFlag; } <Start>"GRAPHICAL_HIERARCHY"[ \t]*"=" { BEGIN(GetBool); b=&Config::gfxHierarchyFlag; }
...@@ -557,6 +559,7 @@ void dumpConfig() ...@@ -557,6 +559,7 @@ void dumpConfig()
printf("perlPath=`%s'\n",Config::perlPath.data()); printf("perlPath=`%s'\n",Config::perlPath.data());
printf("# Configuration options related to the dot tool \n"); printf("# Configuration options related to the dot tool \n");
printf("haveDotFlag=`%d'\n",Config::haveDotFlag); printf("haveDotFlag=`%d'\n",Config::haveDotFlag);
printf("classGraphFlag=`%d'\n",Config::classGraphFlag);
printf("collGraphFlag=`%d'\n",Config::collGraphFlag); printf("collGraphFlag=`%d'\n",Config::collGraphFlag);
printf("includeGraphFlag=`%d'\n",Config::includeGraphFlag); printf("includeGraphFlag=`%d'\n",Config::includeGraphFlag);
printf("gfxHierarchyFlag=`%d'\n",Config::gfxHierarchyFlag); printf("gfxHierarchyFlag=`%d'\n",Config::gfxHierarchyFlag);
...@@ -654,6 +657,7 @@ void Config::init() ...@@ -654,6 +657,7 @@ void Config::init()
Config::allExtFlag = FALSE; Config::allExtFlag = FALSE;
Config::perlPath = "/usr/bin/perl"; Config::perlPath = "/usr/bin/perl";
Config::haveDotFlag = FALSE; Config::haveDotFlag = FALSE;
Config::classGraphFlag = TRUE;
Config::collGraphFlag = TRUE; Config::collGraphFlag = TRUE;
Config::includeGraphFlag = TRUE; Config::includeGraphFlag = TRUE;
Config::gfxHierarchyFlag = TRUE; Config::gfxHierarchyFlag = TRUE;
...@@ -1632,6 +1636,18 @@ void writeTemplateConfig(QFile *f,bool sl) ...@@ -1632,6 +1636,18 @@ void writeTemplateConfig(QFile *f,bool sl)
writeBoolValue(t,Config::haveDotFlag); writeBoolValue(t,Config::haveDotFlag);
t << "\n"; t << "\n";
if (!sl) if (!sl)
{
t << "\n";
t << "# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen \n";
t << "# will generate a graph for each documented class showing the direct and \n";
t << "# indirect inheritance relations. Setting this tag to YES will force the \n";
t << "# the CLASS_DIAGRAMS tag to NO.\n";
t << "\n";
}
t << "CLASS_GRAPH = ";
writeBoolValue(t,Config::classGraphFlag);
t << "\n";
if (!sl)
{ {
t << "\n"; t << "\n";
t << "# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"; t << "# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n";
......
This diff is collapsed.
...@@ -41,9 +41,11 @@ struct EdgeInfo ...@@ -41,9 +41,11 @@ struct EdgeInfo
class DotNode class DotNode
{ {
friend class DotGfxHierarchyTable; friend class DotGfxHierarchyTable;
friend class DotGfxUsageGraph; friend class DotClassGraph;
friend class DotInclDepGraph; friend class DotInclDepGraph;
friend class DotNodeList; friend class DotNodeList;
friend void writeDotGraph(DotNode *root,const QCString &baseName,
bool lrRank,bool renderParents,int distance);
public: public:
DotNode(int n,const char *lab,const char *url,int distance = 0,bool rootNode=FALSE); DotNode(int n,const char *lab,const char *url,int distance = 0,bool rootNode=FALSE);
~DotNode(); ~DotNode();
...@@ -60,14 +62,15 @@ class DotNode ...@@ -60,14 +62,15 @@ class DotNode
void removeChild(DotNode *n); void removeChild(DotNode *n);
void removeParent(DotNode *n); void removeParent(DotNode *n);
int number() const { return m_number; } int number() const { return m_number; }
void write(QTextStream &t,bool topDown,int maxDistance=1000); void write(QTextStream &t,bool topDown,bool toChildren,int maxDistance=1000);
int m_subgraphId; int m_subgraphId;
void clearWriteFlag(); void clearWriteFlag();
private: private:
void colorConnectedNodes(int curColor); void colorConnectedNodes(int curColor);
void writeBox(QTextStream &t,bool hasNonReachableChildren); void writeBox(QTextStream &t,bool hasNonReachableChildren);
void writeArrow(QTextStream &t,DotNode *cn,EdgeInfo *ei,bool topDown); void writeArrow(QTextStream &t,DotNode *cn,EdgeInfo *ei,bool topDown,
bool pointBack=TRUE);
const DotNode *findDocNode() const; // only works for acyclic graphs! const DotNode *findDocNode() const; // only works for acyclic graphs!
int m_number; int m_number;
QCString m_label; //!< label text QCString m_label; //!< label text
...@@ -98,22 +101,24 @@ class DotGfxHierarchyTable ...@@ -98,22 +101,24 @@ class DotGfxHierarchyTable
DotNodeList *m_rootSubgraphs; DotNodeList *m_rootSubgraphs;
}; };
class DotGfxUsageGraph class DotClassGraph
{ {
public: public:
DotGfxUsageGraph(ClassDef *cd,bool impl,int maxRecusionDepth=1000); enum GraphType { Interface, Implementation, Inheritance };
~DotGfxUsageGraph(); DotClassGraph(ClassDef *cd,GraphType t,int maxRecusionDepth=1000);
~DotClassGraph();
bool isTrivial() const; bool isTrivial() const;
void writeGraph(QTextStream &t,const char *path,bool TBRank=TRUE); void writeGraph(QTextStream &t,const char *path,bool TBRank=TRUE);
QCString diskName() const; QCString diskName() const;
private: private:
void buildGraph(ClassDef *cd,DotNode *n,int level); void buildGraph(ClassDef *cd,DotNode *n,int level,bool base);
void addClass(ClassDef *cd,DotNode *n,int prot,const char *label,int level); void addClass(ClassDef *cd,DotNode *n,int prot,const char *label,
int level,const char *templSpec,bool base);
DotNode *m_startNode; DotNode *m_startNode;
QDict<DotNode> *m_usedNodes; QDict<DotNode> *m_usedNodes;
static int m_curNodeNumber; static int m_curNodeNumber;
bool m_impl; GraphType m_graphType;
int m_recDepth; int m_recDepth;
QCString m_diskName; QCString m_diskName;
int m_maxDistance; int m_maxDistance;
......
...@@ -154,7 +154,7 @@ int documentedIncludeFiles; ...@@ -154,7 +154,7 @@ int documentedIncludeFiles;
QTextStream tagFile; QTextStream tagFile;
void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl, void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
bool over_load); bool over_load,NamespaceList *nl=0);
const char idMask[] = "[A-Za-z_][A-Za-z_0-9]*"; const char idMask[] = "[A-Za-z_][A-Za-z_0-9]*";
QCString spaces; QCString spaces;
...@@ -195,6 +195,7 @@ void buildGroupList(Entry *root) ...@@ -195,6 +195,7 @@ void buildGroupList(Entry *root)
gd->addSectionsToDefinition(root->anchors); gd->addSectionsToDefinition(root->anchors);
groupList.append(gd); groupList.append(gd);
groupDict.insert(root->name,gd); groupDict.insert(root->name,gd);
addGroupToGroups(root,gd);
} }
} }
EntryListIterator eli(*root->sublist); EntryListIterator eli(*root->sublist);
...@@ -407,48 +408,6 @@ static bool addNamespace(Entry *root,ClassDef *cd) ...@@ -407,48 +408,6 @@ static bool addNamespace(Entry *root,ClassDef *cd)
return FALSE; return FALSE;
} }
static void addClassToGroups(Entry *root,ClassDef *cd)
{
QListIterator<QCString> sli(*root->groups);
QCString *s;
for (;(s=sli.current());++sli)
{
GroupDef *gd=0;
if (!s->isEmpty() && (gd=groupDict[*s]))
{
gd->addClass(cd);
//printf("Compound %s: in group %s\n",cd->name().data(),s->data());
}
}
}
static void addMemberToGroups(Entry *root,MemberDef *md)
{
QListIterator<QCString> sli(*root->groups);
QCString *s;
for (;(s=sli.current());++sli)
{
GroupDef *gd=0;
if (!s->isEmpty() && (gd=groupDict[*s]))
{
GroupDef *mgd = md->groupDef();
if (mgd==0)
{
gd->insertMember(md,root->mGrpId);
md->setGroupDef(gd);
}
else if (mgd!=gd)
{
warn("Warning: Member %s found in multiple groups.!\n"
"The member will be put in group %s, and not in group %s",
md->name().data(),mgd->name().data(),gd->name().data()
);
}
//printf("Member %s: in group %s\n",md->name().data(),s->data());
}
}
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// build a list of all classes mentioned in the documentation // build a list of all classes mentioned in the documentation
// and all classes that have a documentation block before their definition. // and all classes that have a documentation block before their definition.
...@@ -689,14 +648,8 @@ void buildNamespaceList(Entry *root) ...@@ -689,14 +648,8 @@ void buildNamespaceList(Entry *root)
nd->setBriefDescription(root->brief); nd->setBriefDescription(root->brief);
nd->addSectionsToDefinition(root->anchors); nd->addSectionsToDefinition(root->anchors);
QListIterator<QCString> sli(*root->groups); //printf("Adding namespace to group\n");
QCString *s; addNamespaceToGroups(root,nd);
for (;(s=sli.current());++sli)
{
GroupDef *gd=0;
if (!s->isEmpty() && (gd=groupDict[*s]))
gd->addNamespace(nd);
}
bool ambig; bool ambig;
// file definition containing the namespace nd // file definition containing the namespace nd
...@@ -710,6 +663,7 @@ void buildNamespaceList(Entry *root) ...@@ -710,6 +663,7 @@ void buildNamespaceList(Entry *root)
// add class to the list // add class to the list
namespaceList.inSort(nd); namespaceList.inSort(nd);
namespaceDict.insert(fullName,nd); namespaceDict.insert(fullName,nd);
} }
} }
} }
...@@ -783,6 +737,39 @@ void findUsingDirectives(Entry *root) ...@@ -783,6 +737,39 @@ void findUsingDirectives(Entry *root)
fd->addUsingDirective(usingNd); fd->addUsingDirective(usingNd);
} }
} }
else // unknown namespace, but add it anyway.
{
NamespaceDef *nd=new NamespaceDef(root->name);
nd->setDocumentation(root->doc); // copy docs to definition
nd->setBriefDescription(root->brief);
nd->addSectionsToDefinition(root->anchors);
QListIterator<QCString> sli(*root->groups);
QCString *s;
for (;(s=sli.current());++sli)
{
GroupDef *gd=0;
if (!s->isEmpty() && (gd=groupDict[*s]))
gd->addNamespace(nd);
}
bool ambig;
// file definition containing the namespace nd
FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig);
// insert the namespace in the file definition
if (fd)
{
fd->insertNamespace(nd);
fd->addUsingDirective(nd);
}
// the empty string test is needed for extract all case
nd->setBriefDescription(root->brief);
nd->insertUsedFile(root->fileName);
// add class to the list
namespaceList.inSort(nd);
namespaceDict.insert(root->name,nd);
}
} }
} }
EntryListIterator eli(*root->sublist); EntryListIterator eli(*root->sublist);
...@@ -1961,7 +1948,7 @@ void computeMemberReferences() ...@@ -1961,7 +1948,7 @@ void computeMemberReferences()
// over_load is set the standard overload text is added. // over_load is set the standard overload text is added.
void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl, void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
bool over_load) bool over_load,NamespaceList *nl)
{ {
//printf("addMemberDocs: `%s'::`%s' `%s' funcDecl=`%s'\n", //printf("addMemberDocs: `%s'::`%s' `%s' funcDecl=`%s'\n",
// root->parent->name.data(),md->name().data(),md->argsString(),funcDecl); // root->parent->name.data(),md->name().data(),md->argsString(),funcDecl);
...@@ -1973,7 +1960,9 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl, ...@@ -1973,7 +1960,9 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
NamespaceDef *nd=md->getNamespace(); NamespaceDef *nd=md->getNamespace();
if (matchArguments(md->argumentList(),root->argList, if (matchArguments(md->argumentList(),root->argList,
cd ? cd->name().data() : 0, cd ? cd->name().data() : 0,
nd ? nd->name().data() : 0 nd ? nd->name().data() : 0,
TRUE,
nl
) )
) )
{ {
...@@ -2715,10 +2704,16 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2715,10 +2704,16 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
); );
// TODO: match loop for all possible scopes // TODO: match loop for all possible scopes
bool ambig;
FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig);
// list of namespaces using in the file that this member definition is part of
NamespaceList *nl = fd ? fd->getUsedNamespaces() : 0;
bool matching= bool matching=
md->isVariable() || md->isTypedef() || // needed for function pointers md->isVariable() || md->isTypedef() || // needed for function pointers
(md->argumentList()==0 && root->argList->count()==0) || (md->argumentList()==0 && root->argList->count()==0) ||
matchArguments(argList, root->argList,className,namespaceName); matchArguments(argList, root->argList,className,namespaceName,TRUE,nl);
Debug::print(Debug::FindMembers,0, Debug::print(Debug::FindMembers,0,
"6. match results = %d\n",matching); "6. match results = %d\n",matching);
...@@ -2742,7 +2737,7 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2742,7 +2737,7 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
{ {
//printf("addMemberDocs root->inLine=%d md->isInline()=%d\n", //printf("addMemberDocs root->inLine=%d md->isInline()=%d\n",
// root->inLine,md->isInline()); // root->inLine,md->isInline());
addMemberDocs(root,md,funcDecl,overloaded); addMemberDocs(root,md,funcDecl,overloaded,nl);
count++; count++;
} }
} }
...@@ -4533,7 +4528,8 @@ int readDir(QFileInfo *fi, ...@@ -4533,7 +4528,8 @@ int readDir(QFileInfo *fi,
err("Error: source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data()); err("Error: source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data());
} }
else if (cfi->isFile() && else if (cfi->isFile() &&
patternMatch(cfi,patList) && !patternMatch(cfi,exclPatList)) (patList==0 || patternMatch(cfi,patList)) &&
!patternMatch(cfi,exclPatList))
{ {
totalSize+=cfi->size()+cfi->absFilePath().length()+4; totalSize+=cfi->size()+cfi->absFilePath().length()+4;
QCString name=convertToQCString(cfi->fileName()); QCString name=convertToQCString(cfi->fileName());
...@@ -4991,13 +4987,13 @@ int main(int argc,char **argv) ...@@ -4991,13 +4987,13 @@ int main(int argc,char **argv)
msg("Freeing input...\n"); msg("Freeing input...\n");
input.resize(0); input.resize(0);
msg("Building group list...\n");
buildGroupList(root);
msg("Building namespace list...\n"); msg("Building namespace list...\n");
buildNamespaceList(root); buildNamespaceList(root);
findUsingDirectives(root); findUsingDirectives(root);
msg("Building group list...\n");
buildGroupList(root);
//msg("Computing group relations...\n"); //msg("Computing group relations...\n");
//computeGroupRelations(root); //computeGroupRelations(root);
......
...@@ -36,7 +36,8 @@ GroupDef::GroupDef(const char *na,const char *t) : ...@@ -36,7 +36,8 @@ GroupDef::GroupDef(const char *na,const char *t) :
{ {
fileList = new FileList; fileList = new FileList;
classList = new ClassList; classList = new ClassList;
// groupList = new GroupList; groupList = new GroupList;
namespaceList = new NamespaceList;
allMemberList = new MemberList; allMemberList = new MemberList;
allMemberDict = new QDict<MemberDef>; allMemberDict = new QDict<MemberDef>;
...@@ -57,6 +58,10 @@ GroupDef::~GroupDef() ...@@ -57,6 +58,10 @@ GroupDef::~GroupDef()
{ {
delete fileList; delete fileList;
delete classList; delete classList;
delete groupList;
delete namespaceList;
delete allMemberList;
delete allMemberDict;
delete memberGroupList; delete memberGroupList;
delete memberGroupDict; delete memberGroupDict;
} }
...@@ -120,14 +125,18 @@ void GroupDef::insertMember(MemberDef *md,int groupId) ...@@ -120,14 +125,18 @@ void GroupDef::insertMember(MemberDef *md,int groupId)
} }
} }
//void GroupDef::addGroup(const GroupDef *def) void GroupDef::addGroup(const GroupDef *def)
//{ {
// groupList->append(def); groupList->append(def);
//} }
int GroupDef::countMembers() const int GroupDef::countMembers() const
{ {
return fileList->count()+classList->count()+allMemberList->count(); return fileList->count()+
classList->count()+
namespaceList->count()+
groupList->count()+
allMemberList->count();
} }
/*! Compute the HTML anchor names for all members in the class */ /*! Compute the HTML anchor names for all members in the class */
...@@ -188,6 +197,55 @@ void GroupDef::writeDocumentation(OutputList &ol) ...@@ -188,6 +197,55 @@ void GroupDef::writeDocumentation(OutputList &ol)
} }
ol.endMemberList(); ol.endMemberList();
} }
if (namespaceList->count()>0)
{
ol.startMemberHeader();
parseText(ol,theTranslator->trNamespaces());
ol.endMemberHeader();
ol.startMemberList();
NamespaceDef *nd=namespaceList->first();
while (nd)
{
ol.startMemberItem(0);
ol.docify("namespace");
ol.insertMemberAlign();
ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),0,nd->name());
ol.endMemberItem(FALSE);
if (!nd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{
ol.startMemberDescription();
parseDoc(ol,0,0,nd->briefDescription());
ol.endMemberDescription();
ol.newParagraph();
}
nd=namespaceList->next();
}
ol.endMemberList();
}
if (groupList->count()>0)
{
ol.startMemberHeader();
parseText(ol,theTranslator->trModules());
ol.endMemberHeader();
ol.startMemberList();
GroupDef *gd=groupList->first();
while (gd)
{
ol.startMemberItem(0);
//ol.insertMemberAlign();
ol.writeObjectLink(gd->getReference(),gd->getOutputFileBase(),0,gd->groupTitle());
ol.endMemberItem(FALSE);
if (!gd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{
ol.startMemberDescription();
parseDoc(ol,0,0,gd->briefDescription());
ol.endMemberDescription();
ol.newParagraph();
}
gd=groupList->next();
}
ol.endMemberList();
}
classList->writeDeclaration(ol); classList->writeDeclaration(ol);
...@@ -303,3 +361,79 @@ void GroupDef::writeDocumentation(OutputList &ol) ...@@ -303,3 +361,79 @@ void GroupDef::writeDocumentation(OutputList &ol)
endFile(ol); endFile(ol);
ol.popGeneratorState(); ol.popGeneratorState();
} }
//---- helper functions ------------------------------------------------------
void addClassToGroups(Entry *root,ClassDef *cd)
{
QListIterator<QCString> sli(*root->groups);
QCString *s;
for (;(s=sli.current());++sli)
{
GroupDef *gd=0;
if (!s->isEmpty() && (gd=groupDict[*s]))
{
gd->addClass(cd);
//printf("Compound %s: in group %s\n",cd->name().data(),s->data());
}
}
}
void addNamespaceToGroups(Entry *root,NamespaceDef *nd)
{
//printf("root->groups->count()=%d\n",root->groups->count());
QListIterator<QCString> sli(*root->groups);
QCString *s;
for (;(s=sli.current());++sli)
{
GroupDef *gd=0;
//printf("group `%s'\n",s->data());
if (!s->isEmpty() && (gd=groupDict[*s]))
{
gd->addNamespace(nd);
//printf("Namespace %s: in group %s\n",nd->name().data(),s->data());
}
}
}
void addGroupToGroups(Entry *root,GroupDef *subGroup)
{
QListIterator<QCString> sli(*root->groups);
QCString *s;
for (;(s=sli.current());++sli)
{
GroupDef *gd=0;
if (!s->isEmpty() && (gd=groupDict[*s]))
{
gd->addGroup(subGroup);
}
}
}
void addMemberToGroups(Entry *root,MemberDef *md)
{
QListIterator<QCString> sli(*root->groups);
QCString *s;
for (;(s=sli.current());++sli)
{
GroupDef *gd=0;
if (!s->isEmpty() && (gd=groupDict[*s]))
{
GroupDef *mgd = md->groupDef();
if (mgd==0)
{
gd->insertMember(md,root->mGrpId);
md->setGroupDef(gd);
}
else if (mgd!=gd)
{
warn("Warning: Member %s found in multiple groups.!\n"
"The member will be put in group %s, and not in group %s",
md->name().data(),mgd->name().data(),gd->name().data()
);
}
//printf("Member %s: in group %s\n",md->name().data(),s->data());
}
}
}
...@@ -41,12 +41,12 @@ class GroupDef : public Definition ...@@ -41,12 +41,12 @@ class GroupDef : public Definition
public: public:
GroupDef(const char *name,const char *title); GroupDef(const char *name,const char *title);
~GroupDef(); ~GroupDef();
//const char *groupFile() const { return fileName; }
QCString getOutputFileBase() const { return fileName; } QCString getOutputFileBase() const { return fileName; }
const char *groupTitle() const { return title; } const char *groupTitle() const { return title; }
void addFile(const FileDef *def); void addFile(const FileDef *def);
void addClass(const ClassDef *def); void addClass(const ClassDef *def);
void addNamespace(const NamespaceDef *def); void addNamespace(const NamespaceDef *def);
void addGroup(const GroupDef *def);
void insertMember(MemberDef *def,int groupId); void insertMember(MemberDef *def,int groupId);
void addMemberToGroup(MemberDef *def,int groupId); void addMemberToGroup(MemberDef *def,int groupId);
void writeDocumentation(OutputList &ol); void writeDocumentation(OutputList &ol);
...@@ -64,13 +64,15 @@ class GroupDef : public Definition ...@@ -64,13 +64,15 @@ class GroupDef : public Definition
private: private:
QCString title; // title of the group QCString title; // title of the group
QCString fileName; // base name of the generated file QCString fileName; // base name of the generated file
FileList *fileList; // list of all files in the group FileList *fileList; // list of files in the group
ClassList *classList; // list of all classes in the group ClassList *classList; // list of classes in the group
NamespaceList *namespaceList; // list of all namespace in the group NamespaceList *namespaceList; // list of namespaces in the group
GroupList *groupList; // list of sub groups.
MemberList *allMemberList; // list of all members in the group MemberList *allMemberList; // list of all members in the group
QDict<MemberDef> *allMemberDict; QDict<MemberDef> *allMemberDict;
// members sorted to type
// members sorted by type
MemberList defineMembers; MemberList defineMembers;
MemberList protoMembers; MemberList protoMembers;
MemberList typedefMembers; MemberList typedefMembers;
...@@ -80,7 +82,7 @@ class GroupDef : public Definition ...@@ -80,7 +82,7 @@ class GroupDef : public Definition
MemberList varMembers; MemberList varMembers;
/* user defined member groups */ /* user defined member groups */
MemberGroupList *memberGroupList; MemberGroupList *memberGroupList; // list of member groups in this group
MemberGroupDict *memberGroupDict; MemberGroupDict *memberGroupDict;
}; };
...@@ -95,4 +97,9 @@ class GroupListIterator : public QListIterator<GroupDef> ...@@ -95,4 +97,9 @@ class GroupListIterator : public QListIterator<GroupDef>
GroupListIterator(const GroupList &l) : QListIterator<GroupDef>(l) {} GroupListIterator(const GroupList &l) : QListIterator<GroupDef>(l) {}
}; };
void addClassToGroups(Entry *root,ClassDef *cd);
void addNamespaceToGroups(Entry *root,NamespaceDef *nd);
void addGroupToGroups(Entry *root,GroupDef *subGroup);
void addMemberToGroups(Entry *root,MemberDef *md);
#endif #endif
...@@ -784,11 +784,11 @@ void HtmlGenerator::endMemberDoc() ...@@ -784,11 +784,11 @@ void HtmlGenerator::endMemberDoc()
t << "</table>" << endl; t << "</table>" << endl;
} }
void HtmlGenerator::startCollaborationDiagram() void HtmlGenerator::startDotGraph()
{ {
} }
void HtmlGenerator::endCollaborationDiagram(DotGfxUsageGraph &g) void HtmlGenerator::endDotGraph(DotClassGraph &g)
{ {
g.writeGraph(t,Config::htmlOutputDir); g.writeGraph(t,Config::htmlOutputDir);
} }
......
...@@ -214,8 +214,8 @@ class HtmlGenerator : public OutputGenerator ...@@ -214,8 +214,8 @@ class HtmlGenerator : public OutputGenerator
{ t << "</td></tr>" << endl; } { t << "</td></tr>" << endl; }
//static void docifyStatic(QTextStream &t,const char *str); //static void docifyStatic(QTextStream &t,const char *str);
void startCollaborationDiagram(); void startDotGraph();
void endCollaborationDiagram(DotGfxUsageGraph &g); void endDotGraph(DotClassGraph &g);
void startInclDepGraph(); void startInclDepGraph();
void endInclDepGraph(DotInclDepGraph &g); void endInclDepGraph(DotInclDepGraph &g);
void writeGraphicalHierarchy(DotGfxHierarchyTable &g); void writeGraphicalHierarchy(DotGfxHierarchyTable &g);
......
...@@ -1449,6 +1449,7 @@ void writeGroupList(OutputList &ol) ...@@ -1449,6 +1449,7 @@ void writeGroupList(OutputList &ol)
GroupDef *gd; GroupDef *gd;
for (;(gd=gli.current());++gli) for (;(gd=gli.current());++gli)
{ {
//printf("gd->name()=%s #members=%d\n",gd->name().data(),gd->countMembers());
if (gd->countMembers()>0) if (gd->countMembers()>0)
{ {
ol.startDescItem(); ol.startDescItem();
......
...@@ -47,22 +47,21 @@ static QCString filterTitle(const char *s) ...@@ -47,22 +47,21 @@ static QCString filterTitle(const char *s)
return result; return result;
} }
//static QCString escapeLabelName(const QCString &s) static QCString escapeLabelName(const QCString &s)
//{ {
// QCString result; QCString result;
// uint i; uint i;
// for (i=0;i<s.length();i++) for (i=0;i<s.length();i++)
// { {
// char c=s.at(i); char c=s.at(i);
// switch (c) switch (c)
// { {
// case '~': result+=".1"; break; case '%': result+="\\%"; break;
// case '%': result+=".2"; break; default: result+=c;
// default: result+=c; }
// } }
// } return result;
// return result; }
//}
LatexGenerator::LatexGenerator() : OutputGenerator() LatexGenerator::LatexGenerator() : OutputGenerator()
...@@ -861,11 +860,11 @@ void LatexGenerator::startMemberDoc(const char *clname, ...@@ -861,11 +860,11 @@ void LatexGenerator::startMemberDoc(const char *clname,
docify(clname); docify(clname);
t << "}!"; t << "}!";
} }
t << memname << "@{"; t << escapeLabelName(memname) << "@{";
docify(memname); docify(memname);
t << "}}" << endl; t << "}}" << endl;
t << "\\index{" << memname << "@{"; t << "\\index{" << escapeLabelName(memname) << "@{";
docify(memname); docify(memname);
t << "}"; t << "}";
if (clname) if (clname)
...@@ -921,7 +920,7 @@ void LatexGenerator::addToIndex(const char *s1,const char *s2) ...@@ -921,7 +920,7 @@ void LatexGenerator::addToIndex(const char *s1,const char *s2)
{ {
if (s1) if (s1)
{ {
t << "\\index{" << s1 << "@{"; t << "\\index{" << escapeLabelName(s1) << "@{";
docify(s1); docify(s1);
t << "}"; t << "}";
if (s2) if (s2)
......
...@@ -211,8 +211,8 @@ class LatexGenerator : public OutputGenerator ...@@ -211,8 +211,8 @@ class LatexGenerator : public OutputGenerator
//static void docifyStatic(QTextStream &t,const char *str); //static void docifyStatic(QTextStream &t,const char *str);
void startCollaborationDiagram() {} void startDotGraph() {}
void endCollaborationDiagram(DotGfxUsageGraph &) {} void endDotGraph(DotClassGraph &) {}
void startInclDepGraph() {} void startInclDepGraph() {}
void endInclDepGraph(DotInclDepGraph &) {} void endInclDepGraph(DotInclDepGraph &) {}
void writeGraphicalHierarchy(DotGfxHierarchyTable &) {} void writeGraphicalHierarchy(DotGfxHierarchyTable &) {}
......
...@@ -197,8 +197,8 @@ class ManGenerator : public OutputGenerator ...@@ -197,8 +197,8 @@ class ManGenerator : public OutputGenerator
void startDescTableData() { } void startDescTableData() { }
void endDescTableData() {} void endDescTableData() {}
void startCollaborationDiagram() {} void startDotGraph() {}
void endCollaborationDiagram(DotGfxUsageGraph &) {} void endDotGraph(DotClassGraph &) {}
void startInclDepGraph() {} void startInclDepGraph() {}
void endInclDepGraph(DotInclDepGraph &) {} void endInclDepGraph(DotInclDepGraph &) {}
void writeGraphicalHierarchy(DotGfxHierarchyTable &) {} void writeGraphicalHierarchy(DotGfxHierarchyTable &) {}
......
...@@ -104,7 +104,8 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd, ...@@ -104,7 +104,8 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
bool first=TRUE; bool first=TRUE;
while (a) while (a)
{ {
ol.startParameter(first); first=FALSE; if (!md->isDefine()) ol.startParameter(first); else ol.docify(" ");
first=FALSE;
QRegExp re(")("); QRegExp re(")(");
int vp; int vp;
if (!a->attrib.isEmpty()) // argument has an IDL attribute if (!a->attrib.isEmpty()) // argument has an IDL attribute
...@@ -154,7 +155,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd, ...@@ -154,7 +155,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
if (a) if (a)
{ {
ol.docify(", "); // there are more arguments ol.docify(", "); // there are more arguments
ol.endParameter(FALSE); if (!md->isDefine()) ol.endParameter(FALSE);
} }
} }
ol.pushGeneratorState(); ol.pushGeneratorState();
...@@ -1004,7 +1005,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1004,7 +1005,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
ol.docify("]"); ol.docify("]");
ol.endTypewriter(); ol.endTypewriter();
} }
ol.endParameter(TRUE); if (!isDefine()) ol.endParameter(TRUE);
ol.endMemberDoc(); ol.endMemberDoc();
ol.endDoxyAnchor(); ol.endDoxyAnchor();
ol.startIndent(); ol.startIndent();
...@@ -1300,11 +1301,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1300,11 +1301,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
void MemberDef::warnIfUndocumented() void MemberDef::warnIfUndocumented()
{ {
//if (memberGroup) return; if (memberGroup) return;
ClassDef *cd = memberClass(); ClassDef *cd = memberClass();
NamespaceDef *nd = getNamespace(); NamespaceDef *nd = getNamespace();
FileDef *fd = getFileDef(); FileDef *fd = getFileDef();
GroupDef *gd = groupDef(); GroupDef *gd = groupDef();
Definition *d=0; Definition *d=0;
const char *t=0; const char *t=0;
if (cd) if (cd)
......
...@@ -119,67 +119,7 @@ void MemberList::countDocMembers() ...@@ -119,67 +119,7 @@ void MemberList::countDocMembers()
(Config::extractAllFlag || md->detailsAreVisible()) (Config::extractAllFlag || md->detailsAreVisible())
) )
{ {
static QRegExp r("@[0-9]+"); if (md->memberType()!=MemberDef::EnumValue) m_count++;
int dummy;
switch(md->memberType())
{
case MemberDef::Enumeration:
if (r.match(md->name(),0,&dummy)==-1)
{
m_count++;
}
break;
case MemberDef::EnumValue:
{
MemberDef *scope;
scope=md->getEnumScope();
if (scope && r.match(scope->name(),0,&dummy)!=-1)
m_count++;
}
break;
default:
m_count++;
break;
}
// QRegExp r("@[0-9]+");
// int dummy;
// switch(md->memberType())
// {
// case MemberDef::Variable:
// varCnt++;
// break;
// case MemberDef::Function:
// case MemberDef::Signal:
// case MemberDef::Slot:
// funcCnt++;
// break;
// case MemberDef::Enumeration:
// if (r.match(md->name(),0,&dummy)==-1)
// {
// enumCnt++;
// }
// break;
// case MemberDef::EnumValue:
// {
// MemberDef *scope;
// scope=md->getEnumScope();
// if (scope && r.match(scope->name(),0,&dummy)!=-1)
// enumValCnt++;
// }
// break;
// case MemberDef::Typedef:
// typeCnt++;
// break;
// case MemberDef::Prototype:
// protoCnt++;
// break;
// case MemberDef::Define:
// defCnt++;
// break;
// case MemberDef::Friend:
// friendCnt++;
// }
} }
md=next(); md=next();
} }
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#include "index.h" #include "index.h"
class ClassDiagram; class ClassDiagram;
class DotGfxUsageGraph; class DotClassGraph;
class DotInclDepGraph; class DotInclDepGraph;
class DotGfxHierarchyTable; class DotGfxHierarchyTable;
...@@ -200,8 +200,8 @@ class OutputGenerator ...@@ -200,8 +200,8 @@ class OutputGenerator
virtual void startDescTableData() = 0; virtual void startDescTableData() = 0;
virtual void endDescTableData() = 0; virtual void endDescTableData() = 0;
virtual void startCollaborationDiagram() = 0; virtual void startDotGraph() = 0;
virtual void endCollaborationDiagram(DotGfxUsageGraph &g) = 0; virtual void endDotGraph(DotClassGraph &g) = 0;
virtual void startInclDepGraph() = 0; virtual void startInclDepGraph() = 0;
virtual void endInclDepGraph(DotInclDepGraph &g) = 0; virtual void endInclDepGraph(DotInclDepGraph &g) = 0;
virtual void writeGraphicalHierarchy(DotGfxHierarchyTable &g) = 0; virtual void writeGraphicalHierarchy(DotGfxHierarchyTable &g) = 0;
......
...@@ -257,7 +257,7 @@ void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4),a1,a2,a3,a4) ...@@ -257,7 +257,7 @@ void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4),a1,a2,a3,a4)
FORALL1(const char *a1,a1) FORALL1(const char *a1,a1)
FORALL1(char a1,a1) FORALL1(char a1,a1)
FORALL1(int a1,a1) FORALL1(int a1,a1)
FORALL1(DotGfxUsageGraph &a1,a1) FORALL1(DotClassGraph &a1,a1)
FORALL1(DotInclDepGraph &a1,a1) FORALL1(DotInclDepGraph &a1,a1)
FORALL1(DotGfxHierarchyTable &a1,a1) FORALL1(DotGfxHierarchyTable &a1,a1)
#if defined(HAS_BOOL_TYPE) #if defined(HAS_BOOL_TYPE)
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
void forall(void (OutputGenerator::*func)(arg1,arg2,arg3,arg4),arg1,arg2,arg3,arg4) void forall(void (OutputGenerator::*func)(arg1,arg2,arg3,arg4),arg1,arg2,arg3,arg4)
class ClassDiagram; class ClassDiagram;
class DotGfxUsageGraph; class DotClassGraph;
class DotInclDepGraph; class DotInclDepGraph;
class DotGfxHierarchyTable; class DotGfxHierarchyTable;
...@@ -347,10 +347,10 @@ class OutputList ...@@ -347,10 +347,10 @@ class OutputList
{ forall(&OutputGenerator::startDescTableData); } { forall(&OutputGenerator::startDescTableData); }
void endDescTableData() void endDescTableData()
{ forall(&OutputGenerator::endDescTableData); } { forall(&OutputGenerator::endDescTableData); }
void startCollaborationDiagram() void startDotGraph()
{ forall(&OutputGenerator::startCollaborationDiagram); } { forall(&OutputGenerator::startDotGraph); }
void endCollaborationDiagram(DotGfxUsageGraph &g) void endDotGraph(DotClassGraph &g)
{ forall(&OutputGenerator::endCollaborationDiagram,g); } { forall(&OutputGenerator::endDotGraph,g); }
void startInclDepGraph() void startInclDepGraph()
{ forall(&OutputGenerator::startInclDepGraph); } { forall(&OutputGenerator::startInclDepGraph); }
void endInclDepGraph(DotInclDepGraph &g) void endInclDepGraph(DotInclDepGraph &g)
...@@ -383,7 +383,7 @@ class OutputList ...@@ -383,7 +383,7 @@ class OutputList
FORALLPROTO1(char); FORALLPROTO1(char);
FORALLPROTO1(IndexSections); FORALLPROTO1(IndexSections);
FORALLPROTO1(int); FORALLPROTO1(int);
FORALLPROTO1(DotGfxUsageGraph &); FORALLPROTO1(DotClassGraph &);
FORALLPROTO1(DotInclDepGraph &); FORALLPROTO1(DotInclDepGraph &);
FORALLPROTO1(DotGfxHierarchyTable &); FORALLPROTO1(DotGfxHierarchyTable &);
#if defined(HAS_BOOL_TYPE) #if defined(HAS_BOOL_TYPE)
......
...@@ -1927,11 +1927,11 @@ static bool PreProcessFile(QDir &d,QCString &infName, QTextStream &t, bool bIncl ...@@ -1927,11 +1927,11 @@ static bool PreProcessFile(QDir &d,QCString &infName, QTextStream &t, bool bIncl
return TRUE; return TRUE;
} }
void RTFGenerator::startCollaborationDiagram() void RTFGenerator::startDotGraph()
{ {
} }
void RTFGenerator::endCollaborationDiagram(DotGfxUsageGraph &g) void RTFGenerator::endDotGraph(DotClassGraph &g)
{ {
newParagraph(); newParagraph();
t <<"{\\comment This would be an image map..." << endl; t <<"{\\comment This would be an image map..." << endl;
......
...@@ -191,8 +191,8 @@ class RTFGenerator : public OutputGenerator ...@@ -191,8 +191,8 @@ class RTFGenerator : public OutputGenerator
void startDescTableData(); void startDescTableData();
void endDescTableData(); void endDescTableData();
void startCollaborationDiagram(); void startDotGraph();
void endCollaborationDiagram(DotGfxUsageGraph &); void endDotGraph(DotClassGraph &);
void startInclDepGraph(); void startInclDepGraph();
void endInclDepGraph(DotInclDepGraph &); void endInclDepGraph(DotInclDepGraph &);
void writeGraphicalHierarchy(DotGfxHierarchyTable &) {} void writeGraphicalHierarchy(DotGfxHierarchyTable &) {}
......
...@@ -830,7 +830,7 @@ static QCString findAndCopyImage(const char *fileName,ImageTypes type) ...@@ -830,7 +830,7 @@ static QCString findAndCopyImage(const char *fileName,ImageTypes type)
if (result.left(5)!="http:") if (result.left(5)!="http:")
{ {
warn("Warning: image file %s is not found in IMAGE_PATH: " warn("Warning: image file %s is not found in IMAGE_PATH: "
"assuming external image. ",fileName); "assuming external image.\n",fileName);
} }
} }
return result; return result;
...@@ -877,7 +877,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]* ...@@ -877,7 +877,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?) SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
SCOPEMASK {ID}?(("::"|"#")?(~)?{ID})+ SCOPEMASK {ID}?(("::"|"#")?(~)?{ID})+
URLMASK [a-z_A-Z0-9\~\:\@\#\.\-\+\/]+ URLMASK [a-z_A-Z0-9\~\:\?\@\#\.\-\+\/]+
NONTERM [\{\}\[\]\`\~\@\|\-\+\#\$\/\\\!\%\^\&\*()a-z_A-Z<>0-9] NONTERM [\{\}\[\]\`\~\@\|\-\+\#\$\/\\\!\%\^\&\*()a-z_A-Z<>0-9]
WORD ({NONTERM}+([^\n\t ]*{NONTERM}+)?)|("\""[^\n\"]"\"") WORD ({NONTERM}+([^\n\t ]*{NONTERM}+)?)|("\""[^\n\"]"\"")
ATTR ({B}+[^>\n]*)? ATTR ({B}+[^>\n]*)?
...@@ -1125,6 +1125,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1125,6 +1125,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<DocScan>^{B}*(("//"{B}*)?)"*"*{B}*"-"{B}+ { /* found list item marker */ <DocScan>^{B}*(("//"{B}*)?)"*"*{B}*"-"{B}+ { /* found list item marker */
addListItemMarker(yytext); addListItemMarker(yytext);
} }
<DocScan>\n{B}*"-" {
addListItemMarker(yytext+1);
}
<DocScan>"<!--" { BEGIN(DocSkipHtmlComment); } <DocScan>"<!--" { BEGIN(DocSkipHtmlComment); }
<DocSkipHtmlComment>"--"[!]?">" { BEGIN(DocScan); } <DocSkipHtmlComment>"--"[!]?">" { BEGIN(DocScan); }
<DocSkipHtmlComment>. <DocSkipHtmlComment>.
...@@ -3970,6 +3973,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -3970,6 +3973,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->brief+=' '; current->brief+=' ';
lineCount(); lineCount();
} }
<JavaDoc>".\\"/[ \t\r\n] {
current->brief+=".";
}
<JavaDoc>"."[ \t\r\n] { <JavaDoc>"."[ \t\r\n] {
lineCount(); lineCount();
current->brief+="."; current->brief+=".";
......
...@@ -946,7 +946,8 @@ static void trimNamespaceScope(QCString &t1,QCString &t2) ...@@ -946,7 +946,8 @@ static void trimNamespaceScope(QCString &t1,QCString &t2)
// stored in the list should be equal. // stored in the list should be equal.
bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl,
const char *cl,const char *ns,bool checkCV) const char *cl,const char *ns,bool checkCV,
NamespaceList *usingList)
{ {
QCString className=cl; QCString className=cl;
QCString namespaceName=ns; QCString namespaceName=ns;
...@@ -1048,9 +1049,18 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, ...@@ -1048,9 +1049,18 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl,
srcAType=trimScope(namespaceName,srcAType); srcAType=trimScope(namespaceName,srcAType);
dstAType=trimScope(namespaceName,dstAType); dstAType=trimScope(namespaceName,dstAType);
} }
if (usingList && usingList->count()>0)
{
NamespaceListIterator nli(*usingList);
NamespaceDef *nd;
for (;(nd=nli.current());++nli)
{
srcAType=trimScope(nd->name(),srcAType);
dstAType=trimScope(nd->name(),dstAType);
}
}
//printf("srcAType=%s dstAType=%s\n",srcAType.data(),dstAType.data()); //printf("srcAType=%s dstAType=%s\n",srcAType.data(),dstAType.data());
//printf("`%s' <=> `%s'\n",srcAType.data(),dstAType.data());
uint srcPos=0,dstPos=0; uint srcPos=0,dstPos=0;
bool equal=TRUE; bool equal=TRUE;
while (srcPos<srcAType.length() && dstPos<dstAType.length() && equal) while (srcPos<srcAType.length() && dstPos<dstAType.length() && equal)
...@@ -1201,6 +1211,7 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl) ...@@ -1201,6 +1211,7 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl)
// argListToString(srcAl).data(),argListToString(dstAl).data()); // argListToString(srcAl).data(),argListToString(dstAl).data());
//printArgList(srcAl);printf(" <=> "); //printArgList(srcAl);printf(" <=> ");
//printArgList(dstAl);printf("\n"); //printArgList(dstAl);printf("\n");
if (srcAl==0 || dstAl==0 || srcAl->count()!=dstAl->count()) if (srcAl==0 || dstAl==0 || srcAl->count()!=dstAl->count())
{ {
return; // invalid argument lists -> do not merge return; // invalid argument lists -> do not merge
......
...@@ -35,6 +35,7 @@ class ExampleList; ...@@ -35,6 +35,7 @@ class ExampleList;
class ClassList; class ClassList;
class BaseClassList; class BaseClassList;
class GroupDef; class GroupDef;
class NamespaceList;
extern void setAnchors(char id,MemberList *ml,int groupId=-1); extern void setAnchors(char id,MemberList *ml,int groupId=-1);
extern QCString fileToString(const char *name); extern QCString fileToString(const char *name);
...@@ -53,7 +54,8 @@ extern bool generateLink(OutputList &ol,const char *, ...@@ -53,7 +54,8 @@ extern bool generateLink(OutputList &ol,const char *,
extern void generateFileRef(OutputList &ol,const char *, extern void generateFileRef(OutputList &ol,const char *,
const char *linkTxt=0); const char *linkTxt=0);
extern bool matchArguments(ArgumentList *,ArgumentList *, extern bool matchArguments(ArgumentList *,ArgumentList *,
const char *cl=0,const char *ns=0,bool checkCV=TRUE); const char *cl=0,const char *ns=0,bool checkCV=TRUE,
NamespaceList *usingList=0);
extern void mergeArguments(ArgumentList *,ArgumentList *); extern void mergeArguments(ArgumentList *,ArgumentList *);
extern QCString substituteClassNames(const QCString &s); extern QCString substituteClassNames(const QCString &s);
extern QCString convertSlashes(const QCString &s,bool dots=FALSE); extern QCString convertSlashes(const QCString &s,bool dots=FALSE);
......
...@@ -11,7 +11,7 @@ TMAKE_CC = cl ...@@ -11,7 +11,7 @@ TMAKE_CC = cl
TMAKE_CFLAGS = -nologo TMAKE_CFLAGS = -nologo
TMAKE_CFLAGS_WARN_ON = -W3 TMAKE_CFLAGS_WARN_ON = -W3
TMAKE_CFLAGS_WARN_OFF = -W0 TMAKE_CFLAGS_WARN_OFF = -W0
TMAKE_CFLAGS_RELEASE = -O1 TMAKE_CFLAGS_RELEASE = -O2
TMAKE_CFLAGS_DEBUG = -Zi TMAKE_CFLAGS_DEBUG = -Zi
TMAKE_CFLAGS_MT = -MT TMAKE_CFLAGS_MT = -MT
TMAKE_CFLAGS_MT_DBG = -MTd TMAKE_CFLAGS_MT_DBG = -MTd
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment