diff options
68 files changed, 1181 insertions, 226 deletions
@@ -1,7 +1,7 @@ -DOXYGEN Version 1.7.1-20100822 +DOXYGEN Version 1.7.1-20100920 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (22 August 2010) +Dimitri van Heesch (20 September 2010) @@ -1,4 +1,4 @@ -DOXYGEN Version 1.7.1_20100822 +DOXYGEN Version 1.7.1_20100920 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) (22 August 2010) +Dimitri van Heesch (dimitri@stack.nl) (20 September 2010) @@ -20,7 +20,7 @@ doxygen_version_minor=7 doxygen_version_revision=1 #NOTE: Setting version_mmn to "NO" will omit mmn info from the package. -doxygen_version_mmn=20100822 +doxygen_version_mmn=20100920 bin_dirs=`echo $PATH | sed -e "s/:/ /g"` diff --git a/doc/commands.doc b/doc/commands.doc index 8884b36..69f22e7 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -65,6 +65,7 @@ documentation: \refitem cmddontinclude \\dontinclude \refitem cmddot \\dot \refitem cmddotfile \\dotfile +\refitem cmdmscfile \\mscfile \refitem cmde \\e \refitem cmdelse \\else \refitem cmdelseif \\elseif @@ -320,7 +321,8 @@ Structural indicators \addindex \\dir Indicates that a comment block contains documentation for a directory. The "path fragment" argument should include the directory name and - enough of the path to be unique w.r.t. the other directories in the project. + enough of the path to be unique with respect to the other directories + in the project. The \ref cfg_show_dirs "SHOW_DIRECTORIES" option determines whether or not the directory information is shown and the \ref cfg_strip_from_path "STRIP_FROM_PATH" option determines what is @@ -1288,6 +1290,14 @@ void memcpy(void *dest, const void *src, size_t n); sectioning command is encountered. See section \ref cmdfn "\\fn" for an example. + Note that for PHP one can also specify the type (or types if you + separate them with a pipe symbol) which are allowed for a parameter + (as this is not part of the definition). + The syntax is the same as for phpDocumentor, i.e. +\verbatim +@param datatype1|datatype2 $paramname description +\endverbatim + <hr> \section cmdtparam \\tparam <template-parameter-name> { description } @@ -2046,7 +2056,7 @@ class C {}; Here is an example of the use of the \\msc command. \code /** Sender class. Can be used to send a command to the server. - * The receiver will acknowlegde the command by calling Ack(). + * The receiver will acknowledge the command by calling Ack(). * \msc * Sender,Receiver; * Sender->Receiver [label="Command()", URL="\ref Receiver::Command()"]; @@ -2096,6 +2106,24 @@ class Receiver stripped before the caption is displayed. <hr> +\section cmdmscfile \\mscfile <file> ["caption"] + + \addindex \\mscfile + Inserts an image generated by mscgen from \<file\> into the documentation. + + The first argument specifies the file name of the image. + doxygen will look for files in the paths (or files) that you specified + after the \ref cfg_mscfile_dirs "MSCFILE_DIRS" tag. + If the msc file is found it will be used as an input file to the mscgen tool. + The resulting image will be put into the correct output directory. + If the dot file name contains spaces you'll have to put quotes ("...") around it. + + The second argument is optional and can be used to specify the caption + that is displayed below the image. This argument has to be specified + between quotes even if it does not contain any spaces. The quotes are + stripped before the caption is displayed. + +<hr> \section cmde \\e <word> \addindex \\e @@ -2265,7 +2293,7 @@ class Receiver If the image is found it will be copied to the correct output directory. If the image name contains spaces you'll have to put quotes ("...") around it. You can also specify an absolute URL instead of a file name, but then - doxygen does not copy the image nor check its existance. + doxygen does not copy the image nor check its existence. The third argument is optional and can be used to specify the caption that is displayed below the image. This argument has to be specified @@ -2506,7 +2534,7 @@ class Receiver \addindex \\\" This command writes the \" character to the output. This character has to be escaped in some cases, because it is used in pairs - to indicate an unformated text fragment. + to indicate an unformatted text fragment. <hr> \htmlonly <center> \endhtmlonly diff --git a/doc/config.doc b/doc/config.doc index aff842a..eb8a8bb 100644 --- a/doc/config.doc +++ b/doc/config.doc @@ -103,6 +103,7 @@ followed by the descriptions of the tags grouped by category. \refitem cfg_example_recursive EXAMPLE_RECURSIVE \refitem cfg_exclude EXCLUDE \refitem cfg_exclude_patterns EXCLUDE_PATTERNS +\refitem cfg_exclude_symbols EXCLUDE_SYMBOLS \refitem cfg_exclude_symlinks EXCLUDE_SYMLINKS \refitem cfg_expand_as_defined EXPAND_AS_DEFINED \refitem cfg_expand_only_predef EXPAND_ONLY_PREDEF @@ -189,6 +190,7 @@ followed by the descriptions of the tags grouped by category. \refitem cfg_man_output MAN_OUTPUT \refitem cfg_max_dot_graph_depth MAX_DOT_GRAPH_DEPTH \refitem cfg_max_initializer_lines MAX_INITIALIZER_LINES +\refitem cfg_mscfile_dirs MSCFILE_DIRS \refitem cfg_mscgen_path MSCGEN_PATH \refitem cfg_multiline_cpp_is_brief MULTILINE_CPP_IS_BRIEF \refitem cfg_optimize_for_fortran OPTIMIZE_FOR_FORTRAN @@ -442,7 +444,7 @@ followed by the descriptions of the tags grouped by category. If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to include (a tag file for) the STL sources as input, then you should set this tag to \c YES in order to let doxygen match functions declarations and - definitions whose arguments contain STL classes (e.g. func(std::string); v.s. + definitions whose arguments contain STL classes (e.g. func(std::string); versus func(std::string) {}). This also make the inheritance and collaboration diagrams that involve STL classes more complete and accurate. @@ -483,9 +485,9 @@ followed by the descriptions of the tags grouped by category. \addindex MULTILINE_CPP_IS_BRIEF The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen treat a multi-line C++ special comment block (i.e. a block of //! or /// - comments) as a brief description. This used to be the default behaviour. + comments) as a brief description. This used to be the default behavior. The new default is to treat a multi-line C++ comment block as a detailed - description. Set this tag to YES if you prefer the old behaviour instead. + description. Set this tag to YES if you prefer the old behavior instead. Note that setting this tag to YES also means that rational rose comments are not recognized any more. @@ -605,10 +607,10 @@ followed by the descriptions of the tags grouped by category. For small to medium size projects (<1000 input files) the default value is probably good enough. For larger projects a too small cache size can cause doxygen to be busy swapping symbols to and from disk most of the time - causing a significant performance penality. + causing a significant performance penalty. If the system has enough physical memory increasing the cache will improve the performance by keeping more symbols in memory. Note that the value works on - a logarithmic scale so increasing the size by one will rougly double the + a logarithmic scale so increasing the size by one will roughly double the memory usage. The cache size is given by this formula: \f$2^{(16+\mbox{SYMBOL\_CACHE\_SIZE})}\f$. The valid range is 0..9, the default is 0, corresponding to a cache size of \f$2^{16} = 65536\f$ symbols. @@ -899,7 +901,7 @@ function's detailed documentation block. \anchor cfg_warn_no_paramdoc <dt>\c WARN_NO_PARAMDOC <dd> \addindex WARN_NO_PARAMDOC - This \c WARN_NO_PARAMDOC option can be abled to get warnings for + This \c WARN_NO_PARAMDOC option can be enabled to get warnings for functions that are documented, but have no documentation for their parameters or return value. If set to \c NO (the default) doxygen will only warn about wrong or incomplete parameter documentation, but not about the absence of @@ -1029,6 +1031,14 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn" \c EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude certain files from those directories. +\anchor cfg_exclude_symbols +<dt>\c EXCLUDE_SYMBOLS <dd> +The \c EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +(namespaces, classes, functions, etc.) that should be excluded from the +output. The symbol name can be a fully qualified name, a word, or if the +wildcard * is used, a substring. Examples: ANamespace, AClass, +AClass::ANamespace, ANamespace::*Test + Note that the wildcards are matched against the file with absolute path, so to exclude all test directories use the pattern <code>*</code><code>/test/</code><code>*</code> @@ -1527,7 +1537,7 @@ implemented using a PHP enabled web server instead of at the web client using Javascript. Doxygen will generate the search PHP script and index file to put on the web server. The advantage of the server based approach is that it scales better to large projects and also allows -full text search. The disadvances is that it is more difficult to setup +full text search. The disadvantages are that it is more difficult to setup and does not have live searching capabilities. \anchor cfg_disable_index @@ -1559,7 +1569,7 @@ and does not have live searching capabilities. Windows users are probably better off using the HTML help feature. Via custom stylesheets (see \ref cfg_html_stylesheet "HTML_STYLESHEET") - one can further \ref doxygen_finetune "fine tune" the look of the index. + one can further \ref doxygen_finetune "fine-tune" the look of the index. As an example, the default style sheet generated by doxygen has an example that shows how to put an image at the root of the tree instead of the \ref cfg_project_name "project name". @@ -1649,12 +1659,11 @@ and Class Hierarchy pages using a tree view instead of an ordered list. by the printer. Possible values are: <ul> <li><code>a4</code> (210 x 297 mm). - <li><code>a4wide</code> (same as a4, but including the a4wide package). <li><code>letter</code> (8.5 x 11 inches). <li><code>legal</code> (8.5 x 14 inches). <li><code>executive</code> (7.25 x 10.5 inches) </ul> - If left blank a4wide will be used. + If left blank a4 will be used. \anchor cfg_extra_packages <dt>\c EXTRA_PACKAGES <dd> @@ -2044,16 +2053,15 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre> \addindex CLASS_DIAGRAMS If the \c CLASS_DIAGRAMS tag is set to \c YES (the default) doxygen will generate a class diagram (in HTML and \f$\mbox{\LaTeX}\f$) for classes with base or - super classes. Setting the tag to \c NO turns the diagrams off. - Note that this option is superseded by the HAVE_DOT option below. - This is only a fallback. It is recommended to install and use dot, - since it yields more powerful graphs. +super classes. Setting the tag to NO turns the diagrams off. Note that +this option also works with HAVE_DOT disabled, but it is recommended to +install and use dot, since it yields more powerful graphs. \anchor cfg_mscgen_path <dt>\c MSCGEN_PATH <dd> \addindex MSCGEN_PATH You can define message sequence charts within doxygen comments using the \ref cmdmsc "\\msc" - command. Doxygen will then run the <a href="http://www.mcternan.me.uk/mscgen/">msgen tool</a>) to + command. Doxygen will then run the <a href="http://www.mcternan.me.uk/mscgen/">mscgen tool</a>) to produce the chart and insert it in the documentation. The <code>MSCGEN_PATH</code> tag allows you to specify the directory where the mscgen tool resides. If left empty the tool is assumed to be found in the default search path. @@ -2249,7 +2257,14 @@ The default size is 10pt. \addindex DOTFILE_DIRS This tag can be used to specify one or more directories that contain dot files that are included in the documentation (see the - \\dotfile command). + \ref cmddotfile "\\dotfile" command). + +\anchor cfg_mscfile_dirs +<dt>\c MSCFILE_DIRS <dd> + \addindex MSCFILE_DIRS + This tag can be used to specify one or more directories that + contain msc files that are included in the documentation (see the + \ref cmdmscfile "\\mscfile" command). \anchor cfg_dot_transparent <dt>\c DOT_TRANSPARENT <dd> diff --git a/doc/customize.doc b/doc/customize.doc index 40ef398..c769c75 100644 --- a/doc/customize.doc +++ b/doc/customize.doc @@ -18,7 +18,7 @@ Doxygen provides various levels of customization. The \ref minor_tweaks "first section" discusses what to -do if you want to do minor tweaker to the look and feel of the output. +do if you want to do minor tweaking to the look and feel of the output. The \ref layout "next" section show how to reorder and hide certain information on a page. The \ref xmlgenerator "last" section show how to generate whatever output @@ -27,7 +27,7 @@ you want based on the XML output produced by doxygen. \section minor_tweaks Minor Tweaks To simply tweak things like fonts or colors, margins, or other look \& feel -espects of the HTML output you can create a different +expects of the HTML output you can create a different <a href="http://www.w3schools.com/css/default.asp">cascading style sheet</a>. You can also let doxygen use a custom header and footer for each HTML page it generates, for instance to include a logo or to make the @@ -231,7 +231,7 @@ The file page has the following specific tags: The group page has a specific \c groupgraph tag which represents the graph showing the dependencies between groups. -Similarily, the directory page has a specific \c directorygraph tag +Similarly, the directory page has a specific \c directorygraph tag which represents the graph showing the dependencies between the directories based on the \#include relations of the files inside the directories. diff --git a/doc/diagrams.doc b/doc/diagrams.doc index 7e07cef..06431ee 100644 --- a/doc/diagrams.doc +++ b/doc/diagrams.doc @@ -77,7 +77,7 @@ dashed pattern the inheritance relation is virtual. <li> A \b white box indicates that the documentation of the class is currently shown. - <li> A \b grey box indicates an undocumented class. + <li> A \b gray box indicates an undocumented class. <li> A <b>solid dark blue</b> arrow indicates public inheritance. <li> A <b>dashed dark green</b> arrow indicates protected inheritance. <li> A <b>dotted dark green</b> arrow indicates private inheritance. @@ -112,7 +112,7 @@ <li> A <b>dark green</b> arrow indicates protected inheritance. <li> A <b>dark red</b> arrow indicates private inheritance. <li> A <b>purple dashed</b> arrow indicated a "usage" relation, the - edge of the arrow is labled with the variable(s) responsible for the + edge of the arrow is labeled with the variable(s) responsible for the relation. Class \c A uses class \c B, if class \c A has a member variable \c m of type C, where B is a subtype of C (e.g. C could be \c B, \c B*, <code>T\<B\>*</code> ). diff --git a/doc/docblocks.doc b/doc/docblocks.doc index aa9e873..41f5d99 100644 --- a/doc/docblocks.doc +++ b/doc/docblocks.doc @@ -155,7 +155,7 @@ The option has the same effect for multi-line special C++ comments: or \verbatim -//! Brief descripion. +//! Brief description. //! Detailed description //! starts here. @@ -205,7 +205,7 @@ for the Qt style. By default a JavaDoc style documentation block behaves the same way as a Qt style documentation block. This is not according the JavaDoc specification however, where the first sentence of the documentation block is automatically -treated as a brief description. To enable this behaviour you should set +treated as a brief description. To enable this behavior you should set \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" to YES in the configuration file. If you enable this option and want to put a dot in the middle of a sentence without ending it, you should put a backslash and a space after it. @@ -426,7 +426,7 @@ Go to the <a href="lists.html">next</a> section or return to the For VHDL a comment normally start with "--". Doxygen will extract comments starting with "--!". There are only two types of comment blocks in VHDL; -a one line --! comment representing a brief description, and a multiline +a one line --! comment representing a brief description, and a multi-line --! comment (where the --! prefix is repeated for each line) representing a detailed description. @@ -453,7 +453,7 @@ settings where overruled. When using doxygen for Fortran code you should set \ref cfg_optimize_for_fortran "OPTIMIZE_FOR_FORTRAN" to \c YES. -For fortran "!>" or "!<" starts a comment and "!!" or "!>" can be used to +For Fortran "!>" or "!<" starts a comment and "!!" or "!>" can be used to continuate a one line comment into a multi-line comment. Here is an example of a documented Fortran subroutine: diff --git a/doc/doxygen_usage.doc b/doc/doxygen_usage.doc index 3529e8d..8f23b22 100644 --- a/doc/doxygen_usage.doc +++ b/doc/doxygen_usage.doc @@ -49,7 +49,7 @@ with the -u option. \verbatim doxygen -u <config_file> \endverbatim -All configuration settings in the orginal configuration file will be copied +All configuration settings in the original configuration file will be copied to the new configuration file. Any new options will have their default value. Note that comments that you may have added in the original configuration file will be lost. diff --git a/doc/faq.doc b/doc/faq.doc index e108d9b..1da9c30 100644 --- a/doc/faq.doc +++ b/doc/faq.doc @@ -199,7 +199,7 @@ EXCLUDE_PATTERNS = */test/* Put a \% in front of the class name. Like this: \%MyClass. Doxygen will then remove the % and keep the word unlinked. -<li><b>My favourite programming language is X. Can I still use doxygen?</b> +<li><b>My favorite programming language is X. Can I still use doxygen?</b> No, not as such; doxygen needs to understand the structure of what it reads. If you don't mind spending some time on it, there are several options: @@ -237,7 +237,7 @@ various buffers and then run "texconfig init". <li><b>Why are dependencies via STL classes not shown in the dot graphs?</b> -Doxygen is unware of the STL classes, unless the option BUILTIN_STL_SUPPORT is +Doxygen is unaware of the STL classes, unless the option BUILTIN_STL_SUPPORT is turned on. <li><b>I have problems getting the search engine to work with PHP5 and/or windows</b> @@ -248,7 +248,7 @@ Please read <a href="searchengine.html">this</a> for hints on where to look. Not via command line options, but doxygen can read from <code>stdin</code>, so you can pipe things through it. Here's an example how to override an option -in a configuration file from the command line (assuming a unix environment): +in a configuration file from the command line (assuming a UNIX environment): \verbatim ( cat Doxyfile ; echo "PROJECT_NUMBER=1.0" ) | doxygen - diff --git a/doc/features.doc b/doc/features.doc index c1615ec..9f0164f 100644 --- a/doc/features.doc +++ b/doc/features.doc @@ -92,7 +92,7 @@ for the generated output. <li>Doxygen can generate a layout which you can use and edit to change the layout of each page. -<li>There more than a 100 configurable options to finetune the output. +<li>There more than a 100 configurable options to fine-tune the output. <li>Can cope with large projects easily. </UL> diff --git a/doc/grouping.doc b/doc/grouping.doc index 766109d..d2244b4 100644 --- a/doc/grouping.doc +++ b/doc/grouping.doc @@ -20,7 +20,7 @@ Doxygen has three mechanisms to group things together. One mechanism works at a global level, creating a new page for each group. These groups are called \ref modules "'modules'" in the documentation. The second mechanism works within a member list of some compound entity, -and is refered to as a \ref memgroup "'member groups'". +and is referred to as a \ref memgroup "'member groups'". For \ref cmdpage "pages" there is a third grouping mechanism referred to as \ref subpaging "subpaging". @@ -163,7 +163,7 @@ block or a \endverbatim block if you prefer C style comments. Note that the members of the group should be -physcially inside the member group's body. +physically inside the member group's body. Before the opening marker of a block a separate comment block may be placed. This block should contain the \ref cmdname "@@name" @@ -207,8 +207,8 @@ Information can be grouped into pages using the \ref cmdpage "\\page" and \ref cmdsubpage "\\mainpage" commands. Normally, this results in a flat list of pages, where the "main" page is the first in the list. -Instead of adding structure using the approach decribed in section -\ref modules "modules" it is often more natural and convienent to add +Instead of adding structure using the approach described in section +\ref modules "modules" it is often more natural and convenient to add additional structure to the pages using the \ref cmdsubpage "\\subpage" command. diff --git a/doc/htmlcmds.doc b/doc/htmlcmds.doc index 3dd38c2..d87ba3c 100644 --- a/doc/htmlcmds.doc +++ b/doc/htmlcmds.doc @@ -56,7 +56,7 @@ of a HTML tag are passed on to the HTML output only <li><tt>\</FORM\></tt> Does not generate any output. <li><tt>\<HR\></tt> Writes a horizontal ruler. <li><tt>\<H1\></tt> Starts an unnumbered section. -<li><tt>\</H1\></tt> Ends an unnumberd section. +<li><tt>\</H1\></tt> Ends an unnumbered section. <li><tt>\<H2\></tt> Starts an unnumbered subsection. <li><tt>\</H2\></tt> Ends an unnumbered subsection. <li><tt>\<H3\></tt> Starts an unnumbered subsubsection. @@ -90,6 +90,8 @@ of a HTML tag are passed on to the HTML output only <li><tt>\</TABLE\></tt> ends a table. <li><tt>\<TD\></tt> Starts a new table data element. <li><tt>\</TD\></tt> Ends a table data element. +<li><tt>\<TH\></tt> Starts a new table header. +<li><tt>\</TH\></tt> Ends a table header. <li><tt>\<TR\></tt> Starts a new table row. <li><tt>\</TR\></tt> Ends a table row. <li><tt>\<TT\></tt> Starts a piece of text displayed in a typewriter font. diff --git a/doc/index.doc b/doc/index.doc index c36504d..7454f30 100644 --- a/doc/index.doc +++ b/doc/index.doc @@ -116,7 +116,7 @@ The third part provides information for developers: \addindex license \addindex GPL -Copyright © 1997-2009 by +Copyright © 1997-2010 by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>.<p> Permission to use, copy, modify, and distribute this software and its @@ -201,7 +201,7 @@ Thanks go to: <li>Christian Hammond for redesigning the web-site. <li>Ken Wong for providing the HTML tree view code. <li>Talin for adding support for C# style comments with XML markup. -<li>Petr Prikryl for coordinating the internationalisation support. +<li>Petr Prikryl for coordinating the internationalization support. All language maintainers for providing translations into many languages. <li>The band <a href="http://www.porcupinetree.com">Porcupine Tree</a> for providing hours of great music to listen to while coding. diff --git a/doc/install.doc b/doc/install.doc index b8b8154..321a6fd 100644 --- a/doc/install.doc +++ b/doc/install.doc @@ -24,15 +24,15 @@ to get the latest distribution, if you did not have it already. This section is divided into the following sections: <ul> -<li>\ref install_src_unix "Compiling from source on Unix" -<li>\ref install_bin_unix "Installing the binaries on Unix" -<li>\ref unix_problems "Known compilation problems for Unix" +<li>\ref install_src_unix "Compiling from source on UNIX" +<li>\ref install_bin_unix "Installing the binaries on UNIX" +<li>\ref unix_problems "Known compilation problems for UNIX" <li>\ref install_src_windows "Compiling from source on Windows" <li>\ref install_bin_windows "Installing the binaries on Windows" <li>\ref build_tools "Tools used to develop doxygen" </ul> -\section install_src_unix Compiling from source on Unix +\section install_src_unix Compiling from source on UNIX If you downloaded the source distribution, you need at least the following to build the executable: @@ -47,7 +47,7 @@ following to build the executable: <a href="http://www.perl.com/">perl</a> \latexonly(see {\tt http://www.perl.com/})\endlatexonly. \addindex perl -<li>The configure script assume the availibility of standard Unix tools such +<li>The configure script assume the availability of standard UNIX tools such as sed, date, find, uname, mv, cp, cat, echo, tr, cd, and rm. </ul> @@ -162,10 +162,10 @@ Compilation is now done by performing the following steps: </ol> -\section install_bin_unix Installing the binaries on Unix +\section install_bin_unix Installing the binaries on UNIX After the compilation of the source code do a <code>make install</code> - to install doxygen. If you downloaded the binary distribution for Unix, + to install doxygen. If you downloaded the binary distribution for UNIX, type: \verbatim @@ -194,7 +194,7 @@ Compilation is now done by performing the following steps: If you have a RPM or DEP package, then please follow the standard installation procedure that is required for these packages. -\section unix_problems Known compilation problems for Unix +\section unix_problems Known compilation problems for UNIX <b>Qt problems</b> @@ -236,7 +236,7 @@ your distribution does not have it please select another paper type in the config file (see the \ref cfg_paper_type "PAPER_TYPE" tag in the config file). -<b>HP-UX \& Digital Unix problems</b> +<b>HP-UX \& Digital UNIX problems</b> If you are compiling for HP-UX with aCC and you get this error: \verbatim @@ -258,7 +258,7 @@ If you are compiling for HP-UX with aCC and you get this error: If that does not help, try removing <code>ce_parse.cpp</code> and let bison rebuild it (this worked for me). -If you are compiling for Digital Unix, the same problem can be solved +If you are compiling for Digital UNIX, the same problem can be solved (according to Barnard Schmallhof) by replacing the following in ce_parse.cpp: @@ -370,7 +370,7 @@ before running make. From version 1.7.0 onwards, build files are provided for Visual Studio 2008. Also the free (as in beer) "Express" version of Developer Studio can be used to compile doxygen. Alternatively, you can compile doxygen -\ref install_src_unix "the Unix way" using +\ref install_src_unix "the UNIX way" using <a href="http://en.wikipedia.org/wiki/Cygwin">Cygwin</a> or <a href="http://www.mingw.org/">MinGW</a>. @@ -430,7 +430,7 @@ it and use the INPUT_FILTER, you will run to risk of crashing Windows! The problem is reported to and confirmed by Microsoft so maybe it will fixed in the next service pack. -Since Windows comes without all the nice tools that Unix users are +Since Windows comes without all the nice tools that UNIX users are used to, you'll need to install a number of these tools before you can compile doxygen for Windows from the command-line. @@ -579,7 +579,7 @@ In order to generate PDF output or use scientific formulas you will also need to install <a href="http://en.wikipedia.org/wiki/LaTeX">LaTeX</a> and <a href="http://en.wikipedia.org/wiki/Ghostscript">Ghostscript</a>. -For LaTeX a number of distributions exists. Popular onces that should work with +For LaTeX a number of distributions exists. Popular ones that should work with doxygen are <a href="http://www.miktex.org">MikTex</a> and <a href="http://www.xemtex.org">XemTex</a>. diff --git a/doc/language.doc b/doc/language.doc index df662a5..ba65745 100644 --- a/doc/language.doc +++ b/doc/language.doc @@ -60,8 +60,8 @@ when the translator was updated. </tr> <tr bgcolor="#ffffff"> <td>Arabic</td> - <td>Moaz Reyad</td> - <td>moazreyad at yahoo dot com</td> + <td>Moaz Reyad<br/><span style="color: red; background-color: yellow">-- searching for the maintainer --</span></td> + <td><span style="color: brown">[resigned]</span><br/><span style="color: brown">[Please, try to help to find someone.]</span></td> <td>1.4.6</td> </tr> <tr bgcolor="#ffffff"> @@ -73,7 +73,7 @@ when the translator was updated. <tr bgcolor="#ffffff"> <td>Catalan</td> <td>Maximiliano Pin<br/>Albert Mora</td> - <td>max dot pin at bitroit dot com<br/><span style="color: red; background-color: yellow">[unreachable]</span></td> + <td>max dot pin at bitroit dot com<br/><span style="color: brown">[unreachable]</span></td> <td>1.6.3</td> </tr> <tr bgcolor="#ffffff"> @@ -151,7 +151,7 @@ when the translator was updated. <tr bgcolor="#ffffff"> <td>Hungarian</td> <td>Ákos Kiss<br/>Földvári György</td> - <td>akiss at users dot sourceforge dot net<br/><span style="color: red; background-color: yellow">[unreachable]</span></td> + <td>akiss at users dot sourceforge dot net<br/><span style="color: brown">[unreachable]</span></td> <td>1.4.6</td> </tr> <tr bgcolor="#ffffff"> @@ -169,7 +169,7 @@ when the translator was updated. <tr bgcolor="#ffffff"> <td>Japanese</td> <td>Hiroki Iseri<br/>Ryunosuke Satoh<br/>Kenji Nagamatsu<br/>Iwasa Kazmi</td> - <td>goyoki at gmail dot com<br/>sun594 at hotmail dot com<br/>naga at joyful dot club dot ne dot jp<br/><span style="color: red; background-color: yellow">[unreachable]</span></td> + <td>goyoki at gmail dot com<br/>sun594 at hotmail dot com<br/>naga at joyful dot club dot ne dot jp<br/><span style="color: brown">[unreachable]</span></td> <td>1.6.0</td> </tr> <tr bgcolor="#ffffff"> @@ -181,7 +181,7 @@ when the translator was updated. <tr bgcolor="#ffffff"> <td>Korean</td> <td>Kim Taedong<br/>SooYoung Jung<br/>Richard Kim</td> - <td>fly1004 at gmail dot com<br/>jung5000 at gmail dot com<br/><span style="color: red; background-color: yellow">[unreachable]</span></td> + <td>fly1004 at gmail dot com<br/>jung5000 at gmail dot com<br/><span style="color: brown">[unreachable]</span></td> <td>up-to-date</td> </tr> <tr bgcolor="#ffffff"> @@ -192,8 +192,8 @@ when the translator was updated. </tr> <tr bgcolor="#ffffff"> <td>Lithuanian</td> - <td>Tomas Simonaitis<br/>Mindaugas Radzius<br/>Aidas Berukstis<br/>-- contact lost --</td> - <td><span style="color: red; background-color: yellow">[unreachable]</span><br/><span style="color: red; background-color: yellow">[unreachable]</span><br/><span style="color: red; background-color: yellow">[unreachable]</span><br/><span style="color: red; background-color: yellow">[Please, try to help to find someone.]</span></td> + <td>Tomas Simonaitis<br/>Mindaugas Radzius<br/>Aidas Berukstis<br/><span style="color: red; background-color: yellow">-- searching for the maintainer --</span></td> + <td><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[Please, try to help to find someone.]</span></td> <td>1.4.6</td> </tr> <tr bgcolor="#ffffff"> @@ -217,13 +217,13 @@ when the translator was updated. <tr bgcolor="#ffffff"> <td>Polish</td> <td>Piotr Kaminski<br/>Grzegorz Kowal<br/>Krzysztof Kral</td> - <td><span style="color: red; background-color: yellow">[unreachable]</span><br/><span style="color: red; background-color: yellow">[unreachable]</span><br/>krzysztof dot kral at gmail dot com</td> + <td><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[unreachable]</span><br/>krzysztof dot kral at gmail dot com</td> <td>1.6.3</td> </tr> <tr bgcolor="#ffffff"> <td>Portuguese</td> <td>Rui Godinho Lopes</td> - <td><span style="color: red; background-color: yellow">[resigned]</span></td> + <td><span style="color: brown">[resigned]</span></td> <td>1.3.3</td> </tr> <tr bgcolor="#ffffff"> @@ -241,7 +241,7 @@ when the translator was updated. <tr bgcolor="#ffffff"> <td>Serbian</td> <td>Dejan Milosavljevic</td> - <td><span style="color: red; background-color: yellow">[unreachable]</span></td> + <td><span style="color: brown">[unreachable]</span></td> <td>1.6.0</td> </tr> <tr bgcolor="#ffffff"> @@ -265,7 +265,7 @@ when the translator was updated. <tr bgcolor="#ffffff"> <td>Spanish</td> <td>Bartomeu<br/>Francisco Oltra Thennet<br/>David Vaquero</td> - <td>bartomeu at loteria3cornella dot com<br/><span style="color: red; background-color: yellow">[unreachable]</span><br/>david at grupoikusnet dot com</td> + <td>bartomeu at loteria3cornella dot com<br/><span style="color: brown">[unreachable]</span><br/>david at grupoikusnet dot com</td> <td>up-to-date</td> </tr> <tr bgcolor="#ffffff"> @@ -282,8 +282,8 @@ when the translator was updated. </tr> <tr bgcolor="#ffffff"> <td>Ukrainian</td> - <td>Olexij Tkatchenko<br/>-- searching for the maintainer --</td> - <td><span style="color: red; background-color: yellow">[resigned]</span><br/><span style="color: red; background-color: yellow">[Please, try to help to find someone.]</span></td> + <td>Olexij Tkatchenko<br/><span style="color: red; background-color: yellow">-- searching for the maintainer --</span></td> + <td><span style="color: brown">[resigned]</span><br/><span style="color: brown">[Please, try to help to find someone.]</span></td> <td>1.4.1</td> </tr> <tr bgcolor="#ffffff"> @@ -310,7 +310,8 @@ when the translator was updated. \hline Afrikaans & Johan Prinsloo & {\tt\tiny johan at zippysnoek dot com} & 1.6.0 \\ \hline - Arabic & Moaz Reyad & {\tt\tiny moazreyad at yahoo dot com} & 1.4.6 \\ + Arabic & Moaz Reyad & {\tt\tiny [resigned] moazreyad at yahoo dot com} & 1.4.6 \\ + ~ & -- searching for the maintainer -- & {\tt\tiny [Please, try to help to find someone.]} & ~ \\ \hline Brazilian Portuguese & Fabio "FJTC" Jun Takada Chino & {\tt\tiny jun-chino at uol dot com dot br} & up-to-date \\ \hline @@ -367,7 +368,7 @@ when the translator was updated. Lithuanian & Tomas Simonaitis & {\tt\tiny [unreachable] haden at homelan dot lt} & 1.4.6 \\ ~ & Mindaugas Radzius & {\tt\tiny [unreachable] mindaugasradzius at takas dot lt} & ~ \\ ~ & Aidas Berukstis & {\tt\tiny [unreachable] aidasber at takas dot lt} & ~ \\ - ~ & -- contact lost -- & {\tt\tiny [Please, try to help to find someone.]} & ~ \\ + ~ & -- searching for the maintainer -- & {\tt\tiny [Please, try to help to find someone.]} & ~ \\ \hline Macedonian & Slave Jovanovski & {\tt\tiny slavejovanovski at yahoo dot com} & 1.6.0 \\ \hline @@ -641,7 +642,7 @@ Looking at the base class of the language translator, the script guesses also the status of the translator -- see the last column of the table with languages above. The \c translator.py is called automatically when the doxygen documentation is generated. You can -also run the script manualy whenever you feel that it can help you. +also run the script manually whenever you feel that it can help you. Of course, you are not forced to use the results of the script. You can find the same information by looking at the adapter class and its base classes. @@ -677,7 +678,7 @@ end with <code>=0;</code>). If everything compiles fine, try to run \c translator.py, and have a look at the translator report (ASCII file) at the \c doxygen/doc directory. Even if your translator is marked as up-to-date, there -still may be some remarks related to your souce code. Namely, the +still may be some remarks related to your source code. Namely, the obsolete methods--that are not used at all--may be listed in the section for your language. Simply, remove their code (and run the \c translator.py again). Also, you will be informed when you forgot to @@ -700,7 +701,7 @@ TranslatorAdapter_1_2_4, if it does not implement the methods below the comment <code>new since 1.2.4</code>. When you implement them, your class should use newer translator adapter. -Run the \c translator.py script occasionaly and give it your \c xx +Run the \c translator.py script occasionally and give it your \c xx identification (from \c translator_xx.h) to create the translator report shorter (also produced faster) -- it will contain only the information related to your translator. Once you reach the state when diff --git a/doc/language.tpl b/doc/language.tpl index 5664bd4..7a0d15c 100644 --- a/doc/language.tpl +++ b/doc/language.tpl @@ -265,7 +265,7 @@ Looking at the base class of the language translator, the script guesses also the status of the translator -- see the last column of the table with languages above. The \c translator.py is called automatically when the doxygen documentation is generated. You can -also run the script manualy whenever you feel that it can help you. +also run the script manually whenever you feel that it can help you. Of course, you are not forced to use the results of the script. You can find the same information by looking at the adapter class and its base classes. @@ -301,7 +301,7 @@ end with <code>=0;</code>). If everything compiles fine, try to run \c translator.py, and have a look at the translator report (ASCII file) at the \c doxygen/doc directory. Even if your translator is marked as up-to-date, there -still may be some remarks related to your souce code. Namely, the +still may be some remarks related to your source code. Namely, the obsolete methods--that are not used at all--may be listed in the section for your language. Simply, remove their code (and run the \c translator.py again). Also, you will be informed when you forgot to @@ -324,7 +324,7 @@ TranslatorAdapter_1_2_4, if it does not implement the methods below the comment <code>new since 1.2.4</code>. When you implement them, your class should use newer translator adapter. -Run the \c translator.py script occasionaly and give it your \c xx +Run the \c translator.py script occasionally and give it your \c xx identification (from \c translator_xx.h) to create the translator report shorter (also produced faster) -- it will contain only the information related to your translator. Once you reach the state when diff --git a/doc/lists.doc b/doc/lists.doc index c55277a..f5f9f96 100644 --- a/doc/lists.doc +++ b/doc/lists.doc @@ -101,7 +101,7 @@ Here is the above example with HTML commands: \note In this case the indentation is not important. -<b>Using \\arg or \@li</b> +<b>Using \\arg or \\li</b> For compatibility with the Qt Software's internal documentation tool qdoc and with KDoc, doxygen has two commands that can be used to create simple diff --git a/doc/maintainers.txt b/doc/maintainers.txt index 04ec526..ec4480a 100644 --- a/doc/maintainers.txt +++ b/doc/maintainers.txt @@ -7,6 +7,9 @@ % The following one or more lines contain information about % the maintainer(s) for the language (one line, one maintainer) % in the form: <readable name><colon><e-mail> +% If the readable name name starts with '--' it will be displayed in HTML +% output as a highlighted text notice related to the langluage (usually +% '-- searching for the maintainer --'). % If the <e-mail> is prefixed [some_text] it is not displayed in the table % of maintainers in the Doxygen documentation, nor it is used when building % the mailto.txt by translator.py. The mark is displayed in the documentation @@ -16,7 +19,8 @@ TranslatorAfrikaans Johan Prinsloo: johan at zippysnoek dot com TranslatorArabic -Moaz Reyad: moazreyad at yahoo dot com +Moaz Reyad: [resigned] moazreyad at yahoo dot com +-- searching for the maintainer --: [Please, try to help to find someone.] TranslatorBrazilian Fabio "FJTC" Jun Takada Chino: jun-chino at uol dot com dot br @@ -89,7 +93,7 @@ TranslatorLithuanian Tomas Simonaitis: [unreachable] haden at homelan dot lt Mindaugas Radzius: [unreachable] mindaugasradzius at takas dot lt Aidas Berukstis: [unreachable] aidasber at takas dot lt --- contact lost --: [Please, try to help to find someone.] +-- searching for the maintainer --: [Please, try to help to find someone.] TranslatorNorwegian Lars Erik Jordet: lejordet at gmail dot com diff --git a/doc/perlmod.doc b/doc/perlmod.doc index 4a0ae91..9c0d79f 100644 --- a/doc/perlmod.doc +++ b/doc/perlmod.doc @@ -137,7 +137,7 @@ in DVI format. <p>The Perl Module documentation generated by Doxygen is stored in <b>DoxyDocs.pm</b>. This is a very simple Perl module that contains -only two statements: an assigment to the variable <b>$doxydocs</b> and +only two statements: an assignment to the variable <b>$doxydocs</b> and the customary <b>1;</b> statement which usually ends Perl modules. The documentation is stored in the variable <b>$doxydocs</b>, which can then be accessed by a Perl script using <b>DoxyDocs.pm</b>. diff --git a/doc/perlmod_tree.doc b/doc/perlmod_tree.doc index 0d412ba..e2b1366 100644 --- a/doc/perlmod_tree.doc +++ b/doc/perlmod_tree.doc @@ -15,7 +15,7 @@ Where <ul> -<li>The "key =>" part only appears if the parent node is a hash. +<li>The "key =>" part only appears if the parent node is a hash. "key" is the key for this node. <li><b>"Name"</b> is a unique name for the node, defined in diff --git a/doc/preprocessing.doc b/doc/preprocessing.doc index aa25ff6..dd4702a 100644 --- a/doc/preprocessing.doc +++ b/doc/preprocessing.doc @@ -46,7 +46,7 @@ Then by default doxygen will feed the following to its parser: You can disable all preprocessing by setting \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" to \c -NO in the configuation file. In the case above doxygen will then read +NO in the configuration file. In the case above doxygen will then read both statements, i.e: \verbatim diff --git a/doc/searching.doc b/doc/searching.doc index 03cd2b7..93dd0d2 100644 --- a/doc/searching.doc +++ b/doc/searching.doc @@ -137,12 +137,12 @@ has its own advantages and disadvantages: first search for an keyword. To enable the help plugin set - \ref cfg_generate_eclipsehelp "GENERATE_ECLIPSE_HELP" to \c YES, + \ref cfg_generate_eclipsehelp "GENERATE_ECLIPSEHELP" to \c YES, and define a unique identifier for your project via \ref cfg_eclipse_doc_id "ECLIPSE_DOC_ID", i.e: \verbatim - GENERATE_ECLIPSE_HELP = YES - ECLIPSE_DOC_ID = com.yourcompany.yourproject + GENERATE_ECLIPSEHELP = YES + ECLIPSE_DOC_ID = com.yourcompany.yourproject \endverbatim then create the \c com.yourcompany.yourproject directory (so with the same name as the value of \c ECLIPSE_DOC_ID) in the diff --git a/doc/starting.doc b/doc/starting.doc index d90d136..451a533 100644 --- a/doc/starting.doc +++ b/doc/starting.doc @@ -127,7 +127,7 @@ Please note that as a consequence warnings about undocumented members will not be generated as long as \ref cfg_extract_all "EXTRACT_ALL" is set to \c YES. -To analyse an existing piece of software it is useful to cross-reference +To analyze an existing piece of software it is useful to cross-reference a (documented) entity with its definition in the source files. Doxygen will generate such cross-references if you set the \ref cfg_source_browser "SOURCE_BROWSER" tag to \c YES. @@ -250,7 +250,7 @@ basically two options: <ol> <li>Place a \e special documentation block in front of the declaration or definition of the member, class or namespace. For file, class and namespace - members it is also allowed to place the documention directly after the + members it is also allowed to place the documentation directly after the member. See section \ref specialblock to learn more about special documentation blocks. <li>Place a special documentation block somewhere else (another file or diff --git a/doc/translator.py b/doc/translator.py index 995f910..32c70d5 100644 --- a/doc/translator.py +++ b/doc/translator.py @@ -59,6 +59,7 @@ 2010/08/20 - maintainers.txt to UTF-8, related processin of unicode strings - [any mark] introduced instead of [unreachable] only - marks hihglighted in HTML + 2010/09/30 - Highlighting in what will be the table in langhowto.html modified. """ from __future__ import generators @@ -536,7 +537,6 @@ class Transl: else: self.langReadable = self.lang - def __unexpectedToken(self, status, tokenId, tokenLineNo): """Reports unexpected token and quits with exit code 1.""" @@ -1871,18 +1871,26 @@ class TrManager: # and the list of their mangled e-mails. For English-based # translators that are coupled with the non-English based, # insert the 'see' note. - mm = None # init - ee = None # init + mm = None # init -- maintainer + ee = None # init -- e-mail address if obj.status == 'En': # Check whether there is the coupled non-English. classId = obj.classId[:-2] - if self.__translDic.has_key(classId): + if classId in self.__translDic: lang = self.__translDic[classId].langReadable mm = u'see the %s language' % lang ee = u' ' - if not mm and self.__maintainersDic.has_key(obj.classId): - lm = [ m[0] for m in self.__maintainersDic[obj.classId] ] + if not mm and obj.classId in self.__maintainersDic: + # Build a string of names separated by the HTML break element. + # Special notes used instead of names are highlighted. + lm = [] + for maintainer in self.__maintainersDic[obj.classId]: + name = maintainer[0] + if name.startswith(u'--'): + name = u'<span style="color: red; background-color: yellow">'\ + + name + u'</span>' + lm.append(name) mm = u'<br/>'.join(lm) # The marked adresses (they start with the mark '[unreachable]', @@ -1894,7 +1902,7 @@ class TrManager: address = maintainer[1] m = rexMark.search(address) if m is not None: - address = u'<span style="color: red; background-color: yellow">'\ + address = u'<span style="color: brown">'\ + m.group(u'mark') + u'</span>' le.append(address) ee = u'<br/>'.join(le) diff --git a/doc/trouble.doc b/doc/trouble.doc index ee4dfd7..7bd0804 100644 --- a/doc/trouble.doc +++ b/doc/trouble.doc @@ -44,7 +44,7 @@ const int (a); \endverbatim is also seen as a function declaration with name - <code>int</code>, because only the syntax is analysed, + <code>int</code>, because only the syntax is analyzed, not the semantics. If the redundant braces can be detected, as in \verbatim int *(a[20]); @@ -107,7 +107,7 @@ always try to include the following information in your bug report: <code>doxygen --version</code> if you are not sure). - The name and version number of your operating system (for instance SuSE Linux 6.4) -- It is usually a good idea to send along the configuation file as well, +- It is usually a good idea to send along the configuration file as well, but please use doxygen with the <code>-s</code> flag while generating it to keep it small (use <code>doxygen -s -u [configName]</code> to strip the comments from an existing config file). diff --git a/src/classdef.cpp b/src/classdef.cpp index 04f8934..557604f 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -1065,7 +1065,8 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) bool renderDiagram = FALSE; - if (Config_getBool("HAVE_DOT") && Config_getBool("CLASS_DIAGRAMS")) + if (Config_getBool("HAVE_DOT") && + (Config_getBool("CLASS_DIAGRAMS") || Config_getBool("CLASS_GRAPH"))) // write class diagram using dot { DotClassGraph inheritanceGraph(this,DotNode::Inheritance); diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index 16e8a7a..1e5cc17 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -112,7 +112,8 @@ CommandMap cmdMap[] = { "endmanonly", CMD_ENDMANONLY }, { "includelineno", CMD_INCWITHLINES }, { "inheritdoc", CMD_INHERITDOC }, - { 0, 0 } + { "mscfile", CMD_MSCFILE }, + { 0, 0 }, }; //---------------------------------------------------------------------------- diff --git a/src/cmdmapper.h b/src/cmdmapper.h index 011ebad..1f4bd02 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -113,7 +113,8 @@ enum CommandType CMD_TPARAM = 79 | SIMPLESECT_BIT, CMD_COPYBRIEF = 80, CMD_COPYDETAILS = 81, - CMD_QUOTE = 82 + CMD_QUOTE = 82, + CMD_MSCFILE = 83 }; enum HtmlTagType @@ -2851,13 +2851,15 @@ OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP} if (cd) { setClassScope(cd->name()); + g_scopeStack.push(SCOPEBLOCK); + DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n")); } - else + else { - setClassScope(g_realScope); + //setClassScope(g_realScope); + g_scopeStack.push(INNERBLOCK); + DBG_CTX((stderr,"** scope stack push INNERBLOCK\n")); } - DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n")); - g_scopeStack.push(SCOPEBLOCK); } else { @@ -3356,7 +3358,8 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s, int startLine,int endLine,bool inlineFragment, MemberDef *memberDef,bool showLineNumbers) { - //printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd); + //printf("***parseCode() exBlock=%d exName=%s fd=%p className=%s\n", + // exBlock,exName,fd,className); if (s.isEmpty()) return; if (g_codeClassSDict==0) { @@ -3386,6 +3389,7 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s, g_theCallContext.clear(); g_scopeStack.clear(); g_classScope = className; + //printf("parseCCode %s\n",className); g_exampleBlock = exBlock; g_exampleName = exName; g_sourceFileDef = fd; diff --git a/src/commentscan.l b/src/commentscan.l index 892ac71..d4f7f0e 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -1038,7 +1038,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" <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, or ellipsis +<Comment>("."+)[a-z_A-Z0-9\)] { // . at start or in the middle of a word, or ellipsis addOutput(yytext); } <Comment>".\\"[ \t] { // . with escaped space. diff --git a/src/compound.xsd b/src/compound.xsd index 369e230..7f67a2c 100644 --- a/src/compound.xsd +++ b/src/compound.xsd @@ -577,6 +577,7 @@ <xsd:complexType name="docParamNameList"> <xsd:sequence> + <xsd:element name="parametertype" type="docParamType" minOccurs="0" maxOccurs="unbounded" /> <xsd:element name="parametername" type="docParamName" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> @@ -585,6 +586,12 @@ <xsd:sequence> <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="1" /> </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="docParamName" mixed="true"> + <xsd:sequence> + <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="1" /> + </xsd:sequence> <xsd:attribute name="direction" type="DoxParamDir" use="optional" /> </xsd:complexType> diff --git a/src/compound_xsd.h b/src/compound_xsd.h index fd92308..0404b78 100644 --- a/src/compound_xsd.h +++ b/src/compound_xsd.h @@ -577,6 +577,7 @@ "\n" " <xsd:complexType name=\"docParamNameList\">\n" " <xsd:sequence>\n" +" <xsd:element name=\"parametertype\" type=\"docParamType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" " <xsd:element name=\"parametername\" type=\"docParamName\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" " </xsd:sequence>\n" " </xsd:complexType>\n" @@ -585,6 +586,12 @@ " <xsd:sequence>\n" " <xsd:element name=\"ref\" type=\"refTextType\" minOccurs=\"0\" maxOccurs=\"1\" />\n" " </xsd:sequence>\n" +" </xsd:complexType>\n" +"\n" +" <xsd:complexType name=\"docParamName\" mixed=\"true\">\n" +" <xsd:sequence>\n" +" <xsd:element name=\"ref\" type=\"refTextType\" minOccurs=\"0\" maxOccurs=\"1\" />\n" +" </xsd:sequence>\n" " <xsd:attribute name=\"direction\" type=\"DoxParamDir\" use=\"optional\" />\n" " </xsd:complexType>\n" "\n" diff --git a/src/config.l b/src/config.l index b45097c..532b1c4 100644 --- a/src/config.l +++ b/src/config.l @@ -1084,7 +1084,7 @@ void Config::check() paperType=paperType.lower().stripWhiteSpace(); if (paperType.isEmpty()) { - paperType = "a4wide"; + paperType = "a4"; } if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" && paperType!="legal" && paperType!="executive") diff --git a/src/config.xml b/src/config.xml index 17d3644..8919ab3 100644 --- a/src/config.xml +++ b/src/config.xml @@ -290,7 +290,7 @@ doxygen to be busy swapping symbols to and from disk most of the time causing a significant performance penality. If the system has enough physical memory increasing the cache will improve the performance by keeping more symbols in memory. Note that the value works on -a logarithmic scale so increasing the size by one will rougly double the +a logarithmic scale so increasing the size by one will roughly double the memory usage. The cache size is given by this formula: 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536 symbols @@ -514,7 +514,7 @@ parameters in a documented function, or documenting parameters that don't exist or using markup commands wrongly. ' defval='1'/> <option type='bool' id='WARN_NO_PARAMDOC' docs=' -The WARN_NO_PARAMDOC option can be abled to get warnings for +The WARN_NO_PARAMDOC option can be enabled to get warnings for functions that are documented, but have no documentation for their parameters or return value. If set to NO (the default) doxygen will only warn about wrong or incomplete parameter documentation, but not about the absence of @@ -999,7 +999,7 @@ implemented using a PHP enabled web server instead of at the web client using Javascript. Doxygen will generate the search PHP script and index file to put on the web server. The advantage of the server based approach is that it scales better to large projects and allows -full text search. The disadvances is that it is more difficult to setup +full text search. The disadvantages are that it is more difficult to setup and does not have live searching capabilities. ' defval='0' depends='SEARCHENGINE'/> </group> @@ -1030,9 +1030,9 @@ If the COMPACT_LATEX tag is set to YES Doxygen generates more compact LaTeX documents. This may be useful for small projects and may help to save some trees in general. ' defval='0' depends='GENERATE_LATEX'/> - <option type='enum' id='PAPER_TYPE' defval='a4wide' docs=' + <option type='enum' id='PAPER_TYPE' defval='a4' docs=' The PAPER_TYPE tag can be used to set the paper type that is used -by the printer. Possible values are: a4, a4wide, letter, legal and +by the printer. Possible values are: a4, letter, legal and executive. If left blank a4wide will be used. ' depends='GENERATE_LATEX'> <value name='a4'/> @@ -1301,9 +1301,8 @@ interpreter (i.e. the result of `which perl'). If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or super classes. Setting the tag to NO turns the diagrams off. Note that -this option is superseded by the HAVE_DOT option below. This is only a -fallback. It is recommended to install and use dot, since it yields more -powerful graphs. +this option also works with HAVE_DOT disabled, but it is recommended to +install and use dot, since it yields more powerful graphs. ' defval='1'/> <option type='string' id='MSCGEN_PATH' format='string' docs=' You can define message sequence charts within doxygen comments using the \msc @@ -1431,6 +1430,12 @@ contain dot files that are included in the documentation (see the \dotfile command). ' depends='HAVE_DOT'> </option> + <option type='list' id='MSCFILE_DIRS' format='dir' docs=' +The MSCFILE_DIRS tag can be used to specify one or more directories that +contain msc files that are included in the documentation (see the +\mscfile command). +' > + </option> <option type='int' id='DOT_GRAPH_MAX_NODES' docs=' The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes that will be shown in the graph. If the number of nodes in a graph diff --git a/src/configoptions.cpp b/src/configoptions.cpp index a9c2133..24c0375 100644 --- a/src/configoptions.cpp +++ b/src/configoptions.cpp @@ -744,7 +744,7 @@ void addConfigOptions(Config *cfg) //---- cb = cfg->addBool( "WARN_NO_PARAMDOC", - "The WARN_NO_PARAMDOC option can be abled to get warnings for\n" + "The WARN_NO_PARAMDOC option can be enabled to get warnings for\n" "functions that are documented, but have no documentation for their parameters\n" "or return value. If set to NO (the default) doxygen will only warn about\n" "wrong or incomplete parameter documentation, but not about the absence of\n" @@ -1541,9 +1541,9 @@ void addConfigOptions(Config *cfg) ce = cfg->addEnum( "PAPER_TYPE", "The PAPER_TYPE tag can be used to set the paper type that is used\n" - "by the printer. Possible values are: a4, a4wide, letter, legal and\n" + "by the printer. Possible values are: a4, letter, legal and\n" "executive. If left blank a4wide will be used.", - "a4wide" + "a4" ); ce->addValue("a4"); ce->addValue("a4wide"); @@ -1978,9 +1978,8 @@ void addConfigOptions(Config *cfg) "If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n" "generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base\n" "or super classes. Setting the tag to NO turns the diagrams off. Note that\n" - "this option is superseded by the HAVE_DOT option below. This is only a\n" - "fallback. It is recommended to install and use dot, since it yields more\n" - "powerful graphs.", + "this option also works with HAVE_DOT disabled, but it is recommended to\n" + "install and use dot, since it yields more powerful graphs.", TRUE ); //---- @@ -2186,6 +2185,14 @@ void addConfigOptions(Config *cfg) cl->addDependency("HAVE_DOT"); cl->setWidgetType(ConfigList::Dir); //---- + cl = cfg->addList( + "MSCFILE_DIRS", + "The MSCFILE_DIRS tag can be used to specify one or more directories that\n" + "contain msc files that are included in the documentation (see the\n" + "\\mscfile command)." + ); + cl->setWidgetType(ConfigList::Dir); + //---- ci = cfg->addInt( "DOT_GRAPH_MAX_NODES", "The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of\n" diff --git a/src/definition.cpp b/src/definition.cpp index 6fe8b4e..6cec012 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -252,7 +252,6 @@ void Definition::removeFromMap(Definition *d) DefinitionIntf *di=Doxygen::symbolMap->find(symbolName); if (di) { - ASSERT(di!=0); if (di!=d) // symbolName not unique { //printf(" removing from list: %p!\n",di); @@ -435,6 +434,18 @@ void Definition::setDocumentation(const char *d,const char *docFile,int docLine, #define uni_isupper(c) (QChar(c).category()==QChar::Letter_Uppercase) +// do a UTF-8 aware search for the last real character and return TRUE +// if that is a multibyte one. +static bool lastCharIsMultibyte(const QCString &s) +{ + int l = s.length(); + int p = 0; + int pp = -1; + while ((p=nextUtf8CharPosition(s,l,p))<l) pp=p; + if (pp==-1 || ((uchar)s[pp])<0x80) return FALSE; + return TRUE; +} + void Definition::_setBriefDescription(const char *b,const char *briefFile,int briefLine) { static QCString outputLanguage = Config_getEnum("OUTPUT_LANGUAGE"); @@ -447,11 +458,12 @@ void Definition::_setBriefDescription(const char *b,const char *briefFile,int br int bl = brief.length(); if (bl>0 && needsDot) // add punctuation if needed { - switch(brief.at(bl-1)) + int c = brief.at(bl-1); + switch(c) { - case '.': case '!': case '?': case '>': case ':': break; + case '.': case '!': case '?': case '>': case ':': case ')': break; default: - if (uni_isupper(brief.at(0))) brief+='.'; + if (uni_isupper(brief.at(0)) && !lastCharIsMultibyte(brief)) brief+='.'; break; } } diff --git a/src/diagram.cpp b/src/diagram.cpp index dee8928..bb2d02e 100644 --- a/src/diagram.cpp +++ b/src/diagram.cpp @@ -349,7 +349,7 @@ bool TreeDiagram::layoutTree(DiagramItem *root,int r) DiagramItem *di=dil->first(); while (di && !moved && !di->isInList()) { - moved = moved || layoutTree(di,r+1); + moved = layoutTree(di,r+1); di=dil->next(); } } diff --git a/src/docparser.cpp b/src/docparser.cpp index d68be25..1b95a8c 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -70,15 +70,15 @@ static const char *sectionLevelToName[] = // Parser state: global variables during a call to validatingParseDoc static Definition * g_scope; -static QCString g_context; +static QCString g_context; static bool g_inSeeBlock; static bool g_insideHtmlLink; static QStack<DocNode> g_nodeStack; static QStack<DocStyleChange> g_styleStack; static QStack<DocStyleChange> g_initialStyleStack; static QList<Definition> g_copyStack; -static QCString g_fileName; -static QCString g_relPath; +static QCString g_fileName; +static QCString g_relPath; static bool g_hasParamCommand; static bool g_hasReturnCommand; @@ -89,7 +89,7 @@ static QCString g_exampleName; static SectionDict * g_sectionDict; static QCString g_searchUrl; -static QCString g_includeFileText; +static QCString g_includeFileText; static uint g_includeFileOffset; static uint g_includeFileLength; @@ -999,7 +999,6 @@ static void handleUnclosedStyleCommands() } } - static void handleLinkedWord(DocNode *parent,QList<DocNode> &children) { Definition *compound=0; @@ -1113,6 +1112,23 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children) } } +static void handleParameterType(DocNode *parent,QList<DocNode> &children,const QCString ¶mTypes) +{ + QCString name = g_token->name; + int p=0,i; + QCString type; + while ((i=paramTypes.find('|',p))!=-1) + { + g_token->name = paramTypes.mid(p,i-p); + handleLinkedWord(parent,children); + p=i+1; + } + g_token->name = paramTypes.mid(p); + handleLinkedWord(parent,children); + g_token->name = name; +} + + /* Helper function that deals with the most common tokens allowed in * title like sections. * @param parent Parent node, owner of the children list passed as @@ -1562,6 +1578,21 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children, static void readTextFileByName(const QCString &file,QCString &text) { + QStrList &examplePathList = Config_getList("EXAMPLE_PATH"); + char *s=examplePathList.first(); + while (s) + { + QCString absFileName = QCString(s)+portable_pathSeparator()+file; + QFileInfo fi(absFileName); + if (fi.exists()) + { + text = fileToString(absFileName,Config_getBool("FILTER_SOURCE_FILES")); + return; + } + s=examplePathList.next(); + } + + // as a fallback we also look in the exampleNameDict bool ambig; FileDef *fd; if ((fd=findFileDef(Doxygen::exampleNameDict,file,ambig))) @@ -1826,9 +1857,12 @@ void DocCopy::parse() g_scope = def; if (def->definitionType()==Definition::TypeMember && def->getOuterScope()) { - g_context=def->getOuterScope()->name(); + if (def->getOuterScope()!=Doxygen::globalScope) + { + g_context=def->getOuterScope()->name(); + } } - else + else if (def!=Doxygen::globalScope) { g_context=def->name(); } @@ -2526,6 +2560,87 @@ void DocDotFile::parse() ASSERT(n==this); } +DocMscFile::DocMscFile(DocNode *parent,const QCString &name,const QCString &context) : + m_name(name), m_relPath(g_relPath), m_context(context) +{ + m_parent = parent; +} + +void DocMscFile::parse() +{ + g_nodeStack.push(this); + DBG(("DocMscFile::parse() start\n")); + + doctokenizerYYsetStateTitle(); + int tok; + while ((tok=doctokenizerYYlex())) + { + if (!defaultHandleToken(this,tok,m_children)) + { + switch (tok) + { + case TK_COMMAND: + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Illegal command %s as part of a \\mscfile", + qPrint(g_token->name)); + break; + case TK_SYMBOL: + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unsupported symbol %s found", + qPrint(g_token->name)); + break; + default: + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unexpected token %s", + tokToString(tok)); + break; + } + } + } + tok=doctokenizerYYlex(); + while (tok==TK_WORD) // there are values following the title + { + if (g_token->name=="width") + { + m_width=g_token->chars; + } + else if (g_token->name=="height") + { + m_height=g_token->chars; + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Unknown option %s after image title", + qPrint(g_token->name)); + } + tok=doctokenizerYYlex(); + } + ASSERT(tok==0); + doctokenizerYYsetStatePara(); + handlePendingStyleCommands(this,m_children); + + bool ambig; + FileDef *fd = findFileDef(Doxygen::mscFileNameDict,m_name,ambig); + if (fd) + { + m_file = fd->absFilePath(); + } + else if (ambig) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included msc file name %s is ambiguous.\n" + "Possible candidates:\n%s",qPrint(m_name), + qPrint(showFileDefMatches(Doxygen::exampleNameDict,m_name)) + ); + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: included dot file %s is not found " + "in any of the paths specified via MSCFILE_DIRS!",qPrint(m_name)); + } + + DBG(("DocMscFile::parse() end\n")); + DocNode *n=g_nodeStack.pop(); + ASSERT(n==this); +} + + //--------------------------------------------------------------------------- @@ -4052,8 +4167,20 @@ int DocParamList::parse(const QCString &cmdName) { if (m_type==DocParamSect::Param) { - g_hasParamCommand=TRUE; - checkArgumentName(g_token->name,TRUE); + int typeSeparator = g_token->name.find('#'); // explicit type position + if (typeSeparator!=-1) + { + handleParameterType(this,m_paramTypes,g_token->name.left(typeSeparator)); + g_token->name = g_token->name.mid(typeSeparator+1); + g_hasParamCommand=TRUE; + checkArgumentName(g_token->name,TRUE); + ((DocParamSect*)parent())->m_hasTypeSpecifier=TRUE; + } + else + { + g_hasParamCommand=TRUE; + checkArgumentName(g_token->name,TRUE); + } } else if (m_type==DocParamSect::RetVal) { @@ -4163,6 +4290,11 @@ int DocParamSect::parse(const QCString &cmdName,bool xmlContext, Direction d) DBG(("DocParamSect::parse() start\n")); g_nodeStack.push(this); + if (d!=Unspecified) + { + m_hasInOutSpecifier=TRUE; + } + DocParamList *pl = new DocParamList(this,m_type,d); if (m_children.isEmpty()) { @@ -4392,6 +4524,30 @@ void DocPara::handleDotFile(const QCString &cmdName) df->parse(); } +void DocPara::handleMscFile(const QCString &cmdName) +{ + int tok=doctokenizerYYlex(); + if (tok!=TK_WHITESPACE) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command", + qPrint(cmdName)); + return; + } + doctokenizerYYsetStateFile(); + tok=doctokenizerYYlex(); + doctokenizerYYsetStatePara(); + if (tok!=TK_WORD) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s", + tokToString(tok),qPrint(cmdName)); + return; + } + QCString name = g_token->name; + DocMscFile *df = new DocMscFile(this,name,g_context); + m_children.append(df); + df->parse(); +} + void DocPara::handleLink(const QCString &cmdName,bool isJavaLink) { int tok=doctokenizerYYlex(); @@ -4549,7 +4705,10 @@ void DocPara::handleInheritDoc() //printf("{InheritDocs:%s=>%s}\n",g_memberDef->qualifiedName().data(),reMd->qualifiedName().data()); docParserPushContext(); g_scope=reMd->getOuterScope(); - g_context=g_scope->name(); + if (g_scope!=Doxygen::globalScope) + { + g_context=g_scope->name(); + } g_memberDef=reMd; g_styleStack.clear(); g_nodeStack.clear(); @@ -4903,6 +5062,9 @@ int DocPara::handleCommand(const QCString &cmdName) case CMD_DOTFILE: handleDotFile(cmdName); break; + case CMD_MSCFILE: + handleMscFile(cmdName); + break; case CMD_LINK: handleLink(cmdName,FALSE); break; @@ -5131,7 +5293,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta { // copy attributes HtmlAttribList attrList = tagHtmlAttribs; - // and remove the href attribute + // and remove the src attribute bool result = attrList.remove(index); ASSERT(result); DocImage *img = new DocImage(this,attrList,opt->value,DocImage::Html); @@ -6159,10 +6321,10 @@ DocNode *validatingParseDoc(const char *fileName,int startLine, bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); docParserPushContext(); - if (ctx && + if (ctx && ctx!=Doxygen::globalScope && (ctx->definitionType()==Definition::TypeClass || ctx->definitionType()==Definition::TypeNamespace - ) + ) ) { g_context = ctx->name(); @@ -6170,19 +6332,18 @@ DocNode *validatingParseDoc(const char *fileName,int startLine, else if (ctx && ctx->definitionType()==Definition::TypePage) { Definition *scope = ((PageDef*)ctx)->getPageScope(); - if (scope) g_context = scope->name(); + if (scope && scope!=Doxygen::globalScope) g_context = scope->name(); } else if (ctx && ctx->definitionType()==Definition::TypeGroup) { Definition *scope = ((GroupDef*)ctx)->getGroupScope(); - if (scope) g_context = scope->name(); + if (scope && scope!=Doxygen::globalScope) g_context = scope->name(); } else { g_context = ""; } g_scope = ctx; - //printf("g_context=%s\n",g_context.data()); if (indexWords && md && Doxygen::searchIndex) { diff --git a/src/docparser.h b/src/docparser.h index 7a63cb2..6b2a863 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -131,7 +131,8 @@ class DocNode Kind_ParamList = 44, Kind_InternalRef = 45, Kind_Copy = 46, - Kind_Text = 47 + Kind_Text = 47, + Kind_MscFile = 48 }; /*! Creates a new node */ DocNode() : m_parent(0), m_insidePre(FALSE) {} @@ -350,12 +351,12 @@ class DocVerbatim : public DocNode DocVerbatim(DocNode *parent,const QCString &context, const QCString &text, Type t,bool isExample, const QCString &exampleFile); - Kind kind() const { return Kind_Verbatim; } - Type type() const { return m_type; } + Kind kind() const { return Kind_Verbatim; } + Type type() const { return m_type; } QCString text() const { return m_text; } QCString context() const { return m_context; } - void accept(DocVisitor *v) { v->visit(this); } - bool isExample() const { return m_isExample; } + void accept(DocVisitor *v) { v->visit(this); } + bool isExample() const { return m_isExample; } QCString exampleFile() const { return m_exampleFile; } QCString relPath() const { return m_relPath; } @@ -608,6 +609,31 @@ class DocDotFile : public CompAccept<DocDotFile>, public DocNode QCString m_context; }; +/*! @brief Node representing a msc file */ +class DocMscFile : public CompAccept<DocMscFile>, public DocNode +{ + public: + DocMscFile(DocNode *parent,const QCString &name,const QCString &context); + void parse(); + Kind kind() const { return Kind_MscFile; } + QCString name() const { return m_name; } + QCString file() const { return m_file; } + QCString relPath() const { return m_relPath; } + bool hasCaption() const { return !m_children.isEmpty(); } + QCString width() const { return m_width; } + QCString height() const { return m_height; } + QCString context() const { return m_context; } + void accept(DocVisitor *v) { CompAccept<DocMscFile>::accept(this,v); } + private: + QCString m_name; + QCString m_file; + QCString m_relPath; + QCString m_width; + QCString m_height; + QCString m_context; +}; + + /*! @brief Node representing a link to some item */ class DocLink : public CompAccept<DocLink>, public DocNode { @@ -895,6 +921,7 @@ class DocSimpleSectSep : public DocNode /*! Node representing a parameter section */ class DocParamSect : public CompAccept<DocParamSect>, public DocNode { + friend class DocParamList; public: enum Type { @@ -905,15 +932,21 @@ class DocParamSect : public CompAccept<DocParamSect>, public DocNode In=1, Out=2, InOut=3, Unspecified=0 }; DocParamSect(DocNode *parent,Type t) - : m_type(t) { m_parent = parent; } + : m_type(t), m_dir(Unspecified), + m_hasInOutSpecifier(FALSE), m_hasTypeSpecifier(FALSE) + { m_parent = parent; } int parse(const QCString &cmdName,bool xmlContext,Direction d); Kind kind() const { return Kind_ParamSect; } Type type() const { return m_type; } void accept(DocVisitor *v) { CompAccept<DocParamSect>::accept(this,v); } + bool hasInOutSpecifier() const { return m_hasInOutSpecifier; } + bool hasTypeSpecifier() const { return m_hasTypeSpecifier; } private: Type m_type; Direction m_dir; + bool m_hasInOutSpecifier; + bool m_hasTypeSpecifier; }; /*! Node representing a paragraph in the documentation tree */ @@ -944,6 +977,7 @@ class DocPara : public CompAccept<DocPara>, public DocNode void handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type t); void handleImage(const QCString &cmdName); void handleDotFile(const QCString &cmdName); + void handleMscFile(const QCString &cmdName); void handleInclude(const QCString &cmdName,DocInclude::Type t); void handleLink(const QCString &cmdName,bool isJavaLink); void handleRef(const QCString &cmdName); @@ -965,10 +999,15 @@ class DocParamList : public DocNode public: DocParamList(DocNode *parent,DocParamSect::Type t,DocParamSect::Direction d) : m_type(t), m_dir(d), m_isFirst(TRUE), m_isLast(TRUE) - { m_paragraphs.setAutoDelete(TRUE); m_parent = parent; } + { m_paragraphs.setAutoDelete(TRUE); + m_params.setAutoDelete(TRUE); + m_paramTypes.setAutoDelete(TRUE); + m_parent = parent; + } virtual ~DocParamList() { } Kind kind() const { return Kind_ParamList; } const QList<DocNode> ¶meters() { return m_params; } + const QList<DocNode> ¶mTypes() { return m_paramTypes; } DocParamSect::Type type() const { return m_type; } DocParamSect::Direction direction() const { return m_dir; } void markFirst(bool b=TRUE) { m_isFirst=b; } @@ -989,6 +1028,7 @@ class DocParamList : public DocNode private: QList<DocPara> m_paragraphs; QList<DocNode> m_params; + QList<DocNode> m_paramTypes; DocParamSect::Type m_type; DocParamSect::Direction m_dir; bool m_isFirst; diff --git a/src/docsets.cpp b/src/docsets.cpp index 5138057..fa14cfa 100644 --- a/src/docsets.cpp +++ b/src/docsets.cpp @@ -232,7 +232,7 @@ void DocSets::addContentsItem(bool isDir, void DocSets::addIndexItem(Definition *context,MemberDef *md,const char *) { - if (md==0 || context==0) return; // TODO: also index non members... + if (md==0 && context==0) return; FileDef *fd = 0; ClassDef *cd = 0; diff --git a/src/doctokenizer.l b/src/doctokenizer.l index fa4f28a..0f7dcc1 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -789,6 +789,15 @@ REFWORD {LABELID}|{REFWORD2} g_token->name = g_token->name.left(yyleng-2); return TK_WORD; } +<St_Param>({LABELID}"|")*{LABELID}{WS}+("&")?"$"{LABELID} { + QCString params = yytext; + int j = params.find('&'); + int i = params.find('$'); + if (j<i && j!=-1) i=j; + QCString types = params.left(i).stripWhiteSpace(); + g_token->name = types+"#"+params.mid(i); + return TK_WORD; + } <St_Param>[^ \t\n,]+ { g_token->name = yytext; return TK_WORD; diff --git a/src/docvisitor.h b/src/docvisitor.h index bd8e540..3a67d20 100644 --- a/src/docvisitor.h +++ b/src/docvisitor.h @@ -65,6 +65,7 @@ class DocIncOperator; class DocHtmlHeader; class DocImage; class DocDotFile; +class DocMscFile; class DocLink; class DocRef; class DocFormula; @@ -158,6 +159,8 @@ class DocVisitor virtual void visitPost(DocImage *) = 0; virtual void visitPre(DocDotFile *) = 0; virtual void visitPost(DocDotFile *) = 0; + virtual void visitPre(DocMscFile *) = 0; + virtual void visitPost(DocMscFile *) = 0; virtual void visitPre(DocLink *) = 0; virtual void visitPost(DocLink *) = 0; virtual void visitPre(DocRef *) = 0; diff --git a/src/doxygen.cpp b/src/doxygen.cpp index eda6119..4d78e16 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -40,6 +40,7 @@ #include "pre.h" #include "tagreader.h" #include "dot.h" +#include "msc.h" #include "docparser.h" #include "dirdef.h" #include "outputlist.h" @@ -112,6 +113,7 @@ FileNameDict *Doxygen::includeNameDict = 0; // include names FileNameDict *Doxygen::exampleNameDict = 0; // examples FileNameDict *Doxygen::imageNameDict = 0; // images FileNameDict *Doxygen::dotFileNameDict = 0; // dot files +FileNameDict *Doxygen::mscFileNameDict = 0; // dot files StringDict Doxygen::namespaceAliasDict(257); // all namespace aliases StringDict Doxygen::tagDestinationDict(257); // all tag locations QDict<void> Doxygen::expandAsDefinedDict(257); // all macros that should be expanded @@ -174,6 +176,7 @@ void clearAll() Doxygen::exampleNameDict->clear(); Doxygen::imageNameDict->clear(); Doxygen::dotFileNameDict->clear(); + Doxygen::mscFileNameDict->clear(); Doxygen::formulaDict.clear(); Doxygen::formulaNameDict.clear(); Doxygen::tagDestinationDict.clear(); @@ -192,6 +195,8 @@ void statistics() Doxygen::imageNameDict->statistics(); fprintf(stderr,"--- dotFileNameDict stats ----\n"); Doxygen::dotFileNameDict->statistics(); + fprintf(stderr,"--- mscFileNameDict stats ----\n"); + Doxygen::mscFileNameDict->statistics(); //fprintf(stderr,"--- g_excludeNameDict stats ----\n"); //g_excludeNameDict.statistics(); fprintf(stderr,"--- aliasDict stats ----\n"); @@ -4243,6 +4248,17 @@ static bool findClassRelation( found = baseClass!=0 && baseClass!=cd; } + if (!found) + { + // for PHP the "use A\B as C" construct map class C to A::B, so we lookup + // the class name also in the alias mapping. + QCString *aliasName = Doxygen::namespaceAliasDict[baseClassName]; + if (aliasName) // see if it is indeed a class. + { + baseClass=getClass(*aliasName); + found = baseClass!=0 && baseClass!=cd; + } + } bool isATemplateArgument = templateNames!=0 && templateNames->find(biName)!=0; // make templSpec canonical // warning: the following line doesn't work for Mixin classes (see bug 560623) @@ -5881,7 +5897,7 @@ static void findMember(EntryNav *rootNav, { LockingPtr<ArgumentList> rmdAl = rmd->argumentList(); - newMember=newMember && + newMember= !matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl.pointer(), cd,fd,root->argList, TRUE); @@ -9141,6 +9157,7 @@ void initDoxygen() Doxygen::exampleNameDict->setAutoDelete(TRUE); Doxygen::imageNameDict = new FileNameDict(257); Doxygen::dotFileNameDict = new FileNameDict(257); + Doxygen::mscFileNameDict = new FileNameDict(257); Doxygen::sectionDict.setAutoDelete(TRUE); Doxygen::memGrpInfoDict.setAutoDelete(TRUE); Doxygen::tagDestinationDict.setAutoDelete(TRUE); @@ -9155,6 +9172,7 @@ void cleanUpDoxygen() delete Doxygen::exampleNameDict; delete Doxygen::imageNameDict; delete Doxygen::dotFileNameDict; + delete Doxygen::mscFileNameDict; delete Doxygen::mainPage; delete Doxygen::pageSDict; delete Doxygen::exampleSDict; @@ -9738,6 +9756,18 @@ void searchInputFiles(StringList &inputFiles) s=dotFileList.next(); } + msg("Searching for msc files...\n"); + QStrList &mscFileList=Config_getList("MSCFILE_DIRS"); + s=mscFileList.first(); + while (s) + { + readFileOrDirectory(s,0,Doxygen::mscFileNameDict,0,0, + 0,0,0, + alwaysRecursive); + s=dotFileList.next(); + } + + msg("Searching for files to exclude\n"); QStrList &excludeList = Config_getList("EXCLUDE"); s=excludeList.first(); diff --git a/src/doxygen.css b/src/doxygen.css index 46216c2..39053f8 100644 --- a/src/doxygen.css +++ b/src/doxygen.css @@ -464,6 +464,28 @@ table.memberdecls { font-style: normal; } +.params, .retval, .exception, .tparams { + border-spacing: 6px 2px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + + + + /* @end */ /* @group Directory (tree) */ diff --git a/src/doxygen.h b/src/doxygen.h index 0c2e7fc..d4edebc 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -92,6 +92,7 @@ class Doxygen static FileNameList *inputNameList; static FileNameDict *imageNameDict; static FileNameDict *dotFileNameDict; + static FileNameDict *mscFileNameDict; static QStrList tagfileList; static MemberNameSDict *memberNameSDict; static MemberNameSDict *functionNameSDict; diff --git a/src/doxygen_css.h b/src/doxygen_css.h index 42878a6..f32c905 100644 --- a/src/doxygen_css.h +++ b/src/doxygen_css.h @@ -464,6 +464,28 @@ " font-style: normal;\n" "}\n" "\n" +".params, .retval, .exception, .tparams {\n" +" border-spacing: 6px 2px;\n" +"} \n" +"\n" +".params .paramname, .retval .paramname {\n" +" font-weight: bold;\n" +" vertical-align: top;\n" +"}\n" +" \n" +".params .paramtype {\n" +" font-style: italic;\n" +" vertical-align: top;\n" +"} \n" +" \n" +".params .paramdir {\n" +" font-family: \"courier new\",courier,monospace;\n" +" vertical-align: top;\n" +"}\n" +"\n" +"\n" +"\n" +"\n" "/* @end */\n" "\n" "/* @group Directory (tree) */\n" diff --git a/src/entry.cpp b/src/entry.cpp index 745a7f9..c8475a6 100644 --- a/src/entry.cpp +++ b/src/entry.cpp @@ -39,7 +39,7 @@ bool ArgumentList::hasDocumentation() const Argument *a; for (ali.toFirst();!hasDocs && (a=ali.current());++ali) { - hasDocs = hasDocs || a->hasDocumentation(); + hasDocs = a->hasDocumentation(); } return hasDocs; } diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index a5900cc..7de6e52 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -638,14 +638,12 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast) case DocNode::Kind_AutoListItem: isFirst=TRUE; isLast =TRUE; - if (isFirst) t=1; - if (isLast) t=3; + t=1; // not used break; case DocNode::Kind_SimpleListItem: isFirst=TRUE; isLast =TRUE; - if (isFirst) t=1; - if (isLast) t=3; + t=1; // not used break; case DocNode::Kind_HtmlListItem: isFirst=isFirstChildNode((DocHtmlListItem*)p->parent(),p); @@ -1172,7 +1170,8 @@ void HtmlDocVisitor::visitPre(DocImage *img) } m_t << "<div align=\"center\">" << endl; m_t << "<img src=\"" << img->relPath() << img->name() << "\" alt=\"" - << baseName << "\"" << "/>" << endl; + << baseName << "\"" << htmlAttribsToString(img->attribs()) + << "/>" << endl; if (img->hasCaption()) { m_t << "<p><strong>"; @@ -1224,6 +1223,26 @@ void HtmlDocVisitor::visitPost(DocDotFile *df) m_t << "</div>" << endl; } +void HtmlDocVisitor::visitPre(DocMscFile *df) +{ + if (m_hide) return; + writeMscFile(df->file(),df->relPath(),df->context()); + m_t << "<div align=\"center\">" << endl; + if (df->hasCaption()) + { + m_t << "<p><strong>"; + } +} +void HtmlDocVisitor::visitPost(DocMscFile *df) +{ + if (m_hide) return; + if (df->hasCaption()) + { + m_t << "</strong></p>" << endl; + } + m_t << "</div>" << endl; +} + void HtmlDocVisitor::visitPre(DocLink *lnk) { if (m_hide) return; @@ -1312,25 +1331,33 @@ void HtmlDocVisitor::visitPre(DocParamSect *s) if (m_hide) return; forceEndParagraph(s); m_t << "<dl><dt><b>"; + QCString className; switch(s->type()) { case DocParamSect::Param: - m_t << theTranslator->trParameters(); break; + m_t << theTranslator->trParameters(); + className="params"; + break; case DocParamSect::RetVal: - m_t << theTranslator->trReturnValues(); break; + m_t << theTranslator->trReturnValues(); + className="retval"; + break; case DocParamSect::Exception: - m_t << theTranslator->trExceptions(); break; + m_t << theTranslator->trExceptions(); + className="exception"; + break; case DocParamSect::TemplateParam: /* TODO: add this m_t << theTranslator->trTemplateParam(); break; */ m_t << "Template Parameters"; break; + className="tparams"; default: ASSERT(0); } m_t << ":"; m_t << "</b></dt><dd>" << endl; - m_t << " <table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl; + m_t << " <table class=\"" << className << "\">" << endl; } void HtmlDocVisitor::visitPost(DocParamSect *s) @@ -1345,25 +1372,55 @@ void HtmlDocVisitor::visitPost(DocParamSect *s) void HtmlDocVisitor::visitPre(DocParamList *pl) { if (m_hide) return; - m_t << " <tr><td valign=\"top\">"; - if (pl->direction()!=DocParamSect::Unspecified) + m_t << " <tr>"; + DocParamSect *sect = 0; + if (pl->parent()->kind()==DocNode::Kind_ParamSect) { - m_t << "<tt>["; - if (pl->direction()==DocParamSect::In) - { - m_t << "in"; - } - else if (pl->direction()==DocParamSect::Out) + sect=(DocParamSect*)pl->parent(); + } + if (sect && sect->hasInOutSpecifier()) + { + m_t << "<td class=\"paramdir\">"; + if (pl->direction()!=DocParamSect::Unspecified) { - m_t << "out"; + m_t << "["; + if (pl->direction()==DocParamSect::In) + { + m_t << "in"; + } + else if (pl->direction()==DocParamSect::Out) + { + m_t << "out"; + } + else if (pl->direction()==DocParamSect::InOut) + { + m_t << "in,out"; + } + m_t << "]"; } - else if (pl->direction()==DocParamSect::InOut) + m_t << "</td>"; + } + if (sect && sect->hasTypeSpecifier()) + { + m_t << "<td class=\"paramtype\">"; + QListIterator<DocNode> li(pl->paramTypes()); + DocNode *type; + bool first=TRUE; + for (li.toFirst();(type=li.current());++li) { - m_t << "in,out"; + if (!first) m_t << " | "; else first=FALSE; + if (type->kind()==DocNode::Kind_Word) + { + visit((DocWord*)type); + } + else if (type->kind()==DocNode::Kind_LinkedWord) + { + visit((DocLinkedWord*)type); + } } - m_t << "]</tt> "; + m_t << "</td>"; } - m_t << "</td><td valign=\"top\"><em>"; + m_t << "<td class=\"paramname\">"; //QStrListIterator li(pl->parameters()); //const char *s; QListIterator<DocNode> li(pl->parameters()); @@ -1381,7 +1438,7 @@ void HtmlDocVisitor::visitPre(DocParamList *pl) visit((DocLinkedWord*)param); } } - m_t << "</em> </td><td>"; + m_t << "</td><td>"; } void HtmlDocVisitor::visitPost(DocParamList *) diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h index b31247f..c033e8b 100644 --- a/src/htmldocvisitor.h +++ b/src/htmldocvisitor.h @@ -103,6 +103,8 @@ class HtmlDocVisitor : public DocVisitor void visitPost(DocImage *); void visitPre(DocDotFile *); void visitPost(DocDotFile *); + void visitPre(DocMscFile *); + void visitPost(DocMscFile *); void visitPre(DocLink *); void visitPost(DocLink *); void visitPre(DocRef *); diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index 116b6da..60dc956 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -1006,7 +1006,17 @@ void LatexDocVisitor::visitPost(DocDotFile *df) if (m_hide) return; endDotFile(df->hasCaption()); } +void LatexDocVisitor::visitPre(DocMscFile *df) +{ + if (m_hide) return; + startMscFile(df->file(),df->width(),df->height(),df->hasCaption()); +} +void LatexDocVisitor::visitPost(DocMscFile *df) +{ + if (m_hide) return; + endMscFile(df->hasCaption()); +} void LatexDocVisitor::visitPre(DocLink *lnk) { if (m_hide) return; @@ -1082,10 +1092,15 @@ void LatexDocVisitor::visitPost(DocSecRefList *) void LatexDocVisitor::visitPre(DocParamSect *s) { if (m_hide) return; + bool hasInOutSpecs = s->hasInOutSpecifier(); + bool hasTypeSpecs = s->hasTypeSpecifier(); switch(s->type()) { case DocParamSect::Param: - m_t << "\n\\begin{DoxyParams}{"; + m_t << "\n\\begin{DoxyParams}"; + if (hasInOutSpecs && hasTypeSpecs) m_t << "[2]"; // 2 extra cols + else if (hasInOutSpecs || hasTypeSpecs) m_t << "[1]"; // 1 extra col + m_t << "{"; filter(theTranslator->trParameters()); break; case DocParamSect::RetVal: @@ -1134,23 +1149,60 @@ void LatexDocVisitor::visitPost(DocParamSect *s) void LatexDocVisitor::visitPre(DocParamList *pl) { if (m_hide) return; - m_t << "\\item["; - if (pl->direction()!=DocParamSect::Unspecified) + DocParamSect::Type parentType = DocParamSect::Unknown; + DocParamSect *sect = 0; + if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect) { - m_t << "\\mbox{\\tt["; - if (pl->direction()==DocParamSect::In) - { - m_t << "in"; - } - else if (pl->direction()==DocParamSect::Out) + parentType = ((DocParamSect*)pl->parent())->type(); + sect=(DocParamSect*)pl->parent(); + } + bool useTable = parentType==DocParamSect::Param || + parentType==DocParamSect::RetVal || + parentType==DocParamSect::Exception || + parentType==DocParamSect::TemplateParam; + if (!useTable) + { + m_t << "\\item["; + } + if (sect && sect->hasInOutSpecifier()) + { + if (pl->direction()!=DocParamSect::Unspecified) { - m_t << "out"; + m_t << "\\mbox{\\tt "; + if (pl->direction()==DocParamSect::In) + { + m_t << "in"; + } + else if (pl->direction()==DocParamSect::Out) + { + m_t << "out"; + } + else if (pl->direction()==DocParamSect::InOut) + { + m_t << "in,out"; + } + m_t << "} "; } - else if (pl->direction()==DocParamSect::InOut) + if (useTable) m_t << " & "; + } + if (sect && sect->hasTypeSpecifier()) + { + QListIterator<DocNode> li(pl->paramTypes()); + DocNode *type; + bool first=TRUE; + for (li.toFirst();(type=li.current());++li) { - m_t << "in,out"; + if (!first) m_t << " | "; else first=FALSE; + if (type->kind()==DocNode::Kind_Word) + { + visit((DocWord*)type); + } + else if (type->kind()==DocNode::Kind_LinkedWord) + { + visit((DocLinkedWord*)type); + } } - m_t << "]} "; + if (useTable) m_t << " & "; } m_t << "{\\em "; //QStrListIterator li(pl->parameters()); @@ -1172,11 +1224,34 @@ void LatexDocVisitor::visitPre(DocParamList *pl) } m_insideItem=FALSE; } - m_t << "}]"; + m_t << "}"; + if (useTable) + { + m_t << " & "; + } + else + { + m_t << "]"; + } } -void LatexDocVisitor::visitPost(DocParamList *) +void LatexDocVisitor::visitPost(DocParamList *pl) { + if (m_hide) return; + DocParamSect::Type parentType = DocParamSect::Unknown; + if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect) + { + parentType = ((DocParamSect*)pl->parent())->type(); + } + bool useTable = parentType==DocParamSect::Param || + parentType==DocParamSect::RetVal || + parentType==DocParamSect::Exception || + parentType==DocParamSect::TemplateParam; + if (useTable) + { + m_t << "\\\\" << endl + << "\\hline" << endl; + } } void LatexDocVisitor::visitPre(DocXRefItem *x) @@ -1358,6 +1433,70 @@ void LatexDocVisitor::endDotFile(bool hasCaption) } } +void LatexDocVisitor::startMscFile(const QCString &fileName, + const QCString &width, + const QCString &height, + bool hasCaption + ) +{ + QCString baseName=fileName; + int i; + if ((i=baseName.findRev('/'))!=-1) + { + baseName=baseName.right(baseName.length()-i-1); + } + if (baseName.right(4)==".eps" || baseName.right(4)==".pdf") + { + baseName=baseName.left(baseName.length()-4); + } + if (baseName.right(4)==".dot") + { + baseName=baseName.left(baseName.length()-4); + } + QCString outDir = Config_getString("LATEX_OUTPUT"); + QCString name = fileName; + writeMscGraphFromFile(name,outDir,baseName,MSC_EPS); + if (hasCaption) + { + m_t << "\n\\begin{DoxyImage}\n"; + } + else + { + m_t << "\n\\begin{DoxyImageNoCaption}\n" + " \\mbox{"; + } + m_t << "\\includegraphics"; + if (!width.isEmpty()) + { + m_t << "[width=" << width << "]"; + } + else if (!height.isEmpty()) + { + m_t << "[height=" << height << "]"; + } + m_t << "{" << baseName << "}"; + + if (hasCaption) + { + m_t << "\n\\caption{"; + } +} + +void LatexDocVisitor::endMscFile(bool hasCaption) +{ + if (m_hide) return; + m_t << "}\n"; // end caption or mbox + if (hasCaption) + { + m_t << "\\end{DoxyImage}\n"; + } + else + { + m_t << "\\end{DoxyImageNoCaption}\n"; + } +} + + void LatexDocVisitor::writeMscFile(const QCString &baseName) { QCString shortName = baseName; diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h index 7b7a4d9..39f110e 100644 --- a/src/latexdocvisitor.h +++ b/src/latexdocvisitor.h @@ -106,6 +106,8 @@ class LatexDocVisitor : public DocVisitor void visitPost(DocImage *); void visitPre(DocDotFile *); void visitPost(DocDotFile *); + void visitPre(DocMscFile *); + void visitPost(DocMscFile *); void visitPre(DocLink *lnk); void visitPost(DocLink *); void visitPre(DocRef *ref); @@ -144,6 +146,10 @@ class LatexDocVisitor : public DocVisitor void startDotFile(const QCString &fileName,const QCString &width, const QCString &height, bool hasCaption); void endDotFile(bool hasCaption); + + void startMscFile(const QCString &fileName,const QCString &width, + const QCString &height, bool hasCaption); + void endMscFile(bool hasCaption); void writeMscFile(const QCString &fileName); void pushEnabled(); diff --git a/src/latexgen.cpp b/src/latexgen.cpp index f75b76a..4c5ae50 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -161,7 +161,12 @@ void LatexGenerator::init() t << endl << "clean:" << endl - << "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out refman.pdf" << endl; +#if defined(_MSC_VER) + << "\tdel " +#else + << "\trm -f " +#endif + << "*.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out refman.pdf" << endl; createSubDirs(d); } @@ -190,6 +195,8 @@ static void writeDefaultHeaderPart1(FTextStream &t) "\\usepackage{float}\n" "\\usepackage{listings}\n" "\\usepackage{color}\n" + "\\usepackage{ifthen}\n" + "\\usepackage[table]{xcolor}\n" "\\usepackage{textcomp}\n" "\\usepackage{alltt}\n" //"\\usepackage{ae,aecompl,aeguill}\n" @@ -311,7 +318,10 @@ static void writeDefaultStyleSheetPart1(FTextStream &t) "\\RequirePackage{calc}\n" "\\RequirePackage{color}\n" "\\RequirePackage{fancyhdr}\n" - "\\RequirePackage{verbatim}\n\n"; + "\\RequirePackage{longtable}\n" + "\\RequirePackage{verbatim}\n" + "\\RequirePackage{ifthen}\n" + "\\RequirePackage{xcolor}\n\n"; t << "% Use helvetica font instead of times roman\n" "\\RequirePackage{helvet}\n" @@ -601,10 +611,28 @@ static void writeDefaultStyleSheetPart3(FTextStream &t) " \\end{list}%\n" "}\n\n"; t << "% Used by parameter lists\n" - "\\newenvironment{DoxyParams}[1]{%\n" - " \\begin{DoxyDesc}{#1}%\n" + "\\newenvironment{DoxyParams}[2][]{%\n" + " \\begin{DoxyDesc}{#2}%\n" " \\begin{description}%\n" + " \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n" + " \\definecolor{tableShade}{HTML}{F8F8F8}%\n" + " \\rowcolors{1}{white}{tableShade}%\n" + " \\arrayrulecolor{gray}%\n" + " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n" + " \\ifthenelse{\\equal{#1}{}}\n" // default: name, docs columns + " {\\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n" + " p{0.87\\textwidth}|}}%\n" + " {\\ifthenelse{\\equal{#1}{1}}%\n" // inout, name, docs columns, or type, name, docs columns + " {\\begin{longtable}{|>{\\centering}p{0.10\\textwidth}|%\n" + " >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n" + " p{0.75\\textwidth}|}}%\n" + " {\\begin{longtable}{|>{\\centering}p{0.10\\textwidth}|%\n" // inout, type, name, docs columns + " >{\\centering\\hspace{0pt}}p{0.15\\textwidth}|%\n" + " >{\\raggedleft\\hspace{0pt}}p{0.15\\textwidth}|%\n" + " p{0.58\\textwidth}|}}%\n" + " }\\hline%\n" "}{%\n" + " \\end{longtable}%\n" " \\end{description}%\n" " \\end{DoxyDesc}%\n" "}\n\n"; @@ -617,7 +645,16 @@ static void writeDefaultStyleSheetPart3(FTextStream &t) "\\newenvironment{DoxyRetVals}[1]{%\n" " \\begin{DoxyDesc}{#1}%\n" " \\begin{description}%\n" + " \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n" + " \\definecolor{tableShade}{HTML}{F8F8F8}%\n" + " \\rowcolors{1}{white}{tableShade}%\n" + " \\arrayrulecolor{gray}%\n" + " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n" + " \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n" + " p{0.77\\textwidth}|}%\n" + " \\hline%\n" "}{%\n" + " \\end{longtable}%\n" " \\end{description}%\n" " \\end{DoxyDesc}%\n" "}\n\n"; @@ -625,7 +662,16 @@ static void writeDefaultStyleSheetPart3(FTextStream &t) "\\newenvironment{DoxyExceptions}[1]{%\n" " \\begin{DoxyDesc}{#1}%\n" " \\begin{description}%\n" + " \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n" + " \\definecolor{tableShade}{HTML}{F8F8F8}%\n" + " \\rowcolors{1}{white}{tableShade}%\n" + " \\arrayrulecolor{gray}%\n" + " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n" + " \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n" + " p{0.77\\textwidth}|}%\n" + " \\hline%\n" "}{%\n" + " \\end{longtable}%\n" " \\end{description}%\n" " \\end{DoxyDesc}%\n" "}\n\n"; @@ -633,7 +679,16 @@ static void writeDefaultStyleSheetPart3(FTextStream &t) "\\newenvironment{DoxyTemplParams}[1]{%\n" " \\begin{DoxyDesc}{#1}%\n" " \\begin{description}%\n" + " \\item[] \\hspace{\\fill} \\vspace{-25pt}%\n" + " \\definecolor{tableShade}{HTML}{F8F8F8}%\n" + " \\rowcolors{1}{white}{tableShade}%\n" + " \\arrayrulecolor{gray}%\n" + " \\setlength{\\tabcolsep}{0.01\\textwidth}%\n" + " \\begin{longtable}{|>{\\raggedleft\\hspace{0pt}}p{0.25\\textwidth}|%\n" + " p{0.77\\textwidth}|}%\n" + " \\hline%\n" "}{%\n" + " \\end{longtable}%\n" " \\end{description}%\n" " \\end{DoxyDesc}%\n" "}\n\n"; diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index 902b37c..d1ec0d3 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -718,6 +718,14 @@ void ManDocVisitor::visitPre(DocDotFile *) void ManDocVisitor::visitPost(DocDotFile *) { } +void ManDocVisitor::visitPre(DocMscFile *) +{ +} + +void ManDocVisitor::visitPost(DocMscFile *) +{ +} + void ManDocVisitor::visitPre(DocLink *) { diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h index 5b7eebe..0be4dd5 100644 --- a/src/mandocvisitor.h +++ b/src/mandocvisitor.h @@ -104,6 +104,8 @@ class ManDocVisitor : public DocVisitor void visitPost(DocImage *); void visitPre(DocDotFile *); void visitPost(DocDotFile *); + void visitPre(DocMscFile *); + void visitPost(DocMscFile *); void visitPre(DocLink *lnk); void visitPost(DocLink *); void visitPre(DocRef *ref); diff --git a/src/message.cpp b/src/message.cpp index cc9925a..cece558 100644 --- a/src/message.cpp +++ b/src/message.cpp @@ -116,8 +116,9 @@ void msg(const char *fmt, ...) static void do_warn(const char *tag, const char *file, int line, const char *fmt, va_list args) { if (!Config_getBool(tag)) return; // warning type disabled - char text[40960]; - vsprintf(text, fmt, args); + char text[4096]; + vsnprintf(text, 4096, fmt, args); + text[4095]='\0'; QCString fileSubst = file==0 ? "<unknown>" : file; QCString lineSubst; lineSubst.setNum(line); QCString textSubst = text; diff --git a/src/msc.cpp b/src/msc.cpp index 87ec5d3..a60ce90 100644 --- a/src/msc.cpp +++ b/src/msc.cpp @@ -112,11 +112,17 @@ void writeMscGraphFromFile(const char *inFile,const char *outDir, } mscArgs+=" -i \""; mscArgs+=inFile; - mscArgs+=".msc\" -o \""; + + if (QCString(inFile).right(4)!=".msc") // add extension if not given + { + mscArgs+=".msc"; + } + mscArgs+="\" -o \""; + mscArgs+=outFile; mscArgs+=extension+"\""; int exitCode; - //printf("*** running: %s %s\n",mscExe.data(),mscArgs.data()); +// printf("*** running: %s %s outDir:%s %s\n",mscExe.data(),mscArgs.data(),outDir,outFile); portable_sysTimerStart(); if ((exitCode=portable_system(mscExe,mscArgs,FALSE))!=0) { @@ -146,6 +152,8 @@ QCString getMscImageMapFromFile(const QCString& inFile, const QCString& outDir, { QCString outFile = inFile + ".map"; + + //printf("*** running:getMscImageMapFromFile \n"); // chdir to the output dir, so dot can find the font file. QCString oldDir = convertToQCString(QDir::currentDirPath()); // go to the html output directory (i.e. path) @@ -154,7 +162,12 @@ QCString getMscImageMapFromFile(const QCString& inFile, const QCString& outDir, QCString mscExe = Config_getString("MSCGEN_PATH")+"mscgen"+portable_commandExtension(); QCString mscArgs = "-T ismap -i \""; - mscArgs+=inFile + ".msc\" -o \""; + mscArgs+=inFile; + if (QCString(inFile).right(4)!=".msc") // add extension if not given + { + mscArgs+=".msc"; + } + mscArgs+="\" -o \""; mscArgs+=outFile + "\""; int exitCode; diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 49ae643..2b57f6c 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -350,6 +350,8 @@ public: void visitPost(DocImage *); void visitPre(DocDotFile *); void visitPost(DocDotFile *); + void visitPre(DocMscFile *); + void visitPost(DocMscFile *); void visitPre(DocLink *); void visitPost(DocLink *); void visitPre(DocRef *); @@ -1094,6 +1096,20 @@ void PerlModDocVisitor::visitPost(DocDotFile *) m_output.add("</dotfile>"); #endif } +void PerlModDocVisitor::visitPre(DocMscFile *) +{ +#if 0 + m_output.add("<mscfile name=\""); m_output.add(df->file()); m_output.add("\">"); +#endif +} + +void PerlModDocVisitor::visitPost(DocMscFile *) +{ +#if 0 + m_output.add("</dotfile>"); +#endif +} + void PerlModDocVisitor::visitPre(DocLink *lnk) { diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index 44b63f1..b86236d 100644 --- a/src/printdocvisitor.h +++ b/src/printdocvisitor.h @@ -503,6 +503,16 @@ class PrintDocVisitor : public DocVisitor indent_post(); printf("</dotfile>\n"); } + void visitPre(DocMscFile *df) + { + indent_pre(); + printf("<mscfile src=\"%s\">\n",df->name().data()); + } + void visitPost(DocMscFile *) + { + indent_post(); + printf("</mscfile>\n"); + } void visitPre(DocLink *lnk) { indent_pre(); diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index e420601..4886b8d 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -22,6 +22,7 @@ #include "doxygen.h" #include "outputgen.h" #include "dot.h" +#include "msc.h" #include "util.h" #include "rtfstyle.h" #include "message.h" @@ -1080,6 +1081,21 @@ void RTFDocVisitor::visitPost(DocDotFile *) DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocDotFile)}\n"); popEnabled(); } +void RTFDocVisitor::visitPre(DocMscFile *df) +{ + DBG_RTF("{\\comment RTFDocVisitor::visitPre(MscDotFile)}\n"); + writeMscFile(df->file()); + + // hide caption since it is not supported at the moment + pushEnabled(); + m_hide=TRUE; +} + +void RTFDocVisitor::visitPost(DocMscFile *) +{ + DBG_RTF("{\\comment RTFDocVisitor::visitPost(MscDotFile)}\n"); + popEnabled(); +} void RTFDocVisitor::visitPre(DocLink *lnk) { @@ -1191,42 +1207,142 @@ void RTFDocVisitor::visitPre(DocParamSect *s) m_t << ":"; m_t << "\\par"; m_t << "}" << endl; - incIndentLevel(); + bool useTable = s->type()==DocParamSect::Param || + s->type()==DocParamSect::RetVal || + s->type()==DocParamSect::Exception || + s->type()==DocParamSect::TemplateParam; + if (!useTable) + { + incIndentLevel(); + } m_t << rtf_Style_Reset << getStyle("DescContinue"); m_lastIsPara=TRUE; } -void RTFDocVisitor::visitPost(DocParamSect *) +void RTFDocVisitor::visitPost(DocParamSect *s) { if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocParamSect)}\n"); //m_t << "\\par" << endl; - decIndentLevel(); + bool useTable = s->type()==DocParamSect::Param || + s->type()==DocParamSect::RetVal || + s->type()==DocParamSect::Exception || + s->type()==DocParamSect::TemplateParam; + if (!useTable) + { + decIndentLevel(); + } m_t << "}" << endl; } void RTFDocVisitor::visitPre(DocParamList *pl) { + static int columnPos[4][5] = + { { 2, 25, 100, 100, 100 }, // no inout, no type + { 3, 14, 35, 100, 100 }, // inout, no type + { 3, 25, 50, 100, 100 }, // no inout, type + { 4, 14, 35, 55, 100 }, // no inout, type + }; + int config=0; if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocParamList)}\n"); - // Put in the direction: in/out/in,out if specified. - if (pl->direction()!=DocParamSect::Unspecified) + DocParamSect::Type parentType = DocParamSect::Unknown; + DocParamSect *sect = 0; + if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect) + { + parentType = ((DocParamSect*)pl->parent())->type(); + sect=(DocParamSect*)pl->parent(); + } + bool useTable = parentType==DocParamSect::Param || + parentType==DocParamSect::RetVal || + parentType==DocParamSect::Exception || + parentType==DocParamSect::TemplateParam; + if (sect && sect->hasInOutSpecifier()) config+=1; + if (sect && sect->hasTypeSpecifier()) config+=2; + if (useTable) { - m_t << "["; - if (pl->direction()==DocParamSect::In) + int i; + m_t << "\\trowd \\trgaph108\\trleft426\\tblind426" + "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 " + "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 " + "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 " + "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 " + "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 " + "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 "<< endl; + for (i=0;i<columnPos[config][0];i++) { - m_t << "in"; + m_t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 " + "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 " + "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 " + "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 " + "\\cltxlrtb " + "\\cellx" << (rtf_pageWidth*columnPos[config][i+1]/100) << endl; } - else if (pl->direction()==DocParamSect::Out) + m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl; + } + + if (sect && sect->hasInOutSpecifier()) + { + if (useTable) { - m_t << "out"; + m_t << "{"; } - else if (pl->direction()==DocParamSect::InOut) + + // Put in the direction: in/out/in,out if specified. + if (pl->direction()!=DocParamSect::Unspecified) { - m_t << "in,out"; + if (pl->direction()==DocParamSect::In) + { + m_t << "in"; + } + else if (pl->direction()==DocParamSect::Out) + { + m_t << "out"; + } + else if (pl->direction()==DocParamSect::InOut) + { + m_t << "in,out"; + } } - m_t << "] "; + + if (useTable) + { + m_t << "\\cell }"; + } + } + + if (sect && sect->hasTypeSpecifier()) + { + if (useTable) + { + m_t << "{"; + } + QListIterator<DocNode> li(pl->paramTypes()); + DocNode *type; + bool first=TRUE; + for (li.toFirst();(type=li.current());++li) + { + if (!first) m_t << " | "; else first=FALSE; + if (type->kind()==DocNode::Kind_Word) + { + visit((DocWord*)type); + } + else if (type->kind()==DocNode::Kind_LinkedWord) + { + visit((DocLinkedWord*)type); + } + } + if (useTable) + { + m_t << "\\cell }"; + } + } + + + if (useTable) + { + m_t << "{"; } m_t << "{\\i "; @@ -1248,14 +1364,41 @@ void RTFDocVisitor::visitPre(DocParamList *pl) } } m_t << "} "; + + if (useTable) + { + m_t << "\\cell }{"; + } m_lastIsPara=TRUE; } -void RTFDocVisitor::visitPost(DocParamList *) +void RTFDocVisitor::visitPost(DocParamList *pl) { if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocParamList)}\n"); - m_t << "\\par" << endl; + + DocParamSect::Type parentType = DocParamSect::Unknown; + DocParamSect *sect = 0; + if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect) + { + parentType = ((DocParamSect*)pl->parent())->type(); + sect=(DocParamSect*)pl->parent(); + } + bool useTable = parentType==DocParamSect::Param || + parentType==DocParamSect::RetVal || + parentType==DocParamSect::Exception || + parentType==DocParamSect::TemplateParam; + if (useTable) + { + m_t << "\\cell }" << endl; + //m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl; + m_t << "{\\row }" << endl; + } + else + { + m_t << "\\par" << endl; + } + m_lastIsPara=TRUE; } diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h index db7e28b..ccadaa9 100644 --- a/src/rtfdocvisitor.h +++ b/src/rtfdocvisitor.h @@ -104,7 +104,9 @@ class RTFDocVisitor : public DocVisitor void visitPost(DocImage *); void visitPre(DocDotFile *); void visitPost(DocDotFile *); - void visitPre(DocLink *lnk); + void visitPre(DocMscFile *); + void visitPost(DocMscFile *); + void visitPre(DocLink *); void visitPost(DocLink *); void visitPre(DocRef *ref); void visitPost(DocRef *); diff --git a/src/scanner.l b/src/scanner.l index 3e7c6ca..4846433 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -567,6 +567,7 @@ FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]+ ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?) SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)(((~|!){BN}*)?{ID}) +PHPSCOPENAME ({ID}"\\")+{ID} TSCOPE {ID}("<"[a-z_A-Z0-9 \t\*\&,]*">")? CSSCOPENAME (({ID}?{BN}*"."{BN}*)*)((~{BN}*)?{ID}) PRE [pP][rR][eE] @@ -635,6 +636,8 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) %x Comment %x PackageName %x JavaImport +%x PHPUse +%x PHPUseAs %x CSAccessorDecl %x CSGeneric %x PreLineCtrl @@ -1205,10 +1208,11 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) <ObjCSkipStatement>";" { BEGIN(FindMembers); } -<PackageName>{ID}("."{ID})* { +<PackageName>{ID}(("."|"\\"){ID})* { isTypedef=FALSE; current->name = yytext; current->name = substitute(current->name,".","::"); + current->name = substitute(current->name,"\\","::"); current->section = Entry::NAMESPACE_SEC; current->type = "namespace" ; current->fileName = yyFileName; @@ -1286,7 +1290,14 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) current->startLine = yyLineNr; current->bodyLine = yyLineNr; lineCount(); - BEGIN( CompoundName ); + if (insidePHP) + { + BEGIN( PackageName ); + } + else + { + BEGIN( CompoundName ); + } } <FindMembers>{B}*"module"{BN}+ { lineCount(); @@ -1649,14 +1660,57 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) <NSAliasArg>";" { BEGIN( FindMembers ); } +<PHPUse>({ID}{BN}*"\\"{BN}*)+{ID} { + lineCount(); + aliasName=yytext; + //current->fileName = yyFileName; + //current->section=Entry::USINGDIR_SEC; + //current_root->addSubEntry(current); + //current = new Entry; + //initEntry(); + BEGIN(PHPUseAs); + } +<PHPUseAs>{BN}+"as"{BN}+ { + lineCount(); + } +<PHPUseAs>{ID} { + Doxygen::namespaceAliasDict.insert(yytext, + new QCString(removeRedundantWhiteSpace( + substitute(aliasName,"\\","::")))); + aliasName.resize(0); + } +<PHPUseAs>[,;] { + if (!aliasName.isEmpty()) + { + int i=aliasName.findRev('\\'); + QCString an = removeRedundantWhiteSpace( + substitute(aliasName,"\\","::")); + Doxygen::namespaceAliasDict.insert(aliasName.mid(i+1), + new QCString(an)); + current->name = an; + current->fileName = yyFileName; + current->section=Entry::USINGDECL_SEC; + current_root->addSubEntry(current); + current = new Entry ; + initEntry(); + } + if (*yytext==',') + { + BEGIN(PHPUse); + } + else + { + BEGIN(FindMembers); + } + } <JavaImport>({ID}{BN}*"."{BN}*)+"*" { // package import => add as a using directive lineCount(); QCString scope=yytext; - current->name=removeRedundantWhiteSpace(substitute(scope.left(scope.length()-2),".","::")); + current->name=removeRedundantWhiteSpace(substitute(scope.left(scope.length()-1),".","::")); current->fileName = yyFileName; current->section=Entry::USINGDIR_SEC; current_root->addSubEntry(current); - current = new Entry ; + current = new Entry; initEntry(); BEGIN(Using); } @@ -1892,6 +1946,10 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) else // insideJava or insideD BEGIN(JavaImport); } + else if (insidePHP && strcmp(yytext,"use")==0) + { + BEGIN(PHPUse); + } else if (insideJava && strcmp(yytext,"package")==0) { lineCount(); @@ -4783,7 +4841,23 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) <BasesProt>"private"{BN}+ { lineCount(); baseProt = Private; } <BasesProt>{BN} { lineCount(); } <BasesProt>. { unput(*yytext); BEGIN(Bases); } +<Bases>("\\")?{BN}*({ID}{BN}*"\\"{BN}*)*{ID} { + if (!insidePHP) + { + REJECT; + } + else // PHP base class of the form \Ns\Cl or Ns\Cl + { + lineCount(); + QCString bn=yytext; + bn = substitute(bn,"\\","::"); + baseName += bn; + current->args += ' '; + current->args += yytext; + } + } <Bases>("::")?{BN}*({ID}{BN}*"::"{BN}*)*{ID} { + lineCount(); QCString baseScope = yytext; if (insideCS && baseScope.stripWhiteSpace()=="where") { diff --git a/src/textdocvisitor.h b/src/textdocvisitor.h index 081d57e..4c56935 100644 --- a/src/textdocvisitor.h +++ b/src/textdocvisitor.h @@ -102,6 +102,9 @@ class TextDocVisitor : public DocVisitor void visitPost(DocImage *) {} void visitPre(DocDotFile *) {} void visitPost(DocDotFile *) {} + + void visitPre(DocMscFile *) {} + void visitPost(DocMscFile *) {} void visitPre(DocLink *) {} void visitPost(DocLink *) {} void visitPre(DocRef *) {} diff --git a/src/util.cpp b/src/util.cpp index d31781b..b2d026f 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -6445,7 +6445,7 @@ bool updateLanguageMapping(const QCString &extension,const QCString &language) // found the language SrcLangExt parserId = p->parserId; - QCString extName = extension; + QCString extName = extension.lower(); if (extName.isEmpty()) return FALSE; if (extName.at(0)!='.') extName.prepend("."); if (g_extLookup.find(extension)!=0) // language was already register for this ext @@ -6499,7 +6499,7 @@ SrcLangExt getLanguageFromFileName(const QCString fileName) int i = fileName.findRev('.'); if (i!=-1) // name has an extension { - QCString extStr=fileName.right(fileName.length()-i); + QCString extStr=fileName.right(fileName.length()-i).lower(); if (!extStr.isEmpty()) // non-empty extension { int *pVal=g_extLookup.find(extStr); @@ -380,6 +380,7 @@ void writeSummaryLink(OutputList &ol,const char *label,const char *title, QCString externalLinkTarget(); QCString externalRef(const QCString &relPath,const QCString &ref,bool href); +int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos); #endif diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index d4c6d52..bf9c349 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -294,7 +294,7 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem tt=tt.upper(); ecd =getClass(tt); } - else if (!ecd) + if (!ecd) { tt=tt.lower(); ecd =getClass(tt); diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index 2c09a0a..5dfa052 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -711,6 +711,17 @@ void XmlDocVisitor::visitPost(DocDotFile *) m_t << "</dotfile>" << endl; } +void XmlDocVisitor::visitPre(DocMscFile *df) +{ + if (m_hide) return; + m_t << "<mscfile name=\"" << df->file() << "\">"; +} + +void XmlDocVisitor::visitPost(DocMscFile *) +{ + if (m_hide) return; + m_t << "</dotfile>" << endl; +} void XmlDocVisitor::visitPre(DocLink *lnk) { if (m_hide) return; @@ -810,6 +821,24 @@ void XmlDocVisitor::visitPre(DocParamList *pl) DocNode *param; for (li.toFirst();(param=li.current());++li) { + if (pl->paramTypes().count()>0) + { + QListIterator<DocNode> li(pl->paramTypes()); + DocNode *type; + for (li.toFirst();(type=li.current());++li) + { + m_t << "<parametertype>"; + if (type->kind()==DocNode::Kind_Word) + { + visit((DocWord*)type); + } + else if (type->kind()==DocNode::Kind_LinkedWord) + { + visit((DocLinkedWord*)type); + } + m_t << "</parametertype>" << endl; + } + } m_t << "<parametername"; if (pl->direction()!=DocParamSect::Unspecified) { diff --git a/src/xmldocvisitor.h b/src/xmldocvisitor.h index 89001aa..137af25 100644 --- a/src/xmldocvisitor.h +++ b/src/xmldocvisitor.h @@ -105,6 +105,9 @@ class XmlDocVisitor : public DocVisitor void visitPost(DocImage *); void visitPre(DocDotFile *); void visitPost(DocDotFile *); + + void visitPre(DocMscFile *); + void visitPost(DocMscFile *); void visitPre(DocLink *); void visitPost(DocLink *); void visitPre(DocRef *); |