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

mods for doxygen-0.49-991003

parent 1d4e23de
DOXYGEN Version 0.49-990901 DOXYGEN Version 0.49-991003
CONTENTS CONTENTS
-------- --------
...@@ -8,14 +8,15 @@ CONTENTS ...@@ -8,14 +8,15 @@ CONTENTS
* HTML related problems * HTML related problems
* LaTeX related problems * LaTeX related problems
* HP-UX / Digital UNIX problems * HP-UX / Digital UNIX problems
* gcc 2.7.2.x related problems
INSTALLATION INSTRUCTIONS FOR UNIX: INSTALLATION INSTRUCTIONS FOR UNIX:
----------------------------------- -----------------------------------
1. Unpack the archive, unless you already have: 1. Unpack the archive, unless you already have:
gunzip doxygen-0.49-990901.src.tar.gz # uncompress the archive gunzip doxygen-0.49-991003.src.tar.gz # uncompress the archive
tar xf doxygen-0.49-990901.src.tar # unpack it tar xf doxygen-0.49-991003.src.tar # unpack it
2. Run the configure script: 2. Run the configure script:
...@@ -26,6 +27,9 @@ INSTALLATION INSTRUCTIONS FOR UNIX: ...@@ -26,6 +27,9 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
interpreter. It will report what it finds. Use configure --help interpreter. It will report what it finds. Use configure --help
to see how to override or change the default or detected settings. to see how to override or change the default or detected settings.
If you have downloaded the binary distribution, you can proceed
with step 6 now.
3. Compile the program by running make: 3. Compile the program by running make:
make make
...@@ -34,14 +38,14 @@ INSTALLATION INSTRUCTIONS FOR UNIX: ...@@ -34,14 +38,14 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
doxytag, and doxysearch) should be available in the bin directory of the doxytag, and doxysearch) should be available in the bin directory of the
distribution. distribution.
5. Generate the user manual (optional, will also be done in step 6). 4. Generate the user manual (optional, will also be done in step 6).
make docs make docs
to let doxygen generate the HTML and LaTeX documentation. To let doxygen generate the HTML and LaTeX documentation.
(you will need the stream editor `sed' for this) (you will need the stream editor `sed' for this)
make ps 5. make ps
to generate a postscript version of the manual. to generate a postscript version of the manual.
(you will need latex and dvips for this) (you will need latex and dvips for this)
...@@ -58,14 +62,17 @@ INSTALLATION INSTRUCTIONS FOR UNIX: ...@@ -58,14 +62,17 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
make install make install
Binaries are install to the directory <prefix>/bin Binaries are installed in the directory <prefix>/bin
Documentation and examples to the directory <prefix>/share/doxygen Documentation and examples in the directory <prefix>/doc/doxygen
<prefix> defaults to /usr but can be changed with the --prefix
option of the configure script.
INSTALLATION INSTRUCTIONS FOR WINDOWS: INSTALLATION INSTRUCTIONS FOR WINDOWS:
-------------------------------------- --------------------------------------
Currently, only Microsoft Visual C++ (version 5.0) is supported. Currently, only Microsoft Visual C++ (version 5.0) is supported.
(For other platforms you may need to edit the perl script in wintools/make.pl (For other compilers you may need to edit the perl script in wintools/make.pl
a bit). Let me know what you had to change if you got Doxygen working with a bit). Let me know what you had to change if you got Doxygen working with
another windows compiler. another windows compiler.
...@@ -80,9 +87,10 @@ You will need to install the windows/dos versions of following tools: ...@@ -80,9 +87,10 @@ You will need to install the windows/dos versions of following tools:
- Qt-1.xx (Qt-2.xx should also work, but I didn't test it for Windows) - Qt-1.xx (Qt-2.xx should also work, but I didn't test it for Windows)
(Hint: only the tools section is required, so you can use the free (Hint: only the tools section is required, so you can use the free
X-windows version as well!) X-windows version as well!)
You can get it at http://www.troll.no
- Microsoft Visual C++ (I only tested with version 5.0). - Microsoft Visual C++ (I only tested with version 5.0).
Use the vcvars32.bat to set the environment variables Use the vcvars32.bat to set the environment variables
(if not selected to do this automatically during installation). (if you did not select to do this automatically during installation).
- To generate LaTeX documentation or formulas in HTML you need the tools: - To generate LaTeX documentation or formulas in HTML you need the tools:
latex, dvips and gswin32 latex, dvips and gswin32
To get these working under Windows install the fpTeX distribution To get these working under Windows install the fpTeX distribution
...@@ -96,15 +104,17 @@ You will need to install the windows/dos versions of following tools: ...@@ -96,15 +104,17 @@ You will need to install the windows/dos versions of following tools:
`objects' and `bin' manually in the root of the distribution before `objects' and `bin' manually in the root of the distribution before
compiling. compiling.
Make sure all tools are accessible from the command-line (add them to the Open a dos box.
PATH environment if needed). Make sure all tools (i.e. nmake, latex, gswin32, dvips, sed, flex, bison,
cl, rm and perl), are accessible from the command-line (add them to the
PATH environment variable if needed).
Open a dos box, goto the doxygen root dir and type: goto the doxygen root dir and type:
make.bat make.bat
This should build the executables doxygen.exe, doxytag.exe, and doxysearch.exe This should build the executables doxygen.exe, doxytag.exe, and doxysearch.exe
(The compiler should not produce any warnings or errors). (The compiler should not produce any serious warnings or errors).
To build the examples type: To build the examples type:
...@@ -125,8 +135,8 @@ The manual should now be here latex/doxygen_manual.ps ...@@ -125,8 +135,8 @@ The manual should now be here latex/doxygen_manual.ps
KNOWN CONFIGURATION PROBLEMS KNOWN CONFIGURATION PROBLEMS
QT RELATED PROBLEMS: QT RELATED PROBLEMS:
- Qt-2.01 contains a bug that - Qt-2.01 contains a bug that makes some special characters appear as
question marks (?) in the HTML output.
HTML RELATED PROBLEMS: HTML RELATED PROBLEMS:
- the indent continuously increases. - the indent continuously increases.
...@@ -168,7 +178,31 @@ HP-UX / DIGITAL UNIX PROBLEMS: ...@@ -168,7 +178,31 @@ HP-UX / DIGITAL UNIX PROBLEMS:
defined (__sparc) || defined (__sgi) || defined (__osf__) defined (__sparc) || defined (__sgi) || defined (__osf__)
#include <alloca.h> #include <alloca.h>
This seems to be a problem with bison, but I don't know how to fix it. Alternatively, one could fix the problem at the bison side.
Here is patch for bison.simple (provided by Andre Johansen):
------------------------------------------------------------------------------
--- bison.simple~ Tue Nov 18 11:45:53 1997
+++ bison.simple Mon Jan 26 15:10:26 1998
@@ -27,7 +27,7 @@
#ifdef __GNUC__
#define alloca __builtin_alloca
#else /* not GNU C. */
-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || defined (__alpha)
#include <alloca.h>
#else /* not sparc */
#if defined (MSDOS) && !defined (__TURBOC__)
------------------------------------------------------------------------------
GCC 2.7.2.X PROBLEMS
Old versions of the GNU compiler have problems with constant strings
containing characters with ascii codes >127. Therefore the compiler will
fail to compile some of the translator_xx.h files.
A workaround, if you are planning to use the English translation only,
is to configure doxygen with the --english-only option.
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
That's it! That's it!
...@@ -180,4 +214,4 @@ The latest version of doxygen can be obtained at ...@@ -180,4 +214,4 @@ The latest version of doxygen can be obtained at
Enjoy, Enjoy,
Dimitri van Heesch (01 September 1999) Dimitri van Heesch (03 October 1999)
...@@ -19,17 +19,18 @@ distclean: clean ...@@ -19,17 +19,18 @@ distclean: clean
install: install:
$(INSTTOOL) -d $(INSTALL)/bin $(INSTTOOL) -d $(INSTALL)/bin
$(INSTTOOL) -d $(INSTALL)/share/doxygen/doc $(INSTTOOL) -d $(INSTALL)/doc/doxygen
$(INSTTOOL) -d $(INSTALL)/share/doxygen/examples $(INSTTOOL) -d $(INSTALL)/doc/doxygen
$(INSTTOOL) -m 755 bin/doxy* $(INSTALL)/bin $(INSTTOOL) -m 755 bin/doxy* $(INSTALL)/bin
cp -r doc $(INSTALL)/share/doxygen cp -r doc $(INSTALL)/doc/doxygen
cp -r examples $(INSTALL)/share/doxygen cp -r examples $(INSTALL)/doc/doxygen
echo "DOXYGEN = $(INSTALL)" > $(INSTALL)/share/doxygen/doc/Makefile echo "DOXYGEN = $(INSTALL)" > $(INSTALL)/doc/doxygen/doc/Makefile
echo "DOXYDOCS = $(INSTALL)/share/doxygen" >> $(INSTALL)/share/doxygen/doc/Makefile echo "DOXYDOCS = .." >> $(INSTALL)/doc/doxygen/doc/Makefile
echo "VERSION = $(VERSION)" >> $(INSTALL)/share/doxygen/doc/Makefile echo "VERSION = $(VERSION)" >> $(INSTALL)/doc/doxygen/doc/Makefile
cat doc/Makefile.in >> $(INSTALL)/share/doxygen/doc/Makefile cat doc/Makefile.in >> $(INSTALL)/doc/doxygen/doc/Makefile
cd $(INSTALL)/share/doxygen/examples ; $(MAKE) cd $(INSTALL)/doc/doxygen/examples ; $(MAKE)
cd $(INSTALL)/share/doxygen/doc ; $(MAKE) cd $(INSTALL)/doc/doxygen/doc ; $(MAKE)
rm -rf $(INSTALL)/doc/doxygen/doc
docs: FORCE docs: FORCE
cd examples ; $(MAKE) cd examples ; $(MAKE)
...@@ -38,10 +39,13 @@ docs: FORCE ...@@ -38,10 +39,13 @@ docs: FORCE
ps: docs ps: docs
cd latex ; $(MAKE) cd latex ; $(MAKE)
pdf: docs
cd latex ; $(MAKE)
archive: distclean archive: distclean
tar zcvf dx`date +%y%m%d`.tgz tmake doc wintools examples bin objects \ tar zcvf dx`date +%y%m%d`.tgz tmake doc wintools examples bin objects \
src configure Makefile.in Makefile.win.in INSTALL make.bat \ src configure configure.bin Makefile.in Makefile.win.in INSTALL \
LANGUAGE.HOWTO LICENSE PLATFORMS VERSION make.bat LANGUAGE.HOWTO LICENSE PLATFORMS VERSION
src/version.cpp: Makefile src/version.cpp: Makefile
echo "char versionString[]=\"$(VERSION)\";" > src/version.cpp echo "char versionString[]=\"$(VERSION)\";" > src/version.cpp
......
DOXYGEN Version 0.49-990901 DOXYGEN Version 0.49-991003
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 (01 September 1999) Dimitri van Heesch (03 October 1999)
0.49-990901 0.49-991003
...@@ -21,10 +21,11 @@ f_shared=YES ...@@ -21,10 +21,11 @@ f_shared=YES
f_make=NO f_make=NO
f_perl=NO f_perl=NO
f_plf_auto=NO f_plf_auto=NO
f_prefix=/usr/local f_prefix=/usr
f_insttool=install f_insttool=install
f_english=NO
while test -n "$1"; do while test -n "$1"; do
case $1 in case $1 in
--prefix) --prefix)
shift; f_prefix=$1 shift; f_prefix=$1
...@@ -41,6 +42,9 @@ while test -n "$1"; do ...@@ -41,6 +42,9 @@ while test -n "$1"; do
--debug) --debug)
f_debug=YES f_debug=YES
;; ;;
--english-only)
f_english=YES
;;
--platform) --platform)
shift; f_platform=$1 shift; f_platform=$1
;; ;;
...@@ -68,33 +72,35 @@ done ...@@ -68,33 +72,35 @@ done
if test "$f_help" = y; then if test "$f_help" = y; then
cat <<EOF cat <<EOF
Usage: $0 [--help] [--shared] [--static] [--release] [--debug] Usage: $0 [--help] [--shared] [--static] [--release] [--debug]
[--perl name] [--make name] [--platform target] [--prefix] [--perl name] [--make name] [--platform target] [--prefix dir]
[--install] [--install name] [--english-only]
Options: Options:ll
--help Print this message --help Print this help
--shared | --static Build using shared or static linking --shared | --static Build using shared or static linking
[default: shared] [default: shared]
--release | --debug Build for release or debug --release | --debug Build for release or debug
[default: release] [default: release]
--perl name Use \`name' as the name of the perl interpreter --perl name Use \`name' as the name of the perl interpreter
[default: autodetect] [default: autodetect]
--make name Use \`name' as the name of the GNU make tool --make name Use \`name' as the name of the GNU make tool
[default: autodetect] [default: autodetect]
--platform target Do not detect platform but use \`target' instead. --platform target Do not detect platform but use \`target' instead.
See PLATFORMS for a list of possibilities See PLATFORMS for a list of possibilities
--prefix dir Installation prefix directory --prefix dir Installation prefix directory
[default: /usr/local] [default: /usr]
--install name name of the GNU install tool --install name Use \`name' as the name of the GNU install tool
[default: install] [default: install]
--english-only Include support for English only.
EOF EOF
test "$f_error" = y && exit 1 test "$f_error" = y && exit 1
...@@ -196,11 +202,11 @@ if test -z "$QTDIR"; then ...@@ -196,11 +202,11 @@ if test -z "$QTDIR"; then
echo "check your Qt installation!" echo "check your Qt installation!"
exit 2 exit 2
else else
if ! test -d "$QTDIR/lib"; then if test ! -d "$QTDIR/lib"; then
echo "QTDIR is set, but library directory does not exist!" echo "QTDIR is set, but library directory does not exist!"
exit 2 exit 2
fi fi
if ! test -d "$QTDIR/include"; then if test ! -d "$QTDIR/include"; then
echo "QTDIR is set, but include directory does not exist!" echo "QTDIR is set, but include directory does not exist!"
exit 2 exit 2
fi fi
...@@ -218,8 +224,10 @@ if test "$f_make" = NO; then ...@@ -218,8 +224,10 @@ if test "$f_make" = NO; then
for i in $make_names; do for i in $make_names; do
for j in $make_dirs; do for j in $make_dirs; do
if test -x "$j/$i"; then if test -x "$j/$i"; then
make_prog="$j/$i" if test -n "`$j/$i --version 2>/dev/null | grep GNU`"; then
break 2 make_prog="$j/$i"
break 2
fi
fi fi
done done
done done
...@@ -281,18 +289,24 @@ RM = rm -f ...@@ -281,18 +289,24 @@ RM = rm -f
VERSION = `cat VERSION` VERSION = `cat VERSION`
INSTALL = $f_prefix INSTALL = $f_prefix
INSTTOOL = $f_insttool INSTTOOL = $f_insttool
DOXYDOCS = $PWD DOXYDOCS = ..
export TMAKEPATH export TMAKEPATH
EOF EOF
touch .tmakeconfig touch .tmakeconfig
if test "$f_shared" = NO; then if test "$f_shared" = NO; then
cat > .tmakeconfig <<EOF cat >> .tmakeconfig <<EOF
TMAKE_LFLAGS = -static TMAKE_LFLAGS = -static
EOF EOF
fi fi
if test "$f_english" = YES; then
cat >> .tmakeconfig << EOF
TMAKE_CXXFLAGS = -DENGLISH_ONLY
EOF
fi
for i in Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in ; do for i in Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in ; do
SRC=$i SRC=$i
DST=`echo $i|sed 's%\(.*\).in$%\1%'` DST=`echo $i|sed 's%\(.*\).in$%\1%'`
......
#
# $Id$
#
# Copyright (C) 1997-1999 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
# granted. No representations are made about the suitability of this software
# for any purpose. It is provided "as is" without express or implied warranty.
# See the GNU General Public License for more details.
#
# All output generated with Doxygen is not covered by this license.
PROJECT_NAME = PROJECT_NAME =
OUTPUT_DIRECTORY = .. OUTPUT_DIRECTORY = ..
HTML_HEADER = HTML_HEADER =
...@@ -14,7 +27,7 @@ ENABLE_PREPROCESSING = NO ...@@ -14,7 +27,7 @@ ENABLE_PREPROCESSING = NO
INPUT = index.doc install.doc starting.doc faq.doc trouble.doc \ INPUT = index.doc install.doc starting.doc faq.doc trouble.doc \
history.doc features.doc \ history.doc features.doc \
doxygen_usage.doc doxytag_usage.doc doxysearch_usage.doc \ doxygen_usage.doc doxytag_usage.doc doxysearch_usage.doc \
installdox_usage.doc autolink.doc \ installdox_usage.doc output.doc autolink.doc \
config.doc commands.doc htmlcmds.doc language.doc config.doc commands.doc htmlcmds.doc language.doc
FILE_PATTERNS = *.cpp *.h *.doc FILE_PATTERNS = *.cpp *.h *.doc
EXAMPLE_PATH = ../examples EXAMPLE_PATH = ../examples
...@@ -29,3 +42,4 @@ DOC_URL = ...@@ -29,3 +42,4 @@ DOC_URL =
DOC_ABSPATH = DOC_ABSPATH =
BIN_ABSPATH = /usr/local/bin/ BIN_ABSPATH = /usr/local/bin/
EXT_DOC_PATHS = EXT_DOC_PATHS =
PDF_HYPERLINKS = YES
#
# $Id$
#
# Copyright (C) 1997-1999 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
# granted. No representations are made about the suitability of this software
# for any purpose. It is provided "as is" without express or implied warranty.
# See the GNU General Public License for more details.
#
# All output generated with Doxygen is not covered by this license.
all: FORCE all: FORCE
DOXYGEN_DOCDIR=$(DOXYDOCS); \ DOXYGEN_DOCDIR=$(DOXYDOCS); \
......
all: doxygen_manual.ps #
# $Id$
#
# Copyright (C) 1997-1999 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
# granted. No representations are made about the suitability of this software
# for any purpose. It is provided "as is" without express or implied warranty.
# See the GNU General Public License for more details.
#
# All output generated with Doxygen is not covered by this license.
all: doxygen_manual.pdf
doxygen_manual.pdf: doxygen_manual.ps
ps2pdf doxygen_manual.ps doxygen_manual.pdf
doxygen_manual.ps: doxygen_manual.dvi doxygen_manual.ps: doxygen_manual.dvi
dvips -o doxygen_manual.ps doxygen_manual.dvi dvips -o doxygen_manual.ps doxygen_manual.dvi
......
#
# $Id$
#
# Copyright (C) 1997-1999 by Dimitri van Heesch.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby
# granted. No representations are made about the suitability of this software
# for any purpose. It is provided "as is" without express or implied warranty.
# See the GNU General Public License for more details.
#
# All output generated with Doxygen is not covered by this license.
all: FORCE all: FORCE
set DOXYGEN_DOCDIR=file:///$(DOXYGEN) set DOXYGEN_DOCDIR=file:///$(DOXYGEN)
set VERSION=$(VERSION) set VERSION=$(VERSION)
......
...@@ -70,12 +70,14 @@ documentation: ...@@ -70,12 +70,14 @@ documentation:
<li> \refitem cmdfile \file <li> \refitem cmdfile \file
<li> \refitem cmdfn \fn <li> \refitem cmdfn \fn
<li> \refitem cmdhtmlonly \htmlonly <li> \refitem cmdhtmlonly \htmlonly
<li> \refitem cmdimage \image
<li> \refitem cmdinclude \include <li> \refitem cmdinclude \include
<li> \refitem cmdingroup \ingroup <li> \refitem cmdingroup \ingroup
<li> \refitem cmdinternal \internal <li> \refitem cmdinternal \internal
<li> \refitem cmdlatexonly \latexonly <li> \refitem cmdlatexonly \latexonly
<li> \refitem cmdline \line <li> \refitem cmdline \line
<li> \refitem cmdlink \link <li> \refitem cmdlink \link
<li> \refitem cmdmainpage \mainpage
<li> \refitem cmdnamespace \namespace <li> \refitem cmdnamespace \namespace
<li> \refitem cmdoverload \overload <li> \refitem cmdoverload \overload
<li> \refitem cmdpage \page <li> \refitem cmdpage \page
...@@ -84,6 +86,7 @@ documentation: ...@@ -84,6 +86,7 @@ documentation:
<li> \refitem cmdref \ref <li> \refitem cmdref \ref
<li> \refitem cmdrelates \relates <li> \refitem cmdrelates \relates
<li> \refitem cmdreturn \return <li> \refitem cmdreturn \return
<li> \refitem cmdretval \retval
<li> \refitem cmdsa \sa <li> \refitem cmdsa \sa
<li> \refitem cmdsection \section <li> \refitem cmdsection \section
<li> \refitem cmdskip \skip <li> \refitem cmdskip \skip
...@@ -286,6 +289,38 @@ Doxygen. Unrecognized commands are treated as normal text. ...@@ -286,6 +289,38 @@ Doxygen. Unrecognized commands are treated as normal text.
This command writes the message `For internal use only' to the output. This command writes the message `For internal use only' to the output.
All text after a \c \internal command is ignored. All text after a \c \internal command is ignored.
<hr>
\subsection cmdmainpage \mainpage [(title)]
\addindex \mainpage
If the \\mainpage command is placed in a comment block the
block is used to customize the index page (in HTML) or
the first chapter (in \f$\mbox{\LaTeX}\f$).
The title argument is optional and replaces the default title that
doxygen normally generates.
Here is an example:
\verbatim
/*! \mainpage My Personal Index Page
*
* \section intro Introduction
*
* This is the introduction.
*
* \section install Installation
*
* \subsection step1 Step 1: Opening the box
*
* etc...
*/
\endverbatim
\sa section \ref cmdsection "\\section",
section \ref cmdsubsection "\\subsection" and
section \ref cmdpage "\\page".
<hr> <hr>
\subsection cmdnamespace \namespace <name> \subsection cmdnamespace \namespace <name>
...@@ -338,6 +373,15 @@ Doxygen. Unrecognized commands are treated as normal text. ...@@ -338,6 +373,15 @@ Doxygen. Unrecognized commands are treated as normal text.
Click <a href="$(DOXYGEN_DOCDIR)/examples/page/html/pages.html">here</a> Click <a href="$(DOXYGEN_DOCDIR)/examples/page/html/pages.html">here</a>
for the corresponding HTML documentation that is generated by Doxygen. for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly \endhtmlonly
\par notice:
The \<name\> argument consists of a combination of letters and number
digits. If you wish to use upper case letters (e.g. \c MYPAGE1), or
mixed case letters (e.g. \c MyPage1) in the \<name\> argument, you
should set \c CASE_SENSE_NAMES to \c YES. However, this is advisable
only if your file system is case sensitive. Otherwise (and for better
portability) you should use all lower case letters (e.g. \c mypage1)
for \<name\> in all references to the page.
\sa section \ref cmdsection "\\section", section \sa section \ref cmdsection "\\section", section
\ref cmdsubsection "\\subsection", and section \ref cmdsubsection "\\subsection", and section
...@@ -543,6 +587,23 @@ Doxygen. Unrecognized commands are treated as normal text. ...@@ -543,6 +587,23 @@ Doxygen. Unrecognized commands are treated as normal text.
\sa Section \ref cmdjdreturn "@return". \sa Section \ref cmdjdreturn "@return".
<hr>
\subsection cmdretval \retval <return value> { description }
\addindex \retval
Starts a return value for a function with name
\<return value\>. Followed by a description of the return value.
The text of the paragraph that forms the description has no special
internal structure. All visual enhancement commands may be used inside the
paragraph.
Multiple adjacent \\retval commands will be joined into a single paragraph.
Each return value description will start on a new line.
The \\retval description ends when a blank line or some other
sectioning command is encountered.
\sa Section \ref cmdjdretval "@retval".
<hr> <hr>
\subsection cmdsa \sa { references } \subsection cmdsa \sa { references }
...@@ -690,11 +751,17 @@ Doxygen. Unrecognized commands are treated as normal text. ...@@ -690,11 +751,17 @@ Doxygen. Unrecognized commands are treated as normal text.
\addindex \dontinclude \addindex \dontinclude
This command can be used to parse a source file without actually This command can be used to parse a source file without actually
including it. Any class and member declarations inside the code verbatim including it in the documentation (as the \\include command does).
This is useful if you want to divide the source file into smaller pieces and
add documentation between the pieces.
Source files or directories can be specified using the \c EXAMPLE_PATH tag
of Doxygen's configuration file.
The class and member declarations and definitions inside the code fragment
are `remembered' during the parsing of the comment block that contained are `remembered' during the parsing of the comment block that contained
the \\dontinclude command. the \\dontinclude command.
For line by line description of source files, one or more lines For line by line descriptions of source files, one or more lines
of the example can be displayed using the \\line, \\skip, \\skipline, and of the example can be displayed using the \\line, \\skip, \\skipline, and
\\until commands. An internal pointer is used for these commands. The \\until commands. An internal pointer is used for these commands. The
\\dontinclude command sets the pointer to the first line of the example. \\dontinclude command sets the pointer to the first line of the example.
...@@ -717,8 +784,8 @@ Doxygen. Unrecognized commands are treated as normal text. ...@@ -717,8 +784,8 @@ Doxygen. Unrecognized commands are treated as normal text.
\addindex \include \addindex \include
This command can be used to include a source file as a block of code. This command can be used to include a source file as a block of code.
The command takes the name of an include file as an argument. The command takes the name of an include file as an argument.
Include files or directories can be specified using the Source files or directories can be specified using the
\c INCLUDE_PATH tag of Doxygen's configuration file. \c EXAMPLE_PATH tag of Doxygen's configuration file.
Using the \\include command is equivalent to inserting the file into Using the \\include command is equivalent to inserting the file into
the documentation block and surrounding it the documentation block and surrounding it
...@@ -728,10 +795,9 @@ Doxygen. Unrecognized commands are treated as normal text. ...@@ -728,10 +795,9 @@ Doxygen. Unrecognized commands are treated as normal text.
duplication in case of example blocks that consist of multiple duplication in case of example blocks that consist of multiple
source and header files. source and header files.
For line by line description of source files, one or more lines For a line by line description of a source files use the
of the example can be displayed using the \\line, \\skip, \\skipline, and \\dontinclude command in combination with the \\line, \\skip, \\skipline,
\\until commands. An internal pointer is used for these command. The and \\until commands.
\\include command sets the pointer to the first line of the example.
\sa section \ref cmdexample "\\example" and \ref cmddontinclude "\\dontinclude". \sa section \ref cmdexample "\\example" and \ref cmddontinclude "\\dontinclude".
...@@ -966,6 +1032,45 @@ Doxygen. Unrecognized commands are treated as normal text. ...@@ -966,6 +1032,45 @@ Doxygen. Unrecognized commands are treated as normal text.
\sa section \ref cmdhtmlonly "\\htmlonly" and section \sa section \ref cmdhtmlonly "\\htmlonly" and section
\ref cmdlatexonly "\\latexonly". \ref cmdlatexonly "\\latexonly".
<hr>
\subsection cmdimage \image <format> <file> [<sizeindication>=<size>]
\addindex \image
Inserts an image into the documentation. This command is format
specific, so if you want to insert an image for more than one
format you'll have to repeat this command for each format.
The first argument specifies the output format. Currently, the
following values are supported: \c html and \c latex.
The second argument specifies the path and file name of the image.
If a relative path is used, this will be relative to the directory to
which the output of the particular format is written.
For the html format you may also
specify an URL. If the name contains spaces you'll have to put
quotes (") around it.
The third argument can be used to specify the width or height of the
image. This is only useful for \f$\mbox{\LaTeX}\f$ output
(i.e. format=latex). \c sizeindication can be either
\c width or \c height. The size should be a valid
size specifier in \f$\mbox{\LaTeX}\f$ (for example <code>10cm</code> or
<code>6in</code>).
\verbatim
/*! Here is a snapshot of my new application:
* \image html ../images/application.jpg
* \image latex ../images/application.eps width=10cm
*/
\endverbatim
\warning The image format for HTML is limited to what your
browser supports. For \f$\mbox{\LaTeX}\f$ the image format
must be an encapsulated postscipt (eps).
<br><br>
Doxygen does not check if an image exists or if it is in
the correct format. So \e you have to make sure this is the case!
<hr> <hr>
\subsection cmdlatexonly \latexonly \subsection cmdlatexonly \latexonly
...@@ -1078,6 +1183,9 @@ The following command JavaDoc command are support. ...@@ -1078,6 +1183,9 @@ The following command JavaDoc command are support.
\subsection cmdjdreturn @return { description of the return value } \subsection cmdjdreturn @return { description of the return value }
\addindex @return \addindex @return
Equivalent to \\return (see section \ref cmdreturn "\\return"). Equivalent to \\return (see section \ref cmdreturn "\\return").
\subsection cmdjdretval @retval <return value name> { return value description }
\addindex @retval
Equivalent to \\retval (see section \ref cmdretval "\\retval").
\subsection cmdjdsee @see { references } \subsection cmdjdsee @see { references }
\addindex @see \addindex @see
Equivalent to \\sa (see section \ref cmdsa "\\sa"). Equivalent to \\sa (see section \ref cmdsa "\\sa").
......
...@@ -25,7 +25,7 @@ recursive-descent parser that is built into \c doxygen. ...@@ -25,7 +25,7 @@ recursive-descent parser that is built into \c doxygen.
The file may contain tabs and newlines for formatting purposes. The file may contain tabs and newlines for formatting purposes.
The statements in the file are case-sensitive. The statements in the file are case-sensitive.
Comments may be placed anywhere within the file (except within quotes). Comments may be placed anywhere within the file (except within quotes).
Comments begin with the \c # character and end at the end of the Comments begin with the \# character and end at the end of the
line. line.
The file essentially consists of a list of assignment statements. The file essentially consists of a list of assignment statements.
...@@ -38,11 +38,95 @@ as the last character of a line. ...@@ -38,11 +38,95 @@ as the last character of a line.
Environment variables can expanded using the pattern \c $(ENV_VARIABLE_NAME). Environment variables can expanded using the pattern \c $(ENV_VARIABLE_NAME).
The configuration options can be divided into several categories. The configuration options can be divided into several categories.
Below is a list of tags that are recognized for each category. Below is an alphabetical index of the tags that are recognized
followed by the descriptions of the tags grouped by category.
\htmlonly
<multicol cols=3>
<ul>
\endhtmlonly
\latexonly
\footnotesize
\begin{multicols}{3}
\begin{CompactList}
\endlatexonly
<li> \refitem cfg_allexternals ALLEXTERNALS
<li> \refitem cfg_alphabetical_index ALPHABETICAL_INDEX
<li> \refitem cfg_bin_abspath BIN_ABSPATH
<li> \refitem cfg_brief_member_desc BRIEF_MEMBER_DESC
<li> \refitem cfg_case_sense_names CASE_SENSE_NAMES
<li> \refitem cfg_cgi_name CGI_NAME
<li> \refitem cfg_cgi_url CGI_URL
<li> \refitem cfg_class_diagrams CLASS_DIAGRAMS
<li> \refitem cfg_compact_latex COMPACT_LATEX
<li> \refitem cfg_disable_index DISABLE_INDEX
<li> \refitem cfg_doc_abspath DOC_ABSPATH
<li> \refitem cfg_doc_url DOC_URL
<li> \refitem cfg_enable_preprocessing ENABLE_PREPROCESSING
<li> \refitem cfg_example_path EXAMPLE_PATH
<li> \refitem cfg_exclude EXCLUDE
<li> \refitem cfg_exclude_patterns EXCLUDE_PATTERNS
<li> \refitem cfg_expand_only_predef EXPAND_ONLY_PREDEF
<li> \refitem cfg_ext_doc_paths EXT_DOC_PATHS
<li> \refitem cfg_extra_packages EXTRA_PACKAGES
<li> \refitem cfg_extract_all EXTRACT_ALL
<li> \refitem cfg_extract_private EXTRACT_PRIVATE
<li> \refitem cfg_file_patterns FILE_PATTERNS
<li> \refitem cfg_full_path_names FULL_PATH_NAMES
<li> \refitem cfg_generate_html GENERATE_HTML
<li> \refitem cfg_generate_htmlhelp GENERATE_HTMLHELP
<li> \refitem cfg_generate_latex GENERATE_LATEX
<li> \refitem cfg_generate_man GENERATE_MAN
<li> \refitem cfg_generate_tagfile GENERATE_TAGFILE
<li> \refitem cfg_hide_undoc_classes HIDE_UNDOC_CLASSES
<li> \refitem cfg_hide_undoc_members HIDE_UNDOC_MEMBERS
<li> \refitem cfg_html_align_members HTML_ALIGN_MEMBERS
<li> \refitem cfg_html_footer HTML_FOOTER
<li> \refitem cfg_html_header HTML_HEADER
<li> \refitem cfg_html_output HTML_OUTPUT
<li> \refitem cfg_include_path INCLUDE_PATH
<li> \refitem cfg_inherit_docs INHERIT_DOCS
<li> \refitem cfg_inline_info INLINE_INFO
<li> \refitem cfg_input INPUT
<li> \refitem cfg_input_filter INPUT_FILTER
<li> \refitem cfg_internal_docs INTERNAL_DOCS
<li> \refitem cfg_javadoc_autobrief JAVADOC_AUTOBRIEF
<li> \refitem cfg_latex_header LATEX_HEADER
<li> \refitem cfg_latex_output LATEX_OUTPUT
<li> \refitem cfg_macro_expansion MACRO_EXPANSION
<li> \refitem cfg_man_extension MAN_EXTENSION
<li> \refitem cfg_man_output MAN_OUTPUT
<li> \refitem cfg_output_directory OUTPUT_DIRECTORY
<li> \refitem cfg_output_language OUTPUT_LANGUAGE
<li> \refitem cfg_paper_type PAPER_TYPE
<li> \refitem cfg_perl_path PERL_PATH
<li> \refitem cfg_predefined PREDEFINED
<li> \refitem cfg_project_name PROJECT_NAME
<li> \refitem cfg_project_number PROJECT_NUMBER
<li> \refitem cfg_quiet QUIET
<li> \refitem cfg_recursive RECURSIVE
<li> \refitem cfg_repeat_brief REPEAT_BRIEF
<li> \refitem cfg_search_includes SEARCH_INCLUDES
<li> \refitem cfg_searchengine SEARCHENGINE
<li> \refitem cfg_source_browser SOURCE_BROWSER
<li> \refitem cfg_strip_from_path STRIP_FROM_PATH
<li> \refitem cfg_tagfiles TAGFILES
<li> \refitem cfg_verbatim_headers VERBATIM_HEADERS
<li> \refitem cfg_warnings WARNINGS
\htmlonly
</ul>
</multicol>
\endhtmlonly
\latexonly
\end{CompactList}
\end{multicols}
\normalsize
\endlatexonly
\subsection config_general General options \subsection config_general General options
<dl> <dl>
\anchor cfg_project_name
<dt>\c PROJECT_NAME <dd> <dt>\c PROJECT_NAME <dd>
\addindex PROJECT_NAME \addindex PROJECT_NAME
The \c PROJECT_NAME tag is a single word (or a sequence of words The \c PROJECT_NAME tag is a single word (or a sequence of words
...@@ -50,12 +134,14 @@ Below is a list of tags that are recognized for each category. ...@@ -50,12 +134,14 @@ Below is a list of tags that are recognized for each category.
documentation is generated. This name is used in the title of most documentation is generated. This name is used in the title of most
generated pages and in a few other places. generated pages and in a few other places.
\anchor cfg_project_number
<dt>\c PROJECT_NUMBER <dd> <dt>\c PROJECT_NUMBER <dd>
\addindex PROJECT_NUMBER \addindex PROJECT_NUMBER
The \c PROJECT_NUMBER tag can be used to enter a project or revision number. The \c PROJECT_NUMBER tag can be used to enter a project or revision number.
This could be handy for archiving the generated documentation or This could be handy for archiving the generated documentation or
if some version control system is used. if some version control system is used.
\anchor cfg_output_directory
<dt>\c OUTPUT_DIRECTORY <dd> <dt>\c OUTPUT_DIRECTORY <dd>
\addindex OUTPUT_DIRECTORY \addindex OUTPUT_DIRECTORY
The \c OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) The \c OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
...@@ -63,6 +149,7 @@ Below is a list of tags that are recognized for each category. ...@@ -63,6 +149,7 @@ Below is a list of tags that are recognized for each category.
If a relative path is entered, it will be relative to the location If a relative path is entered, it will be relative to the location
where doxygen was started. If left blank the current directory will be used. where doxygen was started. If left blank the current directory will be used.
\anchor cfg_output_language
<dt>\c OUTPUT_LANGUAGE <dd> <dt>\c OUTPUT_LANGUAGE <dd>
\addindex OUTPUT_LANGUAGE \addindex OUTPUT_LANGUAGE
The \c OUTPUT_LANGUAGE tag is used to specify the language in which all The \c OUTPUT_LANGUAGE tag is used to specify the language in which all
...@@ -71,6 +158,7 @@ Below is a list of tags that are recognized for each category. ...@@ -71,6 +158,7 @@ Below is a list of tags that are recognized for each category.
The default language is English, other supported languages are: The default language is English, other supported languages are:
Dutch, French, Italian, Czech, Swedish, German and Japanese. Dutch, French, Italian, Czech, Swedish, German and Japanese.
\anchor cfg_quiet
<dt>\c QUIET <dd> <dt>\c QUIET <dd>
\addindex QUIET \addindex QUIET
The \c QUIET tag can be used to turn on/off the messages that are generated The \c QUIET tag can be used to turn on/off the messages that are generated
...@@ -78,6 +166,7 @@ Below is a list of tags that are recognized for each category. ...@@ -78,6 +166,7 @@ Below is a list of tags that are recognized for each category.
where \c YES implies that the messages are off. where \c YES implies that the messages are off.
If left blank \c NO is used. If left blank \c NO is used.
\anchor cfg_warnings
<dt>\c WARNINGS <dd> <dt>\c WARNINGS <dd>
\addindex WARNINGS \addindex WARNINGS
The \c WARNINGS tag can be used to turn on/off the warning messages that are The \c WARNINGS tag can be used to turn on/off the warning messages that are
...@@ -86,6 +175,7 @@ Below is a list of tags that are recognized for each category. ...@@ -86,6 +175,7 @@ Below is a list of tags that are recognized for each category.
\b Tip: Turn warnings on while writing the documentation. \b Tip: Turn warnings on while writing the documentation.
\anchor cfg_disable_index
<dt>\c DISABLE_INDEX <dd> <dt>\c DISABLE_INDEX <dd>
\addindex DISABLE_INDEX \addindex DISABLE_INDEX
If you want full control over the layout of the generated HTML pages it If you want full control over the layout of the generated HTML pages it
...@@ -94,6 +184,7 @@ Below is a list of tags that are recognized for each category. ...@@ -94,6 +184,7 @@ Below is a list of tags that are recognized for each category.
top of each page. A value of NO (the default) enables the index and the top of each page. A value of NO (the default) enables the index and the
value YES disables it. value YES disables it.
\anchor cfg_extract_all
<dt>\c EXTRACT_ALL <dd> <dt>\c EXTRACT_ALL <dd>
\addindex EXTRACT_ALL \addindex EXTRACT_ALL
If the \c EXTRACT_ALL tag is set to \c YES all classes and functions will be If the \c EXTRACT_ALL tag is set to \c YES all classes and functions will be
...@@ -102,11 +193,13 @@ Below is a list of tags that are recognized for each category. ...@@ -102,11 +193,13 @@ Below is a list of tags that are recognized for each category.
\b Notice: This will also disable the warnings about undocumented members \b Notice: This will also disable the warnings about undocumented members
that are normally produced when \c WARNINGS is set to \c YES that are normally produced when \c WARNINGS is set to \c YES
\anchor cfg_extract_private
<dt>\c EXTRACT_PRIVATE <dd> <dt>\c EXTRACT_PRIVATE <dd>
\addindex EXTRACT_PRIVATE \addindex EXTRACT_PRIVATE
If the \c EXTRACT_PRIVATE tag is set to \c YES all If the \c EXTRACT_PRIVATE tag is set to \c YES all
documentation for private members will be extracted as well. documentation for private members will be extracted as well.
\anchor cfg_hide_undoc_members
<dt>\c HIDE_UNDOC_MEMBERS <dd> <dt>\c HIDE_UNDOC_MEMBERS <dd>
\addindex HIDE_UNDOC_MEMBERS \addindex HIDE_UNDOC_MEMBERS
If the \c HIDE_UNDOC_MEMBERS tag is set to \c YES, Doxygen will hide all If the \c HIDE_UNDOC_MEMBERS tag is set to \c YES, Doxygen will hide all
...@@ -114,6 +207,7 @@ Below is a list of tags that are recognized for each category. ...@@ -114,6 +207,7 @@ Below is a list of tags that are recognized for each category.
If set to \c NO (the default) these members will be included in the If set to \c NO (the default) these members will be included in the
various overviews, but no documentation section is generated. various overviews, but no documentation section is generated.
\anchor cfg_hide_undoc_classes
<dt>\c HIDE_UNDOC_CLASSES <dd> <dt>\c HIDE_UNDOC_CLASSES <dd>
\addindex HIDE_UNDOC_CLASSES \addindex HIDE_UNDOC_CLASSES
If the \c HIDE_UNDOC_CLASSESS tag is set to \c YES, Doxygen will hide all If the \c HIDE_UNDOC_CLASSESS tag is set to \c YES, Doxygen will hide all
...@@ -121,6 +215,7 @@ Below is a list of tags that are recognized for each category. ...@@ -121,6 +215,7 @@ Below is a list of tags that are recognized for each category.
If set to \c NO (the default) these classes will be included in the If set to \c NO (the default) these classes will be included in the
various overviews. various overviews.
\anchor cfg_brief_member_desc
<dt>\c BRIEF_MEMBER_DESC <dd> <dt>\c BRIEF_MEMBER_DESC <dd>
\addindex BRIEF_MEMBER_DESC \addindex BRIEF_MEMBER_DESC
If the \c BRIEF_MEMBER_DESC tag is set to \c YES (the default) Doxygen will If the \c BRIEF_MEMBER_DESC tag is set to \c YES (the default) Doxygen will
...@@ -128,6 +223,7 @@ Below is a list of tags that are recognized for each category. ...@@ -128,6 +223,7 @@ Below is a list of tags that are recognized for each category.
the file and class documentation (similar to JavaDoc). the file and class documentation (similar to JavaDoc).
Set to NO to disable this. Set to NO to disable this.
\anchor cfg_internal_docs
<dt>\c INTERNAL_DOCS <dd> <dt>\c INTERNAL_DOCS <dd>
\addindex INTERNAL_DOCS \addindex INTERNAL_DOCS
The \c INTERNAL_DOCS tag determines if documentation The \c INTERNAL_DOCS tag determines if documentation
...@@ -135,6 +231,7 @@ Below is a list of tags that are recognized for each category. ...@@ -135,6 +231,7 @@ Below is a list of tags that are recognized for each category.
to \c NO (the default) then the documentation will be excluded. to \c NO (the default) then the documentation will be excluded.
Set it to \c YES to include the internal documentation. Set it to \c YES to include the internal documentation.
\anchor cfg_repeat_brief
<dt>\c REPEAT_BRIEF <dd> <dt>\c REPEAT_BRIEF <dd>
\addindex REPEAT_BRIEF \addindex REPEAT_BRIEF
If the \c REPEAT_BRIEF tag is set to \c YES (the default) Doxygen will If the \c REPEAT_BRIEF tag is set to \c YES (the default) Doxygen will
...@@ -145,12 +242,14 @@ Below is a list of tags that are recognized for each category. ...@@ -145,12 +242,14 @@ Below is a list of tags that are recognized for each category.
If both \c HIDE_UNDOC_MEMBERS and \c BRIEF_MEMBER_DESC are set to \c NO, the If both \c HIDE_UNDOC_MEMBERS and \c BRIEF_MEMBER_DESC are set to \c NO, the
brief descriptions will be completely suppressed. brief descriptions will be completely suppressed.
\anchor cfg_full_path_names
<dt>\c FULL_PATH_NAMES <dd> <dt>\c FULL_PATH_NAMES <dd>
\addindex FULL_PATH_NAMES \addindex FULL_PATH_NAMES
If the \c FULL_PATH_NAMES tag is set to \c YES Doxygen will prepend the full If the \c FULL_PATH_NAMES tag is set to \c YES Doxygen will prepend the full
path before files name in the file list and in the header files. If set path before files name in the file list and in the header files. If set
to NO the shortest path that makes the file name unique will be used to NO the shortest path that makes the file name unique will be used
\anchor cfg_strip_from_path
<dt>\c STRIP_FROM_PATH <dd> <dt>\c STRIP_FROM_PATH <dd>
\addindex STRIP_FROM_PATH \addindex STRIP_FROM_PATH
If the \c FULL_PATH_NAMES tag is set to \c YES then the \c STRIP_FROM_PATH tag If the \c FULL_PATH_NAMES tag is set to \c YES then the \c STRIP_FROM_PATH tag
...@@ -158,18 +257,21 @@ Below is a list of tags that are recognized for each category. ...@@ -158,18 +257,21 @@ Below is a list of tags that are recognized for each category.
only done if one of the specified strings matches the left-hand part of the only done if one of the specified strings matches the left-hand part of the
path. path.
\anchor cfg_class_diagrams
<dt>\c CLASS_DIAGRAMS <dd> <dt>\c CLASS_DIAGRAMS <dd>
\addindex CLASS_DIAGRAMS \addindex CLASS_DIAGRAMS
If the \c CLASS_DIAGRAMS tag is set to \c YES (the default) Doxygen will If the \c CLASS_DIAGRAMS tag is set to \c YES (the default) Doxygen will
generate a class diagram (in Html and LaTeX) for classes with base or generate a class diagram (in Html and \f$\mbox{\LaTeX}\f$) for classes with base or
super classes. Setting the tag to \c NO turns the diagrams off. super classes. Setting the tag to \c NO turns the diagrams off.
\anchor cfg_source_browser
<dt>\c SOURCE_BROWSER <dd> <dt>\c SOURCE_BROWSER <dd>
\addindex SOURCE_BROWSER \addindex SOURCE_BROWSER
If the \c SOURCE_BROWSER tag is set to \c YES than the body of a member or If the \c SOURCE_BROWSER tag is set to \c YES than the body of a member or
function will be appended as a block of code to the documentation of. function will be appended as a block of code to the documentation of.
that member or function. that member or function.
\anchor cfg_case_sense_names
<dt>\c CASE_SENSE_NAMES <dd> <dt>\c CASE_SENSE_NAMES <dd>
\addindex CASE_SENSE_NAMES \addindex CASE_SENSE_NAMES
If the \c CASE_SENSE_NAMES tag is set to \c NO (the default) then Doxygen If the \c CASE_SENSE_NAMES tag is set to \c NO (the default) then Doxygen
...@@ -178,25 +280,40 @@ Below is a list of tags that are recognized for each category. ...@@ -178,25 +280,40 @@ Below is a list of tags that are recognized for each category.
classes or files whose names only differ in case and if your file system classes or files whose names only differ in case and if your file system
supports case sensitive file names. supports case sensitive file names.
\anchor cfg_verbatim_headers
<dt>\c VERBATIM_HEADERS <dd> <dt>\c VERBATIM_HEADERS <dd>
\addindex VERBATIM_HEADERS \addindex VERBATIM_HEADERS
If the VERBATIM_HEADERS tag is set the YES (the default) then Doxygen\n"; If the \c VERBATIM_HEADERS tag is set the \c YES (the default) then Doxygen
will generate a verbatim copy of the header file for each class for\n"; will generate a verbatim copy of the header file for each class for
which an include is specified. Set to NO to disable this.\n"; which an include is specified. Set to NO to disable this.
\sa Section \ref cmdclass "\\class". \sa Section \ref cmdclass "\\class".
\anchor cfg_javadoc_autobrief
<dt>\c JAVADOC_AUTOBRIEF <dd> <dt>\c JAVADOC_AUTOBRIEF <dd>
\addinex JAVADOC_AUTOBRIEF \addinex JAVADOC_AUTOBRIEF
If the JAVADOC_NO_AUTOBRIEF is set to YES (the default) then Doxygen If the \c JAVADOC_NO_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.
\anchor cfg_inherit_docs
<dt>\c INHERIT_DOCS <dd>
\addindex INHERIT_DOCS
If the \c INHERIT_DOCS tag is set to \c YES (the default) then an undocumented
member inherits the documentation from any documented member that it
reimplements.
\anchor cfg_inline_info
<dt> INLINE_INFO <dd>
If the \c INLINE_INFO tag is set to \c YES (the default) then a tag [inline]
is inserted in the documentation for inline members.
</dl> </dl>
\subsection config_input Input related options \subsection config_input Input related options
<dl> <dl>
\anchor cfg_input
<dt>\c INPUT <dd> <dt>\c INPUT <dd>
\addindex INPUT \addindex INPUT
The \c INPUT tag is used to specify the files and/or directories that contain The \c INPUT tag is used to specify the files and/or directories that contain
...@@ -206,6 +323,7 @@ Below is a list of tags that are recognized for each category. ...@@ -206,6 +323,7 @@ Below is a list of tags that are recognized for each category.
\b Notice: This tag (and only this tag) is \e required. \b Notice: This tag (and only this tag) is \e required.
\anchor cfg_file_patterns
<dt>\c FILE_PATTERNS <dd> <dt>\c FILE_PATTERNS <dd>
\addindex FILE_PATTERNS \addindex FILE_PATTERNS
If the value of the \c INPUT tag contains directories, you can use the If the value of the \c INPUT tag contains directories, you can use the
...@@ -214,31 +332,35 @@ Below is a list of tags that are recognized for each category. ...@@ -214,31 +332,35 @@ Below is a list of tags that are recognized for each category.
in the directories. If left blank all files are included in the directories. If left blank all files are included
(i.e. wildcard <tt>*</tt>). (i.e. wildcard <tt>*</tt>).
\anchor cfg_recursive
<dt>\c RECURSIVE <dd> <dt>\c RECURSIVE <dd>
\addindex RECURSIVE \addindex RECURSIVE
The \c RECURSIVE tag can be used to specify whether or not subdirectories The \c RECURSIVE tag can be used to specify whether or not subdirectories
should be searched for input files as well. Possible values are \c YES should be searched for input files as well. Possible values are \c YES
and \c NO. If left blank \c NO is used. and \c NO. If left blank \c NO is used.
\anchor cfg_exclude
<dt>\c EXCLUDE <dd> <dt>\c EXCLUDE <dd>
\addindex EXCLUDE \addindex EXCLUDE
The \c EXCLUDE tag can be used to specify files and/or directories that should The \c EXCLUDE tag can be used to specify files and/or directories that should
excluded from the \c INPUT source files. This way you can easily exclude a excluded from the \c INPUT source files. This way you can easily exclude a
subdirectory from a directory tree whose root is specified with the \c INPUT tag. subdirectory from a directory tree whose root is specified with the \c INPUT tag.
\anchor cfg_exclude_patterns
<dt>\c EXCLUDE_PATTERNS <dd> <dt>\c EXCLUDE_PATTERNS <dd>
\addindex EXCLUDE_PATTERNS \addindex EXCLUDE_PATTERNS
If the value of the INPUT tag contains directories, you can use the If the value of the INPUT tag contains directories, you can use the
\c EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude \c EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
certain files from those directories. certain files from those directories.
\anchor cfg_example_path
<dt>\c EXAMPLE_PATH <dd> <dt>\c EXAMPLE_PATH <dd>
\addindex EXAMPLE_PATH \addindex EXAMPLE_PATH
The \c EXAMPLE_PATH tag can be used to specify one or more files or The \c EXAMPLE_PATH tag can be used to specify one or more files or
directories that contain example code fragments that are included (see directories that contain example code fragments that are included (see
the \\include command in section \ref cmdinclude "\\include"). the \\include command in section \ref cmdinclude "\\include").
\anchor cfg_input_filter
<dt>\c INPUT_FILTER <dd> <dt>\c INPUT_FILTER <dd>
\addindex INPUT_FILTER \addindex INPUT_FILTER
The \c INPUT_FILTER tag can be used to specify a program that doxygen should The \c INPUT_FILTER tag can be used to specify a program that doxygen should
...@@ -257,17 +379,20 @@ Below is a list of tags that are recognized for each category. ...@@ -257,17 +379,20 @@ Below is a list of tags that are recognized for each category.
\subsection html_output HTML related options \subsection html_output HTML related options
<dl> <dl>
\anchor cfg_generate_html
<dt>\c GENERATE_HTML <dd> <dt>\c GENERATE_HTML <dd>
\addindex GENERATE_HTML \addindex GENERATE_HTML
If the \c GENERATE_HTML tag is set to \c YES (the default) Doxygen will If the \c GENERATE_HTML tag is set to \c YES (the default) Doxygen will
generate HTML output generate HTML output
\anchor cfg_html_output
<dt>\c HTML_OUTPUT <dd> <dt>\c HTML_OUTPUT <dd>
\addindex HTML_OUTPUT \addindex HTML_OUTPUT
The \c HTML_OUTPUT tag is used to specify where the HTML docs will be put. The \c HTML_OUTPUT tag is used to specify where the HTML docs will be put.
If a relative path is entered the value of \c OUTPUT_DIRECTORY will be If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
put in front of it. If left blank `html' will be used as the default path. put in front of it. If left blank `html' will be used as the default path.
\anchor cfg_html_header
<dt>\c HTML_HEADER <dd> <dt>\c HTML_HEADER <dd>
\addindex HTML_HEADER \addindex HTML_HEADER
The \c HTML_HEADER tag can be used to specify a user defined HTML The \c HTML_HEADER tag can be used to specify a user defined HTML
...@@ -289,6 +414,7 @@ Below is a list of tags that are recognized for each category. ...@@ -289,6 +414,7 @@ Below is a list of tags that are recognized for each category.
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, or only the current date.
\anchor cfg_html_footer
<dt>\c HTML_FOOTER <dd> <dt>\c HTML_FOOTER <dd>
\addindex HTML_FOOTER \addindex HTML_FOOTER
The \c HTML_FOOTER tag can be used to specify a user defined HTML footer for The \c HTML_FOOTER tag can be used to specify a user defined HTML footer for
...@@ -305,6 +431,7 @@ Below is a list of tags that are recognized for each category. ...@@ -305,6 +431,7 @@ Below is a list of tags that are recognized for each category.
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, or only the current date.
\anchor cfg_html_align_members
<dt>\c HTML_ALIGN_MEMBERS <dd> <dt>\c HTML_ALIGN_MEMBERS <dd>
If the \c HTML_ALIGN_MEMBERS tag is set to \c YES, the members of classes, If the \c HTML_ALIGN_MEMBERS tag is set to \c YES, the members of classes,
...@@ -315,6 +442,7 @@ NO a bullet list will be used. ...@@ -315,6 +442,7 @@ NO a bullet list will be used.
Setting this tag to NO will become obsolete in the future, since I only Setting this tag to NO will become obsolete in the future, since I only
intent to support and test the aligned representation. intent to support and test the aligned representation.
\anchor cfg_generate_htmlhelp
<dt>\c GENERATE_HTMLHELP <dd> <dt>\c GENERATE_HTMLHELP <dd>
If the \c GENERATE_HTMLHELP tag is set to \c YES, If the \c GENERATE_HTMLHELP tag is set to \c YES,
...@@ -337,6 +465,7 @@ and you can search for words in the documentation ...@@ -337,6 +465,7 @@ and you can search for words in the documentation
(which basically renders \c doxysearch obsolete on Windows). (which basically renders \c doxysearch obsolete on Windows).
The HTML workshop also contains a viewer for compressed HTML files. The HTML workshop also contains a viewer for compressed HTML files.
\anchor cfg_alphabetical_index
<dt>\c ALPHABETICAL_INDEX <dd> <dt>\c ALPHABETICAL_INDEX <dd>
If the \c ALPHABETICAL_INDEX tag is set to \c YES, an alphabetical index If the \c ALPHABETICAL_INDEX tag is set to \c YES, an alphabetical index
...@@ -348,23 +477,28 @@ a lot of classes, structs, unions or interfaces. ...@@ -348,23 +477,28 @@ a lot of classes, structs, unions or interfaces.
\subsection latex_output LaTeX related options \subsection latex_output LaTeX related options
<dl> <dl>
\anchor cfg_generate_latex
<dt>\c GENERATE_LATEX <dd> <dt>\c GENERATE_LATEX <dd>
\addindex GENERATE_LATEX \addindex GENERATE_LATEX
If the \c GENERATE_LATEX tag is set to \c YES (the default) Doxygen will If the \c GENERATE_LATEX tag is set to \c YES (the default) Doxygen will
generate Latex output. generate Latex output.
\anchor cfg_latex_output
<dt>\c LATEX_OUTPUT <dd> <dt>\c LATEX_OUTPUT <dd>
\addindex LATEX_OUTPUT \addindex LATEX_OUTPUT
The \c LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. The \c LATEX_OUTPUT tag is used to specify where the \f$\mbox{\LaTeX}\f$
docs will be put.
If a relative path is entered the value of \c OUTPUT_DIRECTORY will be If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
put in front of it. If left blank `latex' will be used as the default path. put in front of it. If left blank `latex' will be used as the default path.
\anchor cfg_compact_latex
<dt>\c COMPACT_LATEX <dd> <dt>\c COMPACT_LATEX <dd>
\addindex COMPACT_LATEX \addindex COMPACT_LATEX
If the \c COMPACT_LATEX tag is set to \c YES Doxygen generates more compact If the \c COMPACT_LATEX tag is set to \c YES Doxygen generates more compact
LaTeX documents. This may be useful for small projects and may help to \f$\mbox{\LaTeX}\f$ documents. This may be useful for small projects and may help to
save some trees in general. save some trees in general.
\anchor cfg_paper_type
<dt>\c PAPER_TYPE <dd> <dt>\c PAPER_TYPE <dd>
\addindex PAPER_TYPE \addindex PAPER_TYPE
The PAPER_TYPE tag can be used to set the paper type that is used The PAPER_TYPE tag can be used to set the paper type that is used
...@@ -378,25 +512,64 @@ a lot of classes, structs, unions or interfaces. ...@@ -378,25 +512,64 @@ a lot of classes, structs, unions or interfaces.
</ul> </ul>
If left blank a4wide will be used. If left blank a4wide will be used.
\anchor cfg_extra_packages
<dt>\c EXTRA_PACKAGES <dd> <dt>\c EXTRA_PACKAGES <dd>
\addindex EXTRA_PACKAGES \addindex EXTRA_PACKAGES
The EXTRA_PACKAGES tag can be used to specify one or more LaTeX The EXTRA_PACKAGES tag can be used to specify one or more \f$\mbox{\LaTeX}\f$
package names that should be included in the LaTeX output. package names that should be included in the \f$\mbox{\LaTeX}\f$ output.
To get the times font for instance you can specify To get the times font for instance you can specify
\verbatim \verbatim
EXTRA_PACKAGES = times EXTRA_PACKAGES = times
\endverbatim \endverbatim
If left blank no extra packages will be included. If left blank no extra packages will be included.
\anchor cfg_latex_header
<dt>\c LATEX_HEADER <dd>
\addindex LATEX_HEADER
The \c LATEX_HEADER tag can be used to specify a personal \f$\mbox{\LaTeX}\f$
header for the generated latex document. The header should contain everything
until the first chapter. If it is left blank doxygen will generate a
standard header, which looks as follows for the default
configuration settings:
\verbatim
\documentclass[a4paper]{book}
\usepackage{a4wide}
\usepackage{makeidx}
\usepackage{fancyheadings}
\usepackage{epsfig}
\usepackage{float}
\usepackage{doxygen}
\makeindex
\setcounter{tocdepth}{1}
\setlength{\footrulewidth}{0.4pt}
\begin{document}
\title{Reference Manual}
\author{Generated by Doxygen}
\date{Thu Sep 30 19:58:32 1999}
\maketitle
\pagenumbering{roman}
\clearemptydoublepage
\tableofcontents
\clearemptydoublepage
\pagenumbering{arabic}
\endverbatim
\par Notice:
Only use a user defined header if you know what you are doing!
</dl> </dl>
\subsection man_output Man page related options \subsection man_output Man page related options
<dl> <dl>
\anchor cfg_generate_man
<dt>\c GENERATE_MAN <dd> <dt>\c GENERATE_MAN <dd>
\addindex GENERATE_MAN \addindex GENERATE_MAN
If the \c GENERATE_MAN tag is set to \c YES (the default) Doxygen will If the \c GENERATE_MAN tag is set to \c YES (the default) Doxygen will
generate man pages for classes and files. generate man pages for classes and files.
\anchor cfg_man_output
<dt>\c MAN_OUTPUT <dd> <dt>\c MAN_OUTPUT <dd>
\addindex MAN_OUTPUT \addindex MAN_OUTPUT
The \c MAN_OUTPUT tag is used to specify where the man pages will be put. The \c MAN_OUTPUT tag is used to specify where the man pages will be put.
...@@ -405,6 +578,7 @@ EXTRA_PACKAGES = times ...@@ -405,6 +578,7 @@ EXTRA_PACKAGES = times
A directory man3 will be created inside the directory specified by A directory man3 will be created inside the directory specified by
\c MAN_OUTPUT. \c MAN_OUTPUT.
\anchor cfg_man_extension
<dt>\c MAN_EXTENSION <dd> <dt>\c MAN_EXTENSION <dd>
\addindex MAX_EXTENSION \addindex MAX_EXTENSION
The MAN_EXTENSION tag determines the extension that is added to The MAN_EXTENSION tag determines the extension that is added to
...@@ -414,29 +588,34 @@ EXTRA_PACKAGES = times ...@@ -414,29 +588,34 @@ EXTRA_PACKAGES = times
\subsection config_prepro Preprocessor related options \subsection config_prepro Preprocessor related options
<dl> <dl>
\anchor cfg_enable_preprocessing
<dt>\c ENABLE_PREPROCESSING <dd> <dt>\c ENABLE_PREPROCESSING <dd>
\addindex ENABLE_PREPROCESSING \addindex ENABLE_PREPROCESSING
If the \c ENABLE_PREPROCESSING tag is set to \c YES (the default) Doxygen will If the \c ENABLE_PREPROCESSING tag is set to \c YES (the default) Doxygen will
evaluate all C-preprocessor directives found in the sources and include evaluate all C-preprocessor directives found in the sources and include
files. files.
\anchor cfg_macro_expansion
<dt>\c MACRO_EXPANSION <dd> <dt>\c MACRO_EXPANSION <dd>
\addindex MACRO_EXPANSION \addindex MACRO_EXPANSION
If the \c MACRO_EXPANSION tag is set to \c YES Doxygen will expand all macro If the \c MACRO_EXPANSION tag is set to \c YES Doxygen will expand all macro
names in the source code. If set to \c NO (the default) only conditional names in the source code. If set to \c NO (the default) only conditional
compilation will be performed. compilation will be performed.
\anchor cfg_search_includes
<dt>\c SEARCH_INCLUDES <dd> <dt>\c SEARCH_INCLUDES <dd>
\addindex SEARCH_INCLUDES \addindex SEARCH_INCLUDES
If the \c SEARCH_INCLUDES tag is set to \c YES (the default) the includes files If the \c SEARCH_INCLUDES tag is set to \c YES (the default) the includes files
in the \c INCLUDE_PATH (see below) will be search if a \#include is found. in the \c INCLUDE_PATH (see below) will be search if a \#include is found.
\anchor cfg_include_path
<dt>\c INCLUDE_PATH <dd> <dt>\c INCLUDE_PATH <dd>
\addindex INCLUDE_PATH \addindex INCLUDE_PATH
The \c INCLUDE_PATH tag can be used to specify one or more directories that The \c INCLUDE_PATH tag can be used to specify one or more directories that
contain include files that are not input files but should be processed by contain include files that are not input files but should be processed by
the preprocessor. the preprocessor.
\anchor cfg_predefined
<dt>\c PREDEFINED <dd> <dt>\c PREDEFINED <dd>
\addindex PREDEFINED \addindex PREDEFINED
The \c PREDEFINED tag can be used to specify one or more macro names that The \c PREDEFINED tag can be used to specify one or more macro names that
...@@ -445,6 +624,7 @@ EXTRA_PACKAGES = times ...@@ -445,6 +624,7 @@ EXTRA_PACKAGES = times
<code>name</code> or <code>name=definition</code> (no spaces). <code>name</code> or <code>name=definition</code> (no spaces).
If the definition and the = are omitted =1 is assumed. If the definition and the = are omitted =1 is assumed.
\anchor cfg_expand_only_predef
<dt>\c EXPAND_ONLY_PREDEF <dd> <dt>\c EXPAND_ONLY_PREDEF <dd>
\addindex EXPAND_ONLY_PREDEF \addindex EXPAND_ONLY_PREDEF
If the \c EXPAND_ONLY_PREDEF and \c MACRO_EXPANSION tags are both set to YES If the \c EXPAND_ONLY_PREDEF and \c MACRO_EXPANSION tags are both set to YES
...@@ -456,6 +636,7 @@ EXTRA_PACKAGES = times ...@@ -456,6 +636,7 @@ EXTRA_PACKAGES = times
\subsection config_extref External reference options \subsection config_extref External reference options
<dl> <dl>
\anchor cfg_tagfiles
<dt>\c TAGFILES <dd> <dt>\c TAGFILES <dd>
\addindex TAGFILES \addindex TAGFILES
The \c TAGFILES tag can be used to specify one or more tagfiles. The \c TAGFILES tag can be used to specify one or more tagfiles.
...@@ -467,6 +648,7 @@ EXTRA_PACKAGES = times ...@@ -467,6 +648,7 @@ EXTRA_PACKAGES = times
in the directory in which doxygen is run, you must also specify the in the directory in which doxygen is run, you must also specify the
path to the tagfile here. path to the tagfile here.
\anchor cfg_generate_tagfile
<dt>\c GENERATE_TAGFILE <dd> <dt>\c GENERATE_TAGFILE <dd>
\addindex GENERATE_TAGFILE \addindex GENERATE_TAGFILE
When a file name is specified after \c GENERATE_TAGFILE, doxygen will create When a file name is specified after \c GENERATE_TAGFILE, doxygen will create
...@@ -474,12 +656,14 @@ EXTRA_PACKAGES = times ...@@ -474,12 +656,14 @@ EXTRA_PACKAGES = times
See section \ref doxytag_usage for more information about the usage of See section \ref doxytag_usage for more information about the usage of
tag files. tag files.
\anchor cfg_allexternals
<dt>\c ALLEXTERNALS <dd> <dt>\c ALLEXTERNALS <dd>
\addindex ALLEXTERNALS \addindex ALLEXTERNALS
if the \c ALLEXTERNALS tag is set to \c YES all external class will be listed if the \c ALLEXTERNALS tag is set to \c YES all external class will be listed
in the class index. If set to \c NO only the inherited external classes in the class index. If set to \c NO only the inherited external classes
will be listed. will be listed.
\anchor cfg_perl_path
<dt>\c PERL_PATH <dd> <dt>\c PERL_PATH <dd>
\addindex PERL_PATH \addindex PERL_PATH
The \c PERL_PATH should be the absolute path and name of the perl script The \c PERL_PATH should be the absolute path and name of the perl script
...@@ -489,6 +673,7 @@ EXTRA_PACKAGES = times ...@@ -489,6 +673,7 @@ EXTRA_PACKAGES = times
\subsection config_search Search engine options \subsection config_search Search engine options
<dl> <dl>
\anchor cfg_searchengine
<dt>\c SEARCHENGINE <dd> <dt>\c SEARCHENGINE <dd>
\addindex SEARCHENGINE \addindex SEARCHENGINE
The \c SEARCHENGINE tag specifies whether or not a The \c SEARCHENGINE tag specifies whether or not a
...@@ -496,18 +681,21 @@ EXTRA_PACKAGES = times ...@@ -496,18 +681,21 @@ EXTRA_PACKAGES = times
If set to \c NO or left blank, the values of all other tags in this section If set to \c NO or left blank, the values of all other tags in this section
will be ignored. will be ignored.
\anchor cfg_cgi_name
<dt>\c CGI_NAME <dd> <dt>\c CGI_NAME <dd>
\addindex CGI_NAME \addindex CGI_NAME
The \c CGI_NAME tag should be the name of the CGI script that The \c CGI_NAME tag should be the name of the CGI script that
starts the search engine (<tt>doxysearch</tt>) with the correct parameters. starts the search engine (<tt>doxysearch</tt>) with the correct parameters.
A script with this name will be generated by doxygen. A script with this name will be generated by doxygen.
\anchor cfg_cgi_url
<dt>\c CGI_URL <dd> <dt>\c CGI_URL <dd>
\addindex CGI_URL \addindex CGI_URL
The \c CGI_URL tag should be the absolute URL to the directory where the The \c CGI_URL tag should be the absolute URL to the directory where the
cgi binaries are located. See the documentation of your http daemon for cgi binaries are located. See the documentation of your http daemon for
details. details.
\anchor cfg_doc_url
<dt>\c DOC_URL <dd> <dt>\c DOC_URL <dd>
\addindex DOC_URL \addindex DOC_URL
The \c DOC_URL tag should be the absolute URL to the directory where the The \c DOC_URL tag should be the absolute URL to the directory where the
...@@ -515,17 +703,20 @@ EXTRA_PACKAGES = times ...@@ -515,17 +703,20 @@ EXTRA_PACKAGES = times
documentation, with <tt>file://</tt> prepended to it, will be used. documentation, with <tt>file://</tt> prepended to it, will be used.
This is correct for local viewing only. This is correct for local viewing only.
\anchor cfg_doc_abspath
<dt>\c DOC_ABSPATH <dd> <dt>\c DOC_ABSPATH <dd>
\addindex DOC_ABSPATH \addindex DOC_ABSPATH
The \c DOC_ABSPATH tag should be the absolute path to the directory where the The \c DOC_ABSPATH tag should be the absolute path to the directory where the
documentation is located. If left blank the directory on the local machine documentation is located. If left blank the directory on the local machine
will be used. will be used.
\anchor cfg_bin_abspath
<dt>\c BIN_ABSPATH <dd> <dt>\c BIN_ABSPATH <dd>
\addindex BIN_ABSPATH \addindex BIN_ABSPATH
The \c BIN_ABSPATH tag must point to the directory where the doxysearch binary The \c BIN_ABSPATH tag must point to the directory where the doxysearch binary
is installed. is installed.
\anchor cfg_ext_doc_paths
<dt>\c EXT_DOC_PATHS <dd> <dt>\c EXT_DOC_PATHS <dd>
\addindex EXT_DOC_PATHS \addindex EXT_DOC_PATHS
The \c EXT_DOC_PATHS tag can be used to specify one or more paths to The \c EXT_DOC_PATHS tag can be used to specify one or more paths to
......
%
% $Id$
%
% Copyright (C) 1997-1999 by Dimitri van Heesch.
%
% Permission to use, copy, modify, and distribute this software and its
% documentation under the terms of the GNU General Public License is hereby
% granted. No representations are made about the suitability of this software
% for any purpose. It is provided "as is" without express or implied warranty.
% See the GNU General Public License for more details.
%
% All output generated with Doxygen is not covered by this license.
\NeedsTeXFormat{LaTeX2e} \NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{doxygen} \ProvidesPackage{doxygen}
\RequirePackage{calc} \RequirePackage{calc}
......
\documentclass[a4paper]{article} %
% $Id$
%
% Copyright (C) 1997-1999 by Dimitri van Heesch.
%
% Permission to use, copy, modify, and distribute this software and its
% documentation under the terms of the GNU General Public License is hereby
% granted. No representations are made about the suitability of this software
% for any purpose. It is provided "as is" without express or implied warranty.
% See the GNU General Public License for more details.
%
% All output generated with Doxygen is not covered by this license.
\documentclass[a4paper,ps2pdf]{article}
\usepackage{a4wide} \usepackage{a4wide}
\usepackage{makeidx} \usepackage{makeidx}
\usepackage{fancyheadings} \usepackage{fancyheadings}
\usepackage{epsf} \usepackage{epsf}
\usepackage{doxygen} \usepackage{doxygen}
\usepackage{multicol} \usepackage{multicol}
\usepackage{times}
\usepackage[backref=true,
pagebackref=true,
colorlinks=true,
linkcolor=blue
]{hyperref}
\makeindex \makeindex
\setcounter{tocdepth}{1} \setcounter{tocdepth}{1}
\setlength{\footrulewidth}{0.4pt} \setlength{\footrulewidth}{0.4pt}
...@@ -35,6 +54,7 @@ Written by Dimitri van Heesch\\[2ex] ...@@ -35,6 +54,7 @@ Written by Dimitri van Heesch\\[2ex]
\input{doxytag_usage} \input{doxytag_usage}
\input{doxysearch_usage} \input{doxysearch_usage}
\input{installdox_usage} \input{installdox_usage}
\input{output}
\input{autolink} \input{autolink}
\input{config} \input{config}
\input{commands} \input{commands}
......
...@@ -41,7 +41,11 @@ doxygen <config_file> ...@@ -41,7 +41,11 @@ doxygen <config_file>
\endverbatim \endverbatim
</ol> </ol>
If you also want a search engine to be generated, you should look The \c -s option is optional and can be used suppress the description that
doxygen normally generates for each tag. Try to use this option if you send
me configuration files!
If you also want to use the search engine, you should look
at section \ref doxysearch_usage. at section \ref doxysearch_usage.
*/ */
...@@ -18,12 +18,19 @@ ...@@ -18,12 +18,19 @@
<ol> <ol>
<li><b>How do get information on the index page in HTML?</b> <li><b>How do get information on the index page in HTML?</b>
<p> <p>
There is no real support for title pages at the moment. But you can You should use the \\mainpage command inside a comment block like this:
override the default index page, by using the following comment block:
\verbatim \verbatim
/*! \page index My Personal Index Page /*! \mainpage My Personal Index Page
* *
* This is my index personal index page. * \section intro Introduction
*
* This is the introduction.
*
* \section install Installation
*
* \subsection step1 Step 1: Opening the box
*
* etc...
*/ */
\endverbatim \endverbatim
...@@ -44,6 +51,11 @@ around the blocks that should be hidden and put: ...@@ -44,6 +51,11 @@ around the blocks that should be hidden and put:
\endverbatim \endverbatim
in the config file then all blocks should be skipped by Doxygen as long in the config file then all blocks should be skipped by Doxygen as long
as <code>PREPROCESSING = YES</code>. as <code>PREPROCESSING = YES</code>.
<li><b>How can I make doxygen ignore nasty macro's? </b>
Look at section \ref preprocessing for the answer.
</ol> </ol>
*/ */
...@@ -41,7 +41,8 @@ All output generated by Doxygen is not covered by this license. ...@@ -41,7 +41,8 @@ All output generated by Doxygen is not covered by this license.
Doxygen is a documentation system for C and C++. It can generate an on-line 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 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. The documentation is extracted directly from the of documented source files. There is also some support for generating
man pages. 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 <a href="http://www.linux.org">Linux</a>
platform, but it runs on most other UNIX flavors as well. platform, but it runs on most other UNIX flavors as well.
An executable for Windows 95/NT is also available. An executable for Windows 95/NT is also available.
...@@ -78,6 +79,8 @@ The second part forms a reference manual: ...@@ -78,6 +79,8 @@ The second part forms a reference manual:
<li>Section \ref doxysearch_usage shows how to use the \c doxysearch program. <li>Section \ref doxysearch_usage shows how to use the \c doxysearch program.
<li>Section \ref installdox_usage shows how to use the \c installdox <li>Section \ref installdox_usage shows how to use the \c installdox
script that is generated by Doxygen if you use tag files. script that is generated by Doxygen if you use tag files.
<li>Section \ref output shows how to generate the various output formats
supported by Doxygen.
<li>Section \ref autolink shows how to put links to files, classes, <li>Section \ref autolink shows how to put links to files, classes,
and members in the documentation. and members in the documentation.
<li>Section \ref config shows how to fine-tune doxygen, so it <li>Section \ref config shows how to fine-tune doxygen, so it
...@@ -177,6 +180,8 @@ Matthias Baas, ...@@ -177,6 +180,8 @@ Matthias Baas,
Walter Mueller, Walter Mueller,
William van Dieten, William van Dieten,
Joshua Jensen, Joshua Jensen,
Patrick Aberts,
Jacques Tremblay,
and many others for suggestions, patches and bug reports. and many others for suggestions, patches and bug reports.
</ul> </ul>
*/ */
......
...@@ -150,6 +150,31 @@ Here is a list of the languages and their current maintainers: ...@@ -150,6 +150,31 @@ Here is a list of the languages and their current maintainers:
foltra@puc.cl</a> foltra@puc.cl</a>
</TD> </TD>
</TR> </TR>
<TR BGCOLOR="#ffffff">
<TD>
Finnish
</TD>
<TD>
Olli Korhonen
</TD>
<TD>
<a href="mailto:Olli.Korhonen@ccc.fi">
Olli.Korhonen@ccc.fi</a>
</TD>
</TR>
<TR BGCOLOR="#ffffff">
<TD>
Russian
</TD>
<TD>
Vladimir Vodolazkiy
</TD>
<TD>
<a href="mailto:voldemarus@geocities.com">
voldemarus@geocities.com</a>
</TD>
</TR>
<TR BGCOLOR="#ffffff"> <TR BGCOLOR="#ffffff">
<TD> <TD>
Dutch Dutch
...@@ -192,6 +217,10 @@ Here is a list of the languages and their current maintainers: ...@@ -192,6 +217,10 @@ Here is a list of the languages and their current maintainers:
\hline \hline
Spanish & Francisco Oltra Thennet & {\tt foltra@puc.cl} \\ Spanish & Francisco Oltra Thennet & {\tt foltra@puc.cl} \\
\hline \hline
Finish & Olli Korhonen & {\tt Olli.Korhonen@ccc.fi} \\
\hline
Russian & Vladimir Vodolazkiy & {\tt voldemarus@geocities.com} \\
\hline
Dutch & Dimitri van Heesch & {\tt dimitri@stack.nl} \\ Dutch & Dimitri van Heesch & {\tt dimitri@stack.nl} \\
\hline \hline
\end{tabular} \end{tabular}
......
/******************************************************************************
*
* $Id$
*
* Copyright (C) 1997-1999 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
* granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
* All output generated with Doxygen is not covered by this license.
*
*/
/*! \page output.html
\section output Output Formats
\addindex output formats
The following output formats are \e directly supported by doxygen:
<dl>
<dt><b>HTML</b>
<dd>Generated if GENERATE_HTML is set to YES in the configuration file.
<dt>\f$\mbox{\LaTeX}\f$
<dd>Generated if GENERATE_LATEX is set to YES in the configuration file.
<dt><b>Man pages</b>
<dd>Generated if GENERATE_MAN is set to YES in the configuration file.
</dl>
The following output formats are \e indirectly supported by doxygen:
<dl>
<dt><b>Compressed HTML</b> (a.k.a. Windows 98 help)
<dd>Generated by Microsoft's HTML Help workshop from the HTML output if
\c GENERATE_HTMLHELP is set to \c YES.
<dt><b>Postscript</b>
<dd>Generated from the \f$\mbox{\LaTeX}\f$ output by
running <code>make ps</code> in the output directory.
For the best results \c PDF_HYPERLINKS should be set to \c NO.
<dt><b>PDF</b>\htmlonly &nbsp;&nbsp;&nbsp;\endhtmlonly
<dd>Generated from the \f$\mbox{\LaTeX}\f$ output by
running <code>make pdf</code> in the output directory.
In order to get hyperlinks in the pdf file,
\c PDF_HYPERLINKS should be set to \c YES.
</dl>
*/
...@@ -203,7 +203,7 @@ The one-line comments should contain a brief description, ...@@ -203,7 +203,7 @@ The one-line comments should contain a brief description,
whereas the multi-line comment blocks contain a more detailed description. whereas the multi-line comment blocks contain a more detailed description.
The brief descriptions are included in the member overview of a class, The brief descriptions are included in the member overview of a class,
namespace or file and are printed using a small italic font namespace or file and are printed using a small italic font
(this description can be omitted by setting \c BRIEF_MEMBER_DESC to \c NO in (this description can be omitted by setting \c BRIEF_STDMETHOD_DESC to \c NO in
the config file). By default the brief descriptions are also the first the config file). By default the brief descriptions are also the first
sentence of the detailed description sentence of the detailed description
(this can be changed by setting the \c REPEAT_BRIEF tag to \c NO). (this can be changed by setting the \c REPEAT_BRIEF tag to \c NO).
...@@ -443,7 +443,7 @@ after preprocessing becomes: ...@@ -443,7 +443,7 @@ after preprocessing becomes:
\endverbatim \endverbatim
Notice that doxygen will now expand \e all macro definitions Notice that doxygen will now expand \e all macro definitions
(recursively if needed). This is often too much, therefore doxygen also (recursively if needed). This is often too much. Therefore, doxygen also
allows you to expand only those defines that you explicitly allows you to expand only those defines that you explicitly
specify. For this you have to set the \c EXPAND_ONLY_PREDEF tag to \c YES specify. For this you have to set the \c EXPAND_ONLY_PREDEF tag to \c YES
and specify the macro definitions after the \c PREDEFINED tag. and specify the macro definitions after the \c PREDEFINED tag.
...@@ -462,9 +462,9 @@ of an abstract base class called \c IUnknown: ...@@ -462,9 +462,9 @@ of an abstract base class called \c IUnknown:
/*! The IUnknown interface */ /*! The IUnknown interface */
DECLARE_INTERFACE(IUnknown) DECLARE_INTERFACE(IUnknown)
{ {
MEMBER(HRESULT,QueryInterface) (THIS_ REFIID iid, void **ppv) PURE; STDMETHOD(HRESULT,QueryInterface) (THIS_ REFIID iid, void **ppv) PURE;
MEMBER(ULONG,AddRef) (THIS) PURE; STDMETHOD(ULONG,AddRef) (THIS) PURE;
MEMBER(ULONG,Release) (THIS) PURE; STDMETHOD(ULONG,Release) (THIS) PURE;
}; };
\endverbatim \endverbatim
...@@ -479,7 +479,7 @@ ENABLE_PREPROCESSING = YES ...@@ -479,7 +479,7 @@ ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = YES MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = YES EXPAND_ONLY_PREDEF = YES
PREDEFINED = "DECLARE_INTERFACE(name)=class name" \ PREDEFINED = "DECLARE_INTERFACE(name)=class name" \
"MEMBER(result,name)=virtual result name" \ "STDMETHOD(result,name)=virtual result name" \
"PURE= = 0" \ "PURE= = 0" \
THIS_= \ THIS_= \
THIS= \ THIS= \
......
...@@ -48,8 +48,8 @@ ...@@ -48,8 +48,8 @@
int *(a[20]); int *(a[20]);
\endverbatim \endverbatim
then doxygen will remove the braces and correctly parse the result. then doxygen will remove the braces and correctly parse the result.
<li>Not all names in code fragments that are include in the documentation <li>Not all names in code fragments that are included in the documentation
are replaced by links (for instance when using SOURCE_BROWSER = YES). are replaced by links (for instance when using \c SOURCE_BROWSER = \c YES).
For a part this is because the code parser isn't smart enough at the For a part this is because the code parser isn't smart enough at the
moment. I'll try to improve this in the future. But even with these moment. I'll try to improve this in the future. But even with these
improvements not everthing can be properly linked to the corresponding improvements not everthing can be properly linked to the corresponding
......
...@@ -75,7 +75,7 @@ autolink/html/index.html: autolink.cpp autolink.cfg ...@@ -75,7 +75,7 @@ autolink/html/index.html: autolink.cpp autolink.cfg
tag/html/index.html: tag.cpp tag.cfg tag/html/index.html: tag.cpp tag.cfg
$(DOXYGEN)/bin/doxygen tag.cfg $(DOXYGEN)/bin/doxygen tag.cfg
sed -e "1,1s.perl.$(PERL).g" tag/html/installdox >tag/html/installdox.perl sed -e "1,1s#perl#$(PERL)#g" tag/html/installdox >tag/html/installdox.perl
cd tag/html ; $(PERL) installdox.perl -lexample.tag@../../example/html cd tag/html ; $(PERL) installdox.perl -lexample.tag@../../example/html
restypedef/html/index.html: restypedef.cpp restypedef.cfg restypedef/html/index.html: restypedef.cpp restypedef.cfg
......
...@@ -232,11 +232,11 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -232,11 +232,11 @@ void ClassDef::writeDocumentation(OutputList &ol)
} }
pageTitle+=pageType+" Reference"; pageTitle+=pageType+" Reference";
startFile(ol,fileName,pageTitle); startFile(ol,fileName,pageTitle);
startTitle(ol); startTitle(ol,getOutputFileBase());
//ol.docify(name()+" "+pageType.right(pageType.length()-1)+" "); //ol.docify(name()+" "+pageType.right(pageType.length()-1)+" ");
//parseText(ol,theTranslator->trReference()); //parseText(ol,theTranslator->trReference());
parseText(ol,theTranslator->trCompoundReference(name(),compType)); parseText(ol,theTranslator->trCompoundReference(name(),compType));
endTitle(ol,name()); endTitle(ol,getOutputFileBase(),name());
// write brief description // write brief description
OutputList briefOutput(&ol); OutputList briefOutput(&ol);
...@@ -694,9 +694,9 @@ void ClassDef::writeMemberList(OutputList &ol) ...@@ -694,9 +694,9 @@ void ClassDef::writeMemberList(OutputList &ol)
// do not generate Latex output // do not generate Latex output
ol.disableAllBut(OutputGenerator::Html); ol.disableAllBut(OutputGenerator::Html);
startFile(ol,memListFileName,theTranslator->trMemberList()); startFile(ol,memListFileName,theTranslator->trMemberList());
startTitle(ol); startTitle(ol,0);
parseText(ol,name()+" "+theTranslator->trMemberList()); parseText(ol,name()+" "+theTranslator->trMemberList());
endTitle(ol,0); endTitle(ol,0,0);
parseText(ol,theTranslator->trThisIsTheListOfAllMembers()); parseText(ol,theTranslator->trThisIsTheListOfAllMembers());
ol.writeObjectLink(getReference(),fileName,0,name()); ol.writeObjectLink(getReference(),fileName,0,name());
parseText(ol,theTranslator->trIncludingInheritedMembers()); parseText(ol,theTranslator->trIncludingInheritedMembers());
...@@ -746,7 +746,8 @@ void ClassDef::writeMemberList(OutputList &ol) ...@@ -746,7 +746,8 @@ void ClassDef::writeMemberList(OutputList &ol)
ol.writeListItem(); ol.writeListItem();
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(), ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),
md->anchor(),name); md->anchor(),name);
if ( md->isFunction() || md->isSignal() || md->isSlot() ) if ( md->isFunction() || md->isSignal() || md->isSlot() ||
(md->isFriend() && md->argsString()))
ol.docify(md->argsString()); ol.docify(md->argsString());
else if (md->isEnumerate()) else if (md->isEnumerate())
parseText(ol," "+theTranslator->trEnumName()); parseText(ol," "+theTranslator->trEnumName());
...@@ -786,7 +787,8 @@ void ClassDef::writeMemberList(OutputList &ol) ...@@ -786,7 +787,8 @@ void ClassDef::writeMemberList(OutputList &ol)
memberWritten=TRUE; memberWritten=TRUE;
} }
if ((protect!=Public || md->isStatic() || virt!=Normal || if ((protect!=Public || md->isStatic() || virt!=Normal ||
md->isFriend() || md->isRelated() md->isFriend() || md->isRelated() ||
(md->isInline() && Config::inlineInfoFlag)
) )
&& memberWritten) && memberWritten)
{ {
...@@ -797,6 +799,8 @@ void ClassDef::writeMemberList(OutputList &ol) ...@@ -797,6 +799,8 @@ void ClassDef::writeMemberList(OutputList &ol)
else if (md->isRelated()) sl.append("related"); else if (md->isRelated()) sl.append("related");
else else
{ {
if (Config::inlineInfoFlag && md->isInline())
sl.append("inline");
if (protect==Protected) sl.append("protected"); if (protect==Protected) sl.append("protected");
else if (protect==Private) sl.append("private"); else if (protect==Private) sl.append("private");
if (virt==Virtual) sl.append("virtual"); if (virt==Virtual) sl.append("virtual");
...@@ -831,11 +835,11 @@ void ClassDef::writeIncludeFile(OutputList &ol) ...@@ -831,11 +835,11 @@ void ClassDef::writeIncludeFile(OutputList &ol)
//printf("incFile=%s\n",incFile->absFilePath().data()); //printf("incFile=%s\n",incFile->absFilePath().data());
ol.disableAllBut(OutputGenerator::Html); ol.disableAllBut(OutputGenerator::Html);
startFile(ol,fileName+"-include",name()+" Include File"); startFile(ol,fileName+"-include",name()+" Include File");
startTitle(ol); startTitle(ol,0);
QCString n=incName.copy(); QCString n=incName.copy();
if (incName.isNull()) n=incFile->name(); if (incName.isNull()) n=incFile->name();
parseText(ol,n); parseText(ol,n);
endTitle(ol,0); endTitle(ol,0,0);
parseText(ol,theTranslator->trVerbatimText(incFile->name())); parseText(ol,theTranslator->trVerbatimText(incFile->name()));
ol.writeRuler(); ol.writeRuler();
ol.startCodeFragment(); ol.startCodeFragment();
...@@ -992,15 +996,25 @@ bool ClassDef::hasNonReferenceSuperClass() ...@@ -992,15 +996,25 @@ bool ClassDef::hasNonReferenceSuperClass()
// htmlHelp->decContentsDepth(); // htmlHelp->decContentsDepth();
//} //}
void ClassDef::writeDeclaration(OutputList &ol) void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md)
{ {
//ol.insertMemberAlign(); //ol.insertMemberAlign();
//printf("ClassName=`%s'\n",name().data());
switch(compType) switch(compType)
{ {
case Class: ol.docify("class {"); break; case Class: ol.docify("class"); break;
case Struct: ol.docify("struct {"); break; case Struct: ol.docify("struct"); break;
default: ol.docify("union {"); break; default: ol.docify("union"); break;
} }
int ri=name().findRev("::");
if (ri==-1) ri=name().length();
QCString cn=name().right(name().length()-ri-2);
if (!cn.isEmpty() && cn.at(0)!='@' && md)
{
ol.docify(" ");
ol.writeObjectLink(0,0,md->anchor(),cn);
}
ol.docify(" {");
ol.endMemberItem(FALSE,0,0,FALSE); // TODO: pass correct group parameters ol.endMemberItem(FALSE,0,0,FALSE); // TODO: pass correct group parameters
// insert members of this class // insert members of this class
......
...@@ -39,6 +39,7 @@ class BaseClassList; ...@@ -39,6 +39,7 @@ class BaseClassList;
class MemberInfoList; class MemberInfoList;
class MemberInfoDict; class MemberInfoDict;
class NamespaceDef; class NamespaceDef;
class MemberDef;
class ClassDef : public Definition class ClassDef : public Definition
{ {
...@@ -76,7 +77,7 @@ class ClassDef : public Definition ...@@ -76,7 +77,7 @@ class ClassDef : public Definition
void writeMemberList(OutputList &ol); void writeMemberList(OutputList &ol);
void writeIncludeFile(OutputList &ol); void writeIncludeFile(OutputList &ol);
//void writeMembersToContents(); //void writeMembersToContents();
void writeDeclaration(OutputList &ol); void writeDeclaration(OutputList &ol,MemberDef *md);
bool addExample(const char *anchor,const char *name, const char *file); bool addExample(const char *anchor,const char *name, const char *file);
bool hasExamples(); bool hasExamples();
//void writeExample(OutputList &ol); //void writeExample(OutputList &ol);
...@@ -84,9 +85,9 @@ class ClassDef : public Definition ...@@ -84,9 +85,9 @@ class ClassDef : public Definition
Protection protection() const { return prot; } Protection protection() const { return prot; }
/*! a link to this class is possible within this project */ /*! a link to this class is possible within this project */
bool isLinkableInProject() bool isLinkableInProject()
{ int i = name().findRev("::"); { //int i = name().findRev("::");
if (i==-1) i=0; else i+=2; //if (i==-1) i=0; else i+=2;
return !name().isEmpty() && name().at(i)!='@' && return !name().isEmpty() && name().find('@')==-1 &&
(prot!=Private || Config::extractPrivateFlag) && (prot!=Private || Config::extractPrivateFlag) &&
hasDocumentation() && !isReference(); hasDocumentation() && !isReference();
} }
...@@ -167,6 +168,7 @@ struct BaseClassDef ...@@ -167,6 +168,7 @@ struct BaseClassDef
class BaseClassList : public QList<BaseClassDef> class BaseClassList : public QList<BaseClassDef>
{ {
public: public:
~BaseClassList() {}
int compareItems(GCI item1,GCI item2) int compareItems(GCI item1,GCI item2)
{ {
ClassDef *c1=((BaseClassDef *)item1)->classDef; ClassDef *c1=((BaseClassDef *)item1)->classDef;
......
...@@ -213,7 +213,10 @@ static bool getLink(const char *className, ...@@ -213,7 +213,10 @@ static bool getLink(const char *className,
// exampleFile.data()); // exampleFile.data());
if (md->addExample(anchor,exampleName,exampleFile)) if (md->addExample(anchor,exampleName,exampleFile))
{ {
bool latexEnabled = result.isEnabled(OutputGenerator::Latex);
if (latexEnabled) result.disable(OutputGenerator::Latex);
result.writeAnchor(anchor); result.writeAnchor(anchor);
if (latexEnabled) result.enable(OutputGenerator::Latex);
anchorCount++; anchorCount++;
} }
} }
...@@ -222,6 +225,7 @@ static bool getLink(const char *className, ...@@ -222,6 +225,7 @@ static bool getLink(const char *className,
if (d) if (d)
{ {
//printf("d->getOutputBase()=`%s' name=`%s'\n",d->getOutputFileBase().data(),md->name().data());
result.writeCodeLink(d->getReference(),d->getOutputFileBase(), result.writeCodeLink(d->getReference(),d->getOutputFileBase(),
md->anchor(),memberName); md->anchor(),memberName);
return TRUE; return TRUE;
...@@ -384,7 +388,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]* ...@@ -384,7 +388,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
if ((fd=findFileDef(&inputNameDict,yytext,ambig)) && if ((fd=findFileDef(&inputNameDict,yytext,ambig)) &&
fd->isLinkable()) fd->isLinkable())
{ {
code->writeCodeLink(0,fd->getOutputFileBase(),0,yytext); code->writeCodeLink(fd->getReference(),fd->getOutputFileBase(),0,yytext);
} }
else else
{ {
......
...@@ -39,6 +39,7 @@ struct Config ...@@ -39,6 +39,7 @@ struct Config
static QCString manOutputDir; // the directory to put the man pages static QCString manOutputDir; // the directory to put the man pages
static QCString outputLanguage; // the output language static QCString outputLanguage; // the output language
static QCString headerFile; // the name of the personal HTML header static QCString headerFile; // the name of the personal HTML header
static QCString latexHeaderFile; // the name of the personal LaTeX header
static QCString footerFile; // the name of the personal HTML footer static QCString footerFile; // the name of the personal HTML footer
static QCString cgiName; // the name of the CGI binary static QCString cgiName; // the name of the CGI binary
static QCString cgiURL; // the absolute URL to the CGI binary static QCString cgiURL; // the absolute URL to the CGI binary
...@@ -91,6 +92,9 @@ struct Config ...@@ -91,6 +92,9 @@ struct Config
static bool autoBriefFlag; // javadoc comments behaves as Qt comments. static bool autoBriefFlag; // javadoc comments behaves as Qt comments.
static bool htmlHelpFlag; // should html help files be generated? static bool htmlHelpFlag; // should html help files be generated?
static bool alphaIndexFlag; // should an alphabetical index be generated? static bool alphaIndexFlag; // should an alphabetical index be generated?
static bool pdfHyperFlag; // generate latex prepared creating hyperlinked pdfs.
static bool inheritDocsFlag; // inheritance of documentation enabled?
static bool inlineInfoFlag; // show info about inline members?
}; };
#endif #endif
...@@ -71,6 +71,7 @@ QCString Config::latexOutputDir; ...@@ -71,6 +71,7 @@ QCString Config::latexOutputDir;
QCString Config::manOutputDir; QCString Config::manOutputDir;
QCString Config::outputLanguage; QCString Config::outputLanguage;
QCString Config::headerFile; QCString Config::headerFile;
QCString Config::latexHeaderFile;
QCString Config::footerFile; QCString Config::footerFile;
QCString Config::cgiName; QCString Config::cgiName;
QCString Config::cgiURL; QCString Config::cgiURL;
...@@ -111,6 +112,7 @@ bool Config::caseSensitiveNames = FALSE; ...@@ -111,6 +112,7 @@ bool Config::caseSensitiveNames = FALSE;
bool Config::includeSourceFlag = FALSE; bool Config::includeSourceFlag = FALSE;
bool Config::htmlHelpFlag = FALSE; bool Config::htmlHelpFlag = FALSE;
bool Config::alphaIndexFlag = FALSE; bool Config::alphaIndexFlag = FALSE;
bool Config::pdfHyperFlag = FALSE;
bool Config::autoBriefFlag = TRUE; bool Config::autoBriefFlag = TRUE;
bool Config::warningFlag = TRUE; bool Config::warningFlag = TRUE;
bool Config::generateHtml = TRUE; bool Config::generateHtml = TRUE;
...@@ -123,6 +125,8 @@ bool Config::classDiagramFlag = TRUE; ...@@ -123,6 +125,8 @@ bool Config::classDiagramFlag = TRUE;
bool Config::repeatBriefFlag = TRUE; bool Config::repeatBriefFlag = TRUE;
bool Config::verbatimHeaderFlag = TRUE; bool Config::verbatimHeaderFlag = TRUE;
bool Config::htmlAlignMemberFlag = TRUE; bool Config::htmlAlignMemberFlag = TRUE;
bool Config::inheritDocsFlag = TRUE;
bool Config::inlineInfoFlag = TRUE;
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* *
...@@ -180,6 +184,7 @@ static int yyread(char *buf,int max_size) ...@@ -180,6 +184,7 @@ static int yyread(char *buf,int max_size)
<Start>"LATEX_OUTPUT"[ \t]*"=" { BEGIN(GetString); s=&Config::latexOutputDir; } <Start>"LATEX_OUTPUT"[ \t]*"=" { BEGIN(GetString); s=&Config::latexOutputDir; }
<Start>"HTML_HEADER"[ \t]*"=" { BEGIN(GetString); s=&Config::headerFile; } <Start>"HTML_HEADER"[ \t]*"=" { BEGIN(GetString); s=&Config::headerFile; }
<Start>"HTML_FOOTER"[ \t]*"=" { BEGIN(GetString); s=&Config::footerFile; } <Start>"HTML_FOOTER"[ \t]*"=" { BEGIN(GetString); s=&Config::footerFile; }
<Start>"LATEX_HEADER"[ \t]*"=" { BEGIN(GetString); s=&Config::latexHeaderFile; }
<Start>"CGI_NAME"[ \t]*"=" { BEGIN(GetString); s=&Config::cgiName; } <Start>"CGI_NAME"[ \t]*"=" { BEGIN(GetString); s=&Config::cgiName; }
<Start>"CGI_URL"[ \t]*"=" { BEGIN(GetString); s=&Config::cgiURL; } <Start>"CGI_URL"[ \t]*"=" { BEGIN(GetString); s=&Config::cgiURL; }
<Start>"DOC_URL"[ \t]*"=" { BEGIN(GetString); s=&Config::docURL; } <Start>"DOC_URL"[ \t]*"=" { BEGIN(GetString); s=&Config::docURL; }
...@@ -232,6 +237,9 @@ static int yyread(char *buf,int max_size) ...@@ -232,6 +237,9 @@ static int yyread(char *buf,int max_size)
<Start>"JAVADOC_AUTOBRIEF"[ \t]*"=" { BEGIN(GetBool); b=&Config::autoBriefFlag; } <Start>"JAVADOC_AUTOBRIEF"[ \t]*"=" { BEGIN(GetBool); b=&Config::autoBriefFlag; }
<Start>"GENERATE_HTMLHELP"[ \t]*"=" { BEGIN(GetBool); b=&Config::htmlHelpFlag; } <Start>"GENERATE_HTMLHELP"[ \t]*"=" { BEGIN(GetBool); b=&Config::htmlHelpFlag; }
<Start>"ALPHABETICAL_INDEX"[ \t]*"=" { BEGIN(GetBool); b=&Config::alphaIndexFlag; } <Start>"ALPHABETICAL_INDEX"[ \t]*"=" { BEGIN(GetBool); b=&Config::alphaIndexFlag; }
<Start>"PDF_HYPERLINKS"[ \t]*"=" { BEGIN(GetBool); b=&Config::pdfHyperFlag; }
<Start>"INHERIT_DOCS"[ \t]*"=" { BEGIN(GetBool); b=&Config::inheritDocsFlag; }
<Start>"INLINE_INFO"[ \t]*"=" { BEGIN(GetBool); b=&Config::inlineInfoFlag; }
<Start>[a-z_A-Z0-9]+ { err("Warning: ignoring unknown tag `%s' at line %d\n",yytext,yyLineNr); } <Start>[a-z_A-Z0-9]+ { err("Warning: ignoring unknown tag `%s' at line %d\n",yytext,yyLineNr); }
<GetString,GetBool>\n { yyLineNr++; BEGIN(Start); } <GetString,GetBool>\n { yyLineNr++; BEGIN(Start); }
<GetStrList>\n { <GetStrList>\n {
...@@ -375,6 +383,7 @@ void Config::init() ...@@ -375,6 +383,7 @@ void Config::init()
Config::manOutputDir ="man"; Config::manOutputDir ="man";
Config::outputLanguage = "English"; Config::outputLanguage = "English";
Config::headerFile.resize(0); Config::headerFile.resize(0);
Config::latexHeaderFile.resize(0);
Config::footerFile.resize(0); Config::footerFile.resize(0);
Config::cgiName = "search.cgi"; Config::cgiName = "search.cgi";
Config::cgiURL.resize(0); Config::cgiURL.resize(0);
...@@ -415,6 +424,7 @@ void Config::init() ...@@ -415,6 +424,7 @@ void Config::init()
Config::includeSourceFlag = FALSE; Config::includeSourceFlag = FALSE;
Config::htmlHelpFlag = FALSE; Config::htmlHelpFlag = FALSE;
Config::alphaIndexFlag = FALSE; Config::alphaIndexFlag = FALSE;
Config::pdfHyperFlag = FALSE;
Config::warningFlag = TRUE; Config::warningFlag = TRUE;
Config::generateHtml = TRUE; Config::generateHtml = TRUE;
Config::generateLatex = TRUE; Config::generateLatex = TRUE;
...@@ -427,6 +437,8 @@ void Config::init() ...@@ -427,6 +437,8 @@ void Config::init()
Config::verbatimHeaderFlag = TRUE; Config::verbatimHeaderFlag = TRUE;
Config::htmlAlignMemberFlag = TRUE; Config::htmlAlignMemberFlag = TRUE;
Config::autoBriefFlag = TRUE; Config::autoBriefFlag = TRUE;
Config::inheritDocsFlag = TRUE;
Config::inlineInfoFlag = TRUE;
} }
void writeTemplateConfig(QFile *f,bool sl) void writeTemplateConfig(QFile *f,bool sl)
...@@ -636,7 +648,7 @@ void writeTemplateConfig(QFile *f,bool sl) ...@@ -636,7 +648,7 @@ void writeTemplateConfig(QFile *f,bool sl)
if (!sl) if (!sl)
{ {
t << "\n"; t << "\n";
t << "# If the JAVADOC_NO_AUTOBRIEF is set to YES (the default) then Doxygen\n"; t << "# If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen\n";
t << "# will interpret the first line (until the first dot) of a JavaDoc-style\n"; t << "# will interpret the first line (until the first dot) of a JavaDoc-style\n";
t << "# comment as the brief description. If set to NO, the Javadoc-style will\n"; t << "# comment as the brief description. If set to NO, the Javadoc-style will\n";
t << "# behave just like the Qt-style comments.\n"; t << "# behave just like the Qt-style comments.\n";
...@@ -644,6 +656,23 @@ void writeTemplateConfig(QFile *f,bool sl) ...@@ -644,6 +656,23 @@ void writeTemplateConfig(QFile *f,bool sl)
} }
t << "JAVADOC_AUTOBRIEF = YES\n"; t << "JAVADOC_AUTOBRIEF = YES\n";
if (!sl) if (!sl)
{
t << "\n";
t << "# if the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n";
t << "# member inherits the documentation from any documented member that it\n";
t << "# reimplements.\n";
t << "\n";
}
t << "INHERIT_DOCS = YES\n";
if (!sl)
{
t << "\n";
t << "# if the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n";
t << "# is inserted in the documentation for inline members.\n";
t << "\n";
}
t << "INLINE_INFO = YES\n";
if (!sl)
{ {
t << "\n"; t << "\n";
} }
...@@ -839,6 +868,26 @@ void writeTemplateConfig(QFile *f,bool sl) ...@@ -839,6 +868,26 @@ void writeTemplateConfig(QFile *f,bool sl)
} }
t << "EXTRA_PACKAGES =\n"; t << "EXTRA_PACKAGES =\n";
if (!sl) if (!sl)
{
t << "\n";
t << "# The LATEX_HEADER tag can be used to specify a personal LaTeX header for \n";
t << "# the generated latex document. The header should contain everything until\n";
t << "# the first chapter. If it is left blank doxygen will generate a \n";
t << "# standard header. Notice: only use this tag if you know what you are doing!\n";
t << "\n";
}
t << "LATEX_HEADER =\n";
if (!sl)
{
t << "\n";
t << "# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n";
t << "# is prepared for conversion to pdf (using ps2pdf). The pdf file will\n";
t << "# contain links (just like the HTML output) instead of page references\n";
t << "# This makes the output suitable for online browsing using a pdf viewer.\n";
t << "\n";
}
t << "PDF_HYPERLINKS = NO\n";
if (!sl)
{ {
t << "\n"; t << "\n";
} }
...@@ -1177,6 +1226,17 @@ void checkConfig() ...@@ -1177,6 +1226,17 @@ void checkConfig()
exit(1); exit(1);
} }
} }
// Test to see if LaTeX header is valid
if (Config::latexHeaderFile.length()>0)
{
QFileInfo fi(Config::latexHeaderFile);
if (!fi.exists())
{
err("Error: tag LATEX_HEADER: header file `%s' "
"does not exist\n",Config::latexHeaderFile.data());
exit(1);
}
}
// check include path // check include path
char *s=Config::includePath.first(); char *s=Config::includePath.first();
while (s) while (s)
......
...@@ -171,11 +171,11 @@ ID [a-z_A-Z][a-z_A-Z0-9]* ...@@ -171,11 +171,11 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
<Template>. { <Template>. {
name+=*yytext; name+=*yytext;
} }
<Operator>{B}*"()"{B}*"<>"{B}*/"(" { <Operator>{B}*"("{B}*")"{B}*"<>"{B}*/"(" {
name+="() <>"; name+="() <>";
BEGIN(ReadArgs); BEGIN(ReadArgs);
} }
<Operator>{B}*"()"{B}*/"(" { <Operator>{B}*"("{B}*")"{B}*/"(" {
name+="()"; name+="()";
BEGIN(ReadArgs); BEGIN(ReadArgs);
} }
......
...@@ -73,3 +73,17 @@ void Definition::addSectionsToDefinition(QList<QCString> *anchorList) ...@@ -73,3 +73,17 @@ void Definition::addSectionsToDefinition(QList<QCString> *anchorList)
s=anchorList->next(); s=anchorList->next();
} }
} }
void Definition::setBriefDescription(const char *b)
{
brief=QCString(b).stripWhiteSpace();
int bl=brief.length();
if (bl>0) // add puntuation if needed
{
switch(brief.at(bl-1))
{
case '.': case '!': case '?': break;
default: brief+='.'; break;
}
}
}
...@@ -50,19 +50,7 @@ class Definition ...@@ -50,19 +50,7 @@ class Definition
/*! sets the brief description of this definition to \a b. /*! sets the brief description of this definition to \a b.
* A dot is added to the sentence if not available. * A dot is added to the sentence if not available.
*/ */
void setBriefDescription(const char *b) void setBriefDescription(const char *b);
{
brief=((QCString) b).stripWhiteSpace();
int bl=brief.length();
if (bl>0) // add puntuation if needed
{
switch(brief.at(bl-1))
{
case '.': case '!': case '?': break;
default: brief+='.'; break;
}
}
}
/*! returns TRUE iff the definition is documented */ /*! returns TRUE iff the definition is documented */
virtual bool hasDocumentation() virtual bool hasDocumentation()
{ return !doc.isNull() || !brief.isNull() || Config::extractAllFlag; } { return !doc.isNull() || !brief.isNull() || Config::extractAllFlag; }
......
...@@ -90,6 +90,8 @@ FormulaDict formulaNameDict(1009); // dictionary of the label name of all f ...@@ -90,6 +90,8 @@ FormulaDict formulaNameDict(1009); // dictionary of the label name of all f
// a member group // a member group
OutputList *outputList; // list of output generating objects OutputList *outputList; // list of output generating objects
PageInfo *mainPage=0;
//bool unrelatedFunctionsUsed; //bool unrelatedFunctionsUsed;
...@@ -357,8 +359,10 @@ static bool addNamespace(Entry *root,ClassDef *cd) ...@@ -357,8 +359,10 @@ static bool addNamespace(Entry *root,ClassDef *cd)
if (e->section==Entry::NAMESPACE_SEC) if (e->section==Entry::NAMESPACE_SEC)
{ {
NamespaceDef *nd=0; NamespaceDef *nd=0;
if (!e->name.isEmpty() && e->name.at(0)!='@' && //printf("addNameSpace() trying: %s\n",e->name.data());
(nd=namespaceDict[e->name]) QCString nsName = stripAnnonymousNamespaceScope(e->name);
if (!nsName.isEmpty() && nsName.at(0)!='@' &&
(nd=namespaceDict[nsName])
) )
{ {
cd->setNamespace(nd); cd->setNamespace(nd);
...@@ -393,7 +397,7 @@ void buildClassList(Entry *root) ...@@ -393,7 +397,7 @@ void buildClassList(Entry *root)
} }
else else
{ {
fullName=stripAnnonymousScope(fullName); fullName=stripAnnonymousNamespaceScope(fullName);
//printf("new class with name %s\n",fullName.data()); //printf("new class with name %s\n",fullName.data());
bool ambig; bool ambig;
...@@ -506,14 +510,8 @@ void buildNamespaceList(Entry *root) ...@@ -506,14 +510,8 @@ void buildNamespaceList(Entry *root)
root->name.length()>0 root->name.length()>0
) )
{ {
QCString fullName=root->name.copy(); QCString fullName=stripAnnonymousNamespaceScope(root->name.copy());
if (fullName.length()==0) if (fullName.length()>0)
{
// this should not be called
warn("Warning: invalid namespace found in file %s at %d\n",
root->fileName.data(),root->startLine);
}
else
{ {
//printf("Found namespace %s in %s at line %d\n",root->name.data(), //printf("Found namespace %s in %s at line %d\n",root->name.data(),
// root->fileName.data(), root->startLine); // root->fileName.data(), root->startLine);
...@@ -596,6 +594,8 @@ void buildNamespaceList(Entry *root) ...@@ -596,6 +594,8 @@ void buildNamespaceList(Entry *root)
} }
} }
//----------------------------------------------------------------------
static MemberDef *addVariableToClass(Entry *root,ClassDef *cd, static MemberDef *addVariableToClass(Entry *root,ClassDef *cd,
MemberDef::MemberType mtype,const QCString &scope,const QCString &name, MemberDef::MemberType mtype,const QCString &scope,const QCString &name,
bool fromAnnScope,int indentDepth,MemberDef *fromAnnMemb) bool fromAnnScope,int indentDepth,MemberDef *fromAnnMemb)
...@@ -642,7 +642,8 @@ static MemberDef *addVariableToClass(Entry *root,ClassDef *cd, ...@@ -642,7 +642,8 @@ static MemberDef *addVariableToClass(Entry *root,ClassDef *cd,
MemberDef *md=mn->first(); MemberDef *md=mn->first();
while (md) while (md)
{ {
if (md->memberClass()==cd) // member already in the scope if (md->memberClass()==cd && root->type==md->typeString())
// member already in the scope
{ {
addMemberDocs(root,md,def,FALSE); addMemberDocs(root,md,def,FALSE);
return md; return md;
...@@ -668,9 +669,6 @@ static MemberDef *addVariableToClass(Entry *root,ClassDef *cd, ...@@ -668,9 +669,6 @@ static MemberDef *addVariableToClass(Entry *root,ClassDef *cd,
// add the member to the global list // add the member to the global list
if (mn) if (mn)
{ {
//printf("Member already found! %s\n",md->name());
//addMemberDocs(root,mn->first(),def,FALSE);
//delete md;
mn->inSort(md); mn->inSort(md);
} }
else // new variable name else // new variable name
...@@ -689,6 +687,107 @@ static MemberDef *addVariableToClass(Entry *root,ClassDef *cd, ...@@ -689,6 +687,107 @@ static MemberDef *addVariableToClass(Entry *root,ClassDef *cd,
return md; return md;
} }
//----------------------------------------------------------------------
static MemberDef *addVariableToFile(Entry *root,MemberDef::MemberType mtype,
const QCString &scope,const QCString &name,
bool fromAnnScope,int indentDepth,MemberDef *fromAnnMemb)
{
Debug::print(Debug::Variables,0,
" global variable:\n"
" type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d\n",
root->type.data(),
scope.data(),
name.data(),
root->args.data(),
root->protection
);
// new global variable, enum value or typedef
MemberDef *md=new MemberDef(root->type,name,root->args,0,
Public, Normal,root->stat,FALSE,
mtype,0,0);
md->setDefFile(root->fileName);
md->setDefLine(root->startLine);
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->addSectionsToDefinition(root->anchors);
md->setFromAnnonymousScope(fromAnnScope);
md->setFromAnnonymousMember(fromAnnMemb);
md->setIndentDepth(indentDepth);
// see if the function is inside a namespace
NamespaceDef *nd = 0;
if (scope.length()>0)
{
nd = namespaceDict[scope];
}
if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
{
nd->insertMember(md);
md->setNamespace(nd);
}
else
{
// find file definition
FileDef *fd=0;
bool ambig;
if (root->fileName.length()>0 &&
(fd=findFileDef(&inputNameDict,root->fileName,ambig))
)
{
fd->insertMember(md);
md->setFileDef(fd);
}
}
QCString def;
// determine the definition of the global variable
if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
// variable is inside a namespace, so put the scope before the name
{
if (root->type.length()>0)
{
def=root->type+" "+nd->name()+"::"+name+root->args;
}
else
{
def=nd->name()+"::"+name+root->args;
}
}
else
{
if (root->type.length()>0)
{
if (name.at(0)=='@') // dummy variable representing annonymous union
def=root->type;
else
def=root->type+" "+name+root->args;
}
else
{
def=name+root->args;
}
}
if (def.left(7)=="static ") def=def.right(def.length()-7);
md->setDefinition(def);
MemberName *mn = 0;
// add member definition to the list of globals
if ((mn=functionNameDict[name]))
{
mn->inSort(md);
}
else
{
mn = new MemberName(name);
mn->inSort(md);
functionNameDict.insert(name,mn);
functionNameList.inSort(mn);
}
return md;
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// Searches the Entry tree for Variable documentation sections. // Searches the Entry tree for Variable documentation sections.
// If found they are stored in their class or in the global list. // If found they are stored in their class or in the global list.
...@@ -698,7 +797,7 @@ void buildVarList(Entry *root) ...@@ -698,7 +797,7 @@ void buildVarList(Entry *root)
QRegExp re("([^)]*)"); QRegExp re("([^)]*)");
int i=-1; int i=-1;
if (root->name.length()>0 && if (root->name.length()>0 &&
root->type!="class" && root->type!="class" && root->type!="interface" &&
( (
(root->section==Entry::VARIABLE_SEC (root->section==Entry::VARIABLE_SEC
) || ) ||
...@@ -751,7 +850,8 @@ void buildVarList(Entry *root) ...@@ -751,7 +850,8 @@ void buildVarList(Entry *root)
Entry *p = root->parent; Entry *p = root->parent;
while ((p->section & Entry::SCOPE_MASK)) while ((p->section & Entry::SCOPE_MASK))
{ {
QCString scopeName = stripAnnonymousScope(p->name); //QCString scopeName = stripAnnonymousScope(p->name);
QCString scopeName = p->name.copy();
if (!scopeName.isEmpty()) if (!scopeName.isEmpty())
{ {
scope.prepend(scopeName); scope.prepend(scopeName);
...@@ -769,6 +869,10 @@ void buildVarList(Entry *root) ...@@ -769,6 +869,10 @@ void buildVarList(Entry *root)
// scope=scope.left(i); // scope=scope.left(i);
//} //}
MemberDef::MemberType mtype;
QCString type=root->type.stripWhiteSpace();
ClassDef *cd=0;
int ni; int ni;
if ((ni=root->name.findRev("::"))!=-1) goto nextMember; if ((ni=root->name.findRev("::"))!=-1) goto nextMember;
/* skip this member, because it is a /* skip this member, because it is a
...@@ -778,9 +882,6 @@ void buildVarList(Entry *root) ...@@ -778,9 +882,6 @@ void buildVarList(Entry *root)
* inserted in the correct list! * inserted in the correct list!
*/ */
MemberDef::MemberType mtype;
// NamespaceDef *nd = 0;
QCString type=root->type.stripWhiteSpace();
if (type=="@") if (type=="@")
mtype=MemberDef::EnumValue; mtype=MemberDef::EnumValue;
else if (type.left(8)=="typedef ") else if (type.left(8)=="typedef ")
...@@ -790,17 +891,34 @@ void buildVarList(Entry *root) ...@@ -790,17 +891,34 @@ void buildVarList(Entry *root)
else else
mtype=MemberDef::Variable; mtype=MemberDef::Variable;
ClassDef *cd=0; //printf("name=`%s' scope=%s\n",name.data(),scope.data());
QCString classScope=stripAnnonymousNamespaceScope(scope);
QCString annScopePrefix=scope.left(scope.length()-classScope.length());
scope=classScope;
if (scope.length()>0 && name.length()>0 && (cd=getClass(scope))) if (scope.length()>0 && name.length()>0 && (cd=getClass(scope)))
{ {
MemberDef *md=0; MemberDef *md=0;
// if cd is an annonymous scope we insert the member // if cd is an annonymous scope we insert the member
// into a non-annonymous scope as well. // into a non-annonymous scope as well.
int indentDepth=0; int indentDepth=0;
if (scope.find('@')!=-1) int si=scope.find('@');
if (si!=-1)
{ {
QCString pScope = scope.copy(); //printf("name=`%s' scope=%s\n",name.data(),scope.data());
QCString pScope;
ClassDef *pcd=0; ClassDef *pcd=0;
pScope = scope.left(QMAX(si-2,0));
indentDepth = scope.right(scope.length()-si).contains("::")+1;
#if 0
// Find the last annonymous scope while search from right to left
// Keep track of the number of scope names we skipped.
while ((i=pScope.findRev("::"))!=-1 && (int)pScope.length()>i+2 &&
pScope.at(i+2)!='@'
)
{
pScope=pScope.left(i);
indentDepth++;
}
while ((i=pScope.findRev("::"))!=-1 && (int)pScope.length()>i+2 && while ((i=pScope.findRev("::"))!=-1 && (int)pScope.length()>i+2 &&
pScope.at(i+2)=='@' pScope.at(i+2)=='@'
) )
...@@ -808,102 +926,37 @@ void buildVarList(Entry *root) ...@@ -808,102 +926,37 @@ void buildVarList(Entry *root)
pScope=pScope.left(i); pScope=pScope.left(i);
indentDepth++; indentDepth++;
} }
if ((pcd=getClass(pScope))) if (pScope.length()>0 && pScope.at(0)=='@')
{
pScope.resize(0);
indentDepth++;
}
#endif
if (!pScope.isEmpty())
pScope.prepend(annScopePrefix);
else if (annScopePrefix.length()>2)
pScope=annScopePrefix.left(annScopePrefix.length()-2);
//printf("pScope=`%s'\n",pScope.data());
if (!name.isEmpty() && name.at(0)!='@')
{ {
//printf("Inserting member in parent scope!\n"); if (pScope.length()>0 && (pcd=getClass(pScope)))
md=addVariableToClass(root,pcd,mtype,pScope,name,TRUE,indentDepth,0); {
//printf("Inserting member in parent scope!\n");
md=addVariableToClass(root,pcd,mtype,pScope,name,TRUE,indentDepth,0);
}
else // annonymous scope inside namespace or file => put variable in the global scope
{
//printf("Inserting member in global scope %s!\n",pScope.data());
md=addVariableToFile(root,mtype,pScope,name,!pScope.isEmpty(),indentDepth,0);
}
} }
} }
addVariableToClass(root,cd,mtype,scope,name,FALSE,indentDepth,md); addVariableToClass(root,cd,mtype,scope,name,FALSE,indentDepth,md);
} }
else if (name.length()>0) // global variable else if (name.length()>0) // global variable
{ {
Debug::print(Debug::Variables,0, //printf("Inserting member in global scope %s!\n",scope.data());
" global variable:\n" addVariableToFile(root,mtype,scope,name,FALSE,0,0);
" type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d\n",
root->type.data(),
scope.data(),
name.data(),
root->args.data(),
root->protection
);
// new global variable, enum value or typedef
MemberDef *md=new MemberDef(root->type,name,root->args,0,
Public, Normal,root->stat,FALSE,
mtype,0,0);
md->setDefFile(root->fileName);
md->setDefLine(root->startLine);
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->addSectionsToDefinition(root->anchors);
QCString def;
// see if the function is inside a namespace
NamespaceDef *nd = 0;
if (scope.length()>0)
{
nd = namespaceDict[scope];
}
if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
{
nd->insertMember(md);
md->setNamespace(nd);
}
else
{
// find file definition
FileDef *fd=0;
bool ambig;
if (root->fileName.length()>0 &&
(fd=findFileDef(&inputNameDict,root->fileName,ambig))
)
{
fd->insertMember(md);
md->setFileDef(fd);
}
}
// determine the definition of the global variable
if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
// variable is inside a namespace, so put the scope before the name
{
if (root->type.length()>0)
{
def=root->type+" "+nd->name()+"::"+name+root->args;
}
else
{
def=nd->name()+"::"+name+root->args;
}
}
else
{
if (root->type.length()>0)
{
def=root->type+" "+name+root->args;
}
else
{
def=name+root->args;
}
}
if (def.left(7)=="static ") def=def.right(def.length()-7);
md->setDefinition(def);
MemberName *mn;
// add member definition to the list of globals
if ((mn=functionNameDict[name]))
{
mn->inSort(md);
}
else
{
mn = new MemberName(name);
mn->inSort(md);
functionNameDict.insert(name,mn);
functionNameList.inSort(mn);
}
} }
} }
nextMember: nextMember:
...@@ -948,7 +1001,7 @@ void buildMemberList(Entry *root) ...@@ -948,7 +1001,7 @@ void buildMemberList(Entry *root)
//printf("root->parent=`%s' cd=%p root->type.find(re,0)=%d\n", //printf("root->parent=`%s' cd=%p root->type.find(re,0)=%d\n",
// root->parent->name.data(),getClass(root->parent->name), // root->parent->name.data(),getClass(root->parent->name),
// root->type.find(re,0)); // root->type.find(re,0));
QCString scope=stripAnnonymousScope(root->parent->name.copy()); QCString scope=stripAnnonymousNamespaceScope(root->parent->name.copy());
int i; int i;
if (root->parent && if (root->parent &&
root->parent->name.length()>0 && root->parent->name.length()>0 &&
...@@ -1002,6 +1055,7 @@ void buildMemberList(Entry *root) ...@@ -1002,6 +1055,7 @@ void buildMemberList(Entry *root)
md->setBriefDescription(root->brief); md->setBriefDescription(root->brief);
md->setBody(root->body); md->setBody(root->body);
md->setGroupId(root->mGrpId); md->setGroupId(root->mGrpId);
md->setInline(root->inLine);
//md->setScopeTemplateArguments(root->tArgList); //md->setScopeTemplateArguments(root->tArgList);
md->addSectionsToDefinition(root->anchors); md->addSectionsToDefinition(root->anchors);
QCString def; QCString def;
...@@ -1095,7 +1149,7 @@ void buildMemberList(Entry *root) ...@@ -1095,7 +1149,7 @@ void buildMemberList(Entry *root)
root->name.find("::")==-1 && root->name.find("::")==-1 &&
root->relates.length()==0 && root->relates.length()==0 &&
root->type.left(7)!="extern " && root->type.left(7)!="extern " &&
root->type.left(8)!="typedef " root->type.left(8)!="typedef "
) )
// no member => unrelated function // no member => unrelated function
{ {
...@@ -1151,6 +1205,7 @@ void buildMemberList(Entry *root) ...@@ -1151,6 +1205,7 @@ void buildMemberList(Entry *root)
md->setBody(root->body); md->setBody(root->body);
md->addSectionsToDefinition(root->anchors); md->addSectionsToDefinition(root->anchors);
md->setGroupId(root->mGrpId); md->setGroupId(root->mGrpId);
md->setInline(root->inLine);
QCString def; QCString def;
if (root->type.length()>0) if (root->type.length()>0)
{ {
...@@ -1369,7 +1424,9 @@ void computeClassRelations(Entry *root) ...@@ -1369,7 +1424,9 @@ void computeClassRelations(Entry *root)
) )
{ {
ClassDef *cd; ClassDef *cd;
if ((cd=getClass(root->name))) QCString bName=stripAnnonymousNamespaceScope(root->name);
//printf("Class %s\n",bName.data());
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)
...@@ -1423,7 +1480,7 @@ void computeClassRelations(Entry *root) ...@@ -1423,7 +1480,7 @@ void computeClassRelations(Entry *root)
ClassDef *baseClass=getClass(baseClassName); ClassDef *baseClass=getClass(baseClassName);
//printf("baseClass %s of %s found (%s and %s)\n", //printf("baseClass %s of %s found (%s and %s)\n",
// baseClassName.data(), // baseClassName.data(),
// root->name.data(), // bName.data(),
// (bi->prot==Private)?"private":((bi->prot==Protected)?"protected":"public"), // (bi->prot==Private)?"private":((bi->prot==Protected)?"protected":"public"),
// (bi->virt==Normal)?"normal":"virtual" // (bi->virt==Normal)?"normal":"virtual"
// ); // );
...@@ -1481,7 +1538,7 @@ void computeClassRelations(Entry *root) ...@@ -1481,7 +1538,7 @@ void computeClassRelations(Entry *root)
} // class has no base classes } // class has no base classes
} // else class is already found } // else class is already found
} }
else if (root->name.right(2)!="::") else if (bName.right(2)!="::")
{ {
if (root->name.length()>0 && root->name[0]!='@') if (root->name.length()>0 && root->name[0]!='@')
warn("Warning: Compound %s\n" warn("Warning: Compound %s\n"
...@@ -1605,6 +1662,7 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl, ...@@ -1605,6 +1662,7 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
} }
md->setDefFile(root->fileName); md->setDefFile(root->fileName);
md->setDefLine(root->startLine); md->setDefLine(root->startLine);
if (root->inLine && !md->isInline()) md->setInline(TRUE);
md->addSectionsToDefinition(root->anchors); md->addSectionsToDefinition(root->anchors);
if (cd) cd->insertUsedFile(root->fileName); if (cd) cd->insertUsedFile(root->fileName);
if (root->mGrpId!=-1) if (root->mGrpId!=-1)
...@@ -1823,10 +1881,12 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -1823,10 +1881,12 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
bool isFunc) bool isFunc)
{ {
Debug::print(Debug::FindMembers,0, Debug::print(Debug::FindMembers,0,
"findMember(root=%p,funcDecl=`%s',related=`%s',overload=%d,isFunc=%d mGrpId=%d tArgList=%p=\"%s\" scopeSpec=%s memberSpec=%s\n", "findMember(root=%p,funcDecl=`%s',related=`%s',overload=%d,"
"isFunc=%d mGrpId=%d tArgList=%p=\"%s\" scopeSpec=%s "
"memberSpec=%s inLine=%d\n",
root,funcDecl.data(),related.data(),overloaded,isFunc,root->mGrpId, root,funcDecl.data(),related.data(),overloaded,isFunc,root->mGrpId,
root->tArgList,tempArgListToString(root->tArgList).data(), root->tArgList,tempArgListToString(root->tArgList).data(),
root->scopeSpec.data(),root->memberSpec.data() root->scopeSpec.data(),root->memberSpec.data(),root->inLine
); );
if (Config::includeSourceFlag && !root->body.isEmpty()) if (Config::includeSourceFlag && !root->body.isEmpty())
{ {
...@@ -1851,6 +1911,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -1851,6 +1911,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
funcDecl=funcDecl.right(funcDecl.length()-7); funcDecl=funcDecl.right(funcDecl.length()-7);
isFriend=TRUE; isFriend=TRUE;
} }
if (funcDecl.left(7)=="inline ")
{
funcDecl=funcDecl.right(funcDecl.length()-7);
root->inLine=TRUE;
}
// delete any ; from the function declaration // delete any ; from the function declaration
int sep; int sep;
...@@ -2229,6 +2294,8 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2229,6 +2294,8 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
} }
if (matching) if (matching)
{ {
//printf("addMemberDocs root->inLine=%d md->isInline()=%d\n",
// root->inLine,md->isInline());
addMemberDocs(root,md,funcDecl,overloaded); addMemberDocs(root,md,funcDecl,overloaded);
count++; count++;
} }
...@@ -2309,6 +2376,7 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2309,6 +2376,7 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
md->setPrototype(root->proto); md->setPrototype(root->proto);
md->addSectionsToDefinition(root->anchors); md->addSectionsToDefinition(root->anchors);
md->setBody(root->body); md->setBody(root->body);
md->setInline(root->inLine);
mn->inSort(md); mn->inSort(md);
cd->insertMember(md); cd->insertMember(md);
cd->insertUsedFile(root->fileName); cd->insertUsedFile(root->fileName);
...@@ -2374,6 +2442,7 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2374,6 +2442,7 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
md->setDefLine(root->startLine); md->setDefLine(root->startLine);
md->setPrototype(root->proto); md->setPrototype(root->proto);
md->setBody(root->body); md->setBody(root->body);
md->setInline(root->inLine);
md->addSectionsToDefinition(root->anchors); md->addSectionsToDefinition(root->anchors);
mn->inSort(md); mn->inSort(md);
cd->insertMember(md); cd->insertMember(md);
...@@ -2421,8 +2490,8 @@ void findMemberDocumentation(Entry *root) ...@@ -2421,8 +2490,8 @@ void findMemberDocumentation(Entry *root)
int i,l; int i,l;
QRegExp re("([a-zA-Z0-9: ]*\\*+[ \\*]*"); QRegExp re("([a-zA-Z0-9: ]*\\*+[ \\*]*");
Debug::print(Debug::FindMembers,0, Debug::print(Debug::FindMembers,0,
"root->type=`%s' root->name=`%s' root->args=`%s' section=%x\n", "root->type=`%s' root->name=`%s' root->args=`%s' section=%x root->inLine=%d\n",
root->type.data(),root->name.data(),root->args.data(),root->section root->type.data(),root->name.data(),root->args.data(),root->section,root->inLine
); );
bool isFunc=TRUE; bool isFunc=TRUE;
if ((i=re.match(root->type,0,&l))!=-1) // func variable/typedef to func ptr if ((i=re.match(root->type,0,&l))!=-1) // func variable/typedef to func ptr
...@@ -2458,6 +2527,7 @@ void findMemberDocumentation(Entry *root) ...@@ -2458,6 +2527,7 @@ void findMemberDocumentation(Entry *root)
(root->section==Entry::FUNCTION_SEC && (root->section==Entry::FUNCTION_SEC &&
(!root->doc.isEmpty() || !root->brief.isEmpty() || (!root->doc.isEmpty() || !root->brief.isEmpty() ||
!root->body.isEmpty() || root->mGrpId!=-1 /*|| Config::extractAllFlag*/ !root->body.isEmpty() || root->mGrpId!=-1 /*|| Config::extractAllFlag*/
|| root->inLine
) )
) )
{ {
...@@ -3149,6 +3219,39 @@ void generateClassDocs() ...@@ -3149,6 +3219,39 @@ void generateClassDocs()
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void inheritDocumentation()
{
MemberNameListIterator mnli(memberNameList);
MemberName *mn;
//int count=0;
for (;(mn=mnli.current());++mnli)
{
MemberNameIterator mni(*mn);
MemberDef *md;
for (;(md=mni.current());++mni)
{
//printf("%04d Member `%s'\n",count++,md->name().data());
if (md->documentation().isEmpty() && md->briefDescription().isEmpty())
{ // no documentation yet
MemberDef *bmd = md->reimplements();
while (bmd && bmd->documentation().isEmpty() &&
bmd->briefDescription().isEmpty()
)
{ // search up the inheritance tree for a documentation member
bmd = bmd->reimplements();
}
if (bmd) // copy the documentation from the reimplemented member
{
md->setDocumentation(bmd->documentation());
md->setBriefDescription(bmd->briefDescription());
}
}
}
}
}
//----------------------------------------------------------------------------
void findDefineDocumentation(Entry *root) void findDefineDocumentation(Entry *root)
{ {
if ((root->section==Entry::DEFINEDOC_SEC || if ((root->section==Entry::DEFINEDOC_SEC ||
...@@ -3286,6 +3389,30 @@ void buildPageList(Entry *root) ...@@ -3286,6 +3389,30 @@ void buildPageList(Entry *root)
} }
} }
void findMainPage(Entry *root)
{
if (root->section == Entry::MAINPAGEDOC_SEC)
{
if (mainPage==0)
{
//printf("Found main page! \n======\n%s\n=======\n",root->doc.data());
mainPage = new PageInfo("index", root->doc,
root->args.stripWhiteSpace());
}
else
{
warn("Warning: found more than one \\mainpage comment block!\n Skipping the "
"block at line %d of %s\n",root->startLine,root->fileName.data());
}
}
EntryListIterator eli(*root->sublist);
Entry *e;
for (;(e=eli.current());++eli)
{
findMainPage(e);
}
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void resolveUserReferences() void resolveUserReferences()
...@@ -3309,6 +3436,25 @@ void resolveUserReferences() ...@@ -3309,6 +3436,25 @@ void resolveUserReferences()
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// generate all separate documentation pages // generate all separate documentation pages
//void generateMainPageDocs()
//{
// if (mainPage)
// {
// msg("Generating docs for the main page\n",mainPage->name.data());
// outputList->disable(OutputGenerator::Man);
// startFile(*outputList,mainPage->name,mainPage->title);
// SectionInfo *si=0;
// if (mainPage->title.length()>0 && mainPage->name.length()>0 &&
// (si=sectionDict[mainPage->name])!=0)
// {
// outputList->writeSection(si->label,si->title,FALSE);
// }
// parseDoc(*outputList,0,0,mainPage->doc);
// endFile(*outputList);
// outputList->enable(OutputGenerator::Man);
// }
//}
void generatePageDocs() void generatePageDocs()
{ {
PageInfo *pi=pageList.first(); PageInfo *pi=pageList.first();
...@@ -3661,7 +3807,7 @@ bool patternMatch(QFileInfo *fi,QStrList *patList) ...@@ -3661,7 +3807,7 @@ bool patternMatch(QFileInfo *fi,QStrList *patList)
#else // unix #else // unix
QRegExp re(pattern,TRUE,TRUE); // case sensitive match QRegExp re(pattern,TRUE,TRUE); // case sensitive match
#endif #endif
found = found || re.match(fi->fileName())!=-1; found = found || re.match(fi->fileName())!=-1 || re.match(fi->filePath())!=-1;
pattern=patList->next(); pattern=patList->next();
} }
} }
...@@ -3766,9 +3912,10 @@ void readFiles(BufStr &output) ...@@ -3766,9 +3912,10 @@ void readFiles(BufStr &output)
copyAndFilterFile(fileName,output); copyAndFilterFile(fileName,output);
} }
output.addChar('\n'); /* to prevent problems under Windows ? */
s=inputFiles.next(); s=inputFiles.next();
//printf("-------> adding new line\n"); //printf("-------> adding new line\n");
output.addChar('\n'); /* to prevent problems under Windows ? */
} }
// *p++='\0'; // *p++='\0';
output.addChar(0); output.addChar(0);
...@@ -4232,6 +4379,9 @@ int main(int argc,char **argv) ...@@ -4232,6 +4379,9 @@ int main(int argc,char **argv)
msg("Building page list...\n"); msg("Building page list...\n");
buildPageList(root); buildPageList(root);
msg("Search for main page...\n");
findMainPage(root);
// msg("Adding compounds to file pages...\n"); // msg("Adding compounds to file pages...\n");
// findClassDefsInFiles(root); // findClassDefsInFiles(root);
...@@ -4283,6 +4433,12 @@ int main(int argc,char **argv) ...@@ -4283,6 +4433,12 @@ int main(int argc,char **argv)
computeMemberGroupDocumentation(); computeMemberGroupDocumentation();
//unrelatedFunctionsUsed=hasUnrelatedFunctions(); //unrelatedFunctionsUsed=hasUnrelatedFunctions();
if (Config::inheritDocsFlag)
{
msg("Inheriting documentation...\n");
inheritDocumentation();
}
/************************************************************************** /**************************************************************************
* Generate documentation * * Generate documentation *
......
...@@ -113,6 +113,7 @@ extern NamespaceDict namespaceDict; ...@@ -113,6 +113,7 @@ extern NamespaceDict namespaceDict;
extern FormulaList formulaList; extern FormulaList formulaList;
extern FormulaDict formulaDict; extern FormulaDict formulaDict;
extern FormulaDict formulaNameDict; extern FormulaDict formulaNameDict;
extern PageInfo *mainPage;
extern int annotatedClasses; extern int annotatedClasses;
extern int hierarchyClasses; extern int hierarchyClasses;
......
...@@ -65,6 +65,7 @@ Entry::Entry(const Entry &e) ...@@ -65,6 +65,7 @@ Entry::Entry(const Entry &e)
fileName = e.fileName.copy(); fileName = e.fileName.copy();
startLine = e.startLine; startLine = e.startLine;
mGrpId = e.mGrpId; mGrpId = e.mGrpId;
inLine = e.inLine;
sublist = new QList<Entry>; sublist = new QList<Entry>;
sublist->setAutoDelete(TRUE); sublist->setAutoDelete(TRUE);
extends = new QList<BaseInfo>; extends = new QList<BaseInfo>;
...@@ -207,6 +208,7 @@ void Entry::reset() ...@@ -207,6 +208,7 @@ void Entry::reset()
slot = FALSE; slot = FALSE;
stat = FALSE; stat = FALSE;
proto = FALSE; proto = FALSE;
inLine = FALSE;
protection = Public; protection = Public;
sublist->clear(); sublist->clear();
extends->clear(); extends->clear();
......
...@@ -62,6 +62,7 @@ struct Argument ...@@ -62,6 +62,7 @@ struct Argument
class ArgumentList : public QList<Argument> class ArgumentList : public QList<Argument>
{ {
public: public:
~ArgumentList() {}
ArgumentList() : QList<Argument>(), ArgumentList() : QList<Argument>(),
constSpecifier(FALSE), constSpecifier(FALSE),
volatileSpecifier(FALSE), volatileSpecifier(FALSE),
...@@ -106,6 +107,7 @@ class Entry ...@@ -106,6 +107,7 @@ class Entry
NAMESPACEDOC_SEC = 0x02000000, NAMESPACEDOC_SEC = 0x02000000,
INTERFACE_SEC = 0x04000000, INTERFACE_SEC = 0x04000000,
INTERFACEDOC_SEC = 0x08000000, INTERFACEDOC_SEC = 0x08000000,
MAINPAGEDOC_SEC = 0x10000000,
COMPOUND_MASK = CLASS_SEC | STRUCT_SEC | UNION_SEC | INTERFACE_SEC, COMPOUND_MASK = CLASS_SEC | STRUCT_SEC | UNION_SEC | INTERFACE_SEC,
COMPOUNDDOC_MASK = CLASSDOC_SEC | STRUCTDOC_SEC | UNIONDOC_SEC | INTERFACEDOC_SEC, COMPOUNDDOC_MASK = CLASSDOC_SEC | STRUCTDOC_SEC | UNIONDOC_SEC | INTERFACEDOC_SEC,
SCOPE_MASK = COMPOUND_MASK | NAMESPACE_SEC, SCOPE_MASK = COMPOUND_MASK | NAMESPACE_SEC,
...@@ -126,6 +128,7 @@ class Entry ...@@ -126,6 +128,7 @@ class Entry
bool slot; // a Qt slot ? bool slot; // a Qt slot ?
bool stat; // static ? bool stat; // static ?
bool proto; // prototype ? bool proto; // prototype ?
bool inLine; // inline ?
Specifier virt; // virtualness of the entry Specifier virt; // virtualness of the entry
Entry *parent; // parent node in the tree Entry *parent; // parent node in the tree
QCString type; // member type QCString type; // member type
......
...@@ -37,6 +37,7 @@ FileDef::FileDef(const char *p,const char *nm,const char *ref) ...@@ -37,6 +37,7 @@ FileDef::FileDef(const char *p,const char *nm,const char *ref)
path=p; path=p;
filepath=path+nm; filepath=path+nm;
filename=nameToFile(nm); filename=nameToFile(nm);
diskname=filename.copy();
setReference(ref); setReference(ref);
memList = new MemberList; memList = new MemberList;
classList = new ClassList; classList = new ClassList;
...@@ -72,9 +73,9 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -72,9 +73,9 @@ void FileDef::writeDocumentation(OutputList &ol)
QCString pageTitle=name()+" File Reference"; QCString pageTitle=name()+" File Reference";
startFile(ol,diskname,pageTitle); startFile(ol,diskname,pageTitle);
startTitle(ol); startTitle(ol,getOutputFileBase());
parseText(ol,theTranslator->trFileReference(name())); parseText(ol,theTranslator->trFileReference(name()));
endTitle(ol,name()); endTitle(ol,getOutputFileBase(),name());
//ol.newParagraph(); //ol.newParagraph();
if (Config::genTagFile.length()>0) tagFile << "&" << name() << ":\n"; if (Config::genTagFile.length()>0) tagFile << "&" << name() << ":\n";
...@@ -184,8 +185,8 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -184,8 +185,8 @@ void FileDef::writeDocumentation(OutputList &ol)
ol.endMemberItem(FALSE,0,0,FALSE); ol.endMemberItem(FALSE,0,0,FALSE);
} }
cd=classList->next(); cd=classList->next();
if (found) ol.endMemberList();
} }
if (found) ol.endMemberList();
} }
memList->writeDeclarations(ol,0,0,this,0,0); memList->writeDeclarations(ol,0,0,this,0,0);
...@@ -265,14 +266,11 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -265,14 +266,11 @@ void FileDef::writeDocumentation(OutputList &ol)
memList->writeDocumentation(ol,name(),MemberDef::EnumValue); memList->writeDocumentation(ol,name(),MemberDef::EnumValue);
} }
int cnt; if ( memList->funcCount()>0 )
if ( (cnt=memList->funcCount()>0) )
{ {
ol.writeRuler(); ol.writeRuler();
ol.startGroupHeader(); ol.startGroupHeader();
QCString cntString; parseText(ol,theTranslator->trFunctionDocumentation());
cntString.sprintf(" (%d)",cnt);
parseText(ol,theTranslator->trFunctionDocumentation()+cntString);
ol.endGroupHeader(); ol.endGroupHeader();
memList->writeDocumentation(ol,name(),MemberDef::Function); memList->writeDocumentation(ol,name(),MemberDef::Function);
} }
......
...@@ -59,6 +59,7 @@ class FileNameDict : public QDict<FileName> ...@@ -59,6 +59,7 @@ class FileNameDict : public QDict<FileName>
{ {
public: public:
FileNameDict(uint size) : QDict<FileName>(size) {} FileNameDict(uint size) : QDict<FileName>(size) {}
~FileNameDict() {}
}; };
#endif #endif
...@@ -52,6 +52,7 @@ class FormulaDict : public QDict<Formula> ...@@ -52,6 +52,7 @@ class FormulaDict : public QDict<Formula>
public: public:
FormulaDict(uint size) : FormulaDict(uint size) :
QDict<Formula>(size) {} QDict<Formula>(size) {}
~FormulaDict() {}
}; };
#endif #endif
...@@ -78,9 +78,9 @@ void GroupDef::writeDocumentation(OutputList &ol) ...@@ -78,9 +78,9 @@ void GroupDef::writeDocumentation(OutputList &ol)
{ {
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
startFile(ol,fileName,title); startFile(ol,fileName,title);
startTitle(ol); startTitle(ol,getOutputFileBase());
ol.docify(title); ol.docify(title);
endTitle(ol,name()); endTitle(ol,getOutputFileBase(),name());
//brief=brief.stripWhiteSpace(); //brief=brief.stripWhiteSpace();
//int bl=brief.length(); //int bl=brief.length();
...@@ -112,13 +112,18 @@ void GroupDef::writeDocumentation(OutputList &ol) ...@@ -112,13 +112,18 @@ void GroupDef::writeDocumentation(OutputList &ol)
} }
if (classList->count()>0) if (classList->count()>0)
{ {
ol.startMemberHeader();
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startIndexList();
ClassDef *cd=classList->first(); ClassDef *cd=classList->first();
bool found=FALSE;
while (cd) while (cd)
{ {
if (!found)
{
ol.startMemberHeader();
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startIndexList();
found=TRUE;
}
QCString type; QCString type;
switch (cd->compoundType()) switch (cd->compoundType())
{ {
......
...@@ -170,17 +170,25 @@ void HtmlGenerator::writeStyleInfo(int part) ...@@ -170,17 +170,25 @@ void HtmlGenerator::writeStyleInfo(int part)
t << "DL.el { margin-left: -1cm }" << endl; t << "DL.el { margin-left: -1cm }" << endl;
t << "DIV.fragment { width: 100%; border: none; background-color: #eeeeee }" << endl; t << "DIV.fragment { width: 100%; border: none; background-color: #eeeeee }" << endl;
t << "DIV.in { margin-left: 16 }" << endl; t << "DIV.in { margin-left: 16 }" << endl;
t << "DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 }" << endl;
t << "A.gl:link { color: #ffffff }" << endl; t << "A.gl:link { color: #ffffff }" << endl;
t << "A.gl:visited { 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 << "A.gl { text-decoration: none; font-weight: bold; background-color: " << GROUP_COLOR << " }" << endl;
t << "TD.md { background-color: #f2f2ff }" << endl;
t << endl; t << endl;
endPlainFile(); endPlainFile();
} }
} }
void HtmlGenerator::writeDoxyAnchor(const char *,const char *anchor, const char *name) void HtmlGenerator::startDoxyAnchor(const char *,const char *,
const char *anchor, const char *name)
{
t << "<a name=\"" << anchor << "\" doxytag=\"" << name << "\">";
}
void HtmlGenerator::endDoxyAnchor()
{ {
t << "<a name=\"" << anchor << "\" doxytag=\"" << name << "\"></a>"; t << "</a>" << endl;
} }
void HtmlGenerator::newParagraph() void HtmlGenerator::newParagraph()
...@@ -601,17 +609,40 @@ void HtmlGenerator::endIndexList() ...@@ -601,17 +609,40 @@ void HtmlGenerator::endIndexList()
//} //}
} }
void HtmlGenerator::startAlfabeticalIndexList() void HtmlGenerator::startAlphabeticalIndexList()
{ {
t << "<multicol cols=5><dl compact>" << endl; t << "<table width=95% border=0 cellspacing=0 cellpadding=0>" << endl;
} }
void HtmlGenerator::endAlfabeticalIndexList() void HtmlGenerator::endAlphabeticalIndexList()
{ {
t << "</dl></multicol>" << endl; t << "</table>" << endl;
} }
void HtmlGenerator::writeIndexHeading(const char *s) void HtmlGenerator::writeIndexHeading(const char *s)
{ {
t << "<dt><b><big>" << s << "</big></b><dd>" << endl; //t << "<dt><b><big>" << s << "</big></b><dd>" << endl;
t << "<div class=\"ah\"><font color=\"white\"><b>&nbsp;&nbsp;" << s
<< "&nbsp;&nbsp;</b></font></div>";
}
void HtmlGenerator::writeImage(const char *name,const char *,const char *)
{
QCString baseName=name;
int i;
if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
{
baseName=baseName.right(baseName.length()-i);
}
t << "<img src=" << name << " alt=\"" << baseName << "\">" << endl;
}
void HtmlGenerator::startMemberDoc(const char *,const char *,const char *,const char *)
{
t << endl << "<p><table width=100%% cellpadding=2 cellspacing=0 border=0><tr><td class=\"md\"><b>" << endl;
}
void HtmlGenerator::endMemberDoc()
{
t << endl << "</b></td></tr></table>" << endl;
} }
...@@ -54,8 +54,8 @@ class HtmlGenerator : public OutputGenerator ...@@ -54,8 +54,8 @@ class HtmlGenerator : public OutputGenerator
void startProjectNumber(); void startProjectNumber();
void endProjectNumber(); void endProjectNumber();
void writeStyleInfo(int part); void writeStyleInfo(int part);
void startTitleHead() { startTitle(); } void startTitleHead(const char *) { startTitle(); }
void endTitleHead(const char *) { endTitle(); } void endTitleHead(const char *,const char *) { endTitle(); }
void startTitle() { t << "<h1>"; } void startTitle() { t << "<h1>"; }
void endTitle() { t << "</h1>"; } void endTitle() { t << "</h1>"; }
...@@ -67,8 +67,8 @@ class HtmlGenerator : public OutputGenerator ...@@ -67,8 +67,8 @@ class HtmlGenerator : public OutputGenerator
void endItemList() { t << "</ul>" << endl; } void endItemList() { t << "</ul>" << endl; }
void startEnumList() { t << "<ol>" << endl; } void startEnumList() { t << "<ol>" << endl; }
void endEnumList() { t << "</ol>" << endl; } void endEnumList() { t << "</ol>" << endl; }
void startAlfabeticalIndexList(); void startAlphabeticalIndexList();
void endAlfabeticalIndexList(); void endAlphabeticalIndexList();
void writeIndexHeading(const char *s); void writeIndexHeading(const char *s);
void writeIndexItem(const char *ref,const char *file,const char *name); void writeIndexItem(const char *ref,const char *file,const char *name);
void docify(const char *text); void docify(const char *text);
...@@ -120,13 +120,15 @@ class HtmlGenerator : public OutputGenerator ...@@ -120,13 +120,15 @@ class HtmlGenerator : public OutputGenerator
void endDescItem() { t << "<dd>"; } void endDescItem() { t << "<dd>"; }
void lineBreak() { t << "<br>" << endl; } void lineBreak() { t << "<br>" << endl; }
void writeChar(char c); void writeChar(char c);
void startMemberDoc(const char *,const char *,const char *) void startMemberDoc(const char *,const char *,const char *,const char *);
{ t << endl << "<h3>"; } void endMemberDoc();
void endMemberDoc() { t << "</h3>" << endl; } //void writeDoxyAnchor(const char *fName,const char *clName,
void writeDoxyAnchor(const char *clName,const char *anchor, // const char *anchor,const char *name);
const char *name); void startDoxyAnchor(const char *fName,const char *clName,
const char *anchor,const char *name);
void endDoxyAnchor();
void writeLatexSpacing() {} void writeLatexSpacing() {}
void writeLatexLabel(const char *,const char *) {} //void writeLatexLabel(const char *,const char *) {}
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);
void writeEndAnnoItem(const char *) { t << endl; } void writeEndAnnoItem(const char *) { t << endl; }
...@@ -144,7 +146,7 @@ class HtmlGenerator : public OutputGenerator ...@@ -144,7 +146,7 @@ class HtmlGenerator : public OutputGenerator
void endSuperscript() { t << "</sup>"; } void endSuperscript() { t << "</sup>"; }
void startTable(int) { t << "<table border=1 cellspacing=3 cellpadding=3>"; } void startTable(int) { t << "<table border=1 cellspacing=3 cellpadding=3>"; }
void endTable() { t << "</table>" << endl; } void endTable() { t << "</table>" << endl; }
void nextTableRow() { t << endl << "<tr><td>"; } void nextTableRow() { t << "<tr><td>"; }
void endTableRow() { t << "</tr>" << endl; } void endTableRow() { t << "</tr>" << endl; }
void nextTableColumn() { t << "<td>"; } void nextTableColumn() { t << "<td>"; }
void endTableColumn() { t << "</td>"; } void endTableColumn() { t << "</td>"; }
...@@ -171,11 +173,13 @@ class HtmlGenerator : public OutputGenerator ...@@ -171,11 +173,13 @@ class HtmlGenerator : public OutputGenerator
void endClassDiagram(ClassDiagram &,const char *,const char *); void endClassDiagram(ClassDiagram &,const char *,const char *);
void startColorFont(uchar r,uchar g,uchar b); void startColorFont(uchar r,uchar g,uchar b);
void endColorFont(); void endColorFont();
void writePageRef(const char *,const char *) {} void startPageRef() {}
void endPageRef(const char *,const char *) {}
void startQuickIndexItem(const char *,const char *); void startQuickIndexItem(const char *,const char *);
void endQuickIndexItem(); void endQuickIndexItem();
void writeFormula(const char *,const char *); void writeFormula(const char *,const char *);
void writeNonBreakableSpace() { t << "&nbsp;&nbsp;&nbsp;"; } void writeNonBreakableSpace() { t << "&nbsp;&nbsp;&nbsp;"; }
void writeImage(const char *,const char *,const char *);
//static void docifyStatic(QTextStream &t,const char *str); //static void docifyStatic(QTextStream &t,const char *str);
......
...@@ -275,10 +275,10 @@ void writeHierarchicalIndex(OutputList &ol) ...@@ -275,10 +275,10 @@ void writeHierarchicalIndex(OutputList &ol)
if (hierarchyClasses==0) return; if (hierarchyClasses==0) return;
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
startFile(ol,"hierarchy","Hierarchical Index"); startFile(ol,"hierarchy","Hierarchical Index");
startTitle(ol); startTitle(ol,0);
QCString title = Config::projectName+" "+theTranslator->trClassHierarchy(); QCString title = Config::projectName+" "+theTranslator->trClassHierarchy();
parseText(ol,title); parseText(ol,title);
endTitle(ol,0); endTitle(ol,0,0);
HtmlHelp *htmlHelp = 0; HtmlHelp *htmlHelp = 0;
if (Config::generateHtml && Config::htmlHelpFlag) if (Config::generateHtml && Config::htmlHelpFlag)
{ {
...@@ -318,10 +318,10 @@ void writeFileIndex(OutputList &ol) ...@@ -318,10 +318,10 @@ void writeFileIndex(OutputList &ol)
if (documentedFiles==0) return; if (documentedFiles==0) return;
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
startFile(ol,"files","File Index"); startFile(ol,"files","File Index");
startTitle(ol); startTitle(ol,0);
QCString title = Config::projectName+" "+theTranslator->trFileList(); QCString title = Config::projectName+" "+theTranslator->trFileList();
parseText(ol,title); parseText(ol,title);
endTitle(ol,0); endTitle(ol,0,0);
HtmlHelp *htmlHelp = 0; HtmlHelp *htmlHelp = 0;
bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag; bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
if (hasHtmlHelp) if (hasHtmlHelp)
...@@ -410,10 +410,10 @@ void writeNamespaceIndex(OutputList &ol) ...@@ -410,10 +410,10 @@ void writeNamespaceIndex(OutputList &ol)
if (documentedNamespaces==0) return; if (documentedNamespaces==0) return;
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
startFile(ol,"namespaces","Namespace Index"); startFile(ol,"namespaces","Namespace Index");
startTitle(ol); startTitle(ol,0);
QCString title = Config::projectName+" "+theTranslator->trNamespaceList(); QCString title = Config::projectName+" "+theTranslator->trNamespaceList();
parseText(ol,title); parseText(ol,title);
endTitle(ol,0); endTitle(ol,0,0);
HtmlHelp *htmlHelp = 0; HtmlHelp *htmlHelp = 0;
bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag; bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
if (hasHtmlHelp) if (hasHtmlHelp)
...@@ -536,31 +536,126 @@ void writeAnnotatedClassList(OutputList &ol) ...@@ -536,31 +536,126 @@ void writeAnnotatedClassList(OutputList &ol)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void writeAlfabeticalClassList(OutputList &ol) // write an alphabetical index of all class with a header for each letter
void writeAlphabeticalClassList(OutputList &ol)
{ {
ol.startAlfabeticalIndexList(); ol.startAlphabeticalIndexList();
//ClassDef *cd=classList.first();
//while (cd) // first count the number of headers
ClassListIterator cli(classList); ClassListIterator cli(classList);
ClassDef *cd; ClassDef *cd;
char startLetter=0; char startLetter=0;
int headerItems=0;
for (;(cd=cli.current());++cli) for (;(cd=cli.current());++cli)
{
if (cd->isLinkableInProject())
{
if (cd->name().at(0)!=startLetter) // new begin letter => new header
{
startLetter=cd->name().at(0);
headerItems++;
}
}
}
// the number of columns in the table
const int columns = 5;
int i,j;
int totalItems = headerItems + annotatedClasses; // number of items in the table
int rows = (totalItems + columns - 1)/columns; // number of rows in the table
int itemsInLastRow = (totalItems + columns -1)%columns + 1; // number of items in the last row
//printf("headerItems=%d totalItems=%d columns=%d rows=%d itemsInLastRow=%d\n",
// headerItems,totalItems,columns,rows,itemsInLastRow);
// create one class list for each column
ClassList *colList = new ClassList[columns];
// fill the columns with the class list (row elements in each column,
// expect for the columns with number >= itemsInLastRow, which get on
// item less.
int col=0,row=0;
//int icount=0;
startLetter=0;
for (cli.toFirst();(cd=cli.current());++cli)
{ {
if (cd->isLinkableInProject()) if (cd->isLinkableInProject())
{ {
if (cd->name().at(0)!=startLetter) if (cd->name().at(0)!=startLetter)
{ {
// insert a new header using a dummy class pointer.
startLetter=cd->name().at(0); startLetter=cd->name().at(0);
char s[2]; s[0]=startLetter; s[1]=0; colList[col].append((ClassDef *)8); // insert dummy for the header
ol.writeIndexHeading(s); row++;
if ( row >= rows + ((col<itemsInLastRow) ? 0 : -1))
{
// if the header is the last item in the row, we add an extra
// row to make it easier to find the text of the header (this
// is then contained in the next cell)
colList[col].append(cd);
col++;
row=0;
}
} }
ol.writeObjectLink(cd->getReference(), // add the class definition to the correct column list
cd->getOutputFileBase(),0,cd->name()); colList[col].append(cd);
ol.lineBreak(); row++;
if ( row >= rows + ((col<itemsInLastRow) ? 0 : -1)) { col++; row=0; }
} }
cd=classList.next();
} }
ol.endAlfabeticalIndexList();
// create iterators for each column
ClassListIterator **colIterators = new ClassListIterator*[columns];
for (i=0;i<columns;i++)
{
colIterators[i] = new ClassListIterator(colList[i]);
}
// generate table
for (i=0;i<rows;i++) // forarch table row
{
ol.nextTableRow();
// the last column may contain less items then the others
int colsInRow = (i<rows-1) ? columns : itemsInLastRow;
//printf("row [%d]\n",i);
for (j=0;j<colsInRow;j++) // foreach table column
{
ClassDef *cd = colIterators[j]->current();
//printf("columns [%d] cd=%p\n",j,cd);
if (cd==(ClassDef *)8) // the class pointer is really a header
{
cd=++(*colIterators[j]); // get the next item
if (cd)
{
//printf("head ClassDef=%p %s\n",cd,cd ? cd->name().data() : "<none>");
startLetter=cd->name().at(0);
char s[2]; s[0]=startLetter; s[1]=0;
ol.writeIndexHeading(s);
}
}
else if (cd) // a real class, insert a link
{
ol.writeObjectLink(cd->getReference(),
cd->getOutputFileBase(),0,cd->name());
ol.writeNonBreakableSpace();
//printf("item ClassDef=%p %s\n",cd,cd ? cd->name().data() : "<none>");
++(*colIterators[j]);
}
ol.endTableColumn();
if (j<colsInRow-1) ol.nextTableColumn();
}
ol.endTableRow();
}
ol.endAlphabeticalIndexList();
// release the temporary memory
for (i=0;i<columns;i++)
{
delete colIterators[i];
}
delete[] colIterators;
delete[] colList;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
...@@ -569,11 +664,11 @@ void writeAlphabeticalIndex(OutputList &ol) ...@@ -569,11 +664,11 @@ void writeAlphabeticalIndex(OutputList &ol)
{ {
ol.disableAllBut(OutputGenerator::Html); ol.disableAllBut(OutputGenerator::Html);
if (annotatedClasses==0) return; if (annotatedClasses==0) return;
startFile(ol,"classes.html","Alfabetical index"); startFile(ol,"classes.html","Alphabetical index");
startTitle(ol); startTitle(ol,0);
parseText(ol,Config::projectName+" "+theTranslator->trCompoundIndex()); parseText(ol,Config::projectName+" "+theTranslator->trCompoundIndex());
endTitle(ol,0); endTitle(ol,0,0);
writeAlfabeticalClassList(ol); writeAlphabeticalClassList(ol);
endFile(ol); endFile(ol);
ol.enableAll(); ol.enableAll();
} }
...@@ -587,10 +682,10 @@ void writeAnnotatedIndex(OutputList &ol) ...@@ -587,10 +682,10 @@ void writeAnnotatedIndex(OutputList &ol)
//if (classList.count()==0) return; //if (classList.count()==0) return;
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
startFile(ol,"annotated","Annotated Index"); startFile(ol,"annotated","Annotated Index");
startTitle(ol); startTitle(ol,0);
QCString title = Config::projectName+" "+theTranslator->trCompoundList(); QCString title = Config::projectName+" "+theTranslator->trCompoundList();
parseText(ol,title); parseText(ol,title);
endTitle(ol,0); endTitle(ol,0,0);
HtmlHelp *htmlHelp = 0; HtmlHelp *htmlHelp = 0;
if (Config::generateHtml && Config::htmlHelpFlag) if (Config::generateHtml && Config::htmlHelpFlag)
{ {
...@@ -728,9 +823,9 @@ void writeMemberIndex(OutputList &ol) ...@@ -728,9 +823,9 @@ void writeMemberIndex(OutputList &ol)
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::Latex);
startFile(ol,"functions","Compound Member Index"); startFile(ol,"functions","Compound Member Index");
startTitle(ol); startTitle(ol,0);
parseText(ol,Config::projectName+" "+theTranslator->trCompoundMembers()); parseText(ol,Config::projectName+" "+theTranslator->trCompoundMembers());
endTitle(ol,0); endTitle(ol,0,0);
parseText(ol,theTranslator->trCompoundMembersDescription(Config::extractAllFlag)); parseText(ol,theTranslator->trCompoundMembersDescription(Config::extractAllFlag));
writeMemberList(ol); writeMemberList(ol);
endFile(ol); endFile(ol);
...@@ -921,9 +1016,9 @@ void writeFileMemberIndex(OutputList &ol) ...@@ -921,9 +1016,9 @@ void writeFileMemberIndex(OutputList &ol)
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::Latex);
startFile(ol,"globals","File Member Index"); startFile(ol,"globals","File Member Index");
startTitle(ol); startTitle(ol,0);
parseText(ol,Config::projectName+" "+theTranslator->trFileMembers()); parseText(ol,Config::projectName+" "+theTranslator->trFileMembers());
endTitle(ol,0); endTitle(ol,0,0);
parseText(ol,theTranslator->trFileMembersDescription(Config::extractAllFlag)); parseText(ol,theTranslator->trFileMembersDescription(Config::extractAllFlag));
writeFileMemberList(ol); writeFileMemberList(ol);
endFile(ol); endFile(ol);
...@@ -939,9 +1034,9 @@ void writeNamespaceMemberIndex(OutputList &ol) ...@@ -939,9 +1034,9 @@ void writeNamespaceMemberIndex(OutputList &ol)
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::Latex);
startFile(ol,"namespacemembers","Namespace Member Index"); startFile(ol,"namespacemembers","Namespace Member Index");
startTitle(ol); startTitle(ol,0);
parseText(ol,Config::projectName+" "+theTranslator->trNamespaceMembers()); parseText(ol,Config::projectName+" "+theTranslator->trNamespaceMembers());
endTitle(ol,0); endTitle(ol,0,0);
parseText(ol,theTranslator->trNamespaceMemberDescription(Config::extractAllFlag)); parseText(ol,theTranslator->trNamespaceMemberDescription(Config::extractAllFlag));
writeNamespaceMemberList(ol); writeNamespaceMemberList(ol);
endFile(ol); endFile(ol);
...@@ -1007,10 +1102,10 @@ void writeHeaderIndex(OutputList &ol) ...@@ -1007,10 +1102,10 @@ void writeHeaderIndex(OutputList &ol)
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::Latex);
startFile(ol,"headers","Header File Index"); startFile(ol,"headers","Header File Index");
startTitle(ol); startTitle(ol,0);
QCString title = Config::projectName+" "+theTranslator->trHeaderFiles(); QCString title = Config::projectName+" "+theTranslator->trHeaderFiles();
parseText(ol,title); parseText(ol,title);
endTitle(ol,0); endTitle(ol,0,0);
HtmlHelp *htmlHelp = 0; HtmlHelp *htmlHelp = 0;
if (Config::generateHtml && Config::htmlHelpFlag) if (Config::generateHtml && Config::htmlHelpFlag)
{ {
...@@ -1036,10 +1131,10 @@ void writeExampleIndex(OutputList &ol) ...@@ -1036,10 +1131,10 @@ void writeExampleIndex(OutputList &ol)
if (exampleList.count()==0) return; if (exampleList.count()==0) return;
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
startFile(ol,"examples","Example Index"); startFile(ol,"examples","Example Index");
startTitle(ol); startTitle(ol,0);
QCString title = Config::projectName+" "+theTranslator->trExamples(); QCString title = Config::projectName+" "+theTranslator->trExamples();
parseText(ol,title); parseText(ol,title);
endTitle(ol,0); endTitle(ol,0,0);
HtmlHelp *htmlHelp = 0; HtmlHelp *htmlHelp = 0;
bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag; bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
if (hasHtmlHelp) if (hasHtmlHelp)
...@@ -1084,10 +1179,10 @@ void writePageIndex(OutputList &ol) ...@@ -1084,10 +1179,10 @@ void writePageIndex(OutputList &ol)
if (pageList.count()==0) return; if (pageList.count()==0) return;
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
startFile(ol,"pages","Page Index"); startFile(ol,"pages","Page Index");
startTitle(ol); startTitle(ol,0);
QCString title = Config::projectName+" "+theTranslator->trRelatedPages(); QCString title = Config::projectName+" "+theTranslator->trRelatedPages();
ol.docify(title); ol.docify(title);
endTitle(ol,0); endTitle(ol,0,0);
HtmlHelp *htmlHelp = 0; HtmlHelp *htmlHelp = 0;
bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag; bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
if (hasHtmlHelp) if (hasHtmlHelp)
...@@ -1173,10 +1268,10 @@ void writeGroupIndex(OutputList &ol) ...@@ -1173,10 +1268,10 @@ void writeGroupIndex(OutputList &ol)
if (documentedGroups==0) return; if (documentedGroups==0) return;
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
startFile(ol,"modules","Module Index"); startFile(ol,"modules","Module Index");
startTitle(ol); startTitle(ol,0);
QCString title = Config::projectName+" "+theTranslator->trModules(); QCString title = Config::projectName+" "+theTranslator->trModules();
parseText(ol,title); parseText(ol,title);
endTitle(ol,0); endTitle(ol,0,0);
HtmlHelp *htmlHelp = 0; HtmlHelp *htmlHelp = 0;
bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag; bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
if (hasHtmlHelp) if (hasHtmlHelp)
...@@ -1212,9 +1307,16 @@ void writeIndex(OutputList &ol) ...@@ -1212,9 +1307,16 @@ void writeIndex(OutputList &ol)
ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::Latex);
ol.startFile("index","Main Index",FALSE); ol.startFile("index","Main Index",FALSE);
if (!Config::noIndexFlag) writeQuickLinks(ol,TRUE); if (!Config::noIndexFlag) writeQuickLinks(ol,TRUE);
ol.startTitleHead(); ol.startTitleHead(0);
parseText(ol,projPrefix+theTranslator->trDocumentation()); if (mainPage && !mainPage->title.isEmpty())
ol.endTitleHead(0); {
parseDoc(ol,0,0,mainPage->title);
}
else
{
parseText(ol,projPrefix+theTranslator->trDocumentation());
}
ol.endTitleHead(0,0);
ol.newParagraph(); ol.newParagraph();
if (!Config::projectNumber.isEmpty()) if (!Config::projectNumber.isEmpty())
{ {
...@@ -1223,6 +1325,12 @@ void writeIndex(OutputList &ol) ...@@ -1223,6 +1325,12 @@ void writeIndex(OutputList &ol)
ol.endProjectNumber(); ol.endProjectNumber();
} }
if (Config::noIndexFlag) writeQuickLinks(ol,FALSE); if (Config::noIndexFlag) writeQuickLinks(ol,FALSE);
if (mainPage)
{
parseDoc(ol,0,0,mainPage->doc);
}
endFile(ol); endFile(ol);
ol.disable(OutputGenerator::Html); ol.disable(OutputGenerator::Html);
...@@ -1241,6 +1349,19 @@ void writeIndex(OutputList &ol) ...@@ -1241,6 +1349,19 @@ void writeIndex(OutputList &ol)
ol.startIndexSection(isTitlePageAuthor); ol.startIndexSection(isTitlePageAuthor);
parseText(ol,theTranslator->trGeneratedBy()); parseText(ol,theTranslator->trGeneratedBy());
ol.endIndexSection(isTitlePageAuthor); ol.endIndexSection(isTitlePageAuthor);
if (mainPage)
{
ol.startIndexSection(isMainPage);
if (!mainPage->title.isEmpty())
{
parseDoc(ol,0,0,mainPage->title);
}
else
{
parseText(ol,projPrefix+theTranslator->trMainPage());
}
ol.endIndexSection(isMainPage);
}
if (documentedGroups>0) if (documentedGroups>0)
{ {
ol.startIndexSection(isModuleIndex); ol.startIndexSection(isModuleIndex);
......
...@@ -25,6 +25,7 @@ enum IndexSections ...@@ -25,6 +25,7 @@ enum IndexSections
{ {
isTitlePageStart, isTitlePageStart,
isTitlePageAuthor, isTitlePageAuthor,
isMainPage,
isModuleIndex, isModuleIndex,
isNamespaceIndex, isNamespaceIndex,
isClassHierarchyIndex, isClassHierarchyIndex,
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
*/ */
#include "language.h" #include "language.h"
#if !defined(ENGLISH_ONLY)
#include "translator_nl.h" #include "translator_nl.h"
#include "translator_se.h" #include "translator_se.h"
#include "translator_cz.h" #include "translator_cz.h"
...@@ -23,6 +24,7 @@ ...@@ -23,6 +24,7 @@
#include "translator_de.h" #include "translator_de.h"
#include "translator_jp.h" #include "translator_jp.h"
#include "translator_es.h" #include "translator_es.h"
#endif
#define L_EQUAL(a) !stricmp(langName,a) #define L_EQUAL(a) !stricmp(langName,a)
...@@ -34,6 +36,7 @@ bool setTranslator(const char *langName) ...@@ -34,6 +36,7 @@ bool setTranslator(const char *langName)
{ {
theTranslator=new Translator; theTranslator=new Translator;
} }
#if !defined(ENGLISH_ONLY)
else if (L_EQUAL("dutch")) else if (L_EQUAL("dutch"))
{ {
theTranslator=new TranslatorDutch; theTranslator=new TranslatorDutch;
...@@ -66,6 +69,7 @@ bool setTranslator(const char *langName) ...@@ -66,6 +69,7 @@ bool setTranslator(const char *langName)
{ {
theTranslator=new TranslatorSpanish; theTranslator=new TranslatorSpanish;
} }
#endif
else // use the default language (i.e. english) else // use the default language (i.e. english)
{ {
theTranslator=new Translator; theTranslator=new Translator;
......
...@@ -26,6 +26,25 @@ ...@@ -26,6 +26,25 @@
#include "diagram.h" #include "diagram.h"
#include "language.h" #include "language.h"
static QCString filterTitle(const char *s)
{
QCString tmp=s,result;
uint i;for (i=0;i<tmp.length();i++)
{
char c=tmp.at(i);
switch(c)
{
case '#': result+="\\#"; break;
case '"': result+="\\\""; break;
case '%': result+="\\%"; break;
case '[': result+="{"; break;
case ']': result+="}"; break;
default: result+=c; break;
}
}
return result;
}
//static QCString escapeLabelName(const QCString &s) //static QCString escapeLabelName(const QCString &s)
//{ //{
// QCString result; // QCString result;
...@@ -49,6 +68,7 @@ LatexGenerator::LatexGenerator() ...@@ -49,6 +68,7 @@ LatexGenerator::LatexGenerator()
{ {
dir=Config::latexOutputDir; dir=Config::latexOutputDir;
col=0; col=0;
//printf("LatexGenerator::LatexGenerator() insideTabbing=FALSE\n");
insideTabbing=FALSE; insideTabbing=FALSE;
} }
...@@ -66,8 +86,17 @@ void LatexGenerator::append(const OutputGenerator *g) ...@@ -66,8 +86,17 @@ void LatexGenerator::append(const OutputGenerator *g)
{ {
t << g->getContents(); t << g->getContents();
col+=((LatexGenerator *)g)->col; col+=((LatexGenerator *)g)->col;
insideTabbing=insideTabbing || ((LatexGenerator *)g)->insideTabbing;
//printf("LatexGenerator::append(%s) insideTabbing=%s\n", g->getContents().data(),
// insideTabbing ? "TRUE" : "FALSE" );
} }
OutputGenerator *LatexGenerator::copy()
{
LatexGenerator *result = new LatexGenerator;
result->insideTabbing=insideTabbing;
return result;
}
void LatexGenerator::init() void LatexGenerator::init()
{ {
...@@ -91,6 +120,9 @@ void LatexGenerator::init() ...@@ -91,6 +120,9 @@ void LatexGenerator::init()
<< endl << endl
<< "ps: refman.ps" << endl << "ps: refman.ps" << endl
<< endl << endl
<< "pdf: ps" << endl
<< "\tps2pdf refman.ps refman.pdf" << endl
<< endl
<< "refman.ps: refman.dvi" << endl << "refman.ps: refman.dvi" << endl
<< "\tdvips -o refman.ps refman.dvi" << endl << "\tdvips -o refman.ps refman.dvi" << endl
<< endl << endl
...@@ -102,7 +134,7 @@ void LatexGenerator::init() ...@@ -102,7 +134,7 @@ void LatexGenerator::init()
<< "\techo \"Rerunning latex....\"" << endl << "\techo \"Rerunning latex....\"" << endl
<< "\tlatex refman.tex" << endl << "\tlatex refman.tex" << endl
<< "clean:" << endl << "clean:" << endl
<< "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log" << endl; << "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out" << endl;
} }
void LatexGenerator::startFile(const char *name,const char *,bool) void LatexGenerator::startFile(const char *name,const char *,bool)
...@@ -134,42 +166,67 @@ void LatexGenerator::startIndexSection(IndexSections is) ...@@ -134,42 +166,67 @@ void LatexGenerator::startIndexSection(IndexSections is)
{ {
case isTitlePageStart: case isTitlePageStart:
{ {
if (Config::paperType=="a4wide") paperName="a4"; else paperName=Config::paperType; if (Config::latexHeaderFile.isEmpty())
t << "\\documentclass[" << paperName << "paper]{";
if (Config::compactLatexFlag) t << "article"; else t << "book";
t << "}\n";
if (Config::paperType=="a4wide") t << "\\usepackage{a4wide}\n";
t << "\\usepackage{makeidx}\n"
"\\usepackage{fancyheadings}\n"
"\\usepackage{epsf}\n"
"\\usepackage{float}\n"
"\\usepackage{doxygen}\n";
if (!theTranslator->latexBabelPackage().isEmpty())
{ {
t << "\\usepackage{" << theTranslator->latexBabelPackage() << "}\n"; if (Config::paperType=="a4wide") paperName="a4"; else paperName=Config::paperType;
t << "\\documentclass[" << paperName << "paper";
if (Config::pdfHyperFlag) t << ",ps2pdf";
t << "]{";
if (Config::compactLatexFlag) t << "article"; else t << "book";
t << "}\n";
if (Config::paperType=="a4wide") t << "\\usepackage{a4wide}\n";
t << "\\usepackage{makeidx}\n"
"\\usepackage{fancyheadings}\n"
"\\usepackage{epsfig}\n"
"\\usepackage{float}\n"
"\\usepackage{doxygen}\n";
if (Config::pdfHyperFlag)
{
t << "\\usepackage{times}" << endl
<< "\\usepackage[backref=true," << endl
<< " pagebackref=true," << endl
<< " colorlinks=true," << endl
<< " linkcolor=blue" << endl
<< " ]{hyperref}" << endl;
}
if (!theTranslator->latexBabelPackage().isEmpty())
{
t << "\\usepackage{" << theTranslator->latexBabelPackage() << "}\n";
}
const char *s=Config::extraPackageList.first();
while (s)
{
t << "\\usepackage{" << s << "}\n";
s=Config::extraPackageList.next();
}
t << "\\makeindex\n"
"\\setcounter{tocdepth}{1}\n"
"\\setlength{\\footrulewidth}{0.4pt}\n"
"\\begin{document}\n"
"\\title{";
//docify(projectName);
//t << " Reference Manual";
//if (!projectNumber.isEmpty())
//{
// t << "\\\\[1ex]\\large ";
// docify(projectNumber);
//}
} }
const char *s=Config::extraPackageList.first(); else
while (s)
{ {
t << "\\usepackage{" << s << "}\n"; t << fileToString(Config::latexHeaderFile);
s=Config::extraPackageList.next();
} }
t << "\\makeindex\n"
"\\setcounter{tocdepth}{1}\n"
"\\setlength{\\footrulewidth}{0.4pt}\n"
"\\begin{document}\n"
"\\title{";
//docify(projectName);
//t << " Reference Manual";
//if (!projectNumber.isEmpty())
//{
// t << "\\\\[1ex]\\large ";
// docify(projectNumber);
//}
} }
break; break;
case isTitlePageAuthor: case isTitlePageAuthor:
t << "}\n\\author{"; if (Config::latexHeaderFile.isEmpty())
{
t << "}\n\\author{";
}
break;
case isMainPage:
if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
t << "{"; //Introduction}\n"
break; break;
case isModuleIndex: case isModuleIndex:
if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter"; if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
...@@ -288,14 +345,20 @@ void LatexGenerator::endIndexSection(IndexSections is) ...@@ -288,14 +345,20 @@ void LatexGenerator::endIndexSection(IndexSections is)
case isTitlePageStart: case isTitlePageStart:
break; break;
case isTitlePageAuthor: case isTitlePageAuthor:
t << " Doxygen}\n" if (Config::latexHeaderFile.isEmpty())
"\\date{" << dateToString(TRUE) << "}\n" {
"\\maketitle\n" t << " Doxygen}\n"
"\\pagenumbering{roman}\n"; "\\date{" << dateToString(TRUE) << "}\n"
if (!Config::compactLatexFlag) t << "\\clearemptydoublepage\n"; "\\maketitle\n"
t << "\\tableofcontents\n"; "\\pagenumbering{roman}\n";
if (!Config::compactLatexFlag) t << "\\clearemptydoublepage\n"; if (!Config::compactLatexFlag) t << "\\clearemptydoublepage\n";
t << "\\pagenumbering{arabic}\n"; t << "\\tableofcontents\n";
if (!Config::compactLatexFlag) t << "\\clearemptydoublepage\n";
t << "\\pagenumbering{arabic}\n";
}
break;
case isMainPage:
t << "}\n\\input{index}\n";
break; break;
case isModuleIndex: case isModuleIndex:
t << "}\n\\input{modules}\n"; t << "}\n\\input{modules}\n";
...@@ -495,14 +558,14 @@ void LatexGenerator::writeStyleInfo(int part) ...@@ -495,14 +558,14 @@ void LatexGenerator::writeStyleInfo(int part)
break; break;
case 2: case 2:
{ {
t << " Dimitri van Heesch \\copyright 1997-1999}]{}\n"; t << " Dimitri van Heesch (c) 1997-1999}]{}\n";
//QCString dtString=dateToString(FALSE); //QCString dtString=dateToString(FALSE);
t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize "; t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize ";
} }
break; break;
case 4: case 4:
{ {
t << " Dimitri van Heesch \\copyright 1997-1999}}\n"; t << " Dimitri van Heesch (c) 1997-1999}}\n";
t << "\\cfoot{}\n"; t << "\\cfoot{}\n";
t << "\\newenvironment{CompactList}\n"; t << "\\newenvironment{CompactList}\n";
t << "{\\begin{list}{}{\n"; t << "{\\begin{list}{}{\n";
...@@ -553,19 +616,6 @@ void LatexGenerator::writeStyleInfo(int part) ...@@ -553,19 +616,6 @@ void LatexGenerator::writeStyleInfo(int part)
} }
} }
void LatexGenerator::endTitleHead(const char *name)
{
t << "}" << endl;
if (name)
{
t << "\\label{" << name << "}\\index{"
<< name << "@{";
docify(name);
t << "}}";
}
t << endl;
}
void LatexGenerator::newParagraph() void LatexGenerator::newParagraph()
{ {
t << endl << endl; t << endl << endl;
...@@ -584,7 +634,7 @@ void LatexGenerator::writeIndexItem(const char *ref,const char *fn, ...@@ -584,7 +634,7 @@ void LatexGenerator::writeIndexItem(const char *ref,const char *fn,
{ {
t << "\\contentsline{section}{"; t << "\\contentsline{section}{";
docify(name); docify(name);
t << "}{\\pageref{" << name << "}}" << endl; t << "}{\\pageref{" << name << "}}{}" << endl;
} }
else else
docify(name); docify(name);
...@@ -620,7 +670,7 @@ void LatexGenerator::writeStartAnnoItem(const char *,const char *, ...@@ -620,7 +670,7 @@ void LatexGenerator::writeStartAnnoItem(const char *,const char *,
void LatexGenerator::writeEndAnnoItem(const char *name) void LatexGenerator::writeEndAnnoItem(const char *name)
{ {
t << "}{\\pageref{" << name << "}}" << endl; t << "}{\\pageref{" << name << "}}{}" << endl;
} }
//void LatexGenerator::writeClassLink(const char *,const char *, //void LatexGenerator::writeClassLink(const char *,const char *,
...@@ -631,17 +681,34 @@ void LatexGenerator::writeEndAnnoItem(const char *name) ...@@ -631,17 +681,34 @@ void LatexGenerator::writeEndAnnoItem(const char *name)
// t << "}"; // t << "}";
//} //}
void LatexGenerator::writeObjectLink(const char *, const char *, void LatexGenerator::writeObjectLink(const char *ref, const char *f,
const char *, const char *text) const char *anchor, const char *text)
{ {
t << "{\\bf "; if (!ref && Config::pdfHyperFlag)
docify(text); {
t << "}"; t << "\\hyperlink{";
if (f) t << f;
if (anchor) t << "_" << anchor;
t << "}{";
docify(text);
t << "}";
}
else
{
t << "{\\bf ";
docify(text);
t << "}";
}
}
void LatexGenerator::startPageRef()
{
t << " {\\rm (";
} }
void LatexGenerator::writePageRef(const char *clname, const char *anchor) void LatexGenerator::endPageRef(const char *clname, const char *anchor)
{ {
t << " {\\rm (p.~\\pageref{"; t << "~\\pageref{";
if (clname) t << clname; if (clname) t << clname;
if (anchor) t << "_" << anchor; if (anchor) t << "_" << anchor;
t << "})}"; t << "})}";
...@@ -654,6 +721,30 @@ void LatexGenerator::writeCodeLink(const char *,const char *, ...@@ -654,6 +721,30 @@ void LatexGenerator::writeCodeLink(const char *,const char *,
col+=strlen(name); col+=strlen(name);
} }
void LatexGenerator::startTitleHead(const char *fileName)
{
if (Config::pdfHyperFlag && fileName)
{
t << "\\hypertarget{" << fileName << "}{" << endl;
}
if (Config::compactLatexFlag) t << "\\subsection{"; else t << "\\section{";
}
void LatexGenerator::endTitleHead(const char *fileName,const char *name)
{
t << "}" << endl;
if (name)
{
t << "\\label{" << name << "}\\index{"
<< name << "@{";
docify(name);
t << "}}" << endl;
if (Config::pdfHyperFlag && fileName)
{
t << "}" << endl;
}
}
}
void LatexGenerator::startTitle() void LatexGenerator::startTitle()
{ {
...@@ -671,7 +762,9 @@ void LatexGenerator::endGroupHeader() ...@@ -671,7 +762,9 @@ void LatexGenerator::endGroupHeader()
} }
void LatexGenerator::startMemberDoc(const char *clname, void LatexGenerator::startMemberDoc(const char *clname,
const char *memname,const char *) const char *memname,
const char *,
const char *title)
{ {
t << "\\index{"; t << "\\index{";
if (clname) if (clname)
...@@ -695,23 +788,41 @@ void LatexGenerator::startMemberDoc(const char *clname, ...@@ -695,23 +788,41 @@ void LatexGenerator::startMemberDoc(const char *clname,
} }
t << "}" << endl; t << "}" << endl;
// //
if (Config::compactLatexFlag) t << "\\subsubsection{"; else t << "\\subsection{"; if (Config::compactLatexFlag) t << "\\subsubsection"; else t << "\\subsection";
t << "\\setlength{\\rightskip}{0pt plus 5cm}"; if (Config::pdfHyperFlag && title) t << "[" << filterTitle(title) << "]";
t << "{\\setlength{\\rightskip}{0pt plus 5cm}";
} }
void LatexGenerator::writeDoxyAnchor(const char *clname,const char *anchor,const char *) void LatexGenerator::startDoxyAnchor(const char *fName,const char *clname,
const char *anchor,const char *)
{ {
t << "\\label{"; t << "\\label{";
if (clname) t << clname; if (clname) t << clname;
if (anchor) t << "_" << anchor; if (anchor) t << "_" << anchor;
t << "}" << endl; t << "}" << endl;
if (Config::pdfHyperFlag)
{
t << "\\hypertarget{";
if (fName) t << fName;
if (anchor) t << "_" << anchor;
t << "}{" << endl;
}
} }
void LatexGenerator::writeLatexLabel(const char *clName,const char *anchor) void LatexGenerator::endDoxyAnchor()
{ {
writeDoxyAnchor(clName,anchor,0); if (Config::pdfHyperFlag)
{
t << "}" << endl;
}
} }
//void LatexGenerator::writeLatexLabel(const char *clName,const char *anchor)
//{
// writeDoxyAnchor(0,clName,anchor,0);
//}
void LatexGenerator::addToIndex(const char *s1,const char *s2) void LatexGenerator::addToIndex(const char *s1,const char *s2)
{ {
if (s1) if (s1)
...@@ -748,7 +859,7 @@ void LatexGenerator::writeSectionRefItem(const char *,const char *lab, ...@@ -748,7 +859,7 @@ void LatexGenerator::writeSectionRefItem(const char *,const char *lab,
{ {
t << "\\contentsline{section}{"; t << "\\contentsline{section}{";
docify(title); docify(title);
t << "}{\\ref{" << lab << "}}" << endl; t << "}{\\ref{" << lab << "}}{}" << endl;
} }
void LatexGenerator::writeSectionRefAnchor(const char *,const char *lab, void LatexGenerator::writeSectionRefAnchor(const char *,const char *lab,
...@@ -793,8 +904,16 @@ void LatexGenerator::docify(const char *str) ...@@ -793,8 +904,16 @@ void LatexGenerator::docify(const char *str)
case '>': t << "$>$"; break; case '>': t << "$>$"; break;
case '|': t << "$|$"; break; case '|': t << "$|$"; break;
case '~': t << "$\\sim$"; break; case '~': t << "$\\sim$"; break;
case '[': if (Config::pdfHyperFlag)
t << "\\mbox{[}";
else
t << "[";
break;
case ']': if (pc=='[') t << "$\\,$"; case ']': if (pc=='[') t << "$\\,$";
t << "]"; if (Config::pdfHyperFlag)
t << "\\mbox{]}";
else
t << "]";
break; break;
case '-': if (*p=='>') case '-': if (*p=='>')
{ t << " $\\rightarrow$ "; p++; } { t << " $\\rightarrow$ "; p++; }
...@@ -966,6 +1085,7 @@ void LatexGenerator::startMemberItem(bool,int annType) ...@@ -966,6 +1085,7 @@ void LatexGenerator::startMemberItem(bool,int annType)
default: default:
t << "\\begin{tabbing}" << endl; t << "\\begin{tabbing}" << endl;
t << "xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=\\kill" << endl; t << "xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=\\kill" << endl;
//printf("LatexGenerator::startMemberItem() insideTabbing=TRUE\n");
insideTabbing=TRUE; insideTabbing=TRUE;
break; break;
} }
...@@ -974,9 +1094,10 @@ void LatexGenerator::startMemberItem(bool,int annType) ...@@ -974,9 +1094,10 @@ void LatexGenerator::startMemberItem(bool,int annType)
void LatexGenerator::endMemberItem(bool,const char *,const char *,bool endItem) void LatexGenerator::endMemberItem(bool,const char *,const char *,bool endItem)
{ {
if (endItem) if (insideTabbing && endItem)
{ {
t << endl << "\\end{tabbing}"; t << endl << "\\end{tabbing}";
//printf("LatexGenerator::endMemberItem() insideTabbing=FALSE\n");
insideTabbing=FALSE; insideTabbing=FALSE;
} }
if (insideTabbing) if (insideTabbing)
...@@ -1006,3 +1127,12 @@ void LatexGenerator::endMemberList() ...@@ -1006,3 +1127,12 @@ void LatexGenerator::endMemberList()
t << "\\end{CompactItemize}" << endl; t << "\\end{CompactItemize}" << endl;
} }
void LatexGenerator::writeImage(const char *name,const char *w,const char *h)
{
t << "\\mbox{\\epsfig{file=" << name;
if (w)
t << "," << w;
else if (h)
t << "," << h;
t << "}}" << endl;
}
...@@ -27,7 +27,7 @@ class LatexGenerator : public OutputGenerator ...@@ -27,7 +27,7 @@ class LatexGenerator : public OutputGenerator
LatexGenerator(); LatexGenerator();
~LatexGenerator(); ~LatexGenerator();
OutputGenerator *copy() { return new LatexGenerator; } OutputGenerator *copy();
//OutputGenerator *clone() { return new LatexGenerator(*this); } //OutputGenerator *clone() { return new LatexGenerator(*this); }
void append(const OutputGenerator *o); void append(const OutputGenerator *o);
void enable() { active=TRUE; } void enable() { active=TRUE; }
...@@ -50,9 +50,9 @@ class LatexGenerator : public OutputGenerator ...@@ -50,9 +50,9 @@ class LatexGenerator : public OutputGenerator
void startProjectNumber(); void startProjectNumber();
void endProjectNumber() {} void endProjectNumber() {}
void writeStyleInfo(int part); void writeStyleInfo(int part);
void startTitleHead() { startTitle(); } void startTitleHead(const char *);
void startTitle(); void startTitle();
void endTitleHead(const char *name); void endTitleHead(const char *,const char *name);
void endTitle() { t << "}"; } void endTitle() { t << "}"; }
void newParagraph(); void newParagraph();
...@@ -63,8 +63,8 @@ class LatexGenerator : public OutputGenerator ...@@ -63,8 +63,8 @@ class LatexGenerator : public OutputGenerator
void endItemList() { t << "\\end{CompactItemize}" << endl; } void endItemList() { t << "\\end{CompactItemize}" << endl; }
void startEnumList() { t << "\\begin{enumerate}" << endl; } void startEnumList() { t << "\\begin{enumerate}" << endl; }
void endEnumList() { t << "\\end{enumerate}" << endl; } void endEnumList() { t << "\\end{enumerate}" << endl; }
void startAlfabeticalIndexList() {} void startAlphabeticalIndexList() {}
void endAlfabeticalIndexList() {} void endAlphabeticalIndexList() {}
void writeIndexHeading(const char *) {} void writeIndexHeading(const char *) {}
void writeIndexItem(const char *ref,const char *file,const char *name); void writeIndexItem(const char *ref,const char *file,const char *name);
void docify(const char *text); void docify(const char *text);
...@@ -96,7 +96,7 @@ class LatexGenerator : public OutputGenerator ...@@ -96,7 +96,7 @@ class LatexGenerator : public OutputGenerator
void memberGroupSeparator() {} void memberGroupSeparator() {}
void insertMemberAlign() {} void insertMemberAlign() {}
void writeRuler() { t << "\\vspace{0.4cm}\\hrule\\vspace{0.2cm}"; } void writeRuler() { t << "\\vspace{0.4cm}\\hrule\\vspace{0.2cm}" << endl; }
void writeAnchor(const char *name) { t << "\\label{" << name << "}" << endl; } void writeAnchor(const char *name) { t << "\\label{" << name << "}" << endl; }
void startCodeFragment() { t << "\\small\\begin{verbatim}"; } void startCodeFragment() { t << "\\small\\begin{verbatim}"; }
void endCodeFragment() { t << "\\end{verbatim}\\normalsize " << endl; } void endCodeFragment() { t << "\\end{verbatim}\\normalsize " << endl; }
...@@ -111,12 +111,13 @@ class LatexGenerator : public OutputGenerator ...@@ -111,12 +111,13 @@ class LatexGenerator : public OutputGenerator
void startDescItem() { t << "\\item["; } void startDescItem() { t << "\\item["; }
void endDescItem() { t << "]" << endl; } void endDescItem() { t << "]" << endl; }
void lineBreak() { t << "\\par\n"; } void lineBreak() { t << "\\par\n"; }
void startMemberDoc(const char *,const char *,const char *); void startMemberDoc(const char *,const char *,const char *,const char *);
void endMemberDoc() { t << "}"; } void endMemberDoc() { t << "}"; }
void writeDoxyAnchor(const char *,const char *,const char *); void startDoxyAnchor(const char *,const char *,const char *,const char *);
void endDoxyAnchor();
void writeChar(char c); void writeChar(char c);
void writeLatexSpacing() { t << "\\hspace{0.3cm}"; } void writeLatexSpacing() { t << "\\hspace{0.3cm}"; }
void writeLatexLabel(const char *scope,const char *anchor); //void writeLatexLabel(const char *scope,const char *anchor);
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);
void writeEndAnnoItem(const char *name); void writeEndAnnoItem(const char *name);
...@@ -157,10 +158,10 @@ class LatexGenerator : public OutputGenerator ...@@ -157,10 +158,10 @@ class LatexGenerator : public OutputGenerator
void writeTilde(char c) { t << "\\~{" << c << "}"; } void writeTilde(char c) { t << "\\~{" << c << "}"; }
void startMemberDescription() { t << "\\begin{CompactList}\\small\\item\\em "; } void startMemberDescription() { t << "\\begin{CompactList}\\small\\item\\em "; }
void endMemberDescription() { t << "\\item\\end{CompactList}"; } void endMemberDescription() { t << "\\item\\end{CompactList}"; }
void startDescList() { t << "\\begin{Desc}\\item["; } void startDescList() { t << "\\begin{Desc}\n\\item["; }
void endDescTitle() { t << "]"; } void endDescTitle() { t << "]"; }
void writeDescItem() { t << "\\par" << endl; } void writeDescItem() { t << "\\par" << endl; }
void endDescList() { t << "\\end{Desc}"; } void endDescList() { t << "\\end{Desc}" << endl; }
void writeSection(const char *,const char *,bool); void writeSection(const char *,const char *,bool);
void writeSectionRef(const char *,const char *,const char *); void writeSectionRef(const char *,const char *,const char *);
void writeSectionRefItem(const char *,const char *,const char *); void writeSectionRefItem(const char *,const char *,const char *);
...@@ -174,11 +175,13 @@ class LatexGenerator : public OutputGenerator ...@@ -174,11 +175,13 @@ class LatexGenerator : public OutputGenerator
void endClassDiagram(ClassDiagram &,const char *,const char *); void endClassDiagram(ClassDiagram &,const char *,const char *);
void startColorFont(uchar,uchar,uchar) {} void startColorFont(uchar,uchar,uchar) {}
void endColorFont() {} void endColorFont() {}
void writePageRef(const char *,const char *); void startPageRef();
void endPageRef(const char *,const char *);
void startQuickIndexItem(const char *,const char *) {} void startQuickIndexItem(const char *,const char *) {}
void endQuickIndexItem() {} void endQuickIndexItem() {}
void writeFormula(const char *,const char *); void writeFormula(const char *,const char *);
void writeNonBreakableSpace(); void writeNonBreakableSpace();
void writeImage(const char *,const char *,const char *);
//static void docifyStatic(QTextStream &t,const char *str); //static void docifyStatic(QTextStream &t,const char *str);
......
...@@ -92,11 +92,7 @@ void ManGenerator::endFile() ...@@ -92,11 +92,7 @@ void ManGenerator::endFile()
endPlainFile(); endPlainFile();
} }
void ManGenerator::writeDoxyAnchor(const char *, const char *,const char *) void ManGenerator::endTitleHead(const char *,const char *name)
{
}
void ManGenerator::endTitleHead(const char *name)
{ {
t << ".TH " << name << " 3 \"" << dateToString(FALSE) << "\" \""; t << ".TH " << name << " 3 \"" << dateToString(FALSE) << "\" \"";
if (Config::projectName.isEmpty()) if (Config::projectName.isEmpty())
...@@ -284,7 +280,7 @@ void ManGenerator::endCodeFragment() ...@@ -284,7 +280,7 @@ void ManGenerator::endCodeFragment()
col=0; col=0;
} }
void ManGenerator::startMemberDoc(const char *,const char *,const char *) void ManGenerator::startMemberDoc(const char *,const char *,const char *,const char *)
{ {
if (!firstCol) t << endl; if (!firstCol) t << endl;
t << ".SS "; t << ".SS ";
......
...@@ -50,8 +50,8 @@ class ManGenerator : public OutputGenerator ...@@ -50,8 +50,8 @@ class ManGenerator : public OutputGenerator
void startProjectNumber() {} void startProjectNumber() {}
void endProjectNumber() {} void endProjectNumber() {}
void writeStyleInfo(int) {} void writeStyleInfo(int) {}
void startTitleHead() {} void startTitleHead(const char *) {}
void endTitleHead(const char *); void endTitleHead(const char *,const char *);
void startTitle(); void startTitle();
void endTitle() {} void endTitle() {}
...@@ -63,8 +63,8 @@ class ManGenerator : public OutputGenerator ...@@ -63,8 +63,8 @@ class ManGenerator : public OutputGenerator
void endItemList() {} void endItemList() {}
void startEnumList() {} void startEnumList() {}
void endEnumList() {} void endEnumList() {}
void startAlfabeticalIndexList() {} void startAlphabeticalIndexList() {}
void endAlfabeticalIndexList() {} void endAlphabeticalIndexList() {}
void writeIndexHeading(const char *) {} void writeIndexHeading(const char *) {}
void writeIndexItem(const char *ref,const char *file,const char *name); void writeIndexItem(const char *ref,const char *file,const char *name);
void docify(const char *text); void docify(const char *text);
...@@ -110,11 +110,13 @@ class ManGenerator : public OutputGenerator ...@@ -110,11 +110,13 @@ class ManGenerator : public OutputGenerator
void endDescItem(); void endDescItem();
void lineBreak() { t << "\n.br" << endl; } void lineBreak() { t << "\n.br" << endl; }
void writeChar(char c); void writeChar(char c);
void startMemberDoc(const char *,const char *,const char *); void startMemberDoc(const char *,const char *,const char *,const char *);
void endMemberDoc() {} void endMemberDoc() {}
void writeDoxyAnchor(const char *clName,const char *anchor,const char *name); void startDoxyAnchor(const char *,const char *,
const char *,const char *) {}
void endDoxyAnchor() {}
void writeLatexSpacing() {} void writeLatexSpacing() {}
void writeLatexLabel(const char *,const char *) {} //void writeLatexLabel(const char *,const char *) {}
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);
void writeEndAnnoItem(const char *) { t << endl; firstCol=TRUE; } void writeEndAnnoItem(const char *) { t << endl; firstCol=TRUE; }
...@@ -162,11 +164,13 @@ class ManGenerator : public OutputGenerator ...@@ -162,11 +164,13 @@ class ManGenerator : public OutputGenerator
void endClassDiagram(ClassDiagram &,const char *,const char *) {} void endClassDiagram(ClassDiagram &,const char *,const char *) {}
void startColorFont(uchar,uchar,uchar) {} void startColorFont(uchar,uchar,uchar) {}
void endColorFont() {} void endColorFont() {}
void writePageRef(const char *,const char *) {} void startPageRef() {}
void endPageRef(const char *,const char *) {}
void startQuickIndexItem(const char *,const char *) {} void startQuickIndexItem(const char *,const char *) {}
void endQuickIndexItem() {} void endQuickIndexItem() {}
void writeFormula(const char *,const char *) {} void writeFormula(const char *,const char *) {}
void writeNonBreakableSpace() { t << " "; } void writeNonBreakableSpace() { t << " "; }
void writeImage(const char *,const char *,const char *) {}
private: private:
bool firstCol; bool firstCol;
......
...@@ -235,8 +235,10 @@ MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e, ...@@ -235,8 +235,10 @@ MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e,
eUsed=FALSE; eUsed=FALSE;
proto=FALSE; proto=FALSE;
annScope=FALSE; annScope=FALSE;
inLine=FALSE;
annMemb=0; annMemb=0;
annUsed=FALSE; annUsed=FALSE;
annShown=FALSE;
indDepth=0; indDepth=0;
docEnumValues=FALSE; docEnumValues=FALSE;
// copy function template arguments (if any) // copy function template arguments (if any)
...@@ -500,27 +502,47 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi ...@@ -500,27 +502,47 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi
// search for the last annonymous scope in the member type // search for the last annonymous scope in the member type
ClassDef *annoClassDef=0; ClassDef *annoClassDef=0;
while (i!=-1 && cname.find(type.mid(i,l))!=-1) //while (i!=-1 && cname.find(type.mid(i,l))!=-1)
{ //{
i=r.match(type,i+l,&l); // i=r.match(type,i+l,&l);
} //}
if (i!=-1) int il=i-1,ir=i+l;
if (i!=-1) // found annonymous scope in type
{ {
// get the definition of the annonymous class that is // extract annonymous scope
// the type of this member while (il>=0 && (isId(type.at(il)) || type.at(il)==':' || type.at(il)=='@')) il--;
annoClassDef=getClass(cname+"::"+type.mid(i,l)); if (il>0) il++;
while (ir<(int)type.length() && (isId(type.at(ir)) || type.at(ir)==':' || type.at(ir)=='@')) ir++;
//QCString annName = type.mid(i,l);
QCString annName = type.mid(il,ir-il);
// if inside a class or namespace try to prepend the scope name
if ((cd || nd) && annName.left(cname.length())!=cname)
{
QCString ts=stripAnnonymousNamespaceScope(cname+"::"+annName);
//printf("Member::writeDeclaration: Trying %s\n",ts.data());
annoClassDef=getClass(ts);
}
// if not found yet, try without scope name
if (annoClassDef==0)
{
QCString ts=stripAnnonymousNamespaceScope(annName);
//printf("Member::writeDeclaration: Trying %s\n",ts.data());
annoClassDef=getClass(ts);
}
} }
// start a new member declaration // start a new member declaration
ol.startMemberItem(gId!=-1,((i!=-1) || annMemb) ? 1 : 0); ol.startMemberItem(gId!=-1,(annoClassDef || annMemb) ? 1 : 0);
// If there is no detailed description we need to write the anchor here. // If there is no detailed description we need to write the anchor here.
bool detailsVisible = detailsAreVisible(); bool detailsVisible = detailsAreVisible();
if (!detailsVisible && !Config::extractAllFlag && !annMemb) if (!detailsVisible && !Config::extractAllFlag && !annMemb)
{ {
QCString doxyName=name().copy(); QCString doxyName=name().copy();
if (!cname.isEmpty()) doxyName.prepend(cname+"::"); if (!cname.isEmpty()) doxyName.prepend(cname+"::");
ol.writeDoxyAnchor(cname,anchor(),doxyName); ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
ol.addToIndex(name(),cname); ol.addToIndex(name(),cname);
ol.addToIndex(cname,name()); ol.addToIndex(cname,name());
if (hasHtmlHelp) if (hasHtmlHelp)
...@@ -538,12 +560,8 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi ...@@ -538,12 +560,8 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi
// ol.writeLatexLabel(cname,anchor()); // ol.writeLatexLabel(cname,anchor());
//} //}
if (tArgList) //printf("member name=%s indDepth=%d\n",name().data(),indDepth);
{ if (annoClassDef || annMemb)
writeTemplatePrefix(ol,tArgList,FALSE);
}
if (i!=-1 || annMemb)
{ {
int j; int j;
for (j=0;j<indDepth;j++) for (j=0;j<indDepth;j++)
...@@ -552,6 +570,11 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi ...@@ -552,6 +570,11 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi
} }
} }
if (tArgList)
{
writeTemplatePrefix(ol,tArgList,FALSE);
}
if (i!=-1) if (i!=-1)
{ {
//printf("scopeName=`%s' annonymous=`%s'\n", //printf("scopeName=`%s' annonymous=`%s'\n",
...@@ -560,15 +583,23 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi ...@@ -560,15 +583,23 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi
if (annoClassDef) if (annoClassDef)
{ {
//printf("class found!\n"); //printf("class found!\n");
annoClassDef->writeDeclaration(ol); annoClassDef->writeDeclaration(ol,annMemb);
ol.startMemberItem(gId!=-1,2); ol.startMemberItem(gId!=-1,2);
int j; int j;
for (j=0;j<indDepth;j++) for (j=0;j<indDepth;j++)
{ {
ol.writeNonBreakableSpace(); ol.writeNonBreakableSpace();
} }
QCString varName=type.right(type.length()-ir).stripWhiteSpace();
ol.docify("}"); ol.docify("}");
ol.docify(type.right(type.length()-i-l).stripWhiteSpace()); if (varName.isEmpty() && (name().isEmpty() || name().at(0)=='@'))
{
ol.docify(";");
}
else
{
ol.docify(varName);
}
} }
else else
{ {
...@@ -605,35 +636,43 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi ...@@ -605,35 +636,43 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi
ol.insertMemberAlign(); ol.insertMemberAlign();
// write name // write name
if (grpId!=-1) if (!name().isEmpty() && name().at(0)!='@')
{ {
if (annMemb) if (grpId!=-1)
{ {
//printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor()); if (annMemb)
annMemb->writeLink(ol,cd,nd,fd,inGroup ? memberGroup : 0); {
annMemb->annUsed=annUsed=TRUE; //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
annMemb->writeLink(ol,cd,nd,fd,inGroup ? memberGroup : 0);
annMemb->annUsed=annUsed=TRUE;
}
else
writeLink(ol,0,0,0,memberGroup);
//ol.writeBoldString(name());
} }
else else if (isLinkable())
writeLink(ol,0,0,0,memberGroup);
//ol.writeBoldString(name());
}
else if (isLinkable())
{
if (annMemb)
{ {
//printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor()); if (annMemb)
annMemb->writeLink(ol,annMemb->memberClass(),nd,fd,inGroup ? memberGroup : 0); {
annMemb->annUsed=annUsed=TRUE; //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
annMemb->writeLink(ol,
annMemb->memberClass(),
annMemb->getNamespace(),
annMemb->getFileDef(),
inGroup ? memberGroup : 0
);
annMemb->annUsed=annUsed=TRUE;
}
else
//printf("writeLink %s->%d\n",name.data(),hasDocumentation());
writeLink(ol,cd,nd,fd,inGroup ? memberGroup : 0);
}
else // there is a brief member description and brief member
// descriptions are enabled or there is no detailed description.
{
if (annMemb) annMemb->annUsed=annUsed=TRUE;
ol.writeBoldString(name());
} }
else
//printf("writeLink %s->%d\n",name.data(),hasDocumentation());
writeLink(ol,cd,nd,fd,inGroup ? memberGroup : 0);
}
else // there is a brief member description and brief member
// descriptions are enabled or there is no detailed description.
{
if (annMemb) annMemb->annUsed=annUsed=TRUE;
ol.writeBoldString(name());
} }
// if member template specifiers are not part of the name, but they are // if member template specifiers are not part of the name, but they are
...@@ -657,8 +696,14 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi ...@@ -657,8 +696,14 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi
ol.docify(excpString()); ol.docify(excpString());
} }
ol.endMemberItem(gId!=-1,gFile,gHeader,annoClassDef!=0 && indDepth==0); if (!detailsVisible && !Config::extractAllFlag && !annMemb)
{
ol.endDoxyAnchor();
}
ol.endMemberItem(gId!=-1,gFile,gHeader,annoClassDef!=0 && indDepth==0);
//ol.endMemberItem(gId!=-1,gFile,gHeader,annoClassDef || annMemb);
// write brief description // write brief description
if (!briefDescription().isEmpty() && Config::briefMemDescFlag && if (!briefDescription().isEmpty() && Config::briefMemDescFlag &&
gId==-1 && !inGroup && !annMemb) gId==-1 && !inGroup && !annMemb)
...@@ -743,27 +788,28 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco ...@@ -743,27 +788,28 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
{ {
if (vmd->isEnumerate() && def.mid(i,l)==vmd->name()) if (vmd->isEnumerate() && def.mid(i,l)==vmd->name())
{ {
ol.startMemberDoc(cname,name(),anchor()); ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
ol.startMemberDoc(cname,name(),anchor(),name());
if (hasHtmlHelp) if (hasHtmlHelp)
{ {
htmlHelp->addIndexItem(cname,name(),cfname,anchor()); htmlHelp->addIndexItem(cname,name(),cfname,anchor());
} }
ol.writeDoxyAnchor(cname,anchor(),doxyName);
linkifyText(ol,scopeName,name(),def.left(i)); linkifyText(ol,scopeName,name(),def.left(i));
ol+=*vmd->enumDecl(); ol+=*vmd->enumDecl();
linkifyText(ol,scopeName,name(),def.right(def.length()-i-l)); linkifyText(ol,scopeName,name(),def.right(def.length()-i-l));
//ol.endDoxyAnchor();
found=TRUE; found=TRUE;
} }
} }
if (!found) // anonymous compound if (!found) // anonymous compound
{ {
//printf("Annonymous compound `%s'\n",cname.data()); //printf("Annonymous compound `%s'\n",cname.data());
ol.startMemberDoc(cname,name(),anchor()); ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
ol.startMemberDoc(cname,name(),anchor(),name());
if (hasHtmlHelp) if (hasHtmlHelp)
{ {
htmlHelp->addIndexItem(cname,name(),cfname,anchor()); htmlHelp->addIndexItem(cname,name(),cfname,anchor());
} }
ol.writeDoxyAnchor(cname,anchor(),doxyName);
// strip annonymous compound names from definition // strip annonymous compound names from definition
int si=def.find(' '),pi,ei=i+l; int si=def.find(' '),pi,ei=i+l;
if (si==-1) si=0; if (si==-1) si=0;
...@@ -772,17 +818,19 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco ...@@ -772,17 +818,19 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
ol.docify(def.left(si)); ol.docify(def.left(si));
ol.docify(" { ... } "); ol.docify(" { ... } ");
// last ei characters of def contain pointer/reference specifiers // last ei characters of def contain pointer/reference specifiers
int ni=def.findRev("::");
if (ni>=ei) ei=ni+2;
linkifyText(ol,scopeName,name(),def.right(def.length()-ei)); linkifyText(ol,scopeName,name(),def.right(def.length()-ei));
} }
} }
else else
{ {
ol.startMemberDoc(cname,name(),anchor()); ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
ol.startMemberDoc(cname,name(),anchor(),name());
if (hasHtmlHelp) if (hasHtmlHelp)
{ {
htmlHelp->addIndexItem(cname,name(),cfname,anchor()); htmlHelp->addIndexItem(cname,name(),cfname,anchor());
} }
ol.writeDoxyAnchor(cname,anchor(),doxyName);
ArgumentList *scopeAl=scopeDefTemplateArguments(); ArgumentList *scopeAl=scopeDefTemplateArguments();
if (scopeAl==0 && cd) scopeAl=cd->templateArguments(); if (scopeAl==0 && cd) scopeAl=cd->templateArguments();
...@@ -840,7 +888,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco ...@@ -840,7 +888,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
if (isStatic() || protection()!=Public || if (isStatic() || protection()!=Public ||
virt!=Normal || isSignal() || isFriend() || virt!=Normal || isSignal() || isFriend() ||
isRelated() || isSlot() isRelated() || isSlot() ||
(isInline() && Config::inlineInfoFlag)
) )
{ {
// write the member specifier list // write the member specifier list
...@@ -852,6 +901,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco ...@@ -852,6 +901,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
else if (isRelated()) sl.append("related"); else if (isRelated()) sl.append("related");
else else
{ {
if (Config::inlineInfoFlag && isInline())
sl.append("inline");
if (isStatic()) sl.append("static"); if (isStatic()) sl.append("static");
if (protection()==Protected) sl.append("protected"); if (protection()==Protected) sl.append("protected");
else if (protection()==Private) sl.append("private"); else if (protection()==Private) sl.append("private");
...@@ -871,6 +922,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco ...@@ -871,6 +922,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
ol.endTypewriter(); ol.endTypewriter();
} }
ol.endMemberDoc(); ol.endMemberDoc();
ol.endDoxyAnchor();
ol.startIndent(); ol.startIndent();
ol.newParagraph(); ol.newParagraph();
...@@ -915,7 +967,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco ...@@ -915,7 +967,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
ol.endBold(); ol.endBold();
ol.startItemList(); ol.startItemList();
} }
ol.writeDoxyAnchor(cname,fmd->anchor(),fmd->name());
ol.addToIndex(fmd->name(),cname); ol.addToIndex(fmd->name(),cname);
ol.addToIndex(cname,fmd->name()); ol.addToIndex(cname,fmd->name());
if (Config::generateHtml && Config::htmlHelpFlag) if (Config::generateHtml && Config::htmlHelpFlag)
...@@ -923,10 +974,12 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco ...@@ -923,10 +974,12 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
HtmlHelp::getInstance()->addIndexItem(cname,fmd->name(),cfname,fmd->anchor()); HtmlHelp::getInstance()->addIndexItem(cname,fmd->name(),cfname,fmd->anchor());
} }
ol.writeListItem(); ol.writeListItem();
ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name());
first=FALSE; first=FALSE;
ol.startBold(); ol.startBold();
ol.docify(fmd->name()); ol.docify(fmd->name());
ol.endBold(); ol.endBold();
ol.endDoxyAnchor();
ol.newParagraph(); ol.newParagraph();
if (!fmd->briefDescription().isEmpty()) if (!fmd->briefDescription().isEmpty())
...@@ -979,18 +1032,18 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco ...@@ -979,18 +1032,18 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
{ {
ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(), ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
bmd->anchor(),bcd->name()); bmd->anchor(),bcd->name());
if ( bcd->isLinkableInProject()) if ( bcd->isLinkableInProject() && !Config::pdfHyperFlag )
{ {
ol.writePageRef(bcd->name(),bmd->anchor()); writePageRef(ol,bcd->name(),bmd->anchor());
} }
} }
else else
{ {
ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(), ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
0,bcd->name()); 0,bcd->name());
if (bcd->isLinkableInProject()) if (bcd->isLinkableInProject() && !Config::pdfHyperFlag )
{ {
ol.writePageRef(bcd->name(),0); writePageRef(ol,bcd->name(),0);
} }
} }
parseText(ol,reimplFromLine.right( parseText(ol,reimplFromLine.right(
...@@ -1041,7 +1094,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco ...@@ -1041,7 +1094,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
count=0; count=0;
// find the entryIndex-th documented entry in the inheritance list. // find the entryIndex-th documented entry in the inheritance list.
for (mli.toFirst();(bmd=mli.current()) && (bcd=bmd->memberClass());++mli) for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->memberClass());--mli)
{ {
if ( bmd->isLinkable() && bcd->isLinkable()) if ( bmd->isLinkable() && bcd->isLinkable())
{ {
...@@ -1058,9 +1111,9 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco ...@@ -1058,9 +1111,9 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
//{ //{
ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(), ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
bmd->anchor(),bcd->name()); bmd->anchor(),bcd->name());
if (bcd->isLinkableInProject()) if (bcd->isLinkableInProject() && !Config::pdfHyperFlag )
{ {
ol.writePageRef(bcd->name(),bmd->anchor()); writePageRef(ol,bcd->name(),bmd->anchor());
} }
//} //}
//else //else
......
...@@ -84,12 +84,14 @@ class MemberDef : public Definition ...@@ -84,12 +84,14 @@ class MemberDef : public Definition
void setFileDec(FileDef *fd) { fileDec=fd; } void setFileDec(FileDef *fd) { fileDec=fd; }
void setAnchor(const char *a) { anc=a; } void setAnchor(const char *a) { anc=a; }
void setProtection(Protection p) { prot=p; } void setProtection(Protection p) { prot=p; }
void setBody(const QCString &b) { body=b; } void setBody(const QCString &b) { body=b; }
void setInline(bool in) { inLine=in; }
FileDef *getFileDef() { return fileDef; } FileDef *getFileDef() { return fileDef; }
FileDef *getFileDec() { return fileDec; } FileDef *getFileDec() { return fileDec; }
void setMemberClass(ClassDef *cd) { classDef=cd; } void setMemberClass(ClassDef *cd) { classDef=cd; }
bool isRelated() const { return related; } bool isRelated() const { return related; }
bool isStatic() const { return stat; } bool isStatic() const { return stat; }
bool isInline() const { return inLine; }
bool hasDocumentation() // overrides hasDocumentation in definition.h bool hasDocumentation() // overrides hasDocumentation in definition.h
{ return Definition::hasDocumentation() || !body.isEmpty(); } { return Definition::hasDocumentation() || !body.isEmpty(); }
...@@ -212,12 +214,14 @@ class MemberDef : public Definition ...@@ -212,12 +214,14 @@ class MemberDef : public Definition
Protection prot; // protection type [Public/Protected/Private] Protection prot; // protection type [Public/Protected/Private]
bool related; // is this a member that is only related to a class bool related; // is this a member that is only related to a class
bool stat; // is it a static function? bool stat; // is it a static function?
bool inLine; // is it an inline function?
MemberType mtype; // returns the kind of member MemberType mtype; // returns the kind of member
bool eUsed; // is the enumerate already placed in a list bool eUsed; // is the enumerate already placed in a list
bool proto; // is it a prototype; bool proto; // is it a prototype;
bool docEnumValues; // is an enum with documented enum values. bool docEnumValues; // is an enum with documented enum values.
bool annScope; bool annScope;
bool annUsed; bool annUsed;
bool annShown;
int indDepth; int indDepth;
MemberDef *annMemb; MemberDef *annMemb;
ArgumentList *argList; // argument list of this member ArgumentList *argList; // argument list of this member
......
...@@ -62,9 +62,9 @@ void MemberGroup::writeDocumentation(OutputList &ol) ...@@ -62,9 +62,9 @@ void MemberGroup::writeDocumentation(OutputList &ol)
} }
ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Man);
startFile(ol,fileName,title); startFile(ol,fileName,title);
startTitle(ol); startTitle(ol,getOutputFileBase());
ol.docify(title); ol.docify(title);
endTitle(ol,name()); endTitle(ol,getOutputFileBase(),name());
OutputList briefOutput(&ol); OutputList briefOutput(&ol);
......
...@@ -256,11 +256,11 @@ void MemberList::writePlainDeclarations(OutputList &ol,ClassDef *cd, ...@@ -256,11 +256,11 @@ void MemberList::writePlainDeclarations(OutputList &ol,ClassDef *cd,
// ) // )
// ) // )
// ) // )
if (md->hasDocumentation() || md->hasDocumentedEnumValues()) if (md->isLinkableInProject() || md->hasDocumentedEnumValues())
{ {
if (Config::genTagFile.length()>0) if (Config::genTagFile.length()>0)
tagFile << md->name() << " " << md->anchor() tagFile << md->name() << " " << md->anchor()
<< " \"" << md->argsString() << "\""; << " \"\"" << endl;
md->writeLink(typeDecl,cd,nd,fd,0); md->writeLink(typeDecl,cd,nd,fd,0);
} }
else else
......
...@@ -86,6 +86,7 @@ class MemberNameInfoIterator : public QListIterator<MemberInfo> ...@@ -86,6 +86,7 @@ class MemberNameInfoIterator : public QListIterator<MemberInfo>
class MemberNameInfoList : public QList<MemberNameInfo> class MemberNameInfoList : public QList<MemberNameInfo>
{ {
public: public:
~MemberNameInfoList() {}
int compareItems(GCI item1,GCI item2) int compareItems(GCI item1,GCI item2)
{ return stricmp( { return stricmp(
((MemberNameInfo *)item1)->memberName(), ((MemberNameInfo *)item1)->memberName(),
...@@ -98,6 +99,7 @@ class MemberNameInfoDict : public QDict<MemberNameInfo> ...@@ -98,6 +99,7 @@ class MemberNameInfoDict : public QDict<MemberNameInfo>
{ {
public: public:
MemberNameInfoDict(int size) : QDict<MemberNameInfo>(size) {} MemberNameInfoDict(int size) : QDict<MemberNameInfo>(size) {}
~MemberNameInfoDict() {}
}; };
class MemberNameInfoListIterator : public QListIterator<MemberNameInfo> class MemberNameInfoListIterator : public QListIterator<MemberNameInfo>
......
...@@ -63,10 +63,10 @@ void NamespaceDef::writeDocumentation(OutputList &ol) ...@@ -63,10 +63,10 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{ {
QCString pageTitle=name()+" Namespace Reference"; QCString pageTitle=name()+" Namespace Reference";
startFile(ol,fileName,pageTitle); startFile(ol,fileName,pageTitle);
startTitle(ol); startTitle(ol,getOutputFileBase());
//ol.docify(pageTitle); //ol.docify(pageTitle);
parseText(ol,theTranslator->trNamespaceReference(name())); parseText(ol,theTranslator->trNamespaceReference(name()));
endTitle(ol,name()); endTitle(ol,getOutputFileBase(),name());
if (Config::genTagFile.length()>0) tagFile << "%" << name() << ":\n"; if (Config::genTagFile.length()>0) tagFile << "%" << name() << ":\n";
...@@ -94,7 +94,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol) ...@@ -94,7 +94,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
bool found=FALSE; bool found=FALSE;
while (cd) while (cd)
{ {
if (cd->isLinkable()) if (cd->name().find('@')==-1)
{ {
if (!found) if (!found)
{ {
...@@ -120,7 +120,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol) ...@@ -120,7 +120,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
} }
ol.writeString(" "); ol.writeString(" ");
ol.insertMemberAlign(); ol.insertMemberAlign();
if (cd->hasDocumentation()) if (cd->isLinkable())
{ {
ol.writeObjectLink(cd->getReference(), ol.writeObjectLink(cd->getReference(),
cd->getOutputFileBase(), cd->getOutputFileBase(),
......
...@@ -76,6 +76,7 @@ class NamespaceDef : public Definition ...@@ -76,6 +76,7 @@ class NamespaceDef : public Definition
class NamespaceList : public QList<NamespaceDef> class NamespaceList : public QList<NamespaceDef>
{ {
public: public:
~NamespaceList() {}
int compareItems(GCI item1,GCI item2) int compareItems(GCI item1,GCI item2)
{ {
return strcmp(((NamespaceDef *)item1)->name(), return strcmp(((NamespaceDef *)item1)->name(),
...@@ -95,6 +96,7 @@ class NamespaceDict : public QDict<NamespaceDef> ...@@ -95,6 +96,7 @@ class NamespaceDict : public QDict<NamespaceDef>
{ {
public: public:
NamespaceDict(int size) : QDict<NamespaceDef>(size) {} NamespaceDict(int size) : QDict<NamespaceDef>(size) {}
~NamespaceDict() {}
}; };
#endif #endif
...@@ -53,8 +53,8 @@ class OutputGenerator ...@@ -53,8 +53,8 @@ class OutputGenerator
virtual void startProjectNumber() = 0; virtual void startProjectNumber() = 0;
virtual void endProjectNumber() = 0; virtual void endProjectNumber() = 0;
virtual void writeStyleInfo(int part) = 0; virtual void writeStyleInfo(int part) = 0;
virtual void startTitleHead() = 0; virtual void startTitleHead(const char *) = 0;
virtual void endTitleHead(const char *name) = 0; virtual void endTitleHead(const char *fileName,const char *name) = 0;
virtual void startTitle() = 0; virtual void startTitle() = 0;
virtual void endTitle() = 0; virtual void endTitle() = 0;
virtual void newParagraph() = 0; virtual void newParagraph() = 0;
...@@ -67,8 +67,8 @@ class OutputGenerator ...@@ -67,8 +67,8 @@ class OutputGenerator
virtual void endEnumList() = 0; virtual void endEnumList() = 0;
virtual void startBold() = 0; virtual void startBold() = 0;
virtual void endBold() = 0; virtual void endBold() = 0;
virtual void startAlfabeticalIndexList() = 0; virtual void startAlphabeticalIndexList() = 0;
virtual void endAlfabeticalIndexList() = 0; virtual void endAlphabeticalIndexList() = 0;
virtual void writeIndexHeading(const char *s) = 0; virtual void writeIndexHeading(const char *s) = 0;
virtual void writeIndexItem(const char *ref,const char *file, virtual void writeIndexItem(const char *ref,const char *file,
const char *text) = 0; const char *text) = 0;
...@@ -109,11 +109,14 @@ class OutputGenerator ...@@ -109,11 +109,14 @@ class OutputGenerator
virtual void startEmphasis() = 0; virtual void startEmphasis() = 0;
virtual void endEmphasis() = 0; virtual void endEmphasis() = 0;
virtual void writeChar(char c) = 0; virtual void writeChar(char c) = 0;
virtual void startMemberDoc(const char *,const char *,const char *) = 0; virtual void startMemberDoc(const char *,const char *,
const char *,const char *) = 0;
virtual void endMemberDoc() = 0; virtual void endMemberDoc() = 0;
virtual void writeDoxyAnchor(const char *clName,const char *anchor,const char *name) = 0; virtual void startDoxyAnchor(const char *fileName,const char *clName,
const char *anchor,const char *name) = 0;
virtual void endDoxyAnchor() = 0;
virtual void writeLatexSpacing() = 0; virtual void writeLatexSpacing() = 0;
virtual void writeLatexLabel(const char *clName,const char *anchor) = 0; //virtual void writeLatexLabel(const char *clName,const char *anchor) = 0;
virtual void writeStartAnnoItem(const char *type,const char *file, virtual void writeStartAnnoItem(const char *type,const char *file,
const char *path,const char *name) = 0; const char *path,const char *name) = 0;
virtual void writeEndAnnoItem(const char *name) = 0; virtual void writeEndAnnoItem(const char *name) = 0;
...@@ -166,11 +169,13 @@ class OutputGenerator ...@@ -166,11 +169,13 @@ class OutputGenerator
virtual void endClassDiagram(ClassDiagram &,const char *,const char *) = 0; virtual void endClassDiagram(ClassDiagram &,const char *,const char *) = 0;
virtual void startColorFont(uchar r,uchar g,uchar b) = 0; virtual void startColorFont(uchar r,uchar g,uchar b) = 0;
virtual void endColorFont() = 0; virtual void endColorFont() = 0;
virtual void writePageRef(const char *,const char *) = 0; virtual void startPageRef() = 0;
virtual void endPageRef(const char *,const char *) = 0;
virtual void startQuickIndexItem(const char *s,const char *l) = 0; virtual void startQuickIndexItem(const char *s,const char *l) = 0;
virtual void endQuickIndexItem() = 0; virtual void endQuickIndexItem() = 0;
virtual void writeFormula(const char *,const char *) = 0; virtual void writeFormula(const char *,const char *) = 0;
virtual void writeNonBreakableSpace() = 0; virtual void writeNonBreakableSpace() = 0;
virtual void writeImage(const char *,const char *,const char *) = 0;
void clear() { b.close(); a.resize(0); b.setBuffer(a); void clear() { b.close(); a.resize(0); b.setBuffer(a);
b.open(IO_WriteOnly); t.setDevice(&b); } b.open(IO_WriteOnly); t.setDevice(&b); }
......
...@@ -226,12 +226,14 @@ void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4),a1,a2,a3,a4) ...@@ -226,12 +226,14 @@ void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4),a1,a2,a3,a4)
FORALL1(const char *a1,a1) FORALL1(const char *a1,a1)
FORALL1(char a1,a1) FORALL1(char a1,a1)
FORALL1(int a1,a1) FORALL1(int a1,a1)
#if defined(HAS_BOOL_TYPE)
FORALL1(bool a1,a1) FORALL1(bool a1,a1)
FORALL1(IndexSections a1,a1)
FORALL2(const char *a1,const char *a2,a1,a2)
FORALL2(int a1,bool a2,a1,a2)
FORALL2(bool a1,int a2,a1,a2) FORALL2(bool a1,int a2,a1,a2)
FORALL2(bool a1,bool a2,a1,a2) FORALL2(bool a1,bool a2,a1,a2)
#endif
FORALL2(int a1,bool a2,a1,a2)
FORALL1(IndexSections a1,a1)
FORALL2(const char *a1,const char *a2,a1,a2)
FORALL3(ClassDiagram &a1,const char *a2,const char *a3,a1,a2,a3) FORALL3(ClassDiagram &a1,const char *a2,const char *a3,a1,a2,a3)
FORALL3(const char *a1,const char *a2,const char *a3,a1,a2,a3) FORALL3(const char *a1,const char *a2,const char *a3,a1,a2,a3)
FORALL3(const char *a1,const char *a2,bool a3,a1,a2,a3) FORALL3(const char *a1,const char *a2,bool a3,a1,a2,a3)
......
...@@ -72,10 +72,10 @@ class OutputList ...@@ -72,10 +72,10 @@ class OutputList
{ forall(&OutputGenerator::endFile); } { forall(&OutputGenerator::endFile); }
void endPlainFile() void endPlainFile()
{ forall(&OutputGenerator::endPlainFile); } { forall(&OutputGenerator::endPlainFile); }
void startTitleHead() void startTitleHead(const char *fileName)
{ forall(&OutputGenerator::startTitleHead); } { forall(&OutputGenerator::startTitleHead,fileName); }
void endTitleHead(const char *name) void endTitleHead(const char *fileName,const char *name)
{ forall(&OutputGenerator::endTitleHead,name); } { forall(&OutputGenerator::endTitleHead,fileName,name); }
void startTitle() void startTitle()
{ forall(&OutputGenerator::startTitle); } { forall(&OutputGenerator::startTitle); }
void endTitle() void endTitle()
...@@ -96,10 +96,10 @@ class OutputList ...@@ -96,10 +96,10 @@ class OutputList
{ forall(&OutputGenerator::startEnumList); } { forall(&OutputGenerator::startEnumList); }
void endEnumList() void endEnumList()
{ forall(&OutputGenerator::endEnumList); } { forall(&OutputGenerator::endEnumList); }
void startAlfabeticalIndexList() void startAlphabeticalIndexList()
{ forall(&OutputGenerator::startAlfabeticalIndexList); } { forall(&OutputGenerator::startAlphabeticalIndexList); }
void endAlfabeticalIndexList() void endAlphabeticalIndexList()
{ forall(&OutputGenerator::endAlfabeticalIndexList); } { forall(&OutputGenerator::endAlphabeticalIndexList); }
void writeIndexHeading(const char *s) void writeIndexHeading(const char *s)
{ forall(&OutputGenerator::writeIndexHeading,s); } { forall(&OutputGenerator::writeIndexHeading,s); }
void writeIndexItem(const char *ref,const char *file,const char *text) void writeIndexItem(const char *ref,const char *file,const char *text)
...@@ -177,16 +177,20 @@ class OutputList ...@@ -177,16 +177,20 @@ class OutputList
{ forall(&OutputGenerator::endEmphasis); } { forall(&OutputGenerator::endEmphasis); }
void writeChar(char c) void writeChar(char c)
{ forall(&OutputGenerator::writeChar,c); } { forall(&OutputGenerator::writeChar,c); }
void startMemberDoc(const char *clName,const char *memName,const char *anchor) void startMemberDoc(const char *clName,const char *memName,
{ forall(&OutputGenerator::startMemberDoc,clName,memName,anchor); } const char *anchor,const char *title)
{ forall(&OutputGenerator::startMemberDoc,clName,memName,anchor,title); }
void endMemberDoc() void endMemberDoc()
{ forall(&OutputGenerator::endMemberDoc); } { forall(&OutputGenerator::endMemberDoc); }
void writeDoxyAnchor(const char *clName,const char *anchor,const char *name) void startDoxyAnchor(const char *fn, const char *cn,
{ forall(&OutputGenerator::writeDoxyAnchor,clName,anchor,name); } const char *anchor,const char *name)
{ forall(&OutputGenerator::startDoxyAnchor,fn,cn,anchor,name); }
void endDoxyAnchor()
{ forall(&OutputGenerator::endDoxyAnchor); }
void writeLatexSpacing() void writeLatexSpacing()
{ forall(&OutputGenerator::writeLatexSpacing); } { forall(&OutputGenerator::writeLatexSpacing); }
void writeLatexLabel(const char *scope,const char *anchor) //void writeLatexLabel(const char *scope,const char *anchor)
{ forall(&OutputGenerator::writeLatexLabel,scope,anchor); } //{ forall(&OutputGenerator::writeLatexLabel,scope,anchor); }
void startDescription() void startDescription()
{ forall(&OutputGenerator::startDescription); } { forall(&OutputGenerator::startDescription); }
void endDescription() void endDescription()
...@@ -289,8 +293,10 @@ class OutputList ...@@ -289,8 +293,10 @@ class OutputList
{ forall(&OutputGenerator::startColorFont,r,g,b); } { forall(&OutputGenerator::startColorFont,r,g,b); }
void endColorFont() void endColorFont()
{ forall(&OutputGenerator::endColorFont); } { forall(&OutputGenerator::endColorFont); }
void writePageRef(const char *c,const char *a) void startPageRef()
{ forall(&OutputGenerator::writePageRef,c,a); } { forall(&OutputGenerator::startPageRef); }
void endPageRef(const char *c,const char *a)
{ forall(&OutputGenerator::endPageRef,c,a); }
void startQuickIndexItem(const char *s,const char *l) void startQuickIndexItem(const char *s,const char *l)
{ forall(&OutputGenerator::startQuickIndexItem,s,l); } { forall(&OutputGenerator::startQuickIndexItem,s,l); }
void endQuickIndexItem() void endQuickIndexItem()
...@@ -299,6 +305,8 @@ class OutputList ...@@ -299,6 +305,8 @@ class OutputList
{ forall(&OutputGenerator::writeFormula,n,t); } { forall(&OutputGenerator::writeFormula,n,t); }
void writeNonBreakableSpace() void writeNonBreakableSpace()
{ forall(&OutputGenerator::writeNonBreakableSpace); } { forall(&OutputGenerator::writeNonBreakableSpace); }
void writeImage(const char *n,const char *w,const char *h)
{ forall(&OutputGenerator::writeImage,n,w,h); }
private: private:
void debug(); void debug();
...@@ -307,13 +315,15 @@ class OutputList ...@@ -307,13 +315,15 @@ class OutputList
void forall(void (OutputGenerator::*func)()); void forall(void (OutputGenerator::*func)());
FORALLPROTO1(const char *); FORALLPROTO1(const char *);
FORALLPROTO1(char); FORALLPROTO1(char);
FORALLPROTO1(IndexSections);
FORALLPROTO1(int); FORALLPROTO1(int);
#if defined(HAS_BOOL_TYPE)
FORALLPROTO1(bool); FORALLPROTO1(bool);
FORALLPROTO1(IndexSections);
FORALLPROTO2(const char *,const char *);
FORALLPROTO2(int,bool);
FORALLPROTO2(bool,int); FORALLPROTO2(bool,int);
FORALLPROTO2(bool,bool); FORALLPROTO2(bool,bool);
#endif
FORALLPROTO2(int,bool);
FORALLPROTO2(const char *,const char *);
FORALLPROTO3(const char *,const char *,bool); FORALLPROTO3(const char *,const char *,bool);
FORALLPROTO3(uchar,uchar,uchar); FORALLPROTO3(uchar,uchar,uchar);
FORALLPROTO3(const char *,const char *,const char *); FORALLPROTO3(const char *,const char *,const char *);
......
...@@ -1155,7 +1155,7 @@ BN [ \t\r\n] ...@@ -1155,7 +1155,7 @@ BN [ \t\r\n]
ifcount++; ifcount++;
//printf("#if... depth=%d\n",ifcount); //printf("#if... depth=%d\n",ifcount);
} }
<SkipCommand>"else"/[^a-z_A-Z0-9] { <SkipCommand>"else" {
//printf("Else! ifcount=%d otherCaseDone=%d\n",ifcount,otherCaseDone()); //printf("Else! ifcount=%d otherCaseDone=%d\n",ifcount,otherCaseDone());
if (ifcount==0 && !otherCaseDone()) if (ifcount==0 && !otherCaseDone())
{ {
...@@ -1179,7 +1179,7 @@ BN [ \t\r\n] ...@@ -1179,7 +1179,7 @@ BN [ \t\r\n]
} }
} }
} }
<SkipCommand>"endif"/[^a-z_A-Z0-9] { <SkipCommand>"endif" {
decrLevel(); decrLevel();
if (--ifcount<0) if (--ifcount<0)
{ {
......
...@@ -115,6 +115,7 @@ static int includeFileLength = 0; ...@@ -115,6 +115,7 @@ static int includeFileLength = 0;
static bool firstLine; static bool firstLine;
static bool isTypedef; static bool isTypedef;
static bool inParamBlock; static bool inParamBlock;
static bool inRetValBlock;
static bool inExceptionBlock; static bool inExceptionBlock;
static bool inSeeBlock; static bool inSeeBlock;
static bool inReturnBlock; static bool inReturnBlock;
...@@ -149,6 +150,7 @@ static QCString *copyArgString; ...@@ -149,6 +150,7 @@ static QCString *copyArgString;
static ArgumentList *currentArgumentList; static ArgumentList *currentArgumentList;
static QCString *currentTemplateSpec; static QCString *currentTemplateSpec;
static QCString curImageName;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
...@@ -186,6 +188,7 @@ static void initParser() ...@@ -186,6 +188,7 @@ static void initParser()
firstLine = TRUE; firstLine = TRUE;
isTypedef = FALSE; isTypedef = FALSE;
inParamBlock = FALSE; inParamBlock = FALSE;
inRetValBlock = FALSE;
inExceptionBlock = FALSE; inExceptionBlock = FALSE;
inSeeBlock = FALSE; inSeeBlock = FALSE;
inReturnBlock = FALSE; inReturnBlock = FALSE;
...@@ -534,7 +537,7 @@ static void newDocState(); ...@@ -534,7 +537,7 @@ static void newDocState();
static bool inBlock() static bool inBlock()
{ {
return inParamBlock || inSeeBlock || inReturnBlock || inAuthorBlock || return inParamBlock || inRetValBlock || inSeeBlock || inReturnBlock || inAuthorBlock ||
inVersionBlock || inDateBlock || inWarningBlock || inBugBlock || inVersionBlock || inDateBlock || inWarningBlock || inBugBlock ||
inParBlock || inExceptionBlock; inParBlock || inExceptionBlock;
} }
...@@ -542,7 +545,7 @@ static bool inBlock() ...@@ -542,7 +545,7 @@ static bool inBlock()
static void endBlock() static void endBlock()
{ {
outDoc->endDescList(); outDoc->endDescList();
inParamBlock=inSeeBlock=inReturnBlock=inAuthorBlock= inParamBlock=inRetValBlock=inSeeBlock=inReturnBlock=inAuthorBlock=
inVersionBlock=inDateBlock=inBugBlock=inWarningBlock= inVersionBlock=inDateBlock=inBugBlock=inWarningBlock=
inParBlock=inExceptionBlock=FALSE; inParBlock=inExceptionBlock=FALSE;
} }
...@@ -692,6 +695,7 @@ VAR [vV][aA][rR] ...@@ -692,6 +695,7 @@ VAR [vV][aA][rR]
%x ClassName %x ClassName
%x ClassVar %x ClassVar
%x Bases %x Bases
%x BasesProt
%x NextSemi %x NextSemi
%x FindMembers %x FindMembers
%x FindMemberName %x FindMemberName
...@@ -803,6 +807,10 @@ VAR [vV][aA][rR] ...@@ -803,6 +807,10 @@ VAR [vV][aA][rR]
%x DocRefArgStart %x DocRefArgStart
%x DocRefItem %x DocRefItem
%x DocRefItemName %x DocRefItemName
%x DocImage
%x DocHtmlImageName
%x DocLatexImageName
%x DocLatexImageWidth
%x SectionLabel %x SectionLabel
%x SectionTitle %x SectionTitle
%x SkipTemplate %x SkipTemplate
...@@ -1031,7 +1039,7 @@ VAR [vV][aA][rR] ...@@ -1031,7 +1039,7 @@ VAR [vV][aA][rR]
outDoc->writeDescItem(); outDoc->writeDescItem();
} }
} }
<DocScan>("\\"|"@")"bug"{BN}+ { <DocScan>("\\"|"@")"bug"[s]?{BN}+ {
endArgumentList(); endArgumentList();
if (!inBugBlock) if (!inBugBlock)
{ {
...@@ -1107,7 +1115,7 @@ VAR [vV][aA][rR] ...@@ -1107,7 +1115,7 @@ VAR [vV][aA][rR]
outDoc->docify(", "); outDoc->docify(", ");
} }
} }
<DocScan>("\\"|"@")"return"{BN}+ { <DocScan>("\\"|"@")("return"([s])?|"result"){BN}+ {
endArgumentList(); endArgumentList();
if (!inReturnBlock) if (!inReturnBlock)
{ {
...@@ -1150,7 +1158,6 @@ VAR [vV][aA][rR] ...@@ -1150,7 +1158,6 @@ VAR [vV][aA][rR]
if (inBlock()) endBlock(); if (inBlock()) endBlock();
inParamBlock=TRUE; inParamBlock=TRUE;
outDoc->startDescList(); outDoc->startDescList();
//outDoc->writeBoldString("Parameters: ");
outDoc->startBold(); outDoc->startBold();
scanString(theTranslator->trParameters()+": "); scanString(theTranslator->trParameters()+": ");
outDoc->endBold(); outDoc->endBold();
...@@ -1158,6 +1165,20 @@ VAR [vV][aA][rR] ...@@ -1158,6 +1165,20 @@ VAR [vV][aA][rR]
} }
BEGIN(DocParam); BEGIN(DocParam);
} }
<DocScan>("\\"|"@")"retval"{BN}+ {
endArgumentList();
if (!inRetValBlock)
{
if (inBlock()) endBlock();
inRetValBlock=TRUE;
outDoc->startDescList();
outDoc->startBold();
scanString(theTranslator->trReturnValues()+": ");
outDoc->endBold();
outDoc->endDescTitle();
}
BEGIN(DocParam);
}
<DocScan>("\\"|"@")"exception"{BN}+ { <DocScan>("\\"|"@")"exception"{BN}+ {
endArgumentList(); endArgumentList();
if (!inExceptionBlock) if (!inExceptionBlock)
...@@ -1174,7 +1195,7 @@ VAR [vV][aA][rR] ...@@ -1174,7 +1195,7 @@ VAR [vV][aA][rR]
BEGIN(DocException); BEGIN(DocException);
} }
<DocScan>"\\capt".* <DocScan>"\\capt".*
<DocParam>{SCOPENAME} { <DocParam>[a-z_A-Z0-9:]+ {
outDoc->writeDescItem(); outDoc->writeDescItem();
outDoc->startEmphasis(); outDoc->startEmphasis();
outDoc->docify(yytext); outDoc->docify(yytext);
...@@ -1290,6 +1311,52 @@ VAR [vV][aA][rR] ...@@ -1290,6 +1311,52 @@ VAR [vV][aA][rR]
} }
BEGIN(DocScan); BEGIN(DocScan);
} }
<DocScan>("\\"|"@")"image"{B}+ {
BEGIN(DocImage);
}
<DocImage>[hH][tT][mM][lL] {
BEGIN(DocHtmlImageName);
}
<DocImage>[lL][aA][tT][eE][xX] {
BEGIN(DocLatexImageName);
}
<DocHtmlImageName>{FILE}|{URLMASK} {
outDoc->disableAllBut(OutputGenerator::Html);
outDoc->writeImage(yytext,0,0);
outDoc->enableAll();
BEGIN(DocScan);
}
<DocLatexImageName>{FILE} {
curImageName = yytext;
BEGIN(DocLatexImageWidth);
}
<DocLatexImageWidth>\n { // no width specified
outDoc->disableAllBut(OutputGenerator::Html);
outDoc->writeImage(curImageName,0,0);
outDoc->enableAll();
BEGIN(DocScan);
}
<DocLatexImageWidth>"width"{B}*"="{B}*[0-9\.]+({B}*{ID})? {
outDoc->disableAllBut(OutputGenerator::Latex);
outDoc->writeImage(curImageName,yytext,0);
outDoc->enableAll();
BEGIN(DocScan);
}
<DocLatexImageWidth>"height"{B}*"="{B}*[0-9\.]+({B}*{ID})? {
outDoc->disableAllBut(OutputGenerator::Latex);
outDoc->writeImage(curImageName,0,yytext);
outDoc->enableAll();
BEGIN(DocScan);
}
<DocImage>[a-z_A-Z0-9\.\-]+ {
warn("Warning: %s is an unsupported output format for \\image\n",yytext);
}
<DocImage,DocHtmlImageName,DocLatexImageName>\n {
warn("Warning: invalid \\image command found!\n");
yyLineNr++;
outDoc->enableAll();
BEGIN(DocScan);
}
<DocScan>("\\"|"@")"code"/{BN}+ { <DocScan>("\\"|"@")"code"/{BN}+ {
outDoc->startCodeFragment(); outDoc->startCodeFragment();
codeBlock.resize(0); codeBlock.resize(0);
...@@ -1697,9 +1764,6 @@ VAR [vV][aA][rR] ...@@ -1697,9 +1764,6 @@ VAR [vV][aA][rR]
current->argList->clear(); current->argList->clear();
lineCount() ; lineCount() ;
} }
/*
<FindMembers>"inline"
*/
<FindMembers>{BN}+ { <FindMembers>{BN}+ {
lineCount(); lineCount();
} }
...@@ -1715,7 +1779,9 @@ VAR [vV][aA][rR] ...@@ -1715,7 +1779,9 @@ VAR [vV][aA][rR]
current->virt = Virtual; current->virt = Virtual;
lineCount(); lineCount();
} }
<FindMembers>{B}*"inline"{BN}+ { lineCount(); } <FindMembers>{B}*"inline"{BN}+ { current->inLine = TRUE;
lineCount();
}
<FindMembers>{B}*"typename"{BN}+ { lineCount(); } <FindMembers>{B}*"typename"{BN}+ { lineCount(); }
<FindMembers>{B}*"namespace"{BN}+ { <FindMembers>{B}*"namespace"{BN}+ {
isTypedef=FALSE; isTypedef=FALSE;
...@@ -2177,7 +2243,8 @@ VAR [vV][aA][rR] ...@@ -2177,7 +2243,8 @@ VAR [vV][aA][rR]
else else
{ {
QCString &cn = current->name; QCString &cn = current->name;
QCString rn = stripAnnonymousScope(current_root->name); //QCString rn = stripAnnonymousScope(current_root->name);
QCString rn = current_root->name.copy();
//printf("cn=`%s' rn=`%s'\n",cn.data(),rn.data()); //printf("cn=`%s' rn=`%s'\n",cn.data(),rn.data());
if (!cn.isEmpty() && !rn.isEmpty() && if (!cn.isEmpty() && !rn.isEmpty() &&
(current_root->section & Entry::SCOPE_MASK)) (current_root->section & Entry::SCOPE_MASK))
...@@ -2202,8 +2269,10 @@ VAR [vV][aA][rR] ...@@ -2202,8 +2269,10 @@ VAR [vV][aA][rR]
//printf("adding `%s' `%s' `%s' brief=%s\n",current->type.data(),current->name.data(),current->args.data(),current->brief.data()); //printf("adding `%s' `%s' `%s' brief=%s\n",current->type.data(),current->name.data(),current->args.data(),current->brief.data());
current_root->addSubEntry( current ) ; current_root->addSubEntry( current ) ;
current = new Entry(*current); current = new Entry(*current);
if (current->section == Entry::NAMESPACE_SEC) if (current->section==Entry::NAMESPACE_SEC ||
{ // a namespace ends with a closing bracket current->section==Entry::INTERFACE_SEC
)
{ // namespaces and interfaces ends with a closing bracket without semicolon
current->reset(); current->reset();
current->protection = protection ; current->protection = protection ;
current->sig = sig; current->sig = sig;
...@@ -2254,7 +2323,33 @@ VAR [vV][aA][rR] ...@@ -2254,7 +2323,33 @@ VAR [vV][aA][rR]
msType = yytext; msType=msType.left(i); msType = yytext; msType=msType.left(i);
} }
<MemberSpec>[,;] { <MemberSpec>[,;] {
if (msName.length()>0) if (msName.isEmpty() && !current->name.isEmpty())
/* && (current->section & Entry::COMPOUND_MASK)) */
{
// see if the compound does not have a name or is inside another
// annonymous compound. If so we insert a
// special `annonymous' variable.
Entry *p=current_root;
while (p)
{
// only look for class scopes, not namespace scopes
if (p->section & Entry::COMPOUND_MASK)
{
//printf("Trying scope `%s'\n",p->name.data());
int i=p->name.findRev("::");
int pi = (i==-1) ? 0 : i+2;
if (p->name.at(pi)=='@')
{
// annonymous compound inside -> insert dummy variable name
//printf("Adding annonymous variable for scope %s\n",p->name.data());
msName.sprintf("@%d",anonCount++);
break;
}
}
p=p->parent;
}
}
if (!msName.isEmpty())
{ {
Entry *varEntry=new Entry; Entry *varEntry=new Entry;
varEntry->protection = current->protection ; varEntry->protection = current->protection ;
...@@ -2518,6 +2613,11 @@ VAR [vV][aA][rR] ...@@ -2518,6 +2613,11 @@ VAR [vV][aA][rR]
lineCount() ; lineCount() ;
BEGIN( ExcpRound ) ; BEGIN( ExcpRound ) ;
} }
<FuncQual>{BN}*"raises"{BN}*"(" {
current->exception = " raises(" ;
lineCount() ;
BEGIN( ExcpRound ) ;
}
<ExcpRound>"(" { current->exception += *yytext ; <ExcpRound>"(" { current->exception += *yytext ;
++bracketCount ; ++bracketCount ;
} }
...@@ -2588,7 +2688,8 @@ VAR [vV][aA][rR] ...@@ -2588,7 +2688,8 @@ VAR [vV][aA][rR]
{ {
//printf("Scanner.l: prototype? type=`%s' name=`%s' args=`%s'\n",current->type.data(),current->name.data(),current->args.data()); //printf("Scanner.l: prototype? type=`%s' name=`%s' args=`%s'\n",current->type.data(),current->name.data(),current->args.data());
QRegExp re("([^)]*)"); QRegExp re("([^)]*)");
if (!current->type.isNull() && current->type.find(re,0)!=-1) if (!current->type.isNull() &&
(current->type.find(re,0)!=-1 || current->type.left(8)=="typedef "))
{ {
//printf("Scanner.l: found function variable!\n"); //printf("Scanner.l: found function variable!\n");
current->section = Entry::VARIABLE_SEC; current->section = Entry::VARIABLE_SEC;
...@@ -2600,9 +2701,8 @@ VAR [vV][aA][rR] ...@@ -2600,9 +2701,8 @@ VAR [vV][aA][rR]
current->proto = TRUE; current->proto = TRUE;
} }
} }
//printf("Adding entry `%s' groupId=%d groupHeader=`%s'\n", //printf("Adding entry `%s' inLine`%d'\n",
// current->name.data(),current->mGrpId,current->mGrpId!=-1 ? // current->name.data(),current->inLine);
// memberGroupDict[current->mGrpId]->header().data() : "");
previous = current; previous = current;
current_root->addSubEntry(current); current_root->addSubEntry(current);
current = new Entry ; current = new Entry ;
...@@ -2615,6 +2715,8 @@ VAR [vV][aA][rR] ...@@ -2615,6 +2715,8 @@ VAR [vV][aA][rR]
lastCurlyContext = FindMembers; lastCurlyContext = FindMembers;
if( *yytext == '{' ) if( *yytext == '{' )
{ {
if (current_root->section & Entry::COMPOUND_MASK)
previous->inLine = TRUE;
addToBody(yytext); addToBody(yytext);
BEGIN( SkipCurly ) ; BEGIN( SkipCurly ) ;
} }
...@@ -2779,7 +2881,7 @@ VAR [vV][aA][rR] ...@@ -2779,7 +2881,7 @@ VAR [vV][aA][rR]
baseProt=Private; baseProt=Private;
baseVirt=Normal; baseVirt=Normal;
baseName.resize(0); baseName.resize(0);
BEGIN( Bases ) ; BEGIN( BasesProt ) ;
} }
<ClassVar>[;=*&] { <ClassVar>[;=*&] {
unput(*yytext); unput(*yytext);
...@@ -2792,17 +2894,25 @@ VAR [vV][aA][rR] ...@@ -2792,17 +2894,25 @@ VAR [vV][aA][rR]
current->name.sprintf("@%d",anonCount++); current->name.sprintf("@%d",anonCount++);
BEGIN( Curly ) ; BEGIN( Curly ) ;
} }
<Bases>"virtual" { baseVirt = Virtual; } <BasesProt>"virtual" { baseVirt = Virtual; }
<Bases>"public" { baseProt = Public; } <BasesProt>"public" { baseProt = Public; }
<Bases>"protected" { baseProt = Protected; } <BasesProt>"protected" { baseProt = Protected; }
<Bases>"private" { baseProt = Private; } <BasesProt>"private" { baseProt = Private; }
<Bases>({ID}{BN}*"::"{BN}*)*{ID} { <BasesProt>{BN} {}
<BasesProt>. { unput(*yytext); BEGIN(Bases); }
<Bases>("::")*{BN}*({ID}{BN}*"::"{BN}*)*{ID} {
//current->extends->append( //current->extends->append(
// new BaseInfo(yytext,baseProt,baseVirt) // new BaseInfo(yytext,baseProt,baseVirt)
//) ; //) ;
baseName += yytext; if (*yytext != ':')
current->args += ' ' ; baseName += yytext;
current->args += yytext ; else
baseName += (yytext+2);
current->args += ' ';
if (*yytext != ':')
current->args += yytext;
else
current->args += (yytext+2);
} }
<ClassVar>"<" { current->name += *yytext; <ClassVar>"<" { current->name += *yytext;
sharpCount=1; sharpCount=1;
...@@ -2845,6 +2955,7 @@ VAR [vV][aA][rR] ...@@ -2845,6 +2955,7 @@ VAR [vV][aA][rR]
baseProt=Private; baseProt=Private;
baseVirt=Normal; baseVirt=Normal;
baseName.resize(0); baseName.resize(0);
BEGIN(BasesProt);
} }
<Bases>{B}*"{"{B}* { current->fileName = yyFileName ; <Bases>{B}*"{"{B}* { current->fileName = yyFileName ;
current->startLine = yyLineNr ; current->startLine = yyLineNr ;
...@@ -2940,6 +3051,10 @@ VAR [vV][aA][rR] ...@@ -2940,6 +3051,10 @@ VAR [vV][aA][rR]
lastBriefContext=Doc; lastBriefContext=Doc;
BEGIN( ClassDocBrief ); BEGIN( ClassDocBrief );
} }
<JavaDoc>"\\brief"{B}+ {
lastBriefContext=tmpDocType;
BEGIN( ClassDocBrief );
}
<JavaDoc>^(({B}*"*"+)?){BL} { <JavaDoc>^(({B}*"*"+)?){BL} {
lineCount(); lineCount();
if (!current->brief.stripWhiteSpace().isEmpty()) if (!current->brief.stripWhiteSpace().isEmpty())
...@@ -3061,6 +3176,12 @@ VAR [vV][aA][rR] ...@@ -3061,6 +3176,12 @@ VAR [vV][aA][rR]
current->startLine = yyLineNr; current->startLine = yyLineNr;
BEGIN( PageDocArg1 ); BEGIN( PageDocArg1 );
} }
<Doc,JavaDoc>{B}*("\\"|"@")"mainpage"{B}* {
current->section = Entry::MAINPAGEDOC_SEC;
current->fileName = yyFileName;
current->startLine = yyLineNr;
BEGIN( PageDocArg2 );
}
<Doc,JavaDoc>{B}*("\\"|"@")"file"{B}* { <Doc,JavaDoc>{B}*("\\"|"@")"file"{B}* {
current->section = Entry::FILEDOC_SEC; current->section = Entry::FILEDOC_SEC;
current->fileName = yyFileName; current->fileName = yyFileName;
...@@ -3150,8 +3271,6 @@ VAR [vV][aA][rR] ...@@ -3150,8 +3271,6 @@ VAR [vV][aA][rR]
newDocState(); newDocState();
} }
<FileDocArg1>"\n" { <FileDocArg1>"\n" {
//warn("Warning: missing argument after "
// "\\file at line %d of %s.\n",yyLineNr,yyFileName);
current->name = yyFileName; current->name = yyFileName;
yyLineNr++; yyLineNr++;
newDocState(); newDocState();
...@@ -3430,17 +3549,18 @@ VAR [vV][aA][rR] ...@@ -3430,17 +3549,18 @@ VAR [vV][aA][rR]
current->brief=current->brief.stripWhiteSpace(); current->brief=current->brief.stripWhiteSpace();
BEGIN( lastBriefContext ); BEGIN( lastBriefContext );
} }
<ClassDocBrief>{BS}/("\\"|"@")"image" { BEGIN( lastBriefContext ); }
<ClassDocBrief>{BS}/("\\"|"@")"author" { BEGIN( lastBriefContext ); } <ClassDocBrief>{BS}/("\\"|"@")"author" { BEGIN( lastBriefContext ); }
<ClassDocBrief>{BS}/("\\"|"@")"internal" { BEGIN( lastBriefContext ); } <ClassDocBrief>{BS}/("\\"|"@")"internal" { BEGIN( lastBriefContext ); }
<ClassDocBrief>{BS}/("\\"|"@")"version" { BEGIN( lastBriefContext ); } <ClassDocBrief>{BS}/("\\"|"@")"version" { BEGIN( lastBriefContext ); }
<ClassDocBrief>{BS}/"\\date" { BEGIN( lastBriefContext ); } <ClassDocBrief>{BS}/("\\"|"@")"date" { BEGIN( lastBriefContext ); }
<ClassDocBrief>{BS}/("\\"|"@")"param" { BEGIN( lastBriefContext ); } <ClassDocBrief>{BS}/("\\"|"@")"param" { BEGIN( lastBriefContext ); }
<ClassDocBrief>{BS}/("\\"|"@")"exception" { BEGIN( lastBriefContext ); } <ClassDocBrief>{BS}/("\\"|"@")"exception" { BEGIN( lastBriefContext ); }
<ClassDocBrief>{BS}/("\\"|"@")"return" { BEGIN( lastBriefContext ); } <ClassDocBrief>{BS}/("\\"|"@")"return" { BEGIN( lastBriefContext ); }
<ClassDocBrief>{BS}/("\\sa"|"@see") { BEGIN( lastBriefContext ); } <ClassDocBrief>{BS}/("\\sa"|"@see") { BEGIN( lastBriefContext ); }
<ClassDocBrief>{BS}/("\\"|"@")"bug" { BEGIN( lastBriefContext ); } <ClassDocBrief>{BS}/("\\"|"@")"bug" { BEGIN( lastBriefContext ); }
<ClassDocBrief>{BS}/("\\"|"@")"warning" { BEGIN( lastBriefContext ); } <ClassDocBrief>{BS}/("\\"|"@")"warning" { BEGIN( lastBriefContext ); }
<ClassDocBrief>{BS}/("\\"|"@")"par"{BN}+ { BEGIN( lastBriefContext ); } <ClassDocBrief>{BS}/("\\"|"@")"par"{BN}+ { BEGIN( lastBriefContext ); }
<ClassDocBrief>{BS}/("\\brief"|"@short"){BN}+ { <ClassDocBrief>{BS}/("\\brief"|"@short"){BN}+ {
lastBriefContext=YY_START; lastBriefContext=YY_START;
BEGIN( ClassDocBrief ); BEGIN( ClassDocBrief );
...@@ -3529,6 +3649,7 @@ VAR [vV][aA][rR] ...@@ -3529,6 +3649,7 @@ VAR [vV][aA][rR]
current->name = current->name.stripWhiteSpace(); current->name = current->name.stripWhiteSpace();
newDocState(); newDocState();
} }
<Doc>[a-z_A-Z0-9]+ { current->doc += yytext; }
<Doc>. { current->doc += *yytext; } <Doc>. { current->doc += *yytext; }
<DefLineDoc,LineDoc>. { current->brief += *yytext; } <DefLineDoc,LineDoc>. { current->brief += *yytext; }
<Doc>\n { yyLineNr++; current->doc += *yytext; } <Doc>\n { yyLineNr++; current->doc += *yytext; }
...@@ -3564,6 +3685,12 @@ VAR [vV][aA][rR] ...@@ -3564,6 +3685,12 @@ VAR [vV][aA][rR]
BEGIN(lastAfterDocContext); BEGIN(lastAfterDocContext);
} }
<AfterDocBrief>"."/{BN} { BEGIN(AfterDoc); } <AfterDocBrief>"."/{BN} { BEGIN(AfterDoc); }
<LineDoc,AfterDocBrief,AfterDocLine>("\\"|"@")"internal" {
current->brief+="\\internal";
}
<Doc,AfterDoc>("\\"|"@")"internal" {
current->doc+="\\internal";
}
<AfterDoc>("\\"|"@")"brief" { BEGIN(AfterDocBrief); } <AfterDoc>("\\"|"@")"brief" { BEGIN(AfterDocBrief); }
<AfterDoc>"/*"|"//" { current->doc+=yytext; } <AfterDoc>"/*"|"//" { current->doc+=yytext; }
<AfterDoc>^{B}*"*"+/[^/] <AfterDoc>^{B}*"*"+/[^/]
......
...@@ -44,6 +44,7 @@ class SectionDict : public QDict<SectionInfo> ...@@ -44,6 +44,7 @@ class SectionDict : public QDict<SectionInfo>
{ {
public: public:
SectionDict(int size) : QDict<SectionInfo>(size) {} SectionDict(int size) : QDict<SectionInfo>(size) {}
~SectionDict() {}
}; };
#endif #endif
...@@ -63,7 +63,7 @@ static void addClass(const char *name,const char *fileName) ...@@ -63,7 +63,7 @@ static void addClass(const char *name,const char *fileName)
static void addFile(const char *name) static void addFile(const char *name)
{ {
//printf("adding file %s\n",name); //printf("adding file %s tagName=`%s'\n",name,tagName.data());
fd = new FileDef(0,name,tagName); fd = new FileDef(0,name,tagName);
FileName *mn; FileName *mn;
if ((mn=inputNameDict[name])) if ((mn=inputNameDict[name]))
......
...@@ -687,7 +687,7 @@ class Translator ...@@ -687,7 +687,7 @@ class Translator
case ClassDef::Union: result+="union"; break; case ClassDef::Union: result+="union"; break;
case ClassDef::Interface: result+="interface"; break; case ClassDef::Interface: result+="interface"; break;
} }
result+="was generated from the following file"; result+=" was generated from the following file";
if (single) result+=":"; else result+="s:"; if (single) result+=":"; else result+="s:";
return result; return result;
} }
...@@ -696,9 +696,26 @@ class Translator ...@@ -696,9 +696,26 @@ class Translator
* list. * list.
*/ */
virtual QCString trAlphabeticalList() virtual QCString trAlphabeticalList()
{ { return "Alphabetical List"; }
return "Alphabetical List";
} //////////////////////////////////////////////////////////////////////////
// new since 0.49-990901
//////////////////////////////////////////////////////////////////////////
/*! This is used as the heading text for the retval command. */
virtual QCString trReturnValues()
{ return "Return values"; }
/*! This is in the (quick) index as a link to the main page (index.html)
*/
virtual QCString trMainPage()
{ return "Main Page"; }
/*! This is used in references to page that are put in the LaTeX
* documentation. It should be an abbreviation of the word page.
*/
virtual QCString trPageAbbreviation()
{ return "p."; }
}; };
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
/** /**
* translator_es.h modifief by Francisco Oltra * translator_es.h modified by Francisco Oltra
* Some notes: * Some notes:
* - Computer related use of the spanish language differs from * - Computer related use of the spanish language differs from
* country to country, so some words might not sound so good * country to country, so some words might not sound so good
......
...@@ -24,89 +24,138 @@ ...@@ -24,89 +24,138 @@
class TranslatorFrench : public Translator class TranslatorFrench : public Translator
{ {
public: public:
/*! returns the name of the package that is included by LaTeX */
QCString latexBabelPackage() QCString latexBabelPackage()
{ return "french"; } { return "french"; }
QCString trInherits()
{ return "Hérite de"; } /*! used in the compound documentation before a list of related functions. */
QCString trAnd()
{ return "et"; }
QCString trInheritedBy()
{ return "Dérivée par"; }
QCString trRelatedFunctions() QCString trRelatedFunctions()
{ return "Fonctions associées"; } { return "Fonctions associées"; }
/*! subscript for the related functions. */
QCString trRelatedSubscript() QCString trRelatedSubscript()
{ return "(Noter que ces fonctions ne sont pas des méthodes de la classe)"; } { return "(Noter que ces fonctions ne sont pas des méthodes de la classe)"; }
/*! header that is put before the detailed description of files, classes and namespaces. */
QCString trDetailedDescription() QCString trDetailedDescription()
{ return "Description détaillée"; } { return "Description détaillée"; }
/*! header that is put before the list of typedefs. */
QCString trMemberTypedefDocumentation() QCString trMemberTypedefDocumentation()
{ return "Documentation des types imbriqués"; } { return "Documentation des types imbriqués"; }
/*! header that is put before the list of enumerations. */
QCString trMemberEnumerationDocumentation() QCString trMemberEnumerationDocumentation()
{ return "Documentation des énumérations imbriqués"; } { return "Documentation des énumérations imbriqués"; }
/*! header that is put before the list of member functions. */
QCString trMemberFunctionDocumentation() QCString trMemberFunctionDocumentation()
{ return "Documentation des méthodes"; } { return "Documentation des méthodes"; }
/*! header that is put before the list of member attributes. */
QCString trMemberDataDocumentation() QCString trMemberDataDocumentation()
{ return "Documentation des données imbriqués"; } { return "Documentation des données imbriqués"; }
QCString trGeneratedFrom(const char *s,bool single)
{ /*! this is the text of a link put after brief descriptions. */
QCString result=(QCString)"La documentation pour cette"+s+
" a été générée à partir ";
if (single) result+="du fichier suivant:";
else result+="des fichiers suivants:";
return result;
}
QCString trMore() QCString trMore()
{ return "Plus de détails..."; } { return "Plus de détails..."; }
QCString trReference()
{ return "Référence"; } /*! put in the class documentation */
QCString trListOfAllMembers() QCString trListOfAllMembers()
{ return "Liste de tous les membres"; } { return "Liste de tous les membres"; }
/*! used as the title of the "list of all members" page of a class */
QCString trMemberList() QCString trMemberList()
{ return "Liste des membres"; } { return "Liste des membres"; }
/*! this is the first part of a sentence that is followed by a class name */
QCString trThisIsTheListOfAllMembers() QCString trThisIsTheListOfAllMembers()
{ return "Ceci est la liste complète des membres de"; } { return "Ceci est la liste complète des membres de"; }
/*! this is the remainder of the sentence after the class name */
QCString trIncludingInheritedMembers() QCString trIncludingInheritedMembers()
{ return "y compris des membres des classes héritées."; } { return "y compris des membres des classes héritées."; }
/*! this is put at the author sections at the bottom of man pages.
* parameter s is name of the project name.
*/
QCString trGeneratedAutomatically(const char *s) QCString trGeneratedAutomatically(const char *s)
{ QCString result="Généré automatiquement par Doxygen"; { QCString result="Généré automatiquement par Doxygen";
if (s) result+=(QCString)" pour "+s; if (s) result+=(QCString)" pour "+s;
result+=" à partir du code source."; result+=" à partir du code source.";
return result; return result;
} }
/*! put after an enum name in the list of all members */
QCString trEnumName() QCString trEnumName()
{ return "énumération"; } { return "énumération"; }
/*! put after an enum value in the list of all members */
QCString trEnumValue() QCString trEnumValue()
{ return "élément d'une énumération"; } { return "élément d'une énumération"; }
/*! put after an undocumented member in the list of all members */
QCString trDefinedIn() QCString trDefinedIn()
{ return "défini dans"; } { return "défini dans"; }
/*! put as in introduction in the verbatim header file of a class.
* parameter f is the name of the include file.
*/
QCString trIncludeFile() QCString trIncludeFile()
{ return "Fichier inclu"; } { return "Fichier inclu"; }
QCString trVerbatimText(const char *f) QCString trVerbatimText(const char *f)
{ return (QCString)"Ce texte provient du fichier inclu "+f+"."; } { return (QCString)"Ce texte provient du fichier inclu "+f+"."; }
// quick reference sections
/*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \group command).
*/
QCString trModules() QCString trModules()
{ return "Modules"; } { return "Modules"; }
/*! This is put above each page as a link to the class hierarchy */
QCString trClassHierarchy() QCString trClassHierarchy()
{ return "Hiérarchie des classes"; } { return "Hiérarchie des classes"; }
/*! This is put above each page as a link to the list of annotated classes */
QCString trCompoundList() QCString trCompoundList()
{ return "Liste des composants"; } { return "Liste des composants";
/*! This is put above each page as a link to the list of documented files */}
QCString trFileList() QCString trFileList()
{ return "Liste des fichiers"; } { return "Liste des fichiers"; }
/*! This is put above each page as a link to the list of all verbatim headers */
QCString trHeaderFiles() QCString trHeaderFiles()
{ return "Fichiers d'entête"; } { return "Fichiers d'entête"; }
/*! This is put above each page as a link to all members of compounds. */
QCString trCompoundMembers() QCString trCompoundMembers()
{ return "Composants"; } { return "Composants"; }
/*! This is put above each page as a link to all members of files. */
QCString trFileMembers() QCString trFileMembers()
{ return "Déclarations"; } { return "Déclarations"; }
/*! This is put above each page as a link to all related pages. */
QCString trRelatedPages() QCString trRelatedPages()
{ return "Pages associées"; } { return "Pages associées"; }
/*! This is put above each page as a link to all examples. */
QCString trExamples() QCString trExamples()
{ return "Exemples"; } { return "Exemples"; }
/*! This is put above each page as a link to the search engine. */
QCString trSearch() QCString trSearch()
{ return "Recherche"; } { return "Recherche"; }
/*! This is an introduction to the class hierarchy. */
QCString trClassHierarchyDescription() QCString trClassHierarchyDescription()
{ return "Cette liste d'héritage est, autant que possible, " { return "Cette liste d'héritage est, autant que possible, "
"classée par ordre alphabétique"; } "classée par ordre alphabétique"; }
/*! This is an introduction to the list with all files. */
QCString trFileListDescription(bool extractAll) QCString trFileListDescription(bool extractAll)
{ {
QCString result="Liste de tous les fichiers "; QCString result="Liste de tous les fichiers ";
...@@ -114,10 +163,14 @@ class TranslatorFrench : public Translator ...@@ -114,10 +163,14 @@ class TranslatorFrench : public Translator
result+="avec une brève description :"; result+="avec une brève description :";
return result; return result;
} }
/*! This is an introduction to the annotated compound list. */
QCString trCompoundListDescription() QCString trCompoundListDescription()
{ return "Liste des classes, des strutures et des unions " { return "Liste des classes, des strutures et des unions "
"avec une brève description :"; "avec une brève description :";
} }
/*! This is an introduction to the page with all class members. */
QCString trCompoundMembersDescription(bool extractAll) QCString trCompoundMembersDescription(bool extractAll)
{ {
QCString result="Liste de tous les membres de classe "; QCString result="Liste de tous les membres de classe ";
...@@ -127,6 +180,8 @@ class TranslatorFrench : public Translator ...@@ -127,6 +180,8 @@ class TranslatorFrench : public Translator
else result+="les classes auxquelles ils appartiennent :"; else result+="les classes auxquelles ils appartiennent :";
return result; return result;
} }
/*! This is an introduction to the page with all file members. */
QCString trFileMembersDescription(bool extractAll) QCString trFileMembersDescription(bool extractAll)
{ {
QCString result="Liste de toutes les déclarations"; QCString result="Liste de toutes les déclarations";
...@@ -137,79 +192,198 @@ class TranslatorFrench : public Translator ...@@ -137,79 +192,198 @@ class TranslatorFrench : public Translator
else result+="les fichiers dans lesquels elles sont définies :"; else result+="les fichiers dans lesquels elles sont définies :";
return result; return result;
} }
/*! This is an introduction to the page with the list of all header files. */
QCString trHeaderFilesDescription() QCString trHeaderFilesDescription()
{ return "Liste de tous les fichiers d'entête constituant " { return "Liste de tous les fichiers d'entête constituant "
"l'interface de programmation :"; } "l'interface de programmation :"; }
/*! This is an introduction to the page with the list of all examples */
QCString trExamplesDescription() QCString trExamplesDescription()
{ return "Liste de tous les exemples :"; } { return "Liste de tous les exemples :"; }
/*! This is an introduction to the page with the list of related pages */
QCString trRelatedPagesDescription() QCString trRelatedPagesDescription()
{ return "Liste de toutes les pages de documentation associées :"; } { return "Liste de toutes les pages de documentation associées :"; }
/*! This is an introduction to the page with the list of class/file groups */
QCString trModulesDescription() QCString trModulesDescription()
{ return "Liste de tous les modules"; } { return "Liste de tous les modules"; }
/*! This sentences is used in the annotated class/file lists if no brief
* description is given.
*/
QCString trNoDescriptionAvailable() QCString trNoDescriptionAvailable()
{ return "Aucune description n'est disponible"; } { return "Aucune description n'est disponible"; }
// index titles (the project name is prepended for these)
/*! This is used in HTML as the title of index.html. */
QCString trDocumentation() QCString trDocumentation()
{ return "Documentation"; } { return "Documentation"; }
/*! This is used in LaTeX as the title of the chapter with the
* index of all groups.
*/
QCString trModuleIndex() QCString trModuleIndex()
{ return "Index des modules"; } { return "Index des modules"; }
/*! This is used in LaTeX as the title of the chapter with the
* class hierarchy.
*/
QCString trHierarchicalIndex() QCString trHierarchicalIndex()
{ return "Index hiérarchique"; } { return "Index hiérarchique"; }
/*! This is used in LaTeX as the title of the chapter with the
* annotated compound index.
*/
QCString trCompoundIndex() QCString trCompoundIndex()
{ return "Index des composants"; } { return "Index des composants"; }
/*! This is used in LaTeX as the title of the chapter with the
* list of all files.
*/
QCString trFileIndex() QCString trFileIndex()
{ return "Index des fichiers"; } { return "Index des fichiers"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all groups.
*/
QCString trModuleDocumentation() QCString trModuleDocumentation()
{ return "Documentation du module"; } { return "Documentation du module"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all classes, structs and unions.
*/
QCString trClassDocumentation() QCString trClassDocumentation()
{ return "Documentation de la classe"; } { return "Documentation de la classe"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all files.
*/
QCString trFileDocumentation() QCString trFileDocumentation()
{ return "Documentation du fichier"; } { return "Documentation du fichier"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all examples.
*/
QCString trExampleDocumentation() QCString trExampleDocumentation()
{ return "Documentation de l'exemple"; } { return "Documentation de l'exemple"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all related pages.
*/
QCString trPageDocumentation() QCString trPageDocumentation()
{ return "Documentation de la page"; } { return "Documentation de la page"; }
/*! This is used in LaTeX as the title of the document */
QCString trReferenceManual() QCString trReferenceManual()
{ return "Manuel de référence"; } { return "Manuel de référence"; }
/*! This is used in the documentation of a file as a header before the
* list of defines
*/
QCString trDefines() QCString trDefines()
{ return "Définitions des macros"; } { return "Définitions des macros"; }
/*! This is used in the documentation of a file as a header before the
* list of function prototypes
*/
QCString trFuncProtos() QCString trFuncProtos()
{ return "Prototypes des fonctions"; } { return "Prototypes des fonctions"; }
/*! This is used in the documentation of a file as a header before the
* list of typedefs
*/
QCString trTypedefs() QCString trTypedefs()
{ return "Définitions des types"; } { return "Définitions des types"; }
/*! This is used in the documentation of a file as a header before the
* list of enumerations
*/
QCString trEnumerations() QCString trEnumerations()
{ return "Enumérations"; } { return "Enumérations"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) functions
*/
QCString trFunctions() QCString trFunctions()
{ return "Fonctions"; } { return "Fonctions"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
QCString trVariables() QCString trVariables()
{ return "Variables"; } { return "Variables"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
QCString trEnumerationValues() QCString trEnumerationValues()
{ return "Eléments énumérés"; } { return "Eléments énumérés"; }
QCString trReimplementedFrom()
{ return "Redéfini à partir de"; } /*! This is used in man pages as the author section. */
QCString trReimplementedIn()
{ return "Redéfini dans"; }
QCString trAuthor() QCString trAuthor()
{ return "Auteur"; } { return "Auteur"; }
/*! This is used in the documentation of a file before the list of
* documentation blocks for defines
*/
QCString trDefineDocumentation() QCString trDefineDocumentation()
{ return "Documentation de la macro"; } { return "Documentation de la macro"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for function prototypes
*/
QCString trFunctionPrototypeDocumentation() QCString trFunctionPrototypeDocumentation()
{ return "Documentation du prototype de la fonction"; } { return "Documentation du prototype de la fonction"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for typedefs
*/
QCString trTypedefDocumentation() QCString trTypedefDocumentation()
{ return "Documentation du type"; } { return "Documentation du type"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration types
*/
QCString trEnumerationTypeDocumentation() QCString trEnumerationTypeDocumentation()
{ return "Documentation du type de l'énumeration"; } { return "Documentation du type de l'énumeration"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration values
*/
QCString trEnumerationValueDocumentation() QCString trEnumerationValueDocumentation()
{ return "Documentation de l'élément de l'énumeration"; } { return "Documentation de l'élément de l'énumeration"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for functions
*/
QCString trFunctionDocumentation() QCString trFunctionDocumentation()
{ return "Documentation de la fonction"; } { return "Documentation de la fonction"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for variables
*/
QCString trVariableDocumentation() QCString trVariableDocumentation()
{ return "Documentation de la variable"; } { return "Documentation de la variable"; }
/*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds
*/
QCString trCompounds() QCString trCompounds()
{ return "Composants"; } { return "Composants"; }
/*! This is used in the documentation of a group before the list of
* links to documented files
*/
QCString trFiles() QCString trFiles()
{ return "Fichiers"; } { return "Fichiers"; }
/*! This is used in the standard footer of each page and indicates when
* the page was generated
*/
QCString trGeneratedAt(const char *date,const char *projName) QCString trGeneratedAt(const char *date,const char *projName)
{ {
QCString result=(QCString)"Généré le "+date; QCString result=(QCString)"Généré le "+date;
...@@ -217,47 +391,75 @@ class TranslatorFrench : public Translator ...@@ -217,47 +391,75 @@ class TranslatorFrench : public Translator
result+=(QCString)" par "; result+=(QCString)" par ";
return result; return result;
} }
/*! This is part of the sentence used in the standard footer of each page.
*/
QCString trWrittenBy() QCString trWrittenBy()
{ {
return "écrit par"; return "écrit par";
} }
/*! this text is put before a class diagram */
QCString trClassDiagram(const char *clName) QCString trClassDiagram(const char *clName)
{ {
return (QCString)"Graphe d'héritage de la classe "+clName; return (QCString)"Graphe d'héritage de la classe "+clName;
} }
/*! this text is generated when the \internal command is used. */
QCString trForInternalUseOnly() QCString trForInternalUseOnly()
{ return "A usage interne uniquement."; } { return "A usage interne uniquement."; }
/*! this text is generated when the \reimp command is used. */
QCString trReimplementedForInternalReasons() QCString trReimplementedForInternalReasons()
{ return "Redéfini pour des raisons internes; " { return "Redéfini pour des raisons internes; "
"l'interface n'est pas modifiée"; "l'interface n'est pas modifiée";
} }
/*! this text is generated when the \warning command is used. */
QCString trWarning() QCString trWarning()
{ return "Avertissement"; } { return "Avertissement"; }
/*! this text is generated when the \bug command is used. */
QCString trBugsAndLimitations() QCString trBugsAndLimitations()
{ return "Bogues et limitations"; } { return "Bogues et limitations"; }
/*! this text is generated when the \version command is used. */
QCString trVersion() QCString trVersion()
{ return "Version"; } { return "Version"; }
/*! this text is generated when the \date command is used. */
QCString trDate() QCString trDate()
{ return "Date"; } { return "Date"; }
/*! this text is generated when the \author command is used. */
QCString trAuthors() QCString trAuthors()
{ return "Auteur(s)"; } { return "Auteur(s)"; }
/*! this text is generated when the \return command is used. */
QCString trReturns() QCString trReturns()
{ return "Renvoie"; } { return "Renvoie"; }
/*! this text is generated when the \sa command is used. */
QCString trSeeAlso() QCString trSeeAlso()
{ return "Voir également"; } { return "Voir également"; }
/*! this text is generated when the \param command is used. */
QCString trParameters() QCString trParameters()
{ return "Paramètres"; } { return "Paramètres"; }
/*! this text is generated when the \exception command is used. */
QCString trExceptions() QCString trExceptions()
{ return "Exceptions"; } { return "Exceptions"; }
/*! this text is used in the title page of a LaTeX document. */
QCString trGeneratedBy() QCString trGeneratedBy()
{ return "Généré par"; } { return "Généré par"; }
// new since 0.49-990307 // new since 0.49-990307
virtual QCString trNamespaces()
{ return "Namespaces"; }
virtual QCString trNamespaceList() virtual QCString trNamespaceList()
{ return "Liste des Namespaces"; } { return "Liste des Namespaces"; }
/*! used as an introduction to the namespace list */
virtual QCString trNamespaceListDescription(bool extractAll) virtual QCString trNamespaceListDescription(bool extractAll)
{ {
QCString result="Liste de tous les namespaces "; QCString result="Liste de tous les namespaces ";
...@@ -265,13 +467,213 @@ class TranslatorFrench : public Translator ...@@ -265,13 +467,213 @@ class TranslatorFrench : public Translator
result+="avec une brève description :"; result+="avec une brève description :";
return result; return result;
} }
/*! used in the class documentation as a header before the list of all
* friends of a class
*/
virtual QCString trFriends() virtual QCString trFriends()
{ return "Friends"; } { return "Friends"; }
// new since 0.49-990405 //////////////////////////////////////////////////////////////////////////
// new since 0.49-990405
//////////////////////////////////////////////////////////////////////////
/*! used in the class documentation as a header before the list of all
* related classes
*/
virtual QCString trRelatedFunctionDocumentation() virtual QCString trRelatedFunctionDocumentation()
{ return "Documentation des fonctions amies et associées"; } { return "Documentation des fonctions amies et associées"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990425
//////////////////////////////////////////////////////////////////////////
/*! used as the title of the HTML page of a class/struct/union */
virtual QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType)
{
QCString result="Référence de ";
switch(compType)
{
case ClassDef::Class: result+="la classe "; break;
case ClassDef::Struct: result+="la structure "; break;
case ClassDef::Union: result+="l'union "; break;
case ClassDef::Interface: result+="l'interface "; break;
}
result+=(QCString)clName;
return result;
}
/*! used as the title of the HTML page of a file */
virtual QCString trFileReference(const char *fileName)
{
QCString result= "Référence du fichier ";
result += fileName;
return result;
}
/*! used as the title of the HTML page of a namespace */
virtual QCString trNamespaceReference(const char *namespaceName)
{
QCString result= "Référence du namespace ";
result += namespaceName;
return result;
}
/*! \mgroup Class sections
* these are for the member sections of a class, struct or union
*/
virtual QCString trPublicMembers()
{ return "Membres publiques"; }
virtual QCString trPublicSlots()
{ return "Connecteurs publiques"; }
virtual QCString trSignals()
{ return "Signaux"; }
virtual QCString trStaticPublicMembers()
{ return "Membres publiques statiques"; }
virtual QCString trProtectedMembers()
{ return "Membres protégés"; }
virtual QCString trProtectedSlots()
{ return "Connecteurs protégés"; }
virtual QCString trStaticProtectedMembers()
{ return "Membres protégés statiques"; }
virtual QCString trPrivateMembers()
{ return "Membres privés"; }
virtual QCString trPrivateSlots()
{ return "Connecteurs privés"; }
virtual QCString trStaticPrivateMembers()
{ return "Membres privés statiques"; }
/*! \endmgroup */
/*! this function is used to produce a comma-separated list of items.
* use generateMarker(i) to indicate where item i should be put.
*/
virtual QCString trWriteList(int numEntries)
{
QCString result;
int i;
// the inherits list contain `numEntries' classes
for (i=0;i<numEntries;i++)
{
// use generateMarker to generate placeholders for the class links!
result+=generateMarker(i); // generate marker for entry i in the list
// (order is left to right)
if (i!=numEntries-1) // not the last entry, so we need a separator
{
if (i<numEntries-2) // not the fore last entry
result+=", ";
else // the fore last entry
result+=", and ";
}
}
return result;
}
/*! used in class documentation to produce a list of base classes,
* if class diagrams are disabled.
*/
virtual QCString trInheritsList(int numEntries)
{
return "Est dérivée de "+trWriteList(numEntries)+".";
}
/*! used in class documentation to produce a list of super classes,
* if class diagrams are disabled.
*/
virtual QCString trInheritedByList(int numEntries)
{
return "Dérivée par "+trWriteList(numEntries)+".";
}
/*! used in member documentation blocks to produce a list of
* members that are hidden by this one.
*/
virtual QCString trReimplementedFromList(int numEntries)
{
return "Redéfinie à partir de "+trWriteList(numEntries)+".";
}
/*! used in member documentation blocks to produce a list of
* all member that overwrite the implementation of this member.
*/
virtual QCString trReimplementedInList(int numEntries)
{
return "Redéfinie dans "+trWriteList(numEntries)+".";
}
/*! This is put above each page as a link to all members of namespaces. */
virtual QCString trNamespaceMembers()
{ return "Menbres des namespaces"; }
/*! This is an introduction to the page with all namespace members */
virtual QCString trNamespaceMemberDescription(bool extractAll)
{
QCString result="Voici une list de tous les membres de namespace";
if (!extractAll) result+="documentés ";
result+=" avec liens vers ";
if (extractAll)
result+="les documentations des namespaces associés :";
else
result+="les namespaces auxquels ils appartiennent :";
return result;
}
/*! This is used in LaTeX as the title of the chapter with the
* index of all namespaces.
*/
virtual QCString trNamespaceIndex()
{ return "Index des Namespaces"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all namespaces.
*/
virtual QCString trNamespaceDocumentation()
{ return "Documentation des Namespaces"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990522
//////////////////////////////////////////////////////////////////////////
/*! This is used in the documentation before the list of all
* namespaces in a file.
*/
virtual QCString trNamespaces()
{ return "Namespaces"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990728
//////////////////////////////////////////////////////////////////////////
/*! This is put at the bottom of a class documentation page and is
* followed by a list of files that were used to generate the page.
*/
virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
bool single)
{ // here s is one of " Class", " Struct" or " Union"
// single is true implies a single file
QCString result=(QCString)"La documentation associée à cette ";
switch(compType)
{
case ClassDef::Class: result+="classe"; break;
case ClassDef::Struct: result+="structure"; break;
case ClassDef::Union: result+="union"; break;
case ClassDef::Interface: result+="interface"; break;
}
result+=" a été générée à partir ";
if (single) result+=" du fichier suivant :";
else result+="des fichiers suivants :";
return result;
}
/*! This is in the (quick) index as a link to the alphabetical compound
* list.
*/
virtual QCString trAlphabeticalList()
{
return "Liste par ordre alphabétique";
}
}; };
#endif #endif
...@@ -6,6 +6,9 @@ ...@@ -6,6 +6,9 @@
* *
* Initial Italian Translation by Ahmed Aldo Faisal * Initial Italian Translation by Ahmed Aldo Faisal
* Revised and completed by Alessandro Falappa (June 1999) * Revised and completed by Alessandro Falappa (June 1999)
* Updates:
* 1999/09/10: corrected some small typos in the "new since 0.49-990425" section
* added the "new since 0.49-990728" section
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -293,15 +296,15 @@ class TranslatorItalian : public Translator ...@@ -293,15 +296,15 @@ class TranslatorItalian : public Translator
QCString trCompoundReference(const char *clName, QCString trCompoundReference(const char *clName,
ClassDef::CompoundType compType) ClassDef::CompoundType compType)
{ {
QCString result="Riferimenti per la"; QCString result="Riferimenti per ";
switch(compType) switch(compType)
{ {
case ClassDef::Class: result+=" classe"; break; case ClassDef::Class: result+="la classe "; break;
case ClassDef::Struct: result+=" struct"; break; case ClassDef::Struct: result+="la struct "; break;
case ClassDef::Union: result+=" union"; break; case ClassDef::Union: result+="la union "; break;
case ClassDef::Interface: result+=" interface"; break; case ClassDef::Interface: result+="l'interfaccia "; break;
} }
result+=" "+(QCString)clName; result+=(QCString)clName;
return result; return result;
} }
QCString trFileReference(const char *fileName) QCString trFileReference(const char *fileName)
...@@ -375,6 +378,40 @@ class TranslatorItalian : public Translator ...@@ -375,6 +378,40 @@ class TranslatorItalian : public Translator
{ return "Indice dei namespaces"; } { return "Indice dei namespaces"; }
QCString trNamespaceDocumentation() QCString trNamespaceDocumentation()
{ return "Documentazione dei namespaces"; } { return "Documentazione dei namespaces"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990728
//////////////////////////////////////////////////////////////////////////
/*! This is put at the bottom of a class documentation page and is
* followed by a list of files that were used to generate the page.
*/
virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
bool single)
{ // here s is one of " Class", " Struct" or " Union"
// single is true implies a single file
QCString result=(QCString)"La documentazione per questa ";
switch(compType)
{
case ClassDef::Class: result+="classe"; break;
case ClassDef::Struct: result+="struct"; break;
case ClassDef::Union: result+="union"; break;
case ClassDef::Interface: result+="interfaccia"; break;
}
result+=" stata generata a partire ";
if (single) result+="dal seguente file:";
else result+="dai seguenti files:";
return result;
}
/*! This is in the (quick) index as a link to the alphabetical compound
* list.
*/
virtual QCString trAlphabeticalList()
{
return "Lista in ordine alfabetico";
}
}; };
#endif #endif
...@@ -384,6 +384,55 @@ class TranslatorDutch : public Translator ...@@ -384,6 +384,55 @@ class TranslatorDutch : public Translator
// This is used in LaTeX as the title of the chapter containing // This is used in LaTeX as the title of the chapter containing
// the documentation of all namespaces. // the documentation of all namespaces.
{ return "Namespace Documentatie"; } { return "Namespace Documentatie"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990728
//////////////////////////////////////////////////////////////////////////
/*! This is put at the bottom of a class documentation page and is
* followed by a list of files that were used to generate the page.
*/
virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
bool single)
{ // here s is one of " Class", " Struct" or " Union"
// single is true implies a single file
QCString result=(QCString)"De documentatie voor deze ";
switch(compType)
{
case ClassDef::Class: result+="class"; break;
case ClassDef::Struct: result+="struct"; break;
case ClassDef::Union: result+="union"; break;
case ClassDef::Interface: result+="interface"; break;
}
result+=" is gegenereerd op grond van de volgende file";
if (single) result+=":"; else result+="s:";
return result;
}
/*! This is in the (quick) index as a link to the alphabetical compound
* list.
*/
virtual QCString trAlphabeticalList()
{ return "Alphabetical List"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990901
//////////////////////////////////////////////////////////////////////////
/*! This is used as the heading text for the retval command. */
virtual QCString trReturnValues()
{ return "Retour waarden"; }
/*! This is in the (quick) index as a link to the main page (index.html)
*/
virtual QCString trMainPage()
{ return "Hoofd Pagina"; }
/*! This is used in references to page that are put in the LaTeX
* documentation. It should be an abbreviation of the word page.
*/
virtual QCString trPageAbbreviation()
{ return "p."; }
}; };
#endif #endif
...@@ -47,10 +47,15 @@ Uppdateringar. ...@@ -47,10 +47,15 @@ Uppdateringar.
=================================================================================== ===================================================================================
Problem! Problem!
Namespace och slot: har de nn hygglig svensk versttning??? Slot: nn hygglig svensk versttning???
Skicka grna synpunkter. Skicka grna synpunkter.
=================================================================================== ===================================================================================
1999/09/01
* Det verkar som om "namnrymd" r en hyggligt vedertagen svensk versttning
av "namnepace", s jag kr med det frn och med nu.
* "interface" heter numera "grnssnitt"
*/ */
#ifndef TRANSLATOR_SE_H #ifndef TRANSLATOR_SE_H
...@@ -349,13 +354,13 @@ class TranslatorSwedish : public Translator ...@@ -349,13 +354,13 @@ class TranslatorSwedish : public Translator
// new since 0.49-990307 // new since 0.49-990307
virtual QCString trNamespaceList() virtual QCString trNamespaceList()
{ return "Namespacelista"; } { return "Namnrymdlista"; }
virtual QCString trNamespaceListDescription(bool extractAll) virtual QCString trNamespaceListDescription(bool extractAll)
{ {
QCString result="Hr r en lista ver alla "; QCString result="Hr r en lista ver alla ";
if (!extractAll) result+="dokumenterade "; if (!extractAll) result+="dokumenterade ";
result+="namespaces med en kort frklaring:"; result+="namnrymder med en kort frklaring:";
return result; return result;
} }
...@@ -379,10 +384,10 @@ class TranslatorSwedish : public Translator ...@@ -379,10 +384,10 @@ class TranslatorSwedish : public Translator
QCString result=(QCString)clName+" "; QCString result=(QCString)clName+" ";
switch(compType) switch(compType)
{ {
case ClassDef::Class: result+=" Klass"; break; case ClassDef::Class: result+=" klass"; break;
case ClassDef::Struct: result+=" Strukt"; break; case ClassDef::Struct: result+=" strukt"; break;
case ClassDef::Union: result+=" Union"; break; case ClassDef::Union: result+=" union"; break;
case ClassDef::Interface: result+=" Interface"; break; case ClassDef::Interface: result+=" grnssnitt"; break;
} }
result+="referens"; result+="referens";
return result; return result;
...@@ -398,7 +403,7 @@ class TranslatorSwedish : public Translator ...@@ -398,7 +403,7 @@ class TranslatorSwedish : public Translator
virtual QCString trNamespaceReference(const char *namespaceName) virtual QCString trNamespaceReference(const char *namespaceName)
{ {
QCString result=namespaceName; QCString result=namespaceName;
result+=" namespacereferens"; result+=" namnrymdreferens";
return result; return result;
} }
...@@ -474,25 +479,65 @@ class TranslatorSwedish : public Translator ...@@ -474,25 +479,65 @@ class TranslatorSwedish : public Translator
} }
virtual QCString trNamespaceMembers() virtual QCString trNamespaceMembers()
{ return "Namespacemedlemmar"; } { return "Namnrymdsmedlemmar"; }
virtual QCString trNamespaceMemberDescription(bool extractAll) virtual QCString trNamespaceMemberDescription(bool extractAll)
{ {
QCString result="Hr r en lista ver alla "; QCString result="Hr r en lista ver alla ";
if (!extractAll) result+="dokumenterade "; if (!extractAll) result+="dokumenterade ";
result+="namespacemedlemmar med lnkar till "; result+="namnrymdsmedlemmar med lnkar till ";
if (extractAll) if (extractAll)
result+=" namespace-dokumentationen fr varje medlem:"; result+=" namnrymd-dokumentationen fr varje medlem:";
else else
result+="de namespaces de tillhr:"; result+="de namnrymder de tillhr:";
return result; return result;
} }
virtual QCString trNamespaceIndex() virtual QCString trNamespaceIndex()
{ return "Namespaceindex"; } { return "Namnrymdsindex"; }
virtual QCString trNamespaceDocumentation() virtual QCString trNamespaceDocumentation()
{ return "Namnrymd-dokumentation"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990522
//////////////////////////////////////////////////////////////////////////
/*! This is used in the documentation before the list of all
* namespaces in a file.
*/
virtual QCString trNamespaces()
{ return "Namnrymder"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990728
//////////////////////////////////////////////////////////////////////////
/*! This is put at the bottom of a class documentation page and is
* followed by a list of files that were used to generate the page.
*/
virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
bool single)
{ // here s is one of " Class", " Struct" or " Union"
// single is true implies a single file
QCString result=(QCString)"Dokumentationen fr ";
switch(compType)
{
case ClassDef::Class: result+="denna klass "; break;
case ClassDef::Struct: result+="denna strukt "; break;
case ClassDef::Union: result+="denna union "; break;
case ClassDef::Interface: result+="detta grnssnitt "; break;
}
result+="var genererad frn fljande fil";
if (single) result+=":"; else result+="er:";
return result;
}
{ return "Namespace-dokumentation"; } /*! This is in the (quick) index as a link to the alphabetical compound
* list.
*/
virtual QCString trAlphabeticalList()
{
return "Alfabetisk lista";
}
}; };
#endif #endif
...@@ -39,18 +39,52 @@ bool isId(char c) ...@@ -39,18 +39,52 @@ bool isId(char c)
return c=='_' || isalnum(c); return c=='_' || isalnum(c);
} }
// strip annonymous part of the scope // strip annonymous left hand side part of the scope
QCString stripAnnonymousScope(const QCString &s) //QCString stripAnnonymousScope(const QCString &s)
//{
// QCString result=s;
// int i=0;
// while (!result.isEmpty() && result.at(0)=='@' && (i=result.find("::"))!=-1)
// {
// result=result.right(result.length()-i-2);
// }
// //if (result.at(0)=='@')
// //{
// // result.resize(0);
// //}
// return result;
//}
// strip annonymous left hand side part of the scope
QCString stripAnnonymousNamespaceScope(const QCString &s)
{ {
QCString result=s; int oi=0,i=0,p=0;
int i=0; if (s.isEmpty()) return s;
while (!result.isEmpty() && result.at(0)=='@' && (i=result.find("::"))!=-1) while (s.at(p)=='@' && (i=s.find("::",p))!=-1 &&
{ namespaceDict[s.left(i)]!=0) { oi=i; p=i+2; }
result=result.right(result.length()-i-2); if (oi==0)
{
//printf("stripAnnonymousNamespaceScope(`%s')=`%s'\n",s.data(),s.data());
return s;
}
else
{
//printf("stripAnnonymousNamespaceScope(`%s')=`%s'\n",s.data(),s.right(s.length()-oi-2).data());
return s.right(s.length()-oi-2);
} }
return result;
} }
void writePageRef(OutputList &ol,const char *cn,const char *mn)
{
bool htmlOn = ol.isEnabled(OutputGenerator::Html);
bool manOn = ol.isEnabled(OutputGenerator::Man);
ol.startPageRef();
ol.disableAllBut(OutputGenerator::Latex);
ol.docify(theTranslator->trPageAbbreviation());
ol.endPageRef(cn,mn);
if (htmlOn) ol.enable(OutputGenerator::Html);
if (manOn) ol.enable(OutputGenerator::Man);
}
QCString generateMarker(int id) QCString generateMarker(int id)
{ {
...@@ -159,8 +193,6 @@ QCString removeRedundantWhiteSpace(const QCString &s) ...@@ -159,8 +193,6 @@ QCString removeRedundantWhiteSpace(const QCString &s)
return result; return result;
} }
bool rightScopeMatch(const QCString &scope, const QCString &name) bool rightScopeMatch(const QCString &scope, const QCString &name)
{ {
return (name==scope || // equal return (name==scope || // equal
...@@ -244,12 +276,14 @@ void linkifyText(OutputList &ol,const char *scName,const char *name,const char * ...@@ -244,12 +276,14 @@ void linkifyText(OutputList &ol,const char *scName,const char *name,const char *
} }
} while (!found && scopeOffset>=0); } while (!found && scopeOffset>=0);
//if (!found) printf("Trying to link %s in %s\n",word.data(),scName);
if (!found && if (!found &&
getDefs(scName,word,0,md,cd,fd,nd) && getDefs(scName,word,0,md,cd,fd,nd) &&
(md->isTypedef() || md->isEnumerate()) && (md->isTypedef() || md->isEnumerate() || md->isReference()) &&
md->isLinkable() md->isLinkable()
) )
{ {
//printf("Found ref\n");
Definition *d=0; Definition *d=0;
if (cd) d=cd; else if (nd) d=nd; else d=fd; if (cd) d=cd; else if (nd) d=nd; else d=fd;
if (d && d->isLinkable()) if (d && d->isLinkable())
...@@ -369,17 +403,17 @@ QCString tempArgListToString(ArgumentList *al) ...@@ -369,17 +403,17 @@ QCString tempArgListToString(ArgumentList *al)
static bool manIsEnabled; static bool manIsEnabled;
void startTitle(OutputList &ol) void startTitle(OutputList &ol,const char *fileName)
{ {
ol.startTitleHead(); ol.startTitleHead(fileName);
manIsEnabled=ol.isEnabled(OutputGenerator::Man); manIsEnabled=ol.isEnabled(OutputGenerator::Man);
if (manIsEnabled) ol.disable(OutputGenerator::Man); if (manIsEnabled) ol.disable(OutputGenerator::Man);
} }
void endTitle(OutputList &ol,const char *name) void endTitle(OutputList &ol,const char *fileName,const char *name)
{ {
if (manIsEnabled) ol.enable(OutputGenerator::Man); if (manIsEnabled) ol.enable(OutputGenerator::Man);
ol.endTitleHead(name); ol.endTitleHead(fileName,name);
} }
void writeQuickLinks(OutputList &ol,bool compact,bool ext) void writeQuickLinks(OutputList &ol,bool compact,bool ext)
...@@ -391,6 +425,12 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext) ...@@ -391,6 +425,12 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext)
if (manEnabled) ol.disable(OutputGenerator::Man); if (manEnabled) ol.disable(OutputGenerator::Man);
if (texEnabled) ol.disable(OutputGenerator::Latex); if (texEnabled) ol.disable(OutputGenerator::Latex);
if (compact) ol.startCenter(); else ol.startItemList(); if (compact) ol.startCenter(); else ol.startItemList();
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,absPath+"index.html");
parseText(ol,theTranslator->trMainPage());
ol.endQuickIndexItem();
if (documentedGroups>0) if (documentedGroups>0)
{ {
if (!compact) ol.writeListItem(); if (!compact) ol.writeListItem();
...@@ -1428,15 +1468,19 @@ void generateRef(OutputList &ol,const char *scName, ...@@ -1428,15 +1468,19 @@ void generateRef(OutputList &ol,const char *scName,
{ {
ol.writeObjectLink(cd->getReference(), ol.writeObjectLink(cd->getReference(),
cd->getOutputFileBase(),0,linkText); cd->getOutputFileBase(),0,linkText);
if (!cd->isReference()) if (!cd->isReference() && !Config::pdfHyperFlag)
ol.writePageRef(cd->name(),0); {
writePageRef(ol,cd->name(),0);
}
} }
else // scope matches that of a namespace else // scope matches that of a namespace
{ {
ol.writeObjectLink(nd->getReference(), ol.writeObjectLink(nd->getReference(),
nd->getOutputFileBase(),0,linkText); nd->getOutputFileBase(),0,linkText);
if (!nd->getReference()) if (!nd->getReference() && !Config::pdfHyperFlag)
ol.writePageRef(nd->name(),0); {
writePageRef(ol,nd->name(),0);
}
} }
// link has been written, stop now. // link has been written, stop now.
return; return;
...@@ -1532,15 +1576,15 @@ void generateRef(OutputList &ol,const char *scName, ...@@ -1532,15 +1576,15 @@ void generateRef(OutputList &ol,const char *scName,
} }
// generate the page reference (for LaTeX) // generate the page reference (for LaTeX)
if (cName.length()>0 || aName.length()>0) if (!Config::pdfHyperFlag && (cName.length()>0 || aName.length()>0))
{ {
if ( if (
(cd && cd->isLinkableInProject()) || (cd && cd->isLinkableInProject()) ||
(fd && !fd->isReference()) || (fd && !fd->isReference()) ||
(nd /* TODO: && !nd->isReference() */) (nd && !nd->isReference())
) )
{ {
ol.writePageRef(cName,aName); writePageRef(ol,cName,aName);
} }
} }
return; return;
......
...@@ -72,8 +72,8 @@ extern int guessSection(const char *name); ...@@ -72,8 +72,8 @@ extern int guessSection(const char *name);
//extern QCString nameToFile(const char *name); //extern QCString nameToFile(const char *name);
extern bool isId(char c); extern bool isId(char c);
extern QCString removeRedundantWhiteSpace(const QCString &s); extern QCString removeRedundantWhiteSpace(const QCString &s);
extern void startTitle(OutputList &ol); extern void startTitle(OutputList &ol,const char *fileName);
extern void endTitle(OutputList &ol,const char *name); extern void endTitle(OutputList &ol,const char *fileName,const char *name);
void startFile(OutputList &ol,const char *name, void startFile(OutputList &ol,const char *name,
const char *title,bool external=FALSE); const char *title,bool external=FALSE);
void endFile(OutputList &ol,bool external=FALSE); void endFile(OutputList &ol,bool external=FALSE);
...@@ -84,6 +84,7 @@ QCString generateMarker(int id); ...@@ -84,6 +84,7 @@ QCString generateMarker(int id);
void writeExample(OutputList &ol,ExampleList *el); void writeExample(OutputList &ol,ExampleList *el);
void setFileNameForSections(QList<QCString> *anchorList,const char *fileName); void setFileNameForSections(QList<QCString> *anchorList,const char *fileName);
QCString stripAnnonymousScope(const QCString &s); QCString stripAnnonymousScope(const QCString &s);
QCString stripAnnonymousNamespaceScope(const QCString &s);
//void writeLink(OutputList &ol,ClassDef *cd,NamespaceDef *nd, //void writeLink(OutputList &ol,ClassDef *cd,NamespaceDef *nd,
...@@ -92,5 +93,6 @@ QCString stripAnnonymousScope(const QCString &s); ...@@ -92,5 +93,6 @@ QCString stripAnnonymousScope(const QCString &s);
QCString stripFromPath(const QCString &path); 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);
#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