Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
doxverilog
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
doxverilog
Commits
367c98ad
Commit
367c98ad
authored
May 08, 2000
by
Dimitri van Heesch
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Release-1.1.3
parent
59bbbf50
Changes
44
Show whitespace changes
Inline
Side-by-side
Showing
44 changed files
with
891 additions
and
411 deletions
+891
-411
INSTALL
INSTALL
+4
-4
README
README
+2
-2
VERSION
VERSION
+1
-1
configgen.cpp
addon/configgen/configgen.cpp
+10
-0
commands.doc
doc/commands.doc
+15
-10
config.doc
doc/config.doc
+19
-0
doxygen_manual.tex
doc/doxygen_manual.tex
+1
-0
faq.doc
doc/faq.doc
+6
-1
index.doc
doc/index.doc
+34
-23
starting.doc
doc/starting.doc
+202
-79
Makefile.in
examples/Makefile.in
+7
-2
Makefile.win.in
examples/Makefile.win.in
+6
-2
group.cpp
examples/group.cpp
+9
-4
memgrp.cfg
examples/memgrp.cfg
+6
-0
memgrp.cpp
examples/memgrp.cpp
+32
-0
make.bat
make.bat
+3
-3
doxygen.spec
packages/rpm/doxygen.spec
+5
-2
classdef.cpp
src/classdef.cpp
+46
-14
classdef.h
src/classdef.h
+1
-0
code.l
src/code.l
+9
-1
config.h
src/config.h
+1
-0
config.l
src/config.l
+16
-0
dot.cpp
src/dot.cpp
+161
-70
dot.h
src/dot.h
+14
-9
doxygen.cpp
src/doxygen.cpp
+55
-59
groupdef.cpp
src/groupdef.cpp
+140
-6
groupdef.h
src/groupdef.h
+13
-6
htmlgen.cpp
src/htmlgen.cpp
+2
-2
htmlgen.h
src/htmlgen.h
+2
-2
index.cpp
src/index.cpp
+1
-0
latexgen.cpp
src/latexgen.cpp
+18
-19
latexgen.h
src/latexgen.h
+2
-2
mangen.h
src/mangen.h
+2
-2
memberdef.cpp
src/memberdef.cpp
+6
-5
memberlist.cpp
src/memberlist.cpp
+1
-61
outputgen.h
src/outputgen.h
+3
-3
outputlist.cpp
src/outputlist.cpp
+1
-1
outputlist.h
src/outputlist.h
+6
-6
rtfgen.cpp
src/rtfgen.cpp
+2
-2
rtfgen.h
src/rtfgen.h
+2
-2
scanner.l
src/scanner.l
+8
-2
util.cpp
src/util.cpp
+13
-2
util.h
src/util.h
+3
-1
tmake.conf
tmake/lib/win32-msvc/tmake.conf
+1
-1
No files found.
INSTALL
View file @
367c98ad
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)
README
View file @
367c98ad
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)
VERSION
View file @
367c98ad
1.1.
2-20000430
1.1.
3
addon/configgen/configgen.cpp
View file @
367c98ad
...
@@ -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"
,
...
...
doc/commands.doc
View file @
367c98ad
...
@@ -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>
...
...
doc/config.doc
View file @
367c98ad
...
@@ -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
...
...
doc/doxygen_manual.tex
View file @
367c98ad
...
@@ -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
}
...
...
doc/faq.doc
View file @
367c98ad
...
@@ -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 function
s
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
...
...
doc/index.doc
View file @
367c98ad
...
@@ -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,
...
...
doc/starting.doc
View file @
367c98ad
...
@@ -60,33 +60,38 @@ Makefile. It contains of a number of assignments (tags) of the form:
...
@@ -60,33 +60,38 @@ Makefile. It contains of a number of assignments (tags) of the form:
You can probably leave the values of most tags in a generated template
You can probably leave the values of most tags in a generated template
configuration file to their default value.
configuration file to their default value.
The \c INPUT tag is the only tag for which you are required to provide
The \ref cfg_input "INPUT" tag is the only tag for which you are required to
a value. See section \ref config for more details about the configuration file.
provide a value. See section \ref config for more details about the
For a small project consisting of a few C and/or C++ source and header files,
configuration file. For a small project consisting of a few C and/or C++ source
you can add the names of the files after the \c INPUT tag.
and header files, you can add the names of the files after the
If you have a larger project consisting of a source directory or tree
\ref cfg_input "INPUT" tag.
this may become tiresome. In this case you should put the root directory or
directories after the \c INPUT tag, and add one or more file
If you have a larger project consisting of a source directory or tree this may
patterns to the \c FILE_PATTERN tag (for instance <code>*.cpp *.h</code>).
become tiresome. In this case you should put the root directory or
Only files that match one of the
directories after the \ref cfg_input "INPUT" tag, and add one or more file
patterns to the \ref cfg_file_patterns "FILE_PATTERNS" tag
(for instance <code>*.cpp *.h</code>). Only files that match one of the
patterns will be parsed (if the patterns are omitted all files will be parsed).
patterns will be parsed (if the patterns are omitted all files will be parsed).
For recursive parsing of a source tree you must set
For recursive parsing of a source tree you must set
the \c RECURSIVE tag to \c YES. To further fine-tune the list of files
the \ref cfg_recursive "RECURSIVE" tag to \c YES. To further fine-tune the
that is parsed the \c EXCLUDE and \c EXCLUDE_PATTERNS tags can be used.
list of files that is parsed the \ref cfg_exclude "EXCLUDE" and
\ref cfg_exclude_patterns "EXCLUDE_PATTERNS" tags can be used.
If you start using doxygen for an existing project (thus without any
If you start using doxygen for an existing project (thus without any
documentation that doxygen is aware of), you can still get an idea of
documentation that doxygen is aware of), you can still get an idea of
what the documented result would be. To do so, you must set
the \c EXTRACT_ALL
what the documented result would be. To do so, you must set
t
ag in the configuration file to \c YES. Then, doxygen will pretend
t
he \ref cfg_extract_all "EXTRACT_ALL" tag in the configuration file
everything in your sources is documented. Please note that warnings of
to \c YES. Then, doxygen will pretend everything in your sources is documented.
undocumented members will not be generated as long as \c EXTRACT_ALL is set
Please note that warnings of undocumented members will not be generated as
to \c YES.
long as \ref cfg_extract_all "EXTRACT_ALL" is set
to \c YES.
To analyse an existing piece of software it is useful to cross-reference
To analyse an existing piece of software it is useful to cross-reference
a (documented) entity with its definition in the source files. Doxygen will
a (documented) entity with its definition in the source files. Doxygen will
generate such cross-references if you set the \c SOURCE_BROWSER tag to \c YES.
generate such cross-references if you set
the \ref cfg_source_browser "SOURCE_BROWSER" tag to \c YES.
It can also include the sources directly into the documentation by setting
It can also include the sources directly into the documentation by setting
\c INLINE_SOURCES to \c YES (this can be handly for code reviews for instance).
\ref cfg_inline_sources "INLINE_SOURCES" to \c YES (this can be handly for
code reviews for instance).
\subsection step2 Step 2: Running doxygen
\subsection step2 Step 2: Running doxygen
...
@@ -95,18 +100,19 @@ To generate the documentation you can now enter:
...
@@ -95,18 +100,19 @@ To generate the documentation you can now enter:
doxygen <config-file>
doxygen <config-file>
\endverbatim
\endverbatim
Doxygen will create a \c html, \c latex and/or \c man directory inside
Doxygen will create a \c html, \c
rtf, \c
latex and/or \c man directory inside
the output directory.
the output directory.
As the names suggest the \c html directory contains the
As the names suggest the \c html directory contain the
generated documentation in HTML format and the \c latex directory contains the
generated documentation in HTML, RTF, \f$\mbox{\LaTeX}\f$ and Unix-Man page
generated documentation in \f$\mbox{\LaTeX}\f$ format. Man pages are put
format.
in a \c man3 directory inside the \c man directory.
The default output directory is the directory in which \c doxygen
The default output directory is the directory in which \c doxygen
is started. The directory to which the output is written can be changed
is started. The directory to which the output is written can be changed
using the \c OUTPUT_DIRECTORY , \c HTML_OUTPUT, \c LATEX_OUTPUT, and
using the \ref cfg_output_directory "OUTPUT_DIRECTORY" ,
\c MAN_OUTPUT tags of the configuration file. If the output directory does not
\ref cfg_html_output "HTML_OUTPUT", \ref cfg_latex_output "LATEX_OUTPUT",
exist, \c doxygen will try to create it for you.
and \ref cfg_man_output "MAN_OUTPUT" tags of the configuration file.
If the output directory does not exist, \c doxygen will try to create it
for you.
\addindex browser
\addindex browser
The generated HTML documentation can be viewed by pointing a HTML browser
The generated HTML documentation can be viewed by pointing a HTML browser
...
@@ -127,10 +133,10 @@ converted into a postscript file \c refman.ps by typing <code>make ps</code>
...
@@ -127,10 +133,10 @@ converted into a postscript file \c refman.ps by typing <code>make ps</code>
(this requires <code>dvips</code>). The Postscript file can be send to a postscript
(this requires <code>dvips</code>). The Postscript file can be send to a postscript
printer. If you do not have a postscript printer, you can try to use
printer. If you do not have a postscript printer, you can try to use
ghostscript to convert postscript into something your printer understands.
ghostscript to convert postscript into something your printer understands.
Conversion to PDF is also possible
; just type
Conversion to PDF is also possible
if you have installed the ghostscript
<code>make pdf</code> (this required <code>ps2pdf</code>).
interpreter; just type <code>make pdf</code>. To get the best results for
To get the best results for PDF output you should set the
PDF output you should set the \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS"
\c PDF_HYPERLINKS
tag to \c YES.
tag to \c YES.
The generated man pages can be viewed using the \c man program. You do need
The generated man pages can be viewed using the \c man program. You do need
to make sure the man directory is in the man path (see the \c MANPATH
to make sure the man directory is in the man path (see the \c MANPATH
...
@@ -145,10 +151,11 @@ this should ofcourse be step 1. Here I assume
...
@@ -145,10 +151,11 @@ this should ofcourse be step 1. Here I assume
you already have some code and you want doxygen to generate a nice document
you already have some code and you want doxygen to generate a nice document
describing the API and maybe the internals as well.
describing the API and maybe the internals as well.
If the \c EXTRACT_ALL option is set to \c NO in the configuration file
If the \ref cfg_extract_all "EXTRACT_ALL" option is set to \c NO in the
(the default), then doxygen will only generate documentation for
configuration file (the default), then doxygen will only generate
\e documented members, files, classes and namespaces. So how do you document
documentation for \e documented members, files, classes and namespaces. So
these? For members, classes and namespaces there are basicly two options:
how do you document these? For members, classes and namespaces there are
basically two options:
<ol>
<ol>
<li>Place a \e special documentation block in front of the declaration or
<li>Place a \e special documentation block in front of the declaration or
definition of the member, class or namespace. For file, class and namespace
definition of the member, class or namespace. For file, class and namespace
...
@@ -174,7 +181,7 @@ During parsing the following steps take place:
...
@@ -174,7 +181,7 @@ During parsing the following steps take place:
<li> If a line starts with some whitespace followed by one or more asterixes
<li> If a line starts with some whitespace followed by one or more asterixes
(<tt>*</tt>) then the whitespace and asterixes are removed.
(<tt>*</tt>) then the whitespace and asterixes are removed.
<li> All resulting blank lines are treated as a paragraph separators.
<li> All resulting blank lines are treated as a paragraph separators.
This saves you from placing new-paragraph commands yourself
,
This saves you from placing new-paragraph commands yourself
in order to make the generated documentation readable.
in order to make the generated documentation readable.
<li> Links are created for words corresponding to documented classes.
<li> Links are created for words corresponding to documented classes.
<li> Links to members are created when certain patterns are found in the
<li> Links to members are created when certain patterns are found in the
...
@@ -218,7 +225,7 @@ Using a number of column aligned minus signs at the start of a
...
@@ -218,7 +225,7 @@ Using a number of column aligned minus signs at the start of a
More text here.
More text here.
If you use tabs within lists, please make sure that \
c TAB_SIZE
in the
If you use tabs within lists, please make sure that \
ref cfg_tab_size "TAB_SIZE"
in the
configuration file is set to the correct tab size.
configuration file is set to the correct tab size.
\htmlonly
\htmlonly
...
@@ -272,11 +279,12 @@ The one-line comments should contain a brief description,
...
@@ -272,11 +279,12 @@ The one-line comments should contain a brief description,
whereas the multi-line comment blocks contain a more detailed description.
whereas the multi-line comment blocks contain a more detailed description.
The brief descriptions are included in the member overview of a class,
The brief descriptions are included in the member overview of a class,
namespace or file and are printed using a small italic font
namespace or file and are printed using a small italic font
(this description can be omitted by setting \c BRIEF_MEMBER_DESC to \c NO in
(this description can be hidden by
setting \ref cfg_brief_member_desc "BRIEF_MEMBER_DESC" to \c NO in
the config file). By default the brief descriptions are also the first
the config file). By default the brief descriptions are also the first
sentence of the detailed description
sentence of the detailed description
(this can be changed by setting the \
c REPEAT_BRIEF tag to \c NO).
(this can be changed by setting the \
ref cfg_repeat_brief "REPEAT_BRIEF" tag
Both the brief and the detailed descriptions are optional
to \c NO).
Both the brief and the detailed descriptions are optional
for the Qt style.
for the Qt style.
Here is the same piece of code, this time documented using the JavaDoc
Here is the same piece of code, this time documented using the JavaDoc
...
@@ -287,10 +295,17 @@ style:
...
@@ -287,10 +295,17 @@ style:
for the corresponding HTML documentation that is generated by doxygen.
for the corresponding HTML documentation that is generated by doxygen.
\endhtmlonly
\endhtmlonly
Note that the first sentence of the documentation (until the <tt>.</tt>)
Note that
by default
the first sentence of the documentation (until the <tt>.</tt>)
is treated as a brief description, whereas the documentation block as a whole
is treated as a brief description, whereas the documentation block as a whole
forms the detailed description. The brief description is required for the
forms the detailed description. If you want to put a dot in the middle of a
JavaDoc style.
sentence you should put a backslash and space behind it. Example:
\verbatim
/** Brief description (e.g.\ using only a few words). Details follow. */
\endverbatim
The brief description is required for the JavaDoc style, unless you set
\ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" to NO. If you do this,
doxygen treats JavaDoc comments just like Qt comments (i.e. You have
to insert an explicit \ref cmdbrief "\\brief" command to add a brief description).
Unlike most other documentation systems, doxygen also allows you to put
Unlike most other documentation systems, doxygen also allows you to put
the documentation of members (including global functions) in front of
the documentation of members (including global functions) in front of
...
@@ -301,6 +316,11 @@ As a compromise the brief description could be placed before the
...
@@ -301,6 +316,11 @@ As a compromise the brief description could be placed before the
declaration and the detailed description before the member definition
declaration and the detailed description before the member definition
(assuming you use the Qt style comments).
(assuming you use the Qt style comments).
\par Note:
Each entity can only have \e one brief and \e one detailed description. If you
specify more than one comment block of the same type, only one will be used,
and all others are ignored!
\subsection structuralcommands Structural commands
\subsection structuralcommands Structural commands
So far we have assumed that the documentation blocks are always located in
So far we have assumed that the documentation blocks are always located in
...
@@ -399,9 +419,99 @@ Here is an example of a the use of these comment blocks:
...
@@ -399,9 +419,99 @@ Here is an example of a the use of these comment blocks:
\endhtmlonly
\endhtmlonly
\warning These blocks can only be used to document \e members.
\warning These blocks can only be used to document \e members.
They cannot be used to document file classes, unions, structs and
They cannot be used to document files, classes, unions, structs,
enums. Furthermore, the structural commands mentioned in the
groups, namespaces and enums. Furthermore, the structural commands
previous section are ignored inside these comment blocks.
mentioned in the previous section (like <code>\\class</code>) are ignored
inside these comment blocks.
\htmlonly
Go to the <a href="grouping.html">next</a> section or return to the
<a href="index.html">index</a>.
\endhtmlonly
*/
/*! \page grouping Grouping
Doxygen has two mechanisms to group things together.
One mechanism works at a global level, creating a new page
for each group. These groups are called "modules" in the documentation.
The other mechanism works within a member list of some compound entity,
and is refered to as a "member group".
\subsection modules Modules
Modules are a way to group things together on a separate page. You
can document a group as a whole, as well as all individual members.
Members of a group can be files, namespaces, classes, functions,
variables, enums, typedefs, and defines, but also other groups.
To define a group, you should put the \ref cmddefgroup "\\defgroup"
command in a special comment block. The first argument of the command
is a label that should uniquely identify the group. You can make an
entity a member of a specific group by putting
a \ref cmdingroup "\\ingroup" command inside its documentation.
\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
\subsection memgroup Member Groups
If a compound (e.g. a class or file) has many members, it is often
desired to group them together. Doxygen already automatically groups
things together on type and protection level, but maybe you feel that
this is not enough or that that default grouping is wrong.
For instance, because you feel that members of different (syntactic)
types belong to the same (semantic) group.
A member group is defined by
a
\verbatim
//@{
...
//@}
\endverbatim
block or a
\verbatim
/*@{*/
...
/*@}*/
\endverbatim
block if you prefer C style
comments. Note that the members of the group should be
physcially inside the member group's body.
Before the opening marker of a block a separate comment block should be
placed. This block should contain the \ref cmdname "@name"
(or \ref cmdname "\name") command and is used to specify the header
of the group. Optionally, the comment block may contain more
detailed information about the group.
Nesting of member groups is not allowed.
If all members of a member group have the same type and protection level
(for instance all are static public members), then the whole member
group is displayed as a subgroup of the type/protection level group
(the group is displayed as a subsection of the "Static Public Members"
section for instance). If two or more members have different types,
then the group is put at the same level as the automatically
generated groups.
\par Example:
\verbinclude memgrp.cpp
\htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/memgrp/html/class_test.html">here</a>
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
Here Group1 is displayed as a subsection of the "Public Members". And
Group2 is a separate section because it contains members with
different protection levels (i.e. public and protected).
\htmlonly
\htmlonly
Go to the <a href="formulas.html">next</a> section or return to the
Go to the <a href="formulas.html">next</a> section or return to the
...
@@ -501,6 +611,10 @@ Go to the <a href="diagrams.html">next</a> section or return to the
...
@@ -501,6 +611,10 @@ Go to the <a href="diagrams.html">next</a> section or return to the
<b>Warning:</b> When you have a very large class hierarchy where many
<b>Warning:</b> When you have a very large class hierarchy where many
classes derive from a common base class, the resulting image may become
classes derive from a common base class, the resulting image may become
too big to handle for some browsers.
too big to handle for some browsers.
<li>if \ref cfg_class_graph "CLASS_GRAPH" is set to \c YES,
a graph will be generated for each documented class showing the
direct and indirect inheritance relations. This disables the
generation of the build-in class inheritance diagrams.
<li>if \ref cfg_include_graph "INCLUDE_GRAPH" is set to \c YES, an include
<li>if \ref cfg_include_graph "INCLUDE_GRAPH" is set to \c YES, an include
dependency graph is generated for each documented file that includes at
dependency graph is generated for each documented file that includes at
least one other file. This feature is currently supported for HTML and RTF
least one other file. This feature is currently supported for HTML and RTF
...
@@ -518,52 +632,56 @@ Go to the <a href="diagrams.html">next</a> section or return to the
...
@@ -518,52 +632,56 @@ Go to the <a href="diagrams.html">next</a> section or return to the
The elements in the class diagrams in HTML and RTF
The elements in the class diagrams in HTML and RTF
have the following meaning:
have the following meaning:
<ul>
<ul>
<li> A yellow box indicates a class. A box can have a
<li> A
\b
yellow box indicates a class. A box can have a
little marker in the lower right corner to indicate that the class
little marker in the lower right corner to indicate that the class
contains base classes that are hidden. If the box is filled with a
contains base classes that are hidden.
For the class diagrams the maximum tree width is currently 8 elements.
If a tree wider some nodes will be hidden.
If the box is filled with a
dashed pattern the inheritance relation is virtual.
dashed pattern the inheritance relation is virtual.
<li> A white box indicates that the documentation of the class
<li> A
\b
white box indicates that the documentation of the class
is currently shown.
is currently shown.
<li> A grey box indicates an undocumented class.
<li> A
\b
grey box indicates an undocumented class.
<li> A
solid dark blue arrows
indicates public inheritance.
<li> A
<b>solid dark blue</b> arrow
indicates public inheritance.
<li> A
dashed dark green arrows
indicates protected inheritance.
<li> A
<b>dashed dark green</b> arrow
indicates protected inheritance.
<li> A
dotted dark green arrows
indicates private inheritance.
<li> A
<b>dotted dark green</b> arrow
indicates private inheritance.
</ul>
</ul>
The elements in the class diagram in \f$\mbox{\LaTeX}\f$ have the
The elements in the class diagram in \f$\mbox{\LaTeX}\f$ have the
following meaning:
following meaning:
<ul>
<ul>
<li> A white box indicates a class.
<li> A
\b
white box indicates a class.
A marker in the lower right corner of the box indicates that the
A
\b
marker in the lower right corner of the box indicates that the
class has base classes that are hidden.
class has base classes that are hidden.
If the box has a dashed border this indicates virtual inheritance.
If the box has a
\b
dashed border this indicates virtual inheritance.
<li> A solid arrow indicates public inheritance.
<li> A
\b
solid arrow indicates public inheritance.
<li> A dashed arrow indicates protected inheritance.
<li> A
\b
dashed arrow indicates protected inheritance.
<li> A dotted arrow indicated private inheritance.
<li> A
\b
dotted arrow indicated private inheritance.
</ul>
</ul>
The elements in the graphs generated by the dot tool have the following
The elements in the graphs generated by the dot tool have the following
meaning:
meaning:
<ul>
<ul>
<li> A white box indicates a class or struct. If the box has a
<li> A \b white box indicates a class or struct or file.
red border this indicates that the class contains related classes
<li> A box with a \b red border indicates a node that has
that are hidden.
\e more arrows than are shown!
<li> A black box indicates that the class' documentation is currently shown.
In order words: the graph is \e truncated with respect to this node.
<li> A dark blue arrow indicates an include relation (for the
The reason a graph is sometimes truncated is too prevent images
from becoming too large.
For the graphs generated with dot doxygen tries
to limit the width of the resulting image to 1024 pixels.
<li> A \b black box indicates that the class' documentation is currently shown.
<li> A <b>dark blue</b> arrow indicates an include relation (for the
include dependency graph) or public inheritance (for the other graphs).
include dependency graph) or public inheritance (for the other graphs).
<li> A
dark green
arrow indicates protected inheritance.
<li> A
<b>dark green</b>
arrow indicates protected inheritance.
<li> A
dark red
arrow indicates private inheritance.
<li> A
<b>dark red</b>
arrow indicates private inheritance.
<li> A
purple dashed
arrow indicated a "usage" relation, the
<li> A
<b>purple dashed</b>
arrow indicated a "usage" relation, the
edge of the arrow is labled with the variable(s) responsible for the
edge of the arrow is labled with the variable(s) responsible for the
relation.
relation.
Class \c A uses class \c B, if class \c A has a member variable \c m
Class \c A uses class \c B, if class \c A has a member variable \c m
of type C, where B is a subtype of C (e.g. C could be \c B, \c B*, <code>T\<B\>*</code> ).
of type C, where B is a subtype of C (e.g. C could be \c B, \c B*, <code>T\<B\>*</code> ).
</ul>
</ul>
The reason why classes or structs are sometimes hidden is too prevent images
to become too large. For the class diagrams the maximum tree width
is currently 8 elements. For the graphs generated with dot doxygen tries
to limit the width of the resulting image to 1024 pixels.
Here are a couple of header files that together show the various diagrams
Here are a couple of header files that together show the various diagrams
that doxygen can generate:
that doxygen can generate:
...
@@ -622,13 +740,14 @@ Then by default doxygen will feed the following to its parser:
...
@@ -622,13 +740,14 @@ Then by default doxygen will feed the following to its parser:
static CONST_STRING version = "2.xx";
static CONST_STRING version = "2.xx";
\endverbatim
\endverbatim
You can disable all preprocessing by setting \c ENABLE_PREPROCESSING to \c
You can disable all preprocessing by setting
\ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" to \c
NO in the configuation file. In the case above doxygen will then read
NO in the configuation file. In the case above doxygen will then read
both statements!
both statements!
In case you want to expand the \c CONST_STRING macro, you should set the
In case you want to expand the \c CONST_STRING macro, you should set the
\
c MACRO_EXPANSION tag in the config file to \c YES. Then the result
\
ref cfg_macro_expansion "MACRO_EXPANSION" tag in the config file
after preprocessing becomes:
to \c YES. Then the result
after preprocessing becomes:
\verbatim
\verbatim
#define VERSION
#define VERSION
...
@@ -640,8 +759,10 @@ after preprocessing becomes:
...
@@ -640,8 +759,10 @@ after preprocessing becomes:
Note that doxygen will now expand \e all macro definitions
Note that doxygen will now expand \e all macro definitions
(recursively if needed). This is often too much. Therefore, doxygen also
(recursively if needed). This is often too much. Therefore, doxygen also
allows you to expand only those defines that you explicitly
allows you to expand only those defines that you explicitly
specify. For this you have to set the \c EXPAND_ONLY_PREDEF tag to \c YES
specify. For this you have to set the
and specify the macro definitions after the \c PREDEFINED tag.
\ref cfg_expand_only_predef "EXPAND_ONLY_PREDEF" tag to \c YES
and specify the macro definitions after
the \ref cfg_predefined "PREDEFINED" tag.
As an example, suppose you have the following obfusciated code fragment
As an example, suppose you have the following obfusciated code fragment
of an abstract base class called \c IUnknown:
of an abstract base class called \c IUnknown:
...
@@ -696,9 +817,11 @@ class IUnknown
...
@@ -696,9 +817,11 @@ class IUnknown
};
};
\endverbatim
\endverbatim
Note that the \c PREDEFINED tag accepts function like macro definitions
Note that the \ref cfg_predefined "PREDEFINED" tag accepts function
(like \c DECLARE_INTERFACE), normal macro substitutions (like \c PURE
like macro definitions
and \c THIS) and plain defines (like \c __cplusplus).
(like \c DECLARE_INTERFACE ), normal macro
substitutions (like \c PURE and \c THIS) and plain
defines (like \c __cplusplus).
Note also that preprocessor definitions that are normally defined
Note also that preprocessor definitions that are normally defined
automatically by the preprocessor (like \c __cplusplus), have to be defined
automatically by the preprocessor (like \c __cplusplus), have to be defined
...
@@ -726,7 +849,7 @@ PREDEFINED = QListT:=QList
...
@@ -726,7 +849,7 @@ PREDEFINED = QListT:=QList
As you can see doxygen's preprocessor is quite powerful, but if you want
As you can see doxygen's preprocessor is quite powerful, but if you want
even more flexibility you can always write an input filter and specify it
even more flexibility you can always write an input filter and specify it
after the \
c INPUT_FILTER
tag.
after the \
ref cfg_input_filter "INPUT_FILTER"
tag.
If you are unsure what the effect of doxygen's preprocessing will be
If you are unsure what the effect of doxygen's preprocessing will be
you can run doxygen as follows:
you can run doxygen as follows:
...
...
examples/Makefile.in
View file @
367c98ad
...
@@ -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
...
...
examples/Makefile.win.in
View file @
367c98ad
...
@@ -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)
\d
oxygen class.cfg
$(DOXYDIR)
\d
oxygen 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)
\d
oxygen group.cfg
$(DOXYDIR)
\d
oxygen group.cfg
memgrp/html/index.html
:
memgrp.cpp memgrp.cfg
$(DOXYDIR)
\d
oxygen 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)
\d
oxygen diagrams.cfg
$(DOXYDIR)
\d
oxygen diagrams.cfg
examples/group.cpp
View file @
367c98ad
...
@@ -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
...
...
examples/memgrp.cfg
0 → 100644
View file @
367c98ad
PROJECT_NAME = "Member Grouping"
OUTPUT_DIRECTORY = memgrp
GENERATE_LATEX = NO
GENERATE_MAN = NO
INPUT = memgrp.cpp
QUIET = YES
examples/memgrp.cpp
0 → 100644
View file @
367c98ad
/** 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
()
{}
//@}
make.bat
View file @
367c98ad
...
@@ -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
packages/rpm/doxygen.spec
View file @
367c98ad
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
...
...
src/classdef.cpp
View file @
367c98ad
...
@@ -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
)
{
{
Dot
GfxUsageGraph
usageImplGraph
(
this
,
TRUE
);
Dot
ClassGraph
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
.
start
CollaborationDiagram
();
ol
.
start
DotGraph
();
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());
}
}
...
...
src/classdef.h
View file @
367c98ad
...
@@ -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
>
...
...
src/code.l
View file @
367c98ad
...
@@ -965,8 +965,16 @@ TYPEKW ("bool"|"char"|"const"|"double"|"float"|"int"|"long"|"short"|"signed"|"u
...
@@ -965,8 +965,16 @@ TYPEKW ("bool"|"char"|"const"|"double"|"float"|"int"|"long"|"short"|"signed"|"u
{
{
startCodeLine(*g_code);
startCodeLine(*g_code);
}
}
if (g_lastSpecialCContext==SkipCxxComment)
{ // force end of C++ comment here
endFontClass();
BEGIN( g_lastCContext ) ;
}
else
{
BEGIN(g_lastSpecialCContext);
BEGIN(g_lastSpecialCContext);
}
}
}
<RemoveSpecialCComment>"*/" {
<RemoveSpecialCComment>"*/" {
BEGIN(g_lastSpecialCContext);
BEGIN(g_lastSpecialCContext);
}
}
...
...
src/config.h
View file @
367c98ad
...
@@ -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
...
...
src/config.l
View file @
367c98ad
...
@@ -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";
...
...
src/dot.cpp
View file @
367c98ad
...
@@ -312,14 +312,15 @@ void DotNode::writeBox(QTextStream &t,bool hasNonReachableChildren)
...
@@ -312,14 +312,15 @@ void DotNode::writeBox(QTextStream &t,bool hasNonReachableChildren)
t
<<
"];"
<<
endl
;
t
<<
"];"
<<
endl
;
}
}
void
DotNode
::
writeArrow
(
QTextStream
&
t
,
DotNode
*
cn
,
EdgeInfo
*
ei
,
bool
topDown
)
void
DotNode
::
writeArrow
(
QTextStream
&
t
,
DotNode
*
cn
,
EdgeInfo
*
ei
,
bool
topDown
,
bool
pointBack
)
{
{
t
<<
" Node"
;
t
<<
" Node"
;
if
(
topDown
)
t
<<
cn
->
number
();
else
t
<<
m_number
;
if
(
topDown
)
t
<<
cn
->
number
();
else
t
<<
m_number
;
t
<<
" -> Node"
;
t
<<
" -> Node"
;
if
(
topDown
)
t
<<
m_number
;
else
t
<<
cn
->
number
();
if
(
topDown
)
t
<<
m_number
;
else
t
<<
cn
->
number
();
t
<<
" ["
;
t
<<
" ["
;
t
<<
"dir=back,"
;
if
(
pointBack
)
t
<<
"dir=back,"
;
t
<<
"color=
\"
"
<<
edgeColorMap
[
ei
->
m_color
]
t
<<
"color=
\"
"
<<
edgeColorMap
[
ei
->
m_color
]
<<
"
\"
,fontsize=10,style=
\"
"
<<
edgeStyleMap
[
ei
->
m_style
]
<<
"
\"
"
;
<<
"
\"
,fontsize=10,style=
\"
"
<<
edgeStyleMap
[
ei
->
m_style
]
<<
"
\"
"
;
if
(
!
ei
->
m_label
.
isEmpty
())
if
(
!
ei
->
m_label
.
isEmpty
())
...
@@ -330,15 +331,16 @@ void DotNode::writeArrow(QTextStream &t,DotNode *cn,EdgeInfo *ei,bool topDown)
...
@@ -330,15 +331,16 @@ void DotNode::writeArrow(QTextStream &t,DotNode *cn,EdgeInfo *ei,bool topDown)
t
<<
"];"
<<
endl
;
t
<<
"];"
<<
endl
;
}
}
void
DotNode
::
write
(
QTextStream
&
t
,
bool
topDown
,
int
distance
)
void
DotNode
::
write
(
QTextStream
&
t
,
bool
topDown
,
bool
toChildren
,
int
distance
)
{
{
//printf("DotNode::write(%d) name=%s\n",distance,m_label.data());
//printf("DotNode::write(%d) name=%s\n",distance,m_label.data());
if
(
m_written
)
return
;
// node already written to the output
if
(
m_written
)
return
;
// node already written to the output
if
(
m_distance
>
distance
)
return
;
if
(
m_distance
>
distance
)
return
;
QList
<
DotNode
>
*
nl
=
toChildren
?
m_children
:
m_parents
;
bool
hasNonReachableChildren
=
FALSE
;
bool
hasNonReachableChildren
=
FALSE
;
if
(
m_distance
==
distance
&&
m_children
)
if
(
m_distance
==
distance
&&
nl
)
{
{
QListIterator
<
DotNode
>
dnli
(
*
m_children
);
QListIterator
<
DotNode
>
dnli
(
*
nl
);
DotNode
*
cn
;
DotNode
*
cn
;
for
(
dnli
.
toFirst
();(
cn
=
dnli
.
current
());
++
dnli
)
for
(
dnli
.
toFirst
();(
cn
=
dnli
.
current
());
++
dnli
)
{
{
...
@@ -347,15 +349,38 @@ void DotNode::write(QTextStream &t,bool topDown,int distance)
...
@@ -347,15 +349,38 @@ void DotNode::write(QTextStream &t,bool topDown,int distance)
}
}
writeBox
(
t
,
hasNonReachableChildren
);
writeBox
(
t
,
hasNonReachableChildren
);
m_written
=
TRUE
;
m_written
=
TRUE
;
if
(
m_children
)
if
(
nl
)
{
if
(
toChildren
)
{
{
QListIterator
<
DotNode
>
dnli1
(
*
m_children
);
QListIterator
<
DotNode
>
dnli1
(
*
nl
);
QListIterator
<
EdgeInfo
>
dnli2
(
*
m_edgeInfo
);
QListIterator
<
EdgeInfo
>
dnli2
(
*
m_edgeInfo
);
DotNode
*
cn
;
DotNode
*
cn
;
for
(
dnli1
.
toFirst
();(
cn
=
dnli1
.
current
());
++
dnli1
,
++
dnli2
)
for
(
dnli1
.
toFirst
();(
cn
=
dnli1
.
current
());
++
dnli1
,
++
dnli2
)
{
{
if
(
cn
->
m_distance
<=
distance
)
writeArrow
(
t
,
cn
,
dnli2
.
current
(),
topDown
);
if
(
cn
->
m_distance
<=
distance
)
cn
->
write
(
t
,
topDown
,
distance
);
{
writeArrow
(
t
,
cn
,
dnli2
.
current
(),
topDown
);
}
cn
->
write
(
t
,
topDown
,
toChildren
,
distance
);
}
}
else
// render parents
{
QListIterator
<
DotNode
>
dnli
(
*
nl
);
DotNode
*
pn
;
for
(
dnli
.
toFirst
();(
pn
=
dnli
.
current
());
++
dnli
)
{
if
(
pn
->
m_distance
<=
distance
)
{
writeArrow
(
t
,
pn
,
pn
->
m_edgeInfo
->
at
(
pn
->
m_children
->
findRef
(
this
)),
FALSE
);
}
pn
->
write
(
t
,
TRUE
,
FALSE
,
distance
);
}
}
}
}
}
}
}
...
@@ -510,7 +535,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
...
@@ -510,7 +535,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
DotNode
*
node
;
DotNode
*
node
;
for
(;(
node
=
dnli2
.
current
());
++
dnli2
)
for
(;(
node
=
dnli2
.
current
());
++
dnli2
)
{
{
if
(
node
->
m_subgraphId
==
n
->
m_subgraphId
)
node
->
write
(
t
,
FALSE
);
if
(
node
->
m_subgraphId
==
n
->
m_subgraphId
)
node
->
write
(
t
,
FALSE
,
TRUE
);
}
}
t
<<
"}"
<<
endl
;
t
<<
"}"
<<
endl
;
f
.
close
();
f
.
close
();
...
@@ -712,49 +737,72 @@ DotGfxHierarchyTable::~DotGfxHierarchyTable()
...
@@ -712,49 +737,72 @@ DotGfxHierarchyTable::~DotGfxHierarchyTable()
//--------------------------------------------------------------------
//--------------------------------------------------------------------
int
Dot
GfxUsage
Graph
::
m_curNodeNumber
;
int
Dot
Class
Graph
::
m_curNodeNumber
;
void
Dot
GfxUsage
Graph
::
addClass
(
ClassDef
*
cd
,
DotNode
*
n
,
int
prot
,
void
Dot
Class
Graph
::
addClass
(
ClassDef
*
cd
,
DotNode
*
n
,
int
prot
,
const
char
*
label
,
int
distance
)
const
char
*
label
,
int
distance
,
const
char
*
templSpec
,
bool
base
)
{
{
//printf(":: DoxGfxUsageGraph::addClass(class=%s,parent=%s,prot=%d,label=%s,dist=%d)\n",
//printf(":: DoxGfxUsageGraph::addClass(class=%s,parent=%s,prot=%d,label=%s,dist=%d)\n",
// cd->name().data(),n->m_label.data(),prot,label,distance);
// cd->name().data(),n->m_label.data(),prot,label,distance);
int
edgeStyle
=
label
?
EdgeInfo
::
Dashed
:
EdgeInfo
::
Solid
;
int
edgeStyle
=
label
?
EdgeInfo
::
Dashed
:
EdgeInfo
::
Solid
;
DotNode
*
bn
=
m_usedNodes
->
find
(
cd
->
name
());
QCString
className
;
if
(
templSpec
)
className
=
insertTemplateSpecifierInScope
(
cd
->
name
(),
templSpec
);
else
className
=
cd
->
name
().
copy
();
DotNode
*
bn
=
m_usedNodes
->
find
(
className
);
if
(
bn
)
// class already inserted
if
(
bn
)
// class already inserted
{
if
(
base
)
{
{
n
->
addChild
(
bn
,
prot
,
edgeStyle
,
label
);
n
->
addChild
(
bn
,
prot
,
edgeStyle
,
label
);
bn
->
addParent
(
n
);
bn
->
addParent
(
n
);
}
else
{
bn
->
addChild
(
n
,
prot
,
edgeStyle
,
label
);
n
->
addParent
(
bn
);
}
bn
->
setDistance
(
distance
);
bn
->
setDistance
(
distance
);
//printf(" add exiting node %s of %s\n",bn->m_label.data(),n->m_label.data());
//printf(" add exiting node %s of %s\n",bn->m_label.data(),n->m_label.data());
}
}
else
// new class
else
// new class
{
{
bn
=
new
DotNode
(
m_curNodeNumber
++
,
bn
=
new
DotNode
(
m_curNodeNumber
++
,
c
d
->
name
()
,
c
lassName
,
cd
->
isLinkable
()
?
cd
->
isLinkable
()
?
(
cd
->
getReference
()
+
"$"
+
cd
->
getOutputFileBase
()).
data
()
:
0
,
(
cd
->
getReference
()
+
"$"
+
cd
->
getOutputFileBase
()).
data
()
:
0
,
distance
distance
);
);
if
(
distance
>
m_maxDistance
)
m_maxDistance
=
distance
;
if
(
distance
>
m_maxDistance
)
m_maxDistance
=
distance
;
if
(
base
)
{
n
->
addChild
(
bn
,
prot
,
edgeStyle
,
label
);
n
->
addChild
(
bn
,
prot
,
edgeStyle
,
label
);
bn
->
addParent
(
n
);
bn
->
addParent
(
n
);
m_usedNodes
->
insert
(
cd
->
name
(),
bn
);
}
else
{
bn
->
addChild
(
n
,
prot
,
edgeStyle
,
label
);
n
->
addParent
(
bn
);
}
m_usedNodes
->
insert
(
className
,
bn
);
//printf(" add used node %s of %s\n",cd->name().data(),n->m_label.data());
//printf(" add used node %s of %s\n",cd->name().data(),n->m_label.data());
if
(
distance
<
m_recDepth
)
buildGraph
(
cd
,
bn
,
distance
+
1
);
if
(
distance
<
m_recDepth
)
buildGraph
(
cd
,
bn
,
distance
+
1
,
base
);
}
}
}
}
void
Dot
GfxUsageGraph
::
buildGraph
(
ClassDef
*
cd
,
DotNode
*
n
,
int
distanc
e
)
void
Dot
ClassGraph
::
buildGraph
(
ClassDef
*
cd
,
DotNode
*
n
,
int
distance
,
bool
bas
e
)
{
{
// add base classes
BaseClassListIterator
bcli
(
base
?
*
cd
->
baseClasses
()
:
*
cd
->
superClasses
());
BaseClassListIterator
bcli
(
*
cd
->
baseClasses
());
BaseClassDef
*
bcd
;
BaseClassDef
*
bcd
;
for
(
;
(
bcd
=
bcli
.
current
())
;
++
bcli
)
for
(
;
(
bcd
=
bcli
.
current
())
;
++
bcli
)
{
{
addClass
(
bcd
->
classDef
,
n
,
bcd
->
prot
,
0
,
distance
);
addClass
(
bcd
->
classDef
,
n
,
bcd
->
prot
,
0
,
distance
,
bcd
->
templSpecifiers
,
base
);
}
}
UsesClassDict
*
dict
=
m_impl
?
cd
->
usedImplementationClasses
()
:
if
(
m_graphType
!=
Inheritance
)
{
UsesClassDict
*
dict
=
m_graphType
==
Implementation
?
cd
->
usedImplementationClasses
()
:
cd
->
usedInterfaceClasses
();
cd
->
usedInterfaceClasses
();
if
(
dict
)
if
(
dict
)
{
{
...
@@ -779,15 +827,16 @@ void DotGfxUsageGraph::buildGraph(ClassDef *cd,DotNode *n,int distance)
...
@@ -779,15 +827,16 @@ void DotGfxUsageGraph::buildGraph(ClassDef *cd,DotNode *n,int distance)
}
}
}
}
//printf("Found label=`%s'\n",label.data());
//printf("Found label=`%s'\n",label.data());
addClass
(
ucd
->
classDef
,
n
,
EdgeInfo
::
Black
,
label
,
distance
);
addClass
(
ucd
->
classDef
,
n
,
EdgeInfo
::
Black
,
label
,
distance
,
ucd
->
templSpecifiers
,
base
);
}
}
}
}
}
}
}
Dot
GfxUsageGraph
::
DotGfxUsageGraph
(
ClassDef
*
cd
,
bool
impl
,
int
maxRecursionDepth
)
Dot
ClassGraph
::
DotClassGraph
(
ClassDef
*
cd
,
GraphType
t
,
int
maxRecursionDepth
)
{
{
//printf("DotGfxUsage::DotGfxUsage %s\n",cd->name().data());
//printf("DotGfxUsage::DotGfxUsage %s\n",cd->name().data());
m_
impl
=
impl
;
m_
graphType
=
t
;
m_maxDistance
=
0
;
m_maxDistance
=
0
;
m_recDepth
=
maxRecursionDepth
;
m_recDepth
=
maxRecursionDepth
;
m_startNode
=
new
DotNode
(
m_curNodeNumber
++
,
m_startNode
=
new
DotNode
(
m_curNodeNumber
++
,
...
@@ -800,25 +849,33 @@ DotGfxUsageGraph::DotGfxUsageGraph(ClassDef *cd,bool impl,int maxRecursionDepth)
...
@@ -800,25 +849,33 @@ DotGfxUsageGraph::DotGfxUsageGraph(ClassDef *cd,bool impl,int maxRecursionDepth)
m_usedNodes
=
new
QDict
<
DotNode
>
(
1009
);
m_usedNodes
=
new
QDict
<
DotNode
>
(
1009
);
m_usedNodes
->
insert
(
cd
->
name
(),
m_startNode
);
m_usedNodes
->
insert
(
cd
->
name
(),
m_startNode
);
//printf("Root node %s\n",cd->name().data());
//printf("Root node %s\n",cd->name().data());
if
(
m_recDepth
>
0
)
buildGraph
(
cd
,
m_startNode
,
1
);
if
(
m_recDepth
>
0
)
{
buildGraph
(
cd
,
m_startNode
,
1
,
TRUE
);
if
(
t
==
Inheritance
)
buildGraph
(
cd
,
m_startNode
,
1
,
FALSE
);
}
m_diskName
=
cd
->
getOutputFileBase
().
copy
();
m_diskName
=
cd
->
getOutputFileBase
().
copy
();
}
}
bool
Dot
GfxUsage
Graph
::
isTrivial
()
const
bool
Dot
Class
Graph
::
isTrivial
()
const
{
{
if
(
m_graphType
==
Inheritance
)
return
m_startNode
->
m_children
==
0
&&
m_startNode
->
m_parents
==
0
;
else
return
m_startNode
->
m_children
==
0
;
return
m_startNode
->
m_children
==
0
;
}
}
Dot
GfxUsageGraph
::~
DotGfxUsage
Graph
()
Dot
ClassGraph
::~
DotClass
Graph
()
{
{
deleteNodes
(
m_startNode
);
deleteNodes
(
m_startNode
);
delete
m_usedNodes
;
delete
m_usedNodes
;
}
}
static
void
writeDotGraph
(
DotNode
*
root
,
const
QCString
&
baseName
,
void
writeDotGraph
(
DotNode
*
root
,
const
QCString
&
baseName
,
bool
lrRank
,
int
distance
)
bool
lrRank
,
bool
renderParents
,
int
distance
)
{
{
// generate the graph description for dot
// generate the graph description for dot
//printf("writeDotGraph(%s,%d)\n",baseName.data(),renderParents);
QFile
f
;
QFile
f
;
f
.
setName
(
baseName
+
".dot"
);
f
.
setName
(
baseName
+
".dot"
);
if
(
f
.
open
(
IO_WriteOnly
))
if
(
f
.
open
(
IO_WriteOnly
))
...
@@ -831,7 +888,25 @@ static void writeDotGraph(DotNode *root,const QCString &baseName,
...
@@ -831,7 +888,25 @@ static void writeDotGraph(DotNode *root,const QCString &baseName,
t
<<
" rankdir=LR;"
<<
endl
;
t
<<
" rankdir=LR;"
<<
endl
;
}
}
root
->
clearWriteFlag
();
root
->
clearWriteFlag
();
root
->
write
(
t
,
TRUE
,
distance
);
root
->
write
(
t
,
TRUE
,
TRUE
,
distance
);
if
(
renderParents
&&
root
->
m_parents
)
{
//printf("rendering parents!\n");
QListIterator
<
DotNode
>
dnli
(
*
root
->
m_parents
);
DotNode
*
pn
;
for
(
dnli
.
toFirst
();(
pn
=
dnli
.
current
());
++
dnli
)
{
if
(
pn
->
m_distance
<=
distance
)
{
root
->
writeArrow
(
t
,
pn
,
pn
->
m_edgeInfo
->
at
(
pn
->
m_children
->
findRef
(
root
)),
FALSE
);
}
pn
->
write
(
t
,
TRUE
,
FALSE
,
distance
);
}
}
t
<<
"}"
<<
endl
;
t
<<
"}"
<<
endl
;
f
.
close
();
f
.
close
();
}
}
...
@@ -840,7 +915,8 @@ static void writeDotGraph(DotNode *root,const QCString &baseName,
...
@@ -840,7 +915,8 @@ static void writeDotGraph(DotNode *root,const QCString &baseName,
static
void
findMaximalDotGraph
(
DotNode
*
root
,
int
maxDist
,
static
void
findMaximalDotGraph
(
DotNode
*
root
,
int
maxDist
,
const
QCString
&
baseName
,
const
QCString
&
baseName
,
QDir
&
thisDir
,
QDir
&
thisDir
,
bool
lrRank
=
FALSE
bool
lrRank
=
FALSE
,
bool
renderParents
=
FALSE
)
)
{
{
bool
lastFit
;
bool
lastFit
;
...
@@ -854,7 +930,7 @@ static void findMaximalDotGraph(DotNode *root,int maxDist,
...
@@ -854,7 +930,7 @@ static void findMaximalDotGraph(DotNode *root,int maxDist,
// sized image (dimensions: maxImageWidth, maxImageHeight)
// sized image (dimensions: maxImageWidth, maxImageHeight)
do
do
{
{
writeDotGraph
(
root
,
baseName
,
lrRank
,
curDistance
);
writeDotGraph
(
root
,
baseName
,
lrRank
,
renderParents
,
curDistance
);
QCString
dotCmd
;
QCString
dotCmd
;
// create annotated dot file
// create annotated dot file
...
@@ -891,19 +967,21 @@ static void findMaximalDotGraph(DotNode *root,int maxDist,
...
@@ -891,19 +967,21 @@ static void findMaximalDotGraph(DotNode *root,int maxDist,
if
(
!
lastFit
)
if
(
!
lastFit
)
{
{
//printf("Using last fit %d\n",minDistance);
//printf("Using last fit %d\n",minDistance);
writeDotGraph
(
root
,
baseName
,
writeDotGraph
(
root
,
baseName
,
lrRank
||
(
curDistance
==
1
&&
width
>
maxImageWidth
),
lrRank
||
(
curDistance
==
1
&&
width
>
maxImageWidth
),
renderParents
,
minDistance
minDistance
);
);
}
}
}
}
QCString
Dot
GfxUsage
Graph
::
diskName
()
const
QCString
Dot
Class
Graph
::
diskName
()
const
{
{
return
m_diskName
+
"_coll_graph"
;
return
m_diskName
+
"_coll_graph"
;
}
}
void
Dot
GfxUsage
Graph
::
writeGraph
(
QTextStream
&
out
,
void
Dot
Class
Graph
::
writeGraph
(
QTextStream
&
out
,
const
char
*
path
,
const
char
*
path
,
bool
isTBRank
)
bool
isTBRank
)
{
{
...
@@ -919,14 +997,27 @@ void DotGfxUsageGraph::writeGraph(QTextStream &out,
...
@@ -919,14 +997,27 @@ void DotGfxUsageGraph::writeGraph(QTextStream &out,
QDir
thisDir
;
QDir
thisDir
;
QCString
baseName
;
QCString
baseName
;
if
(
m_impl
)
QCString
mapName
;
switch
(
m_graphType
)
{
case
Implementation
:
baseName
.
sprintf
(
"%s_coll_graph"
,
m_diskName
.
data
());
baseName
.
sprintf
(
"%s_coll_graph"
,
m_diskName
.
data
());
else
mapName
=
"coll_map"
;
break
;
case
Interface
:
baseName
.
sprintf
(
"%s_intf_graph"
,
m_diskName
.
data
());
baseName
.
sprintf
(
"%s_intf_graph"
,
m_diskName
.
data
());
mapName
=
"intf_map"
;
break
;
case
Inheritance
:
baseName
.
sprintf
(
"%s_inherit_graph"
,
m_diskName
.
data
());
mapName
=
"inherit_map"
;
break
;
}
// TODO: make sure curDistance>0
// TODO: make sure curDistance>0
findMaximalDotGraph
(
m_startNode
,
m_maxDistance
,
baseName
,
thisDir
,
!
isTBRank
);
findMaximalDotGraph
(
m_startNode
,
m_maxDistance
,
baseName
,
thisDir
,
!
isTBRank
,
m_graphType
==
Inheritance
);
// run dot to create a .gif image
// run dot to create a .gif image
QCString
dotCmd
;
QCString
dotCmd
;
...
@@ -948,12 +1039,12 @@ void DotGfxUsageGraph::writeGraph(QTextStream &out,
...
@@ -948,12 +1039,12 @@ void DotGfxUsageGraph::writeGraph(QTextStream &out,
//printf("dot -Timap %s.dot -o %s.map\n",baseName.data(),baseName.data());
//printf("dot -Timap %s.dot -o %s.map\n",baseName.data(),baseName.data());
out
<<
"<p><center><img src=
\"
"
<<
baseName
<<
".gif
\"
border=
\"
0
\"
usemap=
\"
#"
out
<<
"<p><center><img src=
\"
"
<<
baseName
<<
".gif
\"
border=
\"
0
\"
usemap=
\"
#"
<<
m_startNode
->
m_label
<<
"_
impl_map
\"
></center>"
<<
endl
;
<<
m_startNode
->
m_label
<<
"_
"
<<
mapName
<<
"
\"
></center>"
<<
endl
;
out
<<
"<map name=
\"
"
<<
m_startNode
->
m_label
<<
"_
impl_map
\"
>"
<<
endl
;
out
<<
"<map name=
\"
"
<<
m_startNode
->
m_label
<<
"_
"
<<
mapName
<<
"
\"
>"
<<
endl
;
convertMapFile
(
out
,
baseName
+
".map"
);
convertMapFile
(
out
,
baseName
+
".map"
);
out
<<
"</map><p>"
<<
endl
;
out
<<
"</map><p>"
<<
endl
;
thisDir
.
remove
(
baseName
+
".dot"
);
//
thisDir.remove(baseName+".dot");
thisDir
.
remove
(
baseName
+
".map"
);
thisDir
.
remove
(
baseName
+
".map"
);
QDir
::
setCurrent
(
oldDir
);
QDir
::
setCurrent
(
oldDir
);
...
...
src/dot.h
View file @
367c98ad
...
@@ -41,9 +41,11 @@ struct EdgeInfo
...
@@ -41,9 +41,11 @@ struct EdgeInfo
class
DotNode
class
DotNode
{
{
friend
class
DotGfxHierarchyTable
;
friend
class
DotGfxHierarchyTable
;
friend
class
Dot
GfxUsage
Graph
;
friend
class
Dot
Class
Graph
;
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
Dot
GfxUsage
Graph
class
Dot
Class
Graph
{
{
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
;
...
...
src/doxygen.cpp
View file @
367c98ad
...
@@ -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);
...
...
src/groupdef.cpp
View file @
367c98ad
...
@@ -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());
}
}
}
src/groupdef.h
View file @
367c98ad
...
@@ -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
src/htmlgen.cpp
View file @
367c98ad
...
@@ -784,11 +784,11 @@ void HtmlGenerator::endMemberDoc()
...
@@ -784,11 +784,11 @@ void HtmlGenerator::endMemberDoc()
t
<<
"</table>"
<<
endl
;
t
<<
"</table>"
<<
endl
;
}
}
void
HtmlGenerator
::
start
CollaborationDiagram
()
void
HtmlGenerator
::
start
DotGraph
()
{
{
}
}
void
HtmlGenerator
::
end
CollaborationDiagram
(
DotGfxUsage
Graph
&
g
)
void
HtmlGenerator
::
end
DotGraph
(
DotClass
Graph
&
g
)
{
{
g
.
writeGraph
(
t
,
Config
::
htmlOutputDir
);
g
.
writeGraph
(
t
,
Config
::
htmlOutputDir
);
}
}
...
...
src/htmlgen.h
View file @
367c98ad
...
@@ -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
start
CollaborationDiagram
();
void
start
DotGraph
();
void
end
CollaborationDiagram
(
DotGfxUsage
Graph
&
g
);
void
end
DotGraph
(
DotClass
Graph
&
g
);
void
startInclDepGraph
();
void
startInclDepGraph
();
void
endInclDepGraph
(
DotInclDepGraph
&
g
);
void
endInclDepGraph
(
DotInclDepGraph
&
g
);
void
writeGraphicalHierarchy
(
DotGfxHierarchyTable
&
g
);
void
writeGraphicalHierarchy
(
DotGfxHierarchyTable
&
g
);
...
...
src/index.cpp
View file @
367c98ad
...
@@ -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
();
...
...
src/latexgen.cpp
View file @
367c98ad
...
@@ -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
)
...
...
src/latexgen.h
View file @
367c98ad
...
@@ -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
start
CollaborationDiagram
()
{}
void
start
DotGraph
()
{}
void
end
CollaborationDiagram
(
DotGfxUsage
Graph
&
)
{}
void
end
DotGraph
(
DotClass
Graph
&
)
{}
void
startInclDepGraph
()
{}
void
startInclDepGraph
()
{}
void
endInclDepGraph
(
DotInclDepGraph
&
)
{}
void
endInclDepGraph
(
DotInclDepGraph
&
)
{}
void
writeGraphicalHierarchy
(
DotGfxHierarchyTable
&
)
{}
void
writeGraphicalHierarchy
(
DotGfxHierarchyTable
&
)
{}
...
...
src/mangen.h
View file @
367c98ad
...
@@ -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
start
CollaborationDiagram
()
{}
void
start
DotGraph
()
{}
void
end
CollaborationDiagram
(
DotGfxUsage
Graph
&
)
{}
void
end
DotGraph
(
DotClass
Graph
&
)
{}
void
startInclDepGraph
()
{}
void
startInclDepGraph
()
{}
void
endInclDepGraph
(
DotInclDepGraph
&
)
{}
void
endInclDepGraph
(
DotInclDepGraph
&
)
{}
void
writeGraphicalHierarchy
(
DotGfxHierarchyTable
&
)
{}
void
writeGraphicalHierarchy
(
DotGfxHierarchyTable
&
)
{}
...
...
src/memberdef.cpp
View file @
367c98ad
...
@@ -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,7 +1301,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
...
@@ -1300,7 +1301,7 @@ 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
();
...
...
src/memberlist.cpp
View file @
367c98ad
...
@@ -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
();
}
}
...
...
src/outputgen.h
View file @
367c98ad
...
@@ -26,7 +26,7 @@
...
@@ -26,7 +26,7 @@
#include "index.h"
#include "index.h"
class
ClassDiagram
;
class
ClassDiagram
;
class
Dot
GfxUsage
Graph
;
class
Dot
Class
Graph
;
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
start
CollaborationDiagram
()
=
0
;
virtual
void
start
DotGraph
()
=
0
;
virtual
void
end
CollaborationDiagram
(
DotGfxUsage
Graph
&
g
)
=
0
;
virtual
void
end
DotGraph
(
DotClass
Graph
&
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
;
...
...
src/outputlist.cpp
View file @
367c98ad
...
@@ -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
(
Dot
GfxUsage
Graph
&
a1
,
a1
)
FORALL1
(
Dot
Class
Graph
&
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)
...
...
src/outputlist.h
View file @
367c98ad
...
@@ -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
Dot
GfxUsage
Graph
;
class
Dot
Class
Graph
;
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
start
CollaborationDiagram
()
void
start
DotGraph
()
{
forall
(
&
OutputGenerator
::
start
CollaborationDiagram
);
}
{
forall
(
&
OutputGenerator
::
start
DotGraph
);
}
void
end
CollaborationDiagram
(
DotGfxUsage
Graph
&
g
)
void
end
DotGraph
(
DotClass
Graph
&
g
)
{
forall
(
&
OutputGenerator
::
end
CollaborationDiagram
,
g
);
}
{
forall
(
&
OutputGenerator
::
end
DotGraph
,
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
(
Dot
GfxUsage
Graph
&
);
FORALLPROTO1
(
Dot
Class
Graph
&
);
FORALLPROTO1
(
DotInclDepGraph
&
);
FORALLPROTO1
(
DotInclDepGraph
&
);
FORALLPROTO1
(
DotGfxHierarchyTable
&
);
FORALLPROTO1
(
DotGfxHierarchyTable
&
);
#if defined(HAS_BOOL_TYPE)
#if defined(HAS_BOOL_TYPE)
...
...
src/rtfgen.cpp
View file @
367c98ad
...
@@ -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
::
start
CollaborationDiagram
()
void
RTFGenerator
::
start
DotGraph
()
{
{
}
}
void
RTFGenerator
::
end
CollaborationDiagram
(
DotGfxUsage
Graph
&
g
)
void
RTFGenerator
::
end
DotGraph
(
DotClass
Graph
&
g
)
{
{
newParagraph
();
newParagraph
();
t
<<
"{
\\
comment This would be an image map..."
<<
endl
;
t
<<
"{
\\
comment This would be an image map..."
<<
endl
;
...
...
src/rtfgen.h
View file @
367c98ad
...
@@ -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
start
CollaborationDiagram
();
void
start
DotGraph
();
void
end
CollaborationDiagram
(
DotGfxUsage
Graph
&
);
void
end
DotGraph
(
DotClass
Graph
&
);
void
startInclDepGraph
();
void
startInclDepGraph
();
void
endInclDepGraph
(
DotInclDepGraph
&
);
void
endInclDepGraph
(
DotInclDepGraph
&
);
void
writeGraphicalHierarchy
(
DotGfxHierarchyTable
&
)
{}
void
writeGraphicalHierarchy
(
DotGfxHierarchyTable
&
)
{}
...
...
src/scanner.l
View file @
367c98ad
...
@@ -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+=".";
...
...
src/util.cpp
View file @
367c98ad
...
@@ -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
...
...
src/util.h
View file @
367c98ad
...
@@ -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
);
...
...
tmake/lib/win32-msvc/tmake.conf
View file @
367c98ad
...
@@ -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
= -
O
1
TMAKE_CFLAGS_RELEASE
= -
O
2
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
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment