Commit c635cffd authored by dimitri's avatar dimitri

Release-1.4.1-20050129

parent 13feb604
DOXYGEN Version 1.4.1
DOXYGEN Version 1.4.1-20050129
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (09 January 2005)
Dimitri van Heesch (29 January 2005)
......@@ -44,11 +44,17 @@ distclean: clean
-rm -f addon/doxywizard/moc/moc_*
-rm -f addon/doxywizard/config.cpp
DATE=$(shell date "+%B %Y")
install: doxywizard_install
$(INSTTOOL) -d $(INSTALL)/bin
$(INSTTOOL) -m 755 bin/doxygen $(INSTALL)/bin
$(INSTTOOL) -m 755 bin/doxytag $(INSTALL)/bin
$(INSTTOOL) -d $(INSTALL)/man/man1
cat doc/doxygen.1 | sed -e "s/DATE/\$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > $(INSTALL)/man/man1/doxygen.1 ; \
cat doc/doxytag.1 | sed -e "s/DATE/\$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > $(INSTALL)/man/man1/doxytag.1 ; \
cat doc/doxywizard.1 | sed -e "s/DATE/\$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > $(INSTALL)/man/man1/doxywizard.1 ;
install_docs: install
$(INSTTOOL) -d $(DOCDIR)
......
DOXYGEN Version 1.4.1
DOXYGEN Version 1.4.1_20050129
Please read INSTALL for compilation instructions.
......@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (09 January 2005)
Dimitri van Heesch (dimitri@stack.nl) (29 January 2005)
1.4.1
1.4.1-20050129
......@@ -216,10 +216,10 @@ if (open(F,"<Makefile.libdoxygen.old")) {
}
print "Processing Makefile.libdoxygen...\n";
while (<F>) {
if ( s/\(LEX\) -P([a-z]+)YY -t $file/(LEX) -d -P\1YY -t $file/g ) {
if ( s/\(LEX\) -P([a-zA-Z]+)YY -t $file/(LEX) -d -P\1YY -t $file/g ) {
print "Enabling debug info for $file\n";
}
elsif ( s/\(LEX\) -d -P([a-z]+)YY -t $file/(LEX) -P\1YY -t $file/g ) {
elsif ( s/\(LEX\) -d -P([a-zA-Z]+)YY -t $file/(LEX) -P\1YY -t $file/g ) {
print "Disabling debug info for $file\n";
}
print G "$_";
......
......@@ -171,7 +171,7 @@ doxygen. Unrecognized commands are treated as normal text.
Structural indicators
\htmlonly --- </center>\endhtmlonly</h2>
\section cmdaddtogroup \addtogroup <name> [(title)]
\section cmdaddtogroup \\addtogroup <name> [(title)]
\addindex \\addtogroup
Defines a group just like \ref cmddefgroup "\\defgroup", but in contrast to
that command using the same \<name\> more than once will not result in a warning,
......@@ -205,7 +205,7 @@ doxygen. Unrecognized commands are treated as normal text.
\sa page \ref grouping "Grouping", sections \ref cmddefgroup "\\defgroup", \ref cmdingroup "\\ingroup" and
\ref cmdweakgroup "\\weakgroup".
\section cmdcallgraph \callgraph
\section cmdcallgraph \\callgraph
\addindex \\callgraph
When this command is put in a comment block of a function or method
......@@ -217,7 +217,7 @@ doxygen. Unrecognized commands are treated as normal text.
doxygen code parser which is not perfect.
<hr>
\section cmdcategory \category <name> [<header-file>] [<header-name>]
\section cmdcategory \\category <name> [<header-file>] [<header-name>]
\addindex \\category
For Objective-C only: Indicates that a comment block contains documentation
......@@ -227,7 +227,7 @@ doxygen. Unrecognized commands are treated as normal text.
\sa section \ref cmdclass "\\class".
<hr>
\section cmdclass \class <name> [<header-file>] [<header-name>]
\section cmdclass \\class <name> [<header-file>] [<header-name>]
\addindex \\class
Indicates that a comment block contains documentation for a
......@@ -250,7 +250,7 @@ doxygen. Unrecognized commands are treated as normal text.
\endhtmlonly
<hr>
\section cmddef \def <name>
\section cmddef \\def <name>
\addindex \\def
Indicates that a comment block contains documentation for a
......@@ -264,7 +264,7 @@ doxygen. Unrecognized commands are treated as normal text.
\endhtmlonly
<hr>
\section cmddefgroup \defgroup <name> (group title)
\section cmddefgroup \\defgroup <name> (group title)
\addindex \\defgroup
Indicates that a comment block contains documentation for a
......@@ -279,7 +279,7 @@ doxygen. Unrecognized commands are treated as normal text.
\ref cmdweakgroup "\\weakgroup".
<hr>
\section cmddir \dir [<path fragment>]
\section cmddir \\dir [<path fragment>]
\addindex \\dir
Indicates that a comment block contains documentation for a directory.
......@@ -292,7 +292,7 @@ doxygen. Unrecognized commands are treated as normal text.
<hr>
\section cmdenum \enum <name>
\section cmdenum \\enum <name>
\addindex \\enum
Indicates that a comment block contains documentation for an
......@@ -314,7 +314,7 @@ doxygen. Unrecognized commands are treated as normal text.
\endhtmlonly
<hr>
\section cmdexample \example <file-name>
\section cmdexample \\example <file-name>
\addindex \\example
Indicates that a comment block contains documentation for a source code
......@@ -347,7 +347,7 @@ doxygen. Unrecognized commands are treated as normal text.
\sa section \ref cmdinclude "\\include".
<hr>
\section cmdfile \file [<name>]
\section cmdfile \\file [<name>]
\addindex \\file
Indicates that a comment block contains documentation for a source or
......@@ -371,7 +371,7 @@ doxygen. Unrecognized commands are treated as normal text.
has been set to YES in the configuration file.
<hr>
\section cmdfn \fn (function declaration)
\section cmdfn \\fn (function declaration)
\addindex \\fn
Indicates that a comment block contains documentation for a function
......@@ -402,7 +402,7 @@ doxygen. Unrecognized commands are treated as normal text.
\sa section \ref cmdvar "\\var" and \ref cmdtypedef "\\typedef".
<hr>
\section cmdhideinitializer \hideinitializer
\section cmdhideinitializer \\hideinitializer
\addindex \\hideinitializer
By default the value of a define and the initializer of a variable
......@@ -413,7 +413,7 @@ doxygen. Unrecognized commands are treated as normal text.
\sa section \ref cmdshowinitializer "\\showinitializer".
<hr>
\section cmdingroup \ingroup (<groupname> [<groupname> <groupname>])
\section cmdingroup \\ingroup (<groupname> [<groupname> <groupname>])
\addindex \\ingroup
If the \\ingroup command is placed in a comment block of a
......@@ -424,7 +424,7 @@ doxygen. Unrecognized commands are treated as normal text.
\ref cmdaddtogroup "\\addtogroup" and \ref cmdweakgroup "\\weakgroup"
<hr>
\section cmdinterface \interface <name> [<header-file>] [<header-name>]
\section cmdinterface \\interface <name> [<header-file>] [<header-name>]
\addindex \\interface
Indicates that a comment block contains documentation for an
......@@ -434,7 +434,7 @@ doxygen. Unrecognized commands are treated as normal text.
\sa section \ref cmdclass "\\class".
<hr>
\section cmdinternal \internal
\section cmdinternal \\internal
\addindex \\internal
This command writes the message `For internal use only' to the output and
......@@ -451,7 +451,7 @@ doxygen. Unrecognized commands are treated as normal text.
to show or hide the internal documentation.
<hr>
\section cmdmainpage \mainpage [(title)]
\section cmdmainpage \\mainpage [(title)]
\addindex \\mainpage
......@@ -487,7 +487,7 @@ doxygen. Unrecognized commands are treated as normal text.
section \ref cmdpage "\\page".
<hr>
\section cmdname \name (header)
\section cmdname \\name (header)
This command turns a comment block into a header
definition of a member group. The
......@@ -498,14 +498,14 @@ members of the group.
See section \ref memgroup for an example.
<hr>
\section cmdnamespace \namespace <name>
\section cmdnamespace \\namespace <name>
\addindex \\namespace
Indicates that a comment block contains documentation for a
namespace with name \<name\>.
<hr>
\section cmdnosubgrouping \nosubgrouping
\section cmdnosubgrouping \\nosubgrouping
\addindex \\nosubgrouping
This command can be put in the documentation
......@@ -514,7 +514,7 @@ See section \ref memgroup for an example.
Public/Protected/Private/... section.
<hr>
\section cmdoverload \overload [(function declaration)]
\section cmdoverload \\overload [(function declaration)]
\addindex \\overload
This command can be used to generate the following
......@@ -545,14 +545,14 @@ See section \ref memgroup for an example.
\endhtmlonly
<hr>
\section cmdpackage \package <name>
\section cmdpackage \\package <name>
\addindex \\package
Indicates that a comment block contains documentation for a
Java package with name \<name\>.
<hr>
\section cmdpage \page <name> (title)
\section cmdpage \\page <name> (title)
\addindex \\page
Indicates that a comment block contains a piece of documentation that is
......@@ -582,7 +582,7 @@ See section \ref memgroup for an example.
\ref cmdref "\\ref".
<hr>
\section cmdproperty \property (qualified property name)
\section cmdproperty \\property (qualified property name)
\addindex \\property
Indicates that a comment block contains documentation for a
......@@ -592,7 +592,7 @@ See section \ref memgroup for an example.
\sa section \ref cmdfn "\\fn" and \ref cmdvar "\\var".
<hr>
\section cmdprotocol \protocol <name> [<header-file>] [<header-name>]
\section cmdprotocol \\protocol <name> [<header-file>] [<header-name>]
\addindex \\protocol
Indicates that a comment block contains documentation for a
......@@ -602,7 +602,7 @@ See section \ref memgroup for an example.
\sa section \ref cmdclass "\\class".
<hr>
\section cmdrelates \relates <name>
\section cmdrelates \\relates <name>
\addindex \\relates
This command can be used in the documentation of a non-member function
......@@ -620,7 +620,7 @@ See section \ref memgroup for an example.
\endhtmlonly
<hr>
\section cmdrelatesalso \relatesalso <name>
\section cmdrelatesalso \\relatesalso <name>
\addindex \\relatesalso
This command can be used in the documentation of a non-member function
......@@ -631,7 +631,7 @@ See section \ref memgroup for an example.
class. It only works for functions.
<hr>
\section cmdshowinitializer \showinitializer
\section cmdshowinitializer \\showinitializer
\addindex \\showinitializer
By default the value of a define and the initializer of a variable
......@@ -642,7 +642,7 @@ See section \ref memgroup for an example.
\sa section \ref cmdhideinitializer "\\hideinitializer".
<hr>
\section cmdstruct \struct <name> [<header-file>] [<header-name>]
\section cmdstruct \\struct <name> [<header-file>] [<header-name>]
\addindex \\struct
Indicates that a comment block contains documentation for a
......@@ -652,7 +652,7 @@ See section \ref memgroup for an example.
\sa section \ref cmdclass "\\class".
<hr>
\section cmdtypedef \typedef (typedef declaration)
\section cmdtypedef \\typedef (typedef declaration)
\addindex \\typedef
Indicates that a comment block contains documentation for a
......@@ -662,7 +662,7 @@ See section \ref memgroup for an example.
\sa section \ref cmdfn "\\fn" and \ref cmdvar "\\var".
<hr>
\section cmdunion \union <name> [<header-file>] [<header-name>]
\section cmdunion \\union <name> [<header-file>] [<header-name>]
\addindex \\union
Indicates that a comment block contains documentation for a
......@@ -672,7 +672,7 @@ See section \ref memgroup for an example.
\sa section \ref cmdclass "\\class".
<hr>
\section cmdvar \var (variable declaration)
\section cmdvar \\var (variable declaration)
\addindex \\var
Indicates that a comment block contains documentation for a variable or
......@@ -682,7 +682,7 @@ See section \ref memgroup for an example.
\sa section \ref cmdfn "\\fn" and \ref cmdtypedef "\\typedef".
<hr>
\section cmdweakgroup \weakgroup <name> [(title)]
\section cmdweakgroup \\weakgroup <name> [(title)]
\addindex \\addtogroup
Can be used exactly like \ref cmdaddtogroup "\\addtogroup", but has
a lower priority when it comes to resolving conflicting grouping
......@@ -697,7 +697,7 @@ See section \ref memgroup for an example.
\htmlonly --- </center>\endhtmlonly</h2>
<hr>
\section cmdattention \attention { attention text }
\section cmdattention \\attention { attention text }
\addindex \\attention
Starts a paragraph where a message that needs attention may be entered.
......@@ -708,7 +708,7 @@ See section \ref memgroup for an example.
The \\attention command ends when a blank line or some other
sectioning command is encountered.
\section cmdauthor \author { list of authors }
\section cmdauthor \\author { list of authors }
\addindex \\author
Starts a paragraph where one or more author names may be entered.
......@@ -728,7 +728,7 @@ See section \ref memgroup for an example.
\endhtmlonly
<hr>
\section cmdbrief \brief {brief description}
\section cmdbrief \\brief {brief description}
\addindex \\brief
Starts a paragraph that serves as a brief description. For classes and files
......@@ -744,7 +744,7 @@ See section \ref memgroup for an example.
Synonymous to \\short.
<hr>
\section cmdbug \bug { bug description }
\section cmdbug \\bug { bug description }
\addindex \\bug
Starts a paragraph where one or more bugs may be reported.
......@@ -759,7 +759,7 @@ See section \ref memgroup for an example.
for an example.
<hr>
\section cmdcond \cond [<section-label>]
\section cmdcond \\cond [<section-label>]
\addindex \\cond
Starts a conditional section that ends with a corresponding
......@@ -825,7 +825,7 @@ The output will be different depending on whether \c ENABLED_SECTIONS
is empty, \c TEST, \c DEV, or \c DEV \c TEST.
<hr>
\section cmddate \date { date description }
\section cmddate \\date { date description }
\addindex \\date
Starts a paragraph where one or more dates may be entered.
......@@ -840,7 +840,7 @@ is empty, \c TEST, \c DEV, or \c DEV \c TEST.
for an example.
<hr>
\section cmddeprecated \deprecated { description }
\section cmddeprecated \\deprecated { description }
\addindex \\deprecated
Starts a paragraph indicating that this documentation block belongs to
......@@ -848,7 +848,7 @@ is empty, \c TEST, \c DEV, or \c DEV \c TEST.
expected life span, etc.
<hr>
\section cmdelse \else
\section cmdelse \\else
\addindex \\else
Starts a conditional section if the previous conditional section
......@@ -859,7 +859,7 @@ is empty, \c TEST, \c DEV, or \c DEV \c TEST.
\ref cmdendif "\\endif."
<hr>
\section cmdelseif \elseif <section-label>
\section cmdelseif \\elseif <section-label>
\addindex \\elseif
Starts a conditional documentation section if the previous section
......@@ -874,7 +874,7 @@ is empty, \c TEST, \c DEV, or \c DEV \c TEST.
\ref cmdelse "\\else", and \ref cmdelseif "\\elseif".
<hr>
\section cmdendcond \endcond
\section cmdendcond \\endcond
\addindex \\endcond
Ends a conditional section that was started by \ref cmdcond "\\cond".
......@@ -882,7 +882,7 @@ is empty, \c TEST, \c DEV, or \c DEV \c TEST.
\sa \ref cmdcond "\\cond".
<hr>
\section cmdendif \endif
\section cmdendif \\endif
\addindex \\endif
Ends a conditional section that was started by \c \\if or \c \\ifnot
......@@ -891,7 +891,7 @@ is empty, \c TEST, \c DEV, or \c DEV \c TEST.
\sa \ref cmdif "\\if", and \ref cmdifnot "\\ifnot".
<hr>
\section cmdexception \exception <exception-object> { exception description }
\section cmdexception \\exception <exception-object> { exception description }
\addindex \\exception
Starts an exception description for an exception object with name
......@@ -909,7 +909,7 @@ is empty, \c TEST, \c DEV, or \c DEV \c TEST.
the tag \\exceptions is a synonym for this tag.
<hr>
\section cmdif \if <section-label>
\section cmdif \\if <section-label>
\addindex \\if
Starts a conditional documentation section. The section ends
......@@ -967,7 +967,7 @@ ALIASES = "english=\if english" \
\ref cmdelse "\\else", and \ref cmdelseif "\\elseif".
<hr>
\section cmdifnot \ifnot <section-label>
\section cmdifnot \\ifnot <section-label>
\addindex \\ifnot
Starts a conditional documentation section. The section ends
......@@ -981,7 +981,7 @@ ALIASES = "english=\if english" \
\ref cmdelse "\\else", and \ref cmdelseif "\\elseif".
<hr>
\section cmdinvariant \invariant { description of invariant }
\section cmdinvariant \\invariant { description of invariant }
\addindex \\invariant
Starts a paragraph where the invariant of an entity can be described.
......@@ -995,7 +995,7 @@ ALIASES = "english=\if english" \
sectioning command is encountered.
<hr>
\section cmdnote \note { text }
\section cmdnote \\note { text }
\addindex \\note
Starts a paragraph where a note can be entered. The paragraph will be
......@@ -1009,7 +1009,7 @@ ALIASES = "english=\if english" \
for an example.
<hr>
\section cmdpar \par [(paragraph title)] { paragraph }
\section cmdpar \\par [(paragraph title)] { paragraph }
\addindex \\par
If a paragraph title is given this command starts a paragraph with a
......@@ -1033,7 +1033,7 @@ ALIASES = "english=\if english" \
\endhtmlonly
<hr>
\section cmdparam \param <parameter-name> { parameter description }
\section cmdparam \\param <parameter-name> { parameter description }
\addindex \\param
Starts a parameter description for a function parameter with name
......@@ -1067,7 +1067,7 @@ void memcpy(void *dest, const void *src, size_t n);
example.
<hr>
\section cmdpost \post { description of the postcondition }
\section cmdpost \\post { description of the postcondition }
\addindex \\post
Starts a paragraph where the postcondition of an entity can be described.
......@@ -1081,7 +1081,7 @@ void memcpy(void *dest, const void *src, size_t n);
sectioning command is encountered.
<hr>
\section cmdpre \pre { description of the precondition }
\section cmdpre \\pre { description of the precondition }
\addindex \\pre
Starts a paragraph where the precondition of an entity can be described.
......@@ -1095,7 +1095,7 @@ void memcpy(void *dest, const void *src, size_t n);
sectioning command is encountered.
<hr>
\section cmdremarks \remarks { remark text }
\section cmdremarks \\remarks { remark text }
\addindex \\remarks
Starts a paragraph where one or more remarks may be entered.
......@@ -1109,7 +1109,7 @@ void memcpy(void *dest, const void *src, size_t n);
sectioning command is encountered.
<hr>
\section cmdreturn \return { description of the return value }
\section cmdreturn \\return { description of the return value }
\addindex \\return
Starts a return value description for a function.
......@@ -1121,7 +1121,7 @@ void memcpy(void *dest, const void *src, size_t n);
example.
<hr>
\section cmdretval \retval <return value> { description }
\section cmdretval \\retval <return value> { description }
\addindex \\retval
Starts a return value description for a function with name
......@@ -1135,7 +1135,7 @@ void memcpy(void *dest, const void *src, size_t n);
sectioning command is encountered.
<hr>
\section cmdsa \sa { references }
\section cmdsa \\sa { references }
\addindex \\sa
Starts a paragraph where one or more cross-references to classes,
......@@ -1152,13 +1152,13 @@ void memcpy(void *dest, const void *src, size_t n);
to objects.
<hr>
\section cmdsee \see { references }
\section cmdsee \\see { references }
\addindex \\see
Equivalent to \ref cmdsa "\\sa". Introduced for compatibility with Javadoc.
<hr>
\section cmdsince \since { text }
\section cmdsince \\since { text }
\addindex \\since
This tag can be used to specify since when (version or time) an
......@@ -1168,7 +1168,7 @@ void memcpy(void *dest, const void *src, size_t n);
line or some other sectioning command is encountered.
<hr>
\section cmdtest \test { paragraph describing a test case }
\section cmdtest \\test { paragraph describing a test case }
\addindex \\test
Starts a paragraph where a test case can be described.
......@@ -1178,7 +1178,7 @@ void memcpy(void *dest, const void *src, size_t n);
indicates the origin of the test case.
<hr>
\section cmdthrow \throw <exception-object> { exception description }
\section cmdthrow \\throw <exception-object> { exception description }
\addindex \\throw
Synonymous to \\exception (see section \ref cmdexception "\\exception").
......@@ -1187,7 +1187,7 @@ void memcpy(void *dest, const void *src, size_t n);
the tag \\throws is a synonym for this tag.
<hr>
\section cmdtodo \todo { paragraph describing what is to be done }
\section cmdtodo \\todo { paragraph describing what is to be done }
\addindex \\todo
Starts a paragraph where a TODO item is described.
......@@ -1197,7 +1197,7 @@ void memcpy(void *dest, const void *src, size_t n);
indicates the origin of the item.
<hr>
\section cmdversion \version { version number }
\section cmdversion \\version { version number }
\addindex \\version
Starts a paragraph where one or more version strings may be entered.
......@@ -1213,7 +1213,7 @@ void memcpy(void *dest, const void *src, size_t n);
for an example.
<hr>
\section cmdwarning \warning { warning message }
\section cmdwarning \\warning { warning message }
\addindex \\warning
Starts a paragraph where one or more warning messages may be entered.
......@@ -1227,7 +1227,7 @@ void memcpy(void *dest, const void *src, size_t n);
sectioning command is encountered. See section \ref cmdauthor "\\author"
for an example.
\section cmdxrefitem \xrefitem <key> "(heading)" "(list title)" {text}
\section cmdxrefitem \\xrefitem <key> "(heading)" "(list title)" {text}
\addindex \\xrefitem
This command is a generalization of commands such as \ref cmdtodo "\\todo"
......@@ -1264,13 +1264,13 @@ void memcpy(void *dest, const void *src, size_t n);
Commands to create links
\htmlonly --- </center>\endhtmlonly</h2>
\section cmdaddindex \addindex (text)
\section cmdaddindex \\addindex (text)
\addindex \\addindex
This command adds (text) to the \f$\mbox{\LaTeX}\f$ index.
<hr>
\section cmdanchor \anchor <word>
\section cmdanchor \\anchor <word>
\addindex \\anchor
This command places an invisible, named anchor into the documentation
......@@ -1283,7 +1283,7 @@ void memcpy(void *dest, const void *src, size_t n);
\sa section \ref cmdref "\\ref".
<hr>
\section cmdendlink \endlink
\section cmdendlink \\endlink
\addindex \\endlink
This command ends a link that is started with the \\link command.
......@@ -1291,7 +1291,7 @@ void memcpy(void *dest, const void *src, size_t n);
\sa section \ref cmdlink "\\link".
<hr>
\section cmdlink \link <link-object>
\section cmdlink \\link <link-object>
\addindex \\link
The links that are automatically generated by doxygen always have the
......@@ -1307,7 +1307,7 @@ void memcpy(void *dest, const void *src, size_t n);
generated links and valid link-objects.
<hr>
\section cmdref \ref <name> ["(text)"]
\section cmdref \\ref <name> ["(text)"]
\addindex \\ref
Creates a reference to a named section, subsection, page or anchor.
......@@ -1323,7 +1323,7 @@ void memcpy(void *dest, const void *src, size_t n);
Section \ref cmdpage "\\page" for an example of the \\ref command.
<hr>
\section cmdsection \section <section-name> (section title)
\section cmdsection \\section <section-name> (section title)
\addindex \\section
Creates a section with name \<section-name\>. The title of the
......@@ -1334,7 +1334,7 @@ void memcpy(void *dest, const void *src, size_t n);
\e not in other documentation blocks!
<hr>
\section cmdsubsection \subsection <subsection-name> (subsection title)
\section cmdsubsection \\subsection <subsection-name> (subsection title)
\addindex \\subsection
Creates a subsection with name \<subsection-name\>. The title of the
......@@ -1350,7 +1350,7 @@ void memcpy(void *dest, const void *src, size_t n);
\ref cmdsubsection "\\subsection" command.
<hr>
\section cmdsubsubsection \subsubsection <subsubsection-name> (subsubsection title)
\section cmdsubsubsection \\subsubsection <subsubsection-name> (subsubsection title)
\addindex \\subsubsection
Creates a subsubsection with name \<subsubsection-name\>. The title of the
......@@ -1366,7 +1366,7 @@ void memcpy(void *dest, const void *src, size_t n);
\ref cmdsubsubsection "\\subsubsection" command.
<hr>
\section cmdparagraph \paragraph <paragraph-name> (paragraph title)
\section cmdparagraph \\paragraph <paragraph-name> (paragraph title)
\addindex \\paragraph
Creates a named paragraph with name \<paragraph-name\>. The title of the
......@@ -1387,7 +1387,7 @@ void memcpy(void *dest, const void *src, size_t n);
Commands for displaying examples
\htmlonly --- </center>\endhtmlonly</h2>
\section cmddontinclude \dontinclude <file-name>
\section cmddontinclude \\dontinclude <file-name>
\addindex \\dontinclude
This command can be used to parse a source file without actually
......@@ -1420,7 +1420,7 @@ void memcpy(void *dest, const void *src, size_t n);
\ref cmdskipline "\\skipline", and \ref cmduntil "\\until".
<hr>
\section cmdinclude \include <file-name>
\section cmdinclude \\include <file-name>
\addindex \\include
This command can be used to include a source file as a block of code.
......@@ -1451,7 +1451,7 @@ void memcpy(void *dest, const void *src, size_t n);
\sa section \ref cmdexample "\\example" and \ref cmddontinclude "\\dontinclude".
<hr>
\section cmdincludelineno \includelineno <file-name>
\section cmdincludelineno \\includelineno <file-name>
\addindex \\includelineno
This command works the same way as \\include, but will add line
......@@ -1460,7 +1460,7 @@ void memcpy(void *dest, const void *src, size_t n);
\sa section \ref cmdinclude "\\include".
<hr>
\section cmdline \line ( pattern )
\section cmdline \\line ( pattern )
\addindex \\line
This command searches line by line through the example that was last
......@@ -1476,7 +1476,7 @@ void memcpy(void *dest, const void *src, size_t n);
See section \ref cmddontinclude "\\dontinclude" for an example.
<hr>
\section cmdskip \skip ( pattern )
\section cmdskip \\skip ( pattern )
\addindex \\skip
This command searches line by line through the example that was last
......@@ -1490,7 +1490,7 @@ void memcpy(void *dest, const void *src, size_t n);
See section \ref cmddontinclude "\\dontinclude" for an example.
<hr>
\section cmdskipline \skipline ( pattern )
\section cmdskipline \\skipline ( pattern )
\addindex \\skipline
This command searches line by line through the example that was last
......@@ -1512,7 +1512,7 @@ void memcpy(void *dest, const void *src, size_t n);
See section \ref cmddontinclude "\\dontinclude" for an example.
<hr>
\section cmduntil \until ( pattern )
\section cmduntil \\until ( pattern )
\addindex \\until
This command writes all lines of the example that was last
......@@ -1527,7 +1527,7 @@ void memcpy(void *dest, const void *src, size_t n);
See section \ref cmddontinclude "\\dontinclude" for an example.
<hr>
\section cmdverbinclude \verbinclude <file-name>
\section cmdverbinclude \\verbinclude <file-name>
\addindex \\verbinclude
This command includes the file \<file-name\> verbatim in the documentation.
......@@ -1538,7 +1538,7 @@ void memcpy(void *dest, const void *src, size_t n);
\ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
<hr>
\section cmdhtmlinclude \htmlinclude <file-name>
\section cmdhtmlinclude \\htmlinclude <file-name>
\addindex \\htmlinclude
This command includes the file \<file-name\> as is in the HTML documentation.
......@@ -1553,7 +1553,7 @@ void memcpy(void *dest, const void *src, size_t n);
Commands for visual enhancements
\htmlonly --- </center>\endhtmlonly</h2>
\section cmda \a <word>
\section cmda \\a <word>
\addindex \\a
Displays the argument \<word\> using a special font.
......@@ -1567,7 +1567,7 @@ void memcpy(void *dest, const void *src, size_t n);
... the \a x and \a y coordinates are used to ...
<hr>
\section cmdarg \arg { item-description }
\section cmdarg \\arg { item-description }
\addindex \\arg
This command has one argument that continues until the first
......@@ -1600,7 +1600,7 @@ void memcpy(void *dest, const void *src, size_t n);
<hr>
\section cmdb \b <word>
\section cmdb \\b <word>
\addindex \\b
Displays the argument \<word\> using a bold font.
......@@ -1608,7 +1608,7 @@ void memcpy(void *dest, const void *src, size_t n);
To put multiple words in bold use \<b\>multiple words\</b\>.
<hr>
\section cmdc \c <word>
\section cmdc \\c <word>
\addindex \\c
Displays the argument \<word\> using a typewriter font.
......@@ -1627,7 +1627,7 @@ void memcpy(void *dest, const void *src, size_t n);
To have multiple words in typewriter font use \<tt\>multiple words\</tt\>.
<hr>
\section cmdcode \code
\section cmdcode \\code
\addindex \\code
Starts a block of code. A code block is treated differently
......@@ -1638,7 +1638,7 @@ void memcpy(void *dest, const void *src, size_t n);
\sa section \ref cmdendcode "\\endcode", section \ref cmdverbatim "\\verbatim"
<hr>
\section cmdcopydoc \copydoc <link-object>
\section cmdcopydoc \\copydoc <link-object>
\addindex \\copydoc
Copies a documentation block from the object specified by \<link-object\>
......@@ -1676,7 +1676,7 @@ void memcpy(void *dest, const void *src, size_t n);
relation will be broken and flagged as an error.
<hr>
\section cmddot \dot
\section cmddot \\dot
\addindex \\dot
Starts a text fragment which should contain a valid description of a
......@@ -1710,7 +1710,7 @@ class C {};
\endcode
<hr>
\section cmddotfile \dotfile <file> ["caption"]
\section cmddotfile \\dotfile <file> ["caption"]
\addindex \\dotfile
Inserts an image generated by dot from \<file\> into the documentation.
......@@ -1728,7 +1728,7 @@ class C {};
stripped before the caption is displayed.
<hr>
\section cmde \e <word>
\section cmde \\e <word>
\addindex \\e
Displays the argument \<word\> in italics.
......@@ -1746,7 +1746,7 @@ class C {};
To emphasis multiple words use \<em\>multiple words\</em\>.
<hr>
\section cmdem \em <word>
\section cmdem \\em <word>
\addindex \\em
Displays the argument \<word\> in italics.
......@@ -1763,20 +1763,20 @@ class C {};
Equivalent to \ref cmde "\\e"
<hr>
\section cmdendcode \endcode
\section cmdendcode \\endcode
\addindex \\endcode
Ends a block of code.
\sa section \ref cmdcode "\\code"
<hr>
\section cmdenddot \enddot
\section cmdenddot \\enddot
\addindex \\enddot
Ends a blocks that was started with \ref cmddot "\\dot".
<hr>
\section cmdendhtmlonly \endhtmlonly
\section cmdendhtmlonly \\endhtmlonly
\addindex \\endhtmlonly
Ends a block of text that was started with a \\htmlonly command.
......@@ -1784,7 +1784,7 @@ class C {};
\sa section \ref cmdhtmlonly "\\htmlonly".
<hr>
\section cmdendlatexonly \endlatexonly
\section cmdendlatexonly \\endlatexonly
\addindex \\endlatexonly
Ends a block of text that was started with a \\latexonly command.
......@@ -1792,7 +1792,7 @@ class C {};
\sa section \ref cmdlatexonly "\\latexonly".
<hr>
\section cmdendmanonly \endmanonly
\section cmdendmanonly \\endmanonly
\addindex \\endmanonly
Ends a block of text that was started with a \\manonly command.
......@@ -1800,7 +1800,7 @@ class C {};
\sa section \ref cmdmanonly "\\manonly".
<hr>
\section cmdendverbatim \endverbatim
\section cmdendverbatim \\endverbatim
\addindex \\endverbatim
Ends a block of text that was started with a \\verbatim command.
......@@ -1808,7 +1808,7 @@ class C {};
\sa section \ref cmdverbatim "\\verbatim".
<hr>
\section cmdendxmlonly \endxmlonly
\section cmdendxmlonly \\endxmlonly
\addindex \\endxmlonly
Ends a block of text that was started with a \\xmlonly command.
......@@ -1816,7 +1816,7 @@ class C {};
\sa section \ref cmdxmlonly "\\xmlonly".
<hr>
\section cmdfdollar \f$
\section cmdfdollar \\f$
\addindex \\f\$
......@@ -1824,7 +1824,7 @@ class C {};
\sa section \ref formulas "formulas" for an example.
<hr>
\section cmdfbropen \f[
\section cmdfbropen \\f[
\addindex \\f[
......@@ -1833,7 +1833,7 @@ class C {};
\sa section \ref cmdfbrclose "\\f]" and section \ref formulas "formulas".
<hr>
\section cmdfbrclose \f]
\section cmdfbrclose \\f]
\addindex \\f]
......@@ -1842,7 +1842,7 @@ class C {};
\sa section \ref cmdfbropen "\\f[" and section \ref formulas "formulas".
<hr>
\section cmdhtmlonly \htmlonly
\section cmdhtmlonly \\htmlonly
\addindex \\htmlonly
Starts a block of text that will be verbatim included in the
......@@ -1862,7 +1862,7 @@ class C {};
\ref cmdlatexonly "\\latexonly".
<hr>
\section cmdimage \image <format> <file> ["caption"] [<sizeindication>=<size>]
\section cmdimage \\image <format> <file> ["caption"] [<sizeindication>=<size>]
\addindex \\image
Inserts an image into the documentation. This command is format
......@@ -1917,7 +1917,7 @@ class C {};
So \e you have to make sure this is the case!
<hr>
\section cmdlatexonly \latexonly
\section cmdlatexonly \\latexonly
\addindex \\latexonly
Starts a block of text that will be verbatim included in the
......@@ -1937,7 +1937,7 @@ class C {};
and section \ref cmdhtmlonly "\\htmlonly".
<hr>
\section cmdmanonly \manonly
\section cmdmanonly \\manonly
\addindex \\manonly
Starts a block of text that will be verbatim included in the
......@@ -1953,7 +1953,7 @@ class C {};
\ref cmdlatexonly "\\latexonly".
<hr>
\section cmdli \li { item-description }
\section cmdli \\li { item-description }
\addindex \\li
This command has one argument that continues until the first
......@@ -1985,14 +1985,14 @@ class C {};
Equivalent to \ref cmdarg "\\arg"
<hr>
\section cmdn \n
\section cmdn \\n
\addindex \\n
Forces a new line. Equivalent to \<br\> and inspired by
the printf function.
<hr>
\section cmdp \p <word>
\section cmdp \\p <word>
\addindex \\p
Displays the parameter \<word\> using a typewriter font.
......@@ -2009,7 +2009,7 @@ class C {};
Equivalent to \ref cmdc "\\c"
<hr>
\section cmdverbatim \verbatim
\section cmdverbatim \\verbatim
\addindex \\verbatim
Starts a block of text that will be verbatim included in both the
......@@ -2021,7 +2021,7 @@ class C {};
\\verbatim command or the parser will get confused!
<hr>
\section cmdxmlonly \xmlonly
\section cmdxmlonly \\xmlonly
\addindex \\xmlonly
Starts a block of text that will be verbatim included in the
......@@ -2034,7 +2034,7 @@ class C {};
\ref cmdlatexonly "\\latexonly".
<hr>
\section cmdbackslash \\
\section cmdbackslash \\\\
\addindex \\\\
This command writes a backslash character (\\) to the HTML and
......@@ -2042,7 +2042,7 @@ class C {};
cases because doxygen uses it to detect commands.
<hr>
\section cmdat \@
\section cmdat \\\@
\addindex \\\@
This command writes an at-sign (\@) to the HTML and
......@@ -2050,7 +2050,7 @@ class C {};
because doxygen uses it to detect JavaDoc commands.
<hr>
\section cmdtilde \~[LanguageId]
\section cmdtilde \\~[LanguageId]
\addindex \\~
This command enables/disables a language specific filter. This can be
used to put documentation for different language into one comment block
......@@ -2067,14 +2067,14 @@ class C {};
<hr>
\section cmdamp \&
\section cmdamp \\\&
\addindex \\\&
This command writes the \& character to output.
This character has to be escaped because it has a special meaning in HTML.
<hr>
\section cmddollar \$
\section cmddollar \\\$
\addindex \\\$
This command writes the \$ character to the output.
......@@ -2082,7 +2082,7 @@ class C {};
environment variables.
<hr>
\section cmdhash \#
\section cmdhash \\\#
\addindex \\\#
This command writes the \# character to the output. This
......@@ -2090,20 +2090,20 @@ class C {};
to documented entities.
<hr>
\section cmdlt \<
\section cmdlt \\\<
\addindex \\\<
This command writes the \< character to the output.
This character has to be escaped because it has a special meaning in HTML.
<hr>
\section cmdgt \>
\section cmdgt \\\>
\addindex \\\>
This command writes the \> character to the output. This
character has to be escaped because it has a special meaning in HTML.
\section cmdperc \%
\section cmdperc \\\%
\addindex \\\%
This command writes the \% character to the output. This
......
.TH DOXYGEN "1" "DATE" "doxygen VERSION" "User Commands"
.SH NAME
doxygen \- manual page for doxygen VERSION
.SH DESCRIPTION
Doxygen version VERSION
Copyright Dimitri van Heesch 1997-2005
.PP
You can use doxygen in a number of ways:
.TP
1) Use doxygen to generate a template configuration file:
.IP
doxygen [-s] \fB\-g\fR [configName]
.IP
If - is used for configName doxygen will write to standard output.
.TP
2) Use doxygen to update an old configuration file:
.IP
doxygen [-s] \fB\-u\fR [configName]
.TP
3) Use doxygen to generate documentation using an existing configuration file:
.IP
doxygen [configName]
.IP
If - is used for configName doxygen will read from standard input.
.TP
4) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.
.TP
RTF:
doxygen \fB\-w\fR rtf styleSheetFile
.TP
HTML:
doxygen \fB\-w\fR html headerFile footerFile styleSheetFile [configFile]
.TP
LaTeX: doxygen \fB\-w\fR latex headerFile styleSheetFile [configFile]
.TP
5) Use doxygen to generate an rtf extensions file
.TP
RTF:
doxygen \fB\-e\fR rtf extensionsFile
.PP
If \fB\-s\fR is specified the comments in the config file will be omitted.
If configName is omitted `Doxyfile' will be used as a default.
.SH SEE ALSO
doxytag(1), doxywizard(1).
.TH DOXYTAG "1" "DATE" "doxytag VERSION" "User Commands"
.SH NAME
doxytag \- generates a tag file and/or a search index for a set of HTML files
.SH SYNOPSIS
.B doxytag
[\fI-t tag_file\fR] [\fI-s index_file\fR] [ \fIhtml_file \fR[\fIhtml_file\fR...] ]
.SH DESCRIPTION
Generates a tag file and/or a search index for a set of HTML files. Use
doxysearch as a CGI program to search the tag file generated by doxytag.
.SH OPTIONS
.TP
\fB\-t\fR <tag_file>
Generate tag file <tag_file>.
.TP
\fB\-s\fR <index_file> Generate search index <index_file>.
.PP
If no HTML files are given all files in the current dir that
have a .html extension are parsed.
.SH SEE ALSO
doxygen(1), doxywizard(1).
.TH DOXYWIZARD "1" "DATE" "doxywizard VERSION" "User Commands"
.SH NAME
doxywizard \- a tool to configure and run doxygen on your source files
.SH SYNOPSIS
.B doxywizard
.SH DESCRIPTION
Doxywizard is an interactive frontend to the doxygen tool to configure
and run doxygen on your source files.
.SH SEE ALSO
doxygen(1), doxytag(1).
......@@ -63,7 +63,7 @@ PREDEFINED = MY_MACRO()=
</ol>
<li><b>When I set EXTRACT_ALL to NO none of my functions are shown in the
documentation.</b></li>
documentation.</b>
In order for global functions, variables, enums, typedefs, and defines
to be documented you should document the file in which these commands are
......@@ -78,7 +78,6 @@ For member functions or functions that are part of a namespace you should
document either the class or namespace.
<li><b>How can I make doxygen ignore some code fragment?</b>
<p>
The new and easiest way is to add one comment block
with a \ref cmdcond "\\cond" command at the start and one comment block
......
......@@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other
than English (the default). The output language is chosen through the
configuration file (with default name and known as Doxyfile).
Currently (version 1.4.0), 30 languages
Currently (version 1.4.1), 30 languages
are supported (sorted alphabetically):
Afrikaans, Brazilian Portuguese, Catalan, Chinese, Chinese
Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French,
......
......@@ -14,7 +14,7 @@
* input used in their production; they are not affected by this license.
*
*/
/*! \page output.html
/*! \page output.html Output Formats
\section output Output Formats
......
(1.4.0)
(1.4.1)
Doxygen supports the following 30 languages (sorted alphabetically):
......
Summary: A documentation system for C/C++.
Name: doxygen
Version: 1.4.1
Version: 1.4.1_20050129
Release: 1
Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
......@@ -2395,7 +2395,14 @@ OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
g_code->codify(yytext);
if (--g_bracketCount<=0)
{
BEGIN( CallEnd );
if (g_name.isEmpty())
{
BEGIN( Body );
}
else
{
BEGIN( CallEnd );
}
}
}
<CallEnd>[ \t\n]* { codifyLines(yytext); }
......
/******************************************************************************
*
* Copyright (C) 1997-2005 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.
*
*/
#ifndef COMMENTSCAN_H
#define COMMENTSCAN_H
#include "qtbc.h"
#include "entry.h"
bool parseCommentBlock(/* in,out */ Entry *curEntry,
/* in */ const QCString &comment,
/* in */ const QCString &fileName,
/* in */ int lineNr,
/* in */ bool isBrief,
/* in */ bool isJavaDocStyle,
/* in,out */ Protection &prot
);
#endif
/*****************************************************************************
*
* Copyright (C) 1997-2005 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.
*
*/
%{
/*
* includes
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
#include "qtbc.h"
#include <qarray.h>
#include <qstack.h>
#include <qregexp.h>
#include <unistd.h>
#include <qfile.h>
#include "scanner.h"
#include "entry.h"
#include "doxygen.h"
#include "message.h"
#include "config.h"
#include "util.h"
#include "index.h"
#include "defargs.h"
#include "language.h"
#include "outputlist.h"
#include "membergroup.h"
#include "reflist.h"
#include "code.h"
// forward declarations
static void handleBrief(const QCString &);
static void handleFn(const QCString &);
static void handleDef(const QCString &);
static void handleOverload(const QCString &);
static void handleEnum(const QCString &);
static void handleDefGroup(const QCString &);
static void handleAddToGroup(const QCString &);
static void handleWeakGroup(const QCString &);
static void handleNamespace(const QCString &);
static void handlePackage(const QCString &);
static void handleClass(const QCString &);
static void handleProtocol(const QCString &);
static void handleCategory(const QCString &);
static void handleUnion(const QCString &);
static void handleStruct(const QCString &);
static void handleInterface(const QCString &);
static void handleIdlException(const QCString &);
static void handlePage(const QCString &);
static void handleMainpage(const QCString &);
static void handleFile(const QCString &);
static void handleDir(const QCString &);
static void handleExample(const QCString &);
static void handleDetails(const QCString &);
static void handleName(const QCString &);
static void handleTodo(const QCString &);
static void handleTest(const QCString &);
static void handleBug(const QCString &);
static void handleDeprecated(const QCString &);
static void handleXRefItem(const QCString &);
static void handleRelated(const QCString &);
static void handleRelatedAlso(const QCString &);
static void handleRefItem(const QCString &);
static void handleSection(const QCString &);
static void handleAnchor(const QCString &);
static void handleFormatBlock(const QCString &);
static void handleAddIndex(const QCString &);
static void handleIf(const QCString &);
static void handleIfNot(const QCString &);
static void handleElseIf(const QCString &);
static void handleElse(const QCString &);
static void handleEndIf(const QCString &);
static void handleIngroup(const QCString &);
static void handleNoSubGrouping(const QCString &);
static void handleShowInitializer(const QCString &);
static void handleHideInitializer(const QCString &);
static void handleCallgraph(const QCString &);
static void handleInternal(const QCString &);
static void handleLineBr(const QCString &);
static void handleStatic(const QCString &);
static void handlePure(const QCString &);
static void handlePrivate(const QCString &);
static void handlePrivateSection(const QCString &);
static void handleProtected(const QCString &);
static void handleProtectedSection(const QCString &);
static void handlePublic(const QCString &s);
static void handlePublicSection(const QCString &s);
static void handleInherit(const QCString &);
typedef void (*DocCmdFunc)(const QCString &name);
struct DocCmdMap
{
const char *cmdName;
DocCmdFunc handler;
};
static DocCmdMap docCmdMap[] =
{
{ "brief", &handleBrief },
{ "short", &handleBrief },
{ "fn", &handleFn },
{ "var", &handleFn },
{ "typedef", &handleFn },
{ "property", &handleFn },
{ "def", &handleDef },
{ "overload", &handleOverload },
{ "enum", &handleEnum },
{ "defgroup", &handleDefGroup },
{ "addtogroup", &handleAddToGroup },
{ "weakgroup", &handleWeakGroup },
{ "namespace", &handleNamespace },
{ "package", &handlePackage },
{ "class", &handleClass },
{ "protocol", &handleProtocol },
{ "category", &handleCategory },
{ "union", &handleUnion },
{ "struct", &handleStruct },
{ "interface", &handleInterface },
{ "idlexcept", &handleIdlException },
{ "page", &handlePage },
{ "mainpage", &handleMainpage },
{ "file", &handleFile },
{ "dir", &handleDir },
{ "example", &handleExample },
{ "details", &handleDetails },
{ "name", &handleName },
{ "todo", &handleTodo },
{ "test", &handleTest },
{ "bug", &handleBug },
{ "deprecated", &handleDeprecated },
{ "xrefitem", &handleXRefItem },
{ "related", &handleRelated },
{ "relates", &handleRelated },
{ "relatedalso", &handleRelatedAlso },
{ "relatesalso", &handleRelatedAlso },
{ "refitem", &handleRefItem },
{ "section", &handleSection },
{ "subsection", &handleSection },
{ "subsubsection", &handleSection },
{ "paragraph", &handleSection },
{ "anchor", &handleAnchor },
{ "verbatim", &handleFormatBlock },
{ "latexonly", &handleFormatBlock },
{ "htmlonly", &handleFormatBlock },
{ "rtfonly", &handleFormatBlock },
{ "dot", &handleFormatBlock },
{ "code", &handleFormatBlock },
{ "addindex", &handleAddIndex },
{ "if", &handleIf },
{ "ifnot", &handleIfNot },
{ "elseif", &handleElseIf },
{ "else", &handleElse },
{ "endif", &handleEndIf },
{ "ingroup", &handleIngroup },
{ "nosubgrouping", &handleNoSubGrouping },
{ "showinitializer", &handleShowInitializer },
{ "hideinitializer", &handleHideInitializer },
{ "callgraph", &handleCallgraph },
{ "internal", &handleInternal },
{ "_linebr", &handleLineBr },
{ "static", &handleStatic },
{ "pure", &handlePure },
{ "private", &handlePrivate},
{ "privatesection", &handlePrivateSection },
{ "protected", &handleProtected },
{ "protectedsection",&handleProtectedSection },
{ "public", &handlePublic },
{ "publicsection", &handlePublicSection },
{ "inherit", &handleInherit },
{ 0, 0 }
};
/** @brief Command mapper.
*
* Maps a command name (as found in a comment block) onto a
* specific handler function.
*/
class DocCmdMapper
{
public:
/** maps a command name to a handler function */
static DocCmdFunc *map(const char *name)
{
return instance()->find(name);
}
/** release the singleton */
static void freeInstance()
{
delete s_instance; s_instance=0;
}
private:
static DocCmdMapper *instance()
{
if (s_instance==0) s_instance = new DocCmdMapper;
return s_instance;
}
DocCmdMapper() : m_map(89)
{
DocCmdMap *p = docCmdMap;
while (p->cmdName)
{
m_map.insert(p->cmdName,&p->handler);
p++;
}
}
DocCmdFunc *find(const char *name)
{
return m_map.find(name);
}
QDict<DocCmdFunc> m_map;
static DocCmdMapper *s_instance;
};
DocCmdMapper *DocCmdMapper::s_instance=0;
#define YY_NEVER_INTERACTIVE 1
enum XRefKind
{
XRef_Item,
XRef_Todo,
XRef_Test,
XRef_Bug,
XRef_Deprecated
};
enum OutputContext
{
OutputDoc,
OutputBrief,
OutputXRef
};
enum GuardType
{
Guard_If,
Guard_IfNot
};
class GuardedSection
{
public:
GuardedSection(bool enabled,bool parentVisible)
: m_enabled(enabled),m_parentVisible(parentVisible) {}
bool isEnabled() const { return m_enabled; }
bool parentVisible() const { return m_parentVisible; }
private:
bool m_enabled;
bool m_parentVisible;
};
/* -----------------------------------------------------------------
*
* statics
*/
static const char * inputString; // input string
static int inputPosition; // read pointer
static QCString yyFileName; // file name that is read from
static int yyLineNr; // line number in the input
//static bool inBody; // was the comment found inside the body of a function?
static OutputContext inContext; // are we inside the brief, details or xref part
static bool briefEndsAtDot; // does the brief description stop at a dot?
static QCString formulaText; // Running text of a formula
static QCString formulaEnv; // environment name
static QCString *pOutputString; // pointer to string to which the output is appended.
static QCString outputXRef; // temp argument of todo/test/../xrefitem commands
static QCString blockName; // preformatted block name (e.g. verbatim, latexonly,...)
static XRefKind xrefKind; // kind of cross-reference command
static GuardType guardType; // kind of guard for conditional section
static QCString nameHeader; // heading of the @name command
static QCString functionProto; // function prototype
static QStack<GuardedSection> guards; // tracks nested conditional sections (if,ifnot,..)
static Entry* current = 0 ; // working entry
//static Entry* current_root = 0 ; // parent of working entry
//static Entry* previous = 0 ; // TODO: remove need for this
static bool needNewEntry;
static QCString sectionLabel;
static QCString sectionTitle;
static QCString xrefItemKey;
static QCString xrefItemTitle;
static QCString xrefListTitle;
static Protection protection;
//-----------------------------------------------------------------------------
static void initParser()
{
sectionLabel.resize(0);
sectionTitle.resize(0);
nameHeader.resize(0);
}
//-----------------------------------------------------------------------------
static void makeStructuralIndicator(Entry::Sections s)
{
needNewEntry = TRUE;
current->section = s;
current->fileName = yyFileName;
current->startLine = yyLineNr;
}
static void lineCount()
{
for( const char* c = yytext ; *c ; ++c )
yyLineNr += (*c == '\n') ;
}
static QCString stripQuotes(const char *s)
{
QCString name;
if (s==0 || *s==0) return name;
name=s;
if (name.at(0)=='"' && name.at(name.length()-1)=='"')
{
name=name.mid(1,name.length()-2);
}
return name;
}
//-----------------------------------------------------------------
static void addXRefItem(const char *listName,const char *itemTitle,const char *listTitle)
{
Entry *docEntry = current; // inBody && previous ? previous : current;
//printf("docEntry=%p\n",docEntry);
if (listName==0) return;
//printf("addXRefItem(%s,%s,%s)\n",listName,itemTitle,listTitle);
ListItemInfo *lii=0;
RefList *refList = Doxygen::xrefLists->find(listName);
if (refList==0) // new list
{
refList = new RefList(listName,listTitle,itemTitle);
Doxygen::xrefLists->insert(listName,refList);
//printf("new list!\n");
}
if (docEntry->sli)
{
QListIterator<ListItemInfo> slii(*docEntry->sli);
for (slii.toFirst();(lii=slii.current());++slii)
{
if (strcmp(lii->type,listName)==0)
{
//printf("found %s lii->type=%s\n",listName,lii->type);
break;
}
}
}
#if 0 // with this code multiple @todo items can be put under the same
// heading, I removed it because it changes the text flow.
if (lii) // already found item of same type before
{
//printf("listName=%s item id = %d existing\n",listName,lii->itemId);
RefItem *item = refList->getRefItem(lii->itemId);
ASSERT(item!=0);
item->text += " <p>";
item->text += outputXRef;
//printf("%s: text +=%s\n",listName,item->text.data());
}
else // new item
#endif
{
int itemId = refList->addRefItem();
//printf("listName=%s item id = %d new current=%p\n",listName,itemId,current);
// if we have already an item from the same list type (e.g. a second @todo)
// in the same Entry (i.e. lii!=0) then we reuse its link anchor.
char anchorLabel[1024];
sprintf(anchorLabel,"_%s%06d",listName,lii ? lii->itemId : itemId);
RefItem *item = refList->getRefItem(itemId);
ASSERT(item!=0);
item->text = outputXRef;
item->listAnchor = anchorLabel;
docEntry->addSpecialListItem(listName,itemId);
QCString cmdString;
cmdString.sprintf("\\xrefitem %s %d\n",listName,itemId);
docEntry->doc += cmdString;
SectionInfo *si=new SectionInfo(listName,anchorLabel,
sectionTitle,SectionInfo::Anchor);
Doxygen::sectionDict.insert(anchorLabel,si);
docEntry->anchors->append(si);
}
//current->brief = slString; // restore orginial brief desc.
}
//-----------------------------------------------------------------------------
// Adds a formula text to the list/dictionary of formulas if it was
// not already added. Returns the label of the formula.
static QCString addFormula()
{
QCString formLabel;
QCString fText=formulaText.simplifyWhiteSpace();
Formula *f=0;
if ((f=Doxygen::formulaDict[fText])==0)
{
f = new Formula(fText);
Doxygen::formulaList.append(f);
Doxygen::formulaDict.insert(fText,f);
formLabel.sprintf("\\form#%d",f->getId());
Doxygen::formulaNameDict.insert(formLabel,f);
}
else
{
formLabel.sprintf("\\form#%d",f->getId());
}
return formLabel;
}
//-----------------------------------------------------------------------------
static void checkFormula();
//-----------------------------------------------------------------------------
static void prependScope()
{
Entry *current_root = current->parent;
if (current_root && current_root->section & Entry::SCOPE_MASK)
{
//printf("--- prependScope %s to %s\n",current_root->name.data(),current->name.data());
current->name.prepend(current_root->name+"::");
if (current_root->tArgLists)
{
if (current->tArgLists==0)
{
current->tArgLists = new QList<ArgumentList>;
current->tArgLists->setAutoDelete(TRUE);
}
//printf("prependScope #=%d #current=%d\n",current_root->tArgLists->count(),current->tArgLists->count());
QListIterator<ArgumentList> talsi(*current_root->tArgLists);
ArgumentList *srcAl=0;
for (talsi.toLast();(srcAl=talsi.current());--talsi)
{
ArgumentList *dstAl = new ArgumentList;
dstAl->setAutoDelete(TRUE);
QListIterator<Argument> tali(*srcAl);
Argument *a;
for (;(a=tali.current());++tali)
{
dstAl->append(new Argument(*a));
//printf("appending argument %s %s\n",a->type.data(),a->name.data());
}
current->tArgLists->insert(0,dstAl);
}
}
}
}
static void addSection()
{
sectionTitle+=yytext;
sectionTitle=sectionTitle.stripWhiteSpace();
//printf("Adding new section file=%s label=%s title=%s\n",yyFileName,sectionLabel.data(),sectionTitle.data());
SectionInfo *si = new SectionInfo(yyFileName,sectionLabel,sectionTitle,SectionInfo::Anchor);
current->anchors->append(si);
Doxygen::sectionDict.insert(yytext,si);
}
//-----------------------------------------------------------------------------
// determines the string to write to
static inline void setOutput(OutputContext ctx)
{
if (inContext==OutputXRef) // end of XRef section => add the item
{
switch(xrefKind)
{
case XRef_Todo:
addXRefItem("todo",theTranslator->trTodo(),theTranslator->trTodoList());
break;
case XRef_Test:
addXRefItem("test",theTranslator->trTest(),theTranslator->trTestList());
break;
case XRef_Bug:
addXRefItem("bug",theTranslator->trBug(),theTranslator->trBugList());
break;
case XRef_Deprecated:
addXRefItem("deprecated",theTranslator->trDeprecated(),theTranslator->trDeprecatedList());
break;
case XRef_Item:
addXRefItem(xrefItemKey,xrefItemTitle,xrefListTitle);
break;
}
}
inContext = ctx;
switch(inContext)
{
case OutputDoc:
pOutputString = &current->doc;
break;
case OutputBrief:
pOutputString = &current->brief;
break;
case OutputXRef:
pOutputString = &outputXRef;
break;
}
}
// add a string to the output
static inline void addOutput(const char *s)
{
*pOutputString+=s;
}
// add a character to the output
static inline void addOutput(char c)
{
*pOutputString+=c;
}
/* ----------------------------------------------------------------- */
#undef YY_INPUT
#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
static int yyread(char *buf,int max_size)
{
int c=0;
while( c < max_size && inputString[inputPosition] )
{
*buf = inputString[inputPosition++] ;
//printf("%d (%c)\n",*buf,*buf);
c++; buf++;
}
return c;
}
%}
/* start command character */
CMD ("\\"|"@")
DETAILEDCMD {CMD}("arg"|"attention"|"author"|"bug"|"code"|"date"|"deprecated"|"dot"|"dotfile"|"example"|"htmlinclude"|"htmlonly"|"image"|"include"|"includelineno"|"internal"|"invariant"|"latexonly"|"li"|"line"|manonly"|"name"|"note"|"par"|"paragraph"|"param"|"post"|"pre"|"remarks"|"relate"[sd]"("also")?|"remarks"|"return"[s]?|"retval"|"sa"|"section"|"see"|"since"|"subsection"|"subsubsection"|"test"|"throw"|"todo"|"until"|"verbatim"|"verbinclude"|"version"|"warning"|"xmlonly"|"xrefitem")
/* ("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"callgraph"|"latexonly"|"htmlonly"|"xmlonly"|"{"|"verbatim"|"dotfile"|"dot"|"defgroup"|"addtogroup"|"weakgroup"|"class"|"namespace"|"union"|"struct"|"fn"|"var"|"details"|"typedef"|"def"|"overload")|("<"{PRE}">") */
PRE [pP][rR][eE]
TABLE [tT][aA][bB][lL][eE]
P [pP]
UL [uU][lL]
OL [oO][lL]
DL [dD][lL]
IMG [iI][mM][gG]
HR [hH][rR]
CODE [cC][oO][dD][eE]
DETAILEDHTML {PRE}|{UL}|{TABLE}|{OL}|{DL}|{P}|[Hh][1-6]|{IMG}|{HR}|{CODE}
BN [ \t\n\r]
BL [ \t\r]*"\n"
B [ \t]
BS ^(({B}*"//")?)(({B}*"*"+)?){B}*
ATTR ({B}+[^>\n]*)?
DOCNL "\n"|"\\_linebr"
LC "\\"{B}*"\n"
NW [^a-z_A-Z0-9]
FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+]
FILEECHAR [a-z_A-Z0-9\-\+]
FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]+"\"")
ID "$"?[a-z_A-Z][a-z_A-Z0-9]*
LABELID [a-z_A-Z][a-z_A-Z0-9\-]*
SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
%option nounput
%option noyywrap
/* comment parsing states. */
%x Comment
%x PageDocArg1
%x PageDocArg2
%x RelatesParam1
%x ClassDocArg1
%x ClassDocArg2
%x ClassDocArg3
%x CategoryDocArg1
%x XRefItemParam1
%x XRefItemParam2
%x XRefItemParam3
%x FileDocArg1
%x EnumDocArg1
%x NameSpaceDocArg1
%x PackageDocArg1
%x GroupDocArg1
%x GroupDocArg2
%x SectionLabel
%x SectionTitle
%x FormatBlock
%x LineParam
%x GuardParam
%x SkipGuardedSection
%x SkipInternal
%x NameParam
%x InGroupParam
%x FnParam
%x OverloadParam
%x InheritParam
%x ReadFormulaShort
%x ReadFormulaLong
%x AnchorLabel
%x HtmlComment
%%
/* What can happen in while parsing a comment block:
* commands (e.g. @page, or \page)
* escaped commands (e.g. @@page or \\page).
* formulas (e.g. \f$ \f[ \f{..)
* directories (e.g. \doxygen\src\)
* autolist end. (e.g. a dot on an otherwise empty line)
* newlines.
* end of brief due to blank line.
* end of brief due to some command (@command, or <command>).
* words and whitespace and other characters (#,?!, etc).
* grouping commands (e.g. @{ and @})
*/
<Comment>{CMD}{CMD}[a-z_A-Z]*{B}* { // escaped command
addOutput(yytext);
}
<Comment>("\\"[a-z_A-Z]+)+"\\" { // directory (or chain of commands!)
addOutput(yytext);
}
<Comment>{DETAILEDCMD}/[^a-z_A-Z] { // command that can end a brief description
setOutput(OutputDoc);
// continue with the same input
REJECT;
}
<Comment>"<"{DETAILEDHTML}{ATTR}">" { // HTML command that ends a brief description
setOutput(OutputDoc);
// continue with the same input
REJECT;
}
<Comment>"<!--" {
BEGIN(HtmlComment);
}
<Comment>{CMD}[a-z_A-Z]+{B}* { // potentially interesting command
QCString cmdName = QCString(&yytext[1]).stripWhiteSpace();
DocCmdFunc *funcPtr = DocCmdMapper::map(cmdName);
if (funcPtr) // special action is required
{
//printf("Special command %s\n",yytext);
(*funcPtr)(cmdName);
}
else // command not relevant
{
addOutput(yytext);
}
}
<Comment>("\\\\"|"@@")"f"[$\[{] { // escaped formula command
addOutput(yytext);
}
<Comment>{CMD}"f{"[^}\n]+"}" { // start of a formula with custom environment
formulaText="\\begin";
formulaEnv=&yytext[2];
formulaText+=formulaEnv;
BEGIN(ReadFormulaLong);
}
<Comment>{CMD}"f$" { // start of a inline formula
formulaText="$";
BEGIN(ReadFormulaShort);
}
<Comment>{CMD}"f[" { // start of a block formula
formulaText="\\[";
BEGIN(ReadFormulaLong);
}
<Comment>{CMD}"{" { // begin of a group
handleGroupStartCommand(nameHeader);
}
<Comment>{CMD}"}" { // end of a group
handleGroupEndCommand();
}
<Comment>{CMD}[$@\\&~<>#%] { // escaped character
addOutput(yytext);
}
<Comment>[a-z_A-Z]+ { // normal word
addOutput(yytext);
}
<Comment>^{B}*"."{B}*/\n { // explicit end autolist: e.g " ."
addOutput(yytext);
}
<Comment>"."[a-z_A-Z0-9] { // . at start or in the middle of a word
addOutput(yytext);
}
<Comment>".\\"[ \t] { // . with escaped space.
addOutput(yytext[0]);
addOutput(yytext[2]);
}
<Comment>\n({B}*\n)+ { // at least one blank line
if (inContext)
{
setOutput(OutputDoc);
}
else
{
addOutput(yytext);
}
lineCount();
}
<Comment>"." { // potential end of a JavaDoc style comment
addOutput(*yytext);
if (briefEndsAtDot)
{
setOutput(OutputDoc);
}
}
<Comment>\n { // newline
addOutput(*yytext);
yyLineNr++;
}
<Comment>. { // catch-all for anything else
addOutput(*yytext);
}
/* -------------- Rules for handling HTML comments ----------- */
<HtmlComment>"--"[!]?">"{B}* { BEGIN( Comment ); }
<HtmlComment>{DOCNL} {
if (*yytext=='\n') yyLineNr++;
}
<HtmlComment>[^\\\n\-]+ { // ignore unimportant characters
}
<HtmlComment>. { // ignore every else
}
/* -------------- Rules for handling formulas ---------------- */
<ReadFormulaShort>{CMD}"f$" { // end of inline formula
formulaText+="$";
addOutput(addFormula());
addOutput(' ');
BEGIN(Comment);
}
<ReadFormulaLong>{CMD}"f]" { // end of block formula
formulaText+="\\]";
addOutput(addFormula());
addOutput(' ');
BEGIN(Comment);
}
<ReadFormulaLong>{CMD}"f}" { // end of custom env formula
formulaText+="\\end";
formulaText+=formulaEnv;
addOutput(addFormula());
addOutput(' ');
BEGIN(Comment);
}
<ReadFormulaLong,ReadFormulaShort>[^\\@\n]+ { // any non-special character
formulaText+=yytext;
}
<ReadFormulaLong,ReadFormulaShort>\n { // new line
formulaText+=*yytext;
yyLineNr++;
}
<ReadFormulaLong,ReadFormulaShort>. { // any othe character
formulaText+=*yytext;
}
/* ------------ handle argument of enum command --------------- */
<EnumDocArg1>{SCOPEID} { // handle argument
current->name = yytext;
prependScope();
BEGIN( Comment );
}
<EnumDocArg1>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<EnumDocArg1>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
"Warning: missing argument after \\enum."
);
addOutput('\n');
if (*yytext=='\n') yyLineNr++;
BEGIN( Comment );
}
<EnumDocArg1>. { // ignore other stuff
}
/* ------------ handle argument of namespace command --------------- */
<NameSpaceDocArg1>{SCOPENAME} { // handle argument
current->name = yytext;
BEGIN( Comment );
}
<NameSpaceDocArg1>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<NameSpaceDocArg1>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
"Warning: missing argument after "
"\\namespace."
);
addOutput('\n');
if (*yytext=='\n') yyLineNr++;
BEGIN( Comment );
}
<NameSpaceDocArg1>. { // ignore other stuff
}
/* ------------ handle argument of package command --------------- */
<PackageDocArg1>{ID}("."{ID})* { // handle argument
current->name = yytext;
BEGIN( Comment );
}
<PackageDocArg1>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<PackageDocArg1>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
"Warning: missing argument after "
"\\package."
);
addOutput('\n');
if (*yytext=='\n') yyLineNr++;
BEGIN( Comment );
}
<PackageDocArg1>. { // ignore other stuff
}
/* ------ handle argument of class/struct/union command --------------- */
<ClassDocArg1>{SCOPENAME} { // first argument
current->name = yytext;
if (current->section==Entry::PROTOCOLDOC_SEC)
{
current->name+="-p";
}
// prepend outer scope name
prependScope();
BEGIN( ClassDocArg2 );
}
<CategoryDocArg1>{SCOPENAME}{B}*"("[^\)]+")" {
current->name = yytext;
prependScope();
BEGIN( ClassDocArg2 );
}
<ClassDocArg1,CategoryDocArg1>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<ClassDocArg1,CategoryDocArg1>{DOCNL} {
warn(yyFileName,yyLineNr,
"Warning: missing argument after "
"\\%s.",YY_START==ClassDocArg1?"class":"category"
);
addOutput('\n');
if (*yytext=='\n') yyLineNr++;
BEGIN( Comment );
}
<ClassDocArg1,CategoryDocArg1>. { // ignore other stuff
}
<ClassDocArg2>{FILE} { // second argument; include file
current->includeFile = stripQuotes(yytext);
BEGIN( ClassDocArg3 );
}
<ClassDocArg2>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<ClassDocArg2>{DOCNL} {
addOutput('\n');
if (*yytext=='\n') yyLineNr++;
BEGIN( Comment );
}
<ClassDocArg2>. { // ignore other stuff
}
<ClassDocArg3>[<]?{FILE}[>]? { // third argument; include file name
current->includeName = yytext;
BEGIN( Comment );
}
<ClassDocArg3>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<ClassDocArg3>{DOCNL} {
if (*yytext=='\n') yyLineNr++;
BEGIN( Comment );
}
<ClassDocArg3>. { // ignore other stuff
}
/* --------- handle arguments of {def,add,weak}group commands --------- */
<GroupDocArg1>{ID}(".html"?) { // group name
current->name = yytext;
//lastDefGroup.groupname = yytext;
//lastDefGroup.pri = current->groupingPri();
// the .html stuff is for Qt compatibility
if (current->name.right(5)==".html")
{
current->name=current->name.left(current->name.length()-5);
}
BEGIN(GroupDocArg2);
}
<GroupDocArg1>"\\"{B}*"\n" { // line continuation
yyLineNr++;
addOutput('\n');
}
<GroupDocArg1>{DOCNL} { // missing argument!
warn(yyFileName,yyLineNr,
"Warning: missing group name after %s",
current->groupDocCmd()
);
addOutput('\n');
if (*yytext=='\n') yyLineNr++;
BEGIN( Comment );
}
<GroupDocArg2>"\\"{B}*"\n" { // line continuation
yyLineNr++;
addOutput('\n');
}
<GroupDocArg2>[^\n\\\*]+ { // title (stored in type)
current->type += yytext;
current->type = current->type.stripWhiteSpace();
}
<GroupDocArg2>{DOCNL} {
if ( current->groupDocType==Entry::GROUPDOC_NORMAL &&
current->type.isEmpty()
) // defgroup requires second argument
{
warn(yyFileName,yyLineNr,
"Warning: missing title after "
"\\defgroup %s", current->name.data()
);
}
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
BEGIN( Comment );
}
/* --------- handle arguments of page/mainpage command ------------------- */
<PageDocArg1>{FILE} { // first argument; page name
current->name = stripQuotes(yytext);
BEGIN( PageDocArg2 );
}
<PageDocArg1>{LC} { yyLineNr++;
addOutput('\n');
}
<PageDocArg1>{DOCNL} {
warn(yyFileName,yyLineNr,
"Warning: missing argument after "
"\\page."
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
BEGIN( Comment );
}
<PageDocArg1>. { // ignore other stuff
}
<PageDocArg2>.*"\n" { // second argument; page title
yyLineNr++;
current->args = yytext;
addOutput('\n');
BEGIN( Comment );
}
/* --------- handle arguments of the file/dir/example command ------------ */
<FileDocArg1>{FILE} { // first argument; name
current->name = stripQuotes(yytext);
BEGIN( Comment );
}
<FileDocArg1>{LC} { yyLineNr++;
addOutput('\n');
}
<FileDocArg1>{DOCNL} { // no file name specfied
current->name = yyFileName;
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
BEGIN( Comment );
}
<FileDocArg1>. { // ignore other stuff
}
/* --------- handle arguments of the xrefitem command ------------ */
<XRefItemParam1>{ID} { // first argument
xrefItemKey=yytext;
BEGIN(XRefItemParam2);
}
<XRefItemParam1>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<XRefItemParam1>{DOCNL} { // missing arguments
warn(yyFileName,yyLineNr,
"Warning: Missing first argument of \\xrefitem"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
inContext = OutputDoc;
BEGIN( Comment );
}
<XRefItemParam1>. { // ignore other stuff
}
<XRefItemParam2>"\""[^\n\"]*"\"" { // second argument
xrefItemTitle = stripQuotes(yytext);
BEGIN(XRefItemParam3);
}
<XRefItemParam2>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<XRefItemParam2>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
"Warning: Missing second argument of \\xrefitem"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
inContext = OutputDoc;
BEGIN( Comment );
}
<XRefItemParam2>. { // ignore other stuff
}
<XRefItemParam3>"\""[^\n\"]*"\"" { // third argument
xrefListTitle = stripQuotes(yytext);
BEGIN( Comment );
}
<XRefItemParam2>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<XRefItemParam3>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
"Warning: Missing third argument of \\xrefitem"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
inContext = OutputDoc;
BEGIN( Comment );
}
<XRefItemParam3>. { // ignore other stuff
}
/* --------- handle arguments of the relates(also) command ------------ */
<RelatesParam1>({ID}("::"|"."))*{ID} { // argument
current->relates = yytext;
//if (current->mGrpId!=DOX_NOGROUP)
//{
// memberGroupRelates = yytext;
//}
BEGIN( Comment );
}
<RelatesParam1>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<RelatesParam1>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
"Warning: Missing argument of \\relates command"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
BEGIN( Comment );
}
<RelatesParam1>. { // ignore other stuff
}
/* ----- handle arguments of the relates(also)/addindex commands ----- */
<LineParam>{DOCNL} { // end of argument
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
BEGIN( Comment );
}
<LineParam>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<LineParam>. { // ignore other stuff
addOutput(*yytext);
}
/* ----- handle arguments of the section/subsection/.. commands ------- */
<SectionLabel>{LABELID} { // first argyment
sectionLabel=yytext;
sectionTitle.resize(0);
current->doc+=yytext;
BEGIN(SectionTitle);
}
<SectionLabel>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
"Warning: \\section command has no label"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
BEGIN( Comment );
}
<SectionLabel>. { // invalid character for section label
warn(yyFileName,yyLineNr,
"Warning: Invalid or missing section label"
);
BEGIN(Comment);
}
<SectionTitle>[^\n@\\*]*/"\n" { // end of section title
addSection();
addOutput(yytext);
BEGIN( Comment );
}
<SectionTitle>[^\n@\\]*/"\\_linebr" { // end of section title
addSection();
addOutput(yytext);
BEGIN( Comment );
}
<SectionTitle>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<SectionTitle>[^\n@\\]* { // any character without special meaning
sectionTitle+=yytext;
current->doc+=yytext;
}
<SectionTitle>("\\\\"|"@@") { // unescape escaped command
sectionTitle+=*yytext;
current->doc+=*yytext;
}
<SectionTitle>. { // anything else
sectionTitle+=yytext;
current->doc+=yytext;
}
/* ----- handle arguments of the anchor command ------- */
<AnchorLabel>{LABELID} { // found argument
SectionInfo *si = new SectionInfo(yyFileName,yytext,0,SectionInfo::Anchor);
Doxygen::sectionDict.insert(yytext,si);
current->anchors->append(si);
addOutput(yytext);
BEGIN( Comment );
}
<AnchorLabel>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
"Warning: \\anchor command has no label"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
BEGIN( Comment );
}
<AnchorLabel>. { // invalid character for anchor label
warn(yyFileName,yyLineNr,
"Warning: Invalid or missing anchor label"
);
BEGIN(Comment);
}
/* ----- handle arguments of the preformatted block commands ------- */
<FormatBlock>{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddot"|"endcode")/{NW} { // possible ends
addOutput(yytext);
if (&yytext[4]==blockName) // found end of the block
{
BEGIN(Comment);
}
}
<FormatBlock>[^ \@\\\n]* { // some word
addOutput(yytext);
}
<FormatBlock>{DOCNL} { // new line
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
}
<FormatBlock>. {
addOutput(*yytext);
}
<FormatBlock><<EOF>> {
warn(yyFileName,yyLineNr,
"Warning: reached end of comment while inside a @%s block; check for missing @end%s tag!",
blockName.data(),blockName.data()
);
yyterminate();
}
/* ----- handle arguments of if/ifnot commands ------- */
<GuardParam>{LABELID} { // parameter of if/ifnot guard
bool sectionEnabled = Config_getList("ENABLED_SECTIONS").find(yytext)!=-1;
bool parentEnabled = TRUE;
if (!guards.isEmpty()) parentEnabled = guards.top()->isEnabled();
if (parentEnabled)
{
if (
(sectionEnabled && guardType==Guard_If) ||
(!sectionEnabled && guardType==Guard_IfNot)
) // section is visible
{
guards.push(new GuardedSection(TRUE,TRUE));
BEGIN( Comment );
}
else // section is invisible
{
guards.push(new GuardedSection(FALSE,TRUE));
BEGIN( SkipGuardedSection );
}
}
else // invisible because of parent
{
guards.push(new GuardedSection(FALSE,FALSE));
BEGIN( SkipGuardedSection );
}
}
<GuardParam>{DOCNL} { // end of argument
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
BEGIN( Comment );
}
<GuardParam>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<GuardParam>. { // ignore other stuff
addOutput(*yytext);
}
/* ----- handle skipping of conditional sections ------- */
<SkipGuardedSection>{CMD}"ifnot"/{NW} {
guardType = Guard_IfNot;
BEGIN( GuardParam );
}
<SkipGuardedSection>{CMD}"if"/{NW} {
guardType = Guard_If;
BEGIN( GuardParam );
}
<SkipGuardedSection>{CMD}"endif"/{NW} {
if (guards.isEmpty())
{
warn(yyFileName,yyLineNr,
"Warning: found @endif without matching start command");
}
else
{
delete guards.pop();
BEGIN( Comment );
}
}
<SkipGuardedSection>{CMD}"else"/{NW}] {
if (guards.isEmpty())
{
warn(yyFileName,yyLineNr,
"Warning: found @else without matching start command");
}
else
{
if (guards.top()->parentVisible())
{
delete guards.pop();
guards.push(new GuardedSection(TRUE,TRUE));
BEGIN( Comment );
}
}
}
<SkipGuardedSection>{CMD}"elseif"/{NW} {
if (guards.isEmpty())
{
warn(yyFileName,yyLineNr,
"Warning: found @elseif without matching start command");
}
else
{
if (guards.top()->parentVisible())
{
delete guards.pop();
BEGIN( GuardParam );
}
}
}
<SkipGuardedSection>{DOCNL} { // skip line
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
}
<SkipGuardedSection>[^ \\@\n]+ { // skip non-special characters
}
<SkipGuardedSection>. { // any other character
}
/* ----- handle skipping of internal section ------- */
<SkipInternal>{DOCNL} { // skip line
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
}
<SkipInternal>[^ \\@\n]+ { // skip non-special characters
}
<SkipInternal>. { // any other character
}
/* ----- handle argument of name command ------- */
<NameParam>{DOCNL} { // end of argument
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
BEGIN( Comment );
}
<NameParam>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
nameHeader+=' ';
}
<NameParam>. { // ignore other stuff
nameHeader+=*yytext;
}
/* ----- handle argument of ingroup command ------- */
<InGroupParam>{ID} { // group id
current->groups->append(
new Grouping(yytext, Grouping::GROUPING_INGROUP)
);
BEGIN( Comment );
}
<InGroupParam>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
"Warning: Missing group name for \\ingroup command"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
BEGIN( Comment );
}
<InGroupParam>{LC} { // line continuation
yyLineNr++;
addOutput('\n');
}
<InGroupParam>. { // ignore other stuff
addOutput(*yytext);
}
/* ----- handle argument of fn command ------- */
<FnParam>{DOCNL} { // end of argument
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
parsePrototype(functionProto);
BEGIN( Comment );
}
<FnParam>{LC} { // line continuation
yyLineNr++;
functionProto+=' ';
}
<FnParam>[^@\\\n]+ { // non-special characters
functionProto+=yytext;
}
<FnParam>. { // add other stuff
functionProto+=*yytext;
}
/* ----- handle argument of overload command ------- */
<OverloadParam>{DOCNL} { // end of argument
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
if (functionProto.stripWhiteSpace().isEmpty())
{ // plain overload command
addOutput(getOverloadDocs());
}
else // overload declaration
{
makeStructuralIndicator(Entry::OVERLOADDOC_SEC);
parsePrototype(functionProto);
}
BEGIN( Comment );
}
<OverloadParam>{LC} { // line continuation
yyLineNr++;
functionProto+=' ';
}
<OverloadParam>. { // add other stuff
functionProto+=*yytext;
}
/* ----- handle argument of inherit command ------- */
<InheritParam>({ID}("::"|"."))*{ID} { // found argument
current->extends->append(
new BaseInfo(removeRedundantWhiteSpace(yytext),Public,Normal)
);
BEGIN( Comment );
}
<InheritParam>{DOCNL} { // missing argument
warn(yyFileName,yyLineNr,
"Warning: \\inherit command has no argument"
);
if (*yytext=='\n') yyLineNr++;
addOutput('\n');
BEGIN( Comment );
}
<InheritParam>. { // invalid character for anchor label
warn(yyFileName,yyLineNr,
"Warning: Invalid or missing name for \\inherit command"
);
BEGIN(Comment);
}
%%
//----------------------------------------------------------------------------
static void handleBrief(const QCString &)
{
//printf("handleBrief\n");
setOutput(OutputBrief);
}
static void handleFn(const QCString &)
{
makeStructuralIndicator(Entry::MEMBERDOC_SEC);
functionProto.resize(0);
BEGIN(FnParam);
}
static void handleDef(const QCString &)
{
makeStructuralIndicator(Entry::DEFINEDOC_SEC);
functionProto.resize(0);
BEGIN(FnParam);
}
static void handleOverload(const QCString &)
{
functionProto.resize(0);
BEGIN(OverloadParam);
}
static void handleEnum(const QCString &)
{
makeStructuralIndicator(Entry::ENUMDOC_SEC);
BEGIN(EnumDocArg1);
}
static void handleDefGroup(const QCString &)
{
makeStructuralIndicator(Entry::GROUPDOC_SEC);
current->groupDocType = Entry::GROUPDOC_NORMAL;
BEGIN( GroupDocArg1 );
}
static void handleAddToGroup(const QCString &)
{
makeStructuralIndicator(Entry::GROUPDOC_SEC);
current->groupDocType = Entry::GROUPDOC_ADD;
BEGIN( GroupDocArg1 );
}
static void handleWeakGroup(const QCString &)
{
makeStructuralIndicator(Entry::GROUPDOC_SEC);
current->groupDocType = Entry::GROUPDOC_WEAK;
BEGIN( GroupDocArg1 );
}
static void handleNamespace(const QCString &)
{
makeStructuralIndicator(Entry::NAMESPACEDOC_SEC);
BEGIN( NameSpaceDocArg1 );
}
static void handlePackage(const QCString &)
{
makeStructuralIndicator(Entry::PACKAGEDOC_SEC);
BEGIN( PackageDocArg1 );
}
static void handleClass(const QCString &)
{
makeStructuralIndicator(Entry::CLASSDOC_SEC);
BEGIN( ClassDocArg1 );
}
static void handleProtocol(const QCString &)
{ // Obj-C protocol
makeStructuralIndicator(Entry::PROTOCOLDOC_SEC);
BEGIN( ClassDocArg1 );
}
static void handleCategory(const QCString &)
{ // Obj-C category
makeStructuralIndicator(Entry::CATEGORYDOC_SEC);
BEGIN( CategoryDocArg1 );
}
static void handleUnion(const QCString &)
{
makeStructuralIndicator(Entry::UNIONDOC_SEC);
BEGIN( ClassDocArg1 );
}
static void handleStruct(const QCString &)
{
makeStructuralIndicator(Entry::STRUCTDOC_SEC);
BEGIN( ClassDocArg1 );
}
static void handleInterface(const QCString &)
{
makeStructuralIndicator(Entry::INTERFACEDOC_SEC);
BEGIN( ClassDocArg1 );
}
static void handleIdlException(const QCString &)
{
makeStructuralIndicator(Entry::EXCEPTIONDOC_SEC);
BEGIN( ClassDocArg1 );
}
static void handlePage(const QCString &)
{
makeStructuralIndicator(Entry::PAGEDOC_SEC);
BEGIN( PageDocArg1 );
}
static void handleMainpage(const QCString &)
{
makeStructuralIndicator(Entry::MAINPAGEDOC_SEC);
current->name = "mainpage";
BEGIN( PageDocArg2 );
}
static void handleFile(const QCString &)
{
makeStructuralIndicator(Entry::FILEDOC_SEC);
BEGIN( FileDocArg1 );
}
static void handleDir(const QCString &)
{
makeStructuralIndicator(Entry::DIRDOC_SEC);
BEGIN( FileDocArg1 );
}
static void handleExample(const QCString &)
{
makeStructuralIndicator(Entry::EXAMPLE_SEC);
BEGIN( FileDocArg1 );
}
static void handleDetails(const QCString &)
{
setOutput(OutputDoc);
}
static void handleName(const QCString &)
{
makeStructuralIndicator(Entry::MEMBERGRP_SEC);
nameHeader.resize(0);
BEGIN( NameParam );
}
static void handleTodo(const QCString &)
{
xrefKind = XRef_Todo;
setOutput(OutputXRef);
}
static void handleTest(const QCString &)
{
xrefKind = XRef_Test;
setOutput(OutputXRef);
}
static void handleBug(const QCString &)
{
xrefKind = XRef_Bug;
setOutput(OutputXRef);
}
static void handleDeprecated(const QCString &)
{
xrefKind = XRef_Deprecated;
setOutput(OutputXRef);
}
static void handleXRefItem(const QCString &)
{
xrefKind = XRef_Item;
setOutput(OutputXRef);
BEGIN(XRefItemParam1);
}
static void handleRelated(const QCString &)
{
BEGIN(RelatesParam1);
}
static void handleRelatedAlso(const QCString &)
{
current->relatesDup = TRUE;
BEGIN(RelatesParam1);
}
static void handleRefItem(const QCString &)
{
addOutput("@refitem ");
BEGIN(LineParam);
}
static void handleSection(const QCString &s)
{
addOutput("@"+s+" ");
BEGIN(SectionLabel);
}
static void handleAnchor(const QCString &)
{
BEGIN(AnchorLabel);
}
static void handleFormatBlock(const QCString &s)
{
addOutput("@"+s+" ");
//printf("handleFormatBlock(%s)\n",s.data());
blockName=s;
BEGIN(FormatBlock);
}
static void handleAddIndex(const QCString &)
{
addOutput("@addindex ");
BEGIN(LineParam);
}
static void handleIf(const QCString &)
{
guardType = Guard_If;
BEGIN(GuardParam);
}
static void handleIfNot(const QCString &)
{
guardType = Guard_IfNot;
BEGIN(GuardParam);
}
static void handleElseIf(const QCString &)
{
if (guards.isEmpty())
{
warn(yyFileName,yyLineNr,
"Warning: found @else without matching start command");
}
else
{
guardType = Guard_If;
BEGIN(GuardParam);
}
}
static void handleElse(const QCString &)
{
if (guards.isEmpty())
{
warn(yyFileName,yyLineNr,
"Warning: found @else without matching start command");
}
else
{
BEGIN( SkipGuardedSection );
}
}
static void handleEndIf(const QCString &)
{
if (guards.isEmpty())
{
warn(yyFileName,yyLineNr,
"Warning: found @endif without matching start command");
}
else
{
delete guards.pop();
}
}
static void handleIngroup(const QCString &)
{
BEGIN( InGroupParam );
}
static void handleNoSubGrouping(const QCString &)
{
current->subGrouping = FALSE;
}
static void handleShowInitializer(const QCString &)
{
current->initLines = 100000; // ON
}
static void handleHideInitializer(const QCString &)
{
current->initLines = 0; // OFF
}
static void handleCallgraph(const QCString &)
{
current->callGraph = TRUE; // ON
}
static void handleInternal(const QCString &)
{
if (!Config_getBool("INTERNAL_DOCS"))
{
BEGIN( SkipInternal );
}
else
{
addOutput("\\internal ");
}
}
static void handleLineBr(const QCString &)
{
addOutput('\n');
}
static void handleStatic(const QCString &)
{
current->stat = TRUE;
}
static void handlePure(const QCString &)
{
current->virt = Pure;
}
static void handlePrivate(const QCString &)
{
current->protection = Private;
}
static void handlePrivateSection(const QCString &)
{
current->protection = protection = Private;
}
static void handleProtected(const QCString &)
{
current->protection = Protected;
}
static void handleProtectedSection(const QCString &)
{
current->protection = protection = Protected ;
}
static void handlePublic(const QCString &)
{
current->protection = Public;
}
static void handlePublicSection(const QCString &)
{
current->protection = protection = Public;
}
static void handleInherit(const QCString &)
{
BEGIN(InheritParam);
}
//----------------------------------------------------------------------------
static void checkFormula()
{
if (YY_START==ReadFormulaShort || YY_START==ReadFormulaLong)
{
warn(yyFileName,yyLineNr,"Warning: End of comment block while inside formula.");
}
}
//----------------------------------------------------------------------------
bool parseCommentBlock(/* in,out */ Entry *curEntry,
/* in */ const QCString &comment,
/* in */ const QCString &fileName,
/* in */ int lineNr,
/* in */ bool isBrief,
/* in */ bool isJavaDocStyle,
/* in,out */ Protection &prot
)
{
//fprintf(stderr,"isBrief=%d isJavaDocStyle=%d\n",
// isBrief,isJavaDocStyle);
initParser();
guards.setAutoDelete(TRUE);
guards.clear();
//current_root = rootEntry;
current = curEntry;
//previous = prevEntry;
inputString = comment;
inputPosition = 0;
yyLineNr = lineNr;
yyFileName = fileName;
//inBody = foundInBody;
protection = prot;
needNewEntry = FALSE;
setOutput( isBrief || isJavaDocStyle ? OutputBrief : OutputDoc );
briefEndsAtDot = isJavaDocStyle;
commentScanYYrestart( commentScanYYin );
BEGIN( Comment );
commentScanYYlex();
setOutput( OutputDoc );
if (!guards.isEmpty())
{
warn(yyFileName,yyLineNr,"Documentation block ended in the middle of a conditional section!");
}
if (current->section==Entry::FILEDOC_SEC && current->doc.isEmpty())
{
// to allow a comment block with just a @file command.
current->doc="\n\n";
}
checkFormula();
prot = protection;
return needNewEntry;
}
#if 0
//----------------------------------------------------------------------------
void commentScanTest()
{
Entry *ce = new Entry;
Entry *pe = new Entry;
Entry *re = new Entry;
Protection prot=Public;
ce->doc.resize(0);ce->brief.resize(0);
parseCommentBlock(ce,pe,re,"@brief A brief description.\n\n"
"This is a @e simple test!\n","test.dox",
1,FALSE,FALSE,FALSE,prot);
printf("---------\nbrief test: result: brief=[%s] doc=[%s]\n",ce->brief.data(),ce->doc.data());
ce->doc.resize(0);ce->brief.resize(0);
parseCommentBlock(ce,pe,re,"@defgroup grp A group\n"
"This is a @c group definition.","test.dox",
1,FALSE,FALSE,FALSE,prot);
printf("---------\ndefgroup test: result: brief=[%s] doc=[%s]\n",ce->brief.data(),ce->doc.data());
ce->doc.resize(0);ce->brief.resize(0);
parseCommentBlock(ce,pe,re,"A code example:\n"
"@code\n"
"void main()\n"
"{\n"
" printf(\"Hello world\");\n"
"}\n"
"@endcode\n"
"More text follows.","test.dox",
1,FALSE,FALSE,FALSE,prot);
printf("---------\ncode test: result: brief=[%s] doc=[%s]\n",ce->brief.data(),ce->doc.data());
ce->doc.resize(0);ce->brief.resize(0);
parseCommentBlock(ce,pe,re,"Some text <!-- A comment --> and more.\n"
,"test.dox",
1,FALSE,FALSE,FALSE,prot);
printf("---------\nhtml comment test: result: brief=[%s] doc=[%s]\n",ce->brief.data(),ce->doc.data());
}
#endif
#if !defined(YY_FLEX_SUBMINOR_VERSION)
//----------------------------------------------------------------------------
extern "C" { // some bogus code to keep the compiler happy
void commentScanYYdummy() { yy_flex_realloc(0,0); }
}
#endif
......@@ -308,9 +308,11 @@ OPMASK ({BLANK}*{OPNORM}{FUNCARG})|({OPCAST}{FUNCARG})
LNKWORD1 ("::"|"#")?{SCOPEMASK}
CVSPEC {BLANK}*("const"|"volatile")
LNKWORD2 {SCOPEPRE}*"operator"{OPMASK}
WORD1 [^ \t\n\r\\@<>()\[\]:;\?{}&$#,.]+|"{"|"}"|("\""[^"\n]*"\"")
CHARWORD [^ \t\n\r\\@<>()\[\]:;\?{}&%$#,.]
CHARWORDQ [^ \t\n\r\\@<>()\[\]:;\?{}&%$#,."]
WORD1 "%"?{CHARWORD}+|"{"|"}"|("\""[^"\n]*"\"")
WORD2 "."|","|"("|")"|"["|"]"|":"|";"|"\?"
WORD1NQ [^ \t\n\r\\@<>()\[\]:;\?{}&$#,."]+
WORD1NQ "%"?{CHARWORDQ}+
WORD2NQ "."|","|"("|")"|"["|"]"|":"|";"|"\?"
HTMLTAG "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*">"
HTMLKEYL "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"sup"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p"
......
......@@ -566,10 +566,11 @@ static QCString convertLabel(const QCString &l)
switch(c)
{
case '\\': result+="\\\\"; break;
case '<': result+="\\<"; break;
case '>': result+="\\>"; break;
case '|': result+="\\|"; break;
default: result+=c; break;
case '<': result+="\\<"; break;
case '>': result+="\\>"; break;
case '|': result+="\\|"; break;
case '"': result+="\\\""; break;
default: result+=c; break;
}
}
return result;
......
......@@ -7839,7 +7839,7 @@ static const char *getArg(int argc,char **argv,int &optind)
//----------------------------------------------------------------------------
//extern void commentScanTest();
extern void commentScanTest();
void initDoxygen()
{
......@@ -7868,8 +7868,6 @@ void initDoxygen()
Doxygen::lookupCache.setAutoDelete(TRUE);
Doxygen::directories.setAutoDelete(TRUE);
Doxygen::dirRelations.setAutoDelete(TRUE);
// commentScanTest();
}
void cleanUpDoxygen()
......
......@@ -722,7 +722,7 @@ void HtmlDocVisitor::visitPre(DocImage *img)
}
m_t << "<div align=\"center\">" << endl;
m_t << "<img src=\"" << img->relPath() << img->name() << "\" alt=\""
<< baseName << "\"" << htmlAttribsToString(img->attribs()) << ">" << endl;
<< baseName << "\"" << ">" << endl;
if (img->hasCaption())
{
m_t << "<p><strong>";
......
......@@ -14,7 +14,7 @@
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="member" type="MemberType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="refid" type="xsd:Name" use="required"/>
<xsd:attribute name="refid" type="xsd:string" use="required"/>
<xsd:attribute name="kind" type="CompoundKind" use="required"/>
</xsd:complexType>
......@@ -22,7 +22,7 @@
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="refid" type="xsd:Name" use="required"/>
<xsd:attribute name="refid" type="xsd:string" use="required"/>
<xsd:attribute name="kind" type="MemberKind" use="required"/>
</xsd:complexType>
......
......@@ -14,7 +14,7 @@
" <xsd:element name=\"name\" type=\"xsd:string\"/>\n"
" <xsd:element name=\"member\" type=\"MemberType\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n"
" </xsd:sequence>\n"
" <xsd:attribute name=\"refid\" type=\"xsd:Name\" use=\"required\"/>\n"
" <xsd:attribute name=\"refid\" type=\"xsd:string\" use=\"required\"/>\n"
" <xsd:attribute name=\"kind\" type=\"CompoundKind\" use=\"required\"/>\n"
" </xsd:complexType>\n"
"\n"
......@@ -22,7 +22,7 @@
" <xsd:sequence>\n"
" <xsd:element name=\"name\" type=\"xsd:string\"/>\n"
" </xsd:sequence>\n"
" <xsd:attribute name=\"refid\" type=\"xsd:Name\" use=\"required\"/>\n"
" <xsd:attribute name=\"refid\" type=\"xsd:string\" use=\"required\"/>\n"
" <xsd:attribute name=\"kind\" type=\"MemberKind\" use=\"required\"/>\n"
" </xsd:complexType>\n"
" \n"
......
......@@ -182,6 +182,8 @@ bool setTranslator(const char *langName)
{
theTranslator=new TranslatorJapanese;
}
#endif
#ifdef LANG_JE
else if (L_EQUAL("japanese-en"))
{
theTranslator=new TranslatorJapaneseEn;
......@@ -236,6 +238,8 @@ bool setTranslator(const char *langName)
{
theTranslator=new TranslatorKorean;
}
#endif
#ifdef LANG_KE
else if (L_EQUAL("korean-en"))
{
theTranslator=new TranslatorKoreanEn;
......
......@@ -22,6 +22,7 @@ HEADERS = bufstr.h \
cmdmapper.h \
code.h \
commentcnv.h \
commentscan.h \
compound_xsd.h \
config.h \
constexp.h \
......@@ -183,8 +184,8 @@ SOURCES = ce_lex.cpp \
util.cpp \
version.cpp \
xmldocvisitor.cpp \
xmlgen.cpp
# commentscan.cpp
xmlgen.cpp \
commentscan.cpp
win32:TMAKE_CXXFLAGS += -DQT_NODLL
win32-msvc:TMAKE_CXXFLAGS += -Zm200
......
......@@ -402,12 +402,12 @@ static void returnCharToStream(char c)
static inline void addTillEndOfString(const QCString &expr,QCString *rest,
uint &pos,char term,QCString &arg)
{
char cc;
int cc;
while ((cc=getNextChar(expr,rest,pos))!=EOF)
{
if (cc=='\\') arg+=cc,cc=getNextChar(expr,rest,pos);
if (cc=='\\') arg+=(char)cc,cc=getNextChar(expr,rest,pos);
else if (cc==term) return;
arg+=cc;
arg+=(char)cc;
}
}
......
......@@ -23,7 +23,13 @@
class OutputList;
class Entry;
extern void parseMain(Entry *);
extern void parseMain(Entry *,const char *fileName);
// Public interface provided by the language scanner
void parseMain(Entry *);
void parseMain(Entry *,const char *fileName);
// Internal callback interface for comment block scanner
void parsePrototype(const QCString &text);
void handleGroupStartCommand(const char *header);
void handleGroupEndCommand();
#endif
......@@ -45,7 +45,9 @@
#include "membergroup.h"
#include "reflist.h"
#include "code.h"
#include "commentscan.h"
#define COMMENTSCAN
#define YY_NEVER_INTERACTIVE 1
......@@ -176,6 +178,12 @@ static QCString docBackup;
static QCString briefBackup;
static bool g_inputFromFile;
static int docBlockContext;
static QCString docBlock;
static QCString docBlockName;
static bool docBlockInBody;
static bool docBlockJavaStyle;
//-----------------------------------------------------------------------------
......@@ -257,7 +265,9 @@ static int newMemberGroupId()
}
// forward declarations
#ifndef COMMENTSCAN
static void startGroup();
#endif
static void startGroupInDoc();
static void endGroup();
......@@ -305,6 +315,74 @@ static void newDocState();
//-----------------------------------------------------------------
static void addMemberGroupDocs()
{
memberGroupDocs=current->brief.stripWhiteSpace();
current->doc = current->doc.stripWhiteSpace();
if (!memberGroupDocs.isEmpty() && !current->doc.isEmpty())
{
memberGroupDocs+="\n\n";
}
memberGroupDocs+=current->doc;
MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(memberGroupId);
if (info)
{
info->doc = memberGroupDocs;
info->docFile = yyFileName;
}
current->doc.resize(0);
current->brief.resize(0);
}
//-----------------------------------------------------------------
static void handleCommentBlock(const QCString &doc,bool brief)
{
if (brief)
{
current->briefFile = yyFileName;
current->briefLine = yyLineNr;
}
else
{
current->docFile = yyFileName;
current->docLine = yyLineNr;
}
if (docBlockInBody)
{
if (previous==0)
{
ASSERT(previous!=0); // shouldn't happen
return;
}
if (!previous->doc.isEmpty())
{ // start a new paragraph for the next piece of text found in the body
previous->doc=previous->doc.stripWhiteSpace()+"\n\n";
}
}
if (parseCommentBlock(
docBlockInBody ? previous : current,
doc, // text
yyFileName, // file
yyLineNr, // line
docBlockInBody ? FALSE : brief,
docBlockInBody ? FALSE : docBlockJavaStyle,
protection)
) // need to start a new entry
{
if (current->section==Entry::MEMBERGRP_SEC)
{
addMemberGroupDocs();
}
current_root->addSubEntry(current);
previous = current;
current = new Entry ;
initEntry();
}
}
//-----------------------------------------------------------------
static void addXRefItem(bool inBody,const char *listName,const char *itemTitle,const char *listTitle)
{
Entry *docEntry = inBody && previous ? previous : current;
......@@ -617,6 +695,7 @@ static void addKnRArgInfo(const QCString &type,const QCString &name,
}
}
//-----------------------------------------------------------------------------
/* ----------------------------------------------------------------- */
#undef YY_INPUT
#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
......@@ -849,6 +928,12 @@ IDLATTR ("["[^\]]*"]"){BN}*
%x ReadFormulaLong
%x AnchorLabel
/** new comment parsing states */
%x DocLine
%x DocBlock
%x DocCopyBlock
%%
<*>\x06[^\x06]*\x06 { // new file
......@@ -2036,7 +2121,11 @@ IDLATTR ("["[^\]]*"]"){BN}*
BEGIN(AfterDoc);
}
}
<FindMembers,FindFields>("//"([!/]?){B}*{CMD}"{")|("/*"([!*]?){B}*{CMD}"{") {
#ifdef COMMENTSCAN
REJECT;
#else
startGroup();
tmpDocType=-1;
if (current_root->section & Entry::SCOPE_MASK)
......@@ -2064,8 +2153,12 @@ IDLATTR ("["[^\]]*"]"){BN}*
removeSlashes=FALSE;
BEGIN( Doc );
}
#endif
}
<FindMembers,FindFields,ReadInitializer>"//"([!/]?){B}*{CMD}"}".*|"/*"([!*]?){B}*{CMD}"}".*"*/" {
#ifdef COMMENTSCAN
REJECT;
#else
if (memberGroupId==DOX_NOGROUP && autoGroupStack.isEmpty())
{
warn(yyFileName,yyLineNr,
......@@ -2074,6 +2167,7 @@ IDLATTR ("["[^\]]*"]"){BN}*
//printf("end of member group marker ends group %d\n",memberGroupId);
endGroup();
memberGroupHeader.resize(0);
#endif
}
<FindMembers>"=" {
current->bodyLine = yyLineNr;
......@@ -4043,7 +4137,15 @@ IDLATTR ("["[^\]]*"]"){BN}*
memberGroupInside = current->inside.copy();
}
}
#ifdef COMMENTSCAN
docBlockContext = YY_START;
docBlockInBody = YY_START==SkipCurly;
docBlockJavaStyle = FALSE;
docBlock.resize(0);
BEGIN( DocBlock );
#else
BEGIN( Doc );
#endif
}
<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,Bases,OldStyleArgs>("//"{B}*)?"/**"/[^/*] {
removeSlashes=(yytext[1]=='/');
......@@ -4057,6 +4159,28 @@ IDLATTR ("["[^\]]*"]"){BN}*
memberGroupInside = current->inside.copy();
}
}
#ifdef COMMENTSCAN
current->docLine = yyLineNr;
current->docFile = yyFileName;
docBlockContext = YY_START;
docBlockInBody = YY_START==SkipCurly;
docBlockJavaStyle = Config_getBool("JAVADOC_AUTOBRIEF");
docBlock.resize(0);
if (docBlockJavaStyle)
{
current->briefLine = yyLineNr;
current->briefFile = yyFileName;
}
if (!docBlockInBody)
{
current->doc.resize(0);
if (docBlockJavaStyle)
{
current->brief.resize(0);
}
}
BEGIN( DocBlock );
#else
if (!Config_getBool("JAVADOC_AUTOBRIEF")) // use the Qt style
{
current->docLine = yyLineNr;
......@@ -4095,6 +4219,7 @@ IDLATTR ("["[^\]]*"]"){BN}*
BEGIN( JavaDoc );
}
}
#endif
}
<FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>"//!" {
if (YY_START!=SkipCurly)
......@@ -4113,7 +4238,15 @@ IDLATTR ("["[^\]]*"]"){BN}*
memberGroupInside = current->inside.copy();
}
}
#ifdef COMMENTSCAN
docBlockContext = YY_START;
docBlockInBody = YY_START==SkipCurly;
docBlockJavaStyle = FALSE;
docBlock.resize(0);
BEGIN( DocLine );
#else
BEGIN( LineDoc );
#endif
}
<FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>"///"/[^/] {
if (YY_START!=SkipCurly)
......@@ -4132,7 +4265,15 @@ IDLATTR ("["[^\]]*"]"){BN}*
memberGroupInside = current->inside.copy();
}
}
#ifdef COMMENTSCAN
docBlockContext = YY_START;
docBlockInBody = YY_START==SkipCurly;
docBlockJavaStyle = FALSE;
docBlock.resize(0);
BEGIN( DocLine );
#else
BEGIN( LineDoc );
#endif
}
<FindMembers>"extern"{BN}*"\"C"("++")?"\""{BN}*("{")? {
lineCount();
......@@ -4200,6 +4341,91 @@ IDLATTR ("["[^\]]*"]"){BN}*
<CSAccessorDecl>"get" { if (curlyCount==0) current->memSpec |= Entry::Gettable; }
<CSAccessorDecl>. {}
<CSAccessorDecl>\n { yyLineNr++; }
/**********************************************************************************/
/******************** Documentation block related rules ***************************/
/**********************************************************************************/
/* ---- Single line comments ------ */
<DocLine>[^\n]*"\n" { // whole line
yyLineNr++;
handleCommentBlock(yytext,TRUE);
BEGIN( docBlockContext );
}
/* ---- Comments blocks ------ */
<DocBlock>"*/" { // end of comment block
handleCommentBlock(docBlock,FALSE);
BEGIN(docBlockContext);
}
<DocBlock>^{B}*"*"+/{BN}+ { // start of a comment line
}
<DocBlock>("@@"|"\\\\"){ID} { // escaped command
docBlock+=yytext;
}
<DocBlock>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"dot"|"code")/[^a-z_A-Z0-9] { // verbatim command (which could contain nested comments!)
docBlock+=yytext;
docBlockName=&yytext[1];
BEGIN(DocCopyBlock);
}
<DocBlock>[^@*\\\n]+ { // any character that isn't special
docBlock+=yytext;
}
<DocBlock>\n { // newline
yyLineNr++;
docBlock+=*yytext;
}
<DocBlock>. { // command block
docBlock+=*yytext;
}
/* ---- Copy verbatim sections ------ */
<DocCopyBlock>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddot"|"endcode")/[^a-z_A-Z0-9] { // end of verbatim block
docBlock+=yytext;
if (&yytext[4]==docBlockName)
{
BEGIN(DocBlock);
}
}
<DocCopyBlock>^{B}*"*"+/{BN}+ { // start of a comment line
if (docBlockName=="verbatim")
{
REJECT;
}
}
<DocCopyBlock>[^@\*\\\n]+ { // any character that is not special
docBlock+=yytext;
}
<DocCopyBlock>\n { // newline
docBlock+=*yytext;
yyLineNr++;
}
<DocCopyBlock>. { // any other character
docBlock+=*yytext;
}
<DocCopyBlock><<EOF>> {
warn(yyFileName,yyLineNr,
"Warning: reached end of file while inside a %s block!\n",
docBlockName.data());
yyterminate();
}
/*************************************************************************/
/*** The next part is obsolete and will be removed */
<JavaDoc>{CMD}("brief"|"short"){B}+ {
lastBriefContext=tmpDocType;
BEGIN( ClassDocBrief );
......@@ -4211,6 +4437,8 @@ IDLATTR ("["[^\]]*"]"){BN}*
BEGIN( tmpDocType );
}
}
/*
<JavaDoc>"@" {
unput(*yytext);
......@@ -5863,6 +6091,12 @@ IDLATTR ("["[^\]]*"]"){BN}*
current->brief+=yytext;
}
<DefLineDoc,LineDoc,ClassDoc,PageDoc,Doc>"/*"|"//" { current->doc += yytext; }
/**** End of obsolete part */
/***********************************************************************/
<SkipCxxComment>.*/\n {
BEGIN( lastCContext ) ;
}
......@@ -5908,6 +6142,7 @@ IDLATTR ("["[^\]]*"]"){BN}*
//----------------------------------------------------------------------------
#ifndef COMMENTSCAN
static void startGroup()
{
if (!lastDefGroup.groupname.isEmpty())
......@@ -5944,6 +6179,7 @@ static void startGroup()
lastMemberGroupLine = yyLineNr;
}
}
#endif
static void startGroupInDoc()
{
......@@ -6221,6 +6457,72 @@ void parseMain(Entry *rt)
#endif
void parsePrototype(const QCString &text)
{
//printf("**** parsePrototype(%s) begin\n",text.data());
const char *orgInputString;
int orgInputPosition;
YY_BUFFER_STATE orgState;
bool orgInputFromFile;
// save scanner state
orgState = YY_CURRENT_BUFFER;
yy_switch_to_buffer(yy_create_buffer(scanYYin, YY_BUF_SIZE));
orgInputString = inputString;
orgInputPosition = inputPosition;
orgInputFromFile = g_inputFromFile;
// set new string
inputString = text;
inputPosition = 0;
g_inputFromFile = FALSE;
scanYYrestart( scanYYin );
BEGIN(ClassDocFunc);
scanYYlex();
// restore original scanner state
yy_switch_to_buffer(orgState);
inputString = orgInputString;
inputPosition = orgInputPosition;
g_inputFromFile = orgInputFromFile;
//printf("**** parsePrototype end\n");
}
Entry *startNewEntry()
{
// make copy of documentation up till now
QCString doc = current->doc;
QCString brief = current->brief;
current->doc.resize(0);
current->brief.resize(0);
// create new entry
current_root->addSubEntry(current);
previous = current;
current = new Entry ;
initEntry();
// move documentation to this entry
current->doc = doc;
current->brief = brief;
return current;
}
void handleGroupStartCommand(const char *header)
{
memberGroupHeader=header;
startGroupInDoc();
}
void handleGroupEndCommand()
{
endGroup();
}
//----------------------------------------------------------------------------
#if !defined(YY_FLEX_SUBMINOR_VERSION)
......
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