diff options
298 files changed, 4719 insertions, 1900 deletions
@@ -1,7 +1,7 @@ -DOXYGEN Version 1.8.3 +DOXYGEN Version 1.8.3.1 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (27 December 2012) +Dimitri van Heesch (20 January 2013) @@ -1,4 +1,4 @@ -DOXYGEN Version 1.8.3 +DOXYGEN Version 1.8.3.1 Please read INSTALL for compilation instructions. @@ -26,4 +26,4 @@ forum. Enjoy, -Dimitri van Heesch (dimitri@stack.nl) (27 December 2012) +Dimitri van Heesch (dimitri@stack.nl) (20 January 2013) diff --git a/addon/doxyapp/doxyapp.cpp b/addon/doxyapp/doxyapp.cpp index 521d1cc..651bc36 100644 --- a/addon/doxyapp/doxyapp.cpp +++ b/addon/doxyapp/doxyapp.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxysearch/doxyindexer.cpp b/addon/doxysearch/doxyindexer.cpp index c809e0e..9c27f56 100644 --- a/addon/doxysearch/doxyindexer.cpp +++ b/addon/doxysearch/doxyindexer.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxysearch/doxysearch.cpp b/addon/doxysearch/doxysearch.cpp index 7b90c82..8aeed81 100644 --- a/addon/doxysearch/doxysearch.cpp +++ b/addon/doxysearch/doxysearch.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxywizard/Makefile.in b/addon/doxywizard/Makefile.in index 5b0876e..727409a 100644 --- a/addon/doxywizard/Makefile.in +++ b/addon/doxywizard/Makefile.in @@ -1,7 +1,7 @@ # # # -# Copyright (C) 1997-2012 by Dimitri van Heesch. +# Copyright (C) 1997-2013 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 diff --git a/addon/doxywizard/config.l b/addon/doxywizard/config.l index fa49eba..0f25903 100644 --- a/addon/doxywizard/config.l +++ b/addon/doxywizard/config.l @@ -2,7 +2,7 @@ * * $Id: config_templ.l,v 1.8 2001/01/01 10:15:16 root Exp $ * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp index fe8c961..9bdf39d 100644 --- a/addon/doxywizard/doxywizard.cpp +++ b/addon/doxywizard/doxywizard.cpp @@ -191,7 +191,7 @@ void MainWindow::about() t << QString::fromAscii("<qt><center>A tool to configure and run doxygen version ")+ QString::fromAscii(versionString)+ QString::fromAscii(" on your source files.</center><p><br>" - "<center>Written by<br> Dimitri van Heesch<br>© 2000-2012</center><p>" + "<center>Written by<br> Dimitri van Heesch<br>© 2000-2013</center><p>" "</qt>"); QMessageBox::about(this,tr("Doxygen GUI"),msg); } diff --git a/addon/doxywizard/inputbool.cpp b/addon/doxywizard/inputbool.cpp index cd83f88..62fcf62 100644 --- a/addon/doxywizard/inputbool.cpp +++ b/addon/doxywizard/inputbool.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxywizard/inputbool.h b/addon/doxywizard/inputbool.h index 63d16e6..470127a 100644 --- a/addon/doxywizard/inputbool.h +++ b/addon/doxywizard/inputbool.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxywizard/inputint.cpp b/addon/doxywizard/inputint.cpp index 08df309..302c3ea 100644 --- a/addon/doxywizard/inputint.cpp +++ b/addon/doxywizard/inputint.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxywizard/inputint.h b/addon/doxywizard/inputint.h index 9ac506d..a6a87ed 100644 --- a/addon/doxywizard/inputint.h +++ b/addon/doxywizard/inputint.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxywizard/inputstring.cpp b/addon/doxywizard/inputstring.cpp index c0b92b3..9e0a0e1 100644 --- a/addon/doxywizard/inputstring.cpp +++ b/addon/doxywizard/inputstring.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxywizard/inputstring.h b/addon/doxywizard/inputstring.h index b957bfa..741f55d 100644 --- a/addon/doxywizard/inputstring.h +++ b/addon/doxywizard/inputstring.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxywizard/inputstrlist.cpp b/addon/doxywizard/inputstrlist.cpp index bca92e2..2e6e624 100644 --- a/addon/doxywizard/inputstrlist.cpp +++ b/addon/doxywizard/inputstrlist.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxywizard/inputstrlist.h b/addon/doxywizard/inputstrlist.h index 0201aee..3a9278d 100644 --- a/addon/doxywizard/inputstrlist.h +++ b/addon/doxywizard/inputstrlist.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxywizard/version.h b/addon/doxywizard/version.h index 4752520..9d523c1 100644 --- a/addon/doxywizard/version.h +++ b/addon/doxywizard/version.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/addon/doxywizard/wizard.h b/addon/doxywizard/wizard.h index 99e1db5..877de1d 100644 --- a/addon/doxywizard/wizard.h +++ b/addon/doxywizard/wizard.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -17,7 +17,7 @@ doxygen_version_major=1 doxygen_version_minor=8 -doxygen_version_revision=3 +doxygen_version_revision=3.1 #NOTE: Setting version_mmn to "NO" will omit mmn info from the package. doxygen_version_mmn=NO @@ -640,9 +640,9 @@ EOF if test $f_wizard = YES; then EXTRADEPS=doxywizard fi - if test $f_search = YES; then - EXTRADEPS="$EXTRADEPS doxysearch" - fi +# if test $f_search = YES; then +# EXTRADEPS="$EXTRADEPS doxysearch" +# fi echo "all: src/version.cpp $EXTRADEPS" >> $DST echo " \$(MAKE) -C qtools" >> $DST echo " \$(MAKE) -C libmd5" >> $DST diff --git a/doc/Doxyfile b/doc/Doxyfile index 50cede6..7d5470b 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -12,7 +12,7 @@ # Documents produced by Doxygen are derivative works derived from the # input used in their production; they are not affected by this license. -PROJECT_NAME = +PROJECT_NAME = "Doxygen" OUTPUT_DIRECTORY = .. HTML_HEADER = HTML_FOOTER = diff --git a/doc/Makefile.in b/doc/Makefile.in index aaa9b0e..591e327 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -1,7 +1,7 @@ # # # -# Copyright (C) 1997-2012 by Dimitri van Heesch. +# Copyright (C) 1997-2013 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 diff --git a/doc/Makefile.latex b/doc/Makefile.latex index a13b90f..f62f97a 100644 --- a/doc/Makefile.latex +++ b/doc/Makefile.latex @@ -1,7 +1,7 @@ # # # -# Copyright (C) 1997-2012 by Dimitri van Heesch. +# Copyright (C) 1997-2013 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 diff --git a/doc/Makefile.win_make.in b/doc/Makefile.win_make.in index 07c0679..c19b0e4 100644 --- a/doc/Makefile.win_make.in +++ b/doc/Makefile.win_make.in @@ -1,7 +1,7 @@ # # # -# Copyright (C) 1997-2012 by Dimitri van Heesch. +# Copyright (C) 1997-2013 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 diff --git a/doc/Makefile.win_nmake.in b/doc/Makefile.win_nmake.in index af8711c..f8705f3 100644 --- a/doc/Makefile.win_nmake.in +++ b/doc/Makefile.win_nmake.in @@ -1,7 +1,7 @@ # # # -# Copyright (C) 1997-2012 by Dimitri van Heesch. +# Copyright (C) 1997-2013 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 diff --git a/doc/arch.doc b/doc/arch.doc index f89b12a..4e756b2 100644 --- a/doc/arch.doc +++ b/doc/arch.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/autolink.doc b/doc/autolink.doc index 7dcb328..f0e7f87 100644 --- a/doc/autolink.doc +++ b/doc/autolink.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/commands.doc b/doc/commands.doc index 03d6d3c..87eec7a 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/config.doc b/doc/config.doc index 2fdabb0..01ffcb5 100644 --- a/doc/config.doc +++ b/doc/config.doc @@ -1,8 +1,8 @@ -/****************************************************************************** +e****************************************************************************** * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -115,6 +115,7 @@ followed by the descriptions of the tags grouped by category. \refitem cfg_extension_mapping EXTENSION_MAPPING \refitem cfg_external_groups EXTERNAL_GROUPS \refitem cfg_external_search EXTERNAL_SEARCH +\refitem cfg_external_search_id EXTERNAL_SEARCH_ID \refitem cfg_extra_packages EXTRA_PACKAGES \refitem cfg_extra_search_mappings EXTRA_SEARCH_MAPPINGS \refitem cfg_extract_all EXTRACT_ALL @@ -623,9 +624,13 @@ followed by the descriptions of the tags grouped by category. Doxygen has a built-in mapping, but you can override or extend it using this tag. The format is ext=language, where ext is a file extension, and language is one of the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, - Objective-C, Python, Fortran, VHDL. For instance to make doxygen treat + Objective-C, Python, Fortran, VHDL. + + For instance to make doxygen treat .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), - use: inc=Fortran f=C + use: `inc=Fortran f=C`. + + For files without extension you can use `no_extension` as a placeholder. \anchor cfg_subgrouping <dt>\c SUBGROUPING <dd> @@ -1388,10 +1393,10 @@ doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFil <dt><code>\$mathjax</code><dd>will be replaced with a links to the javascript and style sheets needed for the MathJax feature (or an empty string when \ref cfg_use_mathjax "USE_MATHJAX" is disabled). - <dt><code>\$relpath\$</code><dd> - If \c CREATE_SUBDIRS is enabled, the command <code>\$relpath\$</code> can be + <dt><code>\$relpath^</code><dd> + If \c CREATE_SUBDIRS is enabled, the command <code>\$relpath^</code> can be used to produce a relative path to the root of the HTML output directory, - e.g. use \$relpath\$doxygen.css, to refer to the standard style sheet. + e.g. use \$relpath^doxygen.css, to refer to the standard style sheet. </dl> To cope with differences in the layout of the header and footer that depend on @@ -1515,7 +1520,7 @@ hr.footer { The \c HTML_EXTRA_FILES tag can be used to specify one or more extra images or other source files which should be copied to the HTML output directory. Note that these files will be copied to the base HTML output directory. Use the - $relpath$ marker in the \c HTML_HEADER and/or \c HTML_FOOTER files to load these + $relpath^ marker in the \c HTML_HEADER and/or \c HTML_FOOTER files to load these files. In the \c HTML_STYLESHEET file, use the file name only. Also note that the files will be copied as-is; there are no commands or markers available. @@ -1943,18 +1948,27 @@ search data is written to a file for indexing by an external tool. With the \c SEARCHDATA_FILE tag the name of this file can be specified. The default is searchdata.xml. +\anchor cfg_external_search_id +<dt>\c EXTERNAL_SEARCH_ID <dd> + \addindex EXTERNAL_SEARCH_ID + +When \c SERVER_BASED_SEARCH AND \c EXTERNAL_SEARCH are both enabled the +\c EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +useful in combination with \ref cfg_extra_search_mappings "EXTRA_SEARCH_MAPPINGS" +to search through multiple projects and redirect the results back to the right project. + \anchor cfg_extra_search_mappings <dt>\c EXTRA_SEARCH_MAPPINGS <dd> \addindex EXTRA_SEARCH_MAPPINGS -The \c EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through other -doxygen projects that are not otherwise connected via tags files, but are -all added to the same search index. Each project needs to have a tag file set -via \ref cfg_generate_tagfile "GENERATE_TAGFILE". The search mapping then -maps the name of tag file to a relative location where the documentation -can be found, similar to the \ref cfg_tagfiles "TAGFILES" option but without -actually processing the tag file. The format is: +The \c EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +projects other than the one defined by this configuration file, but that are +all added to the same external search index. Each project needs to have a +unique id set via \ref cfg_external_search_id "EXTERNAL_SEARCH_ID". +The search mapping then maps the id of to a relative location where the +documentation can be found. +The format is: \verbatim EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... \endverbatim diff --git a/doc/custcmd.doc b/doc/custcmd.doc index 06ef0d1..c4ec3ac 100644 --- a/doc/custcmd.doc +++ b/doc/custcmd.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/customize.doc b/doc/customize.doc index b035826..158de5b 100644 --- a/doc/customize.doc +++ b/doc/customize.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -250,7 +250,18 @@ defined group with title "My Group": </navindex> \endverbatim -Groups can be nested to form a hierarchy. +Groups can be nested to form a hierarchy. + +By default a usergroup entry in the navigation tree is a link to +a landing page with the contents of the group. You can link to a +different page using the `url` attribute just like you can for the +`<tab>` element and prevent any link using `url="[none]"`, i.e. + +\verbatim + <tab type="usergroup" title="Group without link" url="[none]"> + ... + </tab> +\endverbatim The elements after \c navindex represent the layout of the different pages generated by doxygen: diff --git a/doc/diagrams.doc b/doc/diagrams.doc index 56f82b8..00d1415 100644 --- a/doc/diagrams.doc +++ b/doc/diagrams.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/docblocks.doc b/doc/docblocks.doc index d6bb675..4af0386 100644 --- a/doc/docblocks.doc +++ b/doc/docblocks.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/doxygen.1 b/doc/doxygen.1 index 45090f4..98f0df0 100644 --- a/doc/doxygen.1 +++ b/doc/doxygen.1 @@ -41,6 +41,6 @@ doxygen \fB\-e\fR rtf extensionsFile If \fB\-s\fR is specified the comments in the config file will be omitted. If configName is omitted `Doxyfile' will be used as a default. .SH AUTHOR -Doxygen version VERSION, Copyright Dimitri van Heesch 1997-2012 +Doxygen version VERSION, Copyright Dimitri van Heesch 1997-2013 .SH SEE ALSO doxywizard(1). diff --git a/doc/doxygen_manual.css b/doc/doxygen_manual.css index 45395b4..3286004 100644 --- a/doc/doxygen_manual.css +++ b/doc/doxygen_manual.css @@ -983,6 +983,8 @@ dl.section dd { margin: 0px; width: 100%; border-bottom: 1px solid #848484; + visibility: hidden; + height: 0px; } .image diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex index cd9a544..9435280 100644 --- a/doc/doxygen_manual.tex +++ b/doc/doxygen_manual.tex @@ -1,7 +1,7 @@ % % % -% Copyright (C) 1997-2011 by Dimitri van Heesch. +% Copyright (C) 1997-2013 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 diff --git a/doc/doxygen_usage.doc b/doc/doxygen_usage.doc index 40e5163..59cef23 100644 --- a/doc/doxygen_usage.doc +++ b/doc/doxygen_usage.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/doxywizard_usage.doc b/doc/doxywizard_usage.doc index 435661b..ffe95f2 100644 --- a/doc/doxywizard_usage.doc +++ b/doc/doxywizard_usage.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/external.doc b/doc/external.doc index 013b7c2..501254d 100644 --- a/doc/external.doc +++ b/doc/external.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/extsearch.doc b/doc/extsearch.doc index a86d1db..d69b36e 100644 --- a/doc/extsearch.doc +++ b/doc/extsearch.doc @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -14,6 +14,8 @@ */ /*! \page extsearch External Indexing and Searching +[TOC] + \section extsearch_intro Introduction With release 1.8.3, doxygen provides the ability to search through HTML using @@ -34,26 +36,9 @@ engine, doxygen provides an example tool for each action: `doxyindexer` for indexing the data and `doxysearch.cgi` for searching through the index. The data flow is shown in the following diagram: -\dot -digraph Flow { - edge [fontname="helvetica",fontsize="10pt"]; - node [shape=ellipse,fontname="helvetica",fontsize="10pt"]; - doxygen; - doxyindexer; - doxysearch [label="doxysearch.cgi"]; - browser [label="HTML page\nin browser"]; - node [shape=note]; - searchdata [label="searchdata.xml"]; - searchindex [label="doxysearch.db"]; - - doxygen -> searchdata [label=" writes"]; - searchdata -> doxyindexer [label=" reads"]; - doxyindexer -> searchindex [label=" writes"]; - searchindex -> doxysearch [label=" reads"]; - doxysearch -> browser [label=" get results "]; - browser -> doxysearch [label=" query "]; -} -\enddot + +\image html extsearch_flow.png "External Search Data Flow" +\image latex extsearch_flow.eps "External Search Data Flow" height=10cm - `doxygen` produces the raw search data - `doxyindexer` indexes the data into a search database `doxysearch.db` @@ -135,47 +120,49 @@ Now you should be enable to search for words and symbols from the HTML output. \subsection extsearch_multi Multi project index -In case you have two doxygen projects A and B where B depends on A via a -tag file, i.e. the configuration of project A says: - - GENERATE_TAGFILES = A.tag - -and the configuration of project B has its dependency on A configured as -follows: - - TAGFILES = ../project_A/A.tag=../../project_A/html - -then it may be desirable to allow searching for words in both projects. +In case you have more than one doxygen project and these projects are related, +it may be desirable to allow searching for words in all projects from within +the documentation of any of the projects. To make this possible all that is needed is to combine the search data -for both projects into one index, i.e. run +for all projects into a single index, e.g. for two projects A and B for which the +searchdata.xml is generated in directories project_A and project_B run: doxyindexer project_A/searchdata.xml project_B/searchdata.xml and then copy the resulting `doxysearch.db` to the directory where also -`doxysearch.cgi` used by project B is located. - -In case you also want to link to search results in project B -from the search page of project A (or in general -between two projects that are otherwise unrelated), -you need to give some additional information in order for doxygen to make -the right links. This is what the -\ref cfg_extra_search_mappings "EXTRA_SEARCH_MAPPINGS" option is for. - -Each project needs to have a tag file defined, i.e. in the above example -involving project A and B, also project B should define a tag file: - - GENERATE_TAGFILES = B.tag - -then project A can define the mapping as follows: - - EXTRA_SEARCH_MAPPINGS = B.tag=../../project_B/html - -with this addition, projects A and B can share the same search database. - -@note The mapping defined by `EXTRA_SEARCH_MAPPINGS` is treated as an -extension of the mappings already defined by `TAGFILES`. In case the same -tag file is mentioned in both options, the one in `TAGFILES` is used. +`doxysearch.cgi` is located. + +The `searchdata.xml` file doesn't contain any absolute paths or links, +so how can the search results from multiple projects be linked back to the right documentation set? +This is where the `EXTERNAL_SEARCH_ID` and `EXTRA_SEARCH_MAPPINGS` options come into play. + +To be able to identify the different projects, one needs to +set a unique ID using \ref cfg_external_search_id "EXTERNAL_SEARCH_ID" +for each project. + +To link the search results to the right project, you need to define a +mapping per project using the \ref cfg_extra_search_mappings "EXTRA_SEARCH_MAPPINGS" tag. +With this option to can define the mapping from IDs of other projects to the +(relative) location of documentation of those projects. + +So for projects A and B the relevant part of the configuration file +could look as follows: + + project_A/Doxyfile + ------------------ + EXTERNAL_SEARCH_ID = A + EXTRA_SEARCH_MAPPINGS = B=../../project_B/html + +for project A and for project B + + project_B/Doxyfile + ------------------ + EXTERNAL_SEARCH_ID = B + EXTRA_SEARCH_MAPPINGS = A=../../project_A/html + +with these settings, projects A and B can share the same search database, +and the search results will link to the right documentation set. \section extsearch_update Updating the index diff --git a/doc/extsearch_flow.dot b/doc/extsearch_flow.dot new file mode 100644 index 0000000..6352fba --- /dev/null +++ b/doc/extsearch_flow.dot @@ -0,0 +1,18 @@ +digraph Flow { + edge [fontname="helvetica",fontsize="10pt"]; + node [shape=ellipse,fontname="helvetica",fontsize="10pt"]; + doxygen; + doxyindexer; + doxysearch [label="doxysearch.cgi"]; + browser [label="HTML page\nin browser"]; + node [shape=note]; + searchdata [label="searchdata.xml"]; + searchindex [label="doxysearch.db"]; + + doxygen -> searchdata [label=" writes"]; + searchdata -> doxyindexer [label=" reads"]; + doxyindexer -> searchindex [label=" writes"]; + searchindex -> doxysearch [label=" reads"]; + doxysearch -> browser [label=" get results "]; + browser -> doxysearch [label=" query "]; +} diff --git a/doc/extsearch_flow.eps b/doc/extsearch_flow.eps new file mode 100644 index 0000000..ed140cb --- /dev/null +++ b/doc/extsearch_flow.eps @@ -0,0 +1,2100 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 0.18.4 (http://poppler.freedesktop.org) +%%Creator: cairo 1.10.2 (http://cairographics.org) +%%LanguageLevel: 2 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 176 542 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2004 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + 3 1 roll 2 array astore + /setpagedevice where { + pop 3 dict begin + /PageSize exch def + /ImagingBBox null def + /Policies 1 dict dup begin /PageSize 3 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/cshow where { + pop + /cshow2 { + dup { + pop pop + 1 string dup 0 3 index put 3 index exec + } exch cshow + pop pop + } def +}{ + /cshow2 { + currentfont /FontType get 0 eq { + 0 2 2 index length 1 sub { + 2 copy get exch 1 add 2 index exch get + 2 copy exch 256 mul add + 2 string dup 0 6 5 roll put dup 1 5 4 roll put + 3 index exec + } for + } { + dup { + 1 string dup 0 3 index put 3 index exec + } forall + } ifelse + pop pop + } def +} ifelse +/awcp { + exch { + false charpath + 5 index 5 index rmoveto + 6 index eq { 7 index 7 index rmoveto } if + } exch cshow2 + 6 {pop} repeat +} def +/Tj { + fCol + 1 index stringwidth pdfTextMat idtransform pop + sub 1 index length dup 0 ne { div } { pop pop 0 } ifelse + pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32 + 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0 + pdfTextMat dtransform + 6 5 roll Tj1 +} def +/Tj16 { + fCol + 2 index stringwidth pdfTextMat idtransform pop + sub exch div + pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32 + 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0 + pdfTextMat dtransform + 6 5 roll Tj1 +} def +/Tj16V { + fCol + 2 index stringwidth pdfTextMat idtransform exch pop + sub exch div + 0 pdfWordSpacing pdfTextMat dtransform 32 + 4 3 roll pdfCharSpacing add 0 exch + pdfTextMat dtransform + 6 5 roll Tj1 +} def +/Tj1 { + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 8 2 roll + pdfTextRender 1 and 0 eq pdfPatternCS not and { + 6 copy awidthshow + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 7 index 7 index moveto + 6 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + false awcp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne pdfPatternCS or { + 8 6 roll moveto + false awcp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + 8 {pop} repeat + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { pdfFontSize 0.001 mul mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { pdfFontSize 0.001 mul mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2 image operators +/pdfImBuf 100 string def +/pdfIm { + image + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfImM { + fCol imagemask + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +%%EndProlog +%%BeginSetup +xpdf begin +%%BeginResource: font CairoFont-0-0 +%!PS-AdobeFont-1.0: NimbusSanL-Regu 1.06 +%%Title: NimbusSanL-Regu +%Version: 1.06 +%%CreationDate: Thu Aug 2 14:35:58 2007 +%%Creator: frob +%Copyright: Copyright (URW)++,Copyright 1999 by (URW)++ Design & +%Copyright: Development; Cyrillic glyphs added by Valek Filippov (C) +%Copyright: 2001-2005 +% Generated by FontForge 20070723 (http://fontforge.sf.net/) +%%EndComments + +FontDirectory/NimbusSanL-Regu known{/NimbusSanL-Regu findfont dup/UniqueID known pop false {dup +/UniqueID get 5020902 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /CairoFont-0-0 def +/FontBBox {-174 -285 1022 953 }readonly def + +/PaintType 0 def +/FontInfo 9 dict dup begin + /version (1.06) readonly def + /Notice (Copyright \050URW\051++,Copyright 1999 by \050URW\051++ Design & Development; Cyrillic glyphs added by Valek Filippov \050C\051 2001-2005) readonly def + /FullName (Nimbus Sans L Regular) readonly def + /FamilyName (Nimbus Sans L) readonly def + /Weight (Regular) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + /UnderlinePosition -151 def + /UnderlineThickness 50 def +end readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 17 /space put +dup 14 /period put +dup 21 /H put +dup 24 /L put +dup 23 /M put +dup 22 /T put +dup 9 /a put +dup 20 /b put +dup 11 /c put +dup 1 /d put +dup 6 /e put +dup 5 /g put +dup 12 /h put +dup 19 /i put +dup 16 /l put +dup 15 /m put +dup 7 /n put +dup 2 /o put +dup 25 /p put +dup 27 /q put +dup 10 /r put +dup 8 /s put +dup 13 /t put +dup 26 /u put +dup 18 /w put +dup 3 /x put +dup 4 /y put +readonly def +currentdict end +currentfile eexec +f983ef0097ece61cf3a79690d73bfb4b0027b850f3158905fdac1bc024d7276e +0a12b7ddcede59e3601ab4509dfe0977ed5bf624ebc1f818c45f1350d41b052a +72743accb053eb06ed043568d3196a30bed220227e2a15bacef508449221cf33 +8a8666e92410a9aa91d5a31900a93c01ec21742cd14dc46bffa111ce10b78ae0 +1abaeba7f36cdf79a4733245c63f6d36234d6b0961f1ac295d6177931b9ed554 +bb5fc6741a63c493daabf03d753c7d2b8e8c01e3e280898f810da5985212c8c0 +bbdee4e8ab9b22bea83671c0460443ede9be044168f8ab50be5874d46660f1f8 +241cb261280a68ae2cd60e1648cff45c0ba9b15cb42f86217172a5b855265c21 +4d4b954937d11b94b7b98738393ce09ce40802e512bea7714fe6f163d1b27c8e +c87419fa91767418abc44c94a3a22f97f856b0a4729be6973455a7f7ae72c671 +542e9e74258c2b8b2ad440a1b69bc7de2e54ed6a96d0bfde08b35f6fbf739ae1 +8676c03800ff3e63c6fc20927b3158e8d2cb6644eaf7831c6bf0e9b39aa14145 +e721dc46e792da9be78696808fadf24136f9da0c8003cb34ecb8af2b7de9e033 +545fbca53d881eaea40c638396c8d3b08b6e2b8f7d6188d055d6924bafb0cf7e +f8bf2719495988b0efe373dd1aea97b0f486d0555e3a62cc1b36024ec3ada21b +fe1629acf431928facb4ead9c41e3d4cb50ed2f651d2cb6ca8d0b1ef49d9e214 +e06cb029bc1a40b2052938f6bcd05f013d9ed1edc90bdea459c4483ed0d1470e +30ee0a77ecfb585268a94a8bc6be7d28e5746525107c0a3f05fb5e34e0a21572 +14be2d95a46fdec2e36afd180688fc710c92b27d69b2ff8b1fc7f73cd5526270 +e5bb585d7674a351d9bda5dcbc17b40d465923103f1d02e7446d949002657763 +c82c8fe0372afe94104d148679b4e5be01def615b295d7c25e24660b2a10dfb0 +b5b96fc02bdfdadc10afddd821fff6caf17f11d6a7cf157d3d7f1aa25a00cea4 +1207c8e160663d23b16d2934ffe6a6c178d456facef20fd46c4b33f6d1ebf103 +b7cde86d7aff74174d2d3f5820186c696b9245f97554b7f62411429f1dabebf1 +ce4abebcdd2a4ccc1c06d6ff8dd9d7f935ba5218765a81eb3c727a40dae317df +89cb3234b1a4f1a0b16f88ed1684d3106c2a6cc18aedd3b052df1a2ea7ccb8c6 +c6111abed60277aaa2b91f1da4a83c0b2d4fae8cfbe2873b7f9ec2e9ad05045a +bd1133b95f70185dea97f1081565ac65139ff102004b00e1e77023782a68a752 +088f8d8cd2393eb3f649553f0be59b83687f4425290ff1e334794e59ab4dc73b +26f1beac4c5d6d4d507dd7d13b8721144d28b82eba624965e3d8cf9334083a6a +461277026b05583f96e489be17dcfaad73cc5b9c6021527879f2c194a5bb1869 +9cbef3ea4e14950e1aa56abbd38bf509629e8a4f0edf0946a47aea100a088151 +a9e296d1b5d7688aa0b3b121fb93bd52789d22fc32d645230419d1df1d106a9a +90948fd443eb64a212b3595a133a4a30434b5074ff14f69368de4e0452515257 +aad6332ed29556152c71240df8a6746486d28c6a1315bc5c5ed08a5192c2fd7b +a4ddcd7496139ae2e6e47ac4971edc88a81e2056ff81081b72cec34df2e6bf17 +20bc5c6753ae32e31ce0db86b3aba65f26335a57f2f12827f7495183427d3e86 +1b6ba27f7157003a92a9405c8755f71dca78e6cf0730fe59504cbe903beec227 +65da1f35eabc756bf32e9980eed40c0d1a201e12a71b63171df7ca971e36c03e +8137e0213fe675b392ad8b3232752dd3864c82f9ff85f814becb6fc7510a1e99 +17bcf12a90c4ee29e036db54278f2413731df21833d1f8149344b46e4c3fc2fa +9647e76b3cfd81b4fe88643e427e7f6d9b01f99659e531df0c43b4f44ed236f1 +17bb00830dc10a5b1896cbee06fde9b4fd9b0b138405a0bb83d78ca5546a2b41 +490f5322405f0ea6276d9a13a63b98c59cc9a0428472759009cda518c4dfce24 +49e27df9caac365a6ee3a8ac451167c806889760c404164f941d035b6a1df55c +44ebdda9484f4da9b07c059ae59617c0e86ffa71b9a70322acb3b60071128799 +46f950e04e6b634439b06e05a9781a9ca6b9cbfaf508a835e2daaec957d95fa0 +031f9ae42c17cfd5adfb81766af25ac5237818909e284ae4a439b8b2a5050dde +be0dbde491d135155e98ab579904d045797ea516dbaa4529675a381372fd437e +53f9372dae38f0eeece282771fe7c3d1e68061cc242e4640131ebfcf340b453e +4868ce4825067dfcc88c7d84aee3f06eb202a89979aa520e501288e93f742fc8 +6b6f43e3bba4430be40b099cb0535504f966cf50fd9ba9fd358fa184a39eccfd +4d8e5c4ec35b448bad9cf5bdf15b729a4137a9618a5a44db7d9740a15e0da9c8 +02b428d40ed5401ed76095c73512cb626630608c74143afaa7be85562aac8d81 +48a5e603e3b69b89706b0c1cf5c85bdeb32611221c13325835238fee492e4a08 +bce9741094c4cdc3edd691e82d224c7866590510e2c7cccc07e11484f62d7930 +3fd559e4e511eb67bab756f30acecc560f5def3902bfb52abfb7aa48e72f2732 +b7eb73c0123f6dfe97cb69897c1db3d57ff05466c3cce4730e04e921a5e56e8a +dd31933536393bc00b3ab3435ab950965a752b913bfdff22a8e7df7bc441e5bb +3a3192bea8a17829faa529e56ac69e5a25a6797615d5455e4b430627f9c219a3 +64bf0c55669cb872e403ed1cdffc63cf9223ab581bb9d7967892dfef80da723f +18e199e0b57f12ef0210326aae328882d982392dfcd40e029ad3f53dcd820b4a +61b580bc3f1b492453f5c752e05c705bf8bc05485c5499f804a6ed2a28bb63bc +7e80759003cc7ef0a1d9d51dab1f785d14eb86bd9a4f4221951da58fe7263e23 +e58a2414dcedb6ce1943f62a65699080bf568cc0c67134d8728963466de67133 +27129138d203ab8db0079f63349ac8ea689ac7615d866b7f600b2e91333b61d7 +3c98401b1cb0432e90fa7bd87d9f4fdfecbc2dd5e5eee5daa7d7bd959e41817e +17525a472ac035c391b918d549c38bf2b2426798fc27af235a725ddff5dc79af +b59198c94528a36b8c7cd5683f8af50107b45e02fda4c787b4f14ea4e663bbd6 +15be5b30d6979456f6191b5051f458bf19c91ac99a9a8505a03abedc243ba287 +2c3305b81288a79f5ed8452e2a2caf3fa51208946c72b97e6d59ef74bd8b96ce +d9de45d7cf76a6891c7c0691298855a366737da9be57d98c25c7415122c898a1 +564a052036a3aa550c2bc83478c4e15933de6e4aad64b2e97c640a2e8a14933a +baf85907f09588cb05432f716f05efe4a669d16c881dadc0faf5a704dc91f500 +6e512a61372579eeea5f6076cb8048d71a1e4a3097bc27433bc3613ebd8291e4 +27bd9cf83c0969562d5363662f74f2ecd57071c4d331a26559bf3e307d0e2d1c +9a90a3fc92254d2656555dbc0c8c3502985a00e705213e4522d5eecccc5f94af +0f196501250a4200b04b491f64388f7c3aa37970a8a5bf78a072bcbac61cdbf0 +f95dbd13b8defacae1a53277fea4f19f829fced3b4cc6e209bc2616b9bd7312c +87d78cda5c9f6bca02595086adb6dac9b7bc6c9fca577169940fb58c818a3757 +5de491222128989965657ea8b5dbd96a697ef71778109a1781bd7ddb9b2132da +71b3bac95f6f69fc615b7733d709402bc7fa0812d18aa22fab627f91baf4a346 +d8f103362c0161a3b57d83856c63cc7150fa2ec1ba537a4c608bc28c85d388bc +f4105158f0c9d40a573bab28148104e2db167ff009d34134008cd1ab4cea4091 +c04dd6eb2353686278cb190506778602b0a642d3997caa982a2b3c84f8bc97e8 +3a177fbe6c69512014cbf7ab75d5a35a0521a2d1204d7877f75a8b0816da0bc0 +58c0ccf411b939931bcbbcd1d3d92b0fee9e58012677b1db645c14ae63b7c4c3 +e4b18b890802aaa72c0d8cb771ee4e46ddb6d714894aed7816d7164799b70d7b +64e0a50b979c3616590b871cbae60b9449d02fab57655abd48843da96359d608 +7ce297a26e192491d1cb8420d7cbf1dc66b68ab4299ed1c500ebb26de35f9563 +48d497c3c0858e812fd3d43cd76a41e24f19752bbc8a4a69510c9381cdb8a230 +31f8c0a914db40a659a5b51e19fc9024471cce4e65cbab05a3562a2929398879 +67cbe49331cb58e936a2b6873d3dedfbb378414914a2b78db4daa180a4b40a97 +2fec68f931b75f2109fcf824cc7439ea693c8c080abed27376461dd5f86617d1 +a931cf1caf206e872adf0d8b6e35499fe3df6d3833dca2daee3805fd76f7cc5e +f2ac6f05134e8da55b15204896002803ad497e67c2ea83b2646bc13a72f73d64 +2ebe4b1d5b00a444744160f3341a84335643e58ee6c64acdfcec21bf506a6a30 +b70b1fce06b97b23c767e7e429892085fbff2996aa68e4776b76de0f66edfd89 +b015cc3a3e4d70cdf3bcad9d48b4e17b97f568b0f3b1557d003cd6f087aab912 +a15e88e51f6e33c8c8b2ab69fa8e81f09a75e0059723f1de598a20c567e681b6 +0e954bd6d80c7515870bd6158eb93e8af8ae71542d681895e2b32489694f090e +bc5b560515048626f803b996baa342815b5adfc437dace01d549a6319eff5709 +6c537c9aea7c3f8dd978d42624304a68ef2427dbc0acd85a26960f10e348a30c +dc46e46dc16700f62108fe6c35059759fe69c729edd6c91e83cd49535e16746b +6dff037927de39b77eeb86fadd9ac5c89268c3c529fa1747650cf9e16c7626ae +c25817ea46c1ab2b0a7a9c7ba33087db199adf7594c297a938ddd7ad595c6942 +552ae76711f444b5b833a92cdfea0462b6766685359cd4c2afe4114d884b230f +dc86d680a9b10a4333d68db6ebc595f86806392857b55452e44288a42f924754 +c22778c6d7bfc3d4337bb3a8f68055d0d6f5053700b784c480509caf63336c68 +7c5bd339757008be54c289a10e62d5c83eee133f32168a68aa259e8247d6afcb +25243df6ca8c238ea64082265560188e73a47db7603a1802e7ed3693a9b7e5ed +7b0332171196792cd5272b640c8a5363978a87f58b9d1022d5e7af38d1e45dba +bd89b095eb9e581ce8e9c314a8152465a4663fd4a7ad1996c08afe96d3975d67 +fde3aef4fdbad38c739d0f1bb4584f919b4b5b8a06aa94bc3a4162aaaf01cf60 +7fd24e90dd4889795aa0fd42e4cce9b0c4323963e288dab83c1d1187c1251d77 +da1c6602311cf8a73e16699d6646bf62cf68b3da3855648508edb97cf3614ed1 +141d158ce8f86e055e9034fcc9c77fe4f592251dca7e61952859567c6ff4fa83 +15b554ff50b48bec4d99ad1221b7caa1d47a8f430a07d49f561296a74277adb9 +c21c8b4ca1d3bf3b671506f71d8f88d37ec1b03432c2bcaa337659c35747b0eb +1721073e4e60e93646c719bc4e27c5b5fed52f456f43158ad6ba09e9db6d0c17 +fa75bd7a80746258f7725116c37770e261c9bcf7f578f3f12ec7037c125fd86e +4d38ef23886e18f4e206397006c8c4ba0105e10fcc254a718e3c8ba6dd71218c +4768fe0d8efe2e01454dd52ef33080a1313911ce3e0afa57f5b74d7caef2440f +f148f3c8bbe0cb2418a0367dddb217ffb47fd5766ab6db331bd9d2779ceac6e8 +e3e6562b79d947e687ce271f8f024c5cfe61e3453cc7ca45efc6b682d2da8ace +dda708fc65b668e285e6f542b9fdc071082076c4ec2312de40214f8616ac615a +2669bd490e89d5c125d6c0d6378113f4d37f1d6a06c225c7b0e879746f13607c +0a4b98b7d77ca29572495f4edd58f292ca28417808c8e60c3dd8b1a9d185cc80 +5784e9a1ec1f290197637cb2f1ef65d1b114bc0e99a9d3070be7199f3d30db85 +cb3b65eb8cdd60b44567730017f4f851d4b15a15bf4312f79c05d5ea03b1da80 +1149fef5ad43eded70f470e62281fda1df9ef72f180630b3b1509eb5fd9c73e7 +f02fe23f554e5b74007d6384f6255ea4bdd2a6eba0310eda07327884d26c59d5 +3d38f02b11815e8adde0804c621d6cbda143ff30856063abcd0059183828625b +c486f27c475059855c9dcdb5831ce58532e3e6984b63b690a27373d7d5e613be +666ed52d9f743fd3c373984fbfb8ac8040dcc222ddff4a2e1f6d93f64aabad9a +286e3e07679adc853885c8658e37b0efdb68fe51c09ec2b6b69735b84d2aa481 +793f0e5982e006d985c0c2b8d394b7093a210168e58688ab1c07b99b857e9052 +3f90ea3f4f4202f7751dc55dd7cc187f4afacced589cce0189545f2a26c9d283 +b14ab2aae2e5393d416e014ad99e27f8814c0b1bccd6f798865e243bdc9408df +f7e6fca3b515e5edd3af9ac11e4bf0a7b7a736959a4f48d4e519d069263b0af1 +43dbf431cedf2ab7d4df2cacb62627ea46e77e20233ede4166f291a3a19f6227 +1ea68be133a61b6342782ab58310c4e2b08782800f48d311a7c15d1a6d3f7c6b +5bf2d91cf23b931793adab17d9f085a9aecb9d4df2c4c50c5329503c4a8ad83f +df446b306c56a2ca97bd50f359280415f8cd4bf01817da0f01a0e48bfa4c7a1e +85f052a03369b0ad7eb0122585bd4445dd53912b2d1ee8cbd9b7e2716166790c +32f4e068134102aeedc6ade4d5db39ac29f424b0d5e327d081990adcfad18f6a +b64c7f199cddebf0490b10847d158b2151a8e79b707af40ba4a38c8c02fc49dc +ffa7e2813ad7741ab7bb29c93e146d81be2a2494791582618f49aa9f904f8faa +1ec63adb809cd473ea6743509617fdbf260d4024b4101d962f66f361d7257804 +e354e050004155cf050ffc6adfc28c4f742a3231c5fa37c7c826985c5099698e +da86f0a2baefff000a4e74597e5bda20f8c36f22ddd94ff45e16ac91fd250eb9 +d8d0971bc4bfda5b6c0c14d850822031fcc8f231023a579c09493ff2ac9f72e8 +1b4c0eaa64fc3401b7e128b2642aa708ef990878091956a777d908fa0c4e1f2d +a3363e098a28b6f141ef68258e2f6ae3ac089b3b89de4379a0da96cfaa81a7fd +fae2fe9dbdaa3b21435793e464baaa346a722c385e71398949d32b76c6cdef0b +05c752130d43ebc45a1738f06281097150423f885470928cc1153cb01b2295df +e17cb19d3b4d576209425a806b98d83e80158b67120d6ea0a65d94582e248d3d +d8ad826bbbc00b9b9dd0f4d606a65b1a0ba8eea83cff745e222e6f4645055a9c +bdf1d99160e0e4854d989f07cc3f393f72af97c3575d6f1d8d4312848bc72bef +988cc436c23f4c6a2a5569a79d04a0667611a3b0f2e2b8ca0a6ce0536b0e459e +21dd3d74d8a94be16cdb3d65a6534be608688944c0d68c62e39899104ad6e587 +ec0f3fc097ce54d3e25c9f081dec3be6c71b714b9f92c15517dfd763b9bf0496 +d601fe4690a9a815e803221e007a7ca74743f679daf6a626af5a6525b394731f +ebbe7cadb5de910c2163e640acb041736fe4e508dcb5c7d87d38e12ff80fc903 +c26c480b567f057b193f5d4ba352697b9481d780d94b815a7d96ba6dcc34e39f +43caf780d101bd73488a88d213063432f8e6bea7e7248d85ab48b576ee702af9 +364c81f7d5c74ddad8315ed4345444e0cd92ea23b4394073178807892d2925a6 +a43a75c68881385a78d9d5582d3f3f8bae87ae177ea46dcba9af17217906204f +751a358cd8a4d8c95ca76651271963b6d2ffdf282b653c85ede30f9c8bb5f113 +528e221aa1a6507364f74ecae922bc09e6c3f42166b2118a819638a85560c6e1 +eb7bf2893357a81571201a2bc31a91ab89489fa2050d353039a7085aacb83609 +825ae7392a84b6325bbf17af46a9a3eb63ad14bb387987f6d756ffc59a2a0893 +7538a0efa89ca08f9785952d2e8bbba0e6023ebb8fceb5abcc3c0c3c1b980255 +861d991fbf27e70686fa238e92ca9bffbad61bfd48c5b8e8aa8fde96fd9acb2d +946b69a51137c905955ceafeafea0acb8a0c561808ec2e0d4fbacdb7ef9f9abf +afee72f759e8208559c232ffe5bf6cd3e7cbe88ea579e795455f7c25f4343455 +06d98be333bffa7f7cf1f83bc00e38d2503ceb483519e3b1e5cb7751c00bd2a1 +3c385e2f88ee5df92086b57fadc621a1a539ff102d4fc4c075ab1d800eb1efc6 +fabdc04f81065f0ef3aa5b947d904410962f6533c1aa49b86178ad45e35d44b8 +66c938876f2bdf1dfb28d793bb5d049df0cc3e21b8ae8f9b75ac06f00759d48b +f39c61125641612bc6032f5b6046d85ae9c7102b99b93f7674e80f96a1d74c13 +68d2fdfca6e8535a9d80fbaae20d681e1918b4af227270f40ee97fbaad4a4216 +908272cd9767fce64130744d0ac38825384bd51bfe19a150b55dd390020ae359 +29d4026d4d8798cf2fcabc5ffeb88f20129ff22baa1bf3fc412b404234554507 +5fc332a91a87c3ccaaba8c201ac784fab723c1371991d5a4c5d865727dc7170d +876a83dd01b10c294e651e39a2d3a7c7de70817b0508f612856ddff87bf404f4 +c750437a96608c130bbdb8dc14051061957ec0976ac3b58e117b85cc17f7be4d +d59a34a81ecfea08529704d8cb73176ea03c1d873f0a7acb41d533c8d68dbb3d +9b879448ed2e52a98957c41682fc30a002015af634229c4d5d6b900586a0a0b0 +6b1fedaf188610cc3bfd97eb4261460ce68154b3a5a19a218bbf3035fbc64778 +89c2be397cad1e44c4fbbf3260bf85eaea01ca97d02b4c366a44fd08be6f197d +f8243ca699c2b75b54756ab361115fcc5828dec91dff364db969960569e59a1c +3fd2b76b4f88fd9309f8c9962d02ac778dca69f07609b0b9961ffac6d942943c +bc2e3682879841df4f1d05350302cefc029100f934704dcec7e3f15387153325 +8ad2b5b5ad89d153f53be6390ca66461b84fb405b4722d3e3a205ce3bf339018 +b339f240c4956edd92e16ed988b46813e5e39533804efbc6e426304523b82073 +d9f296b3f8283f12dbb66157440222a888acde1eef4dc861f9e8d0e20c5876f7 +4e99c1dbb0b5fe81eae326545e84285864f90353f9c1c21c166deafc24ffcbe1 +a19522ac8cbabf3bb73c36bda0238a19da380a6ba263cb28f99d3643ca4f4b21 +ebdb9e19f1d53947c8f43a22320f8eb83f152580d83dd6cf230e30b74d2f0bf2 +6d6b621865797b989714ddc45136974dccdc37baa1a52d021544aab74521e9e2 +ef0607d951b1e4cbe230a9a1095df65774af0c2a0c0f1770dad9e054dc06c81d +30801a927e525afce8cb8d753bfb1fc2b5d967b9e25c7cfa39bf6fb86dd482da +0d871d5c8725cac7b44dcd5c3059f39a4cb216177100c0f99572ddadf8d7d537 +33db55286717ce9ee2a12357b901b675c566909a0b4c71bcbc7bbb7d36aa72a7 +018895b617ed93853602a5fd52daa01da6d6e3b713b7fd9d6f75e05f21857211 +d6ed29349ff0e628c26df07d1c079e556ffc60585ec8e91f38c9b4ef0a708559 +b4cc4155ff42c48c18731bd231b2dcb32399943e3fd64fb66d3011cc85e9fa20 +e28c741303d5b1f3b7178753cf97364716e6bea337a89ee47eaf9b93f938d9d1 +0d82d4c0e3927af3c34927fdd5fab439d303d997637e2d21725bca942bad146e +4df93b37e5a38e4da57cb1d6e6e278b17a82644c800e6104eb2518c03ea9b8e3 +f9b7611066ef9afc58b893e3fadc53835440a47d93c7052ca4b617c1d958c693 +ceb60f9a2814cfc1b4a24b32783b389678bdd14fc3ea2124f124afc5ed977097 +af7a1d3a4d825c55f0842b2ac566e43458495b6f51c011d7e78818f6d934203a +74a961618625a380923926544b7c13c14b2180f3576cdcd4f2140bc90b2ec84f +1aca97f147781866d711448c1dc8df1fcc1a1769ece2ed5cea053795c0cbfb72 +04dc61065c87be00d9c0527d5df881708fdbfb7fbe01a933775548eefb736d01 +4a560cdb4313678581a3b1aa73d546869301f309f189c2df29f3d4bebb3b5a72 +046354c2edd273c9794c3659bc72fe7fb7442e75b04fc197a49efc2ea39ae0b5 +d1dce9bb509b5085445a66b6a59979c26412f1d6f5ebae84175ff08a90c9be44 +06797389c439693e2fd2f2c26d2e9dea41c505c32477ca50fc01dcd53d388e27 +cdfd4d73c2ac2fa03b9eb934479f0419ef50036b682c9ad8bfdaa3adf80a03de +9f29b7021cf0441deec0f002fab57da0f5be89f5da4597a2523a2e7886589002 +e5cbbde0356b391148b5502eaa3b3689871a1cebe9b8214992f5349ede7d799a +57b85d1e2ae706f8567efcf24081165f53810a2dc9568a263f69c40eb55cf317 +82da10dd970dc79f6593f1cdd9ce552de6c7c9fd3ab21169a2e487d5fa959d65 +9afddd071a0d756b5c7debd602cf9ad3e6b3dc3f29d954cad22ff28cf333ac67 +b8793f01c6f13c4ae2b6732d60633b59c2d9296ec77b6ee630906adf73ef8603 +3317cf59b6ffcf42fd7a68133f0673a5c91b8e0ec7b88872e9ac8d0aa904af60 +00799d57e1dccb74496e345dfea868ad7498f3ec7b85558a1fefb6f03c7d5365 +cef02b044b220c162c530b8cc899887f8846084c7b4fa1dcc631ba3a3773fa22 +443097b47852b119b42df9d58ef3d55ca10f38b04f378562b3bf03140e25544a +77e66cb9589e6f9dc0a11b6c2a35fac32ce9bac552dc54270bfc025baf639b8a +a5e3dfda4908b869969bd633a9b171ed6a04a2ee6e3744d7a348cdf09dacda62 +5269181d8d0fb84b468d2eea50fdf69324bf64ab1db3ad0fb2fb9583937f0be8 +b41f14a751d7115adf2d329db753cd14534cc282f2b4a4bf497a4c7b69cd25a1 +fb33c5e91796b885176284c77a119b50b077001b566328fd23170e4ae611e342 +6fc26443587e3982cea97c79fd63a4dfa95efee48dd81f90d67e40f283c27947 +d0f0823d2d2d26210e5243d2029b2ff059336b57b9b1334b0b615bf357c6a732 +c8d5165f2c9a6f310e48a2e4d7dc965887b45c14c9b744bd98de8f33071f0dea +693ad64a55d03b2891660d09775030eb5c0e6e868ab1b90028c373d3448851e2 +25dc9eb442aebb5912ab0f3b1107a7d96f9d23983d8a6cfedd589e59fd355ea0 +aec2a448fd9d254d39331cd80dbfd653fffdb2702cb848144c33c28d207adc51 +097c28f754521e715be8b7b14c4f86aff04fddb0bd52247d814192a884e5af3a +8f675cdf0c9dcdee0668773c3a3673af8f51a71bdfea19d0bde8a2a23453164e +dbf01c932db93128b686cc6fd9a1dbd506b6c52664c5aaa01901c5ac0a8275e0 +ff4ec66ae3326dbc1b3b60c4488b6af86fbf30ddc1e3e3a8d63d7682c222e746 +05c95af3327e694f3b3c1600083f9cc241f97c5013c9a0588c715eb4dd00944e +824e43a7a1c1fd144d1098628139034731eb1cbf633184cb857a17855f277bbc +18751799ae28f48130cbc1ed559ab1a5abfa2576d59fa35772557a6fb3d15b4a +de8bd38b763be0f8d8166613cc37dbcec1d65aa06c7b9f171028fddf8b55093a +2fa509ce882054682fcfe32d510012ef5ddcf39f0ae5ade25af279829f8d47b6 +5b89a40a71ab70c2cd961aefb7004d3910c190bf32137e4d9733b971db4616ba +789c741efc39c26540d3228884b4bb490bea1ab957682d250cf95e1d41c11662 +3925e7778755c11c654d42dfff1db2a49c5b57c3df98d942373519cb02f36759 +8997028e11c513a99b4abf115c61e2daedebb709068ce06692303cd0be482289 +18a12dc126af0e4f81766acf9a84526add4d2fa145cb5452c09547de307b352e +141233cd8aea9f965070a2e6321a795f896c0cebc01ce3a15a81f14c14d74aac +a4ab090125fecc310410da79bab5dbe07e9eeb2189788f491c457a82abf7f79f +427932c8ad38466431e28659056c3d5a4be02c8d0d054bcd4f9170aa7b7b0d2e +9a4564af66eb7372fe981bf441b68cf8247d11fcf0bfeb6453f9d2210dc880b9 +b9af2bca1dad558c1be18eab687f453d4aac976fb9466a6602ffca1dc852a56c +50556d777258a7bc26489789fb4fbe2f70034eef6174244ebdcf514c5ff72391 +d097750ac8a9fcfe6c94af17b3a5f2667ca2a02e7f32424ad5a7d902751f7c41 +c9a7fa5fae2d8d7396f8e586be8ba8f960ff3fbcbe783e5ece80def85cdf792e +33459d996a28775979b335a8448523c0a187dd8f3c0831231231f2a158a7b764 +2593932c9e0dce8892ae708b9458993d580656e1614f2d076f256a680ccd3d37 +0e37cde46dbaf38f096b032170759ec0619cfa0389b17568017f8d2811727965 +c75eacb1bf1b179b69567b0ed8bdce2ce95e98ec7a9a573a79ccd5b4990e46d5 +17324a06ba418b34110feeabfb71c1e43cfc1650179fc1e5f65fef017498b83a +1eb5fb5e340a1b19ef7f10fd0422f6e7f640db9a46762fbbaf33e2eed637ee9d +93cad018e33c4fc821212bb0f38f2251827a46f38c38c128dfa891f0b8ed1405 +4c651b735837a0f862967c3d39912e288dc3939816e015e8be9ba798f68c5e89 +a4184aa18392352bdb53119115b1a100e0941b80fb8017dd198c7d0629e72f27 +da2d8ebb59de72ee46daa03e57b12513988f2023484d9f0480126a378ac134a7 +5c2bfdc4df5b8d8fa77ba3fe2da9a01ec9427a00487b3a81b50a118c528b77c2 +2b57265e5f915a063fa3e8bac0ff7cbea9ddb19ab8390775df6049cb85921457 +cfae8a868bc6584a60223fa19a363f98876ea3d1e8a69337a58ffd75c9b296ea +5485e343c04c72a53945e21fb479495d4686302f39188c01b036253ba0a18fc8 +7aae335fa522a435094c3608cf6e2e37fdf5fa3f59048fdbdbe6c58dabafe941 +a7af5aa4ee7b44d64df374780e9e2d691b4639e2aaef8c52de72b51f2bb6506e +5e98f8ae236d183c9cf250dee46d102d964aefb7b82ef32d19a03aa88ef2ab97 +5f04a6cb5208f570af43f73d804843404eb835e5efe3e34887a37816ed3cb02b +13e91be5bda75a112d1d27e92e462ec516100ab117b2882993af81dfbb58ebb2 +f5bc5d5eb98e48f73e88144889677b31d3c660839854a5c611a52bb493b64455 +3e6948d71f94f04eea57f7d458d7d78bb278d83065bdd9097f252d39a9ecfb40 +8f2229ad5edaf4afd518c804214dd2458b085d7bd382c7a1e697b5e0c1a47c25 +e2cf084d63bf186635783b56e6b36e7da64e3f9e3e7135d74381d957c0c62a6d +2c4dda1c21a8e49979dc4946c3bb84680e4386750d4b19c4011759d84f90cf31 +b268f0af056d8566e84939388ff4cda569118ed71a2cd82d28b44e17c8438979 +5a4357f70f976891292e15448c74ce895be53e4212079fba23793f3c247827b4 +4f0e39066964e756719c628e6bf4a5f080de8402d5d1c154785564e019f13ca5 +b45b525b325e29f193557770f88ef82f8d7704631969d4ad624206665ee1d38d +7ef7a7979aa05d39528beb6b7764d88da381eb63f0cca2f797dcac11011445da +21da35e051c1db3da576e698451a0675944f5749e465faadfa4bfb09eba5177c +e8cecbe67fa06b74d75278d7f28c236a596a17fea5467785f345197a43ec5f2e +1b7e7e2151f287ad9181ac39c9771a1713f45b5ddbb402bf674e3eef369647bb +c37b3afb327576831021a1a38fc4840cc4716da8026d16fae600d543a3c4dc4d +7cd5baf19f1db2a24a0757ef6c3bd8047288c1436eda2bd3f9289e6f8b003dea +d7b0cf49f3aa8a56adcc26ae300976e1c84bfa04d9a1887682d19ef68f52b76f +dd0e03f64cc92dbb3ebeafbcc56f8a2a99af870bf7f0153dde4202ca45c530a0 +562dfae59234f4e3287b93bf427fcaa8d236606aa43aff3862063c0bd73dde6b +dd3ab4a8c4d6ad9c24da288dacffd02aca90dfdc72444c9bcbd331755876f649 +e4b665d69921097c364eb8b0562090e10f4d719b2b5afc9312ed39c77e91ece7 +61c6c940133f940a74e5ce3c05d9703556d28a5839727c54800ad0e496885aa4 +052f65813ae552e8dce8d6f73949d0fcf5059e85ca8a1c137d751c6b8a87a52b +198254d01258074227501dbe50de2b82bd2510e5788c46ac997c65bf44dd6928 +ca9f7a902bb957e277e7380123cdd93cf75dd6c7e5a56f93f114b6e46e0407d3 +ed544d781ef6fbfc704a035b7b737eb332457977f223d87ba6e3dbe827b4fae9 +e687f6975731d42a8977cfa67f94e90df98ca790e89713dcbc07cf27ea8c4584 +cc933fc342e5c5e740ee920ac3403d4deee426d35e1062a2cc7d5e23f568b494 +95c8b4556a8bbb0480ade618566f537b440ce52ff7d2cd89fc806fc388e9d7fc +8bf15882a38ae0e11915ab03c272c8a312094938b9b4282ef3a321e3bd82701a +50f8a4380fb32533cf4a100b0f96475a0f12fe9ce7e6a41784fe7c83f05869d4 +2b70febe4f60bf749429bfc4721acc4e17a961bd7da411471edb7a32f4479f2f +079239c9bedcceaf35119982d686545cbb1eb0e9f429e9dbac1b743d28d12c6f +faf8f98a3bbd60518803d997a56bb515602dd3a75f7ace8adf16a6ee79233fee +1d21bf40914f29521638aef27eb796b06b5fe274444e0833ab9a79bddcb33443 +5b815d0af72964e8cc297d246c6bd6d78e0e8394d8359084963b01416db54a3e +3a6d9784320814c4fa99aab6c4934b76a26c5e014d3fd202935f2f9399dda83b +4d652ab89936578ac2c70daec483f69422b25472458417b87f2861ff90aa37e4 +5c07ac19fe09a4c2d37c917941f01682e650fce1785d114abd5949ae733bdaaa +d98a802437f465bb7d2d1e0d4118d6ddc9aee8e08e606d9703c319001725da09 +5dc1e3a421f0c5315e28765e9571982039d5313efe20de55e7b614184c4a1e4e +af4a89c62331c6f2511d706c2c4248c626e6474c450db1838f1d8b264e406d6f +85dc63e78936a3f7d84baaf49bbd3ba15c58fc4734fdeb13d1f1557f29ee53fd +bcca5d008c60f868ab756608ce889de583309a303cebdeed91e7c4922526f125 +58d2e751ec11b3c0bea88065ab0241f9d1e4c6144150f92f917b629295da2e84 +33a66b4a6e6c8571b684a675af7e77cfa6723f82dc6ac13a8a568ed06a519ea0 +a2725cdc99096ac0ce941b93207ed3f5991241f709ef7f9e8b2acb77100cf293 +452a1917d32c2f2a798af506a827be2d3f3ce87e3d920a0d8cf8e98a4bd3bd99 +e12f4374e0f6ad25af32793c5f85b77e213c7805156d53eba08d9a84ba43abbb +a8202d43091436113d930a138dfdd15774397f496aea9172ff0302555658d3b4 +f6926fc115bf3de066f2d3bdac9738ecb824713de70361c91374fbac965ed71e +e2aaf3a27a9cc5564dd26a4bf30dad76ec5f955915b1363ddc6bfb706b559fbe +e46f6b6338dd6a07ccdb23b33b0237c8f0a428fcbf6db62fe6906e4a593b4dfa +ff151b2cd167951a70f535394d84b7ad727bca8403cfd661abf9a72ca0634822 +f0ebf66ed148fd7b29513eb151c8d76ea7b74902d76ef7a88d5c571873bd219a +9f7e60b5d6b77bbc1afe19165f88bbcf45cffa773fa9379259c61a930395ce89 +109c5e3a14066dcf9dc8387209c84273ecac6a6cb033d54cbe4451036b0b5335 +bc4b3a2c6f6a4395fdecf9c1b88d3b8840e0a94b0516c5821cdb3b15aa06ef3f +e3a2c4729e258156fb7ade7c1b8f673dc87a8c87d6229df03d88fdb8d7e122cb +db3c8e9eed4ddd03ef86bf2b6fb140187441e7d3ad4bff4bb61e57dacbb792e9 +f4263770c169933f99eaa94f686169ac46803bf6324b8498c154ca78482224ad +28253607ce99680a755c573b8cc5bd9840b2c8a2518cfeec51a396ec8e3b6c3f +980a3896feedde1a0605ab8d7891736e2c9502b5e2b3de8d76da62afee99a77e +1b079bf6f92363e8a5b6e605245952f9cb351206b65eddff62ab5730b81d8531 +1489f9b4f4eb4690844b47a8a2cc0881180d3b5bb8f6bd73afcef9300002c168 +0503cab52a1c6c10b038c312a0c5e59c60072d4405937a8776bffb1c07d0a876 +1bb4aab03dedb634ce0192bb51b07dfc815073beb441be59d2a5b29a64e559a0 +d0f33022188ca9e9ee43530036e15604ac28bb7349b1f6b57ffea79982da0f9f +ef3b0447ce31ab3bbfc0c03b7a421a836b8bf793fccbe963059de30c4ec0ea18 +bd7f3d00ceadc9e611bf4c1376a64087008b5941734d404646b9f698dcae3c90 +6f2208158f670d807d7ac8509a38a95d16679d11cc23115fd80301e84f4b200e +e160fe96e54346be77e24998e679a0e1c0579135afc37c68c5163028b2c026f5 +d22035539795135e468f192814b49c4967e4873799ae4fccd31cdf23f754ec82 +068c2448ee44a452a0b4bf877a7c420006ce3e9e032d830e2bcb814e447b0147 +3cf5933f6d82cb74e6d1d5d6211484ff1ab6add9a46397b42fe3c7b7cf6357cc +abffeda61f6aeab2ef6a84ba261f837fc8bffdbfb3ca6901c2b4b29834e08d4d +45a2dd4e8a51c229d30915ec1bcb1c5486a57eb7490c70c0dbfa01fd1c53c998 +32c7e26e50265f54b8197a0316d30a5646f6e4a71d475e03460d81e8b658327d +b8a1b1437334d3a907947b2c899e4a53ffe9e8227b2d5420ad4109b2b136ad02 +92b5ccaa83556e85b2018e629113c3e0d4d484bff995a484643f661975737cb0 +eb80f2b1ab319b1ec6251c49ebe855e2d6ea533398f9b3148316210b46ed555e +f68a949b73f31a4457f45588654bf21d554b39eb23850e3a10c2ae0e7369c685 +641f6d8f43936c9250768af2829cc655bc027fa640aa14b18a70aa3a75524911 +45e6a7df0d81e0b7e1f3587ff086712368c48351d661add7e96a25b33f9f1f77 +7cbd3ad42b6786c8b0ae23f5e61421a0b660b7381809f13664aea3067bad45ad +8451c40e07f38f9b6185867caa2a9ddc8c37647c6b6a77d281185db7a56c39cd +ab0ace10890f5c0d7807fc420a2d0948c3880dd22e0b6aada2580f9a635d12a3 +05a89415a24ee12b834a6d01e9f1a756b492f4aab442368cc18c700e1016014b +12e2ca27f141ac3084ce37b42a4c41d41a3ae37aa2e40028aa8f3dd3f0b80df1 +24f33e60d97ee975dc98338c7d2290544d8da601fdef3da00db855237a174cd3 +dda0a9a404c749c849f5592390320053c4de8004c650117289b8f0c44cbef09e +2fdae18a593f2c7ae524cee7e3560e3116bba293c02937b0e95fe22687ee328f +eb89d6738ebd1604031d248ceb6a11f9ffa7b2625d3ad21050df6f25d1bb4f3d +5d269bbaf8d56d25ac40905ba0adab22ccfc7733dcdf3680fa85a94f65445951 +e960e817427a9126a9c767f263f324dfd34841554bedd86841dfba7e43986958 +d688da35786f0497a6d04fcbb6eef0d1e8d9575af1fdbeece6cfe66c574e6158 +346774b185fb5c4e3bc71b45b5202f79210579b4bc35b21f60843b811df3515c +c0d81d665e7eb018619a243e72c29636b8d9366166797292ac7023cccacc9401 +999bedc5920fe7f51458d13eb772d6500f471416f079bee7c9bfc25a0858b10d +c043cc9a219ab9a71ad62d68ba22432e1dfa7d7930f873a9af0ceca0cc4a4667 +d1102a8a685adfdbc5a1b4cea2e9a94d1766ccc8f9e74213876f3d7bfbe09500 +06b11f656a37641f9cfbd0b23c19dcac6d9c2b5cf0e38d8a58ed42c7d37d88bb +9a96ad2864fcbc6033bd464ca519c9e8b24e1033ae844ce27b866f2fe38b09d4 +a262867f4782f15a5a0e762f76e1dae8062ba108e759c6d8f00ec4da4b4bff0e +3b22b22fdc733b708e0c8ed1acc316d8677e488adff3fd5d912fbee47a55e583 +d814d6a77044767539c2a1b964f5a2522b482186ec9f957684f090862afac470 +7e5b48722a97df0d272c713ba3b611aacdbaa0ed665ce873979c55cd6a9dac4f +b8aeca0b0cb0f6fe85e7c97088ac6f4ed2bce9a0d16527d001507702138709bc +abdb694a61da95692e67999aa628b73837f53ca6892788ac702cd6eb52f8c79b +92c866213a6126049797a48454b53318cfdebcbe1c50fd139abe01c30feec51f +0cb7e9d9a863250021dfe7c27786e88b6baedd48d949dc481684e3faf67ca81e +e76cfbd63b547d7a43f3ec9ad09b1bc9e31462a43245f40ee9f0cbe070805a1a +bf940f2ed8300be39fecb86120ec4b0e680d890903458cb93153fd2ed736b873 +07aec4beb473ec4935bfb0b8c01ad84dac20d13b997a884930e3c6abdaabb083 +f6f66c5b936ec4624fd1d1ca39011688ef21faff4f69b93f7fe73a7ae036c3d1 +5f6f5da6838536f3fe0f7543f3f9460b197a7892d6424ba822cdcb26e2b3dd7c +a75ad2710b9ab49c6d5810f68d1a0426987f1e462034ddb4aea10e8e04be42ea +10cd8552670f9251994dd8e844245e97a5902b65d08fd41013de3f3cf0cd6dfe +c75852ec385747f789cb0d846d0d8f4f0c823fe8a6202101f2cdb1811cac9e71 +9f54bffb04d646ebf824a17db7d78137f4e962f3fe6a19fec02697503d1f5c1a +467799d2c347e8f85395eb9bd63f4e6a52fa05d4a3e25700b4de22c41d97c719 +cd5a7576a3dc797c96bf68c5ce7922a8fc928d6aa344fb67d4115cafa38e82f7 +5f621c9153f7f2f9e5ab5817e000d5eba9a789eae7831e1a75a382c6181a130b +0ae6aac0e5cec25c567f1c3eb72caeba74fcd4ab5da3b73412e76399a56533ca +6044f2c2df96153ea47213cdc057e3cdfc8923b80543e5c5b226628dc0bece91 +e30fafeb8d4a860c90021c1a996d178c6c85e9be45f28edd3fba26d6ef2e486c +477670a17494c453ff09074c083aa8b74de9493f207b555c56e72fdb8867ccac +10f060675e0393d1e5c6b2f44f08458dfa45cd4bdddc3ce3aeb5c7afaa73086c +c7399ec8874f529e4af63bcb4df147edda137e552ca22f45ff9fa03ac41f724b +870d8656fd9bb93690eeb0e7df81e6957e602a0159ebf6692fadbc46c9ded8ec +229d9bb5cb617518127e557671723dd8768b1ee594ec29c4a096ec4fe6192ec5 +038eea033d0894c70de3920d1deac65b4fb001ed0c851779ed7154ef5a848257 +c973c7f02aa72c1067dd09b13575a33d3137969d683ebd38e8b61cf62fd3f4e3 +ce98c266e088aef330d9acb450ebbf96bf63600e83f13152eb0353801d2fca3e +18eef4f1fd438afe54026028dfd703cfce0bca12b0d2fdba236918d27517393d +c2ebd744f78e3dec0ce74805418f1a93252abef1ad71acc1809460a8dc423800 +86a593b8167212ad7ee18288d203244dd3a2025b8449c47021ff7620fb89d3ed +41f8547bd5328e7ac7cf5f0ebfc314bd4afa8323d0cba57e98058af91ff4002e +db452461e95eb2bff94e464bed868dc3014915a910704c5740a1ffe4eb3caffe +27c199f573a2b8310ef7dca5dd1baaee4eb5add21887d9b65246d93e36a72766 +e664b83245aea45114ca3c11b50d51d218eddd1fdade2aeabd385ce371734446 +745552c5322e029c892e227dcb3fd626cccdbb1731d4cd23057686833fc20906 +fb3640b2481fdadf09ee20e487556f5dafb429d648d74f57c8f6aa04f2ef121d +f2fd850667df1668f97d721647207084840861f2627f31e8858bfe5851c35fdb +b4a81e41645ceac4873fd2447ff94ebe8b83636578eaed2be03bd8f283fb6832 +c10a917d9ad056ac7ce149186b5664cc52cab3939ef44f35b43bf33cf06416fd +ff848179580a7c39732e7eeffce44f7b24cfb288534f47163a273f2a5d9f30ae +802af8ca1dd90bb7149e3c3a3082fa471257bff78019380b1ac8238b735666c2 +df052ea0b436789bee7ad5dd407e9c20774d5ff3e0af9187e24065dc9a119cb8 +842c5f37421d005f27d787a611a8f52ce76aa34ee0ac7236905c28d6d9841415 +387be7eca5c533ef618397c89f3df4cb86ea2e38ec497e380efd12743f6bc297 +629e86fd88cc269eaadd0dd63984e253caa270ac816df54077f7981cf1f1d5a7 +7aa46b7538794d9d414db7f7eda8831fd123f843b4b6a963648b2f3169693292 +6626e040cda63af93f25d4a6e304d3b05c171c7186f5ba239f9e2156a0e9d30f +d016aafff969eecff0111120c07706f09505359f63199c3e19e8142bc84b7efc +caa61b1f13828755bf18cab9eb638f17c3f20342f60c1e1850332c16c8d21c26 +40dbb93652c7cc6469486584f2e036160ed2334c5cbf3b343c9c20fb460fe049 +2ac14315bbe89139796ad76f219f2f78aa252aba529db54863fba815857b4369 +dbf510ecf4db2255912af8fb0a1d7c1a2d176fbfbbff0182b969c8b02780868d +2267b49d78b449702c46d1267319d79a101cabf6afef50a912b2fcb8482539e4 +9e919f3b1270599e8ccd1becd4fc4b973bf1d412764dcc3013c707039fc5db85 +b8c4759f7fb9be1fd2fc5d972e117af55ef2586b4441a440f350840210186a5e +d1e4019761f7b460cebf431c6d564322cc22362d93433f843166133fdcd079db +0f03591ae83885345c227b918e762e71db2b5e86653898d20f80c18c7f811797 +cd7f4a0b3c6c5d3289c5fe808a7068f3d19e8c4ae145fb822d59d2344bd47dd5 +6fc4f2c7237119a44710846bae73c9d13db5f08114ae8fbf644831e81dec6206 +d933c007f15c0c0ca65091a451a3f4268529df3d047f8c04bfbd7d7bc02b76fd +3aaf76991f6f0b2b4b6a4fb87dfb7281a260920f79aa6c0cd16bd15de94e8681 +fc684280948d6279ca994a078a261860c868d0a029c70f80903265db27ed9791 +2c5a80e648aa078a321e5cb431c0bb2a9d21e9929a4ff4b1f9dbe980bf7ae713 +f76ba86fd6dfc798d7488b115e7c30d1068322010037fc6c9bcc6182df29c66b +2477dc0197f1ec7f48a7473b80a284d917378e89b79c9aef1e975fc3edc7c60b +a3afdace73264dd561ad9478a3cbbf9858978620c79c09d660b1048d3ff8044d +c2bf02d1282e396f5c6298c30f3116285c16d3262630330c4fea515f629d480b +cbaaaeba211aabcb932c2c8c9cbb2d48092f69f11c221d9ca068c529213b4303 +e7db0af9ea0ecefa45fdcfa5478312aeee4e7ab6d393b8b578cc181bde18d138 +6eee5ecb8aa46d9c62eb8dac91fc3375f93917170a43c2fb48ec5bf00d15c5fc +f1d55710b6801ba04b406ad183dff76e19ee9526e6c38d5c2b084e8f36b7a9b1 +68ff8d2027c20b0d79d120a0785a35f93ac1f2a7319c65e68a4abbfd0ee8a3e9 +b14b3c5f230482032323b501a82424aa3256af1f7b5de145b16848b9bdb70bcc +c4f83c231aae58de03afd4b7d0c7cadadff17b2dbe285300606de214cef1c624 +1d2f2969f0b9741dc34d8dfdd30331d8fb2b12d3bffc004ad1e9bccaf126e96a +5e340a89e8a91a9eb19ea03d4886f768ce063c702f25f5ccc8f473f3a4b85fad +95d7a92d2e3318f635bbd79a8a4eee3f1208e9e69a7d63de373262d38eb8ac61 +21f3df1bba843a961b5d3e7f8735ff641ea99fefd347df900b678758080fe745 +538c9d5ad428839bb6840d084a49b2cc475319a99b33a178a4b4f24e56a9c251 +9e8c010f81de925cb895a446c87b63ecea312c8b230151adf735c6b7b158a1d6 +55e44e2f5c77c2b461b97e494dd098fdea07d1940427d2a3f2585abf264bc4ed +efada3790a85e0889e90e45c38482909b802b8c4c678e1129af4382e479e49a9 +e406e7120b85955936ffd8a40f41e91238e4d11c7e660b902897e9746f9948ec +29ed59c91597ab7d2137149edc67bc432e470a404bb9e6b1f98bcfdf1d49389f +828e3f35c203a3aededd8d4d3e6617c959d5c401fae6756223f2ff5b52134cc2 +804d20bb08498b8d00b0660fd27b4511a9a099a8487b7622184d781b47453611 +484da293aaa6b7e8124785991f755bbf689c4cd86e573f40e4f9cce9ffb6c5a8 +4a419e32002acd3392e677cdc2883bddc975bf0550a41e7d5623d745f389fab0 +5918c7cdfc9f49327eb8c4a59fad6ba52b0f075fe0a2851fde85910cf5cc9590 +b7d7bea3a1a8a251e37f6a20205b946b01da9adba76d14506850b6e634ddfdb3 +c853739461d428ac3349438634bc2c4577fa2a337990eb7bec05a6d9b90cfe70 +856680d5e822480f77f580c3a1e82b87dc2c2c554235da6133e79ad708786a8f +bfc34d813f4e4330afbd5e03f7ef0875a7a07aa201c7e71ab6a818afb9399ebf +d88e1d438e5d4634172f2f7000c10112692c4e9f0273a8db1c559b2e8d66fe93 +521514d2896b7321372d441e1e7c63edc272b30b6735ae53ac1b08c352aced8e +8e569d3d3dc4e7b79c9a58310d03ac8d2760522cce13bb95bddbb22a13b13cfb +78bbbf43cbee6adfb333ea66621a5616442fb9eb4d5855eafb1573075650d05b +9b36e80e8ee6e5a4115aa1234ef0898c52ba94d85072c4da759dc246ae56ea52 +6be02430ffa280c4052cf73d6eb4b62c3282d82929177263931d89f27b1e1dc8 +de5ecabd3e348ae919c983913e6ea48b21bc0827807fba233c132aaf170f20b3 +3ba72160f184a3df9b130e3bd09301e12d0b22dbf56ce6fc87ce156de4377498 +cad735a6f5e57840ebd7706ee44c6b44a9bc0120cd4f50720ba4b4f4002e11db +98d7db9a31a5c300d81546ef990481b7f9c278f0853c05b0fe5ef2586b4441a4 +218a64a07ed2bd6c547de31987297af9e99f16ecc361ec2650cbfc0ca9b55cb8 +f5b11408d58fe29e46eb31a0537fe757800abd0f34398cef4e77362a140d3ef6 +b00e83e143656b00cd218db158d44f5df1c5976fe708f15e32642e629645f1dc +1a3d22742637a809f2197ff9a60d1f58e74d0937f8d8cbf0b0de616809d91cfe +77675bc90ebd5cd44fc09ca0625e8cd6144b620bea2183744d33c42e535b4879 +ee3fc032610eab99688a6e800815164ce529eab33e85cb2a84ca3cea8074039a +5b0b9e2065fd72389d02c6608660adcdd7ddeb2c4feb5a32e3276025f5c3ff65 +bf4b01473897164745b05a4c1e1dbaeeb2506bd306e266e613b16b93ac0f869a +ecf140786a639f9856d2f47dfd448564cd6067590cd7c75bbe8b58eef67d2ea3 +8c965e69c090c242e29f12dee8b4335b8ecf7ef341de3a30892c09ef87913cf5 +147ae0cc255e05eb602420ae22e8c2754976dc6ce94fc477f330dba72728449d +459b2ecfecec62d0be91a9397b312a7d46b0cb7cfa2fc664397dbf9a50bcfbc6 +3ed6fd6a7941d36a37a815cc9290c79fe24f19d1a5c1cf0671a73c6c22abb952 +5618c9a3a9909f1850a9f470d2fde679c254bf516641ef96f46574633a94bd7e +c9890023100e55c6a51f1124b3dec6a7fd42f63499a1066d8d27a25819a7ca1a +979e04a8f1fa55d4aaa3eb05d8205cf93fe5d372778e809ba05dfb1e0a1e60ab +6d1140d4c0bd8e2db88e7d68eca8e3f3e2248cb6fcd2919c12d60bf4549cad35 +6000877d0241f7f19487e8c2b17a522bac5a91f864630e2ea4d2f5b7bef4d091 +064ed22d2f597d18c9f04e2e2e1be2ed884cafd31231da6133e79ad708400c02 +fa56a3f3f5eb56a713fe068d4cf564e7e20dec5cd4696759cc35d34fc0efce5b +dda7c02eaad828006036386ca3432c6c005aee97bc884afccd3b642c0a17f418 +e3f2e436dd02237531cf86ae391102b2023ae0913471b6797a8e71031412ac87 +b96a7173d5a56332ddc5811f8672b377955fb5e39f90d787ed2b0cdb81866f79 +165c8353c9cc1f0924b5f4ab6bd5197ea6273aed03c838f6a78bd9c40eb8b71b +436c0803bd569c3ae55ffac24dac9de63cf6f851c5e2199c11d9da77009e5531 +09e47298f63c44644470d768725db00743efd4b012665664b3f663da65c6329d +a22e64b466f56bb45e7afa47e1d2e8680a49fb4948a8c424c175ebb3f221a458 +d75f3f84929ba4716c503c81e9baf81999337a0e74d9c386e2b46aa7ecaa0689 +e5b00465cc49f96f7003d7d0bd1463372602a5a18bdf3e924493566ee07b37df +97814292f85845f2cdae528cf8e6d40b1b4c7ab83c276f3d9712e7cd00e96f81 +39dee7bc8d17b48a57a39210ae727a8563319091fb1944279c1e670a24093b0d +03ac8d4a479d2eead32e98af57251eaef7a6a110493471c97c04cb50fed0461d +b5d0f89df4f461b67bf479fac30463af0eb0a5c40b3ada200bda798ca929d04c +aca634d46b3fcfc12980c2ece9439363ee588b4cfbfe1adf3520a28209e59572 +148f5dd6e4891d9bdfb2525b5d4e16fb79c13a65e1d6872b1e2ef1c761d1ba66 +ea1ca508c2a3bb27a32515269ed4377d1ee7ddc8c94c4078bc4b352211cea134 +95326faf27554edfc3a8854cdd4ed995df19dedd2beaa478a9409a77f75fc1f4 +d57ac4352afaface9ad01b0b621cd8572b3c65878ea89e3f43269e8a0c3854c1 +454418f7b0b385044a15ccc1823961ceac3f500a09579e605f92f0bbc9f2d816 +8c50cd9e61b84e0fc17ad73c36227e22447b9ef1296f2fe302f23663deef0fc1 +eb759acc9dd1909f369fca5564adb3f0b2ed33428c75fcea4caac27e7e2ebcb3 +f50fe19f3a3904eb94baf40c40bfdf8a787e622563a2cbf6c32de0eb309ebbc4 +402e31bcdce135d63f42f314928df9816b69e19f732539bd00b5950b5aa8fc6c +b3bec0f14e60c3b97423680fd8158fae9b076f3d25aa3fd81bb5132f9b1f150a +caf2cbc0744e0d4f42b186af0591f16f51eca0ab48aa2525dbbf629b4754f235 +49f1f9a88d2ec444c26f28ad54c9c388ed9c00c9b2f5a19a32fb8880c47ebb80 +16ceb36d0cc17489b3e4e552984ff17ec5388f14541759ec95282eaeb4a2d6e3 +192cebedc3526f99363024cdebb040b3da29dc93b58f6090f2f5bac6c67c8ea4 +88b3f0eff0d6228e20a5b865bb2d1870e9e76c9663fb32e899c3f1f03507e174 +af0e77433fb35748aba9dc78f419fab7c9e508f73824460a7fe6ee23fca964a2 +839043a19ecb24b15b6406769b703a3b831bd6c4c82ee4af7aad7e5295f85353 +c7d3476119fc664568089a3350ca986913f16002e2889a7f091e02e3a400cf8b +83ece85176f96fc41efa93d5d658f45ac91e6e566184cc0376ebc6c8491f09c5 +e6b12eeea7e4e445a8821e03a381c468bdef4f7074b631a3146675b53f7539b2 +11e0b3b1885eb173883c4cacf1223ef4f6dcaed8054c8738fc3dd1abf1566be3 +b4d8e99bc538504742ab18cb9e5cf97c9e5284aba6f591e2d87f00952d0388ba +ee7c3ba1182073481edc7b9c0e761a85a1643941fc9a0bb39252d59c5b0abad3 +85ca9296546fdb9faf2bd384db91bd96c59da8250df2b5d125d0b2546bc7e2c5 +0ed4dc568d8f1b65b6f327842bed0e7e910e44ddfa302f5b30ec127aef3f02f1 +1dc0ce8a94bd9a77c33c8e366ad06f6675806d7f4e77282f88376fcc8e1772e4 +1ee7f1e9cde177b826f9069ed5c3d3d0b4bd54bd60e01d4c768cb47b27624853 +fd9e3760387debdb46d9dfb6da0f7afc1e1ca352f141b9039c6d2f3ee7ba88db +d5f1a0db0753962fad600b9245a3a6bdb0bc0dae1e65c3b27bf95a52353bff9d +34d860a5d9de8ea0547b9100c160b7b631ef5d8e2bdae77d7a915788bef9eb91 +11d4d7f60f0329462d2ea14a7da9289922a575fd88a52c1aa98cf1f4f34b7054 +64336e3ab7cb09d81e427e3bf24e87bf7147dfc0c52e6c67205181ad234ca1ff +0dedd467d4a13bf9afdc6167bb6f33a47f1ab1477ab32752c256286b25438259 +a143a6d95b2c6e5dd38dca03fd6c803782dd7dab0c7c0647f48a84a163cfec2c +e098a2ee99d2b0d46e0afc85091c8402b36b41cc096e733d3e7252c2a4b58f54 +369f049d0924a6903f8ad3e1bbea39e25bfa05815f79eef03e1748b2d581fe11 +7ab2e3c7a8f520c194b3c5e98fdea58f19b4e79d677ad54a7fa485a7a9712896 +618b0c33694a3c3467a245c52cd39fe9730e7c2634d298c1638a0c7109692cf2 +58f8a6d0bdf578cd28f72e48176a959993014e050a7d060918fde0a223eab193 +96cca9c895a0d5bb26eeeb9190df3f07e2d6243d7a845404be35983125b133d3 +7bf15f8c7cffc8ecf514969e23fabd262facea11fee56fa69682307719c216b7 +881b733d24403eb703c288cbf898749f3e81fe24451e063b3c02cb2ef8dcfc36 +179a525662d47e0e6325b93d885973935c91cc6c52749a939d32fa1f5a74b689 +d06d161914dffba8335c544ad8c4e83522f403157b7aa2ab15593a7583c684e4 +72df545d24a4894038195781caa9f0f49a66fc62fbd0a5155743b7c17c9e6ffa +e86076684c20a77b1e74abf75aab577b93dcde8c3ff60aed1a87ec006d276725 +215681e444c21acbb6318f41d175894c303738994c15099f4021950a8b389dc2 +ab91b74ed57317f7faf10f00bda6be25467f05676ac4192c369ce03bb374617a +d5bebcc56ffc07cb5d8e7da3e17b7ab3d9d5dba4b8354c03a64f02be62ef5df1 +4b9b9376e79a803423bc55c5cee3972f75faf61dc41d1e8415ca55d3cf703612 +1cfe771be80b697389c047c601dbb8548f0d58ed841d25531a41d8664730f34e +2b187bbeb8d9c16ae7591ca61fb2ab36ff3b6782c7e97833827a1ff86644ae56 +f463956635883b55891a08fa707e90c392ae4721fdb0b2311f8cf00a4703faad +8114b615eef9737684a3c53ca307abd11558ce0810db4d94a444fc6babbbe40f +3fca201d7f66ed5f834d33eeb1189648d68efefb7af5a080f1b6297b75e7815b +4680e3c4b2676f3c763fd9d28fd00374c2ff2697bb8b96ea13cebdf68eb17001 +c041d24e19c97d33d448f4d6aa3d50d8720b0377135f30b479d973ebebb93031 +aa1faee6c275b21cd88852d903f08e2629066e18bfcdfe736b208429a99f7420 +7fe3f156e82b16cbe3d401aaf8ea2a417a7ded77fc22d8f047685fb642b7e25a +50c5141c1f1f38a14ce3c0b8b3447d8f48de07c687e4c4cf69204e85c6489a3c +adf29ca7f2363308621dfd1f48efe47d7fcb3f67441ce965f04f42b78d23500d +25890201f30d13dc767cebd955da0ce6f6411001fac35b8ff9762eeafda44864 +cf1fd2f8c5c006ae8afaea913ae1c75765e4d6d77b7e21a6d16daac81366f237 +78d2c5b9a64872015bbad846c77d4a9b93353935d2b6e57b39ebbb02993c18f5 +228d99a76250b85311629162556dd299f7eb2479c705c6e477167faec90ace94 +4145a22a5cdca376cd2f809ee685329d8ae45f3d29b2187bd4077b1e7c5889aa +d999a67759f2b649e82031f198bc592bff385a196f4b9943300e1c9557ccad85 +497b9f2c5ac963b85527302a1d7c42d5d5c8c58328318a6410df0437225eb017 +494c3aa09f129275a02d0f0d2d5e24fa35a6b0112435d63cc0706491cdb6e75d +d957789831d30481e3b8e52d678d0990202a4310255adefea4a4b48abf4b835d +35c66f7f279e1d7cd4887798ef065d2218056e2374c03c99fc2e17a24a9e70b4 +9440f5e20c8806dc23e1b1b545716dcea57adc5e40d7df2a7a259b559cd37c2d +8fb1eeb6731601ccb46af23de0ba8c1628f4b88a9b2d468c96730bff946e66a5 +d200ae32702e6fa6c907ca03518731f60b1252a5cc2dd1f9bd90428c2e0f0a7c +54d92afc89333da6a83c324af0629a26996457d6374437d9cef97bb99eff0e98 +a22c6b0deba1062f3c48226dbc9a5899cc864b975bd1f082d7e511a5b4cf9c0d +7f30d371f689da42f11df7c18389941337b9c07e1cf5f5cbf33e400feb6f4aae +e60a026da25d51a3bc14d427d37fbc1e64e938a4de50f52578768bc70ce53327 +2db34369f898761aec2c8dda5931f895d28872ec6f209d78be4f4ab8da35f656 +97c57405ce7ae5541c9ff509d5762aa6297e7a0194059eef3a2ae5d59dfad4e9 +807cba47217ba163742c83f8205052cd729ed6f8c452af9712dee557d4bf8a30 +3209d36bdddb790812c4e532165f955c981339226c4ccdb89f78666953c02eb2 +f38c4cacff62da858e16feb7bd379b92d9420a26fe2a0aa0c71e064000164413 +7c538d2da78a5403cae324705be07519a4c6124f4e299c41497f23ab3c479ac8 +e309dc694cb84b693a40ef5fa7d4eaeb84e97643474253f982e38060a81ef3de +b08144992e048e8fe2e9719ee6c840e5be01142f4a62ff3f2f1b1d70997f1fcd +183c5cdc04d67e5f46f946eefd6abbcf0170141516c7bffc2a07efb440dce1ce +888a5acbe4c407c8fa46e28d20e7774d2e374e224b991242df5a20cf3be574c4 +10a1a88badb054b812e7f3ea575682e6a86792ff4ea12bb43245bfdf588df7ce +ae590954e88607c4201efb34b2a9cffaaa392ab52f72ec08de1424d2420bf7b8 +2f2a0dc2aa083310b4a6f2a68ab5ee8384bbbf4ed9f932308c2836d6de8da231 +dee2b4f08790d1653490b71ad5d0bed41b06f659f8c3a771b82c8e58ec4e0a0c +5a9f7f9874bc6a1479b918050f06e4d1b49232d8b44f312a5f6666b49e54389c +18e7d89a399fac13ea6ea584dd48ac68c0ee40d26e4f2ac32951a3aef14c503c +7ca2d05701b756990b9809e25384b0815fe2bf5084ed21d8cdab1fe3cbe15c41 +e8a94336359df9ed3a43c529529a9e7f63d8de36720e108d1a9feb0b9ec91379 +b57d2ac8a6799176ca5d5956ab877d87050d86ab917689c93652b729d4746f6f +34de32680d8ab5c5a4565512d6ec950a60f5b0b141f348d1934b4f3689640592 +f22d1c1cbcdd5116b204061afc1b8f15afcb06f4c44905d17b8e44ec96ca2888 +b34eb85465ed2b2620756ed963fbb9312883c8aaf4870c52eb032bb5cb7458b2 +fbd796b670e972f576dd3941c76cbed5c40b669f0dcb34b31d29501097553698 +9bd2a479acfcf324fd549b3e41bdefd06f42492c36d8c0201d2526e53ad34e55 +2b2384e39836743766e384e5858f33ac842cfedc28022ee8dbefb2a2c3a408a6 +be84826023124f7eec8295a2e1079480f30eb64479f2673da8f051267142dc54 +e88dc8dc4ef41036f1de1b9a198e5006f8336b29720288c9f2e545ec8663171a +280273b1626f882c6894be2fa2532c2f20e4e24f1406c0627f9cc4021cac67c8 +3a60b39f1849b483757f18ca956ec3bbaea96cb0e2a10477e69a6040dc3b5321 +391af5478fdded8730e825818d960c6f4a305d653a732f1c51c2ca3e3adc4a37 +22958d50a78359cabcffaae1d75ce79e72e09a354c5e805967e30ae708c109ee +75ef233df66782bebc4c5dd9ed6ef0a50eb2693787576a19b42e70e3d0c073fd +fe1b3562083bc01d9b38868e64b8ae90b9f3164e2a29fbb1f1bdfd8ffc2a842a +c2f9801d4839c97f4bdaf1466038eb4b6975e777acbdd875beb59268f0eae6d3 +a03c2bb60bda0ffaaf77c4f33d4671ee85f301521557a6f323f1b0d060326fd8 +7c60f65e4220b7fdf85de8f0ed64661fddba2efd3374fc45a507437a1ad2ab49 +38e4ccbe2411ffb70718397e156d24ab018436fecd39af252f3f9527397cdab6 +75b261045194cb3d3b5aca47c98f1177ca1322775aa8c29216fb7f8ce0fbe698 +479abd173b9541fdebbc3cde6ad12be816108a049d5462572544912ecac19e6e +9fc6dc06160904e7bb14796e5becff4df3a8f645825c9f59fb419bfb5ced8e5b +449a2e57adc9693e9d34e6bb5a600d16189bf146f3dbaf4f75d16b303a322048 +ddc0de4a91156aa427f1b137a714f7ec2a4aaf612de4819dede79b78c90a86c9 +01278125bf2999c9acfd90a866830d00a0f1c83a87cec69cb2f382c935bc571e +a3b53fb22664be95d8e95d229b9985d992dbc6439f0ca52762b3cd7a4a50973c +17de473f987151687da95caf1457c524a4406c98bd025f353124da7e6389a921 +e56de4d1ca7901cb37f051b9d3b78709640530cd549c9907ee6def35aeb2eecd +1c9a1a4ae7686da61b848371dcacd9f02cc320f29ef144a10803df5dc4621887 +09a85504074b8439c1a3a7c253581597d6f94289e7113c678fae406b6586ec40 +fe51769903be72259817704579212bbe802679ef21f7578fae78d1f8c29a5438 +b656f13d14ac4b10d1b48d83dd1ec6e569358f9dce2093f319f9d3663e331744 +bca142ec6b901acb9b5594ea7423072d96a61e523336059c1091823b03dc6756 +71cfc688bd2062830e0edf7a5d400c680784691ff46bf4d8853a42c57320414a +0c7b838bf2bc33726d8a61d11dc42005b909b241b553c37462ba057c30e7bdee +b3ec5513ddca5046dbf783c780ffccdc188b5890daf03c94c8bbeadd2e33e95a +8bad7cf8c890753d607e1e74dda3963d32cd37ad2d0eb722498718df3827236d +7f073eed7fc3c0ce0fb5629f08d4a71d1825c4d158ef364c8d69e8767acbaa92 +e1751a266718d67fb61b4a07c485cb887f04bd30468bd6ff5163e5e35c7b4bf6 +ead5db27d8690d7c54b2be107d8180396ba6046e8b1ec7f51a624a52ad2f9e25 +96df52d886aa0f5f0316fb0a6ff881ef3cf2a11debba86921f94b6ab18088a61 +ccb125c7732c3681373e4151094543ad56ba6b5b915ca303a753a65aa189f6d7 +1bcd8ab565ab5696b9b0a2fb5b7feef3dcd6ef83f859fa4be52c24c31ec71153 +4577aba733b4f0ec2ca742f8bd658d7646e6af057d09b504f072b85e8ce75c51 +cdb3b17d34c06c1ca57b88e7ae944d289bcbc1f7ad27898a703c0b2b9e0dfc9f +87a6b2c1d9ea2cc05fef8bffb8cffd8d8246ddc86e135a8361d36748680881d2 +5daeefbe63d60e449d50acc1718f1b6df6297849d31eecb6c990304d5e37d6bc +d83c17c4ebded22db52466af31cdd0b576d69ed50ef359cb44507a79462b2825 +04a48a4b8bbe2ef617837ae266e3ab90e5f45647ed6b99c6d8b6121f1f7771f7 +5b76362f01bbe8a8b4268d4755c7b613b2faed3f108c29bda855012eea6c2221 +0f618b416e25534efec4c0f6d0feaa4ce7517802f2ccf54c96c4b5b9227bb59f +8c8a49fb435d4134dce397f41f3b6d295f6453b9483c3c1d2ffd47a3199b370f +2f31b3772afd59d0135ee2970b66acc4a1a0d3a18be2b3cc0a8a261e9dfe32b1 +a63ebc7fd99af94cabd34eeafca393ab83b5ced9b4e60f868e0b7aad2c2f21b0 +d84919f1c1598e6143440481e3c4a97750300f7e0660eb65416215d13d8f546f +74c4700693327ae762ef61db4463f3644d534a3b4127c06741f0f3394f395ed3 +84c4139b7ffc5b02185dd9e9fc4a9a790d91eda97f8262e6327779701f7440a2 +7120c75242cb2e3c5570399c648b21da288d2a9d610dd11d5f9cfae9aa1caf9f +05437bc137d8cf0e83272ecdec1c574ee6880505f03fb673c5ef5e31a674d1fa +390de77900b9dc1fe4d73311032af31f6985bf38005fd3498d569de012062aa9 +c4e5baee3ee651230cf8f06f9562482e56aef639b4e9b14fe104d7a4e59d9f59 +ed573a530fead02933ab576a225e00d4681821a6bd294b96c9f73ead9eba509a +e5d9008007ece9e52dbe377e161c5b5e1fe556db12e167595ca9024a24c72e65 +527e3f4b94353bc5fd302dcd2343dfc038950bbc4c1249776e2561a90c9a5ca9 +c045f6812d9491a77d5f775ccaf51b81f299e1f9122c50712fcd660bf649f628 +2aee3c072d41bfb68cc3aec648f2201fd414d50e1375dc1fa058a80f54ef4852 +2715a66f46b0da8861864fdf8e22f6e47cb32837b34ffdc5b578717a1119c6e7 +ef7566c58b373d111eb6c2bf1e9853d13c6223fac9ad3123765163c06dfc0637 +c692af835e89ebecf5b37620104cb8f17851abfa357e02703a059d960d9df6f7 +fdbb168337708e7f919c04c802ea2e2b3a3babf74eb86e63de9b8644627d8985 +a1ad3b8adcca509f7a7debdd4634cbf42715063265b57d40eb7475423c383835 +9cb5a1fccfcc7874c782cd859ba71d5f114991e6fe5e557fd360943786fa1610 +75b6783140ef30382f184be07a3b0bb616442a4a4007af227492a994854b4029 +8b9e9b4e4483dd252b2230f1f615a122918f32c3ea0a68805fcc73bca40be7f3 +fd94e698d0a65005a64dcbb7d97f60cab183acc86762873f18b673dc194cfce1 +03f07cad09c8fd6b1f532d72cc86ea99ea24a21a41a2e09837093d5e1f1e3d74 +342cc4466d9ed9c1722d8665b00a9f254950c286426737b8690914d856ac20f1 +bf27180e6f9b00981bc8b3b165c5cc7e02a689dccfd58c1b5939186c590a97d0 +4d5710fb5506bcfff05f8c6241c125e300235afcd2311d997a1369783a83ee1f +040b8fe44804dd62ff7e5e77dbfd66177a934eaee33737d643092a0cf65e51b1 +31a7ce8e502102aba1a8a68b8d95c5b0651c83214017ea2bd5e5a52d7e9d8afb +ba7cd22bbcaae087ead54739401b0d8acda7766d94d640feecca18f1829ae75d +a4aba8485bc9dfc9c67409c7d465f54d740ccc8ed6452872082bea2773fd5d64 +6a809f5d382b69955db3a56e61849017f103bec6de80850132002216dfd30111 +0250985d8241933cab0ceac16e90d929dda1d3169a8de16ca98aeec1bf59b9b4 +e0ec460a2631f6d3ad4f84fde5b5dcd29d53afbc6c8a3adf15d234b13de3fce5 +2689a74f49cdf2d9affd89a098d6fa7c0f93724a08324ed1ce7db85034bf4a67 +e7d0573db8e2fbd09e123156b2d066bccd9db05b87cf61545a6e219009452b75 +41aba3802cade07019910ced99eccd026725d0853f9f159703f449d1e1d33902 +148421d34f132378dd12d9e79168bcd8dec5bfe47c862adbf7883e46dcf0c241 +e068ca77b72ce9a73a3ac40f568481f62d9f36ede5f0264c4d8f9b2ce03e19e7 +0a94d0e467a9832efbacffcff9efbcbd405432914bc36fcbd16c4c2aba631f82 +13239b69f183482bd2922470427fbab78cc598a57819dae5e3321efef1fdb44e +084a4402b8cee480242e42dc09bbf208042dea7968a643851cac21aebc1ba274 +0ac999d965b43feaedc8c76a32ff8d4fa30e2c8444b01716af4878ecf291309c +bdb70c5bfbd4134ad5d044a04a057405a91e1a1ef15980383cd4aadd4190904d +5528e55138635714ec3f9d8e0fe1bd1e8ed4b742ea90572f1ac8d01e711c074a +4125ea595fbce0746121a5d022d16b2125a1577850f6d1010279a5dbbf135eb8 +edcdcfc459b7b554192149c29327f86e477dd3d13fa5ae3a78cfb714c9a75006 +7ba154407ef22158670059820c8041941f7ff5c27c016b20b867f83a9c8955dc +d282dbb6f72bd2067dfc1e91373a3021be2be6aec5f90c8001878077eabc9263 +9f5beb892bfded1d04136bb3140dafaeeeb31c21d8baf03715fc56ecc16e7dd1 +1c12df0bb68240772f2c59829482cf97f6a922c8c7deccd1a395e7ba2a1a8552 +06c27630ae1f236606a3a9dba1404326b8b484d5d2564b480ee7422365234cef +2609605ad9e24294ce5f5bdd61a479c33fe53ee8bf857e2d2a25dbbc9a1cfad3 +a5d7b2f1155d29367e318c8a82e1e0aa236b8442838e3deeb9f7455923cd769d +28c1f780c0d3bffc275e0242ec975d2beb7f6bb5222b2cdd196e4ec94452050a +76a4aa6352633cd58f461fd646f23758e343b5a386927b66ac6ef1acc84839f8 +bcca9f9f93f18cb4c6bbc663a951dd5211acd684ef945c10f156b5b6e1c182a7 +a580b3966716c334ddd9f78a404873a738ab6ccf8a335f1f6dc830d7d74e021b +bca95d260b34d1933177e5ead9c2793d264c94e8bb274b9712afb7862bbd8f74 +b4cce27cac9f29c086bb30162820a229e6d5c83410a8b876fad5b8a028abc067 +885b5cec60995550d35f60afd1da93e3dc14c42decd2b0800706a222e9e4b7d7 +bba9646f6a3ef9489dfb011045a6444cb599c62dcae4b11de7d8d98f8e58a9a4 +feba0e5f7301b795f4085baa4a7085c5a438d0b784b21186787abf88b455f1e2 +ef19fbbb4501d5c69c22b219737aa5ceca0d0475bb6916685534448816d2791a +31544769ff1152c2f2cf4c7cd3f64c6830522219349254d11e6ff2056a341648 +e9caf2fc5c6f48a8713448b4a0a7bf4f250df1f9ab9db798e0c5d2cad0116608 +a0a6190d8fa4f8e67f705d8dfc7cd8be652b13ec24beb159f97d22997094e38e +90fe6e9f3d2a07ac92f1648c78e6ca7452481fb78dfefdb4399c62986b652e08 +ca4a9a4966cbbb572c4b2c8bedb9285372904836abcea90e91ee6fe8dbe8fcf7 +18f4e0ce97b29be634db1f19b541e003409442a59e320cd38789b76eb79e35ac +b1e09f5ac2eee068664a0f505c61c07da5bbf439acd52feb4caac79ff0575647 +2aada68f6aad5a1b760468859d9297e3ac4ceaf7830c09d3562c012d48cf7da5 +f93d7942a15fd76be4e90cb1a966503d32dd2fc39c1cd01c629b600ba6463288 +466ebf44a4df63fe204067d6a39719ab32b5073d4bdd022933b5bb5652510919 +af2f90863be9f08dc507609487ebd7b796a3f0b029e13492cd0a1dc002d85b8d +a0d2ddf319f7e732ed40a87c984340976292119ab947b5f5b9e5e31e6023e22e +6ef0d04bb9d9cbb7de56a1626c5925847300a6dbeed495b18deeb81580701052 +e4b37d9e0b346aa8a55621bf5dfe3bd1cbf2051e62ab1e1da21387b5f38c1199 +34ffab0e8158107bc33f36a537996faf01870b85d5da02977ba62fb8e5d4878e +1be660a6414c9084a3a5f05a4a2c3c1f311a589ba7afc5418e3b480c92f91033 +ea61d0a6a1f9e209226f2cab2d9c10e2b54f22e9a730ab8d48548cd28c3dab41 +5b03a59345bdfa9656cbdf48363eb233dead8ed309268a629bbc3c6e2d85eab1 +5f3b769afef377e4602fee3efe33401eba124aa4d4593c5356214c59db31702f +44d33f89196e09e6e2215687c448c9615c69d7163b2867252de9771c9ee8a395 +87bb374d1b705d61c42da4a8a7ed8ebd24d1062d377fb37fd84d5ec3eac25d5d +39bdc91f7c820b9fe806984bcfd3c3753a607650a6ee4460a24906f75b38f2c4 +42a65909bb70e7383f9e90a06f13fa2acf0a37e59a31185b6f9437e741571dbe +fb518dd564140aab4c91d37e6435ab9b2b376bf6522f90b5660ccd1d7e8b82dc +3a41d34e2c39cdfa05f1e4a7ebdd3586e69c6ccc4847e086052dc7d6cd4d8302 +c34f4f0402daf9549bdd83c24c44a68cc2e0c2635686c6e49ed8bd5675749650 +a79e40588f4315fdb9c187fa7b4956151b7123f36937b06fd147eb8d51a8eeac +5461441d24afbadc7922cfc237823efff1a3e742b336e84702189c648ab7078d +6097d8fd5f3baec947d63912156478662aeda72a501c747a325d1227cd4093ff +e9a931367dde46d65857290ade9dc3d8eb73e7149dacc34c08faa51f9fa39e0c +13d14be58999496dfde61566e68f83135a0e43cab3cc6395217a0845423210cb +032c63d56bae68773991e91f186b198105f165723e08f6db39e889ef3f944d33 +9886c0c6ed8e41c20c0743864a50d37c281abf47fba6d08728aa21a833f22aea +d0bc38d211caf58d44d01e10c2da4065a3082e562e82e3f1def28b5fbab1e93c +c3716256b98ce87e4dde9e93622e5ddce60981e89ad0d70d0fa8b1638f4c12ee +82a601073f84ccd47b631781ef34da22b5cd35023f23c6fff02973f993d7457e +fe579da64d7110867d6fabe6b41b97e9e711369232f98cac9975d56d69cfc985 +30e76ecfa380311854170f98cc43596a3d4019d08c25e59dbc3eb850e026cd48 +4644353c125e38f199b22ccf0a502d675d5e0be2a4df28ea88c3ca6b939b4b19 +e81ab728d3e44648830f0ccaac81f705d098c127f07f56ca8550ceb827722d04 +6ce419a2504d8d6740cf9ccb5d079f1086dff76bcef4bd20e854eed00bce0858 +522818c8ebae755857d51961a9c61ab5367445b621562c645664f6df9f63a212 +46ca26d21aeb97ab2b271003d5734719358b16d2af5cbc1799c88b899e3c964c +453e53de23d02bd3137cc0c1f07470d8ffea99d6a27e835ac56c977c149dfd13 +de3c0c328f8edd67c1f95953b9892e0147a245ee0d4e5912c7eba0b810c0667b +17b545543b0662d53be35c26192356522fd7db85df65e5db4d6573b6c0c0f5da +3747e6fd6c4a041525f7e48b56ae420995938a2229c967e98c8256c28f3a99b0 +739f75f0f1d250db34ecd7abcf25b86e6b94de40d033d99710fa654fafc2adf0 +118f750a07aea2c94f205cbd091eb2a3bbbff77253122f179395e088c6b7a9f0 +6ad421055622a1cc0538e8b3f03c4dec14746a49b2a19bb161ef7d5da64a4562 +e3a0ad91e4ad5a052d74c1473febc4f186cd6b73d48a895e8bbba44657d00663 +d5e76686f65a7ddc45ab8194be9fcd289e170994d8f17d4847080ec3f0fc36f8 +11035bde3970e330f1b654034faf87b01b9981330b3513c2f32e13a280b52c92 +449525bd879f684edc107a40c02da468ede54c9bf7ae72d4c314563e55d9d194 +96d0f80472b2f3c8398700bee642314f87fcee7e0fb9e4500fc980e0a9f755c7 +1cd9afe4b3946aa06d2ae458ea77080c3308f65bfa253674be7182dea45a8d2c +029a570cb3914f7c7cd0cf31f9b537b4f2f7cf918c5e82c6ab36f65ac444ce93 +5e1d14f413c2c005ce388ef8175d7c8e7bfd68640c650385b646fd00dbdfbb9e +0ec83d93f7ddd486a358a8493a4327d11568d3145b52cfbd0bd5b4d7def67990 +6fe1297a16908e16b9de0a13986d5ebf4f829c4de8eeab729480c1372c0b85c4 +62d02d8e6bb0c45fb26e4d82f0152eea9b745e1c20e478ea50110efdc5bf0164 +a678ecf71278fb2bf0c8a53a99ec0f46029eaff9229108234fa1624b5e33f927 +2a232f64acd955839b942f8f8cd3f3e3871a443f685149bc5ad0083f6baf20c1 +4025309173788aab5568160b31e7f7ab6f10f4033345656fe958613d626e8ab7 +091aae62e2150d7f854d5740f601c0756b4d04a2f4ced1f833042b4ea609a051 +defe8aed847795cacc657c5dde3331323d5f21b24154b3b2c991e3da5de77d00 +a4577ccc862f035c10f2c073f85b97fb489a5d5a17d84d9ca133a018a22788ef +86afd7c1c8952eadc6cf5139605b19df95546e90a839440d56ea29625d57eba8 +0472486cae74bd099198ab8619cbb6fcd652774b0a97806f5f83f6e8a109eeca +85cc7bfd19ae0cf27336e00d98d130f932be9752cbb97a14a44fc6407b286744 +ff893a26ede2d28c6d5a2c2369388cd6a23bf8e102d7014b3944afea96cbe037 +35db0e6e4922d4c5b2b6add56d317f3532fc50a410cf19be859075abe70ed195 +996f9b9afc7b1f3b1a5d1602fc6d55d5171ccc345e28040625e4fabb28699011 +6ff9dfdbbbd193d503d5ff027b0f4a3b124f2e0a1e428379ac6fecfa313fd135 +a6f38da32b37b3d6b877e5148b55aa40567b78d69bfc59681acf8c871507eb03 +518650eeac7270883e7003ab9ca8a2e531516c309c31f67a059349b0f603f584 +c6d91770ded8a825c6f759cb3128bb928cb1e671c1684cfa153a41e6e775ebdf +54f25d11865ad5972e8bf3193fa4044fa618bfb88b621420c86a5a30b4716fea +a63197c6081bb1f324605d018e8c63753fab6f972670cbaa9a4946b9c20fa42c +6e52c9751654a3cd885fd9efe11600771861ae0d026fe0dbe642b073c91036ae +eecfaa08a7d85983eb13828c3903c532c0829802ff8b45e64e39079f65a5b84f +f91b65688eb31e6d5fc58cadc44319885bda8d78db2aab9fc4a268e3397d12d5 +1ca0ffc79929344f97a6201c01a183d2c0c2702049048205649b91a784c7095b +8630b00c1ee0af742945873049981540863fe38a4e57cfc8647c85c069296284 +599f169506c9df019471e0ca8fbc9abf7d1af1dcec4802e72bfb1d16138585e4 +51918e0c421966a52ac29c21aa3822870959543691460c52ee43517b8588c365 +888921e4560d3e28f72358325197f09baea07fccf9d10b238659be645e0bcdd5 +e76534b21b52941a1e48267faae6abd43149987eb5385b44a422c0d6eb37c818 +542c3553452c97e016c26d38a4c0b53ae8b156167a5e11b861b44bc488bb2bb0 +cc652e3a1d12e616a502d1fcf31bfdcead55e2fdffc121ce85f525ba491feb54 +7a3d16d85f65ad30e430dca5c603685abe8484d4c4144f91c5595a3fda9351e1 +7f00eeccfcdb2e0465566192b23a9a78c14d62fdb3b1963c780f6855dd733820 +89094e921ce09784e1f5408c620f6481d300d9fa6f8c23876a49281b0d425090 +497b767614696424dcecad04f0767bb7601b99dd3bc5cc14d2dd77c09101fbd3 +b6e725e5c68ba66a5a371fd6f3ca6351ef075645a3c03492f7fbfa225a5f3e01 +b962177026d94e845953d5781064633edc41fcfed874e011304723a52fe8ebe5 +d6efc5e69b9edf735067ba2d3ef221ee6244034df2469afb6056dba877ca9850 +d4e20ce756a79a38e74b356019de03ca6651e54d1523e12ba9d9dd8e44dae7a9 +20eba8784607fd0eaeb0b456bad6e739e264aa0a3f4d5cc5584e072cfc8e0a2b +949b4102d14fe3bbcd7ded2405718b0a7cd41deff91bd415340d6de94797c53c +d734d14a11be9fd9de57cc35175f24913e96f95315ad3c66ee102176e59a3b66 +9c0b992d1b6c3cc131b33119eca4fae72f7553cb977dcffbd5ea29728ac5a645 +eaab33042a0ad86e8b28fbdf79325e28c3801cd0f9d8a2b563aaebcebfc6540a +3ea351caa601ba8e5c5bfed770d61d7366f96d6bcde2db981b51e38ba35237ea +d55fa9c1cc2b3381131c1dbb39ddd7229d06e4b9d203d066666c8ad6aaa1a6df +0d346f843205c41a95f72df3027c9e6486a0088f8f8e7c9ef820e2e80766fc70 +6c4df71ba5801863b29a917a16abcd824d9a94c9081208685f8a4398004d8afa +25087ba3fc81dceed46b7d6fc92d3b9557514899c5c97114ed722616b477ccfe +4f4e1faba32e6a24a091a7a1067628ecc8c421f8a967c6e0136a9c23ef642100 +eb91c300975d6dc2c09da077e24fed0aeaf2876b91d0db63c4e347afd558f613 +44eafd38df995bd98fcb720ce19023c26e0b1157e299e18d13fc7715bc1141d4 +49f05fc6bf234ab5af157696a354495e45a818f41a007e601b49500e7554695a +4c21c8f6fb67d7b81379f6d3abff7b059f277e48c0291852c6af3e9d412526e6 +b23653e0283af4ff8f06503ef135f552270f04d735cc21fbaa059025e7e32cc7 +f03bdc406a167be87ce1442f285aba9aab9f4ff91daed0f04eadcc8e98a6ef67 +0263a76e5b77baf65f979e202658c06d0deaa83aeb577e4872a916a87b8aad9e +9c9b22630d3b3b95b790f11f83bc6a52497a7c03264d70f55b6ee2ecf4f5af13 +d45df4bcefc85437ad3d9b78e565e3dadc353e972fc21ba6f8ce701cb9c1aae6 +5b2ffd89d65075bd6a5ae8f195d13165969e08c20a6143efa43a31963e81805b +584f93e1957713065d371abeef4ade6c3c024f37bcb2cc00895252332325359e +6f7425665f46bf49ed14cbdd14a659876670d962d36aab38e75c47db93978cc7 +c30e5e33185c437cfc260caa8c3af8a0fe39d955fe41a89344db01f0f33632b5 +71832eff64ed70de8b5dcf90e73e908b274441d7e34e14381c6a88bf71db2703 +8b3037bcd5eb5a4a1c9b6067d2874b898c95dee5b114c10528dd3cd04d412719 +0405f89ad7461b66eac5bb976c6eb433a43db8847ab105a9d6e004c1d08e17ec +c402862aeba56fa63297c5dab64a0f3dba016a5af5c761de36c9bdf0b375c0bd +6fd3c0fa3787e362103c3f96d6d1bca0fe0b3fa33c034f472204cef2949742fa +5b973d21b8af8e7c1ede70cb40860f7a58ac12a7709be24ba724166770215440 +b0dd64dbe6af369ec9fc0d82e3c7a597884e4330109ab7631b8f8a62f0ce7dc1 +7c9919d55bd997497b66e4089b640ada46e454b4cd90a45a5805eda36ec5db69 +ca53cd3380d2f59c9cc4c6d52139cc33324161adabcf2eb44cfce47ba893bd4a +53d4480118c1ba64436d3771ded3182b2de8306237012aea5d5a2995abcbc097 +e7535e259053c58c8de2a6c7c8d21ad6feec5907c2f6783541c68d00be43776a +8e766d72a8fa8123d819d38f1f53f36bd48adcc6f7a1455cc87453f96e550903 +df9b819196a27061facc772b773dbd1444c37d3136a0d3158d79e98a70e8e030 +dbaa42c202db2c0f8b03687f3d48b0f1783124024a5ebc0433990b1591459766 +cbeaadebafa313226d839697f97e14cad664856368583b3e2e79609cac4c81af +e602dd4200cfa43fda4f1e48d68b13f27533ab9f3fd05a0143378b81d7e5bc77 +eb8829d3d4e896af1c31ae42d39bc60f687306a10107727c8fc2fb98ad61af9b +7808b6afccd125519cc4f98828e53ac23388ffa188e885c64a97439cabfeeaca +48453cf4c6ac118ff667c21300d1c1ed5fef10e03f22e69e36248e476519a677 +fd224e37ac95fa3d9aeea5b2482da91aec2f5e7a2b57a84ec7ec8699fc658175 +7cfc8ed6bab56242725f615304b3cc39c20e8dd67136f864ad32605b0ea9ab0d +3662bb1ec7e317684a5a6afd8c3e83358db1392bdfb53dcb2d1624ba8772f701 +a3626967c0a543a4b01d70aadea4d1c2c86383c6eb9a722a6c833c0c5f7e92ef +d67ff6bb9fc72a9933a446ac965c26c72ab279c5755890d21a9dd9f3862582bd +b1d9ccd1963a21bacd4be17d03819ab523f4473b20a87f120dcef914c72144e3 +50ac33a94859de19fc1c45816ba504646b8b53410dedf6f2b1dd9b2f0b274901 +3aeba319bc7d2e1adc99cbcff5d5ca41baf982ab06c3741fdde91b5ae8601be0 +a690a8848d30eb1727351734daa8ec8fc416bb425309b1232d290ad42ab8d970 +62812696531e1a5f6f87844f9ad9fe0cc660a7c4bb1f7c2d37ac95214fe2cb45 +37f763691698dfc6cb42aee39ca3e37910a5caa4bbc93b20d7565936223f79d7 +77d14971397338d791989bdd842a25eb4747a45fb3d0d853000205301a799d0f +1a597a34fad9c47ba0c27a82251b4d460f1de01fd0066bef08e4e6139412f5f7 +b46ca9c6fc7b5e1bff8f5a24498699cc168b419278a41f5eb1845b41a298cda7 +e237d3b149ebc1ebb02c33433c0cc8043bee875475cc389dfdb141fa31a67c9b +97f2bd9afcdcbd16b0682b3da7c3fe91ce83fa0eee07e155dbbafa26ff706798 +c07bc149d963c31bd8b3d9736a21d45d5d7761f6d93111a10b978b32a00b6593 +4ad2e4df3c2979ce6179aaa50a28348d3fd1743d482c16a2538eaaa17f6894fe +a19a21411ac73ff779f355ae9fca182a55d43f1080a60721ec087738c87987c4 +699e24c19172afdf0461ef5d75820f2957bf75b1b396bf2a5462c7be537e67d2 +8ddeb130863434670c75b36878888a430846e1f6565c9f0f529ad4e5d2386dc6 +1f9fb0f4782a802c853cf5830763f5b9df5d77c5c3fef77c14fa64b966573237 +b911aa353738e3ce2683d5a4612ddce6c8f50cd2c0b11912b7b09cb60590ea9b +25dad41363a82751aff5a9da8e1fb9643a84f3701b518b059e935a3199685c4b +f2afa07980ad93fcc6e7733a7c1cdb6d9ea9756eb985041297452d74381a609b +b8c3f9cc4c7b9ad09e57753602e856b5511cda7b0c9a5e0fbab6c9ef7d7e8d67 +51760312ba04d771974ce5b6c18d9de0d4bf76d5e5b6cd7c3706f94693215165 +881bf682231eb90cb99794177468d89877475bd1510e117d5f845f26fa303762 +c92c2ced4c73a82afeedb275f48fb2cbbee350511004a58efd38e7002e91260e +40f0792b73dbc2158d542146aac2b860479bf6046c7e0e4edc26090205846fc8 +e333cc60a4aa3990290508b400fb02f09560be4f200d272c713ba3b615e2b40b +9552cd70a67a098edf6f1bc4ea86732f1fcc762f513a1a004d39c1dd6d8d0650 +24ad72b147c850945b7bfb29e830d4ef2e84d694422f1c89bc34ee502aca300d +f3c5a3e0ff8359668b11ea33ce14ef62cca8e2dfb8e5ab68d96a9a2552bf53af +81e78c84d96f3b1eda14e19ac07e75e3d3e5454200592a259bc950ccb398dc20 +862141083a5190c1b2cb0aa0d8d3e8a5a3b21004fd002040c4b3ea35de14ccc1 +ccd679d99308409a138c1ec129a71a1bb1443d1754f4763765b6409e8280e25b +5965f444cbb2a6b78bf8541250b992e39d0a4c14ed92c7b9ca642ec4002946f5 +93ae24cc194f41357a86b418c8451b342860441b9d2e33c7f8a81ecfc0e5630d +23ee1fe752b2536ca59253c97aa18712f73f2b0335eeb0c2a26cbd98eedc669e +938831427718070324999284196cdbae8f16946b2bbf2b9f2a8e0a5928447383 +1de3315a2dc0ae872b1036a8040d9c2a0c77a6c0c473c293ab7e19837fd227b3 +52e8bf1bc817c76412f1d6abd47d809e989b3b2f89285d2693824df3191a6d1b +c8c9853f2bf81b8c96607a02b31d23d7495a590cf3f96d7328c4fd74452dc16c +2818512abf981c423d146e9d7a46bf2ef32a98dda4f6695f42532fabb8abba65 +de15bf69090b724a247fcdfefd6f1a83cc35a049d3324bd39816f4ee13a5a38d +a73a3c3fb031daf9bf78fde0f8f6bdd0e897a3b24e090b54a955b232b2258e5f +2bfbfbe13db81f6abd243d73e3ff7d5d21527541ce6258732e85baddc7e56dc1 +ae4b2bdead6d8de14b406a7234ab0c0fb1b6f129a7877adb864cfe9abef498ea +89232ee6639c0cea4dbd515a7a09aafbe65d04ec923e1200fcce3a2f684c07f2 +02273eb6a93f7ae0771e7115385296132be25b258f67273c5a0f28f98627abf7 +7751b7860e123e4a4e70422114eafe03c2606f854588ef418312650f11393ea1 +5bfa6337b955355a183573948398e4438b3e13fc83a36f2d86cca04e6787f6a0 +b29bfbb9aba924f37f5174e3ee892d16102d37b14d7743d9725ac7367217425c +f6263f30097ef995d81458db1357305c6044d6e490d9631e9ee456db83af1d45 +4176174c786a03a7771b02c10daa800cfa6819f878c871f0b3230e5aeb87d8e9 +b5d0e701fc2dd78a2ef5f9e3f0e060eeafc7ebeb813d13d4d77f1130256ceda9 +4dd73b6e7b423d7f4c0c55f3491bbf6153b106b1316b9eb2ce72b263f05fda15 +0b748d74b05f238982702f9564fb43259e9fd1f77d753f7a9bee8d81b2ea2d5b +abfa686d76582857a1a2338a5f8c2733728fdd4adffcc90331d2670c260111b7 +6369299e8f79a9570d277107c81fbd22faf23d821471f8359f13980f282516b7 +800ba8ecbac26e646e401a4d7a644fc3851749c5d19a915fb046bc40de6256a2 +4184d666de6f54e6855060071896eea3338fbea7771f129a449e5bbb498f5edf +7dfb723d4838d670b76ae2842b726e757d534c24ebc471588ea38760f07b59c9 +af9649132871a23ce328acfee7f583f7ff0486e07187a3d4942aaa9e6a38c615 +43299873ae9c902dc5777ef58d396b5feb718509da30302ca268a9fe75e8343e +a5f4da3a39445369280cfca5442939a61f82f24b15bfc71d2e1b2880df011732 +32527227875329ab6069618cde196f153e7ec3b1dc5fa627ed4f49a43550d02c +dd80cfc131d86dfd6ef64530f16be3c08b2fe804ba2c8b8ef512bac05420f780 +9507cdc6aedbfa690c85a1bee6f424799dd0407f40e90051ce3d6b1020719e05 +9187a78047533060ed3426bb7c314b179b608fdb19f181e4cf616e0eb850c408 +85f2e1d9c5afa60dd6480166d7b227b731c8491237112df20561ef85e4a3d207 +4bf8ba61da1e50699e9f9aba612c8a9a536cfaf7c9137b08aeee41148f96118a +43a901722f64a6457937eb18f9733fc353987b8e1fb9da5ec6c7229dad8d0456 +54bcf4426f7148ef1942cd42954a8e5e5767ddd899f178f6f2443b93be25d5d6 +1b9c06e68d653ba56f1506a88f9439a896b3f604880099548ab0dbc39b26237d +d1bbf9c1858716d858b94377708b44d800b95f77ba4f63577d1758719e208c1d +4757e53eec9ad4e1919e197b4507d1d43355c142e91c3d4d80064fa7fd5a85d7 +c08f43cdb63e507726b4378853d6ad68ecc29592eef5a8b72869a2164552ae62 +2f3f02dfa6cc2b5452898943fb90521daee4b1679df0d385b9ff15c9ac6c120b +30626415ed3415d06608b8b182f3efd579a539771a2af421119c43a5444f187b +55fb3b8668eafbcb63b919a2e2152aaa0d62613c37ca5002c6daea891411cb46 +d58d815d7f231678185a0ea2b59ceb1030a8a9959f3426a666352ce86ddb3422 +0f43b9f0695747f65b5c7d0c0bdaf97f76a67c396f24f5c3d277a375744310a9 +f09dbe9f4501739523f301d94e6519029352ff5c1cced0d6dd89af38c49d8fdf +adbfc0baf374d259404ce7bfd2bf94a09a02e3463ab9c6d975190944acde8589 +4ca4537a35ae86e26af1bd5e5bb7c7d24e671bd182153a5022047bd8c138016a +a85f3b7b62bfdbc06ae4dbe5e37528d6c6432b3db333a1347a09838c17b5de1b +2f9570c33e7580978d48effc18fa8e0fec834076990e0d4b8abaa2c336408011 +53c5ffc858524015d49008574cf40c060b751c67395e8d39952b5514463241e8 +aca46f92701b889780db90362ca74b5d13c5f9d3362a0b53d2dbaac2c54836e4 +e42422aa713a20a5124ee36b353631a3933a5bbe368b0c4fd93aac08fdbdd557 +59778a0b7ff59a185e2f9162c0ab4ce98bd37fdc7a85dddcddc3d5eba6020166 +8eda23e041e6920b10912d251171fd3fa5bdbeae378e996d039c7b07bc4aca72 +e81625f6f816a2bb469d2458518988aaddceb796926d796673c030554e7046b0 +0cd49f488394682075dcd5dd193fbfd068636c9daf09f6eda12a326c0bef9abc +11578c932adf74009a4fb22ff201377253262e144366c9f9c140db1fc3074434 +87b103b07a68a869b23a613b0c69f687632f9a89bd1e3c9bb4bcb6b0b4bebb49 +8518f577692d8292730c3e761eb113bfd398b6f4f6e9aadee2f1baabd2cfef83 +de4e0924b35836bd53198fee5eeeed8aa2c15c5117f242ca04ddaf1ffc9ae2fb +41a343b215b005e7267fd653e365a6842bad6be7d97a1df27404ab67126d88bc +79139d47b3a0ad8f8eb78d4a28a503754513393ce036f6671c1ccc0eab2befee +6f9d3b5afb869303af5580ea0b3568f8187087aca49310d17dc2e4b626f11ac2 +bca641f79e15101aa92b013dbdea8c4f28357d0fc8bd2cba2678f0058adc282a +aa1cfcb544f6bef2b2b65488173e6fddb915382a02fd74806fe62fcaad8ca435 +7bd0073647d2809fc510d91b38dd7a964668f72d76d45d3dace0d6383135880d +1082faf3595d0efb5b3026c0de0b4fe19d4713a8c1b31cbf82b9f4b458c75d74 +3e7731d662b5b78afc79c962a6d73e92bd63dfeccdbfcee8c33cf0f1058dd6ee +ff9146cf33f535b4fe245110aea3ce3359accd39926187dc760dec775c0db374 +a77f9712be3312264042527b98267aa3cad2c49d0e33aba1d87712bc4ff630f7 +205019eaa70eee3cc1bd3e4c9f91aecdc8d8e1913ac869250c696a060b673c40 +b2d0fc55673c8c262dfdb0a730228c96e5f95a8d01e4559af8ca5bb847d07581 +5bed1aa246387bd73144b416fbe6652933956354c17a975209af6e2aceed8f07 +8e2ab2dd70221bf9b174cbda7cfae19c1313f4d6e0530e40df9c2f752ef81118 +e9cb012af24fe686924a3f5d145cb01942b72be7548f0d3a3ae8455ec4e422e4 +459e5e231be8510628c22295e5ab6226afeffa45b24ecdfeeefb7ef8717869b7 +758296e3249d4610ce84939d8f5a2b3dab176ec4b4e8902b1591099782f306ff +396a10ba8caaf297123c8c46b8d17cb7f4390c61d4f5ae73e04fe0ea12b2d9ca +2030cf4ba8d41484a101c9345f9849694ffdcdc3977382c54c4289c58960048a +45ac803c9a91a2846d4675917b01393c4d8c130c2110a0e3bcf46d79f3ed369d +19d5cd3be63489816cab5cb1c1eb46cf2550a4fb5ee579152bbd064e38616f6a +de92f96bc7517596f71b35ee3f176bb07861881c6cb050bef617d19b071fba4c +909a8a065aa936406c75e4936e9e138348f7321abf5ca3f4df3be8d0486dac3d +51c41b750a1e41f4004dab3de9ac98b33baab15feedb88c291d71c302adca759 +2e1add8db5a26bde1fadb524588fb8b2971b86c8f31dc72eb3f2e1f3c673bccc +65c64b2c129b862bcfdad7f3672b4c6b99fc413728a83aa750b15708540a38a0 +598ac513ddbbacae4b22fe4d2ea91b3eccf11bd5209032b3c744275c5dc194d8 +952c4f91dc97ab263685a2c2af2ca0b0043307445ffaba4fc039abd736499882 +51021b0ebf29492634dbc38a677e5bfbdd6716ac11d96de5459de1bdcabd7fc3 +528baf83527ffc7e9257800590cf22d7fbf66e48597e33a39f056c80e8713d73 +94a3eb7b3c65db7e7ca620db7ea44c67cab637c1c5d3606802ee0288ffc575e8 +29e05b312a50f0fee6180d8ac0cf7d0ac87d5c6933f88ab16884e412fb545c48 +c45e60e7e3322e9d1640abecf328ca705ef7f2eff6560f2b39b19354afb51515 +07fe5c904481b7f5201b7bda802357b01755da1d3bfd21d941df316198e652af +5be4efc5e8d8e14d5ec9e3665881c74f660518b45aced85bf5b313c62e8ccd4a +9d2d7f32a741dc00fd5f34ac215ac596cbe8b143fa8cc948e52387797268555d +9a6d454ce1aa5cf8eba620a10483d8099c33520d88fbcaf0e1fb570b037b2bf0 +44acf21d9daee9dbf1b0b311fbbc3505f78ebd7ddbc027a5eca10507216e1963 +2b813b258e61fee6aef63c1570616eaa9f9dae95c212e758ab1e51da1fffdeb2 +79260de737a48f3e1fe5d20475ce1223d006a31b1ddf3182ffa611db5ecd812a +4dd8a26a +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if + +%%EndResource +/F5_0 /CairoFont-0-0 1 1 +[ /.notdef/d/o/x/y/g/e/n + /s/a/r/c/h/t/period/m + /l/space/w/i/b/H/T/M + /L/p/u/q/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef] +pdfMakeFont +%%EndSetup +pdfStartPage +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +q +q +36 35 105 471 re +W +/DeviceRGB {} cs +[1 1 1] sc +/DeviceRGB {} CS +[1 1 1] SC +1 w +0 J +1 j +[] 0 d +10 M +36 35 105 471 re +f +36 35 105 471 re +S +/DeviceRGB {} CS +[0 0 0] SC +119.301 484 m +119.301 474.059 105.285 466 88 466 c +70.715 466 56.699 474.059 56.699 484 c +56.699 493.941 70.715 502 88 502 c +105.285 502 119.301 493.941 119.301 484 c +S +/DeviceRGB {} cs +[0 0 0] sc +[1 0 0 1 0 0] Tm +0 0 Td +[9.999756 0 0 9.999756 69.5 481.5] Tm +0 0 Td +/F5_0 1 Tf +(\001) 0.556 Tj +31 TJm +(\002) 0.556 Tj +31 TJm +(\003) 0.5 Tj +-25 TJm +(\004) 0.5 Tj +-25 TJm +(\005) 0.556 Tj +31 TJm +(\006) 0.556 Tj +31 TJm +(\007) 0.556 Tj +/DeviceRGB {} CS +[0 0 0] SC +123.25 418 m +46.75 418 l +46.75 382 l +129.25 382 l +129.25 412 l +123.25 418 l +h +S +123.25 418 m +123.25 412 l +S +129.25 412 m +123.25 412 l +S +/DeviceRGB {} cs +[0 0 0] sc +[1 0 0 1 0 0] Tm +0 0 Td +[9.999756 0 0 9.999756 54.5 397.5] Tm +0 0 Td +/F5_0 1 Tf +(\010) 0.5 Tj +-25 TJm +(\006) 0.556 Tj +31 TJm +(\011) 0.556 Tj +31 TJm +(\012) 0.333 Tj +33 TJm +(\013) 0.5 Tj +-25 TJm +(\014) 0.556 Tj +31 TJm +(\001) 0.556 Tj +31 TJm +(\011) 0.556 Tj +31 TJm +(\015) 0.278 Tj +-22 TJm +(\011) 0.556 Tj +31 TJm +(\016) 0.278 Tj +-23 TJm +(\003) 0.5 Tj +-25 TJm +(\017) 0.832 Tj +8 TJm +(\020) 0.222 Tj +/DeviceRGB {} CS +[0 0 0] SC +88 465.609 m +88 454.773 88 440.602 88 428.293 c +S +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +91.5 428.082 m +88 418.082 l +84.5 428.082 l +91.5 428.082 l +h +f +91.5 428.082 m +88 418.082 l +84.5 428.082 l +91.5 428.082 l +h +S +/DeviceRGB {} cs +[0 0 0] sc +[1 0 0 1 0 0] Tm +0 0 Td +[9.999756 0 0 9.999756 88 439.5] Tm +0 0 Td +/F5_0 1 Tf +(\021) 0.278 Tj +-22 TJm +(\022) 0.721 Tj +-28 TJm +(\012) 0.333 Tj +33 TJm +(\023) 0.222 Tj +-3 TJm +(\015) 0.278 Tj +-22 TJm +(\006) 0.556 Tj +31 TJm +(\010) 0.5 Tj +/DeviceRGB {} CS +[0 0 0] SC +128.426 316 m +128.426 306.059 110.328 298 88 298 c +65.672 298 47.574 306.059 47.574 316 c +47.574 325.941 65.672 334 88 334 c +110.328 334 128.426 325.941 128.426 316 c +S +/DeviceRGB {} cs +[0 0 0] sc +[1 0 0 1 0 0] Tm +0 0 Td +[9.999756 0 0 9.999756 61.5 313.5] Tm +0 0 Td +/F5_0 1 Tf +(\001) 0.556 Tj +31 TJm +(\002) 0.556 Tj +31 TJm +(\003) 0.5 Tj +-25 TJm +(\004) 0.5 Tj +-25 TJm +(\023) 0.222 Tj +-3 TJm +(\007) 0.556 Tj +31 TJm +(\001) 0.556 Tj +31 TJm +(\006) 0.556 Tj +31 TJm +(\003) 0.5 Tj +-25 TJm +(\006) 0.556 Tj +30 TJm +(\012) 0.333 Tj +/DeviceRGB {} CS +[0 0 0] SC +122 250 m +48 250 l +48 214 l +128 214 l +128 244 l +122 250 l +h +S +122 250 m +122 244 l +S +128 244 m +122 244 l +S +/DeviceRGB {} cs +[0 0 0] sc +[1 0 0 1 0 0] Tm +0 0 Td +[9.999756 0 0 9.999756 56 229.5] Tm +0 0 Td +/F5_0 1 Tf +(\001) 0.556 Tj +31 TJm +(\002) 0.556 Tj +31 TJm +(\003) 0.5 Tj +-25 TJm +(\004) 0.5 Tj +-25 TJm +(\010) 0.5 Tj +-25 TJm +(\006) 0.556 Tj +31 TJm +(\011) 0.556 Tj +31 TJm +(\012) 0.333 Tj +33 TJm +(\013) 0.5 Tj +-25 TJm +(\014) 0.556 Tj +31 TJm +(\016) 0.278 Tj +-23 TJm +(\001) 0.556 Tj +31 TJm +(\024) 0.556 Tj +/DeviceRGB {} CS +[0 0 0] SC +88 297.609 m +88 286.773 88 272.602 88 260.293 c +S +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +91.5 260.082 m +88 250.082 l +84.5 260.082 l +91.5 260.082 l +h +f +91.5 260.082 m +88 250.082 l +84.5 260.082 l +91.5 260.082 l +h +S +/DeviceRGB {} cs +[0 0 0] sc +[1 0 0 1 0 0] Tm +0 0 Td +[9.999756 0 0 9.999756 88 271.5] Tm +0 0 Td +/F5_0 1 Tf +(\021) 0.278 Tj +-22 TJm +(\022) 0.721 Tj +-28 TJm +(\012) 0.333 Tj +33 TJm +(\023) 0.222 Tj +-3 TJm +(\015) 0.278 Tj +-22 TJm +(\006) 0.556 Tj +31 TJm +(\010) 0.5 Tj +/DeviceRGB {} CS +[0 0 0] SC +136.289 148 m +136.289 138.059 114.672 130 88 130 c +61.328 130 39.711 138.059 39.711 148 c +39.711 157.941 61.328 166 88 166 c +114.672 166 136.289 157.941 136.289 148 c +S +/DeviceRGB {} cs +[0 0 0] sc +[1 0 0 1 0 0] Tm +0 0 Td +[9.999756 0 0 9.999756 54.5 145.5] Tm +0 0 Td +/F5_0 1 Tf +(\001) 0.556 Tj +31 TJm +(\002) 0.556 Tj +31 TJm +(\003) 0.5 Tj +-25 TJm +(\004) 0.5 Tj +-25 TJm +(\010) 0.5 Tj +-25 TJm +(\006) 0.556 Tj +31 TJm +(\011) 0.556 Tj +31 TJm +(\012) 0.333 Tj +33 TJm +(\013) 0.5 Tj +-25 TJm +(\014) 0.556 Tj +31 TJm +(\016) 0.278 Tj +-23 TJm +(\013) 0.5 Tj +-25 TJm +(\005) 0.556 Tj +31 TJm +(\023) 0.222 Tj +/DeviceRGB {} CS +[0 0 0] SC +136.125 61 m +136.125 49.164 114.578 39.57 88 39.57 c +61.422 39.57 39.875 49.164 39.875 61 c +39.875 72.836 61.422 82.43 88 82.43 c +114.578 82.43 136.125 72.836 136.125 61 c +S +/DeviceRGB {} cs +[0 0 0] sc +[1 0 0 1 0 0] Tm +0 0 Td +[9.999756 0 0 9.999756 62 64] Tm +0 0 Td +/F5_0 1 Tf +(\025) 0.721 Tj +-28 TJm +(\026) 0.61 Tj +11 TJm +(\027) 0.832 Tj +8 TJm +(\030) 0.556 Tj +31 TJm +(\021) 0.278 Tj +-22 TJm +(\031) 0.556 Tj +31 TJm +(\011) 0.556 Tj +31 TJm +(\005) 0.556 Tj +31 TJm +(\006) 0.556 Tj +0.300007 -1.100027 Td +(\023) 0.222 Tj +-3 TJm +(\007) 0.556 Tj +31 TJm +(\021) 0.278 Tj +-22 TJm +(\024) 0.556 Tj +31 TJm +(\012) 0.333 Tj +33 TJm +(\002) 0.556 Tj +31 TJm +(\022) 0.721 Tj +-28 TJm +(\010) 0.5 Tj +-25 TJm +(\006) 0.556 Tj +31 TJm +(\012) 0.333 Tj +/DeviceRGB {} CS +[0 0 0] SC +65.395 131.844 m +55.582 123.238 47.281 111.84 52 100 c +53.711 95.703 56.164 91.617 58.996 87.82 c +S +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +61.828 89.895 m +65.66 80.02 l +56.504 85.348 l +61.828 89.895 l +h +f +61.828 89.895 m +65.66 80.02 l +56.504 85.348 l +61.828 89.895 l +h +S +/DeviceRGB {} cs +[0 0 0] sc +[1 0 0 1 0 0] Tm +0 0 Td +[9.999756 0 0 9.999756 52 103.5] Tm +0 0 Td +/F5_0 1 Tf +(\021) 0.278 Tj +-22 TJm +(\005) 0.556 Tj +31 TJm +(\006) 0.556 Tj +31 TJm +(\015) 0.278 Tj +-22 TJm +(\021) 0.278 Tj +-22 TJm +(\012) 0.333 Tj +33 TJm +(\006) 0.556 Tj +31 TJm +(\010) 0.5 Tj +-25 TJm +(\032) 0.556 Tj +31 TJm +(\020) 0.222 Tj +-3 TJm +(\015) 0.278 Tj +-22 TJm +(\010) 0.5 Tj +-25 TJm +(\021) 0.278 Tj +/DeviceRGB {} CS +[0 0 0] SC +99.348 81.715 m +103.281 90.82 106.211 101.848 104 112 c +103.375 114.875 102.488 117.801 101.453 120.668 c +S +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +98.152 119.488 m +97.508 130.062 l +104.605 122.199 l +98.152 119.488 l +h +f +98.152 119.488 m +97.508 130.062 l +104.605 122.199 l +98.152 119.488 l +h +S +/DeviceRGB {} cs +[0 0 0] sc +[1 0 0 1 0 0] Tm +0 0 Td +[9.999756 0 0 9.999756 104 103.5] Tm +0 0 Td +/F5_0 1 Tf +(\021) 0.278 Tj +-22 TJm +(\033) 0.556 Tj +31 TJm +(\032) 0.556 Tj +31 TJm +(\006) 0.556 Tj +31 TJm +(\012) 0.333 Tj +33 TJm +(\004) 0.5 Tj +-25 TJm +(\021) 0.278 Tj +/DeviceRGB {} CS +[0 0 0] SC +88 381.609 m +88 370.773 88 356.602 88 344.293 c +S +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +91.5 344.082 m +88 334.082 l +84.5 344.082 l +91.5 344.082 l +h +f +91.5 344.082 m +88 334.082 l +84.5 344.082 l +91.5 344.082 l +h +S +/DeviceRGB {} cs +[0 0 0] sc +[1 0 0 1 0 0] Tm +0 0 Td +[9.999756 0 0 9.999756 88 355.5] Tm +0 0 Td +/F5_0 1 Tf +(\021) 0.278 Tj +-22 TJm +(\012) 0.333 Tj +33 TJm +(\006) 0.556 Tj +31 TJm +(\011) 0.556 Tj +31 TJm +(\001) 0.556 Tj +31 TJm +(\010) 0.5 Tj +/DeviceRGB {} CS +[0 0 0] SC +88 213.609 m +88 202.773 88 188.602 88 176.293 c +S +/DeviceRGB {} cs +[0 0 0] sc +/DeviceRGB {} CS +[0 0 0] SC +91.5 176.082 m +88 166.082 l +84.5 176.082 l +91.5 176.082 l +h +f +91.5 176.082 m +88 166.082 l +84.5 176.082 l +91.5 176.082 l +h +S +/DeviceRGB {} cs +[0 0 0] sc +[1 0 0 1 0 0] Tm +0 0 Td +[9.999756 0 0 9.999756 88 187.5] Tm +0 0 Td +/F5_0 1 Tf +(\021) 0.278 Tj +-22 TJm +(\012) 0.333 Tj +33 TJm +(\006) 0.556 Tj +31 TJm +(\011) 0.556 Tj +31 TJm +(\001) 0.556 Tj +31 TJm +(\010) 0.5 Tj +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%+ font CairoFont-0-0 +%%EOF diff --git a/doc/extsearch_flow.png b/doc/extsearch_flow.png Binary files differnew file mode 100644 index 0000000..e99450c --- /dev/null +++ b/doc/extsearch_flow.png diff --git a/doc/faq.doc b/doc/faq.doc index 0475aa7..8e5d049 100644 --- a/doc/faq.doc +++ b/doc/faq.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/features.doc b/doc/features.doc index 46a6219..aa106f3 100644 --- a/doc/features.doc +++ b/doc/features.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/formulas.doc b/doc/formulas.doc index bc23a11..ddae9ef 100644 --- a/doc/formulas.doc +++ b/doc/formulas.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/grouping.doc b/doc/grouping.doc index 56f19f7..c6b40dc 100644 --- a/doc/grouping.doc +++ b/doc/grouping.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/htmlcmds.doc b/doc/htmlcmds.doc index db3c6f3..e2a9514 100644 --- a/doc/htmlcmds.doc +++ b/doc/htmlcmds.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/index.doc b/doc/index.doc index 3b2947d..03c6456 100644 --- a/doc/index.doc +++ b/doc/index.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -14,7 +14,9 @@ * input used in their production; they are not affected by this license. * */ -/*! \mainpage Doxygen Manual +/*! +\mainpage +<!--Doxygen Manual--> \if logo_on <center> \htmlonly @@ -25,10 +27,12 @@ Version: $(VERSION) \endif <h2>Introduction</h2> -Doxygen is a documentation system for C++, C, Java, Objective-C, Python, IDL -(Corba and Microsoft flavors), Fortran, VHDL, PHP, C#, and to some extent D. +Doxygen is the de facto standard tool for generating documentation from +annotated C++ sources, but it also supports other popular programming +languages such as C, Objective-C, C#, PHP, Java, Python, IDL +(Corba and Microsoft flavors), Fortran, VHDL, Tcl, and to some extent D. -It can help you in three ways: +Doxygen can help you in three ways: <ol> <li> It can generate an on-line documentation browser (in HTML) and/or an off-line reference manual (in \f$\mbox{\LaTeX}\f$) from a set @@ -41,20 +45,19 @@ It can help you in three ways: <li> You can \ref extract_all "configure" doxygen to extract the code structure from undocumented source files. This is very useful to quickly find your way in large source distributions. - You can also visualize the relations between the various elements + Doxygen can also visualize the relations between the various elements by means of include dependency graphs, inheritance diagrams, and collaboration diagrams, which are all generated automatically. <li> You can also use doxygen for creating normal documentation (as I did - for this manual). + for the doxygen user manual and web-site). </ol> -Doxygen is developed under <a href="http://www.linux.org">Linux</a> -and Mac OS X, but is set-up to be highly portable. As a result, it -runs on most other Unix flavors as well. Furthermore, executables for -Windows are available. +Doxygen is developed under Mac OS X and Linux, but is set-up to be highly +portable. As a result, it runs on most other Unix flavors as well. +Furthermore, executables for Windows are available. -\n This manual is divided into three parts, each of which is divided into several -sections. +\n +This manual is divided into three parts, each of which is divided into several sections. The first part forms a user manual: <ul> @@ -115,7 +118,7 @@ The third part provides information for developers: \addindex license \addindex GPL -Copyright © 1997-2012 by +Copyright © 1997-2013 by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>.<p> Permission to use, copy, modify, and distribute this software and its @@ -153,21 +156,6 @@ list of projects that use doxygen (see {\tt http://www.doxygen.org/projects.html If you know other projects, let <a href="mailto:dimitri@stack.nl?subject=New%20project%20using%20Doxygen">me</a> know and I'll add them. -<h2>Commercial Support</h2> - -I'm currently investigating the possibilities of providing -commercial support for doxygen. The forms of support I'm thinking of -are: -<ul> -<li>implementing features, -<li>fixing bugs, -<li>providing priority help in answering questions. -</ul> -To get a better understanding of the feasibility, -please let <a href="mailto:dimitri@stack.nl?subject=Doxygen%20Commercial%20Support">me</a> know if you -have a need for this type (or another type) -of doxygen related commercial support. - <h2>Future work</h2> Although doxygen is successfully used by large number of companies and open source projects already, there is always room for improvement. diff --git a/doc/install.doc b/doc/install.doc index 4622065..bbc0d13 100644 --- a/doc/install.doc +++ b/doc/install.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/language.doc b/doc/language.doc index b0e2ffc..2793d66 100644 --- a/doc/language.doc +++ b/doc/language.doc @@ -1,7 +1,7 @@ /****************************************************************************** * Do not edit this file. It was generated by the translator.py script. * - * Copyright (C) 1997-2011 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other than English (the default). The output language is chosen through the configuration file (with default name and known as Doxyfile). -Currently (version 1.8.2), 39 languages +Currently (version 1.8.3), 39 languages are supported (sorted alphabetically): Afrikaans, Arabic, Armenian, Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian, Czech, Danish, Dutch, English, diff --git a/doc/language.tpl b/doc/language.tpl index cba8b8a..7ec6621 100644 --- a/doc/language.tpl +++ b/doc/language.tpl @@ -5,7 +5,7 @@ change the language.doc, make the changes here and inside maintainers.txt. /****************************************************************************** * %(editnote)s * - * Copyright (C) 1997-2011 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/markdown.doc b/doc/markdown.doc index 3799fbc..bd4a3aa 100644 --- a/doc/markdown.doc +++ b/doc/markdown.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/output.doc b/doc/output.doc index d34e057..dea8753 100644 --- a/doc/output.doc +++ b/doc/output.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/preprocessing.doc b/doc/preprocessing.doc index db5418f..aac389e 100644 --- a/doc/preprocessing.doc +++ b/doc/preprocessing.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/searching.doc b/doc/searching.doc index f80e9f6..ed5e48c 100644 --- a/doc/searching.doc +++ b/doc/searching.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/starting.doc b/doc/starting.doc index 4e5481e..636fd3a 100644 --- a/doc/starting.doc +++ b/doc/starting.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/doc/translator_report.txt b/doc/translator_report.txt index ad25228..d5d573c 100644 --- a/doc/translator_report.txt +++ b/doc/translator_report.txt @@ -1,4 +1,4 @@ -(1.8.2) +(1.8.3) Doxygen supports the following 39 languages (sorted alphabetically): diff --git a/doc/trouble.doc b/doc/trouble.doc index c795b0f..c79c0cd 100644 --- a/doc/trouble.doc +++ b/doc/trouble.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -16,7 +16,7 @@ */ /*! \page trouble Troubleshooting -<h2>Known problems:</h2> +\section knowproblems Known Problems <ul> <li>If you have problems building doxygen from sources, please read \ref unix_problems "this section" first. @@ -76,15 +76,14 @@ </ul> -<h2>How to help</h2> +\section howtohelp How to Help The development of Doxygen highly depends on your input! If you are trying Doxygen let me know what you think of it (do you miss certain features?). Even if you decide not to use it, please let me know why. -\anchor bug_reports -<h2>How to report a bug</h2> +\section bug_reports How to report a bug Bugs are tracked in GNOME's <a href="http://bugzilla.gnome.org">bugzilla</a> database. Before submitting a diff --git a/doc/xmlcmds.doc b/doc/xmlcmds.doc index 2d6cbab..8b38d38 100644 --- a/doc/xmlcmds.doc +++ b/doc/xmlcmds.doc @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/qtools/qcstring.h b/qtools/qcstring.h index bbe8700..08f6e82 100644 --- a/qtools/qcstring.h +++ b/qtools/qcstring.h @@ -46,6 +46,10 @@ #include <stdlib.h> #include <string.h> +#if !defined(_OS_WIN32_) +#include <stdint.h> +#endif + #if defined(_OS_SUN_) && defined(_CC_GNU_) #include <strings.h> #endif @@ -98,25 +102,26 @@ Q_EXPORT inline char *cstrcpy( char *dst, const char *src ) Q_EXPORT inline char *qstrcpy( char *dst, const char *src ) { return src ? strcpy(dst, src) : 0; } -Q_EXPORT char *qstrncpy( char *dst, const char *src, uint len ); +Q_EXPORT char * qstrncpy(char *src,const char *dst, uint len); Q_EXPORT inline int cstrcmp( const char *str1, const char *str2 ) { return strcmp(str1,str2); } Q_EXPORT inline int qstrcmp( const char *str1, const char *str2 ) -{ return (str1 && str2) ? strcmp(str1,str2) : (int)((long)str2 - (long)str1); } +{ return (str1 && str2) ? strcmp(str1,str2) : (int)((intptr_t)str2 - (intptr_t)str1); } Q_EXPORT inline int cstrncmp( const char *str1, const char *str2, uint len ) { return strncmp(str1,str2,len); } Q_EXPORT inline int qstrncmp( const char *str1, const char *str2, uint len ) { return (str1 && str2) ? strncmp(str1,str2,len) : - (int)((long)str2 - (long)str1); } + (int)((intptr_t)str2 - (intptr_t)str1); } -Q_EXPORT int qstricmp( const char *, const char * ); +Q_EXPORT int qstricmp( const char *str1, const char *str2 ); -Q_EXPORT int qstrnicmp( const char *, const char *, uint len ); +Q_EXPORT int qstrnicmp( const char *str1, const char *str2, uint len ); +#if 0 // ### TODO for 3.0: these and the cstr* functions should be used if // !defined(QT_CLEAN_NAMESPACE) // We want to keep source compatibility for 2.x @@ -143,6 +148,7 @@ Q_EXPORT int qstrnicmp( const char *, const char *, uint len ); #define strnicmp qstrnicmp #endif +#endif // qChecksum: Internet checksum @@ -274,24 +280,28 @@ inline void QCString::duplicate( const QCString &s ) { if (!s.isEmpty()) { - uint l = strlen(s.data()); + uint l = (uint)strlen(s.data()); m_data = (char *)malloc(l+1); if (m_data) memcpy(m_data,s.data(),l+1); } else + { m_data=0; + } } inline void QCString::duplicate( const char *str) { if (str && str[0]!='\0') { - uint l = strlen(str); + uint l = (uint)strlen(str); m_data = (char *)malloc(l+1); if (m_data) memcpy(m_data,str,l+1); } else + { m_data=0; + } } inline QCString &QCString::duplicate( const char *str, int) diff --git a/qtools/qdir_unix.cpp b/qtools/qdir_unix.cpp index e845043..2257265 100644 --- a/qtools/qdir_unix.cpp +++ b/qtools/qdir_unix.cpp @@ -82,12 +82,14 @@ QString QDir::canonicalPath() const char cur[PATH_MAX]; char tmp[PATH_MAX]; - (void)GETCWD( cur, PATH_MAX ); - if ( CHDIR(QFile::encodeName(dPath)) >= 0 ) { - (void)GETCWD( tmp, PATH_MAX ); - r = QFile::decodeName(tmp); + if (GETCWD( cur, PATH_MAX )) { + if ( CHDIR(QFile::encodeName(dPath)) >= 0 ) { + if (GETCWD( tmp, PATH_MAX )) { + r = QFile::decodeName(tmp); + } + (void)CHDIR( cur ); + } } - (void)CHDIR( cur ); slashify( r ); return r; diff --git a/qtools/qfiledefs_p.h b/qtools/qfiledefs_p.h index 5105c45..5a7cfe2 100644 --- a/qtools/qfiledefs_p.h +++ b/qtools/qfiledefs_p.h @@ -190,10 +190,17 @@ #else // all other systems +#ifdef __MINGW32__ +# define STATBUF struct _stat +# define STATBUF4TSTAT struct _stat +# define STAT _stat +# define FSTAT _fstat +#else # define STATBUF struct stat # define STATBUF4TSTAT struct stat # define STAT ::stat # define FSTAT ::fstat +#endif # define STAT_REG S_IFREG # define STAT_DIR S_IFDIR # define STAT_MASK S_IFMT diff --git a/qtools/qgarray.cpp b/qtools/qgarray.cpp index efc9de0..df31363 100644 --- a/qtools/qgarray.cpp +++ b/qtools/qgarray.cpp @@ -635,7 +635,7 @@ extern "C" { static int cmp_arr( const void *n1, const void *n2 ) { return ( n1 && n2 ) ? memcmp( n1, n2, cmp_item_size ) - : (int)((long)n1 - (long)n2); + : (int)((intptr_t)n1 - (intptr_t)n2); // Qt 3.0: Add a virtual compareItems() method and call that instead } diff --git a/qtools/qgcache.cpp b/qtools/qgcache.cpp index e5dd8de..511c867 100644 --- a/qtools/qgcache.cpp +++ b/qtools/qgcache.cpp @@ -216,7 +216,7 @@ public: bool remove_ascii( QCacheItem *item ) { return QGDict::remove_ascii((const char *)item->key,item); } bool remove_int( QCacheItem *item ) - { return QGDict::remove_int((long)item->key,item);} + { return QGDict::remove_int((intptr_t)item->key,item);} void statistics() { QGDict::statistics(); } }; @@ -406,7 +406,7 @@ bool QGCache::insert_other( const char *key, QCollection::Item data, if ( keytype == AsciiKey ) dict->insert_ascii( key, ci ); else - dict->insert_int( (long)key, ci ); + dict->insert_int( (intptr_t)key, ci ); tCost += cost; return TRUE; } @@ -469,7 +469,7 @@ QCollection::Item QGCache::take_other( const char *key ) if ( keytype == AsciiKey ) ci = dict->take_ascii( key ); else - ci = dict->take_int( (long)key ); + ci = dict->take_int( (intptr_t)key ); Item d; if ( ci ) { d = ci->data; @@ -549,7 +549,7 @@ QCollection::Item QGCache::find_string( const QString &key, bool ref ) const QCollection::Item QGCache::find_other( const char *key, bool ref ) const { QCacheItem *ci = keytype == AsciiKey ? dict->find_ascii(key) - : dict->find_int((long)key); + : dict->find_int((intptr_t)key); #if defined(DEBUG) lruList->finds++; #endif @@ -816,10 +816,10 @@ const char *QGCacheIterator::getKeyAscii() const Returns the key of the current item, as a long. */ -long QGCacheIterator::getKeyInt() const +intptr_t QGCacheIterator::getKeyInt() const { QCacheItem *item = it->current(); - return item ? (long)item->key : 0; + return item ? (intptr_t)item->key : 0; } /*! diff --git a/qtools/qgcache.h b/qtools/qgcache.h index 2f35c41..a71f6d3 100644 --- a/qtools/qgcache.h +++ b/qtools/qgcache.h @@ -114,7 +114,7 @@ protected: QCollection::Item get() const; QString getKeyString() const; const char *getKeyAscii() const; - long getKeyInt() const; + intptr_t getKeyInt() const; QCollection::Item operator()(); QCollection::Item operator++(); diff --git a/qtools/qgdict.cpp b/qtools/qgdict.cpp index e51b9c1..534a93c 100644 --- a/qtools/qgdict.cpp +++ b/qtools/qgdict.cpp @@ -466,7 +466,7 @@ QCollection::Item QGDict::look_int( long key, QCollection::Item d, int op ) QCollection::Item QGDict::look_ptr( void *key, QCollection::Item d, int op ) { QPtrBucket *n; - int index = (int)((ulong)key % vlen); // simple hash + int index = (int)((uintptr_t)key % vlen); // simple hash if ( op == op_find ) { // find for ( n=(QPtrBucket*)vec[index]; n; n=(QPtrBucket*)n->getNext() ) { @@ -681,7 +681,7 @@ QPtrBucket *QGDict::unlink_ptr( void *key, QCollection::Item d ) return 0; QPtrBucket *n; QPtrBucket *prev = 0; - int index = (int)((ulong)key % vlen); + int index = (int)((uintptr_t)key % vlen); for ( n=(QPtrBucket *)vec[index]; n; n=(QPtrBucket *)n->getNext() ) { bool found = (n->getKey() == key); if ( found && d ) @@ -1012,7 +1012,7 @@ QDataStream &QGDict::read( QDataStream &s ) // but hey, serializing pointers? can it be done // at all, ever? if ( k ) - look_ptr( (void *)k, d, op_insert ); + look_ptr( (void *)(uintptr_t)k, d, op_insert ); } break; } diff --git a/qtools/qgdict.h b/qtools/qgdict.h index 6243364..a5c8aa0 100644 --- a/qtools/qgdict.h +++ b/qtools/qgdict.h @@ -83,11 +83,11 @@ private: class QIntBucket : public QBaseBucket { public: - QIntBucket( long k, QCollection::Item d, QBaseBucket *n ) + QIntBucket( intptr_t k, QCollection::Item d, QBaseBucket *n ) : QBaseBucket(d,n), key(k) {} - long getKey() const { return key; } + intptr_t getKey() const { return key; } private: - long key; + intptr_t key; }; class QPtrBucket : public QBaseBucket @@ -178,7 +178,7 @@ public: QCollection::Item get() const; QString getKeyString() const; const char *getKeyAscii() const; - long getKeyInt() const; + intptr_t getKeyInt() const; void *getKeyPtr() const; QCollection::Item operator()(); @@ -208,7 +208,7 @@ inline const char *QGDictIterator::getKeyAscii() const return curNode ? ((QAsciiBucket*)curNode)->getKey() : 0; } -inline long QGDictIterator::getKeyInt() const +inline intptr_t QGDictIterator::getKeyInt() const { return curNode ? ((QIntBucket*)curNode)->getKey() : 0; } diff --git a/qtools/qiodevice.cpp b/qtools/qiodevice.cpp index 43b2787..b52475c 100644 --- a/qtools/qiodevice.cpp +++ b/qtools/qiodevice.cpp @@ -593,7 +593,7 @@ int QIODevice::readLine( char *data, uint maxlen ) break; } *p++ = '\0'; - return (int)((long)p - (long)data); + return (int)((intptr_t)p - (intptr_t)data); } diff --git a/qtools/qtextstream.cpp b/qtools/qtextstream.cpp index 21b455e..bae072d 100644 --- a/qtools/qtextstream.cpp +++ b/qtools/qtextstream.cpp @@ -1894,7 +1894,7 @@ QTextStream &QTextStream::operator<<( void *ptr ) setf( hex, basefield ); setf( showbase ); unsetf( uppercase ); - output_int( I_LONG | I_UNSIGNED, (ulong)ptr, FALSE ); + output_int( I_LONG | I_UNSIGNED, (uintptr_t)ptr, FALSE ); flags( f ); return *this; } diff --git a/src/Makefile.in b/src/Makefile.in index e6a7080..ae6c436 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -2,7 +2,7 @@ # # # -# Copyright (C) 1997-2012 by Dimitri van Heesch. +# Copyright (C) 1997-2013 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 diff --git a/src/arguments.h b/src/arguments.h index 09f5b63..eba452c 100644 --- a/src/arguments.h +++ b/src/arguments.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/bufstr.h b/src/bufstr.h index 2e704f5..635b4cf 100644 --- a/src/bufstr.h +++ b/src/bufstr.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/classdef.cpp b/src/classdef.cpp index 8517893..b285325 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -2206,7 +2206,7 @@ void ClassDef::writeMemberList(OutputList &ol) ol.parseText(" "+theTranslator->trEnumValue()); else if (md->isTypedef()) ol.docify(" typedef"); - else if (md->isFriend() && !strcmp(md->typeString(),"friend class")) + else if (md->isFriend() && !qstrcmp(md->typeString(),"friend class")) ol.docify(" class"); //ol.writeString("\n"); } @@ -2574,8 +2574,7 @@ bool ClassDef::isBaseClass(ClassDef *bcd, bool followInstances,int level) //printf("isBaseClass(cd=%s) looking for %s\n",name().data(),bcd->name().data()); if (level>256) { - err("Possible recursive class relation while inside %s and looking for %s\n",qPrint(name()),qPrint(bcd->name())); - abort(); + err("Possible recursive class relation while inside %s and looking for base class %s\n",qPrint(name()),qPrint(bcd->name())); return FALSE; } if (baseClasses()) @@ -2597,6 +2596,31 @@ bool ClassDef::isBaseClass(ClassDef *bcd, bool followInstances,int level) return found; } +//---------------------------------------------------------------------- + +bool ClassDef::isSubClass(ClassDef *cd,int level) +{ + bool found=FALSE; + if (level>256) + { + err("Possible recursive class relation while inside %s and looking for derived class %s\n",qPrint(name()),qPrint(cd->name())); + return FALSE; + } + if (subClasses()) + { + BaseClassListIterator bcli(*subClasses()); + for ( ; bcli.current() && !found ; ++bcli) + { + ClassDef *ccd=bcli.current()->classDef; + if (ccd==cd) + found=TRUE; + else + found=ccd->isSubClass(cd,level+1); + } + } + return found; +} + //---------------------------------------------------------------------------- static bool isStandardFunc(MemberDef *md) diff --git a/src/classdef.h b/src/classdef.h index 1525dfd..53e1c15 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -185,6 +185,11 @@ class ClassDef : public Definition */ bool isBaseClass(ClassDef *bcd,bool followInstances,int level=0); + /** Returns TRUE iff \a bcd is a direct or indirect sub class of this + * class. + */ + bool isSubClass(ClassDef *bcd,int level=0); + /** returns TRUE iff \a md is a member of this class or of the * the public/protected members of a base class */ @@ -501,7 +506,7 @@ class BaseClassList : public QList<BaseClassDef> if (c1==0 || c2==0) return FALSE; else - return stricmp(c1->name(),c2->name()); + return qstricmp(c1->name(),c2->name()); } }; diff --git a/src/classlist.cpp b/src/classlist.cpp index fec1cb8..da5bf5a 100644 --- a/src/classlist.cpp +++ b/src/classlist.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -41,12 +41,12 @@ static int compItems(void *item1,void *item2) //printf("compItems: %d %s<->%s\n",b,c1->name().data(),c2->name().data()); if (b) { - return stricmp(c1->name(), + return qstricmp(c1->name(), c2->name()); } else { - return stricmp(c1->className(), + return qstricmp(c1->className(), c2->className()); } } diff --git a/src/classlist.h b/src/classlist.h index abe7064..adc781c 100644 --- a/src/classlist.h +++ b/src/classlist.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index 767978c..d9ee4b8 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/cmdmapper.h b/src/cmdmapper.h index 968b017..bea301e 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -2414,14 +2414,14 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" codifyLines(yytext); endFontClass(); g_name.resize(0);g_type.resize(0); - g_inForEachExpression = (strcmp(yytext,"for each")==0 || strcmp(yytext, "foreach")==0); + g_inForEachExpression = (qstrcmp(yytext,"for each")==0 || qstrcmp(yytext, "foreach")==0); BEGIN(FuncCall); } <Body>{FLOWKW}/([^a-z_A-Z0-9]) { startFontClass("keywordflow"); codifyLines(yytext); endFontClass(); - if (g_inFunctionTryBlock && (strcmp(yytext,"catch")==0 || strcmp(yytext,"finally")==0)) + if (g_inFunctionTryBlock && (qstrcmp(yytext,"catch")==0 || qstrcmp(yytext,"finally")==0)) { g_inFunctionTryBlock=FALSE; } @@ -2773,7 +2773,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" } /* <ObjCMemberCall>{ID} { - if (strcmp(yytext,"self")==0 || strcmp(yytext,"super")==0) + if (qstrcmp(yytext,"self")==0 || qstrcmp(yytext,"super")==0) { // TODO: get proper base class for "super" g_theCallContext.setClass(getClass(g_curClassName)); @@ -2944,10 +2944,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" } } <MemberCall2,FuncCall>{OPERATOR} { // operator - if (strcmp(yytext,"*") && - strcmp(yytext,"&") && - strcmp(yytext,"^") && - strcmp(yytext,"%")) // typically a pointer or reference + if (qstrcmp(yytext,"*") && + qstrcmp(yytext,"&") && + qstrcmp(yytext,"^") && + qstrcmp(yytext,"%")) // typically a pointer or reference { // not a * or &, or C++/CLI's ^ or % g_parmType.resize(0);g_parmName.resize(0); diff --git a/src/commentcnv.h b/src/commentcnv.h index 5277524..1c1fcb9 100644 --- a/src/commentcnv.h +++ b/src/commentcnv.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/commentcnv.l b/src/commentcnv.l index 9d99830..96a34d8 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -88,6 +88,7 @@ static bool g_pythonDocString; static GuardType guardType; // kind of guard for conditional section static SrcLangExt g_lang; +static bool isFixedForm; // For Fortran static void replaceCommentMarker(const char *s,int len) { @@ -270,8 +271,8 @@ void replaceComment(int offset); BEGIN(CComment); } } -<Scan>"!>"|"!<"|"!!" { - if (g_lang!=SrcLangExt_Fortran) +<Scan>![><!]/.*\n { + if (g_lang!=SrcLangExt_Fortran) { REJECT; } @@ -280,6 +281,52 @@ void replaceComment(int offset); copyToOutput(yytext,(int)yyleng); BEGIN(CComment); } + } +<Scan>[Cc\*][><!]/.*\n { + if (g_lang!=SrcLangExt_Fortran) + { + REJECT; + } + else + { + /* check for fixed format; we might have some conditional as part of multilene if like C<5 .and. & */ + if (isFixedForm && (g_col == 0)) + { + copyToOutput(yytext,(int)yyleng); + BEGIN(CComment); + } + else + { + REJECT; + } + } + } +<Scan>!.*\n { + if (g_lang!=SrcLangExt_Fortran) + { + REJECT; + } + else + { + copyToOutput(yytext,(int)yyleng); + } + } +<Scan>[Cc\*].*\n { + if (g_lang!=SrcLangExt_Fortran) + { + REJECT; + } + else + { + if (g_col == 0) + { + copyToOutput(yytext,(int)yyleng); + } + else + { + REJECT; + } + } } <Scan>"\"" { /* start of a string */ copyToOutput(yytext,(int)yyleng); @@ -294,7 +341,7 @@ void replaceComment(int offset); <Scan>\n { /* new line */ copyToOutput(yytext,(int)yyleng); } -<Scan>("//!"|"///")/.*\n[ \t]*"//"[\/!][^\/] { /* start C++ style special comment block */ +<Scan>("//!"|"///"[/]*)/.*\n[ \t]*"//"[\/!][^\/] { /* start C++ style special comment block */ if (g_mlBrief) { REJECT; // bail out if we do not need to convert @@ -357,7 +404,7 @@ void replaceComment(int offset); BEGIN(CComment); } } -<Scan>"!>"|"!<"|"!!" { +<Scan>![><!] { if (g_lang!=SrcLangExt_Fortran) { REJECT; @@ -402,7 +449,7 @@ void replaceComment(int offset); g_lastCommentContext = YY_START; BEGIN(Verbatim); } -<Scan>. { /* any other character */ +<Scan>. { /* any ather character */ copyToOutput(yytext,(int)yyleng); } <Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"f$"|"f]"|"f}") { /* end of verbatim block */ @@ -549,6 +596,11 @@ void replaceComment(int offset); } <CComment>\n { /* new line in comment */ copyToOutput(yytext,(int)yyleng); + /* in case of Fortran always end of comment */ + if (g_lang==SrcLangExt_Fortran) + { + BEGIN(Scan); + } } <CComment>"*"+"/" { /* end of C comment */ if (g_lang==SrcLangExt_Python) @@ -583,17 +635,6 @@ void replaceComment(int offset); BEGIN(Scan); } } -<CComment>"\n"/[ \t]*[^!] { /* end of Fortran comment */ - if (g_lang!=SrcLangExt_Fortran) - { - REJECT; - } - else - { - copyToOutput(yytext,(int)yyleng); - BEGIN(Scan); - } - } /* removed for bug 674842 (bug was introduced in rev 768) <CComment>"'" { g_charContext = YY_START; @@ -839,6 +880,45 @@ void replaceComment(int offset) } } +// simplified way to know if this is fixed form +// duplicate in fortrancode.l +static bool recognizeFixedForm(const char* contents) +{ + int column=0; + bool skipLine=FALSE; + + for(int i=0;;i++) { + column++; + + switch(contents[i]) { + case '\n': + column=0; + skipLine=FALSE; + break; + case ' ': + break; + case '\000': + return FALSE; + case 'C': + case 'c': + case '*': + if(column==1) return TRUE; + if(skipLine) break; + return FALSE; + case '!': + if(column>1 && column<7) return FALSE; + skipLine=TRUE; + break; + default: + if(skipLine) break; + if(column==7) return TRUE; + return FALSE; + } + } + return FALSE; +} + + /*! This function does three things: * -# It converts multi-line C++ style comment blocks (that are aligned) * to C style comment blocks (if MULTILINE_CPP_IS_BRIEF is set to NO). @@ -860,6 +940,13 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName) g_lineNr = 1; g_condStack.clear(); g_condStack.setAutoDelete(TRUE); + + isFixedForm = FALSE; + if (g_lang==SrcLangExt_Fortran) + { + isFixedForm = recognizeFixedForm(inBuf->data()); + } + if (g_lang==SrcLangExt_Markdown) { BEGIN(CComment); diff --git a/src/commentscan.h b/src/commentscan.h index 9f90663..e296b89 100644 --- a/src/commentscan.h +++ b/src/commentscan.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/commentscan.l b/src/commentscan.l index 68f6b5f..249fec8 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -1,6 +1,6 @@ /***************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -526,7 +526,7 @@ static void addXRefItem(const char *listName,const char *itemTitle, QListIterator<ListItemInfo> slii(*docEntry->sli); for (slii.toFirst();(lii=slii.current());++slii) { - if (strcmp(lii->type,listName)==0) + if (qstrcmp(lii->type,listName)==0) { //printf("found %s lii->type=%s\n",listName,lii->type); break; @@ -1074,7 +1074,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" <Comment>{B}*{CMD}"~"[a-z_A-Z]* { // language switch command QCString langId = QString(yytext).stripWhiteSpace().data()+2; if (!langId.isEmpty() && - stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)!=0) + qstricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)!=0) { // enable language specific section BEGIN(SkipLang); } @@ -1160,6 +1160,9 @@ RCSTAG "$"{ID}":"[^\n$]+"$" <Comment>"--" { // ndash addOutput(insidePre || Doxygen::markdownSupport ? yytext : "–"); } +<Comment>"-#"{B}+ { // numbered item + addOutput(yytext); + } <Comment>("."+)[a-z_A-Z0-9\)] { // . at start or in the middle of a word, or ellipsis addOutput(yytext); } @@ -2057,7 +2060,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" <SkipLang>[\\@]"~"[a-zA-Z]* { /* language switch */ QCString langId = &yytext[2]; if (langId.isEmpty() || - stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)==0) + qstricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)==0) { // enable language specific section BEGIN(Comment); } @@ -2408,6 +2411,11 @@ static bool handleSubpage(const QCString &s) warn(yyFileName,yyLineNr, "warning: found \\subpage command in a comment block that is not marked as a page!"); } + if (g_spaceBeforeCmd) + { + addOutput(' '); + g_spaceBeforeCmd=FALSE; + } addOutput("@"+s+" "); BEGIN(SubpageLabel); return FALSE; @@ -2849,7 +2857,7 @@ static int findExistingGroup(int &groupId,const MemberGroupInfo *info) { if (g_compoundName==mi->compoundName && // same file or scope !mi->header.isEmpty() && // not a nameless group - stricmp(mi->header,info->header)==0 // same header name + qstricmp(mi->header,info->header)==0 // same header name ) { //printf("Found it!\n"); diff --git a/src/condparser.cpp b/src/condparser.cpp index 2cadc1e..1964eda 100644 --- a/src/condparser.cpp +++ b/src/condparser.cpp @@ -1,5 +1,5 @@ /** - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/condparser.h b/src/condparser.h index 74a05cf..a4dfee8 100644 --- a/src/condparser.h +++ b/src/condparser.h @@ -2,7 +2,7 @@ #define CONDPARSER_H /** - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/config.h b/src/config.h index 5ed8bc4..a33909c 100644 --- a/src/config.h +++ b/src/config.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/config.l b/src/config.l index 0422411..b32fd76 100644 --- a/src/config.l +++ b/src/config.l @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/config.xml b/src/config.xml index a75ff80..26496c9 100644 --- a/src/config.xml +++ b/src/config.xml @@ -1176,14 +1176,19 @@ When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed search data is written to a file for indexing by an external tool. With the SEARCHDATA_FILE tag the name of this file can be specified. ' defval='searchdata.xml' depends='SEARCHENGINE'/> + <option type='string' id='EXTERNAL_SEARCH_ID' docs=' +When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the +EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +projects and redirect the results back to the right project. +' defval='' dependes='SEARCHENGINE'/> <option type='list' id='EXTRA_SEARCH_MAPPINGS' docs=' -The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through other -doxygen projects that are not otherwise connected via tags files, but are -all added to the same search index. Each project needs to have a tag file set -via GENERATE_TAGFILE. The search mapping then maps the name of the tag file -to a relative location where the documentation can be found, similar to the -TAGFILES option but without actually processing the tag file. -The format is: EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... +The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +projects other than the one defined by this configuration file, but that are +all added to the same external search index. Each project needs to have a +unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id +of to a relative location where the documentation can be found. +The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ... ' defval='0' depends='SEARCHENGINE'/> </group> <group name='LaTeX' docs='configuration options related to the LaTeX output'> diff --git a/src/configgen.py b/src/configgen.py index 5af201f..459ec4d 100755 --- a/src/configgen.py +++ b/src/configgen.py @@ -1,6 +1,6 @@ # python script to generate configoptions.cpp from config.xml # -# Copyright (C) 1997-2012 by Dimitri van Heesch. +# Copyright (C) 1997-2013 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 diff --git a/src/configoptions.cpp b/src/configoptions.cpp index 846142c..eef2272 100644 --- a/src/configoptions.cpp +++ b/src/configoptions.cpp @@ -1723,16 +1723,22 @@ void addConfigOptions(Config *cfg) cs->setWidgetType(ConfigString::File); cs->addDependency("SEARCHENGINE"); //---- + cs = cfg->addString( + "EXTERNAL_SEARCH_ID", + "When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the\n" + "EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\n" + "useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n" + "projects and redirect the results back to the right project." + ); + //---- cl = cfg->addList( "EXTRA_SEARCH_MAPPINGS", - "The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through other\n" - "doxygen projects that are not otherwise connected via tags files, but are\n" - "all added to the same search index. Each project needs to have a tag file set\n" - "via GENERATE_TAGFILE. The search mapping then maps the name of the tag file\n" - "to a relative location where the documentation can be found,\n" - "similar to the\n" - "TAGFILES option but without actually processing the tag file.\n" - "The format is: EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ..." + "The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\n" + "projects other than the one defined by this configuration file, but that are\n" + "all added to the same external search index. Each project needs to have a\n" + "unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id\n" + "of to a relative location where the documentation can be found.\n" + "The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ..." ); cl->addDependency("SEARCHENGINE"); //--------------------------------------------------------------------------- diff --git a/src/configoptions.h b/src/configoptions.h index 8bf94d5..179d751 100644 --- a/src/configoptions.h +++ b/src/configoptions.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/constexp.h b/src/constexp.h index 767ea66..60e4722 100644 --- a/src/constexp.h +++ b/src/constexp.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/constexp.l b/src/constexp.l index fda1f04..f72e99d 100644 --- a/src/constexp.l +++ b/src/constexp.l @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/constexp.y b/src/constexp.y index c8b35e5..aed8be9 100644 --- a/src/constexp.y +++ b/src/constexp.y @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/cppvalue.cpp b/src/cppvalue.cpp index 69b8be4..7efb4f8 100644 --- a/src/cppvalue.cpp +++ b/src/cppvalue.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/cppvalue.h b/src/cppvalue.h index 7289ce0..3f3ac3a 100644 --- a/src/cppvalue.h +++ b/src/cppvalue.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/debug.cpp b/src/debug.cpp index da1233b..c962214 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/debug.h b/src/debug.h index c3d78de..bcac588 100644 --- a/src/debug.h +++ b/src/debug.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/declinfo.h b/src/declinfo.h index 9486bad..3d8cb87 100644 --- a/src/declinfo.h +++ b/src/declinfo.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/declinfo.l b/src/declinfo.l index dd3f6f8..3e4ad4a 100644 --- a/src/declinfo.l +++ b/src/declinfo.l @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/defargs.h b/src/defargs.h index 9c6f209..1dbabdb 100644 --- a/src/defargs.h +++ b/src/defargs.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/defargs.l b/src/defargs.l index ce870d9..fa945f6 100644 --- a/src/defargs.l +++ b/src/defargs.l @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -408,7 +408,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" g_curArgTypeName+=*yytext; } -<ReadFuncArgDef,CopyArgString>"->"|">="|">>" { +<ReadFuncArgDef,CopyArgString>"<="|"->"|">="|">>"|"<<" { g_curArgDefValue+=yytext; } <ReadFuncArgDef,CopyArgString,CopyRawString>. { diff --git a/src/defgen.cpp b/src/defgen.cpp index fedb4a0..52f91c7 100644 --- a/src/defgen.cpp +++ b/src/defgen.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/defgen.h b/src/defgen.h index 5b26cd0..290a415 100644 --- a/src/defgen.h +++ b/src/defgen.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/define.cpp b/src/define.cpp index e5dd154..c814e34 100644 --- a/src/define.cpp +++ b/src/define.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/define.h b/src/define.h index c5b5274..da3d956 100644 --- a/src/define.h +++ b/src/define.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -55,7 +55,7 @@ class DefineList : public QList<Define> ~DefineList() {} int compareItems(QCollection::Item i1,QCollection::Item i2) { - return stricmp(((Define *)i1)->name,((Define *)i2)->name); + return qstricmp(((Define *)i1)->name,((Define *)i2)->name); } }; @@ -68,7 +68,7 @@ class DefineName : public QList<Define> const char *nameString() const { return name; } int compareItems(QCollection::Item i1,QCollection::Item i2) { - return stricmp(((Define *)i1)->name,((Define *)i2)->name); + return qstricmp(((Define *)i1)->name,((Define *)i2)->name); } private: @@ -83,7 +83,7 @@ class DefineNameList : public QList<DefineName> ~DefineNameList() {} int compareItems(QCollection::Item i1,QCollection::Item i2) { - return stricmp(((DefineName *)i1)->nameString(), + return qstricmp(((DefineName *)i1)->nameString(), ((DefineName *)i2)->nameString()); } }; diff --git a/src/definition.cpp b/src/definition.cpp index 2833be7..1212a7b 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1008,11 +1008,12 @@ void Definition::setBodyDef(FileDef *fd) /*! Write code of this definition into the documentation */ void Definition::writeInlineCode(OutputList &ol,const char *scopeName) { + static bool inlineSources = Config_getBool("INLINE_SOURCES"); makeResident(); ol.pushGeneratorState(); //printf("Source Fragment %s: %d-%d bodyDef=%p\n",name().data(), // m_startBodyLine,m_endBodyLine,m_bodyDef); - if (Config_getBool("INLINE_SOURCES") && + if (inlineSources && m_impl->body && m_impl->body->startLine!=-1 && m_impl->body->endLine>=m_impl->body->startLine && m_impl->body->fileDef) { @@ -1031,7 +1032,7 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName) if (definitionType()==TypeMember) thisMd = (MemberDef *)this; // vhdl parser can' t start at an arbitrary point in the source code - if(this->getLanguage()==SrcLangExt_VHDL) + if (getLanguage()==SrcLangExt_VHDL) { if (thisMd) VhdlDocGen::writeCodeFragment(ol,actualStart,codeFragment,thisMd); return; @@ -1048,7 +1049,7 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName) actualEnd, // endLine TRUE, // inlineFragment thisMd, // memberDef - FALSE // show line numbers + TRUE // show line numbers ); ol.endCodeFragment(); } @@ -1404,7 +1405,7 @@ int Definition::_getXRefListId(const char *listName) const ListItemInfo *lii; for (slii.toFirst();(lii=slii.current());++slii) { - if (strcmp(lii->type,listName)==0) + if (qstrcmp(lii->type,listName)==0) { return lii->itemId; } @@ -1489,12 +1490,12 @@ QCString Definition::navigationPathAsString() const { if (definitionType()==Definition::TypeGroup && ((const GroupDef*)this)->groupTitle()) { - result+="<a class=\"el\" href=\"$relpath$"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+ + result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+ ((const GroupDef*)this)->groupTitle()+"</a>"; } else if (definitionType()==Definition::TypePage && !((const PageDef*)this)->title().isEmpty()) { - result+="<a class=\"el\" href=\"$relpath$"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+ + result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+ ((const PageDef*)this)->title()+"</a>"; } else if (definitionType()==Definition::TypeClass) @@ -1504,13 +1505,13 @@ QCString Definition::navigationPathAsString() const { name = name.left(name.length()-2); } - result+="<a class=\"el\" href=\"$relpath$"+getOutputFileBase()+Doxygen::htmlFileExtension; + result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension; if (!anchor().isEmpty()) result+="#"+anchor(); result+="\">"+name+"</a>"; } else { - result+="<a class=\"el\" href=\"$relpath$"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+ + result+="<a class=\"el\" href=\"$relpath^"+getOutputFileBase()+Doxygen::htmlFileExtension+"\">"+ locName+"</a>"; } } diff --git a/src/definition.h b/src/definition.h index 9d80431..9bbc85e 100644 --- a/src/definition.h +++ b/src/definition.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -364,7 +364,7 @@ class DefinitionList : public QList<Definition>, public DefinitionIntf DefType definitionType() const { return TypeSymbolList; } int compareItems(QCollection::Item item1,QCollection::Item item2) { - return stricmp(((Definition *)item1)->name(), + return qstricmp(((Definition *)item1)->name(), ((Definition *)item2)->name() ); } diff --git a/src/diagram.cpp b/src/diagram.cpp index 78b9364..10b49b9 100644 --- a/src/diagram.cpp +++ b/src/diagram.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/diagram.h b/src/diagram.h index 63481cd..ec08e5e 100644 --- a/src/diagram.h +++ b/src/diagram.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/dirdef.cpp b/src/dirdef.cpp index 6565393..6795e38 100644 --- a/src/dirdef.cpp +++ b/src/dirdef.cpp @@ -579,8 +579,8 @@ int FilePairDict::compareItems(QCollection::Item item1,QCollection::Item item2) { FilePair *left = (FilePair*)item1; FilePair *right = (FilePair*)item2; - int orderHi = stricmp(left->source()->name(),right->source()->name()); - int orderLo = stricmp(left->destination()->name(),right->destination()->name()); + int orderHi = qstricmp(left->source()->name(),right->source()->name()); + int orderLo = qstricmp(left->destination()->name(),right->destination()->name()); return orderHi==0 ? orderLo : orderHi; } @@ -629,7 +629,7 @@ bool DirDef::matchPath(const QCString &path,QStrList &l) while (s) { QCString prefix = s; - if (stricmp(prefix.left(path.length()),path)==0) // case insensitive compare + if (qstricmp(prefix.left(path.length()),path)==0) // case insensitive compare { return TRUE; } @@ -785,7 +785,7 @@ static void computeCommonDirPrefix() QCString dirName = dir->name(); if (dirName.length()>path.length()) { - if (strncmp(dirName,path,l)!=0) // dirName does not start with path + if (qstrncmp(dirName,path,l)!=0) // dirName does not start with path { int i=path.findRev('/',l-2); if (i==-1) // no unique prefix -> stop diff --git a/src/dirdef.h b/src/dirdef.h index a94f979..99e2137 100644 --- a/src/dirdef.h +++ b/src/dirdef.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -161,7 +161,7 @@ class DirRelation inline int DirList::compareItems(QCollection::Item item1,QCollection::Item item2) { - return stricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName()); + return qstricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName()); } /** A sorted dictionary of DirDef objects. */ @@ -171,7 +171,7 @@ class DirSDict : public SDict<DirDef> DirSDict(int size) : SDict<DirDef>(size) {} int compareItems(QCollection::Item item1,QCollection::Item item2) { - return stricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName()); + return qstricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName()); } }; diff --git a/src/docparser.cpp b/src/docparser.cpp index c4f42f3..29b0030 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1517,6 +1517,39 @@ handlepara: return TRUE; } +//--------------------------------------------------------------------------- + +static int handleDocCopy(DocNode *parent,QList<DocNode> &children) +{ + int tok=doctokenizerYYlex(); + int cmdId = Mappers::cmdMapper->map(g_token->name); + if (tok!=TK_WHITESPACE) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command", + qPrint(g_token->name)); + return 0; + } + tok=doctokenizerYYlex(); + if (tok==0) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the " + "argument of command %s\n", qPrint(g_token->name)); + return 0; + } + else if (tok!=TK_WORD && tok!=TK_LNKWORD) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s", + tokToString(tok),qPrint(g_token->name)); + return 0; + } + DocCopy *cpy = new DocCopy(parent,g_token->name, + cmdId==CMD_COPYDOC || cmdId==CMD_COPYBRIEF, + cmdId==CMD_COPYDOC || cmdId==CMD_COPYDETAILS); + cpy->parse(children); + delete cpy; + return 0; +} + //--------------------------------------------------------------------------- @@ -1687,6 +1720,10 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children, { delete par; } + if (retval==RetVal_CopyDoc) + { + retval=handleDocCopy(parent,children); + } } while (retval==TK_NEWPARA); if (lastPar) lastPar->markLast(); @@ -3164,6 +3201,10 @@ int DocInternal::parse(int level) { warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid list item found",doctokenizerYYlineno); } + else if (retval==RetVal_CopyDoc) + { + retval=handleDocCopy(this,m_children); + } } while (retval!=0 && retval!=RetVal_Section && retval!=RetVal_Subsection && @@ -5460,7 +5501,6 @@ int DocPara::handleCommand(const QCString &cmdName) m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Msc,g_isExample,g_exampleName)); if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: msc section ended without end marker"); doctokenizerYYsetStatePara(); - VhdlDocGen::createFlowChart(g_memberDef); } break; case CMD_ENDCODE: @@ -5522,34 +5562,7 @@ int DocPara::handleCommand(const QCString &cmdName) case CMD_COPYDOC: // fall through case CMD_COPYBRIEF: // fall through case CMD_COPYDETAILS: - { - int tok=doctokenizerYYlex(); - if (tok!=TK_WHITESPACE) - { - warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: expected whitespace after %s command", - qPrint(cmdName)); - break; - } - tok=doctokenizerYYlex(); - if (tok==0) - { - warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected end of comment block while parsing the " - "argument of command %s\n", qPrint(cmdName)); - break; - } - else if (tok!=TK_WORD && tok!=TK_LNKWORD) - { - warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: unexpected token %s as the argument of %s", - tokToString(tok),qPrint(cmdName)); - break; - } - 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); - delete cpy; - } + retval = RetVal_CopyDoc; break; case CMD_INCLUDE: handleInclude(cmdName,DocInclude::Include); @@ -6442,7 +6455,7 @@ reparsetoken: } // handle the command - retval=handleCommand(g_token->name.copy()); + retval=handleCommand(g_token->name); DBG(("handleCommand returns %x\n",retval)); // check the return value @@ -6613,12 +6626,16 @@ int DocSection::parse() { warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: Invalid list item found"); } + else if (retval==RetVal_CopyDoc) + { + retval=handleDocCopy(this,m_children); + } } while (retval!=0 && retval!=RetVal_Internal && retval!=RetVal_Section && retval!=RetVal_Subsection && retval!=RetVal_Subsubsection && - retval!=RetVal_Paragraph + retval!=RetVal_Paragraph ); if (lastPar) lastPar->markLast(); @@ -6829,6 +6846,10 @@ void DocRoot::parse() { warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: found paragraph command outside of subsubsection context!"); } + else if (retval==RetVal_CopyDoc) + { + retval=handleDocCopy(this,m_children); + } } while (retval!=0 && retval!=RetVal_Section && retval!=RetVal_Internal); if (lastPar) lastPar->markLast(); diff --git a/src/docparser.h b/src/docparser.h index cd51522..7279d21 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/docsets.cpp b/src/docsets.cpp index dc483d3..1ba865a 100644 --- a/src/docsets.cpp +++ b/src/docsets.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/docsets.h b/src/docsets.h index 2fa0125..c5f0dc7 100644 --- a/src/docsets.h +++ b/src/docsets.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/doctokenizer.h b/src/doctokenizer.h index 5036f19..048558e 100644 --- a/src/doctokenizer.h +++ b/src/doctokenizer.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -60,7 +60,8 @@ enum Tokens RetVal_Internal = 0x10011, RetVal_SwitchLang = 0x10012, RetVal_CloseXml = 0x10013, - RetVal_EndBlockQuote = 0x10014 + RetVal_EndBlockQuote = 0x10014, + RetVal_CopyDoc = 0x10015 }; /** @brief Data associated with a token used by the comment block parser. */ diff --git a/src/doctokenizer.l b/src/doctokenizer.l index d2b5123..6bc541e 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -353,7 +353,8 @@ TEMPCHAR [a-z_A-Z0-9,: \t\*\&] FUNCCHAR [a-z_A-Z0-9,:\<\> \t\^\*\&\[\]] SCOPESEP "::"|"#"|"." TEMPLPART "<"{TEMPCHAR}*">" -SCOPEPRE {ID}{TEMPLPART}?{SCOPESEP} +ANONNS "anonymous_namespace{"[^}]*"}" +SCOPEPRE (({ID}{TEMPLPART}?)|{ANONNS}){SCOPESEP} SCOPEKEYS ":"({ID}":")* SCOPECPP {SCOPEPRE}*(~)?{ID}("<"{TEMPCHAR}*">")? SCOPEOBJC {SCOPEPRE}?{ID}{SCOPEKEYS}? @@ -379,7 +380,7 @@ HTMLTAG "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*(("/")?)">" HTMLKEYL "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"sup"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p" HTMLKEYU "STRONG"|"CENTER"|"TABLE"|"CAPTION"|"SMALL"|"CODE"|"DFN"|"VAR"|"IMG"|"PRE"|"SUB"|"SUP"|"TR"|"TD"|"TH"|"OL"|"UL"|"LI"|"TT"|"KBD"|"EM"|"HR"|"DL"|"DT"|"DD"|"BR"|"I"|"A"|"B"|"P" HTMLKEYW {HTMLKEYL}|{HTMLKEYU} -REFWORD2 ("#"|"::")?({ID}{TEMPLPART}?("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCARG}? +REFWORD2 ("#"|"::")?((({ID}{TEMPLPART}?)|{ANONNS})("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCARG}? REFWORD3 ({ID}":")*{ID}":"? REFWORD {LABELID}|{REFWORD2}|{REFWORD3} @@ -1091,13 +1092,13 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3} BEGIN(St_SecSkip); } <St_SecSkip>{CMD}{ID} { - if (strcmp(yytext+1,g_endMarker)==0) + if (qstrcmp(yytext+1,g_endMarker)==0) { BEGIN(St_Sections); } } <St_SecSkip>"-->" { - if (strcmp(yytext,g_endMarker)==0) + if (qstrcmp(yytext,g_endMarker)==0) { BEGIN(St_Sections); } diff --git a/src/docvisitor.h b/src/docvisitor.h index 104dce0..312b05d 100644 --- a/src/docvisitor.h +++ b/src/docvisitor.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/dot.cpp b/src/dot.cpp index 0866768..f6d091a 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -573,7 +573,7 @@ static bool readSVGSize(const QCString &fileName,int *width,int *height) if (numBytes>0) { buf[numBytes]='\0'; - if (strncmp(buf,"<!--zoomable ",13)==0) + if (qstrncmp(buf,"<!--zoomable ",13)==0) { *width=-1; *height=-1; @@ -771,7 +771,7 @@ class DotNodeList : public QList<DotNode> ~DotNodeList() {} int compareItems(QCollection::Item item1,QCollection::Item item2) { - return stricmp(((DotNode *)item1)->m_label,((DotNode *)item2)->m_label); + return qstricmp(((DotNode *)item1)->m_label,((DotNode *)item2)->m_label); } }; @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 916c64d..f88972f 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -3263,12 +3263,17 @@ static void buildFunctionList(EntryNav *rootNav) // in case of template functions, we need to check if the // functions have the same number of template parameters bool sameNumTemplateArgs = TRUE; + bool matchingReturnTypes = TRUE; if (mdTempl!=0 && root->tArgLists) { if (mdTempl->count()!=root->tArgLists->getLast()->count()) { sameNumTemplateArgs = FALSE; } + if (md->typeString()!=removeRedundantWhiteSpace(root->type)) + { + matchingReturnTypes = FALSE; + } } bool staticsInDifferentFiles = @@ -3279,6 +3284,7 @@ static void buildFunctionList(EntryNav *rootNav) rnd ? rnd : Doxygen::globalScope,rfd,root->argList, FALSE) && sameNumTemplateArgs && + matchingReturnTypes && !staticsInDifferentFiles ) { @@ -4517,10 +4523,22 @@ static bool findClassRelation( usedName=biName; //printf("***** usedName=%s templSpec=%s\n",usedName.data(),templSpec.data()); } - if (Config_getBool("SIP_SUPPORT")) bi->prot=Public; - cd->insertBaseClass(baseClass,usedName,bi->prot,bi->virt,templSpec); - // add this class as super class to the base class - baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec); + static bool sipSupport = Config_getBool("SIP_SUPPORT"); + if (sipSupport) bi->prot=Public; + if (!cd->isSubClass(baseClass)) // check for recursion, see bug690787 + { + cd->insertBaseClass(baseClass,usedName,bi->prot,bi->virt,templSpec); + // add this class as super class to the base class + baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec); + } + else + { + warn(root->fileName,root->startLine, + "Detected potential recursive class relation " + "between class %s and base class %s!", + cd->name().data(),baseClass->name().data() + ); + } } return TRUE; } @@ -5131,6 +5149,7 @@ static ClassDef *findClassDefinition(FileDef *fd,NamespaceDef *nd, static bool findGlobalMember(EntryNav *rootNav, const QCString &namespaceName, + const char *type, const char *name, const char *tempArg, const char *, @@ -5138,8 +5157,8 @@ static bool findGlobalMember(EntryNav *rootNav, { Entry *root = rootNav->entry(); Debug::print(Debug::FindMembers,0, - "2. findGlobalMember(namespace=%s,name=%s,tempArg=%s,decl=%s)\n", - namespaceName.data(),name,tempArg,decl); + "2. findGlobalMember(namespace=%s,type=%s,name=%s,tempArg=%s,decl=%s)\n", + namespaceName.data(),type,name,tempArg,decl); QCString n=name; if (n.isEmpty()) return FALSE; if (n.find("::")!=-1) return FALSE; // skip undefined class members @@ -5150,7 +5169,7 @@ static bool findGlobalMember(EntryNav *rootNav, } if (mn) // function name defined { - Debug::print(Debug::FindMembers,0,"3. Found function scope\n"); + Debug::print(Debug::FindMembers,0,"3. Found symbol scope\n"); //int count=0; MemberNameIterator mni(*mn); MemberDef *md; @@ -5222,6 +5241,19 @@ static bool findGlobalMember(EntryNav *rootNav, matching = FALSE; } + // for template member we also need to check the return type + if (md->templateArguments()!=0 && root->tArgLists!=0) + { + //printf("Comparing return types '%s'<->'%s'\n", + // md->typeString(),type); + if (md->templateArguments()->count()!=root->tArgLists->last()->count() || + qstrcmp(md->typeString(),type)!=0) + { + //printf(" ---> no matching\n"); + matching = FALSE; + } + } + if (matching) // add docs to the member { Debug::print(Debug::FindMembers,0,"5. Match found\n"); @@ -5260,7 +5292,7 @@ static bool findGlobalMember(EntryNav *rootNav, ) { warn(root->fileName,root->startLine, - "warning: documented function `%s' was not declared or defined.",decl + "warning: documented symbol `%s' was not declared or defined.",decl ); } } @@ -5847,6 +5879,21 @@ static void findMember(EntryNav *rootNav, matching = FALSE; // don't match methods and attributes with the same name } + // for template member we also need to check the return type + if (md->templateArguments()!=0 && root->tArgLists!=0) + { + //printf("Comparing return types '%s'<->'%s' args %d<->%d\n", + // md->typeString(),funcType.data(), + // md->templateArguments()->count(),root->tArgLists->last()->count()); + if (md->templateArguments()->count()!=root->tArgLists->last()->count() || + qstrcmp(md->typeString(),funcType)) + { + //printf(" ---> no matching\n"); + matching = FALSE; + } + } + + Debug::print(Debug::FindMembers,0, "6. match results of matchArguments2 = %d\n",matching); @@ -6131,7 +6178,7 @@ static void findMember(EntryNav *rootNav, } else // unrelated function with the same name as a member { - if (!findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl)) + if (!findGlobalMember(rootNav,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl)) { QCString fullFuncDecl=funcDecl.copy(); if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE); @@ -6338,7 +6385,7 @@ static void findMember(EntryNav *rootNav, } if (root->relatesType == Duplicate) { - if (!findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl)) + if (!findGlobalMember(rootNav,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl)) { QCString fullFuncDecl=funcDecl.copy(); if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE); @@ -6412,7 +6459,7 @@ localObjCMethod: } else // unrelated not overloaded member found { - bool globMem = findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl); + bool globMem = findGlobalMember(rootNav,namespaceName,funcType,funcName,funcTempList,funcArgs,funcDecl); if (className.isEmpty() && !globMem) { warn(root->fileName,root->startLine, @@ -6927,6 +6974,17 @@ static void addEnumValuesToEnums(EntryNav *rootNav) fmd->setAnchor(); md->insertEnumField(fmd); fmd->setEnumScope(md); + MemberName *mn=mnsd->find(root->name); + if (mn) + { + mn->append(fmd); + } + else + { + mn = new MemberName(root->name); + mn->append(fmd); + mnsd->append(root->name,mn); + } } e->releaseEntry(); } @@ -8573,7 +8631,7 @@ static void generateConfigFile(const char *configFile,bool shortList, { msg("\n\nConfiguration file `%s' created.\n\n",configFile); msg("Now edit the configuration file and enter\n\n"); - if (strcmp(configFile,"Doxyfile") || strcmp(configFile,"doxyfile")) + if (qstrcmp(configFile,"Doxyfile") || qstrcmp(configFile,"doxyfile")) msg(" doxygen %s\n\n",configFile); else msg(" doxygen\n\n"); @@ -8730,7 +8788,15 @@ static void parseFiles(Entry *root,EntryNav *rootNav) QCString fileName=*s; QCString extension; int ei = fileName.findRev('.'); - if (ei!=-1) extension=fileName.right(fileName.length()-ei); + if (ei!=-1) + { + extension=fileName.right(fileName.length()-ei); + } + else + { + extension = ".no_extension"; + } + ParserInterface *parser = Doxygen::parserManager->getParser(extension); QFileInfo fi(fileName); @@ -9223,7 +9289,7 @@ void dumpConfigAsXML() static void usage(const char *name) { - msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2012\n\n",versionString); + msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2013\n\n",versionString); msg("You can use doxygen in a number of ways:\n\n"); msg("1) Use doxygen to generate a template configuration file:\n"); msg(" %s [-s] -g [configName]\n\n",name); @@ -9255,7 +9321,7 @@ static void usage(const char *name) static const char *getArg(int argc,char **argv,int &optind) { char *s=0; - if (strlen(&argv[optind][2])>0) + if (qstrlen(&argv[optind][2])>0) s=&argv[optind][2]; else if (optind+1<argc && argv[optind+1][0]!='-') s=argv[++optind]; @@ -9434,7 +9500,7 @@ void readConfiguration(int argc, char **argv) case 'g': genConfig=TRUE; configName=getArg(argc,argv,optind); - if (strcmp(argv[optind+1],"-")==0) + if (optind+1<argc && qstrcmp(argv[optind+1],"-")==0) { configName="-"; optind++; } if (!configName) { configName="Doxyfile"; } @@ -9463,7 +9529,7 @@ void readConfiguration(int argc, char **argv) cleanUpDoxygen(); exit(1); } - if (stricmp(formatName,"rtf")==0) + if (qstricmp(formatName,"rtf")==0) { if (optind+1>=argc) { @@ -9491,7 +9557,7 @@ void readConfiguration(int argc, char **argv) cleanUpDoxygen(); exit(1); } - if (stricmp(formatName,"rtf")==0) + if (qstricmp(formatName,"rtf")==0) { if (optind+1>=argc) { @@ -9507,7 +9573,7 @@ void readConfiguration(int argc, char **argv) cleanUpDoxygen(); exit(1); } - else if (stricmp(formatName,"html")==0) + else if (qstricmp(formatName,"html")==0) { if (optind+4<argc || QFileInfo("Doxyfile").exists()) { @@ -9561,7 +9627,7 @@ void readConfiguration(int argc, char **argv) cleanUpDoxygen(); exit(0); } - else if (stricmp(formatName,"latex")==0) + else if (qstricmp(formatName,"latex")==0) { if (optind+4<argc) // use config file to get settings { @@ -9624,11 +9690,11 @@ void readConfiguration(int argc, char **argv) g_dumpConfigAsXML = TRUE; break; case '-': - if (strcmp(&argv[optind][2],"help")==0) + if (qstrcmp(&argv[optind][2],"help")==0) { usage(argv[0]); } - else if (strcmp(&argv[optind][2],"version")==0) + else if (qstrcmp(&argv[optind][2],"version")==0) { msg("%s\n",versionString); cleanUpDoxygen(); @@ -9699,7 +9765,7 @@ void readConfiguration(int argc, char **argv) else { QFileInfo fi(argv[optind]); - if (fi.exists() || strcmp(argv[optind],"-")==0) + if (fi.exists() || qstrcmp(argv[optind],"-")==0) { configName=argv[optind]; } @@ -10060,9 +10126,10 @@ void parseInput() int cacheSize = Config_getInt("SYMBOL_CACHE_SIZE"); if (cacheSize<0) cacheSize=0; if (cacheSize>9) cacheSize=9; - Doxygen::symbolCache = new ObjCache(16+cacheSize); // 16 -> room for 65536 elements, - // ~2.0 MByte "overhead" + //Doxygen::symbolCache = new ObjCache(16+cacheSize); // 16 -> room for 65536 elements, + // // ~2.0 MByte "overhead" //Doxygen::symbolCache = new ObjCache(1); // only to stress test cache behaviour + Doxygen::symbolCache = 0; //disable cache Doxygen::symbolStorage = new Store; // also scale lookup cache with SYMBOL_CACHE_SIZE diff --git a/src/doxygen.h b/src/doxygen.h index 9ead4c1..35c92ca 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/doxygen.pro.in b/src/doxygen.pro.in index 42ffaa0..3bd617e 100644 --- a/src/doxygen.pro.in +++ b/src/doxygen.pro.in @@ -1,7 +1,7 @@ # # # -# Copyright (C) 1997-2012 by Dimitri van Heesch. +# Copyright (C) 1997-2013 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 @@ -26,7 +26,7 @@ win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib win32-borland:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk win32:TMAKE_CXXFLAGS += -DQT_NODLL -win32-g++:LIBS = -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -liconv -lpthread +win32-g++:LIBS = -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -liconv -lpthread -Wl,--as-needed -lole32 win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti INCLUDEPATH += ../qtools ../libmd5 . DESTDIR = ../bin diff --git a/src/eclipsehelp.cpp b/src/eclipsehelp.cpp index df65a13..213b0fa 100644 --- a/src/eclipsehelp.cpp +++ b/src/eclipsehelp.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/eclipsehelp.h b/src/eclipsehelp.h index 3be7fc0..c21c4ae 100644 --- a/src/eclipsehelp.h +++ b/src/eclipsehelp.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/entry.cpp b/src/entry.cpp index cf3634b..06e1a5f 100644 --- a/src/entry.cpp +++ b/src/entry.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/entry.h b/src/entry.h index 60ba372..dac1e78 100644 --- a/src/entry.h +++ b/src/entry.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/example.h b/src/example.h index 4bcaeb9..8a2b529 100644 --- a/src/example.h +++ b/src/example.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -40,7 +40,7 @@ class ExampleSDict : public SDict<Example> ~ExampleSDict() {} int compareItems(QCollection::Item item1,QCollection::Item item2) { - return stricmp(((Example *)item1)->name,((Example *)item2)->name); + return qstricmp(((Example *)item1)->name,((Example *)item2)->name); } }; diff --git a/src/filedef.cpp b/src/filedef.cpp index 331c792..ccf419e 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/filedef.h b/src/filedef.h index adf0f49..1d037d5 100644 --- a/src/filedef.h +++ b/src/filedef.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -236,7 +236,7 @@ class FileList : public QList<FileDef> { FileDef *md1 = (FileDef *)item1; FileDef *md2 = (FileDef *)item2; - return stricmp(md1->name(),md2->name()); + return qstricmp(md1->name(),md2->name()); } private: QCString m_pathName; @@ -251,7 +251,7 @@ class OutputNameList : public QList<FileList> { FileList *fl1 = (FileList *)item1; FileList *fl2 = (FileList *)item2; - return stricmp(fl1->path(),fl2->path()); + return qstricmp(fl1->path(),fl2->path()); } }; diff --git a/src/filename.cpp b/src/filename.cpp index 2b0dffe..e5c5ca5 100644 --- a/src/filename.cpp +++ b/src/filename.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -102,7 +102,7 @@ int FileName::compareItems(QCollection::Item item1, QCollection::Item item2) { FileName *f1=(FileName *)item1; FileName *f2=(FileName *)item2; - return stricmp(f1->fileName(),f2->fileName()); + return qstricmp(f1->fileName(),f2->fileName()); } FileNameIterator::FileNameIterator(const FileName &fname) : @@ -135,8 +135,8 @@ int FileNameList::compareItems(QCollection::Item item1, QCollection::Item item2) //printf("FileNameList::compareItems `%s'<->`%s'\n", // f1->fileName(),f2->fileName()); return Config_getBool("FULL_PATH_NAMES") ? - stricmp(f1->fullName(),f2->fullName()) : - stricmp(f1->fileName(),f2->fileName()); + qstricmp(f1->fullName(),f2->fullName()) : + qstricmp(f1->fileName(),f2->fileName()); } FileNameListIterator::FileNameListIterator(const FileNameList &fnlist) : diff --git a/src/filename.h b/src/filename.h index e038659..1cd160c 100644 --- a/src/filename.h +++ b/src/filename.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/filestorage.h b/src/filestorage.h index ddffeda..a6ee5b4 100644 --- a/src/filestorage.h +++ b/src/filestorage.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/footer.html b/src/footer.html index 80222ad..d2aa9e6 100644 --- a/src/footer.html +++ b/src/footer.html @@ -5,14 +5,14 @@ $navpath <li class="footer">$generatedby <a href="http://www.doxygen.org/index.html"> - <img class="footer" src="$relpath$doxygen.png" alt="doxygen"/></a> $doxygenversion </li> + <img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion </li> </ul> </div> <!--END GENERATE_TREEVIEW--> <!--BEGIN !GENERATE_TREEVIEW--> <hr class="footer"/><address class="footer"><small> $generatedby  <a href="http://www.doxygen.org/index.html"> -<img class="footer" src="$relpath$doxygen.png" alt="doxygen"/> +<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/> </a> $doxygenversion </small></address> <!--END !GENERATE_TREEVIEW--> diff --git a/src/footer_html.h b/src/footer_html.h index b193c41..2891692 100644 --- a/src/footer_html.h +++ b/src/footer_html.h @@ -5,14 +5,14 @@ " $navpath\n" " <li class=\"footer\">$generatedby\n" " <a href=\"http://www.doxygen.org/index.html\">\n" -" <img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/></a> $doxygenversion </li>\n" +" <img class=\"footer\" src=\"$relpath^doxygen.png\" alt=\"doxygen\"/></a> $doxygenversion </li>\n" " </ul>\n" "</div>\n" "<!--END GENERATE_TREEVIEW-->\n" "<!--BEGIN !GENERATE_TREEVIEW-->\n" "<hr class=\"footer\"/><address class=\"footer\"><small>\n" "$generatedby  <a href=\"http://www.doxygen.org/index.html\">\n" -"<img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/>\n" +"<img class=\"footer\" src=\"$relpath^doxygen.png\" alt=\"doxygen\"/>\n" "</a> $doxygenversion\n" "</small></address>\n" "<!--END !GENERATE_TREEVIEW-->\n" diff --git a/src/formula.cpp b/src/formula.cpp index a1f2328..ef2d5f2 100644 --- a/src/formula.cpp +++ b/src/formula.cpp @@ -1,7 +1,7 @@ /****************************************************************************** * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/formula.h b/src/formula.h index 553ee77..79821bf 100644 --- a/src/formula.h +++ b/src/formula.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/fortrancode.h b/src/fortrancode.h index 45b3333..7f59920 100644 --- a/src/fortrancode.h +++ b/src/fortrancode.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/fortrancode.l b/src/fortrancode.l index b598b73..cb8ad4e 100644 --- a/src/fortrancode.l +++ b/src/fortrancode.l @@ -53,6 +53,20 @@ #define YY_NEVER_INTERACTIVE 1 #define YY_NO_TOP_STATE 1 #define YY_NO_INPUT 1 + +/* + * For fixed formatted code position 6 is of importance (continuation character). + * The following variables and macros keep track of the column number + * YY_USER_ACTION is always called for each scan action + * YY_FTN_REST is used to handle end of lines and reset the column counter + * YY_FTN_REJECT resets the column counters when a pattern is rejected and thus rescanned. + */ +int yy_old_start = 0; +int yy_my_start = 0; +int yy_end = 1; +#define YY_USER_ACTION {yy_old_start = yy_my_start; yy_my_start = yy_end; yy_end += yyleng;} +#define YY_FTN_RESET {yy_old_start = 0; yy_my_start = 0; yy_end = 1;} +#define YY_FTN_REJECT {yy_end = yy_my_start; yy_my_start = yy_old_start; REJECT;} //-------------------------------------------------------------------------------- @@ -680,8 +694,8 @@ CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS})) TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}COMPLEX|DOUBLE{BS_}PRECISION|{CHAR}) INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")" -ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|ELEMENTAL) -ACCESS_SPEC (PRIVATE|PUBLIC) +ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|ELEMENTAL) +ACCESS_SPEC (PROTECTED|PRIVATE|PUBLIC) /* Assume that attribute statements are almost the same as attributes. */ ATTR_STMT {ATTR_SPEC}|DIMENSION FLOW (DO|SELECT|CASE|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT) @@ -729,6 +743,10 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA endFontClass(); } <Start>{FLOW}/[,( \t\n].* { + if (g_isFixedForm) + { + if ((yy_my_start == 1) && ((yytext[0] == 'c') || (yytext[0] == 'C'))) YY_FTN_REJECT; + } /* font class is defined e.g. in doxygen.css */ startFontClass("keywordflow"); codifyLines(yytext); @@ -777,7 +795,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA BEGIN(UseOnly); } <UseOnly>{BS},{BS} { codifyLines(yytext); } -<UseOnly>{BS}&{BS}"\n" { codifyLines(yytext); } +<UseOnly>{BS}&{BS}"\n" { codifyLines(yytext); YY_FTN_RESET} <UseOnly>{ID} { g_insideBody=TRUE; generateLink(*g_code, yytext); @@ -786,7 +804,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA } <Use,UseOnly>"\n" { unput(*yytext); - yy_pop_state(); + yy_pop_state();YY_FTN_RESET } /*-------- fortran module -----------------------------------------*/ @@ -797,7 +815,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA endFontClass(); yy_push_state(YY_START); BEGIN(ClassName); - if (!stricmp(yytext,"module")) currentModule="module"; + if (!qstricmp(yytext,"module")) currentModule="module"; } <ClassName>{ID} { if (currentModule == "module") @@ -810,11 +828,11 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA } <ClassName>\n { // interface may be without name yy_pop_state(); - REJECT; + YY_FTN_REJECT; } <Start>"end"({BS_}"module").* { // just reset currentModule, rest is done in following rule currentModule=0; - REJECT; + YY_FTN_REJECT; } /*-------- subprog definition -------------------------------------*/ <Start>({PREFIX}{BS_})?{TYPE_SPEC}{BS_}({PREFIX}{BS_})?{BS}/{SUBPROG}{BS_} { // TYPE_SPEC is for old function style function result @@ -839,6 +857,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA } <Subprog,Subprogend>"\n" { codifyLines(yytext); yy_pop_state(); + YY_FTN_RESET } <Start>^{BS}"end"{BS}("block"{BS}"data"|{SUBPROG}|"module"|"program"|"type"|"interface"){BS} { // Fortran subroutine or function ends //cout << "===> end function " << yytext << endl; @@ -926,11 +945,13 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA codifyLines(yytext); bracketCount = 0; yy_pop_state(); + YY_FTN_RESET } <Declaration>"\n" { // end declaration line codifyLines(yytext); bracketCount = 0; yy_pop_state(); + YY_FTN_RESET } /*-------- subprog calls -----------------------------------------*/ @@ -954,6 +975,14 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA /*-------- comments ---------------------------------------------------*/ <Start>\n?{BS}"!>"|"!<" { // start comment line or comment block + if (yytext[0] == '\n') + { + yy_old_start = 0; + yy_my_start = 1; + yy_end = yyleng; + } + // Actually we should see if ! on position 6, can be continuation + // but the chance is very unlikely, so no effort to solve it here yy_push_state(YY_START); BEGIN(DocBlock); docBlock=yytext; @@ -967,7 +996,12 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA <DocBlock>.* { // contents of current comment line docBlock+=yytext; } -<DocBlock>"\n"{BS}("!>"|"!<"|"!!") { //| comment block (next line is also comment line) +<DocBlock>"\n"{BS}("!>"|"!<"|"!!") { // comment block (next line is also comment line) + yy_old_start = 0; + yy_my_start = 1; + yy_end = yyleng; + // Actually we should see if ! on position 6, can be continuation + // but the chance is very unlikely, so no effort to solve it here docBlock+=yytext; } <DocBlock>"\n" { // comment block ends at the end of this line @@ -989,17 +1023,19 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA endFontClass(); } yy_pop_state(); + YY_FTN_RESET } <*>"!"[^><\n].*|"!"$ { // normal comment - if(YY_START == String) REJECT; // ignore in strings + if(YY_START == String) YY_FTN_REJECT; // ignore in strings + if (g_isFixedForm && yy_my_start == 6) YY_FTN_REJECT; startFontClass("comment"); codifyLines(yytext); endFontClass(); } <*>^[Cc*].* { // normal comment - if(! g_isFixedForm) REJECT; + if(! g_isFixedForm) YY_FTN_REJECT; startFontClass("comment"); codifyLines(yytext); @@ -1007,9 +1043,12 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA } /*------ preprocessor --------------------------------------------*/ -<Start>"#".*\n { startFontClass("preprocessor"); +<Start>"#".*\n { + if (g_isFixedForm && yy_my_start == 6) YY_FTN_REJECT; + startFontClass("preprocessor"); codifyLines(yytext); endFontClass(); + YY_FTN_RESET } /*------ variable references? -------------------------------------*/ @@ -1031,9 +1070,10 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA codifyLines(str); endFontClass(); str = ""; + YY_FTN_RESET } <String>\"|\' { // string ends with next quote without previous backspace - if(yytext[0]!=stringStartSymbol) REJECT; // single vs double quote + if(yytext[0]!=stringStartSymbol) YY_FTN_REJECT; // single vs double quote str+=yytext; startFontClass("stringliteral"); codifyLines(str); @@ -1043,7 +1083,8 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA <String>. {str+=yytext;} <*>\"|\' { /* string starts */ - /* if(YY_START == StrIgnore) REJECT; // ignore in simple comments */ + /* if(YY_START == StrIgnore) YY_FTN_REJECT; // ignore in simple comments */ + if (g_isFixedForm && yy_my_start == 6) YY_FTN_REJECT; yy_push_state(YY_START); stringStartSymbol=yytext[0]; // single or double quote BEGIN(String); @@ -1053,6 +1094,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA <*>\n { codifyLines(yytext); + YY_FTN_RESET } <*>. { g_code->codify(yytext); diff --git a/src/fortranscanner.h b/src/fortranscanner.h index d904b87..83f7c3e 100644 --- a/src/fortranscanner.h +++ b/src/fortranscanner.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/fortranscanner.l b/src/fortranscanner.l index 3a7a8c1..d59b32b 100644 --- a/src/fortranscanner.l +++ b/src/fortranscanner.l @@ -74,7 +74,7 @@ enum InterfaceType { IF_NONE, IF_SPECIFIC, IF_GENERIC, IF_ABSTRACT }; // {{{ ----- Helper structs ----- //! Holds modifiers (ie attributes) for one symbol (variable, function, etc) struct SymbolModifiers { - enum Protection {NONE_P, PUBLIC, PRIVATE}; + enum Protection {NONE_P, PUBLIC, PRIVATE, PROTECTED}; enum Direction {NONE_D, IN, OUT, INOUT}; //!< This is only used with function return value. @@ -252,8 +252,8 @@ CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS})) TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS_}COMPLEX|DOUBLE{BS_}PRECISION|{CHAR}|TYPE{ARGS}|CLASS{ARGS}|PROCEDURE{ARGS}?) INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")" -ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS}?|DEFERRED|NON_OVERRIDABLE) -ACCESS_SPEC (PRIVATE|PUBLIC) +ATTR_SPEC (ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS}?|DEFERRED|NON_OVERRIDABLE) +ACCESS_SPEC (PROTECTED|PRIVATE|PUBLIC) LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")" /* Assume that attribute statements are almost the same as attributes. */ ATTR_STMT {ATTR_SPEC}|DIMENSION|{ACCESS_SPEC} @@ -545,6 +545,9 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA /*------- access specification --------------------------------------------------------------------------*/ +<ModuleBody>protected/{BS}(\n|"!") { defaultProtection = Protected; + current->protection = defaultProtection ; + } <ModuleBody>private/{BS}(\n|"!") { defaultProtection = Private; current->protection = defaultProtection ; } @@ -586,6 +589,10 @@ private { current->protection = Private; typeProtection = Private; } +protected { + current->protection = Protected; + typeProtection = Protected; + } {LANGUAGE_BIND_SPEC} { /* ignored for now */ } @@ -1527,6 +1534,10 @@ SymbolModifiers& SymbolModifiers::operator|=(QCString mdfString) { newMdf.protection = SymbolModifiers::PRIVATE; } + else if (mdfString=="protected") + { + newMdf.protection = SymbolModifiers::PROTECTED; + } else if (mdfString=="optional") { newMdf.optional = TRUE; @@ -1717,6 +1728,11 @@ static QCString applyModifiers(QCString typeName, SymbolModifiers& mdfs) if (!typeName.isEmpty()) typeName += ", "; typeName += "private"; } + else if (mdfs.protection == SymbolModifiers::PROTECTED) + { + if (!typeName.isEmpty()) typeName += ", "; + typeName += "protected"; + } return typeName; } @@ -1738,6 +1754,8 @@ static void applyModifiers(Entry *ent, SymbolModifiers& mdfs) ent->protection = Public; else if (mdfs.protection == SymbolModifiers::PRIVATE) ent->protection = Private; + else if (mdfs.protection == SymbolModifiers::PROTECTED) + ent->protection = Protected; } /*! Starts the new scope in fortran program. Consider using this function when diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index 5727647..dd3c3d1 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -1,7 +1,7 @@ /****************************************************************************** * ftvhelp.cpp,v 1.0 2000/09/06 16:09:00 * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/ftvhelp.h b/src/ftvhelp.h index d3ba3b9..9794d8b 100644 --- a/src/ftvhelp.h +++ b/src/ftvhelp.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/groupdef.cpp b/src/groupdef.cpp index 96f839e..ef73830 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -89,7 +89,7 @@ GroupDef::~GroupDef() void GroupDef::setGroupTitle( const char *t ) { - if ( t && strlen(t) ) + if ( t && qstrlen(t) ) { title = t; titleSet = TRUE; diff --git a/src/groupdef.h b/src/groupdef.h index 3978397..bd53ff5 100644 --- a/src/groupdef.h +++ b/src/groupdef.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -161,7 +161,7 @@ class GroupSDict : public SDict<GroupDef> virtual ~GroupSDict() {} int compareItems(QCollection::Item item1,QCollection::Item item2) { - return strcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle()); + return qstrcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle()); } }; @@ -171,7 +171,7 @@ class GroupList : public QList<GroupDef> public: int compareItems(QCollection::Item item1,QCollection::Item item2) { - return strcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle()); + return qstrcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle()); } }; diff --git a/src/header.html b/src/header.html index 0a0194b..70305df 100644 --- a/src/header.html +++ b/src/header.html @@ -6,13 +6,13 @@ <meta name="generator" content="Doxygen $doxygenversion"/> <!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME--> <!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME--> -<link href="$relpath$tabs.css" rel="stylesheet" type="text/css"/> -<script type="text/javascript" src="$relpath$jquery.js"></script> -<script type="text/javascript" src="$relpath$dynsections.js"></script> +<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/> +<script type="text/javascript" src="$relpath^jquery.js"></script> +<script type="text/javascript" src="$relpath^dynsections.js"></script> $treeview $search $mathjax -<link href="$relpath$$stylesheet" rel="stylesheet" type="text/css" /> +<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" /> $extrastylesheet </head> <body> @@ -24,7 +24,7 @@ $extrastylesheet <tbody> <tr style="height: 56px;"> <!--BEGIN PROJECT_LOGO--> - <td id="projectlogo"><img alt="Logo" src="$relpath$$projectlogo"/></td> + <td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td> <!--END PROJECT_LOGO--> <!--BEGIN PROJECT_NAME--> <td style="padding-left: 0.5em;"> diff --git a/src/header_html.h b/src/header_html.h index 505960a..62960d6 100644 --- a/src/header_html.h +++ b/src/header_html.h @@ -6,13 +6,13 @@ "<meta name=\"generator\" content=\"Doxygen $doxygenversion\"/>\n" "<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->\n" "<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->\n" -"<link href=\"$relpath$tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n" -"<script type=\"text/javascript\" src=\"$relpath$jquery.js\"></script>\n" -"<script type=\"text/javascript\" src=\"$relpath$dynsections.js\"></script>\n" +"<link href=\"$relpath^tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n" +"<script type=\"text/javascript\" src=\"$relpath^jquery.js\"></script>\n" +"<script type=\"text/javascript\" src=\"$relpath^dynsections.js\"></script>\n" "$treeview\n" "$search\n" "$mathjax\n" -"<link href=\"$relpath$$stylesheet\" rel=\"stylesheet\" type=\"text/css\" />\n" +"<link href=\"$relpath^$stylesheet\" rel=\"stylesheet\" type=\"text/css\" />\n" "$extrastylesheet\n" "</head>\n" "<body>\n" @@ -24,7 +24,7 @@ " <tbody>\n" " <tr style=\"height: 56px;\">\n" " <!--BEGIN PROJECT_LOGO-->\n" -" <td id=\"projectlogo\"><img alt=\"Logo\" src=\"$relpath$$projectlogo\"/></td>\n" +" <td id=\"projectlogo\"><img alt=\"Logo\" src=\"$relpath^$projectlogo\"/></td>\n" " <!--END PROJECT_LOGO-->\n" " <!--BEGIN PROJECT_NAME-->\n" " <td style=\"padding-left: 0.5em;\">\n" diff --git a/src/htags.cpp b/src/htags.cpp index 2acceb8..896f304 100644 --- a/src/htags.cpp +++ b/src/htags.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/htags.h b/src/htags.h index 4a164a6..474b098 100644 --- a/src/htags.h +++ b/src/htags.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/htmlattrib.h b/src/htmlattrib.h index b391861..6e9b62d 100644 --- a/src/htmlattrib.h +++ b/src/htmlattrib.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 3c06837..3b3bb31 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -478,31 +478,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s) if (Config_getBool("DOT_CLEANUP")) file.remove(); } break; -#if 0 - case DocVerbatim::Vhdf: - if (VhdlDocGen::getFlowMember()) // use VHDL flow chart creator - { - QCString fname=FlowNode::convertNameToFileName(); - // fprintf(stderr,"\n create flow mem %s \n",fname.data()); - //m_t << "<div align=\"left\">" << endl; // TODO: use CSS - m_t << "<p>"; - m_t << "flowchart: " ; // TODO: translate me - m_t << "<a href=\""; - m_t << fname.data(); - m_t << ".svg\">"; - m_t << VhdlDocGen::getFlowMember()->name().data(); - m_t << "</a>"; - if (!s->text().isEmpty()) - { - m_t << "<br/>"; - m_t << s->text().data(); - } - m_t << "</p>"; - VhdlDocGen::setFlowMember(NULL); - } - break; -#endif - case DocVerbatim::Msc: + case DocVerbatim::Msc: { forceEndParagraph(s); @@ -1796,7 +1772,7 @@ void HtmlDocVisitor::visitPre(DocVhdlFlow *vf) if (VhdlDocGen::getFlowMember()) // use VHDL flow chart creator { forceEndParagraph(vf); - QCString fname=FlowNode::convertNameToFileName(); + QCString fname=FlowChart::convertNameToFileName(); m_t << "<p>"; m_t << "flowchart: " ; // TODO: translate me m_t << "<a href=\""; @@ -1880,6 +1856,7 @@ void HtmlDocVisitor::startLink(const QCString &ref,const QCString &file, const QCString &relPath,const QCString &anchor, const QCString &tooltip) { + //printf("HtmlDocVisitor: file=%s anchor=%s\n",file.data(),anchor.data()); if (!ref.isEmpty()) // link to entity imported via tag file { m_t << "<a class=\"elRef\" "; diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h index 150493b..3624224 100644 --- a/src/htmldocvisitor.h +++ b/src/htmldocvisitor.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 90d9f84..f19f5d6 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -804,7 +804,7 @@ static void writeImgData(const char *dir,img_data_item *data) if (f.open(IO_WriteOnly)) { f.writeBlock((char*)data->content, - data->len>0 ? data->len : strlen((char*)data->content)); + data->len>0 ? data->len : qstrlen((char*)data->content)); } else { @@ -912,18 +912,18 @@ QCString substitute(const char *s,const char *src,const char *dst) { if (s==0 || src==0) return s; const char *p, *q; - int srcLen = strlen(src); - int dstLen = dst ? strlen(dst) : 0; + int srcLen = qstrlen(src); + int dstLen = dst ? qstrlen(dst) : 0; int resLen; if (srcLen!=dstLen) { int count; for (count=0, p=s; (q=strstr(p,src))!=0; p=q+srcLen) count++; - resLen = (int)(p-s)+strlen(p)+count*(dstLen-srcLen); + resLen = (int)(p-s)+qstrlen(p)+count*(dstLen-srcLen); } else // result has same size as s { - resLen = strlen(s); + resLen = qstrlen(s); } QCString result(resLen+1); char *r; @@ -935,7 +935,7 @@ QCString substitute(const char *s,const char *src,const char *dst) if (dst) memcpy(r,dst,dstLen); r+=dstLen; } - strcpy(r,p); + qstrcpy(r,p); //printf("substitute(%s,%s,%s)->%s\n",s,src,dst,result.data()); return result; } @@ -946,8 +946,8 @@ QCString clearBlock(const char *s,const char *begin,const char *end) { if (s==0 || begin==0 || end==0) return s; const char *p, *q; - int beginLen = strlen(begin); - int endLen = strlen(end); + int beginLen = qstrlen(begin); + int endLen = qstrlen(end); int resLen = 0; for (p=s; (q=strstr(p,begin))!=0; p=q+endLen) { @@ -959,7 +959,7 @@ QCString clearBlock(const char *s,const char *begin,const char *end) break; } } - resLen+=strlen(p); + resLen+=qstrlen(p); // resLen is the length of the string without the marked block QCString result(resLen+1); @@ -977,7 +977,7 @@ QCString clearBlock(const char *s,const char *begin,const char *end) break; } } - strcpy(r,p); + qstrcpy(r,p); return result; } //---------------------------------------------------------------------- @@ -1098,7 +1098,7 @@ static QCString substituteHtmlKeywords(const QCString &s, extraCssFile = Config_getString("HTML_EXTRA_STYLESHEET"); if (!extraCssFile.isEmpty()) { - extraCssText = "<link href=\"$relpath$"+stripPath(extraCssFile)+"\" rel=\"stylesheet\" type=\"text/css\"/>\n"; + extraCssText = "<link href=\"$relpath^"+stripPath(extraCssFile)+"\" rel=\"stylesheet\" type=\"text/css\"/>\n"; } if (timeStamp) { @@ -1110,9 +1110,9 @@ static QCString substituteHtmlKeywords(const QCString &s, if (treeView) { - treeViewCssJs = "<link href=\"$relpath$navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n" - "<script type=\"text/javascript\" src=\"$relpath$resize.js\"></script>\n" - "<script type=\"text/javascript\" src=\"$relpath$navtree.js\"></script>\n" + treeViewCssJs = "<link href=\"$relpath^navtree.css\" rel=\"stylesheet\" type=\"text/css\"/>\n" + "<script type=\"text/javascript\" src=\"$relpath^resize.js\"></script>\n" + "<script type=\"text/javascript\" src=\"$relpath^navtree.js\"></script>\n" "<script type=\"text/javascript\">\n" " $(document).ready(initResizable);\n" " $(window).load(resizeHeight);\n" @@ -1121,8 +1121,8 @@ static QCString substituteHtmlKeywords(const QCString &s, if (searchEngine) { - searchCssJs = "<link href=\"$relpath$search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"; - searchCssJs += "<script type=\"text/javascript\" src=\"$relpath$search/search.js\"></script>\n"; + searchCssJs = "<link href=\"$relpath^search/search.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"; + searchCssJs += "<script type=\"text/javascript\" src=\"$relpath^search/search.js\"></script>\n"; if (!serverBasedSearch) { @@ -1196,7 +1196,8 @@ static QCString substituteHtmlKeywords(const QCString &s, result = substitute(result,"$mathjax",mathJaxJs); result = substitute(result,"$generatedby",generatedBy); result = substitute(result,"$extrastylesheet",extraCssText); - result = substitute(result,"$relpath$",relPath); //<-- must be last + result = substitute(result,"$relpath$",relPath); //<-- obsolete: for backwards compatibility only + result = substitute(result,"$relpath^",relPath); //<-- must be last // additional HTML only conditional blocks result = selectBlock(result,"DISABLE_INDEX",disableIndex); @@ -1361,7 +1362,7 @@ void HtmlCodeGenerator::writeCodeLink(const char *ref,const char *f, m_t << ">"; docify(name); m_t << "</a>"; - m_col+=strlen(name); + m_col+=qstrlen(name); } void HtmlCodeGenerator::startCodeLine(bool hasLineNumbers) @@ -2926,7 +2927,7 @@ void HtmlGenerator::writeSplitBar(const char *name) void HtmlGenerator::writeNavigationPath(const char *s) { - t << substitute(s,"$relpath$",relPath); + t << substitute(s,"$relpath^",relPath); } void HtmlGenerator::startContents() @@ -3108,17 +3109,8 @@ void HtmlGenerator::writeExternalSearchPage() << "\"" << theTranslator->trSearchResults(2) << "\"];" << endl; t << "var serverUrl=\"" << Config_getString("SEARCHENGINE_URL") << "\";" << endl; t << "var tagMap = {" << endl; - // add standard tag file mappings - QDictIterator<QCString> it(Doxygen::tagDestinationDict); - QCString *dest; bool first=TRUE; - for (it.toFirst();(dest=it.current());++it) - { - if (!first) t << "," << endl; - t << " \"" << it.currentKey() << "\": \"" << *dest << "\""; - first=FALSE; - } - // add additional user specified mappings + // add search mappings QStrList &extraSearchMappings = Config_getList("EXTRA_SEARCH_MAPPINGS"); char *ml=extraSearchMappings.first(); while (ml) @@ -3129,7 +3121,7 @@ void HtmlGenerator::writeExternalSearchPage() { QCString tagName = mapLine.left(eqPos).stripWhiteSpace(); QCString destName = mapLine.right(mapLine.length()-eqPos-1).stripWhiteSpace(); - if (!tagName.isEmpty() && Doxygen::tagDestinationDict.find(tagName)==0) + if (!tagName.isEmpty()) { if (!first) t << "," << endl; t << " \"" << tagName << "\": \"" << destName << "\""; diff --git a/src/htmlgen.h b/src/htmlgen.h index 17f12fb..0328a9c 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp index 945a7c5..2146e2f 100644 --- a/src/htmlhelp.cpp +++ b/src/htmlhelp.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -56,7 +56,7 @@ class IndexFieldSDict : public SDict<IndexField> ~IndexFieldSDict() {} int compareItems(QCollection::Item item1, QCollection::Item item2) { - return stricmp(((IndexField *)item1)->name,((IndexField *)item2)->name); + return qstricmp(((IndexField *)item1)->name,((IndexField *)item2)->name); } }; diff --git a/src/htmlhelp.h b/src/htmlhelp.h index 4b8064d..8ccbf28 100644 --- a/src/htmlhelp.h +++ b/src/htmlhelp.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/image.cpp b/src/image.cpp index 2293d1f..49485af 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/image.h b/src/image.h index 5fb98e6..d2311a1 100644 --- a/src/image.h +++ b/src/image.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/index.cpp b/src/index.cpp index 2f9b06a..7eed60d 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -125,7 +125,7 @@ class MemberIndexList : public QList<MemberDef> { MemberDef *md1=(MemberDef *)item1; MemberDef *md2=(MemberDef *)item2; - return stricmp(md1->name(),md2->name()); + return qstricmp(md1->name(),md2->name()); } }; @@ -1384,13 +1384,13 @@ void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalO ftv->addContentsItem(count>0,cd->displayName(FALSE),cd->getReference(), cd->getOutputFileBase(),cd->anchor(),FALSE,TRUE,cd); if (addToIndex && - cd->partOfGroups()==0 && + /*cd->partOfGroups()==0 &&*/ (cd->getOuterScope()==0 || cd->getOuterScope()->definitionType()!=Definition::TypeClass ) ) { - addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor()); + addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor(),cd->partOfGroups()==0); } if (count>0) { @@ -1461,7 +1461,7 @@ static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv, file = nd->getOutputFileBase(); if (nd->getLanguage()==SrcLangExt_VHDL) // UGLY HACK { - file=file.replace(0,strlen("namespace"),"class"); + file=file.replace(0,qstrlen("namespace"),"class"); } } @@ -1537,7 +1537,7 @@ static void writeNamespaceIndex(OutputList &ol) ol.startIndexKey(); if (nd->getLanguage()==SrcLangExt_VHDL) { - ol.writeObjectLink(0, nd->getOutputFileBase().replace(0,strlen("namespace"),"class"),0,nd->displayName()); + ol.writeObjectLink(0, nd->getOutputFileBase().replace(0,qstrlen("namespace"),"class"),0,nd->displayName()); } else { @@ -1722,7 +1722,7 @@ public: QCString n1 = c1->className(); QCString n2 = c2->className(); - return stricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2)); + return qstricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2)); } }; @@ -3907,35 +3907,38 @@ static void writeDirIndex(OutputList &ol) static void writeUserGroupStubPage(OutputList &ol,LayoutNavEntry *lne) { - ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Html); - startFile(ol,lne->baseFile(),0,lne->title(),HLI_UserGroup); - startTitle(ol,0); - ol.parseText(lne->title()); - endTitle(ol,0,0); - ol.startContents(); - QListIterator<LayoutNavEntry> li(lne->children()); - LayoutNavEntry *entry; - int count=0; - for (li.toFirst();(entry=li.current());++li) - { - if (entry->visible()) count++; - } - if (count>0) + if (lne->baseFile().left(9)=="usergroup") { - ol.writeString("<ul>\n"); + ol.pushGeneratorState(); + ol.disableAllBut(OutputGenerator::Html); + startFile(ol,lne->baseFile(),0,lne->title(),HLI_UserGroup); + startTitle(ol,0); + ol.parseText(lne->title()); + endTitle(ol,0,0); + ol.startContents(); + QListIterator<LayoutNavEntry> li(lne->children()); + LayoutNavEntry *entry; + int count=0; for (li.toFirst();(entry=li.current());++li) { - if (entry->visible()) + if (entry->visible()) count++; + } + if (count>0) + { + ol.writeString("<ul>\n"); + for (li.toFirst();(entry=li.current());++li) { - ol.writeString("<li><a href=\""+entry->url()+"\"><span>"+ - fixSpaces(entry->title())+"</span></a></li>\n"); + if (entry->visible()) + { + ol.writeString("<li><a href=\""+entry->url()+"\"><span>"+ + fixSpaces(entry->title())+"</span></a></li>\n"); + } } + ol.writeString("</ul>\n"); } - ol.writeString("</ul>\n"); + endFile(ol); + ol.popGeneratorState(); } - endFile(ol); - ol.popGeneratorState(); } //---------------------------------------------------------------------------- @@ -3945,13 +3948,14 @@ static void writeIndex(OutputList &ol) { static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + static QCString projectName = Config_getString("PROJECT_NAME"); // save old generator state ol.pushGeneratorState(); QCString projPrefix; - if (!Config_getString("PROJECT_NAME").isEmpty()) + if (!projectName.isEmpty()) { - projPrefix=Config_getString("PROJECT_NAME")+" "; + projPrefix=projectName+" "; } //-------------------------------------------------------------------- @@ -3979,8 +3983,8 @@ static void writeIndex(OutputList &ol) if (Doxygen::mainPage) { - if (/*Doxygen::mainPage->hasSubPages() || */ - (!Config_getString("PROJECT_NAME").isEmpty() && mainPageHasTitle()) + if ( + (!projectName.isEmpty() && mainPageHasTitle() && qstricmp(title,projectName)!=0) ) // to avoid duplicate entries in the treeview { Doxygen::indexList->addContentsItem(Doxygen::mainPage->hasSubPages(),title,0,indexName,0,Doxygen::mainPage->hasSubPages(),TRUE); @@ -4014,7 +4018,7 @@ static void writeIndex(OutputList &ol) } else { - if (!Config_getString("PROJECT_NAME").isEmpty()) + if (!projectName.isEmpty()) { ol.startHeaderSection(); ol.startTitleHead(0); @@ -4391,18 +4395,40 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry { // prepend a ! or ^ marker to the URL to avoid tampering with it QCString url = correctURL(lne->url(),"!"); // add ! to relative URL - if (!url.isEmpty() && url.at(0)!='!') // absolute URL + bool isRelative=url.at(0)=='!'; + if (!url.isEmpty() && !isRelative) // absolute URL { url.prepend("^"); // prepend ^ to absolute URL } bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref"; - Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,url,0,FALSE,isRef); + Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,url,0,FALSE,isRef || isRelative); } break; case LayoutNavEntry::UserGroup: if (addToIndex) { - Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,lne->baseFile(),0,TRUE,TRUE); + QCString url = correctURL(lne->url(),"!"); // add ! to relative URL + if (!url.isEmpty()) + { + if (url=="![none]") + { + Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,0,0,FALSE,FALSE); + } + else + { + bool isRelative=url.at(0)=='!'; + if (!isRelative) // absolute URL + { + url.prepend("^"); // prepend ^ to absolute URL + } + bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref"; + Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,url,0,FALSE,isRef || isRelative); + } + } + else + { + Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,lne->baseFile(),0,TRUE,TRUE); + } Doxygen::indexList->incContentsDepth(); needsClosing=TRUE; } diff --git a/src/index.h b/src/index.h index fa3c8fe..ae15f16 100644 --- a/src/index.h +++ b/src/index.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/language.cpp b/src/language.cpp index d7a95ca..00386e1 100644 --- a/src/language.cpp +++ b/src/language.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -150,7 +150,7 @@ #endif #endif // !ENGLISH_ONLY -#define L_EQUAL(a) !stricmp(langName,a) +#define L_EQUAL(a) !qstricmp(langName,a) Translator *theTranslator=0; diff --git a/src/language.h b/src/language.h index 17f5800..9550cb9 100644 --- a/src/language.h +++ b/src/language.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index f3610a3..91f585c 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1665,7 +1665,16 @@ void LatexDocVisitor::startDotFile(const QCString &fileName, { m_t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]"; } - m_t << "{" << baseName << "}"; + m_t << "{" << baseName; + //if (Config_getBool("USE_PDFLATEX")) + //{ + // m_t << ".pdf"; + //} + //else + //{ + // m_t << ".eps"; + //} + m_t << "}"; if (hasCaption) { @@ -1729,7 +1738,16 @@ void LatexDocVisitor::startMscFile(const QCString &fileName, { m_t << "[width=\\textwidth,height=\\textheight/2,keepaspectratio=true]"; } - m_t << "{" << baseName << "}"; + m_t << "{" << baseName; + //if (Config_getBool("USE_PDFLATEX")) + //{ + // m_t << ".pdf"; + //} + //else + //{ + // m_t << ".eps"; + //} + m_t << "}"; if (hasCaption) { diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h index 4745800..3fea33c 100644 --- a/src/latexdocvisitor.h +++ b/src/latexdocvisitor.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 8a7555d..e06a3a2 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -983,12 +983,12 @@ void LatexGenerator::writeStyleSheetFile(QFile &f) t << theTranslator->trGeneratedAt( dateToString(TRUE), projectName ); t << " doxygen"; //t << " " << theTranslator->trWrittenBy() << " "; - //t << "Dimitri van Heesch \\copyright~1997-2012"; + //t << "Dimitri van Heesch \\copyright~1997-2013"; writeDefaultStyleSheetPart2(t); t << theTranslator->trGeneratedAt( dateToString(TRUE), projectName ); t << " doxygen"; //t << " << theTranslator->trWrittenBy() << " "; - //t << "Dimitri van Heesch \\copyright~1997-2012"; + //t << "Dimitri van Heesch \\copyright~1997-2013"; writeDefaultStyleSheetPart3(t); } @@ -1658,7 +1658,7 @@ void LatexGenerator::writeCodeLink(const char *ref,const char *f, { static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS"); static bool usePDFLatex = Config_getBool("USE_PDFLATEX"); - int l = strlen(name); + int l = qstrlen(name); if (col+l>80) { t << "\n "; @@ -2433,7 +2433,7 @@ void LatexGenerator::escapeLabelName(const char *s) if (s==0) return; const char *p=s; char c; - QCString result(strlen(s)+1); // worst case allocation + QCString result(qstrlen(s)+1); // worst case allocation int i; while ((c=*p++)) { @@ -2462,7 +2462,7 @@ void LatexGenerator::escapeMakeIndexChars(const char *s) if (s==0) return; const char *p=s; char c; - QCString result(strlen(s)+1); // worst case allocation + QCString result(qstrlen(s)+1); // worst case allocation int i; while ((c=*p++)) { diff --git a/src/latexgen.h b/src/latexgen.h index 76069d3..cbfdde6 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/layout.cpp b/src/layout.cpp index d1e02ac..93194c8 100644 --- a/src/layout.cpp +++ b/src/layout.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -96,7 +96,8 @@ LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind, QCString LayoutNavEntry::url() const { QCString url = baseFile().stripWhiteSpace(); - if (kind()!=LayoutNavEntry::User) + if ((kind()!=LayoutNavEntry::User && kind()!=LayoutNavEntry::UserGroup) || + (kind()==LayoutNavEntry::UserGroup && url.left(9)=="usergroup")) { url+=Doxygen::htmlFileExtension; } @@ -1073,7 +1074,14 @@ class LayoutParser : public QXmlDefaultHandler } else if (kind==LayoutNavEntry::UserGroup) { - baseFile+=QCString().sprintf("%d",m_userGroupCount++); + if (!url.isEmpty()) + { + baseFile=url; + } + else + { + baseFile+=QCString().sprintf("%d",m_userGroupCount++); + } } // create new item and make it the new root m_rootNav = new LayoutNavEntry(m_rootNav,kind,kind==LayoutNavEntry::MainPage?TRUE:isVisible,baseFile,title,intro); diff --git a/src/layout.h b/src/layout.h index 830ee70..a40d0b0 100644 --- a/src/layout.h +++ b/src/layout.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/libdoxycfg.pro.in b/src/libdoxycfg.pro.in index 800c373..6a63828 100644 --- a/src/libdoxycfg.pro.in +++ b/src/libdoxycfg.pro.in @@ -1,7 +1,7 @@ # # # -# Copyright (C) 1997-2012 by Dimitri van Heesch. +# Copyright (C) 1997-2013 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 diff --git a/src/libdoxycfg.t.in b/src/libdoxycfg.t.in index 29b1623..4f885a7 100644 --- a/src/libdoxycfg.t.in +++ b/src/libdoxycfg.t.in @@ -1,7 +1,7 @@ # # # -# Copyright (C) 1997-2012 by Dimitri van Heesch. +# Copyright (C) 1997-2013 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 diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in index 39d303a..47aaa34 100644 --- a/src/libdoxygen.pro.in +++ b/src/libdoxygen.pro.in @@ -1,7 +1,7 @@ # # # -# Copyright (C) 1997-2012 by Dimitri van Heesch. +# Copyright (C) 1997-2013 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 diff --git a/src/libdoxygen.t.in b/src/libdoxygen.t.in index e11e010..53628dd 100644 --- a/src/libdoxygen.t.in +++ b/src/libdoxygen.t.in @@ -1,7 +1,7 @@ # # # -# Copyright (C) 1997-2012 by Dimitri van Heesch. +# Copyright (C) 1997-2013 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 diff --git a/src/lockingptr.h b/src/lockingptr.h index 5fc328d..024758f 100644 --- a/src/lockingptr.h +++ b/src/lockingptr.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/logos.cpp b/src/logos.cpp index 120a449..6aea996 100644 --- a/src/logos.cpp +++ b/src/logos.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/logos.h b/src/logos.h index 3050819..13406e1 100644 --- a/src/logos.h +++ b/src/logos.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/main.cpp b/src/main.cpp index dd1ea1e..09798ec 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index 38a3ab3..db401bb 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h index d595644..cc4e85f 100644 --- a/src/mandocvisitor.h +++ b/src/mandocvisitor.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/mangen.cpp b/src/mangen.cpp index cea01ce..6d11df9 100644 --- a/src/mangen.cpp +++ b/src/mangen.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/mangen.h b/src/mangen.h index f40d0c3..577e634 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/markdown.cpp b/src/markdown.cpp index 15b36a3..0f6a4fe 100644 --- a/src/markdown.cpp +++ b/src/markdown.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -291,7 +291,7 @@ static int findEmphasisChar(const char *data, int size, char c, int c_size) if ((data[i]=='\\' || data[i]=='@') && // command data[i-1]!='\\' && data[i-1]!='@') // not escaped { - if (strncmp(&data[i+1],endBlockName,l)==0) + if (qstrncmp(&data[i+1],endBlockName,l)==0) { break; } @@ -960,7 +960,7 @@ static int processSpecialCommand(GrowBuf &out, const char *data, int offset, int if ((data[i]=='\\' || data[i]=='@') && // command data[i-1]!='\\' && data[i-1]!='@') // not escaped { - if (strncmp(&data[i+1],endBlockName,l)==0) + if (qstrncmp(&data[i+1],endBlockName,l)==0) { //printf("found end at %d\n",i); out.addStr(data,i+1+l); @@ -1814,7 +1814,7 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size, data[end-1]!='\\' && data[end-1]!='@' ) { - if (strncmp(&data[end+1],endBlockName,l)==0) + if (qstrncmp(&data[end+1],endBlockName,l)==0) { if (pi!=-1) // output previous line if available { @@ -2212,10 +2212,10 @@ void MarkdownFileParser::parseInput(const char *fileName, current->lang = SrcLangExt_Markdown; current->fileName = fileName; current->docFile = fileName; - int len = strlen(fileBuf); + int len = qstrlen(fileBuf); BufStr input(len); BufStr output(len); - input.addArray(fileBuf,strlen(fileBuf)); + input.addArray(fileBuf,qstrlen(fileBuf)); input.addChar('\0'); convertCppComments(&input,&output,fileName); output.addChar('\0'); diff --git a/src/markdown.h b/src/markdown.h index f41de5e..a9f80ee 100644 --- a/src/markdown.h +++ b/src/markdown.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/marshal.h b/src/marshal.h index 3728339..49d58e4 100644 --- a/src/marshal.h +++ b/src/marshal.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/memberdef.cpp b/src/memberdef.cpp index 1482180..924b1e6 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -97,6 +97,39 @@ static QCString addTemplateNames(const QCString &s,const QCString &n,const QCStr return result; } +// ol.startMemberDocName has already been done before this is called. +// when this function returns TRUE, ol.endParameterList will be called. +// +// typical sequence: +// ol.startMemberDoc +// ol.startMemberDocName +// --- enter writeDefArgumentList +// ol.endMemberDocName +// ol.startParameterList +// ... +// ol.startParameterType(first=TRUE) +// ol.endParameterType +// ol.startParameterName +// ol.endParameterName(last==FALSE) +// ... +// ol.startParameterType(first=FALSE) +// ol.endParamtereType +// ol.startParameterName +// ol.endParameterName(last==TRUE) +// ... +// --- leave writeDefArgumentList with return value TRUE +// ol.endParameterList +// ol.endMemberDoc(hasArgs=TRUE) +// +// For an empty list the function should return FALSE, the sequence is +// ol.startMemberDoc +// ol.startMemberDocName +// --- enter writeDefArgumentList +// --- leave writeDefArgumentList with return value FALSE +// ol.endMemberDocName +// ol.endMemberDoc(hasArgs=FALSE); +// + static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, const QCString & /*scopeName*/,MemberDef *md) { @@ -112,7 +145,12 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, // simple argument list for tcl if (md->getLanguage()==SrcLangExt_Tcl) { + if (defArgList->count()==0) return FALSE; Argument *a=defArgList->first(); + ol.endMemberDocName(); + ol.startParameterList(FALSE); + ol.startParameterType(TRUE,0); + ol.endParameterType(); ol.startParameterName(FALSE); while (a) { @@ -126,8 +164,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, } a=defArgList->next(); } - ol.endParameterName(FALSE,FALSE,FALSE); - ol.endMemberDocName(); + ol.endParameterName(TRUE,FALSE,FALSE); return TRUE; } @@ -1733,6 +1770,7 @@ void MemberDef::writeDeclaration(OutputList &ol, { ol.startTextLink(0,anchor()); } + ol.parseText(theTranslator->trMore()); ol.endTextLink(); //ol.startEmphasis(); ol.popGeneratorState(); @@ -2874,7 +2912,7 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container) const char **p = prefixes; while (*p) { - int l=strlen(*p); + int l=qstrlen(*p); if (ts.left(l)==*p) { ol.writeString(*p); diff --git a/src/memberdef.h b/src/memberdef.h index 8727302..47c79bd 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/membergroup.cpp b/src/membergroup.cpp index e7ce2b5..61907e5 100644 --- a/src/membergroup.cpp +++ b/src/membergroup.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/membergroup.h b/src/membergroup.h index 84b7d32..64a521b 100644 --- a/src/membergroup.h +++ b/src/membergroup.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/memberlist.cpp b/src/memberlist.cpp index 5a36ef8..3235b6c 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -67,7 +67,7 @@ int MemberList::compareItems(QCollection::Item item1, QCollection::Item item2) else if (ord2 > ord1) return 1; } - int cmp = stricmp(c1->name(),c2->name()); + int cmp = qstricmp(c1->name(),c2->name()); return cmp!=0 ? cmp : c1->getDefLine()-c2->getDefLine(); } @@ -926,7 +926,7 @@ int MemberSDict::compareItems(QCollection::Item item1, QCollection::Item item2) MemberDef *c1=(MemberDef *)item1; MemberDef *c2=(MemberDef *)item2; //printf("MemberSDict::compareItems(%s,%s)\n",c1->name().data(),c2->name().data()); - int cmp = stricmp(c1->name(),c2->name()); + int cmp = qstricmp(c1->name(),c2->name()); if (cmp) { return cmp; diff --git a/src/memberlist.h b/src/memberlist.h index a047300..e0d948f 100644 --- a/src/memberlist.h +++ b/src/memberlist.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/membername.cpp b/src/membername.cpp index 324db7f..58eaf8c 100644 --- a/src/membername.cpp +++ b/src/membername.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -39,9 +39,9 @@ int MemberName::compareItems(QCollection::Item item1, QCollection::Item item2) FileDef *f1=m1->getFileDef(); FileDef *f2=m2->getFileDef(); if (c1 && c2) - return strcmp(c1->name(),c2->name()); + return qstrcmp(c1->name(),c2->name()); else if (f1 && f2) - return strcmp(f1->name(),f2->name()); + return qstrcmp(f1->name(),f2->name()); else return 0; } @@ -61,9 +61,9 @@ int MemberNameInfo::compareItems(QCollection::Item item1, QCollection::Item item FileDef *f1=m1->memberDef->getFileDef(); FileDef *f2=m2->memberDef->getFileDef(); if (c1 && c2) - return strcmp(c1->name(),c2->name()); + return qstrcmp(c1->name(),c2->name()); else if (f1 && f2) - return strcmp(f1->name(),f2->name()); + return qstrcmp(f1->name(),f2->name()); else return 0; } @@ -76,7 +76,7 @@ int MemberNameSDict::compareItems(QCollection::Item item1, QCollection::Item ite { MemberName *n1=(MemberName *)item1; MemberName *n2=(MemberName *)item2; - return stricmp(n1->memberName()+getPrefixIndex(n1->memberName()), + return qstricmp(n1->memberName()+getPrefixIndex(n1->memberName()), n2->memberName()+getPrefixIndex(n2->memberName()) ); } diff --git a/src/membername.h b/src/membername.h index 2abcbf3..0004aea 100644 --- a/src/membername.h +++ b/src/membername.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -94,7 +94,7 @@ class MemberNameInfoSDict : public SDict<MemberNameInfo> MemberNameInfoSDict(int size) : SDict<MemberNameInfo>(size) {} ~MemberNameInfoSDict() {} int compareItems(QCollection::Item item1,QCollection::Item item2) - { return stricmp( + { return qstricmp( ((MemberNameInfo *)item1)->memberName(), ((MemberNameInfo *)item2)->memberName() ); diff --git a/src/message.cpp b/src/message.cpp index ed438bb..60cb861 100644 --- a/src/message.cpp +++ b/src/message.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/message.h b/src/message.h index 46b736c..acdbaff 100644 --- a/src/message.h +++ b/src/message.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/msc.cpp b/src/msc.cpp index fadbc0c..e87c16f 100644 --- a/src/msc.cpp +++ b/src/msc.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -50,7 +50,7 @@ static bool convertMapFile(QTextStream &t,const char *mapName,const QCString rel int numBytes = f.readLine(buf,maxLineLen); buf[numBytes-1]='\0'; //printf("ReadLine `%s'\n",buf); - if (strncmp(buf,"rect",4)==0) + if (qstrncmp(buf,"rect",4)==0) { // obtain the url and the coordinates in the order used by graphviz-1.5 sscanf(buf,"rect %s %d,%d %d,%d",url,&x1,&y1,&x2,&y2); @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index c57c7ca..b7a6397 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/namespacedef.h b/src/namespacedef.h index 8458a78..9bc4fea 100644 --- a/src/namespacedef.h +++ b/src/namespacedef.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -130,7 +130,7 @@ class NamespaceList : public QList<NamespaceDef> ~NamespaceList() {} int compareItems(QCollection::Item item1,QCollection::Item item2) { - return stricmp(((NamespaceDef *)item1)->name(), + return qstricmp(((NamespaceDef *)item1)->name(), ((NamespaceDef *)item2)->name() ); } @@ -160,7 +160,7 @@ class NamespaceSDict : public SDict<NamespaceDef> ~NamespaceSDict() {} int compareItems(QCollection::Item item1,QCollection::Item item2) { - return stricmp(((NamespaceDef *)item1)->name(), + return qstricmp(((NamespaceDef *)item1)->name(), ((NamespaceDef *)item2)->name() ); } diff --git a/src/objcache.cpp b/src/objcache.cpp index 4258397..989811a 100644 --- a/src/objcache.cpp +++ b/src/objcache.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -19,6 +19,9 @@ #include <assert.h> #include <qglobal.h> #include "objcache.h" +#if !defined(_OS_WIN32_) +#include <stdint.h> +#endif //---------------------------------------------------------------------- @@ -189,7 +192,7 @@ unsigned int ObjCache::hash(void *addr) else { // Thomas Wang's 32 bit Mix Function - unsigned long key = (unsigned long)addr; + uintptr_t key = (uintptr_t)addr; key += ~(key << 15); key ^= (key >> 10); key += (key << 3); diff --git a/src/objcache.h b/src/objcache.h index 71e7178..d93c1f6 100644 --- a/src/objcache.h +++ b/src/objcache.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/outputgen.cpp b/src/outputgen.cpp index 13b6e62..89686e0 100644 --- a/src/outputgen.cpp +++ b/src/outputgen.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/outputgen.h b/src/outputgen.h index 8d67e3d..0fc7351 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/outputlist.cpp b/src/outputlist.cpp index 5ea2a21..d51b548 100644 --- a/src/outputlist.cpp +++ b/src/outputlist.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/outputlist.h b/src/outputlist.h index 23221d3..3ce6fe9 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/pagedef.cpp b/src/pagedef.cpp index 7fc4639..d553570 100644 --- a/src/pagedef.cpp +++ b/src/pagedef.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -179,10 +179,10 @@ void PageDef::writeDocumentation(OutputList &ol) if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { - bool found=FALSE; + bool found = name()=="citelist"; QDictIterator<RefList> rli(*Doxygen::xrefLists); RefList *rl; - for (rli.toFirst();(rl=rli.current());++rli) + for (rli.toFirst();(rl=rli.current()) && !found;++rli) { if (rl->listName()==name()) { diff --git a/src/pagedef.h b/src/pagedef.h index b73ed3b..4670ecd 100644 --- a/src/pagedef.h +++ b/src/pagedef.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -84,7 +84,7 @@ class PageSDict : public SDict<PageDef> virtual ~PageSDict() {} int compareItems(QCollection::Item i1,QCollection::Item i2) { - return stricmp(((PageDef *)i1)->name(),((PageDef *)i2)->name()); + return qstricmp(((PageDef *)i1)->name(),((PageDef *)i2)->name()); } }; diff --git a/src/parserintf.h b/src/parserintf.h index 7211274..fa9184c 100644 --- a/src/parserintf.h +++ b/src/parserintf.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 2a80f8f..9da834d 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 by Dimitri van Heesch. * Authors: Dimitri van Heesch, Miguel Lobo. * * Permission to use, copy, modify, and distribute this software and its diff --git a/src/perlmodgen.h b/src/perlmodgen.h index 4307d9b..7f593b2 100644 --- a/src/perlmodgen.h +++ b/src/perlmodgen.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/portable.cpp b/src/portable.cpp index 554bb0b..2083cbf 100644 --- a/src/portable.cpp +++ b/src/portable.cpp @@ -190,15 +190,15 @@ void portable_setenv(const char *name,const char *value) #else register char **ep = 0; register size_t size; - const size_t namelen=strlen(name); - const size_t vallen=strlen(value) + 1; + const size_t namelen=qstrlen(name); + const size_t vallen=qstrlen(value) + 1; size = 0; if (environ!=0) { for (ep = environ; *ep; ++ep) { - if (!strncmp (*ep, name, (uint)namelen) && + if (!qstrncmp (*ep, name, (uint)namelen) && (*ep)[namelen] == '=') break; else @@ -244,7 +244,7 @@ void portable_setenv(const char *name,const char *value) } else /* replace existing string */ { - size_t len = strlen (*ep); + size_t len = qstrlen (*ep); if (len + 1 < namelen + 1 + vallen) { /* The existing string is too short; malloc a new one. */ @@ -277,12 +277,12 @@ void portable_unsetenv(const char *variable) return; // not properly formatted } - len = strlen(variable); + len = qstrlen(variable); ep = environ; while (*ep != NULL) { - if (!strncmp(*ep, variable, (uint)len) && (*ep)[len]=='=') + if (!qstrncmp(*ep, variable, (uint)len) && (*ep)[len]=='=') { /* Found it. Remove this pointer by moving later ones back. */ char **dp = ep; @@ -304,7 +304,9 @@ const char *portable_getenv(const char *variable) portable_off_t portable_fseek(FILE *f,portable_off_t offset, int whence) { -#if defined(_WIN32) && !defined(__CYGWIN__) +#if defined(__MINGW32__) + return fseeko64(f,offset,whence); +#elif defined(_WIN32) && !defined(__CYGWIN__) return _fseeki64(f,offset,whence); #else return fseeko(f,offset,whence); @@ -313,7 +315,9 @@ portable_off_t portable_fseek(FILE *f,portable_off_t offset, int whence) portable_off_t portable_ftell(FILE *f) { -#if defined(_WIN32) && !defined(__CYGWIN__) +#if defined(__MINGW32__) + return ftello64(f); +#elif defined(_WIN32) && !defined(__CYGWIN__) return _ftelli64(f); #else return ftello(f); @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1200,7 +1200,7 @@ QCString removeIdsAndMarkers(const char *s) } else if (c=='d' && !inNum) // identifier starting with a `d' { - if (strncmp(p,"defined ",8)==0 || strncmp(p,"defined(",8)==0) + if (qstrncmp(p,"defined ",8)==0 || qstrncmp(p,"defined(",8)==0) // defined keyword { p+=7; // skip defined @@ -1481,7 +1481,6 @@ static inline void outputArray(const char *a,int len) static void readIncludeFile(const QCString &inc) { static bool searchIncludes = Config_getBool("SEARCH_INCLUDES"); - if (!searchIncludes) return; // do not read include files uint i=0; // find the start of the include file name @@ -1516,7 +1515,6 @@ static void readIncludeFile(const QCString &inc) // absIncFileName avoids difficulties for incFileName starting with "../" (bug 641336) QCString absIncFileName = incFileName; { - static bool searchIncludes = Config_getBool("SEARCH_INCLUDES"); QFileInfo fi(g_yyFileName); if (fi.exists()) { diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index 1138e8b..cb3daaa 100644 --- a/src/printdocvisitor.h +++ b/src/printdocvisitor.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/pycode.h b/src/pycode.h index e7c1b8b..7389985 100644 --- a/src/pycode.h +++ b/src/pycode.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/pycode.l b/src/pycode.l index df99758..ef4bb2a 100644 --- a/src/pycode.l +++ b/src/pycode.l @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/pyscanner.h b/src/pyscanner.h index ad7cfaa..8a6971f 100644 --- a/src/pyscanner.h +++ b/src/pyscanner.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/pyscanner.l b/src/pyscanner.l index 4e031bb..a2dc878 100644 --- a/src/pyscanner.l +++ b/src/pyscanner.l @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1155,36 +1155,38 @@ STARTDOCSYMS "##" <VariableDec>{ "=" { // the assignment operator //printf("====== VariableDec at line %d\n",yyLineNr); + current->initializer = yytext; + current->initializer += " "; } {B} { // spaces } {INTNUMBER} { // integer value current->type = "int"; - current->initializer = yytext; + current->initializer += yytext; BEGIN(VariableEnd); } {FLOATNUMBER} { // floating point value current->type = "float"; - current->initializer = yytext; + current->initializer += yytext; BEGIN(VariableEnd); } {STRINGPREFIX}?"'" { // string current->type = "string"; - current->initializer = yytext; + current->initializer += yytext; g_copyString=¤t->initializer; g_stringContext=VariableEnd; BEGIN( SingleQuoteString ); } {STRINGPREFIX}?"\"" { // string current->type = "string"; - current->initializer = yytext; + current->initializer += yytext; g_copyString=¤t->initializer; g_stringContext=VariableEnd; BEGIN( DoubleQuoteString ); } {TRIDOUBLEQUOTE} { // start of a comment block current->type = "string"; - current->initializer = yytext; + current->initializer += yytext; g_doubleQuote=TRUE; g_copyString=¤t->initializer; g_stringContext=VariableEnd; @@ -1193,7 +1195,7 @@ STARTDOCSYMS "##" {TRISINGLEQUOTE} { // start of a comment block current->type = "string"; - current->initializer = yytext; + current->initializer += yytext; g_doubleQuote=FALSE; g_copyString=¤t->initializer; g_stringContext=VariableEnd; @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/reflist.cpp b/src/reflist.cpp index 8f103d7..70bd9ba 100644 --- a/src/reflist.cpp +++ b/src/reflist.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/reflist.h b/src/reflist.h index a4a450e..3124582 100644 --- a/src/reflist.h +++ b/src/reflist.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -48,7 +48,7 @@ class SortedRefItems : public SDict<RefItem> { RefItem *r1 = (RefItem*)item1; RefItem *r2 = (RefItem*)item2; - return stricmp(r1->title,r2->title); + return qstricmp(r1->title,r2->title); } }; diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index d77a3d6..8d9cfc2 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h index 2ad0d23..eb841e5 100644 --- a/src/rtfdocvisitor.h +++ b/src/rtfdocvisitor.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index b51245c..4561cd2 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Parker Waechter & Dimitri van Heesch. + * Copyright (C) 1997-2013 by Parker Waechter & Dimitri van Heesch. * * Style sheet additions by Alexander Bartolich * diff --git a/src/rtfgen.h b/src/rtfgen.h index 784cfcc..82f42a3 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Parker Waechter & Dimitri van Heesch. + * Copyright (C) 1997-2013 by Parker Waechter & 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 diff --git a/src/rtfstyle.cpp b/src/rtfstyle.cpp index 1c565e1..2bede42 100644 --- a/src/rtfstyle.cpp +++ b/src/rtfstyle.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -394,9 +394,9 @@ bool StyleData::setStyle(const char* s, const char* styleName) } else if (*end == '\\') { - if (0 == strncmp(end, "\\snext", 6)) + if (0 == qstrncmp(end, "\\snext", 6)) break; - if (0 == strncmp(end, "\\sbasedon", 9)) + if (0 == qstrncmp(end, "\\sbasedon", 9)) break; if (0 != any_clause.match(end, 0, &len)) break; diff --git a/src/rtfstyle.h b/src/rtfstyle.h index ef7cb9a..52488f1 100644 --- a/src/rtfstyle.h +++ b/src/rtfstyle.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/scanner.h b/src/scanner.h index 7e3b2a3..5c226a1 100644 --- a/src/scanner.h +++ b/src/scanner.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/scanner.l b/src/scanner.l index 8efca45..3ed0e70 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -216,6 +216,9 @@ static void initParser() insideCode=FALSE; insideCli=Config_getBool("CPP_CLI_SUPPORT"); previous = 0; + firstTypedefEntry = 0; + tempEntry = 0; + memspecEntry =0; } static void initEntry() @@ -1198,7 +1201,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" roundCount=1; BEGIN( SkipRound ); } - else if (strncmp(yytext,"@property",9)==0) // ObjC 2.0 property + else if (qstrncmp(yytext,"@property",9)==0) // ObjC 2.0 property { current->mtype = mtype = Property; current->spec|=Entry::Readable | Entry::Writable | Entry::Assign; @@ -1255,17 +1258,17 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" { // skip annotation } - else if (strcmp(yytext,"@property")==0) // ObjC 2.0 property + else if (qstrcmp(yytext,"@property")==0) // ObjC 2.0 property { current->mtype = mtype = Property; current->spec|=Entry::Writable | Entry::Readable; current->protection = Public ; } - else if (strcmp(yytext,"@synthesize")==0) + else if (qstrcmp(yytext,"@synthesize")==0) { BEGIN( ObjCSkipStatement ); } - else if (strcmp(yytext,"@dynamic")==0) + else if (qstrcmp(yytext,"@dynamic")==0) { BEGIN( ObjCSkipStatement ); } @@ -2091,56 +2094,56 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" } <FindMembers,FindMemberName>{SCOPENAME} { lineCount(); - if (insideIDL && yyleng==9 && strcmp(yytext,"cpp_quote")==0) + if (insideIDL && yyleng==9 && qstrcmp(yytext,"cpp_quote")==0) { BEGIN(CppQuote); } - else if ((insideIDL || insideJava || insideD) && yyleng==6 && strcmp(yytext,"import")==0) + else if ((insideIDL || insideJava || insideD) && yyleng==6 && qstrcmp(yytext,"import")==0) { if (insideIDL) BEGIN(NextSemi); else // insideJava or insideD BEGIN(JavaImport); } - else if (insidePHP && strcmp(yytext,"use")==0) + else if (insidePHP && qstrcmp(yytext,"use")==0) { BEGIN(PHPUse); } - else if (insideJava && strcmp(yytext,"package")==0) + else if (insideJava && qstrcmp(yytext,"package")==0) { lineCount(); BEGIN(PackageName); } - else if (insideIDL && strcmp(yytext,"case")==0) + else if (insideIDL && qstrcmp(yytext,"case")==0) { BEGIN(IDLUnionCase); } - else if (insideTryBlock && strcmp(yytext,"catch")==0) + else if (insideTryBlock && qstrcmp(yytext,"catch")==0) { insideTryBlock=FALSE; BEGIN(TryFunctionBlock); } - else if (insideJS && strcmp(yytext,"var")==0) + else if (insideJS && qstrcmp(yytext,"var")==0) { // javascript variable current->type="var"; } - else if (insideJS && strcmp(yytext,"function")==0) + else if (insideJS && qstrcmp(yytext,"function")==0) { // javascript function current->type="function"; } - else if (insideCS && strcmp(yytext,"this")==0) + else if (insideCS && qstrcmp(yytext,"this")==0) { // C# indexer addType( current ) ; current->name="this"; BEGIN(CSIndexer); } - else if (insideCpp && strcmp(yytext,"static_assert")==0) + else if (insideCpp && qstrcmp(yytext,"static_assert")==0) { // C++11 static_assert BEGIN(StaticAssert); } - else if (insideCpp && strcmp(yytext,"decltype")==0) + else if (insideCpp && qstrcmp(yytext,"decltype")==0) { // C++11 decltype(x) current->type+=yytext; @@ -2153,23 +2156,23 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" addType( current ) ; } bool javaLike = insideJava || insideCS || insideD || insidePHP || insideJS; - if (javaLike && strcmp(yytext,"public")==0) + if (javaLike && qstrcmp(yytext,"public")==0) { current->protection = Public; } - else if (javaLike && strcmp(yytext,"protected")==0) + else if (javaLike && qstrcmp(yytext,"protected")==0) { current->protection = Protected; } - else if (javaLike && strcmp(yytext,"internal")==0) + else if (javaLike && qstrcmp(yytext,"internal")==0) { current->protection = Package; } - else if (javaLike && strcmp(yytext,"private")==0) + else if (javaLike && qstrcmp(yytext,"private")==0) { current->protection = Private; } - else if (javaLike && strcmp(yytext,"static")==0) + else if (javaLike && qstrcmp(yytext,"static")==0) { if (YY_START==FindMembers) current->name = yytext; @@ -4264,7 +4267,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" } */ <FuncQual>[{:;,] { - if ( strcmp(yytext,";")==0 && + if ( qstrcmp(yytext,";")==0 && insidePHP && !containsWord(current->type,"function") ) { @@ -4446,7 +4449,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" lineCount(); } <FuncQual>{ID} { // typically a K&R style C function - if (insideCS && strcmp(yytext,"where")==0) + if (insideCS && qstrcmp(yytext,"where")==0) { // type contraint for a method delete current->typeConstr; @@ -4979,6 +4982,12 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" current->name = yytext; current->name=current->name.left(current->name.length()-1).stripWhiteSpace(); //printf("template class declaration for %s!\n",current->name.data()); + QCString rn = current_root->name.copy(); + //printf("cn=`%s' rn=`%s' isTypedef=%d\n",cn.data(),rn.data(),isTypedef); + if (!current->name.isEmpty() && !rn.isEmpty()) + { + prependScope(); + } current_root->addSubEntry(current); current = new Entry; } @@ -5026,7 +5035,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" BEGIN( ClassVar ); } <ClassVar>{SCOPENAME}{BN}*/"(" { - if (insideIDL && strncmp(yytext,"switch",6)==0 && !isId(yytext[6])) + if (insideIDL && qstrncmp(yytext,"switch",6)==0 && !isId(yytext[6])) { // Corba IDL style union roundCount=0; @@ -5069,13 +5078,13 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" } } <ClassVar>{ID} { - if (insideIDL && strcmp(yytext,"switch")==0) + if (insideIDL && qstrcmp(yytext,"switch")==0) { // Corba IDL style union roundCount=0; BEGIN(SkipUnionSwitch); } - else if ((insideJava || insidePHP || insideJS) && (strcmp(yytext,"implements")==0 || strcmp(yytext,"extends")==0)) + else if ((insideJava || insidePHP || insideJS) && (qstrcmp(yytext,"implements")==0 || qstrcmp(yytext,"extends")==0)) { current->type.resize(0); baseProt=Public; @@ -5083,7 +5092,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" baseName.resize(0); BEGIN( BasesProt ) ; } - else if (insideCS && strcmp(yytext,"where")==0) // C# type contraint + else if (insideCS && qstrcmp(yytext,"where")==0) // C# type contraint { delete current->typeConstr; current->typeConstr = new ArgumentList; @@ -5091,15 +5100,15 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" lastCSConstraint = YY_START; BEGIN( CSConstraintName ); } - else if (insideCli && strcmp(yytext,"abstract")==0) + else if (insideCli && qstrcmp(yytext,"abstract")==0) { current->spec|=Entry::Abstract; } - else if (insideCli && strcmp(yytext,"sealed")==0) + else if (insideCli && qstrcmp(yytext,"sealed")==0) { current->spec|=Entry::Sealed; } - else if (strcmp(yytext,"final")==0) + else if (qstrcmp(yytext,"final")==0) { current->spec|=Entry::Final; } diff --git a/src/searchindex.cpp b/src/searchindex.cpp index fef0f13..681fe96 100644 --- a/src/searchindex.cpp +++ b/src/searchindex.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -414,7 +414,7 @@ struct SearchDocEntry QCString type; QCString name; QCString args; - QCString tagFile; + QCString extId; QCString url; GrowBuf importantText; GrowBuf normalText; @@ -519,11 +519,11 @@ static QCString definitionToName(Definition *ctx) void SearchIndexExternal::setCurrentDoc(Definition *ctx,const char *anchor,bool isSourceFile) { - QCString tagFile = stripPath(Config_getString("GENERATE_TAGFILE")); + QCString extId = stripPath(Config_getString("EXTERNAL_SEARCH_ID")); QCString baseName = isSourceFile ? ((FileDef*)ctx)->getSourceFileBase() : ctx->getOutputFileBase(); QCString url = baseName + Doxygen::htmlFileExtension; if (anchor) url+=QCString("#")+anchor; - QCString key = tagFile+";"+url; + QCString key = extId+";"+url; p->current = p->docEntries.find(key); if (!p->current) @@ -535,7 +535,7 @@ void SearchIndexExternal::setCurrentDoc(Definition *ctx,const char *anchor,bool { e->args = ((MemberDef*)ctx)->argsString(); } - e->tagFile = tagFile; + e->extId = extId; e->url = url; p->current = e; p->docEntries.append(key,e); @@ -573,9 +573,9 @@ void SearchIndexExternal::write(const char *fileName) { t << " <field name=\"args\">" << convertToXML(doc->args) << "</field>" << endl; } - if (!doc->tagFile.isEmpty()) + if (!doc->extId.isEmpty()) { - t << " <field name=\"tag\">" << convertToXML(doc->tagFile) << "</field>" << endl; + t << " <field name=\"tag\">" << convertToXML(doc->extId) << "</field>" << endl; } t << " <field name=\"url\">" << convertToXML(doc->url) << "</field>" << endl; t << " <field name=\"keywords\">" << convertToXML(doc->importantText.get()) << "</field>" << endl; @@ -649,7 +649,7 @@ class SearchIndexList : public SDict< QList<Definition> > QList<Definition> *md2=(QList<Definition> *)item2; QCString n1 = md1->first()->localName(); QCString n2 = md2->first()->localName(); - return stricmp(n1.data(),n2.data()); + return qstricmp(n1.data(),n2.data()); } }; diff --git a/src/searchindex.h b/src/searchindex.h index ddfe384..2ce80e8 100644 --- a/src/searchindex.h +++ b/src/searchindex.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/section.h b/src/section.h index d3dfc7e..486656d 100644 --- a/src/section.h +++ b/src/section.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/sortdict.h b/src/sortdict.h index 02f1f7b..14a221b 100644 --- a/src/sortdict.h +++ b/src/sortdict.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/store.cpp b/src/store.cpp index 521aa9b..7e5118a 100644 --- a/src/store.cpp +++ b/src/store.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/store.h b/src/store.h index 816ce46..d075dc0 100644 --- a/src/store.h +++ b/src/store.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/tagreader.cpp b/src/tagreader.cpp index 42dcf68..1e0ef4f 100644 --- a/src/tagreader.cpp +++ b/src/tagreader.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/tagreader.h b/src/tagreader.h index 427f674..7b29b01 100644 --- a/src/tagreader.h +++ b/src/tagreader.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/tclscanner.h b/src/tclscanner.h index 24bf40b..f06f3de 100644 --- a/src/tclscanner.h +++ b/src/tclscanner.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 by Dimitri van Heesch. * Copyright (C) 2010-2011 by Rene Zaumseil * * Permission to use, copy, modify, and distribute this software and its diff --git a/src/tclscanner.l b/src/tclscanner.l index c3d5df0..e8bf77d 100644 --- a/src/tclscanner.l +++ b/src/tclscanner.l @@ -80,34 +80,34 @@ // - Tcl_Interp removed // - changes are marked with RZ // #define's to adapt the code: -#define CONST const -#define UCHAR (unsigned char) -#define TCL_ERROR 1 -#define TCL_OK 0 -#define ckalloc malloc -#define ckfree free +#define CONST const +#define UCHAR (unsigned char) +#define TCL_ERROR 1 +#define TCL_OK 0 +#define ckalloc malloc +#define ckfree free #define TclCopyAndCollapse(size,src,dest) memcpy(dest,src,size); *(dest+size)=0 int TclFindElement( - CONST char *list, /* Points to the first byte of a string - * containing a Tcl list with zero or more - * elements (possibly in braces). */ - int listLength, /* Number of bytes in the list's string. */ - CONST char **elementPtr, /* Where to put address of first significant - * character in first element of list. */ - CONST char **nextPtr, /* Fill in with location of character just - * after all white space following end of - * argument (next arg or end of list). */ - int *sizePtr, /* If non-zero, fill in with size of - * element. */ - int *bracePtr) /* If non-zero, fill in with non-zero/zero to - * indicate that arg was/wasn't in braces. */ + CONST char *list, /* Points to the first byte of a string + * containing a Tcl list with zero or more + * elements (possibly in braces). */ + int listLength, /* Number of bytes in the list's string. */ + CONST char **elementPtr, /* Where to put address of first significant + * character in first element of list. */ + CONST char **nextPtr, /* Fill in with location of character just + * after all white space following end of + * argument (next arg or end of list). */ + int *sizePtr, /* If non-zero, fill in with size of + * element. */ + int *bracePtr) /* If non-zero, fill in with non-zero/zero to + * indicate that arg was/wasn't in braces. */ { CONST char *p = list; - CONST char *elemStart; /* Points to first byte of first element. */ - CONST char *limit; /* Points just after list's last byte. */ - int openBraces = 0; /* Brace nesting level during parse. */ + CONST char *elemStart; /* Points to first byte of first element. */ + CONST char *limit; /* Points just after list's last byte. */ + int openBraces = 0; /* Brace nesting level during parse. */ int inQuotes = 0; - int size = 0; /* lint. */ + int size = 0; /* lint. */ //RZ int numChars; /* @@ -122,7 +122,7 @@ int TclFindElement( p++; } if (p == limit) - { /* no element found */ + { /* no element found */ elemStart = limit; goto done; } @@ -157,54 +157,54 @@ int TclFindElement( */ case '{': - if (openBraces != 0) - { - openBraces++; - } - break; + if (openBraces != 0) + { + openBraces++; + } + break; - /* - * Close brace: if element is in braces, keep nesting count and - * quit when the last close brace is seen. - */ + /* + * Close brace: if element is in braces, keep nesting count and + * quit when the last close brace is seen. + */ case '}': - if (openBraces > 1) - { - openBraces--; - } - else if (openBraces == 1) - { - size = (int)(p - elemStart); - p++; - if ((p >= limit) || isspace(UCHAR(*p))) - { /* INTL: ISO space. */ - goto done; - } - - /* - * Garbage after the closing brace; return an error. - */ - - return TCL_ERROR; - } - break; - - /* - * Backslash: skip over everything up to the end of the backslash - * sequence. - */ + if (openBraces > 1) + { + openBraces--; + } + else if (openBraces == 1) + { + size = (int)(p - elemStart); + p++; + if ((p >= limit) || isspace(UCHAR(*p))) + { /* INTL: ISO space. */ + goto done; + } + + /* + * Garbage after the closing brace; return an error. + */ + + return TCL_ERROR; + } + break; + + /* + * Backslash: skip over everything up to the end of the backslash + * sequence. + */ case '\\': - //RZ Tcl_UtfBackslash(p, &numChars, NULL); - //RZ p += (numChars - 1); - p++; //RZ - break; + //RZ Tcl_UtfBackslash(p, &numChars, NULL); + //RZ p += (numChars - 1); + p++; //RZ + break; - /* - * Space: ignore if element is in braces or quotes; otherwise - * terminate element. - */ + /* + * Space: ignore if element is in braces or quotes; otherwise + * terminate element. + */ case ' ': case '\f': @@ -212,33 +212,33 @@ int TclFindElement( case '\r': case '\t': case '\v': - if ((openBraces == 0) && !inQuotes) - { - size = (int)(p - elemStart); - goto done; - } - break; + if ((openBraces == 0) && !inQuotes) + { + size = (int)(p - elemStart); + goto done; + } + break; - /* - * Double-quote: if element is in quotes then terminate it. - */ + /* + * Double-quote: if element is in quotes then terminate it. + */ case '"': - if (inQuotes) - { - size = (int)(p - elemStart); - p++; - if ((p >= limit) || isspace(UCHAR(*p))) - { /* INTL: ISO space */ - goto done; - } - - /* - * Garbage after the closing quote; return an error. - */ - return TCL_ERROR; - } - break; + if (inQuotes) + { + size = (int)(p - elemStart); + p++; + if ((p >= limit) || isspace(UCHAR(*p))) + { /* INTL: ISO space */ + goto done; + } + + /* + * Garbage after the closing quote; return an error. + */ + return TCL_ERROR; + } + break; } p++; } @@ -275,11 +275,11 @@ done: } int Tcl_SplitList( - CONST char *list, /* Pointer to string with list structure. */ - int *argcPtr, /* Pointer to location to fill in with the - * number of elements in the list. */ - CONST char ***argvPtr) /* Pointer to place to store pointer to array - * of pointers to list elements. */ + CONST char *list, /* Pointer to string with list structure. */ + int *argcPtr, /* Pointer to location to fill in with the + * number of elements in the list. */ + CONST char ***argvPtr) /* Pointer to place to store pointer to array + * of pointers to list elements. */ { CONST char **argv, *l, *element; char *p; @@ -295,7 +295,7 @@ int Tcl_SplitList( for (size = 2, l = list; *l != 0; l++) { if (isspace(UCHAR(*l))) - { /* INTL: ISO space. */ + { /* INTL: ISO space. */ size++; /* @@ -304,18 +304,18 @@ int Tcl_SplitList( while (1) { - char next = *(l + 1); - - if (next == '\0') - { - break; - } - ++l; - if (isspace(UCHAR(next))) - { /* INTL: ISO space. */ - continue; - } - break; + char next = *(l + 1); + + if (next == '\0') + { + break; + } + ++l; + if (isspace(UCHAR(next))) + { /* INTL: ISO space. */ + continue; + } + break; } } } @@ -328,7 +328,7 @@ int Tcl_SplitList( CONST char *prevList = list; result = TclFindElement(list, length, &element, &list, - &elSize, &brace); + &elSize, &brace); length -= (int)(list - prevList); if (result != TCL_OK) { @@ -439,10 +439,10 @@ static struct 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 + 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<tcl_scan> scan; // stack of scan contexts QAsciiDict<Entry> ns; // all read namespace entries @@ -481,7 +481,7 @@ Entry* tcl_entry_new() myEntry->lang = SrcLangExt_Tcl; initGroupInfo(myEntry); // collect entries - if (tcl.code==NULL) + if (!tcl.code) { tcl.entry.insert(0,myEntry); } @@ -508,7 +508,7 @@ static void tcl_name(const QCString &ns0, const QCString &name0, QCString &ns, Q QCString myNm; int myStart; - if (strncmp(name0.data(),"::",2)==0) + if (qstrncmp(name0.data(),"::",2)==0) { myNm = name0.mid(2); } @@ -629,7 +629,7 @@ static int tcl_keyword(QCString str) //! End codifying with special font class. static void tcl_font_end() { - if (tcl.code==NULL) return; + if (!tcl.code) return; if (tcl.code_font) { tcl.code->endFontClass(); @@ -640,8 +640,8 @@ static void tcl_font_end() //! Codify 'str' with special font class 's'. static void tcl_codify(const char *s,char *str) { - if (tcl.code==NULL||str==NULL) return; - if (s && strcmp(s,"NULL")!=0) + if (!tcl.code || !str) return; + if (s && qstrcmp(s,"NULL")!=0) { tcl_font_end(); tcl.code->startFontClass(s); @@ -659,20 +659,19 @@ static void tcl_codify(const char *s,char *str) tcl.code_line++; *(p-1)='\0'; tcl.code->codify(sp); - //tcl_font_end(); + if (tcl.code_font) + { + tcl.code->endFontClass(); + } tcl.code->endCodeLine(); + tcl.code->startCodeLine(tcl.code_linenumbers); if (tcl.code_linenumbers) { - if (tcl.code_font!=NULL) - { - tcl.code->endFontClass(); - tcl.code->writeLineNumber(0,0,0,tcl.code_line); - tcl.code->startFontClass(tcl.code_font); - } - else - { - tcl.code->writeLineNumber(0,0,0,tcl.code_line); - } + tcl.code->writeLineNumber(0,0,0,tcl.code_line); + } + if (tcl.code_font) + { + tcl.code->startFontClass(tcl.code_font); } } else @@ -706,7 +705,7 @@ static void tcl_codify(const char *s,const QString &str) //! Codify 'str' with special font class 's'. static void tcl_codify(const char *s,const QCString &str) { - if (tcl.code==NULL) return; + if (!tcl.code) return; tcl_codify(s,str.data()); } @@ -716,11 +715,11 @@ static void tcl_codify_cmd(const char *s,int i) } //----------------------------------------------------------------------------- -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); //----------------------------------------------------------------------------- %} -ws ([ \t]|\\\n) +ws ([ \t]|\\\n) %option yylineno %option noyywrap @@ -1247,8 +1246,8 @@ tcl_inf("(\\\n) ?%s?\n",tcl.string_last.data()); { case '{':// {{x}} myLevel--; - if (myLevel==0 && tcl.code==NULL) - { + if (myLevel==0 && !tcl.code) + { myWhite=1; } break; @@ -1287,7 +1286,7 @@ tcl_inf("(\\\n) ?%s?\n",tcl.string_last.data()); case '{': break; case '[': - myLevel--; + myLevel--; break; case '"': case '.': @@ -1340,7 +1339,7 @@ tcl_inf("(%d) ?%s?\n",what,tcl.string_last.data()); yyless(0); tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.data()); return; - } + } else { myLevel--; @@ -1464,24 +1463,24 @@ tcl_inf("-> %s\n",(const char *)tcl.string_comment); myPos0=myPos; myLine0=myLine; while (parseCommentBlock(tcl.this_parser, &myEntry0, myDoc, tcl.file_name, - myLine, FALSE, tcl.config_autobrief, FALSE, myProt, myPos, myNew)) + myLine, FALSE, tcl.config_autobrief, FALSE, myProt, myPos, myNew)) { if (myNew) { // we need a new entry in this case myNew=0; myEntry = tcl_entry_new(); parseCommentBlock(tcl.this_parser, myEntry, myDoc, tcl.file_name, - myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew); - tcl.entry_inside->addSubEntry(myEntry); + myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew); + tcl.entry_inside->addSubEntry(myEntry); } else { // we can add to current entry in this case - if (myEntry1==NULL) + if (!myEntry1) { myEntry1=tcl_entry_namespace(tcl.scan.at(0)->ns); } parseCommentBlock(tcl.this_parser, myEntry1, myDoc, tcl.file_name, - myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew); + myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew); } myPos0=myPos; myLine0=myLine; @@ -1491,35 +1490,35 @@ tcl_inf("-> %s\n",(const char *)tcl.string_comment); myNew=0; myEntry = tcl_entry_new(); parseCommentBlock(tcl.this_parser, myEntry, myDoc, tcl.file_name, - myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew); - tcl.entry_inside->addSubEntry(myEntry); + myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew); + tcl.entry_inside->addSubEntry(myEntry); } else { // we can add to current entry - if (myEntry1==NULL) + if (!myEntry1) { myEntry1=tcl_entry_namespace(tcl.scan.at(0)->ns); } parseCommentBlock(tcl.this_parser, myEntry1, myDoc, tcl.file_name, - myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew); + myLine0, FALSE, tcl.config_autobrief, FALSE, myProt, myPos0, myNew); } } else { // new entry tcl.entry_current = tcl_entry_new(); while (parseCommentBlock(tcl.this_parser, tcl.entry_current, myDoc, - tcl.file_name, myLine, FALSE, tcl.config_autobrief, FALSE, - myProt, myPos, myNew)) + tcl.file_name, myLine, FALSE, tcl.config_autobrief, FALSE, + myProt, myPos, myNew)) { if (myNew) { - tcl.entry_inside->addSubEntry(tcl.entry_current); - tcl.entry_current = tcl_entry_new(); + tcl.entry_inside->addSubEntry(tcl.entry_current); + tcl.entry_current = tcl_entry_new(); } else { - tcl.entry_current->section = tcl.entry_inside->section; - tcl.entry_current->name = tcl.entry_inside->name; + tcl.entry_current->section = tcl.entry_inside->section; + tcl.entry_current->name = tcl.entry_inside->name; } } if (myNew) @@ -1554,7 +1553,7 @@ D QStringList myArgs; QString myArglist=""; - if (tcl.entry_current->argList==NULL) + if (!tcl.entry_current->argList) { tcl.entry_current->argList=new ArgumentList; } @@ -1571,7 +1570,7 @@ D myArg->defval= (*myArgs1.at(1)).utf8(); if (myArg->defval.isEmpty()) { - myArg->defval = " "; + myArg->defval = " "; } myArglist += "?" + QCString(myArg->name) + "? "; } @@ -1604,7 +1603,7 @@ static void tcl_codify_link(QCString name) MemberNameIterator mi(*mn); for (mi.toFirst();(md=mi.current());++mi) { - fn.insert(md->qualifiedName(),md); + fn.insert(md->qualifiedName(),md); } } for (fni.toFirst();(mn=fni.current());++fni) @@ -1612,7 +1611,7 @@ static void tcl_codify_link(QCString name) MemberNameIterator fi(*mn); for (fi.toFirst();(md=fi.current());++fi) { - fn.insert(md->qualifiedName(),md); + fn.insert(md->qualifiedName(),md); } } } @@ -1645,14 +1644,14 @@ static void tcl_codify_link(QCString name) if (myDef != NULL) // documented command { tcl.code->writeCodeLink(myDef->getReference().data(), - myDef->getOutputFileBase().data(), - myDef->anchor().data(), - name, - myDef->qualifiedName().data()); + myDef->getOutputFileBase().data(), + myDef->anchor().data(), + name, + myDef->qualifiedName().data()); if (tcl.memberdef) { - myDef->addSourceReferencedBy(tcl.memberdef); - tcl.memberdef->addSourceReferences(myDef); + myDef->addSourceReferencedBy(tcl.memberdef); + tcl.memberdef->addSourceReferences(myDef); } } else if (tcl_keyword(myName)) // check keyword @@ -1675,7 +1674,7 @@ D tcl_codify_cmd(NULL,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->ns,myScan->entry_cl,myScan->entry_fn); for (unsigned int i = 3;i<tcl.list_commandwords.count();i++) { myScan->after << type[i] << tcl.list_commandwords[i]; @@ -1690,7 +1689,7 @@ D tcl_codify_cmd(NULL,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->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]; @@ -1713,7 +1712,7 @@ D } tcl_scan *myScan=tcl.scan.at(0); myScan = tcl_scan_start('?',*tcl.list_commandwords.at(tcl.list_commandwords.count()-1), - myScan->ns,myScan->entry_cl,myScan->entry_fn); + myScan->ns,myScan->entry_cl,myScan->entry_fn); } ///! Handle internal tcl commands. @@ -1725,7 +1724,7 @@ D tcl_codify_cmd(NULL,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->ns,myScan->entry_cl,myScan->entry_fn); myScan->after << "NULL" << tcl.list_commandwords[3]; myScan->after << "script" << tcl.list_commandwords[4]; } @@ -1756,32 +1755,32 @@ D for (i=0;i<myName.length();i++) { QChar c = myName[i]; - if (myCmd) - { - if (c==' '||c=='\t'||c=='\n'||c==']') - {//end of command - tcl_codify_link(myStr); - myStr=""; - myCmd=0; - } - myStr+=c; - } - else - { - myStr+=c; - if (c=='[') - {//start of command - for (;i<myName.length();i++) + if (myCmd) + { + if (c==' '||c=='\t'||c=='\n'||c==']') + {//end of command + tcl_codify_link(myStr); + myStr=""; + myCmd=0; + } + myStr+=c; + } + else + { + myStr+=c; + if (c=='[') + {//start of command + for (;i<myName.length();i++) { c = myName[i+1]; - if (c!=' ' && c!='\t' && c!='\n') break; - myStr+=c; + if (c!=' ' && c!='\t' && c!='\n') break; + myStr+=c; } tcl_codify(NULL,myStr); - myStr=""; - myCmd=1; - } - } + myStr=""; + myCmd=1; + } + } } tcl_codify(NULL,myStr); } @@ -1825,7 +1824,7 @@ D myEntry = tcl.entry_current; tcl.fn.insert(myName,myEntry); myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6), - myEntryNs->name,NULL,myEntry); + myEntryNs->name,NULL,myEntry); } //! Handle \c itcl::body statements and \c oo::define method and method inside \c itcl::class statements. @@ -1867,7 +1866,7 @@ D tcl.fn.insert(myName,tcl.entry_current); myEntry = tcl.entry_current; myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6), - myNs, myEntryCl, myEntry); + myNs, myEntryCl, myEntry); } //! Handle \c constructor statements inside class definitions. @@ -1904,7 +1903,7 @@ D myEntry = tcl.entry_current; tcl.fn.insert(myName,myEntry); myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4), - myNs, myEntryCl, myEntry); + myNs, myEntryCl, myEntry); } //! Handle \c destructor statements inside class definitions. @@ -1938,7 +1937,7 @@ D myEntry = tcl.entry_current; tcl.fn.insert(myName,myEntry); myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(2), - myNs, myEntryCl, myEntry); + myNs, myEntryCl, myEntry); } //! Handle \c namespace statements. @@ -2006,7 +2005,7 @@ D tcl.cl.insert(myName,tcl.entry_current); myEntryCl = tcl.entry_current; myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(4), - myName, myEntryCl, NULL); + myName, myEntryCl, NULL); } //! Handle \c oo::class statements. @@ -2039,7 +2038,7 @@ D tcl.cl.insert(myName,tcl.entry_current); myEntryCl = tcl.entry_current; myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(6), - myName, myEntryCl, NULL); + myName, myEntryCl, NULL); } //! Handle \c oo::define statements. @@ -2205,11 +2204,11 @@ tcl_inf("->\n"); { tcl_scan *myScan = tcl.scan.at(0); myScan = tcl_scan_start(tcl.word_is,*tcl.list_commandwords.at(0), - myScan->ns,myScan->entry_cl,myScan->entry_fn); + myScan->ns,myScan->entry_cl,myScan->entry_fn); myProt = tcl.protection; goto command_end; } - myStr = (*tcl.list_commandwords.at(0)).utf8(); + myStr = (*tcl.list_commandwords.at(0)).utf8(); // remove leading "::" and apply TCL_SUBST if (myStr.left(2)=="::") myStr = myStr.mid(2); if (tcl.config_subst.contains(myStr)) @@ -2296,7 +2295,7 @@ 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(tcl.scan.at(0)->entry_cl!=NULL&&tcl.scan.at(0)->entry_cl->name!=""); + tcl_command_VARIABLE(tcl.scan.at(0)->entry_cl && tcl.scan.at(0)->entry_cl->name!=""); goto command_text; } } @@ -2312,7 +2311,7 @@ tcl_inf("->\n"); if (myStr=="inherit" || myStr=="superclass") { 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!="") + if (tcl.scan.at(0)->entry_cl && tcl.scan.at(0)->entry_cl->name!="") { for (unsigned int i = 2; i < tcl.list_commandwords.count(); i = i + 2) { @@ -2354,46 +2353,46 @@ if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN? if (myStr=="then") { myState='t'; - myType << "keyword" << "NULL"; + myType << "keyword" << "NULL"; } else { myState='b'; - myType << "script" << "NULL"; + myType << "script" << "NULL"; } } else if (myState=='t') { myState='b'; - myType << "script" << "NULL"; + myType << "script" << "NULL"; } else if (myState=='b') { if (myStr=="elseif") { myState='i'; - myType << "keyword" << "NULL"; + myType << "keyword" << "NULL"; } else if (myStr=="else" && i==tcl.list_commandwords.count()-3) { - myState = 'b'; - myType << "keyword" << "NULL" << "script"; - i = tcl.list_commandwords.count(); + 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(); - } + myState = 'b'; + myType << "script"; + i = tcl.list_commandwords.count(); + } else { - myLine=__LINE__;goto command_warn; + myLine=__LINE__;goto command_warn; } } else if (myState=='i') { myState='x'; - myType << "script" << "NULL"; + myType << "script" << "NULL"; } } if (myState != 'b') {myLine=__LINE__;goto command_warn;} @@ -2472,20 +2471,20 @@ tcl_inf("TCL_SUBST: use '%s'\n",s); tcl.string_command=""; tcl.string_commentline=""; tcl.string_commentcodify=""; - tcl.string_comment = ""; - tcl.string_last = ""; - tcl.entry_main = NULL; - tcl.entry_file = NULL; - tcl.entry_current = NULL; - tcl.entry_inside = NULL; + tcl.string_comment = ""; + tcl.string_last = ""; + tcl.entry_main = NULL; + tcl.entry_file = NULL; + tcl.entry_current = NULL; + tcl.entry_inside = NULL; tcl.list_commandwords.clear(); tcl.scan.clear(); tcl.ns.clear(); tcl.cl.clear(); tcl.fn.clear(); - yylineno = 1; - tcl.protection = Public; - tcl.memberdef = NULL; + yylineno = 1; + tcl.protection = Public; + tcl.memberdef = NULL; } //! Start parsing. @@ -2563,7 +2562,7 @@ void TclLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf, int startLine, int endLine, bool inlineFragment, - MemberDef *memberDef, + MemberDef *memberDef, bool showLineNumbers, Definition *searchCtx ) @@ -2633,6 +2632,7 @@ tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inli yylineno=startLine; tcl.code_linenumbers = showLineNumbers; tcl.code_line=yylineno; + tcl.code->startCodeLine(tcl.code_linenumbers); if (tcl.code_linenumbers) { tcl.code->writeLineNumber(0,0,0,tcl.code_line); @@ -2641,6 +2641,7 @@ tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inli tcl.this_parser = NULL; tcl.entry_main = tcl_entry_new(); tcl_parse(myNs,myCls); + tcl.code->endCodeLine(); tcl.scan.clear(); tcl.ns.clear(); tcl.cl.clear(); diff --git a/src/textdocvisitor.cpp b/src/textdocvisitor.cpp index 33cb3f4..bc45de2 100644 --- a/src/textdocvisitor.cpp +++ b/src/textdocvisitor.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/textdocvisitor.h b/src/textdocvisitor.h index b6c50e0..81fd9e8 100644 --- a/src/textdocvisitor.h +++ b/src/textdocvisitor.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator.h b/src/translator.h index f96962e..41d3461 100644 --- a/src/translator.h +++ b/src/translator.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -335,7 +335,62 @@ class Translator // new since 1.2.6 ////////////////////////////////////////////////////////////////////////// + + /*! Used as ansicpg for RTF file + * + * The following table shows the correlation of Charset name, Charset Value and + * <pre> + * Codepage number: + * Charset Name Charset Value(hex) Codepage number + * ------------------------------------------------------ + * DEFAULT_CHARSET 1 (x01) + * SYMBOL_CHARSET 2 (x02) + * OEM_CHARSET 255 (xFF) + * ANSI_CHARSET 0 (x00) 1252 + * RUSSIAN_CHARSET 204 (xCC) 1251 + * EE_CHARSET 238 (xEE) 1250 + * GREEK_CHARSET 161 (xA1) 1253 + * TURKISH_CHARSET 162 (xA2) 1254 + * BALTIC_CHARSET 186 (xBA) 1257 + * HEBREW_CHARSET 177 (xB1) 1255 + * ARABIC _CHARSET 178 (xB2) 1256 + * SHIFTJIS_CHARSET 128 (x80) 932 + * HANGEUL_CHARSET 129 (x81) 949 + * GB2313_CHARSET 134 (x86) 936 + * CHINESEBIG5_CHARSET 136 (x88) 950 + * </pre> + * + */ virtual QCString trRTFansicp() = 0; + + /*! Character sets + * <pre> + * 0 â ANSI + * 1 â Default + * 2 â Symbol + * 3 â Invalid + * 77 â Mac + * 128 â Shift Jis + * 129 â Hangul + * 130 â Johab + * 134 â GB2312 + * 136 â Big5 + * 161 â Greek + * 162 â Turkish + * 163 â Vietnamese + * 177 â Hebrew + * 178 â Arabic + * 179 â Arabic Traditional + * 180 â Arabic user + * 181 â Hebrew user + * 186 â Baltic + * 204 â Russian + * 222 â Thai + * 238 â Eastern European + * 254 â PC 437 + * 255 â OEM + * </pre> + */ virtual QCString trRTFCharSet() = 0; virtual QCString trRTFGeneralIndex() = 0; diff --git a/src/translator_am.h b/src/translator_am.h index e1b88f1..5264a21 100644 --- a/src/translator_am.h +++ b/src/translator_am.h @@ -2,7 +2,7 @@ *
*
*
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2013 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
diff --git a/src/translator_ar.h b/src/translator_ar.h index 6738537..818cef8 100644 --- a/src/translator_ar.h +++ b/src/translator_ar.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1251,7 +1251,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6 */ virtual QCString trRTFCharSet() { - return "0"; + return "178"; } /*! Used as header RTF general index */ diff --git a/src/translator_br.h b/src/translator_br.h index 7a0fb76..f4c0c20 100644 --- a/src/translator_br.h +++ b/src/translator_br.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_ca.h b/src/translator_ca.h index da76896..521037e 100644 --- a/src/translator_ca.h +++ b/src/translator_ca.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_cn.h b/src/translator_cn.h index 197cfe4..ac9dca4 100644 --- a/src/translator_cn.h +++ b/src/translator_cn.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_cz.h b/src/translator_cz.h index c317cae..d8d9428 100644 --- a/src/translator_cz.h +++ b/src/translator_cz.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_de.h b/src/translator_de.h index 47fec53..415bf77 100644 --- a/src/translator_de.h +++ b/src/translator_de.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_dk.h b/src/translator_dk.h index bf02402..4611b1a 100644 --- a/src/translator_dk.h +++ b/src/translator_dk.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_en.h b/src/translator_en.h index bc51760..ccddccb 100644 --- a/src/translator_en.h +++ b/src/translator_en.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_eo.h b/src/translator_eo.h index b4a077c..a4f60a1 100644 --- a/src/translator_eo.h +++ b/src/translator_eo.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_es.h b/src/translator_es.h index bdddeba..745498b 100644 --- a/src/translator_es.h +++ b/src/translator_es.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_fa.h b/src/translator_fa.h index e74e123..647ae28 100644 --- a/src/translator_fa.h +++ b/src/translator_fa.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1212,7 +1212,7 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5 */ virtual QCString trRTFCharSet() { - return "0"; + return "178"; } /*! Used as header RTF general index */ diff --git a/src/translator_fi.h b/src/translator_fi.h index fdf4b94..cfe933d 100644 --- a/src/translator_fi.h +++ b/src/translator_fi.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_fr.h b/src/translator_fr.h index 05bd4d8..482667e 100644 --- a/src/translator_fr.h +++ b/src/translator_fr.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_gr.h b/src/translator_gr.h index 95072a3..8457f4c 100644 --- a/src/translator_gr.h +++ b/src/translator_gr.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1183,11 +1183,10 @@ class TranslatorGreek : public Translator /*! Used as ansicpg for RTF fcharset - * \see trRTFansicp() for a table of possible values. */ virtual QCString trRTFCharSet() { - return "0"; + return "161"; } /*! Used as header RTF general index */ diff --git a/src/translator_hr.h b/src/translator_hr.h index 6c22919..0c33407 100644 --- a/src/translator_hr.h +++ b/src/translator_hr.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_hu.h b/src/translator_hu.h index 3bed223..17d588e 100644 --- a/src/translator_hu.h +++ b/src/translator_hu.h @@ -1,8 +1,6 @@ /****************************************************************************** * - * - * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_id.h b/src/translator_id.h index cf9a475..3afbe50 100644 --- a/src/translator_id.h +++ b/src/translator_id.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_it.h b/src/translator_it.h index 701c7ec..53c9cb7 100644 --- a/src/translator_it.h +++ b/src/translator_it.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_je.h b/src/translator_je.h index 09bb066..c6bfdcb 100644 --- a/src/translator_je.h +++ b/src/translator_je.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_jp.h b/src/translator_jp.h index 8278abe..8f080a4 100644 --- a/src/translator_jp.h +++ b/src/translator_jp.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_ke.h b/src/translator_ke.h index 4874a5c..f089d38 100644 --- a/src/translator_ke.h +++ b/src/translator_ke.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_kr.h b/src/translator_kr.h index 3158405..043323c 100644 --- a/src/translator_kr.h +++ b/src/translator_kr.h @@ -1,8 +1,6 @@ /****************************************************************************** * - * - * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_lt.h b/src/translator_lt.h index 6dd1832..166ecbd 100644 --- a/src/translator_lt.h +++ b/src/translator_lt.h @@ -1,8 +1,6 @@ /****************************************************************************** * - * - * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1196,7 +1194,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6 */ virtual QCString trRTFansicp() { - return "1252"; + return "1257"; } @@ -1205,7 +1203,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6 */ virtual QCString trRTFCharSet() { - return "0"; + return "186"; } /*! Used as header RTF general index */ diff --git a/src/translator_mk.h b/src/translator_mk.h index b5d8dcb..f162def 100644 --- a/src/translator_mk.h +++ b/src/translator_mk.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1190,7 +1190,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0 */ virtual QCString trRTFansicp() { - return "1252"; + return "1251"; } @@ -1199,7 +1199,7 @@ class TranslatorMacedonian : public TranslatorAdapter_1_6_0 */ virtual QCString trRTFCharSet() { - return "238"; + return "204"; } /*! Used as header RTF general index */ diff --git a/src/translator_nl.h b/src/translator_nl.h index db724db..3c1cb8e 100644 --- a/src/translator_nl.h +++ b/src/translator_nl.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_no.h b/src/translator_no.h index cffaa09..536eb95 100644 --- a/src/translator_no.h +++ b/src/translator_no.h @@ -1,8 +1,6 @@ /****************************************************************************** * - * - * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_pl.h b/src/translator_pl.h index a6e25c2..49ce796 100644 --- a/src/translator_pl.h +++ b/src/translator_pl.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_pt.h b/src/translator_pt.h index e7510d9..08d228f 100644 --- a/src/translator_pt.h +++ b/src/translator_pt.h @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_ro.h b/src/translator_ro.h index 42f0224..c0a4c3d 100644 --- a/src/translator_ro.h +++ b/src/translator_ro.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_ru.h b/src/translator_ru.h index e7f7d95..8e2fc6f 100644 --- a/src/translator_ru.h +++ b/src/translator_ru.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_sc.h b/src/translator_sc.h index 2ea2091..bf04fc9 100644 --- a/src/translator_sc.h +++ b/src/translator_sc.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1217,7 +1217,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0 */ virtual QCString trRTFansicp() { - return "1252"; + return "1251"; } @@ -1226,7 +1226,7 @@ class TranslatorSerbianCyrilic : public TranslatorAdapter_1_6_0 */ virtual QCString trRTFCharSet() { - return "0"; + return "204"; } /*! Used as header RTF general index */ diff --git a/src/translator_si.h b/src/translator_si.h index 8be0cd4..f1dc23f 100644 --- a/src/translator_si.h +++ b/src/translator_si.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_sk.h b/src/translator_sk.h index df3feea..9418576 100644 --- a/src/translator_sk.h +++ b/src/translator_sk.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1172,7 +1172,7 @@ class TranslatorSlovak : public Translator /*! Used as ansicpg for RTF fcharset */ virtual QCString trRTFCharSet() { - return "3"; + return "238"; } /*! Used as header RTF general index */ diff --git a/src/translator_sr.h b/src/translator_sr.h index b12f87c..a9ce978 100644 --- a/src/translator_sr.h +++ b/src/translator_sr.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_sv.h b/src/translator_sv.h index d6eeff7..7b25d6a 100644 --- a/src/translator_sv.h +++ b/src/translator_sv.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_tr.h b/src/translator_tr.h index 4370400..efb0d14 100644 --- a/src/translator_tr.h +++ b/src/translator_tr.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_tw.h b/src/translator_tw.h index 002c8a0..3edd462 100644 --- a/src/translator_tw.h +++ b/src/translator_tw.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_ua.h b/src/translator_ua.h index 022100d..0b65aea 100644 --- a/src/translator_ua.h +++ b/src/translator_ua.h @@ -1,8 +1,6 @@ /****************************************************************************** * - * - * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translator_vi.h b/src/translator_vi.h index d7984a9..592c005 100644 --- a/src/translator_vi.h +++ b/src/translator_vi.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -1210,7 +1210,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0 */ virtual QCString trRTFansicp() { - return "1252"; + return "1258"; } @@ -1219,7 +1219,7 @@ class TranslatorVietnamese : public TranslatorAdapter_1_6_0 */ virtual QCString trRTFCharSet() { - return "0"; + return "163"; } /*! Used as header RTF general index */ diff --git a/src/translator_za.h b/src/translator_za.h index b3084c6..fb02744 100644 --- a/src/translator_za.h +++ b/src/translator_za.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/translatordecoder.h b/src/translatordecoder.h index 7261ee9..f6ba8dd 100644 --- a/src/translatordecoder.h +++ b/src/translatordecoder.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/types.h b/src/types.h index 9bc5827..2db4b5d 100644 --- a/src/types.h +++ b/src/types.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/util.cpp b/src/util.cpp index 0d48f96..8e26261 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -278,7 +278,7 @@ static QCString stripFromPath(const QCString &path,QStrList &l) { QCString prefix = s; if (prefix.length() > length && - stricmp(path.left(prefix.length()),prefix)==0) // case insensitive compare + qstricmp(path.left(prefix.length()),prefix)==0) // case insensitive compare { length = prefix.length(); potential = path.right(path.length()-prefix.length()); @@ -2449,8 +2449,8 @@ int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level) if (cd==bcd) return level; if (level==256) { - err("error: Internal inconsistency: found class %s seem to have a recursive " - "inheritance relation! Please send a bug report to dimitri@stack.nl\n",cd->name().data()); + err("warning: class %s seem to have a recursive " + "inheritance relation!\n",cd->name().data()); return -1; } int m=maxInheritanceDepth; @@ -2889,11 +2889,11 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, stripIrrelevantConstVolatile(dstAType); // strip typename keyword - if (strncmp(srcAType,"typename ",9)==0) + if (qstrncmp(srcAType,"typename ",9)==0) { srcAType = srcAType.right(srcAType.length()-9); } - if (strncmp(dstAType,"typename ",9)==0) + if (qstrncmp(dstAType,"typename ",9)==0) { dstAType = dstAType.right(dstAType.length()-9); } @@ -3802,7 +3802,7 @@ static void findMembersWithSpecificName(MemberName *mn, { bool match=TRUE; ArgumentList *argList=0; - if (args && !md->isDefine() && strcmp(args,"()")!=0) + if (args && !md->isDefine() && qstrcmp(args,"()")!=0) { argList=new ArgumentList; LockingPtr<ArgumentList> mdAl = md->argumentList(); @@ -3964,7 +3964,7 @@ bool getDefs(const QCString &scName, { delete argList; argList=0; } - if (mdist==maxInheritanceDepth && args && strcmp(args,"()")==0) + if (mdist==maxInheritanceDepth && args && qstrcmp(args,"()")==0) // no exact match found, but if args="()" an arbitrary member will do { //printf(" >Searching for arbitrary member\n"); @@ -4022,7 +4022,7 @@ bool getDefs(const QCString &scName, MemberListIterator mmli(*mn); MemberDef *mmd, *fuzzy_mmd = 0; ArgumentList *argList = 0; - bool hasEmptyArgs = args && strcmp(args, "()") == 0; + bool hasEmptyArgs = args && qstrcmp(args, "()") == 0; if (args) stringToArgumentList(args, argList = new ArgumentList); @@ -4098,7 +4098,7 @@ bool getDefs(const QCString &scName, { // namespace is found bool match=TRUE; ArgumentList *argList=0; - if (args && strcmp(args,"()")!=0) + if (args && qstrcmp(args,"()")!=0) { argList=new ArgumentList; LockingPtr<ArgumentList> mmdAl = mmd->argumentList(); @@ -4120,7 +4120,7 @@ bool getDefs(const QCString &scName, } } } - if (!found && args && !strcmp(args,"()")) + if (!found && args && !qstrcmp(args,"()")) // no exact match found, but if args="()" an arbitrary // member will do { @@ -4171,7 +4171,7 @@ bool getDefs(const QCString &scName, findMembersWithSpecificName(mn,args,FALSE,currentFile,checkCV,forceTagFile,members); } //printf("found %d members\n",members.count()); - if (members.count()!=1 && args && !strcmp(args,"()")) + if (members.count()!=1 && args && !qstrcmp(args,"()")) { // no exact match found, but if args="()" an arbitrary // member will do @@ -4295,10 +4295,18 @@ bool resolveRef(/* in */ const char *scName, bool checkScope ) { + //printf("resolveRef(scope=%s,name=%s,inSeeBlock=%d)\n",scName,name,inSeeBlock); QCString tsName = name; //bool memberScopeFirst = tsName.find('#')!=-1; QCString fullName = substitute(tsName,"#","::"); - fullName = removeRedundantWhiteSpace(substitute(fullName,".","::")); + if (fullName.find("anonymous_namespace{")==-1) + { + fullName = removeRedundantWhiteSpace(substitute(fullName,".","::")); + } + else + { + fullName = removeRedundantWhiteSpace(fullName); + } int bracePos=fullName.findRev('('); // reverse is needed for operator()(...) int endNamePos=bracePos!=-1 ? bracePos : fullName.length(); @@ -4559,6 +4567,7 @@ bool resolveLink(/* in */ const char *scName, ClassDef *cd; DirDef *dir; NamespaceDef *nd; + SectionInfo *si=0; bool ambig; if (linkRef.isEmpty()) // no reference name! { @@ -4569,7 +4578,6 @@ bool resolveLink(/* in */ const char *scName, GroupDef *gd = pd->getGroupDef(); if (gd) { - SectionInfo *si=0; if (!pd->name().isEmpty()) si=Doxygen::sectionDict->find(pd->name()); *resContext=gd; if (si) resAnchor = si->label; @@ -4580,6 +4588,12 @@ bool resolveLink(/* in */ const char *scName, } return TRUE; } + else if ((si=Doxygen::sectionDict->find(linkRef))) + { + *resContext=si->definition; + resAnchor = si->label; + return TRUE; + } else if ((pd=Doxygen::exampleSDict->find(linkRef))) // link to an example { *resContext=pd; @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/version.h b/src/version.h index 4752520..9d523c1 100644 --- a/src/version.h +++ b/src/version.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/vhdlcode.l b/src/vhdlcode.l index b3d24d1..5806149 100644 --- a/src/vhdlcode.l +++ b/src/vhdlcode.l @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index 0a0141f..3024747 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -27,6 +27,11 @@ #include <qcstring.h> #include <qfileinfo.h> #include <qstringlist.h> + +#ifdef DEBUGFLOW +#include <qmap.h> +#endif + /* --------------------------------------------------------------- */ // local includes @@ -95,12 +100,11 @@ const MemberDef* VhdlDocGen::getFlowMember() //-------------------------------------------------------------------------------------------------- static void codify(FTextStream &t,const char *str) { - if (str) { const char *p=str; char c; - while (*p) + while (*p) { c=*p++; switch(c) @@ -330,7 +334,7 @@ static void writeColumn(FTextStream &t,MemberDef *md,bool start) QCString toolTip; static QRegExp reg("[%]"); - bool bidir=(md!=0 &&( stricmp(md->typeString(),"inout")==0)); + bool bidir=(md!=0 &&( qstricmp(md->typeString(),"inout")==0)); if (md) { @@ -766,7 +770,7 @@ MemberDef* VhdlDocGen::findMemberDef(ClassDef* cd,const QCString& key,MemberList for (fmni.toFirst();(md=fmni.current());++fmni) { - if (stricmp(key.data(),md->name().data())==0) + if (qstricmp(key,md->name())==0) { return md; } @@ -1003,9 +1007,9 @@ void VhdlDocGen::findAllArchitectures(QList<QCString>& qll,const ClassDef *cd) { QStringList ql=QStringList::split("-",jj,FALSE); QCString temp=ql[1].utf8(); - if (stricmp(cd->className().data(),temp.data())==0) + if (qstricmp(cd->className(),temp)==0) { - QCString *cl=new QCString(jj.data()); + QCString *cl=new QCString(jj); qll.insert(0,cl); } } @@ -1057,12 +1061,9 @@ void VhdlDocGen::writeVhdlLink(const ClassDef* ccd ,OutputList& ol,QCString& typ ol.lineBreak(); } -bool VhdlDocGen::compareString(const QCString& s1,const QCString& s2) +int VhdlDocGen::compareString(const QCString& s1,const QCString& s2) { - QCString str1=s1.stripWhiteSpace(); - QCString str2=s2.stripWhiteSpace(); - - return stricmp(str1.data(),str2.data()); + return qstricmp(s1.stripWhiteSpace(),s2.stripWhiteSpace()); } @@ -1078,7 +1079,7 @@ void VhdlDocGen::prepareComment(QCString& qcs) { index=qcs.find(s,0,TRUE); if (index<0) break; - qcs=qcs.remove(index,strlen(s)); + qcs=qcs.remove(index,qstrlen(s)); } qcs=qcs.stripWhiteSpace(); } @@ -1460,8 +1461,10 @@ void VhdlDocGen::writeProcedureProto(OutputList& ol,const ArgumentList* al,const } VhdlDocGen::startFonts(nn,"vhdlchar",ol); // write name - if (stricmp(arg->attrib.data(),arg->type.data()) != 0) + if (qstricmp(arg->attrib,arg->type) != 0) + { VhdlDocGen::startFonts(arg->attrib.lower(),"stringliteral",ol); // write in|out + } ol.docify(" "); VhdlDocGen::formatString(arg->type,ol,mdef); sem=TRUE; @@ -1761,27 +1764,27 @@ static void setGlobalType(MemberList *ml) { QCString l=mdd->typeString(); - if (strcmp(mdd->argsString(),"package")==0) + if (qstrcmp(mdd->argsString(),"package")==0) { mdd->setMemberSpecifiers(VhdlDocGen::INSTANTIATION); } - else if (strcmp(mdd->argsString(),"configuration")==0) + else if (qstrcmp(mdd->argsString(),"configuration")==0) { mdd->setMemberSpecifiers(VhdlDocGen::CONFIG); } - else if (strcmp(mdd->typeString(),"library")==0) + else if (qstrcmp(mdd->typeString(),"library")==0) { mdd->setMemberSpecifiers(VhdlDocGen::LIBRARY); } - else if (strcmp(mdd->typeString(),"use")==0) + else if (qstrcmp(mdd->typeString(),"use")==0) { mdd->setMemberSpecifiers(VhdlDocGen::USE); } - else if (stricmp(mdd->typeString(),"misc")==0) + else if (qstricmp(mdd->typeString(),"misc")==0) { mdd->setMemberSpecifiers(VhdlDocGen::MISCELLANEOUS); } - else if (stricmp(mdd->typeString(),"ucf_const")==0) + else if (qstricmp(mdd->typeString(),"ucf_const")==0) { mdd->setMemberSpecifiers(VhdlDocGen::UCF_CONST); } @@ -2005,7 +2008,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, QCString nn; //VhdlDocGen::adjustRecordMember(mdef); if (gd) gd=0; - switch(mm) + switch (mm) { case VhdlDocGen::MISCELLANEOUS: VhdlDocGen::writeCodeFragment(mdef,ol); @@ -2182,17 +2185,13 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, bRec=largs.stripPrefix("record") ; bUnit=largs.stripPrefix("units") ; ol.startBold(); - if (bRec) - ol.docify("record: "); - if (bUnit) - ol.docify("units: "); + if (bRec) ol.docify("record: "); + if (bUnit) ol.docify("units: "); writeLink(mdef,ol); ol.insertMemberAlign(); - if (!bRec) - VhdlDocGen::formatString(ltype,ol,mdef); + if (!bRec) VhdlDocGen::formatString(ltype,ol,mdef); if (bUnit) ol.lineBreak(); - if (bRec || bUnit) - writeRecorUnit(largs,ol,mdef); + if (bRec || bUnit) writeRecorUnit(largs,ol,mdef); ol.endBold(); break; @@ -2381,7 +2380,6 @@ void VhdlDocGen::writeVHDLDeclarations(MemberList* ml,OutputList &ol, bool VhdlDocGen::writeClassType( ClassDef *& cd, OutputList &ol ,QCString & cname) { - int id=cd->protection(); QCString qcs = VhdlDocGen::trTypeString(id+2); cname=VhdlDocGen::getClassName(cd); @@ -2620,7 +2618,7 @@ void VhdlDocGen::parseUCF(const char* input, Entry* entity,QCString fileName,b QCString comment("#!"); QCString brief; - while(!ucFile.isEmpty()) + while (!ucFile.isEmpty()) { int i=ucFile.find("\n"); if (i<0) break; @@ -2642,7 +2640,9 @@ void VhdlDocGen::parseUCF(const char* input, Entry* entity,QCString fileName,b { int i=temp.find("-name"); if (i>0) + { temp=temp.remove(0,i+5); + } temp.stripPrefix("set_location_assignment"); @@ -2673,7 +2673,7 @@ static void initUCF(Entry* root,const char* type,QCString & qcs,int line,QCStr QRegExp sp("\\s"); QRegExp reg("[\\s=]"); QCString n; - // bool bo=(stricmp(type,qcs.data())==0); + // bool bo=(qstricmp(type,qcs.data())==0); VhdlDocGen::deleteAllChars(qcs,';'); qcs=qcs.stripWhiteSpace(); @@ -2742,9 +2742,13 @@ static void writeUCFLink(const MemberDef* mdef,OutputList &ol) } if (mdef->name().contains("dummy")==0) + { VhdlDocGen::writeLink(mdef,ol); + } if (equ) + { ol.insertMemberAlign(); + } ol.docify(" "); VhdlDocGen::formatString(largs,ol,mdef); } @@ -2773,10 +2777,10 @@ bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne) if (Config_getBool("HAVE_DOT") && Config_getEnum("DOT_IMAGE_FORMAT")=="svg") { - QCString ov = theTranslator->trDesignOverview(); - QCString ofile("vhdl_design_overview"); - LayoutNavEntry *oo=new LayoutNavEntry( lne,LayoutNavEntry::MainPage,TRUE,ofile,ov,""); - kk->addChild(oo); + QCString ov = theTranslator->trDesignOverview(); + QCString ofile("vhdl_design_overview"); + LayoutNavEntry *oo=new LayoutNavEntry( lne,LayoutNavEntry::MainPage,TRUE,ofile,ov,""); + kk->addChild(oo); } while (fn) @@ -2819,7 +2823,9 @@ QCString VhdlDocGen::parseForConfig(QCString & entity,QCString & arch) arch= ql[2].utf8(); ql=QStringList::split(exp,arch,FALSE); if (ql.count()>1) // expression + { arch=""; + } } return label; // label } @@ -2835,16 +2841,22 @@ QCString VhdlDocGen::parseForBinding(QCString & entity,QCString & arch) QStringList ql=QStringList::split(exp,entity,FALSE); if (ql.contains("open")) + { return "open"; + } label=ql[0].utf8(); entity = ql[1].utf8(); if ((index=entity.findRev("."))>=0) + { entity.remove(0,index+1); + } if (ql.count()==3) + { arch=ql[2].utf8(); + } return label; } @@ -2858,8 +2870,10 @@ QCString VhdlDocGen::parseForBinding(QCString & entity,QCString & arch) ClassDef *cd; for (;(cd=cli.current());++cli) { - if(stricmp(className,cd->name().data())==0) - return cd; + if (qstricmp(className,cd->name().data())==0) + { + return cd; + } } return 0; } @@ -2878,16 +2892,16 @@ void assignBinding(VhdlConfNode * conf) { QList<Entry> instList= getVhdlInstList(); QListIterator<Entry> eli(instList); - Entry *cur; - ClassDef *archClass,*entClass; + Entry *cur=0; + ClassDef *archClass=0,*entClass=0; QCString archName,entityName; QCString arcBind,entBind; - + bool others,all; entBind=conf->binding; QCString conf2=VhdlDocGen::parseForBinding(entBind,arcBind); - - if(stricmp(conf2.data(),"configuration")==0) + + if (conf2=="configuration") { QList<VhdlConfNode> confList = getVhdlConfiguration(); VhdlConfNode* vconf; @@ -2909,17 +2923,20 @@ void assignBinding(VhdlConfNode * conf) } } if (!found) + { err("error: %s%s",conf->binding.data()," could not be found"); + } //return; }// if - else{ // find entity work.entname(arch?) + else + { // find entity work.entname(arch?) QCString a=VhdlDocGen::getIndexWord(conf->compSpec.data(),0); QCString e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1); a=e+"::"+a; archClass= VhdlDocGen::findVhdlClass(a.data());//Doxygen::classSDict->find(a.data()); entClass= VhdlDocGen::findVhdlClass(e.data()); //Doxygen::classSDict->find(e.data()); } - + QCString label=conf->compSpec.lower(); //label.prepend("|"); @@ -2933,52 +2950,54 @@ void assignBinding(VhdlConfNode * conf) QCString allOt=VhdlDocGen::getIndexWord(conf->arch.data(),0); all=allOt.lower()=="all" ; others= allOt.lower()=="others"; - + for (;(cur=eli.current());++eli){ - + if (cur->exception.lower()==label || conf->isInlineConf) { QCString sign,archy; if (all || others) archy=VhdlDocGen::getIndexWord(conf->arch.data(),1); - else + else archy=conf->arch; - - - QCString inst1=VhdlDocGen::getIndexWord(archy.data(),0).lower(); - QCString comp=VhdlDocGen::getIndexWord(archy.data(),1).lower(); - QStringList ql=QStringList::split(",",inst1); - for(uint j=0;j<ql.count();j++) - { - QCString archy1,sign1; - if(all || others) - { - archy1=VhdlDocGen::getIndexWord(conf->arch.data(),1); - sign1=cur->type; - } - else - { - archy1=comp+":"+ql[j].utf8(); - sign1=cur->type+":"+cur->name; - } - - if (archy1==sign1.lower() && !cur->stat) + QCString inst1=VhdlDocGen::getIndexWord(archy.data(),0).lower(); + QCString comp=VhdlDocGen::getIndexWord(archy.data(),1).lower(); + + QStringList ql=QStringList::split(",",inst1); + + for(uint j=0;j<ql.count();j++) { - // fprintf(stderr," \n label [%s] [%s] [%s]",cur->exception.data(),cur->type.data(),cur->name.data()); - ClassDef *ent= VhdlDocGen::findVhdlClass(entBind.data());//Doxygen::classSDict->find(entBind.data()); - - if (entClass==0 || ent==0) - continue; - - addInstance(ent,archClass,entClass,cur); - cur->stat=TRUE; - break; - } - }// for - } + QCString archy1,sign1; + if(all || others) + { + archy1=VhdlDocGen::getIndexWord(conf->arch.data(),1); + sign1=cur->type; + } + else + { + archy1=comp+":"+ql[j].utf8(); + sign1=cur->type+":"+cur->name; + } + + if (archy1==sign1.lower() && !cur->stat) + { + // fprintf(stderr," \n label [%s] [%s] [%s]",cur->exception.data(),cur->type.data(),cur->name.data()); + ClassDef *ent= VhdlDocGen::findVhdlClass(entBind.data());//Doxygen::classSDict->find(entBind.data()); + + if (entClass==0 || ent==0) + { + continue; + } + + addInstance(ent,archClass,entClass,cur); + cur->stat=TRUE; + break; + } + }// for + } }//for }//assignBinding @@ -3031,8 +3050,6 @@ void VhdlDocGen::computeVhdlComponentRelations() entity=cur->type; } - - ClassDef *classEntity= VhdlDocGen::findVhdlClass(entity.data());//Doxygen::classSDict->find(entity); inst=VhdlDocGen::getIndexWord(cur->args.data(),0); ClassDef *cd=Doxygen::classSDict->find(inst); @@ -3050,23 +3067,23 @@ void VhdlDocGen::computeVhdlComponentRelations() static void addInstance(ClassDef* classEntity, ClassDef* ar, ClassDef *cd , Entry *cur,ClassDef* /*archBind*/) +{ + + QCString bName,n1; + if (ar==0) return; + + if (classEntity==0) { - - QCString bName,n1; - if (ar==0) return; + //add component inst + n1=cur->type; + goto ferr; + } - if(classEntity==0) - { - //add component inst - n1=cur->type; - goto ferr; - } - if (classEntity==cd) return; - bName=classEntity->name(); - // fprintf(stderr,"\naddInstance %s to %s %s %s\n", classEntity->name().data(),cd->name().data(),ar->name().data(),cur->name); - n1=classEntity->name().data(); + bName=classEntity->name(); + // fprintf(stderr,"\naddInstance %s to %s %s %s\n", classEntity->name().data(),cd->name().data(),ar->name().data(),cur->name); + n1=classEntity->name().data(); if (!cd->isBaseClass(classEntity, true, 0)) { @@ -3111,17 +3128,17 @@ ferr: md->setDocumentation(cur->doc.data(),cur->docFile.data(),cur->docLine); FileDef *fd=ar->getFileDef(); md->setBodyDef(fd); - - QCString info="Info: Elaborating entity "+n1; - fd=ar->getFileDef(); - info+=" for hierarchy "; - QRegExp epr("[|]"); - QCString label=cur->type+":"+cur->write+":"+cur->name; - label.replace(epr,":"); - info+=label; - fprintf(stderr,"\n[%s:%d:%s]\n",fd->fileName().data(),cur->startLine,info.data()); - ar->insertMember(md); - + + QCString info="Info: Elaborating entity "+n1; + fd=ar->getFileDef(); + info+=" for hierarchy "; + QRegExp epr("[|]"); + QCString label=cur->type+":"+cur->write+":"+cur->name; + label.replace(epr,":"); + info+=label; + fprintf(stderr,"\n[%s:%d:%s]\n",fd->fileName().data(),cur->startLine,info.data()); + ar->insertMember(md); + } @@ -3273,6 +3290,8 @@ static MemberDef* findMemFlow(const MemberDef* mdef) void VhdlDocGen::createFlowChart(const MemberDef *mdef) { + if (mdef==0) return; + QCString codeFragment; MemberDef* mm=0; if((mm=findMemFlow(mdef))!=0) @@ -3282,7 +3301,9 @@ void VhdlDocGen::createFlowChart(const MemberDef *mdef) return; } else + { mdList.append(mdef); + } //fprintf(stderr,"\n create flow mem %s %p\n",mdef->name().data(),mdef); @@ -3296,7 +3317,6 @@ void VhdlDocGen::createFlowChart(const MemberDef *mdef) VhdlDocGen::setFlowMember(mdef); Entry root; pIntf->parseInput("",codeFragment.data(),&root); - } bool VhdlDocGen::isConstraint(const MemberDef *mdef) @@ -3358,42 +3378,142 @@ bool VhdlDocGen::isMisc(const MemberDef *mdef) //############################## Flowcharts ################################################# +#define STARTL (FlowChart::WHILE_NO | FlowChart::IF_NO | \ + FlowChart::FOR_NO | FlowChart::CASE_NO | \ + FlowChart::LOOP_NO | WHEN_NO) +#define DECLN (FlowChart::WHEN_NO | \ + FlowChart::ELSIF_NO | FlowChart::IF_NO | \ + FlowChart::FOR_NO | FlowChart::WHILE_NO | \ + FlowChart::CASE_NO | FlowChart::LOOP_NO ) +#define STARTFIN (FlowChart::START_NO | FlowChart::END_NO) +#define LOOP (FlowChart::FOR_NO | FlowChart::WHILE_NO | \ + FlowChart::LOOP_NO ) +#define ENDCL (FlowChart::END_CASE | FlowChart::END_LOOP) +#define EEND (FlowChart::ENDIF_NO | FlowChart::ELSE_NO ) +#define IFF (FlowChart::ELSIF_NO | FlowChart::IF_NO) +#define EXITNEXT (FlowChart::EXIT_NO | FlowChart::NEXT_NO ) +#define EMPTY (EEND | FlowChart::ELSIF_NO) +#define EE (FlowChart::ELSE_NO | FlowChart::ELSIF_NO) +#define EMPTNODE (ENDCL | EEND | FlowChart::ELSIF_NO) +#define FLOWLEN (flowList.count()-1) + +static int ifcounter=0; +static int nodeCounter=0; + +struct +{ + // link colors + const char *textNodeLink; + const char *yesNodeLink; + const char *noNodeLink; + + // node colors + const char* comment; + const char* decisionNode; + const char* varNode; + const char *startEndNode; + const char* textNode; +} flowCol = +{ "green", // textNodeLink + "red", // yesNodeLink + "black", // noNodeLink + "khaki", // comment + "0.7 0.3 1.0", // decisionNode + "lightyellow", // varNode + "white", // startEndNode + "lightcyan" // textNode +}; + +QList<FlowChart> FlowChart::flowList; -#define STARTL (FlowNode::WHILE_NO | FlowNode::IF_NO | \ - FlowNode::FOR_NO | FlowNode::CASE_NO | \ - FlowNode::LOOP_NO ) -#define DECLN (FlowNode::NEXT_WHEN_NO | FlowNode::WHEN_NO | \ - FlowNode::ELSIF_NO | FlowNode::IF_NO | \ - FlowNode::FOR_NO | FlowNode::WHILE_NO | \ - FlowNode::CASE_NO | FlowNode::LOOP_NO ) -#define STARTFIN (FlowNode::START_NO | FlowNode::END_NO) -#define LOOP (FlowNode::FOR_NO | FlowNode::WHILE_NO | \ - FlowNode::LOOP_NO ) -#define ENDCL (FlowNode::END_CASE | FlowNode::END_LOOP) -#define EEND (FlowNode::ENDIF_NO | FlowNode::ELSE_NO) -#define IFF (FlowNode::ELSIF_NO | FlowNode::IF_NO) -#define EWHEN (FlowNode::NEXT_WHEN_NO) -#define EMPTY (EEND | FlowNode::ELSIF_NO) - -int FlowNode::ifcounter=0; -int FlowNode::nodeCounter=0; -int FlowNode::imageCounter=0; -int FlowNode::caseCounter=0; -QList<FlowNode> FlowNode::flowList; - -void FlowNode::colTextNodes() +#ifdef DEBUGFLOW +static QMap<QCString,int> keyMap; +#endif + +void FlowChart::printNode(const FlowChart* flo) +{ + if (flo==0) return; + QCString ui="-"; + QCString q,t; + QRegExp ep("[\t\n\r]"); + + ui.fill('-',255); + + if (flo->type & STARTL) + { + if (flo->stamp>0) + { + q=ui.left(2*flo->stamp); + } + else + { + q=" "; + } + QCString nn=flo->exp.stripWhiteSpace(); + printf("\nYES: %s%s[%d,%d]",q.data(),nn.data(),flo->stamp,flo->id); + } + else + { + if (flo->type & COMMENT_NO) + { + t=flo->label; + } + else + { + t=flo->text; + } + t=t.replace(ep,""); + if (t.isEmpty()) + { + t=" "; + } + if (flo->stamp>0) + { + q=ui.left(2*flo->stamp); + } + else + { + q=" "; + } + if (flo->type & EMPTNODE) + { + printf("\n NO: %s%s[%d,%d]",q.data(),FlowChart::getNodeType(flo->type),flo->stamp,flo->id); + } + else if (flo->type & COMMENT_NO) + { + printf("\n NO: %s%s[%d,%d]",t.data(),FlowChart::getNodeType(flo->type),flo->stamp,flo->id); + } + else + { + printf("\n NO: %s%s[%d,%d]",q.data(),t.data(),flo->stamp,flo->id); + } + } +} + +void FlowChart::printFlowTree() +{ + uint size=flowList.count(); + for (uint j=0;j<size;j++) + { + printNode(flowList.at(j)); + } +} + +void FlowChart::colTextNodes() { QCString text; - FlowNode *flno; + FlowChart *flno; bool found=FALSE; for (uint j=0;j<flowList.count();j++) { - FlowNode *flo=flowList.at(j); - if (flo->type==TEXT_NO) + FlowChart *flo=flowList.at(j); + if (flo->type&TEXT_NO) { text+=flo->text+'\n'; if (!found) + { flno=flo; + } if (found) { flno->text+=flo->text; @@ -3410,14 +3530,14 @@ void FlowNode::colTextNodes() // if..elseif without text for (uint j=0;j<flowList.count()-1;j++) { - FlowNode *flo=flowList.at(j); + FlowChart *flo=flowList.at(j); int kind=flo->type; - if ( kind & IFF || flo->type==ELSE_NO) + if ( (kind & IFF) || (flo->type & ELSE_NO)) { - FlowNode *ftemp=flowList.at(j+1); + FlowChart *ftemp=flowList.at(j+1); if (ftemp->type & EMPTY) { - FlowNode *fNew = new FlowNode(TEXT_NO,"empty ",0); + FlowChart *fNew = new FlowChart(TEXT_NO,"empty ",0); fNew->stamp=flo->stamp; flowList.insert(j+1,fNew); } @@ -3426,14 +3546,14 @@ void FlowNode::colTextNodes() }// colTextNode -QCString FlowNode::getNodeName(int n) +QCString FlowChart::getNodeName(int n) { QCString node; node.setNum(n); return node.prepend("node"); } -void FlowNode::delFlowList() +void FlowChart::delFlowList() { ifcounter=0; nodeCounter=0; @@ -3441,14 +3561,123 @@ void FlowNode::delFlowList() for (uint j=0;j <size ;j++) { - FlowNode *fll=flowList.at(j); + FlowChart *fll=flowList.at(j); delete fll; } flowList.clear(); } +void FlowChart::alignCommentNode(FTextStream &t,QCString com) +{ + uint max=0; + QCString s; + QStringList ql=QStringList::split("\n",com); + for (uint j=0;j<ql.count();j++) + { + s=(QCString)ql[j].utf8(); + if (max<s.length()) max=s.length(); + } + + s=ql.last().utf8(); + int diff=max-s.length(); + + QCString n(1); + if (diff>0) + { + n.fill(' ',2*diff); + n.append("."); + s+=n; + ql.remove(ql.last()); + ql.append(s); + } + + for (uint j=0;j<ql.count();j++) + { + s=(QCString)ql[j].utf8(); + if (j<ql.count()-1) + { + s+="\n"; + } + FlowChart::codify(t,s.data()); + } +} + + +void FlowChart::buildCommentNodes(FTextStream & t) +{ + uint size=flowList.count(); + bool begin=false; + + for (uint j=0;j < size-1 ;j++) + { + FlowChart *fll=flowList.at(j); + if (fll->type & COMMENT_NO) + { + FlowChart* to=flowList.at(j+1); + if (to->type & COMMENT_NO) + { + fll->label+="\n"; + QCString temp=fll->label+to->label; + to->label=temp; + flowList.remove(j); + size--; + if (j>0) j--; + } + } + }// for + + for (uint j=0;j <flowList.count() ;j++) + { + FlowChart *fll=flowList.at(j); + + if (fll->type & BEGIN_NO) + { + begin = true; + continue; + } + + if (fll->type & COMMENT_NO) + { + FlowChart* to; + if (!begin) + { + // comment between function/process .. begin is linked to start node + to=flowList.at(0); + } + else + { + to=flowList.at(j+1); + } + t << getNodeName(fll->id); + t << "[shape=none, label=<\n"; + t << "<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" >\n "; + t << "<TR><TD BGCOLOR=\""; + t << flowCol.comment; + t << "\" > "; + + FlowChart::alignCommentNode(t,fll->label); + t << " </TD></TR></TABLE>>];"; + writeEdge(t,fll->id,to->id,2); + } + }// for + + // delete comment nodes; + size=flowList.count(); + for (uint j=0;j < size;j++) + { + FlowChart *fll=flowList.at(j); + if (fll->type & (COMMENT_NO | BEGIN_NO)) + { + flowList.remove(j); + delete fll; + fll=0; + size--; + if (j>0) j--; + } + }// for; +} -void FlowNode::codify(FTextStream &t,const char *str) +void FlowChart::codify(FTextStream &t,const char *str) { if (str) { @@ -3471,31 +3700,38 @@ void FlowNode::codify(FTextStream &t,const char *str) } }//codify -FlowNode::~FlowNode() +FlowChart::~FlowChart() { } -FlowNode::FlowNode(int typ,const char * t,const char* ex,const char* label) +FlowChart::FlowChart(int typ,const char * t,const char* ex,const char* lab) { + stamp=ifcounter; + if (typ & STARTL) { ifcounter++; } - stamp=FlowNode::ifcounter; text=t; exp=ex; type=typ; - this->label=label; + label=lab; + if (typ & (ELSE_NO | ELSIF_NO)) + { + stamp--; + } - if (typ==START_NO || typ==END_NO || typ==VARIABLE_NO) + if (typ & (START_NO | END_NO | VARIABLE_NO)) + { stamp=-1; + } - id=++nodeCounter; + id=nodeCounter++; } -void FlowNode::addFlowNode(int type,const char* text,const char* exp, const char *label) +void FlowChart::addFlowChart(int type,const char* text,const char* exp, const char *label) { static QRegExp reg("[;]"); static QRegExp reg1("[\"]"); @@ -3512,122 +3748,92 @@ void FlowNode::addFlowNode(int type,const char* text,const char* exp, const char } if (exp) + { expression=expression.replace(reg1,"\\\""); + } + + FlowChart *fl=new FlowChart(type,typeString.data(),expression.data(),label); - FlowNode *fl=new FlowNode(type,typeString.data(),expression.data(),label); - if (type==START_NO) +#ifdef DEBUGFLOW + VhdlContainer* vc= getVhdlCont(); + fl->line=vc->yyLineNr; +#endif + + if (type & (START_NO | VARIABLE_NO)) + { flowList.prepend(fl); - else if (type==VARIABLE_NO) - flowList.insert(1,fl); + } else + { flowList.append(fl); + } } -void FlowNode::moveToPrevLevel() +void FlowChart::moveToPrevLevel() { if (!VhdlDocGen::getFlowMember()) return; ifcounter--; } -void FlowNode::setLabel(const char* t) -{ - FlowNode *fll=flowList.last(); - fll->label=t; - assert(fll->type & LOOP); - -} - -void FlowNode::printFlowList() -{ - uint size=FlowNode::flowList.count(); - for (uint j=0;j<size;j++) - { - FlowNode *fll=flowList.at(j); - QCString ty=getNodeType(fll->type); - - printf("============================================"); - if (!fll->text.isEmpty()) - { - printf("\n (%d) NODE:type %s text %s stamp:%d\n",fll->id,ty.data(),fll->text.data(),fll->stamp); - } - else - { - printf("\n (%d) NODE:type %s exp %s stamp:%d [%s]\n",fll->id,ty.data(),fll->exp.data(),fll->stamp,fll->label.data()); - } - - printf("============================================"); - }// for -} - - -QCString FlowNode::convertNameToFileName() +QCString FlowChart::convertNameToFileName() { - static QRegExp exp ("[#&*+-/<=>|$?^]"); + static QRegExp exp ("[^][a-z_A-Z0-9]"); QCString temp,qcs; const MemberDef* md=VhdlDocGen::getFlowMember(); - temp.sprintf("%p",md); - qcs=md->name(); + temp.sprintf("%p",md); + qcs=md->name(); -//long pp=(long)&temp; - - // string literal - VhdlDocGen::deleteAllChars(qcs,'"'); - - // functions like "<=", ">" - int u=qcs.find(exp,0); - - if (u>=0) + if (qcs.find(exp,0)>=0) { qcs.prepend("Z"); qcs=qcs.replace(exp,"_"); } - // temp=temp.setNum(1); return qcs+temp; } -const char* FlowNode::getNodeType(int c) +const char* FlowChart::getNodeType(int c) { switch(c) { - case FlowNode::IF_NO: return "if "; - case FlowNode::ELSIF_NO: return "elsif "; - case FlowNode::ELSE_NO: return "else "; - case FlowNode::CASE_NO: return "case "; - case FlowNode::WHEN_NO: return "when "; - case FlowNode::EXIT_NO: return "exit "; - case FlowNode::END_NO: return "end "; - case FlowNode::TEXT_NO: return "text "; - case FlowNode::START_NO: return "start "; - case FlowNode::ENDIF_NO: return "endif "; - case FlowNode::FOR_NO: return "for "; - case FlowNode::WHILE_NO: return "while "; - case FlowNode::END_LOOP: return "end_loop "; - case FlowNode::END_CASE: return "end_case "; - case FlowNode::VARIABLE_NO: return "variable_decl "; - case FlowNode::RETURN_NO: return "return "; - case FlowNode::LOOP_NO: return "infinte loop "; - case FlowNode::NEXT_NO: return "next "; - case FlowNode::EXIT_WHEN_NO: return "exit_when "; - case FlowNode::NEXT_WHEN_NO: return "next_when "; - case FlowNode::EMPTY_NO: return "empty "; + case IF_NO: return "if "; + case ELSIF_NO: return "elsif "; + case ELSE_NO: return "else "; + case CASE_NO: return "case "; + case WHEN_NO: return "when "; + case EXIT_NO: return "exit "; + case END_NO: return "end "; + case TEXT_NO: return "text "; + case START_NO: return "start "; + case ENDIF_NO: return "endif "; + case FOR_NO: return "for "; + case WHILE_NO: return "while "; + case END_LOOP: return "end_loop "; + case END_CASE: return "end_case "; + case VARIABLE_NO: return "variable_decl "; + case RETURN_NO: return "return "; + case LOOP_NO: return "infinte loop "; + case NEXT_NO: return "next "; + case COMMENT_NO: return "comment "; + case EMPTY_NO: return "empty "; + case BEGIN_NO: return "<begin> "; default: return "--failure--"; } } -void FlowNode::createSVG() +void FlowChart::createSVG() { QCString qcs("/"); QCString ov = Config_getString("HTML_OUTPUT"); - FlowNode::imageCounter++; - qcs+=FlowNode::convertNameToFileName()+".svg"; + qcs+=FlowChart::convertNameToFileName()+".svg"; //const MemberDef *m=VhdlDocGen::getFlowMember(); - //fprintf(stderr,"\n creating flowchart : %s %s in file %s \n",VhdlDocGen::trTypeString(m->getMemberSpecifiers()),m->name().data(),m->getFileDef()->name().data()); + //if (m) + // fprintf(stderr,"\n creating flowchart : %s %s in file %s \n",VhdlDocGen::trTypeString(m->getMemberSpecifiers()),m->name().data(),m->getFileDef()->name().data()); QCString dir=" -o "+ov+qcs; ov+="/flow_design.dot"; @@ -3640,8 +3846,7 @@ void FlowNode::createSVG() } } - -void FlowNode::startDot(FTextStream &t) +void FlowChart::startDot(FTextStream &t) { t << " digraph G { \n"; t << "rankdir=TB \n"; @@ -3649,12 +3854,12 @@ void FlowNode::startDot(FTextStream &t) t << "stylesheet=\"doxygen.css\"\n"; } -void FlowNode::endDot(FTextStream &t) +void FlowChart::endDot(FTextStream &t) { t << " } \n"; } -void FlowNode::writeFlowNode() +void FlowChart::writeFlowChart() { // assert(VhdlDocGen::flowMember); @@ -3670,24 +3875,30 @@ void FlowNode::writeFlowNode() } colTextNodes(); - // printFlowList( ); - FlowNode::startDot(t); + +#ifdef DEBUGFLOW + printFlowTree(); +#endif + + startDot(t); + buildCommentNodes(t); + uint size=flowList.count(); for (uint j=0;j <size ;j++) { - FlowNode *fll=flowList.at(j); + FlowChart *fll=flowList.at(j); writeShape(t,fll); } writeFlowLinks(t); - FlowNode::endDot(t); + FlowChart::endDot(t); delFlowList(); f.close(); - FlowNode::createSVG(); -}// writeFlowNode + FlowChart::createSVG(); +}// writeFlowChart -void FlowNode::writeShape(FTextStream &t,const FlowNode* fl) +void FlowChart::writeShape(FTextStream &t,const FlowChart* fl) { if (fl->type & EEND) return; QCString var; @@ -3706,10 +3917,37 @@ void FlowNode::writeShape(FTextStream &t,const FlowNode* fl) t<<getNodeName(fl->id).data(); QCString q=getNodeType(fl->type); + +#ifdef DEBUGFLOW + QCString qq(getNodeName(fl->id).data()); + keyMap.insert(qq,fl->id); +#endif + bool dec=(fl->type & DECLN); + bool exit=(fl->type & EXITNEXT); + if (exit && !fl->exp.isEmpty()) + { + dec=TRUE; + } if (dec) { - t << " [shape=diamond,style=filled,color=\".7 .3 1.0\",label=\" "+fl->exp+var+"\"]\n"; + t << " [shape=diamond,style=filled,color=\""; + t << flowCol.decisionNode; + t << "\",label=\" "; + QCString kl; + if (exit) kl=fl->text+" "; + + if (fl->label) + { + kl+=fl->label+":"+fl->exp+var; + } + else + { + kl+=fl->exp+var; + } + + FlowChart::alignCommentNode(t,kl); + t << "\"]\n"; } else if (fl->type & ENDCL) { @@ -3718,22 +3956,27 @@ void FlowNode::writeShape(FTextStream &t,const FlowNode* fl) } else if (fl->type & STARTFIN) { - static QRegExp reg1("[\"]"); QCString val=fl->text; - val=val.replace(reg1,"\\\""); t << "[shape=box , style=rounded label=<\n"; t << "<TABLE BORDER=\"0\" CELLBORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\" >\n "; - t << "<TR><TD BGCOLOR=\"white\" > "; - FlowNode::codify(t,val.data()); + t << "<TR><TD BGCOLOR=\""; + t<< flowCol.startEndNode; + t<< "\"> "; + FlowChart::alignCommentNode(t,val); t << " </TD></TR></TABLE>>];"; } else { if (fl->text.isEmpty()) return; - bool var=(fl->type & FlowNode::VARIABLE_NO) ; + bool var=(fl->type & FlowChart::VARIABLE_NO); QCString repl("<BR ALIGN=\"LEFT\"/>"); QCString q=fl->text; + if (exit) + { + q+=" "+fl->label; + } + int z=q.findRev("\n"); if (z==(int)q.length()-1) @@ -3744,371 +3987,359 @@ void FlowNode::writeShape(FTextStream &t,const FlowNode* fl) t << "<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" >\n "; if (var) { - t << "<TR><TD BGCOLOR=\"lightyellow\" > "; + t << "<TR><TD BGCOLOR=\"" << flowCol.varNode << "\" > "; } else { - t << "<TR><TD BGCOLOR=\"lightcyan\" > "; + t << "<TR><TD BGCOLOR=\"" << flowCol.textNode << "\" > "; } - FlowNode::codify(t,q.data()); + FlowChart::alignCommentNode(t,q); t << " </TD></TR></TABLE>>];"; } } -void FlowNode::writeEdge(FTextStream &t,const FlowNode* fl_from,const FlowNode* fl_to,int i) +void FlowChart::writeEdge(FTextStream &t,const FlowChart* fl_from,const FlowChart* fl_to,int i) { - checkNode(fl_to); - writeEdge(t,fl_from->id,fl_to->id,i); + bool b=fl_from->type & STARTL; + bool c=fl_to->type & STARTL; + +#ifdef DEBUGFLOW + QCString s1(getNodeName(fl_from->id).data()); + QCString s2(getNodeName(fl_to->id).data()); + QMap<QCString, int>::Iterator it = keyMap.find(s1); + QMap<QCString, int>::Iterator it1 = keyMap.find(s2); + // checks if the link is connected to a valid node + assert(it.key()); + assert(it1.key()); +#endif + + writeEdge(t,fl_from->id,fl_to->id,i,b,c); } -void FlowNode::writeEdge(FTextStream &t,int fl_from,int fl_to,int i) +void FlowChart::writeEdge(FTextStream &t,int fl_from,int fl_to,int i,bool bFrom,bool bTo) { QCString label,col; if (i==0) { - col="red"; + col=flowCol.yesNodeLink; label="yes"; } else if (i==1) { - col="black"; + col=flowCol.noNodeLink; label="no"; } else { - col="green"; + col=flowCol.textNodeLink; label=""; } - t<<"edge [color=\""+col+"\",label=\""+label+"\"]\n"; - t<<getNodeName(fl_from).data(); - t<<"->"; - t<<getNodeName(fl_to).data(); - t<<"\n"; + t << "edge [color=\""+col+"\",label=\""+label+"\"]\n"; + t << getNodeName(fl_from).data(); + if (bFrom) t << ":s"; + t << "->"; + t << getNodeName(fl_to).data(); + if (bTo) t << ":n"; + t << "\n"; } - -void FlowNode::checkNode(const FlowNode* /*flo*/) +void FlowChart::alignFuncProc( QCString & q,const ArgumentList* al,bool isFunc) { - // assert(!(flo->type & IDLE)); -} + if (al==0) return; -void FlowNode::checkNode(int /*z*/) -{ - // FlowNode *flo=flowList.at(z); - //assert(!(flo->type & IDLE)); -} + ArgumentListIterator ali(*al); + int index=ali.count(); + if (index==0) return; -int FlowNode::getNextNode(int index) -{ - for (uint j=index+1;j<flowList.count();j++) + int len=q.length()+VhdlDocGen::getFlowMember()->name().length(); + QCString prev,temp; + prev.fill(' ',len+1); + + Argument *arg; + bool first=TRUE; + q+="\n"; + for (;(arg=ali.current());++ali) { - FlowNode *flo=flowList.at(j); - int kind=flo->type; - if (kind & FlowNode::ENDIF_NO) - { - continue; - } + QCString attl=arg->defval+" "; + attl+=arg->name+" "; - if (kind==ELSE_NO || kind==ELSIF_NO) + if (!isFunc) { - j=findNode(j,flo->stamp,FlowNode::ENDIF_NO); + attl+=arg->attrib+" "; } else { - return j; + attl+=" in "; } - } + attl+=arg->type; + if (--index) attl+=",\n"; else attl+="\n"; + + attl.prepend(prev.data()); + temp+=attl; + first=FALSE; + } - return flowList.count()-1; + q+=temp; } -int FlowNode::findNode(int index,int type) +int FlowChart::findNextLoop(int index,int stamp) { for (uint j=index+1;j<flowList.count();j++) { - FlowNode *flo=flowList.at(j); - if (flo->type==type) + FlowChart *flo=flowList.at(j); + if (flo->stamp==stamp) + { + continue; + } + if (flo->type&END_LOOP) { return j; } } return flowList.count()-1; -}// findNode +} + +int FlowChart::findPrevLoop(int index,int stamp,bool endif) +{ + for (uint j=index;j>0;j--) + { + FlowChart *flo=flowList.at(j); + if (flo->type & LOOP) + { + if (flo->stamp==stamp && endif) + { + return j; + } + else + { + if (flo->stamp<stamp) + { + return j; + } + } + } + } + return flowList.count()-1; +} +int FlowChart::findLabel(int index,QCString &label) +{ + for (uint j=index;j>0;j--) + { + FlowChart *flo=flowList.at(j); + if ((flo->type & LOOP) && !flo->label.isEmpty() && qstricmp(flo->label,label)==0) + { + return j; + } + } + err("could not find label: ",label.data()); + return 0; +} -int FlowNode::findNode(int index,int stamp,int type) +int FlowChart::findNode(int index,int stamp,int type) { for (uint j=index+1;j<flowList.count();j++) { - FlowNode *flo=flowList.at(j); + FlowChart *flo=flowList.at(j); if (flo->type==type && flo->stamp==stamp) { return j; } } - return flowList.count()-1; + return 0; }// findNode -int FlowNode::getNoLink(const FlowNode* fl,uint index) +int FlowChart::getNextNode(int index,int stamp) { - for (uint j=index+1;j<flowList.count();j++) { - FlowNode *flo=FlowNode::flowList.at(j); - if (flo->type==IF_NO && flo->stamp==fl->stamp) + FlowChart *flo=flowList.at(j); + int kind=flo->type; + int s=flo->stamp; + if (s>stamp) { - return j; + continue; } - - if (flo->type==ELSE_NO && flo->stamp==fl->stamp) + if (kind & ENDIF_NO) { - return j+1; + if (s<stamp && stamp>0) + { + stamp--; + continue; + } } - - if (flo->type==ELSIF_NO && flo->stamp==fl->stamp) + if (kind & (ELSE_NO | ELSIF_NO)) { - return j; + if (s<stamp && stamp>0) + { + stamp--; + } + j=findNode(j,stamp,ENDIF_NO); + continue; } - - if ((flo->type & ENDIF_NO) && flo->stamp==fl->stamp) + if (kind & WHEN_NO) { - return getNextNode(j); + if (s<stamp && stamp>0) + { + stamp--; + } + return findNode(j,stamp-1,END_CASE); } - + return j; } - return flowList.count()-1;// end process + return FLOWLEN; } -int FlowNode::getTextLink(const FlowNode* /*fl*/,uint index) +int FlowChart::getNextIfLink(const FlowChart* fl,uint index) { - assert(FlowNode::flowList.count()>index); + int stamp=fl->stamp; + uint start = index+1; + int endifNode = findNode(start,stamp,ENDIF_NO); + int elseifNode = findNode(start,stamp,ELSIF_NO); + int elseNode = findNode(start,stamp,ELSE_NO); - uint i=index+1; + assert(endifNode>-1); - FlowNode *flo=flowList.at(i); - if (flo->type==IF_NO) + if (elseifNode>0 && elseifNode<endifNode) { - return i; + return elseifNode; } - if (FlowNode::caseCounter) - { - return FlowNode::findNode(index,END_CASE); - } - else + if (elseNode>0 && elseNode<endifNode) { - i = FlowNode::getNextNode(index); + return elseNode+1; } - if (i>0) return i; - - return flowList.count()-1;// end process -} - -int FlowNode::findNextLoop(int index,int stamp) -{ - for (uint j=index+1;j<FlowNode::flowList.count();j++) - { - FlowNode *flo=FlowNode::flowList.at(j); - if (flo->type==END_LOOP && flo->stamp==stamp) - { - return j; - } - } - return flowList.count()-1; -} - -int FlowNode::findPrevLoop(int index,int stamp) -{ - for (uint j=index;j>0;j--) - { - FlowNode *flo=flowList.at(j); - if (flo->type & LOOP) - { - if ( flo->stamp==stamp) - { - return j; - } - } - } - err("end loop without loop"); - assert(FALSE); - return flowList.count()-1; -} - - -int FlowNode::findLabel(int index,QCString & label) -{ - for (uint j=index;j>0;j--) - { - FlowNode *flo=flowList.at(j); - if ((flo->type & LOOP) && !flo->label.isEmpty() && stricmp(flo->label.data(),label.data())==0) - { - return findNode(j,flo->stamp,END_LOOP); - } - } - return 0; + stamp=flowList.at(endifNode)->stamp; + return getNextNode(endifNode,stamp); } - -void FlowNode::writeFlowLinks(FTextStream &t) +void FlowChart::writeFlowLinks(FTextStream &t) { - uint size=flowList.count(); if (size<2) return; - // start link + // write start link writeEdge(t,flowList.at(0),flowList.at(1),2); for (uint j=0;j<size;j++) { - FlowNode *fll=flowList.at(j); + FlowChart *fll=flowList.at(j); int kind=fll->type; - if (kind==ELSE_NO || kind==ENDIF_NO) + int stamp=fll->stamp; + if (kind & EEND) { continue; } - if (kind==IF_NO) + if (kind & IFF) { writeEdge(t,fll,flowList.at(j+1),0); - int z=getNoLink(fll,j); + int z=getNextIfLink(fll,j); + // assert(z>-1); writeEdge(t,fll,flowList.at(z),1); } - - if (kind==ELSIF_NO) + else if (kind & LOOP_NO) { - writeEdge(t,fll,flowList.at(j+1),0); - int z=getNoLink(fll,j); - writeEdge(t,fll,flowList.at(z),1); + writeEdge(t,fll,flowList.at(j+1),2); + continue; } - - if ((kind & LOOP) && kind!=LOOP_NO) + else if (kind & (CASE_NO | FOR_NO | WHILE_NO)) { - writeEdge(t,fll,flowList.at(j+1),0); - int z=findNode(j,fll->stamp,END_LOOP); - z = getNextNode(z); - writeEdge(t,fll,flowList.at(z),1); - } + if (kind & CASE_NO) + { + writeEdge(t,fll,flowList.at(j+1),2); + continue; + } + else + { + writeEdge(t,fll,flowList.at(j+1),0); + } - if (kind==LOOP_NO) - { - writeEdge(t,fll,flowList.at(j+1),0); - } + kind=END_LOOP; + int z=findNode(j+1,fll->stamp,kind); + z=getNextNode(z,flowList.at(z)->stamp); - if (kind==TEXT_NO || kind==VARIABLE_NO) + // assert(z>-1); + writeEdge(t,fll,flowList.at(z),1); + continue; + } + else if (kind & (TEXT_NO | VARIABLE_NO)) { - int z=getTextLink(fll,j); + int z=getNextNode(j,stamp); writeEdge(t,fll,flowList.at(z),2); } - - if (kind==WHEN_NO) + else if (kind & WHEN_NO) { writeEdge(t,fll,flowList.at(j+1),0); - int z=flowList.count()-1; - int u=findNode(j,fll->stamp,WHEN_NO); - if (u<z) - writeEdge(t,fll,FlowNode::flowList.at(u),1); - else { - z=findNode(j,fll->stamp,END_CASE); - writeEdge(t,fll,FlowNode::flowList.at(z),1); - } - } - - if (kind==CASE_NO) - { - writeEdge(t,fll,flowList.at(j+1),2); - caseCounter++; - } + int u=findNode(j,stamp,WHEN_NO); + int v=findNode(j,stamp-1,END_CASE); - if (kind==RETURN_NO) - { - writeEdge(t,fll,FlowNode::flowList.at(size-1),2); - } - - if (kind==EXIT_NO) - { - int z; - if (!fll->label.isEmpty()) + if (u>0 && u<v) { - z=findLabel(j,fll->label); - z=getNextNode(z); - //assert(z!=0); + writeEdge(t,fll,flowList.at(u),1); } else { - z =findNextLoop(j,fll->stamp); - z=getNextNode(z); + writeEdge(t,fll,flowList.at(v),1); } - writeEdge(t,fll,flowList.at(z),2); } - - if (kind==END_CASE) + else if (kind & END_CASE) { - int z=FlowNode::getNextNode(j); + int z=FlowChart::getNextNode(j,fll->stamp); writeEdge(t,fll,flowList.at(z),2); - caseCounter--; } - - if (kind==END_LOOP) + else if (kind & END_LOOP) { - int z=findPrevLoop(j,fll->stamp); + int z=findPrevLoop(j,fll->stamp,true); writeEdge(t,fll,flowList.at(z),2); } - - if (kind & EWHEN) + else if (kind & RETURN_NO) { - writeEdge(t,fll,flowList.at(j+1),0); - int z=getNextNode(j+1); - writeEdge(t,fll,flowList.at(z),1); + writeEdge(t,fll,FlowChart::flowList.at(size-1),2); } - - if (kind & NEXT_NO) + else if (kind & (EXIT_NO | NEXT_NO)) { - int z=findNode(j,fll->stamp,END_LOOP); - writeEdge(t,fll,flowList.at(z),1); + int z; + bool b = kind==NEXT_NO; + if (fll->exp) + { + writeEdge(t,fll,flowList.at(j+1),1); + } + if (!fll->label.isEmpty()) + { + z=findLabel(j,fll->label); + if (b) + { + writeEdge(t,fll,flowList.at(z),0); + } + else + { + z=findNode(z,flowList.at(z)->stamp,END_LOOP); + z=getNextNode(z,flowList.at(z)->stamp); + writeEdge(t,fll,flowList.at(z),0); + } + continue; + } + else + { + if (b) + { + z=findPrevLoop(j,fll->stamp); + writeEdge(t,fll,flowList.at(z),0); + continue; + } + else + { + z =findNextLoop(j,fll->stamp-1); + } + z=getNextNode(z,flowList.at(z)->stamp); + } + writeEdge(t,fll,flowList.at(z),0); } } //for } //writeFlowLinks -void FlowNode::alignFuncProc( QCString & q,const ArgumentList* al,bool isFunc) -{ - if (al==0) return; - - ArgumentListIterator ali(*al); - int index=ali.count(); - if (index==0) return; - - int len=q.length()+VhdlDocGen::getFlowMember()->name().length(); - QCString prev,temp; - prev.fill(' ',len+1); - - Argument *arg; - q+="\n"; - for (;(arg=ali.current());++ali) - { - QCString attl=arg->defval+" "; - attl+=arg->name+" "; - - if (!isFunc) - { - attl+=arg->attrib+" "; - } - else - { - attl+=" in "; - } - - attl+=arg->type; - - if (--index) attl+=",\n"; else attl+="\n"; - - attl.prepend(prev.data()); - temp+=attl; - } - q+=temp; -} - diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h index b26cd63..e6a720c 100644 --- a/src/vhdldocgen.h +++ b/src/vhdldocgen.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -116,8 +116,8 @@ class VhdlDocGen static MemberDef* findFunction(const QList<Argument> &ql, const QCString& name, const QCString& package, bool type); - static bool compareString(const QCString& s1, - const QCString& s2); + static int compareString(const QCString& s1, + const QCString& s2); static QCString getClassTitle(const ClassDef*); static void writeInlineClassLink(const ClassDef*, OutputList &ol); @@ -259,11 +259,12 @@ class VhdlDocGen static void writeRecorUnit(QCString & largs,OutputList& ol ,const MemberDef *mdef); }; +//#define DEBUGFLOW -class FlowNode +class FlowChart { public: - enum nodeType { + enum nodeTypes { IF_NO = 1<<1, ELSIF_NO = 1<<2, ELSE_NO = 1<<3, @@ -282,9 +283,9 @@ class FlowNode RETURN_NO = 1<<16, LOOP_NO = 1<<17, NEXT_NO = 1<<18, - EXIT_WHEN_NO = 1<<19, - NEXT_WHEN_NO = 1<<20, - EMPTY_NO = 1<<21 + EMPTY_NO = 1<<19, + COMMENT_NO = 1<<20, + BEGIN_NO = 1<<21 }; //---------- create svg ------------------------------------------------------------- @@ -292,53 +293,50 @@ class FlowNode static void startDot(FTextStream &t); static void endDot(FTextStream &t); static void codify(FTextStream &t,const char *str); - static void writeShape(FTextStream &t,const FlowNode* fl); - static void writeEdge(FTextStream &t,int fl_from,int fl_to,int i); - static void writeEdge(FTextStream &t,const FlowNode* fl_from,const FlowNode* fl_to,int i); - //static void writeEndNode(FTextStream &t,const FlowNode* fl); + static void writeShape(FTextStream &t,const FlowChart* fl); + static void writeEdge(FTextStream &t,int fl_from,int fl_to,int i,bool bFrom=FALSE,bool bTo=FALSE); + static void writeEdge(FTextStream &t,const FlowChart* fl_from,const FlowChart* fl_to,int i); static void writeFlowLinks(FTextStream &t); - //static void writeStartNode(FTextStream &t,const FlowNode* fl); - static void checkNode(int); - static void checkNode(const FlowNode*); static QCString getNodeName(int n); static void colTextNodes(); - static int getTextLink(const FlowNode* fl,uint index); - static int getNoLink(const FlowNode*,uint); - static int getNextNode(int); + static int getNextTextLink(const FlowChart* fl,uint index); + static int getNextIfLink(const FlowChart*,uint); + static int getNextNode(int,int); static int findNode(int index,int stamp,int type); static int findNode(int index,int type); static int findNextLoop(int j,int stamp); - static int findPrevLoop(int j,int stamp); + static int findPrevLoop(int j,int stamp,bool endif=FALSE); static int findLabel(int j,QCString &); static void delFlowList(); static const char* getNodeType(int c); - static void addFlowNode(int type,const char* text,const char* exp,const char * label=NULL); + static void addFlowChart(int type,const char* text,const char* exp,const char * label=NULL); static void moveToPrevLevel(); - static void printFlowList(); - static void setLabel(const char* text); static int getTimeStamp(); - static void printNodeList(); - static void writeFlowNode(); + static void writeFlowChart(); static void alignFuncProc(QCString & q,const ArgumentList* al,bool isFunc); static QCString convertNameToFileName(); + static void printNode(const FlowChart* n); + static void printFlowTree(); + static void buildCommentNodes(FTextStream &t); + static void alignCommentNode(FTextStream &t,QCString com); - static QList<FlowNode> flowList; - static int ifcounter; - static int nodeCounter; - static int imageCounter; - static int caseCounter; + static QList<FlowChart> flowList; - FlowNode(int typ,const char* t,const char* ex,const char* label=NULL); - ~FlowNode(); + FlowChart(int typ,const char* t,const char* ex,const char* label=0); + ~FlowChart(); private: int id; int stamp; int type; +#ifdef DEBUGFLOW + int line; +#endif + QCString label; QCString text; QCString exp; diff --git a/src/vhdlparser.y b/src/vhdlparser.y index a525666..776ac7e 100644 --- a/src/vhdlparser.y +++ b/src/vhdlparser.y @@ -1,3 +1,17 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2013 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ /********************************************************************************************* * The original was a VHDL parser description to be used with GMD Compiler @@ -121,7 +135,7 @@ static void addProto(const char *s1,const char *s2,const char *s3, static void createFunction(const QCString &impure,int spec, const QCString &fname); -static void createFlow(QCString s); +static void createFlow(); void newVhdlEntry() { @@ -400,7 +414,7 @@ physical_literal_1 : /* empty */ { $$=""; } physical_literal_no_default : t_AbstractLit t_Identifier { $$=$1+" "+$2; } idf_list : t_Identifier { $$=$1; } - | idf_list t_Comma t_Identifier { $$=$1+","+$3} + | idf_list t_Comma t_Identifier { $$=$1+","+$3; } ; /*------------------------------------------ @@ -487,7 +501,7 @@ entity_decl_2 : /* empty */ { $$=""; } | t_PORT { currP=VhdlDocGen::PORT; } interf_list t_Semicolon { currP=0; } ; entity_decl_1 : /* empty */ { $$=""; } - | t_GENERIC { currP=VhdlDocGen::GENERIC;parse_sec=GEN_SEC} interf_list t_Semicolon{ currP=0;parse_sec=0; } + | t_GENERIC { currP=VhdlDocGen::GENERIC;parse_sec=GEN_SEC; } interf_list t_Semicolon{ currP=0;parse_sec=0; } | t_GENERIC error t_Semicolon{ currP=0; } ; @@ -601,24 +615,24 @@ common_decltve_item_1: package_body common_decltve_item_1: subprogram_instantiation_decl -common_decltve_item: type_decl{$$=$1;} -common_decltve_item: subtype_decl{$$=$1;} -common_decltve_item: constant_decl{ $$=$1;} -common_decltve_item: file_decl{$$=$1;} -common_decltve_item: alias_decl{$$=$1;} -common_decltve_item: subprog_decl{$$=$1;} -common_decltve_item: use_clause {$$=$1;} +common_decltve_item: type_decl{ $$=$1; } +common_decltve_item: subtype_decl{ $$=$1; } +common_decltve_item: constant_decl{ $$=$1; } +common_decltve_item: file_decl{ $$=$1; } +common_decltve_item: alias_decl{ $$=$1; } +common_decltve_item: subprog_decl{ $$=$1; } +common_decltve_item: use_clause { $$=$1; } -entity_decltve_item: common_decltve_item {$$=$1;} -entity_decltve_item: subprog_body {$$=$1;} -entity_decltve_item: attribute_decl {$$=$1;} -entity_decltve_item: attribute_spec {$$=$1;} -entity_decltve_item: disconnection_spec {$$=$1;} -entity_decltve_item: signal_decl {$$=$1;} -entity_decltve_item: variable_decl {$$=$1;} -entity_decltve_item: group_template_declaration {$$=$1;} -entity_decltve_item: group_declaration {$$=$1;} -entity_decltve_item: common_decltve_item_1 {$$="";} +entity_decltve_item: common_decltve_item { $$=$1; } +entity_decltve_item: subprog_body { $$=$1; } +entity_decltve_item: attribute_decl { $$=$1; } +entity_decltve_item: attribute_spec { $$=$1; } +entity_decltve_item: disconnection_spec { $$=$1; } +entity_decltve_item: signal_decl { $$=$1; } +entity_decltve_item: variable_decl { $$=$1; } +entity_decltve_item: group_template_declaration { $$=$1; } +entity_decltve_item: group_declaration { $$=$1; } +entity_decltve_item: common_decltve_item_1 { $$=""; } block_decltve_item: common_decltve_item @@ -632,8 +646,8 @@ 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_decltve_item: common_decltve_item_1 { $$=""; } +block_decltve_item: tool_directive { $$=""; } block_declarative_part: block_decltve_item | block_declarative_part block_decltve_item @@ -661,16 +675,16 @@ 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 {$$=$1;} -subprog_decltve_item: subprog_body {$$="";} -subprog_decltve_item: attribute_decl {$$=$1;} -subprog_decltve_item: attribute_spec {$$=$1;} -subprog_decltve_item: variable_decl {$$=$1;} +subprog_decltve_item: common_decltve_item { $$=$1; } +subprog_decltve_item: subprog_body { $$=""; } +subprog_decltve_item: attribute_decl { $$=$1; } +subprog_decltve_item: attribute_spec { $$=$1; } +subprog_decltve_item: variable_decl { $$=$1; } subprog_decltve_item: group_template_declaration -subprog_decltve_item: group_declaration {$$="";} -subprog_decltve_item: common_decltve_item_1 {$$="";} +subprog_decltve_item: group_declaration { $$=""; } +subprog_decltve_item: common_decltve_item_1 { $$=""; } -procs_decltve_item: subprog_decltve_item {$$=$1;} +procs_decltve_item: subprog_decltve_item { $$=$1; } config_decltve_item: attribute_spec { $$=$1; } config_decltve_item: use_clause { $$=$1; } @@ -736,11 +750,19 @@ subprog_spec_2: subprog_spec_22 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 +subprog_body: subprog_spec t_IS subprog_body_1 { - tempEntry->endBodyLine=s_str.yyLineNr; - createFlow($3); - currP=0; + if ($3.data()) + { + FlowChart::addFlowChart(FlowChart::VARIABLE_NO,$3,0); + } + FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0); + } + t_BEGIN seq_stats t_END subprog_body_2 t_Semicolon + { + tempEntry->endBodyLine=s_str.yyLineNr; + createFlow(); + currP=0; } subprog_body: subprog_spec t_IS error t_END subprog_body_2 t_Semicolon { @@ -754,11 +776,11 @@ 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: /* empty */ { $$=""; } //subprog_body_1 : subprogram_instantiation_decl -subprog_body_1: subprog_body_1 subprog_body_3 {$$=$1+$2; } +subprog_body_1: subprog_body_1 subprog_body_3 { $$=$1+$2; } -subprog_body_3: subprog_decltve_item { $$=$1; } +subprog_body_3: subprog_decltve_item { $$=$1; } /*-------------------------------------------------- -- Interface Lists and Associaton Lists @@ -881,19 +903,19 @@ shift_op: t_SLL { $$="sll"; } | t_ROR { $$="ror"; } | t_ROL { $$="rol"; } ; -and_relation: relation shift_op relation {$$= $1+$2+$3; } -and_relation: relation t_AND relation {$$= $1+" and "+$3; } -and_relation: relation t_XOR relation {$$= $1+" xor "+$3; } -and_relation: relation t_OR relation {$$= $1+" or "+$3; } -and_relation: relation t_NOR relation {$$= $1+" nor "+$3; } -and_relation: relation t_XNOR relation {$$= $1+"xnor"+$3; } -and_relation: relation t_NAND relation {$$= $1+"nand"+$3; } -and_relation: and_relation t_NAND relation {$$= $1+"nand"+$3; } -and_relation: and_relation t_NOR relation{$$= $1+"nor"+$3; } -and_relation: and_relation t_XNOR relation {$$= $1+"nand"+$3; } -and_relation: and_relation t_AND relation {$$= $1+" and "+$3; } -and_relation: and_relation t_OR relation {$$= $1+" or "+$3; } -and_relation: and_relation t_XOR relation {$$= $1+" xor "+$3; } +and_relation: relation shift_op relation { $$= $1+$2+$3; } +and_relation: relation t_AND relation { $$= $1+" and "+$3; } +and_relation: relation t_XOR relation { $$= $1+" xor "+$3; } +and_relation: relation t_OR relation { $$= $1+" or "+$3; } +and_relation: relation t_NOR relation { $$= $1+" nor "+$3; } +and_relation: relation t_XNOR relation { $$= $1+"xnor"+$3; } +and_relation: relation t_NAND relation { $$= $1+"nand"+$3; } +and_relation: and_relation t_NAND relation { $$= $1+"nand"+$3; } +and_relation: and_relation t_NOR relation{ $$= $1+"nor"+$3; } +and_relation: and_relation t_XNOR relation { $$= $1+"nand"+$3; } +and_relation: and_relation t_AND relation { $$= $1+" and "+$3; } +and_relation: and_relation t_OR relation { $$= $1+" or "+$3; } +and_relation: and_relation t_XOR relation { $$= $1+" xor "+$3; } /* ;relation : unary_operator primary */ @@ -908,25 +930,25 @@ 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; } +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; } @@ -1072,7 +1094,7 @@ physical_type_definition_2: secondary_unit_decl { $$=$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 @@ -1084,8 +1106,8 @@ unconstrained_array_definition: t_ARRAY t_LeftParen } 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 } +unconstrained_array_definition_1: unconstrained_array_definition_1 unconstrained_array_definition_2 { $$=$1+" "+$2; } +unconstrained_array_definition_2: t_Comma index_subtype_definition { $$=", "+$2; } index_subtype_definition: mark t_RANGE t_Box { $$=$1+" range<> "; } @@ -1247,14 +1269,14 @@ file_decl_1: /* empty */ { $$=""; } file_decl_1: mode { $$=$1; } disconnection_spec: t_DISCONNECT signal_list t_Colon mark t_AFTER expr t_Semicolon - { $$="disconnect "+$2+":"+$4+" after "+$6;} + { $$="disconnect "+$2+":"+$4+" after "+$6; } -signal_list: name signal_list_1 { $$=$1+$2;} -signal_list: t_OTHERS { $$="others";} -signal_list: t_ALL { $$="all";} -signal_list_1: /* empty */ { $$="";} -signal_list_1: signal_list_1 signal_list_2 { $$=$1+$2;} -signal_list_2: t_Comma name {$$=" , "+$2;} +signal_list: name signal_list_1 { $$=$1+$2; } +signal_list: t_OTHERS { $$="others"; } +signal_list: t_ALL { $$="all"; } +signal_list_1: /* empty */ { $$=""; } +signal_list_1: signal_list_1 signal_list_2 { $$=$1+$2; } +signal_list_2: t_Comma name { $$=" , "+$2; } /*-------------------------------------------------- -- Attribute Declarations and Specifications @@ -1273,7 +1295,7 @@ attribute_spec: t_ATTRIBUTE t_Identifier t_OF entity_spec t_IS expr t_Semicolon $$="attribute "+att+";"; } -entity_spec : entity_name_list signature t_Colon entity_class { $$=$1+$2+":"+$4;} +entity_spec : entity_name_list signature t_Colon entity_class { $$=$1+$2+":"+$4; } entity_name_list: designator entity_name_list_1 { $$=$1+" "+$2; } entity_name_list: t_OTHERS { $$="others"; } @@ -1309,8 +1331,8 @@ entity_class: t_PROPERTY { $$="property"; } if_generation_scheme: if_scheme { $$=$1; } -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: 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 { $$="else generate "+$3; } @@ -1320,79 +1342,81 @@ if_scheme_1: if_scheme_1 if_scheme_3 { $$=$1+$2; } if_scheme_3: t_ELSIF expr t_GENERATE generate_statement_body { $$="elsif "+$2+" generate "+$4; } if_scheme_3: t_ELSIF lable expr t_GENERATE generate_statement_body { $$="elsif "+$2+$3+" generate "+$5; } -generation_scheme: for_scheme {$$=$1;} +generation_scheme: for_scheme { $$=$1; } -iteration_scheme: for_scheme {$$=$1;} -iteration_scheme: while_scheme {$$=$1;} +iteration_scheme: for_scheme { $$=$1; } +iteration_scheme: while_scheme { $$=$1; } for_scheme: t_FOR t_Identifier t_IN discrete_range { - if(!lab.isEmpty()) - $$=lab+" :for "+$2+" in "+$4; - else - $$=" for "+$2+" in "+$4; - FlowNode::addFlowNode(FlowNode::FOR_NO,0,$$,lab.data()); - lab.resize(0); + if (!lab.isEmpty()) + { + $$=lab+" :for "+$2+" in "+$4; + } + else + { + $$=" for "+$2+" in "+$4; + } + FlowChart::addFlowChart(FlowChart::FOR_NO,0,$$,lab.data()); + lab.resize(0); } for_scheme: t_FOR lable t_Identifier t_IN discrete_range - { - $$=lab+" for "+$2+$3+" in "+$5; - FlowNode::addFlowNode(FlowNode::FOR_NO,0,$$,lab.data()); - lab=""; - } + { + $$=lab+" for "+$2+$3+" in "+$5; + FlowChart::addFlowChart(FlowChart::FOR_NO,0,$$,lab.data()); + lab=""; + } while_scheme: t_WHILE expr { - $$=" while "+$2; - FlowNode::addFlowNode(FlowNode::WHILE_NO,0,$$,lab.data()); - lab=""; - } + $$=" while "+$2; + FlowChart::addFlowChart(FlowChart::WHILE_NO,0,$$,lab.data()); + lab=""; + } /*-------------------------------------------------- -- Concurrent Statements ----------------------------------------------------*/ -concurrent_stats: concurrent_stats_1 {$$=$1;} -concurrent_stats_1: /* empty */ {$$="";} -concurrent_stats_1: concurrent_stats_1 concurrent_stats_2 {$$=$1+$2;} -concurrent_stats_2: concurrent_stat {$$=$1;} - -concurrent_stat : block_stat {$$=$1;} - | concurrent_assertion_stat {$$=$1;} - | concurrent_procedure_call {$$=$1;} - | concurrent_signal_assign_stat {$$=$1;} - | comp_inst_stat - { - QCString li=$1; - $$=$1; - - } - | generate_stat {$$=$1;} +concurrent_stats: concurrent_stats_1 { $$=$1; } +concurrent_stats_1: /* empty */ { $$=""; } +concurrent_stats_1: concurrent_stats_1 concurrent_stats_2 { $$=$1+$2; } +concurrent_stats_2: concurrent_stat { $$=$1; } + +concurrent_stat : block_stat { $$=$1; } + | concurrent_assertion_stat { $$=$1; } + | concurrent_procedure_call { $$=$1; } + | concurrent_signal_assign_stat { $$=$1; } + | comp_inst_stat { + QCString li=$1; + $$=$1; + } + | generate_stat { $$=$1; } | procs_stat -block_stat: t_Identifier t_Colon t_BLOCK {pushLabel(genLabels,$1); }block_stat_0 block_stat_1 block_stat_2 +block_stat: t_Identifier t_Colon t_BLOCK { pushLabel(genLabels,$1); } 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 { $$=$1+":block"; //+$4+$5+$6+$7+$8+"begin "+$10+" block "+$13; genLabels=popLabel(genLabels); } -block_stat_5: /* empty */ {$$="";} -block_stat_5: t_Identifier {$$=$1;} -block_stat_4: /* empty */ {$$=""; } -block_stat_4: block_stat_4 block_stat_6 {$$=$1+$2;} -block_stat_6: block_decltve_item {$$=$1;} -block_stat_3: /* empty */ {$$="";} -block_stat_3: t_PORT interf_list t_Semicolon block_stat_7 {$$="port "+$2+";"+$4; } -//block_sta_7: /* empty */ {$$="";} -block_stat_7: t_PORT t_MAP association_list t_Semicolon {$$="port map "+$3; } -block_stat_2: /* empty */ {$$="";} -block_stat_2: t_GENERIC interf_list t_Semicolon block_stat_8 {$$="generic "+$2+";"+$4; } -block_stat_8: /* empty */ {$$="";} -block_stat_8: t_GENERIC t_MAP association_list t_Semicolon {$$="generic map "+$3; } -block_stat_1: /* empty */ {$$="";} -block_stat_1: t_LeftParen expr t_RightParen block_stat_0 {$$="("+$2+")"+$4; } -block_stat_0: /* empty */ {$$=""; } -block_stat_0: t_IS {$$=" is ";} +block_stat_5: /* empty */ { $$=""; } +block_stat_5: t_Identifier { $$=$1; } +block_stat_4: /* empty */ { $$=""; } +block_stat_4: block_stat_4 block_stat_6 { $$=$1+$2; } +block_stat_6: block_decltve_item { $$=$1; } +block_stat_3: /* empty */ { $$=""; } +block_stat_3: t_PORT interf_list t_Semicolon block_stat_7 { $$="port "+$2+";"+$4; } +//block_sta_7: /* empty */ { $$=""; } +block_stat_7: t_PORT t_MAP association_list t_Semicolon { $$="port map "+$3; } +block_stat_2: /* empty */ { $$=""; } +block_stat_2: t_GENERIC interf_list t_Semicolon block_stat_8 { $$="generic "+$2+";"+$4; } +block_stat_8: /* empty */ { $$=""; } +block_stat_8: t_GENERIC t_MAP association_list t_Semicolon { $$="generic map "+$3; } +block_stat_1: /* empty */ { $$=""; } +block_stat_1: t_LeftParen expr t_RightParen block_stat_0 { $$="("+$2+")"+$4; } +block_stat_0: /* empty */ { $$=""; } +block_stat_0: t_IS { $$=" is "; } dot_name: t_Identifier { $$=$1; } | dot_name t_Dot t_Identifier { $$=$1+"."+$3; } @@ -1407,93 +1431,93 @@ 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.lower().data(),$3.lower().data(),0,yyLineNr);$$=""; +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.lower().data(),$3.lower().data(),0,yyLineNr);$$=""; + } +comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; } t_PORT t_MAP association_list t_Semicolon + { + addCompInst($1.lower().data(),$3.lower().data(),0,yyLineNr);$$="222"; } -comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; } t_PORT t_MAP association_list t_Semicolon - { - addCompInst($1.lower().data(),$3.lower().data(),0,yyLineNr);$$="222"; - } -comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_PORT t_MAP association_list t_Semicolon - { - addCompInst($1.lower().data(),$4.lower().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 - { - addCompInst($1.lower().data(),$4.lower().data(),$3.lower().data(),yyLineNr);$$=""; - } -comp_inst_stat_1: /* empty {$$="";} */ -comp_inst_stat_1: t_PORT t_MAP association_list // {$$="port map"+$3;} +comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_PORT t_MAP association_list t_Semicolon + { + addCompInst($1.lower().data(),$4.lower().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 + { + addCompInst($1.lower().data(),$4.lower().data(),$3.lower().data(),yyLineNr);$$=""; + } +comp_inst_stat_1: /* empty { $$=""; } */ +comp_inst_stat_1: t_PORT t_MAP association_list // { $$="port map"+$3; } -concurrent_assertion_stat: t_Identifier t_Colon assertion_stat {$$=$1+":"+$3;} -concurrent_assertion_stat: assertion_stat {$$=$1; } +concurrent_assertion_stat: t_Identifier t_Colon assertion_stat { $$=$1+":"+$3; } +concurrent_assertion_stat: assertion_stat { $$=$1; } -concurrent_assertion_stat: t_Identifier t_Colon t_POSTPONED assertion_stat {$$=$1+":"+"postponed "+$4; } -concurrent_assertion_stat: t_POSTPONED assertion_stat {$$="postponed "+$2; } +concurrent_assertion_stat: t_Identifier t_Colon t_POSTPONED assertion_stat { $$=$1+":"+"postponed "+$4; } +concurrent_assertion_stat: t_POSTPONED assertion_stat { $$="postponed "+$2; } -concurrent_procedure_call: t_Identifier t_Colon procedure_call_stat {$$=$1+":"+$3; } -concurrent_procedure_call: procedure_call_stat {$$=$1;} +concurrent_procedure_call: t_Identifier t_Colon procedure_call_stat { $$=$1+":"+$3; } +concurrent_procedure_call: procedure_call_stat { $$=$1; } -concurrent_procedure_call: t_Identifier t_Colon t_POSTPONED procedure_call_stat {$$=$1+":"+"postponed "+$4; } -concurrent_procedure_call: t_POSTPONED procedure_call_stat {$$="postponed "+$2; } +concurrent_procedure_call: t_Identifier t_Colon t_POSTPONED procedure_call_stat { $$=$1+":"+"postponed "+$4; } +concurrent_procedure_call: t_POSTPONED procedure_call_stat { $$="postponed "+$2; } -concurrent_signal_assign_stat: t_Identifier t_Colon condal_signal_assign {$$=$1+":"+$3; } -concurrent_signal_assign_stat: condal_signal_assign {$$=$1;} +concurrent_signal_assign_stat: t_Identifier t_Colon condal_signal_assign { $$=$1+":"+$3; } +concurrent_signal_assign_stat: condal_signal_assign { $$=$1; } -concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED condal_signal_assign {$$=$1+":"+"postponed "+$4; } -concurrent_signal_assign_stat: t_POSTPONED condal_signal_assign {$$="postponed "+$2; } +concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED condal_signal_assign { $$=$1+":"+"postponed "+$4; } +concurrent_signal_assign_stat: t_POSTPONED condal_signal_assign { $$="postponed "+$2; } -concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED sel_signal_assign {$$=$1+":"+"postponed "+$4; } -concurrent_signal_assign_stat: t_POSTPONED sel_signal_assign {$$="postponed "+$2; } +concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED sel_signal_assign { $$=$1+":"+"postponed "+$4; } +concurrent_signal_assign_stat: t_POSTPONED sel_signal_assign { $$="postponed "+$2; } -concurrent_signal_assign_stat: t_Identifier t_Colon sel_signal_assign {$$=$1+":"+$3; } -concurrent_signal_assign_stat: sel_signal_assign {$$=$1; } +concurrent_signal_assign_stat: t_Identifier t_Colon sel_signal_assign { $$=$1+":"+$3; } +concurrent_signal_assign_stat: sel_signal_assign { $$=$1; } -condal_signal_assign: target t_LESym opts condal_wavefrms t_Semicolon {$$=$1+"<="+$3+$4; } +condal_signal_assign: target t_LESym opts condal_wavefrms t_Semicolon { $$=$1+"<="+$3+$4; } -condal_wavefrms: wavefrm {$$=$1;} -condal_wavefrms: wavefrm t_WHEN expr {$$=$1+" when "+$3;} -condal_wavefrms: wavefrm t_WHEN expr t_ELSE condal_wavefrms {$$=$1+" when "+$3+"else"+$5;} +condal_wavefrms: wavefrm { $$=$1; } +condal_wavefrms: wavefrm t_WHEN expr { $$=$1+" when "+$3; } +condal_wavefrms: wavefrm t_WHEN expr t_ELSE condal_wavefrms { $$=$1+" when "+$3+"else"+$5; } -wavefrm: wavefrm_element wavefrm_1 {$$=$1+$2;} -wavefrm: t_UNAFFECTED {$$="unaffected";} -wavefrm_1: /* empty */ {$$="";} -wavefrm_1: wavefrm_1 wavefrm_2 {$$=$1+$2;} -wavefrm_2: t_Comma wavefrm_element {$$=","+$2;} +wavefrm: wavefrm_element wavefrm_1 { $$=$1+$2; } +wavefrm: t_UNAFFECTED { $$="unaffected"; } +wavefrm_1: /* empty */ { $$=""; } +wavefrm_1: wavefrm_1 wavefrm_2 { $$=$1+$2; } +wavefrm_2: t_Comma wavefrm_element { $$=","+$2; } -wavefrm_element: expr wavefrm_element_1 {$$=$1+$2;} -wavefrm_element_1: /* empty */ {$$="";} -wavefrm_element_1: t_AFTER expr {$$="after "+$2;} -wavefrm_element_1: t_NULL wavefrm_element_2 {$$=" null "+$2;} -wavefrm_element_1: t_NULL {$$=" null ";} -wavefrm_element_2: t_AFTER expr {$$="after "+$2;} +wavefrm_element: expr wavefrm_element_1 { $$=$1+$2; } +wavefrm_element_1: /* empty */ { $$=""; } +wavefrm_element_1: t_AFTER expr { $$="after "+$2; } +wavefrm_element_1: t_NULL wavefrm_element_2 { $$=" null "+$2; } +wavefrm_element_1: t_NULL { $$=" null "; } +wavefrm_element_2: t_AFTER expr { $$="after "+$2; } -target: name {$$=$1;} -target: aggregate {$$=$1;} +target: name { $$=$1; } +target: aggregate { $$=$1; } -opts: opts_1 opts_2 {$$=$1+$2;} +opts: opts_1 opts_2 { $$=$1+$2; } -opts_2: /* empty */ {$$="";} -opts_2: t_TRANSPORT {$$="transport ";} -opts_2: t_REJECT expr t_INERTIAL {$$="transport"+$2+" intertial ";} -opts_2: t_INERTIAL {$$=" intertial ";} +opts_2: /* empty */ { $$=""; } +opts_2: t_TRANSPORT { $$="transport "; } +opts_2: t_REJECT expr t_INERTIAL { $$="transport"+$2+" intertial "; } +opts_2: t_INERTIAL { $$=" intertial "; } -opts_1: /* empty */ {$$="";} -opts_1: t_GUARDED {$$=" guarded ";} +opts_1: /* empty */ { $$=""; } +opts_1: t_GUARDED { $$=" guarded "; } sel_signal_assign: t_WITH expr t_SELECT target t_LESym opts sel_wavefrms t_Semicolon - {$$="with "+$2+" select "+$4+"<="+$6+$7;} + { $$="with "+$2+" select "+$4+"<="+$6+$7; } -sel_wavefrms: sel_wavefrms_1 wavefrm t_WHEN choices {$$=$1+$2;} -sel_wavefrms_1: /* empty */ {$$="";} -sel_wavefrms_1: sel_wavefrms_1 sel_wavefrms_2 {$$=$1+$2;} -sel_wavefrms_2: wavefrm t_WHEN choices t_Comma {$$=$1+" when "+$3;} +sel_wavefrms: sel_wavefrms_1 wavefrm t_WHEN choices { $$=$1+$2; } +sel_wavefrms_1: /* empty */ { $$=""; } +sel_wavefrms_1: sel_wavefrms_1 sel_wavefrms_2 { $$=$1+$2; } +sel_wavefrms_2: wavefrm t_WHEN choices t_Comma { $$=$1+" when "+$3; } -gen_stat1: /* empty */ {$$="";} - | block_declarative_part t_BEGIN {$$=$1+" begin ";} - | t_BEGIN {$$="begin ";} +gen_stat1: /* empty */ { $$=""; } + | block_declarative_part t_BEGIN { $$=$1+" begin "; } + | t_BEGIN { $$="begin "; } // problem with double end // end; @@ -1512,7 +1536,7 @@ opstat: t_END generate_stat_1 t_Semicolon {genLabels=popLabel(genLabel generate_stat: t_Identifier t_Colon { pushLabel(genLabels,$1); } - if_generation_scheme opstat // t_END generate_stat_1 t_Semicolon { genLabels=popLabel(genLabels);} + if_generation_scheme opstat // t_END generate_stat_1 t_Semicolon { genLabels=popLabel(genLabels); } generate_stat: t_Identifier t_Colon case_scheme generate_stat_1: t_GENERATE { $$=""; } @@ -1552,7 +1576,7 @@ procs_stat1: procs_stat1_5 tempEntry=current; currP=0; createFunction(currName,VhdlDocGen::PROCESS,$4.data()); - createFlow($5); + createFlow(); currName=""; } procs_stat1: error t_END procs_stat1_3 t_Semicolon { currP=0; } @@ -1566,8 +1590,8 @@ 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: /* empty */ { $$=""; } +procs_stat1_2: t_IS { $$=""; } procs_stat1_2: procs_stat1_2 procs_stat1_4 { $$+=$2; } procs_stat1_4: procs_decltve_item { $$=$1; } procs_stat1_1: /* empty */ { $$=""; } @@ -1583,202 +1607,188 @@ sensitivity_list_2: t_Comma name { $$=","+$2; } -- Sequential Statements ----------------------------------------------------*/ -seq_stats: seq_stats_1 {$$=$1;} -seq_stats_1: /* empty */ {$$="";} -seq_stats_1: seq_stats_1 seq_stats_2 {$$=$1+$2;} -seq_stats_2: seq_stat {$$=$1;} - -seq_stat: assertion_stat {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} -seq_stat: lable assertion_stat {$$=$1+$2; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} -seq_stat: case_stat {$$=$1;} -seq_stat: exit_stat { - $$=$1; - } -seq_stat: if_stat {$$="";} -seq_stat: loop_stat {$$=$1;} -seq_stat: next_stat { - $$=$1; - } -seq_stat: null_stat {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} -seq_stat: procedure_call_stat {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} -seq_stat: return_stat {$$=$1; FlowNode::addFlowNode(FlowNode::RETURN_NO,$$.data(),0);} -seq_stat: lable signal_assign_stat {$$=$1+$2;} -seq_stat: signal_assign_stat - { - $$=$1; - FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0); - } -seq_stat: variable_assign_stat { $$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} -seq_stat: wait_stat {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} -seq_stat: lable wait_stat {$$=$1+$2; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} -seq_stat: report_statement {$$=$1; FlowNode::addFlowNode(FlowNode::TEXT_NO,$$.data(),0);} - -report_statement: loop_stat_1 t_REPORT expr assertion_stat_2 t_Semicolon {$$=$1+"report "+$3+$4+";"; } - -assertion_stat: t_ASSERT expr assertion_stat_1 assertion_stat_2 t_Semicolon {$$="assert "+$2+$3+$4+";";} -assertion_stat_2: /* empty */ {$$="";} -assertion_stat_2 : t_SEVERITY expr {$$=" serverity "+$2;} -assertion_stat_1 : /* empty */ {$$="";} -assertion_stat_1 : t_REPORT expr {$$=" report "+$2;} - -choice_stat : /* empty */ {$$="";} -choice_stat : t_Q {$$="?";} - -choice_stat_1: /* empty */ {$$="";} -choice_stat_1 : t_Q {$$="?";} -choice_stat_1 : t_Identifier {$$=$1;} +seq_stats: seq_stats_1 { $$=$1; } +seq_stats_1: /* empty */ { $$=""; } +seq_stats_1: seq_stats_1 seq_stats_2 { $$=$1+$2; } +seq_stats_2: seq_stat { $$=$1; } +seq_stat: assertion_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } +seq_stat: lable assertion_stat { $$=$1+$2; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } +seq_stat: case_stat { $$=$1; } +seq_stat: exit_stat { $$=$1; } +seq_stat: if_stat { $$=""; } +seq_stat: loop_stat { $$=$1; } +seq_stat: next_stat { $$=$1; } +seq_stat: null_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } +seq_stat: procedure_call_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } +seq_stat: return_stat { $$=$1; FlowChart::addFlowChart(FlowChart::RETURN_NO,$$.data(),0); } +seq_stat: lable signal_assign_stat { $$=$1+$2; } +seq_stat: signal_assign_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } +seq_stat: variable_assign_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } +seq_stat: wait_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } +seq_stat: lable wait_stat { $$=$1+$2; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } +seq_stat: report_statement { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } + +report_statement: loop_stat_1 t_REPORT expr assertion_stat_2 t_Semicolon { $$=$1+"report "+$3+$4+";"; } + +assertion_stat: t_ASSERT expr assertion_stat_1 assertion_stat_2 t_Semicolon { $$="assert "+$2+$3+$4+";"; } +assertion_stat_2: /* empty */ { $$=""; } +assertion_stat_2 : t_SEVERITY expr { $$=" serverity "+$2; } +assertion_stat_1 : /* empty */ { $$=""; } +assertion_stat_1 : t_REPORT expr { $$=" report "+$2; } + +choice_stat : /* empty */ { $$=""; } +choice_stat : t_Q { $$="?"; } + +choice_stat_1: /* empty */ { $$=""; } +choice_stat_1 : t_Q { $$="?"; } +choice_stat_1 : t_Identifier { $$=$1; } case_stat : t_CASE choice_stat expr { QCString ca="case "+$2+$3; - FlowNode::addFlowNode(FlowNode::CASE_NO,0,ca); + FlowChart::addFlowChart(FlowChart::CASE_NO,0,ca); } - t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon - { - FlowNode::addFlowNode(FlowNode::END_CASE,"end case",0); - FlowNode::moveToPrevLevel(); - } + t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon + { + FlowChart::moveToPrevLevel(); + FlowChart::addFlowChart(FlowChart::END_CASE,"end case",0); + } case_stat : lable t_CASE choice_stat expr { - QCString ca="case "+$3+$4; - FlowNode::addFlowNode(FlowNode::CASE_NO,0,ca); + QCString ca="case "+$3+$4; + FlowChart::addFlowChart(FlowChart::CASE_NO,0,ca); } - t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon - { - FlowNode::addFlowNode(FlowNode::END_CASE,0,0); - FlowNode::moveToPrevLevel(); - } + t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon + { + FlowChart::addFlowChart(FlowChart::END_CASE,0,0); + FlowChart::moveToPrevLevel(); + } -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 {$$=$1+$2;} -case_stat_2 : case_stat_alternative {$$=$1;} +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 { $$=$1+$2; } +case_stat_2 : case_stat_alternative { $$=$1; } case_stat_alternative : t_WHEN choices t_Arrow - { - QCString t="when "; - t+=$2+"=> "; - FlowNode::addFlowNode(FlowNode::WHEN_NO,0,t); + { + QCString t="when "; + t+=$2+"=> "; + FlowChart::addFlowChart(FlowChart::WHEN_NO,0,t); } -seq_stats {$$="";} - + seq_stats { $$=""; FlowChart::moveToPrevLevel(); } - -if_stat : t_IF expr t_THEN +if_stat: t_IF expr t_THEN { - $2.prepend("if "); - FlowNode::addFlowNode(FlowNode::IF_NO,0,$2); + $2.prepend("if "); + FlowChart::addFlowChart(FlowChart::IF_NO,0,$2); } seq_stats if_stat_1 if_stat_2 t_END t_IF t_Semicolon { - FlowNode::addFlowNode(FlowNode::ENDIF_NO,0,0); - FlowNode::moveToPrevLevel(); + FlowChart::moveToPrevLevel(); + FlowChart::addFlowChart(FlowChart::ENDIF_NO,0,0); } -if_stat_2 : /* empty */ {$$=""; } +if_stat_2 : /* empty */ { $$=""; } if_stat_2 : t_ELSE - { - FlowNode::addFlowNode(FlowNode::ELSE_NO,0,0); - } seq_stats {$$=""; } + { + FlowChart::addFlowChart(FlowChart::ELSE_NO,0,0); + } + seq_stats + { + $$=""; FlowChart::moveToPrevLevel(); + } -if_stat_1 : /* empty */ {$$=""; } -if_stat_1 : if_stat_1 if_stat_3 {$$=$1+$2; } +if_stat_1 : /* empty */ { $$=""; } +if_stat_1 : if_stat_1 if_stat_3 { $$=$1+$2; } if_stat_3 : t_ELSIF expr t_THEN { - $2.prepend("elsif "); - FlowNode::addFlowNode(FlowNode::ELSIF_NO,0,$2.data()); - } seq_stats {$$="";} + $2.prepend("elsif "); + FlowChart::addFlowChart(FlowChart::ELSIF_NO,0,$2.data()); + } seq_stats { $$=""; } loop_stat: loop_stat_1 loop_stat_2 t_LOOP seq_stats t_END t_LOOP loop_stat_3 t_Semicolon - { - - $$=$1+$2+" loop "+$4+" end loop" +$7; - QCString endLoop="end loop" + $7; - FlowNode::addFlowNode(FlowNode::END_LOOP,endLoop.data(),0); - FlowNode::moveToPrevLevel(); - } + { + $$=$1+$2+" loop "+$4+" end loop" +$7; + QCString endLoop="end loop" + $7; + FlowChart::moveToPrevLevel(); + FlowChart::addFlowChart(FlowChart::END_LOOP,endLoop.data(),0); + } -loop_stat_3: /* empty */ {$$=""; } -loop_stat_3: t_Identifier {$$=$1; } -loop_stat_2: /* empty */ { - $$=""; - FlowNode::addFlowNode(FlowNode::LOOP_NO,0,"infinite loop"); - } +loop_stat_3: /* empty */ { $$=""; } +loop_stat_3: t_Identifier { $$=$1; } +loop_stat_2: /* empty */ { $$=""; + FlowChart::addFlowChart(FlowChart::LOOP_NO,0,"infinite loop"); + } loop_stat_2: iteration_scheme -loop_stat_1: /* empty */ {$$=""; } -loop_stat_1: t_Identifier t_Colon {$$=$1+":";lab=$1;} +loop_stat_1: /* empty */ { $$=""; } +loop_stat_1: t_Identifier t_Colon { $$=$1+":";lab=$1; } exit_stat : loop_stat_1 t_EXIT exit_stat_1 exit_stat_2 t_Semicolon { - $$=$1+"exit "+$3+";"; - if($4.data()) - FlowNode::addFlowNode(FlowNode::EXIT_WHEN_NO,0,$4.data(),0); - - FlowNode::addFlowNode(FlowNode::EXIT_NO,$$.data(),0,$3.data()); - } -exit_stat_2 : /* empty */ {$$="";} -exit_stat_2 : t_WHEN expr {$$="when "+$2;} -exit_stat_1 : /* empty */ {$$="";} -exit_stat_1 : t_Identifier {$$=$1;lab=$$;} + FlowChart::addFlowChart(FlowChart::EXIT_NO,"exit",$4.data(),$3.data()); + lab.resize(0); + } +exit_stat_2 : /* empty */ { $$=""; } +exit_stat_2 : t_WHEN expr { $$="when "+$2; } +exit_stat_1 : /* empty */ { $$=""; } +exit_stat_1 : t_Identifier { $$=$1;lab=$$; } next_stat: loop_stat_1 t_NEXT next_stat_1 next_stat_2 t_Semicolon - { - $$=$1+"next "+$3+";" ; - if($4.data()) - FlowNode::addFlowNode(FlowNode::EXIT_WHEN_NO,0,$4.data(),0); - FlowNode::addFlowNode(FlowNode::NEXT_NO,$$.data(),0,$3.data()); - } + { + FlowChart::addFlowChart(FlowChart::NEXT_NO,"next ",$4.data(),$3.data()); + lab.resize(0); + } -next_stat_2: /* empty */ {$$=""; } -next_stat_2: t_WHEN expr {$$="when "+$2; } -next_stat_1: /* empty */ {$$=""; } -next_stat_1: t_Identifier {$$=$1;lab=$$; } +next_stat_2: /* empty */ { $$=""; } +next_stat_2: t_WHEN expr { $$="when "+$2; } +next_stat_1: /* empty */ { $$=""; } +next_stat_1: t_Identifier { $$=$1;lab=$$; } -null_stat: t_NULL t_Semicolon {$$="null"; $$+=";";} +null_stat: t_NULL t_Semicolon { $$="null"; $$+=";"; } procedure_call_stat: name t_Semicolon { - $$=$1+";"; + $$=$1+";"; } -return_stat: t_RETURN return_stat_1 t_Semicolon {$$="return "+$2+";" ;} -return_stat_1: /* empty */ {$$=""; } -return_stat_1: expr {$$=$1; } +return_stat: t_RETURN return_stat_1 t_Semicolon { $$="return "+$2+";" ; } +return_stat_1: /* empty */ { $$=""; } +return_stat_1: expr { $$=$1; } -signal_assign_stat: target t_LESym wavefrm t_Semicolon {$$=$1+" <="+$3+";" ;} - | target t_LESym delay_mechanism wavefrm t_Semicolon {$$=$1+ "<= "+$3+$4 +";";} - | target t_LESym t_FORCE inout_stat expr t_Semicolon {$$=$1+ "<= "+ " force "+$4+";" ;} - | target t_LESym t_RELEASE inout_stat t_Semicolon {$$=$1+ "<= "+" release "+$4 +";";} - | selected_signal_assignment {$$=$1; } - | conditional_signal_assignment {$$=$1; } +signal_assign_stat: target t_LESym wavefrm t_Semicolon { $$=$1+" <="+$3+";" ; } + | target t_LESym delay_mechanism wavefrm t_Semicolon { $$=$1+ "<= "+$3+$4 +";"; } + | target t_LESym t_FORCE inout_stat expr t_Semicolon { $$=$1+ "<= "+ " force "+$4+";" ; } + | target t_LESym t_RELEASE inout_stat t_Semicolon { $$=$1+ "<= "+" release "+$4 +";"; } + | selected_signal_assignment { $$=$1; } + | conditional_signal_assignment { $$=$1; } ; -variable_assign_stat: variable_assign_stat_1 t_Semicolon {$$=$1+";"; } - | conditional_variable_assignment {$$=$1; } - | lable selected_variable_assignment {$$=$1; } - | selected_variable_assignment {$$=$1; } +variable_assign_stat: variable_assign_stat_1 t_Semicolon { $$=$1+";"; } + | conditional_variable_assignment { $$=$1; } + | lable selected_variable_assignment { $$=$1; } + | selected_variable_assignment { $$=$1; } lable: t_Identifier t_Colon { $$=$1+":"; } -variable_assign_stat_1: target t_VarAsgn expr {$$=$1+":="+$3; } -variable_assign_stat_1: lable target t_VarAsgn expr {$$=$1+$2+":="+$4; } +variable_assign_stat_1: target t_VarAsgn expr { $$=$1+":="+$3; } +variable_assign_stat_1: lable target t_VarAsgn expr { $$=$1+$2+":="+$4; } wait_stat: t_WAIT wait_stat_1 wait_stat_2 wait_stat_3 t_Semicolon { $$="wait "+$2+$3+$4+";"; } -wait_stat_3: /* empty */ {$$=""; } -wait_stat_3: t_FOR expr {$$="for "+$2; } -wait_stat_2: /* empty */ {$$=""; } -wait_stat_2: t_UNTIL expr {$$=" until "+$2; } -wait_stat_1: /* empty */ {$$=""; } -wait_stat_1: t_ON sensitivity_list {$$=" on "+$2; } +wait_stat_3: /* empty */ { $$=""; } +wait_stat_3: t_FOR expr { $$="for "+$2; } +wait_stat_2: /* empty */ { $$=""; } +wait_stat_2: t_UNTIL expr { $$=" until "+$2; } +wait_stat_1: /* empty */ { $$=""; } +wait_stat_1: t_ON sensitivity_list { $$=" on "+$2; } /*-------------------------------------------------- @@ -1803,7 +1813,7 @@ 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 { levelCounter--;} t_END t_FOR t_Semicolon +block_config: t_FOR block_spec block_config_1 block_config_2 { levelCounter--; } t_END t_FOR t_Semicolon { } @@ -1879,11 +1889,11 @@ inst_list: t_OTHERS { $$="others"; } binding_indic : entity_aspect binding_indic_1 binding_indic_2 { $$=$1; } -binding_indic_2: {$$="";} -binding_indic_2: t_PORT t_MAP association_list {$$="port map "+$3;} +binding_indic_2: { $$=""; } +binding_indic_2: t_PORT t_MAP association_list { $$="port map "+$3; } -binding_indic_1: {$$="";} -binding_indic_1: t_GENERIC t_MAP association_list {$$="generic map "+$3;} +binding_indic_1: { $$=""; } +binding_indic_1: t_GENERIC t_MAP association_list { $$="generic map "+$3; } entity_aspect: t_ENTITY name { $$="entity "+$2; } @@ -1915,7 +1925,7 @@ group_template_declaration : t_GROUP t_Identifier t_IS t_LeftParen entity_cl group_template_declaration: t_GROUP t_Identifier t_IS t_LeftParen error t_Semicolon t_RightParen{ $$=""; } -entity_class_entry : entity_class tbox {$$=$1+$2;} +entity_class_entry : entity_class tbox { $$=$1+$2; } tbox : /* empty */ { $$=""; } tbox : t_Box { $$="<>"; } @@ -2063,8 +2073,8 @@ when_stats: when_stats_1 ttend: t_END t_Semicolon ttend: t_END t_Identifier t_Semicolon -conditional_signal_assignment: conditional_waveform_assignment {$$="";} -conditional_signal_assignment: conditional_force_assignment {$$="";} +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 @@ -2078,8 +2088,8 @@ 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 -selected_signal_assignment : selected_waveform_assignment {$$="";} -selected_signal_assignment : selected_force_assignment {$$="";} +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 @@ -2095,13 +2105,13 @@ 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 -inout_stat: /* empty */ {$$="";} -inout_stat: t_IN {$$=" in ";} -inout_stat: t_OUT {$$="out";} +inout_stat: /* empty */ { $$=""; } +inout_stat: t_IN { $$=" in "; } +inout_stat: t_OUT { $$="out"; } -delay_mechanism : t_TRANSPORT { $$=" transport ";} - | t_REJECT expr t_INERTIAL { $$=" reject "+$2+"inertial ";} - | t_INERTIAL { $$=" inertial ";} +delay_mechanism : t_TRANSPORT { $$=" transport "; } + | t_REJECT expr t_INERTIAL { $$=" reject "+$2+"inertial "; } + | t_INERTIAL { $$=" 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 @@ -2110,7 +2120,7 @@ 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 {$$="";} +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 @@ -2554,7 +2564,7 @@ static void newEntry() initEntry(current); } -void createFlow(QCString val) +void createFlow() { if (!VhdlDocGen::getFlowMember()) { @@ -2565,13 +2575,13 @@ void createFlow(QCString val) if (currP==VhdlDocGen::FUNCTION) { q=":function( "; - FlowNode::alignFuncProc(q,tempEntry->argList,true); + FlowChart::alignFuncProc(q,tempEntry->argList,true); q+=")"; } else if (currP==VhdlDocGen::PROCEDURE) { q=":procedure ("; - FlowNode::alignFuncProc(q,tempEntry->argList,false); + FlowChart::alignFuncProc(q,tempEntry->argList,false); q+=")"; } else @@ -2582,12 +2592,7 @@ void createFlow(QCString val) q.prepend(VhdlDocGen::getFlowMember()->name().data()); - FlowNode::addFlowNode(FlowNode::START_NO,q,0); - - if (!val.isEmpty()) - { - FlowNode::addFlowNode(FlowNode::VARIABLE_NO,val,0); - } + FlowChart::addFlowChart(FlowChart::START_NO,q,0); if (currP==VhdlDocGen::FUNCTION) { @@ -2602,9 +2607,9 @@ void createFlow(QCString val) ret="end process "; } - FlowNode::addFlowNode(FlowNode::END_NO,ret,0); - // FlowNode::printFlowList(); - FlowNode::writeFlowNode(); + FlowChart::addFlowChart(FlowChart::END_NO,ret,0); + // FlowChart::printFlowList(); + FlowChart::writeFlowChart(); currP=0; } diff --git a/src/vhdlscanner.h b/src/vhdlscanner.h index c1192cf..676f881 100644 --- a/src/vhdlscanner.h +++ b/src/vhdlscanner.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l index 898713e..54ad209 100644 --- a/src/vhdlscanner.l +++ b/src/vhdlscanner.l @@ -532,6 +532,13 @@ BR [ \t\n\r] { REJECT; } + else if (qcs.stripPrefix("--#")) + { + if (VhdlDocGen::getFlowMember()) + { + FlowChart::addFlowChart(FlowChart::COMMENT_NO,0,0,qcs.data()); + } + } } . { /* unknown characters */ } diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index 05da2a0..23382e8 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -835,7 +835,10 @@ void XmlDocVisitor::visitPost(DocLink *) void XmlDocVisitor::visitPre(DocRef *ref) { if (m_hide) return; - if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor()); + if (!ref->file().isEmpty()) + { + startLink(ref->ref(),ref->file(),ref->isSubPage() ? QCString() : ref->anchor()); + } if (!ref->hasLinkText()) filter(ref->targetTitle()); } @@ -1056,6 +1059,7 @@ void XmlDocVisitor::filter(const char *str) void XmlDocVisitor::startLink(const QCString &ref,const QCString &file,const QCString &anchor) { + //printf("XmlDocVisitor: file=%s anchor=%s\n",file.data(),anchor.data()); m_t << "<ref refid=\"" << file; if (!anchor.isEmpty()) m_t << "_1" << anchor; m_t << "\" kindref=\""; diff --git a/src/xmldocvisitor.h b/src/xmldocvisitor.h index 77242a1..42290cc 100644 --- a/src/xmldocvisitor.h +++ b/src/xmldocvisitor.h @@ -3,7 +3,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index 07ea086..b04fb5a 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 @@ -306,7 +306,7 @@ class XMLCodeGenerator : public CodeOutputInterface m_normalHLNeedStartTag=FALSE; } writeXMLLink(m_t,ref,file,anchor,name,tooltip); - col+=strlen(name); + col+=qstrlen(name); } void startCodeLine(bool) { @@ -1842,10 +1842,26 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample) t << " <compoundname>" << convertToXML(pd->name()) << "</compoundname>" << endl; - SectionInfo *si = Doxygen::sectionDict->find(pd->name()); - if (si) + if (pd==Doxygen::mainPage) // main page is special { - t << " <title>" << convertToXML(si->title) << "</title>" << endl; + QCString title; + if (!pd->title().isEmpty() && pd->title().lower()!="notitle") + { + title = filterTitle(Doxygen::mainPage->title()); + } + else + { + title = Config_getString("PROJECT_NAME"); + } + t << " <title>" << convertToXML(title) << "</title>" << endl; + } + else + { + SectionInfo *si = Doxygen::sectionDict->find(pd->name()); + if (si) + { + t << " <title>" << convertToXML(si->title) << "</title>" << endl; + } } writeInnerPages(pd->getSubPages(),t); t << " <detaileddescription>" << endl; @@ -1923,7 +1939,7 @@ void generateXML() err("Cannot open file %s for writing!\n",fileName.data()); return; } - f.writeBlock(index_xsd,strlen(index_xsd)); + f.writeBlock(index_xsd,qstrlen(index_xsd)); f.close(); fileName=outputDirectory+"/compound.xsd"; @@ -1933,7 +1949,7 @@ void generateXML() err("Cannot open file %s for writing!\n",fileName.data()); return; } - f.writeBlock(compound_xsd,strlen(compound_xsd)); + f.writeBlock(compound_xsd,qstrlen(compound_xsd)); f.close(); fileName=outputDirectory+"/index.xml"; diff --git a/src/xmlgen.h b/src/xmlgen.h index 9193956..b89b10f 100644 --- a/src/xmlgen.h +++ b/src/xmlgen.h @@ -2,7 +2,7 @@ * * * - * Copyright (C) 1997-2012 by Dimitri van Heesch. + * Copyright (C) 1997-2013 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 |