From fd8b446f8ae60e7d1dc259c6f5fe38c287377d19 Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Tue, 10 Jan 2012 21:15:46 +0000 Subject: Release-1.7.6.1-20120110 --- INSTALL | 4 +- Makefile.in | 8 +- Makefile.win_make.in | 3 +- Makefile.win_nmake.in | 3 +- README | 4 +- configure | 4 +- doc/Doxyfile | 3 +- doc/commands.doc | 30 +- doc/config.doc | 67 +- doc/diagrams.doc | 2 +- doc/doxygen.1 | 2 +- doc/doxygen.sty | 231 +++- doc/doxygen_manual.tex | 47 +- doc/doxytag.1 | 21 - doc/doxytag_usage.doc | 97 -- doc/doxywizard.1 | 2 +- doc/external.doc | 36 +- doc/htmlcmds.doc | 2 + doc/index.doc | 3 - doc/infoflow.eps | 58 +- doc/infoflow.fig | 13 +- doc/infoflow.gif | Bin 13383 -> 12857 bytes doc/install.doc | 18 +- doc/installdox_usage.doc | 59 - doc/lists.doc | 27 +- doc/starting.doc | 5 - examples/memgrp.cpp | 8 +- qtools/qxml.cpp | 35 +- qtools/qxml.h | 2 +- src/Makefile.in | 12 +- src/classdef.cpp | 30 +- src/classdef.h | 2 +- src/cmdmapper.cpp | 1 + src/cmdmapper.h | 1 + src/commentscan.l | 47 +- src/compound.xsd | 7 + src/compound_xsd.h | 7 + src/config.l | 13 +- src/config.xml | 26 +- src/configoptions.cpp | 29 +- src/dbusxmlscanner.cpp | 45 +- src/debug.cpp | 1 + src/debug.h | 3 +- src/definition.cpp | 10 +- src/definition.h | 2 +- src/docparser.cpp | 94 +- src/docparser.h | 78 +- src/doctokenizer.h | 3 +- src/doctokenizer.l | 170 ++- src/docvisitor.h | 8 +- src/doxygen.cpp | 35 +- src/doxygen.css | 9 + src/doxygen.h | 1 + src/doxygen_css.h | 9 + src/doxytag.l | 930 --------------- src/doxytag.pro.in | 31 - src/doxytag.t | 50 - src/ftvhelp.cpp | 1 - src/growbuf.h | 38 + src/htmldocvisitor.cpp | 69 +- src/htmldocvisitor.h | 2 + src/htmlgen.cpp | 11 +- src/index.cpp | 39 +- src/instdox.cpp | 180 --- src/instdox.h | 23 - src/latexdocvisitor.cpp | 12 + src/latexdocvisitor.h | 4 +- src/latexgen.cpp | 2 +- src/libdoxygen.pro.in | 4 +- src/mandocvisitor.cpp | 21 + src/mandocvisitor.h | 2 + src/markdown.cpp | 1890 ++++++++++++++++++++++++++++++ src/markdown.h | 52 + src/memberlist.cpp | 2 +- src/pagedef.cpp | 11 +- src/perlmodgen.cpp | 14 + src/printdocvisitor.h | 10 + src/rtfdocvisitor.cpp | 25 + src/rtfdocvisitor.h | 4 +- src/scanner.l | 2 +- src/tclscanner.l | 570 ++++++--- src/textdocvisitor.h | 2 + src/util.cpp | 312 +++-- src/util.h | 34 +- src/vhdlcode.l | 11 +- src/vhdldocgen.cpp | 667 ++++++----- src/vhdldocgen.h | 40 +- src/vhdlparser.y | 2889 ++++++++++++++++++++++++---------------------- src/vhdlscanner.l | 111 +- src/xmldocvisitor.cpp | 13 + src/xmldocvisitor.h | 2 + src/xmlgen.cpp | 4 +- winbuild/Doxygen.sln | 24 +- winbuild/Doxygen.vcproj | 2342 ++++++++++++++++++++++++++++++------- winbuild/Doxytag.vcproj | 328 ------ winbuild/iconv.vcproj | 464 ++++++++ winbuild/iconv64.lib | Bin 0 -> 1206128 bytes winbuild/qtools.vcproj | 818 +++++++++++-- 98 files changed, 8626 insertions(+), 4871 deletions(-) delete mode 100644 doc/doxytag.1 delete mode 100644 doc/doxytag_usage.doc delete mode 100644 doc/installdox_usage.doc delete mode 100644 src/doxytag.l delete mode 100644 src/doxytag.pro.in delete mode 100644 src/doxytag.t create mode 100644 src/growbuf.h delete mode 100644 src/instdox.cpp delete mode 100644 src/instdox.h create mode 100644 src/markdown.cpp create mode 100644 src/markdown.h delete mode 100644 winbuild/Doxytag.vcproj create mode 100644 winbuild/iconv.vcproj create mode 100644 winbuild/iconv64.lib diff --git a/INSTALL b/INSTALL index d374629..47142f5 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ -DOXYGEN Version 1.7.6.1-20111226 +DOXYGEN Version 1.7.6.1-20120110 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (26 December 2011) +Dimitri van Heesch (10 January 2012) diff --git a/Makefile.in b/Makefile.in index b326561..0de53ad 100644 --- a/Makefile.in +++ b/Makefile.in @@ -31,11 +31,11 @@ distclean: clean -rm -f latex -rm -f objects/*.o -rm -f src/Makefile.doxygen src/Makefile.libdoxygen - -rm -f src/Makefile.doxytag src/Makefile.libdoxycfg + -rm -f src/Makefile.libdoxycfg -rm -f libmd5/Makefile.libmd5 -rm -f Makefile qtools/Makefile src/Makefile examples/Makefile doc/Makefile -rm -f .makeconfig .tmakeconfig - -rm -f src/doxygen.pro src/libdoxygen.pro src/doxytag.pro qtools/qtools.pro src/libdoxycfg.pro libmd5/libmd5.pro + -rm -f src/doxygen.pro src/libdoxygen.pro qtools/qtools.pro src/libdoxycfg.pro libmd5/libmd5.pro -rm -f src/version.cpp -rm -r addon/doxywizard/Makefile -rm -f addon/doxywizard/doxywizard.pro @@ -49,14 +49,10 @@ MAN1DIR = man/man1 install: doxywizard_install $(INSTTOOL) -d $(DESTDIR)/$(INSTALL)/bin $(INSTTOOL) -m 755 bin/doxygen $(DESTDIR)/$(INSTALL)/bin - $(INSTTOOL) -m 755 bin/doxytag $(DESTDIR)/$(INSTALL)/bin $(INSTTOOL) -d $(DESTDIR)/$(INSTALL)/$(MAN1DIR) cat doc/doxygen.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > doxygen.1 $(INSTTOOL) -m 644 doxygen.1 $(DESTDIR)/$(INSTALL)/$(MAN1DIR)/doxygen.1 rm doxygen.1 - cat doc/doxytag.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > doxytag.1 - $(INSTTOOL) -m 644 doxytag.1 $(DESTDIR)/$(INSTALL)/$(MAN1DIR)/doxytag.1 - rm doxytag.1 install_docs: $(INSTTOOL) -d $(DESTDIR)/$(DOCDIR) diff --git a/Makefile.win_make.in b/Makefile.win_make.in index d3f270b..9b51ada 100644 --- a/Makefile.win_make.in +++ b/Makefile.win_make.in @@ -13,10 +13,9 @@ clean: distclean: clean -del src\Makefile.libdoxygen \ src\Makefile.doxygen \ - src\Makefile.doxytag \ src\Makefile.libdoxycfg -del Makefile src\Makefile examples\Makefile doc\Makefile - -del src\libdoxygen.pro src\doxygen.pro src\doxytag.pro src\libdoxycfg.pro + -del src\libdoxygen.pro src\doxygen.pro src\libdoxycfg.pro -del src\version.cpp docs: diff --git a/Makefile.win_nmake.in b/Makefile.win_nmake.in index 46dad89..0ef6baa 100644 --- a/Makefile.win_nmake.in +++ b/Makefile.win_nmake.in @@ -25,10 +25,9 @@ clean: FORCE distclean: clean -del src\Makefile.libdoxygen \ src\Makefile.doxygen \ - src\Makefile.doxytag \ src\Makefile.libdoxycfg -del Makefile src\Makefile examples\Makefile doc\Makefile - -del src\libdoxygen.pro src\doxygen.pro src\doxytag.pro src\libdoxycfg.pro + -del src\libdoxygen.pro src\doxygen.pro src\libdoxycfg.pro -del src\version.cpp docs: FORCE diff --git a/README b/README index bafcc8a..282d58e 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -DOXYGEN Version 1.7.6.1_20111226 +DOXYGEN Version 1.7.6.1_20120110 Please read INSTALL for compilation instructions. @@ -26,4 +26,4 @@ forum. Enjoy, -Dimitri van Heesch (dimitri@stack.nl) (26 December 2011) +Dimitri van Heesch (dimitri@stack.nl) (10 January 2012) diff --git a/configure b/configure index 68e628a..65e56fe 100755 --- a/configure +++ b/configure @@ -20,7 +20,7 @@ doxygen_version_minor=7 doxygen_version_revision=6.1 #NOTE: Setting version_mmn to "NO" will omit mmn info from the package. -doxygen_version_mmn=20111226 +doxygen_version_mmn=20120110 bin_dirs=`echo $PATH | sed -e "s/:/ /g"` @@ -626,7 +626,7 @@ EOF echo " Created $DST from $SRC..." done -f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in src/doxytag.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in addon/doxmlparser/examples/metrics/metrics.pro.in libmd5/libmd5.pro.in addon/doxyapp/doxyapp.pro.in" +f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in addon/doxmlparser/examples/metrics/metrics.pro.in libmd5/libmd5.pro.in addon/doxyapp/doxyapp.pro.in" for i in $f_inprofiles ; do SRC=$i diff --git a/doc/Doxyfile b/doc/Doxyfile index 5c666af..74ed73d 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -35,8 +35,7 @@ INPUT = index.doc install.doc starting.doc docblocks.doc lists.doc \ grouping.doc formulas.doc diagrams.doc preprocessing.doc \ autolink.doc output.doc searching.doc customize.doc custcmd.doc \ external.doc faq.doc trouble.doc features.doc \ - doxygen_usage.doc doxytag_usage.doc \ - doxywizard_usage.doc installdox_usage.doc \ + doxygen_usage.doc doxywizard_usage.doc \ config.doc commands.doc htmlcmds.doc xmlcmds.doc language.doc \ perlmod.doc perlmod_tree.doc arch.doc FILE_PATTERNS = *.cpp *.h *.doc diff --git a/doc/commands.doc b/doc/commands.doc index f2c3ddd..0b1db8c 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -192,7 +192,7 @@ documentation: \refitem cmdhash \\\# \refitem cmdperc \\\% \refitem cmdquot \\\" -\refitem cmddcolon \\\:: +\refitem cmddcolon \:: \endsecreflist The following subsections provide a list of all commands that are recognized by @@ -219,7 +219,7 @@ Structural indicators \verbatim /*! \addtogroup mygrp - * Additional documentation for group `mygrp' + * Additional documentation for group 'mygrp' * @{ */ @@ -699,8 +699,8 @@ Structural indicators This command can be used to generate the following standard text for an overloaded member function: - `This is an overloaded member function, provided for convenience. - It differs from the above function only in what argument(s) it accepts.' + > This is an overloaded member function, provided for convenience. + > It differs from the above function only in what argument(s) it accepts. If the documentation for the overloaded member function is not located in front of the function declaration or definition, the optional @@ -738,7 +738,7 @@ Structural indicators not directly related to one specific class, file or member. The HTML generator creates a page containing the documentation. The \f$\mbox{\LaTeX}\f$ generator - starts a new section in the chapter `Page documentation'. + starts a new section in the chapter 'Page documentation'. \par Example: \verbinclude page.doc @@ -878,7 +878,7 @@ Structural indicators \addindex \\relates This command can be used in the documentation of a non-member function - \. It puts the function inside the `related function' section + \. It puts the function inside the 'related function' section of the class documentation. This command is useful for documenting non-friend functions that are nevertheless strongly coupled to a certain class. It prevents the need of having to document a file, but @@ -902,7 +902,7 @@ Structural indicators \addindex \\relatesalso This command can be used in the documentation of a non-member function - \. It puts the function both inside the `related function' section + \. It puts the function both inside the 'related function' section of the class documentation as well as leaving it at its normal file documentation location. This command is useful for documenting non-friend functions that are nevertheless strongly coupled to a certain @@ -1845,7 +1845,7 @@ Commands for displaying examples tag of doxygen's configuration file. The class and member declarations and definitions inside the code fragment - are `remembered' during the parsing of the comment block that contained + are 'remembered' during the parsing of the comment block that contained the \\dontinclude command. For line by line descriptions of source files, one or more lines @@ -2167,7 +2167,7 @@ Commands for visual enhancements should also be documented for the copying to work. To copy the documentation for a member of a - class for instance one can put the following in the documentation + class one can, for instance, put the following in the documentation: \verbatim /*! @copydoc MyClass::myfunction() @@ -2179,7 +2179,7 @@ Commands for visual enhancements explicitly (without spaces!), like in the following: \verbatim - /*! @copydoc MyClass::myfunction(type1,type2) */ + //! @copydoc MyClass::myfunction(type1,type2) \endverbatim Qualified names are only needed if the context in which the documentation @@ -2188,13 +2188,15 @@ Commands for visual enhancements The \\copydoc command can be used recursively, but cycles in the \\copydoc relation will be broken and flagged as an error. - Note that both the brief description and the detailed documentation - will be copied. See \ref cmdcopybrief "\\copybrief" and + Note that \\copydoc foo() is roughly equivalent to doing: +\verbatim + \brief \copybrief foo() + \details \copydetails foo() +\endverbatim + See \ref cmdcopybrief "\\copybrief" and \ref cmdcopydetails "\\copydetails" for copying only the brief or detailed part of the comment block. - \sa sections \ref cmdcopybrief "\\copybrief" and \ref cmdcopydetails "\\copydetails" -
\section cmdcopybrief \\copybrief diff --git a/doc/config.doc b/doc/config.doc index 677b991..9ec918b 100644 --- a/doc/config.doc +++ b/doc/config.doc @@ -202,6 +202,7 @@ followed by the descriptions of the tags grouped by category. \refitem cfg_man_extension MAN_EXTENSION \refitem cfg_man_links MAN_LINKS \refitem cfg_man_output MAN_OUTPUT +\refitem cfg_markdown_support MARKDOWN_SUPPORT \refitem cfg_mathjax_extensions MATHJAX_EXTENSIONS \refitem cfg_mathjax_relpath MATHJAX_RELPATH \refitem cfg_max_dot_graph_depth MAX_DOT_GRAPH_DEPTH @@ -459,6 +460,16 @@ followed by the descriptions of the tags grouped by category. Qt-style will behave just like regular Qt-style comments (thus requiring an explicit \\brief command for a brief description.) +\anchor cfg_markdown_support +
\c MARKDOWN_SUPPORT
+ \addindex MARKDOWN_SUPPORT + If \c MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all + comments according to the Markdown format, which allows for more readable + documentation. See http://daringfireball.net/projects/markdown/ for details. + The output of markdown processing is further processed by doxygen, so you + can mix doxygen, HTML, and XML commands with Markdown formatting. + Disable only in case of backward compatibilities issues. + \anchor cfg_builtin_stl_support
\c BUILTIN_STL_SUPPORT
\addindex BUILTIN_STL_SUPPORT @@ -1116,7 +1127,7 @@ 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 - */test/* + `*``/test/``*` \anchor cfg_example_path
\c EXAMPLE_PATH
@@ -1137,8 +1148,8 @@ AClass::ANamespace, ANamespace::*Test
\c EXAMPLE_PATTERNS
\addindex EXAMPLE_PATTERNS If the value of the \c EXAMPLE_PATH tag contains directories, you can use the - \c EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp - and *.h) to filter out the source-files in the directories. If left + \c EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like `*.cpp` + and `*.h`) to filter out the source-files in the directories. If left blank all files are included. \anchor cfg_image_path @@ -1168,7 +1179,7 @@ AClass::ANamespace, ANamespace::*Test The \c FILTER_PATTERNS tag can be used to specify filters on a per file pattern basis. Doxygen will compare the file name with each pattern and apply the filter if there is a match. The filters are a list of the form: - pattern=filter (like *.cpp=my_cpp_filter). See \c INPUT_FILTER for further + pattern=filter (like `*.cpp=my_cpp_filter`). See \c INPUT_FILTER for further info on how filters are used. If \c FILTER_PATTERNS is empty or if non of the patterns match the file name, \c INPUT_FILTER is applied. @@ -1186,7 +1197,7 @@ AClass::ANamespace, ANamespace::*Test The \c FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file pattern. A pattern will override the setting for \c FILTER_PATTERN (if any) and it is also possible to disable source filtering for a specific pattern - using *.ext= (so without naming a filter). This option only has effect when + using `*.ext=` (so without naming a filter). This option only has effect when \c FILTER_SOURCE_FILES is enabled. @@ -1308,7 +1319,7 @@ AClass::ANamespace, ANamespace::*Test \addindex HTML_OUTPUT The \c HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a relative path is entered the value of \c OUTPUT_DIRECTORY will be - put in front of it. If left blank `html' will be used as the default path. + put in front of it. If left blank 'html' will be used as the default path. \anchor cfg_html_file_extension
\c HTML_FILE_EXTENSION
@@ -1778,7 +1789,7 @@ and Class Hierarchy pages using a tree view instead of an ordered list. Use this tag to change the font size of Latex formulas included as images in the HTML documentation. The default is 10. when you change the font size after a successful doxygen run you need - to manually remove any form_*.png images from the HTML + to manually remove any `form_*.png` images from the HTML output directory to force them to be regenerated. \anchor cfg_formula_transparent @@ -1787,7 +1798,7 @@ and Class Hierarchy pages using a tree view instead of an ordered list. Use the \c FORMULA_TRANPARENT tag to determine whether or not the images generated for formulas are transparent PNGs. Transparent PNGs are not supported properly for IE 6.0, but are supported on all modern browsers. - Note that when changing this option you need to delete any form_*.png files + Note that when changing this option you need to delete any `form_*.png` files in the HTML output before the changes have effect. \anchor cfg_use_mathjax @@ -1837,13 +1848,13 @@ MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols The \c LATEX_OUTPUT tag is used to specify where the \f$\mbox{\LaTeX}\f$ docs will be put. If a relative path is entered the value of \c OUTPUT_DIRECTORY will be - put in front of it. If left blank `latex' will be used as the default path. + put in front of it. If left blank 'latex' will be used as the default path. \anchor cfg_latex_cmd_name
\c LATEX_CMD_NAME
\addindex LATEX_CMD_NAME The \c LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be invoked. - If left blank `latex' will be used as the default command name. + If left blank 'latex' will be used as the default command name. Note that when enabling USE_PDFLATEX this option is only used for generating bitmaps for formulas in the HTML output, but not in the Makefile that is written to the output directory. @@ -1852,7 +1863,7 @@ MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
\c MAKEINDEX_CMD_NAME
\addindex MAKEINDEX_CMD_NAME The MAKEINDEX_CMD_NAME tag can be used to specify the command name to - generate index for LaTeX. If left blank `makeindex' will be used as the + generate index for LaTeX. If left blank 'makeindex' will be used as the default command name. \anchor cfg_compact_latex @@ -2039,7 +2050,7 @@ EXTRA_PACKAGES = times \addindex MAN_OUTPUT The \c MAN_OUTPUT tag is used to specify where the man pages will be put. If a relative path is entered the value of \c OUTPUT_DIRECTORY will be - put in front of it. If left blank `man' will be used as the default path. + put in front of it. If left blank 'man' will be used as the default path. A directory man3 will be created inside the directory specified by \c MAN_OUTPUT. @@ -2195,7 +2206,7 @@ EXTRA_PACKAGES = times
\c INCLUDE_FILE_PATTERNS
\addindex INCLUDE_FILE_PATTERNS You can use the \c INCLUDE_FILE_PATTERNS tag to specify one or more wildcard - patterns (like *.h and *.hpp) to filter out the header-files in the + patterns (like `*.h` and `*.hpp`) to filter out the header-files in the directories. If left blank, the patterns specified with \c FILE_PATTERNS will be used. @@ -2234,27 +2245,13 @@ EXTRA_PACKAGES = times
\c TAGFILES
\addindex TAGFILES - The \c TAGFILES tag can be used to specify one or more tagfiles. - - See section \ref doxytag_usage for more information about the usage of - tag files. - - Optionally an initial location of the external documentation - can be added for each tagfile. - The format of a tag file without this location is as follows: -
-TAGFILES = file1 file2 ... 
- Adding location for the tag files is done as follows: -
-TAGFILES = file1=loc1 "file2 = loc2" ... 
- where \c loc1 and \c loc2 can be relative or absolute paths or URLs, - If a location is present for each tag, the installdox tool (see - section \ref installdox_usage for more information) does not - have to be run to correct the links. - - \par Note: + The \c TAGFILES tag can be used to specify one or more tag files. + + See \ref external for more information about the use of tag files. + + \note Each tag file must have a unique name - (where the name does \e not include the path) + (where the name does \e not include the path). If a tag file is not located in the directory in which doxygen is run, you must also specify the path to the tagfile here. @@ -2263,7 +2260,7 @@ TAGFILES = file1=loc1 "file2 = loc2" ... \addindex GENERATE_TAGFILE When a file name is specified after \c GENERATE_TAGFILE, doxygen will create a tag file that is based on the input files it reads. - See section \ref doxytag_usage for more information about the usage of + See section \ref external for more information about the usage of tag files. \anchor cfg_allexternals @@ -2284,7 +2281,7 @@ TAGFILES = file1=loc1 "file2 = loc2" ...
\c PERL_PATH
\addindex PERL_PATH The \c PERL_PATH should be the absolute path and name of the perl script - interpreter (i.e. the result of `which perl'). + interpreter (i.e. the result of 'which perl'). \section config_dot Dot options diff --git a/doc/diagrams.doc b/doc/diagrams.doc index 78fcfbd..0f5c607 100644 --- a/doc/diagrams.doc +++ b/doc/diagrams.doc @@ -115,7 +115,7 @@ 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*, T\* ). + of type C, where B is a subtype of C (e.g. `C` could be `B`, `B*`, `T\*`). diff --git a/doc/doxygen.1 b/doc/doxygen.1 index 37e4adb..deb0c20 100644 --- a/doc/doxygen.1 +++ b/doc/doxygen.1 @@ -43,4 +43,4 @@ If configName is omitted `Doxyfile' will be used as a default. .SH AUTHOR Doxygen version VERSION, Copyright Dimitri van Heesch 1997-2011 .SH SEE ALSO -doxytag(1), doxywizard(1). +doxywizard(1). diff --git a/doc/doxygen.sty b/doc/doxygen.sty index 4bd82f1..44becf8 100644 --- a/doc/doxygen.sty +++ b/doc/doxygen.sty @@ -1,40 +1,74 @@ -% -% -% -% Copyright (C) 1997-2011 by Dimitri van Heesch. -% -% Permission to use, copy, modify, and distribute this software and its -% documentation under the terms of the GNU General Public License is hereby -% granted. No representations are made about the suitability of this software -% for any purpose. It is provided "as is" without express or implied warranty. -% See the GNU General Public License for more details. -% -% Documents produced by Doxygen are derivative works derived from the -% input used in their production; they are not affected by this license. - \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{doxygen} -\RequirePackage{calc} + +% Packages used by this style file +\RequirePackage{alltt} \RequirePackage{array} +\RequirePackage{calc} +\RequirePackage{color} +\RequirePackage{fancyhdr} +\RequirePackage{longtable} \RequirePackage{verbatim} -\pagestyle{fancyplain} -\addtolength{\headwidth}{\marginparsep} -\addtolength{\headwidth}{\marginparwidth} -\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}} -\lhead[\fancyplain{}{\bfseries\thepage}] - {\fancyplain{}{\bfseries\rightmark}} -\rhead[\fancyplain{}{\bfseries\leftmark}] - {\fancyplain{}{\bfseries\thepage}} -\rfoot[\fancyplain{}{\bfseries\scriptsize User Manual for Doxygen $VERSION, written by Dimitri van Heesch \copyright 1997-2011}]{} -\lfoot[]{\fancyplain{}{\bfseries\scriptsize User Manual for Doxygen $VERSION, written by Dimitri van Heesch \copyright 1997-2011}} -\cfoot{} +\RequirePackage{ifthen} +\RequirePackage[table]{xcolor} +% Use helvetica font instead of times roman +\RequirePackage{helvet} +\RequirePackage{sectsty} +\RequirePackage{tocloft} +\providecommand{\rmdefault}{phv} +\providecommand{\bfdefault}{bc} + + +% Setup fancy headings +\pagestyle{fancyplain} +\newcommand{\clearemptydoublepage}{% + \newpage{\pagestyle{empty}\cleardoublepage}% +} +\renewcommand{\chaptermark}[1]{% + \markboth{#1}{}% +} +\renewcommand{\sectionmark}[1]{% + \markright{\thesection\ #1}% +} +\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}} +\fancyhead[CE]{\fancyplain{}{}} +\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}} +\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}} +\fancyhead[CO]{\fancyplain{}{}} +\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}} +\fancyfoot[LE]{\fancyplain{}{}} +\fancyfoot[CE]{\fancyplain{}{}} +\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated on Fri Dec 16 2011 21\-:40\-:27 for My Project by Doxygen }} +\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated on Fri Dec 16 2011 21\-:40\-:27 for My Project by Doxygen }} +\fancyfoot[CO]{\fancyplain{}{}} +\fancyfoot[RO]{\fancyplain{}{}} %---------- Internal commands used in this style file ---------------- +\newcommand\tabfill[1]{% + \dimen@\linewidth% + \advance\dimen@\@totalleftmargin% + \advance\dimen@-\dimen\@curtab% + \parbox[t]\dimen@{\raggedright #1\ifhmode\strut\fi}% +} + +\newcommand{\ensurespace}[1]{% + \begingroup + \setlength{\dimen@}{#1}% + \vskip\z@\@plus\dimen@ + \penalty -100\vskip\z@\@plus -\dimen@ + \vskip\dimen@ + \penalty 9999% + \vskip -\dimen@ + \vskip\z@skip % hide the previous |\vskip| from |\addvspace| + \endgroup +} + % Generic environment used by all paragraph-based environments defined % below. Note that the command \title{...} needs to be defined inside % those environments! \newenvironment{DoxyDesc}[1]{% + \ensurespace{4\baselineskip}% \begin{list}{}% {% \settowidth{\labelwidth}{40pt}% @@ -43,7 +77,7 @@ \setlength{\itemsep}{-4pt}% \renewcommand{\makelabel}{\entrylabel}% }% - \item[#1:]% + \item[#1]% }{% \end{list}% } @@ -177,6 +211,13 @@ \end{DoxyDesc}% } +% Used by @copyright +\newenvironment{DoxyCopyright}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + % Used by @remark \newenvironment{DoxyRemark}[1]{% \begin{DoxyDesc}{#1}% @@ -221,9 +262,8 @@ % Used by @internal \newenvironment{DoxyInternal}[1]{% - \begin{DoxyDesc}{#1}% + \paragraph*{#1}% }{% - \end{DoxyDesc}% } % Used by @par and @paragraph @@ -242,19 +282,62 @@ } % Used by parameter lists -\newenvironment{DoxyParams}[1]{% +\newenvironment{DoxyParams}[2][]{% + \begin{DoxyDesc}{#2}% + \item[] \hspace{\fill} \vspace{-40pt}% + \settowidth{\labelwidth}{40pt}% + \setlength{\LTleft}{0pt}% + \setlength{\tabcolsep}{0.01\textwidth}% + \ifthenelse{\equal{#1}{}}% + {\begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% + p{0.815\textwidth}|}}% + {\ifthenelse{\equal{#1}{1}}% + {\begin{longtable}{|>{\centering}p{0.10\textwidth}|% + >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% + p{0.685\textwidth}|}}% + {\begin{longtable}{|>{\centering}p{0.10\textwidth}|% + >{\centering\hspace{0pt}}p{0.15\textwidth}|% + >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% + p{0.515\textwidth}|}}% + }\hline% +}{% + \end{longtable}% + \end{DoxyDesc}% +} + +% Used for fields of simple structs +\newenvironment{DoxyFields}[1]{% \begin{DoxyDesc}{#1}% - \begin{description}% + \item[] \hspace{\fill} \vspace{-40pt}% + \settowidth{\labelwidth}{40pt}% + \setlength{\LTleft}{0pt}% + \setlength{\tabcolsep}{0.01\textwidth}% + \begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% + p{0.15\textwidth}|% + p{0.635\textwidth}|}% + \hline% }{% - \end{description}% + \end{longtable}% \end{DoxyDesc}% } +% is used for parameters within a detailed function description +\newenvironment{DoxyParamCaption}{% + \renewcommand{\item}[2][]{##1 {\em ##2}}% + }{% +} + % Used by return value lists \newenvironment{DoxyRetVals}[1]{% \begin{DoxyDesc}{#1}% \begin{description}% + \item[] \hspace{\fill} \vspace{-25pt}% + \setlength{\tabcolsep}{0.01\textwidth}% + \begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|% + p{0.77\textwidth}|}% + \hline% }{% + \end{longtable}% \end{description}% \end{DoxyDesc}% } @@ -263,7 +346,16 @@ \newenvironment{DoxyExceptions}[1]{% \begin{DoxyDesc}{#1}% \begin{description}% + \item[] \hspace{\fill} \vspace{-25pt}% + \definecolor{tableShade}{HTML}{F8F8F8}% + \rowcolors{1}{white}{tableShade}% + \arrayrulecolor{gray}% + \setlength{\tabcolsep}{0.01\textwidth}% + \begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|% + p{0.77\textwidth}|}% + \hline% }{% + \end{longtable}% \end{description}% \end{DoxyDesc}% } @@ -272,7 +364,16 @@ \newenvironment{DoxyTemplParams}[1]{% \begin{DoxyDesc}{#1}% \begin{description}% + \item[] \hspace{\fill} \vspace{-25pt}% + \definecolor{tableShade}{HTML}{F8F8F8}% + \rowcolors{1}{white}{tableShade}% + \arrayrulecolor{gray}% + \setlength{\tabcolsep}{0.01\textwidth}% + \begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|% + p{0.77\textwidth}|}% + \hline% }{% + \end{longtable}% \end{description}% \end{DoxyDesc}% } @@ -284,12 +385,12 @@ \setlength{\itemsep}{0pt} \setlength{\parsep}{0pt} \setlength{\topsep}{0pt} - \renewcommand{\makelabel}{}}} + \renewcommand{\makelabel}{\hfill}}} {\end{list}} \newenvironment{DoxyCompactItemize} { \begin{itemize} - \setlength{\itemsep}{-4pt} + \setlength{\itemsep}{-3pt} \setlength{\parsep}{0pt} \setlength{\topsep}{0pt} \setlength{\partopsep}{0pt} @@ -306,7 +407,8 @@ } {\end{tabular*}\par} \newcommand{\entrylabel}[1]{ - {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\\}}} + {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{% + \usefont{OT1}{phv}{bc}{n}\color{darkgray}#1}\vspace{1.5\baselineskip}}}} \newenvironment{Desc} {\begin{list}{} { @@ -318,6 +420,63 @@ } } {\end{list}} +\newsavebox{\xrefbox} +\newlength{\xreflength} +\newcommand{\xreflabel}[1]{% + \sbox{\xrefbox}{#1}% + \setlength{\xreflength}{\wd\xrefbox}% + \ifthenelse{\xreflength>\labelwidth}{% + \begin{minipage}{\textwidth}% + \setlength{\parindent}{0pt}% + \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}% + \end{minipage}% + }{% + \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}% + }}% +\newenvironment{DoxyRefList}{% + \begin{list}{}{% + \setlength{\labelwidth}{10pt}% + \setlength{\leftmargin}{\labelwidth}% + \addtolength{\leftmargin}{\labelsep}% + \renewcommand{\makelabel}{\xreflabel}% + }% + }% +{\end{list}} +\newenvironment{DoxyRefDesc}[1] +{\begin{list}{}{% + \renewcommand\makelabel[1]{\textbf{##1}} + \settowidth\labelwidth{\makelabel{#1}} + \setlength\leftmargin{\labelwidth+\labelsep}}} +{\end{list}} +\newenvironment{Indent} + {\begin{list}{}{\setlength{\leftmargin}{0.5cm}} + \item[]\ignorespaces} + {\unskip\end{list}} \setlength{\parindent}{0cm} \setlength{\parskip}{0.2cm} -\sloppy +\addtocounter{secnumdepth}{2} +\usepackage[T1]{fontenc} +\makeatletter +\renewcommand{\paragraph}{\@startsection{paragraph}{4}{0ex}% + {-1.0ex}% + {1.0ex}% + {\usefont{OT1}{phv}{bc}{n}\color{darkgray}}} +\renewcommand{\subparagraph}{\@startsection{subparagraph}{5}{0ex}% + {-1.0ex}% + {1.0ex}% + {\usefont{OT1}{phv}{bc}{n}\color{darkgray}}} +\makeatother +\allsectionsfont{\usefont{OT1}{phv}{bc}{n}\selectfont\color{darkgray}} +\stepcounter{secnumdepth} +\stepcounter{tocdepth} +\definecolor{comment}{rgb}{0.5,0.0,0.0} +\definecolor{keyword}{rgb}{0.0,0.5,0.0} +\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} +\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} +\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} +\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} +\definecolor{charliteral}{rgb}{0.0,0.5,0.5} +\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} +\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} +\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} +\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex index 9dfd459..010ba4c 100644 --- a/doc/doxygen_manual.tex +++ b/doc/doxygen_manual.tex @@ -12,30 +12,55 @@ % Documents produced by Doxygen are derivative works derived from the % input used in their production; they are not affected by this license. -\documentclass[a4paper]{report} +\documentclass[a4paper]{book} \usepackage{makeidx} -\usepackage{fancyhdr} -\usepackage{float} -\usepackage{longtable} +\usepackage{natbib} \usepackage{graphicx} -\usepackage{epsf} -\usepackage{doxygen} \usepackage{multicol} -\usepackage{times} +\usepackage{float} +\usepackage{listings} +\usepackage{color} +\usepackage{ifthen} +\usepackage[table]{xcolor} +\usepackage{textcomp} \usepackage{alltt} -\usepackage{tocloft} +\usepackage{ifpdf} +\ifpdf \usepackage[pdftex, pagebackref=true, colorlinks=true, - linkcolor=blue + linkcolor=blue, + unicode ]{hyperref} +\else +\usepackage[ps2pdf, + pagebackref=true, + colorlinks=true, + linkcolor=blue, + unicode + ]{hyperref} +\usepackage{pspicture} +\fi +\usepackage[utf8]{inputenc} +\usepackage{mathptmx} +\usepackage[scaled=.90]{helvet} +\usepackage{courier} +\usepackage{sectsty} +\usepackage[titles]{tocloft} +\usepackage{doxygen} +\lstset{language=C++,inputencoding=utf8,basicstyle=\footnotesize,breaklines=true,breakatwhitespace=true,tabsize=8,numbers=left } \makeindex -\setcounter{tocdepth}{1} +\setcounter{tocdepth}{3} \renewcommand{\footrulewidth}{0.4pt} +\renewcommand{\familydefault}{\sfdefault} \renewcommand{\cftsecindent}{0 em} \renewcommand{\cftsecnumwidth}{3.2 em} \renewcommand{\cftsubsecindent}{3.2 em} \newcommand{\thisyear}{\the\year} +\hfuzz=15pt +\setlength{\emergencystretch}{15pt} +\hbadness=750 +\tolerance=750 \begin{document} \begin{titlepage} \includegraphics[width=\textwidth]{doxygen_logo} @@ -70,9 +95,7 @@ Written by Dimitri van Heesch\\[2ex] \part{Reference Manual} \chapter{Features}\label{features}\hypertarget{features}{}\input{features} \chapter{Doxygen usage}\label{doxygen_usage}\hypertarget{doxygen_usage}{}\input{doxygen_usage} -\chapter{Doxytag usage}\label{doxytag_usage}\hypertarget{doxytag_usage}{}\input{doxytag_usage} \chapter{Doxywizard usage}\label{doxywizard_usage}\hypertarget{doxywizard_usage}{}\input{doxywizard_usage} -\chapter{Installdox usage}\label{installdox_usage}\hypertarget{installdox_usage}{}\input{installdox_usage} \chapter{Configuration}\label{config}\hypertarget{config}{}\input{config} \chapter{Special Commands}\label{commands}\hypertarget{commands}{}\input{commands} \chapter{HTML commands}\label{htmlcmds}\hypertarget{htmlcmds}{}\input{htmlcmds} diff --git a/doc/doxytag.1 b/doc/doxytag.1 deleted file mode 100644 index a28879a..0000000 --- a/doc/doxytag.1 +++ /dev/null @@ -1,21 +0,0 @@ -.TH DOXYTAG "1" "DATE" "doxytag VERSION" "User Commands" -.SH NAME -doxytag \- generates a tag file and/or a search index for a set of HTML files -.SH SYNOPSIS -.B doxytag -[\fI-t tag_file\fR] [\fI-s index_file\fR] [ \fIhtml_file \fR[\fIhtml_file\fR...] ] -.SH DESCRIPTION -Generates a tag file and/or a search index for a set of HTML files. Use -doxysearch as a CGI program to search the tag file generated by doxytag. -.SH OPTIONS -.TP -\fB\-t\fR -Generate tag file . -.TP -\fB\-s\fR -Generate search index . -.PP -If no HTML files are given all files in the current dir that -have a .html extension are parsed. -.SH SEE ALSO -doxygen(1), doxywizard(1). diff --git a/doc/doxytag_usage.doc b/doc/doxytag_usage.doc deleted file mode 100644 index 25d45fd..0000000 --- a/doc/doxytag_usage.doc +++ /dev/null @@ -1,97 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2011 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ -/*! \page doxytag_usage Doxytag usage - -Doxytag is a small command line based utility. -It can generate tag files. -These tag files can be used with doxygen -to generate references to external documentation -(i.e. documentation not contained in the input files that are used by -doxygen). - -A tag file contains information about files, classes and members -documented in external documentation. Doxytag extracts this information -directly from the HTML files. This has the advantage that you do not need -to have the sources from which the documentation was extracted. - -If you \e do have the sources it is better to let \c doxygen generate the -tag file by putting the name of the tag file after -\ref cfg_generate_tagfile "GENERATE_TAGFILE" in -the configuration file. - -The input of doxytag consists of a set of HTML files. - -\par Important: - If you use tag files, the links that - are generated by doxygen will contain \e dummy links. You have to run - the \c installdox script to change these dummy links into real links. - See \ref installdox_usage for more information. - The use of dummy links may seem redundant, but it is really useful, - if you want to move the external documentation to another location. - Then the documentation does not need to be regenerated by \c doxygen, - only \c installdox has to be run. - -\par Note: - Because the HTML files are expected to have a certain - structure, only HTML files generated with doxygen or with Qt's class - browser generator can be used. Doxytag only reads the HTML files, - they are not altered in any way. - -Doxytag expects a list of all HTML files that form the documentation -or a directory that contains all HTML files. If neither is present doxytag -will read all files with a .html extension from the current directory. -If doxytag is used with the -t flag it generates a tag file. - -\par Example 1: - Suppose the file \c example.cpp from the \c examples directory that is listed - below is included in some package for which you do not have the sources. - Fortunately, the distributor of the packages included the HTML documentation - that was generated by doxygen in the package. - \verbinclude example.cpp - Now you can create a tag file from the HTML files in the package by - typing: -\verbatim -doxytag -t example.tag example/html -\endverbatim - from the examples directory. - Finally you can use this tag file with your own piece of code, such - as done in the following example: - \verbinclude tag.cpp - Doxygen will now include links to the external package in your own - documentation. Because the tag file does not specify where the - documentation is located, you will have to specify that by running the - installdox script that doxygen generates - (See section \ref installdox_usage for more information). - - Note that this is actually a feature because if you (or someone else) - moves the external documentation to a different - directory or URL you can simply run the script again and all links in - the HTML files will be updated. - - \htmlonly - Click here - for the corresponding HTML documentation that is generated by Doxygen using - only the tag file and second piece of code. - \endhtmlonly - -\par Example 2: - To generate a tag file of the Qt documentation you can do the following: -\verbatim -doxytag -t qt.tag $QTDIR/doc/html -\endverbatim - -*/ diff --git a/doc/doxywizard.1 b/doc/doxywizard.1 index 4195cbb..a209f21 100644 --- a/doc/doxywizard.1 +++ b/doc/doxywizard.1 @@ -7,4 +7,4 @@ doxywizard \- a tool to configure and run doxygen on your source files Doxywizard is an interactive frontend to the doxygen tool to configure and run doxygen on your source files. .SH SEE ALSO -doxygen(1), doxytag(1). +doxygen(1) diff --git a/doc/external.doc b/doc/external.doc index a1be8b1..2a6426e 100644 --- a/doc/external.doc +++ b/doc/external.doc @@ -58,21 +58,15 @@ To combine the output of one or more external projects with your own project you should specify the name of the tag files after the \ref cfg_tagfiles "TAGFILES" option in the configuration file. -A tag file does not contain information about where the external documentation -is located. This could be a directory or an URL. So when you include a tag -file you have to specify where the external documentation is located. -There are two ways to do this: -
-
At configuration time:
just assign the location of the output to the - tag files specified after the \ref cfg_tagfiles "TAGFILES" configuration - option. If you use a relative path it should be relative with respect to - the directory where the HTML output of your project is generated. -
After compile time:
if you do not assign a location to a tag file, - doxygen will generate dummy links for all external HTML references. It will - also generate a perl script called \ref installdox_usage "installdox" in - the HTML output directory. This script should be run to replace the - dummy links with real links for all generated HTML files. -
+A tag file typically only contains a relative location of the documentation from the +point where doxygen was run. So when you include a tag file in other project +you have to specify where the external documentation is located in relation this project. +You can do this in the configuration file by assigning the (relative) location to the +tag files specified after the \ref cfg_tagfiles "TAGFILES" configuration +option. If you use a relative path it should be relative with respect to +the directory where the HTML output of your project is generated; so a relative path +from the HTML output directory of a project to the HTML output of the other project that +is linked to. \par Example: Suppose you have a project \c proj that uses two external @@ -118,18 +112,6 @@ OUTPUT_DIRECTORY = ext2 GENERATE_TAGFILE = ext2/ext2.tag \endverbatim -In some (hopefully exceptional) cases you may have the documentation -generated by doxygen, but not the sources nor a tag file. In this case you -can use the \ref doxytag_usage "doxytag" tool to extract a tag file from -the generated HTML sources. Another case where you should use doxytag is -if you want to create a tag file for the Qt documentation. - -The tool \c doxytag depends on the particular structure -of the generated output and on some special markers that are generated by -doxygen. Since this type of extraction is brittle and error-prone I -suggest you only use this approach if there is no alternative. The -doxytag tool may even become obsolete in the future. - \htmlonly Go to the next section or return to the index. diff --git a/doc/htmlcmds.doc b/doc/htmlcmds.doc index 1327246..aa03498 100644 --- a/doc/htmlcmds.doc +++ b/doc/htmlcmds.doc @@ -30,6 +30,8 @@ of a HTML tag are passed on to the HTML output only
  • \ Ends a link or anchor
  • \ Starts a piece of text displayed in a bold font.
  • \ Ends a \ section. +
  • \ Starts a quotation block. +
  • \ Ends the quotation block.
  • \ Does not generate any output.
  • \ Does not generate any output.
  • \ Forces a line break. diff --git a/doc/index.doc b/doc/index.doc index fca1bd3..9d10829 100644 --- a/doc/index.doc +++ b/doc/index.doc @@ -88,10 +88,7 @@ The second part forms a reference manual:
    • Section \ref features presents an overview of what doxygen can do.
    • Section \ref doxygen_usage shows how to use the \c doxygen program. -
    • Section \ref doxytag_usage shows how to use the \c doxytag program.
    • Section \ref doxywizard_usage shows how to use the \c doxywizard program. -
    • Section \ref installdox_usage shows how to use the \c installdox - script that is generated by doxygen if you use tag files.
    • Section \ref config shows how to fine-tune doxygen, so it generates the documentation you want.
    • Section \ref commands shows an overview of the special commands that can be diff --git a/doc/infoflow.eps b/doc/infoflow.eps index dd7f799..f11b1fc 100644 --- a/doc/infoflow.eps +++ b/doc/infoflow.eps @@ -1,11 +1,12 @@ -%!PS-Adobe-2.0 EPSF-2.0 +%!PS-Adobe-3.0 EPSF-3.0 %%Title: infoflow.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5 -%%CreationDate: Sun Aug 17 14:52:37 2008 -%%For: dimitri@macbook.home.nl (Dimitri Van Heesch) +%%Creator: fig2dev Version 3.2 Patchlevel 5d +%%CreationDate: Thu Dec 29 10:46:41 2011 +%%For: dimitri@macbookpro (Dimitri van Heesch) %%BoundingBox: 0 0 661 582 %Magnification: 1.0000 %%EndComments +%%BeginProlog /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put @@ -46,10 +47,6 @@ $F2psDict /mtrx matrix put /col33 {0.000 0.000 0.000 srgb} bind def end -save -newpath 0 582 moveto 0 0 lineto 661 0 lineto 661 582 lineto closepath clip newpath --53.3 599.2 translate -1 -1 scale /cp {closepath} bind def /ef {eofill} bind def @@ -123,10 +120,22 @@ newfontname newfont definefont pop end } def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def +/pageheader { +save +newpath 0 582 moveto 0 0 lineto 661 0 lineto 661 582 lineto closepath clip newpath +-53.3 599.2 translate +1 -1 scale $F2psBegin 10 setmiterlimit 0 slj 0 slc 0.06000 0.06000 sc +} bind def +/pagefooter { +$F2psEnd +restore +} bind def +%%EndProlog +pageheader % % Fig objects follow % @@ -412,32 +421,11 @@ n 7875 9150 m % arrowhead n 8864 9180 m 8984 9150 l 8864 9120 l 8864 9180 l cp gs 0.00 setgray ef gr col0 s % Polyline -n 3300 8850 m 5100 8850 l 5100 9525 l 3300 9525 l - cp gs col32 1.00 shd ef gr gs col0 s gr -% Polyline -gs clippath -5236 9270 m 5085 9270 l 5085 9330 l 5236 9330 l 5236 9330 l 5116 9300 l 5236 9270 l cp -eoclip -n 6675 9300 m - 5100 9300 l gs col0 s gr gr - -% arrowhead -n 5236 9270 m 5116 9300 l 5236 9330 l 5236 9270 l cp gs 0.00 setgray ef gr col0 s -% Polyline [60] 0 sd n 8700 6450 m 11850 6450 l 11850 9975 l 8700 9975 l cp gs col0 s gr [] 0 sd % Polyline gs clippath -4305 7261 m 4305 7110 l 4245 7110 l 4245 7261 l 4245 7261 l 4275 7141 l 4305 7261 l cp -eoclip -n 4275 8850 m - 4275 7125 l gs col0 s gr gr - -% arrowhead -n 4305 7261 m 4275 7141 l 4245 7261 l 4305 7261 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath 4845 1514 m 4845 1665 l 4905 1665 l 4905 1514 l 4905 1514 l 4875 1634 l 4845 1514 l cp 4905 1186 m 4905 1035 l 4845 1035 l 4845 1186 l 4845 1186 l 4875 1066 l 4905 1186 l cp eoclip @@ -551,12 +539,6 @@ gs 1 -1 sc (HTML) col0 sh gr 6975 9300 m gs 1 -1 sc (pages) col0 sh gr /Times-Roman-iso ff 200.00 scf sf -5475 9525 m -gs 1 -1 sc (parse) col0 sh gr -/Times-Roman-iso ff 200.00 scf sf -3825 9300 m -gs 1 -1 sc (Doxytag) col0 sh gr -/Times-Roman-iso ff 200.00 scf sf 8775 6675 m gs 1 -1 sc (Windows only) col0 sh gr /Times-Roman-iso ff 200.00 scf sf @@ -569,9 +551,6 @@ gs 1 -1 sc (Sources) col0 sh gr 1275 5775 m gs 1 -1 sc (Custom) col0 sh gr /Times-Roman-iso ff 200.00 scf sf -4350 8175 m -gs 1 -1 sc (generate) col0 sh gr -/Times-Roman-iso ff 200.00 scf sf 3675 1350 m gs 1 -1 sc (generate/edit) col0 sh gr /Times-Roman-iso ff 200.00 scf sf @@ -639,8 +618,7 @@ n 900 3675 m 1200 3375 l 2100 3375 l 2100 4875 l 900 4875 l 900 3675 l 1200 3675 l 1200 3375 l gs col0 s gr % here ends figure; -$F2psEnd -rs +pagefooter showpage %%Trailer %EOF diff --git a/doc/infoflow.fig b/doc/infoflow.fig index d09c571..9db91af 100644 --- a/doc/infoflow.fig +++ b/doc/infoflow.fig @@ -1,4 +1,4 @@ -#FIG 3.2 Produced by xfig version 3.2.5 +#FIG 3.2 Produced by xfig version 3.2.5b Landscape Center Inches @@ -158,16 +158,8 @@ Single 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 1 1 1.00 60.00 120.00 7875 9150 9000 9150 -2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5 - 3300 8850 5100 8850 5100 9525 3300 9525 3300 8850 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 6675 9300 5100 9300 2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5 8700 6450 11850 6450 11850 9975 8700 9975 8700 6450 -2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 - 1 1 1.00 60.00 120.00 - 4275 8850 4275 7125 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2 1 1 1.00 60.00 120.00 1 1 1.00 60.00 120.00 @@ -209,13 +201,10 @@ Single 4 0 0 50 0 0 12 0.0000 4 150 390 11025 3825 PDF\001 4 0 0 50 0 0 12 0.0000 4 150 615 6975 9075 HTML\001 4 0 0 50 0 0 12 0.0000 4 150 510 6975 9300 pages\001 -4 0 0 50 0 0 12 0.0000 4 150 480 5475 9525 parse\001 -4 0 0 50 0 0 12 0.0000 4 195 735 3825 9300 Doxytag\001 4 0 0 50 0 0 12 0.0000 4 195 1215 8775 6675 Windows only\001 4 0 0 50 0 0 12 0.0000 4 150 390 8250 1200 read\001 4 0 0 50 0 0 12 0.0000 4 150 705 1200 4200 Sources\001 4 0 0 50 0 0 12 0.0000 4 150 675 1275 5775 Custom\001 -4 0 0 50 0 0 12 0.0000 4 165 765 4350 8175 generate\001 4 0 0 50 0 0 12 0.0000 4 195 1140 3675 1350 generate/edit\001 4 0 0 50 0 0 12 0.0000 4 195 1050 4425 750 Doxywizard\001 4 0 0 50 0 0 12 0.0000 4 150 390 4050 3525 read\001 diff --git a/doc/infoflow.gif b/doc/infoflow.gif index 4bd30c5..82fc46e 100644 Binary files a/doc/infoflow.gif and b/doc/infoflow.gif differ diff --git a/doc/install.doc b/doc/install.doc index b2dd559..6524750 100644 --- a/doc/install.doc +++ b/doc/install.doc @@ -130,8 +130,8 @@ Compilation is now done by performing the following steps: make \endverbatim - The program should compile without problems and three binaries - (doxygen and doxytag) + The program should compile without problems and the binaries + (doxygen and optionally doxywizard) should be available in the bin directory of the distribution.
    • Optional: Generate the user manual. @@ -319,8 +319,7 @@ dlopen /usr/lib/libc.a(nss_deffinder.o) \endverbatim Manually adding -Bdynamic after the target rule in -Makefile.doxygen and Makefile.doxytag -will fix this: +Makefile.doxygen will fix this: \verbatim $(TARGET): $(OBJECTS) $(OBJMOC) @@ -395,7 +394,7 @@ tar xvf doxygen-x.y.z.src.tar \endverbatim to unpack the sources. -Now your environment is setup to build \c doxygen and \c doxytag. +Now your environment is setup to build \c doxygen. Inside the \c doxygen-x.y.z directory you will find a \c winbuild directory containing a \c Doxygen.sln file. Open this file in Visual Studio. @@ -487,10 +486,10 @@ Here is what is required: steps.
    • From Doxygen-1.2.2-20001015 onwards, the distribution includes the part - of Qt that is needed for to compile doxygen and doxytag, + of Qt that is needed for to compile doxygen. The Windows specific part were also created. As a result doxygen (without the wizard) can be compiled on systems - without X11 or the (commerical) version of Qt. + without X11 or (the commerical version of) Qt.
    • If you used WinZip to extract the tar archive it will (apparently) not create empty folders, so you have to add the folders @@ -521,9 +520,8 @@ Compilation is now done by performing the following steps: make.bat msvc \endverbatim - This should build the executables - doxygen.exe and doxytag.exe - using Microsoft's Visual C++ compiler + This should build the executable + doxygen.exe using Microsoft's Visual C++ compiler (The compiler should not produce any serious warnings or errors). You can use also the bcc argument to build diff --git a/doc/installdox_usage.doc b/doc/installdox_usage.doc deleted file mode 100644 index a93ca0a..0000000 --- a/doc/installdox_usage.doc +++ /dev/null @@ -1,59 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2011 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ -/*! \page installdox_usage Installdox usage - -Installdox is a perl script that is generated by doxygen whenever -tag files are used (See \c TAGFILES -in section \ref config_extref). The script is -located in the same directory where the HTML files are located. - -Its purpose is to set the location of the external documentation -for each tag file at install time. - -Calling \c installdox with option -h at the command line -will give you a brief description of the usage of the program. - -The following options are available: -
      -
      -l \\@\
      - Each tag file contains information about the files, classes and members - documented in a set of HTML files. A user can install these - HTML files anywhere on his/her hard disk or web site. - Therefore installdox \e requires the location of the - documentation for each tag file \ - that is used by doxygen. The location \ can be - an absolute path or a URL. - - \par Note: - Each \ must be unique and should only be the name of the - file, not including the path. - -
      -q
      - When this option is specified, installdox will generate no output other - than fatal errors. -
      -Optionally a list of HTML files may be given. -These files are scanned and modified if needed. -If this list is omitted all files in the current directory -that end with \c .html are used. - -The \c installdox script is unique for each generated class browser -in the sense that it `knows' what tag files are used. It will generate an error if -the -l option is missing for a tag file or if an invalid tag file -is given. - -*/ diff --git a/doc/lists.doc b/doc/lists.doc index f5f9f96..f72957e 100644 --- a/doc/lists.doc +++ b/doc/lists.doc @@ -4,9 +4,13 @@ Doxygen provides a number of ways to create lists of items. Using dashes - By putting a number of column-aligned minus signs at the start of a - line, a bullet list will automatically be generated. - Numbered lists can also be generated by using a minus followed by a hash. + By putting a number of column-aligned minus (-) signs at the start of a + line, a bullet list will automatically be generated. Instead of the minus + sign also plus (+) or asterix (\*) can be used. + + Numbered lists can also be generated by using a minus followed by a hash + or by using a number followed by a dot. + Nesting of lists is allowed and is based on indentation of the items.

      Here is an example: \verbatim @@ -18,8 +22,8 @@ Doxygen provides a number of ways to create lists of items. * More info about the click event. * -# mouse double click event * - keyboard events - * -# key down event - * -# key up event + * 1. key down event + * 2. key up event * * More text here. */ @@ -33,8 +37,8 @@ Doxygen provides a number of ways to create lists of items. More info about the click event. -# mouse double click event - keyboard events - -# key down event - -# key up event + 1. key down event + 2. key up event More text here. @@ -43,7 +47,7 @@ that \ref cfg_tab_size "TAB_SIZE" in the configuration file is set to the correct tab size. You can end a list by starting a new paragraph or -by putting a dot (.) on an empty line at the same indent level as the +by putting a dot (.) on an empty line at the same indentation level as the list you would like to end. Here is an example that speaks for itself: @@ -57,9 +61,11 @@ Here is an example that speaks for itself: * - sub sub item 2 * . * The dot above ends the sub sub item list. + * * More text for the first sub item * . * The dot above ends the first sub item. + * * More text for the first list item * - sub item 2 * - sub item 3 @@ -74,8 +80,7 @@ Here is an example that speaks for itself: Using HTML commands If you like you can also use HTML commands inside the documentation -blocks. Using these commands has the advantage that it is more natural -for list items that consist of multiple paragraphs. +blocks. Here is the above example with HTML commands: \verbatim @@ -85,7 +90,7 @@ Here is the above example with HTML commands: *

    • mouse events *
        *
      1. mouse move event - *
      2. mouse click event\n + *
      3. mouse click event
        * More info about the click event. *
      4. mouse double click event *
      diff --git a/doc/starting.doc b/doc/starting.doc index caed175..4e60d3a 100644 --- a/doc/starting.doc +++ b/doc/starting.doc @@ -20,11 +20,6 @@ The executable \c doxygen is the main program that parses the sources and generates the documentation. See section \ref doxygen_usage for more detailed usage information. -The executable \c doxytag is only needed if you want to generate references -to external documentation (i.e. documentation that was generated by doxygen) -for which you do not have the sources. See section \ref doxytag_usage -for more detailed usage information. - Optionally, the executable \c doxywizard can be used, which is a \ref doxywizard_usage "graphical front-end" for editing the configuration file that is used by doxygen and for running doxygen in a graphical environment. diff --git a/examples/memgrp.cpp b/examples/memgrp.cpp index 394cdbc..77f03a4 100644 --- a/examples/memgrp.cpp +++ b/examples/memgrp.cpp @@ -21,21 +21,21 @@ void Test::func2InGroup1() {} /** @name Group2 * Description of group 2. */ -//@{ +///@{ /** Function 2 in group 2. Details. */ void Test::func2InGroup2() {} /** Function 1 in group 2. Details. */ void Test::func1InGroup2() {} -//@} +///@} /*! \file * docs for this file */ -//@{ +//!@{ //! one description for all members of this group //! (because DISTRIBUTE_GROUP_DOC is YES in the config file) #define A 1 #define B 2 void glob_func(); -//@} +//!@} diff --git a/qtools/qxml.cpp b/qtools/qxml.cpp index 9a24c1b..83ab89d 100644 --- a/qtools/qxml.cpp +++ b/qtools/qxml.cpp @@ -2449,7 +2449,7 @@ bool QXmlSimpleReader::parseElement() d->error = XMLERR_ERRORPARSINGNAME; goto parseError; } - if ( !parseElementETagBegin2() ) + if ( !parseElementETagBegin2( uri, lname ) ) goto parseError; break; case Attribute: @@ -2495,10 +2495,17 @@ bool QXmlSimpleReader::parseElementEmptyTag( bool &t, QString &uri, QString &lna return FALSE; } // ... followed by endElement - // ### missing namespace support! - if ( !contentHnd->endElement( "","",tags.pop() ) ) { - d->error = contentHnd->errorString(); - return FALSE; + if ( d->useNamespaces ) { + if ( !contentHnd->endElement( uri, lname,tags.pop() ) ) { + d->error = contentHnd->errorString(); + return FALSE; + } + } + else { + if ( !contentHnd->endElement( "","",tags.pop() ) ) { + d->error = contentHnd->errorString(); + return FALSE; + } } // namespace support? if ( d->useNamespaces ) { @@ -2529,7 +2536,7 @@ bool QXmlSimpleReader::parseElementEmptyTag( bool &t, QString &uri, QString &lna Helper to break down the size of the code in the case statement. Return FALSE on error, otherwise TRUE. */ -bool QXmlSimpleReader::parseElementETagBegin2() +bool QXmlSimpleReader::parseElementETagBegin2( QString &uri, QString &lname ) { // pop the stack and compare it with the name @@ -2538,11 +2545,19 @@ bool QXmlSimpleReader::parseElementETagBegin2() return FALSE; } // call the handler - // ### missing namespace support! if ( contentHnd ) { - if ( !contentHnd->endElement("","",name()) ) { - d->error = contentHnd->errorString(); - return FALSE; + if ( d->useNamespaces ) { + d->namespaceSupport.processName( name(), FALSE, uri, lname ); + if ( !contentHnd->endElement(uri,lname,name()) ) { + d->error = contentHnd->errorString(); + return FALSE; + } + } + else { + if ( !contentHnd->endElement("","",name()) ) { + d->error = contentHnd->errorString(); + return FALSE; + } } } // namespace support? diff --git a/qtools/qxml.h b/qtools/qxml.h index 2f7567d..36164ff 100644 --- a/qtools/qxml.h +++ b/qtools/qxml.h @@ -337,7 +337,7 @@ private: bool parseProlog(); bool parseElement(); bool parseElementEmptyTag( bool &t, QString &uri, QString &lname ); - bool parseElementETagBegin2(); + bool parseElementETagBegin2( QString &uri, QString &lname ); bool parseElementAttribute( QString &prefix, QString &uri, QString &lname ); bool parseMisc(); bool parseContent(); diff --git a/src/Makefile.in b/src/Makefile.in index 19bcf7a..eb0c170 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -14,11 +14,10 @@ # input used in their production; they are not affected by this license. # -all: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile.doxytag Makefile +all: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile $(MAKE) -f Makefile.libdoxycfg PERL=$(PERL) $@ $(MAKE) -f Makefile.libdoxygen PERL=$(PERL) $@ $(MAKE) -f Makefile.doxygen PERL=$(PERL) $@ - $(MAKE) -f Makefile.doxytag PERL=$(PERL) $@ Makefile.libdoxygen: libdoxygen.pro libdoxygen.t $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen @@ -29,24 +28,19 @@ Makefile.libdoxycfg: libdoxycfg.pro libdoxycfg.t Makefile.doxygen: doxygen.pro $(ENV) $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen -Makefile.doxytag: doxytag.pro doxytag.t - $(ENV) $(PERL) $(TMAKE) doxytag.pro >Makefile.doxytag - tmake: $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen $(ENV) $(PERL) $(TMAKE) libdoxycfg.pro >Makefile.libdoxycfg $(ENV) $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen - $(ENV) $(PERL) $(TMAKE) doxytag.pro >Makefile.doxytag -clean: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile.doxytag +clean: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen $(MAKE) -f Makefile.libdoxygen clean $(MAKE) -f Makefile.libdoxycfg clean $(MAKE) -f Makefile.doxygen clean - $(MAKE) -f Makefile.doxytag clean distclean: clean -$(RM) scanner.cpp code.cpp config.cpp pre.cpp ce_lex.cpp \ - ce_parse.cpp ce_parse.h doxytag.cpp tag.cpp commentscan.cpp \ + ce_parse.cpp ce_parse.h tag.cpp commentscan.cpp \ declinfo.cpp defargs.cpp commentcnv.cpp doctokenizer.cpp \ pycode.cpp pyscanner.cpp fortrancode.cpp fortranscanner.cpp \ vhdlscanner.cpp vhdlcode.cpp tclscanner.cpp vhdlparser.h \ diff --git a/src/classdef.cpp b/src/classdef.cpp index be7429e..c5ff60d 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -1493,30 +1493,8 @@ void ClassDef::writeSummaryLinks(OutputList &ol) ol.popGeneratorState(); } -void ClassDef::writeTagFileMarker(OutputList &ol) +void ClassDef::writeTagFileMarker() { - // write markers for tag file processing to the output - ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Html); - ol.writeString(""); - if (m_impl->inherits && m_impl->inherits->count()>0) - { - BaseClassListIterator bli(*m_impl->inherits); - ol.writeString(""); - } - ol.popGeneratorState(); - // write section to the tag file if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { @@ -1657,7 +1635,7 @@ void ClassDef::writeInlineDocumentation(OutputList &ol) ol.popGeneratorState(); // part 4: write tag file information - writeTagFileMarker(ol); + writeTagFileMarker(); } void ClassDef::writeMoreLink(OutputList &ol,const QCString &anchor) @@ -1812,7 +1790,7 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString &pageTit pageType += compoundTypeString(); toupper(pageType.at(1)); - writeTagFileMarker(ol); + writeTagFileMarker(); Doxygen::indexList.addIndexItem(this,0); @@ -2100,7 +2078,7 @@ void ClassDef::writeMemberList(OutputList &ol) { if (getOuterScope()!=Doxygen::globalScope) { - writeNavigationPath(ol,FALSE); + writeNavigationPath(ol); } ol.endQuickIndices(); } diff --git a/src/classdef.h b/src/classdef.h index d92b5a6..fb37e0b 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -348,7 +348,7 @@ class ClassDef : public Definition void showUsedFiles(OutputList &ol); private: - void writeTagFileMarker(OutputList &ol); + void writeTagFileMarker(); void writeDocumentationContents(OutputList &ol,const QCString &pageTitle); void internalInsertMember(MemberDef *md,Protection prot,bool addToAllList); QCString getMemberListFileName() const; diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index 3c21a75..b42ca4b 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -162,6 +162,7 @@ CommandMap htmlTagMap[] = { "h6", HTML_H6 }, { "span", HTML_SPAN }, { "div", HTML_DIV }, + { "blockquote", HTML_BLOCKQUOTE }, { "c", XML_C }, // { "code", XML_CODE }, <= ambiguous is also a HTML tag diff --git a/src/cmdmapper.h b/src/cmdmapper.h index 6a62546..b2950ce 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -156,6 +156,7 @@ enum HtmlTagType HTML_H6 = 30, HTML_SPAN = 31, HTML_DIV = 32, + HTML_BLOCKQUOTE= 33, XML_CmdMask = 0x100, diff --git a/src/commentscan.l b/src/commentscan.l index cb295d1..4f4408f 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -45,6 +45,7 @@ #include "debug.h" #include "parserintf.h" #include "cite.h" +#include "markdown.h" // forward declarations static bool handleBrief(const QCString &); @@ -110,6 +111,7 @@ static bool handlePublic(const QCString &s); static bool handlePublicSection(const QCString &s); static bool handleInherit(const QCString &); static bool handleExtends(const QCString &); +static bool handleCopyDoc(const QCString &); typedef bool (*DocCmdFunc)(const QCString &name); @@ -209,7 +211,7 @@ static DocCmdMap docCmdMap[] = { "attention", 0, TRUE }, { "author", 0, TRUE }, { "authors", 0, TRUE }, - { "copydoc", 0, TRUE }, + { "copydoc", &handleCopyDoc, TRUE }, { "copybrief", 0, FALSE }, { "copydetails", 0, TRUE }, { "date", 0, TRUE }, @@ -404,6 +406,7 @@ static int g_sectionLevel; static int g_commentCount; static bool g_spaceBeforeCmd; static bool g_spaceBeforeIf; +static QCString g_copyDocArg; //----------------------------------------------------------------------------- @@ -749,6 +752,7 @@ static inline void setOutput(OutputContext ctx) // add a string to the output static inline void addOutput(const char *s) { + //printf("addOutput(%s)\n",s); *pOutputString+=s; } @@ -876,6 +880,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" %x HtmlComment %x SkipLang %x CiteLabel +%x CopyDoc %% @@ -1055,7 +1060,8 @@ RCSTAG "$"{ID}":"[^\n$]+"$" ^{B}*"."{B}*/\n { // explicit end autolist: e.g " ." addOutput(yytext); } -^{B}*"-" { // start of autolist +^{B}*[1-9][0-9]*"."{B}+ | +^{B}*[*+-]{B}+ { // start of autolist if (inContext!=OutputXRef) { briefEndsAtDot=FALSE; @@ -1997,6 +2003,26 @@ RCSTAG "$"{ID}":"[^\n$]+"$" BEGIN(Comment); } + /* ----- handle argument of the copydoc command ------- */ + +<> | +{DOCNL} { + if (*yytext=='\n') yyLineNr++; + addOutput('\n'); + setOutput(OutputDoc); + addOutput("\\copydetails "); + addOutput(g_copyDocArg); + addOutput("\n"); + BEGIN(Comment); + } +[^\n\\]+ { + g_copyDocArg+=yytext; + addOutput(yytext); + } +. { + g_copyDocArg+=yytext; + addOutput(yytext); + } %% @@ -2517,6 +2543,15 @@ static bool handleExtends(const QCString &) return FALSE; } +static bool handleCopyDoc(const QCString &) +{ + setOutput(OutputBrief); + addOutput("\\copybrief "); + g_copyDocArg.resize(0); + BEGIN(CopyDoc); + return FALSE; +} + //---------------------------------------------------------------------------- static void checkFormula() @@ -2609,6 +2644,13 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, openGroup(current,yyFileName,yyLineNr); } + if (Doxygen::markdownSupport) + { + current->brief = processMarkdown(current->brief); + current->doc = processMarkdown(current->doc); + current->inbodyDocs = processMarkdown(current->inbodyDocs); + } + Debug::print(Debug::CommentScan,0, "brief=[%s]\ndocs=[%s]\ninbody=[%s]\n===========\n", current->brief.data(),current->doc.data(),current->inbodyDocs.data() @@ -2631,7 +2673,6 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, lineNr = yyLineNr; //printf("position=%d parseMore=%d\n",position,parseMore); - return parseMore; } diff --git a/src/compound.xsd b/src/compound.xsd index 493fc4e..1149266 100644 --- a/src/compound.xsd +++ b/src/compound.xsd @@ -419,6 +419,7 @@ + @@ -612,6 +613,12 @@ + + + + + + diff --git a/src/compound_xsd.h b/src/compound_xsd.h index e84e21f..6531857 100644 --- a/src/compound_xsd.h +++ b/src/compound_xsd.h @@ -419,6 +419,7 @@ " \n" " \n" " \n" +" \n" " \n" " \n" "\n" @@ -612,6 +613,12 @@ " \n" " \n" "\n" +" \n" +" \n" +" \n" +" \n" +" \n" +"\n" " \n" " \n" " \n" diff --git a/src/config.l b/src/config.l index 3c22571..ee535e9 100644 --- a/src/config.l +++ b/src/config.l @@ -1334,6 +1334,8 @@ void Config::check() filePatternList.append("*.vhd"); filePatternList.append("*.vhdl"); filePatternList.append("*.tcl"); + filePatternList.append("*.md"); + filePatternList.append("*.markdown"); if (portable_fileSystemIsCaseSensitive()) { // unix => case sensitive match => also include useful uppercase versions @@ -1356,6 +1358,8 @@ void Config::check() filePatternList.append("*.VHD"); filePatternList.append("*.VHDL"); filePatternList.append("*.TCL"); + filePatternList.append("*.MD"); + filePatternList.append("*.MARKDOWN"); } } @@ -1477,21 +1481,24 @@ void Config::check() bool b2 = Config_getBool("INHERIT_DOCS"); bool b3 = Config_getBool("HIDE_SCOPE_NAMES"); bool b4 = Config_getBool("EXTRACT_PRIVATE"); - const char *s1,*s2,*s3,*s4; + bool b5 = Config_getBool("SKIP_FUNCTION_MACROS"); + const char *s1,*s2,*s3,*s4,*s5; if (b1) s1=" INLINDE_INHERITED_MEMB = NO (was YES)\n"; else s1=""; if (b2) s2=" INHERIT_DOCS = NO (was YES)\n"; else s2=""; if (!b3) s3=" HIDE_SCOPE_NAMES = YES (was NO)\n"; else s3=""; if (!b4) s4=" EXTRACT_PRIVATE = YES (was NO)\n"; else s4=""; + if (b5) s5=" ENABLE_PREPROCESSING = NO (was YES)\n"; else s5=""; config_err("warning: enabling OPTIMIZE_OUTPUT_VHDL assumes the following settings:\n" - "%s%s%s%s",s1,s2,s3,s4 + "%s%s%s%s%s",s1,s2,s3,s4,s5 ); Config_getBool("INLINE_INHERITED_MEMB") = FALSE; Config_getBool("INHERIT_DOCS") = FALSE; Config_getBool("HIDE_SCOPE_NAMES") = TRUE; Config_getBool("EXTRACT_PRIVATE") = TRUE; - } + Config_getBool("ENABLE_PREPROCESSING") = FALSE; + } } diff --git a/src/config.xml b/src/config.xml index dc79fc7..adbb326 100644 --- a/src/config.xml +++ b/src/config.xml @@ -250,6 +250,14 @@ doxygen treat .inc files as Fortran files (default is PHP), and .f files as C you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. '> +
    • \n"); } -void Definition::writeNavigationPath(OutputList &ol,bool showSearchInfo) const +void Definition::writeNavigationPath(OutputList &ol) const { static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); @@ -1351,10 +1351,10 @@ void Definition::writeNavigationPath(OutputList &ol,bool showSearchInfo) const { ol.writeString("\n"); } - if (showSearchInfo) - { - ol.writeSearchInfo(); - } + //if (showSearchInfo) + //{ + // ol.writeSearchInfo(); + //} ol.writeString("
      \n"); ol.writeString("
        \n"); diff --git a/src/definition.h b/src/definition.h index 8c6bda3..1e51a1c 100644 --- a/src/definition.h +++ b/src/definition.h @@ -317,7 +317,7 @@ class Definition : public DefinitionIntf, public LockableObj void writeSourceReffedBy(OutputList &ol,const char *scopeName); void makePartOfGroup(GroupDef *gd); void writePathFragment(OutputList &ol) const; - void writeNavigationPath(OutputList &ol,bool showSearchInfo=TRUE) const; + void writeNavigationPath(OutputList &ol) const; virtual void writeQuickMemberLinks(OutputList &,MemberDef *) const {} virtual void writeSummaryLinks(OutputList &) {} QCString pathFragment() const; diff --git a/src/docparser.cpp b/src/docparser.cpp index 48810ed..3ec6631 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -1605,6 +1605,9 @@ static int internalValidatingParseDoc(DocNode *parent,QList &children, } while (retval==TK_NEWPARA); if (lastPar) lastPar->markLast(); + //printf("internalValidateParsingDoc: %p: isFirst=%d isLast=%d\n", + // lastPar,lastPar?lastPar->isFirst():-1,lastPar?lastPar->isLast():-1); + return retval; } @@ -1900,7 +1903,7 @@ void DocIncOperator::parse() //--------------------------------------------------------------------------- -void DocCopy::parse() +void DocCopy::parse(QList &children) { QCString doc,brief; Definition *def; @@ -1938,7 +1941,7 @@ void DocCopy::parse() if (m_copyBrief) { brief+='\n'; - internalValidatingParseDoc(this,m_children,brief); + internalValidatingParseDoc(m_parent,children,brief); //printf("..2 hasParamCommand=%d hasReturnCommand=%d paramsFound=%d\n", // g_hasParamCommand,g_hasReturnCommand,g_paramsFound.count()); @@ -1954,7 +1957,7 @@ void DocCopy::parse() if (m_copyDetails) { doc+='\n'; - internalValidatingParseDoc(this,m_children,doc); + internalValidatingParseDoc(m_parent,children,doc); //printf("..3 hasParamCommand=%d hasReturnCommand=%d paramsFound=%d\n", // g_hasParamCommand,g_hasReturnCommand,g_paramsFound.count()); @@ -3990,6 +3993,33 @@ endlist: RetVal_OK : retval; } +//-------------------------------------------------------------------------- + +int DocHtmlBlockQuote::parse() +{ + DBG(("DocHtmlBlockQuote::parse() start\n")); + int retval=0; + g_nodeStack.push(this); + + // parse one or more paragraphs + bool isFirst=TRUE; + DocPara *par=0; + do + { + par = new DocPara(this); + if (isFirst) { par->markFirst(); isFirst=FALSE; } + m_children.append(par); + retval=par->parse(); + } + while (retval==TK_NEWPARA); + if (par) par->markLast(); + + DocNode *n=g_nodeStack.pop(); + ASSERT(n==this); + DBG(("DocHtmlBlockQuote::parse() end retval=%x\n",retval)); + return (retval==RetVal_EndBlockQuote) ? RetVal_OK : retval; +} + //--------------------------------------------------------------------------- int DocSimpleListItem::parse() @@ -4026,11 +4056,37 @@ int DocAutoListItem::parse() { int retval = RetVal_OK; g_nodeStack.push(this); - retval=m_paragraph->parse(); - m_paragraph->markFirst(); - m_paragraph->markLast(); + + //retval=m_paragraph->parse(); + //m_paragraph->markFirst(); + //m_paragraph->markLast(); + + // first parse any number of paragraphs + bool isFirst=TRUE; + DocPara *lastPar=0; + do + { + DocPara *par = new DocPara(this); + if (isFirst) { par->markFirst(); isFirst=FALSE; } + retval=par->parse(); + if (!par->isEmpty()) + { + m_children.append(par); + if (lastPar) lastPar->markLast(FALSE); + lastPar=par; + } + else + { + delete par; + } + // next paragraph should be more indented than the - marker to belong + // to this item + } while (retval==TK_NEWPARA && g_token->indent>m_indent); + if (lastPar) lastPar->markLast(); + DocNode *n=g_nodeStack.pop(); ASSERT(n==this); + //printf("DocAutoListItem: retval=%d indent=%d\n",retval,g_token->indent); return retval; } @@ -4044,7 +4100,7 @@ int DocAutoList::parse() // first item or sub list => create new list do { - DocAutoListItem *li = new DocAutoListItem(this,num++); + DocAutoListItem *li = new DocAutoListItem(this,m_indent,num++); m_children.append(li); retval=li->parse(); } @@ -5179,8 +5235,9 @@ int DocPara::handleCommand(const QCString &cmdName) DocCopy *cpy = new DocCopy(this,g_token->name, cmdId==CMD_COPYDOC || cmdId==CMD_COPYBRIEF, cmdId==CMD_COPYDOC || cmdId==CMD_COPYDETAILS); - m_children.append(cpy); - cpy->parse(); + //m_children.append(cpy); + cpy->parse(m_children); + delete cpy; } break; case CMD_INCLUDE: @@ -5476,6 +5533,13 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta } } break; + case HTML_BLOCKQUOTE: + { + DocHtmlBlockQuote *block = new DocHtmlBlockQuote(this,tagHtmlAttribs); + m_children.append(block); + retval = block->parse(); + } + break; case XML_SUMMARY: case XML_REMARKS: @@ -5727,6 +5791,9 @@ int DocPara::handleHtmlEndTag(const QCString &tagName) // ignore tags } break; + case HTML_BLOCKQUOTE: + retval=RetVal_EndBlockQuote; + break; //case HTML_PRE: // if (!insidePRE(this)) // { @@ -5770,7 +5837,6 @@ int DocPara::handleHtmlEndTag(const QCString &tagName) //doctokenizerYYsetInsidePre(FALSE); break; case HTML_P: - // ignore

        tag retval=TK_NEWPARA; break; case HTML_DL: @@ -5909,6 +5975,7 @@ reparsetoken: k!=DocNode::Kind_SimpleList && /*k!=DocNode::Kind_Verbatim &&*/ k!=DocNode::Kind_HtmlHeader && + k!=DocNode::Kind_HtmlBlockQuote && k!=DocNode::Kind_ParamSect && k!=DocNode::Kind_XRefItem ) @@ -5940,7 +6007,8 @@ reparsetoken: n=parent(); while(n) { - if(n->kind() == DocNode::Kind_AutoList) ++depth; + if (n->kind() == DocNode::Kind_AutoList && + ((DocAutoList*)n)->isEnumList()) depth++; n=n->parent(); } @@ -5948,8 +6016,7 @@ reparsetoken: DocAutoList *al=0; do { - al = new DocAutoList(this,g_token->indent,g_token->isEnumList, - depth); + al = new DocAutoList(this,g_token->indent,g_token->isEnumList, depth); m_children.append(al); retval = al->parse(); } while (retval==TK_LISTITEM && // new list @@ -6641,7 +6708,6 @@ DocNode *validatingParseDoc(const char *fileName,int startLine, delete v; } - checkUndocumentedParams(); detectNoDocumentedParams(); diff --git a/src/docparser.h b/src/docparser.h index 1e1fb0e..4e8587c 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -132,7 +132,8 @@ class DocNode Kind_InternalRef = 45, Kind_Copy = 46, Kind_Text = 47, - Kind_MscFile = 48 + Kind_MscFile = 48, + Kind_HtmlBlockQuote = 49 }; /*! Creates a new node */ DocNode() : m_parent(0), m_insidePre(FALSE) {} @@ -182,6 +183,8 @@ template class CompAccept for (cli.toFirst();(n=cli.current());++cli) n->accept(v); v->visitPost(obj); } + const QList &children() const { return m_children; } + QList &children() { return m_children; } protected: QList m_children; @@ -508,7 +511,7 @@ class DocIndexEntry : public DocNode //----------------------------------------------------------------------- /*! @brief Node representing a copy of documentation block. */ -class DocCopy : public CompAccept, public DocNode +class DocCopy : /*public CompAccept,*/ public DocNode { public: DocCopy(DocNode *parent,const QCString &link,bool copyBrief,bool copyDetails) @@ -516,8 +519,8 @@ class DocCopy : public CompAccept, public DocNode m_copyBrief(copyBrief), m_copyDetails(copyDetails) { m_parent = parent; } Kind kind() const { return Kind_Copy; } QCString link() const { return m_link; } - void accept(DocVisitor *v) { CompAccept::accept(this,v); } - void parse(); + void accept(DocVisitor * /*v*/) { /*CompAccept::accept(this,v);*/ } + void parse(QList &children); private: QCString m_link; @@ -546,6 +549,24 @@ class DocAutoList : public CompAccept, public DocNode int m_depth; }; +/*! @brief Node representing an item of a auto list */ +class DocAutoListItem : public CompAccept, public DocNode +{ + public: + DocAutoListItem(DocNode *parent,int indent,int num) + : m_indent(indent), m_itemNum(num) + { m_parent = parent; } + Kind kind() const { return Kind_AutoListItem; } + int itemNumber() const { return m_itemNum; } + void accept(DocVisitor *v) { CompAccept::accept(this,v); } + int parse(); + + private: + int m_indent; + int m_itemNum; +}; + + /*! @brief Node representing a simple section title */ class DocTitle : public CompAccept, public DocNode @@ -574,7 +595,6 @@ class DocXRefItem : public CompAccept, public DocNode QCString key() const { return m_key; } void accept(DocVisitor *v) { CompAccept::accept(this,v); } bool parse(); - const QList &children() const { return m_children; } private: int m_id; @@ -848,7 +868,6 @@ class DocSecRefItem : public CompAccept, public DocNode QCString anchor() const { return m_anchor; } void accept(DocVisitor *v) { CompAccept::accept(this,v); } void parse(); - const QList &children() const { return m_children; } private: QCString m_target; @@ -930,7 +949,6 @@ class DocSimpleSect : public CompAccept, public DocNode int parseRcs(); int parseXml(); void appendLinkWord(const QCString &word); - const QList &children() const { return m_children; } private: Type m_type; @@ -995,8 +1013,6 @@ class DocPara : public CompAccept, public DocNode void markLast(bool v=TRUE) { m_isLast=v; } bool isFirst() const { return m_isFirst; } bool isLast() const { return m_isLast; } - const QList &children() const { return m_children; } - QList &children() { return m_children; } int handleCommand(const QCString &cmdName); int handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &tagHtmlAttribs); @@ -1018,6 +1034,7 @@ class DocPara : public CompAccept, public DocNode void handleInheritDoc(); int handleStartCode(); int handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs,int level); + bool injectToken(int tok,const QCString &tokText); private: @@ -1068,28 +1085,6 @@ class DocParamList : public DocNode bool m_isLast; }; -/*! @brief Node representing an item of a auto list */ -class DocAutoListItem : public DocNode -{ - public: - DocAutoListItem(DocNode *parent,int num) : m_itemNum(num) - { m_paragraph=new DocPara(this); m_parent = parent; } - virtual ~DocAutoListItem() { delete m_paragraph; } - Kind kind() const { return Kind_AutoListItem; } - int itemNumber() const { return m_itemNum; } - void accept(DocVisitor *v) - { - v->visitPre(this); - m_paragraph->accept(v); - v->visitPost(this); - } - int parse(); - - private: - DocPara *m_paragraph; - int m_itemNum; -}; - /*! @brief Node representing a simple list item */ class DocSimpleListItem : public DocNode { @@ -1122,7 +1117,6 @@ class DocHtmlListItem : public CompAccept, public DocNode void accept(DocVisitor *v) { CompAccept::accept(this,v); } int parse(); int parseXml(); - const QList &children() const { return m_children; } private: HtmlAttribList m_attribs; @@ -1138,7 +1132,6 @@ class DocHtmlDescData : public CompAccept, public DocNode const HtmlAttribList &attribs() const { return m_attribs; } void accept(DocVisitor *v) { CompAccept::accept(this,v); } int parse(); - const QList &children() const { return m_children; } private: HtmlAttribList m_attribs; @@ -1159,7 +1152,6 @@ class DocHtmlCell : public CompAccept, public DocNode void markFirst(bool v=TRUE) { m_isFirst=v; } void markLast(bool v=TRUE) { m_isLast=v; } const HtmlAttribList &attribs() const { return m_attribs; } - const QList &children() const { return m_children; } int parse(); int parseXml(); @@ -1221,7 +1213,22 @@ class DocHtmlTable : public CompAccept, public DocNode private: DocHtmlCaption *m_caption; - HtmlAttribList m_attribs; + HtmlAttribList m_attribs; +}; + +/*! @brief Node representing an HTML blockquote */ +class DocHtmlBlockQuote : public CompAccept, public DocNode +{ + public: + DocHtmlBlockQuote(DocNode *parent,const HtmlAttribList &attribs) + : m_attribs(attribs) { m_parent = parent; } + Kind kind() const { return Kind_HtmlBlockQuote; } + int parse(); + void accept(DocVisitor *v) { CompAccept::accept(this,v); } + const HtmlAttribList &attribs() const { return m_attribs; } + + private: + HtmlAttribList m_attribs; }; /*! @brief Root node of a text fragment */ @@ -1244,7 +1251,6 @@ class DocRoot : public CompAccept, public DocNode void parse(); bool indent() const { return m_indent; } bool singleLine() const { return m_singleLine; } - const QList &children() const { return m_children; } private: bool m_indent; diff --git a/src/doctokenizer.h b/src/doctokenizer.h index 5c352ca..f86020a 100644 --- a/src/doctokenizer.h +++ b/src/doctokenizer.h @@ -59,7 +59,8 @@ enum Tokens RetVal_EndTable = 0x10010, RetVal_Internal = 0x10011, RetVal_SwitchLang = 0x10012, - RetVal_CloseXml = 0x10013 + RetVal_CloseXml = 0x10013, + RetVal_EndBlockQuote = 0x10014 }; struct TokenInfo diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 3772807..765e6c8 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -23,6 +23,7 @@ #include #include #include +#include #include "doctokenizer.h" #include "cmdmapper.h" @@ -257,17 +258,44 @@ static void handleHtmlTag() } } -static QCString stripEmptyLines(const char *s) +static QCString stripEmptyLines(const QCString &s) { - if (s==0) return QCString(); - int result=0,p=0; + if (s.isEmpty()) return QCString(); + int end=s.length(); + int start=0,p=0; + // skip leading empty lines for (;;) { int c; - while ((c=s[p]) && isspace(c)) p++; - if (s[p]=='\n') result=++p; else break; + while ((c=s[p]) && (c==' ' || c=='\t')) p++; + if (s[p]=='\n') + { + start=++p; + } + else + { + break; + } + } + // skip trailing empty lines + p=end-1; + if (p>=start && s.at(p)=='\n') p--; + while (p>=start) + { + int c; + while ((c=s[p]) && (c==' ' || c=='\t')) p--; + if (s[p]=='\n') + { + end=p; + } + else + { + break; + } + p--; } - return &s[result]; + //printf("stripEmptyLines(%d-%d)\n",start,end); + return s.mid(start,end-start); } //-------------------------------------------------------------------------- @@ -288,18 +316,20 @@ static int yyread(char *buf,int max_size) %} -CMD ("\\"|"@") -WS [ \t\r\n] -NONWS [^ \t\r\n] -BLANK [ \t\r] -ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* -LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]* -CITEID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-:/]* -MAILADR [a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+ -OPTSTARS ("//"{BLANK}*)?"*"*{BLANK}* -LISTITEM {BLANK}*{OPTSTARS}"-"("#")?{WS} -ENDLIST {BLANK}*{OPTSTARS}"."{BLANK}*\n -ATTRIB {ID}{WS}*("="{WS}*(("\""[^\"]*"\"")|("'"[^\']*"'")|[^ \t\r\n'"><]+))? +CMD ("\\"|"@") +WS [ \t\r\n] +NONWS [^ \t\r\n] +BLANK [ \t\r] +ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* +LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]* +CITEID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-:/]* +MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+ +OPTSTARS ("//"{BLANK}*)?"*"*{BLANK}* +LISTITEM {BLANK}*[-]("#")?{WS} +MLISTITEM {BLANK}*[+*]{WS} +OLISTITEM {BLANK}*[1-9][0-9]*"."{WS} +ENDLIST {BLANK}*"."{BLANK}*\n +ATTRIB {ID}{WS}*("="{WS}*(("\""[^\"]*"\"")|("'"[^\']*"'")|[^ \t\r\n'"><]+))? URLCHAR [a-z_A-Z0-9\!\~\,\:\;\'\$\?\@\&\%\#\.\-\+\/\=] URLMASK ({URLCHAR}+([({]{URLCHAR}*[)}])?)+ FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+] @@ -309,7 +339,7 @@ FILEMASK ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK} LINKMASK [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)? VERBATIM "verbatim"{BLANK}* SPCMD1 {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM}) -SPCMD2 {CMD}[\\@<>&$#%~"] +SPCMD2 {CMD}[\\@<>&$#%~".] SPCMD3 {CMD}form#[0-9]+ SPCMD4 {CMD}"::" INOUT "in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in") @@ -389,14 +419,44 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} %x St_SecSkip %% -\r /* skip carriage return */ -^{LISTITEM} { /* list item */ +\r /* skip carriage return */ +^{LISTITEM} { /* list item */ QCString text=yytext; int dashPos = text.findRev('-'); g_token->isEnumList = text.at(dashPos+1)=='#'; g_token->indent = computeIndent(yytext,dashPos); return TK_LISTITEM; } +^{MLISTITEM} { /* list item */ + if (!Doxygen::markdownSupport) + { + REJECT; + } + else + { + QCString text=yytext; + static QRegExp re("[*+]"); + int listPos = text.findRev(re); + g_token->isEnumList = FALSE; + g_token->indent = computeIndent(yytext,listPos); + return TK_LISTITEM; + } + } +^{OLISTITEM} { /* numbered list item */ + if (!Doxygen::markdownSupport) + { + REJECT; + } + else + { + QCString text=yytext; + static QRegExp re("[1-9]"); + int digitPos = text.find(re); + g_token->isEnumList = TRUE; + g_token->indent = computeIndent(yytext,digitPos); + return TK_LISTITEM; + } + } {BLANK}*\n{LISTITEM} { /* list item on next line */ QCString text=yytext; text=text.right(text.length()-text.find('\n')-1); @@ -405,6 +465,38 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} g_token->indent = computeIndent(text,dashPos); return TK_LISTITEM; } +{BLANK}*\n{MLISTITEM} { /* list item on next line */ + if (!Doxygen::markdownSupport) + { + REJECT; + } + else + { + QCString text=yytext; + static QRegExp re("[*+]"); + text=text.right(text.length()-text.find('\n')-1); + int markPos = text.findRev(re); + g_token->isEnumList = FALSE; + g_token->indent = computeIndent(text,markPos); + return TK_LISTITEM; + } + } +{BLANK}*\n{OLISTITEM} { /* list item on next line */ + if (!Doxygen::markdownSupport) + { + REJECT; + } + else + { + QCString text=yytext; + text=text.right(text.length()-text.find('\n')-1); + static QRegExp re("[1-9]"); + int digitPos = text.find(re); + g_token->isEnumList = TRUE; + g_token->indent = computeIndent(text,digitPos); + return TK_LISTITEM; + } + } ^{ENDLIST} { /* end list */ int dotPos = QCString(yytext).findRev('.'); g_token->indent = computeIndent(yytext,dotPos); @@ -479,8 +571,22 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} g_token->isEMailAddr=FALSE; return TK_URL; } +"<"("http:"|"https:"|"ftp:"|"file:"|"news:"){URLMASK}">" { // URL + g_token->name=yytext; + g_token->name = g_token->name.mid(1,g_token->name.length()-2); + g_token->isEMailAddr=FALSE; + return TK_URL; + } {MAILADR} { // Mail address g_token->name=yytext; + g_token->name.stripPrefix("mailto:"); + g_token->isEMailAddr=TRUE; + return TK_URL; + } +"<"{MAILADR}">" { // Mail address + g_token->name=yytext; + g_token->name = g_token->name.mid(1,g_token->name.length()-2); + g_token->name.stripPrefix("mailto:"); g_token->isEMailAddr=TRUE; return TK_URL; } @@ -565,7 +671,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} g_token->name = yytext; return TK_COMMAND; } -({BLANK}*\n)+{BLANK}*\n { +({BLANK}*\n)+{BLANK}*\n{BLANK}* { if (g_insidePre) { /* Inside a
        ..
        blank lines are treated @@ -574,9 +680,19 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} g_token->chars=yytext; return TK_WHITESPACE; } - else + else // found end of a paragraph { - /* start of a new paragraph */ + g_token->indent=computeIndent(yytext,yyleng-1); + int i; + // put back the indentation (needed for list items) + for (i=0;iindent;i++) + { + unput(' '); + } + // tell flex that after putting the last indent + // back we are at the beginning of the line + YY_CURRENT_BUFFER->yy_at_bol=1; + // start of a new paragraph return TK_NEWPARA; } } @@ -618,9 +734,9 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} {CMD}"endxmlonly" { return RetVal_OK; } -[^\\@\n]+ | -\n | -. { +[^\\@\n]+ | +\n | +. { g_token->verb+=yytext; } {CMD}"endverbatim" { diff --git a/src/docvisitor.h b/src/docvisitor.h index 8978831..057da5f 100644 --- a/src/docvisitor.h +++ b/src/docvisitor.h @@ -72,14 +72,14 @@ class DocRef; class DocFormula; class DocSecRefItem; class DocSecRefList; -//class DocLanguage; class DocLinkedWord; class DocParamSect; class DocParamList; class DocInternalRef; -class DocCopy; +class DocCopy; // TODO: no longer generated => remove class DocText; class DocSimpleSectSep; +class DocHtmlBlockQuote; /*! @brief Abstract visitor that participates in the visitor pattern. */ @@ -171,8 +171,6 @@ class DocVisitor virtual void visitPost(DocSecRefItem *) = 0; virtual void visitPre(DocSecRefList *) = 0; virtual void visitPost(DocSecRefList *) = 0; - //virtual void visitPre(DocLanguage *) = 0; - //virtual void visitPost(DocLanguage *) = 0; virtual void visitPre(DocParamSect *) = 0; virtual void visitPost(DocParamSect *) = 0; virtual void visitPre(DocParamList *) = 0; @@ -185,6 +183,8 @@ class DocVisitor virtual void visitPost(DocCopy *) = 0; virtual void visitPre(DocText *) = 0; virtual void visitPost(DocText *) = 0; + virtual void visitPre(DocHtmlBlockQuote *) = 0; + virtual void visitPost(DocHtmlBlockQuote *) = 0; /*! @} */ }; diff --git a/src/doxygen.cpp b/src/doxygen.cpp index d200a47..aa61647 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -34,7 +34,6 @@ #include "entry.h" #include "index.h" #include "logos.h" -#include "instdox.h" #include "message.h" #include "config.h" #include "util.h" @@ -82,6 +81,7 @@ #include "eclipsehelp.h" #include "cite.h" #include "filestorage.h" +#include "markdown.h" #include "layout.h" @@ -150,6 +150,7 @@ int Doxygen::subpageNestingLevel = 0; bool Doxygen::userComments = FALSE; QCString Doxygen::spaces; bool Doxygen::generatingXmlOutput = FALSE; +bool Doxygen::markdownSupport = TRUE; // locally accessible globals static QDict g_classEntries(1009); @@ -502,7 +503,8 @@ static void addRelatedPage(EntryNav *rootNav) PageDef *pd = addRelatedPage(root->name,root->args,doc,root->anchors, root->fileName,root->startLine, root->sli, - gd,rootNav->tagInfo() + gd,rootNav->tagInfo(), + root->lang ); if (pd) { @@ -7652,28 +7654,6 @@ static void generateClassList(ClassSDict &classSDict) static void generateClassDocs() { - // write the installdox script if necessary - if (Config_getBool("GENERATE_HTML") && - (Config_getList("TAGFILES").count()>0 || - Config_getBool("SEARCHENGINE") - ) - ) - { - writeInstallScript(); - } - - //msg("Generating annotated compound index...\n"); - //writeAnnotatedIndex(*g_outputList); - - //msg("Generating alphabetical compound index...\n"); - //writeAlphabeticalIndex(*g_outputList); - - //msg("Generating hierarchical class index...\n"); - //writeHierarchicalIndex(*g_outputList); - - //msg("Generating member index...\n"); - //writeClassMemberIndex(*g_outputList); - generateClassList(*Doxygen::classSDict); generateClassList(*Doxygen::hiddenClasses); } @@ -8442,6 +8422,7 @@ static void buildExampleList(EntryNav *rootNav) root->name,root->brief+root->doc+root->inbodyDocs,root->args); pd->setFileName(convertNameToFile(pd->name()+"-example",FALSE,TRUE)); pd->addSectionsToDefinition(root->anchors); + pd->setLanguage(root->lang); //pi->addSections(root->anchors); Doxygen::exampleSDict->inSort(root->name,pd); @@ -8500,8 +8481,7 @@ static void generateExampleDocs() TRUE, // is example pd->name() ); - g_outputList->endContents(); - endFile(*g_outputList); + endFile(*g_outputList); // contains g_outputList->endContents() } g_outputList->enable(OutputGenerator::Man); } @@ -9358,6 +9338,7 @@ void initDoxygen() Doxygen::parserManager->registerParser("vhdl", new VHDLLanguageScanner); Doxygen::parserManager->registerParser("dbusxml", new DBusXMLScanner); Doxygen::parserManager->registerParser("tcl", new TclLanguageScanner); + Doxygen::parserManager->registerParser("md", new MarkdownFileParser); // register any additional parsers here... @@ -9830,6 +9811,8 @@ void adjustConfiguration() Config_getBool("CALLER_GRAPH") || Config_getBool("REFERENCES_RELATION") || Config_getBool("REFERENCED_BY_RELATION"); + + Doxygen::markdownSupport = Config_getBool("MARKDOWN_SUPPORT"); /************************************************************************** * Add custom extension mappings diff --git a/src/doxygen.css b/src/doxygen.css index b3365a7..613a3d3 100644 --- a/src/doxygen.css +++ b/src/doxygen.css @@ -293,6 +293,13 @@ span.vhdllogic { color: #ff0000 } +blockquote { + background-color: ##F8; + border-left: 2px solid ##AA; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + /* @end */ /* @@ -616,6 +623,8 @@ address { table.doxtable { border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; } table.doxtable td, table.doxtable th { diff --git a/src/doxygen.h b/src/doxygen.h index 0722513..b06d205 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -134,6 +134,7 @@ class Doxygen static int subpageNestingLevel; static QCString spaces; static bool generatingXmlOutput; + static bool markdownSupport; }; void initDoxygen(); diff --git a/src/doxygen_css.h b/src/doxygen_css.h index 4466e07..1e4f161 100644 --- a/src/doxygen_css.h +++ b/src/doxygen_css.h @@ -293,6 +293,13 @@ " color: #ff0000 \n" "}\n" "\n" +"blockquote {\n" +" background-color: ##F8;\n" +" border-left: 2px solid ##AA;\n" +" margin: 0 24px 0 4px;\n" +" padding: 0 12px 0 16px;\n" +"}\n" +"\n" "/* @end */\n" "\n" "/*\n" @@ -616,6 +623,8 @@ "\n" "table.doxtable {\n" " border-collapse:collapse;\n" +" margin-top: 4px;\n" +" margin-bottom: 4px;\n" "}\n" "\n" "table.doxtable td, table.doxtable th {\n" diff --git a/src/doxytag.l b/src/doxytag.l deleted file mode 100644 index f8e4540..0000000 --- a/src/doxytag.l +++ /dev/null @@ -1,930 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2011 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ - -%{ -/* - * includes - */ -#include -#include -#include - -#include "qtbc.h" -#include -#include -#include -#include -#include -#include - -#include "version.h" -//#include "suffixtree.h" -//#include "searchindex.h" -#include "logos.h" - -static QCString convertToXML(const char *s) -{ - QCString result; - if (s==0) return result; - const char *p=s; - char c; - while ((c=*p++)) - { - switch (c) - { - case '<': result+="<"; break; - case '>': result+=">"; break; - case '&': result+="&"; break; - case '\'': result+="'"; break; - case '"': result+="""; break; - default: result+=c; break; - } - } - return result; -} - -struct MemberDef -{ - QCString name; - QCString anchor; - QCString args; -}; - -struct ClassDef -{ - QCString name; - QStrList bases; - QCString fileName; - bool isFile; - QList memberList; -}; - -QList classList; -QDict classDict(1009); -QList fileList; -QDict fileDict(1009); - -static bool genTag; -static bool genIndex; - -static QStrList bases; -static QCString inputString; -static int inputPosition; -static QCString yyFileName; -static int yyLineNr; -static QCString classFile; -static QCString memberRef; -static QCString memberName; -static QCString memberArgs; -static QCString className; -static QCString baseName; -static QCString docBaseLink; -static QCString docAnchor; -static QCString docRefName; -static bool nameBug; -//static SearchIndex searchIndex; - -#define YY_NEVER_INTERACTIVE 1 - -/* ----------------------------------------------------------------- - */ -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); - -static int yyread(char *buf,int max_size) -{ - int c=0; - while( c < max_size && inputString[inputPosition] ) - { - *buf = inputString[inputPosition++] ; - c++; buf++; - } - return c; -} - -static void addClass(const char *clName) -{ - if (classDict[clName]==0) - { - //printf("addClass(%s)\n",clName); - ClassDef *cd=new ClassDef; - cd->name=clName; - cd->fileName=yyFileName; - cd->isFile=FALSE; - classList.append(cd); - classDict.insert(clName,cd); - } -} - -static void addFile(const char *fName) -{ - if (classDict[fName]==0) - { - ClassDef *fd=new ClassDef; - fd->name=fName; - fd->fileName=yyFileName; - fd->isFile=TRUE; - classList.append(fd); - classDict.insert(fName,fd); - } -} - -static void addBases(const char *clName) -{ - ClassDef *cd=0; - if (clName && (cd=classDict[clName])) cd->bases=bases; -} - -static void addMember(const char *memName,const char *memRef,const char *memArgs) -{ - //printf("addMember(%s,%s,%s)\n",memName,memRef,memArgs); - ClassDef *cd=classList.last(); - if (cd) - { - MemberDef *md; - md=new MemberDef; - md->name=memName; - md->anchor=memRef; - md->args=memArgs; - cd->memberList.append(md); - } - else - { - //printf("Warning: found member %s %s but not class was found to insert it!\n", - // memName,memArgs); - } -} - -static void addReference() -{ - //printf("addReference() key: %s ref:%s\n", - // docRefName.data(),(docBaseLink+"#"+docAnchor).data()); - //if (genIndex && !docRefName.isEmpty() && !docBaseLink.isEmpty()) - //{ - // if (docAnchor.isEmpty()) - // searchIndex.addReference(docRefName,docBaseLink); - // else - // searchIndex.addReference(docRefName,docBaseLink+"#"+docAnchor); - // searchIndex.addWord(docRefName,docRefName,TRUE); - //} -} - -QCString unhtmlify(const char *str) -{ - QCString result; - const char *p=str; - char c; - while ((c=*p)!='\0') - { - if (c!='&') { result+=c; p++; } - else - { - if (strncmp(p,"&",5)==0) { result+='&'; p+=5; } - else if (strncmp(p,"<",4)==0) { result+='<'; p+=4; } - else if (strncmp(p,">",4)==0) { result+='>'; p+=4; } - else if (strncmp(p,""",6)==0) { result+='"'; p+=4; } - else /* should not happen */ { result+='&'; p++; } - } - } - return result; -} - -%} - -%x Start -%x SearchClassFile -%x ReadClassFile -%x CheckClassName -%x ReadClassName -%x SearchMemberRef -%x ReadMemberRef -%x SearchMemberName -%x ReadMemberName -%x ReadOperator -%x SearchBaseClasses -%x ReadBaseClass -%x SearchRefName -%x ReadRefName -%x SearchArgs -%x ReadArgs -%x SearchWords -%x SkipHTMLTag -%x CheckConstructor -%x SkipPreformated - -%x Qt3ReadType -%x Qt3ReadAnchor -%x Qt3ReadName -%x Qt3ReadOperator -%x Qt3ReadArgs - -%x DoxReadAnchor -%x DoxReadName -%x DoxReadArgs -%x DoxClassName -%x DoxClassBase - -%% - -^"
      • " { - BEGIN( SearchClassFile ); - } -^"" | // Qt-3.x.x -"

        " | // Qt-4 -"

        " | // >Qt-4.4.0 -^"

        " { // Qt variant - BEGIN( ReadClassName ); - } -^("
        ")?"

        " { // Doxygen variant - BEGIN( ReadClassName ); - } -^"Inherits " { - //printf("Inherits found\n"); - BEGIN( SearchBaseClasses ); - } -^"

        "/[a-z_A-Z0-9] { // needed due to inconsistency in the Qt docs - BEGIN( CheckConstructor ); - } - - /* --------------------------------------------------- */ - /* Qt member extraction rules */ - -^"

        " { - BEGIN( Qt3ReadType ); - } -^"

        ^"

        ". -[~a-z_A-Z0-9\-\[\]*+%\^&|!]+ { - memberRef = yytext; - } -"\">" { - BEGIN( Qt3ReadName ); - } -. { - BEGIN( Start ); - } -[a-z_A-Z0-9]+"::operator" { - memberName="operator"; - BEGIN(Qt3ReadOperator); - } -[+\-*/%\^&|~!=\[\]]+ { memberName+=yytext; } -"<" { memberName+="<"; } -">" { memberName+=">"; } -"new" { memberName+=" new"; } -"delete" { memberName+=" delete"; } -"()" { memberName+="()"; BEGIN( Qt3ReadArgs ); } -. { unput(*yytext); BEGIN( Qt3ReadArgs ); } -[a-z_A-Z0-9]+"::"[~a-z_A-Z0-9]+ { - memberName=yytext; - memberName=memberName.mid(memberName.find("::")+2); - BEGIN(Qt3ReadArgs); - } -. -[ \t]*"(" { - memberArgs+='('; - } -"&" { memberArgs+='&'; } -"<" { memberArgs+='<'; } -">" { memberArgs+='>'; } -""" { memberArgs+='"'; } -" " { memberArgs+=' '; } -"

        " { - addMember(memberName,memberRef,memberArgs); - memberName.resize(0); - memberRef.resize(0); - memberArgs.resize(0); - BEGIN(Start); - } -"<"[^>]+">" -")" { - memberArgs+=')'; - addMember(memberName,memberRef,memberArgs); - memberName.resize(0); - memberRef.resize(0); - memberArgs.resize(0); - BEGIN(Start); - } -[a-z_A-Z0-9]+ { memberArgs+=yytext; } -. { memberArgs+=*yytext; } - - /* --------------------------------------------------- */ - /* Doxygen class extraction rules */ - -"" { - BEGIN(Start); - } - - /* --------------------------------------------------- */ - /* Doxygen inheritance extraction rules */ - -"" { - bases.append(baseName); - baseName.resize(0); - addBases(className); - BEGIN(Start); - } - - /* --------------------------------------------------- */ - /* Doxygen member extraction rules */ - -"" { - addMember(memberName,memberRef,memberArgs); - memberName.resize(0); - memberRef.resize(0); - memberArgs.resize(0); - BEGIN(Start); - } - - /** --------------------------------------------------- */ - -"
        "			   { 
        -  				     BEGIN( SkipPreformated );
        -				   }
        -""<"			   { 
        -  				     BEGIN( SkipHTMLTag ); 
        -				   }
        -"&"[a-zA-Z]+";"
        -[a-z_A-Z][a-z_A-Z0-9]*	   {
        -  				     //printf("tag: %s#%s ref: %s word: `%s'\n",
        -				     // docBaseLink.data(),docAnchor.data(),
        -				     // docRefName.data(),yytext);
        -  				     //if (genIndex && !docRefName.isEmpty() && yyleng>2)
        -				     //  searchIndex.addWord(docRefName,
        -				     //	                   yytext,FALSE
        -				     //			  );
        -  				   }
        -"
        " { - BEGIN( Start ); - } -[^\<\n]+ -[a-z_A-Z0-9~:]+ { - QCString s=yytext; - if (s.find("::")!=-1) - { - docRefName=yytext; - addReference(); - nameBug=TRUE; - } - else - { - nameBug=FALSE; - } - BEGIN( Start ); - } -[a-z_A-Z0-9]+ { - docAnchor = yytext; - if (docAnchor=="details" || - docAnchor=="_details") - { - docRefName=className.copy(); - addReference(); - BEGIN( Start ); - } - else - { - BEGIN( SearchRefName ); - } - } -"\" doxytag=\"" { - BEGIN( ReadRefName ); - } -"\">"\">" { // HACK: deal with Qt code - if (nameBug) - BEGIN( Start ); - else - BEGIN( ReadRefName ); - } - -[a-z_A-Z0-9:\.\+\-]*"operator"[ \t]*("new"|"delete"|("&"("&"|"=")*)|(">"(">"|"=")*)|("<"("<"|"=")*)|("->"[*]*)|[+\-*%/|~!=,\^]|[+\-*%/\^!|~=\[(][=|+\-\])]) { // hmm, looks impressive :-) - docRefName=unhtmlify(yytext); - addReference(); - BEGIN( Start ); - } -[a-z_A-Z0-9~:\.\+\-]+ { - //printf("ReadRef=%s\n",yytext); - docRefName=yytext; - addReference(); - BEGIN( Start ); - } -"" { - //printf("Search %s\n",yytext); - BEGIN( ReadBaseClass ); - } -\n { - addBases(className); - BEGIN( Start ); - } -[a-z_A-Z0-9]+ { - bases.append(yytext); - BEGIN( SearchBaseClasses ); - } -""[a-z_A-Z0-9:\.\-\+]+ { - className=yytext; - BEGIN( CheckClassName); - } -"Class Reference" { - //printf("className=%s\n",className.data()); - addClass(className); - BEGIN( Start ); - } -"File Reference" { - //printf("className=%s\n",className.data()); - addFile(className); - BEGIN( Start ); - } -[a-z_A-Z0-9]+ { // not a class file - className.resize(0); - BEGIN( Start ); - } -[a-z_A-Z0-9.\-\+]+ { - classFile=yytext; - BEGIN( SearchMemberRef ); - } -"#" { - if (YY_START==ReadClassFile) - { - classFile=yyFileName; - } - //BEGIN( ReadMemberRef ); - BEGIN( Start ); - } -[a-z_A-Z0-9]+ { - memberRef=yytext; - BEGIN( SearchMemberName ); - } -""|"" { // is for qt-1.44, is for qt-2.00 - BEGIN( ReadMemberName ); - } -[a-z_A-Z~] { - unput(*yytext); - BEGIN( ReadMemberName ); - } -"operator" { - memberName="operator"; - BEGIN( ReadOperator ); - } -[+\-*/%\^&|~!=()\[\]] { memberName+=*yytext; } -"<" { memberName+="<"; } -">" { memberName+=">"; } -"new" { memberName+=" new"; } -"delete" { memberName+=" delete"; } -"<" { BEGIN( SearchArgs ); } -[a-z_A-Z0-9]+ { - memberName=yytext; - BEGIN( SearchArgs ); - } -"" { - //printf("SearchArg className=%s memberName=%s\n",className.data(),memberName.data()); - if (!className.isEmpty() && !memberName.isEmpty()) - BEGIN( ReadArgs ); - else - BEGIN( Start ); - } -"&" { memberArgs+='&'; } -"<" { memberArgs+='<'; } -">" { memberArgs+='>'; } -""" { memberArgs+='"'; } -" " { memberArgs+=' '; } - /* -[{}] { // handle enums - memberArgs.resize(0); - addMember(memberName,memberRef,memberArgs); - if (*yytext=='}') - BEGIN( Start ); - else - BEGIN( SearchClassFile ); - } - */ -"<"|"\n" { - //printf("adding member %s\n",memberName.data()); - memberArgs=memberArgs.stripWhiteSpace(); - //if (newClass) - //{ - // newClass=FALSE; - // addClass(className); - //} - addMember(memberName,memberRef,memberArgs); - memberName.resize(0); - memberRef.resize(0); - memberArgs.resize(0); - if (*yytext=='<') - BEGIN( SkipHTMLTag); - else - BEGIN( Start ); - } -. { memberArgs+=(*yytext)&0x7f; } -">" { BEGIN( Start ); } -[a-zA-Z]+ -<*>. -<*>\n { yyLineNr++; - if (YY_START!=SkipHTMLTag) BEGIN( Start ); - } - -%% - -/*@ ---------------------------------------------------------------------------- - */ - - -void parse(QCString &s) -{ - bases.clear(); - nameBug = FALSE; - //newClass = TRUE; - inputString = s; - inputPosition = 0; - yyLineNr = 0; - tagYYrestart( tagYYin ); - BEGIN( Start ); - tagYYlex(); - //printf("Number of lines scanned: %d\n",yyLineNr); -} - -void parseFile(QFileInfo &fi) -{ - printf("Parsing file %s...\n",fi.fileName().data()); - QFile f; - f.setName(fi.absFilePath()); - if (f.open(IO_ReadOnly)) - { - yyFileName = fi.fileName(); - className.resize(0); - memberName.resize(0); - //printf("Parsing file %s...\n",fi.fileName().data()); - QCString input(fi.size()+1); - docBaseLink=fi.fileName(); - docRefName=fi.fileName().copy(); - //searchIndex.addReference(docRefName,docBaseLink); - //searchIndex.addWord(docRefName,docRefName,TRUE); - f.readBlock(input.data(),fi.size()); - input.at(fi.size())='\0'; - parse(input); - } - else - { - fprintf(stderr,"Warning: Cannot open file %s\n",fi.fileName().data()); - } -} - -void parseFileOrDir(const char *fileName) -{ - QFileInfo fi(fileName); - if (fi.exists()) - { - if (fi.isFile()) - { - parseFile(fi); - } - else if (fi.isDir()) - { - QDir dir(fileName); - dir.setFilter( QDir::Files ); - dir.setNameFilter( "*.html" ); - const QFileInfoList *list = dir.entryInfoList(); - QFileInfoListIterator it( *list ); - QFileInfo *cfi; - for ( it.toFirst() ; (cfi=it.current()) ; ++it) - { - if (cfi->isFile()) - { - parseFile(*cfi); - } - } - } - } - else - { - fprintf(stderr,"Warning: File %s does not exist\n",fileName); - } -} - -void usage(const char *name) -{ - fprintf(stderr,"Doxytag version %s\nCopyright Dimitri van Heesch 1997-2011\n\n", - versionString); - fprintf(stderr," Generates a tag file and/or a search index for a set of HTML files\n\n"); - fprintf(stderr,"Usage: %s [-t tag_file] [ html_file [html_file...] ]\n",name); - fprintf(stderr,"Options:\n"); - fprintf(stderr," -t Generate tag file .\n"); - fprintf(stderr,"If no HTML files are given all files in the current dir that\n" - "have a .html extension are parsed.\n\n"); - exit(1); -} - -const char *getArg(int argc,char **argv,int &optind,const char c) -{ - char *s=0; - if (strlen(&argv[optind][2])>0) - s=&argv[optind][2]; - else if (optind+1=argc) - { - parseFileOrDir("."); - } - else - { - for (i=optind;iError: $DOXYSEARCH not found. Check cgi script!\"" << endl -// << "fi" << endl; -// f.close(); -// } -// else -// { -// fprintf(stderr,"Error: could not open file %s for writing\n",(dir+"/search.cgi").data()); -// } -// } -// } - } - if (genTag) - { - QFile f; - f.setName(tagName); - if (f.open(IO_WriteOnly)) - { - QTextStream t(&f); - t << "" << endl; - ClassDef *cd=classList.first(); - while (cd) - { - t << " isFile) t << "file"; else t << "class"; - t << "\">" << endl; - t << " " << convertToXML(cd->name) << "" << endl; - char *base=cd->bases.first(); - while (base) - { - t << " " << convertToXML(base) << "" << endl; - base=cd->bases.next(); - } - t << " " << convertToXML(cd->fileName) << "" << endl; - MemberDef *md=cd->memberList.first(); - while (md) - { - if (md->anchor.right(5)=="-enum") - { - t << " " << endl; - } - else - { - t << " " << endl; - } - t << " " << convertToXML(md->name) << "" << endl; - t << " " << convertToXML(md->anchor) << "" << endl; - t << " " << convertToXML(md->args) << "" << endl; - t << " " << endl; - md=cd->memberList.next(); - } - t << " " << endl; - cd=classList.next(); - } - t << "" << endl; - } - else - { - fprintf(stderr,"Error: Could not write tag file %s\n",tagName.data()); - } - } - return 0; -} - -extern "C" { -int tagYYwrap() { return 1 ; } -}; diff --git a/src/doxytag.pro.in b/src/doxytag.pro.in deleted file mode 100644 index d448f97..0000000 --- a/src/doxytag.pro.in +++ /dev/null @@ -1,31 +0,0 @@ -# -# -# -# Copyright (C) 1997-2011 by Dimitri van Heesch. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation under the terms of the GNU General Public License is hereby -# granted. No representations are made about the suitability of this software -# for any purpose. It is provided "as is" without express or implied warranty. -# See the GNU General Public License for more details. -# -# Documents produced by Doxygen are derivative works derived from the -# input used in their production; they are not affected by this license. -# -# TMake project file for doxytag - -TEMPLATE = doxytag.t -CONFIG = console warn_on $extraopts -HEADERS = logos.h version.h -SOURCES = doxytag.cpp logos.cpp version.cpp -unix:LIBS += -L../lib -lqtools -win32:INCLUDEPATH += . -win32-mingw:LIBS += -L../lib -lqtools -win32-msvc:LIBS += qtools.lib shell32.lib -win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib -win32-borland:LIBS += qtools.lib shell32.lib -win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk -win32:TMAKE_CXXFLAGS += -DQT_NODLL -INCLUDEPATH += ../qtools -OBJECTS_DIR = ../objects -TARGET = ../bin/doxytag diff --git a/src/doxytag.t b/src/doxytag.t deleted file mode 100644 index c74c7ef..0000000 --- a/src/doxytag.t +++ /dev/null @@ -1,50 +0,0 @@ -# -# -# -# Copyright (C) 1997-2011 by Dimitri van Heesch. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation under the terms of the GNU General Public License is hereby -# granted. No representations are made about the suitability of this software -# for any purpose. It is provided "as is" without express or implied warranty. -# See the GNU General Public License for more details. -# -# Documents produced by Doxygen are derivative works derived from the -# input used in their production; they are not affected by this license. -# -#! -#! doxytag.t: This is a custom template for building Doxytag -#! -#$ IncludeTemplate("app.t"); - -LEX = flex - -#${ -sub GenerateDep { - my($obj,$src,$dep) = @_; - my(@objv,$srcv,$i,$s,$o,$d,$c); - @objv = split(/\s+/,$obj); - @srcv = split(/\s+/,$src); - for $i ( 0..$#objv ) { - $s = $srcv[$i]; - $o = $objv[$i]; - next if $s eq ""; - $text .= $o . ": " . $s; - $text .= " ${linebreak}\n\t\t" . $dep if $dep ne ""; - if ( $moc_output{$s} ne "" ) { - $text .= " ${linebreak}\n\t\t" . $moc_output{$s}; - } - $d = &make_depend($s); - $text .= " ${linebreak}\n\t\t" . $d if $d ne ""; - $text .= "\n"; - } - chop $text; -} -#$} - -##################### - -#$ GenerateDep("doxytag.cpp","doxytag.l"); - $(LEX) -PtagYY -t doxytag.l >doxytag.cpp - - diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index 7dd03c4..5d1061c 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -687,7 +687,6 @@ void FTVHelp::generateJSLink(FTextStream &t,FTVNode *n) } else // link into other page { - // TODO: external links with installdox // TODO: use m_topLevelIndex t << "\"" << convertToJSString(n->name) << "\", \""; t << externalRef("",n->ref,TRUE); diff --git a/src/growbuf.h b/src/growbuf.h new file mode 100644 index 0000000..6798692 --- /dev/null +++ b/src/growbuf.h @@ -0,0 +1,38 @@ +#ifndef GROWBUF_H +#define GROWBUF_H + +#include +#include + +class GrowBuf +{ + public: + GrowBuf() : str(0), pos(0), len(0) {} + ~GrowBuf() { free(str); str=0; pos=0; len=0; } + void clear() { pos=0; } + void addChar(char c) { if (pos>=len) { len+=1024; str = (char*)realloc(str,len); } + str[pos++]=c; + } + void addStr(const char *s) { + int l=strlen(s); + if (pos+l>=len) { len+=l+1024; str = (char*)realloc(str,len); } + strcpy(&str[pos],s); + pos+=l; + } + void addStr(const char *s,int n) { + int l=strlen(s); + if (n=len) { len+=l+1024; str = (char*)realloc(str,len); } + strncpy(&str[pos],s,n); + pos+=l; + } + const char *get() { return str; } + int getPos() const { return pos; } + char at(int i) const { return str[i]; } + private: + char *str; + int pos; + int len; +}; + +#endif diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 16c5b46..5ecb124 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -94,6 +94,8 @@ static bool mustBeOutsideParagraph(DocNode *n) * preserve formatting. */ case DocNode::Kind_Copy: + /*
        */ + case DocNode::Kind_HtmlBlockQuote: return TRUE; case DocNode::Kind_StyleChange: return ((DocStyleChange*)n)->style()==DocStyleChange::Preformatted || @@ -211,11 +213,37 @@ void HtmlDocVisitor::visit(DocSymbol *s) void HtmlDocVisitor::visit(DocURL *u) { if (m_hide) return; - m_t << "isEmail()) m_t << "mailto:"; - m_t << u->url() << "\">"; - filter(u->url()); - m_t << ""; + if (u->isEmail()) // mail address + { + // do obfuscation via javascript + m_t << "url(); + uint i; + int size=3; + for (i=0;i"; + size=5; + for (i=0;i.nosp@m."; + i+=size; + if (size==5) size=4; else size=5; + } + m_t << ""; + } + else // web address + { + m_t << "url() << "\">"; + filter(u->url()); + m_t << ""; + } } void HtmlDocVisitor::visit(DocLineBreak *) @@ -702,8 +730,10 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast) switch (p->parent()->kind()) { case DocNode::Kind_AutoListItem: - isFirst=TRUE; - isLast =TRUE; + //isFirst=TRUE; + //isLast =TRUE; + isFirst=isFirstChildNode((DocAutoListItem*)p->parent(),p); + isLast =isLastChildNode ((DocAutoListItem*)p->parent(),p); t=1; // not used break; case DocNode::Kind_SimpleListItem: @@ -790,6 +820,7 @@ void HtmlDocVisitor::visitPre(DocPara *p) case DocNode::Kind_SimpleSect: case DocNode::Kind_XRefItem: case DocNode::Kind_Copy: + case DocNode::Kind_HtmlBlockQuote: needsTag = TRUE; break; case DocNode::Kind_Root: @@ -862,6 +893,7 @@ void HtmlDocVisitor::visitPost(DocPara *p) case DocNode::Kind_SimpleSect: case DocNode::Kind_XRefItem: case DocNode::Kind_Copy: + case DocNode::Kind_HtmlBlockQuote: needsTag = TRUE; break; case DocNode::Kind_Root: @@ -1581,6 +1613,29 @@ void HtmlDocVisitor::visitPost(DocText *) { } +void HtmlDocVisitor::visitPre(DocHtmlBlockQuote *b) +{ + if (m_hide) return; + forceEndParagraph(b); + + QString attrs = htmlAttribsToString(b->attribs()); + if (attrs.isEmpty()) + { + m_t << "
        \n"; + } + else + { + m_t << "
        attribs()) << ">\n"; + } +} + +void HtmlDocVisitor::visitPost(DocHtmlBlockQuote *b) +{ + if (m_hide) return; + m_t << "
        " << endl; + forceStartParagraph(b); +} + void HtmlDocVisitor::filter(const char *str) { if (str==0) return; diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h index b4a50ae..cf71e22 100644 --- a/src/htmldocvisitor.h +++ b/src/htmldocvisitor.h @@ -126,6 +126,8 @@ class HtmlDocVisitor : public DocVisitor void visitPost(DocCopy *); void visitPre(DocText *); void visitPost(DocText *); + void visitPre(DocHtmlBlockQuote *); + void visitPost(DocHtmlBlockQuote *); private: diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 4a203b1..c3921af 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -1401,17 +1401,10 @@ void HtmlGenerator::writeStyleInfo(int part) } void HtmlGenerator::startDoxyAnchor(const char *,const char *, - const char *anchor, const char *name, - const char *args) + const char *anchor, const char *, + const char *) { t << ""; - t << ""; } void HtmlGenerator::endDoxyAnchor(const char *,const char *) diff --git a/src/index.cpp b/src/index.cpp index 7d094d8..09e152c 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -286,7 +286,6 @@ void startFile(OutputList &ol,const char *name,const char *manName, const char *altSidebarName) { static bool disableIndex = Config_getBool("DISABLE_INDEX"); - static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); ol.startFile(name,manName,title); ol.startQuickIndices(); if (!disableIndex) @@ -297,10 +296,8 @@ void startFile(OutputList &ol,const char *name,const char *manName, { ol.endQuickIndices(); } - if (generateTreeView) - { - ol.writeSplitBar(altSidebarName ? altSidebarName : name); - } + ol.writeSplitBar(altSidebarName ? altSidebarName : name); + ol.writeSearchInfo(); } void endFile(OutputList &ol,bool skipNavIndex,bool skipEndContents) @@ -311,7 +308,6 @@ void endFile(OutputList &ol,bool skipNavIndex,bool skipEndContents) if (!skipNavIndex) { if (!skipEndContents) ol.endContents(); - ol.writeSearchInfo(); if (generateTreeView) { ol.writeString("

      \n"); @@ -1980,7 +1976,6 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h { if (documentedClassMembers[hl]==0) return; - static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); static bool disableIndex = Config_getBool("DISABLE_INDEX"); bool multiPageIndex=FALSE; @@ -2067,11 +2062,8 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h } } ol.endQuickIndices(); - - if (generateTreeView) - { - ol.writeSplitBar(fileName); - } + ol.writeSplitBar(fileName); + ol.writeSearchInfo(); ol.startContents(); @@ -2161,7 +2153,6 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl) { if (documentedFileMembers[hl]==0) return; - static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); static bool disableIndex = Config_getBool("DISABLE_INDEX"); bool multiPageIndex=FALSE; @@ -2245,11 +2236,8 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl) } } ol.endQuickIndices(); - - if (generateTreeView) - { - ol.writeSplitBar(fileName); - } + ol.writeSplitBar(fileName); + ol.writeSearchInfo(); ol.startContents(); @@ -2337,7 +2325,6 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, { if (documentedNamespaceMembers[hl]==0) return; - static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); static bool disableIndex = Config_getBool("DISABLE_INDEX"); @@ -2423,11 +2410,8 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, } ol.endQuickIndices(); - - if (generateTreeView) - { - ol.writeSplitBar(fileName); - } + ol.writeSplitBar(fileName); + ol.writeSearchInfo(); ol.startContents(); @@ -3456,7 +3440,6 @@ static void writeIndex(OutputList &ol) title = filterTitle(Doxygen::mainPage->title()); } - static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); QCString indexName="index"; ol.startFile(indexName,0,title); @@ -3476,10 +3459,8 @@ static void writeIndex(OutputList &ol) ol.writeQuickLinks(TRUE,HLI_Main,0); } ol.endQuickIndices(); - if (generateTreeView) - { - ol.writeSplitBar(indexName); - } + ol.writeSplitBar(indexName); + ol.writeSearchInfo(); bool headerWritten=FALSE; if (Doxygen::mainPage && !Doxygen::mainPage->title().isEmpty()) { diff --git a/src/instdox.cpp b/src/instdox.cpp deleted file mode 100644 index 56a3630..0000000 --- a/src/instdox.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2011 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ - -#include -#include - -#include "qtbc.h" -#include -#include - -#include "instdox.h" -#include "doxygen.h" -#include "config.h" -#include "message.h" - -void writeInstallScript() -{ - QCString fileName=Config_getString("HTML_OUTPUT")+"/installdox"; - QFile f(fileName); - if (f.open(IO_WriteOnly)) - { - FTextStream t(&f); - t << "#!" << Config_getString("PERL_PATH") << endl << endl << "%subst = ( "; - - char *s=Config_getList("TAGFILES").first(); - while (s) - { - QCString tagLine=s; - QCString fileName; - int eqPos = tagLine.find('='); - if (eqPos!=-1) // strip destination part - { - fileName = tagLine.left(eqPos).stripWhiteSpace(); - } - else - { - fileName = tagLine; - } - QFileInfo fi(fileName); - t << "\"" << fi.fileName() << "\", \"\""; - s=Config_getList("TAGFILES").next(); - if (s) t << ", "; - } - - t << ");\n"; - t << "$quiet = 0;\n"; - t << "\n"; - t << "while ( @ARGV ) {\n"; - t << " $_ = shift @ARGV;\n"; - t << " if ( s/^-// ) {\n"; - t << " if ( /^l(.*)/ ) {\n"; - t << " $v = ($1 eq \"\") ? shift @ARGV : $1;\n"; - t << " ($v =~ /\\/$/) || ($v .= \"/\");\n"; - t << " $_ = $v;\n"; - t << " if ( /(.+)\\@(.+)/ ) {\n"; - t << " if ( exists $subst{$1} ) {\n"; - t << " $subst{$1} = $2;\n"; - t << " } else {\n"; - t << " print STDERR \"Unknown tag file $1 given with option -l\\n\";\n"; - t << " &usage();\n"; - t << " }\n"; - t << " } else {\n"; - t << " print STDERR \"Argument $_ is invalid for option -l\\n\";\n"; - t << " &usage();\n"; - t << " }\n"; - t << " }\n"; - t << " elsif ( /^q/ ) {\n"; - t << " $quiet = 1;\n"; - t << " }\n"; - t << " elsif ( /^\\?|^h/ ) {\n"; - t << " &usage();\n"; - t << " }\n"; - t << " else {\n"; - t << " print STDERR \"Illegal option -$_\\n\";\n"; - t << " &usage();\n"; - t << " }\n"; - t << " }\n"; - t << " else {\n"; - t << " push (@files, $_ );\n"; - t << " }\n"; - t << "}\n"; - t << "\n"; - t << "foreach $sub (keys %subst)\n"; - t << "{\n"; - t << " if ( $subst{$sub} eq \"\" ) \n"; - t << " {\n"; - t << " print STDERR \"No substitute given for tag file `$sub'\\n\";\n"; - t << " &usage();\n"; - t << " }\n"; - t << " elsif ( ! $quiet && $sub ne \"_doc\" && $sub ne \"_cgi\" )\n"; - t << " {\n"; - t << " print \"Substituting $subst{$sub} for each occurrence of tag file $sub\\n\"; \n"; - t << " }\n"; - t << "}\n"; - t << "\n"; - t << "if ( ! @files ) {\n"; - t << " if (opendir(D,\".\")) {\n"; - t << " foreach $file ( readdir(D) ) {\n"; - t << " $match = \"" << Config_getString("HTML_FILE_EXTENSION") << "\";\n"; - t << " next if ( $file =~ /^\\.\\.?$/ );\n"; - t << " ($file =~ /$match/) && (push @files, $file);\n"; - t << " ($file =~ /\\.svg/) && (push @files, $file);\n"; - t << " ($file =~ \"navtree.js\") && (push @files, $file);\n"; - t << " }\n"; - t << " closedir(D);\n"; - t << " }\n"; - t << "}\n"; - t << "\n"; - t << "if ( ! @files ) {\n"; - t << " print STDERR \"Warning: No input files given and none found!\\n\";\n"; - t << "}\n"; - t << "\n"; - t << "foreach $f (@files)\n"; - t << "{\n"; - t << " if ( ! $quiet ) {\n"; - t << " print \"Editing: $f...\\n\";\n"; - t << " }\n"; - t << " $oldf = $f;\n"; - t << " $f .= \".bak\";\n"; - t << " unless (rename $oldf,$f) {\n"; - t << " print STDERR \"Error: cannot rename file $oldf\\n\";\n"; - t << " exit 1;\n"; - t << " }\n"; - t << " if (open(F,\"<$f\")) {\n"; - t << " unless (open(G,\">$oldf\")) {\n"; - t << " print STDERR \"Error: opening file $oldf for writing\\n\";\n"; - t << " exit 1;\n"; - t << " }\n"; - t << " if ($oldf ne \"tree.js\") {\n"; - t << " while () {\n"; - t << " s/doxygen\\=\\\"([^ \\\"\\:\\t\\>\\<]*)\\:([^ \\\"\\t\\>\\<]*)\\\" (xlink:href|href|src)=\\\"\\2/doxygen\\=\\\"$1:$subst{$1}\\\" \\3=\\\"$subst{$1}/g;\n"; - t << " print G \"$_\";\n"; - t << " }\n"; - t << " }\n"; - t << " else {\n"; - t << " while () {\n"; - t << " s/\\\"([^ \\\"\\:\\t\\>\\<]*)\\:([^ \\\"\\t\\>\\<]*)\\\", \\\"\\2/\\\"$1:$subst{$1}\\\" ,\\\"$subst{$1}/g;\n"; - t << " print G \"$_\";\n"; - t << " }\n"; - t << " }\n"; - t << " } \n"; - t << " else {\n"; - t << " print STDERR \"Warning file $f does not exist\\n\";\n"; - t << " }\n"; - t << " unlink $f;\n"; - t << "}\n"; - t << "\n"; - t << "sub usage {\n"; - t << " print STDERR \"Usage: installdox [options] [html-file [html-file ...]]\\n\";\n"; - t << " print STDERR \"Options:\\n\";\n"; - t << " print STDERR \" -l tagfile\\@linkName tag file + URL or directory \\n\";\n"; - t << " print STDERR \" -q Quiet mode\\n\\n\";\n"; - t << " exit 1;\n"; - t << "}\n"; - } - else - { - err("Error: Cannot open file %s for writing\n",fileName.data()); - } - f.close(); - struct stat stat_struct; - stat(fileName,&stat_struct); -#if !defined(_WIN32) - chmod(fileName,stat_struct.st_mode|S_IXUSR|S_IXGRP|S_IXOTH); -#endif -} diff --git a/src/instdox.h b/src/instdox.h deleted file mode 100644 index 55c1864..0000000 --- a/src/instdox.h +++ /dev/null @@ -1,23 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2011 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ - -#ifndef INSTDOX_H -#define INSTDOX_H - -extern void writeInstallScript(); - -#endif diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index 8d84c4d..dc3b4e7 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -1367,6 +1367,18 @@ void LatexDocVisitor::visitPost(DocText *) { } +void LatexDocVisitor::visitPre(DocHtmlBlockQuote *) +{ + if (m_hide) return; + m_t << "\\begin{quotation}" << endl; +} + +void LatexDocVisitor::visitPost(DocHtmlBlockQuote *) +{ + if (m_hide) return; + m_t << "\\end{quotation}" << endl; +} + void LatexDocVisitor::filter(const char *str) { filterLatexString(m_t,str,m_insideTabbing,m_insidePre,m_insideItem); diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h index 359b9f7..fc0218e 100644 --- a/src/latexdocvisitor.h +++ b/src/latexdocvisitor.h @@ -117,8 +117,6 @@ class LatexDocVisitor : public DocVisitor void visitPost(DocSecRefItem *); void visitPre(DocSecRefList *); void visitPost(DocSecRefList *); - //void visitPre(DocLanguage *); - //void visitPost(DocLanguage *); void visitPre(DocParamSect *); void visitPost(DocParamSect *); void visitPre(DocParamList *); @@ -131,6 +129,8 @@ class LatexDocVisitor : public DocVisitor void visitPost(DocCopy *); void visitPre(DocText *); void visitPost(DocText *); + void visitPre(DocHtmlBlockQuote *); + void visitPost(DocHtmlBlockQuote *); private: diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 66302b3..6f92f79 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -158,7 +158,7 @@ void LatexGenerator::init() << "pdf: refman.pdf" << endl << endl; t << "refman.pdf: clean refman.tex" << endl; t << "\tpdflatex refman" << endl; - t << "\t" << mkidx_command << " refman.tex" << endl; + t << "\t" << mkidx_command << " refman.idx" << endl; if (generateBib) { t << "\tbibtex refman" << endl; diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in index 626b7d9..1446a17 100644 --- a/src/libdoxygen.pro.in +++ b/src/libdoxygen.pro.in @@ -64,7 +64,6 @@ HEADERS = bufstr.h \ image.h \ index.h \ index_xsd.h \ - instdox.h \ jquery_js.h \ jquery_ui_js.h \ sizzle_js.h \ @@ -78,6 +77,7 @@ HEADERS = bufstr.h \ logos.h \ mandocvisitor.h \ mangen.h \ + markdown.h \ marshal.h \ memberdef.h \ membergroup.h \ @@ -208,7 +208,6 @@ SOURCES = ce_lex.cpp \ indexlog.cpp \ image.cpp \ index.cpp \ - instdox.cpp \ language.cpp \ latexdocvisitor.cpp \ latexgen.cpp \ @@ -217,6 +216,7 @@ SOURCES = ce_lex.cpp \ logos.cpp \ mandocvisitor.cpp \ mangen.cpp \ + markdown.cpp \ marshal.cpp \ memberdef.cpp \ membergroup.cpp \ diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index 541a5e1..9a630b7 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -955,6 +955,27 @@ void ManDocVisitor::visitPost(DocText *) { } +void ManDocVisitor::visitPre(DocHtmlBlockQuote *) +{ + if (m_hide) return; + if (!m_firstCol) + { + m_t << endl; + m_t << ".PP" << endl; + } + m_t << ".RS 4" << endl; // TODO: add support for nested block quotes +} + +void ManDocVisitor::visitPost(DocHtmlBlockQuote *) +{ + if (m_hide) return; + if (!m_firstCol) m_t << endl; + m_t << ".RE" << endl; + m_t << ".PP" << endl; + m_firstCol=TRUE; +} + + void ManDocVisitor::filter(const char *str) { if (str) diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h index 929780e..14559d5 100644 --- a/src/mandocvisitor.h +++ b/src/mandocvisitor.h @@ -129,6 +129,8 @@ class ManDocVisitor : public DocVisitor void visitPost(DocCopy *); void visitPre(DocText *); void visitPost(DocText *); + void visitPre(DocHtmlBlockQuote *); + void visitPost(DocHtmlBlockQuote *); private: diff --git a/src/markdown.cpp b/src/markdown.cpp new file mode 100644 index 0000000..42b5bee --- /dev/null +++ b/src/markdown.cpp @@ -0,0 +1,1890 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2012 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +/* Note: part of the code below is inspired by libupskirt written by + * Natacha Porté. Original copyright message follows: + * + * Copyright (c) 2008, Natacha Porté + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include + +#include "markdown.h" +#include "growbuf.h" +#include "debug.h" +#include "util.h" +#include "doxygen.h" +#include "commentscan.h" + +//---------- + +struct LinkRef +{ + LinkRef(const QCString &l,const QCString &t) : link(l), title(t) {} + QCString link; + QCString title; +}; + +typedef int (*action_t)(GrowBuf &out,const char *data,int offset,int size); + +enum Alignment { AlignNone, AlignLeft, AlignCenter, AlignRight }; + + +//---------- + +static QDict g_linkRefs(257); +static action_t g_actions[256]; +//static QDict g_htmlBlockTags(17); + +//---------- + +const int codeBlockIndent = 4; + +static void processInline(GrowBuf &out,const char *data,int size); + +// escape characters that have a special meaning later on. +static QCString escapeSpecialChars(const QCString &s) +{ + if (s.isEmpty()) return ""; + GrowBuf growBuf; + const char *p=s; + char c; + while ((c=*p++)) + { + switch (c) + { + case '<': growBuf.addStr("\\<"); break; + case '>': growBuf.addStr("\\>"); break; + case '\\': growBuf.addStr("\\\\"); break; + case '@': growBuf.addStr("\\@"); break; + default: growBuf.addChar(c); break; + } + } + growBuf.addChar(0); + return growBuf.get(); +} + +static void convertStringFragment(QCString &result,const char *data,int size) +{ + if (size<0) size=0; + result.resize(size+1); + memcpy(result.data(),data,size); + result.at(size)='\0'; +} + +/** helper function to convert presence of left and/or right alignment markers + * to a alignment value + */ +static Alignment markersToAlignment(bool leftMarker,bool rightMarker) +{ + //printf("markerToAlignment(%d,%d)\n",leftMarker,rightMarker); + if (leftMarker && rightMarker) + { + return AlignCenter; + } + else if (leftMarker) + { + return AlignLeft; + } + else if (rightMarker) + { + return AlignRight; + } + else + { + return AlignNone; + } +} + + +// Check if data contains a block command. If so returned the command +// that ends the block. If not an empty string is returned. +// Note When offset>0 character position -1 will be inspected. +// +// Checks for and skip the following block commands: +// {@code .. { .. } .. } +// \dot .. \enddot +// \code .. \endcode +// \msc .. \endmsc +// \f$..\f$ +// \f[..\f] +// \f{..\f} +// \verbatim..\endverbatim +// \latexonly..\endlatexonly +// \htmlonly..\endhtmlonly +// \xmlonly..\endxmlonly +// \rtfonly..\endrtfonly +// \manonly..\endmanonly +static QCString isBlockCommand(const char *data,int offset,int size) +{ + bool openBracket = offset>0 && data[-1]=='{'; + bool isEscaped = offset>0 && (data[-1]=='\\' || data[-1]=='@'); + if (isEscaped) return QCString(); + + int end=1; + while (end='a' && data[end]<='z')) end++; + if (end==1) return QCString(); + QCString blockName; + convertStringFragment(blockName,data+1,end-1); + if (blockName=="code" && openBracket) + { + return "}"; + } + else if (blockName=="dot" || + blockName=="code" || + blockName=="msc" || + blockName=="verbatim" || + blockName=="latexonly" || + blockName=="htmlonly" || + blockName=="xmlonly" || + blockName=="rtfonly" || + blockName=="manonly" + ) + { + return "end"+blockName; + } + else if (blockName=="f" && end='a' && data[i+1]<='z') || + (data[i+1]>='A' && data[i+1]<='Z') || + (data[i+1]>='0' && data[i+1]<='9') + ) + ) // to prevent touching some_underscore_identifier + { + i++; + continue; + } + return i; // found it + } + + // not counting escaped chars + if (i>0 && (data[i-1]=='\\' || data[i-1]=='@')) + { + i++; + continue; + } + + // skipping a code span + if (data[i]=='`') + { + int snb=0; + while (i=size || data[i]=='\n') return 0; // empty line -> paragraph + } + else // should not get here! + { + i++; + } + + } + return 0; +} + +/** process single emphasis */ +static int processEmphasis1(GrowBuf &out, const char *data, int size, char c) +{ + int i = 0, len; + + /* skipping one symbol if coming from emph3 */ + if (size>1 && data[0]==c && data[1]==c) { i=1; } + + while (i=size) return 0; + + if (i+1"); + processInline(out,data,i); + out.addStr(""); + return i+1; + } + } + return 0; +} + +/** process double emphasis */ +static int processEmphasis2(GrowBuf &out, const char *data, int size, char c) +{ + int i = 0, len; + + while (i"); + processInline(out,data,i); + out.addStr(""); + return i + 2; + } + i++; + } + return 0; +} + +/** Parsing single emphase. + * Finds the first closing tag, and delegates to the other emph + */ +static int processEmphasis3(GrowBuf &out, const char *data, int size, char c) +{ + int i = 0, len; + + while (i"); + processInline(out,data,i); + out.addStr(""); + return i+3; + } + else if (i+12 && data[1]!=c) + { + // whitespace cannot follow an opening emphasis + if (data[1]==' ' || data[1]=='\n' || + (ret = processEmphasis1(out, data+1, size-1, c)) == 0) + { + return 0; + } + return ret+1; + } + if (size>3 && data[1]==c && data[2]!=c) + { + if (data[2]==' ' || data[2]=='\n' || + (ret = processEmphasis2(out, data+2, size-2, c)) == 0) + { + return 0; + } + return ret+2; + } + if (size>4 && data[1]==c && data[2]==c && data[3]!=c) + { + if (data[3]==' ' || data[3]=='\n' || + (ret = processEmphasis3(out, data+3, size-3, c)) == 0) + { + return 0; + } + return ret+3; + } + return 0; +} + +static int processLink(GrowBuf &out,const char *data,int,int size) +{ + QCString content; + QCString link; + QCString title; + int contentStart,contentEnd,linkStart,titleStart,titleEnd; + bool isImageLink = FALSE; + int i=1; + if (data[0]=='!') + { + isImageLink = TRUE; + if (size<2 || data[1]!='[') + { + return 0; + } + i++; + } + contentStart=i; + int level=1; + int nl=0; + // find the matching ] + while (i1) return 0; // only allow one newline in the content + } + i++; + } + if (i>=size) return 0; // premature end of comment -> no link + contentEnd=i; + convertStringFragment(content,data+contentStart,contentEnd-contentStart); + //printf("processLink: content={%s}\n",content.data()); + if (content.isEmpty()) return 0; // no link text + i++; // skip over ] + + // skip whitespace + while (i1) return 0; + } + i++; + } + if (i>=size || data[i]=='\n') return 0; + convertStringFragment(link,data+linkStart,i-linkStart); + link = link.stripWhiteSpace(); + //printf("processLink: link={%s}\n",link.data()); + if (link.isEmpty()) return 0; + if (link.at(link.length()-1)=='>') link=link.left(link.length()-1); + + // optional title + if (data[i]=='\'' || data[i]=='"') + { + char c = data[i]; + i++; + titleStart=i; + nl=0; + while (i1) return 0; + nl++; + } + i++; + } + if (i>=size) + { + return 0; + } + titleEnd = i-1; + // search back for closing marker + while (titleEnd>titleStart && data[titleEnd]==' ') titleEnd--; + if (data[titleEnd]==c) // found it + { + convertStringFragment(title,data+titleStart,titleEnd-titleStart); + //printf("processLink: title={%s}\n",title.data()); + } + else + { + return 0; + } + } + i++; + } + else if (i1) return 0; + } + i++; + } + if (i>=size) return 0; + // extract link + convertStringFragment(link,data+linkStart,i-linkStart); + //printf("processLink: link={%s}\n",link.data()); + link = link.stripWhiteSpace(); + if (link.isEmpty()) // shortcut link + { + link=content; + } + // lookup reference + LinkRef *lr = g_linkRefs.find(link.lower()); + if (lr) // found it + { + link = lr->link; + title = lr->title; + //printf("processLink: ref: link={%s} title={%s}\n",link.data(),title.data()); + } + else // reference not found! + { + //printf("processLink: ref {%s} do not exist\n",link.lower().data()); + return 0; + } + i++; + } + else if (ilink; + title = lr->title; + explicitTitle=TRUE; + i=contentEnd; + } + else + { + return 0; + } + i++; + } + else + { + return 0; + } + if (isImageLink) // TODO: use @image? + { + out.addStr("\"");"); + } + else + { + static QRegExp re("^[@\\]ref "); + if (link.find('/')!=-1) // file/url link + { + out.addStr(""); + out.addStr(content.simplifyWhiteSpace()); + out.addStr(""); + } + else if (link.find("@ref ")!=-1 || link.find("\\ref ")!=-1) + // assume doxygen symbol link + { + out.addStr(link); + out.addStr(" \""); + if (explicitTitle && !title.isEmpty()) + { + out.addStr(title); + } + else + { + out.addStr(content); + } + out.addStr("\""); + } + else // avoid link to F[x](y) + { + //printf("no link for '%s'\n",link.data()); + return 0; + } + } + return i; +} + +/** '`' parsing a code span (assuming codespan != 0) */ +static int processCodeSpan(GrowBuf &out, const char *data, int /*offset*/, int size) +{ + int end, nb = 0, i, f_begin, f_end; + + /* counting the number of backticks in the delimiter */ + while (nb= size) + { + return 0; // no matching delimiter + } + if (nl==2) // too many newlines inside the span + { + return 0; + } + + // trimming outside whitespaces + f_begin = nb; + while (f_begin < end && data[f_begin]==' ') + { + f_begin++; + } + f_end = end - nb; + while (f_end > nb && data[f_end-1]==' ') + { + f_end--; + } + + if (nb==1) // check for closing ' followed by space within f_begin..f_end + { + i=f_begin; + while (i='a' && data[i+1]<='z') || + (data[i+1]>='A' && data[i+1]<='Z') || + (data[i+1]>='0' && data[i+1]<='9') + )) // reject `some word' and not `it's cool` + { + return 0; + } + i++; + } + } + printf("found code span '%s'\n",QCString(data+f_begin).left(f_end-f_begin).data()); + + /* real code span */ + if (f_begin < f_end) + { + QCString codeFragment; + convertStringFragment(codeFragment,data+f_begin,f_end-f_begin); + out.addStr(""); + //out.addStr(convertToHtml(codeFragment,TRUE)); + out.addStr(escapeSpecialChars(codeFragment)); + out.addStr(""); + } + return end; +} + + +static int processSpecialCommand(GrowBuf &out, const char *data, int offset, int size) +{ + int i=1; + QCString endBlockName = isBlockCommand(data,offset,size); + if (!endBlockName.isEmpty()) + { + int l = endBlockName.length(); + while (i1) + { + char c=data[1]; + if (c=='[' || c==']' || c=='*' || c=='_' || c=='+' || c=='-' || + c=='!' || c=='(' || c==')' || c=='.' || c=='`') + { + out.addStr(&data[1],1); + return 2; + } + } + return 0; +} + +#if 0 +static int processHtmlBlock(GrowBuf &out, const char *data, int offset, int size) +{ + if (size<2 || data[0]!='<') return 0; + int i=1; + while (i='0' && data[i]<='9') || + (data[i]>='A' && data[i]<='Z') || + (data[i]>='a' && data[i]<='z'))) i++; + if (i<=1 || i>=size) return 0; + QCString tagName; + convertStringFragment(tagName,data+1,i-1); + printf("found html tag '%s'\n",tagName.data()); + if (g_htmlBlockTags.find(tagName)!=0) + { + printf("found block tag\n"); + + // search for end of the block... + } + return 0; +} +#endif + +static void processInline(GrowBuf &out,const char *data,int size) +{ + int i=0, end=0; + action_t action; + while (i=size) break; + i=end; + end = action(out,data+i,i,size-i); + if (!end) + { + end=i+1; + } + else + { + i+=end; + end=i; + } + } +} + +/** returns whether the line is a setext-style hdr underline */ +static int isHeaderline(const char *data, int size) +{ + int i = 0; + while (i=size || data[i]=='\n') ? 1 : 0; + } + // test of level 2 header + if (data[i]=='-') + { + while (i=size || data[i]=='\n') ? 2 : 0; + } + return 0; +} + +/** returns TRUE if this line starts a block quote */ +static bool isBlockQuote(const char *data,int size,int indent) +{ + int i = 0; + while (i' && i=size || data[i]!='[') return 0; + i++; + int refIdStart=i; + while (i=size || data[i]!=']') return 0; + convertStringFragment(refid,data+refIdStart,i-refIdStart); + if (refid.isEmpty()) return 0; + //printf(" isLinkRef: found refid='%s'\n",refid.data()); + i++; + if (i>=size || data[i]!=':') return 0; + i++; + + // format: whitespace* \n? whitespace* ( | url) + while (i=size) return 0; + + if (i') i++; + if (linkStart==linkEnd) return 0; // empty link + convertStringFragment(link,data+linkStart,linkEnd-linkStart); + //printf(" isLinkRef: found link='%s'\n",link.data()); + if (link=="@ref" || link=="\\ref") + { + int argStart=i; + while (i=size) + { + //printf("end of isLinkRef while looking for title! i=%d\n",i); + return i; // end of buffer while looking for the optional title + } + + char c = data[i]; + if (c=='\'' || c=='"' || c=='(') // optional title present? + { + //printf(" start of title found! char='%c'\n",c); + i++; + if (c=='(') c=')'; // replace c by end character + int titleStart=i; + // search for end of the line + while (ititleStart && data[end]!=c) end--; + if (end>titleStart) + { + convertStringFragment(title,data+titleStart,end-titleStart); + } + //printf(" title found: '%s'\n",title.data()); + } + while (i=size) return i; // end of buffer while ref id was found + else if (data[i]=='\n') return i+1; // end of line while ref id was found + else if (eol) return eol; // no optional title found + return 0; // invalid link ref +} + +static int isHRuler(const char *data,int size) +{ + int i=0; + if (size>0 && data[size-1]=='\n') size--; // ignore newline character + while (i=size) return 0; // empty line + char c=data[i]; + if (c!='*' && c!='-' && c!='_') + { + return 0; // not a hrule character + } + int n=0; + while (i=3; // at least 3 characters needed for a hruler +} + +static QCString extractTitleId(QCString &title) +{ + static QRegExp r1("^[a-z_A-Z][a-z_A-Z0-9\\-]*:"); + static QRegExp r2("\\{#[a-z_A-Z][a-z_A-Z0-9\\-]*\\}$"); + int l=0; + int i = r2.match(title,0,&l); + if (i!=-1) // found {#id} style id + { + QCString id = title.mid(i+2,l-3); + title = title.left(i)+title.mid(i+l); + //printf("found id='%s' title='%s'\n",id.data(),title.data()); + return id; + } + i = r1.match(title,0,&l); + if (i!=-1) // found id: style id + { + QCString id = title.mid(i,l-1); + title = title.left(i)+title.mid(i+l); + //printf("found id='%s' title='%s'\n",id.data(),title.data()); + return id; + } + //printf("no id found in title '%s'\n",title.data()); + return ""; +} + + +static int isAtxHeader(const char *data,int size,QCString &header) +{ + int i = 0, end; + int level = 0; + + // find start of header text and determine heading level + while (i=size || data[i]!='#') return 0; + while (ii && (data[end-1]=='#' || data[end-1]==' ')) end--; + + // store result + convertStringFragment(header,data+i,end-i); + + return level; +} + +static int isEmptyLine(const char *data,int size) +{ + int i=0; + while (i='1' && data[i]<='9'))) // ordered list marker? + ) + ) + ) + { + if (isDigit) // skip over ordered list marker '10. ' + { + int j=i+1; + while (j='0' && data[j]<='9') || data[j]=='.')) + { + if (data[j]=='.') // should be end of the list marker + { + if (j%d\n",QCString(data).left(size).data(),indent); + return indent; +} + +static bool isCodeBlock(const char *data,int offset,int size,int &indent) +{ + //printf("isCodeBlock: line is not indented enough %d<4\n",indent0); + return FALSE; + } + + i=offset; + int nl=0; + int nl_pos[3]; + // search back 3 lines and remember the start of lines -1 and -2 + while (i>0 && nl<3) + { + if (data[i-offset-1]=='\n') nl_pos[nl++]=i-offset; + i--; + } + + // if there are only 2 preceding lines, then line -2 starts at -offset + if (i==0 && nl==2) nl_pos[nl++]=-offset; + //printf(" nl=%d\n",nl); + + if (nl==3) // we have at least 2 preceding lines + { + //printf(" positions: nl_pos=[%d,%d,%d] line[-2]='%s' line[-1]='%s'\n", + // nl_pos[0],nl_pos[1],nl_pos[2], + // QCString(data+nl_pos[1]).left(nl_pos[0]-nl_pos[1]-1).data(), + // QCString(data+nl_pos[2]).left(nl_pos[1]-nl_pos[2]-1).data()); + + // check that line -1 is empty + if (!isEmptyLine(data+nl_pos[1],nl_pos[0]-nl_pos[1]-1)) + { + return FALSE; + } + + // determine the indent of line -2 + indent=computeIndentExcludingListMarkers(data+nl_pos[2],nl_pos[1]-nl_pos[2]); + + //printf(">isCodeBlock local_indent %d>=%d+4=%d\n", + // indent0,indent2,indent0>=indent2+4); + // if the difference is >4 spaces -> code block + return indent0>=indent+codeBlockIndent; + } + else // not enough lines to determine the relative indent, use global indent + { + // check that line -1 is empty + if (nl==1 && !isEmptyLine(data-offset,offset-1)) + { + return FALSE; + } + //printf(">isCodeBlock global indent %d>=%d+4=%d\n", + // indent0,indent,indent0>=indent+4); + return indent0>=indent+codeBlockIndent; + } +} + +/** Finds the location of the table's contains in the string \a data. + * Only one line will be inspected. + * @param[in] data pointer to the string buffer. + * @param[in] size the size of the buffer. + * @param[out] start offset of the first character of the table content + * @param[out] end offset of the last character of the table content + * @param[out] columns number of table columns found + * @returns The offset until the next line in the buffer. + */ +int findTableColumns(const char *data,int size,int &start,int &end,int &columns) +{ + int i=0; + int eol; + // find start character of the table line + while (i0 && data[i]==' ') i--; + if (i>0 && data[i]=='|') i--; // trailing | does not count + end = i; + + // count columns between start and end + columns=1; + if (end>start) + { + i=start; + while (i<=end) + { + if (data[i]=='|' && (i==0 || data[i-1]!='\\')) columns++; + i++; + } + } + //printf("findTableColumns(start=%d,end=%d,columns=%d) eol=%d\n", + // start,end,columns,eol); + return eol; +} + +/** Returns TRUE iff data points to the start of a table block */ +static bool isTableBlock(const char *data,int size) +{ + int cc0,start,end; + + // the first line should have at least two columns separated by '|' + int i = findTableColumns(data,size,start,end,cc0); + if (i>=size || cc0<2) + { + //printf("isTableBlock: no |'s in the header\n"); + return FALSE; + } + + int cc1; + int ret = findTableColumns(data+i,size-i,start,end,cc1); + int j=i+start; + // separator line should consist of |, - and : and spaces only + while (j<=end+i) + { + if (data[j]!=':' && data[j]!='-' && data[j]!='|' && data[j]!=' ') + { + //printf("isTableBlock: invalid character '%c'\n",data[j]); + return FALSE; // invalid characters in table separator + } + j++; + } + if (cc1!=cc0) // number of columns should be same as previous line + { + return FALSE; + } + + i+=ret; // goto next line + int cc2; + ret = findTableColumns(data+i,size-i,start,end,cc2); + + //printf("isTableBlock: %d\n",cc1==cc2); + return cc1==cc2; +} + +static int writeTableBlock(GrowBuf &out,const char *data,int size) +{ + int i=0,j,k; + int columns,start,end,cc; + + i = findTableColumns(data,size,start,end,columns); + + out.addStr(""); + + // write table header, in range [start..end] + out.addStr(""); + j=start; + for (k=0;k"); + while (j<=end && (data[j]!='|' || (j>0 && data[j-1]=='\\'))) + { + out.addChar(data[j++]); + } + j++; + } + + // read cell alignments + int ret = findTableColumns(data+i,size-i,start,end,cc); + k=0; + Alignment *columnAlignment = new Alignment[columns]; + + bool leftMarker=FALSE,rightMarker=FALSE; + bool startFound=FALSE; + j=start+i; + while (j<=end+i) + { + if (!startFound) + { + if (data[j]==':') { leftMarker=TRUE; startFound=TRUE; } + if (data[j]=='-') startFound=TRUE; + //printf(" data[%d]=%c startFound=%d\n",j,data[j],startFound); + } + if (data[j]=='-') rightMarker=FALSE; + else if (data[j]==':') rightMarker=TRUE; + if (j<=end+i && (data[j]=='|' && (j==0 || data[j-1]!='\\'))) + { + if (k"); + j=start+i; + int columnStart=j; + k=0; + while (j<=end+i) + { + if (j==columnStart) + { + out.addStr(""); + } + if (j<=end+i && (data[j]=='|' && (j==0 || data[j-1]!='\\'))) + { + columnStart=j+1; + k++; + } + else + { + out.addChar(data[j]); + } + j++; + } + out.addChar('\n'); + + // proceed to next line + i+=ret; + } + + out.addStr("
      \n"); + + delete columnAlignment; + return i; +} + + +void writeOneLineHeaderOrRuler(GrowBuf &out,const char *data,int size) +{ + int level; + QCString header; + if (isHRuler(data,size)) + { + out.addStr("
      \n"); + } + else if ((level=isAtxHeader(data,size,header))) + { + QCString hTag; + hTag.sprintf("h%d",level); + out.addStr("<"+hTag+">"); + out.addStr(header); + out.addStr("\n"); + } + else // nothing interesting -> just output the line + { + out.addStr(data,size); + } +} + +static int writeBlockQuote(GrowBuf &out,const char *data,int size) +{ + int l; + int i=0; + int curLevel=0; + int end=0; + while (i')) + { + if (data[j]=='>') { level++; indent=j+1; } + else if (j>0 && data[j-1]=='>') indent=j+1; + j++; + } + if (level>curLevel) // quote level increased => add start markers + { + for (l=curLevel;l\n"); + } + } + else if (level add end markers + { + for (l=level;l\n"); + } + } + curLevel=level; + if (level==0) break; // end of quote block + // copy line without quotation marks + out.addStr(data+indent,end-indent); + // proceed with next line + i=end; + } + // end of comment within blockquote => add end markers + for (l=0;l\n"); + } + return i; +} + +static int writeCodeBlock(GrowBuf &out,const char *data,int size,int refIndent) +{ + int i=0,end; + //printf("writeCodeBlock: data={%s}\n",QCString(data).left(size).data()); + out.addStr("@verbatim\n"); + while (i=refIndent+codeBlockIndent) // enough indent to contine the code block + { + // add code line minus the indent + out.addStr(data+i+refIndent+codeBlockIndent,end-i-refIndent-codeBlockIndent); + i=end; + } + else // end of code block + { + break; + } + } + out.addStr("@endverbatim\n"); + //printf("i=%d\n",i); + return i; +} + +// start searching for the end of the line start at offset \a i +// keeping track of possible blocks that need to to skipped. +static void findEndOfLine(GrowBuf &out,const char *data,int size, + int &pi,int&i,int &end) +{ + // find end of the line + for (end=i+1; endcodeBlockIndent && isCodeBlock(data,0,end,blockIndent)) + { + i=writeCodeBlock(out,data,size,blockIndent); + end=i+1; + pi=-1; + } + + // process each line + while (i0) + { + //printf("Found header at %d-%d\n",i,end); + while (pi1) + { + out.addStr(level==1?"

      ":"

      "); + out.addStr(data+pi,i-pi-1); + out.addStr(level==1?"

      \n":"\n"); + } + else + { + out.addStr("
      \n"); + } + pi=-1; + i=end; + end=i+1; + continue; + } + else if ((ref=isLinkRef(data+pi,size-pi,id,link,title))) + { + //printf("found link ref: id='%s' link='%s' title='%s'\n", + // id.data(),link.data(),title.data()); + g_linkRefs.insert(id.lower(),new LinkRef(link,title)); + i=ref+pi; + pi=-1; + end=i+1; + } + else if (isCodeBlock(data+i,i,end-i,blockIndent)) + //if (isCodeBlock(data+pi,pi,end-pi,blockIndent)) + { + // skip previous line (it is empty anyway) + i=pi+writeCodeBlock(out,data+pi,size-pi,blockIndent); + pi=-1; + end=i+1; + continue; + } + else if (isTableBlock(data+pi,size-pi)) + { + i=pi+writeTableBlock(out,data+pi,size-pi); + pi=-1; + end=i+1; + continue; + } + else + { + writeOneLineHeaderOrRuler(out,data+pi,i-pi); + } + } + pi=i; + i=end; + } + //printf("last line %d size=%d\n",i,size); + if (pi!=-1 && pi=size) return ""; + int end1=i+1; + while (end10) + { + docs=docs.mid(end1); + } + //printf("extractPageTitle(title='%s' docs='%s')\n",title.data(),docs.data()); + return title; +} + +static QCString detab(const QCString &s,int &refIndent) +{ + static int tabSize = Config_getInt("TAB_SIZE"); + GrowBuf out; + int size = s.length(); + const char *data = s.data(); + int i=0; + int col=0; + const int maxIndent=1000000; // value representing infinity + int minIndent=maxIndent; + while (i update minIndent + out.addChar(c); + if (collang = SrcLangExt_Markdown; + QCString docs = fileBuf; + QCString title=extractPageTitle(docs).stripWhiteSpace(); + QCString id=extractTitleId(title); + QCString baseName = substitute(QFileInfo(fileName).baseName().utf8()," ","_"); + if (id.isEmpty()) id = "md_"+baseName; + if (id=="mainpage" || id=="index") + { + docs.prepend("@mainpage "+title+"\n"); + } + else + { + docs.prepend("@page "+id+" "+title+"\n"); + } + int lineNr=1; + int position=0; + + // even without markdown support enabled, we still + // parse markdown files as such + bool markdownEnabled = Doxygen::markdownSupport; + Doxygen::markdownSupport = TRUE; + + bool needsEntry; + Protection prot; + while (parseCommentBlock( + this, + current, + docs, + fileName, + lineNr, + FALSE, // isBrief + FALSE, // javadoc autobrief + FALSE, // inBodyDocs + prot, // protection + position, + needsEntry)) + { + if (needsEntry) + { + QCString docFile = current->docFile; + root->addSubEntry(current); + current = new Entry; + current->lang = SrcLangExt_Markdown; + current->docFile = docFile; + current->docLine = lineNr; + } + } + if (needsEntry) + { + root->addSubEntry(current); + } + + // restore setting + Doxygen::markdownSupport = markdownEnabled; +} + +void MarkdownFileParser::parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + bool isExampleBlock, + const char *exampleName, + FileDef *fileDef, + int startLine, + int endLine, + bool inlineFragment, + MemberDef *memberDef, + bool showLineNumbers + ) +{ + ParserInterface *pIntf = Doxygen::parserManager->getParser("*.cpp"); + if (pIntf!=this) + { + pIntf->parseCode( + codeOutIntf,scopeName,input,isExampleBlock,exampleName, + fileDef,startLine,endLine,inlineFragment,memberDef,showLineNumbers); + } +} + +void MarkdownFileParser::resetCodeParserState() +{ + ParserInterface *pIntf = Doxygen::parserManager->getParser("*.cpp"); + if (pIntf!=this) + { + pIntf->resetCodeParserState(); + } +} + +void MarkdownFileParser::parsePrototype(const char *text) +{ + ParserInterface *pIntf = Doxygen::parserManager->getParser("*.cpp"); + if (pIntf!=this) + { + pIntf->parsePrototype(text); + } +} + diff --git a/src/markdown.h b/src/markdown.h new file mode 100644 index 0000000..616c01e --- /dev/null +++ b/src/markdown.h @@ -0,0 +1,52 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2011 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#ifndef MARKDOWN_H +#define MARKDOWN_H + +#include +#include "parserintf.h" + +/** processes string \a s and converts markdown into doxygen/html commands. */ +QCString processMarkdown(const QCString &s); + +class MarkdownFileParser : public ParserInterface +{ + public: + virtual ~MarkdownFileParser() {} + void parseInput(const char *fileName, + const char *fileBuf, + Entry *root); + bool needsPreprocessing(const QCString &) { return FALSE; } + void parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + bool isExampleBlock, + const char *exampleName=0, + FileDef *fileDef=0, + int startLine=-1, + int endLine=-1, + bool inlineFragment=FALSE, + MemberDef *memberDef=0, + bool showLineNumbers=TRUE + ); + void resetCodeParserState(); + void parsePrototype(const char *text); +}; + + + + +#endif diff --git a/src/memberlist.cpp b/src/memberlist.cpp index f35f5b7..f3cfe54 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -575,7 +575,7 @@ void MemberList::writeDocumentationPage(OutputList &ol, container->getOutputFileBase()); if (!generateTreeView) { - container->writeNavigationPath(ol,FALSE); + container->writeNavigationPath(ol); ol.endQuickIndices(); } ol.startContents(); diff --git a/src/pagedef.cpp b/src/pagedef.cpp index 4bf42cb..63b24d8 100644 --- a/src/pagedef.cpp +++ b/src/pagedef.cpp @@ -98,7 +98,7 @@ void PageDef::writeDocumentation(OutputList &ol) { if (getOuterScope()!=Doxygen::globalScope && !Config_getBool("DISABLE_INDEX")) { - getOuterScope()->writeNavigationPath(ol,FALSE); + getOuterScope()->writeNavigationPath(ol); } ol.endQuickIndices(); } @@ -183,6 +183,13 @@ void PageDef::writeDocumentation(OutputList &ol) void PageDef::writePageDocumentation(OutputList &ol) { + + bool markdownEnabled = Doxygen::markdownSupport; + if (getLanguage()==SrcLangExt_Markdown) + { + Doxygen::markdownSupport = TRUE; + } + ol.startTextBlock(); ol.parseDoc( docFile(), // fileName @@ -195,6 +202,8 @@ void PageDef::writePageDocumentation(OutputList &ol) ); ol.endTextBlock(); + Doxygen::markdownSupport = markdownEnabled; + if (hasSubPages()) { // for printed documentation we write subpages as section's of the diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index ebe09e8..30e4788 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -375,6 +375,8 @@ public: void visitPost(DocCopy *); void visitPre(DocText *); void visitPost(DocText *); + void visitPre(DocHtmlBlockQuote *); + void visitPost(DocHtmlBlockQuote *); private: @@ -1300,6 +1302,18 @@ void PerlModDocVisitor::visitPost(DocText *) { } +void PerlModDocVisitor::visitPre(DocHtmlBlockQuote *) +{ + openItem("blockquote"); + openSubBlock("content"); +} + +void PerlModDocVisitor::visitPost(DocHtmlBlockQuote *) +{ + closeSubBlock(); + closeItem(); +} + static void addTemplateArgumentList(ArgumentList *al,PerlModOutput &output,const char *) { QCString indentStr; diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index 4cfc06a..4a41647 100644 --- a/src/printdocvisitor.h +++ b/src/printdocvisitor.h @@ -668,6 +668,16 @@ class PrintDocVisitor : public DocVisitor indent_post(); printf("\n"); } + void visitPre(DocHtmlBlockQuote *) + { + indent_pre(); + printf("
      \n"); + } + void visitPost(DocHtmlBlockQuote *) + { + indent_post(); + printf("
      \n"); + } private: // helper functions diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index b66a9a8..4923bb1 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -1519,24 +1519,49 @@ void RTFDocVisitor::visitPost(DocInternalRef *) void RTFDocVisitor::visitPre(DocCopy *) { + if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocCopy)}\n"); } void RTFDocVisitor::visitPost(DocCopy *) { + if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocCopy)}\n"); } void RTFDocVisitor::visitPre(DocText *) { + if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocText)}\n"); } void RTFDocVisitor::visitPost(DocText *) { + if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocText)}\n"); } +void RTFDocVisitor::visitPre(DocHtmlBlockQuote *) +{ + if (m_hide) return; + DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlBlockQuote)}\n"); + if (!m_lastIsPara) m_t << "\\par" << endl; + m_t << "{"; // start desc + incIndentLevel(); + m_t << rtf_Style_Reset << getStyle("DescContinue"); +} + +void RTFDocVisitor::visitPost(DocHtmlBlockQuote *) +{ + if (m_hide) return; + DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlBlockQuote)}\n"); + if (!m_lastIsPara) m_t << "\\par" << endl; + decIndentLevel(); + m_t << "}"; // end desc + m_lastIsPara=TRUE; +} + + //static char* getMultiByte(int c) //{ // static char s[10]; diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h index fd76af2..db70b00 100644 --- a/src/rtfdocvisitor.h +++ b/src/rtfdocvisitor.h @@ -115,8 +115,6 @@ class RTFDocVisitor : public DocVisitor void visitPost(DocSecRefItem *); void visitPre(DocSecRefList *); void visitPost(DocSecRefList *); - //void visitPre(DocLanguage *); - //void visitPost(DocLanguage *); void visitPre(DocParamSect *); void visitPost(DocParamSect *); void visitPre(DocParamList *); @@ -129,6 +127,8 @@ class RTFDocVisitor : public DocVisitor void visitPost(DocCopy *); void visitPre(DocText *); void visitPost(DocText *); + void visitPre(DocHtmlBlockQuote *); + void visitPost(DocHtmlBlockQuote *); private: diff --git a/src/scanner.l b/src/scanner.l index 49495f3..d211301 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -5401,7 +5401,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) handleCommentBlock(docBlock.data(),FALSE); BEGIN(docBlockContext); } -^{B}*("//")?{B}*"*"+/[^//] { // start of a comment line +^{B}*("//")?{B}*"*"+/[^//a-z_A-Z0-9*] { // start of a comment line } ^{B}*("//"){B}* { // strip embedded C++ comments if at the start of a line } diff --git a/src/tclscanner.l b/src/tclscanner.l index 08b330e..fec5dc7 100644 --- a/src/tclscanner.l +++ b/src/tclscanner.l @@ -392,16 +392,16 @@ void tcl_split_list(QString &str, QStringList &list) //! Structure containing information about current scan context. typedef struct { - int type; - QCString string_after; + char type[2]; // type of scan context: "\"" "{" "[" "?" " " int line0; // start line of scan context int line1; // end line of scan context YY_BUFFER_STATE buffer_state; // value of scan context - QString ns; // current namespace + QCString ns; // current namespace Entry *entry_fn; // if set contains the current proc/method/constructor/destructor Entry *entry_cl; // if set contain the current class Entry *entry_scan; // current scan entry Protection protection; // current protections state + QStringList after; // option/value list (options: NULL comment keyword script) } tcl_scan; //* Structure containing all internal global variables. @@ -422,27 +422,27 @@ static struct int brace_level; // bookkeeping of braces int bracket_level; // bookkeeping of brackets int bracket_quote; // bookkeeping of quotes (toggles) - int word_is; // type of current word + char word_is; // type of current word: "\"" "{" "[" "?" " " int line_comment; // line number of comment int line_commentline; // line number of comment after command int line_command; // line number of command int line_body0; // start line of body int line_body1; // end line of body - QString string_command; // contain current command - QString string_commentline; // contain current comment after command - QString string_commentcodify; // current comment string used in codifying - QString string_comment; // contain current comment - QString string_last; // contain last read word or part of word - QString string; // temporary string value + QCString string_command; // contain current command + QCString string_commentline; // contain current comment after command + QCString string_commentcodify; // current comment string used in codifying + QCString string_comment; // contain current comment + QCString string_last; // contain last read word or part of word + QCString string; // temporary string value Entry* entry_main; // top level entry Entry* entry_file; // entry of current file Entry* entry_current; // currently used entry Entry* entry_inside; // contain entry of current scan context QStringList list_commandwords; // list of command words QList scan; // stack of scan contexts - QDict ns; // all read namespace entries - QDict cl; // all read class entries - QDict fn; // all read function entries + QAsciiDict ns; // all read namespace entries + QAsciiDict cl; // all read class entries + QAsciiDict fn; // all read function entries QList entry; // list of all created entries, will be deleted after codifying Protection protection; // current protections state MemberDef *memberdef; // contain current MemberDef when codifying @@ -450,7 +450,7 @@ static struct // scanner functions static int yyread(char *buf,int max_size); -static void tcl_scan_start(int type, QString content, const char *after, QString ns, Entry *entry_cls, Entry *entry_fn); +static tcl_scan *tcl_scan_start(char type, QString content, QCString ns, Entry *entry_cls, Entry *entry_fn); static void tcl_scan_end(); static void tcl_comment(int what,const char *text); static void tcl_word(int what,const char *text); @@ -498,18 +498,18 @@ void tcl_protection(Entry *entry) //! Check name. // @return 'ns' and 'name' of given current 'ns0' and 'name0' -static void tcl_name(const QString ns0, const QString name0, QString &ns, QString &name) +static void tcl_name(const QCString ns0, const QString name0, QCString &ns, QCString &name) { - QString myNm; + QCString myNm; int myStart; - if (strncmp(name0.ascii(),"::",2)==0) + if (strncmp(name0.data(),"::",2)==0) { myNm = name0.mid(2); } - else if (ns0.length()) + else if (ns0.length() && ns0 != " ") { - myNm = ns0 + "::" + name0; + myNm = ns0 + "::" + name0.data(); } else { @@ -530,18 +530,22 @@ static void tcl_name(const QString ns0, const QString name0, QString &ns, QStrin // Check and return namespace entry. // @return namespace entry -Entry* tcl_entry_namespace(const QString ns) +Entry* tcl_entry_namespace(const QCString ns) { Entry *myEntry; - QString myNs = " "; - if (strlen(ns.ascii())) {myNs = ns;} - - myEntry = tcl.ns.find(myNs); + if (ns.length()) + { + myEntry = tcl.ns.find(ns); + } + else + { + myEntry = tcl.ns.find("::"); + } if (myEntry == NULL) { myEntry = tcl_entry_new(); myEntry->section = Entry::NAMESPACE_SEC; - myEntry->name = ns.ascii(); + myEntry->name = ns; tcl.entry_main->addSubEntry(myEntry); tcl.ns.insert(ns,myEntry); } @@ -550,18 +554,17 @@ Entry* tcl_entry_namespace(const QString ns) // Check and return class entry. // @return class entry -Entry* tcl_entry_class(const QString cl) +Entry* tcl_entry_class(const QCString cl) { Entry *myEntry; - QString myCl = " "; - if (strlen(cl.ascii())) {myCl = cl;} + if (!cl.length()) return(NULL); - myEntry = tcl.cl.find(myCl); + myEntry = tcl.cl.find(cl); if (myEntry == NULL) { myEntry = tcl_entry_new(); myEntry->section = Entry::CLASS_SEC; - myEntry->name = cl.ascii(); + myEntry->name = cl; tcl.entry_main->addSubEntry(myEntry); tcl.cl.insert(cl,myEntry); } @@ -570,13 +573,13 @@ Entry* tcl_entry_class(const QString cl) //! Check for keywords. // @return 1 if keyword and 0 otherwise -static int tcl_keyword(QString str) +static int tcl_keyword(QCString str) { static QStringList myList; static int myInit=1; if (myInit) { - // tcl keywords TODO default, else, provide, require + // tcl keywords myList <<"append"<<"apply"<<"array"<<"auto_execok"<<"auto_import"<<"auto_load"<<"auto_mkindex"<<"auto_qualify"<<"auto_reset"; myList <<"binary"; myList <<"catch"<<"cd"<<"close"<<"clock"<<"concat"; @@ -633,7 +636,7 @@ static void tcl_font_end() static void tcl_codify(const char *s,char *str) { if (tcl.code==NULL||str==NULL) return; - if (s) + if (s && strcmp(s,"NULL")!=0) { tcl_font_end(); tcl.code->startFontClass(s); @@ -676,6 +679,7 @@ static void tcl_codify(const char *s,char *str) tcl_font_end(); } +#if 0 //! Codify 'str' with special font class 's'. static void tcl_codify(const char *s,const char *str) { @@ -685,6 +689,7 @@ static void tcl_codify(const char *s,const char *str) tcl_codify(s,tmp); free(tmp); } +#endif //! Codify 'str' with special font class 's'. static void tcl_codify(const char *s,QString str) @@ -727,10 +732,6 @@ ws ([ \t]|\\\n) %x COMMENT_VERB %x COMMENTLINE %x COMMENTLINE_NL -%x STRING -%x QUOTE -%x BRACE -%x BRACKET %% . { D @@ -777,13 +778,18 @@ D D tcl_codify("comment",yytext); } +"###".*\n { +D + tcl_codify("comment",yytext); + tcl_comment(2,yytext+1); +} "##".*\\\n { D tcl_codify("comment",yytext); - QString t=yytext; + QCString t=yytext; t = t.mid(2,t.length()-3); - t.append('\n'); - tcl_comment(1,t.ascii()); + t.append("\n"); + tcl_comment(1,t.data()); yy_push_state(COMMENT_NL); } "##".*\n { @@ -793,7 +799,7 @@ D } "#"[@\\]"code"\n[ \t]*[^#] { D - QString t=yytext; + QCString t=yytext; tcl_codify("comment",t.left(7)); tcl_comment(2,"\n@code\n"); yyless(7); @@ -801,7 +807,7 @@ D } "#"[@\\]"verbatim"\n[ \t]*[^#] { D - QString t=yytext; + QCString t=yytext; tcl_codify("comment",t.left(11)); tcl_comment(2,"\n@verbatim\n"); yyless(11); @@ -810,10 +816,10 @@ D "#".*\\\n { D tcl_codify("comment",yytext); - QString t=yytext; + QCString t=yytext; t = t.mid(1,t.length()-3); - t.append('\n'); - tcl_comment(2,t.ascii()); + t.append("\n"); + tcl_comment(2,t.data()); yy_push_state(COMMENT_NL); } "#".*\n { @@ -823,11 +829,11 @@ D } "#".*\x1A { D - QString t=yytext; + QCString t=yytext; t = t.mid(0,t.length()-1); - tcl_codify("comment",t.ascii()); + tcl_codify("comment",t.data()); t = t.mid(1,t.length()); - tcl_comment(-2,t.ascii()); + tcl_comment(-2,t.data()); unput(0x1A); } \x1A { @@ -843,9 +849,9 @@ D "#"[@\\]"endcode"\n { D - QString t=yytext; + QCString t=yytext; t = t.left(t.length()-10); - tcl_comment(2,t.ascii()); + tcl_comment(2,t.data()); tcl_comment(2,"\n@endcode\n"); yy_pop_state(); yyless(0); @@ -862,9 +868,9 @@ D "#"[@\\]"endverbatim"\n { D - QString t=yytext; + QCString t=yytext; t = t.left(t.length()-14); - tcl_comment(2,t.ascii()); + tcl_comment(2,t.data()); tcl_comment(2,"\n@endverbatim\n"); yy_pop_state(); yyless(0); @@ -908,9 +914,9 @@ D "#<".*\\\n { D tcl.string_commentcodify += yytext; - QString t=yytext; + QCString t=yytext; t = t.mid(2,t.length()-4); - t.append('\n'); + t.append("\n"); tcl.string_commentline += t; yy_push_state(COMMENTLINE_NL); } @@ -929,7 +935,7 @@ D tcl.entry_current->briefFile = tcl.file_name; } yyless(0); - tcl_command(-1,tcl.string_commentcodify.ascii()); + tcl_command(-1,tcl.string_commentcodify.data()); tcl.string_commentline=""; tcl.string_commentcodify=""; } @@ -937,9 +943,9 @@ D .*\\\n { D tcl.string_commentcodify += yytext; - QString t=yytext; + QCString t=yytext; t = t.left(t.length()-3); - t.append('\n'); + t.append("\n"); tcl.string_commentline += t; } .*\n { @@ -950,7 +956,7 @@ D } .*\x1A { D - QString t=yytext; + QCString t=yytext; t = t.left(t.length()-1); tcl.string_commentcodify += t; tcl.string_commentline += t; @@ -996,19 +1002,20 @@ D } "{*}". { D - tcl.word_is = WORD; + tcl.word_is = ' '; tcl.string_last = "{*}"; tcl_word(0,&yytext[3]); } +"\\"[\{\}\[\]\;\" \t] { +D + tcl.word_is=' '; + tcl.string_last = ""; + tcl_word(0,yytext); +} . { D - switch (yytext[0]) - { - case '{': tcl.word_is = BRACE; break; - case '[': tcl.word_is = BRACKET; break; - case '"': tcl.word_is = QUOTE; break; - default: tcl.word_is = WORD; - } + tcl.word_is=' '; + if (yytext[0]=='{'||yytext[0]=='['||yytext[0]=='"') tcl.word_is = yytext[0]; tcl.string_last = ""; tcl_word(0,yytext); } @@ -1057,34 +1064,32 @@ D //! Start new scan context for given 'content'. // @return created new scan context. -static void tcl_scan_start(int type, QString content, const char *after, QString ns, Entry *entry_cl, Entry *entry_fn) +static tcl_scan *tcl_scan_start(char type, QString content, QCString ns, Entry *entry_cl, Entry *entry_fn) { tcl_scan *myScan=tcl.scan.at(0); - QString myName; - char c[2]=" "; + QCString myName; tcl_inf("line=%d type=%d '%s'\n",tcl.line_body0,type,content.ascii()); myScan->line1=yylineno; yy_push_state(TOP); myScan=new tcl_scan; - myScan->type = type; - myScan->string_after=after; - - switch (myScan->type) - { - case QUOTE: c[0]='"'; - break; - case BRACE: c[0]='{'; - break; - case BRACKET: c[0]='['; - break; - default: + myScan->type[0] =' '; + myScan->type[1] = '\0'; + switch (type) { + case '"': + case '{': + case '[': + myScan->type[0] = type; break; + case '?': + if (content[0]=='"'&&content[content.length()-1]=='"') myScan->type[0]='"'; + if (content[0]=='{'&&content[content.length()-1]=='}') myScan->type[0]='{'; + if (content[0]=='['&&content[content.length()-1]==']') myScan->type[0]='['; } - if (c[0]!=' ') + if (myScan->type[0]!=' ') { - tcl_codify(NULL,c); + tcl_codify(NULL,&myScan->type[0]); content = content.mid(1,content.length()-2); } content += (char)0x1A;// for detection end of scan context @@ -1095,6 +1100,7 @@ tcl_inf("line=%d type=%d '%s'\n",tcl.line_body0,type,content.ascii()); myScan->buffer_state=yy_scan_string(content.ascii()); myScan->line0=tcl.line_body0; myScan->line1=tcl.line_body1; + myScan->after.clear(); yylineno=myScan->line0; myScan->protection = tcl.protection; @@ -1102,34 +1108,47 @@ tcl_inf("line=%d type=%d '%s'\n",tcl.line_body0,type,content.ascii()); tcl.entry_current = tcl_entry_new(); tcl.scan.insert(0,myScan); yy_switch_to_buffer(myScan->buffer_state); + return (myScan); } //! Close current scan context. static void tcl_scan_end() { tcl_scan *myScan=tcl.scan.at(0); - char c[2]=" "; + tcl_scan *myScan1=tcl.scan.at(1); tcl_inf("line=%d\n",myScan->line1); - switch (myScan->type) - { - case QUOTE: c[0]='"'; break; - case BRACE: c[0]='}'; break; - case BRACKET: c[0]=']'; break; - } - if (c[0]!=' ') {tcl_codify(NULL,c);} - if (myScan->string_after.length()) + if (myScan->type[0]=='{') myScan->type[0]='}'; + if (myScan->type[0]=='[') myScan->type[0]=']'; + if (myScan->type[0]!=' ') tcl_codify(NULL,&myScan->type[0]); + int myStart=-1; + for (unsigned int i=0;iafter.count();i=i+2) { - tcl_codify("comment",myScan->string_after); + if (myScan->after[i]=="script") { + myStart=i; + break; + } + tcl_codify(myScan->after[i],myScan->after[i+1]); } yy_delete_buffer(myScan->buffer_state); - tcl.scan.removeFirst(); yy_pop_state(); - myScan=tcl.scan.at(0); - tcl.entry_inside = myScan->entry_scan; - yy_switch_to_buffer(myScan->buffer_state); - yylineno=myScan->line1; - tcl.protection = myScan->protection; + tcl.entry_inside = myScan1->entry_scan; + yy_switch_to_buffer(myScan1->buffer_state); + yylineno=myScan1->line1; + tcl.protection = myScan1->protection; + if (myStart>=0) + { + myScan1 = tcl_scan_start('?', myScan->after[myStart+1], myScan->ns, myScan->entry_cl, myScan->entry_fn); + for (unsigned int i=myStart+2;iafter.count();i++) + { + myScan1->after.append(myScan->after[i]); + } + tcl.scan.remove(1); + } + else + { + tcl.scan.removeFirst(); + } } //! Handling of word parsing. @@ -1174,7 +1193,7 @@ static void tcl_word(int what,const char *text) myWord=' '; yy_pop_state(); yyless(0); -tcl_inf("(\\\n) ?%s?\n",tcl.string_last.ascii()); +tcl_inf("(\\\n) ?%s?\n",tcl.string_last.data()); return; } switch (myList[myLevel-1]) @@ -1189,7 +1208,7 @@ tcl_inf("(\\\n) ?%s?\n",tcl.string_last.ascii()); myWord=' '; yy_pop_state(); yyless(0); -tcl_inf("(\\\n) ?%s?\n",tcl.string_last.ascii()); +tcl_inf("(\\\n) ?%s?\n",tcl.string_last.data()); return; } break; @@ -1300,7 +1319,7 @@ tcl_inf("(\\\n) ?%s?\n",tcl.string_last.ascii()); myWord=' '; yy_pop_state(); yyless(0); -tcl_inf("(%d) ?%s?\n",what,tcl.string_last.ascii()); +tcl_inf("(%d) ?%s?\n",what,tcl.string_last.data()); return; } switch (myList[myLevel-1]) @@ -1315,7 +1334,7 @@ tcl_inf("(%d) ?%s?\n",what,tcl.string_last.ascii()); myWord=' '; yy_pop_state(); yyless(0); -tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.ascii()); +tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.data()); return; } else @@ -1332,7 +1351,7 @@ tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.ascii()); myWord=' '; yy_pop_state(); yyless(0); -tcl_inf("(%d) ?%s?\n",what,tcl.string_last.ascii()); +tcl_inf("(%d) ?%s?\n",what,tcl.string_last.data()); return; } if (myLevel!=1 || myList[0] != '.') @@ -1342,7 +1361,7 @@ tcl_inf("(%d) ?%s?\n",what,tcl.string_last.ascii()); myWord=' '; yy_pop_state(); yyless(0); -tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.ascii()); +tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.data()); return; myWhite=0; break; @@ -1414,7 +1433,7 @@ tcl_inf("-> %s\n",(const char *)tcl.string_comment); // resolve ALIASES myI.addArray("/*!",3); - myI.addArray(tcl.string_comment.ascii(),tcl.string_comment.length()); + myI.addArray(tcl.string_comment.data(),tcl.string_comment.length()); myI.addArray("*/",2); convertCppComments(&myI,&myO,tcl.file_name); myO.dropFromStart(3); @@ -1564,11 +1583,11 @@ D } //! Create link. -static void tcl_codify_link(const char *name) +static void tcl_codify_link(QCString name) { - if (tcl.code == NULL || name == NULL) return; + if (tcl.code == NULL || name.isEmpty()) return; static int init=0; - static QDict fn; + static QAsciiDict fn; if (init==0) { init=1; @@ -1594,22 +1613,29 @@ static void tcl_codify_link(const char *name) } } MemberDef *myDef; - QString myName=name; - - if (strncmp(name,"::",2)==0) // fully qualified global command + QCString myName=name; + if (name.mid(0,2)=="::") // fully qualified global command { myName = myName.mid(2); myDef = fn.find(myName); } else // not qualified name { + QCString myName1=myName; myDef = NULL; - myName = tcl.scan.at(0)->ns; - myName = myName + "::" + myName; - myDef = fn.find(myName); // search namespace command + myName1 = tcl.scan.at(0)->ns; + if (myName1 == " " || myName1 == "") + { + myName1 = myName; + } + else + { + myName1 = myName1 + "::" + myName; + } + myDef = fn.find(myName1); // search namespace command if (myDef == NULL) { - myDef = fn.find(name); // search global command + myDef = fn.find(myName); // search global command } } if (myDef != NULL) // documented command @@ -1635,33 +1661,102 @@ static void tcl_codify_link(const char *name) } } + +//! Handle internal tcl commands. +// "if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?" +static void tcl_command_IF(QStringList type) +{ +D + tcl_codify("keyword",*tcl.list_commandwords.at(0)); + tcl_codify(NULL,*tcl.list_commandwords.at(1)); + tcl_scan *myScan=tcl.scan.at(0); + myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2), + myScan->ns,myScan->entry_cl,myScan->entry_fn); + for (unsigned int i = 3;iafter << type[i] << tcl.list_commandwords[i]; + } +} +//! Handle internal tcl commands. +// "for start test next body" +static void tcl_command_FOR() +{ +D + tcl_codify("keyword",*tcl.list_commandwords.at(0)); + tcl_codify(NULL,*tcl.list_commandwords.at(1)); + tcl_scan *myScan=tcl.scan.at(0); + myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2), + myScan->ns,myScan->entry_cl,myScan->entry_fn); + myScan->after << "NULL" << tcl.list_commandwords[3]; + myScan->after << "script" << tcl.list_commandwords[4]; + myScan->after << "NULL" << tcl.list_commandwords[5]; + myScan->after << "script" << tcl.list_commandwords[6]; + myScan->after << "NULL" << tcl.list_commandwords[7]; + myScan->after << "script" << tcl.list_commandwords[8]; +} + +///! Handle internal tcl commands. +// "foreach varname list body" and +// "foreach varlist1 list1 ?varlist2 list2 ...? body" +static void tcl_command_FOREACH() +{ +D + unsigned int i; + tcl_codify("keyword",*tcl.list_commandwords.at(0)); + for (i = 1;ins,myScan->entry_cl,myScan->entry_fn); +} + +///! Handle internal tcl commands. +// "while test body" +static void tcl_command_WHILE() +{ +D + tcl_codify("keyword",*tcl.list_commandwords.at(0)); + tcl_codify(NULL,*tcl.list_commandwords.at(1)); + tcl_scan *myScan=tcl.scan.at(0); + myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2), + myScan->ns,myScan->entry_cl,myScan->entry_fn); + myScan->after << "NULL" << tcl.list_commandwords[3]; + myScan->after << "script" << tcl.list_commandwords[4]; +} + //! Handle all other commands. // Create links of first command word or first command word inside []. -static void tcl_command_OTHER(const char *text) +static void tcl_command_OTHER() { if (tcl.code == NULL) return; D - QCString myName; - + QCString myName; for (unsigned int i=0; i< tcl.list_commandwords.count(); i++) { myName = *tcl.list_commandwords.at(i); if (i==0) { - tcl_codify_link(myName.data()); + tcl_codify_link(myName); } - else //TODO check on [... inside current string + else if (i%2 != 0) + { + tcl_codify(NULL,myName); + } + else { QCString myStr=""; int myCmd=0; - for (unsigned int i=0;iaddSubEntry(tcl.entry_current); myEntry = tcl.entry_current; tcl.fn.insert(myName,myEntry); - tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),text, + myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6), myEntryNs->name,NULL,myEntry); } //! Handle \c itcl::body statements and \c oo::define method and method inside \c itcl::class statements. -static void tcl_command_METHOD(const char *text) +static void tcl_command_METHOD() { D - QString myNs, myName; + QCString myNs, myName; Entry *myEntryCl, *myEntry; tcl_scan *myScan = tcl.scan.at(0); @@ -1761,15 +1861,15 @@ D myEntryCl->addSubEntry(tcl.entry_current); tcl.fn.insert(myName,tcl.entry_current); myEntry = tcl.entry_current; - tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),text, + myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6), myNs, myEntryCl, myEntry); } //! Handle \c constructor statements inside class definitions. -static void tcl_command_CONSTRUCTOR(const char *text) +static void tcl_command_CONSTRUCTOR() { D - QString myNs, myName; + QCString myNs, myName; Entry *myEntryCl, *myEntry; tcl_scan *myScan = tcl.scan.at(0); @@ -1798,15 +1898,15 @@ D myEntryCl->addSubEntry(tcl.entry_current); myEntry = tcl.entry_current; tcl.fn.insert(myName,myEntry); - tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4),text, + myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4), myNs, myEntryCl, myEntry); } //! Handle \c destructor statements inside class definitions. -static void tcl_command_DESTRUCTOR(const char *text) +static void tcl_command_DESTRUCTOR() { D - QString myNs, myName; + QCString myNs, myName; Entry *myEntryCl, *myEntry; tcl_scan *myScan = tcl.scan.at(0); @@ -1832,15 +1932,15 @@ D myEntryCl->addSubEntry(tcl.entry_current); myEntry = tcl.entry_current; tcl.fn.insert(myName,myEntry); - tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(2),text, + myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(2), myNs, myEntryCl, myEntry); } //! Handle \c namespace statements. -static void tcl_command_NAMESPACE(const char *text) +static void tcl_command_NAMESPACE() { D - QString myNs, myName, myStr; + QCString myNs, myName, myStr; Entry *myEntryNs=NULL; tcl_scan *myScan = tcl.scan.at(0); @@ -1870,16 +1970,16 @@ D { myStr.append(*tcl.list_commandwords.at(i)); } - tcl.word_is=STRING; + tcl.word_is=' '; } - tcl_scan_start(tcl.word_is,myStr,text, myName, NULL, NULL); + myScan = tcl_scan_start(tcl.word_is,myStr, myName, NULL, NULL); } //! Handle \c itcl::class statements. -static void tcl_command_ITCL_CLASS(const char *text) +static void tcl_command_ITCL_CLASS() { D - QString myNs, myName, myStr; + QCString myNs, myName, myStr; Entry *myEntryCl; tcl_scan *myScan = tcl.scan.at(0); @@ -1900,15 +2000,15 @@ D tcl.entry_main->addSubEntry(tcl.entry_current); tcl.cl.insert(myName,tcl.entry_current); myEntryCl = tcl.entry_current; - tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4),text, + myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4), myName, myEntryCl, NULL); } //! Handle \c oo::class statements. -static void tcl_command_OO_CLASS(const char *text) +static void tcl_command_OO_CLASS() { D - QString myNs, myName, myStr; + QCString myNs, myName, myStr; Entry *myEntryNs, *myEntryCl; tcl_scan *myScan = tcl.scan.at(0); @@ -1932,15 +2032,15 @@ D myEntryNs = tcl_entry_namespace(myName); tcl.cl.insert(myName,tcl.entry_current); myEntryCl = tcl.entry_current; - tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6),text, + myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6), myName, myEntryCl, NULL); } //! Handle \c oo::define statements. -static void tcl_command_OO_DEFINE(const char *text) +static void tcl_command_OO_DEFINE() { D - QString myNs, myName, myStr; + QCString myNs, myName, myStr; Entry *myEntryCl; tcl_scan *myScan = tcl.scan.at(0); @@ -1961,16 +2061,16 @@ D { myStr.append(*tcl.list_commandwords.at(i)); } - tcl.word_is=STRING; + tcl.word_is=' '; } - tcl_scan_start(tcl.word_is,myStr,text,myName,myEntryCl,NULL); + myScan = tcl_scan_start(tcl.word_is,myStr,myName,myEntryCl,NULL); } //! Handle \c variable statements. -static void tcl_command_VARIABLE(const char *text, int inclass) +static void tcl_command_VARIABLE(int inclass) { D - QString myNs, myName; + QCString myNs, myName; Entry *myEntry; tcl_scan *myScan = tcl.scan.at(0); @@ -2006,7 +2106,6 @@ D tcl_protection(tcl.entry_current); myEntry->addSubEntry(tcl.entry_current); tcl.entry_current = tcl_entry_new(); - tcl_codify("comment",text); } //! Handling of command parsing. @@ -2043,6 +2142,7 @@ tcl_inf("<- %s\n",text); tcl_err("what %d\n",what); return; } + QCString myText = text; tcl_inf("->\n"); if (tcl.command==0) { @@ -2062,8 +2162,8 @@ tcl_inf("->\n"); if (tcl.list_commandwords.count() < 3) { - tcl_command_OTHER(text); - goto command_end; + tcl_command_OTHER(); + goto command_text; } // remove leading "::" and apply TCL_SUBST if (myStr.left(2)=="::") myStr = myStr.mid(2); @@ -2095,7 +2195,7 @@ tcl_inf("->\n"); if (tcl.list_commandwords.count()==1) { tcl_scan *myScan = tcl.scan.at(0); - tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(0),text, + myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(0), myScan->ns,myScan->entry_cl,myScan->entry_fn); myProt = tcl.protection; goto command_end; @@ -2116,7 +2216,7 @@ tcl_inf("->\n"); tcl.list_commandwords.append(""); } if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;} - tcl_command_PROC(text); + tcl_command_PROC(); goto command_end; } if (strcmp("method",myStr)==0) @@ -2127,19 +2227,19 @@ tcl_inf("->\n"); tcl.list_commandwords.append(""); } if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;} - tcl_command_METHOD(text); + tcl_command_METHOD(); goto command_end; } if (strcmp("constructor",myStr)==0) { if (tcl.list_commandwords.count() != 5) {myLine=__LINE__;goto command_warn;} - tcl_command_CONSTRUCTOR(text); + tcl_command_CONSTRUCTOR(); goto command_end; } if (strcmp("destructor",myStr)==0) { if (tcl.list_commandwords.count() != 3) {myLine=__LINE__;goto command_warn;} - tcl_command_DESTRUCTOR(text); + tcl_command_DESTRUCTOR(); goto command_end; } if (strcmp("namespace",myStr)==0) @@ -2147,22 +2247,22 @@ tcl_inf("->\n"); if (strcmp("eval",*tcl.list_commandwords.at(2))==0) { if (tcl.list_commandwords.count() < 7) {myLine=__LINE__;goto command_warn;} - tcl_command_NAMESPACE(text); + tcl_command_NAMESPACE(); goto command_end; } - tcl_command_OTHER(text); - goto command_end; + tcl_command_OTHER(); + goto command_text; } if (strcmp("itcl::class",myStr)==0) { if (tcl.list_commandwords.count() != 5) {myLine=__LINE__;goto command_warn;} - tcl_command_ITCL_CLASS(text); + tcl_command_ITCL_CLASS(); goto command_end; } if (strcmp("itcl::body",myStr)==0) { if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;} - tcl_command_METHOD(text); + tcl_command_METHOD(); goto command_end; } if (strcmp("oo::class",myStr)==0) @@ -2170,16 +2270,16 @@ tcl_inf("->\n"); if (strcmp("create",*tcl.list_commandwords.at(2))==0) { if (tcl.list_commandwords.count() != 7) {myLine=__LINE__;goto command_warn;} - tcl_command_OO_CLASS(text); + tcl_command_OO_CLASS(); goto command_end; } - tcl_command_OTHER(text); - goto command_end; + tcl_command_OTHER(); + goto command_text; } if (strcmp("oo::define",myStr)==0) { if (tcl.list_commandwords.count() < 5) {myLine=__LINE__;goto command_warn;} - tcl_command_OO_DEFINE(text); + tcl_command_OO_DEFINE(); goto command_end; } if (strcmp("variable",myStr)==0) @@ -2187,8 +2287,8 @@ tcl_inf("->\n"); if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;} if (tcl.scan.at(0)->entry_fn == NULL) {// only parsed outside functions - tcl_command_VARIABLE(text,tcl.scan.at(0)->entry_cl!=NULL&&tcl.scan.at(0)->entry_cl->name!=""); - goto command_end; + tcl_command_VARIABLE(tcl.scan.at(0)->entry_cl!=NULL&&tcl.scan.at(0)->entry_cl->name!=""); + goto command_text; } } if (strcmp("common",myStr)==0) @@ -2196,8 +2296,8 @@ tcl_inf("->\n"); if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;} if (tcl.scan.at(0)->entry_fn == NULL) {// only parsed outside functions - tcl_command_VARIABLE(text,0); - goto command_end; + tcl_command_VARIABLE(0); + goto command_text; } } if (strcmp("inherit",myStr)==0 || strcmp("superclass",myStr)==0) @@ -2205,18 +2305,107 @@ tcl_inf("->\n"); if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;} if (tcl.scan.at(0)->entry_cl!=NULL&&tcl.scan.at(0)->entry_cl->name!="") { - for (unsigned int i = 2; i < tcl.list_commandwords.count(); i++) + for (unsigned int i = 2; i < tcl.list_commandwords.count(); i = i + 2) { tcl.scan.at(0)->entry_cl->extends->append(new BaseInfo(*tcl.list_commandwords.at(i),Public,Normal)); } } + goto command_end; + } + /* + * Start of internal tcl keywords + * Ready: if, for, foreach, while + * TODO: switch, eval, ? + */ + if (strcmp("for",myStr)==0) + { + if (tcl.list_commandwords.count() != 9) {myLine=__LINE__;goto command_warn;} + tcl_command_FOR(); + goto command_end; } - tcl_command_OTHER(text); - goto command_end; - command_warn: + if (strcmp("foreach",myStr)==0) + { + if (tcl.list_commandwords.count() < 7 || tcl.list_commandwords.count()%2==0) {myLine=__LINE__;goto command_warn;} + tcl_command_FOREACH(); + goto command_end; + } + /* +if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN? + */ + if (strcmp("if",myStr)==0 && tcl.list_commandwords.count() > 4) + { + QStringList myType; + myType << "keyword" << "NULL" << "script" << "NULL"; + char myState='x';// last word: e'x'pr 't'hen 'b'ody 'e'lse else'i'f.. + for (unsigned int i = 4; i < tcl.list_commandwords.count(); i = i + 2) + { + const char *myStr=*tcl.list_commandwords.at(i); + if (myState=='x') + { + if (strcmp("then",myStr)==0) { + myState='t'; + myType << "keyword" << "NULL"; + } + else + { + myState='b'; + myType << "script" << "NULL"; + } + } + else if (myState=='t') + { + myState='b'; + myType << "script" << "NULL"; + } + else if (myState=='b') + { + if (strcmp("elseif",myStr)==0) { + myState='i'; + myType << "keyword" << "NULL"; + } + else if (strcmp("else",myStr)==0 && i==tcl.list_commandwords.count()-3) + { + myState = 'b'; + myType << "keyword" << "NULL" << "script"; + i = tcl.list_commandwords.count(); + } + else if (i==tcl.list_commandwords.count()-1) + { + myState = 'b'; + myType << "script"; + i = tcl.list_commandwords.count(); + } + else + { + myLine=__LINE__;goto command_warn; + } + } + else if (myState=='i') + { + myState='x'; + myType << "script" << "NULL"; + } + } + if (myState != 'b') {myLine=__LINE__;goto command_warn;} + tcl_command_IF(myType); + goto command_end; + } + if (strcmp("while",myStr)==0) + { + if (tcl.list_commandwords.count() != 5) {myLine=__LINE__;goto command_warn;} + tcl_command_WHILE(); + goto command_end; + } + tcl_command_OTHER(); + goto command_text; + command_warn:// print warning message because of wrong used syntax tcl_war("%d count=%d: %s\n",myLine,tcl.list_commandwords.count(),tcl.list_commandwords.join(" ").ascii()); - tcl_command_OTHER(text); - command_end: + tcl_command_OTHER(); + command_text:// print remaining text as comment + if (!myText.isEmpty()) tcl_codify("comment",myText); + myText = ""; + command_end:// add remaining text to current context + if (!myText.isEmpty()) tcl.scan.at(0)->after << "comment" << myText; tcl.list_commandwords.clear(); tcl.command = 0; tcl.protection = myProt; @@ -2250,7 +2439,7 @@ tcl_inf("TCL_SUBST: use '%s'\n",s); if (tcl.input_string.at(tcl.input_string.length()-1) == '\n') { - tcl.input_string.at(tcl.input_string.length()-1) = 0x1A; + tcl.input_string[tcl.input_string.length()-1] = 0x1A; } else { @@ -2269,7 +2458,7 @@ tcl_inf("TCL_SUBST: use '%s'\n",s); tcl.brace_level=0; tcl.bracket_level=0; tcl.bracket_quote=0; - tcl.word_is=WORD; + tcl.word_is=' '; tcl.string_command=""; tcl.string_commentline=""; tcl.string_commentcodify=""; @@ -2290,7 +2479,7 @@ tcl_inf("TCL_SUBST: use '%s'\n",s); } //! Start parsing. -static void tcl_parse(const QString ns, const QString cls) +static void tcl_parse(const QCString ns, const QCString cls) { tcl_scan *myScan; @@ -2299,14 +2488,18 @@ static void tcl_parse(const QString ns, const QString cls) tcl.entry_file->section = Entry::SOURCE_SEC; tcl.entry_file->protection = Public; tcl.entry_main->addSubEntry(tcl.entry_file); + Entry *myEntry=tcl_entry_new(); + myEntry->name=""; + tcl.entry_main->addSubEntry(myEntry); + tcl.ns.insert("::",myEntry); tcl.entry_current = tcl_entry_new(); tclscanYYrestart( tclscanYYin ); BEGIN( TOP ); yylineno=1; myScan = new tcl_scan; - myScan->type=STRING; - myScan->string_after=""; + myScan->type[0]=' ';myScan->type[1]='\n'; + myScan->after.clear(); myScan->line0=yylineno; myScan->line1=yylineno; myScan->buffer_state=YY_CURRENT_BUFFER; @@ -2316,7 +2509,6 @@ static void tcl_parse(const QString ns, const QString cls) tcl.entry_inside = tcl.entry_file; myScan->entry_scan = tcl.entry_inside; tcl.scan.insert(0,myScan); - tclscanYYlex(); tcl.scan.clear(); tcl.ns.clear(); @@ -2346,7 +2538,6 @@ tcl_inf("%s\n",fileName); tcl.this_parser = this; tcl.entry_main = root; /* toplevel entry */ tcl_parse("",""); - groupLeaveFile(tcl.file_name,yylineno); root->program.resize(0); myFile.close(); @@ -2375,8 +2566,8 @@ void TclLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, if (input.length()<1) return; tcl.input_string = input; - QString myNs=""; - QString myCls=""; + QCString myNs=""; + QCString myCls=""; if (memberDef) { if (memberDef->getClassDef()) @@ -2415,7 +2606,6 @@ void TclLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, } tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inlineFragment); //tcl_inf("%s\n"input.data()); - if (isExampleBlock) { tcl_codify(NULL,input); diff --git a/src/textdocvisitor.h b/src/textdocvisitor.h index 40fa612..5646064 100644 --- a/src/textdocvisitor.h +++ b/src/textdocvisitor.h @@ -126,6 +126,8 @@ class TextDocVisitor : public DocVisitor void visitPost(DocCopy *) {} void visitPre(DocText *) {} void visitPost(DocText *) {} + void visitPre(DocHtmlBlockQuote *) {} + void visitPost(DocHtmlBlockQuote *) {} private: diff --git a/src/util.cpp b/src/util.cpp index 1f54503..6addbc7 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -52,6 +52,7 @@ #include "parserintf.h" #include "bufstr.h" #include "image.h" +#include "growbuf.h" #define ENABLE_TRACINGSUPPORT 0 @@ -1539,43 +1540,18 @@ static bool findOperator2(const QCString &s,int i) static const char constScope[] = { 'c', 'o', 'n', 's', 't', ':' }; static const char virtualScope[] = { 'v', 'i', 'r', 't', 'u', 'a', 'l', ':' }; - -class StrBuf -{ - public: - StrBuf() : str(0), pos(0), len(0) {} - ~StrBuf() { free(str); str=0; pos=0; len=0; } - void clear() { pos=0; } - void addChar(char c) { if (pos>=len) { len+=1024; str = (char*)realloc(str,len); } - str[pos++]=c; - } - void addStr(const char *s) { - int l=strlen(s); - if (pos+l>=len) { len+=l+1024; str = (char*)realloc(str,len); } - strcpy(&str[pos],s); - pos+=l; - } - const char *get() { return str; } - int getPos() const { return pos; } - char at(int i) const { return str[i]; } - private: - char *str; - int pos; - int len; -}; - // Note: this function is not reentrant due to the use of static buffer! QCString removeRedundantWhiteSpace(const QCString &s) { static bool cliSupport = Config_getBool("CPP_CLI_SUPPORT"); if (s.isEmpty()) return s; - static StrBuf strBuf; + static GrowBuf growBuf; //int resultLen = 1024; //int resultPos = 0; //QCString result(resultLen); - // we use strBuf.addChar(c) instead of result+=c to + // we use growBuf.addChar(c) instead of result+=c to // improve the performance of this function - strBuf.clear(); + growBuf.clear(); uint i; uint l=s.length(); uint csp=0; @@ -1610,14 +1586,14 @@ nextChar: if (c=='"') // quoted string { i++; - strBuf.addChar(c); + growBuf.addChar(c); while (i0 && c=='>' && // current char is a > (isId(s.at(i-1)) || isspace((uchar)s.at(i-1)) || s.at(i-1)=='*' || s.at(i-1)=='&') && // prev char is an id char or space (i<8 || !findOperator(s,i)) // string in front is not "operator" ) { - strBuf.addChar(' '); - strBuf.addChar('>'); + growBuf.addChar(' '); + growBuf.addChar('>'); } else if (i>0 && c==',' && !isspace((uchar)s.at(i-1)) && ((i0 && ((isId(s.at(i)) && s.at(i-1)==')') || @@ -1656,8 +1632,8 @@ nextChar: ) ) { - strBuf.addChar(' '); - strBuf.addChar(s.at(i)); + growBuf.addChar(' '); + growBuf.addChar(s.at(i)); } else if (c=='t' && csp==5 /*&& (i<5 || !isId(s.at(i-5)))*/ && !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ || @@ -1668,16 +1644,16 @@ nextChar: ) // prevent const ::A from being converted to const::A { - strBuf.addChar('t'); - strBuf.addChar(' '); + growBuf.addChar('t'); + growBuf.addChar(' '); if (s.at(i+1)==' ') i++; csp=0; } else if (c==':' && csp==6 /*&& (i<6 || !isId(s.at(i-6)))*/) // replace const::A by const ::A { - strBuf.addChar(' '); - strBuf.addChar(':'); + growBuf.addChar(' '); + growBuf.addChar(':'); csp=0; } else if (c=='l' && vsp==7 /*&& (i<7 || !isId(s.at(i-7)))*/ && @@ -1689,16 +1665,16 @@ nextChar: ) // prevent virtual ::A from being converted to virtual::A { - strBuf.addChar('l'); - strBuf.addChar(' '); + growBuf.addChar('l'); + growBuf.addChar(' '); if (s.at(i+1)==' ') i++; vsp=0; } else if (c==':' && vsp==8 /*&& (i<8 || !isId(s.at(i-8)))*/) // replace virtual::A by virtual ::A { - strBuf.addChar(' '); - strBuf.addChar(':'); + growBuf.addChar(' '); + growBuf.addChar(':'); vsp=0; } else if (!isspace((uchar)c) || // not a space @@ -1712,28 +1688,28 @@ nextChar: if (c=='*' || c=='&' || c=='@' || c=='$') { //uint rl=result.length(); - uint rl=strBuf.getPos(); - if ((rl>0 && (isId(strBuf.at(rl-1)) || strBuf.at(rl-1)=='>')) && + uint rl=growBuf.getPos(); + if ((rl>0 && (isId(growBuf.at(rl-1)) || growBuf.at(rl-1)=='>')) && ((c!='*' && c!='&') || !findOperator2(s,i)) // avoid splitting operator* and operator->* and operator& ) { - strBuf.addChar(' '); + growBuf.addChar(' '); } } - strBuf.addChar(c); + growBuf.addChar(c); if (cliSupport && (c=='^' || c=='%') && i>1 && isId(s.at(i-1)) && !findOperator(s,i) ) { - strBuf.addChar(' '); // C++/CLI: Type^ name and Type% name + growBuf.addChar(' '); // C++/CLI: Type^ name and Type% name } } } //printf("removeRedundantWhiteSpace(`%s')=`%s'\n",s.data(),result.data()); - strBuf.addChar(0); + growBuf.addChar(0); //result.resize(resultPos); - return strBuf.get(); + return growBuf.get(); } bool rightScopeMatch(const QCString &scope, const QCString &name) @@ -4080,17 +4056,17 @@ bool getDefs(const QCString &scName,const QCString &memberName, /*! * Searches for a scope definition given its name as a string via parameter - * `scope'. + * `scope`. * - * The parameter `docScope' is a string representing the name of the scope in - * which the `scope' string was found. + * The parameter `docScope` is a string representing the name of the scope in + * which the `scope` string was found. * * The function returns TRUE if the scope is known and documented or * FALSE if it is not. - * If TRUE is returned exactly one of the parameter `cd', `nd' + * If TRUE is returned exactly one of the parameter `cd`, `nd` * will be non-zero: - * - if `cd' is non zero, the scope was a class pointed to by cd. - * - if `nd' is non zero, the scope was a namespace pointed to by nd. + * - if `cd` is non zero, the scope was a class pointed to by cd. + * - if `nd` is non zero, the scope was a namespace pointed to by nd. */ static bool getScopeDefs(const char *docScope,const char *scope, ClassDef *&cd, NamespaceDef *&nd) @@ -4818,41 +4794,41 @@ bool hasVisibleRoot(BaseClassList *bcl) //---------------------------------------------------------------------- -// note that this function is not reentrant due to the use of static strBuf! +// note that this function is not reentrant due to the use of static growBuf! QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscore) { static bool caseSenseNames = Config_getBool("CASE_SENSE_NAMES"); - static StrBuf strBuf; - strBuf.clear(); + static GrowBuf growBuf; + growBuf.clear(); char c; const char *p=name; while ((c=*p++)!=0) { switch(c) { - case '_': if (allowUnderscore) strBuf.addChar('_'); else strBuf.addStr("__"); break; - case '-': strBuf.addChar('-'); break; - case ':': strBuf.addStr("_1"); break; - case '/': strBuf.addStr("_2"); break; - case '<': strBuf.addStr("_3"); break; - case '>': strBuf.addStr("_4"); break; - case '*': strBuf.addStr("_5"); break; - case '&': strBuf.addStr("_6"); break; - case '|': strBuf.addStr("_7"); break; - case '.': if (allowDots) strBuf.addChar('.'); else strBuf.addStr("_8"); break; - case '!': strBuf.addStr("_9"); break; - case ',': strBuf.addStr("_00"); break; - case ' ': strBuf.addStr("_01"); break; - case '{': strBuf.addStr("_02"); break; - case '}': strBuf.addStr("_03"); break; - case '?': strBuf.addStr("_04"); break; - case '^': strBuf.addStr("_05"); break; - case '%': strBuf.addStr("_06"); break; - case '(': strBuf.addStr("_07"); break; - case ')': strBuf.addStr("_08"); break; - case '+': strBuf.addStr("_09"); break; - case '=': strBuf.addStr("_0A"); break; - case '$': strBuf.addStr("_0B"); break; + case '_': if (allowUnderscore) growBuf.addChar('_'); else growBuf.addStr("__"); break; + case '-': growBuf.addChar('-'); break; + case ':': growBuf.addStr("_1"); break; + case '/': growBuf.addStr("_2"); break; + case '<': growBuf.addStr("_3"); break; + case '>': growBuf.addStr("_4"); break; + case '*': growBuf.addStr("_5"); break; + case '&': growBuf.addStr("_6"); break; + case '|': growBuf.addStr("_7"); break; + case '.': if (allowDots) growBuf.addChar('.'); else growBuf.addStr("_8"); break; + case '!': growBuf.addStr("_9"); break; + case ',': growBuf.addStr("_00"); break; + case ' ': growBuf.addStr("_01"); break; + case '{': growBuf.addStr("_02"); break; + case '}': growBuf.addStr("_03"); break; + case '?': growBuf.addStr("_04"); break; + case '^': growBuf.addStr("_05"); break; + case '%': growBuf.addStr("_06"); break; + case '(': growBuf.addStr("_07"); break; + case ')': growBuf.addStr("_08"); break; + case '+': growBuf.addStr("_09"); break; + case '=': growBuf.addStr("_0A"); break; + case '$': growBuf.addStr("_0B"); break; default: if (c<0) { @@ -4864,22 +4840,22 @@ QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscor ids[2]=map[id>>4]; ids[3]=map[id&0xF]; ids[4]=0; - strBuf.addStr(ids); + growBuf.addStr(ids); } else if (caseSenseNames || !isupper(c)) { - strBuf.addChar(c); + growBuf.addChar(c); } else { - strBuf.addChar('_'); - strBuf.addChar(tolower(c)); + growBuf.addChar('_'); + growBuf.addChar(tolower(c)); } break; } } - strBuf.addChar(0); - return strBuf.get(); + growBuf.addChar(0); + return growBuf.get(); } /*! This function determines the file name on disk of an item @@ -5216,8 +5192,8 @@ QCString stripScope(const char *name) /*! Converts a string to an XML-encoded string */ QCString convertToXML(const char *s) { - static StrBuf strBuf; - strBuf.clear(); + static GrowBuf growBuf; + growBuf.clear(); if (s==0) return ""; const char *p=s; char c; @@ -5225,23 +5201,23 @@ QCString convertToXML(const char *s) { switch (c) { - case '<': strBuf.addStr("<"); break; - case '>': strBuf.addStr(">"); break; - case '&': strBuf.addStr("&"); break; - case '\'': strBuf.addStr("'"); break; - case '"': strBuf.addStr("""); break; - default: strBuf.addChar(c); break; + case '<': growBuf.addStr("<"); break; + case '>': growBuf.addStr(">"); break; + case '&': growBuf.addStr("&"); break; + case '\'': growBuf.addStr("'"); break; + case '"': growBuf.addStr("""); break; + default: growBuf.addChar(c); break; } } - strBuf.addChar(0); - return strBuf.get(); + growBuf.addChar(0); + return growBuf.get(); } /*! Converts a string to a HTML-encoded string */ QCString convertToHtml(const char *s,bool keepEntities) { - static StrBuf strBuf; - strBuf.clear(); + static GrowBuf growBuf; + growBuf.clear(); if (s==0) return ""; const char *p=s; char c; @@ -5249,8 +5225,8 @@ QCString convertToHtml(const char *s,bool keepEntities) { switch (c) { - case '<': strBuf.addStr("<"); break; - case '>': strBuf.addStr(">"); break; + case '<': growBuf.addStr("<"); break; + case '>': growBuf.addStr(">"); break; case '&': if (keepEntities) { const char *e=p; @@ -5262,32 +5238,32 @@ QCString convertToHtml(const char *s,bool keepEntities) if (ce==';') // found end of an entity { // copy entry verbatim - strBuf.addChar(c); - while (p *sli, GroupDef *gd, - TagInfo *tagInfo + TagInfo *tagInfo, + SrcLangExt lang ) { PageDef *pd=0; @@ -5902,6 +5879,7 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle, pd=new PageDef(fileName,startLine,baseName,doc,title); pd->setRefItems(sli); + pd->setLanguage(lang); if (tagInfo) { @@ -6269,25 +6247,22 @@ static struct Lang2ExtMap g_lang2extMap[] = { // language parser parser option - { "idl", "c", SrcLangExt_IDL }, - { "java", "c", SrcLangExt_Java }, - { "javascript", "c", SrcLangExt_JS }, - { "csharp", "c", SrcLangExt_CSharp }, - { "d", "c", SrcLangExt_D }, - { "php", "c", SrcLangExt_PHP }, - { "objective-c", "c", SrcLangExt_ObjC }, - { "c", "c", SrcLangExt_Cpp }, - { "c++", "c", SrcLangExt_Cpp }, - { "python", "python", SrcLangExt_Python }, - { "fortran", "fortran", SrcLangExt_Fortran }, - { "vhdl", "vhdl", SrcLangExt_VHDL }, - { "vhd", "vhd", SrcLangExt_VHDL }, - { "ucf", "vhd", SrcLangExt_VHDL }, - { "qsf", "vhd", SrcLangExt_VHDL }, - - { "dbusxml", "dbusxml", SrcLangExt_XML }, - { "tcl", "tcl", SrcLangExt_Tcl }, - { 0, 0, (SrcLangExt)0 } + { "idl", "c", SrcLangExt_IDL }, + { "java", "c", SrcLangExt_Java }, + { "javascript", "c", SrcLangExt_JS }, + { "csharp", "c", SrcLangExt_CSharp }, + { "d", "c", SrcLangExt_D }, + { "php", "c", SrcLangExt_PHP }, + { "objective-c", "c", SrcLangExt_ObjC }, + { "c", "c", SrcLangExt_Cpp }, + { "c++", "c", SrcLangExt_Cpp }, + { "python", "python", SrcLangExt_Python }, + { "fortran", "fortran", SrcLangExt_Fortran }, + { "vhdl", "vhdl", SrcLangExt_VHDL }, + { "dbusxml", "dbusxml", SrcLangExt_XML }, + { "tcl", "tcl", SrcLangExt_Tcl }, + { "md", "md", SrcLangExt_Markdown }, + { 0, 0, (SrcLangExt)0 } }; bool updateLanguageMapping(const QCString &extension,const QCString &language) @@ -6328,31 +6303,33 @@ bool updateLanguageMapping(const QCString &extension,const QCString &language) void initDefaultExtensionMapping() { g_extLookup.setAutoDelete(TRUE); - updateLanguageMapping(".idl", "idl"); - updateLanguageMapping(".ddl", "idl"); - updateLanguageMapping(".odl", "idl"); - updateLanguageMapping(".java", "java"); - updateLanguageMapping(".as", "javascript"); - updateLanguageMapping(".js", "javascript"); - updateLanguageMapping(".cs", "csharp"); - updateLanguageMapping(".d", "d"); - updateLanguageMapping(".php", "php"); - updateLanguageMapping(".php4", "php"); - updateLanguageMapping(".php5", "php"); - updateLanguageMapping(".inc", "php"); - updateLanguageMapping(".phtml", "php"); - updateLanguageMapping(".m", "objective-c"); - updateLanguageMapping(".M", "objective-c"); - updateLanguageMapping(".mm", "objective-c"); - updateLanguageMapping(".py", "python"); - updateLanguageMapping(".f", "fortran"); - updateLanguageMapping(".for", "fortran"); - updateLanguageMapping(".f90", "fortran"); - updateLanguageMapping(".vhd", "vhdl"); - updateLanguageMapping(".vhdl", "vhdl"); - updateLanguageMapping(".tcl", "tcl"); - updateLanguageMapping(".ucf", "vhdl"); - updateLanguageMapping(".qsf", "vhdl"); + updateLanguageMapping(".idl", "idl"); + updateLanguageMapping(".ddl", "idl"); + updateLanguageMapping(".odl", "idl"); + updateLanguageMapping(".java", "java"); + updateLanguageMapping(".as", "javascript"); + updateLanguageMapping(".js", "javascript"); + updateLanguageMapping(".cs", "csharp"); + updateLanguageMapping(".d", "d"); + updateLanguageMapping(".php", "php"); + updateLanguageMapping(".php4", "php"); + updateLanguageMapping(".php5", "php"); + updateLanguageMapping(".inc", "php"); + updateLanguageMapping(".phtml", "php"); + updateLanguageMapping(".m", "objective-c"); + updateLanguageMapping(".M", "objective-c"); + updateLanguageMapping(".mm", "objective-c"); + updateLanguageMapping(".py", "python"); + updateLanguageMapping(".f", "fortran"); + updateLanguageMapping(".for", "fortran"); + updateLanguageMapping(".f90", "fortran"); + updateLanguageMapping(".vhd", "vhdl"); + updateLanguageMapping(".vhdl", "vhdl"); + updateLanguageMapping(".tcl", "tcl"); + updateLanguageMapping(".ucf", "vhdl"); + updateLanguageMapping(".qsf", "vhdl"); + updateLanguageMapping(".md", "md"); + updateLanguageMapping(".markdown", "md"); //updateLanguageMapping(".xml", "dbusxml"); } @@ -7239,3 +7216,4 @@ QCString correctURL(const QCString &url,const QCString &relPath) return result; } +//--------------------------------------------------------------------------- diff --git a/src/util.h b/src/util.h index f99d7a6..9bc235c 100644 --- a/src/util.h +++ b/src/util.h @@ -89,20 +89,21 @@ class TextGeneratorOLImpl : public TextGeneratorIntf enum SrcLangExt { - SrcLangExt_Unknown = 0x0000, - SrcLangExt_IDL = 0x0008, - SrcLangExt_Java = 0x0010, - SrcLangExt_CSharp = 0x0020, - SrcLangExt_D = 0x0040, - SrcLangExt_PHP = 0x0080, - SrcLangExt_ObjC = 0x0100, - SrcLangExt_Cpp = 0x0200, - SrcLangExt_JS = 0x0400, - SrcLangExt_Python = 0x0800, - SrcLangExt_Fortran = 0x1000, - SrcLangExt_VHDL = 0x2000, - SrcLangExt_XML = 0x4000, - SrcLangExt_Tcl = 0x8000 + SrcLangExt_Unknown = 0x00000, + SrcLangExt_IDL = 0x00008, + SrcLangExt_Java = 0x00010, + SrcLangExt_CSharp = 0x00020, + SrcLangExt_D = 0x00040, + SrcLangExt_PHP = 0x00080, + SrcLangExt_ObjC = 0x00100, + SrcLangExt_Cpp = 0x00200, + SrcLangExt_JS = 0x00400, + SrcLangExt_Python = 0x00800, + SrcLangExt_Fortran = 0x01000, + SrcLangExt_VHDL = 0x02000, + SrcLangExt_XML = 0x04000, + SrcLangExt_Tcl = 0x08000, + SrcLangExt_Markdown = 0x10000 }; QCString langToString(SrcLangExt lang); @@ -306,7 +307,8 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle, const char *fileName,int startLine, const QList *sli, GroupDef *gd=0, - TagInfo *tagInfo=0 + TagInfo *tagInfo=0, + SrcLangExt lang=SrcLangExt_Unknown ); QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscore=FALSE); @@ -415,5 +417,7 @@ QCString extractBlock(const QCString text,const QCString marker); QCString correctURL(const QCString &url,const QCString &relPath); +QCString processMarkup(const QCString &s); + #endif diff --git a/src/vhdlcode.l b/src/vhdlcode.l index 4500140..9aaeb02 100644 --- a/src/vhdlcode.l +++ b/src/vhdlcode.l @@ -451,7 +451,14 @@ static void generateFuncLink(CodeOutputInterface &ol,MemberDef* mdef) static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& memberName) { - if (clName.isEmpty() || memberName.isEmpty()) return; + if (memberName.isEmpty()) return; + if (clName.isEmpty()) + { + codifyLines(memberName.data()); + + return; + } + QCString className=clName; MemberDef *md=0; @@ -826,7 +833,7 @@ XILINX "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFI cc=t1.at(index); } - QCString s1=(QCString)ql[0]; + QCString s1=t1; s1=s1.stripWhiteSpace(); // if (!g_PortMapComp.isEmpty()) diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index 06a5c8c..43f8054 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -3,8 +3,8 @@ * Copyright (C) 1997-2010 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * @@ -16,7 +16,7 @@ * Parser for VHDL subset * written by M. Kreis * supports VHDL-87/93/2002 - * does not support VHDL-AMS + * does not support VHDL-AMS ******************************************************************************/ // global includes @@ -49,21 +49,21 @@ #define theTranslator_vhdlType VhdlDocGen::trVhdlType -static QDict g_vhdlKeyDict0(17,FALSE); -static QDict g_vhdlKeyDict1(17,FALSE); +static QDict g_vhdlKeyDict0(17,FALSE); +static QDict g_vhdlKeyDict1(17,FALSE); static QDict g_vhdlKeyDict2(17,FALSE); static QDict g_xilinxUcfDict(17,FALSE); static void initUCF(Entry* root,const char* type,QCString & qcs,int line,QCString & fileName,QCString & brief); static void writeUCFLink(const MemberDef* mdef,OutputList &ol); -static void assignConfiguration(ConfNode* ,QCString); +static void assignConfiguration(ConfNode* ,QCString); static void assignBinding(ConfNode* conf,QCString label); static void addInstance(ClassDef* entity, ClassDef* arch, ClassDef *inst,Entry *cur,ClassDef* archBind=NULL); #if 0 static ConfNode* findConfiguration(QCString config) -{ +{ QList confList= getVhdlConfiguration(); uint size=confList.count(); if (size==0) return NULL; @@ -72,7 +72,7 @@ static ConfNode* findConfiguration(QCString config) { ConfNode* conf= (ConfNode *)confList.at(i); QCString entity=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1); - if (entity==config) + if (entity==config) { return conf; } @@ -92,10 +92,10 @@ VhdlDocGen::~VhdlDocGen() void VhdlDocGen::init() { - + // vhdl keywords inlcuded VHDL 2008 -const char* g_vhdlKeyWordMap0[] = -{ +const char* g_vhdlKeyWordMap0[] = +{ "abs","access","after","alias","all","and","architecture","array","assert","assume","assume_guarantee","attribute", "begin","block","body","buffer","bus", "case","component","configuration","constant","context","cover", @@ -116,19 +116,19 @@ const char* g_vhdlKeyWordMap0[] = "variable","vmode","vprop","vunit", "wait","when","while","with", "xor","xnor", - 0 + 0 }; - + // type -const char* g_vhdlKeyWordMap1[] = -{ +const char* g_vhdlKeyWordMap1[] = +{ "natural","unsigned","signed","string","boolean", "bit","bit_vector","character", "std_ulogic","std_ulogic_vector","std_logic","std_logic_vector","integer", "real","float","ufixed","sfixed","time",0 }; // logic -const char* g_vhdlKeyWordMap2[] = +const char* g_vhdlKeyWordMap2[] = { "abs","and","or","not","mod", "xor","rem","xnor","ror","rol","sla", "sll",0 @@ -166,8 +166,8 @@ const char* g_vhdlKeyWordMap2[] = }// buildKeyMap /*! - * returns the color of a keyword - */ + * returns the color of a keyword + */ QCString* VhdlDocGen::findKeyWord(const QCString& word) { @@ -203,7 +203,7 @@ ClassDef *VhdlDocGen::getClass(const char *name) { if (name==0 || name[0]=='\0') return 0; - ClassDef *cd=0; + ClassDef *cd=0; QCString temp(name); //temp=temp.lower(); temp=temp.stripWhiteSpace(); @@ -225,7 +225,7 @@ ClassDef* VhdlDocGen::getPackageName(const QCString & name) MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& memName) { - QDict packages(17,FALSE); + QDict packages(17,FALSE); packages.setAutoDelete(TRUE); ClassDef* cd; MemberDef *mdef=0; @@ -239,16 +239,16 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::pubMethods); if (mdef) return mdef; - // nothing found so far + // nothing found so far // if we are an architecture or package body search in entitiy - if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS || + if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS || (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS) { Definition *d = cd->getOuterScope(); // searching upper/lower case names - QCString tt=d->name(); + QCString tt=d->name(); ClassDef *ecd =getClass(tt); if (!ecd) { @@ -258,7 +258,7 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem if (!ecd) { tt=tt.lower(); - ecd =getClass(tt); + ecd =getClass(tt); } if (ecd) //d && d->definitionType()==Definition::TypeClass) @@ -272,10 +272,10 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem //cd=getClass(getClassName(cd)); //if (!cd) return 0; } - // nothing found , so we are now searching all included packages + // nothing found , so we are now searching all included packages VhdlDocGen::findAllPackages(className,packages); //cd=getClass(className.data()); - if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS || + if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS || (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS) { Definition *d = cd->getOuterScope(); @@ -290,12 +290,12 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem if (!ecd) { tt=tt.lower(); - ecd =getClass(tt); + ecd =getClass(tt); } if (ecd) //d && d->definitionType()==Definition::TypeClass) { - VhdlDocGen::findAllPackages(ecd->className(),packages); + VhdlDocGen::findAllPackages(ecd->className(),packages); } } @@ -314,11 +314,11 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem if (!cd) { *curString=curString->lower(); - cd=VhdlDocGen::getPackageName(*curString); + cd=VhdlDocGen::getPackageName(*curString); } } if (cd) - { + { mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::variableMembers); if (mdef) return mdef; mdef=VhdlDocGen::findMemberDef(cd,memName,MemberList::pubMethods); @@ -335,7 +335,7 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem MemberDef* VhdlDocGen::findMemberDef(ClassDef* cd,const QCString& key,MemberList::ListType type) { - // return cd->getMemberByName(key);//does not work + // return cd->getMemberByName(key);//does not work MemberDef *md=0; MemberList *ml= cd->getMemberList(type); @@ -349,7 +349,7 @@ MemberDef* VhdlDocGen::findMemberDef(ClassDef* cd,const QCString& key,MemberList { return md; } - } + } return 0; }//findMemberDef @@ -362,7 +362,7 @@ void VhdlDocGen::findAllPackages(const QCString& className,QDict& qdic ClassDef *cdef=getClass(className); if (cdef) { - MemberList *mem=cdef->getMemberList(MemberList::variableMembers); + MemberList *mem=cdef->getMemberList(MemberList::variableMembers); MemberDef *md; if (mem) @@ -377,8 +377,8 @@ void VhdlDocGen::findAllPackages(const QCString& className,QDict& qdic QCString p(md->name().data()); //p=p.lower(); ClassDef* cd=VhdlDocGen::getPackageName(*temp1); - if (cd) - { + if (cd) + { QCString *ss=qdict.find(*temp1); if (ss==0) { @@ -414,7 +414,7 @@ MemberDef* VhdlDocGen::findFunction(const QList &ql, else funcType=VhdlDocGen::FUNCTION; - MemberList *mem=cdef->getMemberList(MemberList::pubMethods); + MemberList *mem=cdef->getMemberList(MemberList::pubMethods); if (mem) { @@ -456,15 +456,15 @@ MemberDef* VhdlDocGen::findFunction(const QList &ql, } // for if (equ==0) return mdef; }//if - }//for - }//if + }//for + }//if return mdef; } //findFunction -/*! +/*! * returns the class title+ref */ @@ -489,13 +489,13 @@ QCString VhdlDocGen::getClassName(const ClassDef* cd) if (cd==0) return ""; if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS) - { + { temp=cd->name(); temp.stripPrefix("_"); return temp; - } + } //if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS) - //{ + //{ // QStringList qlist=QStringList::split("-",cd->className(),FALSE); // if (qlist.count()>1) // return (QCString)qlist[1]; @@ -504,7 +504,7 @@ QCString VhdlDocGen::getClassName(const ClassDef* cd) return substitute(cd->className(),"::","."); } -/*! +/*! * writes an inline link form entity|package to architecture|package body and vice verca */ @@ -524,22 +524,22 @@ void VhdlDocGen::writeInlineClassLink(const ClassDef* cd ,OutputList& ol) type+=theTranslator_vhdlType(VhdlDocGen::PACKAGE,TRUE); else if (ii==VhdlDocGen::PACKAGE) type+=theTranslator_vhdlType(VhdlDocGen::PACKAGE_BODY,TRUE); - else + else type+=""; - //type=type.lower(); + //type=type.lower(); type+=" >> "; - ol.disable(OutputGenerator::RTF); + ol.disable(OutputGenerator::RTF); ol.disable(OutputGenerator::Man); ol.lineBreak(); ol.lineBreak(); - if (ii==VhdlDocGen::PACKAGE_BODY) + if (ii==VhdlDocGen::PACKAGE_BODY) { nn.stripPrefix("_"); cd=getClass(nn.data()); } - else if (ii==VhdlDocGen::PACKAGE) + else if (ii==VhdlDocGen::PACKAGE) { nn.prepend("_"); cd=getClass(nn.data()); @@ -549,11 +549,11 @@ void VhdlDocGen::writeInlineClassLink(const ClassDef* cd ,OutputList& ol) QStringList qlist=QStringList::split("-",nn,FALSE); nn=qlist[1]; cd=VhdlDocGen::getClass(nn.data()); - } + } QCString opp; if (ii==VhdlDocGen::ENTITY) - { + { VhdlDocGen::findAllArchitectures(ql,cd); int j=ql.count(); for (int i=0;idata()); if (cc) { - VhdlDocGen::writeVhdlLink(cc,ol,type,s2,s1); + VhdlDocGen::writeVhdlLink(cc,ol,type,s2,s1); } - } - } + } + } else { VhdlDocGen::writeVhdlLink(cd,ol,type,nn,opp); @@ -595,12 +595,12 @@ void VhdlDocGen::findAllArchitectures(QList& qll,const ClassDef *cd) { QStringList ql=QStringList::split("-",jj,FALSE); QCString temp=(QCString)ql[1]; - if (stricmp(cd->className().data(),temp.data())==0) + if (stricmp(cd->className().data(),temp.data())==0) { QCString *cl=new QCString(jj.data()); qll.insert(0,cl); } - } + } }// for }//findAllArchitectures @@ -617,7 +617,7 @@ ClassDef* VhdlDocGen::findArchitecture(const ClassDef *cd) if (ql.count()>1) { if ((QCString)ql[0]==nn ) - { + { return citer; } } @@ -625,7 +625,7 @@ ClassDef* VhdlDocGen::findArchitecture(const ClassDef *cd) return 0; } /* - * writes the link entity >> .... or architecture >> ... + * writes the link entity >> .... or architecture >> ... */ void VhdlDocGen::writeVhdlLink(const ClassDef* ccd ,OutputList& ol,QCString& type,QCString& nn,QCString& behav) @@ -638,7 +638,7 @@ void VhdlDocGen::writeVhdlLink(const ClassDef* ccd ,OutputList& ol,QCString& typ nn.stripPrefix("_"); ol.writeObjectLink(ccd->getReference(),ccd->getOutputFileBase(),0,nn.data()); - if (!behav.isEmpty()) + if (!behav.isEmpty()) { behav.prepend(" "); ol.startBold(); @@ -659,7 +659,7 @@ bool VhdlDocGen::compareString(const QCString& s1,const QCString& s2) /*! - * strips the "--" prefixes of vhdl comments + * strips the "--" prefixes of vhdl comments */ void VhdlDocGen::prepareComment(QCString& qcs) { @@ -667,7 +667,7 @@ void VhdlDocGen::prepareComment(QCString& qcs) const char* s="--!"; //const char *start="--!{"; //const char *end="--!}"; - int index=0; + int index=0; while (TRUE) { @@ -699,24 +699,24 @@ void VhdlDocGen::parseFuncProto(const char* text,QList& qlist, index=s1.find("("); end=s1.findRev(")"); - if ((end-index)>0) + if ((end-index)>0) { QCString tt=s1.mid(index,(end-index+1)); temp=s1.mid(index+1,(end-index-1)); //getFuncParams(qlist,temp); - } + } if (doc) { name=s1.left(index); name=name.stripWhiteSpace(); - if ((end-index)>0) - { + if ((end-index)>0) + { ret="function"; - } + } return; } else - { + { QCString s1(text); s1=s1.stripWhiteSpace(); int i=s1.find("(",0,FALSE); @@ -776,7 +776,7 @@ QCString VhdlDocGen::trTypeString(int type) { switch(type) { - case VhdlDocGen::LIBRARY: return "Library"; + case VhdlDocGen::LIBRARY: return "Library"; case VhdlDocGen::ENTITY: return "Entity"; case VhdlDocGen::PACKAGE_BODY: return "Package Body"; case VhdlDocGen::ATTRIBUTE: return "Attribute"; @@ -794,22 +794,22 @@ QCString VhdlDocGen::trTypeString(int type) case VhdlDocGen::PROCESS: return "Process"; case VhdlDocGen::PORT: return "Port"; case VhdlDocGen::GENERIC: return "Generic"; - case VhdlDocGen::UNITS: return "Units"; - //case VhdlDocGen::PORTMAP: return "Port Map"; - case VhdlDocGen::SHAREDVARIABLE: return "Shared Variable"; - case VhdlDocGen::GROUP: return "Group"; - case VhdlDocGen::VFILE: return "File"; - case VhdlDocGen::COMPONENT_INST: return "Component Instantiation"; + case VhdlDocGen::UNITS: return "Units"; + //case VhdlDocGen::PORTMAP: return "Port Map"; + case VhdlDocGen::SHAREDVARIABLE: return "Shared Variable"; + case VhdlDocGen::GROUP: return "Group"; + case VhdlDocGen::VFILE: return "File"; + case VhdlDocGen::INSTANTIATION: return "Instantiation"; case VhdlDocGen::ALIAS: return "Alias"; - case VhdlDocGen::CONFIG: return "Configuration"; - case VhdlDocGen::MISCELLANEOUS: return "Miscellaneous"; - case VhdlDocGen::UCF_CONST: return "Constraints"; + case VhdlDocGen::CONFIG: return "Configuration"; + case VhdlDocGen::MISCELLANEOUS: return "Miscellaneous"; + case VhdlDocGen::UCF_CONST: return "Constraints"; default: return ""; } } // convertType /*! - * deletes a char backwards in a string + * deletes a char backwards in a string */ bool VhdlDocGen::deleteCharRev(QCString &s,char c) @@ -829,14 +829,14 @@ void VhdlDocGen::deleteAllChars(QCString &s,char c) int index=s.findRev(c,-1,FALSE); while (index > -1) { - QString qcs=s.remove(index,1); + QString qcs=s.remove(index,1); s=qcs; index=s.findRev(c,-1,FALSE); - } + } } -static int recordCounter=0; +static int recordCounter=0; /*! * returns the next number of a record|unit member @@ -865,12 +865,13 @@ QCString VhdlDocGen::getProcessNumber() } /*! - * writes a colored and formatted string + * writes a colored and formatted string */ -void VhdlDocGen::writeFormatString(QCString& qcs,OutputList&ol,const MemberDef* mdef) +void VhdlDocGen::writeFormatString(const QCString& s,OutputList&ol,const MemberDef* mdef) { QRegExp reg("[\\[\\]\\.\\/\\:\\<\\>\\:\\s\\,\\;\\'\\+\\-\\*\\|\\&\\=\\(\\)\"]"); + QCString qcs = s; qcs+=QCString(" ");// parsing the last sign QCString *ss; QCString find=qcs; @@ -917,9 +918,9 @@ void VhdlDocGen::writeFormatString(QCString& qcs,OutputList&ol,const MemberDef* int ii=find.find('"',2); if (ii>1) { - QCString com=find.left(ii+1); + QCString com=find.left(ii+1); VhdlDocGen::startFonts(com,"keyword",ol); - temp=find.remove(0,ii+1); + temp=find.remove(0,ii+1); } } else @@ -931,7 +932,7 @@ void VhdlDocGen::writeFormatString(QCString& qcs,OutputList&ol,const MemberDef* }//if else { - VhdlDocGen::startFonts(find,"vhdlchar",ol); + VhdlDocGen::startFonts(find,"vhdlchar",ol); } ol.endBold(); }// writeFormatString @@ -947,7 +948,7 @@ bool VhdlDocGen::isNumber(const QCString& s) if (s.isEmpty()) return FALSE; int j,len; j = regg.match(s.data(),0,&len); - if ((j==0) && (len==(int)s.length())) return TRUE; + if ((j==0) && (len==(int)s.length())) return TRUE; return FALSE; }// isNumber @@ -960,13 +961,14 @@ void VhdlDocGen::startFonts(const QCString& q, const char *keyword,OutputList& o } /*! - * inserts white spaces for better readings + * inserts white spaces for better readings * and writes a colored string to the output */ -void VhdlDocGen::formatString(QCString & qcs, OutputList& ol,const MemberDef* mdef) -{ - QCString temp(qcs.length()); +void VhdlDocGen::formatString(const QCString &s, OutputList& ol,const MemberDef* mdef) +{ + QCString qcs = s; + QCString temp(qcs.length()); qcs.stripPrefix(":"); qcs.stripPrefix("is"); qcs.stripPrefix("IS"); @@ -983,30 +985,30 @@ void VhdlDocGen::formatString(QCString & qcs, OutputList& ol,const MemberDef* md char c=qcs[j]; char b=c; if (j>0) b=qcs[j-1]; - if (c=='"' || c==',' || c=='\''|| c=='(' || c==')' || c==':' || c=='[' || c==']' ) // || (c==':' && b!='=')) // || (c=='=' && b!='>')) + if (c=='"' || c==',' || c=='\''|| c=='(' || c==')' || c==':' || c=='[' || c==']' ) // || (c==':' && b!='=')) // || (c=='=' && b!='>')) { if (temp.at(index-1) != ' ') { temp+=" "; } temp+=c; - temp+=" "; + temp+=" "; } - else if (c=='=') + else if (c=='=') { if (b==':') // := operator - { + { temp.replace(index-1,1,"="); - temp+=" "; + temp+=" "; } else // = operator { - temp+=" "; + temp+=" "; temp+=c; - temp+=" "; + temp+=" "; } } - else + else { temp+=c; } @@ -1028,7 +1030,7 @@ void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList* al,const Argument *arg; bool sem=FALSE; int len=al->count(); - ol.docify("( "); + ol.docify("( "); if (len > 2) { ol.lineBreak(); @@ -1044,7 +1046,7 @@ void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList* al,const QCString *str=VhdlDocGen::findKeyWord(arg->defval); arg->defval+=" "; - if (str) + if (str) { VhdlDocGen::startFonts(arg->defval,str->data(),ol); } @@ -1053,7 +1055,7 @@ void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList* al,const VhdlDocGen::startFonts(arg->defval,"vhdlchar",ol); // write type (variable,constant etc.) } - VhdlDocGen::startFonts(nn,"vhdlchar",ol); // write name + VhdlDocGen::startFonts(nn,"vhdlchar",ol); // write name if (stricmp(arg->attrib.data(),arg->type.data()) != 0) VhdlDocGen::startFonts(arg->attrib.lower(),"stringliteral",ol); // write in|out ol.docify(" "); @@ -1061,13 +1063,13 @@ void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList* al,const sem=TRUE; ol.endBold(); if (len > 2) - { + { ol.lineBreak(); ol.docify(" "); } }//for - ol.docify(" )"); + ol.docify(" )"); } @@ -1084,7 +1086,7 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const bool sem=FALSE; int len=al->count(); ol.startBold(); - ol.docify(" ( "); + ol.docify(" ( "); ol.endBold(); if (len>2) { @@ -1093,20 +1095,26 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const for (;(arg=ali.current());++ali) { ol.startBold(); + QCString att=arg->defval; + bool bGen=att.stripPrefix("gen!"); + if (sem && len < 3) { ol.docify(" , "); } - QCString att=arg->defval; - if (!att.isEmpty()) - { + + if (bGen) { + VhdlDocGen::formatString(QCString("generic "),ol,mdef); + } + if (!att.isEmpty()) + { QCString *str=VhdlDocGen::findKeyWord(att); att+=" "; if (str) VhdlDocGen::formatString(att,ol,mdef); else - VhdlDocGen::startFonts(att,"vhdlchar",ol); - } + VhdlDocGen::startFonts(att,"vhdlchar",ol); + } QCString nn=arg->name; nn+=": "; @@ -1118,30 +1126,32 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const if (str) VhdlDocGen::formatString(w,ol,mdef); else - VhdlDocGen::startFonts(w,"vhdlchar",ol); + VhdlDocGen::startFonts(w,"vhdlchar",ol); if (arg->attrib) VhdlDocGen::startFonts(arg->attrib,"vhdlchar",ol); - sem=TRUE; + sem=TRUE; ol.endBold(); - if (len > 2) + if (len > 2) { ol.lineBreak(); } } - ol.startBold(); - ol.docify(" )"); + ol.startBold(); + ol.docify(" )"); const char *exp=mdef->excpString(); if (exp) { ol.insertMemberAlign(); + ol.startBold(); ol.docify("[ "); ol.docify(exp); ol.docify(" ]"); + ol.endBold(); } - ol.endBold(); + ol.endBold(); } /*! @@ -1155,17 +1165,19 @@ void VhdlDocGen::writeProcessProto(OutputList& ol,const ArgumentList* al,const M Argument *arg; bool sem=FALSE; ol.startBold(); - ol.docify(" ( "); + ol.docify(" ( "); for (;(arg=ali.current());++ali) { if (sem) + { ol.docify(" , "); + } QCString nn=arg->name; // VhdlDocGen::startFonts(nn,"vhdlchar",ol); VhdlDocGen::writeFormatString(nn,ol,mdef); - sem=TRUE; - } - ol.docify(" )"); + sem=TRUE; + } + ol.docify(" )"); ol.endBold(); } @@ -1175,13 +1187,13 @@ void VhdlDocGen::writeProcessProto(OutputList& ol,const ArgumentList* al,const M */ void VhdlDocGen::writeFuncProcDocu( - const MemberDef *md, + const MemberDef *md, OutputList& ol, const ArgumentList* al, bool /*type*/) { if (al==0) return; - bool sem=FALSE; + bool sem=FALSE; ol.enableAll(); ArgumentListIterator ali(*al); @@ -1191,24 +1203,30 @@ void VhdlDocGen::writeFuncProcDocu( ol.docify(" ( ) "); return; } - ol.startParameterList(TRUE); + ol.startParameterList(TRUE); //ol.startParameterName(FALSE); Argument *arg; bool first=TRUE; for (;(arg=ali.current());++ali) - { - ol.startParameterType(first,""); + { + ol.startParameterType(first,""); // if (first) ol.writeChar('('); + QCString attl=arg->defval; + bool bGen=attl.stripPrefix("gen!"); + if (bGen) + VhdlDocGen::writeFormatString(QCString("generic "),ol,md); + + if (VhdlDocGen::isProcedure(md)) { startFonts(arg->defval,"keywordtype",ol); ol.docify(" "); - } + } ol.endParameterType(); ol.startParameterName(TRUE); VhdlDocGen::writeFormatString(arg->name,ol,md); - ol.docify(" "); + ol.docify(" : "); if (VhdlDocGen::isProcedure(md)) { @@ -1225,15 +1243,16 @@ void VhdlDocGen::writeFuncProcDocu( ol.enable(OutputGenerator::Man); if (!VhdlDocGen::isProcess(md)) { - startFonts(arg->type,"vhdlkeyword",ol); + // startFonts(arg->type,"vhdlkeyword",ol); + VhdlDocGen::writeFormatString(arg->type,ol,md); } ol.disable(OutputGenerator::Man); ol.endEmphasis(); ol.enable(OutputGenerator::Man); - if (--index) + if (--index) { - ol.docify(" , "); + ol.docify(" , "); } else { @@ -1243,10 +1262,10 @@ void VhdlDocGen::writeFuncProcDocu( } ol.endParameterName(FALSE,FALSE,FALSE); - sem=TRUE; + sem=TRUE; first=FALSE; } - //ol.endParameterList(); + //ol.endParameterList(); } // writeDocFunProc @@ -1267,7 +1286,7 @@ QCString VhdlDocGen::convertArgumentListToString(const ArgumentList* al,bool fun { argString+=arg->name; argString+=":"; - argString+=arg->type; + argString+=arg->type; } else { @@ -1275,7 +1294,7 @@ QCString VhdlDocGen::convertArgumentListToString(const ArgumentList* al,bool fun argString+=arg->name+" :"; argString+=arg->attrib+" "; argString+=arg->type; - } + } sem=TRUE; } return argString; @@ -1318,11 +1337,11 @@ void VhdlDocGen::writeVhdlDeclarations(MemberList* ml, VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::SHAREDVARIABLE,FALSE),0,FALSE,VhdlDocGen::SHAREDVARIABLE); VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::VFILE,FALSE),0,FALSE,VhdlDocGen::VFILE); VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::GROUP,FALSE),0,FALSE,VhdlDocGen::GROUP); - VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::COMPONENT_INST,FALSE),0,FALSE,VhdlDocGen::COMPONENT_INST); + VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::INSTANTIATION,FALSE),0,FALSE,VhdlDocGen::INSTANTIATION); VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::ALIAS,FALSE),0,FALSE,VhdlDocGen::ALIAS); VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::MISCELLANEOUS),0,FALSE,VhdlDocGen::MISCELLANEOUS); - // configurations must be added to global file definitions. + // configurations must be added to global file definitions. VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::CONFIG,FALSE),0,FALSE,VhdlDocGen::CONFIG); VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,nd,fd,gd,theTranslator_vhdlType(VhdlDocGen::UCF_CONST,FALSE),0,FALSE,VhdlDocGen::UCF_CONST); @@ -1337,26 +1356,30 @@ static void setGlobalType(MemberList *ml) { QCString l=mdd->typeString(); - if (strcmp(mdd->argsString(),"configuration")==0) + if (strcmp(mdd->argsString(),"package")==0) { - mdd->setMemberSpecifiers(VhdlDocGen::CONFIG); + mdd->setMemberSpecifiers(VhdlDocGen::INSTANTIATION); + } + else if (strcmp(mdd->argsString(),"configuration")==0) + { + mdd->setMemberSpecifiers(VhdlDocGen::CONFIG); } else if (strcmp(mdd->typeString(),"library")==0) { - mdd->setMemberSpecifiers(VhdlDocGen::LIBRARY); + mdd->setMemberSpecifiers(VhdlDocGen::LIBRARY); } - else if (strcmp(mdd->typeString(),"package")==0) + else if (strcmp(mdd->typeString(),"use")==0) { - mdd->setMemberSpecifiers(VhdlDocGen::USE); - } + mdd->setMemberSpecifiers(VhdlDocGen::USE); + } else if (stricmp(mdd->typeString(),"misc")==0) { - mdd->setMemberSpecifiers(VhdlDocGen::MISCELLANEOUS); - } + mdd->setMemberSpecifiers(VhdlDocGen::MISCELLANEOUS); + } else if (stricmp(mdd->typeString(),"ucf_const")==0) { - mdd->setMemberSpecifiers(VhdlDocGen::UCF_CONST); - } + mdd->setMemberSpecifiers(VhdlDocGen::UCF_CONST); + } } } @@ -1368,7 +1391,7 @@ void VhdlDocGen::writeVHDLTypeDocumentation(const MemberDef* mdef, const Definit if (cd==0) return; QCString ttype=mdef->typeString(); - QCString largs=mdef->argsString(); + QCString largs=mdef->argsString(); if ((VhdlDocGen::isVhdlFunction(mdef) || VhdlDocGen::isProcedure(mdef) || VhdlDocGen::isProcess(mdef))) { @@ -1376,12 +1399,12 @@ void VhdlDocGen::writeVHDLTypeDocumentation(const MemberDef* mdef, const Definit nn=nn.stripWhiteSpace(); QCString na=cd->name(); MemberDef* memdef=VhdlDocGen::findMember(na,nn); - if (memdef && memdef->isLinkable()) - { + if (memdef && memdef->isLinkable()) + { ol.docify(" "); ol.startBold(); - //ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,mdef->typeString()); + //ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,mdef->typeString()); writeLink(memdef,ol); ol.endBold(); ol.docify(" "); @@ -1390,7 +1413,7 @@ void VhdlDocGen::writeVHDLTypeDocumentation(const MemberDef* mdef, const Definit { ol.docify(" "); VhdlDocGen::formatString(ttype,ol,mdef); - ol.docify(" "); + ol.docify(" "); } ol.docify(mdef->name()); VhdlDocGen::writeFuncProcDocu(mdef,ol, mdef->argumentList().pointer()); @@ -1412,24 +1435,26 @@ void VhdlDocGen::writeVHDLTypeDocumentation(const MemberDef* mdef, const Definit return; } else - { + { writeLink(mdef,ol); ol.docify(" "); // ttype=mdef->typeString(); } - // QCString largs=mdef->argsString(); + // QCString largs=mdef->argsString(); + bool c=largs=="context"; + bool brec=largs.stripPrefix("record") ; - bool brec=largs.stripPrefix("record"); - - if (!brec) + if (!brec && !c) VhdlDocGen::formatString(ttype,ol,mdef); - if (brec || largs.stripPrefix("units")) - { + if (c || brec || largs.stripPrefix("units")) + { + if (c) + largs=ttype; VhdlDocGen::writeRecUnitDocu(mdef,ol,largs); - return; + return; } ol.docify(" "); @@ -1446,7 +1471,7 @@ void VhdlDocGen::writeVHDLTypeDocumentation(const MemberDef* mdef, const Definit void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd, - bool /*inGroup*/) + bool /*inGroup*/) { static QRegExp reg("[%]"); LockingPtr lock(mdef,mdef); @@ -1465,14 +1490,14 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, */ - ASSERT(cd!=0 || nd!=0 || fd!=0 || gd!=0 || - mdef->getMemberSpecifiers()==VhdlDocGen::LIBRARY || - mdef->getMemberSpecifiers()==VhdlDocGen::USE + ASSERT(cd!=0 || nd!=0 || fd!=0 || gd!=0 || + mdef->getMemberSpecifiers()==VhdlDocGen::LIBRARY || + mdef->getMemberSpecifiers()==VhdlDocGen::USE ); // member should belong to something - if (cd) d=cd; - else if (nd) d=nd; - else if (fd) d=fd; - else if (gd) d=gd; + if (cd) d=cd; + else if (nd) d=nd; + else if (fd) d=fd; + else if (gd) d=gd; else d=(Definition*)mdef; // write tag file information of this member @@ -1497,7 +1522,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, if (VhdlDocGen::isVariable(mdef)) Doxygen::tagFile << "shared variable"; if (VhdlDocGen::isFile(mdef)) Doxygen::tagFile << "file"; if (VhdlDocGen::isGroup(mdef)) Doxygen::tagFile << "group"; - if (VhdlDocGen::isCompInst(mdef)) Doxygen::tagFile << "component instantiation"; + if (VhdlDocGen::isCompInst(mdef)) Doxygen::tagFile << " instantiation"; if (VhdlDocGen::isAlias(mdef)) Doxygen::tagFile << "alias"; if (VhdlDocGen::isCompInst(mdef)) Doxygen::tagFile << "configuration"; @@ -1561,7 +1586,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, // *** write type /*VHDL CHANGE */ bool bRec,bUnit; - QCString ltype(mdef->typeString()); + QCString ltype(mdef->typeString()); ltype=ltype.replace(reg," "); QCString largs(mdef->argsString()); largs=largs.replace(reg," "); @@ -1572,7 +1597,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, ClassDef *kl=0; LockingPtr alp = mdef->argumentList(); QCString nn; - + VhdlDocGen::adjustRecordMember(mdef) ; if (gd) gd=0; switch(mm) { @@ -1580,7 +1605,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, VhdlDocGen::writeCodeFragment(mdef,ol); break; case VhdlDocGen::PROCEDURE: - case VhdlDocGen::FUNCTION: + case VhdlDocGen::FUNCTION: ol.startBold(); VhdlDocGen::formatString(ltype,ol,mdef); ol.endBold(); @@ -1598,7 +1623,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, case VhdlDocGen::USE: kl=VhdlDocGen::getClass(mdef->name()); if (kl && ((VhdlDocGen::VhdlClasses)kl->protection()==VhdlDocGen::ENTITYCLASS)) break; - writeLink(mdef,ol); + writeLink(mdef,ol); ol.insertMemberAlign(); ol.docify(" "); @@ -1610,7 +1635,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, ol.docify(" "); QCString name=theTranslator_vhdlType(VhdlDocGen::PACKAGE,TRUE); ol.startBold(); - ol.docify(name.data()); + ol.docify(name.data()); name.resize(0); ol.endBold(); name+=" <"+mdef->name()+">"; @@ -1622,11 +1647,16 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, case VhdlDocGen::LIBRARY: writeLink(mdef,ol); ol.insertMemberAlign(); - break; + if (largs=="context") + { + VhdlDocGen::writeRecorUnit(ltype,ol,mdef); + } + + break; case VhdlDocGen::GENERIC: case VhdlDocGen::PORT: - case VhdlDocGen::ALIAS: + case VhdlDocGen::ALIAS: writeLink(mdef,ol); ol.docify(" "); @@ -1648,17 +1678,28 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, } break; case VhdlDocGen::PROCESS: - writeLink(mdef,ol); + writeLink(mdef,ol); ol.insertMemberAlign(); VhdlDocGen::writeProcessProto(ol,alp.pointer(),mdef); break; case VhdlDocGen::PACKAGE: case VhdlDocGen::ENTITY: case VhdlDocGen::COMPONENT: - case VhdlDocGen::COMPONENT_INST: + case VhdlDocGen::INSTANTIATION: case VhdlDocGen::CONFIG: if (VhdlDocGen::isCompInst(mdef) ) { + nn=largs; + if(nn.stripPrefix("function") || nn.stripPrefix("package")) + { + VhdlDocGen::formatString(largs,ol,mdef); + ol.insertMemberAlign(); + writeLink(mdef,ol); + ol.docify(" "); + VhdlDocGen::formatString(ltype,ol,mdef); + break; + } + largs.prepend("::"); largs.prepend(mdef->name().data()); ol.writeObjectLink(mdef->getReference(), @@ -1676,7 +1717,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, ol.docify(ltype); ol.endBold(); ol.docify(" "); - if (VhdlDocGen::isComponent(mdef) || + if (VhdlDocGen::isComponent(mdef) || VhdlDocGen::isConfig(mdef) || VhdlDocGen::isCompInst(mdef)) { @@ -1690,7 +1731,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, nn=mdef->name(); } kl=getClass(nn.data()); - if (kl) + if (kl) { nn=kl->getOutputFileBase(); ol.pushGeneratorState(); @@ -1709,27 +1750,29 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, ol.endEmphasis(); ol.popGeneratorState(); } - } + } break; - case VhdlDocGen::UCF_CONST: + case VhdlDocGen::UCF_CONST: mm=mdef->name().findRev('_'); - if (mm>0) + if (mm>0) + { mdef->setName(mdef->name().left(mm)); + } writeUCFLink(mdef,ol); break; case VhdlDocGen::SIGNAL: case VhdlDocGen::ATTRIBUTE: case VhdlDocGen::SUBTYPE: - case VhdlDocGen::CONSTANT: - case VhdlDocGen::SHAREDVARIABLE: + case VhdlDocGen::CONSTANT: + case VhdlDocGen::SHAREDVARIABLE: case VhdlDocGen::VFILE: - case VhdlDocGen::GROUP: + case VhdlDocGen::GROUP: writeLink(mdef,ol); ol.docify(" "); ol.insertMemberAlign(); VhdlDocGen::formatString(ltype,ol,mdef); break; - case VhdlDocGen::TYPE: + case VhdlDocGen::TYPE: bRec=largs.stripPrefix("record") ; bUnit=largs.stripPrefix("units") ; ol.startBold(); @@ -1739,12 +1782,12 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, ol.docify("units: "); writeLink(mdef,ol); ol.insertMemberAlign(); - if (!bRec) + if (!bRec) VhdlDocGen::formatString(ltype,ol,mdef); if (bUnit) ol.lineBreak(); if (bRec || bUnit) writeRecorUnit(largs,ol,mdef); - ol.endBold(); + ol.endBold(); break; default: break; @@ -1757,7 +1800,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, } if (!ltype.isEmpty()) ol.docify(" "); - if (htmlOn) + if (htmlOn) { ol.enable(OutputGenerator::Html); } @@ -1776,7 +1819,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, ol.parseDoc(mdef->briefFile(),mdef->briefLine(), mdef->getOuterScope()?mdef->getOuterScope():d, mdef,mdef->briefDescription(),TRUE,FALSE,0,TRUE,FALSE); - if (detailsVisible) + if (detailsVisible) { ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); @@ -1802,7 +1845,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, }// end writeVhdlDeclaration -void VhdlDocGen::writeLink(const MemberDef* mdef,OutputList &ol) +void VhdlDocGen::writeLink(const MemberDef* mdef,OutputList &ol) { ol.writeObjectLink(mdef->getReference(), mdef->getOutputFileBase(), @@ -1823,7 +1866,7 @@ void VhdlDocGen::writePlainVHDLDeclarations( MemberDef *md; MemberListIterator mli(*mlist); for ( ; (md=mli.current()); ++mli ) - { + { int mems=md->getMemberSpecifiers(); if (md->isBriefSectionVisible() && (mems==specifier) && (mems!=VhdlDocGen::LIBRARY) ) { @@ -1840,7 +1883,7 @@ void VhdlDocGen::writePlainVHDLDeclarations( } } //if } //for - if (!first) ol.endMemberList(); + if (!first) ol.endMemberList(); pack.clear(); }//plainDeclaration @@ -1874,19 +1917,19 @@ bool VhdlDocGen::membersHaveSpecificType(MemberList *ml,int type) void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol, ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd, - const char *title,const char *subtitle,bool /*showEnumValues*/,int type) + const char *title,const char *subtitle,bool /*showEnumValues*/,int type) { setGlobalType(ml); if (!membersHaveSpecificType(ml,type)) return; - if (title) + if (title) { ol.startMemberHeader(title); ol.parseText(title); ol.endMemberHeader(); ol.docify(" "); } - if (subtitle && subtitle[0]!=0) + if (subtitle && subtitle[0]!=0) { ol.startMemberSubtitle(); ol.parseDoc("[generated]",-1,0,0,subtitle,FALSE,FALSE,0,TRUE,FALSE); @@ -1929,9 +1972,9 @@ void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol, }// writeVHDLDeclarations /* strips the prefix for record and unit members*/ -void VhdlDocGen::adjustRecordMember(MemberDef *mdef) +void VhdlDocGen::adjustRecordMember(MemberDef *mdef) { //,OutputList & ol) { - QRegExp regg("[_a-zA-Z]"); + QRegExp regg("[_a-zA-Z\"]"); QCString nn=mdef->name(); int j=nn.find(regg,0); if (j>0) @@ -1965,84 +2008,84 @@ QCString VhdlDocGen::trVhdlType(int type,bool sing) { switch(type) { - case VhdlDocGen::LIBRARY: + case VhdlDocGen::LIBRARY: if (sing) return "Library"; - else return "Libraries"; - case VhdlDocGen::PACKAGE: - if (sing) return "Package"; + else return "Libraries"; + case VhdlDocGen::PACKAGE: + if (sing) return "Package"; else return "Packages"; - case VhdlDocGen::SIGNAL: - if (sing) return "Signal"; + case VhdlDocGen::SIGNAL: + if (sing) return "Signal"; else return "Signals"; - case VhdlDocGen::COMPONENT: - if (sing) return "Component"; - else return "Components"; - case VhdlDocGen::CONSTANT: - if (sing) return "Constant"; + case VhdlDocGen::COMPONENT: + if (sing) return "Component"; + else return "Components"; + case VhdlDocGen::CONSTANT: + if (sing) return "Constant"; else return "Constants"; - case VhdlDocGen::ENTITY: - if (sing) return "Entity"; + case VhdlDocGen::ENTITY: + if (sing) return "Entity"; else return "Entities"; - case VhdlDocGen::TYPE: - if (sing) return "Type"; + case VhdlDocGen::TYPE: + if (sing) return "Type"; else return "Types"; - case VhdlDocGen::SUBTYPE: - if (sing) return "Subtype"; + case VhdlDocGen::SUBTYPE: + if (sing) return "Subtype"; else return "Subtypes"; - case VhdlDocGen::FUNCTION: - if (sing) return "Function"; + case VhdlDocGen::FUNCTION: + if (sing) return "Function"; else return "Functions"; - case VhdlDocGen::RECORD: - if (sing) return "Record"; + case VhdlDocGen::RECORD: + if (sing) return "Record"; else return "Records"; - case VhdlDocGen::PROCEDURE: - if (sing) return "Procedure"; - else return "Procedures"; - case VhdlDocGen::ARCHITECTURE: - if (sing) return "Architecture"; + case VhdlDocGen::PROCEDURE: + if (sing) return "Procedure"; + else return "Procedures"; + case VhdlDocGen::ARCHITECTURE: + if (sing) return "Architecture"; else return "Architectures"; - case VhdlDocGen::ATTRIBUTE: - if (sing) return "Attribute"; + case VhdlDocGen::ATTRIBUTE: + if (sing) return "Attribute"; else return "Attributes"; - case VhdlDocGen::PROCESS: - if (sing) return "Process"; + case VhdlDocGen::PROCESS: + if (sing) return "Process"; else return "Processes"; - case VhdlDocGen::PORT: - if (sing) return "Port"; + case VhdlDocGen::PORT: + if (sing) return "Port"; else return "Ports"; - case VhdlDocGen::USE: - if (sing) return "use clause"; + case VhdlDocGen::USE: + if (sing) return "use clause"; else return "Use Clauses"; - case VhdlDocGen::GENERIC: - if (sing) return "Generic"; + case VhdlDocGen::GENERIC: + if (sing) return "Generic"; else return "Generics"; - case VhdlDocGen::PACKAGE_BODY: + case VhdlDocGen::PACKAGE_BODY: return "Package Body"; - case VhdlDocGen::UNITS: - return "Units"; - case VhdlDocGen::SHAREDVARIABLE: - if (sing) return "Shared Variable"; - return "Shared Variables"; - case VhdlDocGen::VFILE: - if (sing) return "File"; - return "Files"; - case VhdlDocGen::GROUP: - if (sing) return "Group"; + case VhdlDocGen::UNITS: + return "Units"; + case VhdlDocGen::SHAREDVARIABLE: + if (sing) return "Shared Variable"; + return "Shared Variables"; + case VhdlDocGen::VFILE: + if (sing) return "File"; + return "Files"; + case VhdlDocGen::GROUP: + if (sing) return "Group"; return "Groups"; - case VhdlDocGen::COMPONENT_INST: - if (sing) return "Component Instantiation"; - else return "Component Instantiations"; - case VhdlDocGen::ALIAS: - if (sing) return "Alias"; + case VhdlDocGen::INSTANTIATION: + if (sing) return "Instantiation"; + else return "Instantiations"; + case VhdlDocGen::ALIAS: + if (sing) return "Alias"; return "Aliases"; - case VhdlDocGen::CONFIG: - if (sing) return "Configuration"; + case VhdlDocGen::CONFIG: + if (sing) return "Configuration"; return "Configurations"; case VhdlDocGen::MISCELLANEOUS: - return "Miscellaneous"; - case VhdlDocGen::UCF_CONST: + return "Miscellaneous"; + case VhdlDocGen::UCF_CONST: return "Constraints"; - default: + default: return "Class"; } } @@ -2065,7 +2108,7 @@ QCString VhdlDocGen::trDesignUnitMembers() QCString VhdlDocGen::trDesignUnitListDescription() { return "Here is a list of all design unit members with links to " - "the Entities they belong to:"; + "the Entities they belong to:"; } QCString VhdlDocGen::trDesignUnitIndex() @@ -2093,11 +2136,11 @@ bool VhdlDocGen::foundInsertedComponent(const QCString & name,Entry* root) { QListIterator bii(*root->extends); BaseInfo *bi=0; - for (bii.toFirst();(bi=bii.current());++bii) + for (bii.toFirst();(bi=bii.current());++bii) { if (bi->name==name) { - return TRUE; // + return TRUE; // } } @@ -2108,24 +2151,24 @@ bool VhdlDocGen::foundInsertedComponent(const QCString & name,Entry* root) void VhdlDocGen::writeStringLink(const MemberDef *mdef,QCString mem, OutputList& ol) { - if (mdef) + if (mdef) { ClassDef *cd=mdef->getClassDef(); if (cd) - { - QCString n=cd->name(); + { + QCString n=cd->name(); MemberDef* memdef=VhdlDocGen::findMember(n,mem); - if (memdef && memdef->isLinkable()) - { + if (memdef && memdef->isLinkable()) + { ol.startBold(); - writeLink(memdef,ol); + writeLink(memdef,ol); ol.endBold(); ol.docify(" "); return; } } } - VhdlDocGen::startFonts(mem,"vhdlchar",ol); + VhdlDocGen::startFonts(mem,"vhdlchar",ol); }// found component void VhdlDocGen::writeCodeFragment( MemberDef *mdef,OutputList& ol) @@ -2142,12 +2185,12 @@ void VhdlDocGen::writeCodeFragment( MemberDef *mdef,OutputList& ol) writeLink(mdef,ol); ol.docify(" "); ol.insertMemberAlign(); - int len= qsl.count(); + int len= qsl.count(); for(int j=0;jgetStartBodyLine(); QStringList qsl=QStringList::split("\n",codeFragment); ol.startCodeFragment(); - int len = qsl.count(); + int len = qsl.count(); QCString lineNumber; int j; for (j=0;jbodyLine=line; current->fileName=fileName; current->type="ucf_const"; - //if (!bo) + //if (!bo) //current->args=type; current->args+=qcs; current->lang= SrcLangExt_VHDL ; - // adding dummy name for constraints like VOLTAGE=5,TEMPERATURE=20 C + // adding dummy name for constraints like VOLTAGE=5,TEMPERATURE=20 C if (n.isEmpty()) { n="dummy"; @@ -2350,7 +2393,7 @@ QCString VhdlDocGen::splitString(QCString& str, char c) { QCString n=str; int i=str.find(c); - if (i>0) + if (i>0) { n=str.left(i); str=str.remove(0,i+1); @@ -2366,15 +2409,15 @@ bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne) LayoutNavEntry *kk = lne->parent();// find(LayoutNavEntry::Files); // LayoutNavEntry *kks = kk->parent();// find(LayoutNavEntry::Files); QCString file; - QCString co("Constraint File"); + QCString co("Constraints"); while (fn) { FileDef *fd=fn->first(); if (fd->name().contains(".ucf") || fd->name().contains(".qsf")) { file = convertNameToFile(fd->name().data(),FALSE,FALSE); - LayoutNavEntry *ucf=new LayoutNavEntry(lne,LayoutNavEntry::MainPage,TRUE,file,co,""); - kk->addChild(ucf); + LayoutNavEntry *ucf=new LayoutNavEntry(lne,LayoutNavEntry::MainPage,TRUE,file,co,""); + kk->addChild(ucf); break; } fn=Doxygen::inputNameList->next(); @@ -2383,9 +2426,9 @@ bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne) } void VhdlDocGen::writeAlphbeticalClass(OutputList& ol,const ClassDef* cd,const QCString & cname) -{ +{ if (cname.contains("::")==0) - { + { ClassDef*oo= VhdlDocGen::findArchitecture(cd); ol.writeObjectLink(cd->getReference(), cd->getOutputFileBase(),0,cname); @@ -2407,7 +2450,7 @@ QCString VhdlDocGen::parseForConfig(QCString & entity,QCString & arch) { int index; QCString label; - QCString ent("entity"); + QCString ent("entity"); if (!entity.contains(":")) return ""; QRegExp exp("[:()\\s]"); @@ -2469,13 +2512,13 @@ ClassDef* VhdlDocGen::findArchitecture(QCString identifier, QCString entity_nam //@param arch bit0:flipflop -//@param binding e.g entity work.foo(bar) -//@param label |label0|label1 -// label0:architecture name -//@param confVhdl of configuration file (identifier::entity_name) or +//@param binding e.g entity work.foo(bar) +//@param label |label0|label1 +// label0:architecture name +//@param confVhdl of configuration file (identifier::entity_name) or // the architecture if isInlineConf TRUE -//@param isInlineConf -//@param confN List of configurations +//@param isInlineConf +//@param confN List of configurations void assignBinding(ConfNode * conf,QCString label) { @@ -2518,7 +2561,7 @@ void assignBinding(ConfNode * conf,QCString label) if (!conf->isInlineConf && (archName!=cur->args)) continue; - if (cur->exception==label || conf->isInlineConf) + if (cur->exception==label || conf->isInlineConf) { QCString sign,archy; @@ -2543,10 +2586,10 @@ void assignBinding(ConfNode * conf,QCString label) arch1=ent1+"::"+arch1; //ClassDef *archBind=Doxygen::classSDict->find(arch1.data()); ClassDef *ent=Doxygen::classSDict->find(ent1.data()); - QCString inst=VhdlDocGen::getIndexWord(cur->args.data(),0); + QCString inst=VhdlDocGen::getIndexWord(cur->args.data(),0); ClassDef *cd=Doxygen::classSDict->find(inst.data()); - if (cd==0 || ent==0) + if (cd==0 || ent==0) continue; addInstance(ent,archClass,cd,cur); @@ -2582,19 +2625,19 @@ void assignConfiguration(ConfNode* rootNode,QCString label) /* // file foo.vhd -// enitity foo +// enitity foo // ..... // end entity -// file foo_arch.vhd +// file foo_arch.vhd // architecture xxx of foo is -// ........ +// ........ // end architecture */ void VhdlDocGen::computeVhdlComponentRelations() { - + QCString entity,inst,arch,vhd; QList confList = getVhdlConfiguration(); @@ -2623,11 +2666,11 @@ void VhdlDocGen::computeVhdlComponentRelations() entity=cur->type; } ClassDef *classEntity=Doxygen::classSDict->find(entity); - inst=VhdlDocGen::getIndexWord(cur->args.data(),0); + inst=VhdlDocGen::getIndexWord(cur->args.data(),0); ClassDef *cd=Doxygen::classSDict->find(inst); ClassDef *ar=Doxygen::classSDict->find(cur->args); - if (cd==0 || classEntity==0 ) + if (cd==0 || classEntity==0 ) continue; addInstance(classEntity,ar,cd,cur); @@ -2635,7 +2678,7 @@ void VhdlDocGen::computeVhdlComponentRelations() } } -static void addInstance(ClassDef* classEntity, ClassDef* ar, +static void addInstance(ClassDef* classEntity, ClassDef* ar, ClassDef *cd , Entry *cur,ClassDef* /*archBind*/) { @@ -2658,18 +2701,18 @@ static void addInstance(ClassDef* classEntity, ClassDef* ar, if (ar==0) return; QCString uu=cur->name; MemberDef *md=new MemberDef( - ar->getDefFileName(), cur->startLine, + ar->getDefFileName(), cur->startLine, cur->type,uu,uu, 0, Public, Normal, cur->stat,Member, MemberDef::Variable, 0, 0); md->setLanguage(SrcLangExt_VHDL); - md->setMemberSpecifiers(VhdlDocGen::COMPONENT_INST); + md->setMemberSpecifiers(VhdlDocGen::INSTANTIATION); md->setBriefDescription(cur->brief,cur->briefFile,cur->briefLine); md->setBodySegment(cur->startLine,-1) ; FileDef *fd=ar->getFileDef(); - md->setBodyDef(fd); + md->setBodyDef(fd); ar->insertMember(md); // printf("\nMemberreference [%p]",md); } @@ -2688,7 +2731,7 @@ void VhdlDocGen::writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDe void VhdlDocGen::writeRecUnitDocu( - const MemberDef *md, + const MemberDef *md, OutputList& ol, QCString largs ) @@ -2696,14 +2739,14 @@ void VhdlDocGen::writeRecUnitDocu( QStringList ql=QStringList::split("#",largs,FALSE); uint len=ql.count(); - ol.startParameterList(TRUE); + ol.startParameterList(TRUE); bool first=TRUE; for(uint i=0;i1) + if ((len-i)>1) { ol.endParameterName(FALSE,FALSE,FALSE); } @@ -2720,7 +2763,7 @@ void VhdlDocGen::writeCodeFragment(OutputList& ol,int start, QCString & codeFrag { QStringList qsl=QStringList::split("\n",codeFragment); ol.startCodeFragment(); - int len = qsl.count(); + int len = qsl.count(); QCString lineNumber; int j; for (j=0;jgetMemberSpecifiers()==VhdlDocGen::UCF_CONST; } static bool isConfig(const MemberDef *mdef) @@ -189,9 +182,9 @@ class VhdlDocGen static bool isGroup(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::GROUP; } static bool isCompInst(const MemberDef *mdef) - { return mdef->getMemberSpecifiers()==VhdlDocGen::COMPONENT_INST; } -static bool isMisc(const MemberDef *mdef) -{ return mdef->getMemberSpecifiers()==VhdlDocGen::MISCELLANEOUS; } + { return mdef->getMemberSpecifiers()==VhdlDocGen::INSTANTIATION; } + static bool isMisc(const MemberDef *mdef) + { return mdef->getMemberSpecifiers()==VhdlDocGen::MISCELLANEOUS; } //----------------------------------------------------- // translatable items @@ -220,24 +213,18 @@ static bool isMisc(const MemberDef *mdef) // trFunctions static QCString trFunctionAndProc(); - //----------------------------------------------------- static void prepareComment(QCString&); - - - - static void formatString(QCString&,OutputList& ol,const MemberDef*); + static void formatString(const QCString&,OutputList& ol,const MemberDef*); - static void writeFormatString(QCString&,OutputList& ol,const MemberDef*); + static void writeFormatString(const QCString&,OutputList& ol,const MemberDef*); static void writeFunctionProto(OutputList& ol,const ArgumentList *al,const MemberDef*); static void writeProcessProto(OutputList& ol,const ArgumentList *al,const MemberDef*); static void writeProcedureProto(OutputList& ol, const ArgumentList *al,const MemberDef*); static void writeFuncProcDocu(const MemberDef *mdef, OutputList& ol,const ArgumentList* al,bool type=false); static void writeRecordProto(const MemberDef *mdef, OutputList& ol,const ArgumentList *al); - - static void writeVHDLTypeDocumentation(const MemberDef* mdef, const Definition* d, OutputList &ol); static void writeVhdlDeclarations(MemberList*,OutputList&,GroupDef*,ClassDef*,FileDef*,NamespaceDef*); @@ -272,7 +259,6 @@ static bool isMisc(const MemberDef *mdef) static QCString splitString(QCString & str, char c); static void parseUCF(const char* input,Entry* entity,QCString f,bool vendor); - static bool findConstraintFile( LayoutNavEntry *lne); static ClassDef* findArchitecture(const ClassDef *cd); @@ -284,16 +270,16 @@ static bool isMisc(const MemberDef *mdef) static void writeSource(MemberDef *mdef,OutputList& ol,QCString & cname); static void writeAlphbeticalClass(OutputList& ol,const ClassDef* cd,const QCString &); + static QCString parseForConfig(QCString & entity,QCString & arch); + static QCString parseForBinding(QCString & entity,QCString & arch); - static QCString parseForConfig(QCString & entity,QCString & arch); - static QCString parseForBinding(QCString & entity,QCString & arch); private: static void findAllArchitectures(QList& ql,const ClassDef *cd); static bool compareArgList(ArgumentList*,ArgumentList*); static void writeVhdlLink(const ClassDef* cdd ,OutputList& ol,QCString& type,QCString& name,QCString& beh); static void writeStringLink(const MemberDef *mdef,QCString mem,OutputList& ol); - static void writeRecUnitDocu( const MemberDef *md, OutputList& ol,QCString largs); - static void writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDef *mdef); + static void writeRecUnitDocu( const MemberDef *md, OutputList& ol,QCString largs); + static void writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDef *mdef); }; #endif diff --git a/src/vhdlparser.y b/src/vhdlparser.y index d86bbff..1389f23 100644 --- a/src/vhdlparser.y +++ b/src/vhdlparser.y @@ -1,5 +1,5 @@ -/********************************************************************************************* +/********************************************************************************************* * The original was a VHDL parser description to be used with GMD Compiler * Tool Box * written from: @@ -14,13 +14,13 @@ * author of YACC transformation: * Thomas Dettmer * Dortmund University - * Dept. of Computer Scienc, LS1 + * Dept. of Computer Scienc, LS1 * PB 500 500 * D-44221 Dortmund (Germany) * Phone: +49-231-755-6464 * e-mail: dettmer@ls1.informatik.uni-dortmund.de ***************************************************************** - * + * * This file is intended not to be used for commercial purposes * without permission of the University of Twente and permission * of the University of Dortmund @@ -29,9 +29,9 @@ * OR ANYTHING ELSE. * *******************************************************/ -/****************************************************************************** +/****************************************************************************** * modified for doxygen by M. Kreis - * extended to VHDL 93/2002/2008 + * extended to VHDL 93/2002/2008 ******************************************************************************/ @@ -43,12 +43,12 @@ #ifndef YYSTYPE typedef int YYSTYPE; #endif - + struct YYMM { - int itype; + int itype; QCString qstr; -}; +}; // define struct instead of union #define YYSTYPE YYMM @@ -84,6 +84,12 @@ static ConfNode* currNode; static int currP=0; +enum { GEN_SEC=0x1, PARAM_SEC,CONTEXT_SEC,PROTECTED_SEC } ; + +static int param_sec = 0; +static int parse_sec=0; + + //---------------------------- function -------------------------------------------------------------------------------- int vhdlScanYYlex (); @@ -101,9 +107,9 @@ static bool isFuncProcProced(); static void popConfig(); static void pushLabel(QCString label); static void popLabel(); -static void addConfigureNode(const char* a,const char*b, +static void addConfigureNode(const char* a,const char*b, bool isRoot,bool isLeave,bool inlineConf=FALSE); -static bool addLibUseClause(const QCString &type); +//static bool addLibUseClause(const QCString &type); static bool isFuncProcProced(); static void initEntry(Entry *e); static void addProto(const char *s1,const char *s2,const char *s3, @@ -232,11 +238,11 @@ t_GROUP t_POSTPONED t_SHARED t_XNOR -t_SLL -t_SRA -t_SLA +t_SLL +t_SRA +t_SLA t_SRL -t_ROR +t_ROR t_ROL t_UNAFFECTED /*============== VHDL 2008 keywords ======================= */ @@ -279,13 +285,13 @@ t_QNEQU %nonassoc t_EQSym t_NESym t_LTSym t_LESym t_GTSym t_GESym t_QNEQU t_QEQU t_QL t_QG t_QLT t_QGT %left t_Plus t_Minus t_Ampersand %left MED_PRECEDENCE -%left t_Star t_Slash t_MOD t_REM -%nonassoc t_DoubleStar t_ABS t_NOT MAX_PRECEDENCE +%left t_Star t_Slash t_MOD t_REM +%nonassoc t_DoubleStar t_ABS t_NOT MAX_PRECEDENCE /* misc syms */ /*t_Space */ -%token +%token t_Apostrophe t_LeftParen t_RightParen @@ -303,28 +309,34 @@ t_Neg t_LEFTBR t_RIGHTBR t_ToolDir - + %type designator literal enumeration_literal physical_literal physical_literal_no_default physical_literal_1 -%type lib_clause use_clause sel_list entity_decl entity_start entity_decl_2 entity_decl_1 arch_body arch_start arch_body_1 -%type config_decl config_start config_decl_2 config_decl_1 config_decl_3 package_decl package_start package_body pack_body_start package_body_2 package_body_1 common_decltve_item +%type lib_clause use_clause sel_list entity_decl entity_start entity_decl_2 entity_decl_1 arch_body arch_start arch_body_1 +%type config_decl config_start config_decl_2 config_decl_1 config_decl_3 package_decl package_start package_body pack_body_start package_body_2 package_body_1 common_decltve_item %type config_decltve_item subprog_decl subprog_body interf_list interf_element interf_element_4 interf_element_3 interf_element_2 interf_element_1 mode -%type association_list association_list_1 association_list_2 gen_association_list gen_association_list_1 gen_association_list_2 association_element gen_association_element formal_part actual_part mark expr and_relation relation primary name name2 sel_name suffix ifts_name -%type attribute_name aggregate element_association_list2 qualified_expr element_association choices choices_1 choices_2 choice type_decl type_decl_1 type_definition enumeration_type_definition enumeration_type_definition_1 enumeration_type_definition_2 physical_type_definition physical_type_definition_1 physical_type_definition_2 base_unit_decl secondary_unit_decl unconstrained_array_definition unconstrained_array_definition_1 unconstrained_array_definition_2 index_subtype_definition constrained_array_definition record_type_definition record_type_definition_1 record_type_definition_2 element_decl -%type access_type_definition file_type_definition subtype_decl subtype_indic subtype_indic_1 subtype_indic1 subtype_indic1_1 range_constraint index_constraint index_constraint_1 index_constraint_2 discrete_range discrete_range1 range_spec direction constant_decl constant_decl_1 signal_decl signal_decl_2 signal_decl_1 variable_decl variable_decl_1 object_class signal_kind alias_decl file_decl file_decl_1 attribute_decl attribute_spec entity_spec entity_name_list entity_name_list_1 -%type entity_name_list_2 entity_class block_stat -%type generate_stat generate_stat_1 procs_stat procs_stat1 procs_stat1_1 sensitivity_list sensitivity_list_1 sensitivity_list_2 -%type procedure_call_stat comp_decl comp_decl_2 comp_decl_1 block_config block_config_2 block_config_3 block_config_1 block_config_4 block_spec config_item comp_config comp_config_2 comp_config_1 config_spec binding_indic comp_spec -%type inst_list entity_aspect idf_list procs_stat1_6 +%type association_list association_list_1 association_list_2 gen_association_list gen_association_list_1 gen_association_list_2 association_element gen_association_element formal_part actual_part mark expr and_relation relation primary name name2 sel_name suffix ifts_name +%type attribute_name aggregate element_association_list2 qualified_expr element_association choices choices_1 choices_2 choice type_decl type_decl_1 type_definition enumeration_type_definition enumeration_type_definition_1 enumeration_type_definition_2 physical_type_definition physical_type_definition_1 physical_type_definition_2 base_unit_decl secondary_unit_decl unconstrained_array_definition unconstrained_array_definition_1 unconstrained_array_definition_2 index_subtype_definition constrained_array_definition record_type_definition record_type_definition_1 record_type_definition_2 element_decl +%type access_type_definition file_type_definition subtype_decl subtype_indic subtype_indic_1 subtype_indic1 subtype_indic1_1 range_constraint index_constraint index_constraint_1 index_constraint_2 discrete_range discrete_range1 range_spec direction constant_decl constant_decl_1 signal_decl signal_decl_2 signal_decl_1 variable_decl variable_decl_1 object_class signal_kind alias_decl file_decl file_decl_1 attribute_decl attribute_spec entity_spec entity_name_list entity_name_list_1 +%type entity_name_list_2 entity_class block_stat +%type generate_stat generate_stat_1 procs_stat procs_stat1 procs_stat1_1 sensitivity_list sensitivity_list_1 sensitivity_list_2 +%type procedure_call_stat comp_decl comp_decl_2 comp_decl_1 block_config block_config_2 block_config_3 block_config_1 block_config_4 block_spec config_item comp_config comp_config_2 comp_config_1 config_spec binding_indic comp_spec +%type inst_list entity_aspect idf_list procs_stat1_6 %type t_Identifier t_StringLit t_BitStringLit t_AbstractLit t_CharacterLit tbox group_name record_type_simple_name %type entity_class_entry_list entity_class_entry group_constituent_list group_constituent group_declaration group_template_declaration %type procs_stat1_5 comp_1 mark_comp dot_name fi_dec multiplying_operator factor term adding_op -%type simple_exp alias_spec sigma signature1 mark_stats mark_stats_1 signature -%type protected_type_body protected_type_declaration alias_name_stat vcomp_stat comp_spec_stat +%type simple_exp alias_spec sigma signature1 mark_stats mark_stats_1 signature +%type protected_type_body protected_type_declaration alias_name_stat vcomp_stat comp_spec_stat +%type sig_stat external_name absolute_pathname relative_pathname package_path_name external_pathname pathname_element_list neg_list pathname_element + +%type func_name return_is param func_prec iproc ifunc interface_subprogram_decl interface_package_decl package_instantiation_decl +%type subprogram_instantiation_decl +%type context_ref libustcont_stats libustcont_stat context_decl + %debug // for debugging set yydebug=1 -%initial-action { yydebug=0; } +%initial-action { yydebug=0; } %expect 2 @@ -336,78 +348,84 @@ start: design_file design_file : design_unit_list - + design_unit_list: design_unit - | design_unit_list design_unit - ; - -designator : t_Identifier {$$=$1;} - | t_StringLit {$$=$1;} - ; - -literal : t_AbstractLit {$$=$1;} - | t_CharacterLit {$$=$1;} - | t_BitStringLit {$$=$1;} - | physical_literal_no_default {$$=$1;} - | t_NULL {$$="null";} - ; + | design_unit_list design_unit + ; -enumeration_literal : t_CharacterLit {$$=$1;} - | t_Identifier {$$=$1;} +designator : t_Identifier { $$=$1; } + | t_StringLit { $$=$1; } + ; -physical_literal : physical_literal_1 t_Identifier {$$=$1+" "+$2;} +literal : t_AbstractLit { $$=$1; } + | t_CharacterLit { $$=$1; } + | t_BitStringLit { $$=$1; } + | physical_literal_no_default { $$=$1; } + | t_NULL { $$="null"; } + ; -physical_literal_1 : /* empty */ {$$="";} - | t_AbstractLit {$$=$1;} +enumeration_literal : t_CharacterLit { $$=$1; } + | t_Identifier { $$=$1; } -physical_literal_no_default : t_AbstractLit t_Identifier {$$=$1+" "+$2;} +physical_literal : physical_literal_1 t_Identifier { $$=$1+" "+$2; } -idf_list : t_Identifier {$$=$1;} - | idf_list t_Comma t_Identifier {$$=$1+","+$3} - ; +physical_literal_1 : /* empty */ { $$=""; } + | t_AbstractLit { $$=$1; } + +physical_literal_no_default : t_AbstractLit t_Identifier { $$=$1+" "+$2; } + +idf_list : t_Identifier { $$=$1; } + | idf_list t_Comma t_Identifier { $$=$1+","+$3} + ; /*------------------------------------------ -- Desing Unit --------------------------------------------*/ - design_unit : context_list lib_unit - - context_list : /* empty */ - | context_list context_item +design_unit : context_list lib_unit - lib_unit : entity_decl - | config_decl - | package_decl - | arch_body - | package_body +context_list : /* empty */ + | context_list context_item + +lib_unit : entity_decl + | config_decl + | package_decl + | arch_body + | package_body | context_decl | package_instantiation_decl ; - -context_item : lib_clause - | use_clause - ; - -lib_clause : t_LIBRARY idf_list t_Semicolon -{ - if (addLibUseClause($2)) - addVhdlType($2,getParsedLine(t_LIBRARY),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,$2.data(),0); -} -use_clause : t_USE sel_list t_Semicolon - { - QStringList ql1=QStringList::split(",",$2,FALSE); - for (uint j=0;jsection=Entry::NAMESPACE_SEC; clone->spec=VhdlDocGen::PACKAGE; clone->name=$2; - clone->startLine= getParsedLine(t_PACKAGE); - clone->bodyLine= getParsedLine(t_PACKAGE); - + int line=s_str.iLine; + clone->startLine=line; + clone->bodyLine=line; + clone->protection=Package; current_root->addSubEntry(clone); - - - addVhdlType($2,getParsedLine(t_PACKAGE),Entry::CLASS_SEC,VhdlDocGen::PACKAGE,0,0,Package); + + + addVhdlType($2,line,Entry::CLASS_SEC,VhdlDocGen::PACKAGE,0,0,Package); //fprintf(stderr,"\n entiy %s : at line %d",$$.data(),s_str.yyLineNr); } -package_decl_2 : /* empty */ -package_decl_2 : t_Identifier {lastCompound=0;} -package_decl_2 : t_PACKAGE t_Identifier {lastCompound=0;} -package_decl_2 : t_PACKAGE {lastCompound=0;} - -package_decl_1 : /* empty */ +package_decl_2 : /* empty */ +package_decl_2 : t_Identifier { lastCompound=0; } +package_decl_2 : t_PACKAGE t_Identifier { lastCompound=0; } +package_decl_2 : t_PACKAGE { lastCompound=0; } + +package_decl_1 : /* empty */ package_decl_1 : package_decl_22 -package_decl_1 : package_decl_1 package_decl_3 -package_decl_3 : package_decltve_item +package_decl_1 : package_decl_1 package_decl_3 +package_decl_3 : package_decltve_item package_decl_22: gen_interface_list t_Semicolon package_decl_22: gen_interface_list package_decl_22: gen_interface_list gen_assoc_list package_decl_22: gen_interface_list gen_assoc_list t_Semicolon -package_body : pack_body_start error t_END package_body_2 t_Semicolon -package_body : pack_body_start package_body_1 t_END package_body_2 t_Semicolon -pack_body_start : t_PACKAGE t_BODY t_Identifier t_IS +package_body : pack_body_start error t_END package_body_2 t_Semicolon +package_body : pack_body_start package_body_1 t_END package_body_2 t_Semicolon +pack_body_start : t_PACKAGE t_BODY t_Identifier t_IS { $$=$3; lastCompound=current; $$.prepend("_"); addVhdlType($$,getParsedLine(t_PACKAGE) ,Entry::CLASS_SEC,VhdlDocGen::PACKAGE_BODY,0,0,Protected); } -package_body_2 : /* empty */ {$$="";lastCompound=0;} -package_body_2 : t_Identifier {lastCompound=0;} -package_body_2 : t_PACKAGE t_BODY {lastCompound=0;} -package_body_2 : t_PACKAGE t_BODY t_Identifier {lastCompound=0;} +package_body_2 : /* empty */ { $$="";lastCompound=0; } +package_body_2 : t_Identifier { lastCompound=0; } +package_body_2 : t_PACKAGE t_BODY { lastCompound=0; } +package_body_2 : t_PACKAGE t_BODY t_Identifier { lastCompound=0; } -package_body_1 : /* empty */ {$$="";} -package_body_1 : package_body_1 package_body_3 -package_body_3 : package_body_decltve_item +package_body_1 : /* empty */ { $$=""; } +package_body_1 : package_body_1 package_body_3 +package_body_3 : package_body_decltve_item @@ -556,229 +574,280 @@ package_body_3 : package_body_decltve_item -- Declarative Item --------------------------------------------*/ -common_decltve_item_1 : package_decl -common_decltve_item_1 : package_instantiation_decl -common_decltve_item_1 : package_body -common_decltve_item_1 : subprogram_instantiation_decl - - -common_decltve_item : type_decl -common_decltve_item : subtype_decl -common_decltve_item : constant_decl -common_decltve_item : file_decl -common_decltve_item : alias_decl -common_decltve_item : subprog_decl -common_decltve_item : use_clause - -entity_decltve_item : common_decltve_item -entity_decltve_item : subprog_body -entity_decltve_item : attribute_decl -entity_decltve_item : attribute_spec -entity_decltve_item : disconnection_spec -entity_decltve_item : signal_decl -entity_decltve_item : variable_decl -entity_decltve_item : group_template_declaration -entity_decltve_item : group_declaration -entity_decltve_item : common_decltve_item_1 - - -block_decltve_item : common_decltve_item -block_decltve_item : subprog_body -block_decltve_item : comp_decl -block_decltve_item : attribute_decl -block_decltve_item : attribute_spec -block_decltve_item : config_spec -block_decltve_item : disconnection_spec -block_decltve_item : signal_decl -block_decltve_item : variable_decl -block_decltve_item : group_template_declaration -block_decltve_item : group_declaration -block_decltve_item : common_decltve_item_1 -block_decltve_item : tool_directive -block_declarative_part : block_decltve_item - | block_declarative_part block_decltve_item - - -package_decltve_item : common_decltve_item -package_decltve_item : comp_decl -package_decltve_item : attribute_decl -package_decltve_item : attribute_spec -package_decltve_item : disconnection_spec -package_decltve_item : signal_decl -package_decltve_item : variable_decl -package_decltve_item : group_template_declaration - package_decltve_item : group_declaration - package_decltve_item : package_decl - package_decltve_item : package_instantiation_decl - package_decltve_item : subprogram_instantiation_decl - -package_body_decltve_item : common_decltve_item -package_body_decltve_item : subprog_body -package_body_decltve_item : variable_decl -package_body_decltve_item : group_template_declaration -package_body_decltve_item : group_declaration -package_body_decltve_item :attribute_decl -package_body_decltve_item :attribute_spec -package_body_decltve_item : common_decltve_item_1 - -subprog_decltve_item : common_decltve_item -subprog_decltve_item : subprog_body -subprog_decltve_item : attribute_decl -subprog_decltve_item : attribute_spec -subprog_decltve_item : variable_decl -subprog_decltve_item : group_template_declaration -subprog_decltve_item : group_declaration -subprog_decltve_item : common_decltve_item_1 - -procs_decltve_item : common_decltve_item -procs_decltve_item : subprog_body -procs_decltve_item : attribute_decl -procs_decltve_item : attribute_spec -procs_decltve_item : variable_decl -procs_decltve_item : group_template_declaration -procs_decltve_item : group_declaration -procs_decltve_item : common_decltve_item_1 - -config_decltve_item : attribute_spec { $$=$1;} -config_decltve_item : use_clause { $$=$1;} -config_decltve_item : group_declaration { $$=$1;} -config_decltve_item: t_USE t_VUNIT idf_list t_Semicolon { $$=$3;} +common_decltve_item_1: package_decl +common_decltve_item_1: package_instantiation_decl +common_decltve_item_1: package_body +common_decltve_item_1: subprogram_instantiation_decl + + +common_decltve_item: type_decl +common_decltve_item: subtype_decl +common_decltve_item: constant_decl +common_decltve_item: file_decl +common_decltve_item: alias_decl +common_decltve_item: subprog_decl +common_decltve_item: use_clause + +entity_decltve_item: common_decltve_item +entity_decltve_item: subprog_body +entity_decltve_item: attribute_decl +entity_decltve_item: attribute_spec +entity_decltve_item: disconnection_spec +entity_decltve_item: signal_decl +entity_decltve_item: variable_decl +entity_decltve_item: group_template_declaration +entity_decltve_item: group_declaration +entity_decltve_item: common_decltve_item_1 + + +block_decltve_item: common_decltve_item +block_decltve_item: subprog_body +block_decltve_item: comp_decl +block_decltve_item: attribute_decl +block_decltve_item: attribute_spec +block_decltve_item: config_spec +block_decltve_item: disconnection_spec +block_decltve_item: signal_decl +block_decltve_item: variable_decl +block_decltve_item: group_template_declaration +block_decltve_item: group_declaration +block_decltve_item: common_decltve_item_1 +block_decltve_item: tool_directive + +block_declarative_part: block_decltve_item + | block_declarative_part block_decltve_item + + +package_decltve_item: common_decltve_item +package_decltve_item: comp_decl +package_decltve_item: attribute_decl +package_decltve_item: attribute_spec +package_decltve_item: disconnection_spec +package_decltve_item: signal_decl +package_decltve_item: variable_decl +package_decltve_item: group_template_declaration +package_decltve_item: group_declaration +package_decltve_item: package_decl +package_decltve_item: package_instantiation_decl +package_decltve_item: subprogram_instantiation_decl + +package_body_decltve_item: common_decltve_item +package_body_decltve_item: subprog_body +package_body_decltve_item: variable_decl +package_body_decltve_item: group_template_declaration +package_body_decltve_item: group_declaration +package_body_decltve_item: attribute_decl +package_body_decltve_item: attribute_spec +package_body_decltve_item: common_decltve_item_1 + +subprog_decltve_item: common_decltve_item +subprog_decltve_item: subprog_body +subprog_decltve_item: attribute_decl +subprog_decltve_item: attribute_spec +subprog_decltve_item: variable_decl +subprog_decltve_item: group_template_declaration +subprog_decltve_item: group_declaration +subprog_decltve_item: common_decltve_item_1 + +procs_decltve_item: common_decltve_item +procs_decltve_item: subprog_body +procs_decltve_item: attribute_decl +procs_decltve_item: attribute_spec +procs_decltve_item: variable_decl +procs_decltve_item: group_template_declaration +procs_decltve_item: group_declaration +procs_decltve_item: common_decltve_item_1 + +config_decltve_item: attribute_spec { $$=$1; } +config_decltve_item: use_clause { $$=$1; } +config_decltve_item: group_declaration { $$=$1; } +config_decltve_item: t_USE t_VUNIT idf_list t_Semicolon { $$=$3; } /*------------------------------------------ -- Subprograms --------------------------------------------*/ -func_prec: t_PURE -func_prec: t_IMPURE - -subprog_decl : subprog_spec t_Semicolon {currP=0;} - -subprog_spec : t_PROCEDURE t_Identifier {currP=VhdlDocGen::PROCEDURE; createFunction($2,currP,0); } subprog_spec_1 { newEntry(); } -subprog_spec : func_prec t_FUNCTION designator subprog_spec_2 t_RETURN mark -subprog_spec : t_FUNCTION designator -{ - currP=VhdlDocGen::FUNCTION; - createFunction(0,currP,$2.data()); -} subprog_spec_2 t_RETURN mark -{ - tempEntry=current; - current->type=$6; - newEntry(); -} +func_prec: t_PURE { $$="pure"; } +func_prec: t_IMPURE { $$="impure"; } + +subprog_decl: subprog_spec t_Semicolon { currP=0; } + +subprog_spec: t_PROCEDURE t_Identifier + { currP=VhdlDocGen::PROCEDURE; createFunction($2,currP,0); } + subprog_spec_1 { newEntry(); } +subprog_spec: func_prec t_FUNCTION designator + { + currP=VhdlDocGen::FUNCTION; + createFunction($1,currP,$3.data()); + } + subprog_spec_2 t_RETURN mark + { + tempEntry=current; + current->type=$7; + newEntry(); + } + +subprog_spec : t_FUNCTION designator + { + currP=VhdlDocGen::FUNCTION; + createFunction(0,currP,$2.data()); + } + subprog_spec_2 t_RETURN mark + { + tempEntry=current; + current->type=$6; + newEntry(); + } subprog_spec_22: gen_interface_list subprog_spec_22: gen_interface_list gen_assoc_list -subprog_spec_33: t_PARAMETER interf_list -subprog_spec_33: interf_list +subprog_spec_33: t_PARAMETER + { param_sec=PARAM_SEC; } + interf_list + { param_sec= 0; } +subprog_spec_33: { param_sec=PARAM_SEC; } + interf_list + { param_sec= 0; } -subprog_spec_2 : /* empty */ -subprog_spec_2 : subprog_spec_22 subprog_spec_33 -subprog_spec_2 : subprog_spec_33 -subprog_spec_2 : subprog_spec_22 - -subprog_spec_1 : subprog_spec_2 +subprog_spec_2: /* empty */ +subprog_spec_2: subprog_spec_22 subprog_spec_33 +subprog_spec_2: subprog_spec_33 +subprog_spec_2: subprog_spec_22 -subprog_body : subprog_spec t_IS subprog_body_1 t_BEGIN seq_stats t_END subprog_body_2 t_Semicolon -{ - currP=0; -} -subprog_body : subprog_spec t_IS error t_END subprog_body_2 t_Semicolon -{ - currP=0; -} -subprog_body_2 : /* empty */ -subprog_body_2 : designator -subprog_body_2 : t_FUNCTION -subprog_body_2 : t_PROCEDURE -subprog_body_2 : t_PROCEDURE t_Identifier -subprog_body_2 : t_FUNCTION t_Identifier -subprog_body_2 : t_FUNCTION t_STRING - - -subprog_body_1 : /* empty */ +subprog_spec_1: subprog_spec_2 + +subprog_body: subprog_spec t_IS subprog_body_1 t_BEGIN seq_stats t_END subprog_body_2 t_Semicolon + { + currP=0; + } +subprog_body: subprog_spec t_IS error t_END subprog_body_2 t_Semicolon + { + currP=0; + } +subprog_body_2: /* empty */ +subprog_body_2: designator +subprog_body_2: t_FUNCTION +subprog_body_2: t_PROCEDURE +subprog_body_2: t_PROCEDURE t_Identifier +subprog_body_2: t_FUNCTION t_Identifier +subprog_body_2: t_FUNCTION t_STRING + + +subprog_body_1: /* empty */ //subprog_body_1 : subprogram_instantiation_decl -subprog_body_1 : subprog_body_1 subprog_body_3 -subprog_body_3 : subprog_decltve_item +subprog_body_1: subprog_body_1 subprog_body_3 +subprog_body_3: subprog_decltve_item /*-------------------------------------------------- -- Interface Lists and Associaton Lists ----------------------------------------------------*/ -interf_list : t_LeftParen interf_element interf_list_1 t_RightParen {$$="";} -interf_list : t_LeftParen error t_RightParen {$$="";} -interf_list_1 : /* empty */ -interf_list_1 : interf_list_1 interf_list_2 -interf_list_2 : t_Semicolon interf_element - - -interf_element : interface_package_decl {$$="";} -interf_element : interface_subprogram_decl {$$="";} -interf_element : interf_element_1 t_Identifier {$$="";} -interf_element : interf_element_1 idf_list t_Colon interf_element_2 subtype_indic interf_element_3 interf_element_4 - { - if (currP!=VhdlDocGen::COMPONENT) - { - if (currP==VhdlDocGen::FUNCTION || currP==VhdlDocGen::PROCEDURE) - { - addProto($1.data(),$2.data(),$4.data(),$5.data(),$6.data(),$7.data()); - } - else - { - QCString i=$5+$6+$7; - addVhdlType($2,s_str.iLine,Entry::VARIABLE_SEC,currP,i.data(),$4.data()); - } - // fprintf(stderr,"\n\n <>\n",$$.data()); - } // if component - } -interf_element_4 : /* empty :=*/ {$$="";} -interf_element_4 : t_VarAsgn expr {$$=":="+$2;} -interf_element_3 : /* empty */ {$$="";} -interf_element_3 : t_BUFFER {$$="buffer";} -interf_element_3 : t_BUS {$$="bus";} -interf_element_2 : /* empty */ {$$="";} -interf_element_2 : mode {$$=$1;} -interf_element_1 : /* empty */ {$$="";} -interf_element_1 : object_class {$$=$1;} - -mode : t_IN {$$="in";} -mode : t_OUT {$$="out";} -mode : t_INOUT {$$="inout";} -mode : t_BUFFER {$$="buffer";} -mode : t_LINKAGE {$$="link";} - -association_list : t_LeftParen association_element association_list_1 t_RightParen {$$="("+$2+")";} -association_list_1 : /* empty */ {$$="";} -association_list_1 : association_list_1 association_list_2 {$$=$1+" "+$2; } -association_list_2 : t_Comma association_element {$$=", "+$2; } - -gen_association_list : t_LeftParen gen_association_element gen_association_list_1 t_RightParen -{ - QCString str="( "+$2; - str.append(" )"); - $$=str; -} -gen_association_list : t_LeftParen error t_RightParen {$$="";} -gen_association_list :t_LeftParen t_OPEN t_RightParen {$$=" ( open ) ";} - -gen_association_list_1 : /* empty */ {$$="";} -gen_association_list_1 : gen_association_list_1 gen_association_list_2 {$$=$1+"?? "+$2; } -gen_association_list_2 : t_Comma gen_association_element {$$=","+$2;} - -association_element : formal_part t_Arrow actual_part {$$=$1+"=>"+$3;} -association_element : actual_part {$$=$1;} -association_element : t_Box {$$="<>";} -association_element : t_DEFAULT {$$="default";} +interf_list: t_LeftParen interf_element interf_list_1 t_RightParen { $$=""; } +interf_list: t_LeftParen error t_RightParen { $$=""; } +interf_list_1: /* empty */ +interf_list_1: interf_list_1 interf_list_2 +interf_list_2: t_Semicolon interf_element + +interf_element: interface_package_decl + { + // adding generic : [ package foo is new bar] + if (parse_sec==GEN_SEC) + { + QCString n=current->name; + addVhdlType(n.data(),getParsedLine(t_PACKAGE),Entry::VARIABLE_SEC,VhdlDocGen::GENERIC,$1.data(),0); + } + } +interf_element: interface_subprogram_decl + { + if (parse_sec==GEN_SEC) + { + int a=getParsedLine(t_FUNCTION); + int b=getParsedLine(t_PROCEDURE); + + if (a>b) b=a; + + QCString n=current->name; + addVhdlType(n.data(),b,Entry::VARIABLE_SEC,VhdlDocGen::GENERIC,$1.data(),0); + } + } +interf_element: interf_element_1 t_Identifier + { + if (parse_sec==GEN_SEC) + { + QCString v= $1; + addVhdlType($2,s_str.iLine,Entry::VARIABLE_SEC,currP,$1.data(),0); + } + } +interf_element: interf_element_1 idf_list t_Colon interf_element_2 subtype_indic interf_element_3 interf_element_4 + { + QCString b=$2; + $$=$2+":"+$4+$5+$6+$7; + if (currP!=VhdlDocGen::COMPONENT) + { + if (currP==VhdlDocGen::FUNCTION || currP==VhdlDocGen::PROCEDURE) + { + addProto($1.data(),$2.data(),$4.data(),$5.data(),$6.data(),$7.data()); + } + else + { + QCString i=$5+$6+$7; + if (currP==VhdlDocGen::GENERIC) + addVhdlType($2,s_str.iLine,Entry::VARIABLE_SEC,currP,i.data(),$4.data()); + else if(parse_sec != GEN_SEC) + addVhdlType($2,s_str.iLine,Entry::VARIABLE_SEC,currP,i.data(),$4.data()); + } + // fprintf(stderr,"\n\n <>\n",$$.data()); + } // if component + } +interf_element_4: /* empty :=*/ { $$=""; } +interf_element_4: t_VarAsgn expr { $$=":="+$2; } +interf_element_3: /* empty */ { $$=""; } +interf_element_3: t_BUFFER { $$="buffer"; } +interf_element_3: t_BUS { $$="bus"; } +interf_element_2: /* empty */ { $$=""; } +interf_element_2: mode { $$=$1; } +interf_element_1: /* empty */ { $$=""; } +interf_element_1: object_class { $$=$1; } + +mode: t_IN { $$="in"; } +mode: t_OUT { $$="out"; } +mode: t_INOUT { $$="inout"; } +mode: t_BUFFER { $$="buffer"; } +mode: t_LINKAGE { $$="link"; } + +association_list: t_LeftParen association_element association_list_1 t_RightParen { $$="("+$2+")"; } +association_list_1: /* empty */ { $$=""; } +association_list_1: association_list_1 association_list_2 { $$=$1+" "+$2; } +association_list_2: t_Comma association_element { $$=", "+$2; } + +gen_association_list : t_LeftParen gen_association_element gen_association_list_1 t_RightParen + { + QCString str="( "+$2; + str.append(" )"); + $$=str; + } +gen_association_list: t_LeftParen error t_RightParen { $$=""; } +gen_association_list: t_LeftParen t_OPEN t_RightParen { $$=" ( open ) "; } + +gen_association_list_1: /* empty */ { $$=""; } +gen_association_list_1: gen_association_list_1 gen_association_list_2 { $$=$1+"?? "+$2; } +gen_association_list_2: t_Comma gen_association_element { $$=","+$2; } + +association_element: formal_part t_Arrow actual_part { $$=$1+"=>"+$3; } +association_element: actual_part { $$=$1; } +association_element: t_Box { $$="<>"; } +association_element: t_DEFAULT { $$="default"; } /* changed ;gen_association_element : association_element */ -gen_association_element : expr { $$=$1; } -gen_association_element : choice t_Arrow expr -gen_association_element :discrete_range1 { $$=$1 ;} +gen_association_element: expr { $$=$1; } +gen_association_element: choice t_Arrow expr +gen_association_element: discrete_range1 { $$=$1 ; } -formal_part : name {$$=$1;} +formal_part: name { $$=$1; } -actual_part : expr {$$=$1;} -actual_part : t_OPEN {$$="open";} -actual_part : t_INERTIAL expr {$$="inertial";} +actual_part: expr { $$=$1; } +actual_part: t_OPEN { $$="open"; } +actual_part: t_INERTIAL expr { $$="inertial"; } /*-------------------------------------------------- -- Names and Expressions @@ -786,442 +855,424 @@ actual_part : t_INERTIAL expr {$$="inertial";} -expr : and_relation {$$=$1;} -expr : relation {$$=$1;} +expr: and_relation { $$=$1; } +expr: relation { $$=$1; } -shift_op: t_SLL - | t_SRA - | t_SLA - |t_SRL - |t_ROR - |t_ROL - ; -and_relation : relation shift_op relation -and_relation : relation t_AND relation -and_relation : relation t_XOR relation -and_relation : relation t_OR relation -and_relation : relation t_NOR relation -and_relation : relation t_XNOR relation -and_relation : relation t_NAND relation -and_relation : and_relation t_NAND relation -and_relation : and_relation t_NOR relation -and_relation : and_relation t_XNOR relation -and_relation : and_relation t_AND relation -and_relation : and_relation t_OR relation -and_relation : and_relation t_XOR relation - - - -/* ;relation : unary_operator primary */ - - -relation : t_QQ primary {$$=" ?? "+$2;} -relation : primary {$$=$1;} -relation : t_Plus primary %prec MED_PRECEDENCE {$$="+"+$2;} -relation : t_Minus primary %prec MED_PRECEDENCE {$$="-"+$2 ;} -relation : t_ABS primary {$$="abs"+$2;} -relation : t_NOT primary {$$="not "+$2;} -relation : primary t_DoubleStar primary {$$=$1+" ** "+$3;} -relation : t_Minus primary t_DoubleStar primary {$$=$2+" ** "+$4;} - -/* ; relation : relation binary_operator primary */ - -relation : relation t_MOD relation {$$=$1+" mod "+$3;} -relation : relation t_REM relation {$$=$1+" rem "+$3;} -relation : relation t_Ampersand relation {$$=$1+" & "+$3;} -relation : relation t_Star relation {$$=$1+" * "+$3;} -relation : relation t_Plus relation {$$=$1+" + "+$3;} -relation : relation t_Minus relation {$$=$1+" - "+$3;} -relation : relation t_LESym relation {$$=$1+" <= "+$3;} -relation : relation t_GESym relation {$$=$1+" >= "+$3;} -relation : relation t_LTSym relation {$$=$1+" < "+$3;} -relation : relation t_GTSym relation {$$=$1+" > "+$3;} -relation : relation t_EQSym relation {$$=$1+" == "+$3;} -relation : relation t_NESym relation {$$=$1+" != "+$3;} -relation : relation t_Slash relation {$$=$1+" /"+$3;} -relation : relation t_QNEQU relation {$$=$1+" ?/="+$3;} -relation : relation t_QEQU relation {$$=$1+" ?="+$3;} -relation : relation t_QL relation {$$=$1+" ?<"+$3;} -relation : relation t_QG relation {$$=$1+" ?>"+$3;} -relation : relation t_QLT relation {$$=$1+" ?<="+$3;} -relation : relation t_QGT relation {$$=$1+" ?>="+$3;} - - - -simple_exp: t_Minus term { $$ = "-"+$2;} - | t_Plus term { $$ = "+"+$2;} - | term { $$ = $1;} - | simple_exp adding_op term { $$ = $1+" "+$2+" "+$3;} - -adding_op: t_Ampersand { $$ = "&";} - | t_Minus { $$ = "-";} - | t_Plus { $$ = "+";} - ; - -term : factor { $$=$1; } - | factor multiplying_operator factor { $$ = $1+" "+$2+" "+$3;} +shift_op: t_SLL + | t_SRA + | t_SLA + | t_SRL + | t_ROR + | t_ROL ; - -multiplying_operator: t_Star { $$ = "*";} - | t_REM { $$ = "rem";} - | t_MOD { $$ = "mod";} - | t_Slash { $$ = "/";} - -factor : primary { $$=$1; } - | t_ABS primary { $$="abs "+$2; } - | t_NOT primary { $$="not "+$2; } - | primary t_DoubleStar primary { $$ = $1+" ** "+$3;} - - -primary : name {$$=$1;} -primary : literal {$$=$1;} -primary : aggregate {$$=$1;} -primary : qualified_expr {$$=$1;} -primary : allocator {$$="";} -primary : t_LeftParen expr t_RightParen {$$="("+$2+")";} - +and_relation: relation shift_op relation +and_relation: relation t_AND relation +and_relation: relation t_XOR relation +and_relation: relation t_OR relation +and_relation: relation t_NOR relation +and_relation: relation t_XNOR relation +and_relation: relation t_NAND relation +and_relation: and_relation t_NAND relation +and_relation: and_relation t_NOR relation +and_relation: and_relation t_XNOR relation +and_relation: and_relation t_AND relation +and_relation: and_relation t_OR relation +and_relation: and_relation t_XOR relation -name : mark {$$=$1;} -name : name2 {$$=$1;} -name : external_name {$$="";} -name2 : t_StringLit {$$=$1;} -name2 : attribute_name {$$=$1;} -name2 : ifts_name {$$=$1;} - -mark : t_Identifier {$$=$1;} -mark : sel_name {$$=$1;} - -sel_name : name t_Dot suffix {$$=$1+"."+$3;} - -suffix : designator {$$=$1;} -suffix : t_CharacterLit {$$=$1;} -suffix : t_ALL {$$="all";} - -ifts_name : mark gen_association_list {$$=$1+" "+$2;} -ifts_name : name2 gen_association_list {$$=$1+" "+$2;} - - -sigma: t_Apostrophe {$$="'";} -//sigma : t_LEFTBR signature1 t_RIGHTBR t_Apostrophe {$$="("+$2;;$$.append(")");$$.append("'");} - -attribute_name : mark sigma t_Identifier {$$=$1+"' "+$3;} -attribute_name :attribute_name t_LeftParen expr t_RightParen -attribute_name : name2 sigma t_Identifier {$$=$1+" '"+$3;} -attribute_name : mark sigma t_RANGE {$$=$1+"' range ";} -attribute_name : name2 sigma t_RANGE {$$=$1+"' range ";} - -aggregate : element_association_list2 t_RightParen {$$=$1+" ) ";} -aggregate : t_LeftParen choices t_Arrow expr t_RightParen {$$="( "+$2+ "=>"+$4+" ) ";} - - -element_association_list2 : t_LeftParen element_association t_Comma element_association {$$=" ( "+$2+","+$4;} -element_association_list2 : element_association_list2 t_Comma element_association {$$=$1+","+$3;} - +/* ;relation : unary_operator primary */ -qualified_expr : mark t_Apostrophe t_LeftParen expr t_RightParen {$$=$1+"'("+$4+" ) ";} -qualified_expr : mark t_Apostrophe aggregate {$$=$1+"'"+$3;} +relation: t_QQ primary { $$=" ?? "+$2; } +relation: primary { $$=$1; } +relation: t_Plus primary %prec MED_PRECEDENCE { $$="+"+$2; } +relation: t_Minus primary %prec MED_PRECEDENCE { $$="-"+$2; } +relation: t_ABS primary { $$="abs"+$2; } +relation: t_NOT primary { $$="not "+$2; } +relation: primary t_DoubleStar primary { $$=$1+" ** "+$3; } +relation: t_Minus primary t_DoubleStar primary { $$=$2+" ** "+$4; } +/* ; relation : relation binary_operator primary */ -allocator : t_NEW mark mark allocator_1 -allocator : t_NEW mark allocator_2 -allocator : t_NEW qualified_expr -allocator_2 : /* empty */ -allocator_2 : gen_association_list -allocator_1 : /* empty */ -allocator_1 : gen_association_list +relation: relation t_MOD relation { $$=$1+" mod "+$3; } +relation: relation t_REM relation { $$=$1+" rem "+$3; } +relation: relation t_Ampersand relation { $$=$1+" & "+$3; } +relation: relation t_Star relation { $$=$1+" * "+$3; } +relation: relation t_Plus relation { $$=$1+" + "+$3; } +relation: relation t_Minus relation { $$=$1+" - "+$3; } +relation: relation t_LESym relation { $$=$1+" <= "+$3; } +relation: relation t_GESym relation { $$=$1+" >= "+$3; } +relation: relation t_LTSym relation { $$=$1+" < "+$3; } +relation: relation t_GTSym relation { $$=$1+" > "+$3; } +relation: relation t_EQSym relation { $$=$1+" == "+$3; } +relation: relation t_NESym relation { $$=$1+" != "+$3; } +relation: relation t_Slash relation { $$=$1+" /"+$3; } +relation: relation t_QNEQU relation { $$=$1+" ?/="+$3; } +relation: relation t_QEQU relation { $$=$1+" ?="+$3; } +relation: relation t_QL relation { $$=$1+" ?<"+$3; } +relation: relation t_QG relation { $$=$1+" ?>"+$3; } +relation: relation t_QLT relation { $$=$1+" ?<="+$3; } +relation: relation t_QGT relation { $$=$1+" ?>="+$3; } + +simple_exp: t_Minus term { $$ = "-"+$2; } + | t_Plus term { $$ = "+"+$2; } + | term { $$ = $1; } + | simple_exp + adding_op term { $$ = $1+" "+$2+" "+$3; } + +adding_op: t_Ampersand { $$ = "&"; } + | t_Minus { $$ = "-"; } + | t_Plus { $$ = "+"; } + ; + +term: factor { $$=$1; } + | factor multiplying_operator factor { $$ = $1+" "+$2+" "+$3; } + ; + +multiplying_operator: t_Star { $$ = "*"; } + | t_REM { $$ = "rem"; } + | t_MOD { $$ = "mod"; } + | t_Slash { $$ = "/"; } + +factor: primary { $$=$1; } + | t_ABS primary { $$="abs "+$2; } + | t_NOT primary { $$="not "+$2; } + | primary t_DoubleStar primary { $$ = $1+" ** "+$3; } + +primary: name { $$=$1; } +primary: literal { $$=$1; } +primary: aggregate { $$=$1; } +primary: qualified_expr { $$=$1; } +primary: allocator { $$=""; } +primary: t_LeftParen expr t_RightParen { $$="("+$2+")"; } + +name: mark { $$=$1; } +name: name2 { $$=$1; } +name: external_name { $$=$1; } +name2: t_StringLit { $$=$1; } +name2: attribute_name { $$=$1; } +name2: ifts_name { $$=$1; } + +mark: t_Identifier { $$=$1; } +mark: sel_name { $$=$1; } + +sel_name: name t_Dot suffix { $$=$1+"."+$3; } + +suffix: designator { $$=$1; } +suffix: t_CharacterLit { $$=$1; } +suffix: t_ALL { $$="all"; } + +ifts_name: mark gen_association_list { $$=$1+" "+$2; } +ifts_name: name2 gen_association_list { $$=$1+" "+$2; } + +sigma: t_Apostrophe { $$="'"; } +//sigma : t_LEFTBR signature1 t_RIGHTBR t_Apostrophe { $$="("+$2;;$$.append(")");$$.append("'"); } + +attribute_name: mark sigma t_Identifier { $$=$1+"' "+$3; } +attribute_name: attribute_name t_LeftParen expr t_RightParen +attribute_name: name2 sigma t_Identifier { $$=$1+" '"+$3; } +attribute_name: mark sigma t_RANGE { $$=$1+"' range "; } +attribute_name: name2 sigma t_RANGE { $$=$1+"' range "; } + +aggregate : element_association_list2 t_RightParen { $$=$1+" ) "; } +aggregate : t_LeftParen choices t_Arrow expr t_RightParen { $$="( "+$2+ "=>"+$4+" ) "; } + +element_association_list2 : t_LeftParen element_association t_Comma element_association { $$=" ( "+$2+","+$4; } +element_association_list2 : element_association_list2 t_Comma element_association { $$=$1+","+$3; } + +qualified_expr : mark t_Apostrophe t_LeftParen expr t_RightParen { $$=$1+"'("+$4+" ) "; } +qualified_expr : mark t_Apostrophe aggregate { $$=$1+"'"+$3; } + +allocator: t_NEW mark mark allocator_1 +allocator: t_NEW mark allocator_2 +allocator: t_NEW qualified_expr +allocator_2: /* empty */ +allocator_2: gen_association_list +allocator_1: /* empty */ +allocator_1: gen_association_list /*-------------------------------------------------- -- Element Association and Choices ----------------------------------------------------*/ -element_association : choices t_Arrow expr {$$=$1+"=> "+$3;} - -element_association : expr {$$=$1;} +element_association: choices t_Arrow expr { $$=$1+"=> "+$3; } +element_association: expr { $$=$1; } -choices : choice choices_1 {$$=$1+" "+$2;} -choices_1 : /* empty */ {$$="";} -choices_1 : choices_1 choices_2 {$$=$1+" "+$2;} -choices_2 : t_Bar choice {$$=" | "+$2;} +choices: choice choices_1 { $$=$1+" "+$2; } +choices_1: /* empty */ { $$=""; } +choices_1: choices_1 choices_2 { $$=$1+" "+$2; } +choices_2: t_Bar choice { $$=" | "+$2; } -choice : expr {$$=$1;} -choice : discrete_range1 {$$=$1;} -choice : t_OTHERS {$$="others";} +choice: expr { $$=$1; } +choice: discrete_range1 { $$=$1; } +choice: t_OTHERS { $$="others"; } /*-------------------------------------------------- -- Type Declarations ----------------------------------------------------*/ -type_decl : t_TYPE t_Identifier error t_Semicolon {$$="";} -type_decl : t_TYPE t_Identifier type_decl_1 t_Semicolon - { - addVhdlType($2,getParsedLine(t_TYPE),Entry::VARIABLE_SEC,VhdlDocGen::TYPE,0,$3.data()); - } - type_decl : t_TYPE error t_Semicolon {$$="";} - -type_decl_1 : /* empty */ {$$="";} -type_decl_1 : t_IS type_definition {$$="is "+$2;} - -type_definition : enumeration_type_definition {$$=$1;} -type_definition : range_constraint {$$=$1;} -type_definition : physical_type_definition { $$=$1; } -type_definition : unconstrained_array_definition {$$=$1;} -type_definition : constrained_array_definition {$$=$1;} -type_definition : record_type_definition {$$=$1;} -type_definition : access_type_definition {$$=$1;} -type_definition : file_type_definition {$$=$1;} -type_definition : protected_type_declaration {$$=$1;} -type_definition : protected_type_body {$$=$1;} - - -enumeration_type_definition : t_LeftParen enumeration_literal enumeration_type_definition_1 t_RightParen {$$="( "+$2+" "+$3+" )";} -enumeration_type_definition_1 : {$$="";} -enumeration_type_definition_1 : enumeration_type_definition_1 enumeration_type_definition_2 {$$=$1+" "+$2;} -enumeration_type_definition_2 : t_Comma enumeration_literal {$$=","+$2;} +type_decl: t_TYPE t_Identifier error t_Semicolon { $$=""; } +type_decl: t_TYPE t_Identifier type_decl_1 t_Semicolon + { + addVhdlType($2,getParsedLine(t_TYPE),Entry::VARIABLE_SEC,VhdlDocGen::TYPE,0,$3.data()); + } +type_decl: t_TYPE error t_Semicolon { $$=""; } + +type_decl_1: /* empty */ { $$=""; } +type_decl_1: t_IS type_definition { $$="is "+$2; } + +type_definition: enumeration_type_definition { $$=$1; } +type_definition: range_constraint { $$=$1; } +type_definition: physical_type_definition { $$=$1; } +type_definition: unconstrained_array_definition { $$=$1; } +type_definition: constrained_array_definition { $$=$1; } +type_definition: record_type_definition { $$=$1; } +type_definition: access_type_definition { $$=$1; } +type_definition: file_type_definition { $$=$1; } +type_definition: protected_type_declaration { $$=$1; } +type_definition: protected_type_body { $$=$1; } + + +enumeration_type_definition: t_LeftParen enumeration_literal enumeration_type_definition_1 t_RightParen { $$="( "+$2+" "+$3+" )"; } +enumeration_type_definition_1: { $$=""; } +enumeration_type_definition_1: enumeration_type_definition_1 enumeration_type_definition_2 { $$=$1+" "+$2; } +enumeration_type_definition_2: t_Comma enumeration_literal { $$=","+$2; } physical_type_definition : range_constraint t_UNITS base_unit_decl -physical_type_definition_1 t_END unit_stat - { - $$=$1; - current->args=$3+"#"+$4; - current->args.prepend("units"); - current->spec=VhdlDocGen::UNITS; - } + physical_type_definition_1 t_END unit_stat + { + $$=$1; + current->args=$3+"#"+$4; + current->args.prepend("units"); + current->spec=VhdlDocGen::UNITS; + } -unit_stat: t_UNITS t_Identifier -unit_stat : t_UNITS +unit_stat: t_UNITS t_Identifier +unit_stat: t_UNITS +physical_type_definition_1: /* empty */ { $$=""; } +physical_type_definition_1: physical_type_definition_1 physical_type_definition_2 { $$=$1+" "+$2; } +physical_type_definition_2: secondary_unit_decl { $$=$1+"#"; } -physical_type_definition_1 : /* empty */ {$$="";} -physical_type_definition_1 : physical_type_definition_1 physical_type_definition_2 {$$=$1+" "+$2;} -physical_type_definition_2 : secondary_unit_decl {$$=$1+"#";} +base_unit_decl: t_Identifier t_Semicolon { $$=$1; } -base_unit_decl : t_Identifier t_Semicolon {$$=$1;} +secondary_unit_decl: t_Identifier t_EQSym physical_literal t_Semicolon { $$=$1+"="+$3 } -secondary_unit_decl : t_Identifier t_EQSym physical_literal t_Semicolon {$$=$1+"="+$3} +unconstrained_array_definition: t_ARRAY t_LeftParen + index_subtype_definition unconstrained_array_definition_1 t_RightParen t_OF + subtype_indic + { + QCString sr1=" array ( "+$3+" "+$4; + QCString sr2=" ) of "+$7; + $$=sr1+sr2; + } -unconstrained_array_definition : t_ARRAY t_LeftParen -index_subtype_definition unconstrained_array_definition_1 t_RightParen t_OF -subtype_indic -{ - QCString sr1=" array ( "+$3+" "+$4; - QCString sr2=" ) of "+$7; +unconstrained_array_definition_1: { $$=""; } +unconstrained_array_definition_1: unconstrained_array_definition_1 unconstrained_array_definition_2 { $$=$1+" "+$2 } +unconstrained_array_definition_2: t_Comma index_subtype_definition { $$=", "+$2 } - $$=sr1+sr2; -} +index_subtype_definition: mark t_RANGE t_Box { $$=$1+" range<> "; } -unconstrained_array_definition_1 : {$$="";} -unconstrained_array_definition_1 : unconstrained_array_definition_1 unconstrained_array_definition_2 {$$=$1+" "+$2} -unconstrained_array_definition_2 : t_Comma index_subtype_definition {$$=", "+$2} +constrained_array_definition: t_ARRAY index_constraint t_OF subtype_indic { $$=" array "+$2+" of "+$4; } -index_subtype_definition : mark t_RANGE t_Box {$$=$1+" range<> ";} +record_type_simple_name:/*empty*/ { $$=""; } + | t_Identifier { $$=$1; } -constrained_array_definition : t_ARRAY index_constraint t_OF subtype_indic {$$=" array "+$2+" of "+$4;} +record_type_definition: t_RECORD element_decl record_type_definition_1 t_END + t_RECORD record_type_simple_name + { + QRegExp reg("[\\s]"); + QCString oo=$2+" "+$3; + current->spec=VhdlDocGen::RECORD; + current->args=oo; + current->args.replace(reg,"%"); + current->args.prepend("record"); + $$=$2+" "+$3; + } -record_type_simple_name :/*empty*/ {$$="";} - | t_Identifier {$$=$1;} - -record_type_definition : t_RECORD element_decl record_type_definition_1 t_END -t_RECORD record_type_simple_name -{ - QRegExp reg("[\\s]"); - QCString oo=$2+" "+$3; - current->spec=VhdlDocGen::RECORD; - current->args=oo; - current->args.replace(reg,"%"); - current->args.prepend("record"); - $$=$2+" "+$3; -} - -record_type_definition_1 : /*empty*/ {$$="";} -record_type_definition_1 : record_type_definition_1 record_type_definition_2 - { - $$=$1+" "+$2; +record_type_definition_1: /*empty*/ { $$=""; } +record_type_definition_1: record_type_definition_1 record_type_definition_2 + { + $$=$1+" "+$2; } -record_type_definition_2 : element_decl {$$=$1;} +record_type_definition_2: element_decl { $$=$1; } -element_decl : idf_list t_Colon subtype_indic t_Semicolon {$$=$1+":"+$3+"#"; } +element_decl: idf_list t_Colon subtype_indic t_Semicolon { $$=$1+":"+$3+"#"; } -access_type_definition : t_ACCESS subtype_indic {$$="access "+$2; } +access_type_definition: t_ACCESS subtype_indic { $$="access "+$2; } -file_type_definition : t_FILE t_OF mark {$$="file of "+$3; } +file_type_definition: t_FILE t_OF mark { $$="file of "+$3; } /*-------------------------------------------------- -- Subtypes and Constraints ----------------------------------------------------*/ -subtype_decl : t_SUBTYPE t_Identifier t_IS subtype_indic t_Semicolon - { - addVhdlType($2,getParsedLine(t_SUBTYPE),Entry::VARIABLE_SEC,VhdlDocGen::SUBTYPE,0,$4.data()); - } -subtype_decl : t_SUBTYPE error t_Semicolon {$$="";} -subtype_indic : mark subtype_indic_1 {$$=$1+" "+$2;}; -subtype_indic : subtype_indic1 {$$=$1;} -subtype_indic_1 : /* empty */ {$$="";} -subtype_indic_1 : gen_association_list {$$=$1;} - -subtype_indic1 : mark mark range_constraint {$$=$1+" "+$2+" "+$3;}; -subtype_indic1 : mark range_constraint {$$=$1+" "+$2;} -subtype_indic1 : mark mark subtype_indic1_1 {$$=$1+" "+$2+" "+$3;} -subtype_indic1_1 : /* empty */ {$$="";} -subtype_indic1_1 : gen_association_list {$$=$1;} - -range_constraint : t_RANGE range_spec { $$="range "+$2;} +subtype_decl: t_SUBTYPE t_Identifier t_IS subtype_indic t_Semicolon + { + addVhdlType($2,getParsedLine(t_SUBTYPE),Entry::VARIABLE_SEC,VhdlDocGen::SUBTYPE,0,$4.data()); + } +subtype_decl: t_SUBTYPE error t_Semicolon { $$=""; } +subtype_indic: mark subtype_indic_1 { $$=$1+" "+$2; } +subtype_indic: subtype_indic1 { $$=$1; } +subtype_indic_1: /* empty */ { $$=""; } +subtype_indic_1: gen_association_list { $$=$1; } + +subtype_indic1: mark mark range_constraint { $$=$1+" "+$2+" "+$3; } +subtype_indic1: mark range_constraint { $$=$1+" "+$2; } +subtype_indic1: mark mark subtype_indic1_1 { $$=$1+" "+$2+" "+$3; } +subtype_indic1_1: /* empty */ { $$=""; } +subtype_indic1_1: gen_association_list { $$=$1; } + +range_constraint: t_RANGE range_spec { $$="range "+$2; } //range_constraint : array_constraint +index_constraint: t_LeftParen discrete_range + index_constraint_1 + t_RightParen { $$="("+$2+" "+$3+")"; } +index_constraint_1: /* empty */ { $$=""; } +index_constraint_1: index_constraint_1 + index_constraint_2 { $$=$1+" "+$2; } +index_constraint_2: t_Comma discrete_range { $$=","+$2; } -index_constraint : t_LeftParen discrete_range index_constraint_1 t_RightParen { $$="("+$2+" "+$3+")";} -index_constraint_1 : /* empty */ {$$="";} -index_constraint_1 : index_constraint_1 index_constraint_2 { $$=$1+" "+$2;} -index_constraint_2 : t_Comma discrete_range { $$=","+$2;} - +discrete_range: subtype_indic { $$=$1; } +discrete_range: range_spec { $$=$1; } -discrete_range : subtype_indic { $$=$1;} -discrete_range : range_spec { $$=$1;} +discrete_range1 : subtype_indic1 { $$=$1; } +discrete_range1 : expr direction expr { $$=$1+" "+$2+" "+$3; } -discrete_range1 : subtype_indic1 { $$=$1;} -discrete_range1 : expr direction expr { $$=$1+" "+$2+" "+$3;} +range_spec : attribute_name { $$=$1; } +range_spec : simple_exp direction simple_exp { $$=$1+" "+$2+" "+$3; } -range_spec : attribute_name { $$=$1;} -range_spec : simple_exp direction simple_exp { $$=$1+" "+$2+" "+$3;} - - -direction : t_TO {$$=" to ";} -direction : t_DOWNTO {$$=" downto ";} +direction : t_TO { $$=" to "; } +direction : t_DOWNTO { $$=" downto "; } /*-------------------------------------------------- -- Objects, Aliases, Files, Disconnections ----------------------------------------------------*/ -constant_decl : t_CONSTANT idf_list t_Colon subtype_indic constant_decl_1 t_Semicolon - { - QCString it=$4+" "+$5; - // fprintf(stderr,"\n currP %d \n",currP); - addVhdlType($2,getParsedLine(t_CONSTANT),Entry::VARIABLE_SEC,VhdlDocGen::CONSTANT,0,it.data()); - } -constant_decl_1 : /* empty */ {$$="";} -constant_decl_1 : t_VarAsgn expr {$$=":="+$2;} +constant_decl: t_CONSTANT idf_list t_Colon subtype_indic constant_decl_1 t_Semicolon + { + QCString it=$4+" "+$5; + // fprintf(stderr,"\n currP %d \n",currP); + addVhdlType($2,getParsedLine(t_CONSTANT),Entry::VARIABLE_SEC,VhdlDocGen::CONSTANT,0,it.data()); + } +constant_decl_1: /* empty */ { $$=""; } +constant_decl_1: t_VarAsgn expr { $$=":="+$2; } -signal_decl : t_SIGNAL idf_list t_Colon subtype_indic signal_decl_1 signal_decl_2 t_Semicolon - { - QCString s=$4+" "+$6; - addVhdlType($2,getParsedLine(t_SIGNAL),Entry::VARIABLE_SEC,VhdlDocGen::SIGNAL,0,s.data()); - } -signal_decl_2 : /* empty */ {$$="";} -signal_decl_2 : t_VarAsgn expr {$$=":="+$2;} -signal_decl_1 : /* empty */ {$$="";} -signal_decl_1 : signal_kind { - $$=$1; - } +signal_decl: t_SIGNAL idf_list t_Colon subtype_indic signal_decl_1 signal_decl_2 t_Semicolon + { + QCString s=$4+" "+$6; + addVhdlType($2,getParsedLine(t_SIGNAL),Entry::VARIABLE_SEC,VhdlDocGen::SIGNAL,0,s.data()); + } +signal_decl_2: /* empty */ { $$=""; } +signal_decl_2: t_VarAsgn expr { $$=":="+$2; } +signal_decl_1: /* empty */ { $$=""; } +signal_decl_1: signal_kind { $$=$1; } +variable_decl: t_VARIABLE idf_list t_Colon subtype_indic variable_decl_1 t_Semicolon + { + $$=$2+":"+$4+" "+$5; + } +variable_decl: t_SHARED t_VARIABLE idf_list t_Colon subtype_indic variable_decl_1 t_Semicolon + { + $$=$5+" "+$6; + addVhdlType($3,getParsedLine(t_VARIABLE),Entry::VARIABLE_SEC,VhdlDocGen::SHAREDVARIABLE,0,$$.data()); + } +variable_decl_1: /* empty */ { $$=""; } +variable_decl_1: t_VarAsgn expr { $$=":="+$2; } + +object_class: t_CONSTANT { $$="constant"; } +object_class: t_SIGNAL { $$="signal"; } +object_class: t_VARIABLE { $$="variable"; } +object_class: t_SHARED t_VARIABLE { $$="shared"; } +object_class: t_FILE { $$="file"; } +object_class: t_TYPE { $$="type"; } +signal_kind: t_BUS { $$="bus"; } +signal_kind: t_REGISTER { $$="register"; } -variable_decl : t_VARIABLE idf_list t_Colon subtype_indic variable_decl_1 t_Semicolon +alias_decl: t_ALIAS alias_name_stat alias_spec t_IS name signature t_Semicolon { - $$=$2+":"+$4+" "+$5; - } -variable_decl : t_SHARED t_VARIABLE idf_list t_Colon subtype_indic variable_decl_1 t_Semicolon - { - $$=$5+" "+$6; - addVhdlType($3,getParsedLine(t_VARIABLE),Entry::VARIABLE_SEC,VhdlDocGen::SHAREDVARIABLE,0,$$.data()); - } -variable_decl_1 : /* empty */ {$$="";} -variable_decl_1 : t_VarAsgn expr {$$=":="+$2;} - -object_class : t_CONSTANT {$$="constant";} -object_class : t_SIGNAL {$$="signal";} -object_class : t_VARIABLE {$$="variable";} -object_class :t_SHARED t_VARIABLE {$$="shared";} -object_class :t_FILE {$$="file";} -object_class :t_TYPE {$$="type";} - -signal_kind : t_BUS {$$="bus";} -signal_kind : t_REGISTER {$$="register";} - -alias_decl : t_ALIAS alias_name_stat alias_spec t_IS name signature t_Semicolon - { - QCString s=$3+" "+$5+$6; - addVhdlType($2,getParsedLine(t_ALIAS),Entry::VARIABLE_SEC,VhdlDocGen::ALIAS,0,s.data()); - } - alias_decl : t_ALIAS alias_name_stat alias_spec t_IS error t_Semicolon {$$="";} - - alias_name_stat : t_Identifier {$$=$1;} - alias_name_stat : t_StringLit {$$=$1;} - - alias_spec :/*empty*/ {$$="";} - | t_Colon subtype_indic { $$=","+$2;} - ; - - -file_decl : t_FILE idf_list t_Colon subtype_indic t_IS file_decl_1 expr t_Semicolon - { - addVhdlType($2,getParsedLine(t_FILE),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,$4.data()); - } - -file_decl : t_FILE idf_list t_Colon t_Identifier fi_dec t_Semicolon - { - QCString s=$4+" "+$5; - addVhdlType($2,getParsedLine(t_FILE),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,s.data()); - } + QCString s=$3+" is "+$5+$6; + addVhdlType($2,getParsedLine(t_ALIAS),Entry::VARIABLE_SEC,VhdlDocGen::ALIAS,0,s.data()); + } +alias_decl: t_ALIAS alias_name_stat alias_spec t_IS error t_Semicolon { $$=""; } + +alias_name_stat: t_Identifier { $$=$1; } +alias_name_stat: t_StringLit { $$=$1; } + +alias_spec :/*empty*/ { $$=""; } + | t_Colon subtype_indic { $$=","+$2; } + ; + +file_decl: t_FILE idf_list t_Colon subtype_indic t_IS file_decl_1 expr t_Semicolon + { + addVhdlType($2,getParsedLine(t_FILE),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,$4.data()); + } -fi_dec: /*empty*/ {$$="";} - | t_OPEN expr t_IS expr {$$="open "+$2+" is "+s_str.qstr; } +file_decl: t_FILE idf_list t_Colon t_Identifier fi_dec t_Semicolon + { + QCString s=$4+" "+$5; + addVhdlType($2,getParsedLine(t_FILE),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,s.data()); + } +fi_dec: /*empty*/ { $$=""; } + | t_OPEN expr t_IS expr { $$="open "+$2+" is "+s_str.qstr; } -file_decl_1 : /* empty */ {$$="";} -file_decl_1 : mode {$$=$1;} -disconnection_spec : t_DISCONNECT signal_list t_Colon mark t_AFTER expr t_Semicolon +file_decl_1: /* empty */ { $$=""; } +file_decl_1: mode { $$=$1; } -signal_list : name signal_list_1 -signal_list : t_OTHERS -signal_list : t_ALL -signal_list_1 : /* empty */ -signal_list_1 : signal_list_1 signal_list_2 -signal_list_2 : t_Comma name +disconnection_spec: t_DISCONNECT signal_list t_Colon mark t_AFTER expr t_Semicolon + +signal_list: name signal_list_1 +signal_list: t_OTHERS +signal_list: t_ALL +signal_list_1: /* empty */ +signal_list_1: signal_list_1 signal_list_2 +signal_list_2: t_Comma name /*-------------------------------------------------- -- Attribute Declarations and Specifications ----------------------------------------------------*/ -attribute_decl : t_ATTRIBUTE t_Identifier t_Colon mark t_Semicolon - { - addVhdlType($2,getParsedLine(t_ATTRIBUTE),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,$4.data()); - } - -attribute_spec : t_ATTRIBUTE t_Identifier t_OF entity_spec t_IS expr t_Semicolon - { - QCString oo=$4+" is "+$6; - addVhdlType($2,getParsedLine(t_ATTRIBUTE),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,oo.data()); - } - -entity_spec : entity_name_list signature t_Colon entity_class - -entity_name_list : designator entity_name_list_1 {$$=$1+" "+$2;} -entity_name_list : t_OTHERS {$$="others";} -entity_name_list : t_ALL {$$="all";} -entity_name_list_1 : /* empty */ {$$="";} -entity_name_list_1 : entity_name_list_1 entity_name_list_2 {$$=$1+" "+$2;} -entity_name_list_2 : t_Comma designator {$$=","+$2;} - -entity_class : t_ENTITY {$$="entity";} -entity_class : t_ARCHITECTURE {$$="architecture";} -entity_class : t_PACKAGE {$$="package";} -entity_class : t_CONFIGURATION {$$="configuration";} -entity_class : t_COMPONENT {$$="component";} -entity_class : t_LABEL {$$="label";} -entity_class : t_TYPE {$$="type";} -entity_class : t_SUBTYPE {$$="subtype";} -entity_class : t_PROCEDURE {$$="procedure";} -entity_class : t_FUNCTION {$$="";} -entity_class : t_SIGNAL {$$="signal";} -entity_class : t_VARIABLE {$$="variable";} -entity_class : t_CONSTANT {$$="constant";} -entity_class : t_GROUP {$$="group";} -entity_class : t_FILE {$$="file";} -entity_class : t_UNITS {$$="units";} -entity_class : t_LITERAL {$$="literal";} -entity_class : t_SEQUENCE {$$="sequence";} -entity_class : t_PROPERTY {$$="property";} +attribute_decl: t_ATTRIBUTE t_Identifier t_Colon mark t_Semicolon + { + addVhdlType($2,getParsedLine(t_ATTRIBUTE),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,$4.data()); + } + +attribute_spec: t_ATTRIBUTE t_Identifier t_OF entity_spec t_IS expr t_Semicolon + { + QCString oo=$4+" is "+$6; + addVhdlType($2,getParsedLine(t_ATTRIBUTE),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,oo.data()); + } + +entity_spec : entity_name_list signature t_Colon entity_class + +entity_name_list: designator entity_name_list_1 { $$=$1+" "+$2; } +entity_name_list: t_OTHERS { $$="others"; } +entity_name_list: t_ALL { $$="all"; } +entity_name_list_1: /* empty */ { $$=""; } +entity_name_list_1: entity_name_list_1 entity_name_list_2 { $$=$1+" "+$2; } +entity_name_list_2: t_Comma designator { $$=","+$2; } + +entity_class: t_ENTITY { $$="entity"; } +entity_class: t_ARCHITECTURE { $$="architecture"; } +entity_class: t_PACKAGE { $$="package"; } +entity_class: t_CONFIGURATION { $$="configuration"; } +entity_class: t_COMPONENT { $$="component"; } +entity_class: t_LABEL { $$="label"; } +entity_class: t_TYPE { $$="type"; } +entity_class: t_SUBTYPE { $$="subtype"; } +entity_class: t_PROCEDURE { $$="procedure"; } +entity_class: t_FUNCTION { $$=""; } +entity_class: t_SIGNAL { $$="signal"; } +entity_class: t_VARIABLE { $$="variable"; } +entity_class: t_CONSTANT { $$="constant"; } +entity_class: t_GROUP { $$="group"; } +entity_class: t_FILE { $$="file"; } +entity_class: t_UNITS { $$="units"; } +entity_class: t_LITERAL { $$="literal"; } +entity_class: t_SEQUENCE { $$="sequence"; } +entity_class: t_PROPERTY { $$="property"; } /*-------------------------------------------------- @@ -1229,738 +1280,782 @@ entity_class : t_PROPERTY {$$="property" --------------------------------------------------------------------------*/ +if_generation_scheme: if_scheme -if_generation_scheme : if_scheme +if_scheme: t_IF expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 +if_scheme: t_IF lable expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 +if_scheme_2: /* empty */ +if_scheme_2: t_ELSE t_GENERATE generate_statement_body +if_scheme_2: t_ELSE lable t_GENERATE generate_statement_body +if_scheme_1: /* empty */ +if_scheme_1: if_scheme_1 if_scheme_3 +if_scheme_3: t_ELSIF expr t_GENERATE generate_statement_body +if_scheme_3: t_ELSIF lable expr t_GENERATE generate_statement_body -if_scheme : t_IF expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 -if_scheme : t_IF lable expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 +generation_scheme: for_scheme -if_scheme_2 : /* empty */ -if_scheme_2 : t_ELSE t_GENERATE generate_statement_body -if_scheme_2 : t_ELSE lable t_GENERATE generate_statement_body -if_scheme_1 : /* empty */ -if_scheme_1 : if_scheme_1 if_scheme_3 -if_scheme_3 : t_ELSIF expr t_GENERATE generate_statement_body -if_scheme_3 : t_ELSIF lable expr t_GENERATE generate_statement_body +iteration_scheme: for_scheme +iteration_scheme: while_scheme -generation_scheme : for_scheme +for_scheme: t_FOR t_Identifier t_IN discrete_range +for_scheme: t_FOR lable t_Identifier t_IN discrete_range -iteration_scheme : for_scheme -iteration_scheme : while_scheme - -for_scheme : t_FOR t_Identifier t_IN discrete_range -for_scheme : t_FOR lable t_Identifier t_IN discrete_range - -while_scheme : t_WHILE expr +while_scheme: t_WHILE expr /*-------------------------------------------------- -- Concurrent Statements ----------------------------------------------------*/ -concurrent_stats : concurrent_stats_1 -concurrent_stats_1 : /* empty */ -concurrent_stats_1 : concurrent_stats_1 concurrent_stats_2 -concurrent_stats_2 : concurrent_stat - -concurrent_stat : block_stat - | concurrent_assertion_stat - | concurrent_procedure_call - | concurrent_signal_assign_stat - | comp_inst_stat - | generate_stat - | procs_stat - -block_stat : t_Identifier t_Colon t_BLOCK block_stat_0 block_stat_1 block_stat_2 -block_stat_3 block_stat_4 t_BEGIN concurrent_stats t_END t_BLOCK block_stat_5 -t_Semicolon -block_stat_5 : /* empty */ -block_stat_5 : t_Identifier -block_stat_4 : /* empty */ -block_stat_4 : block_stat_4 block_stat_6 -block_stat_6 : block_decltve_item -block_stat_3 : /* empty */ -block_stat_3 : t_PORT interf_list t_Semicolon block_stat_7 -//block_sta_7 : /* empty */ -block_stat_7 : t_PORT t_MAP association_list t_Semicolon -block_stat_2 : /* empty */ -block_stat_2 : t_GENERIC interf_list t_Semicolon block_stat_8 -block_stat_8 : /* empty */ -block_stat_8 : t_GENERIC t_MAP association_list t_Semicolon -block_stat_1 : /* empty */ -block_stat_1 : t_LeftParen expr t_RightParen block_stat_0 -block_stat_0: /* empty */ +concurrent_stats: concurrent_stats_1 +concurrent_stats_1: /* empty */ +concurrent_stats_1: concurrent_stats_1 concurrent_stats_2 +concurrent_stats_2: concurrent_stat + +concurrent_stat : block_stat + | concurrent_assertion_stat + | concurrent_procedure_call + | concurrent_signal_assign_stat + | comp_inst_stat + | generate_stat + | procs_stat + +block_stat: t_Identifier t_Colon t_BLOCK block_stat_0 block_stat_1 block_stat_2 + block_stat_3 block_stat_4 t_BEGIN concurrent_stats t_END t_BLOCK block_stat_5 + t_Semicolon +block_stat_5: /* empty */ +block_stat_5: t_Identifier +block_stat_4: /* empty */ +block_stat_4: block_stat_4 block_stat_6 +block_stat_6: block_decltve_item +block_stat_3: /* empty */ +block_stat_3: t_PORT interf_list t_Semicolon block_stat_7 +//block_sta_7: /* empty */ +block_stat_7: t_PORT t_MAP association_list t_Semicolon +block_stat_2: /* empty */ +block_stat_2: t_GENERIC interf_list t_Semicolon block_stat_8 +block_stat_8: /* empty */ +block_stat_8: t_GENERIC t_MAP association_list t_Semicolon +block_stat_1: /* empty */ +block_stat_1: t_LeftParen expr t_RightParen block_stat_0 +block_stat_0: /* empty */ block_stat_0: t_IS -dot_name:t_Identifier {$$=$1;} - | dot_name t_Dot t_Identifier {$$=$1+"."+$3;} - ; - -mark_comp: dot_name comp_1 {$$=$1+" "+$2;} -mark_comp: dot_name {$$=$1;} - -comp_1: t_LeftParen t_Identifier t_RightParen {$$="("+$2+")";} - - vcomp_stat :t_CONFIGURATION {$$="configurátion";yyLineNr=s_str.iLine;} - vcomp_stat : t_ENTITY {$$="entity";yyLineNr=s_str.iLine;} - vcomp_stat : t_COMPONENT {$$="component";yyLineNr=s_str.iLine;} - -comp_inst_stat : t_Identifier t_Colon name {yyLineNr=s_str.iLine;} t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon +dot_name: t_Identifier { $$=$1; } + | dot_name t_Dot t_Identifier { $$=$1+"."+$3; } + ; + +mark_comp: dot_name comp_1 { $$=$1+" "+$2; } +mark_comp: dot_name { $$=$1; } + +comp_1: t_LeftParen t_Identifier t_RightParen { $$="("+$2+")"; } + +vcomp_stat: t_CONFIGURATION { $$="configurátion";yyLineNr=s_str.iLine; } +vcomp_stat: t_ENTITY { $$="entity";yyLineNr=s_str.iLine; } +vcomp_stat: t_COMPONENT { $$="component";yyLineNr=s_str.iLine; } + +comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; } t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon { addCompInst($1.data(),$3.data(),0,yyLineNr); } -comp_inst_stat : t_Identifier t_Colon name {yyLineNr=s_str.iLine;} t_PORT t_MAP association_list t_Semicolon +comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; } t_PORT t_MAP association_list t_Semicolon { addCompInst($1.data(),$3.data(),0,yyLineNr); } -comp_inst_stat : t_Identifier t_Colon vcomp_stat mark_comp t_PORT t_MAP association_list t_Semicolon +comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_PORT t_MAP association_list t_Semicolon { addCompInst($1.data(),$4.data(),$3.data(),yyLineNr); } -comp_inst_stat : t_Identifier t_Colon vcomp_stat mark_comp t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon +comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon { addCompInst($1.data(),$4.data(),$3.data(),yyLineNr); - } -comp_inst_stat_1 : /* empty */ -comp_inst_stat_1 : t_PORT t_MAP association_list - -concurrent_assertion_stat : t_Identifier t_Colon assertion_stat -concurrent_assertion_stat : assertion_stat - -concurrent_assertion_stat : t_Identifier t_Colon t_POSTPONED assertion_stat -concurrent_assertion_stat : t_POSTPONED assertion_stat + } +comp_inst_stat_1: /* empty */ +comp_inst_stat_1: t_PORT t_MAP association_list -concurrent_procedure_call : t_Identifier t_Colon procedure_call_stat -concurrent_procedure_call : procedure_call_stat +concurrent_assertion_stat: t_Identifier t_Colon assertion_stat +concurrent_assertion_stat: assertion_stat -concurrent_procedure_call : t_Identifier t_Colon t_POSTPONED procedure_call_stat -concurrent_procedure_call : t_POSTPONED procedure_call_stat +concurrent_assertion_stat: t_Identifier t_Colon t_POSTPONED assertion_stat +concurrent_assertion_stat: t_POSTPONED assertion_stat +concurrent_procedure_call: t_Identifier t_Colon procedure_call_stat +concurrent_procedure_call: procedure_call_stat -concurrent_signal_assign_stat : t_Identifier t_Colon condal_signal_assign -concurrent_signal_assign_stat : condal_signal_assign +concurrent_procedure_call: t_Identifier t_Colon t_POSTPONED procedure_call_stat +concurrent_procedure_call: t_POSTPONED procedure_call_stat -concurrent_signal_assign_stat : t_Identifier t_Colon t_POSTPONED condal_signal_assign -concurrent_signal_assign_stat : t_POSTPONED condal_signal_assign +concurrent_signal_assign_stat: t_Identifier t_Colon condal_signal_assign +concurrent_signal_assign_stat: condal_signal_assign -concurrent_signal_assign_stat : t_Identifier t_Colon t_POSTPONED sel_signal_assign -concurrent_signal_assign_stat : t_POSTPONED sel_signal_assign +concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED condal_signal_assign +concurrent_signal_assign_stat: t_POSTPONED condal_signal_assign -concurrent_signal_assign_stat : t_Identifier t_Colon sel_signal_assign -concurrent_signal_assign_stat : sel_signal_assign +concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED sel_signal_assign +concurrent_signal_assign_stat: t_POSTPONED sel_signal_assign +concurrent_signal_assign_stat: t_Identifier t_Colon sel_signal_assign +concurrent_signal_assign_stat: sel_signal_assign -condal_signal_assign : target t_LESym opts condal_wavefrms t_Semicolon +condal_signal_assign: target t_LESym opts condal_wavefrms t_Semicolon -condal_wavefrms:wavefrm -condal_wavefrms:wavefrm t_WHEN expr -condal_wavefrms:wavefrm t_WHEN expr t_ELSE condal_wavefrms +condal_wavefrms: wavefrm +condal_wavefrms: wavefrm t_WHEN expr +condal_wavefrms: wavefrm t_WHEN expr t_ELSE condal_wavefrms -wavefrm : wavefrm_element wavefrm_1 -wavefrm : t_UNAFFECTED -wavefrm_1 : /* empty */ -wavefrm_1 : wavefrm_1 wavefrm_2 -wavefrm_2 : t_Comma wavefrm_element +wavefrm: wavefrm_element wavefrm_1 +wavefrm: t_UNAFFECTED +wavefrm_1: /* empty */ +wavefrm_1: wavefrm_1 wavefrm_2 +wavefrm_2: t_Comma wavefrm_element -wavefrm_element : expr wavefrm_element_1 -wavefrm_element_1 : /* empty */ -wavefrm_element_1 : t_AFTER expr -wavefrm_element_1 : t_NULL wavefrm_element_2 -wavefrm_element_1 : t_NULL - +wavefrm_element: expr wavefrm_element_1 +wavefrm_element_1: /* empty */ +wavefrm_element_1: t_AFTER expr +wavefrm_element_1: t_NULL wavefrm_element_2 +wavefrm_element_1: t_NULL +wavefrm_element_2: t_AFTER expr -wavefrm_element_2 : t_AFTER expr - -target : name -target : aggregate +target: name +target: aggregate -opts : opts_1 opts_2 +opts: opts_1 opts_2 -opts_2 : /* empty */ -opts_2 : t_TRANSPORT -opts_2 : t_REJECT expr t_INERTIAL -opts_2 : t_INERTIAL +opts_2: /* empty */ +opts_2: t_TRANSPORT +opts_2: t_REJECT expr t_INERTIAL +opts_2: t_INERTIAL -opts_1 : /* empty */ -opts_1 : t_GUARDED +opts_1: /* empty */ +opts_1: t_GUARDED -sel_signal_assign : t_WITH expr t_SELECT target t_LESym opts sel_wavefrms t_Semicolon +sel_signal_assign: t_WITH expr t_SELECT target t_LESym opts sel_wavefrms t_Semicolon -sel_wavefrms : sel_wavefrms_1 wavefrm t_WHEN choices -sel_wavefrms_1 : /* empty */ -sel_wavefrms_1 : sel_wavefrms_1 sel_wavefrms_2 -sel_wavefrms_2 : wavefrm t_WHEN choices t_Comma +sel_wavefrms: sel_wavefrms_1 wavefrm t_WHEN choices +sel_wavefrms_1: /* empty */ +sel_wavefrms_1: sel_wavefrms_1 sel_wavefrms_2 +sel_wavefrms_2: wavefrm t_WHEN choices t_Comma -gen_stat1: /* empty */ +gen_stat1: /* empty */ | block_declarative_part t_BEGIN | t_BEGIN - + // problem with double end // end; // end generate; - -generate_statement_body: gen_stat1 concurrent_stats - -generate_stat : t_Identifier t_Colon { pushLabel($1); } generation_scheme t_GENERATE - gen_stat1 concurrent_stats opstat - -// stems from VHDL 2008 generate_statement_body - opstat : end_stats t_END generate_stat_1 t_Semicolon { popLabel(); } - opstat : t_END generate_stat_1 t_Semicolon { popLabel(); } - -generate_stat : t_Identifier t_Colon { pushLabel($1); } if_generation_scheme - opstat // t_END generate_stat_1 t_Semicolon { popLabel(); } - -generate_stat : t_Identifier t_Colon case_scheme - -generate_stat_1 : t_GENERATE { $$=""; } -generate_stat_1 : t_GENERATE t_Identifier { $$=$2; } - - - //end_stats : - end_stats : t_END t_Semicolon - end_stats : t_END t_Identifier t_Semicolon - - - -procs_stat : t_Identifier t_Colon procs_stat1 - { - current->name=$1; - current->endBodyLine=s_str.yyLineNr; - newEntry(); - } - - -procs_stat : procs_stat1 - { - current->name=VhdlDocGen::getProcessNumber(); - current->endBodyLine=s_str.yyLineNr; - newEntry(); - } - -procs_stat1 : procs_stat1_5 {currP=VhdlDocGen::PROCESS;} t_PROCESS procs_stat1_1 procs_stat1_2 t_BEGIN seq_stats t_END - procs_stat1_3 t_Semicolon {currP=0;} - { - createFunction(currName,VhdlDocGen::PROCESS,$4.data()); - } -procs_stat1 : error t_END procs_stat1_3 t_Semicolon {currP=0;} - -procs_stat1_3 : /* empty */ -procs_stat1_3 : procs_stat1_5 t_PROCESS procs_stat1_6 +generate_statement_body: gen_stat1 concurrent_stats -procs_stat1_5 : /* empty */ {$$="";} -procs_stat1_5 : t_POSTPONED {$$="postponed";} +generate_stat : t_Identifier t_Colon + { pushLabel($1); } + generation_scheme t_GENERATE + gen_stat1 concurrent_stats opstat -procs_stat1_6 : /* empty */ {$$="";} -procs_stat1_6 : t_Identifier {$$=$1;} - -procs_stat1_2 : /* empty */ -procs_stat1_2 : t_IS -procs_stat1_2 : procs_stat1_2 procs_stat1_4 -procs_stat1_4 : procs_decltve_item -procs_stat1_1 : /* empty */ {$$="";} -procs_stat1_1 : t_LeftParen t_ALL t_RightParen {$$="all";} -procs_stat1_1 : t_LeftParen sensitivity_list t_RightParen {$$=$2;} - -sensitivity_list : name sensitivity_list_1 {$$=$1+" "+$2;} -sensitivity_list_1 : /* empty */ {$$="";} -sensitivity_list_1 : sensitivity_list_1 sensitivity_list_2 {$$=$1+" "+$2;} -sensitivity_list_2 : t_Comma name {$$=","+$2;} +// stems from VHDL 2008 generate_statement_body +opstat: end_stats t_END generate_stat_1 t_Semicolon { popLabel(); } +opstat: t_END generate_stat_1 t_Semicolon { popLabel(); } + +generate_stat: t_Identifier t_Colon + { pushLabel($1); } + if_generation_scheme opstat // t_END generate_stat_1 t_Semicolon { popLabel(); } +generate_stat: t_Identifier t_Colon case_scheme + +generate_stat_1: t_GENERATE { $$=""; } +generate_stat_1: t_GENERATE t_Identifier { $$=$2; } + +//end_stats : +end_stats: t_END t_Semicolon +end_stats: t_END t_Identifier t_Semicolon + +procs_stat: t_Identifier t_Colon procs_stat1 + { + current->name=$1; + current->endBodyLine=s_str.yyLineNr; + newEntry(); + } + +procs_stat: procs_stat1 + { + current->name=VhdlDocGen::getProcessNumber(); + current->endBodyLine=s_str.yyLineNr; + newEntry(); + } + +procs_stat1: procs_stat1_5 + { currP=VhdlDocGen::PROCESS; } + t_PROCESS procs_stat1_1 procs_stat1_2 t_BEGIN seq_stats t_END + procs_stat1_3 t_Semicolon + { currP=0; + createFunction(currName,VhdlDocGen::PROCESS,$4.data()); + } +procs_stat1: error t_END procs_stat1_3 t_Semicolon { currP=0; } + +procs_stat1_3: /* empty */ +procs_stat1_3: procs_stat1_5 t_PROCESS procs_stat1_6 + +procs_stat1_5: /* empty */ { $$=""; } +procs_stat1_5: t_POSTPONED { $$="postponed"; } + +procs_stat1_6: /* empty */ { $$=""; } +procs_stat1_6: t_Identifier { $$=$1; } + +procs_stat1_2: /* empty */ +procs_stat1_2: t_IS +procs_stat1_2: procs_stat1_2 procs_stat1_4 +procs_stat1_4: procs_decltve_item +procs_stat1_1: /* empty */ { $$=""; } +procs_stat1_1: t_LeftParen t_ALL t_RightParen { $$="all"; } +procs_stat1_1: t_LeftParen sensitivity_list t_RightParen { $$=$2; } + +sensitivity_list: name sensitivity_list_1 { $$=$1+" "+$2; } +sensitivity_list_1: /* empty */ { $$=""; } +sensitivity_list_1: sensitivity_list_1 sensitivity_list_2 { $$=$1+" "+$2; } +sensitivity_list_2: t_Comma name { $$=","+$2; } /*-------------------------------------------------- -- Sequential Statements ----------------------------------------------------*/ -seq_stats : seq_stats_1 -seq_stats_1 : /* empty */ -seq_stats_1 : seq_stats_1 seq_stats_2 -seq_stats_2 : seq_stat - -seq_stat : assertion_stat -seq_stat : lable assertion_stat -seq_stat : case_stat -seq_stat : exit_stat -seq_stat : if_stat -seq_stat : loop_stat -seq_stat : next_stat -seq_stat : null_stat -seq_stat : procedure_call_stat -seq_stat : return_stat -seq_stat :lable signal_assign_stat -seq_stat : signal_assign_stat -seq_stat : variable_assign_stat -seq_stat : wait_stat -seq_stat : lable wait_stat -seq_stat : report_statement - - - -report_statement : loop_stat_1 t_REPORT expr assertion_stat_2 t_Semicolon - -assertion_stat : t_ASSERT expr assertion_stat_1 assertion_stat_2 t_Semicolon -assertion_stat_2 : /* empty */ -assertion_stat_2 : t_SEVERITY expr +seq_stats: seq_stats_1 +seq_stats_1: /* empty */ +seq_stats_1: seq_stats_1 seq_stats_2 +seq_stats_2: seq_stat + +seq_stat: assertion_stat +seq_stat: lable assertion_stat +seq_stat: case_stat +seq_stat: exit_stat +seq_stat: if_stat +seq_stat: loop_stat +seq_stat: next_stat +seq_stat: null_stat +seq_stat: procedure_call_stat +seq_stat: return_stat +seq_stat: lable signal_assign_stat +seq_stat: signal_assign_stat +seq_stat: variable_assign_stat +seq_stat: wait_stat +seq_stat: lable wait_stat +seq_stat: report_statement + +report_statement: loop_stat_1 t_REPORT expr assertion_stat_2 t_Semicolon + +assertion_stat: t_ASSERT expr assertion_stat_1 assertion_stat_2 t_Semicolon +assertion_stat_2: /* empty */ +assertion_stat_2 : t_SEVERITY expr assertion_stat_1 : /* empty */ -assertion_stat_1 : t_REPORT expr +assertion_stat_1 : t_REPORT expr choice_stat : /* empty */ -choice_stat : t_Q +choice_stat : t_Q choice_stat_1: /* empty */ -choice_stat_1 : t_Q +choice_stat_1 : t_Q choice_stat_1 : t_Identifier -case_stat : t_CASE choice_stat expr t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon -case_stat : lable t_CASE choice_stat expr t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon +case_stat : t_CASE choice_stat expr t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon +case_stat : lable t_CASE choice_stat expr t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon -case_stat : t_CASE error t_END t_CASE choice_stat_1 t_Semicolon +case_stat : t_CASE error t_END t_CASE choice_stat_1 t_Semicolon case_stat_1 : /* empty */ -case_stat_1 : case_stat_1 case_stat_2 -case_stat_2 : case_stat_alternative +case_stat_1 : case_stat_1 case_stat_2 +case_stat_2 : case_stat_alternative -case_stat_alternative : t_WHEN choices t_Arrow seq_stats +case_stat_alternative : t_WHEN choices t_Arrow seq_stats -exit_stat : t_EXIT exit_stat_1 exit_stat_2 t_Semicolon +exit_stat : t_EXIT exit_stat_1 exit_stat_2 t_Semicolon exit_stat_2 : /* empty */ -exit_stat_2 : t_WHEN expr +exit_stat_2 : t_WHEN expr exit_stat_1 : /* empty */ -exit_stat_1 : t_Identifier +exit_stat_1 : t_Identifier -if_stat : t_IF expr t_THEN seq_stats if_stat_1 if_stat_2 t_END t_IF t_Semicolon -if_stat : t_IF expr t_THEN error t_END t_IF t_Semicolon +if_stat : t_IF expr t_THEN seq_stats if_stat_1 if_stat_2 t_END t_IF t_Semicolon +if_stat : t_IF expr t_THEN error t_END t_IF t_Semicolon if_stat_2 : /* empty */ -if_stat_2 : t_ELSE seq_stats +if_stat_2 : t_ELSE seq_stats if_stat_1 : /* empty */ -if_stat_1 : if_stat_1 if_stat_3 -if_stat_3 : t_ELSIF expr t_THEN seq_stats - -loop_stat : loop_stat_1 loop_stat_2 t_LOOP seq_stats t_END t_LOOP loop_stat_3 t_Semicolon -loop_stat_3 : /* empty */ -loop_stat_3 : t_Identifier -loop_stat_2 : /* epty */ -loop_stat_2 : iteration_scheme -loop_stat_1 : /* empty */ -loop_stat_1 : t_Identifier t_Colon - -next_stat : t_NEXT next_stat_1 next_stat_2 t_Semicolon -next_stat_2 : /* empty */ -next_stat_2 : t_WHEN expr -next_stat_1 : /* empty */ -next_stat_1 : t_Identifier - -null_stat : t_NULL t_Semicolon - -procedure_call_stat : name t_Semicolon - -return_stat : t_RETURN return_stat_1 t_Semicolon -return_stat_1 : /* empty */ -return_stat_1 : expr - -signal_assign_stat : target t_LESym wavefrm t_Semicolon - | target t_LESym delay_mechanism wavefrm t_Semicolon - | target t_LESym t_FORCE inout_stat expr t_Semicolon - | target t_LESym t_RELEASE inout_stat t_Semicolon - | selected_signal_assignment - | conditional_signal_assignment - ; - - - -variable_assign_stat : variable_assign_stat_1 t_Semicolon - | conditional_variable_assignment - | lable selected_variable_assignment - | selected_variable_assignment - -lable: t_Identifier t_Colon -variable_assign_stat_1: target t_VarAsgn expr -variable_assign_stat_1: lable target t_VarAsgn expr - -wait_stat : t_WAIT wait_stat_1 wait_stat_2 wait_stat_3 t_Semicolon -wait_stat_3 : /* empty */ -wait_stat_3 : t_FOR expr -wait_stat_2 : /* empty */ -wait_stat_2 : t_UNTIL expr -wait_stat_1 : /* empty */ -wait_stat_1 : t_ON sensitivity_list +if_stat_1 : if_stat_1 if_stat_3 +if_stat_3 : t_ELSIF expr t_THEN seq_stats + +loop_stat: loop_stat_1 loop_stat_2 t_LOOP seq_stats t_END t_LOOP loop_stat_3 t_Semicolon +loop_stat_3: /* empty */ +loop_stat_3: t_Identifier +loop_stat_2: /* epty */ +loop_stat_2: iteration_scheme +loop_stat_1: /* empty */ +loop_stat_1: t_Identifier t_Colon + +next_stat: t_NEXT next_stat_1 next_stat_2 t_Semicolon +next_stat_2: /* empty */ +next_stat_2: t_WHEN expr +next_stat_1: /* empty */ +next_stat_1: t_Identifier + +null_stat: t_NULL t_Semicolon + +procedure_call_stat: name t_Semicolon + +return_stat: t_RETURN return_stat_1 t_Semicolon +return_stat_1: /* empty */ +return_stat_1: expr + +signal_assign_stat: target t_LESym wavefrm t_Semicolon + | target t_LESym delay_mechanism wavefrm t_Semicolon + | target t_LESym t_FORCE inout_stat expr t_Semicolon + | target t_LESym t_RELEASE inout_stat t_Semicolon + | selected_signal_assignment + | conditional_signal_assignment + ; + +variable_assign_stat: variable_assign_stat_1 t_Semicolon + | conditional_variable_assignment + | lable selected_variable_assignment + | selected_variable_assignment + +lable: t_Identifier t_Colon +variable_assign_stat_1: target t_VarAsgn expr +variable_assign_stat_1: lable target t_VarAsgn expr + +wait_stat: t_WAIT wait_stat_1 wait_stat_2 wait_stat_3 t_Semicolon +wait_stat_3: /* empty */ +wait_stat_3: t_FOR expr +wait_stat_2: /* empty */ +wait_stat_2: t_UNTIL expr +wait_stat_1: /* empty */ +wait_stat_1: t_ON sensitivity_list /*-------------------------------------------------- -- Components and Configurations ----------------------------------------------------*/ - comp_end_dec : t_END {lastEntity=0;lastCompound=0;genLabels.resize(0);} - | t_END t_COMPONENT entity_decl_5 - | t_END t_ARCHITECTURE entity_decl_5 {lastCompound=0;genLabels.resize(0);} - | t_END t_ENTITY entity_decl_5 {lastEntity=0;genLabels.resize(0);} - | t_END t_Identifier {lastEntity=0;lastCompound=0;genLabels.resize(0);} - - iss :/*empty*/ {currP=VhdlDocGen::COMPONENT;} - | t_IS {currP=VhdlDocGen::COMPONENT;} - -comp_decl : t_COMPONENT t_Identifier iss comp_decl_1 comp_decl_2 comp_end_dec t_Semicolon - { - addVhdlType($2,getParsedLine(t_COMPONENT),Entry::VARIABLE_SEC,VhdlDocGen::COMPONENT,0,0); - currP=0; - } -comp_decl_2 : /* empty */ {$$="";} -comp_decl_2 : t_PORT interf_list t_Semicolon {$$=$2;} -comp_decl_1 : /* empty */ {$$="";} -comp_decl_1 : t_GENERIC interf_list t_Semicolon {$$=$2;} - -block_config : t_FOR block_spec block_config_1 block_config_2 t_END t_FOR t_Semicolon +comp_end_dec : t_END { lastEntity=0; lastCompound=0; genLabels.resize(0); } + | t_END t_COMPONENT entity_decl_5 + | t_END t_ARCHITECTURE entity_decl_5 { lastCompound=0; genLabels.resize(0); } + | t_END t_ENTITY entity_decl_5 { lastEntity=0; genLabels.resize(0); } + | t_END t_Identifier { lastEntity=0; lastCompound=0; genLabels.resize(0); } + +iss :/*empty*/ { currP=VhdlDocGen::COMPONENT; } + | t_IS { currP=VhdlDocGen::COMPONENT; } + +comp_decl: t_COMPONENT t_Identifier iss comp_decl_1 comp_decl_2 comp_end_dec t_Semicolon + { + addVhdlType($2,getParsedLine(t_COMPONENT),Entry::VARIABLE_SEC,VhdlDocGen::COMPONENT,0,0); + currP=0; + } +comp_decl_2: /* empty */ { $$=""; } +comp_decl_2: t_PORT interf_list t_Semicolon { $$=$2; } +comp_decl_1: /* empty */ { $$=""; } +comp_decl_1: t_GENERIC interf_list t_Semicolon { $$=$2; } + +block_config: t_FOR block_spec block_config_1 block_config_2 t_END t_FOR t_Semicolon { popConfig(); } - -block_config : t_FOR error t_END t_FOR t_Semicolon {$$="";} -block_config_2 : /* empty */ {$$="";} -block_config_2 : block_config_2 block_config_3 - { - $$=$1+" "; - } -block_config_3 : config_item {$$=$1;} -block_config_1 : /* empty */ {$$="";} -block_config_1 : block_config_1 block_config_4 - { - $$=$1; - } -block_config_4 : use_clause {$$=$1;} - -block_spec : name { -$$=$1; - - if(levelCounter==0) - addConfigureNode($1.data(),NULL,TRUE,FALSE); - else - addConfigureNode($1.data(),NULL,FALSE,FALSE); -} - -config_item : block_config { -$$=$1; - } - -config_item : comp_config { - $$=$1; - } - -comp_config : t_FOR comp_spec comp_config_1 comp_config_2 t_END t_FOR t_Semicolon - { - $$=$2+" "+$3+" "+$4; - popConfig(); - } -comp_config_2 : /* empty */ {$$="";} -comp_config_2 : block_config {$$=$1;} -comp_config_1 : /*empty*/ {$$="";} - -comp_config_1 : binding_indic_1 binding_indic_2 t_Semicolon {$$="";} -comp_config_1 : t_USE t_VUNIT idf_list t_Semicolon {$$="";} -comp_config_1 : t_USE binding_indic t_Semicolon - { - addConfigureNode(compSpec.data(),$2.data(),FALSE,FALSE); - } - -config_spec : t_FOR comp_spec comp_spec_stat t_Semicolon {addConfigureNode($2.data(),$3.data(),TRUE,FALSE,TRUE);currNode->confVhdl=lastCompound->name; } -config_spec : t_FOR comp_spec comp_spec_stat t_Semicolon t_END t_FOR t_Semicolon {addConfigureNode($2.data(),$3.data(),TRUE,FALSE,TRUE);currNode->confVhdl=lastCompound->name; } - -comp_spec_stat : t_USE binding_indic { $$=$2;} -comp_spec_stat : t_USE t_VUNIT idf_list t_Semicolon {$$="";} -comp_spec_stat : binding_indic_1 binding_indic_2 {$$="";} - -comp_spec : inst_list t_Colon expr - { + +block_config: t_FOR error t_END t_FOR t_Semicolon { $$=""; } +block_config_2: /* empty */ { $$=""; } +block_config_2: block_config_2 block_config_3 { $$=$1+" "; } +block_config_3: config_item { $$=$1; } +block_config_1: /* empty */ { $$=""; } +block_config_1: block_config_1 block_config_4 { $$=$1; } +block_config_4: use_clause { $$=$1; } + +block_spec: name + { + $$=$1; + + if (levelCounter==0) + addConfigureNode($1.data(),NULL,TRUE,FALSE); + else + addConfigureNode($1.data(),NULL,FALSE,FALSE); + } + +config_item: block_config { $$=$1; } +config_item: comp_config { $$=$1; } + +comp_config: t_FOR comp_spec comp_config_1 comp_config_2 t_END t_FOR t_Semicolon + { + $$=$2+" "+$3+" "+$4; + popConfig(); + } +comp_config_2: /* empty */ { $$=""; } +comp_config_2: block_config { $$=$1; } +comp_config_1: /*empty*/ { $$=""; } + +comp_config_1: binding_indic_1 binding_indic_2 t_Semicolon { $$=""; } +comp_config_1: t_USE t_VUNIT idf_list t_Semicolon { $$=""; } +comp_config_1: t_USE binding_indic t_Semicolon + { + addConfigureNode(compSpec.data(),$2.data(),FALSE,FALSE); + } + +config_spec: t_FOR comp_spec comp_spec_stat t_Semicolon + { + addConfigureNode($2.data(),$3.data(),TRUE,FALSE,TRUE);currNode->confVhdl=lastCompound->name; + } +config_spec: t_FOR comp_spec comp_spec_stat t_Semicolon t_END t_FOR t_Semicolon + { + addConfigureNode($2.data(),$3.data(),TRUE,FALSE,TRUE);currNode->confVhdl=lastCompound->name; + } + +comp_spec_stat: t_USE binding_indic { $$=$2; } +comp_spec_stat: t_USE t_VUNIT idf_list t_Semicolon { $$=""; } +comp_spec_stat: binding_indic_1 binding_indic_2 { $$=""; } + +comp_spec: inst_list t_Colon expr + { $$=$1+":"+$3; - compSpec=$$; - } + compSpec=$$; + } +inst_list: idf_list { $$=$1; } +inst_list: t_ALL { $$="all"; } +inst_list: t_OTHERS { $$="others"; } +binding_indic : entity_aspect binding_indic_1 binding_indic_2 { $$=$1; } -inst_list : idf_list {$$=$1;} -inst_list : t_ALL {$$="all";} -inst_list : t_OTHERS {$$="others";} +binding_indic_2: +binding_indic_2: t_PORT t_MAP association_list -binding_indic : entity_aspect binding_indic_1 binding_indic_2 - { - $$=$1; - } +binding_indic_1: +binding_indic_1: t_GENERIC t_MAP association_list -binding_indic_2 : -binding_indic_2 : t_PORT t_MAP association_list +entity_aspect: t_ENTITY name { $$="entity "+$2; } +entity_aspect: t_CONFIGURATION mark { $$="configuration "+ $2; } +entity_aspect: t_OPEN { $$="open "; } + ; -binding_indic_1 : +group_constituent: t_Identifier { $$=$1; } + | t_CharacterLit { $$=$1; } + ; -binding_indic_1 : t_GENERIC t_MAP association_list +group_constituent_list: group_constituent { $$=$1; } + | group_constituent_list t_Comma group_constituent { $$=$1+","+$3; } + ; +group_declaration : t_GROUP t_Identifier t_Colon group_name t_LeftParen group_constituent_list t_RightParen t_Semicolon + { + // $$=$2+":"+$4+$6; + $$="("+$4+$6+")"; + addVhdlType($2,getParsedLine(t_GROUP),Entry::VARIABLE_SEC,VhdlDocGen::GROUP,$$.data(),0); + } -entity_aspect : t_ENTITY name {$$="entity "+$2;} +group_template_declaration : t_GROUP t_Identifier t_IS t_LeftParen entity_class_entry_list t_RightParen t_Semicolon + { + $$=$2+":"+$5; + addVhdlType($2,getParsedLine(t_GROUP),Entry::VARIABLE_SEC,VhdlDocGen::GROUP,$5.data(),0); + } -entity_aspect : t_CONFIGURATION mark {$$="configuration "+ $2;} +group_template_declaration: t_GROUP t_Identifier t_IS t_LeftParen error t_Semicolon t_RightParen { $$=""; } -entity_aspect : t_OPEN {$$="open ";} -; +entity_class_entry : entity_class tbox -group_constituent : t_Identifier {$$=$1;} - | t_CharacterLit {$$=$1;} - ; +tbox : /* empty */ { $$=""; } +tbox : t_Box { $$="<>"; } -group_constituent_list : group_constituent {$$=$1;} - | group_constituent_list t_Comma group_constituent {$$=$1+","+$3;} - ; - - group_declaration : t_GROUP t_Identifier t_Colon group_name t_LeftParen group_constituent_list t_RightParen t_Semicolon - { - // $$=$2+":"+$4+$6; - $$="("+$4+$6+")"; - addVhdlType($2,getParsedLine(t_GROUP),Entry::VARIABLE_SEC,VhdlDocGen::GROUP,$$.data(),0); - } - - group_template_declaration : t_GROUP t_Identifier t_IS t_LeftParen entity_class_entry_list t_RightParen t_Semicolon - { - $$=$2+":"+$5; - addVhdlType($2,getParsedLine(t_GROUP),Entry::VARIABLE_SEC,VhdlDocGen::GROUP,$5.data(),0); - } - - group_template_declaration: t_GROUP t_Identifier t_IS t_LeftParen error t_Semicolon t_RightParen {$$="";} - entity_class_entry : entity_class tbox - - tbox : /* empty */ {$$="";} - tbox : t_Box {$$="<>";} - - entity_class_entry_list : entity_class_entry {$$=$1;} - | entity_class_entry_list t_Comma entity_class_entry {$$=$1+","+$3;} - ; - -group_name : t_Identifier {$$=$1;} -group_name: t_StringLit {$$=$1;} - - t_Identifier : t_LETTER - { - $$=s_str.qstr; - } - - - t_BitStringLit :t_DIGIT - { - $$=s_str.qstr; - } - - - t_StringLit : t_STRING - { - $$=s_str.qstr; - } +entity_class_entry_list: entity_class_entry { $$=$1; } + | entity_class_entry_list + t_Comma entity_class_entry { $$=$1+","+$3; } + ; - t_AbstractLit : t_ABSTRLIST - { - $$=s_str.qstr; - } - - t_CharacterLit : t_CHARLIST - { - $$=s_str.qstr; - } +group_name: t_Identifier { $$=$1; } +group_name: t_StringLit { $$=$1; } + +t_Identifier: t_LETTER + { + $$=s_str.qstr; + } + +t_BitStringLit: t_DIGIT + { + $$=s_str.qstr; + } + +t_StringLit: t_STRING + { + $$=s_str.qstr; + } + +t_AbstractLit: t_ABSTRLIST + { + $$=s_str.qstr; + } + +t_CharacterLit: t_CHARLIST + { + $$=s_str.qstr; + } /*-------------------------------------------------- -- VHDL 2002 extensions -- to do: must be added -----------------------------------------------------*/ -protected_type_declaration:t_PROTECTED protected_stats t_END protected_stat_1 {$$="";} -protected_type_declaration:t_PROTECTED error t_END protected_stat_1 {$$="";} - - protected_stats : /* empty */ - protected_stats : protected_stats protected_stat_decl_1 - protected_stat_decl_1: protected_type_declaration_item - protected_stat_1:t_PROTECTED - protected_stat_1:t_PROTECTED t_Identifier - -protected_type_declaration_item : use_clause -protected_type_declaration_item : attribute_spec -protected_type_declaration_item : subprog_decl -protected_type_declaration_item : subprogram_instantiation_decl - -protected_type_body : t_PROTECTED t_BODY protected_body_stats t_END protected_body_stat_1 {$$="";} -protected_type_body : t_PROTECTED t_BODY error t_END protected_body_stat_1 {$$="";} - - protected_body_stats : /* empty */ - protected_body_stats : protected_body_stats protected_body_stat_decl_1 - protected_body_stat_decl_1: protected_type_body_declaration_item +protected_type_declaration:t_PROTECTED protected_stats t_END protected_stat_1 { $$=""; } +protected_type_declaration:t_PROTECTED error t_END protected_stat_1 { $$=""; } + +protected_stats: /* empty */ +protected_stats: protected_stats protected_stat_decl_1 +protected_stat_decl_1: protected_type_declaration_item +protected_stat_1: t_PROTECTED +protected_stat_1: t_PROTECTED t_Identifier + +protected_type_declaration_item: use_clause +protected_type_declaration_item: attribute_spec +protected_type_declaration_item: subprog_decl +protected_type_declaration_item: subprogram_instantiation_decl + +protected_type_body: t_PROTECTED t_BODY protected_body_stats t_END protected_body_stat_1 { $$=""; } +protected_type_body: t_PROTECTED t_BODY error t_END protected_body_stat_1 { $$=""; } + +protected_body_stats: /* empty */ +protected_body_stats: protected_body_stats protected_body_stat_decl_1 +protected_body_stat_decl_1: protected_type_body_declaration_item protected_body_stat_1: t_PROTECTED t_BODY protected_body_stat_1: t_PROTECTED t_BODY t_Identifier protected_type_body_declaration_item: subprog_decltve_item // same as subprog - - /*-------------------------------------------------- -- VHDL 2008 extensions -- to do: must be added -----------------------------------------------------*/ - context_ref : t_CONTEXT sel_list t_Semicolon - - context_decl : t_CONTEXT t_Identifier t_IS libustcont_stats t_END context_stat_1 t_Semicolon - context_decl : t_CONTEXT t_Identifier t_IS t_END context_stat_1 t_Semicolon +context_ref: t_CONTEXT sel_list t_Semicolon { $$="context "+$2; } + +context_decl: t_CONTEXT t_Identifier t_IS { parse_sec=CONTEXT_SEC; } libustcont_stats t_END context_stat_1 t_Semicolon + { + parse_sec=0; + QCString v=$5; + addVhdlType($2,getParsedLine(t_LIBRARY),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,"context",$5.data()); + } +context_decl: t_CONTEXT t_Identifier t_IS t_END context_stat_1 t_Semicolon + { + addVhdlType($2,getParsedLine(t_LIBRARY),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,"context",0); + } context_stat_1: t_CONTEXT context_stat_1: t_CONTEXT t_Identifier - libustcont_stats : libustcont_stat - libustcont_stats : libustcont_stats libustcont_stat - - libustcont_stat : use_clause - libustcont_stat : lib_clause - libustcont_stat : context_ref - -package_instantiation_decl: t_PACKAGE t_Identifier t_IS t_NEW dot_name signature t_Semicolon; -package_instantiation_decl: t_PACKAGE t_Identifier t_IS t_NEW dot_name signature gen_assoc_list t_Semicolon -package_instantiation_decl: t_PACKAGE error t_Identifier t_IS t_NEW t_Semicolon; - -subprogram_instantiation_decl: t_FUNCTION t_Identifier t_IS t_NEW dot_name signature t_Semicolon -subprogram_instantiation_decl: t_FUNCTION t_Identifier t_IS t_NEW dot_name signature gen_assoc_list t_Semicolon -subprogram_instantiation_decl: t_FUNCTION t_Identifier t_IS t_NEW error t_Semicolon +libustcont_stats: libustcont_stat { $$ = $1; } +libustcont_stats: libustcont_stats libustcont_stat { $$ = $1+"#"+$2; } -signature:/*empty*/ {$$="";} -signature: t_LEFTBR signature1 t_RIGHTBR {$$="["+$2+" ]";} -signature: t_LEFTBR t_RIGHTBR {$$="[ ]";} +libustcont_stat: use_clause { $$ = $1; } +libustcont_stat: lib_clause { $$ = $1; } +libustcont_stat: context_ref { $$ = $1; } +package_instantiation_decl: t_PACKAGE t_Identifier t_IS t_NEW dot_name signature t_Semicolon + { + $$=" is new "+$5+$6; + //Entry * pp=lastCompound; + //Entry * pps=lastEntity ; + //assert(false); + addVhdlType($2,getParsedLine(t_PACKAGE),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"package",$$.data()); + } +package_instantiation_decl: t_PACKAGE t_Identifier t_IS t_NEW dot_name signature gen_assoc_list t_Semicolon + { + $$=" is new "+$5+$6; + addVhdlType($2,getParsedLine(t_PACKAGE),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"package",$$.data()); + } +package_instantiation_decl: t_PACKAGE error t_Identifier t_IS t_NEW t_Semicolon { $$=""; } +subprogram_instantiation_decl: t_FUNCTION t_Identifier t_IS t_NEW dot_name signature t_Semicolon + { + $$= " is new "+$5+$6; + addVhdlType($2,getParsedLine(t_FUNCTION),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"function ",$$.data()); + } +subprogram_instantiation_decl: t_FUNCTION t_Identifier t_IS t_NEW dot_name signature gen_assoc_list t_Semicolon + { + $$=" is new "+$5+$6; + addVhdlType($2,getParsedLine(t_FUNCTION),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"function ",$$.data()); + } +subprogram_instantiation_decl: t_FUNCTION t_Identifier t_IS t_NEW error t_Semicolon { $$=""; } -signature1: t_RETURN mark {$$="return "+$2;} -signature1:mark_stats { $$=$1;} -signature1: mark_stats t_RETURN mark {$$=$1+" return "+$3;} +signature:/*empty*/ { $$=""; } +signature: t_LEFTBR signature1 + t_RIGHTBR { $$="["+$2+" ]"; } +signature: t_LEFTBR t_RIGHTBR { $$="[ ]"; } -mark_stats : mark {$$=$1;} -mark_stats: mark_stats mark_stats_1 {$$=$1+" "+$2;} -mark_stats_1: t_Comma mark {$$=" , "+$2;} +signature1: t_RETURN mark { $$="return "+$2; } +signature1: mark_stats { $$=$1; } +signature1: mark_stats t_RETURN mark { $$=$1+" return "+$3; } -case_scheme: t_CASE expr t_GENERATE when_stats ttend t_END t_GENERATE generate_stat_1 t_Semicolon -case_scheme: t_CASE expr t_GENERATE when_stats t_END t_GENERATE generate_stat_1 t_Semicolon -case_scheme: t_CASE error t_GENERATE error t_END t_GENERATE generate_stat_1 t_Semicolon +mark_stats: mark { $$=$1; } +mark_stats: mark_stats mark_stats_1 { $$=$1+" "+$2; } +mark_stats_1: t_Comma mark { $$=" , "+$2; } -when_stats_1 : t_WHEN lable choices t_Arrow generate_statement_body -when_stats_1 : t_WHEN choices t_Arrow generate_statement_body -when_stats : when_stats when_stats_1 -when_stats : when_stats_1 +case_scheme: t_CASE expr t_GENERATE when_stats ttend t_END t_GENERATE generate_stat_1 t_Semicolon +case_scheme: t_CASE expr t_GENERATE when_stats t_END t_GENERATE generate_stat_1 t_Semicolon +case_scheme: t_CASE error t_GENERATE error t_END t_GENERATE generate_stat_1 t_Semicolon - ttend :t_END t_Semicolon - ttend : t_END t_Identifier t_Semicolon +when_stats_1: t_WHEN lable choices t_Arrow generate_statement_body +when_stats_1: t_WHEN choices t_Arrow generate_statement_body +when_stats: when_stats when_stats_1 +when_stats: when_stats_1 -conditional_signal_assignment : conditional_waveform_assignment -conditional_signal_assignment : conditional_force_assignment - -conditional_waveform_assignment: target t_LESym wavefrm_element t_WHEN expr else_wave_list t_Semicolon -conditional_waveform_assignment: target t_LESym delay_mechanism wavefrm_element t_WHEN expr else_wave_list t_Semicolon +ttend: t_END t_Semicolon +ttend: t_END t_Identifier t_Semicolon -conditional_waveform_assignment: target t_LESym wavefrm_element t_WHEN expr t_Semicolon -conditional_waveform_assignment: target t_LESym delay_mechanism wavefrm_element t_WHEN expr t_Semicolon -conditional_waveform_assignment: target t_LESym error t_Semicolon +conditional_signal_assignment: conditional_waveform_assignment +conditional_signal_assignment: conditional_force_assignment + +conditional_waveform_assignment: target t_LESym wavefrm_element t_WHEN expr else_wave_list t_Semicolon +conditional_waveform_assignment: target t_LESym delay_mechanism wavefrm_element t_WHEN expr else_wave_list t_Semicolon +conditional_waveform_assignment: target t_LESym wavefrm_element t_WHEN expr t_Semicolon +conditional_waveform_assignment: target t_LESym delay_mechanism wavefrm_element t_WHEN expr t_Semicolon +conditional_waveform_assignment: target t_LESym error t_Semicolon else_wave_list: t_ELSE expr t_WHEN expr else_wave_list: t_ELSE expr -conditional_force_assignment: target t_LESym t_FORCE inout_stat expr t_WHEN expr else_stat t_Semicolon -conditional_force_assignment: target t_LESym t_FORCE inout_stat expr t_WHEN expr t_Semicolon +conditional_force_assignment: target t_LESym t_FORCE inout_stat expr t_WHEN expr else_stat t_Semicolon +conditional_force_assignment: target t_LESym t_FORCE inout_stat expr t_WHEN expr t_Semicolon selected_signal_assignment : selected_waveform_assignment selected_signal_assignment : selected_force_assignment -selected_waveform_assignment: t_WITH expr t_SELECT choice_stat - target t_LESym delay_stat sel_wave_list +selected_waveform_assignment: t_WITH expr t_SELECT choice_stat + target t_LESym delay_stat sel_wave_list + +delay_stat: +delay_stat: delay_mechanism -delay_stat : -delay_stat : delay_mechanism - -sel_wave_list : wavefrm_element t_WHEN choices t_Comma sel_wave_list -sel_wave_list : sel_wave_list_1 +sel_wave_list: wavefrm_element t_WHEN choices t_Comma sel_wave_list +sel_wave_list: sel_wave_list_1 -sel_wave_list_1 : wavefrm_element t_WHEN choices t_Semicolon +sel_wave_list_1: wavefrm_element t_WHEN choices t_Semicolon -selected_force_assignment: t_WITH expr t_SELECT choice_stat target t_LESym t_FORCE - inout_stat sel_var_list +selected_force_assignment: t_WITH expr t_SELECT choice_stat target t_LESym t_FORCE + inout_stat sel_var_list - inout_stat : - inout_stat : t_IN - inout_stat : t_OUT +inout_stat: +inout_stat: t_IN +inout_stat: t_OUT delay_mechanism : t_TRANSPORT - | t_REJECT expr t_INERTIAL - | t_INERTIAL - - conditional_variable_assignment : variable_assign_stat_1 t_WHEN expr else_stat t_Semicolon - conditional_variable_assignment : variable_assign_stat_1 t_WHEN expr t_Semicolon - -else_stat : t_ELSE expr t_WHEN expr -else_stat : else_stat t_ELSE expr t_WHEN expr -else_stat : t_ELSE expr - -selected_variable_assignment: t_WITH expr t_SELECT choice_stat select_name t_VarAsgn sel_var_list - - sel_var_list : expr t_WHEN choices t_Comma sel_var_list - sel_var_list : sel_var_list_1 - - sel_var_list_1 : expr t_WHEN choices t_Semicolon - -select_name:name - | aggregate - -interface_subprogram_decl: iproc - | ifunc - ; -iproc: t_PROCEDURE t_Identifier param -ifunc: func_prec t_FUNCTION func_name param t_RETURN mark return_is -ifunc: t_FUNCTION func_name param t_RETURN mark return_is - - -func_name: t_Identifier - | t_StringLit // "?<" - ; - -return_is: /* empty */ - | t_IS t_Identifier - | t_IS t_Box - -param: /* empty */ -param: t_PARAMETER -param: t_PARAMETER t_LeftParen interf_element interf_list_1 t_RightParen -param:t_LeftParen interf_element interf_list_1 t_RightParen - -interface_package_decl: t_PACKAGE t_Identifier t_IS t_NEW dot_name -interface_package_decl: t_PACKAGE t_Identifier t_IS t_NEW dot_name gen_assoc_list - -gen_assoc_list : t_GENERIC t_MAP association_list - - -gen_interface_list : t_GENERIC interf_list - + | t_REJECT expr t_INERTIAL + | t_INERTIAL + +conditional_variable_assignment : variable_assign_stat_1 t_WHEN expr else_stat t_Semicolon +conditional_variable_assignment : variable_assign_stat_1 t_WHEN expr t_Semicolon + +else_stat: t_ELSE expr t_WHEN expr +else_stat: else_stat t_ELSE expr t_WHEN expr +else_stat: t_ELSE expr + +selected_variable_assignment: t_WITH expr t_SELECT choice_stat select_name t_VarAsgn sel_var_list + +sel_var_list: expr t_WHEN choices t_Comma sel_var_list +sel_var_list: sel_var_list_1 + +sel_var_list_1: expr t_WHEN choices t_Semicolon + +select_name: name + | aggregate + +interface_subprogram_decl: iproc { $$ = $1; } + | ifunc { $$=$1; } + ; +iproc: t_PROCEDURE t_Identifier param { $$ = "procedure "+$2+$3; current->name=$2; } + +ifunc: t_FUNCTION func_name param t_RETURN mark return_is + { + QCString s=$6; + if (!s.isEmpty()) + { + s.prepend(" is "); + } + $$=" function "+$2+$3+$5+s; + current->name=$2; + } +ifunc: func_prec t_FUNCTION func_name param t_RETURN mark return_is + { + QCString s=$7; + if (!s.isEmpty()) + { + s.prepend(" is "); + } + $$=$1+" function "+$3+$4+" return "+$6+s; + current->name=$3; + } + +func_name: t_Identifier { $$=$1; } + | t_StringLit { $$=$1; } // "?<" + ; + +return_is: /* empty */ { $$=""; } + | t_IS t_Identifier { $$=$2; } + | t_IS t_Box { $$="<>"; } + +param: /* empty */ { $$=""; } +param: t_PARAMETER { $$="parameter "; } +param: t_PARAMETER { parse_sec=PARAM_SEC; } + t_LeftParen interf_element interf_list_1 t_RightParen + { parse_sec=0; } + +param: t_LeftParen interf_element interf_list_1 t_RightParen { $$="("+$2+")"; } + +interface_package_decl: t_PACKAGE t_Identifier t_IS t_NEW dot_name + { + $$="package "+$2+" is new "+$5; + current->name=$2; + } +interface_package_decl: t_PACKAGE t_Identifier t_IS t_NEW dot_name gen_assoc_list + { + $$="package "+$2+" is new "+$5+"( ... )" ; + current->name=$2; + } + +gen_assoc_list: t_GENERIC t_MAP association_list + +gen_interface_list : t_GENERIC + { + //int u=s_str.iLine; + parse_sec=GEN_SEC; + } + interf_list + { + QCString vo=$3; + parse_sec=0; + } + external_name: t_SLSL sig_stat external_pathname t_Colon subtype_indic t_SRSR + { + QCString s="<<"+$2; + QCString s1=$3+":"+$5+">>"; + $$=s+s1; + } + +sig_stat: t_CONSTANT { $$="constant "; } +sig_stat: t_SIGNAL { $$="signal "; } +sig_stat: t_VARIABLE { $$="variable "; } -sig_stat: t_CONSTANT -sig_stat: t_SIGNAL -sig_stat: t_VARIABLE +external_pathname: absolute_pathname { $$=$1; } + | relative_pathname { $$=$1; } + | package_path_name { $$=$1; } + ; -external_pathname: absolute_pathname - | relative_pathname - | package_path_name - ; +absolute_pathname: t_Dot pathname_element_list t_Identifier { $$="."+$2+$3; } +absolute_pathname: t_Dot t_Identifier { $$="."+$2; } -absolute_pathname: t_Dot pathname_element_list t_Identifier -absolute_pathname: t_Dot t_Identifier +relative_pathname: neg_list pathname_element_list t_Identifier { $$=$1+$2+$3; } +relative_pathname: neg_list t_Identifier { $$=$1+$2; } -relative_pathname: t_Neg t_Dot pathname_element_list t_Identifier -relative_pathname: t_Neg t_Dot t_Identifier +neg_list: t_Neg t_Dot { $$="^."; } +neg_list: neg_list t_Neg t_Dot { $$=$1+"^."; } -pathname_element: t_Identifier - | t_Identifier t_LeftParen expr t_RightParen - ; - - pathname_element_list: pathname_element t_Dot - | pathname_element_list pathname_element t_Dot - -package_path_name: t_At dot_name +pathname_element: t_Identifier { $$=$1; } + | t_Identifier t_LeftParen expr t_RightParen { $$=$1+"("+$3+")"; } + ; -tool_directive : t_ToolDir +pathname_element_list: pathname_element t_Dot { $$=$1+"."; } + | pathname_element_list pathname_element t_Dot { $$=$1+$2+"."; } + +package_path_name: t_At dot_name { $$="@"+$2; } + +tool_directive: t_ToolDir { // fprintf(stderr,"\n tooldir %s",s_str.qstr.data() ); } @@ -1980,11 +2075,11 @@ int MyParserVhdl::parse(MyParserVhdl* conv) { myconv=conv; return vhdlScanYYparse(); -} +} int lex(void) { - return myconv->doLex(); + return myconv->doLex(); } struct s_contVhdl* getVhdlCont() @@ -2000,19 +2095,19 @@ Entry* getVhdlCompound() } QList& getVhdlConfiguration() { return configL; } - + static void addCompInst(char *n, char* instName, char* comp,int iLine) { - current->spec=VhdlDocGen::COMPONENT_INST; + current->spec=VhdlDocGen::INSTANTIATION; current->section=Entry::VARIABLE_SEC; current->startLine=iLine; current->bodyLine=iLine; - current->type=instName; // foo:instname e.g proto or work. proto(ttt) - current->exception=genLabels; // |arch|label1:label2... - current->name=n; // foo + current->type=instName; // foo:instname e.g proto or work. proto(ttt) + current->exception=genLabels; // |arch|label1:label2... + current->name=n; // foo current->args=lastCompound->name; // architecture name - current->includeName=comp; // component/enity/configuration + current->includeName=comp; // component/enity/configuration //printf(" \n genlable: [%s] inst: [%s] name: [%s] \n",genLabels.data(),instName,n); @@ -2020,7 +2115,7 @@ static void addCompInst(char *n, char* instName, char* comp,int iLine) { current->args=lastCompound->name; if (!findInstant(current->type)) - { + { initEntry(current); instFiles.append(new Entry(*current)); } @@ -2031,7 +2126,7 @@ static void addCompInst(char *n, char* instName, char* comp,int iLine) newEntry(); } } - + static void pushLabel(QCString label) { genLabels+="|"+label; @@ -2041,11 +2136,11 @@ static void popLabel() { int u=genLabels.findRev("|"); if (u<0) return; - genLabels=genLabels.left(u); + genLabels=genLabels.left(u); } static void popConfig() -{ +{ assert(currNode); currNode=currNode->prevNode; // printf("\n pop arch %s ",currNode->arch.data()); @@ -2091,32 +2186,12 @@ static void addConfigureNode(const char* a,const char*b, bool isRoot,bool isLeav } }// addConfigure - - //------------------------------------------------------------------------------------------------------------ -static bool addLibUseClause(const QCString &type) -{ - static bool show=Config_getBool("SHOW_INCLUDE_FILES"); - static bool showIEEESTD=Config_getBool("FORCE_LOCAL_INCLUDES"); - - if (!show) // all libraries and included packages are not shown - { - return FALSE; - } - - if (!showIEEESTD) // all standard packages and libraries are not shown - { - if (type.lower().stripPrefix("ieee")) return FALSE; - if (type.lower().stripPrefix("std")) return FALSE; - } - return TRUE; -} - static bool isFuncProcProced() { - if (currP==VhdlDocGen::FUNCTION || - currP==VhdlDocGen::PROCEDURE || + if (currP==VhdlDocGen::FUNCTION || + currP==VhdlDocGen::PROCEDURE || currP==VhdlDocGen::PROCESS ) { @@ -2125,7 +2200,6 @@ static bool isFuncProcProced() return FALSE; } - static void initEntry(Entry *e) { e->fileName = s_str.fileName; @@ -2136,7 +2210,7 @@ static void initEntry(Entry *e) static void addProto(const char *s1,const char *s2,const char *s3, const char *s4,const char *s5,const char *s6) { - (void)s3; // avoid unused warning + // (void)s3; // avoid unused warning (void)s5; // avoid unused warning static QRegExp reg("[\\s]"); QCString name=s2; @@ -2146,9 +2220,29 @@ static void addProto(const char *s1,const char *s2,const char *s3, { Argument *arg=new Argument; arg->name=(QCString)ql[u]; - arg->type=s4; - arg->defval=s1; - arg->attrib=s6; + if (s3) + { + arg->type=s3; + } + arg->type+=" "; + arg->type+=s4; + if (s6) + { + arg->type+=s6; + } + if (parse_sec==GEN_SEC && param_sec==0) + { + arg->defval="gen!"; + } + + if (parse_sec==PARAM_SEC) + { + assert(false); + } + + arg->defval+=s1; + arg->attrib="";//s6; + current->argList->append(arg); current->args+=s2; current->args+=","; @@ -2175,12 +2269,20 @@ static void createFunction(const QCString &impure,int spec, { int it=0; current->bodyLine=getParsedLine(spec); - current->spec=spec; + current->spec=spec; current->section=Entry::FUNCTION_SEC; current->exception=impure; + + if (parse_sec==GEN_SEC) + { + current->spec= VhdlDocGen::GENERIC; + current->section=Entry::FUNCTION_SEC; + } + if (currP==VhdlDocGen::PROCEDURE) { current->name=impure; + current->exception=""; it=t_PROCEDURE; } else @@ -2195,16 +2297,16 @@ static void createFunction(const QCString &impure,int spec, current->args=fname; current->name=impure; if (!fname.isEmpty()) - { + { QStringList q1=QStringList::split(',',fname); for (uint ii=0;iiname=(QCString)q1[ii]; - current->argList->append(arg); + Argument *arg=new Argument; + arg->name=(QCString)q1[ii]; + current->argList->append(arg); } } - } + } current->startLine=getParsedLine(it); current->bodyLine=getParsedLine(it); @@ -2222,21 +2324,24 @@ static void addVhdlType(const QCString &name,int startLine,int section,int spec, return; } + if (parse_sec==GEN_SEC) + { + spec= VhdlDocGen::GENERIC; + } + // more than one name ? QStringList ql=QStringList::split(",",name,FALSE); for (uint u=0;uname=(QCString)ql[u]; - if (section==Entry::VARIABLE_SEC && - !(spec == VhdlDocGen::USE || spec == VhdlDocGen::LIBRARY) - ) + if (section==Entry::VARIABLE_SEC && !(spec == VhdlDocGen::USE || spec == VhdlDocGen::LIBRARY) ) { current->name.prepend(VhdlDocGen::getRecordNumber()); } current->startLine=startLine; current->bodyLine=startLine; - current->section=section; + current->section=section; current->spec=spec; current->fileName=s_str.fileName; if (current->args.isEmpty()) @@ -2253,9 +2358,9 @@ static void addVhdlType(const QCString &name,int startLine,int section,int spec, static void newEntry() { - if (current->spec==VhdlDocGen::ENTITY || - current->spec==VhdlDocGen::PACKAGE || - current->spec==VhdlDocGen::ARCHITECTURE || + if (current->spec==VhdlDocGen::ENTITY || + current->spec==VhdlDocGen::PACKAGE || + current->spec==VhdlDocGen::ARCHITECTURE || current->spec==VhdlDocGen::PACKAGE_BODY ) { @@ -2263,7 +2368,7 @@ static void newEntry() } else { - if (lastCompound) + if (lastCompound) { lastCompound->addSubEntry(current); } @@ -2271,11 +2376,11 @@ static void newEntry() { if (lastEntity) { - lastEntity->addSubEntry(current); + lastEntity->addSubEntry(current); } - else + else { - current_root->addSubEntry(current); + current_root->addSubEntry(current); } } } diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l index 3212b75..9a7cf3a 100644 --- a/src/vhdlscanner.l +++ b/src/vhdlscanner.l @@ -4,7 +4,7 @@ * * This scanner is derived from a scanner of the ALLIANCE CAD toolset, * release 1.1. That toolset was written from: - * MASI/CAO-VLSI CAD Team + * MASI/CAO-VLSI CAD Team * Laboratoire MASI/CAO-VLSI * Tour 55-65, 2eme etage, Porte 13 * Universite Pierre et Marie Curie (PARIS VI) @@ -107,6 +107,7 @@ static QMap keyMap; static void handleCommentBlock(const QCString &doc,bool brief); static void mapLibPackage(const Entry* ce); static Entry* getEntryAtLine(const Entry* ce,int line); +static bool addLibUseClause(const QCString &type); #define YY_NEVER_INTERACTIVE 1 @@ -321,12 +322,12 @@ static void makeInlineDoc(int endCode) if (compound) { - compound->addSubEntry(temp); + compound->addSubEntry(temp); } else { - temp->type="misc"; // global code like library ieee... - current_root->addSubEntry(temp); + temp->type="misc"; // global code like library ieee... + current_root->addSubEntry(temp); } strComment.resize(0); gBlock.reset(); @@ -445,6 +446,19 @@ BR [ \t\n\r] // printf("\n <<<< insert tok: %s %d %d>>>\n",vhdlScanYYtext,itoken,yyLineNr); lineIndex[itoken]=yyLineNr; } + + // global members + if (( itoken==t_ARCHITECTURE ) || + ( itoken==t_ENTITY) || + ( itoken==t_PACKAGE ) || + ( itoken==t_LIBRARY ) || + ( itoken==t_USE ) || + ( itoken==t_CONFIGURATION ) || + ( itoken==t_CONTEXT ) ) + { + lineIndex[itoken]=yyLineNr; + } + prevToken=itoken; yycont->qstr=vhdlScanYYtext; @@ -521,7 +535,7 @@ BR [ \t\n\r] . { /* unknown characters */ } -<*>{BR}*"--!"[^{}\n][^\n]*\n/{B}*"--!" { // multi line comment +<*>{B}*"--!"[^{}\n][^\n]*\n/{B}*"--!" { // multi line comment if (iDocLine==-1) iDocLine=yyLineNr; QCString qc(vhdlScanYYtext); int len=qc.contains('\n')+yyLineNr-1; @@ -556,6 +570,7 @@ BR [ \t\n\r] startCodeBlock(index); } lineCount(); + BEGIN(Comment); } .|\n { @@ -566,12 +581,14 @@ BR [ \t\n\r] { startCodeBlock(index); } - + VhdlDocGen::prepareComment(strComment); - - + + if (index==-1) + { handleCommentBlock(strComment,FALSE); + } strComment.resize(0);; unput(*vhdlScanYYtext); BEGIN(g_lastCommentContext); @@ -658,11 +675,11 @@ BR [ \t\n\r] if (c =='/') { unput('*'); - BEGIN(Vhdl2008Comment); + BEGIN(EndVhdl2008Comment); } else { - BEGIN(EndVhdl2008Comment); + BEGIN(Vhdl2008Comment); } } @@ -825,30 +842,40 @@ static void mapLibPackage(const Entry* ce) for (;(rt=eli.current()),eli1=eli;++eli) { if (rt->spec==VhdlDocGen::LIBRARY || rt->spec==VhdlDocGen::USE) - // top level library or use statement + // top level library or use statement { - Entry *temp=0; - for (;(temp=eli1.current());++eli1) // find next entity - { - if (temp->spec==VhdlDocGen::ENTITY || temp->spec==VhdlDocGen::PACKAGE || temp->spec==VhdlDocGen::ARCHITECTURE || temp->spec==VhdlDocGen::PACKAGE_BODY) - { - Entry *ee=new Entry(*rt); //append a copy to entries sublist - temp->addSubEntry(ee); - found=TRUE; - rt->spec=-1; //nullify entry - rt->section=0; - lastComp=temp; - break; - } - }//for - if (lastComp && rt->spec!=-1) - { - Entry *ee=new Entry(*rt); //append a copy to entries sublist - lastComp->addSubEntry(ee); - found=TRUE; - rt->spec=-1; //nullify entry - rt->section=0; - } + Entry *temp=0; + if(!addLibUseClause(rt->name)) + { + rt->spec=-1; + rt->section=0; + // continue; + } + + for (;(temp=eli1.current());++eli1) // find next entity + { + if (temp->spec==VhdlDocGen::ENTITY || + temp->spec==VhdlDocGen::PACKAGE || + temp->spec==VhdlDocGen::ARCHITECTURE || + temp->spec==VhdlDocGen::PACKAGE_BODY) + { + Entry *ee=new Entry(*rt); //append a copy to entries sublist + temp->addSubEntry(ee); + found=TRUE; + rt->spec=-1; //nullify entry + rt->section=0; + lastComp=temp; + break; + } + }//for + if (lastComp && rt->spec!=-1) + { + Entry *ee=new Entry(*rt); //append a copy to entries sublist + lastComp->addSubEntry(ee); + found=TRUE; + rt->spec=-1; //nullify entry + rt->section=0; + } }//if }//for if (!found) // nothing left to do @@ -858,6 +885,24 @@ static void mapLibPackage(const Entry* ce) }//while }//MapLib +static bool addLibUseClause(const QCString &type) +{ + static bool show=Config_getBool("SHOW_INCLUDE_FILES"); + static bool showIEEESTD=Config_getBool("FORCE_LOCAL_INCLUDES"); + + if (!show) // all libraries and included packages will not be shown + { + return FALSE; + } + + if (!showIEEESTD) // all standard packages and libraries will not be shown + { + if (type.lower().stripPrefix("ieee")) return FALSE; + if (type.lower().stripPrefix("std")) return FALSE; + } + return TRUE; +} + static void handleCommentBlock(const QCString &doc,bool brief) { int position=0; diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index 856d3d2..1e135ef 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -953,6 +953,19 @@ void XmlDocVisitor::visitPost(DocText *) { } +void XmlDocVisitor::visitPre(DocHtmlBlockQuote *) +{ + if (m_hide) return; + m_t << "
      "; +} + +void XmlDocVisitor::visitPost(DocHtmlBlockQuote *) +{ + if (m_hide) return; + m_t << "
      "; +} + + void XmlDocVisitor::filter(const char *str) { m_t << convertToXML(str); diff --git a/src/xmldocvisitor.h b/src/xmldocvisitor.h index 7d2ab4b..531cd38 100644 --- a/src/xmldocvisitor.h +++ b/src/xmldocvisitor.h @@ -131,6 +131,8 @@ class XmlDocVisitor : public DocVisitor void visitPost(DocCopy *); void visitPre(DocText *); void visitPost(DocText *); + void visitPre(DocHtmlBlockQuote *); + void visitPost(DocHtmlBlockQuote *); private: diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index 886e921..b398ac3 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -119,8 +119,8 @@ inline void writeXMLCodeString(FTextStream &t,const char *s, int &col) { case '\t': { - int spacesToNextTabStop = - Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE")); + static int tabSize = Config_getInt("TAB_SIZE"); + int spacesToNextTabStop = tabSize - (col%tabSize); col+=spacesToNextTabStop; while (spacesToNextTabStop--) t << ""; break; diff --git a/winbuild/Doxygen.sln b/winbuild/Doxygen.sln index 7910673..6bfc6c9 100644 --- a/winbuild/Doxygen.sln +++ b/winbuild/Doxygen.sln @@ -1,16 +1,11 @@  Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 +# Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Doxygen", "Doxygen.vcproj", "{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}" ProjectSection(ProjectDependencies) = postProject {B6BB4771-8A4E-4656-AC08-1EF8AC182F64} = {B6BB4771-8A4E-4656-AC08-1EF8AC182F64} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Doxytag", "Doxytag.vcproj", "{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}" - ProjectSection(ProjectDependencies) = postProject - {B6BB4771-8A4E-4656-AC08-1EF8AC182F64} = {B6BB4771-8A4E-4656-AC08-1EF8AC182F64} - EndProjectSection -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qtools", "qtools.vcproj", "{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doxywizard", "Doxywizard.vcproj", "{77C9C2D3-EA3F-3D59-8B4C-0ED852890172}" @@ -18,25 +13,34 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Debug|Win32.ActiveCfg = Debug|Win32 {309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Debug|Win32.Build.0 = Debug|Win32 + {309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Debug|x64.ActiveCfg = Debug|x64 {309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Release|Win32.ActiveCfg = Release|Win32 {309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Release|Win32.Build.0 = Release|Win32 - {EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Debug|Win32.ActiveCfg = Debug|Win32 - {EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Debug|Win32.Build.0 = Debug|Win32 - {EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Release|Win32.ActiveCfg = Release|Win32 - {EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Release|Win32.Build.0 = Release|Win32 + {309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Release|x64.ActiveCfg = Release|x64 + {309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Release|x64.Build.0 = Release|x64 {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Debug|Win32.ActiveCfg = Debug|Win32 {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Debug|Win32.Build.0 = Debug|Win32 + {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Debug|x64.ActiveCfg = Debug|x64 + {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Debug|x64.Build.0 = Debug|x64 {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Release|Win32.ActiveCfg = Release|Win32 {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Release|Win32.Build.0 = Release|Win32 + {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Release|x64.ActiveCfg = Release|x64 + {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Release|x64.Build.0 = Release|x64 {77C9C2D3-EA3F-3D59-8B4C-0ED852890172}.Debug|Win32.ActiveCfg = Debug|Win32 {77C9C2D3-EA3F-3D59-8B4C-0ED852890172}.Debug|Win32.Build.0 = Debug|Win32 + {77C9C2D3-EA3F-3D59-8B4C-0ED852890172}.Debug|x64.ActiveCfg = Debug|x64 + {77C9C2D3-EA3F-3D59-8B4C-0ED852890172}.Debug|x64.Build.0 = Debug|x64 {77C9C2D3-EA3F-3D59-8B4C-0ED852890172}.Release|Win32.ActiveCfg = Release|Win32 {77C9C2D3-EA3F-3D59-8B4C-0ED852890172}.Release|Win32.Build.0 = Release|Win32 + {77C9C2D3-EA3F-3D59-8B4C-0ED852890172}.Release|x64.ActiveCfg = Release|x64 + {77C9C2D3-EA3F-3D59-8B4C-0ED852890172}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/winbuild/Doxygen.vcproj b/winbuild/Doxygen.vcproj index 22dfecb..07df324 100644 --- a/winbuild/Doxygen.vcproj +++ b/winbuild/Doxygen.vcproj @@ -11,6 +11,9 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -242,6 +448,15 @@ /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + @@ -393,6 +703,14 @@ /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - + + - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - + + + + + + - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="" + PreprocessorDefinitions="" + /> + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/winbuild/iconv.vcproj b/winbuild/iconv.vcproj new file mode 100644 index 0000000..d865a54 --- /dev/null +++ b/winbuild/iconv.vcproj @@ -0,0 +1,464 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/winbuild/iconv64.lib b/winbuild/iconv64.lib new file mode 100644 index 0000000..a1afc1c Binary files /dev/null and b/winbuild/iconv64.lib differ diff --git a/winbuild/qtools.vcproj b/winbuild/qtools.vcproj index 6c11c85..573d633 100644 --- a/winbuild/qtools.vcproj +++ b/winbuild/qtools.vcproj @@ -1,7 +1,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -188,7 +348,7 @@ /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +