Commit 19119105 authored by Dimitri van Heesch's avatar Dimitri van Heesch

mods for doxygen-1.0.0

parent ea506045
DOXYGEN Version 0.49-991205
DOXYGEN Version 1.0.0
CONTENTS
--------
......@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
1. Unpack the archive, unless you already have:
gunzip doxygen-0.49-991205.src.tar.gz # uncompress the archive
tar xf doxygen-0.49-991205.src.tar # unpack it
gunzip doxygen-1.0.0.src.tar.gz # uncompress the archive
tar xf doxygen-1.0.0.src.tar # unpack it
2. Run the configure script:
......@@ -135,6 +135,21 @@ The manual should now be here latex/doxygen_manual.ps
KNOWN CONFIGURATION PROBLEMS
QT RELATED PROBLEMS:
- The Qt include files and libraries are not a sub directory of the
directory pointed to by QTDIR on some systems.
(for instance on Red Hat 6.0 includes are in /usr/include/qt and
libs are in /usr/lib)
The solution:
- goto the root of doxygen distribution
- do "mkdir qt"
- do "cd qt"
- do "ln -s your-qt-include-dir-here include",
- do "ln -s your-qt-lib-dir-here lib",
- do "export QTDIR=$PWD" (or "setenv QTDIR $PWD if you have a csh)
Now install doxygen as described above.
- Qt-2.01 contains a bug that makes some special characters appear as
question marks (?) in the HTML output.
......@@ -215,6 +230,9 @@ HP-UX / DIGITAL UNIX PROBLEMS:
#if defined (MSDOS) && !defined (__TURBOC__)
------------------------------------------------------------------------------
The generated scanner.cpp that comes with doxygen is build with this
patch applied.
GCC 2.7.2.X PROBLEMS
Old versions of the GNU compiler have problems with constant strings
......@@ -234,4 +252,4 @@ The latest version of doxygen can be obtained at
Enjoy,
Dimitri van Heesch (05 December 1999)
Dimitri van Heesch (27 December 1999)
DOXYGEN Version 0.49-991205
DOXYGEN Version 1.0.0
Please read INSTALL for compilation instructions.
......@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
Enjoy,
Dimitri van Heesch (05 December 1999)
Dimitri van Heesch (27 December 1999)
......@@ -61,7 +61,7 @@
\par Note 1:
The patterns above should not contain spaces, tabs or newlines.
\par Note 2:
For JavaDoc compatibility a \c # may be used instead of a \c :: in
For JavaDoc compatibility a \# may be used instead of a :: in
the patterns above.
For non overloaded members the argument list may be omitted.
......
This diff is collapsed.
......@@ -303,7 +303,7 @@ followed by the descriptions of the tags grouped by category.
\anchor cfg_javadoc_autobrief
<dt>\c JAVADOC_AUTOBRIEF <dd>
\addindex JAVADOC_AUTOBRIEF
If the \c JAVADOC_NO_AUTOBRIEF is set to \c YES (the default) then Doxygen
If the \c JAVADOC_AUTOBRIEF is set to \c YES (the default) then Doxygen
will interpret the first line (until the first dot) of a JavaDoc-style
comment as the brief description. If set to NO, the Javadoc-style will
behave just like the Qt-style comments.
......@@ -444,10 +444,12 @@ followed by the descriptions of the tags grouped by category.
The following commands have a special meaning inside the header:
<code>\$title</code>, <code>\$datetime</code>, <code>\$date</code>,
<code>\$doxygenversion</code>.
<code>\$doxygenversion</code>, <code>\$projectname</code>,
<code>\$projectnumber</code>.
Doxygen will replace them by respectively
the title of the page, the current date and time, only the current date,
or the version number of doxygen.
the version number of doxygen, the project name (see PROJECT_NAME), or the
project number (see PROJECT_NUMBER).
\anchor cfg_html_footer
<dt>\c HTML_FOOTER <dd>
......@@ -461,10 +463,15 @@ followed by the descriptions of the tags grouped by category.
\endverbatim
If the tag is left blank doxygen will generate a standard footer.
The following commands have a special meaning inside the footer:
<code>\$title</code>, <code>\$datetime</code>, <code>\$date</code>.
The following commands have a special meaning inside the header:
<code>\$title</code>, <code>\$datetime</code>, <code>\$date</code>,
<code>\$doxygenversion</code>, <code>\$projectname</code>,
<code>\$projectnumber</code>.
Doxygen will replace them by respectively
the title of the page, the current date and time, or only the current date.
the title of the page, the current date and time, only the current date,
the version number of doxygen, the project name (see PROJECT_NAME), or the
project number (see PROJECT_NUMBER).
\anchor cfg_html_stylesheet
<dt>\c HTML_STYLESHEET <dd>
......@@ -477,14 +484,19 @@ followed by the descriptions of the tags grouped by category.
\verbatim
H1 { text-align: center }
A.qindex {}
A.qindexRef {}
A.el { text-decoration: none; font-weight: bold }
A.elRef { font-weight: bold }
A.code { text-decoration: none; font-weight: normal; color: #4444ee }
A.codeRef { font-weight: normal; color: #4444ee }
A.gl:link { color: #ffffff }
A.gl:visited { color: #ffffff }
A.gl { text-decoration: none; font-weight: bold; background-color: #ff8080 }
DL.el { margin-left: -1cm }
DIV.fragment { width: 100%; border: none; background-color: #eeeeee }
DIV.in { margin-left: 16 }
DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 }
A.gl:link { color: #ffffff }
A.gl:visited { color: #ffffff }
A.gl { text-decoration: none; font-weight: bold; background-color: #ff8080 }
TD.md { background-color: #f2f2ff }
\endverbatim
......@@ -622,6 +634,15 @@ EXTRA_PACKAGES = times
\par Note:
Only use a user defined header if you know what you are doing!
The following commands have a special meaning inside the header:
<code>\$title</code>, <code>\$datetime</code>, <code>\$date</code>,
<code>\$doxygenversion</code>, <code>\$projectname</code>,
<code>\$projectnumber</code>.
Doxygen will replace them by respectively
the title of the page, the current date and time, only the current date,
the version number of doxygen, the project name (see PROJECT_NAME), or the
project number (see PROJECT_NUMBER).
</dl>
\subsection man_output Man page related options
......@@ -842,7 +863,7 @@ DOC_ABSPATH = /home/dimitri/.html/qdbttabular
BIN_ABSPATH = /home/dimitri/bin
\endverbatim
To regenerate the Qt documentation from the sources, you could use the
To regenerate the Qt-1.44 documentation from the sources, you could use the
following config file:
\verbatim
PROJECT_NAME = Qt
......
......@@ -22,6 +22,15 @@
<li>Requires very little overhead from the writer of the documentation.
Plain text will do, but for more fancy or structured output HTML tags
and/or some of doxygen's special commands can be used.
<li>Supports C++, (Corba or Microsoft) IDL and C sources.
<li>Supports documentation of files, namespaces, classes, structs, unions,
templates, variables, functions, typedefs, enums and defines.
<li>JavaDoc (1.1), Qt-Doc, and KDOC compatible.
<li>Automatically generates class diagrams in HTML (as clickable
image maps) and \f$\mbox{\LaTeX}\f$ (as encapsulated postscript images).
<li>Allows you to put documentation in the header file (before the
declaration of an entity), source file (before the definition of an entity)
or in a separate file.
<li>Outputs documentation in on-line format (HTML and UNIX man page) and
off-line format (\f$\mbox{\LaTeX}\f$) simultaniously
(any one can be disabled if desired). Both formats are optimized for
......@@ -29,23 +38,18 @@
Furthermore, compressed HTML can be generated from HTML output using
Microsoft's HTML help workshop (Windows only) and PDF can be generated
from the \f$\mbox{\LaTeX}\f$ output.
<li>Allows documentation of files, namespaces, classes, structs, unions,
templates, variables, functions, typedefs, enums and defines.
<li>Includes a full C preprocessor to allow proper parsing of conditional
code fragments and to allow expansion of all or part of the define macros.
code fragments and to allow expansion of all or part of macros definitions.
<li>Automatically detects public, protected and private sections, as well as
the Qt specific signal and slots sections. Extraction of private class
members is optional.
<li>Automatically generates of class diagrams in HTML (as clickable
image maps) and \f$\mbox{\LaTeX}\f$ (as encapsulated postscript images).
<li>JavaDoc (1.1) and Qt-Doc compatible.
<li>Automatically generates references to documented classes, files, namespaces
and members. Documentation of global functions, globals variables,
typedefs, defines and enumerations is also supported.
<li>References to base/super classes and inherited/overridden members are
generated automatically.
<li>Includes a fast, rank based search engine to search for strings or words
in the class and member documentation.
<li>Automatic generation of references to documented classes, files and
members. Documentation of global functions, globals variables,
typedefs, defines and enumerations is also supported.
<li>Documentation may be placed either at the declaration or at the definition
of a member function or class. Most documentation systems (such as Javadoc) only
support the former, others (such as Qt) only the latter.
......@@ -61,6 +65,7 @@
looking into the implementation details.
<li>Allows automatic cross-referencing of (documented) entities with their
definition in the source code.
<li>Allows inclusion of function/member/class definitions in the documentation.
<li>All options are read from an easy to edit and documented
configuration file.
<li>Documentation and search engine can be transferred to another
......
......@@ -16,18 +16,21 @@
/*! \page history Doxygen History
<h3>Features scheduled for version 1.0</h3>
<h3>Version 1.0.0</h3>
<h4>New features:</h4>
<ul>
<li>Include LaTeX style formulas in LaTeX and HTML output (in HTML as a gif).
<li>Multi-lingual support: currently supported languages are: English,
Dutch, French, German, Italian, Swedish, Czech, Japanese.
<li>Generation of class diagrams (clickable image maps in HTML, eps images
in postscript).
<li>Output generator for the man page format.
<li>Proper support for template classes, members, functions and specializations.
<li>Proper support for namespaces.
<li>Reintroduction of the multi-column class list (and file list) to quickly
select a class or file
<li>Support for templates and namespaces.
<li>Internationalization support. Currently supported languages are:
English, Czech, German, Spanish, Finnish, French, Italian, Japanse,
Dutch, and Swedish.
<li>Automatic generation of inheritance diagrams for sub & super classes.
<li>Support for man page, compressed HTML help, and hyperlinked PDF output.
<li>Cross-referencing documentation with source code and source inlining.
<li>LaTeX formulas can be included in the documentation.
<li>Support for parsing Corba & Microsoft IDL.
<li>Images can be included in the documentation.
<li>Improved parsing & preprocessing.
</ul>
<h3>Version 0.4</h3>
......
......@@ -41,15 +41,15 @@ for more details.
All output generated by Doxygen is not covered by this license.
<h2>Introduction</h2>
Doxygen is a documentation system for C and C++. It can generate an on-line
class browser (in HTML) and/or an off-line reference manual
Doxygen is a documentation system for C, C++ and IDL. It can generate an
on-line class browser (in HTML) and/or an off-line reference manual
(in \f$\mbox{\LaTeX}\f$) from a set
of documented source files. There is also support for generating
man pages and for converting the generated output into
Postscript, hyperlinked PDF or compressed HTML.
The documentation is extracted directly from the
sources. Doxygen is developed on a <a href="http://www.linux.org">Linux</a>
platform, but it runs on most other UNIX flavors as well.
sources. Doxygen is developed on <a href="http://www.linux.org">Linux</a>,
but it runs on most other UNIX flavors as well.
An executable for Windows 9x/NT is also available.
Doxygen can also be configured to extract the code-structure from undocumented
......@@ -127,15 +127,19 @@ of possible and/or requested enhancements.
Thanks go to:
<ul>
\addindex Doc++
<li>Malte Z&ouml;ckler and Roland Wunderling, authors of Doc++.
The first version of Doxygen was based on an old version of Doc++.
Although I have rewritten practically all code since then, Doc++ has still
<li>Malte Z&ouml;ckler and Roland Wunderling, authors of DOC++.
The first version of Doxygen borrowed some code of an old version of DOC++.
Although I have rewritten practically all code since then, DOC++ has still
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 :-)
<li>My brother <a href="http://www.stack.nl/~fidget/index.html">Frank</a>
for rendering the logos.
<li>Harm van der Heijden for adding HTML help support.
<li>Jens Breitenstein, Christophe Bordeaux, Samuel Hägglund, Xet Erixon,
Vlastimil Havran, Ahmed Also Faisal, Alessandro Falappa, Kenji Nagamatsu,
Francisco Oltra Thennet, Olli Korhonen for providing translations into
various languages.
<li>
Arnt Gulbrandsen,
Adam P. Jenkins,
......@@ -201,6 +205,10 @@ Jacques Tremblay,
John Sturton,
Moshe Kruger,
David Wong,
Peter Garner,
Fred Labrosse,
Frank Schimmel,
Reinhard Nissl
and many others for suggestions, patches and bug reports.
</ul>
*/
......
......@@ -57,7 +57,7 @@ To override the auto detected platform you can specify
\verbatim
configure --platform platform-type
\endverbatim
See the \c PLATFORMS file for a list of possible platforms.
See the file \c PLATFORMS for a list of possible platforms.
For more configuration options use <code>configure --help</code>
To compile and link the sources enter
......@@ -102,6 +102,7 @@ Doxygen was developed and tested under Linux using the following tools:
<li>Netscape 4.61
<li>Troll Tech's tmake version 1.3 (included in the distribution)
<li>teTeX version 0.9
<li>CVS 1.10.7
</ul>
\htmlonly
......
......@@ -99,7 +99,7 @@ the output directory.
As the names suggest the \c html directory contains the
generated documentation in HTML format and the \c latex directory contains the
generated documentation in \f$\mbox{\LaTeX}\f$ format. Man pages are put
in a man3 directory inside the \c man directory.
in a \c man3 directory inside the \c man directory.
The default output directory is the directory in which \c doxygen
is started. The directory to which the output is written can be changed
......@@ -123,11 +123,11 @@ By typing \c make in the \c latex directory the dvi file \c refman.dvi
will be generated (provided that you have a make tool called
<code>make</code> ofcourse). This file can then be viewed using \c xdvi or
converted into a postscript file \c refman.ps by typing <code>make ps</code>
(this requires \c dvips ). 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
ghostscript to convert postscript into something your printer understands.
Conversion to PDF is also possible; just type
<code>make pdf</code>.
<code>make pdf</code> (this required <code>ps2pdf</code>).
To get the best results for PDF output you should set the
\c PDF_HYPERLINKS tag to \c YES.
......@@ -208,6 +208,13 @@ The following types of special documentation blocks are supported by doxygen:
\endverbatim
</ul>
Doxygen only allows one brief and one detailed description. If there is
one brief description before a declaration and one before a
definition, only the one before the \e declaration will be used. If
the same situation occurs for a detail description,
the one before the \e definition is preferred and the one before the
declaration will be ignored.
Here is an example of a documented piece of C++ code using the Qt style:
\verbinclude qtstyle.cpp
\htmlonly
......@@ -551,9 +558,9 @@ after the \c INPUT_FILTER tag.
\subsection moreinfo More information
\addindex QdbtTabular
For a more elaborate example see <a href="http://www.stack.nl/~dimitri/qdbttabular/html/index.html">
For a more elaborate example see <a href="http://www.stack.nl/~dimitri/qdbttabular/doc/html/index.html">
the documentation of QdbtTabular</a> \latexonly
({\tt http://www.stack.nl/$\sim$dimitri/qdbttabular/html})\endlatexonly.
({\tt http://www.stack.nl/$\sim$dimitri/qdbttabular/doc/html})\endlatexonly.
\htmlonly
I hope that was clear. If not, please let me know, so I can improve this document. If you have problems
take a look at the <a href="faq.html">faq</a> and the <a href="trouble.html">troubleshooting</a> sections.
......
......@@ -262,7 +262,14 @@ void ClassDef::writeDocumentation(OutputList &ol)
if (incFile)
{
QCString nm=incName.copy();
if (incName.isEmpty()) nm=incFile->name();
if (incName.isEmpty())
{
nm=incFile->name();
if (Config::fullPathNameFlag)
{
nm.prepend(stripFromPath(incFile->getPath().copy()));
}
}
ol.startTypewriter();
ol.docify("#include <");
ol.disable(OutputGenerator::Html);
......@@ -837,7 +844,14 @@ void ClassDef::writeIncludeFile(OutputList &ol)
startFile(ol,fileName+"-include",name()+" Include File");
startTitle(ol,0);
QCString n=incName.copy();
if (incName.isEmpty()) n=incFile->name();
if (incName.isEmpty())
{
n=incFile->name();
if (Config::fullPathNameFlag)
{
n.prepend(stripFromPath(incFile->getPath().copy()));
}
}
parseText(ol,n);
endTitle(ol,0,0);
parseText(ol,theTranslator->trVerbatimText(incFile->name()));
......
......@@ -3437,7 +3437,7 @@ void writeTemplateConfig(QFile *f,bool sl)
t << "# standard header. Notice: only use this tag if you know what you are doing!\n";
t << "\n";
}
t << "LATEX_HEADER =\n";
t << "LATEX_HEADER =\n";
if (!sl)
{
t << "\n";
......
......@@ -965,7 +965,7 @@ void writeTemplateConfig(QFile *f,bool sl)
t << "# standard header. Notice: only use this tag if you know what you are doing!\n";
t << "\n";
}
t << "LATEX_HEADER =\n";
t << "LATEX_HEADER =\n";
if (!sl)
{
t << "\n";
......
......@@ -304,39 +304,39 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
*yy_cp = '\0'; \
yy_c_buf_p = yy_cp;
#define YY_NUM_RULES 32
#define YY_END_OF_BUFFER 33
static yyconst short int yy_acclist[132] =
#define YY_NUM_RULES 33
#define YY_END_OF_BUFFER 34
static yyconst short int yy_acclist[133] =
{ 0,
2, 2, 33, 31, 32, 32, 1, 31, 32, 25,
31, 32, 20, 25, 31, 32, 25, 31, 32, 27,
31, 32, 13, 27, 31, 32, 14, 27, 31, 32,
26, 27, 31, 32, 15, 27, 31, 32, 16, 27,
31, 32, 18, 27, 31, 32, 17, 27, 31, 32,
24, 31, 32, 2, 24, 31, 32, 12, 24, 31,
32, 22, 24, 31, 32, 12, 24, 31, 32, 21,
24, 31, 32, 23, 24, 31, 32, 24, 31, 32,
7, 25, 31, 32, 25, 31, 32, 12, 25, 31,
32, 22, 25, 31, 32, 11, 24, 31, 32, 9,
23, 24, 31, 32, 31, 32, 31, 32, 31, 32,
19, 26, 2,16392, 23, 3, 10, 9, 23, 30,
16392, 8200, 6, 6, 8200, 5, 4, 5, 4, 28,
29
2, 2, 34, 32, 33, 31, 33, 1, 32, 33,
25, 32, 33, 20, 25, 32, 33, 25, 32, 33,
27, 32, 33, 13, 27, 32, 33, 14, 27, 32,
33, 26, 27, 32, 33, 15, 27, 32, 33, 16,
27, 32, 33, 18, 27, 32, 33, 17, 27, 32,
33, 24, 32, 33, 2, 24, 32, 33, 12, 24,
32, 33, 22, 24, 32, 33, 12, 24, 32, 33,
21, 24, 32, 33, 23, 24, 32, 33, 24, 32,
33, 7, 25, 32, 33, 25, 32, 33, 12, 25,
32, 33, 22, 25, 32, 33, 11, 24, 32, 33,
9, 23, 24, 32, 33, 32, 33, 32, 33, 32,
33, 19, 26, 2,16392, 23, 3, 10, 9, 23,
30,16392, 8200, 6, 6, 8200, 5, 4, 5, 4,
28, 29
} ;
static yyconst short int yy_accept[100] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 2, 3, 3, 3, 3,
3, 3, 3, 4, 6, 7, 10, 13, 17, 20,
23, 27, 31, 35, 39, 43, 47, 51, 54, 58,
62, 66, 70, 74, 78, 81, 85, 88, 92, 96,
100, 105, 107, 109, 111, 112, 113, 114, 114, 114,
115, 116, 116, 117, 117, 117, 117, 118, 120, 120,
121, 121, 121, 121, 121, 121, 122, 123, 124, 124,
125, 125, 125, 125, 125, 126, 127, 129, 129, 129,
129, 130, 130, 131, 131, 131, 131, 132, 132
3, 3, 3, 4, 6, 8, 11, 14, 18, 21,
24, 28, 32, 36, 40, 44, 48, 52, 55, 59,
63, 67, 71, 75, 79, 82, 86, 89, 93, 97,
101, 106, 108, 110, 112, 113, 114, 115, 115, 115,
116, 117, 117, 118, 118, 118, 118, 119, 121, 121,
122, 122, 122, 122, 122, 122, 123, 124, 125, 125,
126, 126, 126, 126, 126, 127, 128, 130, 130, 130,
130, 131, 131, 132, 132, 132, 132, 133, 133
} ;
......@@ -1175,7 +1175,12 @@ YY_RULE_SETUP
YY_BREAK
case 32:
YY_RULE_SETUP
#line 282 "defargs.l"
#line 281 "defargs.l"
YY_BREAK
case 33:
YY_RULE_SETUP
#line 283 "defargs.l"
ECHO;
YY_BREAK
case YY_STATE_EOF(INITIAL):
......@@ -2067,7 +2072,7 @@ int main()
return 0;
}
#endif
#line 282 "defargs.l"
#line 283 "defargs.l"
/* ----------------------------------------------------------------------------
......
......@@ -277,6 +277,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
<FuncQual>"="{B}*"0" {
argList->pureSpecifier=TRUE;
}
<*>\n
<*>.
%%
......
......@@ -31,6 +31,7 @@
#include "util.h"
#include "latexgen.h"
#include "htmlgen.h"
#include "doxygen.h"
//-----------------------------------------------------------------------------
......@@ -150,9 +151,21 @@ static void writeMapArea(QTextStream &t,ClassDef *cd,int x,int y,int w,int h)
{
if (cd->isLinkable())
{
QCString *dest;
QCString ref=cd->getReference();
t << "<area ";
if (cd->getReference()) t << "doxygen=\"" << cd->getReference() << ":\" ";
t << "href=\"" << cd->getOutputFileBase() << ".html\" ";
if (!ref.isEmpty())
{
t << "doxygen=\"" << ref << ":";
if ((dest=tagDestinationDict[ref])) t << *dest << "/";
t << "\" ";
}
t << "href=\"";
if (!ref.isEmpty())
{
if ((dest=tagDestinationDict[ref])) t << *dest << "/";
}
t << cd->getOutputFileBase() << ".html\" ";
t << "ALT=\"" << cd->name();
t << "\" shape=\"rect\" coords=\"" << x << "," << y << ",";
t << (x+w) << "," << (y+h) << "\">" << endl;
......@@ -217,8 +230,10 @@ void DiagramItem::addChild(DiagramItem *di)
void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
Protection prot,Specifier virt,const char *ts)
{
if (cd->visited) return; // error in the class diagram
DiagramItem *di=new DiagramItem(parent, diagram->at(level)->count(),
cd,prot,virt,ts);
cd->visited=TRUE;
if (parent) parent->addChild(di);
di->move(count()*gridWidth,level*gridHeight);
append(di);
......@@ -229,7 +244,7 @@ void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
while (bcd)
{
ClassDef *ccd=bcd->classDef;
if (ccd && ccd->isVisibleInHierarchy()) count++;
if (ccd && ccd->isVisibleInHierarchy() && !ccd->visited) count++;
bcd=bcl->next();
}
if (count>0 && (prot!=Private || !doBases))
......@@ -249,7 +264,7 @@ void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
while (bcd)
{
ClassDef *ccd=bcd->classDef;
if (ccd && ccd->isVisibleInHierarchy())
if (ccd && ccd->isVisibleInHierarchy() && !ccd->visited)
{
row->insertClass(di,ccd,doBases,bcd->prot,
doBases?bcd->virt:Normal,
......@@ -883,10 +898,23 @@ void TreeDiagram::drawConnectors(QTextStream &t,Image *image,
}
}
void clearVisitFlags()
{
ClassListIterator cli(classList);
ClassDef *cd;
for (;(cd=cli.current());++cli)
{
cd->visited=FALSE;
}
}
ClassDiagram::ClassDiagram(ClassDef *root)
{
clearVisitFlags();
base = new TreeDiagram(root,TRUE);
base->computeLayout();
clearVisitFlags();
super = new TreeDiagram(root,FALSE);
super->computeLayout();
DiagramItem *baseItem = base->first()->first();
......
......@@ -265,7 +265,8 @@ void buildFileList(Entry *root)
void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
{
if (
(!root->doc.isEmpty() || !root->brief.isEmpty() ||
(!root->doc.stripWhiteSpace().isEmpty() ||
!root->brief.stripWhiteSpace().isEmpty() ||
Config::extractAllFlag
) && root->protection!=Private
)
......@@ -313,8 +314,11 @@ void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
// set include supplied name
cd->setIncludeName(root->includeName);
if (cd->name().find('@')==-1)
{
fd->setIncludeName(cd->getOutputFileBase()+"-include");
if (includeDict[fd->absFilePath()]==0) // include not inserted earlier
}
if (!fd->absFilePath().isEmpty() &&
includeDict[fd->absFilePath()]==0) // include not inserted earlier
{
includeFiles.inSort(fd);
includeDict.insert(fd->absFilePath(),fd);
......@@ -1551,84 +1555,88 @@ bool findBaseClassRelation(Entry *root,ClassDef *cd,const char *scopePrefix,
{
QCString baseClassName=removeRedundantWhiteSpace(scopePrefix+bi->name);
ClassDef *baseClass=getClass(baseClassName);
//printf("baseClass %s of %s found (%s and %s)\n",
// baseClassName.data(),
// root->name.data(),
// (bi->prot==Private)?"private":((bi->prot==Protected)?"protected":"public"),
// (bi->virt==Normal)?"normal":"virtual"
// );
int i;
QCString templSpec;
if (baseClass==0 && (i=baseClassName.find('<'))!=-1)
// base class has template specifiers
if (baseClassName!=root->name) // check for base class with the same name,
// look in the outer scope for a match
{
// TODO: here we should try to find the correct template specialization
// but for now, we only look for the unspecializated base class.
templSpec=baseClassName.right(baseClassName.length()-i);
baseClassName=baseClassName.left(i);
baseClass=getClass(baseClassName);
//printf("baseClass=%s templSpec=%s\n",
// baseClassName.data(),templSpec.data());
}
//printf("baseClass %s of %s found (%s and %s)\n",
// baseClassName.data(),
// root->name.data(),
// (bi->prot==Private)?"private":((bi->prot==Protected)?"protected":"public"),
// (bi->virt==Normal)?"normal":"virtual"
// );
int i;
QCString templSpec;
if (baseClass==0 && (i=baseClassName.find('<'))!=-1)
// base class has template specifiers
{
// TODO: here we should try to find the correct template specialization
// but for now, we only look for the unspecializated base class.
templSpec=baseClassName.right(baseClassName.length()-i);
baseClassName=baseClassName.left(i);
baseClass=getClass(baseClassName);
//printf("baseClass=%p baseClass=%s templSpec=%s\n",
// baseClass,baseClassName.data(),templSpec.data());
}
bool found=baseClass!=0;
NamespaceDef *nd=cd->getNamespace();
if (!found)
{
FileDef *fd=cd->getFileDef();
if (fd)
bool found=baseClass!=0;
NamespaceDef *nd=cd->getNamespace();
if (!found)
{
// look for the using statement in this file in which the
// class was found
NamespaceList *nl = fd->getUsedNamespaces();
if (nl) // try to prepend any of the using namespace scopes.
FileDef *fd=cd->getFileDef();
if (fd)
{
NamespaceListIterator nli(*nl);
NamespaceDef *nd;
for (nli.toFirst() ; (nd=nli.current()) && !found ; ++nli)
// look for the using statement in this file in which the
// class was found
NamespaceList *nl = fd->getUsedNamespaces();
if (nl) // try to prepend any of the using namespace scopes.
{
found = (baseClass=getClass(nd->name()+"::"+baseClassName))!=0;
NamespaceListIterator nli(*nl);
NamespaceDef *nd;
for (nli.toFirst() ; (nd=nli.current()) && !found ; ++nli)
{
found = (baseClass=getClass(nd->name()+"::"+baseClassName))!=0;
}
}
}
}
if (!found && nd) // class is inside a namespace
{
NamespaceList *nl = nd->getUsedNamespaces();
found = (baseClass=getClass(nd->name()+"::"+baseClassName))!=0;
if (nl) // try to prepend any of the using namespace scopes.
if (!found && nd) // class is inside a namespace
{
NamespaceListIterator nli(*nl);
NamespaceDef *nd;
for (nli.toFirst() ; (nd=nli.current()) && !found ; ++nli)
NamespaceList *nl = nd->getUsedNamespaces();
found = (baseClass=getClass(nd->name()+"::"+baseClassName))!=0;
if (nl) // try to prepend any of the using namespace scopes.
{
found = (baseClass=getClass(nd->name()+"::"+baseClassName))!=0;
NamespaceListIterator nli(*nl);
NamespaceDef *nd;
for (nli.toFirst() ; (nd=nli.current()) && !found ; ++nli)
{
found = (baseClass=getClass(nd->name()+"::"+baseClassName))!=0;
}
}
}
}
}
if (found)
{
// add base class to this class
cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec);
// add this class as super class to the base class
baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec);
foundAny=TRUE;
}
else if (insertUndocumented)
{
//printf(">>> Undocumented base class = %s\n",bi->name.data());
baseClass=new ClassDef(baseClassName,ClassDef::Class);
// add base class to this class
cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec);
// add this class as super class to the base class
baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec);
// the undocumented base was found in this file
baseClass->insertUsedFile(root->fileName);
// add class to the list
classList.inSort(baseClass);
//printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data());
//classDict.insert(resolveDefines(bi->name),baseClass);
classDict.insert(bi->name,baseClass);
if (found)
{
// add base class to this class
cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec);
// add this class as super class to the base class
baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec);
foundAny=TRUE;
}
else if (insertUndocumented)
{
//printf(">>> Undocumented base class = %s\n",bi->name.data());
baseClass=new ClassDef(baseClassName,ClassDef::Class);
// add base class to this class
cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec);
// add this class as super class to the base class
baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec);
// the undocumented base was found in this file
baseClass->insertUsedFile(root->fileName);
// add class to the list
classList.inSort(baseClass);
//printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data());
//classDict.insert(resolveDefines(bi->name),baseClass);
classDict.insert(baseClassName,baseClass);
}
}
bi=baseList->next();
}
......@@ -1660,10 +1668,9 @@ void computeClassRelations(Entry *root)
if ((cd=getClass(bName)))
{
//printf("Class %s %d\n",cd->name().data(),root->extends->count());
if (!cd->visited)
if (!cd->visited) // check integrity of the tree
{
cd->visited=TRUE; // mark class as used (in case the are multiple classes
// with the same name!)
cd->visited=TRUE; // mark class as used
if (root->extends->count()>0) // there are base classes
{
Entry *p=root->parent;
......@@ -1957,7 +1964,7 @@ static bool findUnrelatedFunction(Entry *root,
}
else // got docs for an undefined member!
{
warn("Warning: documented function `%s' in file %s at line %d "
warn("Warning: documented function `%s'\nin file %s at line %d "
"was not defined \n",decl,
root->fileName.data(),root->startLine);
}
......@@ -4145,7 +4152,9 @@ void readTagFile(const char *tl)
{
fileName = tagLine.left(eqPos).stripWhiteSpace();
destName = tagLine.right(tagLine.length()-eqPos-1).stripWhiteSpace();
tagDestinationDict.insert(fileName,new QCString(destName));
QFileInfo fi(fileName);
tagDestinationDict.insert(fi.fileName(),new QCString(destName));
//printf("insert tagDestination %s->%s\n",fileName.data(),destName.data());
}
else
{
......@@ -4155,9 +4164,9 @@ void readTagFile(const char *tl)
QFileInfo fi(fileName);
if (!fi.exists() || !fi.isFile())
{
err("Error: Tag file `%s' does not exist or is not a file\n",
warn("Warning: Tag file `%s' does not exist or is not a file. Skipping it...\n",
fileName.data());
exit(1);
return;
}
if (!destName.isEmpty())
......
......@@ -45,6 +45,7 @@ class ExampleDict : public QDict<Example>
{
public:
ExampleDict(int size=17) : QDict<Example>(size) {}
~ExampleDict() {}
};
#endif
......@@ -78,11 +78,17 @@ void FileDef::writeDocumentation(OutputList &ol)
{
//funcList->countDecMembers();
QCString fn = name();
if (Config::fullPathNameFlag)
{
fn.prepend(stripFromPath(getPath().copy()));
}
QCString pageTitle=name()+" File Reference";
startFile(ol,diskname,pageTitle);
startTitle(ol,getOutputFileBase());
parseText(ol,theTranslator->trFileReference(name()));
endTitle(ol,getOutputFileBase(),name());
parseText(ol,theTranslator->trFileReference(fn));
endTitle(ol,getOutputFileBase(),fn);
//ol.newParagraph();
if (Config::genTagFile.length()>0) tagFile << "&" << name() << ":\n";
......@@ -322,10 +328,15 @@ void FileDef::writeDocumentation(OutputList &ol)
/*! Write a source listing of this file to the output */
void FileDef::writeSource(OutputList &ol)
{
QCString fn=name();
if (Config::fullPathNameFlag)
{
fn.prepend(stripFromPath(getPath().copy()));
}
ol.disableAllBut(OutputGenerator::Html);
startFile(ol,sourceName(),name()+" Source File");
startFile(ol,sourceName(),fn+" Source File");
startTitle(ol,0);
parseText(ol,name());
parseText(ol,fn);
endTitle(ol,0,0);
//parseText(ol,theTranslator->trVerbatimText(incFile->name()));
//ol.writeRuler();
......
......@@ -90,7 +90,11 @@ void FormulaList::generateBitmaps(const char *path)
{
//printf("Running latex...\n");
//system("latex _formulas.tex </dev/null >/dev/null");
system("latex _formulas.tex");
if (system("latex _formulas.tex")!=0)
{
err("Problems running latex. Check your installation or look at _formulas.tex!\n");
return;
}
//printf("Running dvips...\n");
QListIterator<int> pli(pagesToGenerate);
int *pagePtr;
......@@ -106,7 +110,11 @@ void FormulaList::generateBitmaps(const char *path)
// encapsulated postscript.
sprintf(dviCmd,"dvips -q -D 600 -E -n 1 -p %d -o %s.eps _formulas.dvi",
pageIndex,formBase.data());
system(dviCmd);
if (system(dviCmd)!=0)
{
err("Problems running dvips. Check your installation!\n");
return;
}
// now we read the generated postscript file to extract the bounding box
QFileInfo fi(formBase+".eps");
if (fi.exists())
......@@ -164,7 +172,11 @@ void FormulaList::generateBitmaps(const char *path)
);
#endif
//printf("Running ghostscript...\n");
system(gsCmd);
if (system(gsCmd)!=0)
{
err("Problem running ghostscript. Check your installation!\n");
return;
}
f.setName(formBase+".pnm");
uint imageX=0,imageY=0;
// we read the generated image again, to obtain the pixel data.
......
......@@ -79,25 +79,19 @@ void HtmlGenerator::startFile(const char *name,const char *title,bool external)
else
t << "href=\"";
if (Config::htmlStyleSheet.isEmpty())
{
t << "doxygen.css";
}
else
{
t << Config::htmlStyleSheet;
}
t << "\" rel=\"stylesheet\" type=\"text/css\">\n"
"</head><body bgcolor=\"#ffffff\">\n";
}
else
{
t << substitute(
substitute(
substitute(
substitute(header,"$title",lastTitle),
"$datetime",dateToString(TRUE)
),
"$date",dateToString(FALSE)
),
"$doxygenversion",versionString
);
t << substituteKeywords(header,lastTitle);
}
t << "<!-- Generated by Doxygen " << versionString << " on "
<< dateToString(TRUE) << " -->" << endl;
......@@ -138,16 +132,7 @@ void HtmlGenerator::writeFooter(int part,bool external)
if (footer.length()==0)
t << "<hr><address><small>";
else
t << substitute(
substitute(
substitute(
substitute(footer,"$title",lastTitle),
"$datetime",dateToString(TRUE)
),
"$date",dateToString(FALSE)
),
"$doxygenversion",versionString
);
t << substituteKeywords(footer,lastTitle);
break;
case 1:
if (footer.length()==0)
......@@ -195,24 +180,33 @@ void HtmlGenerator::writeStyleInfo(int part)
{
if (part==0)
{
startPlainFile("doxygen.css");
t << "H1 { text-align: center }" << endl;
t << "A.qindex {}" << endl;
t << "A.qindexRef {}" << endl;
t << "A.el { text-decoration: none; font-weight: bold }" << endl;
t << "A.elRef { font-weight: bold }" << endl;
t << "A.code { text-decoration: none; font-weight: normal; color: #4444ee }" << endl;
t << "A.codeRef { font-weight: normal; color: #4444ee }" << endl;
t << "A.gl:link { color: #ffffff }" << endl;
t << "A.gl:visited { color: #ffffff }" << endl;
t << "A.gl { text-decoration: none; font-weight: bold; background-color: " << GROUP_COLOR << " }" << endl;
t << "DL.el { margin-left: -1cm }" << endl;
t << "DIV.fragment { width: 100%; border: none; background-color: #eeeeee }" << endl;
t << "DIV.in { margin-left: 16 }" << endl;
t << "DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 }" << endl;
t << "TD.md { background-color: #f2f2ff }" << endl;
t << endl;
endPlainFile();
if (Config::htmlStyleSheet.isEmpty()) // write default style sheet
{
startPlainFile("doxygen.css");
t << "H1 { text-align: center }" << endl;
t << "A.qindex {}" << endl;
t << "A.qindexRef {}" << endl;
t << "A.el { text-decoration: none; font-weight: bold }" << endl;
t << "A.elRef { font-weight: bold }" << endl;
t << "A.code { text-decoration: none; font-weight: normal; color: #4444ee }" << endl;
t << "A.codeRef { font-weight: normal; color: #4444ee }" << endl;
t << "A.gl:link { color: #ffffff }" << endl;
t << "A.gl:visited { color: #ffffff }" << endl;
t << "A.gl { text-decoration: none; font-weight: bold; background-color: " << GROUP_COLOR << " }" << endl;
t << "DL.el { margin-left: -1cm }" << endl;
t << "DIV.fragment { width: 100%; border: none; background-color: #eeeeee }" << endl;
t << "DIV.in { margin-left: 16 }" << endl;
t << "DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 }" << endl;
t << "TD.md { background-color: #f2f2ff }" << endl;
t << endl;
endPlainFile();
}
else // write user defined style sheet
{
startPlainFile(Config::htmlStyleSheet);
t << fileToString(Config::htmlStyleSheet);
endPlainFile();
}
}
}
......@@ -372,6 +366,13 @@ void HtmlGenerator::writeHtmlLink(const char *url,const char *text)
t << "</a>";
}
void HtmlGenerator::writeMailLink(const char *url)
{
t << "<a href=\"mailto:" << url << "\">";
docify(url);
t << "</a>";
}
void HtmlGenerator::startGroupHeader()
{
t << "<h2>";
......
......@@ -80,6 +80,7 @@ class HtmlGenerator : public OutputGenerator
void startTextLink(const char *file,const char *anchor);
void endTextLink();
void writeHtmlLink(const char *url,const char *text);
void writeMailLink(const char *url);
void startTypewriter() { t << "<code>"; }
void endTypewriter() { t << "</code>"; }
void startGroupHeader();
......
......@@ -43,6 +43,7 @@ class IndexFieldList : public QList<IndexField>
{
return stricmp(((IndexField *)item1)->name,((IndexField *)item2)->name);
}
~IndexFieldList() {}
};
class IndexFieldListIterator : public QListIterator<IndexField>
......@@ -56,6 +57,7 @@ class IndexFieldDict : public QDict<IndexField>
{
public:
IndexFieldDict(int size) : QDict<IndexField>(size) {}
~IndexFieldDict() {}
};
/*! A helper class for HtmlHelp that manages a two level index in
......
......@@ -55,7 +55,7 @@ QCString abbreviate(const char *s,const char *name)
QCString start1=(QCString)"The "+name+" class ";
QCString start2=(QCString)"The "+name+" widget ";
QCString start3=(QCString)"The "+name+" file ";
result=result.simplifyWhiteSpace();
result=result.stripWhiteSpace();
// strip trailing .
if (result.length()>0 && result.at(result.length()-1)=='.')
result=result.left(result.length()-1);
......
......@@ -50,7 +50,8 @@ void writeInstallScript()
{
fileName = tagLine;
}
t << "\"" << fileName << "\", \"\"";
QFileInfo fi(fileName);
t << "\"" << fi.fileName() << "\", \"\"";
s=Config::tagFileList.next();
if (s) t << ", ";
}
......
......@@ -217,7 +217,8 @@ void LatexGenerator::startIndexSection(IndexSections is)
}
else
{
t << fileToString(Config::latexHeaderFile);
QCString header = fileToString(Config::latexHeaderFile);
t << substituteKeywords(header,0);
}
}
break;
......@@ -657,7 +658,9 @@ void LatexGenerator::writeIndexItem(const char *ref,const char *fn,
void LatexGenerator::writeHtmlLink(const char *url,const char *text)
{
t << "{\\tt ";
docify(text);
t << "}";
if (url)
{
// t << " {\\tt (";
......@@ -666,6 +669,13 @@ void LatexGenerator::writeHtmlLink(const char *url,const char *text)
}
}
void LatexGenerator::writeMailLink(const char *url)
{
t << "{\\tt ";
docify(url);
t << "}";
}
void LatexGenerator::writeStartAnnoItem(const char *,const char *,
const char *path,const char *name)
{
......
......@@ -76,6 +76,7 @@ class LatexGenerator : public OutputGenerator
void startTextLink(const char *,const char *);
void endTextLink();
void writeHtmlLink(const char *,const char *);
void writeMailLink(const char *);
void startTypewriter() { t << "{\\tt "; }
void endTypewriter() { t << "}"; }
void startGroupHeader();
......
......@@ -150,6 +150,11 @@ void ManGenerator::writeHtmlLink(const char *,const char *text)
docify(text);
}
void ManGenerator::writeMailLink(const char *url)
{
docify(url);
}
void ManGenerator::startGroupHeader()
{
if (!firstCol) t << endl;
......
......@@ -76,6 +76,7 @@ class ManGenerator : public OutputGenerator
void startTextLink(const char *,const char *) {}
void endTextLink() {}
void writeHtmlLink(const char *url,const char *text);
void writeMailLink(const char *url);
void startTypewriter() { t << "\\fC"; firstCol=FALSE; }
void endTypewriter() { t << "\\fR"; firstCol=FALSE; }
void startGroupHeader();
......
......@@ -33,7 +33,6 @@ class ExampleList;
class ExampleDict;
class OutputList;
class MemberDef : public Definition
{
public:
......
......@@ -59,6 +59,7 @@ struct MemberInfo
{
MemberInfo(MemberDef *md,Protection p,Specifier v) :
memberDef(md), prot(p), virt(v) {}
~MemberInfo() {}
MemberDef *memberDef;
Protection prot;
Specifier virt;
......@@ -70,6 +71,7 @@ class MemberNameInfo : public QList<MemberInfo>
{
public:
MemberNameInfo(const char *name);
~MemberNameInfo() {}
const char *memberName() const { return name; }
int compareItems(GCI item1,GCI item2);
private:
......
......@@ -81,6 +81,7 @@ class OutputGenerator
virtual void startTextLink(const char *file,const char *anchor) = 0;
virtual void endTextLink() = 0;
virtual void writeHtmlLink(const char *url,const char *text) = 0;
virtual void writeMailLink(const char *url) = 0;
virtual void startTypewriter() = 0;
virtual void endTypewriter() = 0;
virtual void startGroupHeader() = 0;
......
......@@ -120,6 +120,8 @@ class OutputList
{ forall(&OutputGenerator::endTextLink); }
void writeHtmlLink(const char *url,const char *text)
{ forall(&OutputGenerator::writeHtmlLink,url,text); }
void writeMailLink(const char *url)
{ forall(&OutputGenerator::writeMailLink,url); }
void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name)
{ forall(&OutputGenerator::writeStartAnnoItem,type,file,path,name); }
......
This diff is collapsed.
This diff is collapsed.
......@@ -29,6 +29,7 @@ struct SectionInfo
enum SectionType { Section, Subsection, Anchor };
SectionInfo(const char *l,const char *t,SectionType st)
{ label=l; title=t; type=st; definition=0; }
~SectionInfo() {}
QCString label;
QCString title;
SectionType type;
......
......@@ -733,6 +733,15 @@ class Translator
{
return "Definition in file @0.";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.0.0
//////////////////////////////////////////////////////////////////////////
virtual QCString trDeprecated()
{
return "Deprecated";
}
};
#endif
......@@ -450,6 +450,15 @@ class TranslatorDutch : public Translator
{
return "De definitie bevindt zich in de file @0.";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.0.0
//////////////////////////////////////////////////////////////////////////
virtual QCString trDeprecated()
{
return "Verouderd";
}
};
#endif
......@@ -32,6 +32,7 @@
#include "config.h"
#include "htmlhelp.h"
#include "example.h"
#include "version.h"
// an inheritance tree of depth of 100000 should be enough for everyone :-)
const int maxInheritanceDepth = 100000;
......@@ -1878,3 +1879,16 @@ void setFileNameForSections(QList<QCString> *anchorList,const char *fileName)
}
}
//----------------------------------------------------------------------
QCString substituteKeywords(QCString &s,const char *title)
{
if (title) s = substitute(s,"$title",title);
s = substitute(s,"$datetime",dateToString(TRUE));
s = substitute(s,"$date",dateToString(FALSE));
s = substitute(s,"$doxygenversion",versionString);
s = substitute(s,"$projectname",Config::projectName);
s = substitute(s,"$projectnumber",Config::projectNumber);
return s;
}
......@@ -77,5 +77,6 @@ QCString stripFromPath(const QCString &path);
bool rightScopeMatch(const QCString &scope, const QCString &name);
bool leftScopeMatch(const QCString &scope, const QCString &name);
void writePageRef(OutputList &ol,const char *cn,const char *mn);
QCString substituteKeywords(QCString &s,const char *title);
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment