Commit 422c14b6 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.2.0

parent 686cb8df
DOXYGEN Version 1.1.5-20000716
DOXYGEN Version 1.2.0
Please read the installation section of the manual for instructions.
--------
Dimitri van Heesch (16 July 2000)
Dimitri van Heesch (23 July 2000)
DOXYGEN Version 1.1.5-20000716
DOXYGEN Version 1.2.0
Please read INSTALL for compilation instructions.
......@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
Enjoy,
Dimitri van Heesch (16 July 2000)
Dimitri van Heesch (23 July 2000)
1.1.5-20000716
1.2.0
......@@ -768,7 +768,7 @@ void init()
"information to generate all constant output in the proper language. \n"
"The default language is English, other supported languages are: \n"
"Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, \n"
"Spanish, Russian, Croatian and Polish.\n"
"Spanish, Russian, Croatian, Polish, and Portuguese.\n"
);
ConfigString::addFixedValue("outputLanguage","English");
ConfigString::addFixedValue("outputLanguage","Dutch");
......@@ -783,6 +783,7 @@ void init()
ConfigString::addFixedValue("outputLanguage","Russian");
ConfigString::addFixedValue("outputLanguage","Croatian");
ConfigString::addFixedValue("outputLanguage","Polish");
ConfigString::addFixedValue("outputLanguage","Portuguese");
ConfigBool::add( "noIndexFlag",
"DISABLE_INDEX",
"FALSE",
......@@ -1310,9 +1311,8 @@ void init()
"TRUE",
"generate RTF flag",
"If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n"
"For now this is experimental and is disabled by default. The RTF output \n"
"is optimised for Word 97 and may not look too pretty with other readers \n"
"or editors.\n"
"The RTF output is optimised for Word 97 and may not look very pretty with \n"
"other RTF readers or editors.\n"
);
ConfigString::add("rtfOutputDir",
"RTF_OUTPUT",
......
......@@ -356,6 +356,10 @@ EOF
elif test "$f_platform" = "solaris-cc"; then
cat >> .tmakeconfig <<EOF
TMAKE_LFLAGS = -Bstatic
EOF
elif test "$f_platform" = "hpux-cc"; then
cat >> .tmakeconfig <<EOF
TMAKE_LFLAGS = -noshared
EOF
else
cat >> .tmakeconfig <<EOF
......
......@@ -14,8 +14,8 @@
PROJECT_NAME =
OUTPUT_DIRECTORY = ..
HTML_HEADER =
HTML_FOOTER =
HTML_HEADER =
HTML_FOOTER =
QUIET = NO
WARNINGS = YES
DISABLE_INDEX = YES
......@@ -26,11 +26,15 @@ GENERATE_LATEX = YES
GENERATE_HTML = YES
GENERATE_HTMLHELP = YES
GENERATE_RTF = NO
ENABLED_SECTIONS = logo_on
ENABLE_PREPROCESSING = NO
CASE_SENSE_NAMES = NO
IMAGE_PATH = .
INPUT = index.doc install.doc starting.doc docblocks.doc \
grouping.doc formulas.doc diagrams.doc preprocessing.doc \
external.doc faq.doc trouble.doc history.doc features.doc \
doxygen_usage.doc doxytag_usage.doc doxysearch_usage.doc \
doxywizard_usage.doc \
installdox_usage.doc output.doc autolink.doc \
config.doc commands.doc htmlcmds.doc language.doc
FILE_PATTERNS = *.cpp *.h *.doc
......
......@@ -61,6 +61,7 @@ documentation:
<li> \refitem cmddeprecated \deprecated
<li> \refitem cmddontinclude \dontinclude
<li> \refitem cmde \e
<li> \refitem cmdem \em
<li> \refitem cmdendcode \endcode
<li> \refitem cmdendhtmlonly \endhtmlonly
<li> \refitem cmdendif \endif
......@@ -84,13 +85,16 @@ documentation:
<li> \refitem cmdinternal \internal
<li> \refitem cmdinvariant \invariant
<li> \refitem cmdlatexonly \latexonly
<li> \refitem cmdli \li
<li> \refitem cmdline \line
<li> \refitem cmdlink \link
<li> \refitem cmdmainpage \mainpage
<li> \refitem cmdname \name
<li> \refitem cmdnamespace \namespace
<li> \refitem cmdnosubgrouping \nosubgrouping
<li> \refitem cmdnote \note
<li> \refitem cmdoverload \overload
<li> \refitem cmdp \p
<li> \refitem cmdpage \page
<li> \refitem cmdpar \par
<li> \refitem cmdparam \param
......@@ -164,17 +168,6 @@ Doxygen. Unrecognized commands are treated as normal text.
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
<hr>
\subsection cmdcode \code
\addindex \code
Starts a block of code. A code block is treated differently
from ordinary text. It is interpreted as C/C++ code. The names of the
classes and members that are documented are automatically replaced by
links to the documentation.
\sa section \ref cmdendcode "\\endcode", section \ref cmdverbatim "\\verbatim"
<hr>
\subsection cmddef \def <name>
......@@ -185,7 +178,7 @@ Doxygen. Unrecognized commands are treated as normal text.
\par Example:
\verbinclude define.h
\htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/define/html/index.html">here</a>
Click <a href="$(DOXYGEN_DOCDIR)/examples/define/html/define.h.html">here</a>
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
......@@ -203,13 +196,6 @@ Doxygen. Unrecognized commands are treated as normal text.
\sa section \ref cmdingroup "\\ingroup"
<hr>
\subsection cmdendcode \endcode
\addindex \endcode
Ends a block of code.
\sa section \ref cmdcode "\\code"
<hr>
\subsection cmdenum \enum <name>
......@@ -229,7 +215,7 @@ Doxygen. Unrecognized commands are treated as normal text.
\par Example:
\verbinclude enum.h
\htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/enum/html/index.html">here</a>
Click <a href="$(DOXYGEN_DOCDIR)/examples/enum/html/class_test.html">here</a>
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
......@@ -260,7 +246,7 @@ Doxygen. Unrecognized commands are treated as normal text.
Where the example file \c example_test.cpp looks as follows:
\verbinclude example_test.cpp
\htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/example/html/index.html">here</a>
Click <a href="$(DOXYGEN_DOCDIR)/examples/example/html/examples.html">here</a>
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
......@@ -283,7 +269,7 @@ Doxygen. Unrecognized commands are treated as normal text.
\par Example:
\verbinclude file.h
\htmlonly
Click <a href="$(DOXYGEN_DOCDIR)/examples/file/html/index.html">here</a>
Click <a href="$(DOXYGEN_DOCDIR)/examples/file/html/file.h.html">here</a>
for the corresponding HTML documentation that is generated by Doxygen.
\endhtmlonly
......@@ -412,6 +398,8 @@ Public/Protected/Private/... section.
\par Note 1:
You are responsible that there is indeed an
earlier documented member that is overloaded by this one.
To prevent that document reorders the documentation you should set
\ref cfg_sort_member_docs "SORT_MEMBER_DOCS" to NO in this case.
\par Note 2:
The \\overload command does not work inside a one-line comment.
\par Example:
......@@ -684,6 +672,20 @@ Public/Protected/Private/... section.
several invariants. The \\invariant command ends when a blank line or some other
sectioning command is encountered.
<hr>
\subsection cmdnote \note { text }
\addindex \note
Starts a paragraph where a note can be entered. The paragraph will be
indented. The text of the paragraph has no special internal structure.
All visual enhancement commands may be used inside the paragraph.
Multiple adjacent \\note commands will be joined into a single paragraph.
Each note description will start on a new line.
Alternatively, one \\note command may mention
several notes. The \\note command ends when a blank line or some other
sectioning command is encountered. See section \ref cmdpar "\\par"
for an example.
<hr>
\subsection cmdpar \par [(paragraph title)] { paragraph }
......@@ -797,10 +799,11 @@ Public/Protected/Private/... section.
\addindex \sa
Starts a paragraph where one or more cross-references to classes,
functions, methods, variables, files or URL may be specified.
The separators \c :: and \c # may be used to separate a class from the
name of its members. One of several overloaded methods or constructors
Two names joines by either <code>::</code> or <code>\#</code>
are understood as referring to a class and one of its members.
One of several overloaded methods or constructors
may be selected by including a parenthesized list of argument types after
the method.
the method name.
Synonymous to \\see.
......@@ -1112,11 +1115,11 @@ Public/Protected/Private/... section.
\par Example:
\verbatim
... the \a x and \y coordinates are used to ...
... the \a x and \a y coordinates are used to ...
\endverbatim
This will result in the following text:<br><br>
... the \a x and \a y coordinates are used to ...
<hr>
\subsection cmdarg \arg { item-description }
......@@ -1147,6 +1150,9 @@ Public/Protected/Private/... section.
\par Note:
For nested lists, HTML commands should be used.
Equivalent to \ref cmdli "\\cmdli"
<hr>
\subsection cmdb \b <word>
......@@ -1170,6 +1176,19 @@ Public/Protected/Private/... section.
will result in the following text:<br><br>
... This function returns \c void and not \c int ...
Equivalent to \ref cmdp "\\cmdp"
<hr>
\subsection cmdcode \code
\addindex \code
Starts a block of code. A code block is treated differently
from ordinary text. It is interpreted as C/C++ code. The names of the
classes and members that are documented are automatically replaced by
links to the documentation.
\sa section \ref cmdendcode "\\endcode", section \ref cmdverbatim "\\verbatim"
<hr>
\subsection cmde \e <word>
......@@ -1185,6 +1204,32 @@ Public/Protected/Private/... section.
will result in the following text:<br><br>
... this is a \e really good example ...
Equvalent to \ref cmdem "\\em"
<hr>
\subsection cmdem \em <word>
\addindex \e
Displays the argument \<word\> in italics.
Use this command to emphasize words.
\par Example:
Typing:
\verbatim
... this is a \em really good example ...
\endverbatim
will result in the following text:<br><br>
... this is a \em really good example ...
Equivalent to \ref cmde "\\e"
<hr>
\subsection cmdendcode \endcode
\addindex \endcode
Ends a block of code.
\sa section \ref cmdcode "\\code"
<hr>
\subsection cmdendhtmlonly \endhtmlonly
......@@ -1321,6 +1366,55 @@ Public/Protected/Private/... section.
\sa section \ref cmdlatexonly "\\latexonly"
and section \ref cmdhtmlonly "\\htmlonly".
<hr>
\subsection cmdli \li { item-description }
\addindex \li
This command has one argument that continues until the first
blank line or until another \\li is encountered.
The command can be used to generate a simple, not nested list of
arguments.
Each argument should start with a \\li command.
\par Example:
Typing:
\verbatim
\li \c AlignLeft left alignment.
\li \c AlignCenter center alignment.
\li \c AlignRight right alignment
No other types of alignment are supported.
\endverbatim
will result in the following text:<br><br>
<ul>
<li> \c AlignLeft left alignment.
<li> \c AlignCenter center alignment.
<li> \c AlignRight right alignment
</ul><br>
No other types of alignment are supported.
\par Note:
For nested lists, HTML commands should be used.
Equivalent to \ref cmdarg "\\cmdarg"
<hr>
\subsection cmdp \p <word>
\addindex \p
Displays the parameter \<word\> using a typewriter font.
You can use this command to refer to member function parameters in
the running text.
\par Example:
\verbatim
... the \p x and \p y coordinates are used to ...
\endverbatim
This will result in the following text:<br><br>
... the \p x and \p y coordinates are used to ...
Equivalent to \ref cmdc "\\cmdc"
<hr>
\subsection cmdverbatim \verbatim
......
......@@ -21,8 +21,7 @@
\subsection config_format Format
A configuration file is a free-form ASCII text file with a structure that
is similar to that of a Makefile. It is parsed by a
recursive-descent parser that is built into \c doxygen.
is similar to that of a Makefile. It is parsed by \c doxygen.
The file may contain tabs and newlines for formatting purposes.
The statements in the file are case-sensitive.
Comments may be placed anywhere within the file (except within quotes).
......@@ -189,7 +188,7 @@ followed by the descriptions of the tags grouped by category.
information to generate all constant output in the proper language.
The default language is English, other supported languages are:
Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese,
Spanish, Russian, Croatian and Polish.
Spanish, Russian, Croatian, Polish and Portuguese.
\anchor cfg_disable_index
<dt>\c DISABLE_INDEX <dd>
......@@ -423,7 +422,8 @@ followed by the descriptions of the tags grouped by category.
<dt>\c WARN_FORMAT <dd>
\addindex WARN_FORMAT
The WARN_FORMAT tag determines the format of the warning messages that
doxygen can produce. The string should contain the $file, $line, and $text
doxygen can produce. The string should contain the <code>\$file</code>,
<code>\$line</code>, and <code>\$text</code>
tags, which will be replaced by the file and line number from which the
warning originated and the warning text.
......@@ -559,7 +559,9 @@ followed by the descriptions of the tags grouped by category.
\addindex HTML_HEADER
The \c HTML_HEADER tag can be used to specify a user defined HTML
header file for each generated HTML page. To get valid HTML the header file
should contain at least a \c <HTML> and a \c <BODY> tag. Example:
should contain at least a \c <HTML> and a \c <BODY> tag, but it is
good idea to include the style sheet that is generated by doxygen as well.
Minimal example:
\verbatim
<HTML>
<HEAD>
......@@ -580,12 +582,15 @@ followed by the descriptions of the tags grouped by category.
the version number of doxygen, the project name (see \c PROJECT_NAME), or the
project number (see \c PROJECT_NUMBER).
See also section \ref doxygen_usage for information on how to generate
the default header that doxygen normally uses.
\anchor cfg_html_footer
<dt>\c HTML_FOOTER <dd>
\addindex HTML_FOOTER
The \c HTML_FOOTER tag can be used to specify a user defined HTML footer for
each generated HTML page. To get valid HTML the header file should contain
at least a \c </BODY> and a \c </HTML> tag. Example:
at least a \c </BODY> and a \c </HTML> tag. A minimal example:
\verbatim
</BODY>
</HTML>
......@@ -600,7 +605,9 @@ followed by the descriptions of the tags grouped by category.
the title of the page, the current date and time, only the current date,
the version number of doxygen, the project name (see \c PROJECT_NAME), or the
project number (see \c PROJECT_NUMBER).
See also section \ref doxygen_usage for information on how to generate
the default footer that doxygen normally uses.
\anchor cfg_html_stylesheet
<dt>\c HTML_STYLESHEET <dd>
......@@ -608,32 +615,10 @@ followed by the descriptions of the tags grouped by category.
The \c HTML_STYLESHEET tag can be used to specify a user defined cascading
style sheet that is used by each HTML page. It can be used to
fine-tune the look of the HTML output. If the tag is left blank doxygen
will generate a default style sheet. Here is the default style sheet
that doxygen normally generates:
will generate a default style sheet.
\verbatim
H1 { text-align: center; }
A.qindex {}
A.qindexRef {}
A.el { text-decoration: none; font-weight: bold }
A.elRef { font-weight: bold }
A.code { text-decoration: none; font-weight: normal; color: #4444ee }
A.codeRef { font-weight: normal; color: #4444ee }
DL.el { margin-left: -1cm }
DIV.fragment { width: 100%; border: none; background-color: #eeeeee }
DIV.in { margin-left: 16 }
DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 }
TD.md { background-color: #f2f2ff }
DIV.groupHeader { margin-left: 16; margin-top: 12; margin-bottom: 6; font-weight
DIV.groupText { margin-left: 16; font-style: italic; font-size: smaller }
FONT.keyword { color: #008000 }
FONT.keywordtype { color: #604020 }
FONT.keywordflow { color: #e08000 }
FONT.comment { color: #800000 }
FONT.preprocessor { color: #806020 }
FONT.stringliteral { color: #002080 }
FONT.charliteral { color: #008080 }
\endverbatim
See also section \ref doxygen_usage for information on how to generate
the style sheet that doxygen normally uses.
\anchor cfg_html_align_members
<dt>\c HTML_ALIGN_MEMBERS <dd>
......@@ -724,32 +709,11 @@ EXTRA_PACKAGES = times
\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:
until the first chapter.
\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
If it is left blank doxygen will generate a
standard header. See section \ref doxygen_usage for information on how to
let doxygen write the default header to a separate file.
\par Note:
Only use a user defined header if you know what you are doing!
......@@ -790,8 +754,7 @@ EXTRA_PACKAGES = times
<dt>\c GENERATE_RTF <dd>
\addindex GENERATE_RTF
If the \c GENERATE_RTF tag is set to \c YES Doxygen will generate RTF output.
For now this is experimental and is disabled by default. The RTF
output is optimised for Word 97 and may not look too pretty with
The RTF output is optimised for Word 97 and may not look too pretty with
other readers/editors.
\anchor cfg_rtf_output
......@@ -820,89 +783,15 @@ EXTRA_PACKAGES = times
\par note:
wordpad (write) and others do not support links.
\anchor cfg_rtf_stylesheet_file RTF_STYLESHEET_FILE
\anchor cfg_rtf_stylesheet_file
<dt>\c RTF_STYLESHEET_FILE <dd>
\addindex RTF_STYLESHEET_FILE
Load stylesheet definitions from file. Syntax is similar to doxygen's
config file, i.e. a series of assigments. You only have to provide
replacements, missing definitions are set to their default value.
\htmlonly
Here are the default settings:
<font size=2><pre>Reset = \\pard\\plain
Heading1 = \\s1\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs36\\kerning36\\cgrid
Heading2 = \\s2\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs28\\kerning28\\cgrid
Heading3 = \\s3\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\cgrid
Heading4 = \\s4\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid
Title = \\s15\\qc\\sb240\\sa60\\widctlpar\\outlinelevel0\\adjustright \\b\\f1\\fs32\\kerning28\\cgrid
SubTitle = \\s16\\qc\\sa60\\widctlpar\\outlinelevel1\\adjustright \\f1\\cgrid
BodyText = \\s17\\sa60\\sb30\\widctlpar\\qj \\fs22\\cgrid
DenseText = \\s18\\widctlpar\\fs22\\cgrid
Header = \\s28\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid
Footer = \\s29\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\qr\\adjustright \\fs20\\cgrid
GroupHeader = \\s30\\li360\\sa60\\sb120\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid
CodeExample0 = \\s40\\li0\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid
CodeExample1 = \\s41\\li360\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid
CodeExample2 = \\s42\\li720\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid
CodeExample3 = \\s43\\li1080\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid
CodeExample4 = \\s44\\li1440\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid
CodeExample5 = \\s45\\li1800\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid
CodeExample6 = \\s46\\li2160\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid
CodeExample7 = \\s47\\li2520\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid
CodeExample8 = \\s48\\li2880\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid
CodeExample9 = \\s49\\li3240\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid
ListContinue0 = \\s50\\li0\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid
ListContinue1 = \\s51\\li360\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid
ListContinue2 = \\s52\\li720\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid
ListContinue3 = \\s53\\li1080\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid
ListContinue4 = \\s54\\li1440\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid
ListContinue5 = \\s55\\li1800\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid
ListContinue6 = \\s56\\li2160\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid
ListContinue7 = \\s57\\li2520\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid
ListContinue8 = \\s58\\li2880\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid
ListContinue9 = \\s59\\li3240\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid
DescContinue0 = \\s60\\li0\\widctlpar\\ql\\adjustright \\fs20\\cgrid
DescContinue1 = \\s61\\li360\\widctlpar\\ql\\adjustright \\fs20\\cgrid
DescContinue2 = \\s62\\li720\\widctlpar\\ql\\adjustright \\fs20\\cgrid
DescContinue3 = \\s63\\li1080\\widctlpar\\ql\\adjustright \\fs20\\cgrid
DescContinue4 = \\s64\\li1440\\widctlpar\\ql\\adjustright \\fs20\\cgrid
DescContinue5 = \\s65\\li1800\\widctlpar\\ql\\adjustright \\fs20\\cgrid
DescContinue6 = \\s66\\li2160\\widctlpar\\ql\\adjustright \\fs20\\cgrid
DescContinue7 = \\s67\\li2520\\widctlpar\\ql\\adjustright \\fs20\\cgrid
DescContinue8 = \\s68\\li2880\\widctlpar\\ql\\adjustright \\fs20\\cgrid
DescContinue9 = \\s69\\li3240\\widctlpar\\ql\\adjustright \\fs20\\cgrid
LatexTOC0 = \\s70\\li0\\sa30\\sb30\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid
LatexTOC1 = \\s71\\li360\\sa27\\sb27\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid
LatexTOC2 = \\s72\\li720\\sa24\\sb24\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid
LatexTOC3 = \\s73\\li1080\\sa21\\sb21\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid
LatexTOC4 = \\s74\\li1440\\sa18\\sb18\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid
LatexTOC5 = \\s75\\li1800\\sa15\\sb15\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid
LatexTOC6 = \\s76\\li2160\\sa12\\sb12\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid
LatexTOC7 = \\s77\\li2520\\sa9\\sb9\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid
LatexTOC8 = \\s78\\li2880\\sa6\\sb6\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid
LatexTOC9 = \\s79\\li3240\\sa3\\sb3\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid
ListBullet0 = \\s80\\fi-360\\li360\\widctlpar\\jclisttab\\tx360{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\ls1\\adjustright \\fs20\\cgrid
ListBullet1 = \\s81\\fi-360\\li720\\widctlpar\\jclisttab\\tx720{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\\ls2\\adjustright \\fs20\\cgrid
ListBullet2 = \\s82\\fi-360\\li1080\\widctlpar\\jclisttab\\tx1080{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\ls3\\adjustright \\fs20\\cgrid
ListBullet3 = \\s83\\fi-360\\li1440\\widctlpar\\jclisttab\\tx1440{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\ls4\\adjustright \\fs20\\cgrid
ListBullet4 = \\s84\\fi-360\\li1800\\widctlpar\\jclisttab\\tx1800{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\\ls5\\adjustright \\fs20\\cgrid
ListBullet5 = \\s85\\fi-360\\li2160\\widctlpar\\jclisttab\\tx2160{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\ls6\\adjustright \\fs20\\cgrid
ListBullet6 = \\s86\\fi-360\\li2520\\widctlpar\\jclisttab\\tx2520{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\ls7\\adjustright \\fs20\\cgrid
ListBullet7 = \\s87\\fi-360\\li2880\\widctlpar\\jclisttab\\tx2880{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\\pndec }\\ls8\\adjustright \\fs20\\cgrid
ListBullet8 = \\s88\\fi-360\\li3240\\widctlpar\\jclisttab\\tx3240{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\ls9\\adjustright \\fs20\\cgrid
ListBullet9 = \\s89\\fi-360\\li3600\\widctlpar\\jclisttab\\tx3600{\\*\\pn \\pnlvlbody\\ilvl0\\ls10\\pnrnot0\\pndec }\\ls10\\adjustright \\fs20\\cgrid
ListEnum0 = \\s90\\fi-360\\li360\\widctlpar\\fs20\\cgrid
ListEnum1 = \\s91\\fi-360\\li720\\widctlpar\\fs20\\cgrid
ListEnum2 = \\s92\\fi-360\\li1080\\widctlpar\\fs20\\cgrid
ListEnum3 = \\s93\\fi-360\\li1440\\widctlpar\\fs20\\cgrid
ListEnum4 = \\s94\\fi-360\\li1800\\widctlpar\\fs20\\cgrid
ListEnum4 = \\s95\\fi-360\\li2160\\widctlpar\\fs20\\cgrid
ListEnum5 = \\s96\\fi-360\\li2520\\widctlpar\\fs20\\cgrid
ListEnum6 = \\s97\\fi-360\\li2880\\widctlpar\\fs20\\cgrid
ListEnum7 = \\s98\\fi-360\\li3240\\widctlpar\\fs20\\cgrid
ListEnum8 = \\s99\\fi-360\\li3600\\widctlpar\\fs20\\cgrid
</pre></font>
\endhtmlonly
See also section \ref doxygen_usage for information on how to generate
the default style sheet that doxygen normally uses.
</dl>
......@@ -1247,6 +1136,35 @@ INCLUDE_PATH = $(QTDIR)/include
RECURSIVE = YES
\endverbatim
For the Qt-2.1 sources I recommand to use the following settings:
\verbatim
PROJECT_NAME = Qt
PROJECT_NUMBER = 2.1
HIDE_UNDOC_MEMBERS = YES
HIDE_UNDOC_CLASSES = YES
SOURCE_BROWSER = YES
INPUT = $(QTDIR)/src
FILE_PATTERNS = *.cpp *.h q*.doc
RECURSIVE = YES
EXCLUDE_PATTERNS = *codec.cpp moc_* */compat/* */3rdparty/*
ALPHABETICAL_INDEX = YES
COLS_IN_ALPHA_INDEX = 3
IGNORE_PREFIX = Q
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = YES
INCLUDE_PATH = $(QTDIR)/include
PREDEFINED = Q_PROPERTY(x)= \
Q_OVERRIDE(x)= \
Q_EXPORT= \
Q_ENUMS(x)= \
"QT_STATIC_CONST=static const " \
_WS_X11_ \
INCLUDE_MENUITEM_DEF
EXPAND_ONLY_PREDEF = YES
EXPAND_AS_DEFINED = Q_OBJECT_FAKE Q_OBJECT ACTIVATE_SIGNAL_WITH_PARAM \
Q_VARIANT_AS
\endverbatim
Here Doxygen's preprocessor is used to substitute some
macro names that are normally substituted by the C preprocessor,
but without doing full macro expansion.
......
......@@ -17,16 +17,17 @@
/*! \page doxygen_usage Doxygen usage
Doxygen is a command line based utility. Calling \c doxygen with the
\c -h option at the command line will give you a brief description of the
\c --help option at the command line will give you a brief description of the
usage of the program.
All options consist of a leading character <tt>-</tt>,
followed by one character and optionally an argument.
followed by one character and one or more arguments depending on the option.
To generate a class browser you typically need to follow these steps:
To generate a manual for your project you typically
need to follow these steps:
<ol>
<li> You document your source code with
special documentation blocks.
special documentation blocks (see section \ref specialblock).
<li> You generate a configuration file (see section \ref config) by
calling doxygen with the \c -g option:
\verbatim
......@@ -42,12 +43,50 @@ doxygen <config_file>
\endverbatim
</ol>
If you have a configuration file generated with an older version of
doxygen that you can upgrade it to the current version by running doxygen
with the -u option.
\verbatim
doxygen -u <config_file>
\endverbatim
All configuration settings in the orginal configuration file will be copied
to the new configuration file. Any new options will have their default value.
Note that comments that you may have added in the original configuration file
will be lost.
If you want to fine-tune the way the output looks, doxygen allows you
generate default style sheet, header, and footer files that you can edit
afterwards:
<ul>
<li>For HTML output, you can generate the default header file
(see \ref cfg_html_header "HTML_HEADER"), the default footer
(see \ref cfg_html_footer "HTML_FOOTER"), and the default style
sheet (see \ref cfg_html_stylesheet "HTML_STYLESHEET"), using the
following command:
\verbatim
doxygen -w html header.html footer.html stylesheet.css
\endverbatim
<li>For LaTeX output, you can generate the first part of \c refman.tex
(see \ref cfg_latex_header "LATEX_HEADER") and the style sheet included
by that header (normally <code>doxygen.sty</code>), using:
\verbatim
doxygen -w latex header.tex doxygen.sty
\endverbatim
<li>For RTF output, you can generate the default style sheet file (see
\ref cfg_rtf_stylesheet_file "RTF_STYLESHEET_FILE") using:
\verbatim
doxygen -w rtf rtfstyle.cfg
\endverbatim
</ul>
<b>Note:</b><br>
<ul>
<li> If you do not want the description for each item in the configuration
file then you can use the optional \c -s option.
Try to use this option if you send me a configuration file as part of
a bug report!
<li> If you do not want documentation for each item inside the configuration
file then you can use the optional \c -s option. This can use be
used in combination with the \c -u option, to add or strip the
documentation from an existing configuration file.
Please use the \c -s this option if you send me a configuration file
as part of a bug report!
<li> To make doxygen read/write to standard input/output instead of from/to
a file, use \c - for the file name.
</ul>
......
/******************************************************************************
*
*
*
* Copyright (C) 1997-2000 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.
*
* Documents produced by Doxygen are derivative works derived from the
* input used in their production; they are not affected by this license.
*
*/
/*! \page doxywizard_usage Doxywizard usage
Doxywizard is a GUI front-end for creating and editing
configuration files that are used by doxygen.
Doxywizard consists of a single executable that, when started,
pops up a window.
The main window has a number of tab field, one
for each section in the configuration file. Each tab-field
contains a number of lines, one for each configuration option in
that section.
The kind of input widget depends on the type of the configuration option.
<ul>
<li>For each boolean option (those options that are answered with YES or
NO in the configuration file) there is a check-box.
<li>For items taking one of a fixed set of values (like
\ref cfg_output_language "OUTPUT_LANGUAGE") a combo box is used.
<li>For items taking an integer value from a range, a spinbox is used.
<li>For free form string-type options there is a one line edit field
<li>For options taking a lists of strings, a one line edit field is
available, with a `+' button to add this string to the list and
a `-' button to remove the selected string from the list. There
is also a button with a circular "refresh" arrow that, when pressed,
replaces the selected item in the list with the string entered in the
edit field.
<li>For file and folder entries, there are special buttons
that start a file dialog.
</ul>
\image html doxywizard.gif
*/
......@@ -38,7 +38,7 @@
parser and GUI front-end from source templates.
<li>Better support for the using keyword.
<li>New transparent mini logo that is put in the footer of all HTML pages.
<li>Internationalization support for the Polish and Croatian language.
<li>Internationalization support for the Polish, Portuguese and Croatian language.
<li>Todo list support.
<li>If the source browser is enabled, for a function, a list of function whose
implementation calls that function, is generated.
......
......@@ -15,6 +15,7 @@
*
*/
/*! \page index
\if logo_on
<center>
\htmlonly
<img align=center lowsrc="doxygen_logo_low.gif" src="doxygen_logo.gif"
......@@ -22,6 +23,7 @@
Version: $(VERSION)
\endhtmlonly
</center>
\endif
<h2>Doxygen license</h2>
\addindex license
......@@ -105,6 +107,7 @@ The second part forms a reference manual:
<li>Section \ref doxygen_usage shows how to use the \c doxygen program.
<li>Section \ref doxytag_usage shows how to use the \c doxytag program.
<li>Section \ref doxysearch_usage shows how to use the \c doxysearch program.
<li>Section \ref doxywizard_usage shows how to use the \c doxywizard program.
<li>Section \ref installdox_usage shows how to use the \c installdox
script that is generated by Doxygen if you use tag files.
<li>Section \ref output shows how to generate the various output formats
......
......@@ -92,7 +92,11 @@ Compilation is now done by performing the following steps:
If you have Qt-2.1.x installed and want to build the GUI front-end, you
should run the configure script with the <code>--with-doxywizard</code>
option.
option:
\verbatim
configure --with-doxywizard
\endverbatim
For an overview of other configuration options use
......@@ -216,6 +220,9 @@ If you are compiling for HP-UX with aCC and you get this error:
#include <alloca.h>
\endverbatim
If that does not help, try removing <code>ce_parse.cpp</code> and let
bison rebuilt it (this worked for me).
If you are compiling for Digital Unix, the same problem can be solved
(according to Barnard Schmallhof) by replacing the following in
ce_parse.cpp:
......@@ -256,7 +263,50 @@ ce_parse.cpp:
<b>Sun compiler problems</b>
I tried compiling doxygen only with Sun's C++ WorkShop Compiler
version 5.0 (I used <code>./configure --platform solaris-cc</code>)
Qt-2.x.x is required for this compiler (Qt-1.44 has problems with the bool
type).
Compiling the \c doxygen binary went ok, but while linking <code>doxytag</code> I got a
lot of link errors, like these:
\verbatim
QList<PageInfo>::__vtbl /home/dimitri/doxygen/objects/SunWS_cache/CC_obj_6/6c3eO4IogMT2vrlGCQUQ.o
[Hint: try checking whether the first non-inlined, non-pure virtual function of class QList<PageInfo> is defined]
\endverbatim
These are generated because the compiler is confused about the object sharing
between \c doxygen and \c doxytag. To compile \c doxytag and \c doxysearch
anyway do:
\verbatim
rm -rf objects
mkdir objects
cd src
gmake -f Makefile.doxytag
gmake -f Makefile.doxysearch
\endverbatim
when configuring with <code>--static</code> I got:
\verbatim
Undefined first referenced
symbol in file
dlclose /usr/lib/libc.a(nss_deffinder.o)
dlsym /usr/lib/libc.a(nss_deffinder.o)
dlopen /usr/lib/libc.a(nss_deffinder.o)
\endverbatim
Manually adding <code>-Bdynamic</code> after the target rule in
<code>Makefile.doxygen</code> and <code>Makefile.doxytag</code>
will fix this:
\verbatim
$(TARGET): $(OBJECTS) $(OBJMOC)
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) -Bdynamic
\endverbatim
<b>GNU 2.7.2.x compiler problems</b>
......
......@@ -29,6 +29,9 @@ information.
The executable \c doxysearch is only needed if you want to use the search
engine. See section \ref doxysearch_usage for more detailed usage information.
Optionally, the executable \c doxywizard is a GUI front-end for editing
the configuration files that are used by doxygen.
\subsection step1 Step 1: Creating a configuration file
Doxygen uses a configuration file to determine all of its settings.
......@@ -129,14 +132,16 @@ documentation, \c doxygen writes a \c Makefile into the \c latex directory.
By typing \c make in the \c latex directory the dvi file \c refman.dvi
will be generated (provided that you have a make tool called
<code>make</code> ofcourse). This file can then be viewed using \c xdvi or
converted into a postscript file \c refman.ps by typing <code>make ps</code>
(this requires <code>dvips</code>). The Postscript file can be send to a postscript
converted into a postscript file \c refman.ps by
typing <code>make ps</code> (this requires <code>dvips</code>).
To put 2 pages on one physical page use <code>make ps_2on1</code> instead.
The resulting Postscript file can be send to a postscript
printer. If you do not have a postscript printer, you can try to use
ghostscript to convert postscript into something your printer understands.
Conversion to PDF is also possible if you have installed the ghostscript
interpreter; just type <code>make pdf</code>. To get the best results for
PDF output you should set the \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS"
tag to \c YES.
interpreter; just type <code>make pdf</code> (or <code>make pdf_2on1</code>).
To get the best results for PDF output you should set
the \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS" tag to \c YES.
The generated man pages can be viewed using the \c man program. You do need
to make sure the man directory is in the man path (see the \c MANPATH
......
......@@ -80,12 +80,24 @@ know why.
Furthermore, I would appreciate a mail if you have found
a bug, or if you have ideas (or even better some code or a patch)
how to fix existing bugs and limitations.
how to fix existing bugs and limitations. For patches please use
"diff -u"
<h2>How to report a bug</h2>
If you think you have found a bug in doxygen, please report it so I can
fix it.
Always include the following information in your bug report:
- The version of doxygen you are using.
- The name and version number of your operating system
The easiest way for me to solve bugs is if you can send me a small example
demonstrating the problem you have (make sure the example compiles!). It is
usually a good idea to send along the configuation file as well, but please
use doxygen with the <code>-s</code> flag while generating it.
demonstrating the problem you have. Please make sure the example is valid
source code (try compiling it) and if the problem is really captured by
the example.
It is usually a good idea to send along the configuation file as well,
but please use doxygen with the <code>-s</code> flag while generating it.
My e-mail address: <a href="mailto:dimitri@stack.nl">dimitri@stack.nl</a>
*/
......
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = afterdoc
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = afterdoc.h
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = author
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = author.cpp
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = autolink
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = autolink.cpp
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = class
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = class.h
QUIET = YES
......@@ -3,6 +3,7 @@ OUTPUT_DIRECTORY = define
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = define.h
ENABLE_PREPROCESSING = YES
QUIET = YES
......@@ -5,6 +5,7 @@ EXTRACT_ALL = YES
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
ENABLE_PREPROCESSING = YES
INPUT = .
FILE_PATTERNS = diagrams_*.h
......
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = enum
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = enum.h
QUIET = YES
......@@ -4,6 +4,7 @@ GENERATE_TAGFILE = example.tag
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = example.cpp
EXAMPLE_PATH = example_test.cpp
QUIET = YES
>Test: "class_Test.html"
>Test: "class_test.html"
example a0 "()"
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = file
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = file.h
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = func
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = func.h
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = group
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = group.cpp
QUIET = YES
......@@ -3,6 +3,7 @@ OUTPUT_DIRECTORY = include
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = include.cpp
EXAMPLE_PATH = example_test.cpp
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = jdstyle
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = jdstyle.cpp
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = memgrp
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = memgrp.cpp
QUIET = YES
......@@ -3,5 +3,7 @@ OUTPUT_DIRECTORY = overload
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
SORT_MEMBER_DOCS = NO
INPUT = overload.cpp
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = page
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = page.doc
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = par
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = par.cpp
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = qtstyle
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = qtstyle.cpp
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = relates
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = relates.cpp
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = restypedef
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = restypedef.cpp
QUIET = YES
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = structcmd
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = structcmd.h
QUIET = YES
......@@ -3,6 +3,7 @@ OUTPUT_DIRECTORY = tag
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = tag.cpp
TAGFILES = example.tag
PERL_PATH = perl
......
......@@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = template
GENERATE_LATEX = NO
GENERATE_MAN = NO
GENERATE_RTF = NO
CASE_SENSE_NAMES = NO
INPUT = templ.cpp
QUIET = YES
Name: doxygen
Version: 1.1.5-20000716
Version: 1.2.0
Summary: documentation system for C, C++ and IDL
Release: 1
Source0: doxygen-%{version}.src.tar.gz
......
......@@ -779,9 +779,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
ol.writeString("<font size=2><center>[");
ol.writeString("<center><font size=\"2\">[");
ol.writeHtmlLink("graph_legend.html",theTranslator->trLegend());
ol.writeString("]</center></font>");
ol.writeString("]</font></center>");
ol.popGeneratorState();
}
ol.popGeneratorState();
......@@ -811,9 +811,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
ol.writeString("<font size=2><center>[");
ol.writeString("<center><font size=\"2\">[");
ol.writeHtmlLink("graph_legend.html",theTranslator->trLegend());
ol.writeString("]</center></font>");
ol.writeString("]</font></center>");
ol.popGeneratorState();
}
ol.popGeneratorState();
......@@ -1123,7 +1123,7 @@ void ClassDef::writeMemberList(OutputList &ol)
while (mi)
{
MemberDef *md=mi->memberDef;
ClassDef *cd=md->memberClass();
ClassDef *cd=md->getClassDef();
// compute the protection level for this member
Protection protect=md->protection();
......@@ -1301,7 +1301,7 @@ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup)
//ol.insertMemberAlign();
//printf("ClassName=`%s' inGroup=%d\n",name().data(),inGroup);
if (inGroup && md && md->memberClass()==this) return;
if (inGroup && md && md->getClassDef()==this) return;
switch(compType)
{
......@@ -1447,13 +1447,13 @@ void ClassDef::mergeMembers(/*ClassDef *cd,BaseClassList *bcl*/)
bool hidden=FALSE;
MemberNameInfoIterator dstMnii(*dstMni);
MemberInfo *dstMi;
ClassDef *srcCd = srcMd->memberClass();
ClassDef *srcCd = srcMd->getClassDef();
for ( ; (dstMi=dstMnii.current()) && !found; ++dstMnii )
{
MemberDef *dstMd = dstMi->memberDef;
if (srcMd!=dstMd) // different members
{
ClassDef *dstCd = dstMd->memberClass();
ClassDef *dstCd = dstMd->getClassDef();
//printf("Is %s a base class of %s?\n",srcCd->name(),dstCd->name());
if (srcCd==dstCd || dstCd->isBaseClass(srcCd))
// member is in the same or a base class
......@@ -1565,7 +1565,7 @@ void ClassDef::mergeMembers(/*ClassDef *cd,BaseClassList *bcl*/)
Specifier virt=mi->virt;
if (mi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt;
MemberInfo *newMi=new MemberInfo(mi->memberDef,bcd->prot,virt);
//if (mi->memberDef->memberClass()!=bClass)
//if (mi->memberDef->getClassDef()!=bClass)
newMi->scopePath=bClass->name()+"::"+mi->scopePath;
newMi->ambigClass=mi->ambigClass;
newMi->ambiguityResolutionScope=mi->ambiguityResolutionScope.copy();
......
......@@ -102,10 +102,12 @@ class ClassDef : public Definition
ArgumentList *outerTemplateArguments() const;
void setTemplateArguments(ArgumentList *al);
//QCString getTemplateNameString();
NamespaceDef *getNamespaceDef() { return nspace; }
FileDef *getFileDef() const { return fileDef; }
void setNamespace(NamespaceDef *nd) { nspace = nd; }
NamespaceDef *getNamespace() { return nspace; }
void setFileDef(FileDef *fd) { fileDef=fd; }
FileDef *getFileDef() const { return fileDef; }
void mergeMembers();
bool isBaseClass(ClassDef *bcd);
void determineImplUsageRelation();
......
......@@ -96,6 +96,7 @@ static int g_lastStringContext;
static int g_bracketCount = 0;
static int g_curlyCount = 0;
static int g_sharpCount = 0;
static bool g_insideTemplate = FALSE;
static QCString g_type;
static QCString g_name;
static QCString g_args;
......@@ -254,6 +255,14 @@ static void setClassScope(const QCString &name)
//printf("setClassScope(%s)\n",name.data());
QCString n=name;
n=n.simplifyWhiteSpace();
int ts=n.find('<'); // start of template
int te=n.findRev('>'); // end of template
//printf("ts=%d te=%d\n",ts,te);
if (ts!=-1 && te!=-1 && te>ts)
{
// remove template from scope
n=n.left(ts)+n.right(n.length()-te-1);
}
int index;
if ((index=n.findRev("::"))!=-1)
g_classScope=n.left(index);
......@@ -273,7 +282,7 @@ static void addVariable()
else
{
//printf("adding variable `%s' `%s'\n",g_cvd.type.data(),g_cvd.name.data());
if ((getClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type]))
if ((getResolvedClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type]))
{
g_cvd.classScope=g_classScope;
g_codeVarList.append(new CodeVarDef(g_cvd)); // add it to a list
......@@ -436,11 +445,11 @@ static bool generateClassMemberLink(OutputList &ol,ClassDef *mcd,const char *mem
int mdist=maxInheritanceDepth;
for (;(mmd=mmni.current());++mmni)
{
int m=minClassDistance(mcd,mmd->memberClass());
if (m<mdist && mmd->memberClass()->isLinkable())
int m=minClassDistance(mcd,mmd->getClassDef());
if (m<mdist && mmd->getClassDef()->isLinkable())
{
mdist=m;
xcd=mmd->memberClass();
xcd=mmd->getClassDef();
xmd=mmd;
}
}
......@@ -507,33 +516,36 @@ static void generateMemberLink(OutputList &ol,const char *varName,
}
else
{
//printf("Class not found!\n");
OutputList result(&ol);
//printf("cvd->type=`%s'\n",cvd->type.data());
if (getLink(cvd->type,memName,result))
{
ol+=result;
}
else
{
codifyLines(memName);
codifyLines(memName);
}
return;
}
}
else
{
ClassDef *vcd = getClass(g_classScope);
ClassDef *vcd = getResolvedClass(g_classScope);
if (vcd && vcd->isLinkable())
{
//printf("Found class for variable `%s'\n",varName);
MemberName *vmn=memberNameDict[varName];
if (vmn)
{
//printf("There is a variable with name `%s'\n",varName);
MemberNameIterator vmni(*vmn);
MemberDef *vmd;
for (;(vmd=vmni.current());++vmni)
{
if ((vmd->isVariable() || vmd->isFunction()) &&
vmd->memberClass()==vcd)
vmd->getClassDef()==vcd)
{
//printf("Found variable type=%s\n",vmd->typeString());
ClassDef *mcd=stripClassName(vmd->typeString());
......@@ -552,11 +564,11 @@ static void generateMemberLink(OutputList &ol,const char *varName,
int mdist=maxInheritanceDepth;
for (;(mmd=mmni.current());++mmni)
{
int m=minClassDistance(mcd,mmd->memberClass());
if (m<mdist && mmd->memberClass()->isLinkable())
int m=minClassDistance(mcd,mmd->getClassDef());
if (m<mdist && mmd->getClassDef()->isLinkable())
{
mdist=m;
xcd=mmd->memberClass();
xcd=mmd->getClassDef();
xmd=mmd;
}
}
......@@ -609,6 +621,14 @@ static void generateFunctionLink(OutputList &ol,char *funcName)
{
locScope=locFunc.left(i);
locFunc=locFunc.right(locFunc.length()-i-2);
int ts=locScope.find('<'); // start of template
int te=locScope.findRev('>'); // end of template
//printf("ts=%d te=%d\n",ts,te);
if (ts!=-1 && te!=-1 && te>ts)
{
// remove template from scope
locScope=locScope.left(ts)+locScope.right(locScope.length()-te-1);
}
}
//printf("generateFunctionLink(%s) classScope=%s\n",locFunc.data(),locScope.data());
if (!locScope.isEmpty() && (ccd=g_codeClassDict[locScope]))
......@@ -684,7 +704,9 @@ B [ \t]
BN [ \t\n\r]
ID [a-z_A-Z][a-z_A-Z0-9]*
SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
SCOPEPREFIX {ID}{B}*"::"({B}*{ID}{B}*"::")*
TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID})
SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*"::"{BN}*)+
KEYWORD ("asm"|"auto"|"class"|"const"|"const_cast"|"delete"|"dynamic_cast"|"enum"|"explicit"|"extern"|"false"|"friend"|"inline"|"mutable"|"namespace"|"new"|"operator"|"private"|"protected"|"public"|"register"|"reinterpret_cast"|"sizeof"|"static"|"static_cast"|"struct"|"template"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile")
FLOWKW ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"for"|"goto"|"if"|"return"|"switch"|"throw"|"try"|"while")
TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"|"void"|"wchar_t")
......@@ -720,7 +742,8 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
codifyLines(yytext);
endFontClass();
//g_code->codify(yytext);
BEGIN( ClassName );
if (!g_insideTemplate)
BEGIN( ClassName );
}
<ReadInclude>[a-z_A-Z0-9.]+(("/"[a-z_A-Z0-9.]+)*)/(">"|"\"") {
//FileInfo *f;
......@@ -753,7 +776,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
<SkipCPP>\\\n {
codifyLines(yytext);
}
<SkipCPP>\n {
<SkipCPP>\n/.*\n {
codifyLines(yytext);
endFontClass();
BEGIN( Body ) ;
......@@ -852,7 +875,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
}
<Body>{SCOPEPREFIX}*{B}*"operator"{B}*"()"{B}*/"(" {
<Body>{SCOPEPREFIX}?"operator"{B}*"()"{B}*/"(" {
addType();
generateFunctionLink(*g_code,yytext);
g_bracketCount=1;
......@@ -860,7 +883,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_name+=yytext;
BEGIN( FuncCall );
}
<Body>{SCOPEPREFIX}*{B}*"operator"{B}*[^\(\n]+/"(" {
<Body>{SCOPEPREFIX}?"operator"{B}*[^\(\n]+/"(" {
addType();
generateFunctionLink(*g_code,yytext);
g_bracketCount=1;
......@@ -868,6 +891,13 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_name+=yytext;
BEGIN( FuncCall );
}
<Body>"template"/([^a-zA-Z0-9]) {
startFontClass("keyword");
codifyLines(yytext);
endFontClass();
g_insideTemplate=TRUE;
g_sharpCount=0;
}
<Body>{KEYWORD}/([^a-z_A-Z0-9]) {
startFontClass("keyword");
codifyLines(yytext);
......@@ -918,13 +948,15 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
addType();
g_name+=yytext;
}
<Body>{SCOPENAME}{B}*"<"[^\"\}\{\(\)\/\n\>]*">"/{B}* {
/*
<Body>{SCOPETNAME}/{B}* {
int i;
generateClassLink(*g_code,yytext,&i);
addType();
QCString text=yytext;
g_name+=text.left(i);
}
*/
<Body>{SCOPENAME}/{B}* { // p->func()
generateClassLink(*g_code,yytext);
addType();
......@@ -944,7 +976,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
addType();
g_name+=varname;
}
<Body>{SCOPENAME}/{B}*"(" { // func1()->func2()
<Body>{SCOPETNAME}/{B}*"(" { // a() or c::a() or t<A,B>::a()
addType();
generateFunctionLink(*g_code,yytext);
g_bracketCount=1;
......@@ -976,6 +1008,23 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_code->codify(yytext);
g_name.resize(0);g_type.resize(0);
}
<Body>"<" {
if (g_insideTemplate)
{
g_sharpCount++;
}
g_code->codify(yytext);
}
<Body>">" {
if (g_insideTemplate)
{
if (--g_sharpCount<=0)
{
g_insideTemplate=FALSE;
}
}
g_code->codify(yytext);
}
<Body,MemberCall,MemberCall2,FuncCall>"'"((\\0[Xx0-9]+)|(\\.)|(.))"'" {
startFontClass("charliteral");
g_code->codify(yytext);
......@@ -986,7 +1035,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
g_code->codify(yytext);
BEGIN( MemberCall );
}
<MemberCall>{SCOPENAME}/{B}*"(" {
<MemberCall>{SCOPETNAME}/{B}*"(" {
if (!g_name.isEmpty())
{
generateMemberLink(*g_code,g_name,yytext);
......@@ -1273,7 +1322,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
}
else
{
g_lastCContext = YY_START ;
// check is to prevent getting stuck in skipping C++ comments
if (YY_START != SkipCxxComment)
{
g_lastCContext = YY_START ;
}
startFontClass("comment");
g_code->codify(yytext);
BEGIN(SkipComment);
......@@ -1336,7 +1389,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
}
else
{
g_lastCContext = YY_START ;
// check is to prevent getting stuck in skipping C++ comments
if (YY_START != SkipCxxComment)
{
g_lastCContext = YY_START ;
}
startFontClass("comment");
g_code->codify(yytext);
BEGIN(SkipComment);
......@@ -1350,7 +1407,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
}
else
{
g_lastCContext = YY_START ;
// check is to prevent getting stuck in skipping C++ comments
if (YY_START != SkipCxxComment)
{
g_lastCContext = YY_START ;
}
startFontClass("comment");
g_code->codify(yytext);
BEGIN(SkipComment);
......@@ -1366,7 +1427,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
<*>"/*" {
startFontClass("comment");
g_code->codify(yytext);
g_lastCContext = YY_START ;
// check is to prevent getting stuck in skipping C++ comments
if (YY_START != SkipCxxComment)
{
g_lastCContext = YY_START ;
}
BEGIN( SkipComment ) ;
}
<*>"//" {
......@@ -1430,6 +1495,7 @@ void parseCode(OutputList &ol,const char *className,const QCString &s,
g_bodyCurlyCount = 0;
g_bracketCount = 0;
g_sharpCount = 0;
g_insideTemplate = FALSE;
g_classVar = 0;
g_classScope = className;
g_exampleBlock = exBlock;
......
......@@ -357,7 +357,7 @@ void Definition::writeSourceRefs(OutputList &ol,const char *scopeName)
{
QCString scope=md->getScopeString();
QCString name=md->name();
//printf("class=%p scope=%s scopeName=%s\n",md->memberClass(),scope.data(),scopeName);
//printf("class=%p scope=%s scopeName=%s\n",md->getClassDef(),scope.data(),scopeName);
if (!scope.isEmpty() && scope!=scopeName)
{
name.prepend(scope+"::");
......
......@@ -1104,7 +1104,20 @@ void DotClassGraph::writeGraph(QTextStream &out,
return;
}
out << "<p><center><img src=\"" << baseName << ".gif\" border=\"0\" usemap=\"#"
<< m_startNode->m_label << "_" << mapName << "\"></center>" << endl;
<< m_startNode->m_label << "_" << mapName << "\" alt=\"";
switch (m_graphType)
{
case Implementation:
out << "Collaboration graph";
break;
case Interface:
out << "Interface dependency graph";
break;
case Inheritance:
out << "Inheritance graph";
break;
}
out << "\"></center>" << endl;
out << "<map name=\"" << m_startNode->m_label << "_" << mapName << "\">" << endl;
convertMapFile(out,baseName+".map");
out << "</map><p>" << endl;
......@@ -1140,7 +1153,7 @@ void DotClassGraph::writeGraph(QTextStream &out,
"\\end{center}\n"
"\\end{figure}\n";
}
//thisDir.remove(baseName+".dot");
thisDir.remove(baseName+".dot");
QDir::setCurrent(oldDir);
}
......@@ -1280,7 +1293,9 @@ void DotInclDepGraph::writeGraph(QTextStream &out,
}
out << "<p><center><img src=\"" << baseName << ".gif\" border=\"0\" usemap=\"#"
<< mapName << "_map\">";
<< mapName << "_map\" alt=\"";
if (m_inverse) out << "Included by dependency graph"; else out << "Include dependency graph";
out << "\">";
out << "</center>" << endl;
out << "<map name=\"" << mapName << "_map\">" << endl;
convertMapFile(out,baseName+".map");
......
......@@ -952,7 +952,7 @@ static MemberDef *addVariableToClass(
MemberDef *md=mn->first();
while (md)
{
if (md->memberClass()==cd && root->type==md->typeString())
if (md->getClassDef()==cd && root->type==md->typeString())
// member already in the scope
{
addMemberDocs(root,md,def,0,FALSE);
......@@ -1085,7 +1085,7 @@ static MemberDef *addVariableToFile(
{
nd = namespaceDict[nscope];
}
if (nd==0 || md->getNamespace()==nd)
if (nd==0 || md->getNamespaceDef()==nd)
// variable already in the scope
{
addMemberDocs(root,md,def,0,FALSE);
......@@ -1352,8 +1352,9 @@ static void buildMemberList(Entry *root)
);
bool isFriend=root->type.find("friend ")!=-1;
QCString rname = removeRedundantWhiteSpace(root->name);
if (!root->name.isEmpty())
if (!rname.isEmpty())
{
ClassDef *cd=0;
......@@ -1365,18 +1366,18 @@ static void buildMemberList(Entry *root)
QCString scope=stripAnnonymousNamespaceScope(root->parent->name.copy());
bool isMember=FALSE;
int memIndex=root->name.find("::");
int memIndex=rname.find("::");
if (memIndex!=-1)
{
int ts=root->name.find('<');
int te=root->name.find('>');
int ts=rname.find('<');
int te=rname.find('>');
if (ts==-1 || te==-1)
{
isMember=TRUE;
}
else
{
isMember=memIndex<ts && memIndex<te;
isMember=memIndex<ts || memIndex>te;
}
}
......@@ -1398,7 +1399,7 @@ static void buildMemberList(Entry *root)
root->type=root->type.left(i+l);
}
QCString name=removeRedundantWhiteSpace(root->name);
QCString name=removeRedundantWhiteSpace(rname);
if (name.left(2)=="::") name=name.right(name.length()-2);
MemberDef::MemberType mtype;
......@@ -1417,7 +1418,7 @@ static void buildMemberList(Entry *root)
//if (Config::includeSourceFlag && !root->body.isEmpty())
//{
// printf("Function: %s\n-----------------\n%s\n------------------\n",
// root->name.data(),root->body.data());
// rname.data(),root->body.data());
//}
// new member function, signal or slot.
......@@ -1500,7 +1501,7 @@ static void buildMemberList(Entry *root)
" def=`%s'\n",
root->type.data(),
root->parent->name.data(),
root->name.data(),
rname.data(),
root->args.data(),
root->proto,
def.data()
......@@ -1532,7 +1533,7 @@ static void buildMemberList(Entry *root)
!(root->parent->section & Entry::COMPOUND_MASK) &&
!isMember &&
//root->name.find("::")==-1 && // TODO: remove this check
//rname.find("::")==-1 && // TODO: remove this check
// // it breaks cases like
// // func<A::B>(), but it is needed
// // for detect that A::func() is a member
......@@ -1550,23 +1551,37 @@ static void buildMemberList(Entry *root)
bool found=FALSE;
MemberName *mn;
//MemberDef *fmd;
if ((mn=functionNameDict[root->name]))
if ((mn=functionNameDict[rname]))
{
//printf("--> function %s already found!\n",root->name.data());
//printf("--> function %s already found!\n",rname.data());
MemberDef *md=mn->first();
while (md && !found)
{
NamespaceDef *nd = md->getNamespace();
NamespaceDef *nd = md->getNamespaceDef();
NamespaceDef *rnd = 0;
if (!root->parent->name.isEmpty())
{
rnd = namespaceDict[root->parent->name];
}
FileDef *fd = md->getFileDef();
QCString nsName = nd ? nd->name().data() : "";
//printf("namespace `%s'\n",nsName.data());
QCString nsName,rnsName;
if (nd) nsName = nd->name().copy();
if (rnd) rnsName = rnd->name().copy();
//printf("namespace `%s' `%s'\n",nsName.data(),rnsName.data());
if (
matchArguments(md->argumentList(),root->argList,0,nsName)
)
{
// function already found in the same file, one is probably
// a prototype.
found=nd || fd->absFilePath()==root->fileName;
// see if we need to create a new member
found=nsName==rnsName && // members are in the same namespace
((fd!=0 && // no external reference
fd->absFilePath()==root->fileName // prototype in the same file
) ||
md->getGroupDef()!=0 // member is part of a group
);
// otherwise, allow a duplicate global member with the same argument list
// merge members documentation and properties
mergeArguments(root->argList,md->argumentList());
if (!md->documentation() && !root->doc.isEmpty())
{
......@@ -1590,10 +1605,10 @@ static void buildMemberList(Entry *root)
if (!found) /* global function is unique with respect to the file */
{
//printf("New function type=`%s' name=`%s' args=`%s' bodyLine=%d\n",
// root->type.data(),root->name.data(),root->args.data(),root->bodyLine);
// root->type.data(),rname.data(),root->args.data(),root->bodyLine);
// new global function
QCString name=removeRedundantWhiteSpace(root->name);
QCString name=removeRedundantWhiteSpace(rname);
MemberDef *md=new MemberDef(
root->fileName,root->startLine,
root->type,name,root->args,root->exception,
......@@ -1641,7 +1656,7 @@ static void buildMemberList(Entry *root)
" def=`%s'\n",
root->type.data(),
root->parent->name.data(),
root->name.data(),
rname.data(),
root->args.data(),
root->proto,
def.data()
......@@ -1705,10 +1720,10 @@ static void buildMemberList(Entry *root)
}
//printf("unrelated function %d `%s' `%s' `%s'\n",
// root->parent->section,root->type.data(),root->name.data(),root->args.data());
// root->parent->section,root->type.data(),rname.data(),root->args.data());
}
}
else if (root->name.isEmpty())
else if (rname.isEmpty())
{
warn(root->fileName,root->startLine,
"Warning: Illegal member name found."
......@@ -1748,11 +1763,11 @@ static void findFriends()
//printf("Checking for matching arguments
// mmd->isRelated()=%d mmd->isFriend()=%d mmd->isFunction()=%d\n",
// mmd->isRelated(),mmd->isFriend(),mmd->isFunction());
NamespaceDef *nd=mmd->getNamespace();
NamespaceDef *nd=mmd->getNamespaceDef();
if ((mmd->isFriend() || (mmd->isRelated() && mmd->isFunction())) &&
matchArguments(mmd->argumentList(),
fmd->argumentList(),
mmd->memberClass()->name(),
mmd->getClassDef()->name(),
nd ? nd->name().data() : 0
)
) // if the member is related and the arguments match then the
......@@ -1951,7 +1966,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
}
bool found=baseClass!=0 && baseClass!=cd;
NamespaceDef *nd=cd->getNamespace();
NamespaceDef *nd=cd->getNamespaceDef();
if (!found)
{
FileDef *fd=cd->getFileDef();
......@@ -2166,8 +2181,8 @@ static void addMemberDocs(Entry *root,
// strip extern specifier
if (fDecl.left(7)=="extern ") fDecl=fDecl.right(fDecl.length()-7);
md->setDefinition(fDecl);
ClassDef *cd=md->memberClass();
NamespaceDef *nd=md->getNamespace();
ClassDef *cd=md->getClassDef();
NamespaceDef *nd=md->getNamespaceDef();
if (al)
{
mergeArguments(md->argumentList(),al);
......@@ -2390,7 +2405,7 @@ static bool findUnrelatedFunction(Entry *root,
while (md)
{
bool ambig;
NamespaceDef *nd=md->getNamespace();
NamespaceDef *nd=md->getNamespaceDef();
//printf("Namespace namespaceName=%s nd=%s\n",
// namespaceName.data(),nd ? nd->name().data() : "<none>");
FileDef *fd=findFileDef(inputNameDict,root->fileName,ambig);
......@@ -2897,7 +2912,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
{
Debug::print(Debug::FindMembers,0,
"3. member definition found scopeName=`%s'\n",scopeName.data());
ClassDef *cd=md->memberClass();
ClassDef *cd=md->getClassDef();
//printf("Member %s (member scopeName=%s) (this scopeName=%s) classTempList=%s\n",md->name().data(),cd->name().data(),scopeName.data(),classTempList.data());
ClassDef *tcd=0;
......@@ -3036,7 +3051,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
md=mn->first();
while (md)
{
ClassDef *cd=md->memberClass();
ClassDef *cd=md->getClassDef();
if (cd!=0 && cd->name()==className) candidates++;
md=mn->next();
}
......@@ -3047,7 +3062,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
md=mn->first();
while (md)
{
ClassDef *cd=md->memberClass();
ClassDef *cd=md->getClassDef();
if (cd!=0 && cd->name()==className)
{
warn_cont(" %s",md->declaration());
......@@ -3075,14 +3090,14 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
// however be avoided, because it is error prone
MemberDef *md=mn->first();
ASSERT(md);
ClassDef *cd=md->memberClass();
ClassDef *cd=md->getClassDef();
ASSERT(cd);
QCString className=cd->name().copy();
md=mn->next();
bool unique=TRUE;
while (md)
{
ClassDef *cd=md->memberClass();
ClassDef *cd=md->getClassDef();
if (className!=cd->name()) unique=FALSE;
md=mn->next();
}
......@@ -3519,7 +3534,7 @@ static void findEnums(Entry *root)
{
if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
{
NamespaceDef *fnd=fmd->getNamespace();
NamespaceDef *fnd=fmd->getNamespaceDef();
if (fnd==nd) // enum value is inside a namespace
{
md->insertEnumField(fmd);
......@@ -3537,7 +3552,7 @@ static void findEnums(Entry *root)
}
else
{
ClassDef *fcd=fmd->memberClass();
ClassDef *fcd=fmd->getClassDef();
if (fcd==cd) // enum value is inside a class
{
md->insertEnumField(fmd); // add field def to list
......@@ -3605,7 +3620,7 @@ static void findEnumDocumentation(Entry *root)
MemberDef *md=mn->first();
while (md && !found)
{
ClassDef *cd=md->memberClass();
ClassDef *cd=md->getClassDef();
if (cd && cd->name()==className)
{
// documentation outside a compound overrides the documentation inside it
......@@ -3729,8 +3744,8 @@ static void computeMemberRelations()
for ( ; bmdi.current() ; ++bmdi) // for each other member with that signature
{
MemberDef *bmd=bmdi.current();
ClassDef *bmcd = bmd->memberClass();
ClassDef *mcd = md->memberClass();
ClassDef *bmcd = bmd->getClassDef();
ClassDef *mcd = md->getClassDef();
//printf("Check relation between `%s'::`%s' and `%s'::`%s'\n",
// mcd->name().data(),md->name().data(),
// bmcd->name().data(),bmd->name().data()
......@@ -3750,7 +3765,7 @@ static void computeMemberRelations()
{
MemberDef *rmd;
if ((rmd=md->reimplements())==0 ||
minClassDistance(mcd,bmcd)<minClassDistance(mcd,rmd->memberClass())
minClassDistance(mcd,bmcd)<minClassDistance(mcd,rmd->getClassDef())
)
{
//printf("setting (new) reimplements member\n");
......@@ -3905,13 +3920,13 @@ static void addSourceReferences()
MemberDef *md=0;
for (mni.toFirst();(md=mni.current());++mni)
{
ClassDef *cd=md->memberClass();
ClassDef *cd=md->getClassDef();
FileDef *fd=md->getBodyDef();
if (fd && cd && cd->isLinkableInProject() && md->getStartBodyLine()!=-1 &&
md->isLinkableInProject())
{
Definition *d=cd;
if (d==0) d=md->getNamespace();
if (d==0) d=md->getNamespaceDef();
if (d==0) d=md->getFileDef();
fd->addSourceRef(md->getStartBodyLine(),d,md);
}
......@@ -3924,9 +3939,9 @@ static void addSourceReferences()
MemberDef *md=0;
for (mni.toFirst();(md=mni.current());++mni)
{
NamespaceDef *nd=md->getNamespace();
NamespaceDef *nd=md->getNamespaceDef();
FileDef *fd=md->getBodyDef();
GroupDef *gd=md->groupDef();
GroupDef *gd=md->getGroupDef();
if (md->getStartBodyLine()!=-1 && md->isLinkableInProject() &&
((nd && nd->isLinkableInProject()) ||
(fd && fd->isLinkableInProject()) ||
......@@ -4641,22 +4656,17 @@ static void generateSearchIndex()
//----------------------------------------------------------------------------
/*! Generate a template version of the configuration file.
* If the \a shortList parameter is TRUE a configuration file without
* comments will be generated.
*/
static void generateConfigFile(const char *configFile,bool shortList)
static bool openOutputFile(const char *outFile,QFile &f)
{
QFile f;
bool fileOpened=FALSE;
bool writeToStdout=(configFile[0]=='-' && configFile[1]==0);
bool writeToStdout=(outFile[0]=='-' && outFile[1]=='\0');
if (writeToStdout) // write to stdout
{
fileOpened = f.open(IO_WriteOnly,stdout);
}
else // write to file
{
QFileInfo fi(configFile);
QFileInfo fi(outFile);
if (fi.exists()) // create a backup
{
QDir dir=fi.dir();
......@@ -4665,14 +4675,24 @@ static void generateConfigFile(const char *configFile,bool shortList)
dir.remove(backup.fileName());
dir.rename(fi.fileName(),fi.fileName()+".bak");
}
f.setName(configFile);
f.setName(outFile);
fileOpened = f.open(IO_WriteOnly);
}
return fileOpened;
}
/*! Generate a template version of the configuration file.
* If the \a shortList parameter is TRUE a configuration file without
* comments will be generated.
*/
static void generateConfigFile(const char *configFile,bool shortList)
{
QFile f;
bool fileOpened=openOutputFile(configFile,f);
bool writeToStdout=(configFile[0]=='-' && configFile[1]=='\0');
if (fileOpened)
{
writeTemplateConfig(&f,shortList);
f.close();
if (!writeToStdout)
{
msg("\n\nConfiguration file `%s' created.\n\n",configFile);
......@@ -4691,60 +4711,6 @@ static void generateConfigFile(const char *configFile,bool shortList)
}
}
//----------------------------------------------------------------------------
/*! Generate a template stylesheet
*/
static void generateStyleSheetFile(OutputGenerator::OutputType outType,const char *sheetName)
{
QFile f;
bool fileOpened=FALSE;
bool writeToStdout = strcmp(sheetName,"-")==0;
if (writeToStdout) // write to stdout
{
fileOpened = f.open(IO_WriteOnly,stdout);
}
else // write to file
{
QFileInfo fi(sheetName);
if (fi.exists()) // create a backup
{
QDir dir=fi.dir();
QFileInfo backup(fi.fileName()+".bak");
if (backup.exists()) // remove existing backup
dir.remove(backup.fileName());
dir.rename(fi.fileName(),fi.fileName()+".bak");
}
f.setName(sheetName);
fileOpened = f.open(IO_WriteOnly);
}
if (fileOpened)
{
switch(outType)
{
case OutputGenerator::RTF:
RTFGenerator::writeStyleSheetFile(f);
break;
case OutputGenerator::Html:
HtmlGenerator::writeStyleSheetFile(f);
break;
case OutputGenerator::Latex:
LatexGenerator::writeStyleSheetFile(f);
break;
default:
break;
}
f.close();
}
else
{
err("Error: Cannot open file %s for writing\n",sheetName);
exit(1);
}
}
//----------------------------------------------------------------------------
// read and parse a tag file
......@@ -5189,8 +5155,9 @@ static void usage(const char *name)
msg(" %s [configName]\n\n",name);
msg(" If - is used for configName doxygen will read from standard input.\n\n");
msg("4) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.\n");
msg(" %s -w rtf|html|latex outputFileName [configName]\n",name);
msg(" If - is used for outputFileName doxygen will write to standard output.\n\n");
msg(" RTF: %s -w rtf styleSheetFile\n",name);
msg(" HTML: %s -w html headerFile footerFile styleSheetFile [configFile]\n",name);
msg(" LaTeX: %s -w latex headerFile styleSheetFile [configFile]\n\n",name);
msg("If -s is specified the comments in the config file will be omitted.\n");
msg("If configName is omitted `Doxyfile' will be used as a default.\n\n");
exit(1);
......@@ -5261,28 +5228,65 @@ int main(int argc,char **argv)
err("Error: option -w is missing format specifier rtf, html or latex\n");
exit(1);
}
if (optind+1>=argc)
{
err("Error: option -w is missing a configuration file name\n");
exit(1);
}
if (stricmp(formatName,"rtf")==0)
{
generateStyleSheetFile(OutputGenerator::RTF,argv[optind+1]);
if (optind+1>=argc)
{
err("Error: option \"-w rtf\" is missing a style sheet file name\n");
exit(1);
}
QFile f;
if (openOutputFile(argv[optind+1],f))
{
RTFGenerator::writeStyleSheetFile(f);
}
exit(1);
}
else if (stricmp(formatName,"html")==0)
{
generateStyleSheetFile(OutputGenerator::Html,argv[optind+1]);
if (optind+4<argc)
{
QCString configFile=fileToString(argv[optind+4]);
if (configFile.isEmpty()) exit(1);
parseConfig(fileToString(argv[optind+4]));
configStrToVal();
substituteEnvironmentVars();
checkConfig();
}
else
{
Config::init();
setTranslator("English");
}
if (optind+3>=argc)
{
err("Error: option \"-w html\" does not have enough arguments\n");
exit(1);
}
QFile f;
if (openOutputFile(argv[optind+1],f))
{
HtmlGenerator::writeHeaderFile(f);
}
f.close();
if (openOutputFile(argv[optind+2],f))
{
HtmlGenerator::writeFooterFile(f);
}
f.close();
if (openOutputFile(argv[optind+3],f))
{
HtmlGenerator::writeStyleSheetFile(f);
}
exit(1);
}
else if (stricmp(formatName,"latex")==0)
{
if (optind+2<argc) // use config file to get settings
if (optind+3<argc) // use config file to get settings
{
QCString configFile=fileToString(argv[optind+2]);
QCString configFile=fileToString(argv[optind+3]);
if (configFile.isEmpty()) exit(1);
parseConfig(fileToString(argv[optind+2]));
parseConfig(fileToString(argv[optind+3]));
configStrToVal();
substituteEnvironmentVars();
checkConfig();
......@@ -5292,7 +5296,21 @@ int main(int argc,char **argv)
Config::init();
setTranslator("English");
}
generateStyleSheetFile(OutputGenerator::Latex,argv[optind+1]);
if (optind+2>=argc)
{
err("Error: option \"-w html\" does not have enough arguments\n");
exit(1);
}
QFile f;
if (openOutputFile(argv[optind+1],f))
{
LatexGenerator::writeHeaderFile(f);
}
f.close();
if (openOutputFile(argv[optind+2],f))
{
LatexGenerator::writeStyleSheetFile(f);
}
exit(1);
}
else
......@@ -5356,7 +5374,7 @@ int main(int argc,char **argv)
else
{
QFileInfo fi(argv[optind]);
if (fi.exists())
if (fi.exists() || strcmp(argv[optind],"-")==0)
{
config=fileToString(argv[optind]);
configName=argv[optind];
......@@ -5765,8 +5783,7 @@ int main(int argc,char **argv)
msg("Combining RTF output...\n");
if (!RTFGenerator::preProcessFileInplace(Config::rtfOutputDir,"refman.rtf"))
{
err("Error processing RTF files!\n");
exit(1);
err("An error occurred during post-processing the RTF files!\n");
}
}
......
......@@ -508,25 +508,46 @@ void FileDef::insertMember(MemberDef *md)
switch(md->memberType())
{
case MemberDef::Variable:
varMembers.inSort(md);
if (Config::sortMembersFlag)
varMembers.inSort(md);
else
varMembers.append(md);
break;
case MemberDef::Function:
funcMembers.inSort(md);
case MemberDef::Function:
if (Config::sortMembersFlag)
funcMembers.inSort(md);
else
funcMembers.append(md);
break;
case MemberDef::Typedef:
typedefMembers.inSort(md);
if (Config::sortMembersFlag)
typedefMembers.inSort(md);
else
typedefMembers.append(md);
break;
case MemberDef::Enumeration:
enumMembers.inSort(md);
if (Config::sortMembersFlag)
enumMembers.inSort(md);
else
enumMembers.append(md);
break;
case MemberDef::EnumValue:
enumValMembers.inSort(md);
if (Config::sortMembersFlag)
enumValMembers.inSort(md);
else
enumValMembers.append(md);
break;
case MemberDef::Prototype:
protoMembers.inSort(md);
if (Config::sortMembersFlag)
protoMembers.inSort(md);
else
protoMembers.append(md);
break;
case MemberDef::Define:
defineMembers.inSort(md);
if (Config::sortMembersFlag)
defineMembers.inSort(md);
else
defineMembers.append(md);
break;
default:
err("FileDef::insertMembers(): unexpected member insert in file!\n");
......@@ -537,7 +558,10 @@ void FileDef::insertMember(MemberDef *md)
/*! Adds compound definition \a cd to the list of all compounds of this file */
void FileDef::insertClass(ClassDef *cd)
{
classList->inSort(cd);
if (Config::sortMembersFlag)
classList->inSort(cd);
else
classList->append(cd);
}
/*! Adds namespace definition \a nd to the list of all compounds of this file */
......@@ -545,7 +569,10 @@ void FileDef::insertNamespace(NamespaceDef *nd)
{
if (!nd->name().isEmpty() && namespaceDict->find(nd->name())==0)
{
namespaceList->inSort(nd);
if (Config::sortMembersFlag)
namespaceList->inSort(nd);
else
namespaceList->append(nd);
namespaceDict->insert(nd->name(),nd);
}
}
......
......@@ -78,17 +78,26 @@ void GroupDef::distributeMemberGroupDocumentation()
void GroupDef::addFile(const FileDef *def)
{
fileList->append(def);
if (Config::sortMembersFlag)
fileList->inSort(def);
else
fileList->append(def);
}
void GroupDef::addClass(const ClassDef *def)
{
classList->append(def);
if (Config::sortMembersFlag)
classList->inSort(def);
else
classList->append(def);
}
void GroupDef::addNamespace(const NamespaceDef *def)
{
namespaceList->append(def);
if (Config::sortMembersFlag)
namespaceList->inSort(def);
else
namespaceList->append(def);
}
void GroupDef::addMemberListToGroup(MemberList *ml,
......@@ -142,15 +151,50 @@ void GroupDef::insertMember(MemberDef *md)
allMemberDict->insert(funcDecl,md);
switch(md->memberType())
{
case MemberDef::Variable: varMembers.inSort(md); break;
case MemberDef::Function: funcMembers.inSort(md); break;
case MemberDef::Typedef: typedefMembers.inSort(md); break;
case MemberDef::Enumeration: enumMembers.inSort(md); break;
case MemberDef::EnumValue: enumValMembers.inSort(md); break;
case MemberDef::Prototype: protoMembers.inSort(md); break;
case MemberDef::Define: defineMembers.inSort(md); break;
case MemberDef::Variable:
if (Config::sortMembersFlag)
varMembers.inSort(md);
else
varMembers.append(md);
break;
case MemberDef::Function:
if (Config::sortMembersFlag)
funcMembers.inSort(md);
else
funcMembers.append(md);
break;
case MemberDef::Typedef:
if (Config::sortMembersFlag)
typedefMembers.inSort(md);
else
typedefMembers.append(md);
break;
case MemberDef::Enumeration:
if (Config::sortMembersFlag)
enumMembers.inSort(md);
else
enumMembers.append(md);
break;
case MemberDef::EnumValue:
if (Config::sortMembersFlag)
enumValMembers.inSort(md);
else
enumValMembers.append(md);
break;
case MemberDef::Prototype:
if (Config::sortMembersFlag)
protoMembers.inSort(md);
else
protoMembers.append(md);
break;
case MemberDef::Define:
if (Config::sortMembersFlag)
defineMembers.inSort(md);
else
defineMembers.append(md);
break;
default:
err("FileDef::insertMembers(): unexpected member insert in file!\n");
err("FileDef::insertMembers(): unexpected member insert in file!\n");
}
//addMemberToGroup(md,groupId);
}
......@@ -158,7 +202,10 @@ void GroupDef::insertMember(MemberDef *md)
void GroupDef::addGroup(const GroupDef *def)
{
groupList->append(def);
if (Config::sortMembersFlag)
groupList->inSort(def);
else
groupList->append(def);
}
int GroupDef::countMembers() const
......@@ -450,7 +497,7 @@ void addMemberToGroups(Entry *root,MemberDef *md)
GroupDef *gd=0;
if (!s->isEmpty() && (gd=groupDict[*s]))
{
GroupDef *mgd = md->groupDef();
GroupDef *mgd = md->getGroupDef();
if (mgd==0)
{
gd->insertMember(md);
......
......@@ -45,7 +45,7 @@ static const char *defaultStyleSheet =
"A.codeRef { font-weight: normal; color: #4444ee }\n"
"DL.el { margin-left: -1cm }\n"
"DIV.fragment { width: 100%; border: none; background-color: #eeeeee }\n"
"DIV.in { margin-left: 16 }\n"
//"DIV.in { margin-left: 16 }\n"
"DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 }\n"
"TD.md { background-color: #f2f2ff }\n"
"DIV.groupHeader { margin-left: 16; margin-top: 12; margin-bottom: 6; font-weight: bold }\n"
......@@ -96,6 +96,61 @@ void HtmlGenerator::writeStyleSheetFile(QFile &file)
QTextStream t(&file);
t << defaultStyleSheet;
}
static void writeDefaultHeaderFile(QTextStream &t,const char *title,
bool external)
{
t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"
"<html><head><meta name=\"robots\" content=\"noindex\">\n"
"<meta http-equiv=\"Content-Type\" content=\"text/html;charset="
<< theTranslator->idLanguageCharset() << "\">\n"
"<title>" << title << "</title>\n";
t << "<link ";
if (external)
t << "doxygen=\"_doc:" << Config::docURL
<< "\" href=\"" << Config::docURL << "/";
else
t << "href=\"";
if (Config::htmlStyleSheet.isEmpty())
{
t << "doxygen.css";
}
else
{
QFileInfo cssfi(Config::htmlStyleSheet);
if (!cssfi.exists())
{
err("Error: user specified HTML style sheet file does not exist!\n");
}
t << cssfi.fileName();
}
t << "\" rel=\"stylesheet\" type=\"text/css\">\n"
"</head><body bgcolor=\"#ffffff\">\n";
}
void HtmlGenerator::writeHeaderFile(QFile &file)
{
QTextStream t(&file);
writeDefaultHeaderFile(t,"$title",FALSE);
}
void HtmlGenerator::writeFooterFile(QFile &file)
{
QTextStream t(&file);
t << "<hr><address><small>\n";
t << "Generated at $datetime for $projectname ";
t << " by <a href=\"http://www.stack.nl/~dimitri/doxygen/index.html\">\n"
<< "<img src=\"doxygen.gif\" alt=\"doxygen\" "
<< "align=\"middle\" border=0 width=110 height=53>\n"
<< "</a> $doxygenversion written by"
<< " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n"
<< " &copy;&nbsp;1997-2000</small></address>\n"
<< "</body>\n"
<< "</html>\n";
}
void HtmlGenerator::startFile(const char *name,const char *title,bool external)
{
QCString fileName=name;
......@@ -105,28 +160,7 @@ void HtmlGenerator::startFile(const char *name,const char *title,bool external)
lastFile = fileName;
if (header.isEmpty())
{
t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"
"<html><head><meta name=\"robots\" content=\"noindex\">\n"
"<meta http-equiv=\"Content-Type\" content=\"text/html;charset="
<< theTranslator->idLanguageCharset() << "\">\n"
"<title>" << title << "</title>\n";
t << "<link ";
if (external)
t << "doxygen=\"_doc:" << Config::docURL
<< "\" href=\"" << Config::docURL << "/";
else
t << "href=\"";
if (Config::htmlStyleSheet.isEmpty())
{
t << "doxygen.css";
}
else
{
QFileInfo cssfi(Config::htmlStyleSheet);
t << cssfi.fileName();
}
t << "\" rel=\"stylesheet\" type=\"text/css\">\n"
"</head><body bgcolor=\"#ffffff\">\n";
writeDefaultHeaderFile(t,title,external);
}
else
{
......@@ -190,13 +224,13 @@ void HtmlGenerator::writeFooter(int part,bool external)
t << "src=\"";
}
t << "doxygen.gif\" alt=\"doxygen\" "
<< "align=center border=0 " << endl <<
<< "align=\"middle\" border=0 " << endl <<
"width=110 height=53></a>" << versionString <<" ";
}
break;
default:
if (footer.isEmpty())
t << " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n &copy; "
t << " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n &copy;&nbsp;"
"1997-2000</small></address>\n</body>\n</html>\n";
break;
......@@ -561,7 +595,15 @@ void HtmlGenerator::endColorFont()
void HtmlGenerator::writeFormula(const char *n,const char *text)
{
if (text && text[0]=='\\') t << "<p><center>" << endl;
t << "<img align=\"top\" src=\"" << n << "\">" << endl;
t << "<img align=";
#if !defined(_WIN32)
t << "\"top\""; // assume Unix users use Netscape 4.x which does
// not seem to support align == "middle" :-((
#else
t << "\"middle\""; // assume Windows users use IE or HtmlHelp which only
// displays formulas nicely with align == "middle"
#endif
t << " src=\"" << n << "\">" << endl;
if (text && text[0]=='\\') t << "</center><p>" << endl;
}
......@@ -899,7 +941,13 @@ void HtmlGenerator::endMemberGroup(bool)
void HtmlGenerator::startIndent()
{
// I really wanted to use CSS here to provide an indented section, but
// alas, Netscape is buggy enough to sometimes "forget" to end the
// indent cause a staircase effect where the indent continuously increases.
// It's back to abusing tables :-(
//t << "<div class=\"in\">" << endl;
t << "<table cellspacing=5 cellpadding=0 border=0>\n"
" <tr>\n"
" <td>\n"
......
......@@ -31,6 +31,8 @@ class HtmlGenerator : public OutputGenerator
~HtmlGenerator();
static void init();
static void writeStyleSheetFile(QFile &f);
static void writeHeaderFile(QFile &f);
static void writeFooterFile(QFile &f);
OutputGenerator *copy() { return new HtmlGenerator; }
//OutputGenerator *clone() { return new HtmlGenerator(*this); }
......
......@@ -947,7 +947,7 @@ void writeMemberList(OutputList &ol)
//!md->isReference() && md->hasDocumentation() &&
// md->name()[0]!='@' &&
md->isLinkableInProject() &&
(cd=md->memberClass()) &&
(cd=md->getClassDef()) &&
cd->isLinkableInProject()
)
{
......@@ -968,7 +968,7 @@ void writeMemberList(OutputList &ol)
QCString prevName;
while (md)
{
ClassDef *cd=md->memberClass();
ClassDef *cd=md->getClassDef();
if (//cd && (md->isFriend() || md->protection()!=Private || Config::extractPrivateFlag) &&
//!md->isReference() && md->hasDocumentation() &&
md->isLinkableInProject() &&
......@@ -1009,10 +1009,10 @@ int countClassMembers()
{
if (//(md->isFriend() || md->protection()!=Private || Config::extractPrivateFlag) &&
//!md->isReference() && !md->isRelated() && md->hasDocumentation() &&
//md->name()[0]!='@' && (cd=md->memberClass()) && cd->isLinkable())
//md->name()[0]!='@' && (cd=md->getClassDef()) && cd->isLinkable())
md->isLinkableInProject() &&
!md->isRelated() &&
(cd=md->memberClass()) &&
(cd=md->getClassDef()) &&
cd->isLinkableInProject()
)
{
......@@ -1025,10 +1025,10 @@ int countClassMembers()
// otherMd=md;
//if (//(md->isFriend() || md->protection()!=Private || Config::extractPrivateFlag) &&
// //!md->isReference() && md->isRelated() && md->hasDocumentation() &&
// //md->name()[0]!='@' && (cd=md->memberClass()) && cd->isLinkable()
// //md->name()[0]!='@' && (cd=md->getClassDef()) && cd->isLinkable()
// md->isLinkableInProject() &&
// md->isRelated() &&
// (cd=md->memberClass()) &&
// (cd=md->getClassDef()) &&
// cd->isLinkableInProject()
// )
// found=TRUE;
......@@ -1073,10 +1073,9 @@ void writeFileMemberList(OutputList &ol)
bool found=FALSE;
while (md && !found)
{
FileDef *fd=md->getFileDef() ? md->getFileDef() : md->getFileDec();
bool hasDocs =
(md->getFileDef() && md->getFileDef()->isLinkableInProject()) ||
(md->getFileDec() && md->getFileDec()->isLinkableInProject());
FileDef *fd=md->getFileDef();
bool hasDocs = md->getFileDef() &&
md->getFileDef()->isLinkableInProject();
if (fd && hasDocs &&
md->isLinkableInProject()
......@@ -1099,10 +1098,9 @@ void writeFileMemberList(OutputList &ol)
QCString prevName;
while (md)
{
FileDef *fd=md->getFileDef() ? md->getFileDef() : md->getFileDec();
bool hasDocs =
(md->getFileDef() && md->getFileDef()->isLinkableInProject()) ||
(md->getFileDec() && md->getFileDec()->isLinkableInProject());
FileDef *fd=md->getFileDef();
bool hasDocs = md->getFileDef() &&
md->getFileDef()->isLinkableInProject();
if (fd && hasDocs &&
md->isLinkableInProject() &&
//!md->isReference() &&
......@@ -1143,7 +1141,7 @@ void writeNamespaceMemberList(OutputList &ol)
bool found=FALSE;
while (md && !found)
{
NamespaceDef *nd=md->getNamespace();
NamespaceDef *nd=md->getNamespaceDef();
if (nd && nd->isLinkableInProject() && md->isLinkableInProject())
found=TRUE;
else
......@@ -1161,7 +1159,7 @@ void writeNamespaceMemberList(OutputList &ol)
QCString prevName;
while (md)
{
NamespaceDef *nd=md->getNamespace();
NamespaceDef *nd=md->getNamespaceDef();
if (nd && nd->isLinkableInProject() && md->isLinkableInProject() &&
prevName!=nd->name()
)
......@@ -1195,7 +1193,7 @@ int countNamespaceMembers()
bool found=FALSE;
while (md && !found)
{
NamespaceDef *nd=md->getNamespace();
NamespaceDef *nd=md->getNamespaceDef();
if (nd && nd->isLinkableInProject() && md->isLinkableInProject())
found=TRUE;
else
......@@ -1220,11 +1218,9 @@ int countFileMembers()
bool found=FALSE;
while (md && !found)
{
if (md->isLinkableInProject() &&
(((fd=md->getFileDef()) && fd->isLinkableInProject())
||
((fd=md->getFileDec()) && fd->isLinkableInProject())
)
if (md->isLinkableInProject() &&
(fd=md->getFileDef()) &&
fd->isLinkableInProject()
)
found=TRUE;
else
......@@ -1243,8 +1239,6 @@ void writeFileMemberIndex(OutputList &ol)
if (documentedFunctions==0) return;
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
//ol.disable(OutputGenerator::Man);
//ol.disable(OutputGenerator::Latex);
startFile(ol,"globals","File Member Index");
startTitle(ol,0);
parseText(ol,Config::projectName+" "+theTranslator->trFileMembers());
......@@ -1252,8 +1246,6 @@ void writeFileMemberIndex(OutputList &ol)
parseText(ol,theTranslator->trFileMembersDescription(Config::extractAllFlag));
writeFileMemberList(ol);
endFile(ol);
//ol.enable(OutputGenerator::Latex);
//ol.enable(OutputGenerator::Man);
ol.popGeneratorState();
}
......
......@@ -30,6 +30,7 @@
#include "translator_ru.h"
#include "translator_hr.h"
#include "translator_pl.h"
#include "translator_pt.h"
#endif
#define L_EQUAL(a) !stricmp(langName,a)
......@@ -95,6 +96,10 @@ bool setTranslator(const char *langName)
{
theTranslator=new TranslatorPolish;
}
else if (L_EQUAL("portuguese"))
{
theTranslator=new TranslatorPortuguese;
}
#endif
else // use the default language (i.e. english)
{
......
......@@ -96,6 +96,7 @@ LatexGenerator::LatexGenerator() : OutputGenerator()
col=0;
//printf("LatexGenerator::LatexGenerator() insideTabbing=FALSE\n");
insideTabbing=FALSE;
firstDescItem=TRUE;
}
LatexGenerator::~LatexGenerator()
......@@ -113,6 +114,7 @@ void LatexGenerator::append(const OutputGenerator *g)
t << g->getContents();
col+=((LatexGenerator *)g)->col;
insideTabbing=insideTabbing || ((LatexGenerator *)g)->insideTabbing;
firstDescItem = ((LatexGenerator *)g)->firstDescItem;
//printf("LatexGenerator::append(%s) insideTabbing=%s\n", g->getContents().data(),
// insideTabbing ? "TRUE" : "FALSE" );
}
......@@ -175,7 +177,7 @@ void LatexGenerator::init()
<< "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out" << endl;
}
static void writeDefaultsStyleSheetPart1(QTextStream &t)
static void writeDefaultHeaderPart1(QTextStream &t)
{
// part 1
......@@ -252,7 +254,7 @@ static void writeDefaultsStyleSheetPart1(QTextStream &t)
}
static void writeDefaultsStyleSheetPart2(QTextStream &t)
static void writeDefaultHeaderPart2(QTextStream &t)
{
// part 2
t << "}\\\\" << endl
......@@ -260,7 +262,7 @@ static void writeDefaultsStyleSheetPart2(QTextStream &t)
<< "{\\large ";
}
static void writeDefaultsStyleSheetPart3(QTextStream &t)
static void writeDefaultHeaderPart3(QTextStream &t)
{
// part 3
t << " Doxygen " << versionString << "}\\\\" << endl
......@@ -275,16 +277,112 @@ static void writeDefaultsStyleSheetPart3(QTextStream &t)
t << "\\pagenumbering{arabic}\n";
}
void LatexGenerator::writeStyleSheetFile(QFile &f)
static void writeDefaultStyleSheetPart1(QTextStream &t)
{
// part 1
t << "\\NeedsTeXFormat{LaTeX2e}\n";
t << "\\ProvidesPackage{doxygen}\n";
t << "\\RequirePackage{calc}\n";
t << "\\RequirePackage{array}\n";
t << "\\pagestyle{fancyplain}\n";
t << "\\addtolength{\\headwidth}{\\marginparsep}\n";
t << "\\addtolength{\\headwidth}{\\marginparwidth}\n";
t << "\\newcommand{\\clearemptydoublepage}{\\newpage{\\pagestyle{empty}";
t << "\\cleardoublepage}}\n";
if (!Config::compactLatexFlag)
t << "\\renewcommand{\\chaptermark}[1]{\\markboth{#1}{}}\n";
t << "\\renewcommand{\\sectionmark}[1]{\\markright{\\thesection\\ #1}}\n";
t << "\\lhead[\\fancyplain{}{\\bfseries\\thepage}]\n";
t << " {\\fancyplain{}{\\bfseries\\rightmark}}\n";
t << "\\rhead[\\fancyplain{}{\\bfseries\\leftmark}]\n";
t << " {\\fancyplain{}{\\bfseries\\thepage}}\n";
t << "\\rfoot[\\fancyplain{}{\\bfseries\\scriptsize ";
}
static void writeDefaultStyleSheetPart2(QTextStream &t)
{
t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize ";
}
static void writeDefaultStyleSheetPart3(QTextStream &t)
{
t << "}}\n";
t << "\\cfoot{}\n";
t << "\\newenvironment{CompactList}\n";
t << "{\\begin{list}{}{\n";
t << " \\setlength{\\leftmargin}{0.5cm}\n";
t << " \\setlength{\\itemsep}{0pt}\n";
t << " \\setlength{\\parsep}{0pt}\n";
t << " \\setlength{\\topsep}{0pt}\n";
t << " \\renewcommand{\\makelabel}{}}}\n";
t << "{\\end{list}}\n";
t << "\\newenvironment{CompactItemize}\n";
t << "{\n";
t << " \\begin{itemize}\n";
t << " \\setlength{\\itemsep}{-3pt}\n";
t << " \\setlength{\\parsep}{0pt}\n";
t << " \\setlength{\\topsep}{0pt}\n";
t << " \\setlength{\\partopsep}{0pt}\n";
t << "}\n";
t << "{\\end{itemize}}\n";
t << "\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}\n";
t << "\\newlength{\\tmplength}\n";
t << "\\newenvironment{TabularC}[1]\n";
t << "{\n";
t << "\\setlength{\\tmplength}\n";
t << " {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}\n";
t << " \\par\\begin{tabular*}{\\linewidth}\n";
t << " {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}\n";
t << "}\n";
t << "{\\end{tabular*}\\par}\n";
t << "\\newcommand{\\entrylabel}[1]{\n";
t << " {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{\\textbf{#1}}\\\\}}}\n";
t << "\\newenvironment{Desc}\n";
t << "{\\begin{list}{}\n";
t << " {\n";
t << " \\settowidth{\\labelwidth}{40pt}\n";
t << " \\setlength{\\leftmargin}{\\labelwidth}\n";
t << " \\setlength{\\parsep}{0pt}\n";
t << " \\setlength{\\itemsep}{-4pt}\n";
t << " \\renewcommand{\\makelabel}{\\entrylabel}\n";
t << " }\n";
t << "}\n";
t << "{\\end{list}}\n";
t << "\\newenvironment{Indent}\n";
t << " {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n";
t << " \\item[]\\ignorespaces}\n";
t << " {\\unskip\\end{list}}\n";
t << "\\setlength{\\parindent}{0cm}\n";
t << "\\setlength{\\parskip}{0.2cm}\n";
t << "\\addtocounter{secnumdepth}{1}\n";
t << "\\sloppy\n";
}
void LatexGenerator::writeHeaderFile(QFile &f)
{
QTextStream t(&f);
writeDefaultsStyleSheetPart1(t);
writeDefaultHeaderPart1(t);
t << "Your title here";
writeDefaultsStyleSheetPart2(t);
writeDefaultHeaderPart2(t);
t << "Generated by";
writeDefaultsStyleSheetPart3(t);
writeDefaultHeaderPart3(t);
}
void LatexGenerator::writeStyleSheetFile(QFile &f)
{
QTextStream t(&f);
writeDefaultStyleSheetPart1(t);
t << "Generated at " << dateToString(TRUE);
if (Config::projectName.isEmpty()) t << " for " << Config::projectName << " ";
t << "by doxygen written by Dimitri van Heesch \\copyright{} 1997-2000";
writeDefaultStyleSheetPart2(t);
t << "Generated at " << dateToString(TRUE);
if (Config::projectName.isEmpty()) t << " for " << Config::projectName << " ";
t << "by doxygen written by Dimitri van Heesch \\copyright{} 1997-2000";
writeDefaultStyleSheetPart3(t);
}
void LatexGenerator::startFile(const char *name,const char *,bool)
{
......@@ -316,7 +414,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
{
if (Config::latexHeaderFile.isEmpty())
{
writeDefaultsStyleSheetPart1(t);
writeDefaultHeaderPart1(t);
}
else
{
......@@ -328,7 +426,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
case isTitlePageAuthor:
if (Config::latexHeaderFile.isEmpty())
{
writeDefaultsStyleSheetPart2(t);
writeDefaultHeaderPart2(t);
}
break;
case isMainPage:
......@@ -365,7 +463,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
bool found=FALSE;
while (gd && !found)
{
if (gd->isLinkableInProject() || gd->countMembers()>0)
if (gd->countMembers()>0)
{
if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
t << "{"; //Module Documentation}\n";
......@@ -381,7 +479,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
bool found=FALSE;
while (nd && !found)
{
if (nd->isLinkableInProject())
if (nd->isLinkableInProject() && nd->countMembers()>0)
{
if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
t << "{"; // Namespace Documentation}\n":
......@@ -458,7 +556,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
case isTitlePageAuthor:
if (Config::latexHeaderFile.isEmpty())
{
writeDefaultsStyleSheetPart3(t);
writeDefaultHeaderPart3(t);
}
break;
case isMainPage:
......@@ -512,7 +610,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
bool found=FALSE;
while (nd && !found)
{
if (nd->isLinkableInProject() || nd->countMembers()>0)
if (nd->isLinkableInProject() && nd->countMembers()>0)
{
t << "}\n\\input{" << nd->getOutputFileBase() << "}\n";
found=TRUE;
......@@ -521,7 +619,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
}
while (nd)
{
if (nd->isLinkableInProject() || nd->countMembers()>0)
if (nd->isLinkableInProject() && nd->countMembers()>0)
{
if (Config::compactLatexFlag) t << "\\input"; else t << "\\include";
t << "{" << nd->getOutputFileBase() << "}\n";
......@@ -640,23 +738,7 @@ void LatexGenerator::writeStyleInfo(int part)
{
//QCString pname=Config::projectName.stripWhiteSpace();
startPlainFile("doxygen.sty");
t << "\\NeedsTeXFormat{LaTeX2e}\n";
t << "\\ProvidesPackage{doxygen}\n";
t << "\\RequirePackage{calc}\n";
t << "\\RequirePackage{array}\n";
t << "\\pagestyle{fancyplain}\n";
t << "\\addtolength{\\headwidth}{\\marginparsep}\n";
t << "\\addtolength{\\headwidth}{\\marginparwidth}\n";
t << "\\newcommand{\\clearemptydoublepage}{\\newpage{\\pagestyle{empty}";
t << "\\cleardoublepage}}\n";
if (!Config::compactLatexFlag)
t << "\\renewcommand{\\chaptermark}[1]{\\markboth{#1}{}}\n";
t << "\\renewcommand{\\sectionmark}[1]{\\markright{\\thesection\\ #1}}\n";
t << "\\lhead[\\fancyplain{}{\\bfseries\\thepage}]\n";
t << " {\\fancyplain{}{\\bfseries\\rightmark}}\n";
t << "\\rhead[\\fancyplain{}{\\bfseries\\leftmark}]\n";
t << " {\\fancyplain{}{\\bfseries\\thepage}}\n";
t << "\\rfoot[\\fancyplain{}{\\bfseries\\scriptsize ";
writeDefaultStyleSheetPart1(t);
}
break;
case 1:
......@@ -665,83 +747,15 @@ void LatexGenerator::writeStyleInfo(int part)
break;
case 2:
{
t << " Dimitri van Heesch \\copyright{} 1997-2000}]{}\n";
//QCString dtString=dateToString(FALSE);
t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize ";
t << " Dimitri van Heesch \\copyright{} 1997-2000";
t << "}]{}\n";
writeDefaultStyleSheetPart2(t);
}
break;
case 4:
{
t << " Dimitri van Heesch \\copyright{} 1997-2000}}\n";
t << "\\cfoot{}\n";
t << "\\newenvironment{CompactList}\n";
t << "{\\begin{list}{}{\n";
t << " \\setlength{\\leftmargin}{0.5cm}\n";
t << " \\setlength{\\itemsep}{0pt}\n";
t << " \\setlength{\\parsep}{0pt}\n";
t << " \\setlength{\\topsep}{0pt}\n";
t << " \\renewcommand{\\makelabel}{}}}\n";
t << "{\\end{list}}\n";
t << "\\newenvironment{CompactItemize}\n";
t << "{\n";
t << " \\begin{itemize}\n";
t << " \\setlength{\\itemsep}{-3pt}\n";
t << " \\setlength{\\parsep}{0pt}\n";
t << " \\setlength{\\topsep}{0pt}\n";
t << " \\setlength{\\partopsep}{0pt}\n";
t << "}\n";
t << "{\\end{itemize}}\n";
t << "\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}\n";
t << "\\newlength{\\tmplength}\n";
t << "\\newenvironment{TabularC}[1]\n";
t << "{\n";
t << "\\setlength{\\tmplength}\n";
t << " {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}\n";
t << " \\par\\begin{tabular*}{\\linewidth}\n";
t << " {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}\n";
t << "}\n";
t << "{\\end{tabular*}\\par}\n";
t << "\\newcommand{\\entrylabel}[1]{\n";
t << " {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{\\textbf{#1}}\\\\}}}\n";
t << "\\newenvironment{Desc}\n";
t << "{\\begin{list}{}\n";
t << " {\n";
t << " \\settowidth{\\labelwidth}{40pt}\n";
t << " \\setlength{\\leftmargin}{\\labelwidth}\n";
t << " \\setlength{\\parsep}{0pt}\n";
t << " \\setlength{\\itemsep}{-4pt}\n";
t << " \\renewcommand{\\makelabel}{\\entrylabel}\n";
t << " }\n";
t << "}\n";
t << "{\\end{list}}\n";
t << "\\newenvironment{Indent}\n";
t << " {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n";
t << " \\item[]\\ignorespaces}\n";
t << " {\\unskip\\end{list}}\n";
t << "\\setlength{\\parindent}{0cm}\n";
t << "\\setlength{\\parskip}{0.2cm}\n";
t << "\\addtocounter{secnumdepth}{1}\n";
//if (!Config::compactLatexFlag)
//{
// t << "\\renewcommand{\\subsection}{\\@startsection{subsection}{2}{\\z@}\n";
// t << " {-3.25ex \\@plus -1ex \\@minus -.2ex}\n";
// t << " {1.5ex \\@plus.2ex}\n";
// t << " {\\normalfont\\large\\bfseries\\medskip\n";
// t << " \\vspace{0.6cm}\\hrule\\vspace{-0.6cm}}\n";
// t << " }\n";
//}
//else
//{
// t << "\\renewcommand{\\subsubsection}{\\@startsection{subsubsection}{3}{\\z@}\n";
// t << " {-3.25ex \\@plus -1ex \\@minus -.2ex}\n";
// t << " {1.5ex \\@plus.2ex}\n";
// t << " {\\normalfont\\normalsize\\bfseries\\medskip\n";
// t << " \\vspace{0.6cm}\\hrule\\vspace{-0.6cm}}\n";
// t << " }\n";
//}
t << "\\sloppy\n";
t << " Dimitri van Heesch \\copyright{} 1997-2000";
writeDefaultStyleSheetPart3(t);
endPlainFile();
}
break;
......@@ -1435,4 +1449,33 @@ void LatexGenerator::endInclDepGraph(DotInclDepGraph &g)
g.writeGraph(t,EPS,Config::latexOutputDir);
}
void LatexGenerator::startDescription()
{
t << "\\begin{description}" << endl;
}
void LatexGenerator::endDescription()
{
t << "\\end{description}" << endl;
firstDescItem=TRUE;
}
void LatexGenerator::startDescItem()
{
firstDescItem=TRUE;
t << "\\item[";
}
void LatexGenerator::endDescItem()
{
if (firstDescItem)
{
t << "]" << endl;
firstDescItem=FALSE;
}
else
{
lineBreak();
}
}
......@@ -29,6 +29,7 @@ class LatexGenerator : public OutputGenerator
~LatexGenerator();
static void init();
static void writeStyleSheetFile(QFile &f);
static void writeHeaderFile(QFile &f);
OutputGenerator *copy();
//OutputGenerator *clone() { return new LatexGenerator(*this); }
......@@ -117,10 +118,10 @@ class LatexGenerator : public OutputGenerator
void endEmphasis() { t << "}"; }
void startBold() { t << "{\\bf "; }
void endBold() { t << "}"; }
void startDescription() { t << "\\begin{description}" << endl; }
void endDescription() { t << "\\end{description}" << endl; }
void startDescItem() { t << "\\item["; }
void endDescItem() { t << "]" << endl; }
void startDescription();
void endDescription();
void startDescItem();
void endDescItem();
void lineBreak() { t << "\\par\n"; }
void startMemberDoc(const char *,const char *,const char *,const char *);
void endMemberDoc();
......@@ -236,6 +237,7 @@ class LatexGenerator : public OutputGenerator
LatexGenerator &operator=(const LatexGenerator &);
int col;
bool insideTabbing;
bool firstDescItem;
};
#endif
......@@ -236,7 +236,7 @@ MemberDef::MemberDef(const char *df,int dl,
//printf("++++++ MemberDef(%s file=%s,line=%d) ++++++ \n",na,df,dl);
classDef=0;
fileDef=0;
fileDec=0;
//fileDec=0;
redefines=0;
redefinedBy=0;
nspace=0;
......@@ -392,10 +392,10 @@ QCString MemberDef::getOutputFileBase() const
{
return fileDef->getOutputFileBase();
}
else if (fileDec)
{
return fileDec->getOutputFileBase();
}
//else if (fileDec)
//{
// return fileDec->getOutputFileBase();
//}
else if (nspace)
{
return nspace->getOutputFileBase();
......@@ -703,10 +703,10 @@ void MemberDef::writeDeclaration(OutputList &ol,
{
//printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
annMemb->writeLink(ol,
annMemb->memberClass(),
annMemb->getNamespace(),
annMemb->getClassDef(),
annMemb->getNamespaceDef(),
annMemb->getFileDef(),
annMemb->groupDef()
annMemb->getGroupDef()
);
annMemb->annUsed=annUsed=TRUE;
}
......@@ -794,7 +794,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
const char *scopeName)
{
if (memberClass()==0 && isStatic() && !Config::extractStaticFlag) return;
if (getClassDef()==0 && isStatic() && !Config::extractStaticFlag) return;
bool hasDocs = detailsAreVisible();
//printf("MemberDef::writeDocumentation(): type=`%s' def=`%s'\n",type.data(),definition());
if (
......@@ -806,8 +806,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
)
{
// get definition. TODO: make a method of this
NamespaceDef *nd=getNamespace();
ClassDef *cd=memberClass();
NamespaceDef *nd=getNamespaceDef();
ClassDef *cd=getClassDef();
FileDef *fd=getFileDef();
Definition *d = 0;
if (cd) d=cd; else if (nd) d=nd; else d=fd;
......@@ -1160,7 +1160,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
MemberDef *bmd=reimplements();
ClassDef *bcd=0;
if (bmd && (bcd=bmd->memberClass()))
if (bmd && (bcd=bmd->getClassDef()))
{
#if 0
if (lvirt!=Normal) // search for virtual member of the deepest base class
......@@ -1168,7 +1168,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
MemberDef *lastBmd=bmd;
while (lastBmd)
{
ClassDef *lastBcd = lastBmd->memberClass();
ClassDef *lastBcd = lastBmd->getClassDef();
if (lastBmd->virtualness()!=Normal &&
lastBmd->isLinkable() &&
lastBcd->isLinkable()
......@@ -1227,7 +1227,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
MemberDef *bmd=0;
uint count=0;
ClassDef *bcd=0;
for (mli.toFirst();(bmd=mli.current()) && (bcd=bmd->memberClass());++mli)
for (mli.toFirst();(bmd=mli.current()) && (bcd=bmd->getClassDef());++mli)
{
// count the members that directly inherit from md and for
// which the member and class are visible in the docs.
......@@ -1253,7 +1253,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
count=0;
// find the entryIndex-th documented entry in the inheritance list.
for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->memberClass());--mli)
for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->getClassDef());--mli)
{
if ( bmd->isLinkable() && bcd->isLinkable())
{
......@@ -1310,10 +1310,10 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
void MemberDef::warnIfUndocumented()
{
if (memberGroup) return;
ClassDef *cd = memberClass();
NamespaceDef *nd = getNamespace();
ClassDef *cd = getClassDef();
NamespaceDef *nd = getNamespaceDef();
FileDef *fd = getFileDef();
GroupDef *gd = groupDef();
GroupDef *gd = getGroupDef();
Definition *d=0;
const char *t=0;
if (cd)
......@@ -1348,7 +1348,7 @@ bool MemberDef::isLinkable()
bool MemberDef::detailsAreVisible() const
{
return !documentation().isEmpty() || // has detailed docs
/*(Config::sourceBrowseFlag && startBodyLine!=-1 && bodyDef) || // has reference to sources */
(Config::sourceBrowseFlag && startBodyLine!=-1 && bodyDef) || // has reference to sources
(mtype==Enumeration && docEnumValues) || // has enum values
(mtype==EnumValue && !briefDescription().isEmpty()) || // is doc enum value
(!briefDescription().isEmpty() &&
......@@ -1385,7 +1385,7 @@ bool MemberDef::visibleMemberGroup(bool hideNoHeader)
QCString MemberDef::getScopeString() const
{
QCString result;
if (memberClass()) result=memberClass()->name();
else if (getNamespace()) result=getNamespace()->name();
if (getClassDef()) result=getClassDef()->name();
else if (getNamespaceDef()) result=getNamespaceDef()->name();
return result;
}
......@@ -72,6 +72,71 @@ class MemberDef : public Definition
const ArgumentList *al);
~MemberDef();
QCString getOutputFileBase() const;
const char *declaration() const { return decl; }
const char *definition() const { return def; }
const char *typeString() const { return type; }
const char *argsString() const { return args; }
const char *excpString() const { return exception; }
const char *anchor() const { return anc; }
const QCString &initializer() const { return init; }
int initializerLines() const { return initLines; }
int getMemberSpecifiers() const { return memSpec; }
MemberList *getSectionList() const { return section; }
// scope query members
ClassDef *getClassDef() const { return classDef; }
GroupDef *getGroupDef() const { return group; }
FileDef *getFileDef() const { return fileDef; }
NamespaceDef* getNamespaceDef() const { return nspace; }
// direct kind info
Protection protection() const { return prot; }
Specifier virtualness() const { return virt; }
MemberType memberType() const { return mtype; }
// convenience methods
bool isSignal() const { return mtype==Signal; }
bool isSlot() const { return mtype==Slot; }
bool isVariable() const { return mtype==Variable; }
bool isEnumerate() const { return mtype==Enumeration; }
bool isEnumValue() const { return mtype==EnumValue; }
bool isTypedef() const { return mtype==Typedef; }
bool isFunction() const { return mtype==Function; }
bool isDefine() const { return mtype==Define; }
bool isFriend() const { return mtype==Friend; }
bool isRelated() const { return related; }
bool isStatic() const { return stat; }
bool isInline() const { return (memSpec&Entry::Inline)!=0; }
bool isExplicit() const { return (memSpec&Entry::Explicit)!=0; }
bool isMutable() const { return (memSpec&Entry::Mutable)!=0; }
// output info
bool isLinkableInProject();
bool isLinkable();
bool detailsAreVisible() const;
bool hasDocumentation(); // overrides hasDocumentation in definition.h
// set functions
void setMemberType(MemberType t) { mtype=t; }
void setDefinition(const char *d) { def=d; }
void setFileDef(FileDef *fd) { fileDef=fd; }
void setAnchor(const char *a) { anc=a; }
void setProtection(Protection p) { prot=p; }
void setMemberSpecifiers(int s) { memSpec=s; }
void mergeMemberSpecifiers(int s) { memSpec|=s; }
void setInitializer(const char *i) { init=i;
init=init.stripWhiteSpace();
initLines=init.contains('\n');
}
void setMaxInitLines(int lines) { if (lines!=-1) maxInitLines=lines; }
void setMemberClass(ClassDef *cd) { classDef=cd; }
void setSectionList(MemberList *sl) { section=sl; }
void setGroupDef(GroupDef *gd) { group=gd; }
void makeRelated() { related=TRUE; }
// output generatation
void writeLink(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
void writeDeclaration(OutputList &ol,
......@@ -81,56 +146,11 @@ class MemberDef : public Definition
const char *scopeName/*,MemberType m*/);
void warnIfUndocumented();
QCString getOutputFileBase() const;
const char *declaration() const { return decl; }
const char *definition() const { return def; }
const char *typeString() const { return type; }
const char *argsString() const { return args; }
const char *excpString() const { return exception; }
const char *anchor() const { return anc; }
const QCString &initializer() const { return init; }
int initializerLines() const { return initLines; }
ClassDef *memberClass() const { return classDef; }
Protection protection() const { return prot; }
Specifier virtualness() const { return virt; }
MemberType memberType() const { return mtype; }
GroupDef *groupDef() const { return group; }
FileDef *getFileDef() { return fileDef; }
FileDef *getFileDec() { return fileDec; }
bool isRelated() const { return related; }
bool isStatic() const { return stat; }
bool isInline() const { return (memSpec&Entry::Inline)!=0; }
bool isExplicit() const { return (memSpec&Entry::Explicit)!=0; }
bool isMutable() const { return (memSpec&Entry::Mutable)!=0; }
MemberList *getSectionList() const { return section; }
void setMemberType(MemberType t) { mtype=t; }
void setDefinition(const char *d) { def=d; }
void setFileDef(FileDef *fd) { fileDef=fd; }
void setFileDec(FileDef *fd) { fileDec=fd; }
void setAnchor(const char *a) { anc=a; }
void setProtection(Protection p) { prot=p; }
void setMemberSpecifiers(int s) { memSpec=s; }
int getMemberSpecifiers() const { return memSpec; }
void mergeMemberSpecifiers(int s) { memSpec|=s; }
void setInitializer(const char *i) { init=i;
init=init.stripWhiteSpace();
initLines=init.contains('\n');
}
void setMaxInitLines(int lines) { if (lines!=-1) maxInitLines=lines; }
void setMemberClass(ClassDef *cd) { classDef=cd; }
void setSectionList(MemberList *sl) { section=sl; }
void makeRelated() { related=TRUE; }
void setGroupDef(GroupDef *gd) { group=gd; }
bool hasDocumentation(); // overrides hasDocumentation in definition.h
bool isLinkableInProject();
bool isLinkable();
bool detailsAreVisible() const;
// relation to other members
void setReimplements(MemberDef *md) { redefines=md; }
void setReimplements(MemberDef *md) { redefines=md; }
void insertReimplementedBy(MemberDef *md);
MemberDef *reimplements() const { return redefines; }
MemberList *reimplementedBy() const { return redefinedBy; }
MemberDef *reimplements() const { return redefines; }
MemberList *reimplementedBy() const { return redefinedBy; }
// enumeration specific members
void insertEnumField(MemberDef *md);
......@@ -148,20 +168,9 @@ class MemberDef : public Definition
// example related members
bool addExample(const char *anchor,const char *name,const char *file);
//void writeExample(OutputList &ol);
bool hasExamples();
ExampleList *getExampleList() const { return exampleList; }
// convenience members
bool isSignal() const { return mtype==Signal; }
bool isSlot() const { return mtype==Slot; }
bool isVariable() const { return mtype==Variable; }
bool isEnumerate() const { return mtype==Enumeration; }
bool isEnumValue() const { return mtype==EnumValue; }
bool isTypedef() const { return mtype==Typedef; }
bool isFunction() const { return mtype==Function; }
bool isDefine() const { return mtype==Define; }
bool isFriend() const { return mtype==Friend; }
// prototype related members
void setPrototype(bool p) { proto=p; }
......@@ -178,10 +187,8 @@ class MemberDef : public Definition
ArgumentList *scopeDefTemplateArguments() const { return scopeTAL; }
void setMemberDefTemplateArguments(ArgumentList *t);
ArgumentList *memberDefTemplateArguments() const { return membTAL; }
//QCString getScopeTemplateNameString();
// namespace related members
NamespaceDef *getNamespace() const { return nspace; }
void setNamespace(NamespaceDef *nd) { nspace=nd; }
// member group related members
......@@ -190,6 +197,7 @@ class MemberDef : public Definition
void setMemberGroupId(int id) { grpId=id; }
int getMemberGroupId() const { return grpId; }
// annonymous scope members
void setFromAnnonymousScope(bool b) { annScope=b; }
void setFromAnnonymousMember(MemberDef *m) { annMemb=m; }
bool fromAnnonymousScope() const { return annScope; }
......@@ -204,7 +212,6 @@ class MemberDef : public Definition
private:
ClassDef *classDef; // member of or related to
FileDef *fileDef; // member of file definition
FileDef *fileDec; // member of file declaration
MemberDef *redefines; // the member that is redefined by this one
MemberDef *enumScope; // the enclosing scope, if this is an enum field
MemberDef *annEnumType; // the annonymous enum that is the type of this member
......@@ -225,8 +232,6 @@ class MemberDef : public Definition
QCString declFile; // file where the declaration was found
int declLine; // line where the declaration was found
QCString def; // member definition in code (fully qualified name)
//QCString defFile; // file where the definition was found
//int defLine; // line where the definition was found
QCString anc; // HTML anchor name
Specifier virt; // normal/virtual/pure virtual
Protection prot; // protection type [Public/Protected/Private]
......@@ -237,10 +242,10 @@ class MemberDef : public Definition
bool eUsed; // is the enumerate already placed in a list
bool proto; // is it a prototype;
bool docEnumValues; // is an enum with documented enum values.
bool annScope;
bool annUsed;
bool annShown;
int indDepth;
bool annScope; // member is part of an annoymous scope
bool annUsed;
bool annShown;
int indDepth; // indentation depth for this member if inside an annonymous scope
int maxInitLines; // when the initializer will be displayed
MemberList *section; // declation list containing this member
MemberDef *annMemb;
......@@ -249,7 +254,6 @@ class MemberDef : public Definition
ArgumentList *scopeTAL; // template argument list of class template
ArgumentList *membTAL; // template argument list of class template
int grpId; // group id
//QCString grpHeader; // group header
MemberGroup *memberGroup; // group's member definition
GroupDef *group; // group in which this member is in
......
......@@ -54,7 +54,7 @@ void MemberList::countDecMembers(bool inGroup,bool countSubGroups,bool sectionPe
{
//printf("md=%p md->name()=`%s' inGroup=%d getMemberGroup()=%p\n",
// md,md->name().data(),inGroup,md->getMemberGroup());
if (!(md->memberClass()==0 && md->isStatic() && !Config::extractStaticFlag) &&
if (!(md->getClassDef()==0 && md->isStatic() && !Config::extractStaticFlag) &&
(!Config::hideMemberFlag || md->hasDocumentation()) &&
(
(!Config::hideMemberFlag || !md->documentation().isEmpty() ||
......@@ -73,7 +73,7 @@ void MemberList::countDecMembers(bool inGroup,bool countSubGroups,bool sectionPe
case MemberDef::Variable: varCnt++,m_count++; break;
case MemberDef::Function: // fall through
case MemberDef::Signal: // fall through
case MemberDef::Slot: if (!md->isRelated() || md->memberClass())
case MemberDef::Slot: if (!md->isRelated() || md->getClassDef())
funcCnt++,m_count++;
break;
case MemberDef::Enumeration: enumCnt++,m_count++; break;
......@@ -119,7 +119,7 @@ void MemberList::countDocMembers()
//printf("%s MemberList::countDocMembers() details=%d\n",
// md->name().data(),md->detailsAreVisible());
bool visibleIfStatic =
!(md->memberClass()==0 && md->isStatic() && !Config::extractStaticFlag);
!(md->getClassDef()==0 && md->isStatic() && !Config::extractStaticFlag);
if (visibleIfStatic &&
(Config::extractAllFlag || md->detailsAreVisible())
......@@ -410,7 +410,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
{
if (
( md->isFunction() || md->isSignal() || md->isSlot()) &&
( !md->isRelated() || md->memberClass() ) &&
( !md->isRelated() || md->getClassDef() ) &&
inGroup==md->visibleMemberGroup(sectionPerType)
)
{
......
......@@ -33,8 +33,8 @@ int MemberName::compareItems(GCI item1, GCI item2)
{
MemberDef *m1=(MemberDef *)item1;
MemberDef *m2=(MemberDef *)item2;
ClassDef *c1=m1->memberClass();
ClassDef *c2=m2->memberClass();
ClassDef *c1=m1->getClassDef();
ClassDef *c2=m2->getClassDef();
FileDef *f1=m1->getFileDef();
FileDef *f2=m2->getFileDef();
if (c1 && c2)
......@@ -55,8 +55,8 @@ int MemberNameInfo::compareItems(GCI item1, GCI item2)
{
MemberInfo *m1=(MemberInfo *)item1;
MemberInfo *m2=(MemberInfo *)item2;
ClassDef *c1=m1->memberDef->memberClass();
ClassDef *c2=m2->memberDef->memberClass();
ClassDef *c1=m1->memberDef->getClassDef();
ClassDef *c2=m2->memberDef->getClassDef();
FileDef *f1=m1->memberDef->getFileDef();
FileDef *f2=m2->memberDef->getFileDef();
if (c1 && c2)
......
......@@ -66,14 +66,23 @@ void NamespaceDef::distributeMemberGroupDocumentation()
}
void NamespaceDef::insertUsedFile(const char *f)
{
if (files.find(f)==-1) files.append(f);
if (files.find(f)==-1)
{
if (Config::sortMembersFlag)
files.inSort(f);
else
files.append(f);
}
}
void NamespaceDef::insertClass(ClassDef *cd)
{
if (classDict->find(cd->name())==0)
{
classList->append(cd);
if (Config::sortMembersFlag)
classList->inSort(cd);
else
classList->append(cd);
classDict->insert(cd->name(),cd);
}
}
......@@ -121,13 +130,48 @@ void NamespaceDef::insertMember(MemberDef *md)
allMemberList.append(md);
switch(md->memberType())
{
case MemberDef::Variable: varMembers.inSort(md); break;
case MemberDef::Function: funcMembers.inSort(md); break;
case MemberDef::Typedef: typedefMembers.inSort(md); break;
case MemberDef::Enumeration: enumMembers.inSort(md); break;
case MemberDef::EnumValue: enumValMembers.inSort(md); break;
case MemberDef::Prototype: protoMembers.inSort(md); break;
case MemberDef::Define: defineMembers.inSort(md); break;
case MemberDef::Variable:
if (Config::sortMembersFlag)
varMembers.inSort(md);
else
varMembers.append(md);
break;
case MemberDef::Function:
if (Config::sortMembersFlag)
funcMembers.inSort(md);
else
funcMembers.append(md);
break;
case MemberDef::Typedef:
if (Config::sortMembersFlag)
typedefMembers.inSort(md);
else
typedefMembers.append(md);
break;
case MemberDef::Enumeration:
if (Config::sortMembersFlag)
enumMembers.inSort(md);
else
enumMembers.append(md);
break;
case MemberDef::EnumValue:
if (Config::sortMembersFlag)
enumValMembers.inSort(md);
else
enumValMembers.append(md);
break;
case MemberDef::Prototype:
if (Config::sortMembersFlag)
protoMembers.inSort(md);
else
protoMembers.append(md);
break;
case MemberDef::Define:
if (Config::sortMembersFlag)
defineMembers.inSort(md);
else
defineMembers.append(md);
break;
default:
err("NamespaceDef::insertMembers(): unexpected member inserted in namespace!\n");
}
......
......@@ -51,8 +51,6 @@
#define YY_NEVER_INTERACTIVE 1
#define DUMP_OUTPUT 1 // set this to one to see what the preprocessor
// produces.
#define SHOW_INCLUDES 0 // set this to one to list all parsed include files
struct FileState
......@@ -590,10 +588,10 @@ static void expandExpression(QCString &expr,QCString *rest,int pos)
if (g_expandedDict->find(macroName)==0) // expand macro
{
Define *def=isDefined(macroName);
//printf("name is not an expanded macro def=%s\n",def ? def->name.data() : 0);
if (def && def->nargs==-1) // simple macro
{
// substitute the definition of the macro
//printf("macro `%s'->`%s'\n",macroName.data(),def->definition.data());
expMacro=def->definition.stripWhiteSpace();
replaced=TRUE;
len=l;
......@@ -774,6 +772,7 @@ Define *newDefine()
def->fileName = g_yyFileName;
def->lineNr = g_yyLineNr;
def->varArgs = g_defVarArgs;
//printf("newDefine: `%s'->`%s'\n",def->name.data(),def->definition.data());
if (!def->name.isEmpty() && expandAsDefinedDict[def->name])
{
def->isPredefined=TRUE;
......@@ -1520,7 +1519,7 @@ BN [ \t\r\n]
g_defLitText+=yytext;
outputChar('\n');
Define *def=0;
//printf("Define name=`%s' text=`%s'\n",g_defName.data(),g_defText.data());
//printf("Define name=`%s' text=`%s' litTexti=`%s'\n",g_defName.data(),g_defText.data(),g_defLitText.data());
if (g_includeStack.isEmpty())
{
addDefine();
......@@ -1528,10 +1527,12 @@ BN [ \t\r\n]
def=g_fileDefineDict->find(g_defName);
if (def==0) // new define
{
//printf("new define!\n");
g_fileDefineDict->insert(g_defName,newDefine());
}
else if (def)// name already exists
{
//printf("existing define!\n");
//printf("define found\n");
if (def->undef) // undefined name
{
......@@ -1860,23 +1861,21 @@ void preprocessFile(const char *fileName,BufStr &output)
else
pclose(preYYin);
//#if DUMP_OUTPUT
if (Debug::isFlagSet(Debug::Preprocessor))
{
char *orgPos=output.data()+orgOffset;
char *newPos=output.data()+output.curPos();
printf("Preprocessor output (size: %d bytes):\n",newPos-orgPos);
msg("Preprocessor output (size: %d bytes):\n",newPos-orgPos);
int line=1;
printf("---------\n00001 ");
msg("---------\n00001 ");
while (orgPos<newPos)
{
putchar(*orgPos);
if (*orgPos=='\n') printf("%05d ",++line);
orgPos++;
}
printf("\n---------\n");
msg("\n---------\n");
}
//#endif
}
extern "C" { // some bogus code to keep the compiler happy
......
......@@ -650,7 +650,7 @@ void RTFGenerator::startIndexSection(IndexSections is)
bool found=FALSE;
while (gd && !found)
{
if (gd->isLinkableInProject() || gd->countMembers()>0)
if (gd->countMembers()>0)
{
beginRTFChapter();
found=TRUE;
......@@ -666,7 +666,7 @@ void RTFGenerator::startIndexSection(IndexSections is)
bool found=FALSE;
while (nd && !found)
{
if (nd->isLinkableInProject())
if (nd->isLinkableInProject() && nd->countMembers()>0)
{
beginRTFChapter();
found=TRUE;
......@@ -840,7 +840,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
bool found=FALSE;
while (nd && !found)
{
if (nd->isLinkableInProject() || nd->countMembers()>0)
if (nd->isLinkableInProject() && nd->countMembers()>0)
{
t << "\\par " << Rtf_Style["Reset"] << endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
......@@ -852,7 +852,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
}
while (nd)
{
if (nd->isLinkableInProject() || nd->countMembers()>0)
if (nd->isLinkableInProject() && nd->countMembers()>0)
{
t << "\\par " << Rtf_Style["Reset"] << endl;
beginRTFSection();
......
......@@ -2449,7 +2449,7 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
lineCount();
BEGIN( CompoundName );
}
<FindMembers>{B}*("disp")?"interface"{BN}+ { // M$/Corba IDL interface
<FindMembers>{B}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba IDL interface
isTypedef=FALSE;
current->section = Entry::INTERFACE_SEC;
addType( current ) ;
......@@ -3157,24 +3157,31 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
//printf("adding `%s' `%s' `%s' to enum `%s' (mGrpId=%d)\n",
// current->type.data(), current->name.data(),
// current->args.data(), current_root->name.data(),current->mGrpId);
current->fileName = yyFileName;
current->startLine = yyLineNr;
current->type = "@"; // enum marker
current->args = current->args.simplifyWhiteSpace();
current->name = current->name.stripWhiteSpace();
current->section = Entry::VARIABLE_SEC;
// add to the scope of the enum
current_root->addSubEntry(current);
current = new Entry(*current);
// add to the scope surrounding the enum (copy!)
current_root->parent->addSubEntry(current);
current = new Entry ;
current->protection = protection ;
current->sig = sig;
current->virt = virt;
current->stat = gstat;
current->slot = slot;
current->mGrpId = memberGroupId;
if (!current->name.isEmpty())
{
current->fileName = yyFileName;
current->startLine = yyLineNr;
current->type = "@"; // enum marker
current->args = current->args.simplifyWhiteSpace();
current->name = current->name.stripWhiteSpace();
current->section = Entry::VARIABLE_SEC;
// add to the scope of the enum
current_root->addSubEntry(current);
current = new Entry(*current);
// add to the scope surrounding the enum (copy!)
current_root->parent->addSubEntry(current);
current = new Entry ;
current->protection = protection ;
current->sig = sig;
current->virt = virt;
current->stat = gstat;
current->slot = slot;
current->mGrpId = memberGroupId;
}
else // probably a redundant ,
{
current->reset();
}
}
/*
<FindFieldArg>"," { unput(*yytext); BEGIN(FindFields); }
......
......@@ -27,74 +27,43 @@
//
// havran@fel.cvut.cz, 1999/04/11
//
// The first version of Czech strings with diacritics was implemented by
// Petr Prikryl (prikrylp@skil.cz). Vlastimil Havran is still
// the maintainer. The translation was based on translator.h
// of Doxygen versison 1.1.4 (from scratch) and updated for 1.1.5
// (including important updates of the up-to-1.1.4 strings).
//
// The Czech strings in this file were first written in Windows 1250
// encoding. The conditional compilation ensures or the neutral
// functionality of the macro DECODE, or calling the WinToISO()
// method for on-line encoding conversion. If you want to maintain
// the source in the ISO Latin-2, do convert the source, change the
// conditional definition of the DECODE macro using the method
// ISOToWin() -- for conversion of strings for the Windows version.
// The version which does not call the function is slightly faster.
// Updates:
// --------
// 2000/06/20
// - The prototype version of Czech strings with diacritics implemented by
// Petr Prikryl (prikrylp@skil.cz). (Vlastimil Havran is still
// the maintainer.) The translation was based on translator.h
// of Doxygen versison 1.1.4 (from scratch).
//
// Notice: Only one of the following tables is necessary for
// the support as well as the only one conversion private method
// of the TranslatorCzech class. However, the prototype was created
// under WindowsNT thus using Windows 1250 encoding. The second
// table and the method are here to switch to the ISO Latin-2
// smoothly. And also, there is not a big loose of space when both
// tables and methods are supported.
/*! Translation tables for characters >127. They should work,
* but I would not put my hand into fire for that.
*/
static const char WinToISOTab[] = {
'\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
'\x88', '\x89', '\xA9', '\x8B', '\xA6', '\xAB', '\xAE', '\xAC',
'\x90', '\x91', '\x92', '\x93', '\x94', '\x2E', '\x96', '\x97',
'\x98', '\x99', '\xB9', '\x9B', '\xB6', '\xBB', '\xBE', '\xBC',
'\xA0', '\x20', '\x20', '\xA3', '\xA4', '\xA1', '\xA6', '\xA7',
'\x22', '\xA9', '\xAA', '\x3C', '\xAC', '\x2D', '\xAE', '\xAF',
'\x2E', '\x2B', '\x20', '\xB3', '\x27', '\x75', '\xB6', '\xB7',
'\x20', '\xB1', '\xBA', '\x3E', '\xA5', '\x22', '\xB5', '\xBF',
'\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
'\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF',
'\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7',
'\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF',
'\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
'\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF',
'\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\x2D',
'\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF',
'\0'
};
static const char ISOToWinTab[] = {
'\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
'\x88', '\x89', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F',
'\x90', '\x91', '\x92', '\x93', '\x94', '\x95', '\x96', '\x97',
'\x98', '\x99', '\x9A', '\x9B', '\x9C', '\x9D', '\x9E', '\x9F',
'\xA0', '\xA5', '\xA2', '\xA3', '\xA4', '\xBC', '\x8C', '\xA7',
'\xA8', '\x8A', '\xAA', '\x8D', '\x8F', '\xAD', '\x8E', '\xAF',
'\xB0', '\xB9', '\xB2', '\xB3', '\xB4', '\xBE', '\x9C', '\xB7',
'\xB8', '\x9A', '\xBA', '\x9D', '\x9F', '\xBD', '\x9E', '\xBF',
'\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
'\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF',
'\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7',
'\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF',
'\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
'\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF',
'\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\xF7',
'\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF',
'\0'
};
// 2000/07/10 (Petr Prikryl)
// - Updated version based on 1.1.5 sources (including important updates
// of the up-to-1.1.4 strings). Czech strings this file were written
// in windows-1250 encoding. On-line decoding into iso-8859-2 ensured
// via conditional compilation if the sources are compiled under UNIX.
//
// 2000/07/19 (Petr Prikryl)
// - Encoding conversion tables moved to the methods that use them.
// - Updates for "new since 1.1.5".
//
// Notices:
// --------
// The conditional compilation ensures or the neutral functionality
// of the macro DECODE, or calling the WinToISO() method for
// on-line encoding conversion. If you want to maintain the source
// in the iso-8859-2, do convert the source, change the conditional
// definition of the DECODE macro using the method ISOToWin() --
// for conversion of strings for the Windows version. The version
// which does not call the function is slightly faster.
//
// Only one of the private method WinToISO() and ISOToWin() is
// necessary depending on whether this source is maintained in
// windows-1250 or iso-8859-2 encoding. However, there is not a
// big loose of space when both methods with the conversion tables
// are supported. The other (not used now) may be handy in future.
// Do not erase it.
// Here the DECODE macro assumes the source written in Win1250 encoding.
// Here the DECODE macro assumes the source written in Windows encoding.
//
#ifdef _WIN32
#define DECODE(sInput) sInput
......@@ -103,13 +72,34 @@ static const char ISOToWinTab[] = {
#endif
class TranslatorCzech : public Translator
{
private:
/*! returns the string converted from Win1250 to ISO Latin-2 */
/*! returns the string converted from windows-1250 to iso-8859-2 */
QCString WinToISO(const QCString sInput)
{
// The conversion table for characters >127
//
static const char WinToISOTab[] = {
'\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
'\x88', '\x89', '\xA9', '\x8B', '\xA6', '\xAB', '\xAE', '\xAC',
'\x90', '\x91', '\x92', '\x93', '\x94', '\x2E', '\x96', '\x97',
'\x98', '\x99', '\xB9', '\x9B', '\xB6', '\xBB', '\xBE', '\xBC',
'\xA0', '\x20', '\x20', '\xA3', '\xA4', '\xA1', '\xA6', '\xA7',
'\x22', '\xA9', '\xAA', '\x3C', '\xAC', '\x2D', '\xAE', '\xAF',
'\x2E', '\x2B', '\x20', '\xB3', '\x27', '\x75', '\xB6', '\xB7',
'\x20', '\xB1', '\xBA', '\x3E', '\xA5', '\x22', '\xB5', '\xBF',
'\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
'\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF',
'\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7',
'\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF',
'\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
'\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF',
'\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\x2D',
'\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF',
'\0'
};
QCString result;
int len = sInput.length();
......@@ -121,9 +111,30 @@ class TranslatorCzech : public Translator
return result;
}
/*! returns the string converted from ISO Latin-2 to Win1250 */
/*! returns the string converted from iso-8859-2 to windows-1250 */
QCString ISOToWin(const QCString sInput)
{
// The conversion table for characters >127
//
static const char ISOToWinTab[] = {
'\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
'\x88', '\x89', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F',
'\x90', '\x91', '\x92', '\x93', '\x94', '\x95', '\x96', '\x97',
'\x98', '\x99', '\x9A', '\x9B', '\x9C', '\x9D', '\x9E', '\x9F',
'\xA0', '\xA5', '\xA2', '\xA3', '\xA4', '\xBC', '\x8C', '\xA7',
'\xA8', '\x8A', '\xAA', '\x8D', '\x8F', '\xAD', '\x8E', '\xAF',
'\xB0', '\xB9', '\xB2', '\xB3', '\xB4', '\xBE', '\x9C', '\xB7',
'\xB8', '\x9A', '\xBA', '\x9D', '\x9F', '\xBD', '\x9E', '\xBF',
'\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
'\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF',
'\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7',
'\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF',
'\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
'\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF',
'\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\xF7',
'\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF',
'\0'
};
QCString result;
int len = sInput.length();
......@@ -136,6 +147,8 @@ class TranslatorCzech : public Translator
}
public:
// --- Language contol methods -------------------
virtual QCString idLanguage()
{ return "czech"; }
......@@ -146,6 +159,18 @@ class TranslatorCzech : public Translator
virtual QCString latexBabelPackage()
{ return ""; }
/*! return the language charset. This will be used for the HTML output */
virtual QCString idLanguageCharset()
{
#ifdef _WIN32
return "windows-1250";
#else
return "iso-8859-2";
#endif
}
// --- Language translation methods -------------------
/*! used in the compound documentation before a list of related functions. */
virtual QCString trRelatedFunctions()
{ return DECODE("Související funkce"); }
......@@ -567,7 +592,7 @@ class TranslatorCzech : public Translator
/*! this text is generated when the \return command is used. */
virtual QCString trReturns()
{ return DECODE("Vrací"); }
{ return DECODE("Návratová hodnota"); }
/*! this text is generated when the \sa command is used. */
virtual QCString trSeeAlso()
......@@ -642,7 +667,7 @@ class TranslatorCzech : public Translator
/*! used as the title of the HTML page of a file */
virtual QCString trFileReference(const char *fileName)
{
QCString result="Dokumentace souboru ";
QCString result("Dokumentace souboru ");
result+=fileName;
return DECODE(result);
}
......@@ -650,7 +675,7 @@ class TranslatorCzech : public Translator
/*! used as the title of the HTML page of a namespace */
virtual QCString trNamespaceReference(const char *namespaceName)
{
QCString result("Dokumentace prostroru jmen ");
QCString result("Dokumentace prostoru jmen ");
result+=namespaceName;
return DECODE(result);
}
......@@ -718,7 +743,10 @@ class TranslatorCzech : public Translator
*/
virtual QCString trInheritedByList(int numEntries)
{
return DECODE("Zdìdìna tøídami "+trWriteList(numEntries)+".");
QCString result("Zdìdìna ");
result += (numEntries == 1) ? "tøídou " : "tøídami ";
result += trWriteList(numEntries)+".";
return DECODE(result);
}
/*! used in member documentation blocks to produce a list of
......@@ -726,7 +754,10 @@ class TranslatorCzech : public Translator
*/
virtual QCString trReimplementedFromList(int numEntries)
{
return DECODE("Reimplementace metody tøídy "+trWriteList(numEntries)+".");
QCString result("Reimplementuje ");
result += (numEntries == 1) ? "metodu tøídy " : "metody tøíd ";
result += trWriteList(numEntries)+".";
return DECODE(result);
}
/*! used in member documentation blocks to produce a list of
......@@ -734,7 +765,10 @@ class TranslatorCzech : public Translator
*/
virtual QCString trReimplementedInList(int numEntries)
{
return DECODE("Reimplementováno v "+trWriteList(numEntries)+".");
QCString result("Reimplementováno ");
result += (numEntries == 1) ? "tøídou " : "tøídami ";
result += trWriteList(numEntries)+".";
return DECODE(result);
}
/*! This is put above each page as a link to all members of namespaces. */
......@@ -1010,6 +1044,90 @@ class TranslatorCzech : public Translator
{
return DECODE("Od"); // ??? not checked in a context
}
////////////////////////////////////////////////////////////////////////////
// new since 1.1.5
//////////////////////////////////////////////////////////////////////////
/*! title of the graph legend page */
virtual QCString trLegendTitle()
{
return DECODE("Vysvìtlivky ke grafu");
}
/*! page explaining how the dot graph's should be interpreted */
virtual QCString trLegendDocs()
{
QCString result(
"Zde naleznete vysvìtlení, jak mají být interpretovány grafy, "
"které byly generovány programem doxygen.<p>\n"
"Uvažujte následující pøíklad:\n"
"\\code\n"
"/*! Neviditelná tøída, která se v grafu nezobrazuje, protože "
"došlo k oøezání grafu. */\n"
"class Invisible { };\n\n"
"/*! Tøída, u které došlo k oøezání grafu. Vztah dìdiènosti "
"je skryt. */\n"
"class Truncated : public Invisible { };\n\n"
"/* Tøída, která není dokumentována komentáøi programu doxygen. */\n"
"class Undocumented { };\n\n"
"/*! Odvozená tøída s veøejným (public) dìdìním bázové tøídy. */\n"
"class PublicBase : public Truncated { };\n\n"
"/*! Odvozená tøída s chránìným (protected) dìdìním bázové tøídy. */\n"
"class ProtectedBase { };\n\n"
"/*! Odvozená tøída s privátním dìdìním bázové tøídy. */\n"
"class PrivateBase { };\n\n"
"/*! Tøída, která je využívána tøídou Inherited. */\n"
"class Used { };\n\n"
"/*! Odvozená tøída, která rùzným zpùsobem dìdí z více bázových "
"tøíd. */\n"
"class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n"
" private PrivateBase,\n"
" public Undocumented\n"
"{\n"
" private:\n"
" Used *m_usedClass;\n"
"};\n"
"\\endcode\n"
"Pokud je položka \\c MAX_DOT_GRAPH_HEIGHT konfiguraèního souboru "
"nastavena na hodnotu 200, bude vygenerován následující graf:"
"<p><center><img src=\"graph_legend.gif\"></center>\n"
"<p>\n"
"Bloky (tj. uzly) v uvedeném grafu mají následující význam:\n"
"<ul>\n"
"<li>Èernì vyplnìný obdélník reprezentuje strukturu nebo tøídu, "
"pro kterou byl graf generován.\n"
"<li>Obdélník s èerným obrysem oznaèuje dokumentovanou "
"strukturu nebo tøídu.\n"
"<li>Obdélník s šedým obrysem oznaèuje nedokumentovanou "
"strukturu nebo tøídu.\n"
"<li>Obdélník s èerveným obrysem oznaèuje dokumentovanou "
"strukturu nebo tøídu, pro kterou\n"
"nejsou zobrazeny všechny vztahy dìdiènosti nebo obsažení. "
"Graf je oøezán v pøípadì, kdy jej\n"
"není možné umístit do vymezených hranic.\n"
"</ul>\n"
"Šipky (tj. hrany grafu) mají následující význam:\n"
"<ul>\n"
"<li>Tmavì modrá šipka se používá pro oznaèení vztahu veøejné "
"dìdiènosti mezi dvìma tøídami.\n"
"<li>Tmavì zelená šipka oznaèuje vztah chránìné dìdiènosti "
"(protected).\n"
"<li>Tmavì èervená šipka oznaèuje vztah privátní dìdiènosti.\n"
"<li>Purpurová šipka kreslená èárkovanì se používá v pøípadì, "
"kdy je tøída obsažena v jiné tøídì,\n"
"nebo kdy je používána jinou tøídou. Je oznaèena identifikátorem "
"jedné nebo více promìných, pøes které\n"
"je tøída nebo struktura zpøístupnìna.\n"
"</ul>\n");
return DECODE(result);
}
/*! text for the link to the legend page */
virtual QCString trLegend()
{
return DECODE("vysvìtlivky");
}
};
#endif // TRANSLATOR_CZ_H
......@@ -583,10 +583,119 @@ class TranslatorDutch : public Translator
return "Static Private Attributen";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.1.3
//////////////////////////////////////////////////////////////////////////
/*! Used as a marker that is put before a todo item */
QCString trTodo()
{
return "Todo";
}
/*! Used as the header of the todo list */
QCString trTodoList()
{
return "Todo Lijst";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.1.4
//////////////////////////////////////////////////////////////////////////
QCString trReferencedBy()
{
return "Wordt aangeroepen door";
}
QCString trRemarks()
{
return "Opmerkingen";
}
QCString trAttention()
{
return "Attentie";
}
QCString trInclByDepGraph()
{
return "Deze graaf geeft aan welke files direct of "
"indirect afhankelijk zijn van deze file:";
}
QCString trSince()
{
return "Sinds";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.1.1
// new since 1.1.5
//////////////////////////////////////////////////////////////////////////
/*! title of the graph legend page */
QCString trLegendTitle()
{
return "Graaf Legenda";
}
/*! page explaining how the dot graph's should be interpreted */
QCString trLegendDocs()
{
return
"Deze pagina legt uit hoe de grafen die gegenereerd worden door doxygen "
"ge&iuml;nterpreteerd dienen te worden.<p>\n"
"Beschouw het volgende voorbeeld:\n"
"\\code\n"
"/*! Onzichtbare klasse vanwege afkappen van de graaf */\n"
"class Invisible { };\n\n"
"/*! Afgekapte klasse, overervingsrelatie is verborgen */\n"
"class Truncated : public Invisible { };\n\n"
"/* Klasse is niet gedocumenteerd met doxygen commentaar */\n"
"class Undocumented { };\n\n"
"/*! Klasse met public inheritance */\n"
"class PublicBase : public Truncated { };\n\n"
"/*! Klasse met protected inheritance */\n"
"class ProtectedBase { };\n\n"
"/*! Klasse met private inheritance */\n"
"class PrivateBase { };\n\n"
"/*! Klasse die wordt gebruikt door de klasse Inherited */\n"
"class Used { };\n\n"
"/*! Super klasse die overerft van een aantal andere klassen */\n"
"class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n"
" private PrivateBase,\n"
" public Undocumented\n"
"{\n"
" private:\n"
" Used *m_usedClass;\n"
"};\n"
"\\endcode\n"
"Als de \\c MAX_DOT_GRAPH_HEIGHT tag in the configuratie file "
"op 200 gezet is, zal het bestaande voorbeeld resulteren in de volgende graaf:"
"<p><center><img src=\"graph_legend.gif\"></center>\n"
"<p>\n"
"De rechthoeken in the bovenstaande graaf hebben de volgende betekenis:\n"
"<ul>\n"
"<li>Een gevulde zwarte rechthoek representeert de structure of klasse waarvoor "
"de graaf is gegeneerd.\n"
"<li>Een rechthoek met een zwarte rand representeert een gedocumenteerde structure of klasse.\n"
"<li>Een rechthoek met een grijze rand representeert een ongedocumenteerde structure of klasse.\n"
"<li>Een rechthoek met een rode rand representeert een gedocumenteerde structure or klasse waarvoor\n"
"niet alle overervings- of gebruiksrelaties konden worden getoond. Een graaf wordt "
"afgekapt als hij niet past binnen de gespecificeerde grenzen."
"</ul>\n"
"De pijlen hebben de volgende betekenis:\n"
"<ul>\n"
"<li>Een donkerblauwe pijl visualizeert een public inheritance "
"relatie tussen twee klassen.\n"
"<li>Een donkergroene pijl wordt gebruikt voor protected inheritance.\n"
"<li>Een donkerrode pijl wordt gebruikt voor private inheritance.\n"
"<li>Een paars gestreepte pijl wordt gebruikt indien een klasse bevat is of gebruikt wordt "
"door een andere klasse. De pijl is gelabeled met de variable(n) "
"die toegang geven tot de aangewezen klasse of structure. \n"
"</ul>\n";
}
/*! text for the link to the legend page */
QCString trLegend()
{
return "legenda";
}
};
#endif
/******************************************************************************
*
*
*
* Copyright (C) 1997-2000 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.
*
* Documents produced by Doxygen are derivative works derived from the
* input used in their production; they are not affected by this license.
*
* The translation into Portuguese was provided by
* Rui Godinho Lopes <ruiglopes@yahoo.com>
*/
#ifndef TRANSLATOR_PT_H
#define TRANSLATOR_PT_H
#include "translator.h"
class TranslatorPortuguese : public Translator
{
public:
QCString idLanguage()
{ return "portuguese"; }
/*! returns the name of the package that is included by LaTeX */
QCString latexBabelPackage()
{ return "portuguese"; }
/*! used in the compound documentation before a list of related functions. */
QCString trRelatedFunctions()
{ return "Funções associadas"; }
/*! subscript for the related functions. */
QCString trRelatedSubscript()
{ return "(Note que não são funções membro)"; }
/*! header that is put before the detailed description of files, classes and namespaces. */
QCString trDetailedDescription()
{ return "Descrição detalhada"; }
/*! header that is put before the list of typedefs. */
QCString trMemberTypedefDocumentation()
{ return "Documentação de tipos definidos"; }
/*! header that is put before the list of enumerations. */
QCString trMemberEnumerationDocumentation()
{ return "Documentação da enumerações"; }
/*! header that is put before the list of member functions. */
QCString trMemberFunctionDocumentation()
{ return "Documentação dos métodos"; }
/*! header that is put before the list of member attributes. */
QCString trMemberDataDocumentation()
{ return "Documentação dos dados"; }
/*! this is the text of a link put after brief descriptions. */
QCString trMore()
{ return "Mais..."; }
/*! put in the class documentation */
QCString trListOfAllMembers()
{ return "Mostrar lista completa dos membros"; }
/*! used as the title of the "list of all members" page of a class */
QCString trMemberList()
{ return "Lista dos membros"; }
/*! this is the first part of a sentence that is followed by a class name */
QCString trThisIsTheListOfAllMembers()
{ return "Esta é a lista completa dos membros de "; }
/*! this is the remainder of the sentence after the class name */
QCString trIncludingInheritedMembers()
{ return ", incluindo todos os membros herdados."; }
/*! 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 result="Gerado automaticamente por Doxygen";
if (s) result+=(QCString)" para "+s;
result+=" a partir do código fonte.";
return result;
}
/*! put after an enum name in the list of all members */
QCString trEnumName()
{ return "enumeração"; }
/*! put after an enum value in the list of all members */
QCString trEnumValue()
{ return "valor enumerado"; }
/*! put after an undocumented member in the list of all members */
QCString trDefinedIn()
{ return "definido em"; }
/*! put as in introduction in the verbatim header file of a class.
* parameter f is the name of the include file.
*/
QCString trIncludeFile()
{ return "Ficheiro incluído"; }
QCString trVerbatimText(const char *f)
{ return (QCString)"Este texto foi originado pelo ficheiro incluído "+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()
{ return "Módulos"; }
/*! This is put above each page as a link to the class hierarchy */
QCString trClassHierarchy()
{ return "Hierarquia de classes"; }
/*! This is put above each page as a link to the list of annotated classes */
QCString trCompoundList()
{ return "Lista de componentes";
/*! This is put above each page as a link to the list of documented files */}
QCString trFileList()
{ return "Lista de ficheiros"; }
/*! This is put above each page as a link to the list of all verbatim headers */
QCString trHeaderFiles()
{ return "Ficheiros Incluídos"; }
/*! This is put above each page as a link to all members of compounds. */
QCString trCompoundMembers()
{ return "Componentes"; }
/*! This is put above each page as a link to all members of files. */
QCString trFileMembers()
{ return "Declarações"; }
/*! This is put above each page as a link to all related pages. */
QCString trRelatedPages()
{ return "Paginas relacionadas"; }
/*! This is put above each page as a link to all examples. */
QCString trExamples()
{ return "Exemplos"; }
/*! This is put above each page as a link to the search engine. */
QCString trSearch()
{ return "Localizar"; }
/*! This is an introduction to the class hierarchy. */
QCString trClassHierarchyDescription()
{ return "Esta lista de heranças está organizada, dentro do possível, por ordem alfabética:"; }
/*! This is an introduction to the list with all files. */
QCString trFileListDescription(bool extractAll)
{
QCString result="Lista de todos os ficheiros ";
if (!extractAll) result+="documentados ";
result+="com uma breve descrição:";
return result;
}
/*! This is an introduction to the annotated compound list. */
QCString trCompoundListDescription()
{ return "Lista da classes, estruturas, uniões e interfaces com uma breve descrição:";
}
/*! This is an introduction to the page with all class members. */
QCString trCompoundMembersDescription(bool extractAll)
{
QCString result="Lista de todas as funções membro ";
if (!extractAll) result+="documentadas ";
result+="com links para ";
if (extractAll) result+="a documentação da classe correspondente:";
else result+="o ficheiro a que pertencem:";
return result;
}
/*! This is an introduction to the page with all file members. */
QCString trFileMembersDescription(bool extractAll)
{
QCString result="Lista de todas as funções membro ";
if (!extractAll) result+="documentadas ";
result+="com links para ";
if (extractAll) result+="a documentação correspondente:";
else result+="os ficheiros onde foram definidas:";
return result;
}
/*! This is an introduction to the page with the list of all header files. */
QCString trHeaderFilesDescription()
{ return "Lista de todos os ficheiros cabeçalho que constituem a API:"; }
/*! This is an introduction to the page with the list of all examples */
QCString trExamplesDescription()
{ return "Lista de todos os exemplos:"; }
/*! This is an introduction to the page with the list of related pages */
QCString trRelatedPagesDescription()
{ return "Lista de documentação relacionada:"; }
/*! This is an introduction to the page with the list of class/file groups */
QCString trModulesDescription()
{ return "Lista de todos os módulos:"; }
/*! This sentences is used in the annotated class/file lists if no brief
* description is given.
*/
QCString trNoDescriptionAvailable()
{ return "Nenhuma descrição disponível"; }
// index titles (the project name is prepended for these)
/*! This is used in HTML as the title of index.html. */
QCString trDocumentation()
{ return "Documentação"; }
/*! This is used in LaTeX as the title of the chapter with the
* index of all groups.
*/
QCString trModuleIndex()
{ return "Índice dos módulos"; }
/*! This is used in LaTeX as the title of the chapter with the
* class hierarchy.
*/
QCString trHierarchicalIndex()
{ return "Índice da hierarquia"; }
/*! This is used in LaTeX as the title of the chapter with the
* annotated compound index.
*/
QCString trCompoundIndex()
{ return "Índice dos componentes"; }
/*! This is used in LaTeX as the title of the chapter with the
* list of all files.
*/
QCString trFileIndex()
{ return "Índice dos ficheiros"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all groups.
*/
QCString trModuleDocumentation()
{ return "Documentação do módulo"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all classes, structs and unions.
*/
QCString trClassDocumentation()
{ return "Documentação da classe"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all files.
*/
QCString trFileDocumentation()
{ return "Documentação do ficheiro"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all examples.
*/
QCString trExampleDocumentation()
{ return "Documentação do exemplo"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all related pages.
*/
QCString trPageDocumentation()
{ return "Documentação da página"; }
/*! This is used in LaTeX as the title of the document */
QCString trReferenceManual()
{ return "Manual de referência"; }
/*! This is used in the documentation of a file as a header before the
* list of defines
*/
QCString trDefines()
{ return "Definição de macros"; }
/*! This is used in the documentation of a file as a header before the
* list of function prototypes
*/
QCString trFuncProtos()
{ return "Protótipos de funções"; }
/*! This is used in the documentation of a file as a header before the
* list of typedefs
*/
QCString trTypedefs()
{ return "Definição de tipos"; }
/*! This is used in the documentation of a file as a header before the
* list of enumerations
*/
QCString trEnumerations()
{ return "Enumerações"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) functions
*/
QCString trFunctions()
{ return "Funções"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
QCString trVariables()
{ return "Variáveis"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
QCString trEnumerationValues()
{ return "Valores da enumeração"; }
/*! This is used in man pages as the author section. */
QCString trAuthor()
{ return "Autor"; }
/*! This is used in the documentation of a file before the list of
* documentation blocks for defines
*/
QCString trDefineDocumentation()
{ return "Documentação da macro"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for function prototypes
*/
QCString trFunctionPrototypeDocumentation()
{ return "Documentação do protótipo da função"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for typedefs
*/
QCString trTypedefDocumentation()
{ return "Documentação do tipo"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration types
*/
QCString trEnumerationTypeDocumentation()
{ return "Documentação do tipo de enumeração"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration values
*/
QCString trEnumerationValueDocumentation()
{ return "Documentação dos elementos da enumeração"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for functions
*/
QCString trFunctionDocumentation()
{ return "Documentação da função"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for variables
*/
QCString trVariableDocumentation()
{ return "Documentação da variável"; }
/*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds
*/
QCString trCompounds()
{ return "Componentes"; }
/*! This is used in the documentation of a group before the list of
* links to documented files
*/
QCString trFiles()
{ return "Ficheiros"; }
/*! 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 result=(QCString)"Gerado em "+date;
if (projName) result+=(QCString)" para "+projName;
result+=(QCString)" por";
return result;
}
/*! This is part of the sentence used in the standard footer of each page.
*/
QCString trWrittenBy()
{
return "escrito por";
}
/*! this text is put before a class diagram */
QCString trClassDiagram(const char *clName)
{
return (QCString)"Diagrama de heranças da classe "+clName;
}
/*! this text is generated when the \internal command is used. */
QCString trForInternalUseOnly()
{ return "Apenas para uso interno."; }
/*! this text is generated when the \reimp command is used. */
QCString trReimplementedForInternalReasons()
{ return "Redefinido por razões internas; o interface não é afectado";
}
/*! this text is generated when the \warning command is used. */
QCString trWarning()
{ return "Aviso"; }
/*! this text is generated when the \bug command is used. */
QCString trBugsAndLimitations()
{ return "Bugs e limitações"; }
/*! this text is generated when the \version command is used. */
QCString trVersion()
{ return "Versão"; }
/*! this text is generated when the \date command is used. */
QCString trDate()
{ return "Data"; }
/*! this text is generated when the \author command is used. */
QCString trAuthors()
{ return "Autor(es)"; }
/*! this text is generated when the \return command is used. */
QCString trReturns()
{ return "Retorna"; }
/*! this text is generated when the \sa command is used. */
QCString trSeeAlso()
{ return "Veja também"; }
/*! this text is generated when the \param command is used. */
QCString trParameters()
{ return "Parâmetros"; }
/*! this text is generated when the \exception command is used. */
QCString trExceptions()
{ return "Excepções"; }
/*! this text is used in the title page of a LaTeX document. */
QCString trGeneratedBy()
{ return "Gerado por"; }
// new since 0.49-990307
virtual QCString trNamespaceList()
{ return "Lista de namespaces"; }
/*! used as an introduction to the namespace list */
virtual QCString trNamespaceListDescription(bool extractAll)
{
QCString result="Lista ";
if (!extractAll) result+="de toda a documentação ";
result+="dos namespaces com uma breve descrição:";
return result;
}
/*! used in the class documentation as a header before the list of all
* friends of a class
*/
virtual QCString trFriends()
{ return "Amigos"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990405
//////////////////////////////////////////////////////////////////////////
/*! used in the class documentation as a header before the list of all
* related classes
*/
virtual QCString trRelatedFunctionDocumentation()
{ return "Documentação das funções relacionadas e classes amigas"; }
//////////////////////////////////////////////////////////////////////////
// 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,
bool isTemplate)
{
QCString result="Referencia ";
switch(compType)
{
case ClassDef::Class: result+="à classe "; break;
case ClassDef::Struct: result+="à estrutura "; break;
case ClassDef::Union: result+="à união "; break;
case ClassDef::Interface: result+="ao interface "; break;
case ClassDef::Exception: result+="à excepção "; break;
}
if (isTemplate)
result+="<template> ";
result+=(QCString)clName;
return result;
}
/*! used as the title of the HTML page of a file */
virtual QCString trFileReference(const char *fileName)
{
QCString result= "Referencia ao ficheiro ";
result += fileName;
return result;
}
/*! used as the title of the HTML page of a namespace */
virtual QCString trNamespaceReference(const char *namespaceName)
{
QCString result= "Referencia ao namespace ";
result += namespaceName;
return result;
}
/*! \mgroup Class sections
* these are for the member sections of a class, struct or union
*/
virtual QCString trPublicMembers()
{ return "Membros públicos"; }
virtual QCString trPublicSlots()
{ return "Slots públicos"; }
virtual QCString trSignals()
{ return "Sinais"; }
virtual QCString trStaticPublicMembers()
{ return "Membros públicos estáticos"; }
virtual QCString trProtectedMembers()
{ return "Membros protegidos"; }
virtual QCString trProtectedSlots()
{ return "Slots protegidos"; }
virtual QCString trStaticProtectedMembers()
{ return "Membros protegidos estáticos"; }
virtual QCString trPrivateMembers()
{ return "Membros privados"; }
virtual QCString trPrivateSlots()
{ return "Slots privados"; }
virtual QCString trStaticPrivateMembers()
{ return "Membros privados estáticos"; }
/*! \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+=", e ";
}
}
return result;
}
/*! used in class documentation to produce a list of base classes,
* if class diagrams are disabled.
*/
virtual QCString trInheritsList(int numEntries)
{
return "Derivada 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 "Herdado por "+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 "Reimplementado 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 "Reimplementado em "+trWriteList(numEntries)+".";
}
/*! This is put above each page as a link to all members of namespaces. */
virtual QCString trNamespaceMembers()
{ return "Membros do namespace"; }
/*! This is an introduction to the page with all namespace members */
virtual QCString trNamespaceMemberDescription(bool extractAll)
{
QCString result="Lista ";
if (extractAll) result+="de todos os ";
else result+="de toda a documentação dos ";
result+="membros do namespace com links para ";
if (extractAll) result+="a documentação de cada membro:";
else result+="o namespace correspondente:";
return result;
}
/*! This is used in LaTeX as the title of the chapter with the
* index of all namespaces.
*/
virtual QCString trNamespaceIndex()
{ return "Índice dos namespaces"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all namespaces.
*/
virtual QCString trNamespaceDocumentation()
{ return "Documentação dos 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)"A documentação para ";
switch(compType)
{
case ClassDef::Class: result+="esta classe"; break;
case ClassDef::Struct: result+="esta estrutura"; break;
case ClassDef::Union: result+="esta união"; break;
case ClassDef::Interface: result+="este interface"; break;
case ClassDef::Exception: result+="esta excepção"; break;
}
result+=" foi gerada a partir ";
if (single) result+=" do seguinte ficheiro:";
else result+="dos seguintes ficheiros:";
return result;
}
/*! This is in the (quick) index as a link to the alphabetical compound
* list.
*/
virtual QCString trAlphabeticalList()
{
return "Lista alfabética";
}
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990901
//////////////////////////////////////////////////////////////////////////
/*! This is used as the heading text for the retval command. */
virtual QCString trReturnValues()
{ return "Valores retornados"; }
/*! This is in the (quick) index as a link to the main page (index.html)
*/
virtual QCString trMainPage()
{ return "Página principal"; }
/*! 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. "; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-991003
//////////////////////////////////////////////////////////////////////////
virtual QCString trSources()
{
return "Fontes";
}
virtual QCString trDefinedAtLineInSourceFile()
{
return "Definido na linha @0 do ficheiro @1.";
}
virtual QCString trDefinedInSourceFile()
{
return "Definido no ficheiro @0.";
}
//////////////////////////////////////////////////////////////////////////
// new since 0.49-991205
//////////////////////////////////////////////////////////////////////////
virtual QCString trDeprecated()
{
return "Desaprovado";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.0.0
//////////////////////////////////////////////////////////////////////////
/*! this text is put before a collaboration diagram */
virtual QCString trCollaborationDiagram(const char *clName)
{
return (QCString)"Diagrama de colaboração para "+clName+":";
}
/*! this text is put before an include dependency graph */
virtual QCString trInclDepGraph(const char *fName)
{
return (QCString)"Diagrama de dependências de inclusão para "+fName+":";
}
/*! header that is put before the list of constructor/destructors. */
virtual QCString trConstructorDocumentation()
{
return "Documentação do Construtor & Destrutor";
}
/*! Used in the file documentation to point to the corresponding sources. */
virtual QCString trGotoSourceCode()
{
return "Ir para o código fonte deste ficheiro.";
}
/*! Used in the file sources to point to the corresponding documentation. */
virtual QCString trGotoDocumentation()
{
return "Ir para a documentação deste ficheiro.";
}
/*! Text for the \pre command */
virtual QCString trPrecondition()
{
return "Precondição";
}
/*! Text for the \post command */
virtual QCString trPostcondition()
{
return "Poscondição";
}
/*! Text for the \invariant command */
virtual QCString trInvariant()
{
return "Invariante";
}
/*! Text shown before a multi-line variable/enum initialization */
virtual QCString trInitialValue()
{
return "Valor inicial:";
}
/*! Text used the source code in the file index */
virtual QCString trCode()
{
return "código";
}
virtual QCString trGraphicalHierarchy()
{
return "Representação gráfica da hiearquia da classe";
}
virtual QCString trGotoGraphicalHierarchy()
{
return "Ir para a representação gráfica da hierarquia da classe";
}
virtual QCString trGotoTextualHierarchy()
{
return "Ir para a representação textual da hierarquia da classe";
}
virtual QCString trPageIndex()
{
return "Índice da página";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.1.0
//////////////////////////////////////////////////////////////////////////
virtual QCString trNote()
{
return "Nota";
}
virtual QCString trPublicTypes()
{
return "Tipos Públicos";
}
virtual QCString trPublicAttribs()
{
return "Atributos Públicos";
}
virtual QCString trStaticPublicAttribs()
{
return "Atributos Públicos Estáticos";
}
virtual QCString trProtectedTypes()
{
return "Tipos Protegidos";
}
virtual QCString trProtectedAttribs()
{
return "Atributos Protegidos";
}
virtual QCString trStaticProtectedAttribs()
{
return "Atributos Protegidos Estáticos";
}
virtual QCString trPrivateTypes()
{
return "Tipos Privados";
}
virtual QCString trPrivateAttribs()
{
return "Atributos Privados";
}
virtual QCString trStaticPrivateAttribs()
{
return "Atributos Privados Estáticos";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.1.3
//////////////////////////////////////////////////////////////////////////
/*! Used as a marker that is put before a todo item */
virtual QCString trTodo()
{
return "Tarefa";
}
/*! Used as the header of the todo list */
virtual QCString trTodoList()
{
return "Lista de tarefas";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.1.4
//////////////////////////////////////////////////////////////////////////
virtual QCString trReferencedBy()
{
return "Referenciado por";
}
virtual QCString trRemarks()
{
return "Observações";
}
virtual QCString trAttention()
{
return "Atenção";
}
virtual QCString trInclByDepGraph()
{
return "Este gráfico mostra quais são os ficheiros que incluem directamente ou indirectamente este ficheiro:";
}
virtual QCString trSince()
{
return "Desde";
}
};
#endif
......@@ -300,13 +300,19 @@ QCString removeRedundantWhiteSpace(const QCString &s)
for (i=0;i<l;i++)
{
char c=s.at(i);
if (i<l-2 && c=='<' && (isId(s.at(i+1)) || isspace(s.at(i+1))))
if (i<l-2 && c=='<' && // current char is a <
(isId(s.at(i+1)) || isspace(s.at(i+1))) && // next char is a id char or space
(i<8 || s.mid(i-8,8)!="operator") // string in front is not "operator"
)
{
result+="< ";
result+="< "; // insert extra space for layouting (nested) templates
}
else if (i>0 && c=='>' && (isId(s.at(i-1)) || isspace(s.at(i-1))))
else if (i>0 && c=='>' && // current char is a >
(isId(s.at(i-1)) || isspace(s.at(i-1))) && // prev char is a id char or space
(i<8 || s.mid(i-8,8)!="operator") // string in front is not "operator"
)
{
result+=" >";
result+=" >"; // insert extra space for layouting (nested) templates
}
else if (c!=' ' ||
(i!=0 && i!=l-1 && isId(s.at(i-1)) && isId(s.at(i+1)))
......@@ -1480,7 +1486,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
//printf("Trying class scope %s\n",className.data());
ClassDef *fcd=0;
if ((fcd=getClass(className)) && // is it a documented class
if ((fcd=getResolvedClass(className)) && // is it a documented class
fcd->isLinkable()
)
{
......@@ -1501,7 +1507,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
//printf("match=%d\n",match);
if (match)
{
ClassDef *mcd=mmd->memberClass();
ClassDef *mcd=mmd->getClassDef();
int m=minClassDistance(fcd,mcd);
if (m<mdist && mcd->isLinkable())
{
......@@ -1533,7 +1539,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
mmd->isLinkable()
)
{
ClassDef *mcd=mmd->memberClass();
ClassDef *mcd=mmd->getClassDef();
//printf(" >Class %s found\n",mcd->name().data());
int m=minClassDistance(fcd,mcd);
if (m<mdist && mcd->isLinkable())
......@@ -1594,9 +1600,9 @@ bool getDefs(const QCString &scName,const QCString &memberName,
MemberDef *mmd=mn->first();
while (mmd && !found)
{
//printf("mmd->getNamespace()=%p fnd=%p\n",
// mmd->getNamespace(),fnd);
if (mmd->getNamespace()==fnd &&
//printf("mmd->getNamespaceDef()=%p fnd=%p\n",
// mmd->getNamespaceDef(),fnd);
if (mmd->getNamespaceDef()==fnd &&
//(mmd->isReference() || mmd->hasDocumentation())
mmd->isLinkable()
)
......@@ -1630,7 +1636,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
// the first defined!
while (mmd && !found)
{
if (mmd->getNamespace()==fnd &&
if (mmd->getNamespaceDef()==fnd &&
//(mmd->isReference() || mmd->hasDocumentation())
mmd->isLinkable()
)
......@@ -1646,14 +1652,14 @@ bool getDefs(const QCString &scName,const QCString &memberName,
}
else // no scope => global function
{
//printf("Function with global scope `%s'\n",namespaceName.data());
//printf("Function with global scope `%s' args=`%s'\n",namespaceName.data(),args);
md=mn->first();
while (md)
{
if (md->isLinkable())
{
fd=md->getFileDef();
gd=md->groupDef();
gd=md->getGroupDef();
//printf("md->name()=`%s' md->args=`%s' fd=%p gd=%p\n",
// md->name().data(),args,fd,gd);
bool inGroup=FALSE;
......@@ -1688,13 +1694,14 @@ bool getDefs(const QCString &scName,const QCString &memberName,
md=mn->last();
while (md)
{
if (md->isLinkable())
//printf("Found member `%s'\n",md->name().data());
if (1 /* md->isLinkable() */)
{
//printf("md->name()=`%s'\n",md->name().data());
//printf("member is linkable md->name()=`%s'\n",md->name().data());
fd=md->getFileDef();
gd=md->groupDef();
gd=md->getGroupDef();
bool inGroup=FALSE;
if ((fd && fd->isLinkable()) |+
if ((fd && fd->isLinkable()) ||
(inGroup=(gd && gd->isLinkable()))
)
{
......
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