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