Imported Upstream version 1.8.7 upstream/1.8.7
authorDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 15 Oct 2021 01:51:13 +0000 (10:51 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 15 Oct 2021 01:51:13 +0000 (10:51 +0900)
392 files changed:
.gitignore
Doxyfile
Makefile.in
addon/doxmlparser/examples/metrics/metrics.pro.in
addon/doxmlparser/include/doxmlintf.h [changed from file to symlink]
addon/doxmlparser/src/basehandler.h
addon/doxmlparser/src/baseiterator.h
addon/doxmlparser/src/compoundhandler.cpp
addon/doxmlparser/src/compoundhandler.h
addon/doxmlparser/src/dochandler.cpp
addon/doxmlparser/src/dochandler.h
addon/doxmlparser/src/doxmlintf.h [changed from symlink to file mode: 0644]
addon/doxmlparser/src/doxmlparser.pro.in
addon/doxmlparser/src/graphhandler.h
addon/doxmlparser/src/linkedtexthandler.cpp
addon/doxmlparser/src/linkedtexthandler.h
addon/doxmlparser/src/loamhandler.h
addon/doxmlparser/src/mainhandler.cpp
addon/doxmlparser/src/mainhandler.h
addon/doxmlparser/src/memberhandler.cpp
addon/doxmlparser/src/memberhandler.h
addon/doxmlparser/src/paramhandler.cpp
addon/doxmlparser/src/paramhandler.h
addon/doxmlparser/src/sectionhandler.cpp
addon/doxmlparser/src/sectionhandler.h
addon/doxmlparser/test/xmlparse.pro.in
addon/doxyapp/doxyapp.cpp
addon/doxyapp/doxyapp.pro.in
addon/doxypysql/search.py [new file with mode: 0755]
addon/doxysearch/Makefile.in
addon/doxysearch/doxyindexer.cpp
addon/doxysearch/doxyindexer.pro.in
addon/doxysearch/doxysearch.cpp
addon/doxysearch/doxysearch.pro.in
addon/doxywizard/Makefile.in
addon/doxywizard/config.l
addon/doxywizard/config_doxyw.l
addon/doxywizard/doxywizard.cpp
addon/doxywizard/doxywizard.pro.in
addon/doxywizard/expert.cpp
addon/doxywizard/inputbool.cpp
addon/doxywizard/inputbool.h
addon/doxywizard/inputint.cpp
addon/doxywizard/inputint.h
addon/doxywizard/inputstring.cpp
addon/doxywizard/inputstring.h
addon/doxywizard/inputstrlist.cpp
addon/doxywizard/inputstrlist.h
addon/doxywizard/version.h
addon/doxywizard/wizard.cpp
addon/doxywizard/wizard.h
configure
configure.bin
doc/Doxyfile
doc/Makefile.in
doc/Makefile.latex
doc/Makefile.win_make.in
doc/Makefile.win_nmake.in
doc/arch.doc
doc/autolink.doc
doc/changelog.doc
doc/commands.doc
doc/config.doc [deleted file]
doc/custcmd.doc
doc/customize.doc
doc/diagrams.doc
doc/docblocks.doc
doc/doxygen.1
doc/doxygen.sty
doc/doxygen_manual.tex
doc/doxygen_usage.doc
doc/doxywizard_usage.doc
doc/external.doc
doc/extsearch.doc
doc/faq.doc
doc/features.doc
doc/formulas.doc
doc/grouping.doc
doc/htmlcmds.doc
doc/index.doc
doc/install.doc
doc/language.doc [deleted file]
doc/language.tpl
doc/maintainers.txt
doc/markdown.doc
doc/output.doc
doc/perlmod.doc
doc/preprocessing.doc
doc/searching.doc
doc/starting.doc
doc/trouble.doc
doc/xmlcmds.doc
examples/include.cpp
examples/mux.vhdl
libmd5/libmd5.pro.in
qtools/Doxyfile
qtools/Makefile.in
qtools/qdict.h
qtools/qdir.h
qtools/qgcache.cpp
qtools/qgdict.cpp
qtools/qinternallist.h [new file with mode: 0644]
qtools/qlist.h
qtools/qstrlist.h
qtools/qtextcodec.cpp
qtools/qtools.pro.in
qtools/qwaitcondition_win32.cpp
src/Makefile.in
src/arguments.h
src/bufstr.h
src/cite.cpp
src/classdef.cpp
src/classdef.h
src/classlist.cpp
src/classlist.h
src/cmdmapper.cpp
src/cmdmapper.h
src/code.h
src/code.l
src/commentcnv.h
src/commentcnv.l
src/commentscan.h
src/commentscan.l
src/compound.xsd
src/condparser.cpp
src/condparser.h
src/config.h
src/config.l
src/config.xml
src/configgen.py
src/configoptions.h
src/constexp.h
src/constexp.l
src/constexp.y
src/context.cpp
src/context.h
src/cppvalue.cpp
src/cppvalue.h
src/dbusxmlscanner.cpp
src/debug.cpp
src/debug.h
src/declinfo.h
src/declinfo.l
src/defargs.h
src/defargs.l
src/defgen.cpp
src/defgen.h
src/define.cpp
src/define.h
src/definition.cpp
src/definition.h
src/dia.cpp
src/dia.h
src/diagram.cpp
src/diagram.h
src/dirdef.cpp
src/dirdef.h
src/docbookgen.cpp
src/docbookgen.h
src/docbookvisitor.cpp
src/docbookvisitor.h
src/docparser.cpp
src/docparser.h
src/docsets.cpp
src/docsets.h
src/doctokenizer.h
src/doctokenizer.l
src/docvisitor.h
src/dot.cpp
src/dot.h
src/doxygen.cpp
src/doxygen.css
src/doxygen.h
src/doxygen.pro.in
src/doxygen.sty
src/dynsections.js
src/eclipsehelp.cpp
src/eclipsehelp.h
src/entry.cpp
src/entry.h
src/example.h
src/filedef.cpp
src/filedef.h
src/filename.cpp
src/filename.h
src/filestorage.h
src/formula.cpp
src/formula.h
src/fortrancode.h
src/fortrancode.l
src/fortranscanner.h
src/fortranscanner.l
src/ftextstream.cpp
src/ftvhelp.cpp
src/ftvhelp.h
src/groupdef.cpp
src/groupdef.h
src/htags.cpp
src/htags.h
src/htmlattrib.h
src/htmldocvisitor.cpp
src/htmldocvisitor.h
src/htmlentity.cpp [new file with mode: 0644]
src/htmlentity.h [new file with mode: 0644]
src/htmlgen.cpp
src/htmlgen.h
src/htmlhelp.cpp
src/htmlhelp.h
src/image.cpp
src/image.h
src/index.cpp
src/index.h
src/lang_cfg.h [deleted file]
src/language.cpp
src/language.h
src/languages.py
src/latexdocvisitor.cpp
src/latexdocvisitor.h
src/latexgen.cpp
src/latexgen.h
src/layout.cpp
src/layout.h
src/libdoxycfg.pro.in
src/libdoxycfg.t.in
src/libdoxygen.pro.in
src/libdoxygen.t.in
src/lodepng.cpp
src/logos.cpp
src/logos.h
src/main.cpp
src/mandocvisitor.cpp
src/mandocvisitor.h
src/mangen.cpp
src/mangen.h
src/markdown.cpp
src/markdown.h
src/marshal.cpp
src/marshal.h
src/memberdef.cpp
src/memberdef.h
src/membergroup.cpp
src/membergroup.h
src/memberlist.cpp
src/memberlist.h
src/membername.cpp
src/membername.h
src/message.cpp
src/message.h
src/msc.cpp
src/msc.h
src/namespacedef.cpp
src/namespacedef.h
src/navtree.js
src/objcache.cpp
src/objcache.h
src/outputgen.cpp
src/outputgen.h
src/outputlist.cpp
src/outputlist.h
src/pagedef.cpp
src/pagedef.h
src/parserintf.h
src/perlmodgen.cpp
src/perlmodgen.h
src/pre.h
src/pre.l
src/printdocvisitor.h
src/pycode.h
src/pycode.l
src/pyscanner.h
src/pyscanner.l
src/qtbc.h
src/reflist.cpp
src/reflist.h
src/rtfdocvisitor.cpp
src/rtfdocvisitor.h
src/rtfgen.cpp
src/rtfgen.h
src/rtfstyle.cpp
src/rtfstyle.h
src/scanner.h
src/scanner.l
src/searchindex.cpp
src/searchindex.h
src/section.h
src/settings.h [deleted file]
src/settings.py
src/sortdict.h
src/sqlite3gen.cpp
src/sqlite3gen.h
src/store.cpp
src/store.h
src/tagreader.cpp
src/tagreader.h
src/tclscanner.h
src/template.cpp
src/template.h
src/textdocvisitor.cpp
src/textdocvisitor.h
src/tooltip.cpp
src/tooltip.h
src/translator.h
src/translator_am.h
src/translator_ar.h
src/translator_br.h
src/translator_ca.h
src/translator_cn.h
src/translator_cz.h
src/translator_de.h
src/translator_dk.h
src/translator_en.h
src/translator_eo.h
src/translator_es.h
src/translator_fa.h
src/translator_fi.h
src/translator_fr.h
src/translator_gr.h
src/translator_hr.h
src/translator_hu.h
src/translator_id.h
src/translator_it.h
src/translator_je.h
src/translator_jp.h
src/translator_ke.h
src/translator_kr.h
src/translator_lt.h
src/translator_lv.h
src/translator_mk.h
src/translator_nl.h
src/translator_no.h
src/translator_pl.h
src/translator_pt.h
src/translator_ro.h
src/translator_ru.h
src/translator_sc.h
src/translator_si.h
src/translator_sk.h
src/translator_sr.h
src/translator_sv.h
src/translator_tr.h
src/translator_tw.h
src/translator_ua.h
src/translator_vi.h
src/translator_za.h
src/types.h
src/util.cpp
src/util.h
src/version.h
src/version.py
src/vhdlcode.l
src/vhdldocgen.cpp
src/vhdldocgen.h
src/vhdlparser.y
src/vhdlscanner.h
src/vhdlscanner.l
src/xmldocvisitor.cpp
src/xmldocvisitor.h
src/xmlgen.cpp
src/xmlgen.h
testing/006/indexpage.xml
testing/020/indexpage.xml
testing/020_only.dox
testing/054/054__parblock_8cpp.xml [new file with mode: 0644]
testing/054_parblock.cpp [new file with mode: 0644]
testing/055/md_055_markdown.xml [new file with mode: 0644]
testing/055_markdown.md [new file with mode: 0644]
testing/056/indexpage.xml [new file with mode: 0644]
testing/056_latexinclude.dox [new file with mode: 0644]
testing/sample.tex [new file with mode: 0644]
testing/testsqlite3.py [new file with mode: 0755]
tmake/lib/macosx-c++/tmake.conf
tmake/lib/macosx-intel-c++/tmake.conf
tmake/lib/macosx-uni-c++/tmake.conf
tmake/lib/win32-g++/generic.t
tmake/lib/win32-mingw/generic.t
winbuild/Config.rules
winbuild/Doxygen.sln
winbuild/Doxygen.vcproj
winbuild/Doxywizard.vcproj
winbuild/Gen_head.rules
winbuild/Languages.rules
winbuild/Lex.rules
winbuild/Settings.rules
winbuild/Unistd.rules [new file with mode: 0755]
winbuild/Version.rules
winbuild/doxyindexer.vcproj
winbuild/doxysearch.vcproj
winbuild/qtools.vcproj
winbuild/runbison.bat [deleted file]
winbuild/unistd.h [deleted file]
winbuild/unistd.py [new file with mode: 0644]
winbuild/version.bat [deleted file]

index af29780..6abfaa8 100644 (file)
 /addon/doxyapp/Makefile.doxyapp
 /addon/doxywizard/Makefile
 /addon/doxywizard/Makefile.doxywizard
-/addon/doxywizard/config_doxyw.cpp
-/addon/doxywizard/configdoc.cpp
-/addon/doxywizard/moc
-/addon/doxywizard/obj
-/addon/doxywizard/rcc
 /addon/doxmlparser/objects
 /addon/doxmlparser/lib
 /addon/doxmlparser/test/Makefile.xmlparse
 /addon/doxmlparser/test/xmlparse.exe
 /addon/doxmlparser/examples/metrics/obj
 /addon/doxmlparser/examples/metrics/metrics.exe
-/winbuild/config_lex.cpp
-/winbuild/moc
-/winbuild/obj
-/winbuild/rcc
 *.idb
 *.pdb
 /examples/Makefile
 
 /bin
 /lib
+/generated_src
 /objects
-/src/ce_lex.cpp
-/src/ce_parse.cpp
-/src/ce_parse.h
-/src/code.cpp
-/src/commentcnv.cpp
-/src/commentscan.cpp
-/src/config.cpp
-/src/declinfo.cpp
-/src/defargs.cpp
-/src/doctokenizer.cpp
-/src/fortrancode.cpp
-/src/fortranscanner.cpp
-/src/pre.cpp
-/src/pycode.cpp
-/src/pyscanner.cpp
-/src/scanner.cpp
-/src/tclscanner.cpp
-/src/version.cpp
-/src/vhdlcode.cpp
-/src/vhdlparser.cpp
-/src/vhdlparser.h
-/src/vhdlscanner.cpp
-/src/configoptions.cpp
-/src/Makefile
-/src/bib2xhtml.pl.h
-/src/compound.xsd.h
-/src/constexp.cpp
-/src/doxygen.bst.h
-/src/doxygen.css.h
-/src/doxygen.sty.h
-/src/dynsections.js.h
-/src/extsearch.js.h
-/src/footer.html.h
-/src/header.html.h
-/src/index.xsd.h
-/src/jquery_fx.js.h
-/src/jquery_p1.js.h
-/src/jquery_p2.js.h
-/src/jquery_p3.js.h
-/src/jquery_pt.js.h
-/src/jquery_ui.js.h
-/src/layout_default.xml.h
-/src/navtree.css.h
-/src/navtree.js.h
-/src/resize.js.h
-/src/search.css.h
-/src/search.js.h
-/src/search_functions.php.h
-/src/search_opensearch.php.h
-/src/svgpan.js.h
+/moc
+/rcc
 
+/src/Makefile
 
 /doc/Makefile
 /doc/translator_report.txt
+/doc/config.doc
+/doc/language.doc
 
 /doxygen_docs
 /doxygen.tag
 /examples/*/html
 /html
 /latex
+/rtf
+/xml
+/man
+/docbook
+/perlmod
index 2c49548..3b175c4 100644 (file)
--- a/Doxyfile
+++ b/Doxyfile
@@ -102,55 +102,8 @@ FILE_PATTERNS          = *.h \
                          *.cpp \
                          *.md
 RECURSIVE              = NO
-EXCLUDE                = src/code.cpp \
-                         src/ce_lex.cpp \
-                         src/ce_parse.cpp \
-                         src/declinfo.cpp \
-                         src/defargs.cpp \
-                         src/doxytag.cpp \
-                         src/pre.cpp \
-                         src/scanner.cpp \
-                         src/tag.cpp \
-                         src/doctokenizer.cpp \
-                         src/logos.cpp \
-                         src/suffixtree.cpp \
-                         src/suffixtree.h \
-                         src/commentcnv.cpp \
-                         src/commentscan.cpp \
-                         src/pycode.cpp \
-                         src/config.cpp \
-                         src/pyscanner.cpp \
-                         src/fortranscanner.cpp \
-                         src/fortrancode.cpp \
-                         src/vhdlscanner.cpp \
-                         src/vhdlparser.cpp \
-                         src/vhdlcode.cpp \
-                         src/tclscanner.cpp \
-                         src/lodepng.cpp \
-                         src/doxygen.css.h \
-                         src/doxygen.js.h \
-                         src/doxygen.php.h \
-                         src/compound.xsd.h \
-                         src/layout_default.xml.h \
-                         src/bib2xhtml.pl.h \
-                         src/doxygen.bst.h \
-                         src/header.html.h \
-                         src/index.xsd.h \
-                         src/jquery.js.h \
-                         src/jquery_fx.js.h \
-                         src/jquery_ui.js.h \
-                         src/navtree.css.h \
-                         src/navtree.hs.h \
-                         src/search.css.h \
-                         src/search_functions.php.h \
-                         src/search_opensearch.php.h \
-                         src/search.js.h \
-                         src/navtree.js.h \
-                         src/resize.js.h \
-                         src/svgpan.js.h \
-                         src/dynsections.js.h \
-                         src/extsearch.js.h \
-                         src/footer.html.h
+EXCLUDE                = src/logos.cpp \
+                         src/lodepng.cpp
 EXCLUDE_SYMLINKS       = NO
 EXCLUDE_SYMBOLS        =
 EXAMPLE_PATH           =
index fff10db..b5918ba 100644 (file)
@@ -1,6 +1,3 @@
-#all: src/version.cpp doxywizard 
-#      cd qtools ; $(MAKE)
-#      cd src ; $(MAKE)
 
 DESTDIR = 
 
@@ -31,7 +28,7 @@ clean: FORCE
        -cd addon/doxmlparser/test ; $(MAKE) clean
        -cd addon/doxmlparser/examples/metrics ; $(MAKE) clean
        -rm -f bin/doxy*
-       -rm -f objects/*.o
+       -rm -f objects/*/*.o
 
 distclean: clean
        -cd src ; $(MAKE) distclean
@@ -42,17 +39,22 @@ distclean: clean
        -cd addon/doxmlparser/src ; $(MAKE) distclean
        -cd addon/doxmlparser/test ; $(MAKE) distclean
        -cd addon/doxmlparser/examples/metrics ; $(MAKE) distclean
-       -rm -f lib/lib*
-       -rm -f bin/doxy*
-       -rm -f html
-       -rm -f latex
-       -rm -f objects/*.o
+       -rm -rf lib
+       -rm -rf bin
+       -rm -rf objects
+       -rm -rf html
+       -rm -rf latex
+       -rm -rf man
+       -rm -rf docbook
+       -rm -rf perlmod
+       -rm -rf rtf
+       -rm -rf xml
        -rm -f src/Makefile.doxygen src/Makefile.libdoxygen 
        -rm -f src/Makefile.libdoxycfg src/libdoxycfg.t src/libdoxygen.t
        -rm -f libmd5/Makefile.libmd5
        -rm -f .makeconfig .tmakeconfig
        -rm -f src/doxygen.pro src/libdoxygen.pro qtools/qtools.pro src/libdoxycfg.pro libmd5/libmd5.pro
-       -rm -f src/version.cpp 
+       -rm -rf generated_src
        -rm -f addon/doxywizard/doxywizard.pro
        -rm -f VERSION
        -rm -f packages/rpm/doxygen.spec
@@ -65,17 +67,6 @@ distclean: clean
        -rm -f qtools/Makefile src/Makefile examples/Makefile doc/Makefile 
        -rm -f Makefile
 
-realclean: clean
-       -cd src ; $(MAKE) realclean
-       -cd libmd5 ; $(MAKE) realclean
-       -cd addon/doxywizard ; $(MAKE) realclean
-       -cd addon/doxysearch ; $(MAKE) realclean
-       -cd addon/doxyapp ; $(MAKE) realclean
-       -cd addon/doxmlparser/src ; $(MAKE) realclean
-       -cd addon/doxmlparser/test ; $(MAKE) realclean
-       -cd addon/doxmlparser/examples/metrics ; $(MAKE) realclean
-       -$(MAKE) distclean
-
 DATE=$(shell date "+%B %Y")
 
 MAN1DIR = man/man1
@@ -122,12 +113,6 @@ dist: clean
        tar zcvf $(DISTDIR).src.tar.gz $(DISTDIR)
        rm -rf $(DISTDIR)
 
-src/version.cpp: Makefile
-       echo "char versionString[]=\"$(VERSION)\";" > src/version.cpp
-
-addon/doxywizard/version.cpp: Makefile
-       echo "char versionString[]=\"$(VERSION)\";" > addon/doxywizard/version.cpp
-
 DISTDIR = doxygen-`echo $(VERSION) | tr - _`
 rpm: dist
        gzip -df $(DISTDIR).src.tar.gz
index 6dd344f..3b2354d 100644 (file)
@@ -2,19 +2,19 @@ TEMPLATE     =        app.t
 CONFIG       = console warn_on $extraopts
 HEADERS      = 
 SOURCES      = main.cpp
-unix:LIBS                   += -L../../../../lib -L../../lib -ldoxmlparser -lqtools
+unix:LIBS                   += -L../../../../lib -ldoxmlparser -lqtools
 win32:INCLUDEPATH           += .
-win32-mingw:LIBS            += -L../../../../lib -L../../lib -ldoxmlparser -lqtools
+win32-mingw:LIBS            += -L../../../../lib -ldoxmlparser -lqtools
 win32-msvc:LIBS             += doxmlparser.lib qtools.lib shell32.lib 
-win32-msvc:TMAKE_LFLAGS     += /LIBPATH:..\..\..\..\lib;..\..\lib
+win32-msvc:TMAKE_LFLAGS     += /LIBPATH:..\..\..\..\lib;
 win32-borland:LIBS          += doxmlparser.lib qtools.lib shell32.lib
-win32-borland:TMAKE_LFLAGS  += -L..\..\..\..\lib -L..\..\lib
+win32-borland:TMAKE_LFLAGS  += -L..\..\..\..\lib
 win32:TMAKE_CXXFLAGS        += -DQT_NODLL
-DESTDIR                     = 
-OBJECTS_DIR                 = obj
+DESTDIR                     = ../../../../bin
+OBJECTS_DIR                 = ../../../../objects/doxmlparer/metrics
 TARGET                      = metrics
 DEPENDPATH                  = ../../include
 INCLUDEPATH                += ../../../../qtools ../../include
-unix:TARGETDEPS             = ../../lib/libdoxmlparser.a
-win32:TARGETDEPS            = ..\..\lib\doxmlparser.lib
+unix:TARGETDEPS             = ../../../../lib/libdoxmlparser.a
+win32:TARGETDEPS            = ..\..\..\..\lib\doxmlparser.lib
 
deleted file mode 100644 (file)
index f13971fd8fa0a521bb81ddeb2536db3e5467feb9..0000000000000000000000000000000000000000
+++ /dev/null
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2013 by Dimitri van 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.
- *
- */
-
-#ifndef _DOXMLINTF_H
-#define _DOXMLINTF_H
-
-/*! \file
- *  \brief The interface to the object model provided by the XML parser 
- *         library.
- *
- *  To start using this library one calls createObjectModel() and then
- *  uses the returned IDoxygen interface to read doxygen generated
- *  XML output and navigate through the information contained in it.
- *
- *  @see createObjectModel()
- */
-
-class IMember;
-class IDocIterator;
-class ICompound;
-class ISection;
-class INode;
-class IDocInternal;
-class IDocRoot;
-
-#define VIRTUAL_DESTRUCTOR(x) virtual ~x() {}
-
-/*! \brief Read only interface to a string. 
- */
-class IString
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IString)
-    /*! Returns a latin1 character representation of the string. */
-    virtual const char *latin1() const = 0;
-    /*! Returns a utf8 character representation of the string. */
-    virtual const char *utf8() const = 0;
-    /*! Returns a 16-bit unicode character representation of the character at 
-     *  position \a index in the string. The first character is at index 0.
-     */
-    virtual unsigned short unicodeCharAt(int index) const = 0;
-    /*! Returns true if this string is empty or false otherwise */
-    virtual bool isEmpty() const = 0;
-    /*! Returns the number of characters in the string. */
-    virtual int length() const = 0;
-};
-
-/*! \brief Base interface for hyperlinked text
- *
- *  Depending on the result of kind() the interface is extended by
- *  ILT_Text or ILT_Ref.
- */
-class ILinkedText
-{
-  public:
-    VIRTUAL_DESTRUCTOR(ILinkedText)
-    enum Kind { Kind_Text, Kind_Ref };
-    virtual Kind kind() const = 0;
-};
-
-/*! \brief Plain text fragment.
- */
-class ILT_Text : public ILinkedText
-{
-  public:
-    VIRTUAL_DESTRUCTOR(ILT_Text)
-    virtual const IString *text() const = 0;
-};
-
-/*! \brief Reference to an object.
- */
-class ILT_Ref : public ILinkedText
-{
-  public:
-    VIRTUAL_DESTRUCTOR(ILT_Ref)
-    enum TargetKind { Member, Compound };
-    virtual const IString *id() const = 0;
-    virtual TargetKind targetKind() const = 0;
-    virtual const IString *external() const = 0;
-    virtual const IString *text() const = 0;
-};
-
-/*! \brief Iterates over a list of ILinkedText fragments.
- */
-class ILinkedTextIterator 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(ILinkedTextIterator)
-    virtual ILinkedText *toFirst() = 0;
-    virtual ILinkedText *toLast() = 0;
-    virtual ILinkedText *toNext() = 0;
-    virtual ILinkedText *toPrev() = 0;
-    virtual ILinkedText *current() const = 0;
-    virtual void release() = 0;
-};
-
-/*! \brief Representation of a parameter of a function. */
-class IParam 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IParam)
-    virtual ILinkedTextIterator *type() const = 0;
-    virtual const IString * declarationName() const = 0;
-    virtual const IString * definitionName() const = 0;
-    virtual const IString * attrib() const = 0;
-    virtual const IString * arraySpecifier() const = 0;
-    virtual ILinkedTextIterator *defaultValue() const = 0;
-    virtual IDocRoot *briefDescription() const = 0;
-};
-
-class IParamIterator
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IParamIterator)
-    virtual IParam *toFirst() = 0;
-    virtual IParam *toLast() = 0;
-    virtual IParam *toNext() = 0;
-    virtual IParam *toPrev() = 0;
-    virtual IParam *current() const = 0;
-    virtual void release() = 0;
-};
-
-class IMemberReference 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IMemberReference)
-    virtual IMember *member() const = 0;
-    virtual const IString * name() const = 0;
-    virtual const IString * scope() const = 0;
-    virtual const IString * protection() const = 0;
-    virtual const IString * virtualness() const = 0;
-    virtual const IString * ambiguityScope() const = 0;
-};
-
-class IMemberReferenceIterator 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IMemberReferenceIterator)
-    virtual IMemberReference *toFirst() = 0;
-    virtual IMemberReference *toLast() = 0;
-    virtual IMemberReference *toNext() = 0;
-    virtual IMemberReference *toPrev() = 0;
-    virtual IMemberReference *current() const = 0;
-    virtual void release() = 0;
-};
-
-class IDoc
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IDoc)
-    enum Kind 
-    { 
-      Invalid = 0,        //  0
-      Para,               //  1 -> IDocPara
-      Text,               //  2 -> IDocText
-      MarkupModifier,     //  3 -> IDocMarkupModifier
-      ItemizedList,       //  4 -> IDocItemizedList
-      OrderedList,        //  5 -> IDocOrderedList
-      ListItem,           //  6 -> IDocListItem
-      ParameterList,      //  7 -> IDocParameterList
-      Parameter,          //  8 -> IDocParameter
-      SimpleSect,         //  9 -> IDocSimpleSect
-      Title,              // 10 -> IDocTitle
-      Ref,                // 11 -> IDocRef
-      VariableList,       // 12 -> IDocVariableList
-      VariableListEntry,  // 13 -> IDocVariableListEntry
-      HRuler,             // 14 -> IDocHRuler
-      LineBreak,          // 15 -> IDocLineBreak
-      ULink,              // 16 -> IDocULink
-      EMail,              // 17 -> IDocEMail
-      Link,               // 18 -> IDocLink
-      ProgramListing,     // 19 -> IDocProgramListing
-      CodeLine,           // 20 -> IDocCodeLine
-      Highlight,          // 21 -> IDocHighlight
-      Formula,            // 22 -> IDocFormula
-      Image,              // 23 -> IDocImage
-      DotFile,            // 24 -> IDocDotFile
-      IndexEntry,         // 25 -> IDocIndexEntry
-      Table,              // 26 -> IDocTable
-      Row,                // 27 -> IDocRow
-      Entry,              // 28 -> IDocEntry
-      Section,            // 29 -> IDocSection
-      Verbatim,           // 30 -> IDocVerbatim
-      Copy,               // 31 -> IDocCopy
-      TocList,            // 32 -> IDocTocList
-      TocItem,            // 33 -> IDocTocItem
-      Anchor,             // 34 -> IDocAnchor
-      Symbol,             // 35 -> IDocSymbol
-      Internal,           // 36 -> IDocInternal
-      Root,               // 37 -> IDocRoot
-      ParameterItem       // 38 -> IDocParameterItem
-    };
-    virtual Kind kind() const = 0;
-};
-
-class IDocMarkup : public IDoc
-{
-  public:
-    enum Markup 
-    { 
-      Normal         = 0x000,
-      Bold           = 0x001,
-      Emphasis       = 0x002,
-      ComputerOutput = 0x004,
-      Subscript      = 0x008,
-      Superscript    = 0x010,
-      SmallFont      = 0x020,
-      Center         = 0x040,
-      Preformatted   = 0x080,
-      Heading        = 0x100
-    };
-};
-
-class IDocPara : public IDoc
-{
-  public:
-    virtual IDocIterator *contents() const = 0; 
-};
-
-class IDocText : public IDocMarkup
-{
-  public:
-    virtual const IString * text() const = 0;
-    virtual int markup() const = 0;
-    virtual int headingLevel() const = 0;
-};
-
-class IDocMarkupModifier : public IDoc
-{
-  public:
-    virtual bool enabled() const = 0;
-    virtual int markup() const = 0;
-    virtual int headingLevel() const = 0;
-};
-
-class IDocItemizedList : public IDoc
-{
-  public:
-    virtual IDocIterator *elements() const = 0;
-};
-
-class IDocOrderedList : public IDoc
-{
-  public:
-    virtual IDocIterator *elements() const = 0;
-};
-
-class IDocListItem : public IDoc
-{
-  public:
-    virtual IDocIterator *contents() const = 0;
-};
-
-class IDocParameterList : public IDoc
-{
-  public:
-    enum Types { Param, RetVal, Exception };
-    virtual Types sectType() const = 0;
-    virtual IDocIterator *params() const = 0;
-};
-
-class IDocParameterItem : public IDoc
-{
-  public:
-    virtual IDocIterator *paramNames() const = 0;
-    virtual IDocPara *description() const = 0;
-};
-
-class IDocParameter : public IDoc
-{
-  public:
-    virtual const IString * name() const = 0;
-};
-
-class IDocTitle : public IDoc
-{
-  public:
-    virtual IDocIterator *title() const = 0;
-};
-
-class IDocSimpleSect : public IDoc
-{
-  public:
-    enum Types { Invalid = 0,
-                 See, Return, Author, Version, 
-                 Since, Date, Bug, Note,
-                 Warning, Par, Deprecated, Pre, 
-                 Post, Invar, Remark, Attention,
-                 Todo, Test, RCS, EnumValues, 
-                 Examples
-    };
-    virtual Types type() const = 0;
-    virtual const IString * typeString() const = 0;
-    virtual IDocTitle *title() const = 0;
-    virtual IDocPara *description() const = 0;
-};
-
-class IDocRef : public IDoc
-{
-  public:
-    enum TargetKind { Member, Compound };
-    virtual const IString * refId() const = 0;
-    virtual TargetKind targetKind() const = 0;
-    virtual const IString * external() const = 0;
-    virtual const IString * text() const = 0;
-};
-
-class IDocVariableList : public IDoc
-{
-  public:
-    virtual IDocIterator *entries() const = 0;
-};
-
-class IDocVariableListEntry : public IDoc
-{
-  public:
-    virtual ILinkedTextIterator * term() const = 0;
-    virtual IDocPara *description() const = 0;
-};
-
-class IDocHRuler : public IDoc
-{
-};
-
-class IDocLineBreak : public IDoc
-{
-};
-
-class IDocULink : public IDoc
-{
-  public:
-    virtual const IString * url() const = 0;
-    virtual const IString * text() const = 0;
-};
-
-class IDocEMail : public IDoc
-{
-  public:
-    virtual const IString * address() const = 0;
-};
-
-class IDocLink : public IDoc
-{
-  public:
-    virtual const IString * refId() const = 0;
-    virtual const IString * text() const = 0;
-};
-
-class IDocProgramListing : public IDoc
-{
-  public:
-    virtual IDocIterator *codeLines() const = 0;
-};
-
-class IDocCodeLine : public IDoc
-{
-  public:
-    virtual int lineNumber() const = 0;
-    virtual const IString * refId() const = 0;
-    virtual IDocIterator *codeElements() const = 0;
-};
-
-class IDocHighlight : public IDoc
-{
-  public:
-    enum HighlightKind 
-    { Invalid=0,
-      Comment, Keyword, 
-      KeywordType, KeywordFlow, CharLiteral, 
-      StringLiteral, Preprocessor
-    };
-    virtual HighlightKind highlightKind() const = 0;
-    virtual IDocIterator *codeElements() const = 0;
-};
-
-class IDocFormula : public IDoc
-{
-  public:
-    virtual const IString * id() const = 0;
-    virtual const IString * text() const = 0;
-};
-
-class IDocImage : public IDoc
-{
-  public:
-    virtual const IString * name() const = 0;
-    virtual const IString * caption() const = 0;
-};
-
-class IDocDotFile : public IDoc
-{
-  public:
-    virtual const IString * name() const = 0;
-    virtual const IString * caption() const = 0;
-};
-
-class IDocIndexEntry : public IDoc
-{
-  public:
-    virtual const IString * primary() const = 0;
-    virtual const IString * secondary() const = 0;
-};
-
-class IDocTable : public IDoc
-{
-  public:
-    virtual IDocIterator *rows() const = 0;
-    virtual int numColumns() const = 0;
-    virtual const IString * caption() const = 0;
-};
-
-class IDocRow : public IDoc
-{
-  public:
-    virtual IDocIterator *entries() const = 0;
-};
-
-class IDocEntry : public IDoc
-{
-  public:
-    virtual IDocIterator *contents() const = 0;
-};
-
-class IDocSection : public IDoc
-{
-  public:
-    virtual const IString * id() const = 0; 
-    virtual int level() const = 0;
-    virtual IDocTitle *title() const = 0;
-    virtual IDocIterator *paragraphs() const = 0;
-    virtual IDocIterator *subSections() const = 0;
-    virtual IDocInternal *internal() const = 0;
-};
-
-class IDocInternal : public IDoc
-{
-  public:
-    virtual IDocIterator *paragraphs() const = 0;
-    virtual IDocIterator *subSections() const = 0;
-};
-
-class IDocTocList : public IDoc
-{
-  public:
-    virtual IDocIterator *elements() const = 0;
-};
-
-class IDocTocItem : public IDoc
-{
-  public:
-    virtual const IString *id() const = 0; 
-    virtual const IString *title() const = 0;
-};
-
-class IDocCopy : public IDoc
-{
-  public:
-    virtual IDocIterator *contents() const = 0; 
-};
-
-class IDocVerbatim : public IDoc
-{
-  public:
-    enum Types { Invalid = 0, HtmlOnly, LatexOnly, Verbatim };
-    virtual const IString *text() const = 0; 
-    virtual Types type() const = 0;
-};
-
-class IDocAnchor : public IDoc
-{
-  public:
-    virtual const IString *id() const = 0; 
-};
-
-class IDocSymbol : public IDoc
-{
-  public:
-    enum Types 
-    { Invalid = 0,
-      Umlaut, Acute, Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Copy
-    };
-    virtual Types type() const = 0;
-    virtual const IString * typeString() const = 0;
-    virtual char letter() const = 0;
-};
-
-class IDocRoot : public IDoc
-{
-  public:
-    virtual IDocIterator *contents() const = 0; 
-    virtual IDocInternal *internal() const = 0; 
-};
-
-class IDocIterator 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IDocIterator)
-    virtual IDoc *toFirst() = 0;
-    virtual IDoc *toLast() = 0;
-    virtual IDoc *toNext() = 0;
-    virtual IDoc *toPrev() = 0;
-    virtual IDoc *current() const = 0;
-    virtual void release() = 0;
-};
-
-class IEdgeLabel
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IEdgeLabel)
-    virtual const IString * label() const = 0;
-};
-
-class IEdgeLabelIterator 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IEdgeLabelIterator)
-    virtual IEdgeLabel *toFirst() = 0;
-    virtual IEdgeLabel *toLast() = 0;
-    virtual IEdgeLabel *toNext() = 0;
-    virtual IEdgeLabel *toPrev() = 0;
-    virtual IEdgeLabel *current() const = 0;
-    virtual void release() = 0;
-};
-
-class IChildNode
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IChildNode)
-    enum NodeRelation { PublicInheritance, ProtectedInheritance,
-                        PrivateInheritance, Usage, TemplateInstance
-                      };
-    virtual INode * node() const = 0;
-    virtual NodeRelation relation() const = 0;
-    virtual const IString * relationString() const = 0;
-    virtual IEdgeLabelIterator *edgeLabels() const = 0;
-};
-
-class IChildNodeIterator 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IChildNodeIterator)
-    virtual IChildNode *toFirst() = 0;
-    virtual IChildNode *toLast() = 0;
-    virtual IChildNode *toNext() = 0;
-    virtual IChildNode *toPrev() = 0;
-    virtual IChildNode *current() const = 0;
-    virtual void release() = 0;
-};
-
-class INode
-{
-  public:
-    VIRTUAL_DESTRUCTOR(INode)
-    virtual const IString * id() const = 0;
-    virtual const IString * label() const = 0;
-    virtual const IString * linkId() const = 0;
-    virtual IChildNodeIterator *children() const = 0;
-};
-
-class INodeIterator 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(INodeIterator)
-    virtual INode *toFirst() = 0;
-    virtual INode *toLast() = 0;
-    virtual INode *toNext() = 0;
-    virtual INode *toPrev() = 0;
-    virtual INode *current() const = 0;
-    virtual void release() = 0;
-};
-
-class IGraph
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IGraph)
-    virtual INodeIterator *nodes() const = 0;
-};
-
-class IMember 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IMember)
-    enum MemberKind { Invalid=0,
-                      Define, Property, Variable, Typedef, Enum,
-                      Function, Signal, Prototype, Friend, DCOP, Slot, 
-                      EnumValue
-                    };
-    virtual ICompound *compound() const = 0;
-    virtual ISection *section() const = 0;
-    virtual MemberKind kind() const = 0;
-    virtual const IString * kindString() const = 0;
-    virtual const IString * id() const = 0;
-    virtual const IString * protection() const = 0;
-    virtual const IString * virtualness() const = 0;
-    virtual ILinkedTextIterator *type() const = 0;
-    virtual const IString * typeString() const = 0;
-    virtual const IString * name() const = 0;
-    virtual const IString * readAccessor() const = 0;
-    virtual const IString * writeAccessor() const = 0;
-    virtual const IString * definition() const = 0;
-    virtual const IString * argsstring() const = 0;
-    virtual bool isConst() const = 0;
-    virtual bool isVolatile() const = 0;
-    virtual bool isStatic() const = 0;
-    virtual bool isExplicit() const = 0;
-    virtual bool isInline() const = 0;
-    virtual bool isMutable() const = 0;
-    virtual bool isReadable() const = 0;
-    virtual bool isWritable() const = 0;
-    virtual IParamIterator *parameters() const = 0;
-    virtual IParamIterator *templateParameters() const = 0;
-    virtual ILinkedTextIterator *initializer() const = 0;
-    virtual ILinkedTextIterator *exceptions() const = 0;
-    virtual IMemberReferenceIterator *references() const = 0; 
-    virtual IMemberReferenceIterator *referencedBy() const = 0;
-    virtual const IString *bodyFile() const = 0;
-    virtual int bodyStart() const = 0;
-    virtual int bodyEnd() const = 0;
-    virtual const IString * definitionFile() const = 0;
-    virtual int definitionLine() const = 0;
-    virtual IMemberReference *reimplements() const = 0;
-    virtual IMemberReferenceIterator *reimplementedBy() const = 0;
-    virtual IDocRoot *briefDescription() const = 0;
-    virtual IDocRoot *detailedDescription() const = 0;
-    virtual IDocRoot *inbodyDescription() const = 0;
-};
-
-class IDefine : public IMember
-{
-  public:
-};
-
-class IProperty : public IMember
-{
-  public:
-};
-
-class IVariable : public IMember
-{
-  public:
-};
-
-class ITypedef : public IMember
-{
-  public:
-};
-
-class IFunction : public IMember
-{
-  public:
-};
-
-class ISignal : public IMember
-{
-  public:
-};
-
-class IPrototype : public IMember
-{
-  public:
-};
-
-class IFriend : public IMember
-{
-  public:
-};
-
-class IDCOP : public IMember
-{
-  public:
-};
-
-class ISlot : public IMember
-{
-  public:
-};
-
-class IEnumValue : public IMember
-{
-  public:
-    virtual const IString * name() const = 0;
-};
-
-/*! \brief Include relation
- */
-class IInclude 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IInclude)
-    virtual const IString * name() const = 0;
-    virtual const IString * refId() const = 0;
-    virtual bool isLocal() const = 0;
-};
-
-class IIncludeIterator
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IIncludeIterator)
-    virtual IInclude *toFirst() = 0;
-    virtual IInclude *toLast() = 0;
-    virtual IInclude *toNext() = 0;
-    virtual IInclude *toPrev() = 0;
-    virtual IInclude *current() const = 0;
-    virtual void release() = 0;
-};
-
-class IMemberIterator 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IMemberIterator)
-    virtual IMember *toFirst() = 0;
-    virtual IMember *toLast() = 0;
-    virtual IMember *toNext() = 0;
-    virtual IMember *toPrev() = 0;
-    virtual IMember *current() const = 0;
-    virtual void release() = 0;
-};
-
-class IEnum : public IMember
-{
-  public:
-    virtual IMemberIterator *enumValues() const = 0;
-};
-
-/*! \brief The interface to a section in the object model. 
- *
- *  A compound can have a number of sections, where each
- *  section contains a set of members with the properties implied by
- *  the section kind. The kind() method returns the kind of the section.
- *  The members of the section can be accessed via members(). Apart
- *  from using kind(), some of the individual properties of the section can 
- *  also be inspected via isStatic(), isPublic(), isProtected() and 
- *  isPrivate().
- */
-class ISection 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(ISection)
-    /*! Possible section types */
-    enum SectionKind 
-    { Invalid=0,
-      UserDefined,         //!< A user defined member group 
-      PubTypes,            //!< Public member typedefs
-      PubFuncs,            //!< Public member functions
-      PubAttribs,          //!< Public member attributes 
-      PubSlots,            //!< Public Qt Slots
-      Signals,             //!< Qt Signals
-      DCOPFuncs,           //!< KDE-DCOP interface functions
-      Properties,          //!< IDL properties
-      Events,              //!< C# events
-      PubStatFuncs,        //!< Public static member functions
-      PubStatAttribs,      //!< Public static attributes
-      ProTypes,            //!< Protected member typedefs
-      ProFuncs,            //!< Protected member functions
-      ProAttribs,          //!< Protected member attributes
-      ProSlots,            //!< Protected slots
-      ProStatFuncs,        //!< Protected static member functions
-      ProStatAttribs,      //!< Protected static member attributes
-      PacTypes,            //!< Package member typedefs
-      PacFuncs,            //!< Package member functions
-      PacAttribs,          //!< Package member attributes
-      PacStatFuncs,        //!< Package static member functions
-      PacStatAttribs,      //!< Package static member attributes
-      PriTypes,            //!< Private member typedefs
-      PriFuncs,            //!< Private member functions
-      PriAttribs,          //!< Private member attributes
-      PriSlots,            //!< Private Qt slots
-      PriStatFuncs,        //!< Private static member functions
-      PriStatAttribs,      //!< Private static member attributes
-      Friend,              //!< Friends
-      Related,             //!< Function marked as related
-      Defines,             //!< Preprocessor defines
-      Prototypes,          //!< Global function prototypes
-      Typedefs,            //!< Global typedefs
-      Enums,               //!< Enumerations
-      Functions,           //!< Global functions
-      Variables            //!< Global variables
-    };
-    
-    /*! Returns a string representation of the value returned by kind() */
-    virtual const IString * kindString() const = 0;
-    
-    /*! Returns what kind of section this is */
-    virtual SectionKind kind() const = 0;
-
-    /*! Returns the description attached to this section (for user defined
-     *  sections, also known as member groups).
-     */
-    virtual IDocRoot *description() const = 0;
-    
-    /*! Returns an iterator for the members of this section */
-    virtual IMemberIterator *members() const = 0;
-    
-    /*! Returns \c true if this section contains statics */
-    virtual bool isStatic() const = 0;
-    
-    /*! Returns \c true if this section belongs to a 
-     *  public section of a class 
-     */
-    virtual bool isPublic() const = 0;
-    
-    /*! Returns \c true if this section belongs to a 
-     *  private section of a class 
-     */
-    virtual bool isPrivate() const = 0;
-    
-    /*! Returns \c true if this section belongs to a 
-     *  protected section of a class 
-     * */
-    virtual bool isProtected() const = 0;
-};
-
-class IUserDefined : public ISection
-{
-  public:
-    virtual const IString * header() const = 0;
-};
-
-class ISectionIterator 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(ISectionIterator)
-    virtual ISection *toFirst() = 0;
-    virtual ISection *toLast() = 0;
-    virtual ISection *toNext() = 0;
-    virtual ISection *toPrev() = 0;
-    virtual ISection *current() const = 0;
-    virtual void release() = 0;
-};
-
-/*! \brief The interface to a compound in the object model. 
- *
- *  A compound has a name which can be obtained via the name() method 
- *  and a unique id, which is return via the id() method.
- *  A compound consists zero or more members which are grouped into sections. 
- *  The sections() method can be used to access the individual sections. 
- *  Alternatively, members can be obtained by name or id. There are 
- *  different types of compounds. The kind() method returns what kind of 
- *  compound this is. Depending on the return value one can dynamically 
- *  cast an interface pointer to an more specialised interface that provides 
- *  additional methods.
- *  Example:
- *  \code
- *  ICompound *comp=...;
- *  if (comp->kind()==ICompound::Class)
- *  {
- *    IClass *cls = dynamic_cast<IClass*>(comp);
- *    // use methods of IClass
- *  }
- *  \endcode
- *  The documentation that is provided by a compound is available via
- *  the briefDescription() and detailedDescription() methods.
- *  To avoid excessive memory usage, release() should be called (once) on each 
- *  compound interface pointer that is no longer needed.
- */
-class ICompound 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(ICompound)
-    /*! Represents the kind of compounds recognised by doxygen. */
-    enum CompoundKind { Invalid=0,
-                        Class, Struct, Union, Interface, Protocol, Category,
-                        Exception, File, Namespace, Group, Page, Example, Dir
-                      };
-
-    /*! Returns the name of this compound */
-    virtual const IString * name() const = 0;
-
-    /*! Returns the id of this compound. The id is a
-     *  unique string representing a specific compound object.
-     */
-    virtual const IString * id()   const = 0;
-
-    /*! Returns the kind of compound. See #CompoundKind for possible
-     *  values.
-     */
-    virtual CompoundKind kind() const = 0;
-
-    /*! Returns a string representation of the compound kind.
-     *  @see kind()
-     */
-    virtual const IString * kindString() const = 0;
-
-    /*! Returns an iterator for the different member sections in this
-     *  compound.
-     */
-    virtual ISectionIterator *sections() const = 0;
-
-    /*! Returns a tree-structured representation of the brief
-     *  description that is attached to this compound.
-     */
-    virtual IDocRoot *briefDescription() const = 0;
-
-    /*! Returns a tree-structured representation of the detailed
-     *  description that is attached to this compound.
-     */
-    virtual IDocRoot *detailedDescription() const = 0;
-
-    /*! Returns an interface to a member given its id. 
-     *  @param id The member id.
-     */
-    virtual IMember *memberById(const char * id) const = 0;
-
-    /*! Returns a list of all members within the compound having a certain 
-     *  name. Member overloading is the reason why there can be more than 
-     *  one member. 
-     *  @param name The name of the member.
-     */
-    virtual IMemberIterator *memberByName(const char * name) const = 0;
-
-    /*! Decreases the reference counter for this compound. If it reaches
-     *  zero, the memory for the compound will be released.
-     */
-    virtual void release() = 0;
-};
-
-class ICompoundIterator 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(ICompoundIterator)
-    virtual void toFirst() = 0;
-    virtual void toLast() = 0;
-    virtual void toNext() = 0;
-    virtual void toPrev() = 0;
-    virtual ICompound *current() const = 0;
-    virtual void release() = 0;
-};
-
-class IRelatedCompound
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IRelatedCompound)
-    enum Protection { Public, Protected, Private };
-    enum Kind { Normal, Virtual };
-    virtual ICompound *compound() const = 0;
-    virtual Protection protection() const = 0;
-    virtual Kind kind() const = 0;
-    virtual const IString *name() const = 0;
-
-};
-
-class IRelatedCompoundIterator 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IRelatedCompoundIterator)
-    virtual IRelatedCompound *toFirst() = 0;
-    virtual IRelatedCompound *toLast() = 0;
-    virtual IRelatedCompound *toNext() = 0;
-    virtual IRelatedCompound *toPrev() = 0;
-    virtual IRelatedCompound *current() const = 0;
-    virtual void release() = 0;
-};
-
-/*! \brief The interface to a class in the object model. 
- */
-class IClass : public ICompound
-{
-  public:
-    virtual IGraph *inheritanceGraph() const = 0;
-    virtual IGraph *collaborationGraph() const = 0;
-    virtual IRelatedCompoundIterator *baseCompounds() const = 0;
-    virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
-    virtual ICompoundIterator *nestedCompounds() const = 0;
-    virtual IParamIterator *templateParameters() const = 0;
-    virtual const IString *locationFile() const = 0;
-    virtual int locationLine() const = 0;
-    virtual const IString *locationBodyFile() const = 0;
-    virtual int locationBodyStartLine() const = 0;
-    virtual int locationBodyEndLine() const = 0;
-
-    // TODO:
-    // class:
-    //  listOfAllMembers()
-    //  protection()
-    //  isAbstract()
-};
-
-/*! \brief The interface to a struct in the object model. 
- */
-class IStruct : public ICompound
-{
-  public:
-    virtual ICompoundIterator *nestedCompounds() const = 0;
-    virtual IRelatedCompoundIterator *baseCompounds() const = 0;
-    virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
-    virtual const IString *locationFile() const = 0;
-    virtual int locationLine() const = 0;
-    virtual int locationBodyStartLine() const = 0;
-    virtual int locationBodyEndLine() const = 0;
-};
-
-/*! \brief The interface to a union in the object model. 
- */
-class IUnion : public ICompound
-{
-  public:
-    virtual ICompoundIterator *nestedCompounds() const = 0;
-};
-
-/*! \brief The interface to a Java/IDL interface in the object model. 
- */
-class IInterface : public ICompound
-{
-  public:
-    virtual IRelatedCompoundIterator *baseCompounds() const = 0;
-    virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
-};
-
-
-/*! \brief The interface to a Java/IDL exception in the object model. 
- */
-class IException : public ICompound
-{
-};
-
-/*! \brief The interface to a namespace in the object model. 
- */
-class INamespace : public ICompound
-{
-  public:
-    virtual ICompoundIterator *nestedCompounds() const = 0;
-};
-
-/*! \brief The interface to a file in the object model. 
- */
-class IFile : public ICompound
-{
-  public:
-    virtual IGraph *includeDependencyGraph() const = 0;
-    virtual IGraph *includedByDependencyGraph() const = 0;
-    virtual IDocProgramListing *source() const = 0;
-    virtual ICompoundIterator *nestedCompounds() const = 0;
-
-    virtual IIncludeIterator *includes() const = 0;
-    virtual IIncludeIterator *includedBy() const = 0;
-
-    //  ICompound *innerNamespaces()
-    //  ICompoundIterator *innerClasses()
-};
-
-/*! \brief The interface to a group in the object model. 
- */
-class IGroup : public ICompound
-{
-  public:
-    virtual ICompoundIterator *nestedCompounds() const = 0;
-    // group:
-    //  Title()
-    //  innerFile()
-    //  innerPage()
-};
-
-/*! \brief The interface to a page in the object model. 
- */
-class IPage : public ICompound
-{
-  public:
-    virtual const IDocTitle *title() const = 0;
-};
-
-/** \brief Interface to a directory in the object model. */
-class IDir : public ICompound
-{
-  public:
-    virtual ICompoundIterator *nestedCompounds() const = 0;
-};
-
-/*! Root node of the object model. */
-class IDoxygen 
-{
-  public:
-    VIRTUAL_DESTRUCTOR(IDoxygen)
-
-    /*! Returns an iterator that can be used to iterate over the list
-     *  of compounds found in the project.
-     */
-    virtual ICompoundIterator *compounds() const = 0;
-
-    /*! Returns a compound given its unique \a id. If you have a
-     *  compound id this function is much more efficient than iterating
-     *  over the compound list. Returns 0 if the id is not valid.
-     */
-    virtual ICompound *compoundById(const char * id) const = 0;
-
-    /*! Returns a compound given its name (including the scope). 
-     *  Returns 0 if the name is not found in the project.
-     */
-    virtual ICompound *compoundByName(const char * name) const = 0;
-
-    /*! Returns an interface to a compound containing a member given it the
-     *  member's id. Given the ICompound interface one can use the same id
-     *  to obtain the IMember interface.
-     *  @param id The member id.
-     */
-    virtual ICompound *memberById(const char * id) const = 0;
-
-    /*! Returns a list of all compounds containing at least one members 
-     *  with a certain name. Each compound can be asked to return the
-     *  list of members with that name.
-     *  @param name The name of the member.
-     */
-    virtual ICompoundIterator *memberByName(const char * name) const = 0;
-
-    /*! Releases the memory for the object hierarchy obtained by 
-     *  createdObjecModelFromXML(). First release all iterators before calling
-     *  this function.
-     */
-    virtual void release() = 0;
-
-    /*! Sets the debug level.
-     *  - 0 all debugging messages are disabled (the default).
-     *  - 1 display important messages only
-     *  - 2 display any messages.
-     */
-    virtual void setDebugLevel(int level) = 0;
-
-    /*! Reads an XML directory produced by doxygen and builds up a data 
-     *  structure representing the contents of the XML files in the directory. 
-     */
-    virtual bool readXMLDir(const char *xmlDirName) = 0;
-};
-
-/*! Factory method that creates an empty object model for a doxygen generated XML file.
- *  Use the readXMLDir() method to build the model from an XML output 
- *  directory containing doxygen output.
- */
-IDoxygen *createObjectModel();
-
-#endif
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..2d2b707b74ecf7859c04fd0755f2769224f5a5cd
--- /dev/null
@@ -0,0 +1 @@
+../src/doxmlintf.h
\ No newline at end of file
index 32e4181..31fbf24 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 9a59502..2ee9c2f 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 3cd77b0..87b0440 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 635cff3..c7e5ac0 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 992b185..df71e6a 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 172bcd2..6bc2bd9 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
deleted file mode 120000 (symlink)
index 1b1e84779646791b56cef97f9c5081bb64eaaf26..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1 +0,0 @@
-../include/doxmlintf.h
\ No newline at end of file
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..ba863d4446d0f6e3feeb2d7da7f4cd9fb34248fa
--- /dev/null
+/******************************************************************************
+ *
+ * $Id$
+ *
+ *
+ * Copyright (C) 1997-2014 by Dimitri van 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.
+ *
+ */
+
+#ifndef _DOXMLINTF_H
+#define _DOXMLINTF_H
+
+/*! \file
+ *  \brief The interface to the object model provided by the XML parser 
+ *         library.
+ *
+ *  To start using this library one calls createObjectModel() and then
+ *  uses the returned IDoxygen interface to read doxygen generated
+ *  XML output and navigate through the information contained in it.
+ *
+ *  @see createObjectModel()
+ */
+
+class IMember;
+class IDocIterator;
+class ICompound;
+class ISection;
+class INode;
+class IDocInternal;
+class IDocRoot;
+
+#define VIRTUAL_DESTRUCTOR(x) virtual ~x() {}
+
+/*! \brief Read only interface to a string. 
+ */
+class IString
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IString)
+    /*! Returns a latin1 character representation of the string. */
+    virtual const char *latin1() const = 0;
+    /*! Returns a utf8 character representation of the string. */
+    virtual const char *utf8() const = 0;
+    /*! Returns a 16-bit unicode character representation of the character at 
+     *  position \a index in the string. The first character is at index 0.
+     */
+    virtual unsigned short unicodeCharAt(int index) const = 0;
+    /*! Returns true if this string is empty or false otherwise */
+    virtual bool isEmpty() const = 0;
+    /*! Returns the number of characters in the string. */
+    virtual int length() const = 0;
+};
+
+/*! \brief Base interface for hyperlinked text
+ *
+ *  Depending on the result of kind() the interface is extended by
+ *  ILT_Text or ILT_Ref.
+ */
+class ILinkedText
+{
+  public:
+    VIRTUAL_DESTRUCTOR(ILinkedText)
+    enum Kind { Kind_Text, Kind_Ref };
+    virtual Kind kind() const = 0;
+};
+
+/*! \brief Plain text fragment.
+ */
+class ILT_Text : public ILinkedText
+{
+  public:
+    VIRTUAL_DESTRUCTOR(ILT_Text)
+    virtual const IString *text() const = 0;
+};
+
+/*! \brief Reference to an object.
+ */
+class ILT_Ref : public ILinkedText
+{
+  public:
+    VIRTUAL_DESTRUCTOR(ILT_Ref)
+    enum TargetKind { Member, Compound };
+    virtual const IString *id() const = 0;
+    virtual TargetKind targetKind() const = 0;
+    virtual const IString *external() const = 0;
+    virtual const IString *text() const = 0;
+};
+
+/*! \brief Iterates over a list of ILinkedText fragments.
+ */
+class ILinkedTextIterator 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(ILinkedTextIterator)
+    virtual ILinkedText *toFirst() = 0;
+    virtual ILinkedText *toLast() = 0;
+    virtual ILinkedText *toNext() = 0;
+    virtual ILinkedText *toPrev() = 0;
+    virtual ILinkedText *current() const = 0;
+    virtual void release() = 0;
+};
+
+/*! \brief Representation of a parameter of a function. */
+class IParam 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IParam)
+    virtual ILinkedTextIterator *type() const = 0;
+    virtual const IString * declarationName() const = 0;
+    virtual const IString * definitionName() const = 0;
+    virtual const IString * attrib() const = 0;
+    virtual const IString * arraySpecifier() const = 0;
+    virtual ILinkedTextIterator *defaultValue() const = 0;
+    virtual IDocRoot *briefDescription() const = 0;
+};
+
+class IParamIterator
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IParamIterator)
+    virtual IParam *toFirst() = 0;
+    virtual IParam *toLast() = 0;
+    virtual IParam *toNext() = 0;
+    virtual IParam *toPrev() = 0;
+    virtual IParam *current() const = 0;
+    virtual void release() = 0;
+};
+
+class IMemberReference 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IMemberReference)
+    virtual IMember *member() const = 0;
+    virtual const IString * name() const = 0;
+    virtual const IString * scope() const = 0;
+    virtual const IString * protection() const = 0;
+    virtual const IString * virtualness() const = 0;
+    virtual const IString * ambiguityScope() const = 0;
+};
+
+class IMemberReferenceIterator 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IMemberReferenceIterator)
+    virtual IMemberReference *toFirst() = 0;
+    virtual IMemberReference *toLast() = 0;
+    virtual IMemberReference *toNext() = 0;
+    virtual IMemberReference *toPrev() = 0;
+    virtual IMemberReference *current() const = 0;
+    virtual void release() = 0;
+};
+
+class IDoc
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IDoc)
+    enum Kind 
+    { 
+      Invalid = 0,        //  0
+      Para,               //  1 -> IDocPara
+      Text,               //  2 -> IDocText
+      MarkupModifier,     //  3 -> IDocMarkupModifier
+      ItemizedList,       //  4 -> IDocItemizedList
+      OrderedList,        //  5 -> IDocOrderedList
+      ListItem,           //  6 -> IDocListItem
+      ParameterList,      //  7 -> IDocParameterList
+      Parameter,          //  8 -> IDocParameter
+      SimpleSect,         //  9 -> IDocSimpleSect
+      Title,              // 10 -> IDocTitle
+      Ref,                // 11 -> IDocRef
+      VariableList,       // 12 -> IDocVariableList
+      VariableListEntry,  // 13 -> IDocVariableListEntry
+      HRuler,             // 14 -> IDocHRuler
+      LineBreak,          // 15 -> IDocLineBreak
+      ULink,              // 16 -> IDocULink
+      EMail,              // 17 -> IDocEMail
+      Link,               // 18 -> IDocLink
+      ProgramListing,     // 19 -> IDocProgramListing
+      CodeLine,           // 20 -> IDocCodeLine
+      Highlight,          // 21 -> IDocHighlight
+      Formula,            // 22 -> IDocFormula
+      Image,              // 23 -> IDocImage
+      DotFile,            // 24 -> IDocDotFile
+      IndexEntry,         // 25 -> IDocIndexEntry
+      Table,              // 26 -> IDocTable
+      Row,                // 27 -> IDocRow
+      Entry,              // 28 -> IDocEntry
+      Section,            // 29 -> IDocSection
+      Verbatim,           // 30 -> IDocVerbatim
+      Copy,               // 31 -> IDocCopy
+      TocList,            // 32 -> IDocTocList
+      TocItem,            // 33 -> IDocTocItem
+      Anchor,             // 34 -> IDocAnchor
+      Symbol,             // 35 -> IDocSymbol
+      Internal,           // 36 -> IDocInternal
+      Root,               // 37 -> IDocRoot
+      ParameterItem       // 38 -> IDocParameterItem
+    };
+    virtual Kind kind() const = 0;
+};
+
+class IDocMarkup : public IDoc
+{
+  public:
+    enum Markup 
+    { 
+      Normal         = 0x000,
+      Bold           = 0x001,
+      Emphasis       = 0x002,
+      ComputerOutput = 0x004,
+      Subscript      = 0x008,
+      Superscript    = 0x010,
+      SmallFont      = 0x020,
+      Center         = 0x040,
+      Preformatted   = 0x080,
+      Heading        = 0x100
+    };
+};
+
+class IDocPara : public IDoc
+{
+  public:
+    virtual IDocIterator *contents() const = 0; 
+};
+
+class IDocText : public IDocMarkup
+{
+  public:
+    virtual const IString * text() const = 0;
+    virtual int markup() const = 0;
+    virtual int headingLevel() const = 0;
+};
+
+class IDocMarkupModifier : public IDoc
+{
+  public:
+    virtual bool enabled() const = 0;
+    virtual int markup() const = 0;
+    virtual int headingLevel() const = 0;
+};
+
+class IDocItemizedList : public IDoc
+{
+  public:
+    virtual IDocIterator *elements() const = 0;
+};
+
+class IDocOrderedList : public IDoc
+{
+  public:
+    virtual IDocIterator *elements() const = 0;
+};
+
+class IDocListItem : public IDoc
+{
+  public:
+    virtual IDocIterator *contents() const = 0;
+};
+
+class IDocParameterList : public IDoc
+{
+  public:
+    enum Types { Param, RetVal, Exception };
+    virtual Types sectType() const = 0;
+    virtual IDocIterator *params() const = 0;
+};
+
+class IDocParameterItem : public IDoc
+{
+  public:
+    virtual IDocIterator *paramNames() const = 0;
+    virtual IDocPara *description() const = 0;
+};
+
+class IDocParameter : public IDoc
+{
+  public:
+    virtual const IString * name() const = 0;
+};
+
+class IDocTitle : public IDoc
+{
+  public:
+    virtual IDocIterator *title() const = 0;
+};
+
+class IDocSimpleSect : public IDoc
+{
+  public:
+    enum Types { Invalid = 0,
+                 See, Return, Author, Version, 
+                 Since, Date, Bug, Note,
+                 Warning, Par, Deprecated, Pre, 
+                 Post, Invar, Remark, Attention,
+                 Todo, Test, RCS, EnumValues, 
+                 Examples
+    };
+    virtual Types type() const = 0;
+    virtual const IString * typeString() const = 0;
+    virtual IDocTitle *title() const = 0;
+    virtual IDocPara *description() const = 0;
+};
+
+class IDocRef : public IDoc
+{
+  public:
+    enum TargetKind { Member, Compound };
+    virtual const IString * refId() const = 0;
+    virtual TargetKind targetKind() const = 0;
+    virtual const IString * external() const = 0;
+    virtual const IString * text() const = 0;
+};
+
+class IDocVariableList : public IDoc
+{
+  public:
+    virtual IDocIterator *entries() const = 0;
+};
+
+class IDocVariableListEntry : public IDoc
+{
+  public:
+    virtual ILinkedTextIterator * term() const = 0;
+    virtual IDocPara *description() const = 0;
+};
+
+class IDocHRuler : public IDoc
+{
+};
+
+class IDocLineBreak : public IDoc
+{
+};
+
+class IDocULink : public IDoc
+{
+  public:
+    virtual const IString * url() const = 0;
+    virtual const IString * text() const = 0;
+};
+
+class IDocEMail : public IDoc
+{
+  public:
+    virtual const IString * address() const = 0;
+};
+
+class IDocLink : public IDoc
+{
+  public:
+    virtual const IString * refId() const = 0;
+    virtual const IString * text() const = 0;
+};
+
+class IDocProgramListing : public IDoc
+{
+  public:
+    virtual IDocIterator *codeLines() const = 0;
+};
+
+class IDocCodeLine : public IDoc
+{
+  public:
+    virtual int lineNumber() const = 0;
+    virtual const IString * refId() const = 0;
+    virtual IDocIterator *codeElements() const = 0;
+};
+
+class IDocHighlight : public IDoc
+{
+  public:
+    enum HighlightKind 
+    { Invalid=0,
+      Comment, Keyword, 
+      KeywordType, KeywordFlow, CharLiteral, 
+      StringLiteral, Preprocessor
+    };
+    virtual HighlightKind highlightKind() const = 0;
+    virtual IDocIterator *codeElements() const = 0;
+};
+
+class IDocFormula : public IDoc
+{
+  public:
+    virtual const IString * id() const = 0;
+    virtual const IString * text() const = 0;
+};
+
+class IDocImage : public IDoc
+{
+  public:
+    virtual const IString * name() const = 0;
+    virtual const IString * caption() const = 0;
+};
+
+class IDocDotFile : public IDoc
+{
+  public:
+    virtual const IString * name() const = 0;
+    virtual const IString * caption() const = 0;
+};
+
+class IDocIndexEntry : public IDoc
+{
+  public:
+    virtual const IString * primary() const = 0;
+    virtual const IString * secondary() const = 0;
+};
+
+class IDocTable : public IDoc
+{
+  public:
+    virtual IDocIterator *rows() const = 0;
+    virtual int numColumns() const = 0;
+    virtual const IString * caption() const = 0;
+};
+
+class IDocRow : public IDoc
+{
+  public:
+    virtual IDocIterator *entries() const = 0;
+};
+
+class IDocEntry : public IDoc
+{
+  public:
+    virtual IDocIterator *contents() const = 0;
+};
+
+class IDocSection : public IDoc
+{
+  public:
+    virtual const IString * id() const = 0; 
+    virtual int level() const = 0;
+    virtual IDocTitle *title() const = 0;
+    virtual IDocIterator *paragraphs() const = 0;
+    virtual IDocIterator *subSections() const = 0;
+    virtual IDocInternal *internal() const = 0;
+};
+
+class IDocInternal : public IDoc
+{
+  public:
+    virtual IDocIterator *paragraphs() const = 0;
+    virtual IDocIterator *subSections() const = 0;
+};
+
+class IDocTocList : public IDoc
+{
+  public:
+    virtual IDocIterator *elements() const = 0;
+};
+
+class IDocTocItem : public IDoc
+{
+  public:
+    virtual const IString *id() const = 0; 
+    virtual const IString *title() const = 0;
+};
+
+class IDocCopy : public IDoc
+{
+  public:
+    virtual IDocIterator *contents() const = 0; 
+};
+
+class IDocVerbatim : public IDoc
+{
+  public:
+    enum Types { Invalid = 0, HtmlOnly, LatexOnly, Verbatim };
+    virtual const IString *text() const = 0; 
+    virtual Types type() const = 0;
+};
+
+class IDocAnchor : public IDoc
+{
+  public:
+    virtual const IString *id() const = 0; 
+};
+
+class IDocSymbol : public IDoc
+{
+  public:
+    enum Types 
+    { Invalid = 0,
+      Umlaut, Acute, Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Copy
+    };
+    virtual Types type() const = 0;
+    virtual const IString * typeString() const = 0;
+    virtual char letter() const = 0;
+};
+
+class IDocRoot : public IDoc
+{
+  public:
+    virtual IDocIterator *contents() const = 0; 
+    virtual IDocInternal *internal() const = 0; 
+};
+
+class IDocIterator 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IDocIterator)
+    virtual IDoc *toFirst() = 0;
+    virtual IDoc *toLast() = 0;
+    virtual IDoc *toNext() = 0;
+    virtual IDoc *toPrev() = 0;
+    virtual IDoc *current() const = 0;
+    virtual void release() = 0;
+};
+
+class IEdgeLabel
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IEdgeLabel)
+    virtual const IString * label() const = 0;
+};
+
+class IEdgeLabelIterator 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IEdgeLabelIterator)
+    virtual IEdgeLabel *toFirst() = 0;
+    virtual IEdgeLabel *toLast() = 0;
+    virtual IEdgeLabel *toNext() = 0;
+    virtual IEdgeLabel *toPrev() = 0;
+    virtual IEdgeLabel *current() const = 0;
+    virtual void release() = 0;
+};
+
+class IChildNode
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IChildNode)
+    enum NodeRelation { PublicInheritance, ProtectedInheritance,
+                        PrivateInheritance, Usage, TemplateInstance
+                      };
+    virtual INode * node() const = 0;
+    virtual NodeRelation relation() const = 0;
+    virtual const IString * relationString() const = 0;
+    virtual IEdgeLabelIterator *edgeLabels() const = 0;
+};
+
+class IChildNodeIterator 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IChildNodeIterator)
+    virtual IChildNode *toFirst() = 0;
+    virtual IChildNode *toLast() = 0;
+    virtual IChildNode *toNext() = 0;
+    virtual IChildNode *toPrev() = 0;
+    virtual IChildNode *current() const = 0;
+    virtual void release() = 0;
+};
+
+class INode
+{
+  public:
+    VIRTUAL_DESTRUCTOR(INode)
+    virtual const IString * id() const = 0;
+    virtual const IString * label() const = 0;
+    virtual const IString * linkId() const = 0;
+    virtual IChildNodeIterator *children() const = 0;
+};
+
+class INodeIterator 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(INodeIterator)
+    virtual INode *toFirst() = 0;
+    virtual INode *toLast() = 0;
+    virtual INode *toNext() = 0;
+    virtual INode *toPrev() = 0;
+    virtual INode *current() const = 0;
+    virtual void release() = 0;
+};
+
+class IGraph
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IGraph)
+    virtual INodeIterator *nodes() const = 0;
+};
+
+class IMember 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IMember)
+    enum MemberKind { Invalid=0,
+                      Define, Property, Variable, Typedef, Enum,
+                      Function, Signal, Prototype, Friend, DCOP, Slot, 
+                      EnumValue
+                    };
+    virtual ICompound *compound() const = 0;
+    virtual ISection *section() const = 0;
+    virtual MemberKind kind() const = 0;
+    virtual const IString * kindString() const = 0;
+    virtual const IString * id() const = 0;
+    virtual const IString * protection() const = 0;
+    virtual const IString * virtualness() const = 0;
+    virtual ILinkedTextIterator *type() const = 0;
+    virtual const IString * typeString() const = 0;
+    virtual const IString * name() const = 0;
+    virtual const IString * readAccessor() const = 0;
+    virtual const IString * writeAccessor() const = 0;
+    virtual const IString * definition() const = 0;
+    virtual const IString * argsstring() const = 0;
+    virtual bool isConst() const = 0;
+    virtual bool isVolatile() const = 0;
+    virtual bool isStatic() const = 0;
+    virtual bool isExplicit() const = 0;
+    virtual bool isInline() const = 0;
+    virtual bool isMutable() const = 0;
+    virtual bool isReadable() const = 0;
+    virtual bool isWritable() const = 0;
+    virtual IParamIterator *parameters() const = 0;
+    virtual IParamIterator *templateParameters() const = 0;
+    virtual ILinkedTextIterator *initializer() const = 0;
+    virtual ILinkedTextIterator *exceptions() const = 0;
+    virtual IMemberReferenceIterator *references() const = 0; 
+    virtual IMemberReferenceIterator *referencedBy() const = 0;
+    virtual const IString *bodyFile() const = 0;
+    virtual int bodyStart() const = 0;
+    virtual int bodyEnd() const = 0;
+    virtual const IString * definitionFile() const = 0;
+    virtual int definitionLine() const = 0;
+    virtual IMemberReference *reimplements() const = 0;
+    virtual IMemberReferenceIterator *reimplementedBy() const = 0;
+    virtual IDocRoot *briefDescription() const = 0;
+    virtual IDocRoot *detailedDescription() const = 0;
+    virtual IDocRoot *inbodyDescription() const = 0;
+};
+
+class IDefine : public IMember
+{
+  public:
+};
+
+class IProperty : public IMember
+{
+  public:
+};
+
+class IVariable : public IMember
+{
+  public:
+};
+
+class ITypedef : public IMember
+{
+  public:
+};
+
+class IFunction : public IMember
+{
+  public:
+};
+
+class ISignal : public IMember
+{
+  public:
+};
+
+class IPrototype : public IMember
+{
+  public:
+};
+
+class IFriend : public IMember
+{
+  public:
+};
+
+class IDCOP : public IMember
+{
+  public:
+};
+
+class ISlot : public IMember
+{
+  public:
+};
+
+class IEnumValue : public IMember
+{
+  public:
+    virtual const IString * name() const = 0;
+};
+
+/*! \brief Include relation
+ */
+class IInclude 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IInclude)
+    virtual const IString * name() const = 0;
+    virtual const IString * refId() const = 0;
+    virtual bool isLocal() const = 0;
+};
+
+class IIncludeIterator
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IIncludeIterator)
+    virtual IInclude *toFirst() = 0;
+    virtual IInclude *toLast() = 0;
+    virtual IInclude *toNext() = 0;
+    virtual IInclude *toPrev() = 0;
+    virtual IInclude *current() const = 0;
+    virtual void release() = 0;
+};
+
+class IMemberIterator 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IMemberIterator)
+    virtual IMember *toFirst() = 0;
+    virtual IMember *toLast() = 0;
+    virtual IMember *toNext() = 0;
+    virtual IMember *toPrev() = 0;
+    virtual IMember *current() const = 0;
+    virtual void release() = 0;
+};
+
+class IEnum : public IMember
+{
+  public:
+    virtual IMemberIterator *enumValues() const = 0;
+};
+
+/*! \brief The interface to a section in the object model. 
+ *
+ *  A compound can have a number of sections, where each
+ *  section contains a set of members with the properties implied by
+ *  the section kind. The kind() method returns the kind of the section.
+ *  The members of the section can be accessed via members(). Apart
+ *  from using kind(), some of the individual properties of the section can 
+ *  also be inspected via isStatic(), isPublic(), isProtected() and 
+ *  isPrivate().
+ */
+class ISection 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(ISection)
+    /*! Possible section types */
+    enum SectionKind 
+    { Invalid=0,
+      UserDefined,         //!< A user defined member group 
+      PubTypes,            //!< Public member typedefs
+      PubFuncs,            //!< Public member functions
+      PubAttribs,          //!< Public member attributes 
+      PubSlots,            //!< Public Qt Slots
+      Signals,             //!< Qt Signals
+      DCOPFuncs,           //!< KDE-DCOP interface functions
+      Properties,          //!< IDL properties
+      Events,              //!< C# events
+      PubStatFuncs,        //!< Public static member functions
+      PubStatAttribs,      //!< Public static attributes
+      ProTypes,            //!< Protected member typedefs
+      ProFuncs,            //!< Protected member functions
+      ProAttribs,          //!< Protected member attributes
+      ProSlots,            //!< Protected slots
+      ProStatFuncs,        //!< Protected static member functions
+      ProStatAttribs,      //!< Protected static member attributes
+      PacTypes,            //!< Package member typedefs
+      PacFuncs,            //!< Package member functions
+      PacAttribs,          //!< Package member attributes
+      PacStatFuncs,        //!< Package static member functions
+      PacStatAttribs,      //!< Package static member attributes
+      PriTypes,            //!< Private member typedefs
+      PriFuncs,            //!< Private member functions
+      PriAttribs,          //!< Private member attributes
+      PriSlots,            //!< Private Qt slots
+      PriStatFuncs,        //!< Private static member functions
+      PriStatAttribs,      //!< Private static member attributes
+      Friend,              //!< Friends
+      Related,             //!< Function marked as related
+      Defines,             //!< Preprocessor defines
+      Prototypes,          //!< Global function prototypes
+      Typedefs,            //!< Global typedefs
+      Enums,               //!< Enumerations
+      Functions,           //!< Global functions
+      Variables            //!< Global variables
+    };
+    
+    /*! Returns a string representation of the value returned by kind() */
+    virtual const IString * kindString() const = 0;
+    
+    /*! Returns what kind of section this is */
+    virtual SectionKind kind() const = 0;
+
+    /*! Returns the description attached to this section (for user defined
+     *  sections, also known as member groups).
+     */
+    virtual IDocRoot *description() const = 0;
+    
+    /*! Returns an iterator for the members of this section */
+    virtual IMemberIterator *members() const = 0;
+    
+    /*! Returns \c true if this section contains statics */
+    virtual bool isStatic() const = 0;
+    
+    /*! Returns \c true if this section belongs to a 
+     *  public section of a class 
+     */
+    virtual bool isPublic() const = 0;
+    
+    /*! Returns \c true if this section belongs to a 
+     *  private section of a class 
+     */
+    virtual bool isPrivate() const = 0;
+    
+    /*! Returns \c true if this section belongs to a 
+     *  protected section of a class 
+     * */
+    virtual bool isProtected() const = 0;
+};
+
+class IUserDefined : public ISection
+{
+  public:
+    virtual const IString * header() const = 0;
+};
+
+class ISectionIterator 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(ISectionIterator)
+    virtual ISection *toFirst() = 0;
+    virtual ISection *toLast() = 0;
+    virtual ISection *toNext() = 0;
+    virtual ISection *toPrev() = 0;
+    virtual ISection *current() const = 0;
+    virtual void release() = 0;
+};
+
+/*! \brief The interface to a compound in the object model. 
+ *
+ *  A compound has a name which can be obtained via the name() method 
+ *  and a unique id, which is return via the id() method.
+ *  A compound consists zero or more members which are grouped into sections. 
+ *  The sections() method can be used to access the individual sections. 
+ *  Alternatively, members can be obtained by name or id. There are 
+ *  different types of compounds. The kind() method returns what kind of 
+ *  compound this is. Depending on the return value one can dynamically 
+ *  cast an interface pointer to an more specialised interface that provides 
+ *  additional methods.
+ *  Example:
+ *  \code
+ *  ICompound *comp=...;
+ *  if (comp->kind()==ICompound::Class)
+ *  {
+ *    IClass *cls = dynamic_cast<IClass*>(comp);
+ *    // use methods of IClass
+ *  }
+ *  \endcode
+ *  The documentation that is provided by a compound is available via
+ *  the briefDescription() and detailedDescription() methods.
+ *  To avoid excessive memory usage, release() should be called (once) on each 
+ *  compound interface pointer that is no longer needed.
+ */
+class ICompound 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(ICompound)
+    /*! Represents the kind of compounds recognised by doxygen. */
+    enum CompoundKind { Invalid=0,
+                        Class, Struct, Union, Interface, Protocol, Category,
+                        Exception, File, Namespace, Group, Page, Example, Dir
+                      };
+
+    /*! Returns the name of this compound */
+    virtual const IString * name() const = 0;
+
+    /*! Returns the id of this compound. The id is a
+     *  unique string representing a specific compound object.
+     */
+    virtual const IString * id()   const = 0;
+
+    /*! Returns the kind of compound. See #CompoundKind for possible
+     *  values.
+     */
+    virtual CompoundKind kind() const = 0;
+
+    /*! Returns a string representation of the compound kind.
+     *  @see kind()
+     */
+    virtual const IString * kindString() const = 0;
+
+    /*! Returns an iterator for the different member sections in this
+     *  compound.
+     */
+    virtual ISectionIterator *sections() const = 0;
+
+    /*! Returns a tree-structured representation of the brief
+     *  description that is attached to this compound.
+     */
+    virtual IDocRoot *briefDescription() const = 0;
+
+    /*! Returns a tree-structured representation of the detailed
+     *  description that is attached to this compound.
+     */
+    virtual IDocRoot *detailedDescription() const = 0;
+
+    /*! Returns an interface to a member given its id. 
+     *  @param id The member id.
+     */
+    virtual IMember *memberById(const char * id) const = 0;
+
+    /*! Returns a list of all members within the compound having a certain 
+     *  name. Member overloading is the reason why there can be more than 
+     *  one member. 
+     *  @param name The name of the member.
+     */
+    virtual IMemberIterator *memberByName(const char * name) const = 0;
+
+    /*! Decreases the reference counter for this compound. If it reaches
+     *  zero, the memory for the compound will be released.
+     */
+    virtual void release() = 0;
+};
+
+class ICompoundIterator 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(ICompoundIterator)
+    virtual void toFirst() = 0;
+    virtual void toLast() = 0;
+    virtual void toNext() = 0;
+    virtual void toPrev() = 0;
+    virtual ICompound *current() const = 0;
+    virtual void release() = 0;
+};
+
+class IRelatedCompound
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IRelatedCompound)
+    enum Protection { Public, Protected, Private };
+    enum Kind { Normal, Virtual };
+    virtual ICompound *compound() const = 0;
+    virtual Protection protection() const = 0;
+    virtual Kind kind() const = 0;
+    virtual const IString *name() const = 0;
+
+};
+
+class IRelatedCompoundIterator 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IRelatedCompoundIterator)
+    virtual IRelatedCompound *toFirst() = 0;
+    virtual IRelatedCompound *toLast() = 0;
+    virtual IRelatedCompound *toNext() = 0;
+    virtual IRelatedCompound *toPrev() = 0;
+    virtual IRelatedCompound *current() const = 0;
+    virtual void release() = 0;
+};
+
+/*! \brief The interface to a class in the object model. 
+ */
+class IClass : public ICompound
+{
+  public:
+    virtual IGraph *inheritanceGraph() const = 0;
+    virtual IGraph *collaborationGraph() const = 0;
+    virtual IRelatedCompoundIterator *baseCompounds() const = 0;
+    virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
+    virtual ICompoundIterator *nestedCompounds() const = 0;
+    virtual IParamIterator *templateParameters() const = 0;
+    virtual const IString *locationFile() const = 0;
+    virtual int locationLine() const = 0;
+    virtual const IString *locationBodyFile() const = 0;
+    virtual int locationBodyStartLine() const = 0;
+    virtual int locationBodyEndLine() const = 0;
+
+    // TODO:
+    // class:
+    //  listOfAllMembers()
+    //  protection()
+    //  isAbstract()
+};
+
+/*! \brief The interface to a struct in the object model. 
+ */
+class IStruct : public ICompound
+{
+  public:
+    virtual ICompoundIterator *nestedCompounds() const = 0;
+    virtual IRelatedCompoundIterator *baseCompounds() const = 0;
+    virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
+    virtual const IString *locationFile() const = 0;
+    virtual int locationLine() const = 0;
+    virtual int locationBodyStartLine() const = 0;
+    virtual int locationBodyEndLine() const = 0;
+};
+
+/*! \brief The interface to a union in the object model. 
+ */
+class IUnion : public ICompound
+{
+  public:
+    virtual ICompoundIterator *nestedCompounds() const = 0;
+};
+
+/*! \brief The interface to a Java/IDL interface in the object model. 
+ */
+class IInterface : public ICompound
+{
+  public:
+    virtual IRelatedCompoundIterator *baseCompounds() const = 0;
+    virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
+};
+
+
+/*! \brief The interface to a Java/IDL exception in the object model. 
+ */
+class IException : public ICompound
+{
+};
+
+/*! \brief The interface to a namespace in the object model. 
+ */
+class INamespace : public ICompound
+{
+  public:
+    virtual ICompoundIterator *nestedCompounds() const = 0;
+};
+
+/*! \brief The interface to a file in the object model. 
+ */
+class IFile : public ICompound
+{
+  public:
+    virtual IGraph *includeDependencyGraph() const = 0;
+    virtual IGraph *includedByDependencyGraph() const = 0;
+    virtual IDocProgramListing *source() const = 0;
+    virtual ICompoundIterator *nestedCompounds() const = 0;
+
+    virtual IIncludeIterator *includes() const = 0;
+    virtual IIncludeIterator *includedBy() const = 0;
+
+    //  ICompound *innerNamespaces()
+    //  ICompoundIterator *innerClasses()
+};
+
+/*! \brief The interface to a group in the object model. 
+ */
+class IGroup : public ICompound
+{
+  public:
+    virtual ICompoundIterator *nestedCompounds() const = 0;
+    // group:
+    //  Title()
+    //  innerFile()
+    //  innerPage()
+};
+
+/*! \brief The interface to a page in the object model. 
+ */
+class IPage : public ICompound
+{
+  public:
+    virtual const IDocTitle *title() const = 0;
+};
+
+/** \brief Interface to a directory in the object model. */
+class IDir : public ICompound
+{
+  public:
+    virtual ICompoundIterator *nestedCompounds() const = 0;
+};
+
+/*! Root node of the object model. */
+class IDoxygen 
+{
+  public:
+    VIRTUAL_DESTRUCTOR(IDoxygen)
+
+    /*! Returns an iterator that can be used to iterate over the list
+     *  of compounds found in the project.
+     */
+    virtual ICompoundIterator *compounds() const = 0;
+
+    /*! Returns a compound given its unique \a id. If you have a
+     *  compound id this function is much more efficient than iterating
+     *  over the compound list. Returns 0 if the id is not valid.
+     */
+    virtual ICompound *compoundById(const char * id) const = 0;
+
+    /*! Returns a compound given its name (including the scope). 
+     *  Returns 0 if the name is not found in the project.
+     */
+    virtual ICompound *compoundByName(const char * name) const = 0;
+
+    /*! Returns an interface to a compound containing a member given it the
+     *  member's id. Given the ICompound interface one can use the same id
+     *  to obtain the IMember interface.
+     *  @param id The member id.
+     */
+    virtual ICompound *memberById(const char * id) const = 0;
+
+    /*! Returns a list of all compounds containing at least one members 
+     *  with a certain name. Each compound can be asked to return the
+     *  list of members with that name.
+     *  @param name The name of the member.
+     */
+    virtual ICompoundIterator *memberByName(const char * name) const = 0;
+
+    /*! Releases the memory for the object hierarchy obtained by 
+     *  createdObjecModelFromXML(). First release all iterators before calling
+     *  this function.
+     */
+    virtual void release() = 0;
+
+    /*! Sets the debug level.
+     *  - 0 all debugging messages are disabled (the default).
+     *  - 1 display important messages only
+     *  - 2 display any messages.
+     */
+    virtual void setDebugLevel(int level) = 0;
+
+    /*! Reads an XML directory produced by doxygen and builds up a data 
+     *  structure representing the contents of the XML files in the directory. 
+     */
+    virtual bool readXMLDir(const char *xmlDirName) = 0;
+};
+
+/*! Factory method that creates an empty object model for a doxygen generated XML file.
+ *  Use the readXMLDir() method to build the model from an XML output 
+ *  directory containing doxygen output.
+ */
+IDoxygen *createObjectModel();
+
+#endif
index 841a46c..2bbf326 100644 (file)
@@ -20,8 +20,8 @@ win32-msvc:TMAKE_LFLAGS    += /LIBPATH:....\\..\lib
 win32-borland:LIBS         += qtools.lib doxycfg.lib shell32.lib
 win32-borland:TMAKE_LFLAGS += -L..\..\..\lib
 win32:TMAKE_CXXFLAGS       += -DQT_NODLL
-DESTDIR                     = ../lib
-OBJECTS_DIR                =  ../objects
+DESTDIR                     = ../../../lib
+OBJECTS_DIR                 = ../../../objects/doxmlparser
 TARGET                      = doxmlparser
 INCLUDEPATH                += ../../../qtools ../include
 
index d946fcf..090c62a 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index d51d8e2..fe45133 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 6c6a1c7..cebdeb0 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 61f9e6b..a113aa9 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 49cfef9..48c77fa 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 5706e6e..270f417 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 4d0a0cf..ea55333 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 66c9a14..a84cc79 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 4b57e50..e6d3db1 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 89ef541..7ecf711 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index df89941..bb43925 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index b43e878..2730307 100644 (file)
@@ -3,7 +3,7 @@
  * $Id$
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index cfb95be..368d499 100644 (file)
@@ -2,19 +2,19 @@ TEMPLATE     =        app.t
 CONFIG       = console warn_on $extraopts
 HEADERS      = 
 SOURCES      = main.cpp
-unix:LIBS                   += -L../../../lib -L../lib -ldoxmlparser -lqtools
+unix:LIBS                   += -L../../../lib -ldoxmlparser -lqtools
 win32:INCLUDEPATH           += .
-win32-mingw:LIBS            += -L../../../lib -L../lib -ldoxmlparser -lqtools
+win32-mingw:LIBS            += -L../../../lib -ldoxmlparser -lqtools
 win32-msvc:LIBS             += doxmlparser.lib qtools.lib shell32.lib 
 win32-msvc:TMAKE_LFLAGS     += /LIBPATH:..\..\..\lib;..\lib
 win32-borland:LIBS          += doxmlparser.lib qtools.lib shell32.lib
-win32-borland:TMAKE_LFLAGS  += -L..\..\..\lib -L..\lib
+win32-borland:TMAKE_LFLAGS  += -L..\..\..\lib
 win32:TMAKE_CXXFLAGS        += -DQT_NODLL
-DESTDIR                     = 
-OBJECTS_DIR                 = ../objects
+DESTDIR                     = ../../../bin
+OBJECTS_DIR                 = ../../../objects/doxmlparser/test
 TARGET                      = xmlparse
 INCLUDEPATH                += ../../../qtools ../include
 DEPENDPATH                 += ../include
-unix:TARGETDEPS             = ../lib/libdoxmlparser.a
-win32:TARGETDEPS            = ..\lib\doxmlparser.lib
+unix:TARGETDEPS             = ../../../lib/libdoxmlparser.a
+win32:TARGETDEPS            = ..\..\..\lib\doxmlparser.lib
 
index a05f414..e73d12a 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 4a49a56..7a8c5ee 100644 (file)
@@ -4,7 +4,7 @@ HEADERS      =
 SOURCES      = doxyapp.cpp
 LIBS          += -L../../lib -ldoxygen -lqtools -lmd5 -ldoxycfg -lpthread -liconv
 DESTDIR        = 
-OBJECTS_DIR    = ../../objects
+OBJECTS_DIR    = ../../objects/doxyapp
 TARGET         = ../../bin/doxyapp
 INCLUDEPATH   += ../../qtools ../../src
 DEPENDPATH    += ../../src
diff --git a/addon/doxypysql/search.py b/addon/doxypysql/search.py
new file mode 100755 (executable)
index 0000000..d0c88c0
--- /dev/null
@@ -0,0 +1,364 @@
+#!/usr/bin/python
+
+# python script to search through doxygen_sqlite3.db
+#
+# 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.
+#
+
+import sqlite3
+import sys
+import os
+import getopt
+import json
+
+class MemberType:
+  Define="0"
+  Function="1"
+  Variable="2"
+  Typedef="3"
+  Enumeration="4"
+  EnumValue="5"
+  Signal="6"
+  Slot="7"
+  Friend="8"
+  DCOP="9"
+  Property="10"
+  Event="11"
+
+class RequestType:
+  References="9901"
+  Struct="9902"
+  Includers="9903"
+  Includees="9904"
+  Members="9905"
+  BaseClasses="9906"
+  SubClasses="9907"
+
+g_conn=None
+###############################################################################
+
+def escapeLike(val):
+    return 'LIKE "%' + val.replace("\\", "\\\\").replace("_", "\\_") \
+        .replace("%", "\\%") + '%" ESCAPE "\\"'
+
+def matchName(name):
+    if type(name) is str:
+        return "name "+escapeLike(name)
+    else:
+        return 'id=%d' %name
+
+def fileName(id_file):
+    if g_conn.execute("SELECT COUNT(*) FROM files WHERE id=?",[id_file]).fetchone()[0] > 1:
+        print "non-uniq fileid"
+
+    for r in g_conn.execute("SELECT * FROM files WHERE id=?",[id_file]).fetchall():
+            return r['name']
+
+    return ""
+
+def fileId(name):
+    if g_conn.execute("SELECT COUNT(*) FROM files WHERE name=?",[name]).fetchone()[0] > 1:
+        print "non-uniq file name"
+
+    for r in g_conn.execute("SELECT * FROM files WHERE name=?",[name]).fetchall():
+            return r['id']
+
+    return -1
+
+###############################################################################
+
+def findReferences(name):
+    o=[]
+
+    cur = g_conn.cursor()
+    cur.execute("SELECT refid FROM memberdef WHERE name=?",[name])
+    refids = cur.fetchall()
+
+    if len(refids) == 0:
+        return o
+
+    refid = refids[0]['refid']
+    cur = g_conn.cursor()
+    for info in cur.execute("SELECT * FROM xrefs WHERE dst LIKE '%"+refid+"%'"):
+        item={}
+        cur = g_conn.cursor()
+        for i2 in cur.execute("SELECT * FROM memberdef WHERE refid=?",[info['src']]):
+            item['name']=i2['name']
+            item['src']=info['src']
+            item['file']=fileName(info['id_file'])
+            item['line']=info['line']
+
+        o.append(item)
+    return o
+
+
+def findFunction(name):
+    o=[]
+    for r in g_conn.execute('SELECT * FROM memberdef WHERE '+matchName(name)+' AND kind=?',[MemberType.Function]).fetchall():
+        item={}
+        item['name'] = r['name']
+        item['definition'] = r['definition']
+        item['argsstring'] = r['argsstring']
+        item['file'] = fileName(r['id_file'])
+        item['line'] = r['line']
+        item['detaileddescription'] = r['detaileddescription']
+        o.append(item)
+    return o
+
+
+def findMacro(name):
+    o=[]
+    for r in g_conn.execute('SELECT * FROM memberdef WHERE '+matchName(name)+' AND kind=?',[MemberType.Define]).fetchall():
+        item={}
+        item['name'] = r['name']
+        if r['argsstring']:
+            item['argsstring'] = r['argsstring']
+        item['definition'] = r['initializer']
+        item['file'] = fileName(r['id_file'])
+        item['line'] = r['line']
+        o.append(item)
+    return o
+
+
+def findTypedef(name):
+    o=[]
+    for r in g_conn.execute('SELECT * FROM memberdef WHERE '+matchName(name)+' AND kind=?',[MemberType.Typedef]).fetchall():
+        item={}
+        item['name'] = r['name']
+        item['definition'] = r['definition']
+        item['file'] = fileName(r['id_file'])
+        item['line'] = r['line']
+        o.append(item)
+    return o
+
+
+def findVariable(name):
+    o=[]
+    for r in g_conn.execute('SELECT * FROM memberdef WHERE '+matchName(name)+' AND kind=?',[MemberType.Variable]).fetchall():
+        item={}
+        item['name'] = r['name']
+        item['definition'] = r['definition']
+        item['file'] = fileName(r['id_file'])
+        item['line'] = r['line']
+        o.append(item)
+    return o
+
+def findParams(name):
+    o=[]
+    for r in g_conn.execute('SELECT id FROM memberdef WHERE '+matchName(name)).fetchall():
+        #a=("SELECT * FROM params where id=(SELECT id_param FROM memberdef_params where id_memberdef=?",[id_memberdef])
+        item={}
+        item['id'] = r['id']
+        o.append(item)
+    return o
+
+
+def findStruct(name):
+    o=[]
+    for r in g_conn.execute('SELECT * FROM compounddef WHERE '+matchName(name)).fetchall():
+        item={}
+        item['name'] = r['name']
+        o.append(item)
+    return o
+
+def findIncluders(name):
+    o=[]
+    fid = fileId(name)
+    for r in g_conn.execute('SELECT * FROM includes WHERE id_dst=?',[fid]).fetchall():
+        item={}
+        item['name'] = fileName(r['id_src'])
+        o.append(item)
+    return o
+
+def findIncludees(name):
+    o=[]
+    fid = fileId(name)
+    for r in g_conn.execute('SELECT * FROM includes WHERE id_src=?',[fid]).fetchall():
+        item={}
+        item['name'] = r['dst']
+        o.append(item)
+    return o
+
+
+def findMembers(name):
+    o=[]
+    for r in g_conn.execute('SELECT * FROM memberdef WHERE scope LIKE "%'+name+'%";').fetchall():
+        item={}
+        item['name'] = r['name']
+        item['definition'] = r['definition']
+        item['argsstring'] = r['argsstring']
+        item['file'] = fileName(r['id_file'])
+        item['line'] = r['line']
+        item['documentation'] = r['documentation']
+        o.append(item)
+    return o
+
+
+def findBaseClasses(name):
+    o=[]
+    for r in g_conn.execute('SELECT base FROM basecompoundref WHERE derived=?',[name]).fetchall():
+        item={}
+        item['name'] = r['base']
+        o.append(item)
+    return o
+
+
+def findSubClasses(name):
+    o=[]
+    for r in g_conn.execute('SELECT derived FROM basecompoundref WHERE base=?',[name]).fetchall():
+        item={}
+        item['name'] = r['derived']
+        o.append(item)
+    return o
+
+
+###############################################################################
+
+def usage():
+  print """Usage: search.py [Options]
+Options:
+    -h, --help
+    -d <D>    Use database <D> for queries
+    -r <F>    Search for references to <F>
+    -f <F>    Search for definition of function <F>
+    -m <M>    Search for definition of macro <M>
+    -t <T>    Search for definition of type <T>
+    -v <V>    Search for definition of variable <V>
+    -I <I>    Get the includers of <I>
+    -i <I>    Get the includees of <I>
+    -M <C>    Get all members of class <C>
+    -B <C>    Get the base classes of class <C>
+    -S <C>    Get the sub classes of class <C>
+"""
+
+def openDb(dbname):
+    global g_conn
+
+    if dbname == None:
+        dbname = "doxygen_sqlite3.db"
+
+    if not os.path.isfile(dbname):
+        raise BaseException("No such file %s" % dbname )
+
+    g_conn = sqlite3.connect(dbname)
+    g_conn.execute('PRAGMA temp_store = MEMORY;')
+    g_conn.row_factory = sqlite3.Row
+
+###############################################################################
+def process(kind,o):
+    request_processors = {
+        MemberType.Function: findFunction,
+        MemberType.Define:   findMacro,
+        MemberType.Variable: findVariable,
+        MemberType.Typedef:  findTypedef,
+        RequestType.References: findReferences,
+        RequestType.Struct: findStruct,
+        RequestType.Includers: findIncluders,
+        RequestType.Includees: findIncludees,
+        RequestType.Members: findMembers,
+        RequestType.BaseClasses: findBaseClasses,
+        RequestType.SubClasses: findSubClasses
+    }
+    return request_processors[kind](o)
+
+
+def processHref(ref):
+    j={}
+
+    # is it in memberdef ?
+    table="memberdef"
+    if ( g_conn.execute("SELECT count(*) from %s WHERE refid='%s'" % (table,ref) ).fetchone()[0] > 0 ):
+        for r in g_conn.execute("SELECT kind,id FROM %s WHERE refid='%s'" % (table,ref) ).fetchall():
+            j=process(str(r['kind']),int(r['id']))
+
+    # is it in compounddef ?
+    table="compounddef"
+    if ( g_conn.execute("SELECT count(*) from %s WHERE refid='%s'" % (table,ref)).fetchone()[0] > 0 ):
+        for r in g_conn.execute("SELECT id FROM %s WHERE refid='%s'" % (table,ref) ).fetchall():
+            j=process(RequestType.Struct,int(r['id']))
+
+    return j
+
+
+def serveCgi():
+    import cgi
+
+    print 'Content-Type: application/json\n'
+
+    fieldStorage = cgi.FieldStorage()
+    form = dict((key, fieldStorage.getvalue(key)) for key in fieldStorage.keys())
+
+    if 'href' in form:
+        ref = form['href']
+    else:
+        print '{"result": null, "error": "no refid given"}'
+        sys.exit(0)
+
+    openDb('doxygen_sqlite3.db')
+
+    j = processHref(ref)
+
+    print json.dumps({"result":j,"error":None})
+
+
+def serveCli(argv):
+    try:
+        opts, args = getopt.getopt(argv, "hr:I:i:d:f:m:t:v:H:M:B:S:",["help"])
+    except getopt.GetoptError:
+        usage()
+        sys.exit(1)
+
+    ref=None
+    dbname=None
+    j={}
+
+    for a, o in opts:
+        if a in ('-h', '--help'):
+            usage()
+            sys.exit(0)
+        elif a in ('-d'):
+            dbname=o
+            continue
+        elif a in ('-r'):
+            kind=RequestType.References
+        elif a in ('-I'):
+            kind=RequestType.Includers
+        elif a in ('-i'):
+            kind=RequestType.Includees
+        elif a in ('-M'):
+            kind=RequestType.Members
+        elif a in ('-B'):
+            kind=RequestType.BaseClasses
+        elif a in ('-S'):
+            kind=RequestType.SubClasses
+        elif a in ('-f'):
+            kind=MemberType.Function
+        elif a in ('-m'):
+            kind=MemberType.Define
+        elif a in ('-t'):
+            kind=MemberType.Typedef
+        elif a in ('-v'):
+            kind=MemberType.Variable
+        elif a in ('-H'):
+            ref = o
+
+        openDb(dbname)
+        if ref != None:
+          j=processHref(ref)
+        else:
+          j=process(kind,o)
+        print json.dumps(j)
+
+
+def main(argv):
+    if 'REQUEST_METHOD' in os.environ:
+        serveCgi()
+    else:
+        serveCli(argv)
+
+if __name__ == '__main__':
+    main(sys.argv[1:])
index f3ed662..7daafee 100644 (file)
@@ -7,8 +7,6 @@ distclean: clean
        $(RM) -rf Makefile doxysearch.pro Makefile.doxysearch
        $(RM) -rf Makefile doxyindexer.pro Makefile.doxyindexer
 
-realclean: distclean
-
 tmake:
        $(ENV) $(PERL) "$(TMAKE)" doxysearch.pro >Makefile.doxysearch
        $(ENV) $(PERL) "$(TMAKE)" doxyindexer.pro >Makefile.doxyindexer
index 9c27f56..b44a940 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index deeb8f8..c84a2ac 100644 (file)
@@ -4,7 +4,7 @@ HEADERS      =
 SOURCES      = doxyindexer.cpp
 LIBS        += -L../../lib -lxapian -lqtools
 DESTDIR      = 
-OBJECTS_DIR  = ../../objects
+OBJECTS_DIR  = ../../objects/doxyindexer
 TARGET       = ../../bin/doxyindexer
 INCLUDEPATH += ../../qtools
 DEPENDPATH  += 
index 8aeed81..11af8e3 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index c860fd1..702f5a4 100644 (file)
@@ -4,7 +4,7 @@ HEADERS      =
 SOURCES      = doxysearch.cpp
 LIBS        += -lxapian
 DESTDIR      = 
-OBJECTS_DIR  = ../../objects
+OBJECTS_DIR  = ../../objects/doxysearch
 TARGET       = ../../bin/doxysearch.cgi
 INCLUDEPATH += 
 DEPENDPATH  += 
index 152c2b7..9b14174 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
 # 
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
@@ -29,11 +29,6 @@ distclean: Makefile.doxywizard
        $(MAKE) -f Makefile.doxywizard distclean 
        $(RM) Makefile.doxywizard
 
-realclean: Makefile.doxywizard
-       $(RM) configdoc.cpp
-       $(RM) config_doxyw.cpp
-       $(MAKE) distclean
-       
 install:
        $(INSTTOOL) -d $(INSTALL)/bin   
        $(INSTTOOL) -m 755 ../../bin/doxywizard $(INSTALL)/bin  
index 48d233e..f11bc46 100644 (file)
@@ -2,7 +2,7 @@
  *
  * $Id: config_templ.l,v 1.8 2001/01/01 10:15:16 root Exp $
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 3a26eb6..400330f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * $Id: config_templ.l,v 1.8 2001/01/01 10:15:16 root Exp $
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index ce764e0..99310a1 100644 (file)
@@ -624,20 +624,34 @@ bool MainWindow::discardUnsavedChanges(bool saveOption)
 }
 
 //-----------------------------------------------------------------------
-
 int main(int argc,char **argv)
 {
   QApplication a(argc,argv);
-  MainWindow &main = MainWindow::instance();
-  if (argc==2 && argv[1][0]!='-') // name of config file as an argument
+  if (argc == 2)
   {
-    main.loadConfigFromFile(QString::fromLocal8Bit(argv[1]));
+    if (!qstrcmp(argv[1],"--help"))
+    {
+      QMessageBox msgBox;
+      msgBox.setText(QString().sprintf("Usage: %s [config file]",argv[0]));
+      msgBox.exec();
+      exit(0);
+    }
   }
-  else if (argc>1)
+  if (argc > 2)
   {
-    printf("Usage: %s [config file]\n",argv[0]);
+    QMessageBox msgBox;
+    msgBox.setText(QString().sprintf("Too many arguments specified\n\nUsage: %s [config file]",argv[0]));
+    msgBox.exec();
     exit(1);
   }
-  main.show();
-  return a.exec();
+  else
+  {
+    MainWindow &main = MainWindow::instance();
+    if (argc==2 && argv[1][0]!='-') // name of config file as an argument
+    {
+      main.loadConfigFromFile(QString::fromLocal8Bit(argv[1]));
+    }
+    main.show();
+    return a.exec();
+  }
 }
index 01832df..0c8d049 100644 (file)
@@ -6,12 +6,12 @@ TEMPLATE     = app
 DESTDIR      = ../../bin
 TARGET       = 
 DEPENDPATH  += .
-INCLUDEPATH += .
+INCLUDEPATH += . ../../generated_src/doxywizard
 QT          += xml
 CONFIG      += $extraopts
-OBJECTS_DIR  = obj
-MOC_DIR      = moc
-RCC_DIR      = rcc
+OBJECTS_DIR  = ../../objects/doxywizard
+MOC_DIR      = ../../moc/doxywizard
+RCC_DIR      = ../../rcc/doxywizard
 DEFINES     += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII
 
 macx-g++ {
@@ -27,13 +27,13 @@ RESOURCES   += doxywizard.qrc
 INCBUFSIZE=$(PYTHON)  ../../src/increasebuffer.py
 win32:RC_FILE += doxywizard.rc
 
-config.target = config_doxyw.cpp
-config.commands = $(LEX) -P$*YY -t $*.l | $(INCBUFSIZE) >$*.cpp
-config.depends = config_doxyw.l  ../../src/increasebuffer.py
-configdoc.target = configdoc.cpp
-configdoc.commands = $(PYTHON) ../../src/configgen.py -wiz ../../src/config.xml > configdoc.cpp
+config.target = ../../generated_src/doxywizard/config_doxyw.cpp
+config.commands = $(LEX) -Pconfig_doxywYY -t ../../addon/doxywizard/config_doxyw.l | $(INCBUFSIZE) >../../generated_src/doxywizard/$*.cpp
+config.depends = ../../addon/doxywizard/config_doxyw.l  ../../src/increasebuffer.py
+configdoc.target = ../../generated_src/doxywizard/configdoc.cpp
+configdoc.commands = $(PYTHON) ../../src/configgen.py -wiz ../../src/config.xml > ../../generated_src/doxywizard/configdoc.cpp
 configdoc.depends = ../../src/config.xml ../../src/configgen.py
-version.target = ../../src/version.cpp
+version.target = ../../generated_src/doxywizard/version.cpp
 version.commands = cd ../../src;$(PYTHON) version.py
 version.depends = ../../configure
 QMAKE_EXTRA_TARGETS += configdoc config version
index 4c988c9..fe6609e 100644 (file)
@@ -9,7 +9,7 @@
 #include "config.h"
 #include "version.h"
 #include "configdoc.h"
-#include "../../src/settings.h"
+#include "settings.h"
 
 #define SA(x) QString::fromAscii(x)
 
@@ -323,6 +323,32 @@ static QString getDocsForNode(const QDomElement &child)
         }
       }
     }
+    else if (child.attribute(SA("format")) == SA("image"))
+    {
+      QString abspath = child.attribute(SA("abspath"));
+      if (defval != SA(""))
+      {
+        docs+=SA("<br/>");
+        if (abspath != SA("1"))
+        {
+          docs += SA(" The default image is: <code>") + defval + SA("</code>.");
+        }
+        else
+        {
+          docs += SA(" The default image (with absolute path) is: <code>") + defval + SA("</code>.");
+        }
+        docs += SA("<br/>");
+      }
+      else
+      {
+        if (abspath == SA("1"))
+        {
+          docs+=SA("<br/>");
+          docs += SA(" The image has to be specified with full path.");
+          docs += SA("<br/>");
+        }
+      }
+    }
     else // if (child.attribute(SA("format")) == SA("string"))
     {
       if (defval != SA(""))
@@ -477,6 +503,10 @@ QWidget *Expert::createTopicWidget(QDomElement &elem)
         {
           mode = InputString::StringFile;
         }
+        else if (format==SA("image"))
+        {
+          mode = InputString::StringImage;
+        }
         else // format=="string"
         {
           mode = InputString::StringFree;
index 9e28852..be99b0a 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 69a6893..03bb76e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 876a920..e0c426c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index c4723be..6662865 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 36fe319..ad258f7 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -44,6 +44,7 @@ InputString::InputString( QGridLayout *layout,int &row,
     layout->addWidget( m_com, row, 1, 1, 3, Qt::AlignLeft );
     m_le=0;
     m_br=0;
+    m_im=0;
     row++;
   }
   else
@@ -51,28 +52,39 @@ InputString::InputString( QGridLayout *layout,int &row,
     layout->addWidget( m_lab, row, 0 );
     m_le = new QLineEdit;
     m_le->setText( s );
+    m_im = 0;
     //layout->setColumnMinimumWidth(2,150);
-    if (m==StringFile || m==StringDir)
+    if (m==StringFile || m==StringDir || m==StringImage)
     {
       layout->addWidget( m_le, row, 1 );
       m_br = new QToolBar;
       m_br->setIconSize(QSize(24,24));
-      if (m==StringFile) 
+      if (m==StringFile || m==StringImage
       {
         QAction *file = m_br->addAction(QIcon(QString::fromAscii(":/images/file.png")),QString(),this,SLOT(browse()));
         file->setToolTip(tr("Browse to a file"));
+        layout->addWidget( m_br,row,2 );
+        if (m==StringImage) 
+        {
+          m_im = new QLabel;
+          m_im->setMinimumSize(1,55);
+          m_im->setAlignment(Qt::AlignLeft|Qt::AlignTop);
+          row++;
+          layout->addWidget( m_im,row,1 );
+        }
       }
       else 
       {
         QAction *dir = m_br->addAction(QIcon(QString::fromAscii(":/images/folder.png")),QString(),this,SLOT(browse()));
         dir->setToolTip(tr("Browse to a folder"));
+        layout->addWidget( m_br,row,2 );
       }
-      layout->addWidget( m_br,row,2 );
     }
     else
     {
       layout->addWidget( m_le, row, 1, 1, 2 );
       m_br=0;
+      m_im=0;
     }
     m_com=0;
     row++;
@@ -119,6 +131,33 @@ void InputString::updateDefault()
     {
       m_lab->setText(QString::fromAscii("<qt><font color='red'>")+m_id+QString::fromAscii("</font></qt>"));
     }
+    if (m_im)
+    {
+      if (m_str.isEmpty())
+      {
+        m_im->setText(tr("No Project logo selected."));
+      }
+      else
+      {
+        QFile Fout(m_str);
+        if(!Fout.exists()) 
+        {
+          m_im->setText(tr("Sorry, cannot find file(")+m_str+QString::fromAscii(");"));
+        }
+        else
+        {
+          QPixmap pm(m_str);
+          if (!pm.isNull())
+          {
+            m_im->setPixmap(pm.scaledToHeight(55,Qt::SmoothTransformation));
+          }
+          else
+          {
+            m_im->setText(tr("Sorry, no preview available (")+m_str+QString::fromAscii(");"));
+          }
+        }
+      }
+    }
     if (m_le && m_le->text()!=m_str) m_le->setText( m_str );
     emit changed();
   }
@@ -128,6 +167,7 @@ void InputString::setEnabled(bool state)
 {
   m_lab->setEnabled(state);
   if (m_le)  m_le->setEnabled(state);
+  if (m_im)  m_le->setEnabled(state);
   if (m_br)  m_br->setEnabled(state);
   if (m_com) m_com->setEnabled(state);
   updateDefault();
@@ -136,7 +176,7 @@ void InputString::setEnabled(bool state)
 void InputString::browse()
 {
   QString path = QFileInfo(MainWindow::instance().configFileName()).path();
-  if (m_sm==StringFile)
+  if (m_sm==StringFile || m_sm==StringImage)
   {
     QString fileName = QFileDialog::getOpenFileName(&MainWindow::instance(),
         tr("Select file"),path);
index c904dad..90ea87d 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -35,7 +35,8 @@ class InputString : public QObject, public Input
     enum StringMode { StringFree=0, 
                       StringFile=1, 
                       StringDir=2, 
-                      StringFixed=3
+                      StringFixed=3,
+                      StringImage=4
                     };
 
     InputString( QGridLayout *layout,int &row,
@@ -77,6 +78,7 @@ class InputString : public QObject, public Input
     void updateDefault();
     QLabel       *m_lab;
     QLineEdit    *m_le;
+    QLabel       *m_im;
     QToolBar     *m_br;
     QComboBox    *m_com;
     QString       m_str;
index 23c20ff..0a0f01f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 352ed5e..0d7efe7 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 9d523c1..b31fe4f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index ce989e7..56933e0 100644 (file)
@@ -468,6 +468,7 @@ Step1::Step1(Wizard *wizard,const QHash<QString,Input*> &modelData) : m_wizard(w
   projVersion->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
   // project icon
   QLabel *projLogo = new QLabel(this);
+  projLogo->setMinimumSize(1,55);
   projLogo->setText(tr("Project logo:"));
   projLogo->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
 
@@ -481,10 +482,7 @@ Step1::Step1(Wizard *wizard,const QHash<QString,Input*> &modelData) : m_wizard(w
   m_projNumber = new QLineEdit;
   QPushButton *projIconSel = new QPushButton(this);
   projIconSel->setText(tr("Select..."));
-  QPixmap pm(QSize(120,55));
-  pm.fill();
   m_projIconLab = new QLabel;
-  m_projIconLab->setPixmap(pm);
 
   grid->addWidget(m_projName,0,1,1,2);
   grid->addWidget(m_projBrief,1,1,1,2);
@@ -567,12 +565,31 @@ void Step1::selectProjectIcon()
   QString path = QFileInfo(MainWindow::instance().configFileName()).path();
   QString iconName = QFileDialog::getOpenFileName(this,
                                     tr("Select project icon/image"),path);
-  QPixmap pm(iconName);
-  if (!pm.isNull())
+  if (iconName.isEmpty())
   {
-    m_projIconLab->setPixmap(pm.scaledToHeight(55,Qt::SmoothTransformation));
-    updateStringOption(m_modelData,STR_PROJECT_LOGO,iconName);
+    m_projIconLab->setText(tr("No Project logo selected."));
   }
+  else
+  {
+    QFile Fout(iconName);
+    if(!Fout.exists()) 
+    {
+      m_projIconLab->setText(tr("Sorry, cannot find file(")+iconName+QString::fromAscii(");"));
+    }
+    else
+    {
+      QPixmap pm(iconName);
+      if (!pm.isNull())
+      {
+        m_projIconLab->setPixmap(pm.scaledToHeight(55,Qt::SmoothTransformation));
+      }
+      else
+      {
+        m_projIconLab->setText(tr("Sorry, no preview available (")+iconName+QString::fromAscii(");"));
+      }
+    }
+  }
+  updateStringOption(m_modelData,STR_PROJECT_LOGO,iconName);
 }
 
 void Step1::selectSourceDir()
@@ -663,17 +680,27 @@ void Step1::init()
   QString iconName = getStringOption(m_modelData,STR_PROJECT_LOGO);
   if (!iconName.isEmpty())
   {
-    QPixmap pm(iconName);
-    if (!pm.isNull())
+    QFile Fout(iconName);
+    if(!Fout.exists()) 
+    {
+      m_projIconLab->setText(tr("Sorry, cannot find file(")+iconName+QString::fromAscii(");"));
+    }
+    else
     {
-      m_projIconLab->setPixmap(pm.scaledToHeight(55,Qt::SmoothTransformation));
+      QPixmap pm(iconName);
+      if (!pm.isNull())
+      {
+        m_projIconLab->setPixmap(pm.scaledToHeight(55,Qt::SmoothTransformation));
+      }
+      else
+      {
+        m_projIconLab->setText(tr("Sorry, no preview available (")+iconName+QString::fromAscii(");"));
+      }
     }
   }
   else
   {
-    QPixmap pm(QSize(120,55));
-    pm.fill();
-    m_projIconLab->setPixmap(pm);
+    m_projIconLab->setText(tr("No Project logo selected."));
   }
   option = m_modelData[STR_INPUT];
   if (option->value().toStringList().count()>0)
index 877de1d..a18df62 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 9c3d28b..f046fcb 100755 (executable)
--- a/configure
+++ b/configure
@@ -2,7 +2,7 @@
 #
 # $Id$
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van 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=6
+doxygen_version_revision=7
 
 #NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
 doxygen_version_mmn=NO
@@ -55,9 +55,15 @@ f_langs=`ls -1 src/translator_??.h | sed -e 's%src/translator_%%g' | sed -e 's/\
 
 while test -n "$1";  do
   case $1 in
+    --prefix=*)
+       f_prefix=`echo $1 | sed 's/^--prefix=//'`
+       ;;
     --prefix | -prefix)
        shift; f_prefix=$1
        ;;
+    --docdir=*)
+       f_docdir=`echo $1 | sed 's/^--docdir=//'`
+       ;;
     --docdir | -docdir)
        shift; f_docdir=$1
        ;;
@@ -76,30 +82,57 @@ while test -n "$1";  do
     --english-only | -english-only)
        f_english=YES
        ;;
+    --enable-langs=*)
+       f_langs=`echo $1 | sed 's/^--enable-langs=//'`
+       ;;
     --enable-langs | -enable-langs)
        shift; f_langs=$1
        ;;
+    --platform=*)
+       f_platform=`echo $1 | sed 's/^--platform=//'`
+       ;;
     --platform | -platform)
        shift; f_platform=$1
        ;;
+    --make=*)
+       f_make=`echo $1 | sed 's/^--make=//'`
+       ;;
     --make | -make)
        shift; f_make=$1
        ;;
+    --dot=*)
+       f_dot=`echo $1 | sed 's/^--dot=//'`
+       ;;
     --dot | -dot)
        shift; f_dot=$1
        ;;
+    --python=*)
+       f_python=`echo $1 | sed 's/^--python=//'`
+       ;;
     --python | -python)
        shift; f_python=$1
        ;;
+    --perl=*)
+       f_perl=`echo $1 | sed 's/^--perl=//'`
+       ;;
     --perl | -perl)
        shift; f_perl=$1
        ;;
+    --flex=*)
+       f_flex=`echo $1 | sed 's/^--flex=//'`
+       ;;
     --flex | -flex)
        shift; f_flex=$1
        ;;
+    --bison=*)
+       f_bison=`echo $1 | sed 's/^--bison=//'`
+       ;;
     --bison | -bison)
        shift; f_bison=$1
        ;;
+    --install=*)
+       f_insttool=`echo $1 | sed 's/^--install=//'`
+       ;;
     --install | -install)
        shift; f_insttool=$1
        ;;
@@ -122,6 +155,9 @@ while test -n "$1";  do
        f_sqlite3=YES
        f_sqlite3static=YES
        ;;
+    --sqlite3-path=*)
+       f_sqlite3_path=`echo $1 | sed 's/^--sqlite3-path=//'`
+       ;;
     --sqlite3-path | -sqlite3-path)
        shift; f_sqlite3_path=$1
        ;;
@@ -471,7 +507,7 @@ if test "$f_sqlite3" = YES; then
   printf "  Checking for sqlite3 ... "
   if test "$f_sqlite3_path" = NO; then
     sqlite3_hdr_dir="/usr/include /usr/local/include /opt/local/include"
-    sqlite3_lib_dir="/usr/lib /usr/local/lib /opt/local/lib /usr/lib/x86_64-linux-gnu"
+    sqlite3_lib_dir="/usr/lib /usr/local/lib /opt/local/lib /usr/lib/x86_64-linux-gnu /usr/lib64"
   else
     sqlite3_hdr_dir="$f_sqlite3_path/include"
     sqlite3_lib_dir="$f_sqlite3_path/lib"
@@ -519,7 +555,7 @@ fi
 if test "$f_libclang" = YES; then
   printf "  Checking for libclang ... "
   libclang_hdr_dir="/usr/include /usr/local/include /opt/local/include"
-  libclang_lib_dir="/usr/lib /usr/local/lib /opt/local/lib"
+  libclang_lib_dir="/usr/lib /usr/local/lib /opt/local/lib /usr/lib64/llvm /usr/lib/llvm"
   if test "$f_libclangstatic" = NO; then
     libclang_lib_name="libclang.so libclang.dylib libclang.a libclang.dll.a"
   else
@@ -560,7 +596,7 @@ fi
 
 printf "  Checking for python... "
 if test "$f_python" = NO; then
-  python_names="python"
+  python_names="python2 python"
   python_dirs="$bin_dirs /usr/bin /usr/local/bin /bin /sbin"
   python_prog=NO
   python_found=NO
@@ -672,15 +708,32 @@ fi
 
 # -----------------------------------------------------------------------------
 
+if ! test -d "generated_src/doxygen"; then
+  mkdir -p generated_src/doxygen
+fi
+if test "$f_wizard" = YES; then
+  if ! test -d "generated_src/doxywizard"; then
+    mkdir -p generated_src/doxywizard
+  fi
+fi
+
 #
 # Make VERSION file
 #
-echo "  Creating VERSION file."
-# Output should be something like 1.4.5-20051010
-if test "x$doxygen_version_mmn" = "xNO"; then
-  echo "$doxygen_version_major.$doxygen_version_minor.$doxygen_version_revision" > VERSION
-else
-  echo "$doxygen_version_major.$doxygen_version_minor.$doxygen_version_revision-$doxygen_version_mmn" > VERSION
+test -f "VERSION" && chmod u+w VERSION
+test -f "generated_src/doxygen/version.cpp" && chmod u+w generated_src/doxygen/version.cpp
+echo "  Generating generated_src/doxygen/version.cpp and VERSION..."
+cd src
+$f_python version.py ../generated_src/doxygen
+cd ..
+if test "$f_wizard" = YES; then
+  test -f "VERSION" && chmod u+w VERSION
+  test -f "generated_src/doxywizard/version.cpp" && chmod u+w generated_src/doxywizard/version.cpp
+  echo "  Generating generated_src/doxywizard/version.cpp and VERSION..."
+  cd src
+  $f_python version.py ../generated_src/doxywizard
+  cd ..
+
 fi
 
 test -f .makeconfig && rm .makeconfig
@@ -828,7 +881,7 @@ EOF
 #       if test $f_search = YES; then
 #         EXTRADEPS="$EXTRADEPS doxysearch"
 #       fi
-       echo "all: src/version.cpp $EXTRADEPS" >> $DST
+       echo "all: generated_src/doxygen/version.cpp $EXTRADEPS" >> $DST
        echo "  \$(MAKE) -C qtools" >> $DST
        echo "  \$(MAKE) -C libmd5" >> $DST
        echo "  \$(MAKE) -C src" >> $DST
@@ -892,28 +945,33 @@ EOF
      echo "  Created $DST from $SRC..."
 done
 
-# - generating src/lang_cfg.h 
+# - generating generated_src/doxygen/doxygen/lang_cfg.h 
 # use consistent method on Linux and Windows
 
-if test -f "src/lang_cfg.h"; then
-    chmod u+w src/lang_cfg.h   # make sure file can be overwritten
+if test -f "generated_src/doxygen/lang_cfg.h"; then
+    chmod u+w generated_src/doxygen/lang_cfg.h   # make sure file can be overwritten
 fi
-echo "  Generating src/lang_cfg.h..."
+echo "  Generating generated_src/doxygen/lang_cfg.h..."
 if test "$f_english" = YES; then
-   $f_python src/lang_cfg.py ENONLY > src/lang_cfg.h
+   $f_python src/lang_cfg.py ENONLY > generated_src/doxygen/lang_cfg.h
 else
    f_ulangs=`echo $f_langs | tr '[a-z,]' '[A-Z ]'`
-   $f_python src/lang_cfg.py $f_ulangs > src/lang_cfg.h
+   $f_python src/lang_cfg.py $f_ulangs > generated_src/doxygen/lang_cfg.h
 fi
 
-if test -f "src/config.h"; then
-    chmod u+w src/config.h
+if test -f "generated_src/doxygen/settings.h"; then
+    chmod u+w generated_src/doxygen/settings.h
 fi
-if test -f "src/settings.h"; then
-    chmod u+w src/settings.h
+echo "  Generating generated_src/doxygen/settings.h..."
+$f_python src/settings.py $f_sqlite3 $f_libclang generated_src/doxygen
+
+if test "$f_wizard" = YES; then
+  if test -f "generated_src/doxywizard/settings.h"; then
+      chmod u+w generated_src/doxywizard/settings.h
+  fi
+  echo "  Generating generated_src/doxywizard/settings.h..."
+  $f_python src/settings.py $f_sqlite3 $f_libclang generated_src/doxywizard
 fi
-echo "  Generating src/settings.h..."
-cd src
-$f_python settings.py $f_sqlite3 $f_libclang
+
 cd ..
 echo "  Finished"
index 0b15cd4..dbc21c6 100755 (executable)
@@ -2,7 +2,7 @@
 #
 # $Id: configure,v 1.1 1999/07/19 17:00:15 root Exp $
 #
-# Copyright (C) 1997-2011 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
 # 
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
index 7269989..c57bbe9 100644 (file)
@@ -51,3 +51,5 @@ PDF_HYPERLINKS    = YES
 USE_PDFLATEX      = YES
 STRIP_CODE_COMMENTS = NO
 HTML_STYLESHEET   = doxygen_manual.css
+ALIASES           = LaTeX="\f$\mbox{\LaTeX}\f$"
+ALIASES          += TeX="\f$\mbox{\TeX}\f$"
index 5036116..1f472e6 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
index f62f97a..803b75d 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
index 418c5b6..1d22dbf 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
index b889e7c..99ac2f1 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
index 62661bc..fc80659 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -190,13 +190,13 @@ could extract information from the XML output. Possible tools could be:
 Since doxygen uses a lot of \c flex code it is important to understand
 how \c flex works (for this one should read the man page) 
 and to understand what it is doing when \c flex is parsing some input. 
-Fortunately, when flex is used with the -d option it outputs what rules
+Fortunately, when flex is used with the `-d` option it outputs what rules
 matched. This makes it quite easy to follow what is going on for a 
 particular input fragment. 
 
 To make it easier to toggle debug information for a given flex file I
-wrote the following perl script, which automatically adds or removes -d
-from the correct line in the Makefile:
+wrote the following perl script, which automatically adds or removes `-d`
+from the correct line in the \c Makefile:
 
 \verbatim
 #!/usr/bin/perl 
@@ -236,6 +236,19 @@ $now = time;
 utime $now, $now, $file
 
 \endverbatim
+Another way to get rules matching / debugging information from the flex code is in the following way:
+\verbatim
+touch src/<flex code file>.l
+make LEX="flex -d"
+\endverbatim
+to remove the rules / debug information again:
+\verbatim
+touch src/<flex codefile>.l
+make
+\endverbatim
+
+Note that by running doxygen with `-d lex` you get information about which flex
+codefile is used.
 
 \htmlonly
 Return to the <a href="index.html">index</a>.
index 3c50435..b872f7d 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van 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 @@
   Although doxygen also has a command to start such a section (See section
   \ref cmdsa "\\sa"), it does allow you to put these kind of links anywhere in the
   documentation. 
-  For \f$\mbox{\LaTeX}\f$ documentation a reference to the page number
+  For \LaTeX documentation a reference to the page number
   is written instead of a link. Furthermore, the index at the end of the 
   document can be used to quickly find the documentation of a member, class, 
   namespace or file.
index 9eaf192..e7a8f97 100644 (file)
 \tableofcontents
 \section log_1_8 1.8 Series
 
+\subsection log_1_8_7 Release 1.8.7
+\htmlonly
+<b>(release date 21-04-2014)</b>
+<a name="1.8.7"></a>
+<ul>
+<li>Bug 436885 - c-source and h-source missing for latex [<a href="http://github.com/doxygen/doxygen/commit/d5d34325fb9bed776cf2b4facc0c341f701e780b">view</a>]</li>
+<li>Bug 625601 - FORTRAN: recognition free versus fixed formatted code [<a href="http://github.com/doxygen/doxygen/commit/2dec1060623165057628ee678eb3580351922408">view</a>]</li>
+<li>Bug 626172 - Latex $projectname with &quot;&amp;&quot; gets no escaped [<a href="http://github.com/doxygen/doxygen/commit/586b3b69238fb09d55a03c5d50fc1b7d3e65ed97">view</a>]</li>
+<li>Bug 643618 - Fortran: variable with name &quot;type&quot; confuses Doxygen [<a href="http://github.com/doxygen/doxygen/commit/17c5b6160d013d118296663e133cf8884c74a939">view</a>]</li>
+<li>Bug 674851 - Percent to prevent auto-linking in page title is not removed for navpath [<a href="http://github.com/doxygen/doxygen/commit/5d44acc0a49bd7b990bfe649efa312f5f0bb594b">view</a>]</li>
+<li>Bug 678436 - Nested \if messes up list items [<a href="http://github.com/doxygen/doxygen/commit/7f4414b92a1c2147b073dd3cf58e0db7c8a88be6">view</a>]</li>
+<li>Bug 678436 - Nested \if messes up list items [<a href="http://github.com/doxygen/doxygen/commit/de502ca71fc1c20ed93209f6a223c488eee38297">view</a>]</li>
+<li>Bug 683115 - Command ignored when using umlauts in markdown and also C-comments in markdown didn&#39;t work properly [<a href="http://github.com/doxygen/doxygen/commit/b4b40f4c7ea57655d1264e8f72c754526e3a9209">view</a>]</li>
+<li>Bug 692985 - Notes in xml output are not correctly separated [<a href="http://github.com/doxygen/doxygen/commit/bc61f00f142792dfbe97c361d9fecd3ea2850f5e">view</a>]</li>
+<li>Bug 705220 - Enables using unicode (non ASCII) to name output files [<a href="http://github.com/doxygen/doxygen/commit/d5fb69739a1b2facf32a63ca94c12d097f8278cc">view</a>]</li>
+<li>Bug 705499 - Nested namespace causes incorrect display when referenced via .tag file [<a href="http://github.com/doxygen/doxygen/commit/1bdbbc60982f2f61f4e0423c9fc8c4a24cfb2e94">view</a>]</li>
+<li>Bug 712251 - Documentation for enumeration not generated [<a href="http://github.com/doxygen/doxygen/commit/1bb36723a522b371810606c2f6504d0374a7b027">view</a>]</li>
+<li>Bug 720691 - Code coloring in case of file without extension [<a href="http://github.com/doxygen/doxygen/commit/45934e88fa961686c00be1ad272a088f4e7eac0b">view</a>]</li>
+<li>Bug 721032 - Trouble with /cond /endcond [<a href="http://github.com/doxygen/doxygen/commit/2912829ca5bced897a2c063d1883b9cfd39d3bd9">view</a>]</li>
+<li>Bug 721169 - Wrong call graph in simple situation [<a href="http://github.com/doxygen/doxygen/commit/e12d6b506862c8ad843b7853bc1c9ceb5d0ccb4d">view</a>]</li>
+<li>Bug 721302 - [Latex/PDF] Merging brief and detailed description in file section [<a href="http://github.com/doxygen/doxygen/commit/a99c33838057acba20768ca32681e1f379f36ca0">view</a>]</li>
+<li>Bug 721462 - Parsing problem with C++11 empty initializer lists [<a href="http://github.com/doxygen/doxygen/commit/1bfacc3b8e589907352eff923b7b3aa73cfc5138">view</a>]</li>
+<li>Bug 721618 - Move contructors and move assignment operators of embedded classes of template classes cannot be matched. [<a href="http://github.com/doxygen/doxygen/commit/1d0c9b6fefb6c2e0a9a2b7a7ea3192ccace33710">view</a>]</li>
+<li>Bug 721878 - Dia diagrams not displayed by Firefox [<a href="http://github.com/doxygen/doxygen/commit/5ea2f2a123e473d5964435369fd925d7f103b456">view</a>]</li>
+<li>Bug 722457 - regression referencing namespaced type [<a href="http://github.com/doxygen/doxygen/commit/9b76c1a9bb7039962933aeef398bb7aa2f59c3a5">view</a>]</li>
+<li>Bug 722603 - doxygen nested \if \endif sample not working [<a href="http://github.com/doxygen/doxygen/commit/cc78b12b0019fbcb17692b231d38ba75d0952201">view</a>]</li>
+<li>Bug 722619 - doxygen 1.8.6 sorts the contents of a namespace by group within the Class List [<a href="http://github.com/doxygen/doxygen/commit/f9b80aff6d20524dd0838aff12033fe3df66ba98">view</a>]</li>
+<li>Bug 722711 - Link refs with no title swallow an extra newline [<a href="http://github.com/doxygen/doxygen/commit/60ea06a68f2e355e34b61bf45babc6405bfbfe84">view</a>]</li>
+<li>Bug 722759 - Documentation for derived classes no longer has an &quot;Additional Inherited Members&quot; section after upgrading Doxygen from 1.8.3.1 to 1.8.6 [<a href="http://github.com/doxygen/doxygen/commit/0e9da9fb27147c5685088019afd428a0aaa901fa">view</a>]</li>
+<li>Bug 722786 - configure --prefix=/opt/foo not accepted [<a href="http://github.com/doxygen/doxygen/commit/bc7e6301e2d1474592f6cd6cc07624852d1b5016">view</a>]</li>
+<li>Bug 722788 - Command \| not working when last character in markdown table line [<a href="http://github.com/doxygen/doxygen/commit/8309fbd9e639eaf9e763e83ca7a228c659450a57">view</a>]</li>
+<li>Bug 723299 - Last line of code block lost if it is only one character and there is no text afterward [<a href="http://github.com/doxygen/doxygen/commit/4d1951ebb648bbc92464904305cafc7fc0dba557">view</a>]</li>
+<li>Bug 723314 - Doxygen crashes on incorrect end group /**&lt; @} */ [<a href="http://github.com/doxygen/doxygen/commit/b4d5ef176eced8315523baea464cfda733ecb9aa">view</a>]</li>
+<li>Bug 723516 - star is not printed in \code environment [<a href="http://github.com/doxygen/doxygen/commit/0eaf1cd5d2eac57666b5ffea9e0f948b7a3e6b3a">view</a>]</li>
+<li>Bug 724241 - Internal inconsistency: namespace in IDL [<a href="http://github.com/doxygen/doxygen/commit/b0456fbefa864b33611f289818deeaaf791c17c9">view</a>]</li>
+<li>Bug 724949 - Server side (PHP) search broke in 1.8.3 [<a href="http://github.com/doxygen/doxygen/commit/1d2bb19e394850ecb37bea06ef4e5d15fe06e7b0">view</a>]</li>
+<li>Bug 726219 - python3 import style causes doxygen to ignore some inheritances [<a href="http://github.com/doxygen/doxygen/commit/513ce9aafd05add9b5c1e67e843e540f8937cf63">view</a>]</li>
+<li>Bug 726294 - Markdown Extra - fenced code block: &#39;&gt;&#39; before tab width parsed as block quote [<a href="http://github.com/doxygen/doxygen/commit/3598e8fdf7ee61a281480fec09f63669710ac35d">view</a>]</li>
+<li>Bug 726469 - Tilde sign in combination with &lt;pre&gt; and MARKDOWN_SUPPORT disabled [<a href="http://github.com/doxygen/doxygen/commit/721764a1b3c63c77ff0792beb6c37fbfee0f87bb">view</a>]</li>
+<li>Bug 726722 - Blockquote followed by text inserts an extra paragraph [<a href="http://github.com/doxygen/doxygen/commit/518fccbbadba3136a29c895f3606f40fa220fe47">view</a>]</li>
+<li>Bug 726734 - alignment of blockquotes in pdf [<a href="http://github.com/doxygen/doxygen/commit/9059295fd6e178804f2f2d95ffe3764645ecc026">view</a>]</li>
+<li>Bug 728077 - Build fails when --with-libclang on Fedora [<a href="http://github.com/doxygen/doxygen/commit/837d63319a7b014412cb3cb2b5d27d2474a932c2">view</a>]</li>
+<li>Bug 728530 - Crash on \addindex \term [<a href="http://github.com/doxygen/doxygen/commit/653a2a8b123b79835af9f684f8b92ef7f88712aa">view</a>]</li>
+<li>A new files have been added but is not incorporated in the windows build part [<a href="http://github.com/doxygen/doxygen/commit/d9dd873e25fba968ddcbcc79d6643f5df669b626">view</a>]</li>
+<li>Add docbook directory to be removed as well [<a href="http://github.com/doxygen/doxygen/commit/08ea10029e705a388ab14ee29544d496a203f23f">view</a>]</li>
+<li>Add extra (documenattion) directories to ignore pattern [<a href="http://github.com/doxygen/doxygen/commit/db358b1f219fecf0d7df96d8c70b47b245471c66">view</a>]</li>
+<li>Add index support to context [<a href="http://github.com/doxygen/doxygen/commit/12cd22f4c32ed8b92da7b5a03181aa6735018a5b">view</a>]</li>
+<li>Add line numbers in case comment is not closed properly. [<a href="http://github.com/doxygen/doxygen/commit/b1d513b2ac65fe26ceec2fa494867713efa01cd5">view</a>]</li>
+<li>Add template context for annotated class index [<a href="http://github.com/doxygen/doxygen/commit/9434ecb13e1f3e2901b78d3e41e7f1d7d9469434">view</a>]</li>
+<li>Add validation of internal consistency to html entity mapper [<a href="http://github.com/doxygen/doxygen/commit/d96458ce99b92590a8fec0aba46c67b6816fa632">view</a>]</li>
+<li>Add warning when encountering a nested comment start (/*) without matching end (*/). [<a href="http://github.com/doxygen/doxygen/commit/7f30d0afbeb9565bced1439f86ce9f862de5282e">view</a>]</li>
+<li>Added \latexinclude command (thanks to Juan Zaratiegui for the patch) [<a href="http://github.com/doxygen/doxygen/commit/1134237afe25f86fcf7c7e2a76a3542eee8acc79">view</a>]</li>
+<li>Added basic arithmetic operations to the template expressions, and made the expression lexer faster [<a href="http://github.com/doxygen/doxygen/commit/5af2b7c0aef5cd6a0dc6ceddcffba16f623d920a">view</a>]</li>
+<li>Added dir tree nodes to the context [<a href="http://github.com/doxygen/doxygen/commit/762ee821bb0bef125d5406572963ce32c748e227">view</a>]</li>
+<li>Added directory info to the context [<a href="http://github.com/doxygen/doxygen/commit/47adeb82d67208db88a4aaae5c3427291462611a">view</a>]</li>
+<li>Added doc/config.doc to .gitignore [<a href="http://github.com/doxygen/doxygen/commit/fa400a0252d12db3ffd30eb083e5185f11264112">view</a>]</li>
+<li>Added language update for Swedish (thanks to Bj&ouml;rn Palmqvist) [<a href="http://github.com/doxygen/doxygen/commit/eec2140f577431915ed087727093c5bf381500ba">view</a>]</li>
+<li>Added last and first attributes to index tree node [<a href="http://github.com/doxygen/doxygen/commit/ff5ec803a39b225e03edcd1bf2df3198dafcc16e">view</a>]</li>
+<li>Added missing \+ command to build LaTeX manual [<a href="http://github.com/doxygen/doxygen/commit/c096119b0c0bfc567058538b6225ca26eb191a3a">view</a>]</li>
+<li>Added new language maintainer for Swedish, removed generated file language.doc [<a href="http://github.com/doxygen/doxygen/commit/f3172cf19514fc05588878d3fabfffe479495cca">view</a>]</li>
+<li>Added optional [block] option to \htmlonly [<a href="http://github.com/doxygen/doxygen/commit/842c816a31537e32cec376c85c0a4363f74d7a54">view</a>]</li>
+<li>Added reference counting for all context objects [<a href="http://github.com/doxygen/doxygen/commit/ff00706a18b6e57419796ffd6f1448cb2ccb9436">view</a>]</li>
+<li>Added stricter URL filtering to prevent DOM Based XSS when the tree view is enabled [<a href="http://github.com/doxygen/doxygen/commit/8ba739ad1ecde1036bfe2e364aee378e137f6dff">view</a>]</li>
+<li>Added support for \-- and \--- to prevent interpretation as ndash and mdash [<a href="http://github.com/doxygen/doxygen/commit/385b87e08c23b1392d0e6d6fbdb6ef463fa28477">view</a>]</li>
+<li>Added support for elif to the template language [<a href="http://github.com/doxygen/doxygen/commit/ae3a22ba276a2e446a460274e0bff8a9bdf4af7d">view</a>]</li>
+<li>Added support for range tag in the template language [<a href="http://github.com/doxygen/doxygen/commit/b98846d0b57b78cd45d34e0962a8bcdc2e643e18">view</a>]</li>
+<li>Alterative way to get rules information from flex [<a href="http://github.com/doxygen/doxygen/commit/224fa96dd9c9245bfdf68ee6f92160b7aa05f8d1">view</a>]</li>
+<li>Better message in case doxygen -u is used [<a href="http://github.com/doxygen/doxygen/commit/cfd8c2415e7d0744a00bf1990f26aab538940f20">view</a>]</li>
+<li>Changed &quot;See Also&quot; back to &quot;See also&quot; [<a href="http://github.com/doxygen/doxygen/commit/0754c968a4a06c8217c9301a5ca82c6212c228ec">view</a>]</li>
+<li>Chm don&#39;t add images multiple times [<a href="http://github.com/doxygen/doxygen/commit/3b339813794390bdce59fa1009cf71506e0cec2b">view</a>]</li>
+<li>Command \&lt; and \&gt; are not properly shown in section headers (and consequently in index) [<a href="http://github.com/doxygen/doxygen/commit/04a8ce9a8e2f022c21a5728ffdfb029258fa54e9">view</a>]</li>
+<li>Consistency of usage of the word LaTeX in the documentation [<a href="http://github.com/doxygen/doxygen/commit/d63a7d8812c7f748a48d76bfc39ce57f79f6f667">view</a>]</li>
+<li>Context enhancement [<a href="http://github.com/doxygen/doxygen/commit/92d53a473074a78735d25bbef02715b3caced569">view</a>]</li>
+<li>Corrected some definitions for some Fortran keywords [<a href="http://github.com/doxygen/doxygen/commit/d4aa05e171d27cc17b177078d3ff481441087da4">view</a>]</li>
+<li>Disabled config dependency check to avoid regression [<a href="http://github.com/doxygen/doxygen/commit/904ad3fbdc5e1615fdb052ba8562fc9b1329cd81">view</a>]</li>
+<li>Documentation corrections [<a href="http://github.com/doxygen/doxygen/commit/4b51e6113f1e9e20a5700840d83f1c3928d84825">view</a>]</li>
+<li>Enable Previous and Next buttons in chm output file [<a href="http://github.com/doxygen/doxygen/commit/e6a78b6b2573388353bdb5dcd7a13dcc11959d13">view</a>]</li>
+<li>Enabling possibility to have { and } in (latex) index items [<a href="http://github.com/doxygen/doxygen/commit/dd2c137847e16d0a7c6086053f55bce501d84a0c">view</a>]</li>
+<li>Error message is given for make distclean as generated_src is a directory [<a href="http://github.com/doxygen/doxygen/commit/76701e2bfb688ac22a751c4f03b28fa9d5f594f7">view</a>]</li>
+<li>Extension in config.xml if type=string with format=image [<a href="http://github.com/doxygen/doxygen/commit/025cc9def72002d4ab6da7bfee8a73c03ca7c331">view</a>]</li>
+<li>Extension specific filtering [<a href="http://github.com/doxygen/doxygen/commit/425e64e2ee52b92a2c0c8f6fb5457bf95b95e5bf">view</a>]</li>
+<li>Fix id parsing for atx markdown headers [<a href="http://github.com/doxygen/doxygen/commit/ee830bb8888535ac48c0c4fd90580542e7f70481">view</a>]</li>
+<li>Fix segfault on invalid bounding FIG when patching dot [<a href="http://github.com/doxygen/doxygen/commit/1bd2e38a2ce2d0823557381c48fe47cb53d6fba8">view</a>]</li>
+<li>Fix to VHDL scanner. [<a href="http://github.com/doxygen/doxygen/commit/5ca7d423a11337d5c31082f52a287a3dc0986642">view</a>]</li>
+<li>Fix typos in russian translation [<a href="http://github.com/doxygen/doxygen/commit/8ce2b0d7aec1d4398b5b4f365a7d3abbe75daf5f">view</a>]</li>
+<li>Fixed Tidy&#39;s &#39;empty span&#39; warning in HTML output [<a href="http://github.com/doxygen/doxygen/commit/8cfac90d6c8632436db1a6b650a05a8dfcfab5d0">view</a>]</li>
+<li>Fixed compiler warnings in section.h [<a href="http://github.com/doxygen/doxygen/commit/683ef76f7bf1ba929f9c263064bb5f6c8e377275">view</a>]</li>
+<li>Fixed difference between generated XML schema and XML files for HTML entities [<a href="http://github.com/doxygen/doxygen/commit/836af2f9510d10f2dd7d832025f214983387b3c6">view</a>]</li>
+<li>Fixed issues with @parblock and added regression test case [<a href="http://github.com/doxygen/doxygen/commit/2ed3d33a92dbcdf0a0149c5f06909926e44cdebd">view</a>]</li>
+<li>Fixed issues with SEPARATE_MEMBER_PAGES and INLINE_SIMPLE_STRUCTS [<a href="http://github.com/doxygen/doxygen/commit/a9f93437b6b2b9686e1b4f2e691782c6ebe99c26">view</a>]</li>
+<li>Fixed memory leak in nested comment administration [<a href="http://github.com/doxygen/doxygen/commit/2514ba72e53473f8dd424efdbef34287c8a3fd56">view</a>]</li>
+<li>Fixed off-by one error for last character in compound.xsd [<a href="http://github.com/doxygen/doxygen/commit/61b00c0061eda805696fe6f90db15136811e1ed7">view</a>]</li>
+<li>Fixed potential crash caused by overloading the variadic warn function [<a href="http://github.com/doxygen/doxygen/commit/31505eb34565b2e39d113b7f5460645d02ad6d2e">view</a>]</li>
+<li>Fixed problem handling Obj-C protocol list when proceeded by a newline [<a href="http://github.com/doxygen/doxygen/commit/09a5fc198a98d697d3e50c1c76392b8373f1af12">view</a>]</li>
+<li>Fixed problem with ending a paragraph when htmlonly was at the end of a comment block [<a href="http://github.com/doxygen/doxygen/commit/8d03b3f35e404abfd0ed31022a687fc1eab07fd5">view</a>]</li>
+<li>Fixed typo in changelog [<a href="http://github.com/doxygen/doxygen/commit/8f58d6dd7c3d0f6004d127bf111f76e4a4478516">view</a>]</li>
+<li>Fixed typo in doxyindexer.vcproj [<a href="http://github.com/doxygen/doxygen/commit/2bc8a820b3e2fefaedb10a3129eed35581a1ea5b">view</a>]</li>
+<li>Fixes for missing build dependencies [<a href="http://github.com/doxygen/doxygen/commit/62379ff8fdb13d95c7651419d92db47150e15bcc">view</a>]</li>
+<li>Give message when PROJECT_LOGO cannot be found or cannot be converted [<a href="http://github.com/doxygen/doxygen/commit/164864d9bc8ea7e32a69fbc0e47cff54dc678a48">view</a>]</li>
+<li>Handlingh of -- by \c and &lt;code&gt; results in - adjusted documentation [<a href="http://github.com/doxygen/doxygen/commit/73d12cc5cf0656e94125baea62cdb19b67908b3d">view</a>]</li>
+<li>Improve rendering of sub and superscripts in LaTeX [<a href="http://github.com/doxygen/doxygen/commit/a7c7f36ea2a67969bf3916c7600fe487e34438c0">view</a>]</li>
+<li>Improved handling of percent symbol [<a href="http://github.com/doxygen/doxygen/commit/0e080f486f67008ef427c834f6ab6ebca7578124">view</a>]</li>
+<li>Improved performance of rendering large index pages, by replacing images in the tables by spans [<a href="http://github.com/doxygen/doxygen/commit/956a7fb004e72923f737e387d053812f99b7bda2">view</a>]</li>
+<li>In case of sections with the same name they are not reported. [<a href="http://github.com/doxygen/doxygen/commit/ac611be473c2d9bf65bcafb53b0577274c4ae706">view</a>]</li>
+<li>Inconsistency in usage of simplesecr versus simplesectsep corrected [<a href="http://github.com/doxygen/doxygen/commit/bc46b90c42470e238a6e038f49a7423796a8c2e3">view</a>]</li>
+<li>Inconsistency in usage of simplesecr versus simplesectsep corrected [<a href="http://github.com/doxygen/doxygen/commit/c5bedcdc2e3b6c519aae62ff1a08d4ec808cce6b">view</a>]</li>
+<li>Incorrect handling dependencies [<a href="http://github.com/doxygen/doxygen/commit/bfcfa6fc73942b80cb22e2900438dc99d844a78e">view</a>]</li>
+<li>Items XML_SCHEMA and XML_DTD declared obsolete [<a href="http://github.com/doxygen/doxygen/commit/ba31ee73aad3bdc6b3854add2db01c302c9cf19c">view</a>]</li>
+<li>List only the project pages in &quot;Related Pages&quot; [<a href="http://github.com/doxygen/doxygen/commit/a2c7f91d6320f72951f1e3ef092e077a89562670">view</a>]</li>
+<li>Made documentation more consistent [<a href="http://github.com/doxygen/doxygen/commit/b81fe14c7fe8b3eaafa4ce8ddcd0f1815c2c7ff0">view</a>]</li>
+<li>Make sure all ids in g_linkRefs are lower case [<a href="http://github.com/doxygen/doxygen/commit/3df31762585075033a04e40c3cdfb52781aa258f">view</a>]</li>
+<li>Make the MAN_SUBDIR setting overide the name of the directry the man pages are placed in. [<a href="http://github.com/doxygen/doxygen/commit/83b344db49b27bf68994eb8ec6be87d6d0f24e86">view</a>]</li>
+<li>Meta tag in the HTML search page was not closed properly [<a href="http://github.com/doxygen/doxygen/commit/4ccfb9efa8382de50dfc5b176cb147fd1b05870c">view</a>]</li>
+<li>Minor fixes for the new build locations [<a href="http://github.com/doxygen/doxygen/commit/d86520ef4920a9a47a4d6e33eadfc62b8b983748">view</a>]</li>
+<li>Missing &amp; and chars after &quot; in tree of chm documentation [<a href="http://github.com/doxygen/doxygen/commit/89638fbc9961bd9a1e9cb7bc25e5f739936e8a43">view</a>]</li>
+<li>More context changes [<a href="http://github.com/doxygen/doxygen/commit/196f39515ec5f9fdcbda68046f48a1d1a8250854">view</a>]</li>
+<li>More work on the template and context mechanisms [<a href="http://github.com/doxygen/doxygen/commit/744d1ca52e25dfa9e3d656056d87ed7cb6320585">view</a>]</li>
+<li>On windows citelist.doc remains [<a href="http://github.com/doxygen/doxygen/commit/3c941f24ee93687c197363fa2d4b787512878eab">view</a>]</li>
+<li>Place where dot executable is found [<a href="http://github.com/doxygen/doxygen/commit/90ecc2487146e0cdd392047342a30fd13453b233">view</a>]</li>
+<li>Properly escape the XCODE path. [<a href="http://github.com/doxygen/doxygen/commit/0cc8f6b2a14fdeb6d6769d34edb035b755d1299f">view</a>]</li>
+<li>Pull out property names in Objective-C. [<a href="http://github.com/doxygen/doxygen/commit/f4ff0ea8b11560ce718bb41b63bdf793cd333f27">view</a>]</li>
+<li>Recognize all HTML4 special character entities [<a href="http://github.com/doxygen/doxygen/commit/1bd64ac0e925ba2ff069ec64c026ea3c32f85600">view</a>]</li>
+<li>Reduced and improved functionality of QList [<a href="http://github.com/doxygen/doxygen/commit/6e51abf63021dc9fe32c05f003232fe68a08591d">view</a>]</li>
+<li>Removed config.doc as it is generated by configgen.py [<a href="http://github.com/doxygen/doxygen/commit/a642629761d43d53f3ade41c78530d0c7228a84d">view</a>]</li>
+<li>Removed generated file src/settings.h from source repository [<a href="http://github.com/doxygen/doxygen/commit/43461e44d49200fd1564c4e416db7384e7e5eab8">view</a>]</li>
+<li>Removed message, minor restructuring [<a href="http://github.com/doxygen/doxygen/commit/ea436bd659e022d6375dd37f651d4bb18a1c01db">view</a>]</li>
+<li>Removed remark about installdox from the FAQ [<a href="http://github.com/doxygen/doxygen/commit/68080883535bb146e2e4f65943c8b836da6b68e0">view</a>]</li>
+<li>Restructered html entity handling [<a href="http://github.com/doxygen/doxygen/commit/dfa20277697fe904a0846b60a01cc388fc13c933">view</a>]</li>
+<li>Reverted #132 after submitter reported that it did not work [<a href="http://github.com/doxygen/doxygen/commit/fdc81edcd47ce176648d7507d0597294098ae8aa">view</a>]</li>
+<li>Showing error message on windows in case on error on startup [<a href="http://github.com/doxygen/doxygen/commit/6a0651d9328262271ade2b733c125aae4415e3c3">view</a>]</li>
+<li>Simplified LaTeX header/footer escaping [<a href="http://github.com/doxygen/doxygen/commit/3337add3a6e05e26800c9e269b23fff272a9534c">view</a>]</li>
+<li>Some restructuring and some compiler warning fixes [<a href="http://github.com/doxygen/doxygen/commit/941eea998d6b9608b8fc586069ef90e805d771f5">view</a>]</li>
+<li>Spitting generated files better from source files [<a href="http://github.com/doxygen/doxygen/commit/8885016b2a3bbeb6045a3e71d508939e0a7bd773">view</a>]</li>
+<li>Superfluous &lt; sign [<a href="http://github.com/doxygen/doxygen/commit/599700e6e72d687b6597cfbe2453474b231640ea">view</a>]</li>
+<li>Superfluous backslash in documentation [<a href="http://github.com/doxygen/doxygen/commit/be5f9c70bcf38f9bce58e4b8e293dab6aea754fd">view</a>]</li>
+<li>Superfluous include removed [<a href="http://github.com/doxygen/doxygen/commit/0e12f6bfa938b675f827074eb3693eff362e6b96">view</a>]</li>
+<li>Undo previous commit [<a href="http://github.com/doxygen/doxygen/commit/1b5d5e53a7fce8136f9ab0ce82c95a8f9d479574">view</a>]</li>
+<li>Unified DirFileContext and NestingContext [<a href="http://github.com/doxygen/doxygen/commit/df839603204979113b96678e2ab21b3eba64476c">view</a>]</li>
+<li>Update doctokenizer.l [<a href="http://github.com/doxygen/doxygen/commit/68cf977ee72f8914678e30e3a88f0e9d90703418">view</a>]</li>
+<li>Update doctokenizer.l [<a href="http://github.com/doxygen/doxygen/commit/ea1ee635fccbba4273a922dab3d092dd75b195e0">view</a>]</li>
+<li>Updated copyright [<a href="http://github.com/doxygen/doxygen/commit/a28ff2331d8e228d901cd6f0b038f76e1cee630a">view</a>]</li>
+<li>Use \newline i.s.o. \par for linebreaks in LaTeX [<a href="http://github.com/doxygen/doxygen/commit/7e719d1ad5da33ccb3f54a90ae11dee58828b6ab">view</a>]</li>
+<li>Use hook arrow for hyphens in symbol names in the LaTeX output. [<a href="http://github.com/doxygen/doxygen/commit/ac813134a85ba9bd999fb4cf8271c74e02cd4ebb">view</a>]</li>
+<li>Wrong UTF 8 codes [<a href="http://github.com/doxygen/doxygen/commit/fd4beb272e5f1a760a71ab8d85463b8356c6f786">view</a>]</li>
+<li>Fix broken links to subpages in LaTeX output [<a href="http://github.com/doxygen/doxygen/commit/10189681dcb46e543a287827e2096cef3dbc42ae">view</a>]</li>
+<li>\xmlonly aoppeared twice in see also section of \htmlonly and \docbookonly [<a href="http://github.com/doxygen/doxygen/commit/f1cdb27194dd180f1bff1fbdd87874bb0d15758d">view</a>]</li>
+<li>add css-escape to avoid jquery based xss [<a href="http://github.com/doxygen/doxygen/commit/7fea82094723ecfb4e9b3ea6819137b99d7dfa9c">view</a>]</li>
+<li>add parameter [<a href="http://github.com/doxygen/doxygen/commit/c5bc9fc8c407aac845d594b2685d0c92699727d8">view</a>]</li>
+<li>add search.py, a client for doxygen_sqlite3.db [<a href="http://github.com/doxygen/doxygen/commit/697ac97aad7fa045b6cc205050b69cf3f22408ad">view</a>]</li>
+<li>add space between br and / for better compatibility [<a href="http://github.com/doxygen/doxygen/commit/2a40448c3855da250561fa4bac01179311831307">view</a>]</li>
+<li>added option to have numbers in the bookmark pane (PDF output) [<a href="http://github.com/doxygen/doxygen/commit/62cf79095c4d02ff1c737e02f91f8dcea2175b9e">view</a>]</li>
+<li>config.l: dependency checks for booleans [<a href="http://github.com/doxygen/doxygen/commit/5d64c0e2f39730bb5decd86a483a5b0823a67958">view</a>]</li>
+<li>detect python2 as Python 2 binary [<a href="http://github.com/doxygen/doxygen/commit/3754cd80cae41b23dc1069245ad5acdc460b8809">view</a>]</li>
+<li>fixed compile issue on Linux [<a href="http://github.com/doxygen/doxygen/commit/e3c636337323ba6e3f21bf1e8cfe2a899a8890c1">view</a>]</li>
+<li>pass libclang header file location; add paths for Ubuntu&#39;s llvm-3.4 [<a href="http://github.com/doxygen/doxygen/commit/2613bf77ccbeee4721a17a8168dead071e41b45e">view</a>]</li>
+<li>sqlite3: SQLITE_TRANSIENTs [<a href="http://github.com/doxygen/doxygen/commit/6f38dd245d56aaa9b6c8e966a4ccebe2f66ceb7d">view</a>]</li>
+<li>sqlite3: add new searches to search.py [<a href="http://github.com/doxygen/doxygen/commit/c99422b0c7919e953811a3a06e18c7cacbacd7c6">view</a>]</li>
+<li>sqlite3: clear bindings on errors and more care with return [<a href="http://github.com/doxygen/doxygen/commit/1a708967ba0c4a5604c1ac7d8f3c8112ec3e7044">view</a>]</li>
+<li>sqlite3: extract more info [<a href="http://github.com/doxygen/doxygen/commit/cd4bdf6708194228434bed1f71d1cd698863aaaf">view</a>]</li>
+<li>sqlite3: fedora has libsqlite3.so in /usr/lib64 [<a href="http://github.com/doxygen/doxygen/commit/49f65d1ee1c9005e019ec95a933ec5fcf02556c9">view</a>]</li>
+<li>sqlite3: leave out insertMemberReference until xref location is valid [<a href="http://github.com/doxygen/doxygen/commit/2349f4b3ff931e334b3d3e09b3e03861a7630f86">view</a>]</li>
+<li>sqlite3: remove some debug messages [<a href="http://github.com/doxygen/doxygen/commit/f76ec80dc8d1d7910951b34582ac25ce6f0efe4d">view</a>]</li>
+<li>sqlite3: speedup the SELECTs [<a href="http://github.com/doxygen/doxygen/commit/d7f9bbedaa4b4fcc0253470d522149a2307d1020">view</a>]</li>
+<li>sqlite3: updates [<a href="http://github.com/doxygen/doxygen/commit/2b80c416671220315a11287b6e10d5b3b2f852cc">view</a>]</li>
+<li>sqlite3: use the new qtools API [<a href="http://github.com/doxygen/doxygen/commit/54fbd99c753e09b1c3850af6b8b4457d339b6e84">view</a>]</li>
+<li>testsqlite3: a test for sqlite3gen [<a href="http://github.com/doxygen/doxygen/commit/733aaaa073a92a316ba888b6992f1172550dd469">view</a>]</li>
+<li>util/patternMatch: break when pattern is found [<a href="http://github.com/doxygen/doxygen/commit/6d8c3184fadb1834223236b13471797089e4a004">view</a>]</li>
+<li>util/patternMatch: don&#39;t extract a QCString(QFileInfo) each time we QRegExp.match [<a href="http://github.com/doxygen/doxygen/commit/8991d11cc824f40c11a28ccc38c09e9b10f722c3">view</a>]</li>
+</ul>
+\endhtmlonly
+
 \subsection log_1_8_6 Release 1.8.6
 \htmlonly
 <b>(release date 24-12-2013)</b>
 <a name="1.8.6"></a>
-<h3>Bug fixes (ids refer to the <a href="http://bugzilla.gnome.org/buglist.cgi?product=doxygen&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=NEEDINFO&bug_status=REOPENED&bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&changedin=&chfieldfrom=&chfieldto=Now&chfieldvalue=&short_desc=&short_desc_type=substring&long_desc=&long_desc_type=substring&bug_file_loc=&bug_file_loc_type=substring&status_whiteboard=&status_whiteboard_type=substring&keywords=&keywords_type=anywords&op_sys_details=&op_sys_details_type=substring&version_details=&version_details_type=substring&newqueryname=&form_name=query&order=bugs.bug_id">bugzilla</a> database, lines with bug refer to commit is <a href="https://github.com/doxygen/doxygen/commits/master">GitHub</a>)</h3>
+<h3>Bug fixes (ids refer to the <a href="http://bugzilla.gnome.org/buglist.cgi?product=doxygen&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=NEEDINFO&bug_status=REOPENED&bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&changedin=&chfieldfrom=&chfieldto=Now&chfieldvalue=&short_desc=&short_desc_type=substring&long_desc=&long_desc_type=substring&bug_file_loc=&bug_file_loc_type=substring&status_whiteboard=&status_whiteboard_type=substring&keywords=&keywords_type=anywords&op_sys_details=&op_sys_details_type=substring&version_details=&version_details_type=substring&newqueryname=&form_name=query&order=bugs.bug_id">bugzilla</a> database, lines without bug id refer to commits in <a href="https://github.com/doxygen/doxygen/commits/master">GitHub</a>)</h3>
 <ul>
 <li> Bug 154880 - if "using namespace" used, call of a static member function in C++ is not recognized or recognized wrong
 <li> Bug 647517  - make install prepends a slash to the installation path Removed superfluous /
 <li>   Additional Inherited Members could turn up empty of all members of
        the inherited class were grouped and SUBGROUPING was set to NO.
 </ul>
-<\endhtmlonly
+\endhtmlonly
 \subsection log_1_8_1 Release 1.8.1
 \htmlonly
 <a name="1.8.1"></a>
index d13c68b..5743832 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -117,6 +117,7 @@ documentation:
 \refitem cmdinternal \\internal
 \refitem cmdinvariant \\invariant
 \refitem cmdinterface \\interface
+\refitem cmdlatexinclude \\latexinclude
 \refitem cmdlatexonly \\latexonly
 \refitem cmdli \\li
 \refitem cmdline \\line
@@ -208,6 +209,8 @@ documentation:
 \refitem cmdchardot \\\.
 \refitem cmddcolon \::
 \refitem cmdpipe \\|
+\refitem cmdndash \\\--
+\refitem cmdmdash \\\---
 \endsecreflist
 
 The following subsections provide a list of all commands that are recognized by
@@ -290,7 +293,7 @@ Structural indicators
   \addindex \\category
   For Objective-C only: Indicates that a comment block contains documentation
   for a class category with name \<name\>. The arguments are
-  equal to the \\class command.
+  equal to the \ref cmdclass "\\class" command.
 
   \sa section \ref cmdclass "\\class".
 
@@ -629,7 +632,7 @@ Structural indicators
 
   If the \c \\mainpage command is placed in a comment block the
   block is used to customize the index page (in HTML) or
-  the first chapter (in \f$\mbox{\LaTeX}\f$).
+  the first chapter (in \LaTeX).
 
   The title argument is optional and replaces the default title that
   doxygen normally generates. If you do not want any title you can
@@ -760,7 +763,7 @@ Structural indicators
   Indicates that a comment block contains a piece of documentation that is
   not directly related to one specific class, file or member.
   The HTML generator creates a page containing the documentation. The
-  \f$\mbox{\LaTeX}\f$ generator
+  \LaTeX generator
   starts a new section in the chapter 'Page documentation'.
 
   \par Example:
@@ -929,7 +932,7 @@ Structural indicators
 <hr>
 \section cmdrelated \\related <name>
 
-  \addindex related
+  \addindex \\related
   Equivalent to \ref cmdrelates "\\relates"
 
 <hr>
@@ -946,7 +949,7 @@ Structural indicators
 <hr>
 \section cmdrelatedalso \\relatedalso <name>
 
-  \addindex relatedalso
+  \addindex \\relatedalso
   Equivalent to \ref cmdrelatesalso "\\relatesalso"
 
 <hr>
@@ -1496,13 +1499,13 @@ void setPosition(double x,double y,double z,double t)
  *  Rest of the comment block continues.
  */
 \endverbatim
-  Note that the \\parblock command may also appear directly after
-  \\param's first argument.
+  Note that the \c \\parblock command may also appear directly after
+  \ref cmdparam "\\param"'s first argument.
 
 <hr>
 \section cmdendparblock \\endparblock
   \addindex \\endparblock
-  This ends a block of paragraphs started with \\ref cmdparblock "\\parblock".
+  This ends a block of paragraphs started with \ref cmdparblock "\\parblock".
 
 <hr>
 \section cmdtparam \\tparam <template-parameter-name> { description }
@@ -1612,7 +1615,7 @@ void setPosition(double x,double y,double z,double t)
   may be selected by including a parenthesized list of argument types after
   the method name.
 
-  Synonymous to \\see.
+  Synonymous to \ref cmdsee "\\see".
 
   \sa section \ref autolink "autolink" for information on how to create links
       to objects.
@@ -1633,7 +1636,7 @@ void setPosition(double x,double y,double z,double t)
 \section cmdsince \\since { text }
 
   \addindex \\since
-  This tag can be used to specify since when (version or time) an
+  This command can be used to specify since when (version or time) an
   entity is available. The paragraph that follows \c \\since does not have any
   special internal structure. All visual enhancement commands may be
   used inside the paragraph. The \c \\since description ends when a blank
@@ -1656,7 +1659,7 @@ void setPosition(double x,double y,double z,double t)
   Synonymous \ref cmdexception "\\exception".
 
   \par Note:
-  the tag \c \\throws is a synonym for this tag.
+  the command \ref cmdthrows "\\throws" is a synonym for this command.
 
   \sa section \ref cmdexception "\\exception"
 
@@ -1774,7 +1777,7 @@ Commands to create links
 \section cmdaddindex \\addindex (text)
 
   \addindex \\addindex
-  This command adds (text) to the \f$\mbox{\LaTeX}\f$ index.
+  This command adds (text) to the \LaTeX index.
 
 <hr>
 \section cmdanchor \\anchor <word>
@@ -1796,7 +1799,7 @@ Commands to create links
   Adds a bibliographic reference in the text and in the list of bibliographic
   references. The \<label\> must be a valid BibTeX label that can be found 
   in one of the .bib files listed in \ref cfg_cite_bib_files "CITE_BIB_FILES".  
-  For the LaTeX output the formatting of the reference in the text can be 
+  For the \LaTeX output the formatting of the reference in the text can be 
   configured with \ref cfg_latex_bib_style "LATEX_BIB_STYLE". For other
   output formats a fixed representation is used. Note that using this
   command requires the \c bibtex tool to be present in the search path.
@@ -1834,7 +1837,7 @@ Commands to create links
   the section. For a section or subsection the title of the section will be
   used as the text of the link. For an anchor the optional text between quotes
   will be used or \<name\> if no text is specified.
-  For \f$\mbox{\LaTeX}\f$ documentation the reference command will
+  For \LaTeX documentation the reference command will
   generate a section number for sections or the text followed by a
   page number if \<name\> refers to an anchor.
 
@@ -2060,7 +2063,7 @@ Commands for displaying examples
   \ref cmddontinclude "\\dontinclude" command in combination with
   the \ref cmdline "\\line", \ref cmdskip "\\skip",
   \ref cmdskipline "\\skipline",
-  and \\until commands.
+  and \ref cmduntil "\\until" commands.
 
   Alternatively, the \ref cmdsnippet "\\snippet" command can be used to
   include only a fragment of a source file. For this to work the
@@ -2224,6 +2227,19 @@ Commands for displaying examples
 
 <hr>
 
+\section cmdlatexinclude \\latexinclude <file-name>
+
+  \addindex \\latexinclude
+  This command includes the file \<file-name\> as is in the \LaTeX documentation.
+  The command is equivalent to pasting the file in the documentation and
+  placing \ref cmdlatexonly "\\latexonly" and \ref cmdendlatexonly "\\endlatexonly"
+  commands around it.
+
+  Files or directories that doxygen should look for can be specified using the
+  \ref cfg_example_path "EXAMPLE_PATH" tag of doxygen's configuration file.
+
+<hr>
+
 \htmlonly <center> \endhtmlonly
 <h2>
 \htmlonly --- \endhtmlonly
@@ -2392,12 +2408,14 @@ Commands for visual enhancements
 <hr>
 \section cmdcopybrief \\copybrief <link-object>
 
+  \addindex \\copybrief
 Works in a similar way as \ref cmdcopydoc "\\copydoc" but will
 only copy the brief description, not the detailed documentation.
 
 <hr>
 \section cmdcopydetails \\copydetails <link-object>
 
+  \addindex \\copydetails
 Works in a similar way as \ref cmdcopydoc "\\copydoc" but will
 only copy the detailed documentation, not the brief description.
 
@@ -2410,7 +2428,6 @@ only copy the detailed documentation, not the brief description.
   \ref cmdenddocbookonly "\\enddocbookonly" command.
 
   \sa section \ref cmdmanonly "\\manonly", 
-              \ref cmdxmlonly "\\xmlonly", 
               \ref cmdlatexonly "\\latexonly", 
               \ref cmdrtfonly "\\rtfonly", 
               \ref cmdxmlonly "\\xmlonly", and 
@@ -2425,7 +2442,7 @@ only copy the detailed documentation, not the brief description.
   Doxygen will pass the text on to dot and include the resulting
   image (and image map) into the output.
   The nodes of a graph can be made clickable by using the URL attribute.
-  By using the command \\ref inside the URL value you can conveniently
+  By using the command \ref cmdref "\\ref" inside the URL value you can conveniently
   link to an item inside doxygen. Here is an example:
 \code
 /*! class B */
@@ -2476,12 +2493,12 @@ Here is an example of the use of the \c \\msc command.
 class Sender
 {
   public:
-    /** Acknowledgement from server */
+    /** Acknowledgment from server */
     void Ack(bool ok);
 };
 
 /** Receiver class. Can be used to receive and execute commands.
- *  After execution of a command, the receiver will send an acknowledgement
+ *  After execution of a command, the receiver will send an acknowledgment
  *  \msc
  *    Receiver,Sender;
  *    Receiver<-Sender [label="Command()", URL="\ref Command()"];
@@ -2697,6 +2714,8 @@ class Receiver
 <hr>
 \section cmdfcurlyopen \\f{environment}{
 
+  \addindex \\f{
+
   Marks the start of a formula that is in a specific environment.
   \note The second \c { is optional and is only to help editors (such as \c Vim) to
   do proper syntax highlighting by making the number of opening and closing braces
@@ -2706,11 +2725,13 @@ class Receiver
 <hr>
 \section cmdfcurlyclose \\f}
 
+  \addindex \\f}
+
   Marks the end of a formula that is in a specific environment.
   \sa section \ref cmdfcurlyopen "\\f{" and section \ref formulas "formulas".
 
 <hr>
-\section cmdhtmlonly \\htmlonly
+\section cmdhtmlonly \\htmlonly ["[block]"]
 
   \addindex \\htmlonly
   Starts a block of text that will be verbatim included in the
@@ -2719,15 +2740,19 @@ class Receiver
 
   This command can be used to include HTML code that is too complex
   for doxygen (i.e. applets, java-scripts, and HTML tags that
-  require attributes). You can use the \ref cmdlatexonly "\\latexonly" and 
-  \ref cmdendlatexonly "\\endlatexonly"
-  pair to provide a proper \f$\mbox{\LaTeX}\f$ alternative.
+  require specific attributes).
+
+  Normally the contents between \ref cmdhtmlonly "\\htmlonly" and
+  \ref cmdendhtmlonly "\\endhtmlonly" is inserted as-is. When you
+  want to insert a HTML fragment that has block scope like a table or list
+  which should appear outside \<p\>..\</p\>, this can lead to invalid HTML.
+  You can use \\htmlonly[block] to make doxygen
+  end the current paragraph and restart it after \\endhtmlonly.
 
   \note environment variables (like \$(HOME) ) are resolved inside a
-    HTML-only block.
+  HTML-only block.
 
   \sa section \ref cmdmanonly "\\manonly", 
-              \ref cmdxmlonly "\\xmlonly", 
               \ref cmdlatexonly "\\latexonly", 
               \ref cmdrtfonly "\\rtfonly", 
               \ref cmdxmlonly "\\xmlonly", and 
@@ -2759,10 +2784,10 @@ class Receiver
 
   The fourth argument is also optional and can be used to specify the
   width or height of the image. This is only useful
-  for \f$\mbox{\LaTeX}\f$ output
+  for \LaTeX output
   (i.e. format=<code>latex</code>). The \c sizeindication can be
   either \c width or \c height. The size should be a valid
-  size specifier in \f$\mbox{\LaTeX}\f$ (for example <code>10cm</code> or
+  size specifier in \LaTeX (for example <code>10cm</code> or
   <code>6in</code> or a symbolic width like <code>\\textwidth</code>).
 
   Here is example of a comment block:
@@ -2782,7 +2807,7 @@ class Receiver
 \endverbatim
 
   \warning The image format for HTML is limited to what your
-           browser supports. For \f$\mbox{\LaTeX}\f$, the image format
+           browser supports. For \LaTeX, the image format
            must be Encapsulated PostScript (eps).
            <br><br>
            Doxygen does not check if the image is in the correct format.
@@ -2793,17 +2818,17 @@ class Receiver
 
   \addindex \\latexonly
   Starts a block of text that will be verbatim included in the
-  generated \f$\mbox{\LaTeX}\f$ documentation only. The block ends with a
+  generated \LaTeX documentation only. The block ends with a
   \ref cmdendlatexonly "\\endlatexonly" command.
 
-  This command can be used to include \f$\mbox{\LaTeX}\f$ code that is too
+  This command can be used to include \LaTeX code that is too
   complex for doxygen (i.e. images, formulas, special characters). You can
   use the \ref cmdhtmlonly "\\htmlonly" and \ref cmdendhtmlonly "\\endhtmlonly"
   pair to provide a proper HTML alternative.
 
   \b Note:
     environment variables (like \$(HOME) ) are resolved inside a
-    \f$\mbox{\LaTeX}\f$-only block.
+    \LaTeX-only block.
 
   \sa sections \ref cmdrtfonly "\\rtfonly",
                \ref cmdxmlonly "\\xmlonly",
@@ -2824,7 +2849,7 @@ class Receiver
   \ref cmdendhtmlonly "\\endhtmlonly" and
   \ref cmdlatexonly "\\latexonly" and
   \ref cmdendlatexonly "\\endlatexonly" pairs to provide proper
-  HTML and \f$\mbox{\LaTeX}\f$ alternatives.
+  HTML and \LaTeX alternatives.
 
   \sa sections \ref cmdhtmlonly "\\htmlonly",
                \ref cmdxmlonly "\\xmlonly",
@@ -2979,7 +3004,7 @@ class Receiver
 \section cmdamp \\\&
 
   \addindex \\\&
-  This command writes the \c \& character to output.
+  This command writes the \c \& character to the output.
   This character has to be escaped because it has a special meaning in HTML.
 
 <hr>
@@ -3032,7 +3057,7 @@ class Receiver
 \section cmdchardot \\.
 
   \addindex \\\.
-  This command writes a dot (\c .) to the output. This can be useful to 
+  This command writes a dot (`.`) to the output. This can be useful to 
   prevent ending a brief description when JAVADOC_AUTOBRIEF is enabled
   or to prevent starting a numbered list when the dot follows a number at
   the start of a line.
@@ -3040,7 +3065,7 @@ class Receiver
 <hr>
 \section cmddcolon \\::
 
-  \addindex \\\::
+  \addindex \\::
   This command writes a double colon (\c \::) to the output. This
   character sequence has to be escaped in some cases, because it is used
   to reference to documented entities.
@@ -3054,6 +3079,20 @@ class Receiver
   for Markdown tables.
 
 <hr>
+\section cmdndash \\--
+
+  \addindex \\\--
+  This command writes two dashes (\--) to the output. This allows
+  writing two consecutive dashes to the output instead of one n-dash character (--).
+
+<hr>
+\section cmdmdash \\---
+
+  \addindex \\\---
+  This command writes three dashes (\---) to the output. This allows
+  writing three consecutuve dashes to the output instead of one m-dash character (---).
+
+<hr>
 \htmlonly <center> \endhtmlonly
 <h2>
 \htmlonly --- \endhtmlonly
diff --git a/doc/config.doc b/doc/config.doc
deleted file mode 100644 (file)
index 9b27733..0000000
+++ /dev/null
@@ -1,3826 +0,0 @@
-/* WARNING: This file is generated!
- * Do not edit this file, but edit config.xml instead and run
- * python configgen.py -doc config.xml to regenerate this file!
- */
-/*
- *
- * 
- *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby 
- * granted. No representations are made about the suitability of this software 
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page config Configuration
-
-\tableofcontents
-\section config_format Format
-
-A configuration file is a free-form ASCII text file with a structure
-that is similar to that of a \c Makefile, with the default name \c Doxyfile. It is
-parsed by \c doxygen. The file may contain tabs and newlines for
-formatting purposes. The statements in the file are case-sensitive.
-Comments may be placed anywhere within the file (except within quotes).
-Comments beginning with two hash characters (\c \#\#) are kept when updating
-the configuration file and are placed in front of the TAG are in front of.
-Comments beginning with two hash characters (\c \#\#) at the end of the
-configuration file are also kept and placed at the end of the file.
-Comments begin with the hash character (\c \#) and ends at the end of the line.
-
-The file essentially consists of a list of assignment statements.
-Each statement consists of a \c TAG_NAME written in capitals,
-followed by the equal sign (<code>=</code>) and one or more values. If the same tag
-is assigned more than once, the last assignment overwrites any earlier
-assignment. For tags that take a list as their argument,
-the <code>+=</code> operator can be used instead of <code>=</code> to append 
-new values to the list. Values are sequences of non-blanks. If the value should 
-contain one or more blanks it must be surrounded by quotes (<code>&quot;...&quot;</code>).
-Multiple lines can be concatenated by inserting a backslash (\c \\)
-as the last character of a line. Environment variables can be expanded 
-using the pattern <code>\$(ENV_VARIABLE_NAME)</code>.
-
-You can also include part of a configuration file from another configuration
-file using a <code>\@INCLUDE</code> tag as follows:
-\verbatim
-@INCLUDE = config_file_name
-\endverbatim 
-The include file is searched in the current working directory. You can 
-also specify a list of directories that should be searched before looking
-in the current working directory. Do this by putting a <code>\@INCLUDE_PATH</code> tag 
-with these paths before the <code>\@INCLUDE</code> tag, e.g.:
-\verbatim
-@INCLUDE_PATH = my_config_dir
-\endverbatim
-
-The configuration options can be divided into several categories.
-Below is an alphabetical index of the tags that are recognized 
-followed by the descriptions of the tags grouped by category.
-\secreflist
-\refitem cfg_abbreviate_brief ABBREVIATE_BRIEF
-\refitem cfg_aliases ALIASES
-\refitem cfg_allexternals ALLEXTERNALS
-\refitem cfg_alphabetical_index ALPHABETICAL_INDEX
-\refitem cfg_always_detailed_sec ALWAYS_DETAILED_SEC
-\refitem cfg_autolink_support AUTOLINK_SUPPORT
-\refitem cfg_binary_toc BINARY_TOC
-\refitem cfg_brief_member_desc BRIEF_MEMBER_DESC
-\refitem cfg_builtin_stl_support BUILTIN_STL_SUPPORT
-\refitem cfg_caller_graph CALLER_GRAPH
-\refitem cfg_call_graph CALL_GRAPH
-\refitem cfg_case_sense_names CASE_SENSE_NAMES
-\refitem cfg_chm_file CHM_FILE
-\refitem cfg_chm_index_encoding CHM_INDEX_ENCODING
-\refitem cfg_cite_bib_files CITE_BIB_FILES
-\refitem cfg_clang_assisted_parsing CLANG_ASSISTED_PARSING
-\refitem cfg_clang_options CLANG_OPTIONS
-\refitem cfg_class_diagrams CLASS_DIAGRAMS
-\refitem cfg_class_graph CLASS_GRAPH
-\refitem cfg_collaboration_graph COLLABORATION_GRAPH
-\refitem cfg_cols_in_alpha_index COLS_IN_ALPHA_INDEX
-\refitem cfg_compact_latex COMPACT_LATEX
-\refitem cfg_compact_rtf COMPACT_RTF
-\refitem cfg_cpp_cli_support CPP_CLI_SUPPORT
-\refitem cfg_create_subdirs CREATE_SUBDIRS
-\refitem cfg_diafile_dirs DIAFILE_DIRS
-\refitem cfg_dia_path DIA_PATH
-\refitem cfg_directory_graph DIRECTORY_GRAPH
-\refitem cfg_disable_index DISABLE_INDEX
-\refitem cfg_distribute_group_doc DISTRIBUTE_GROUP_DOC
-\refitem cfg_docbook_output DOCBOOK_OUTPUT
-\refitem cfg_docset_bundle_id DOCSET_BUNDLE_ID
-\refitem cfg_docset_feedname DOCSET_FEEDNAME
-\refitem cfg_docset_publisher_id DOCSET_PUBLISHER_ID
-\refitem cfg_docset_publisher_name DOCSET_PUBLISHER_NAME
-\refitem cfg_dotfile_dirs DOTFILE_DIRS
-\refitem cfg_dot_cleanup DOT_CLEANUP
-\refitem cfg_dot_fontname DOT_FONTNAME
-\refitem cfg_dot_fontpath DOT_FONTPATH
-\refitem cfg_dot_fontsize DOT_FONTSIZE
-\refitem cfg_dot_graph_max_nodes DOT_GRAPH_MAX_NODES
-\refitem cfg_dot_image_format DOT_IMAGE_FORMAT
-\refitem cfg_dot_multi_targets DOT_MULTI_TARGETS
-\refitem cfg_dot_num_threads DOT_NUM_THREADS
-\refitem cfg_dot_path DOT_PATH
-\refitem cfg_dot_transparent DOT_TRANSPARENT
-\refitem cfg_doxyfile_encoding DOXYFILE_ENCODING
-\refitem cfg_eclipse_doc_id ECLIPSE_DOC_ID
-\refitem cfg_enabled_sections ENABLED_SECTIONS
-\refitem cfg_enable_preprocessing ENABLE_PREPROCESSING
-\refitem cfg_enum_values_per_line ENUM_VALUES_PER_LINE
-\refitem cfg_example_path EXAMPLE_PATH
-\refitem cfg_example_patterns EXAMPLE_PATTERNS
-\refitem cfg_example_recursive EXAMPLE_RECURSIVE
-\refitem cfg_exclude EXCLUDE
-\refitem cfg_exclude_patterns EXCLUDE_PATTERNS
-\refitem cfg_exclude_symbols EXCLUDE_SYMBOLS
-\refitem cfg_exclude_symlinks EXCLUDE_SYMLINKS
-\refitem cfg_expand_as_defined EXPAND_AS_DEFINED
-\refitem cfg_expand_only_predef EXPAND_ONLY_PREDEF
-\refitem cfg_extension_mapping EXTENSION_MAPPING
-\refitem cfg_external_groups EXTERNAL_GROUPS
-\refitem cfg_external_pages EXTERNAL_PAGES
-\refitem cfg_external_search EXTERNAL_SEARCH
-\refitem cfg_external_search_id EXTERNAL_SEARCH_ID
-\refitem cfg_extract_all EXTRACT_ALL
-\refitem cfg_extract_anon_nspaces EXTRACT_ANON_NSPACES
-\refitem cfg_extract_local_classes EXTRACT_LOCAL_CLASSES
-\refitem cfg_extract_local_methods EXTRACT_LOCAL_METHODS
-\refitem cfg_extract_package EXTRACT_PACKAGE
-\refitem cfg_extract_private EXTRACT_PRIVATE
-\refitem cfg_extract_static EXTRACT_STATIC
-\refitem cfg_extra_packages EXTRA_PACKAGES
-\refitem cfg_extra_search_mappings EXTRA_SEARCH_MAPPINGS
-\refitem cfg_ext_links_in_window EXT_LINKS_IN_WINDOW
-\refitem cfg_file_patterns FILE_PATTERNS
-\refitem cfg_file_version_filter FILE_VERSION_FILTER
-\refitem cfg_filter_patterns FILTER_PATTERNS
-\refitem cfg_filter_source_files FILTER_SOURCE_FILES
-\refitem cfg_filter_source_patterns FILTER_SOURCE_PATTERNS
-\refitem cfg_force_local_includes FORCE_LOCAL_INCLUDES
-\refitem cfg_formula_fontsize FORMULA_FONTSIZE
-\refitem cfg_formula_transparent FORMULA_TRANSPARENT
-\refitem cfg_full_path_names FULL_PATH_NAMES
-\refitem cfg_generate_autogen_def GENERATE_AUTOGEN_DEF
-\refitem cfg_generate_buglist GENERATE_BUGLIST
-\refitem cfg_generate_chi GENERATE_CHI
-\refitem cfg_generate_deprecatedlist GENERATE_DEPRECATEDLIST
-\refitem cfg_generate_docbook GENERATE_DOCBOOK
-\refitem cfg_generate_docset GENERATE_DOCSET
-\refitem cfg_generate_eclipsehelp GENERATE_ECLIPSEHELP
-\refitem cfg_generate_html GENERATE_HTML
-\refitem cfg_generate_htmlhelp GENERATE_HTMLHELP
-\refitem cfg_generate_latex GENERATE_LATEX
-\refitem cfg_generate_legend GENERATE_LEGEND
-\refitem cfg_generate_man GENERATE_MAN
-\refitem cfg_generate_perlmod GENERATE_PERLMOD
-\refitem cfg_generate_qhp GENERATE_QHP
-\refitem cfg_generate_rtf GENERATE_RTF
-\refitem cfg_generate_tagfile GENERATE_TAGFILE
-\refitem cfg_generate_testlist GENERATE_TESTLIST
-\refitem cfg_generate_todolist GENERATE_TODOLIST
-\refitem cfg_generate_treeview GENERATE_TREEVIEW
-\refitem cfg_generate_xml GENERATE_XML
-\refitem cfg_graphical_hierarchy GRAPHICAL_HIERARCHY
-\refitem cfg_group_graphs GROUP_GRAPHS
-\refitem cfg_have_dot HAVE_DOT
-\refitem cfg_hhc_location HHC_LOCATION
-\refitem cfg_hide_friend_compounds HIDE_FRIEND_COMPOUNDS
-\refitem cfg_hide_in_body_docs HIDE_IN_BODY_DOCS
-\refitem cfg_hide_scope_names HIDE_SCOPE_NAMES
-\refitem cfg_hide_undoc_classes HIDE_UNDOC_CLASSES
-\refitem cfg_hide_undoc_members HIDE_UNDOC_MEMBERS
-\refitem cfg_hide_undoc_relations HIDE_UNDOC_RELATIONS
-\refitem cfg_html_colorstyle_gamma HTML_COLORSTYLE_GAMMA
-\refitem cfg_html_colorstyle_hue HTML_COLORSTYLE_HUE
-\refitem cfg_html_colorstyle_sat HTML_COLORSTYLE_SAT
-\refitem cfg_html_dynamic_sections HTML_DYNAMIC_SECTIONS
-\refitem cfg_html_extra_files HTML_EXTRA_FILES
-\refitem cfg_html_extra_stylesheet HTML_EXTRA_STYLESHEET
-\refitem cfg_html_file_extension HTML_FILE_EXTENSION
-\refitem cfg_html_footer HTML_FOOTER
-\refitem cfg_html_header HTML_HEADER
-\refitem cfg_html_index_num_entries HTML_INDEX_NUM_ENTRIES
-\refitem cfg_html_output HTML_OUTPUT
-\refitem cfg_html_stylesheet HTML_STYLESHEET
-\refitem cfg_html_timestamp HTML_TIMESTAMP
-\refitem cfg_idl_property_support IDL_PROPERTY_SUPPORT
-\refitem cfg_ignore_prefix IGNORE_PREFIX
-\refitem cfg_image_path IMAGE_PATH
-\refitem cfg_included_by_graph INCLUDED_BY_GRAPH
-\refitem cfg_include_file_patterns INCLUDE_FILE_PATTERNS
-\refitem cfg_include_graph INCLUDE_GRAPH
-\refitem cfg_include_path INCLUDE_PATH
-\refitem cfg_inherit_docs INHERIT_DOCS
-\refitem cfg_inline_grouped_classes INLINE_GROUPED_CLASSES
-\refitem cfg_inline_info INLINE_INFO
-\refitem cfg_inline_inherited_memb INLINE_INHERITED_MEMB
-\refitem cfg_inline_simple_structs INLINE_SIMPLE_STRUCTS
-\refitem cfg_inline_sources INLINE_SOURCES
-\refitem cfg_input INPUT
-\refitem cfg_input_encoding INPUT_ENCODING
-\refitem cfg_input_filter INPUT_FILTER
-\refitem cfg_interactive_svg INTERACTIVE_SVG
-\refitem cfg_internal_docs INTERNAL_DOCS
-\refitem cfg_javadoc_autobrief JAVADOC_AUTOBRIEF
-\refitem cfg_latex_batchmode LATEX_BATCHMODE
-\refitem cfg_latex_bib_style LATEX_BIB_STYLE
-\refitem cfg_latex_cmd_name LATEX_CMD_NAME
-\refitem cfg_latex_extra_files LATEX_EXTRA_FILES
-\refitem cfg_latex_footer LATEX_FOOTER
-\refitem cfg_latex_header LATEX_HEADER
-\refitem cfg_latex_hide_indices LATEX_HIDE_INDICES
-\refitem cfg_latex_output LATEX_OUTPUT
-\refitem cfg_latex_source_code LATEX_SOURCE_CODE
-\refitem cfg_layout_file LAYOUT_FILE
-\refitem cfg_lookup_cache_size LOOKUP_CACHE_SIZE
-\refitem cfg_macro_expansion MACRO_EXPANSION
-\refitem cfg_makeindex_cmd_name MAKEINDEX_CMD_NAME
-\refitem cfg_man_extension MAN_EXTENSION
-\refitem cfg_man_links MAN_LINKS
-\refitem cfg_man_output MAN_OUTPUT
-\refitem cfg_markdown_support MARKDOWN_SUPPORT
-\refitem cfg_mathjax_codefile MATHJAX_CODEFILE
-\refitem cfg_mathjax_extensions MATHJAX_EXTENSIONS
-\refitem cfg_mathjax_format MATHJAX_FORMAT
-\refitem cfg_mathjax_relpath MATHJAX_RELPATH
-\refitem cfg_max_dot_graph_depth MAX_DOT_GRAPH_DEPTH
-\refitem cfg_max_initializer_lines MAX_INITIALIZER_LINES
-\refitem cfg_mscfile_dirs MSCFILE_DIRS
-\refitem cfg_mscgen_path MSCGEN_PATH
-\refitem cfg_multiline_cpp_is_brief MULTILINE_CPP_IS_BRIEF
-\refitem cfg_optimize_for_fortran OPTIMIZE_FOR_FORTRAN
-\refitem cfg_optimize_output_for_c OPTIMIZE_OUTPUT_FOR_C
-\refitem cfg_optimize_output_java OPTIMIZE_OUTPUT_JAVA
-\refitem cfg_optimize_output_vhdl OPTIMIZE_OUTPUT_VHDL
-\refitem cfg_output_directory OUTPUT_DIRECTORY
-\refitem cfg_output_language OUTPUT_LANGUAGE
-\refitem cfg_paper_type PAPER_TYPE
-\refitem cfg_pdf_hyperlinks PDF_HYPERLINKS
-\refitem cfg_perlmod_latex PERLMOD_LATEX
-\refitem cfg_perlmod_makevar_prefix PERLMOD_MAKEVAR_PREFIX
-\refitem cfg_perlmod_pretty PERLMOD_PRETTY
-\refitem cfg_perl_path PERL_PATH
-\refitem cfg_predefined PREDEFINED
-\refitem cfg_project_brief PROJECT_BRIEF
-\refitem cfg_project_logo PROJECT_LOGO
-\refitem cfg_project_name PROJECT_NAME
-\refitem cfg_project_number PROJECT_NUMBER
-\refitem cfg_qch_file QCH_FILE
-\refitem cfg_qhg_location QHG_LOCATION
-\refitem cfg_qhp_cust_filter_attrs QHP_CUST_FILTER_ATTRS
-\refitem cfg_qhp_cust_filter_name QHP_CUST_FILTER_NAME
-\refitem cfg_qhp_namespace QHP_NAMESPACE
-\refitem cfg_qhp_sect_filter_attrs QHP_SECT_FILTER_ATTRS
-\refitem cfg_qhp_virtual_folder QHP_VIRTUAL_FOLDER
-\refitem cfg_qt_autobrief QT_AUTOBRIEF
-\refitem cfg_quiet QUIET
-\refitem cfg_recursive RECURSIVE
-\refitem cfg_referenced_by_relation REFERENCED_BY_RELATION
-\refitem cfg_references_link_source REFERENCES_LINK_SOURCE
-\refitem cfg_references_relation REFERENCES_RELATION
-\refitem cfg_repeat_brief REPEAT_BRIEF
-\refitem cfg_rtf_extensions_file RTF_EXTENSIONS_FILE
-\refitem cfg_rtf_hyperlinks RTF_HYPERLINKS
-\refitem cfg_rtf_output RTF_OUTPUT
-\refitem cfg_rtf_stylesheet_file RTF_STYLESHEET_FILE
-\refitem cfg_searchdata_file SEARCHDATA_FILE
-\refitem cfg_searchengine SEARCHENGINE
-\refitem cfg_searchengine_url SEARCHENGINE_URL
-\refitem cfg_search_includes SEARCH_INCLUDES
-\refitem cfg_separate_member_pages SEPARATE_MEMBER_PAGES
-\refitem cfg_server_based_search SERVER_BASED_SEARCH
-\refitem cfg_short_names SHORT_NAMES
-\refitem cfg_show_files SHOW_FILES
-\refitem cfg_show_grouped_memb_inc SHOW_GROUPED_MEMB_INC
-\refitem cfg_show_include_files SHOW_INCLUDE_FILES
-\refitem cfg_show_namespaces SHOW_NAMESPACES
-\refitem cfg_show_used_files SHOW_USED_FILES
-\refitem cfg_sip_support SIP_SUPPORT
-\refitem cfg_skip_function_macros SKIP_FUNCTION_MACROS
-\refitem cfg_sort_brief_docs SORT_BRIEF_DOCS
-\refitem cfg_sort_by_scope_name SORT_BY_SCOPE_NAME
-\refitem cfg_sort_group_names SORT_GROUP_NAMES
-\refitem cfg_sort_members_ctors_1st SORT_MEMBERS_CTORS_1ST
-\refitem cfg_sort_member_docs SORT_MEMBER_DOCS
-\refitem cfg_source_browser SOURCE_BROWSER
-\refitem cfg_source_tooltips SOURCE_TOOLTIPS
-\refitem cfg_strict_proto_matching STRICT_PROTO_MATCHING
-\refitem cfg_strip_code_comments STRIP_CODE_COMMENTS
-\refitem cfg_strip_from_inc_path STRIP_FROM_INC_PATH
-\refitem cfg_strip_from_path STRIP_FROM_PATH
-\refitem cfg_subgrouping SUBGROUPING
-\refitem cfg_tab_size TAB_SIZE
-\refitem cfg_tagfiles TAGFILES
-\refitem cfg_tcl_subst TCL_SUBST
-\refitem cfg_template_relations TEMPLATE_RELATIONS
-\refitem cfg_toc_expand TOC_EXPAND
-\refitem cfg_treeview_width TREEVIEW_WIDTH
-\refitem cfg_typedef_hides_struct TYPEDEF_HIDES_STRUCT
-\refitem cfg_uml_limit_num_fields UML_LIMIT_NUM_FIELDS
-\refitem cfg_uml_look UML_LOOK
-\refitem cfg_use_htags USE_HTAGS
-\refitem cfg_use_mathjax USE_MATHJAX
-\refitem cfg_use_mdfile_as_mainpage USE_MDFILE_AS_MAINPAGE
-\refitem cfg_use_pdflatex USE_PDFLATEX
-\refitem cfg_verbatim_headers VERBATIM_HEADERS
-\refitem cfg_warnings WARNINGS
-\refitem cfg_warn_format WARN_FORMAT
-\refitem cfg_warn_if_doc_error WARN_IF_DOC_ERROR
-\refitem cfg_warn_if_undocumented WARN_IF_UNDOCUMENTED
-\refitem cfg_warn_logfile WARN_LOGFILE
-\refitem cfg_warn_no_paramdoc WARN_NO_PARAMDOC
-\refitem cfg_xml_dtd XML_DTD
-\refitem cfg_xml_output XML_OUTPUT
-\refitem cfg_xml_programlisting XML_PROGRAMLISTING
-\refitem cfg_xml_schema XML_SCHEMA
-\endsecreflist
-\section config_project Project related configuration options
- \anchor cfg_doxyfile_encoding
-<dl>
-
-<dt>\c DOXYFILE_ENCODING <dd>
- \addindex DOXYFILE_ENCODING
- This tag specifies the encoding used for all characters in the config file that 
- follow. The default is UTF-8 which is also the encoding used for all text before
- the first occurrence of this tag. Doxygen uses \c libiconv (or the iconv built into
- \c libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of
- possible encodings.
-
-The default value is: <code>UTF-8</code>.
-
- \anchor cfg_project_name
-<dt>\c PROJECT_NAME <dd>
- \addindex PROJECT_NAME
- The \c PROJECT_NAME tag is a single word (or a sequence of words
- surrounded by double-quotes, unless you are using Doxywizard) that should identify the project for which the 
- documentation is generated. This name is used in the title of most 
- generated pages and in a few other places.
-
-The default value is: <code>My Project</code>.
-
- \anchor cfg_project_number
-<dt>\c PROJECT_NUMBER <dd>
- \addindex PROJECT_NUMBER
- The \c PROJECT_NUMBER tag can be used to enter a project or revision number.
- This could be handy for archiving the generated documentation or
- if some version control system is used.
-
- \anchor cfg_project_brief
-<dt>\c PROJECT_BRIEF <dd>
- \addindex PROJECT_BRIEF
- Using the \c PROJECT_BRIEF tag one can provide an optional one line description 
- for a project that appears at the top of each page and should give viewer 
- a quick idea about the purpose of the project. Keep the description short.
-
- \anchor cfg_project_logo
-<dt>\c PROJECT_LOGO <dd>
- \addindex PROJECT_LOGO
- With the \c PROJECT_LOGO tag one can specify an logo or icon that is 
- included in the documentation. The maximum height of the logo should not 
- exceed 55 pixels and the maximum width should not exceed 200 pixels. 
- Doxygen will copy the logo to the output directory.
-
- \anchor cfg_output_directory
-<dt>\c OUTPUT_DIRECTORY <dd>
- \addindex OUTPUT_DIRECTORY
- The \c OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
- path into which the generated documentation will be written. 
- If a relative path is entered, it will be relative to the location 
- where doxygen was started. If left blank the current directory will be used.
-
- \anchor cfg_create_subdirs
-<dt>\c CREATE_SUBDIRS <dd>
- \addindex CREATE_SUBDIRS
- If the \c CREATE_SUBDIRS tag is set to \c YES, then doxygen will create
- 4096 sub-directories (in 2 levels) under the output directory of each output 
- format and will distribute the generated files over these directories. 
- Enabling this option can be useful when feeding doxygen a huge amount of source
- files, where putting all generated files in the same directory would otherwise
- causes performance problems for the file system.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_output_language
-<dt>\c OUTPUT_LANGUAGE <dd>
- \addindex OUTPUT_LANGUAGE
- The \c OUTPUT_LANGUAGE tag is used to specify the language in which all
- documentation generated by doxygen is written. Doxygen will use this
- information to generate all constant output in the proper language.
-
-Possible values are: 
-<code>Afrikaans</code>, 
-<code>Arabic</code>, 
-<code>Armenian</code>, 
-<code>Brazilian</code>, 
-<code>Catalan</code>, 
-<code>Chinese</code>, 
-<code>Chinese-Traditional</code>, 
-<code>Croatian</code>, 
-<code>Czech</code>, 
-<code>Danish</code>, 
-<code>Dutch</code>, 
-<code>English</code> (United States), 
-<code>Esperanto</code>, 
-<code>Farsi</code> (Persian), 
-<code>Finnish</code>, 
-<code>French</code>, 
-<code>German</code>, 
-<code>Greek</code>, 
-<code>Hungarian</code>, 
-<code>Indonesian</code>, 
-<code>Italian</code>, 
-<code>Japanese</code>, 
-<code>Japanese-en</code> (Japanese with English messages), 
-<code>Korean</code>, 
-<code>Korean-en</code> (Korean with English messages), 
-<code>Latvian</code>, 
-<code>Lithuanian</code>, 
-<code>Macedonian</code>, 
-<code>Norwegian</code>, 
-<code>Persian</code> (Farsi), 
-<code>Polish</code>, 
-<code>Portuguese</code>, 
-<code>Romanian</code>, 
-<code>Russian</code>, 
-<code>Serbian</code>, 
-<code>Serbian-Cyrillic</code>, 
-<code>Slovak</code>, 
-<code>Slovene</code>, 
-<code>Spanish</code>, 
-<code>Swedish</code>, 
-<code>Turkish</code>, 
-<code>Ukrainian</code> and 
-<code>Vietnamese</code>.
-
-
-The default value is: <code>English</code>.
-
- \anchor cfg_brief_member_desc
-<dt>\c BRIEF_MEMBER_DESC <dd>
- \addindex BRIEF_MEMBER_DESC
- If the \c BRIEF_MEMBER_DESC tag is set to \c YES doxygen will
- include brief member descriptions after the members that are listed in
- the file and class documentation (similar to \c Javadoc).
- Set to \c NO to disable this.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_repeat_brief
-<dt>\c REPEAT_BRIEF <dd>
- \addindex REPEAT_BRIEF
- If the \c REPEAT_BRIEF tag is set to \c YES doxygen will 
- prepend the brief description of a member or function before the detailed 
- description 
- <br>Note: 
- If both \ref cfg_hide_undoc_members "HIDE_UNDOC_MEMBERS" and
- \ref cfg_brief_member_desc "BRIEF_MEMBER_DESC" are set to \c NO, the 
- brief descriptions will be completely suppressed.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_abbreviate_brief
-<dt>\c ABBREVIATE_BRIEF <dd>
- \addindex ABBREVIATE_BRIEF
- This tag implements a quasi-intelligent brief description abbreviator
- that is used to form the text in various listings. Each string
- in this list, if found as the leading text of the brief description, will be
- stripped from the text and the result, after processing the whole list, is used
- as the annotated text. Otherwise, the brief description is used as-is. If left
- blank, the following values are used (`$name` is automatically replaced with the
- name of the entity):
-<code>The $name class</code>, 
-<code>The $name widget</code>, 
-<code>The $name file</code>, 
-<code>is</code>, 
-<code>provides</code>, 
-<code>specifies</code>, 
-<code>contains</code>, 
-<code>represents</code>, 
-<code>a</code>, 
-<code>an</code> and 
-<code>the</code>.
-
- \anchor cfg_always_detailed_sec
-<dt>\c ALWAYS_DETAILED_SEC <dd>
- \addindex ALWAYS_DETAILED_SEC
- If the \c ALWAYS_DETAILED_SEC and \ref cfg_repeat_brief "REPEAT_BRIEF" tags 
- are both set to \c YES then
- doxygen will generate a detailed section even if there is only a brief
- description.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_inline_inherited_memb
-<dt>\c INLINE_INHERITED_MEMB <dd>
- \addindex INLINE_INHERITED_MEMB
- If the \c INLINE_INHERITED_MEMB tag is set to \c YES, doxygen will show all inherited
- members of a class in the documentation of that class as if those members were
- ordinary class members. Constructors, destructors and assignment operators of
- the base classes will not be shown.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_full_path_names
-<dt>\c FULL_PATH_NAMES <dd>
- \addindex FULL_PATH_NAMES
- If the \c FULL_PATH_NAMES tag is set to \c YES doxygen will prepend the full
- path before files name in the file list and in the header files. If set
- to \c NO the shortest path that makes the file name unique will be used
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_strip_from_path
-<dt>\c STRIP_FROM_PATH <dd>
- \addindex STRIP_FROM_PATH
- The \c STRIP_FROM_PATH tag
- can be used to strip a user-defined part of the path. Stripping is
- only done if one of the specified strings matches the left-hand part of the 
- path. The tag can be used to show relative paths in the file list.
- If left blank the directory from which doxygen is run is used as the
- path to strip.
- <br>Note that you can specify absolute paths here, but also 
- relative paths, which will be relative from the directory where doxygen is 
- started.
-
-
-This tag requires that the tag \ref cfg_full_path_names "FULL_PATH_NAMES" is set to \c YES.
- \anchor cfg_strip_from_inc_path
-<dt>\c STRIP_FROM_INC_PATH <dd>
- \addindex STRIP_FROM_INC_PATH
- The \c STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
- the path mentioned in the documentation of a class, which tells
- the reader which header file to include in order to use a class. 
- If left blank only the name of the header file containing the class
- definition is used. Otherwise one should specify the list of include paths that 
- are normally passed to the compiler using the `-I` flag.
-
- \anchor cfg_short_names
-<dt>\c SHORT_NAMES <dd>
- \addindex SHORT_NAMES
- If the \c SHORT_NAMES tag is set to \c YES, doxygen will generate much shorter
- (but less readable) file names. This can be useful is your file systems
- doesn't support long names like on DOS, Mac, or CD-ROM.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_javadoc_autobrief
-<dt>\c JAVADOC_AUTOBRIEF <dd>
- \addindex JAVADOC_AUTOBRIEF
-  If the \c JAVADOC_AUTOBRIEF tag is set to \c YES then doxygen
-  will interpret the first line (until the first dot) of a Javadoc-style
-  comment as the brief description. If set to \c NO, the 
-  Javadoc-style will behave just like regular Qt-style comments
-  (thus requiring an explicit \ref cmdbrief "\@brief" command for a brief description.)
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_qt_autobrief
-<dt>\c QT_AUTOBRIEF <dd>
- \addindex QT_AUTOBRIEF
-  If the \c QT_AUTOBRIEF tag is set to \c YES then doxygen
-  will interpret the first line (until the first dot) of a Qt-style
-  comment as the brief description. If set to \c NO, the
-  Qt-style will behave just like regular Qt-style comments (thus
-  requiring an explicit \ref cmdbrief "\\brief" command for a brief description.)
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_multiline_cpp_is_brief
-<dt>\c MULTILINE_CPP_IS_BRIEF <dd>
- \addindex MULTILINE_CPP_IS_BRIEF
-  The \c MULTILINE_CPP_IS_BRIEF tag can be set to \c YES to make doxygen
-  treat a multi-line C++ special comment block (i.e. a block of \c //! or \c ///
-  comments) as a brief description. This used to be the default behavior.
-  The new default is to treat a multi-line C++ comment block as a detailed
-  description. Set this tag to \c YES if you prefer the old behavior instead.
-  <br>Note that setting this tag to \c YES also means that rational rose comments
-  are not recognized any more.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_inherit_docs
-<dt>\c INHERIT_DOCS <dd>
- \addindex INHERIT_DOCS
- If the \c INHERIT_DOCS tag is set to \c YES then an undocumented
- member inherits the documentation from any documented member that it
- re-implements.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_separate_member_pages
-<dt>\c SEPARATE_MEMBER_PAGES <dd>
- \addindex SEPARATE_MEMBER_PAGES
- If the \c SEPARATE_MEMBER_PAGES tag is set to \c YES, then doxygen will produce
- a new page for each member. If set to \c NO, the documentation of a member will
- be part of the file/class/namespace that contains it.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_tab_size
-<dt>\c TAB_SIZE <dd>
- \addindex TAB_SIZE
- The \c TAB_SIZE tag can be used to set the number of spaces in a tab.
- Doxygen uses this value to replace tabs by spaces in code fragments.
-
-
- Minimum value: <code>1</code>, maximum value: <code>16</code>, default value: <code>4</code>.
-
- \anchor cfg_aliases
-<dt>\c ALIASES <dd>
- \addindex ALIASES
- This tag can be used to specify a number of aliases that act
- as commands in the documentation. An alias has the form: 
-\verbatim
- name=value
-\endverbatim
- For example adding 
-\verbatim
- "sideeffect=@par Side Effects:\n" 
-\endverbatim
- will allow you to
- put the command \c \\sideeffect (or \c \@sideeffect) in the documentation, which 
- will result in a user-defined paragraph with heading "Side Effects:".
- You can put \ref cmdn "\\n"'s in the value part of an alias to insert newlines.
-
- \anchor cfg_tcl_subst
-<dt>\c TCL_SUBST <dd>
- \addindex TCL_SUBST
- This tag can be used to specify a number of word-keyword mappings (TCL only). 
- A mapping has the form <code>"name=value"</code>. For example adding 
- <code>"class=itcl::class"</code> will allow you to use the command class in the 
- <code>itcl::class</code> meaning.
-
- \anchor cfg_optimize_output_for_c
-<dt>\c OPTIMIZE_OUTPUT_FOR_C <dd>
- \addindex OPTIMIZE_OUTPUT_FOR_C
- Set the \c OPTIMIZE_OUTPUT_FOR_C tag to \c YES if your project consists 
- of C sources only. Doxygen will then generate output that is more tailored 
- for C. For instance, some of the names that are used will be different. 
- The list of all members will be omitted, etc.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_optimize_output_java
-<dt>\c OPTIMIZE_OUTPUT_JAVA <dd>
- \addindex OPTIMIZE_OUTPUT_JAVA
- Set the \c OPTIMIZE_OUTPUT_JAVA tag to \c YES if your project consists of Java or
- Python sources only. Doxygen will then generate output that is more tailored 
- for that language. For instance, namespaces will be presented as packages, 
- qualified scopes will look different, etc.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_optimize_for_fortran
-<dt>\c OPTIMIZE_FOR_FORTRAN <dd>
- \addindex OPTIMIZE_FOR_FORTRAN
- Set the \c OPTIMIZE_FOR_FORTRAN tag to \c YES if your project consists of Fortran 
- sources. Doxygen will then generate output that is tailored for Fortran.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_optimize_output_vhdl
-<dt>\c OPTIMIZE_OUTPUT_VHDL <dd>
- \addindex OPTIMIZE_OUTPUT_VHDL
- Set the \c OPTIMIZE_OUTPUT_VHDL tag to \c YES if your project consists of VHDL 
- sources. Doxygen will then generate output that is tailored for VHDL.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_extension_mapping
-<dt>\c EXTENSION_MAPPING <dd>
- \addindex EXTENSION_MAPPING
- Doxygen selects the parser to use depending on the extension of the files it parses.
- With this tag you can assign which parser to use for a given extension.
- Doxygen has a built-in mapping, but you can override or extend it using this tag.
- The format is <code>ext=language</code>, where \c 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
- <code>.inc</code> files as Fortran files (default is PHP), and <code>.f</code> files as C (default is Fortran),
- use: `inc=Fortran f=C`.
-
- <br>Note For files without extension you can use `no_extension` as a placeholder.
- <br>Note that for custom extensions you also need to set \ref cfg_file_patterns "FILE_PATTERNS" otherwise the 
- files are not read by doxygen.
-
- \anchor cfg_markdown_support
-<dt>\c MARKDOWN_SUPPORT <dd>
- \addindex MARKDOWN_SUPPORT
- If the \c MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all 
- comments according to the Markdown format, which allows for more readable 
- documentation. See http://daringfireball.net/projects/markdown/ for details. 
- The output of markdown processing is further processed by doxygen, so you 
- can mix doxygen, HTML, and XML commands with Markdown formatting. 
- Disable only in case of backward compatibilities issues.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_autolink_support
-<dt>\c AUTOLINK_SUPPORT <dd>
- \addindex AUTOLINK_SUPPORT
- When enabled doxygen tries to link words that correspond to documented classes, 
- or namespaces to their corresponding documentation. Such a link can be 
- prevented in individual cases by by putting a \c % sign in front of the word or 
- globally by setting \c AUTOLINK_SUPPORT to \c NO.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_builtin_stl_support
-<dt>\c BUILTIN_STL_SUPPORT <dd>
- \addindex BUILTIN_STL_SUPPORT
- If you use STL classes (i.e. `std::string`, `std::vector`, etc.) but do not want to
- include (a tag file for) the STL sources as input, then you should
- set this tag to \c YES in order to let doxygen match functions declarations and
- definitions whose arguments contain STL classes (e.g. `func(std::string`); versus
- `func(std::string) {}`). This also make the inheritance and collaboration
- diagrams that involve STL classes more complete and accurate.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_cpp_cli_support
-<dt>\c CPP_CLI_SUPPORT <dd>
- \addindex CPP_CLI_SUPPORT
- If you use Microsoft's C++/CLI language, you should set this option to \c YES to
- enable parsing support.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_sip_support
-<dt>\c SIP_SUPPORT <dd>
- \addindex SIP_SUPPORT
- Set the \c SIP_SUPPORT tag to \c YES if your project consists 
- of <a href="http://www.riverbankcomputing.co.uk/software/sip/intro">sip</a> sources only. 
- Doxygen will parse them like normal C++ but will assume all classes use public 
- instead of private inheritance when no explicit protection keyword is present.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_idl_property_support
-<dt>\c IDL_PROPERTY_SUPPORT <dd>
- \addindex IDL_PROPERTY_SUPPORT
- For Microsoft's IDL there are \c propget and \c propput attributes to indicate getter
- and setter methods for a property. Setting this option to \c YES
- will make doxygen to replace the get and set methods by a property in the
- documentation. This will only work if the methods are indeed getting or 
- setting a simple type. If this is not the case, or you want to show the 
- methods anyway, you should set this option to \c NO.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_distribute_group_doc
-<dt>\c DISTRIBUTE_GROUP_DOC <dd>
- \addindex DISTRIBUTE_GROUP_DOC
- If member grouping is used in the documentation and the \c DISTRIBUTE_GROUP_DOC
- tag is set to \c YES, then doxygen will reuse the documentation of the first
- member in the group (if any) for the other members of the group. By default
- all members of a group must be documented explicitly.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_subgrouping
-<dt>\c SUBGROUPING <dd>
- \addindex SUBGROUPING
- Set the \c SUBGROUPING tag to \c YES to allow class member groups of
- the same type (for instance a group of public functions) to be put as a
- subgroup of that type (e.g. under the Public Functions section). Set it to
- \c NO to prevent subgrouping. Alternatively, this can be done per class using
- the \ref cmdnosubgrouping "\\nosubgrouping" command.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_inline_grouped_classes
-<dt>\c INLINE_GROUPED_CLASSES <dd>
- \addindex INLINE_GROUPED_CLASSES
- When the \c INLINE_GROUPED_CLASSES tag is set to \c YES, classes, structs and 
- unions are shown inside the group in which they are included 
- (e.g. using \ref cmdingroup "\\ingroup") instead of on a separate page (for HTML and Man pages) 
- or section (for \f$\mbox{\LaTeX}\f$ and RTF).
- <br>Note that this feature does not work in
- combination with \ref cfg_separate_member_pages "SEPARATE_MEMBER_PAGES".
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_inline_simple_structs
-<dt>\c INLINE_SIMPLE_STRUCTS <dd>
- \addindex INLINE_SIMPLE_STRUCTS
- When the \c INLINE_SIMPLE_STRUCTS tag is set to \c YES, structs, classes, and 
- unions with only public data fields or simple typedef fields will be shown 
- inline in the documentation of the scope in which they are defined (i.e. file, 
- namespace, or group documentation), provided this scope is documented. If set 
- to \c NO, structs, classes, and unions are shown on a separate 
- page (for HTML and Man pages) or section (for \f$\mbox{\LaTeX}\f$ and RTF).
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_typedef_hides_struct
-<dt>\c TYPEDEF_HIDES_STRUCT <dd>
- \addindex TYPEDEF_HIDES_STRUCT
- When \c TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or enum
- is documented as struct, union, or enum with the name of the typedef. So 
- <code>typedef struct TypeS {} TypeT</code>, will appear in the documentation as a struct 
- with name \c TypeT. When disabled the typedef will appear as a member of a file, 
- namespace, or class. And the struct will be named \c TypeS. This can typically 
- be useful for C code in case the coding convention dictates that all compound 
- types are typedef'ed and only the typedef is referenced, never the tag name.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_lookup_cache_size
-<dt>\c LOOKUP_CACHE_SIZE <dd>
- \addindex LOOKUP_CACHE_SIZE
- The size of the symbol lookup cache can be 
- set using \c LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given 
- their name and scope. Since this can be an expensive process and often the 
- same symbol appears multiple times in the code, doxygen keeps a cache of 
- pre-resolved symbols. If the cache is too small doxygen will become slower. 
- If the cache is too large, memory is wasted. The cache size is given by this 
- formula: \f$2^{(16+\mbox{LOOKUP\_CACHE\_SIZE})}\f$. The valid range is 0..9, the default is 0, 
- corresponding to a cache size of \f$2^{16} = 65536\f$ symbols. 
- At the end of a run doxygen will report the cache usage and suggest the
- optimal cache size from a speed point of view.
-
-
- Minimum value: <code>0</code>, maximum value: <code>9</code>, default value: <code>0</code>.
-
-</dl>
-\section config_build Build related configuration options
- \anchor cfg_extract_all
-<dl>
-
-<dt>\c EXTRACT_ALL <dd>
- \addindex EXTRACT_ALL
- If the \c EXTRACT_ALL tag is set to \c YES doxygen will assume all 
- entities in documentation are documented, even if no documentation was 
- available. Private class members and static file members will be hidden 
- unless the \ref cfg_extract_private "EXTRACT_PRIVATE" respectively 
- \ref cfg_extract_static "EXTRACT_STATIC" tags are set to \c YES.
-
- \note This will also disable the warnings about undocumented members 
- that are normally produced when \ref cfg_warnings "WARNINGS" is 
- set to \c YES.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_extract_private
-<dt>\c EXTRACT_PRIVATE <dd>
- \addindex EXTRACT_PRIVATE
- If the \c EXTRACT_PRIVATE tag is set to \c YES all private members of a 
- class will be included in the documentation.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_extract_package
-<dt>\c EXTRACT_PACKAGE <dd>
- \addindex EXTRACT_PACKAGE
- If the \c EXTRACT_PACKAGE tag is set to \c YES all members with package 
- or internal scope will be included in the documentation.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_extract_static
-<dt>\c EXTRACT_STATIC <dd>
- \addindex EXTRACT_STATIC
- If the \c EXTRACT_STATIC tag is set to \c YES all static members of a file
- will be included in the documentation.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_extract_local_classes
-<dt>\c EXTRACT_LOCAL_CLASSES <dd>
- \addindex EXTRACT_LOCAL_CLASSES
- If the \c EXTRACT_LOCAL_CLASSES tag is set to \c YES classes (and structs) 
- defined locally in source files will be included in the documentation. 
- If set to \c NO only classes defined in header files are included. Does not
- have any effect for Java sources.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_extract_local_methods
-<dt>\c EXTRACT_LOCAL_METHODS <dd>
- \addindex EXTRACT_LOCAL_METHODS
- This flag is only useful for Objective-C code. When set to \c YES local 
- methods, which are defined in the implementation section but not in
- the interface are included in the documentation.
- If set to \c NO only methods in the interface are included.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_extract_anon_nspaces
-<dt>\c EXTRACT_ANON_NSPACES <dd>
- \addindex EXTRACT_ANON_NSPACES
- If this flag is set to \c YES, the members of anonymous namespaces will be extracted
- and appear in the documentation as a namespace called 'anonymous_namespace{file}',
- where file will be replaced with the base name of the file that contains the anonymous
- namespace. By default anonymous namespace are hidden.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_hide_undoc_members
-<dt>\c HIDE_UNDOC_MEMBERS <dd>
- \addindex HIDE_UNDOC_MEMBERS
- If the \c HIDE_UNDOC_MEMBERS tag is set to \c YES, doxygen will hide all
- undocumented members inside documented classes or files. 
- If set to \c NO these members will be included in the
- various overviews, but no documentation section is generated.
- This option has no effect if \ref cfg_extract_all "EXTRACT_ALL" is enabled.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_hide_undoc_classes
-<dt>\c HIDE_UNDOC_CLASSES <dd>
- \addindex HIDE_UNDOC_CLASSES
- If the \c HIDE_UNDOC_CLASSES tag is set to \c YES, doxygen will hide all
- undocumented classes that are normally visible in the class hierarchy. 
- If set to \c NO these classes will be included in the
- various overviews.
- This option has no effect if \ref cfg_extract_all "EXTRACT_ALL" is enabled.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_hide_friend_compounds
-<dt>\c HIDE_FRIEND_COMPOUNDS <dd>
- \addindex HIDE_FRIEND_COMPOUNDS
- If the \c HIDE_FRIEND_COMPOUNDS tag is set to \c YES, doxygen will hide all
- friend (class|struct|union) declarations.
- If set to \c NO these declarations will be included in the
- documentation.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_hide_in_body_docs
-<dt>\c HIDE_IN_BODY_DOCS <dd>
- \addindex HIDE_IN_BODY_DOCS
- If the \c HIDE_IN_BODY_DOCS tag is set to \c YES, doxygen will hide any 
- documentation blocks found inside the body of a function.
- If set to \c NO these blocks will be appended to the 
- function's detailed documentation block.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_internal_docs
-<dt>\c INTERNAL_DOCS <dd>
- \addindex INTERNAL_DOCS
- The \c INTERNAL_DOCS tag determines if documentation
- that is typed after a \ref cmdinternal "\\internal" command is included. If the tag is set
- to \c NO then the documentation will be excluded.
- Set it to \c YES to include the internal documentation.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_case_sense_names
-<dt>\c CASE_SENSE_NAMES <dd>
- \addindex CASE_SENSE_NAMES
- If the \c CASE_SENSE_NAMES tag is set to \c NO then doxygen
- will only generate file names in lower-case letters. If set to
- \c YES upper-case letters are also allowed. This is useful if you have
- classes or files whose names only differ in case and if your file system
- supports case sensitive file names. Windows and Mac users are advised to set this
- option to \c NO.
-
-
-The default value is: system dependent.
-
- \anchor cfg_hide_scope_names
-<dt>\c HIDE_SCOPE_NAMES <dd>
- \addindex HIDE_SCOPE_NAMES
- If the \c HIDE_SCOPE_NAMES tag is set to \c NO then doxygen 
- will show members with their full class and namespace scopes in the
- documentation. If set to \c YES the scope will be hidden.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_show_include_files
-<dt>\c SHOW_INCLUDE_FILES <dd>
- \addindex SHOW_INCLUDE_FILES
- If the \c SHOW_INCLUDE_FILES tag is set to \c YES then doxygen
- will put a list of the files that are included by a file in the documentation 
- of that file.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_show_grouped_memb_inc
-<dt>\c SHOW_GROUPED_MEMB_INC <dd>
- \addindex SHOW_GROUPED_MEMB_INC
- If the SHOW_GROUPED_MEMB_INC tag is set to \c YES then Doxygen 
- will add for each grouped member an include statement to the documentation,
- telling the reader which file to include in order to use the member.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_force_local_includes
-<dt>\c FORCE_LOCAL_INCLUDES <dd>
- \addindex FORCE_LOCAL_INCLUDES
- If the \c FORCE_LOCAL_INCLUDES tag is set to \c YES then doxygen 
- will list include files with double quotes in the documentation 
- rather than with sharp brackets.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_inline_info
-<dt>\c INLINE_INFO <dd>
- \addindex INLINE_INFO
- If the \c INLINE_INFO tag is set to \c YES then a tag [inline]
- is inserted in the documentation for inline members.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_sort_member_docs
-<dt>\c SORT_MEMBER_DOCS <dd>
- \addindex SORT_MEMBER_DOCS
- If the \c SORT_MEMBER_DOCS tag is set to \c YES then doxygen
- will sort the (detailed) documentation of file and class members
- alphabetically by member name. If set to \c NO the members will appear in
- declaration order.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_sort_brief_docs
-<dt>\c SORT_BRIEF_DOCS <dd>
- \addindex SORT_BRIEF_DOCS
- If the \c SORT_BRIEF_DOCS tag is set to \c YES then doxygen will sort the
- brief descriptions of file, namespace and class members alphabetically
- by member name. If set to \c NO the members will appear in
- declaration order. Note that this will also influence the order of the
- classes in the class list.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_sort_members_ctors_1st
-<dt>\c SORT_MEMBERS_CTORS_1ST <dd>
- \addindex SORT_MEMBERS_CTORS_1ST
- If the \c SORT_MEMBERS_CTORS_1ST tag is set to \c YES then doxygen
- will sort the (brief and detailed) documentation of class members so that
- constructors and destructors are listed first. If set to \c NO
- the constructors will appear in the respective orders defined by
- \ref cfg_sort_brief_docs "SORT_BRIEF_DOCS" and \ref cfg_sort_member_docs "SORT_MEMBER_DOCS".
- \note If \ref cfg_sort_brief_docs "SORT_BRIEF_DOCS" is set to \c NO this option is ignored for
-       sorting brief member documentation.
- \note If \ref cfg_sort_member_docs "SORT_MEMBER_DOCS" is set to \c NO this option is ignored for
-       sorting detailed member documentation.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_sort_group_names
-<dt>\c SORT_GROUP_NAMES <dd>
- \addindex SORT_GROUP_NAMES
- If the \c SORT_GROUP_NAMES tag is set to \c YES then doxygen will sort the 
- hierarchy of group names into alphabetical order. If set to \c NO
- the group names will appear in their defined order.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_sort_by_scope_name
-<dt>\c SORT_BY_SCOPE_NAME <dd>
- \addindex SORT_BY_SCOPE_NAME
- If the \c SORT_BY_SCOPE_NAME tag is set to \c YES, the class list will be
- sorted by fully-qualified names, including namespaces. If set to
- \c NO, the class list will be sorted only by class name,
- not including the namespace part.
- \note This option is not very useful if \ref cfg_hide_scope_names "HIDE_SCOPE_NAMES" is set to \c YES.
- \note This option applies only to the class list, not to the 
-       alphabetical list.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_strict_proto_matching
-<dt>\c STRICT_PROTO_MATCHING <dd>
- \addindex STRICT_PROTO_MATCHING
- If the \c STRICT_PROTO_MATCHING option is enabled and doxygen fails to
- do proper type resolution of all parameters of a function it will reject a  
- match between the prototype and the implementation of a member function even
- if there is only one candidate or it is obvious which candidate to choose
- by doing a simple string match. By disabling \c STRICT_PROTO_MATCHING doxygen 
- will still accept a match between prototype and implementation in such cases.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_generate_todolist
-<dt>\c GENERATE_TODOLIST <dd>
- \addindex GENERATE_TODOLIST
- The \c GENERATE_TODOLIST tag can be used to enable (\c YES) or
- disable (\c NO) the todo list. This list is created by 
- putting \ref cmdtodo "\\todo" commands in the documentation.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_generate_testlist
-<dt>\c GENERATE_TESTLIST <dd>
- \addindex GENERATE_TESTLIST
- The \c GENERATE_TESTLIST tag can be used to enable (\c YES) or
- disable (\c NO) the test list. This list is created by 
- putting \ref cmdtest "\\test" commands in the documentation.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_generate_buglist
-<dt>\c GENERATE_BUGLIST <dd>
- \addindex GENERATE_BUGLIST
- The \c GENERATE_BUGLIST tag can be used to enable (\c YES) or
- disable (\c NO) the bug list. This list is created by 
- putting \ref cmdbug "\\bug" commands in the documentation.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_generate_deprecatedlist
-<dt>\c GENERATE_DEPRECATEDLIST <dd>
- \addindex GENERATE_DEPRECATEDLIST
- The \c GENERATE_DEPRECATEDLIST tag can be used to enable (\c YES) or
- disable (\c NO) the deprecated list. This list is created by 
- putting \ref cmddeprecated "\\deprecated"
- commands in the documentation.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_enabled_sections
-<dt>\c ENABLED_SECTIONS <dd>
- \addindex ENABLED_SECTIONS
- The \c ENABLED_SECTIONS tag can be used to enable conditional
- documentation sections, marked by \ref cmdif "\\if" \<section_label\> ... 
- \ref cmdendif "\\endif" and \ref cmdcond "\\cond" \<section_label\> ...
- \ref cmdendcond "\\endcond" blocks.
-
- \anchor cfg_max_initializer_lines
-<dt>\c MAX_INITIALIZER_LINES <dd>
- \addindex MAX_INITIALIZER_LINES
- The \c MAX_INITIALIZER_LINES tag determines the maximum number of lines
- that the initial value of a variable or macro / define can have for it to appear in
- the documentation. If the initializer
- consists of more lines than specified here it will be hidden. Use a value
- of 0 to hide initializers completely. The appearance of the value of
- individual variables and macros / defines can be controlled using \ref cmdshowinitializer "\\showinitializer"
- or \ref cmdhideinitializer "\\hideinitializer" command in the documentation regardless of this setting.
-
-
- Minimum value: <code>0</code>, maximum value: <code>10000</code>, default value: <code>30</code>.
-
- \anchor cfg_show_used_files
-<dt>\c SHOW_USED_FILES <dd>
- \addindex SHOW_USED_FILES
- Set the \c SHOW_USED_FILES tag to \c NO to disable the list of files generated
- at the bottom of the documentation of classes and structs. If set to \c YES the
- list will mention the files that were used to generate the documentation.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_show_files
-<dt>\c SHOW_FILES <dd>
- \addindex SHOW_FILES
- Set the \c SHOW_FILES tag to \c NO to disable the generation of the Files page.
- This will remove the Files entry from the Quick Index and from the
- Folder Tree View (if specified).
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_show_namespaces
-<dt>\c SHOW_NAMESPACES <dd>
- \addindex SHOW_NAMESPACES
- Set the \c SHOW_NAMESPACES tag to \c NO to disable the generation of the
- Namespaces page. This will remove the Namespaces entry from the Quick Index
- and from the Folder Tree View (if specified).
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_file_version_filter
-<dt>\c FILE_VERSION_FILTER <dd>
- \addindex FILE_VERSION_FILTER
- The \c FILE_VERSION_FILTER tag can be used to specify a program or script that
- doxygen should invoke to get the current version for each file (typically from the
- version control system). Doxygen will invoke the program by executing (via
- <code>popen()</code>) the command <code>command input-file</code>, where \c command is 
- the value of the \c FILE_VERSION_FILTER tag, and \c input-file is the name 
- of an input file provided by doxygen. 
- Whatever the program writes to standard output is used as the file version.Example of using a shell script as a filter for Unix:
-\verbatim
- FILE_VERSION_FILTER = "/bin/sh versionfilter.sh"
-\endverbatim
-<br>
-Example shell script for CVS:
-\verbatim
-#!/bin/sh
-cvs status $1 | sed -n 's/^[ \]*Working revision:[ \t]*\([0-9][0-9\.]*\).*/\1/p'
-\endverbatim 
-<br> 
-Example shell script for Subversion:
-\verbatim
-#!/bin/sh
-svn stat -v $1 | sed -n 's/^[ A-Z?\*|!]\{1,15\}/r/;s/ \{1,15\}/\/r/;s/ .*//p'
-\endverbatim
-<br>
-Example filter for ClearCase:
-\verbatim
-FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
-\endverbatim
-
- \anchor cfg_layout_file
-<dt>\c LAYOUT_FILE <dd>
- \addindex LAYOUT_FILE
- The \c LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
- doxygen. The layout file controls the global structure of the generated output files
- in an output format independent way. To create the layout file that represents
- doxygen's defaults, run doxygen with the `-l` option. You can optionally specify a
- file name after the option, if omitted \c DoxygenLayout.xml will be used as the name
- of the layout file.
- <br>Note that if you run doxygen from a directory containing 
- a file called \c DoxygenLayout.xml, doxygen will parse it automatically even if 
- the \c LAYOUT_FILE tag is left empty.
-
- \anchor cfg_cite_bib_files
-<dt>\c CITE_BIB_FILES <dd>
- \addindex CITE_BIB_FILES
- The \c CITE_BIB_FILES tag can be used to specify one or more \c bib files 
- containing the reference definitions. This must be a list of <code>.bib</code> files. The 
- <code>.bib</code> extension is automatically appended if omitted. This requires the 
- \c bibtex tool to be installed. See also http://en.wikipedia.org/wiki/BibTeX for
- more info. For \f$\mbox{\LaTeX}\f$ the style of the bibliography can be controlled 
- using \ref cfg_latex_bib_style "LATEX_BIB_STYLE".
- To use this 
- feature you need \c bibtex and \c perl available in the search path. Do not use 
- file names with spaces, \c bibtex cannot handle them.
- See also \ref cmdcite "\\cite" for info how to create references.
-
-</dl>
-\section config_messages Configuration options related to warning and progress messages
- \anchor cfg_quiet
-<dl>
-
-<dt>\c QUIET <dd>
- \addindex QUIET
- The \c QUIET tag can be used to turn on/off the messages that are generated
- to standard output by doxygen. If \c QUIET is set to \c YES this implies that the messages are off.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_warnings
-<dt>\c WARNINGS <dd>
- \addindex WARNINGS
- The \c WARNINGS tag can be used to turn on/off the warning messages that are
- generated to standard error (\c stderr) by doxygen. If \c WARNINGS is set to 
- \c YES this implies that the warnings are on.
-<br>
- \b Tip: Turn warnings on while writing the documentation.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_warn_if_undocumented
-<dt>\c WARN_IF_UNDOCUMENTED <dd>
- \addindex WARN_IF_UNDOCUMENTED
- If the \c WARN_IF_UNDOCUMENTED tag is set to \c YES, then doxygen will generate warnings
- for undocumented members. If \ref cfg_extract_all "EXTRACT_ALL" is set to \c YES then this flag will
- automatically be disabled.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_warn_if_doc_error
-<dt>\c WARN_IF_DOC_ERROR <dd>
- \addindex WARN_IF_DOC_ERROR
- If the \c WARN_IF_DOC_ERROR tag is set to \c YES, doxygen will generate warnings for
- potential errors in the documentation, such as not documenting some
- parameters in a documented function, or documenting parameters that
- don't exist or using markup commands wrongly.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_warn_no_paramdoc
-<dt>\c WARN_NO_PARAMDOC <dd>
- \addindex WARN_NO_PARAMDOC
- This \c WARN_NO_PARAMDOC option can be enabled to get warnings for 
- functions that are documented, but have no documentation for their parameters
- or return value. If set to \c NO doxygen will only warn about
- wrong or incomplete parameter documentation, but not about the absence of
- documentation.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_warn_format
-<dt>\c WARN_FORMAT <dd>
- \addindex WARN_FORMAT
- The \c WARN_FORMAT tag determines the format of the warning messages that
- doxygen can produce. The string should contain the <code>\$file</code>, 
- <code>\$line</code>, and <code>\$text</code> 
- tags, which will be replaced by the file and line number from which the
- warning originated and the warning text.
- Optionally the format may contain 
- <code>$version</code>, which will be replaced by the version of the file (if it could 
- be obtained via \ref cfg_file_version_filter "FILE_VERSION_FILTER")
-
-The default value is: <code>$file:$line: $text</code>.
-
- \anchor cfg_warn_logfile
-<dt>\c WARN_LOGFILE <dd>
- \addindex WARN_LOGFILE
- The \c WARN_LOGFILE tag can be used to specify a file to which warning
- and error messages should be written. If left blank the output is written 
- to standard error (`stderr`).
-
-</dl>
-\section config_input Configuration options related to the input files
- \anchor cfg_input
-<dl>
-
-<dt>\c INPUT <dd>
- \addindex INPUT
- The \c INPUT tag is used to specify the files and/or directories that contain 
- documented source files. You may enter file names like 
- \c myfile.cpp or directories like \c /usr/src/myproject. 
- Separate the files or directories with spaces.
-
- \note If this tag is empty the current directory is searched.
-
- \anchor cfg_input_encoding
-<dt>\c INPUT_ENCODING <dd>
- \addindex INPUT_ENCODING
- This tag can be used to specify the character encoding of the source files that 
- doxygen parses. Internally doxygen uses the UTF-8 encoding.
- Doxygen uses `libiconv` (or the `iconv` built into `libc`) for the transcoding. 
- See <a href="http://www.gnu.org/software/libiconv">the libiconv documentation</a> for 
- the list of possible encodings.
-
-The default value is: <code>UTF-8</code>.
-
- \anchor cfg_file_patterns
-<dt>\c FILE_PATTERNS <dd>
- \addindex FILE_PATTERNS
- If the value of the \ref cfg_input "INPUT" tag contains directories, you can use the 
- \c FILE_PATTERNS tag to specify one or more wildcard patterns 
- (like `*.cpp` and `*.h`) to filter out the source-files 
- in the directories. If left blank the following patterns are tested:
-<code>*.c</code>, 
-<code>*.cc</code>, 
-<code>*.cxx</code>, 
-<code>*.cpp</code>, 
-<code>*.c++</code>, 
-<code>*.java</code>, 
-<code>*.ii</code>, 
-<code>*.ixx</code>, 
-<code>*.ipp</code>, 
-<code>*.i++</code>, 
-<code>*.inl</code>, 
-<code>*.idl</code>, 
-<code>*.ddl</code>, 
-<code>*.odl</code>, 
-<code>*.h</code>, 
-<code>*.hh</code>, 
-<code>*.hxx</code>, 
-<code>*.hpp</code>, 
-<code>*.h++</code>, 
-<code>*.cs</code>, 
-<code>*.d</code>, 
-<code>*.php</code>, 
-<code>*.php4</code>, 
-<code>*.php5</code>, 
-<code>*.phtml</code>, 
-<code>*.inc</code>, 
-<code>*.m</code>, 
-<code>*.markdown</code>, 
-<code>*.md</code>, 
-<code>*.mm</code>, 
-<code>*.dox</code>, 
-<code>*.py</code>, 
-<code>*.f90</code>, 
-<code>*.f</code>, 
-<code>*.for</code>, 
-<code>*.tcl</code>, 
-<code>*.vhd</code>, 
-<code>*.vhdl</code>, 
-<code>*.ucf</code>, 
-<code>*.qsf</code>, 
-<code>*.as</code> and 
-<code>*.js</code>.
-
- \anchor cfg_recursive
-<dt>\c RECURSIVE <dd>
- \addindex RECURSIVE
- The \c RECURSIVE tag can be used to specify whether or not subdirectories
- should be searched for input files as well.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_exclude
-<dt>\c EXCLUDE <dd>
- \addindex EXCLUDE
- The \c EXCLUDE tag can be used to specify files and/or directories that should be
- excluded from the \ref cfg_input "INPUT" source files. This way you can easily exclude a
- subdirectory from a directory tree whose root is specified with the \ref cfg_input "INPUT" tag.
- <br>Note that relative paths are relative to the directory from which doxygen is run.
-
- \anchor cfg_exclude_symlinks
-<dt>\c EXCLUDE_SYMLINKS <dd>
- \addindex EXCLUDE_SYMLINKS
- The \c EXCLUDE_SYMLINKS tag can be used to select whether or not files or directories 
- that are symbolic links (a Unix file system feature) are excluded from the input.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_exclude_patterns
-<dt>\c EXCLUDE_PATTERNS <dd>
- \addindex EXCLUDE_PATTERNS
- If the value of the \ref cfg_input "INPUT" tag contains directories, you can use the
- \c EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
- certain files from those directories.
- <br>Note that the wildcards are matched 
- against the file with absolute path, so to exclude all test directories 
- for example use the pattern `*``/test/``*`
-
- \anchor cfg_exclude_symbols
-<dt>\c EXCLUDE_SYMBOLS <dd>
- \addindex EXCLUDE_SYMBOLS
- The \c EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
- (namespaces, classes, functions, etc.) that should be excluded from the 
- output. The symbol name can be a fully qualified name, a word, or if the 
- wildcard `*` is used, a substring. Examples: `ANamespace`, `AClass`, 
- `AClass::ANamespace`, `ANamespace::*Test` 
- <br>Note that the wildcards are matched against the file with absolute path, 
- so to exclude all test directories use the pattern 
- `*``/test/``*`
-
- \anchor cfg_example_path
-<dt>\c EXAMPLE_PATH <dd>
- \addindex EXAMPLE_PATH
- The \c EXAMPLE_PATH tag can be used to specify one or more files or
- directories that contain example code fragments that are included (see
- the \ref cmdinclude "\\include" command).
-
- \anchor cfg_example_patterns
-<dt>\c EXAMPLE_PATTERNS <dd>
- \addindex EXAMPLE_PATTERNS
- If the value of the \ref cfg_example_path "EXAMPLE_PATH" tag contains directories, 
- you can use the
- \c EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like `*.cpp`
- and `*.h`) to filter out the source-files in the directories. If left
- blank all files are included.
-
- \anchor cfg_example_recursive
-<dt>\c EXAMPLE_RECURSIVE <dd>
- \addindex EXAMPLE_RECURSIVE
- If the \c EXAMPLE_RECURSIVE tag is set to \c YES then subdirectories will be
- searched for input files to be used with the \ref cmdinclude "\\include" or
- \ref cmddontinclude "\\dontinclude" 
- commands irrespective of the value of the \ref cfg_recursive "RECURSIVE" tag.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_image_path
-<dt>\c IMAGE_PATH <dd>
- \addindex IMAGE_PATH
- The \c IMAGE_PATH tag can be used to specify one or more files or
- directories that contain images that are to be included in the 
- documentation (see the \ref cmdimage "\\image" command).
-
- \anchor cfg_input_filter
-<dt>\c INPUT_FILTER <dd>
- \addindex INPUT_FILTER
- The \c INPUT_FILTER tag can be used to specify a program that doxygen should
- invoke to filter for each input file. Doxygen will invoke the filter program
- by executing (via <code>popen()</code>) the command:
- <br>
-   <code>\<filter\> \<input-file\></code>
- <br>
- where <code>\<filter\></code>
- is the value of the \c INPUT_FILTER tag, and <code>\<input-file\></code> is the name of an
- input file. Doxygen will then use the output that the filter program writes
- to standard output.  If \ref cfg_filter_patterns "FILTER_PATTERNS" is specified, this tag will be ignored. 
- <br>Note that the filter must not add or remove lines; it is applied before the 
- code is scanned, but not when the output code is generated. If lines are added 
- or removed, the anchors will not be placed correctly.
-
- \anchor cfg_filter_patterns
-<dt>\c FILTER_PATTERNS <dd>
- \addindex FILTER_PATTERNS
- The \c FILTER_PATTERNS tag can be used to specify filters on a per file pattern
- basis. Doxygen will compare the file name with each pattern and apply the
- filter if there is a match. The filters are a list of the form:
- pattern=filter (like `*.cpp=my_cpp_filter`). See \ref cfg_input_filter "INPUT_FILTER" for further
- information on how filters are used. If the \c FILTER_PATTERNS tag is empty or if
- none of the patterns match the file name, \ref cfg_input_filter "INPUT_FILTER" is 
- applied.
-
- \anchor cfg_filter_source_files
-<dt>\c FILTER_SOURCE_FILES <dd>
- \addindex FILTER_SOURCE_FILES
- If the \c FILTER_SOURCE_FILES tag is set to \c YES, the input filter (if set using
- \ref cfg_input_filter "INPUT_FILTER" ) will also be used to filter the input
- files that are used for producing the source files to browse 
- (i.e. when \ref cfg_source_browser "SOURCE_BROWSER" is set to \c YES).
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_filter_source_patterns
-<dt>\c FILTER_SOURCE_PATTERNS <dd>
- \addindex FILTER_SOURCE_PATTERNS
- The \c FILTER_SOURCE_PATTERNS tag can be used to specify source filters per 
- file pattern. A pattern will override the setting 
- for \ref cfg_filter_patterns "FILTER_PATTERN" (if any) 
- and it is also possible to disable source filtering for a specific pattern 
- using `*.ext=` (so without naming a filter).
-
-
-This tag requires that the tag \ref cfg_filter_source_files "FILTER_SOURCE_FILES" is set to \c YES.
- \anchor cfg_use_mdfile_as_mainpage
-<dt>\c USE_MDFILE_AS_MAINPAGE <dd>
- \addindex USE_MDFILE_AS_MAINPAGE
- If the \c USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that 
- is part of the input, its contents will be placed on the main page (`index.html`). 
- This can be useful if you have a project on for instance GitHub and want to reuse 
- the introduction page also for the doxygen output.
-
-</dl>
-\section config_source_browser Configuration options related to source browsing
- \anchor cfg_source_browser
-<dl>
-
-<dt>\c SOURCE_BROWSER <dd>
- \addindex SOURCE_BROWSER
- If the \c SOURCE_BROWSER tag is set to \c YES then a list of source files will
- be generated. Documented entities will be cross-referenced with these sources.
- <br>Note: To get rid of all source code in the generated output, make sure that also
- \ref cfg_verbatim_headers "VERBATIM_HEADERS" is set to \c NO.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_inline_sources
-<dt>\c INLINE_SOURCES <dd>
- \addindex INLINE_SOURCES
- Setting the \c INLINE_SOURCES tag to \c YES will include the body
- of functions, classes and enums directly into the documentation.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_strip_code_comments
-<dt>\c STRIP_CODE_COMMENTS <dd>
- \addindex STRIP_CODE_COMMENTS
- Setting the \c STRIP_CODE_COMMENTS tag to \c YES will instruct
- doxygen to hide any special comment blocks from generated source code
- fragments. Normal C, C++ and Fortran comments will always remain visible.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_referenced_by_relation
-<dt>\c REFERENCED_BY_RELATION <dd>
- \addindex REFERENCED_BY_RELATION
- If the \c REFERENCED_BY_RELATION tag is set to \c YES
- then for each documented function all documented
- functions referencing it will be listed.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_references_relation
-<dt>\c REFERENCES_RELATION <dd>
- \addindex REFERENCES_RELATION
- If the \c REFERENCES_RELATION tag is set to \c YES
- then for each documented function all documented entities
- called/used by that function will be listed.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_references_link_source
-<dt>\c REFERENCES_LINK_SOURCE <dd>
- \addindex REFERENCES_LINK_SOURCE
- If the \c REFERENCES_LINK_SOURCE tag is set to \c YES
- and \ref cfg_source_browser "SOURCE_BROWSER" tag is set to \c YES, then the hyperlinks from 
- functions in \ref cfg_references_relation "REFERENCES_RELATION" and
- \ref cfg_referenced_by_relation "REFERENCED_BY_RELATION" lists will 
- link to the source code.  Otherwise they will link to the documentation.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_source_tooltips
-<dt>\c SOURCE_TOOLTIPS <dd>
- \addindex SOURCE_TOOLTIPS
-If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the 
-source code will show a tooltip with additional information such as prototype, 
-brief description and links to the definition and documentation. Since this will 
-make the HTML file larger and loading of large files a bit slower, you can opt 
-to disable this feature.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_source_browser "SOURCE_BROWSER" is set to \c YES.
- \anchor cfg_use_htags
-<dt>\c USE_HTAGS <dd>
- \addindex USE_HTAGS
- If the \c USE_HTAGS tag is set to \c YES then the references to source code
- will point to the HTML generated by the \c htags(1) tool instead of doxygen
- built-in source browser. The \c htags tool is part of GNU's global source
- tagging system (see http://www.gnu.org/software/global/global.html). You 
- will need version 4.8.6 or higher. 
-<br>
- To use it do the following:
- -# Install the latest version of \c global
- -# Enable \ref cfg_source_browser "SOURCE_BROWSER" and \c USE_HTAGS in the config file
- -# Make sure the \ref cfg_input "INPUT" points to the root of the source tree
- -# Run \c doxygen as normal
-<br>
- Doxygen will invoke \c htags (and that will in turn invoke \c gtags), so these tools
- must be available from the command line (i.e. in the search path).
-<br>
- The result: instead of the source browser generated by doxygen, the links to
- source code will now point to the output of \c htags.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_source_browser "SOURCE_BROWSER" is set to \c YES.
- \anchor cfg_verbatim_headers
-<dt>\c VERBATIM_HEADERS <dd>
- \addindex VERBATIM_HEADERS
-  If the \c VERBATIM_HEADERS tag is set the \c YES then doxygen
-  will generate a verbatim copy of the header file for each class for
-  which an include is specified. Set to \c NO to disable this.
-  \sa Section \ref cmdclass "\\class".
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_clang_assisted_parsing
-<dt>\c CLANG_ASSISTED_PARSING <dd>
- \addindex CLANG_ASSISTED_PARSING
-  If the \c CLANG_ASSISTED_PARSING tag is set to \c YES, then doxygen will use the 
-  <a href="http://clang.llvm.org/">clang parser</a> for more acurate parsing 
-  at the cost of reduced performance. This can be particularly helpful with 
-  template rich C++ code for which doxygen's built-in parser lacks the 
-  necessary type information.
-
-  @note The availability of this option depends on whether or not doxygen
-  was compiled with the `--with-libclang` option.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_clang_options
-<dt>\c CLANG_OPTIONS <dd>
- \addindex CLANG_OPTIONS
- If clang assisted parsing is enabled you can provide the compiler with command 
- line options that you would normally use when invoking the compiler. Note that 
- the include paths will already be set by doxygen for the files and directories 
- specified with \ref cfg_input "INPUT" and \ref cfg_include_path "INCLUDE_PATH".
-
-
-This tag requires that the tag \ref cfg_clang_assisted_parsing "CLANG_ASSISTED_PARSING" is set to \c YES.
-</dl>
-\section config_index Configuration options related to the alphabetical class index
- \anchor cfg_alphabetical_index
-<dl>
-
-<dt>\c ALPHABETICAL_INDEX <dd>
- \addindex ALPHABETICAL_INDEX
- If the \c ALPHABETICAL_INDEX tag is set to \c YES, an alphabetical index
- of all compounds will be generated. Enable this if the project contains 
- a lot of classes, structs, unions or interfaces.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_cols_in_alpha_index
-<dt>\c COLS_IN_ALPHA_INDEX <dd>
- \addindex COLS_IN_ALPHA_INDEX
- The \c COLS_IN_ALPHA_INDEX tag can be 
- used to specify the number of columns in which the alphabetical index list will be split.
-
-
- Minimum value: <code>1</code>, maximum value: <code>20</code>, default value: <code>5</code>.
-
-
-This tag requires that the tag \ref cfg_alphabetical_index "ALPHABETICAL_INDEX" is set to \c YES.
- \anchor cfg_ignore_prefix
-<dt>\c IGNORE_PREFIX <dd>
- \addindex IGNORE_PREFIX
- In case all classes in a project start with a common prefix, all classes will 
- be put under the same header in the alphabetical index.
- The \c IGNORE_PREFIX tag can be used to specify a prefix 
- (or a list of prefixes) that should be ignored while generating the index headers.
-
-
-This tag requires that the tag \ref cfg_alphabetical_index "ALPHABETICAL_INDEX" is set to \c YES.
-</dl>
-\section config_html Configuration options related to the HTML output
- \anchor cfg_generate_html
-<dl>
-
-<dt>\c GENERATE_HTML <dd>
- \addindex GENERATE_HTML
- If the \c GENERATE_HTML tag is set to \c YES doxygen will
- generate HTML output
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_html_output
-<dt>\c HTML_OUTPUT <dd>
- \addindex HTML_OUTPUT
- The \c HTML_OUTPUT tag is used to specify where the HTML docs will be put.
- If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
- put in front of it.
-
-The default directory is: <code>html</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_html_file_extension
-<dt>\c HTML_FILE_EXTENSION <dd>
- \addindex HTML_FILE_EXTENSION
- The \c HTML_FILE_EXTENSION tag can be used to specify the file extension for 
- each generated HTML page (for example: <code>.htm, .php, .asp</code>).
-
-The default value is: <code>.html</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_html_header
-<dt>\c HTML_HEADER <dd>
- \addindex HTML_HEADER
- The \c HTML_HEADER tag can be used to specify a user-defined HTML 
- header file for each generated HTML page. 
- If the tag is left blank doxygen will generate a 
- standard header. 
-<br>
- To get valid HTML the header file that
- includes any scripts and style sheets that doxygen
- needs, which is dependent on the configuration options used (e.g. the
- setting \ref cfg_generate_treeview "GENERATE_TREEVIEW").
- It is highly recommended to start with a default header using
-\verbatim
-doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFile
-\endverbatim
- and then modify the file \c new_header.html.
-
- See also section \ref doxygen_usage for information on how to generate
- the default header that doxygen normally uses.
-
- @note The header is subject to change so you typically
- have to regenerate the default header when upgrading to a newer version of 
- doxygen. The following markers have a special meaning inside the header and footer:
- <dl>
- <dt><code>\$title</code><dd>will be replaced with the title of the page.
- <dt><code>\$datetime</code><dd>will be replaced with current the date and time.
- <dt><code>\$date</code><dd>will be replaced with the current date.
- <dt><code>\$year</code><dd>will be replaces with the current year.
- <dt><code>\$doxygenversion</code><dd>will be replaced with the version of doxygen
- <dt><code>\$projectname</code><dd>will be replaced with the name of 
-            the project (see \ref cfg_project_name "PROJECT_NAME")
- <dt><code>\$projectnumber</code><dd>will be replaced with the project number
-            (see \ref cfg_project_number "PROJECT_NUMBER")
- <dt><code>\$projectbrief</code><dd>will be replaced with the project brief
-            description (see \ref cfg_project_brief "PROJECT_BRIEF")
- <dt><code>\$projectlogo</code><dd>will be replaced with the project logo
-            (see \ref cfg_project_logo "PROJECT_LOGO")
- <dt><code>\$treeview</code><dd>will be replaced with links to 
-            the javascript and style sheets needed for the navigation tree 
-            (or an empty string when \ref cfg_generate_treeview "GENERATE_TREEVIEW" 
-            is disabled).
- <dt><code>\$search</code><dd>will be replaced with a links to 
-            the javascript and style sheets needed for the search engine 
-            (or an empty string when \ref cfg_searchengine "SEARCHENGINE" 
-            is disabled).
- <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 \ref cfg_create_subdirs "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 <code>\$relpath^doxygen.css</code>, to refer to the standard style sheet.
- </dl>
-
- To cope with differences in the layout of the header and footer that depend on 
- configuration settings, the header can also contain special blocks that 
- will be copied to the output or skipped depending on the configuration.
- Such blocks have the following form:
-\verbatim
- <!--BEGIN BLOCKNAME-->
- Some context copied when condition BLOCKNAME holds
- <!--END BLOCKNAME-->
- <!--BEGIN !BLOCKNAME-->
- Some context copied when condition BLOCKNAME does not hold
- <!--END !BLOCKNAME-->
-\endverbatim
- The following block names are supported:
- <dl>
- <dt><code>DISABLE_INDEX</code><dd>Content within this block is copied to the output
-     when the \ref cfg_disable_index "DISABLE_INDEX" option is enabled (so when the index is disabled).
- <dt><code>GENERATE_TREEVIEW</code><dd>Content within this block is copied to the output
-     when the \ref cfg_generate_treeview "GENERATE_TREEVIEW" option is enabled.
- <dt><code>SEARCHENGINE</code><dd>Content within this block is copied to the output
-     when the \ref cfg_searchengine "SEARCHENGINE" option is enabled.
- <dt><code>PROJECT_NAME</code><dd>Content within the block is copied to the output
-      when the \ref cfg_project_name "PROJECT_NAME" option is not empty.
- <dt><code>PROJECT_NUMBER</code><dd>Content within the block is copied to the output
-      when the \ref cfg_project_number "PROJECT_NUMBER" option is not empty.
- <dt><code>PROJECT_BRIEF</code><dd>Content within the block is copied to the output
-      when the \ref cfg_project_brief "PROJECT_BRIEF" option is not empty.
- <dt><code>PROJECT_LOGO</code><dd>Content within the block is copied to the output
-      when the \ref cfg_project_logo "PROJECT_LOGO" option is not empty.
- <dt><code>TITLEAREA</code><dd>Content within this block is copied to the output
-     when a title is visible at the top of each page. This is the case
-     if either \ref cfg_project_name "PROJECT_NAME", 
-     \ref cfg_project_brief "PROJECT_BRIEF", \ref cfg_project_logo "PROJECT_LOGO" 
-     is filled in or if both \ref cfg_disable_index "DISABLE_INDEX" and 
-     \ref cfg_searchengine "SEARCHENGINE" are enabled.
- </dl>
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_html_footer
-<dt>\c HTML_FOOTER <dd>
- \addindex HTML_FOOTER
- The \c HTML_FOOTER tag can be used to specify a user-defined HTML footer for 
- each generated HTML page. 
- If the tag is left blank doxygen will generate a standard footer.
-
- See \ref cfg_html_header "HTML_HEADER" for more information on 
- how to generate a default footer and what special commands can be 
- used inside the footer.
-
- See also section \ref doxygen_usage for information on how to generate
- the default footer that doxygen normally uses.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_html_stylesheet
-<dt>\c HTML_STYLESHEET <dd>
- \addindex HTML_STYLESHEET
- The \c HTML_STYLESHEET tag can be used to specify a user-defined cascading 
- style sheet that is used by each HTML page. It can be used to 
- fine-tune the look of the HTML output. If left blank doxygen 
- will generate a default style sheet. 
- See also section \ref doxygen_usage for information on how to generate
- the style sheet that doxygen normally uses.
-
- \note It is recommended to use 
- \ref cfg_html_extra_stylesheet "HTML_EXTRA_STYLESHEET" instead of this tag,
- as it is more robust and 
- this tag (<code>HTML_STYLESHEET</code>) will in the future become obsolete.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_html_extra_stylesheet
-<dt>\c HTML_EXTRA_STYLESHEET <dd>
- \addindex HTML_EXTRA_STYLESHEET
- The \c HTML_EXTRA_STYLESHEET tag can be used to specify an additional 
- user-defined cascading style sheet that is included after the standard 
- style sheets created by doxygen. Using this option one can overrule 
- certain style aspects. This is preferred over using \ref cfg_html_stylesheet "HTML_STYLESHEET" 
- since it does not replace the standard style sheet and is therefor more 
- robust against future updates. Doxygen will copy the style sheet file to 
- the output directory. Here is an example stylesheet that gives the contents area a fixed width:
-\verbatim
-body {
-        background-color: #CCC;
-        color: black;
-        margin: 0;
-}
-
-div.contents {
-        margin-bottom: 10px;
-        padding: 12px;
-        margin-left: auto;
-        margin-right: auto;
-        width: 960px;
-        background-color: white;
-        border-radius: 8px;
-}
-
-#titlearea {
-        background-color: white;
-}
-
-hr.footer {
-        display: none;
-}
-
-.footer {
-        background-color: #AAA;
-}
-\endverbatim
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_html_extra_files
-<dt>\c HTML_EXTRA_FILES <dd>
- \addindex HTML_EXTRA_FILES
- 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 
- <code>$relpath^</code> marker in the \ref cfg_html_header "HTML_HEADER" and/or
- \ref cfg_html_footer "HTML_FOOTER" files to load these 
- files. In the \ref cfg_html_stylesheet "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.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_html_colorstyle_hue
-<dt>\c HTML_COLORSTYLE_HUE <dd>
- \addindex HTML_COLORSTYLE_HUE
- The \c HTML_COLORSTYLE_HUE tag controls the color of the HTML output. 
- Doxygen will adjust the colors in the stylesheet and background images 
- according to this color. Hue is specified as an angle on a colorwheel, 
- see http://en.wikipedia.org/wiki/Hue for more information. 
- For instance the value 0 represents red, 60 is yellow, 120 is green, 
- 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
-
-
- Minimum value: <code>0</code>, maximum value: <code>359</code>, default value: <code>220</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_html_colorstyle_sat
-<dt>\c HTML_COLORSTYLE_SAT <dd>
- \addindex HTML_COLORSTYLE_SAT
- The \c HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of 
- the colors in the HTML output. For a value of 0 the output will use 
- grayscales only. A value of 255 will produce the most vivid colors.
-
-
- Minimum value: <code>0</code>, maximum value: <code>255</code>, default value: <code>100</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_html_colorstyle_gamma
-<dt>\c HTML_COLORSTYLE_GAMMA <dd>
- \addindex HTML_COLORSTYLE_GAMMA
- The \c HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to 
- the luminance component of the colors in the HTML output. Values below 
- 100 gradually make the output lighter, whereas values above 100 make 
- the output darker. The value divided by 100 is the actual gamma applied, 
- so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, 
- and 100 does not change the gamma.
-
-
- Minimum value: <code>40</code>, maximum value: <code>240</code>, default value: <code>80</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_html_timestamp
-<dt>\c HTML_TIMESTAMP <dd>
- \addindex HTML_TIMESTAMP
- If the \c HTML_TIMESTAMP tag is set to \c YES then the footer of 
- each generated HTML page will contain the date and time when the page 
- was generated. Setting this to \c NO can help when comparing the output of 
- multiple runs.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_html_dynamic_sections
-<dt>\c HTML_DYNAMIC_SECTIONS <dd>
- \addindex HTML_DYNAMIC_SECTIONS
- If the \c HTML_DYNAMIC_SECTIONS tag is set to \c YES then the generated HTML
- documentation will contain sections that can be hidden and shown after the
- page has loaded.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_html_index_num_entries
-<dt>\c HTML_INDEX_NUM_ENTRIES <dd>
- \addindex HTML_INDEX_NUM_ENTRIES
- With \c HTML_INDEX_NUM_ENTRIES one can control the preferred number of 
- entries shown in the various tree structured indices initially; the user 
- can expand and collapse entries dynamically later on. Doxygen will expand 
- the tree to such a level that at most the specified number of entries are 
- visible (unless a fully collapsed tree already exceeds this amount). 
- So setting the number of entries 1 will produce a full collapsed tree by 
- default. 0 is a special value representing an infinite number of entries 
- and will result in a full expanded tree by default.
-
-
- Minimum value: <code>0</code>, maximum value: <code>9999</code>, default value: <code>100</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_generate_docset
-<dt>\c GENERATE_DOCSET <dd>
- \addindex GENERATE_DOCSET
- If the \c GENERATE_DOCSET tag is set to \c YES, additional index files
- will be generated that can be used as input for 
- <a href="http://developer.apple.com/tools/xcode/">Apple's Xcode 3
- integrated development environment</a>, introduced with OSX 10.5 (Leopard).
- To create a documentation set, doxygen will generate a Makefile in the
- HTML output directory. Running \c make will produce the docset in that
- directory and running <code>make install</code> will install the docset in 
- <code>~/Library/Developer/Shared/Documentation/DocSets</code> 
- so that Xcode will find it at startup. See
- http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for
- more information.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_docset_feedname
-<dt>\c DOCSET_FEEDNAME <dd>
- \addindex DOCSET_FEEDNAME
- This tag determines the name of the docset
- feed. A documentation feed provides an umbrella under which multiple
- documentation sets from a single provider (such as a company or product suite) 
- can be grouped.
-
-The default value is: <code>Doxygen generated docs</code>.
-
-
-This tag requires that the tag \ref cfg_generate_docset "GENERATE_DOCSET" is set to \c YES.
- \anchor cfg_docset_bundle_id
-<dt>\c DOCSET_BUNDLE_ID <dd>
- \addindex DOCSET_BUNDLE_ID
- This tag specifies a string that
- should uniquely identify the documentation set bundle. This should be a
- reverse domain-name style string, e.g. <code>com.mycompany.MyDocSet</code>. 
- Doxygen will append <code>.docset</code> to the name.
-
-The default value is: <code>org.doxygen.Project</code>.
-
-
-This tag requires that the tag \ref cfg_generate_docset "GENERATE_DOCSET" is set to \c YES.
- \anchor cfg_docset_publisher_id
-<dt>\c DOCSET_PUBLISHER_ID <dd>
- \addindex DOCSET_PUBLISHER_ID
-The \c DOCSET_PUBLISHER_ID
-tag specifies a string that should uniquely identify 
-the documentation publisher. This should be a reverse domain-name style 
-string, e.g. <code>com.mycompany.MyDocSet.documentation</code>.
-
-The default value is: <code>org.doxygen.Publisher</code>.
-
-
-This tag requires that the tag \ref cfg_generate_docset "GENERATE_DOCSET" is set to \c YES.
- \anchor cfg_docset_publisher_name
-<dt>\c DOCSET_PUBLISHER_NAME <dd>
- \addindex DOCSET_PUBLISHER_NAME
-The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
-
-The default value is: <code>Publisher</code>.
-
-
-This tag requires that the tag \ref cfg_generate_docset "GENERATE_DOCSET" is set to \c YES.
- \anchor cfg_generate_htmlhelp
-<dt>\c GENERATE_HTMLHELP <dd>
- \addindex GENERATE_HTMLHELP
- If the \c GENERATE_HTMLHELP tag is set to \c YES then
- doxygen generates three additional HTML index files: 
- \c index.hhp, \c index.hhc, and \c index.hhk. The \c index.hhp is a 
- project file that can be read by 
- <a href="http://www.microsoft.com/en-us/download/details.aspx?id=21138">
- Microsoft's HTML Help Workshop</a>
- on Windows.
-<br>
- The HTML Help Workshop contains a compiler that can convert all HTML output 
- generated by doxygen into a single compiled HTML file (`.chm`). Compiled
- HTML files are now used as the Windows 98 help format, and will replace
- the old Windows help format (`.hlp`) on all Windows platforms in the future.
- Compressed HTML files also contain an index, a table of contents,
- and you can search for words in the documentation.
- The HTML workshop also contains a viewer for compressed HTML files.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_chm_file
-<dt>\c CHM_FILE <dd>
- \addindex CHM_FILE
-  The \c CHM_FILE tag can
-  be used to specify the file name of the resulting `.chm` file. You
-  can add a path in front of the file if the result should not be
-  written to the html output directory.
-
-
-This tag requires that the tag \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" is set to \c YES.
- \anchor cfg_hhc_location
-<dt>\c HHC_LOCATION <dd>
- \addindex HHC_LOCATION
-  The \c HHC_LOCATION tag can
-  be used to specify the location (absolute path including file name) of 
-  the HTML help compiler (\c hhc.exe). If non-empty doxygen will try to run
-  the HTML help compiler on the generated \c index.hhp.
-
-The file has to be specified with full path.
-
-
-This tag requires that the tag \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" is set to \c YES.
- \anchor cfg_generate_chi
-<dt>\c GENERATE_CHI <dd>
- \addindex GENERATE_CHI
- The \c GENERATE_CHI flag
- controls if a separate `.chi` index file is generated (\c YES) or that
- it should be included in the master `.chm` file (\c NO).
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" is set to \c YES.
- \anchor cfg_chm_index_encoding
-<dt>\c CHM_INDEX_ENCODING <dd>
- \addindex CHM_INDEX_ENCODING
- The \c CHM_INDEX_ENCODING 
- is used to encode HtmlHelp index (\c hhk), content (\c hhc) and project file 
- content.
-
-
-This tag requires that the tag \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" is set to \c YES.
- \anchor cfg_binary_toc
-<dt>\c BINARY_TOC <dd>
- \addindex BINARY_TOC
- The \c BINARY_TOC flag
- controls whether a binary table of contents is generated (\c YES) or a
- normal table of contents (\c NO) in the `.chm` file.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" is set to \c YES.
- \anchor cfg_toc_expand
-<dt>\c TOC_EXPAND <dd>
- \addindex TOC_EXPAND
- The \c TOC_EXPAND flag can be set to \c YES to add extra items for 
- group members to the table of contents of the HTML help documentation 
- and to the tree view.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP" is set to \c YES.
- \anchor cfg_generate_qhp
-<dt>\c GENERATE_QHP <dd>
- \addindex GENERATE_QHP
- If the \c GENERATE_QHP tag is set to \c YES and both \ref cfg_qhp_namespace "QHP_NAMESPACE"
- and \ref cfg_qhp_virtual_folder "QHP_VIRTUAL_FOLDER" are set, an additional index file will
- be generated that can be used as input for Qt's qhelpgenerator
- to generate a Qt Compressed Help (`.qch`) of the generated HTML
- documentation.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_qch_file
-<dt>\c QCH_FILE <dd>
- \addindex QCH_FILE
- If the \ref cfg_qhg_location "QHG_LOCATION" tag is specified, the \c QCH_FILE tag can
- be used to specify the file name of the resulting `.qch` file.
- The path specified is relative to the HTML output folder.
-
-
-This tag requires that the tag \ref cfg_generate_qhp "GENERATE_QHP" is set to \c YES.
- \anchor cfg_qhp_namespace
-<dt>\c QHP_NAMESPACE <dd>
- \addindex QHP_NAMESPACE
- The \c QHP_NAMESPACE tag specifies the namespace to use when generating
- Qt Help Project output. For more information please see
- <a href="http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace">Qt Help Project / Namespace</a>.
-
-The default value is: <code>org.doxygen.Project</code>.
-
-
-This tag requires that the tag \ref cfg_generate_qhp "GENERATE_QHP" is set to \c YES.
- \anchor cfg_qhp_virtual_folder
-<dt>\c QHP_VIRTUAL_FOLDER <dd>
- \addindex QHP_VIRTUAL_FOLDER
- The \c QHP_VIRTUAL_FOLDER tag specifies the namespace to use when
- generating Qt Help Project output. For more information please see
- <a href="http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>.
-
-The default value is: <code>doc</code>.
-
-
-This tag requires that the tag \ref cfg_generate_qhp "GENERATE_QHP" is set to \c YES.
- \anchor cfg_qhp_cust_filter_name
-<dt>\c QHP_CUST_FILTER_NAME <dd>
- \addindex QHP_CUST_FILTER_NAME
-  If the \c QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom filter to add. For more information please see
-  <a href="http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
-
-
-This tag requires that the tag \ref cfg_generate_qhp "GENERATE_QHP" is set to \c YES.
- \anchor cfg_qhp_cust_filter_attrs
-<dt>\c QHP_CUST_FILTER_ATTRS <dd>
- \addindex QHP_CUST_FILTER_ATTRS
-  The \c QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the custom filter to add.
-  For more information please see
-  <a href="http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
-
-
-This tag requires that the tag \ref cfg_generate_qhp "GENERATE_QHP" is set to \c YES.
- \anchor cfg_qhp_sect_filter_attrs
-<dt>\c QHP_SECT_FILTER_ATTRS <dd>
- \addindex QHP_SECT_FILTER_ATTRS
-  The \c QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's filter section matches.
-  <a href="http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
-
-
-This tag requires that the tag \ref cfg_generate_qhp "GENERATE_QHP" is set to \c YES.
- \anchor cfg_qhg_location
-<dt>\c QHG_LOCATION <dd>
- \addindex QHG_LOCATION
- The \c QHG_LOCATION tag can be used to specify the location of Qt's qhelpgenerator.
- If non-empty doxygen will try to run qhelpgenerator on the generated `.qhp` file.
-
-
-This tag requires that the tag \ref cfg_generate_qhp "GENERATE_QHP" is set to \c YES.
- \anchor cfg_generate_eclipsehelp
-<dt>\c GENERATE_ECLIPSEHELP <dd>
- \addindex GENERATE_ECLIPSEHELP
- If the \c GENERATE_ECLIPSEHELP tag is set to \c YES, additional index files  
- will be generated, together with the HTML files, they form an `Eclipse` help 
- plugin. 
-
- To install this plugin and make it available under the help contents 
- menu in `Eclipse`, the contents of the directory containing the HTML and XML 
- files needs to be copied into the plugins directory of eclipse. The name of 
- the directory within the plugins directory should be the same as 
- the \ref cfg_eclipse_doc_id "ECLIPSE_DOC_ID" value. 
-
- After copying `Eclipse` needs to be restarted before the help appears.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_eclipse_doc_id
-<dt>\c ECLIPSE_DOC_ID <dd>
- \addindex ECLIPSE_DOC_ID
- A unique identifier for the `Eclipse` help plugin. When installing the plugin 
- the directory name containing the HTML and XML files should also have 
- this name. Each documentation set should have its own identifier.
-
-The default value is: <code>org.doxygen.Project</code>.
-
-
-This tag requires that the tag \ref cfg_generate_eclipsehelp "GENERATE_ECLIPSEHELP" is set to \c YES.
- \anchor cfg_disable_index
-<dt>\c DISABLE_INDEX <dd>
- \addindex DISABLE_INDEX
- If you want full control over the layout of the generated HTML pages it
- might be necessary to disable the index and replace it with your own.
- The \c DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at
- top of each HTML page. A value of \c NO enables the index and the
- value \c YES disables it. Since the tabs in the index contain the same 
- information as the navigation tree, you can set this option to \c YES if 
- you also set \ref cfg_generate_treeview "GENERATE_TREEVIEW" to \c YES.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_generate_treeview
-<dt>\c GENERATE_TREEVIEW <dd>
- \addindex GENERATE_TREEVIEW
- The \c GENERATE_TREEVIEW tag is used to specify whether a tree-like index
- structure should be generated to display hierarchical information.
- If the tag value is set to \c YES, a side panel will be generated
- containing a tree-like index structure (just like the one that
- is generated for HTML Help). For this to work a browser that supports
- JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
- Windows users are probably better off using the HTML help feature.
-
- Via custom stylesheets (see \ref cfg_html_extra_stylesheet "HTML_EXTRA_STYLESHEET")
- one can further \ref doxygen_finetune "fine-tune" the look of the index.
- As an example, the default style sheet generated by doxygen has an
- example that shows how to put an image at the root of the tree instead of
- the \ref cfg_project_name "PROJECT_NAME".
-
- Since the tree basically has the same information as the tab index, you could
- consider setting \ref cfg_disable_index "DISABLE_INDEX" to \c YES when 
- enabling this option.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_enum_values_per_line
-<dt>\c ENUM_VALUES_PER_LINE <dd>
- \addindex ENUM_VALUES_PER_LINE
- The \c ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
- that doxygen will group on one line in the generated HTML documentation. 
- <br>Note that a value of 0 will completely suppress the enum values from
- appearing in the overview section.
-
-
- Minimum value: <code>0</code>, maximum value: <code>20</code>, default value: <code>4</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_treeview_width
-<dt>\c TREEVIEW_WIDTH <dd>
- \addindex TREEVIEW_WIDTH
- If the treeview is enabled (see \ref cfg_generate_treeview "GENERATE_TREEVIEW") then this tag can be
- used to set the initial width (in pixels) of the frame in which the tree
- is shown.
-
-
- Minimum value: <code>0</code>, maximum value: <code>1500</code>, default value: <code>250</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_ext_links_in_window
-<dt>\c EXT_LINKS_IN_WINDOW <dd>
- \addindex EXT_LINKS_IN_WINDOW
- When the \c EXT_LINKS_IN_WINDOW option is set to \c YES doxygen will open 
- links to external symbols imported via tag files in a separate window.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_formula_fontsize
-<dt>\c FORMULA_FONTSIZE <dd>
- \addindex FORMULA_FONTSIZE
- Use this tag to change the font size of \f$\mbox{\LaTeX}\f$ formulas included
- as images in the HTML documentation.
- When you change the font size after a successful doxygen run you need
- to manually remove any `form_*.png` images from the HTML 
- output directory to force them to be regenerated.
-
-
- Minimum value: <code>8</code>, maximum value: <code>50</code>, default value: <code>10</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_formula_transparent
-<dt>\c FORMULA_TRANSPARENT <dd>
- \addindex FORMULA_TRANSPARENT
- Use the \c FORMULA_TRANPARENT tag to determine whether or not the images 
- generated for formulas are transparent PNGs. Transparent PNGs are 
- not supported properly for IE 6.0, but are supported on all modern browsers. 
- <br>Note that when changing this option you need to delete any `form_*.png` files 
- in the HTML output directory before the changes have effect.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_use_mathjax
-<dt>\c USE_MATHJAX <dd>
- \addindex USE_MATHJAX
- Enable the \c USE_MATHJAX option to render \f$\mbox{\LaTeX}\f$ formulas using MathJax 
- (see http://www.mathjax.org) which uses client side Javascript for the 
- rendering instead of using prerendered bitmaps. Use this if you do not 
- have \f$\mbox{\LaTeX}\f$ installed or if you want to formulas look prettier in the HTML 
- output. When enabled you may also need to install MathJax separately and 
- configure the path to it using the \ref cfg_mathjax_relpath "MATHJAX_RELPATH" 
- option.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_mathjax_format
-<dt>\c MATHJAX_FORMAT <dd>
- \addindex MATHJAX_FORMAT
- When MathJax is enabled you can set the default output format to be used for 
- the MathJax output.
- See <a href="http://docs.mathjax.org/en/latest/output.html">the MathJax site</a>
- for more details.
-
-Possible values are: 
-<code>HTML-CSS</code> (which is slower, but has the best compatibility), 
-<code>NativeMML</code> (i.e. MathML) and 
-<code>SVG</code>.
-
-
-The default value is: <code>HTML-CSS</code>.
-
-
-This tag requires that the tag \ref cfg_use_mathjax "USE_MATHJAX" is set to \c YES.
- \anchor cfg_mathjax_relpath
-<dt>\c MATHJAX_RELPATH <dd>
- \addindex MATHJAX_RELPATH
- When MathJax is enabled you need to specify the location relative to the 
- HTML output directory using the \c MATHJAX_RELPATH option. The destination 
- directory should contain the `MathJax.js` script. For instance, if the \c mathjax 
- directory is located at the same level as the HTML output directory, then 
- \c MATHJAX_RELPATH should be <code>../mathjax</code>. The default value points to 
- the MathJax Content Delivery Network so you can quickly see the result without 
- installing MathJax.  However, it is strongly recommended to install a local 
- copy of MathJax from http://www.mathjax.org before deployment.
-
-The default value is: <code>http://cdn.mathjax.org/mathjax/latest</code>.
-
-
-This tag requires that the tag \ref cfg_use_mathjax "USE_MATHJAX" is set to \c YES.
- \anchor cfg_mathjax_extensions
-<dt>\c MATHJAX_EXTENSIONS <dd>
- \addindex MATHJAX_EXTENSIONS
- The \c MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax extension 
- names that should be enabled during MathJax rendering. For example
-\verbatim
-MATHJAX_EXTENSIONS     = TeX/AMSmath TeX/AMSsymbols
-\endverbatim
-
-
-This tag requires that the tag \ref cfg_use_mathjax "USE_MATHJAX" is set to \c YES.
- \anchor cfg_mathjax_codefile
-<dt>\c MATHJAX_CODEFILE <dd>
- \addindex MATHJAX_CODEFILE
- The \c MATHJAX_CODEFILE tag can be used to specify a file with javascript 
- pieces of code that will be used on startup of the MathJax code. 
- See 
-<a href="http://docs.mathjax.org/en/latest/output.html">the MathJax site</a>
- for more details. As an example to disable the "Math Renderer" menu item in the "Math
- Settings" menu of MathJax:
-\verbatim
-MATHJAX_CODEFILE = disableRenderer.js
-\endverbatim
-  with in the file <code>disableRenderer.js</code>:
-\verbatim
-  MathJax.Hub.Config({
-   menuSettings: {
-    showRenderer: false,
-   } 
-  });
-\endverbatim
-
-
-This tag requires that the tag \ref cfg_use_mathjax "USE_MATHJAX" is set to \c YES.
- \anchor cfg_searchengine
-<dt>\c SEARCHENGINE <dd>
- \addindex SEARCHENGINE
- When the \c SEARCHENGINE tag is enabled doxygen will generate a search box
- for the HTML output. The underlying search engine uses javascript 
- and DHTML and should work on any modern browser. Note that when using
- HTML help (\ref cfg_generate_htmlhelp "GENERATE_HTMLHELP"), 
- Qt help (\ref cfg_generate_qhp "GENERATE_QHP"), or docsets
- (\ref cfg_generate_docset "GENERATE_DOCSET") there is already a search 
- function so this one should typically be disabled. For large projects 
- the javascript based search engine can be slow, then enabling 
- \ref cfg_server_based_search "SERVER_BASED_SEARCH" may provide a 
- better solution. 
-
- It is possible to search using the keyboard;
- to jump to the search box use <code>\<access key\> + S</code> (what the <code>\<access key\></code> is
- depends on the OS and browser, but it is typically <code>\<CTRL\></code>, <code>\<ALT\></code>/<code>\<option\></code>, or both).
- Inside the search box use the <code>\<cursor down key\></code> to jump into the search 
- results window, the results can be navigated using the <code>\<cursor keys\></code>.
- Press <code>\<Enter\></code> to select an item or <code>\<escape\></code> to cancel the search. The
- filter options can be selected when the cursor is inside the search box
- by pressing <code>\<Shift\>+\<cursor down\></code>. Also here use the <code>\<cursor keys\></code> to 
- select a filter and <code>\<Enter\></code> or <code>\<escape\></code> to activate or cancel the filter option.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_generate_html "GENERATE_HTML" is set to \c YES.
- \anchor cfg_server_based_search
-<dt>\c SERVER_BASED_SEARCH <dd>
- \addindex SERVER_BASED_SEARCH
-When the \c SERVER_BASED_SEARCH tag is enabled the search engine will be 
-implemented using a web server instead of a web client using Javascript. 
-
-There are two flavours of web server based searching depending on the 
-\ref cfg_external_search "EXTERNAL_SEARCH" setting. When disabled, 
-doxygen will generate a PHP script for searching and an index file used 
-by the script. When \ref cfg_external_search "EXTERNAL_SEARCH" is 
-enabled the indexing and searching needs to be provided by external tools. 
-See the section \ref extsearch for details.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_searchengine "SEARCHENGINE" is set to \c YES.
- \anchor cfg_external_search
-<dt>\c EXTERNAL_SEARCH <dd>
- \addindex EXTERNAL_SEARCH
- When \c EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP 
- script for searching. Instead the search results are written to an XML file 
- which needs to be processed by an external indexer. Doxygen will invoke an 
- external search engine pointed to by the 
- \ref cfg_searchengine_url "SEARCHENGINE_URL" option to obtain 
- the search results.
- <br>Doxygen ships with an example indexer (\c doxyindexer) and 
- search engine (<code>doxysearch.cgi</code>) which are based on the open source search 
- engine library <a href="http://xapian.org/">Xapian</a>.
- <br>See the section \ref extsearch for details.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_searchengine "SEARCHENGINE" is set to \c YES.
- \anchor cfg_searchengine_url
-<dt>\c SEARCHENGINE_URL <dd>
- \addindex SEARCHENGINE_URL
- The \c SEARCHENGINE_URL should point to a search engine hosted by a web server 
- which will return the search results when \ref cfg_external_search "EXTERNAL_SEARCH" 
- is enabled.
- <br>Doxygen ships with an example indexer (\c doxyindexer) and 
- search engine (<code>doxysearch.cgi</code>) which are based on the open source search 
- engine library <a href="http://xapian.org/">Xapian</a>.
- See the section \ref extsearch for details.
-
-
-This tag requires that the tag \ref cfg_searchengine "SEARCHENGINE" is set to \c YES.
- \anchor cfg_searchdata_file
-<dt>\c SEARCHDATA_FILE <dd>
- \addindex SEARCHDATA_FILE
-When \ref cfg_server_based_search "SERVER_BASED_SEARCH" and 
-\ref cfg_external_search "EXTERNAL_SEARCH" are both enabled the unindexed 
-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 file is: <code>searchdata.xml</code>.
-
-
-This tag requires that the tag \ref cfg_searchengine "SEARCHENGINE" is set to \c YES.
- \anchor cfg_external_search_id
-<dt>\c EXTERNAL_SEARCH_ID <dd>
- \addindex EXTERNAL_SEARCH_ID
-When \ref cfg_server_based_search "SERVER_BASED_SEARCH" and 
-\ref cfg_external_search "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.
-
-
-This tag requires that the tag \ref cfg_searchengine "SEARCHENGINE" is set to \c YES.
- \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 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
-
-
-This tag requires that the tag \ref cfg_searchengine "SEARCHENGINE" is set to \c YES.
-</dl>
-\section config_latex Configuration options related to the LaTeX output
- \anchor cfg_generate_latex
-<dl>
-
-<dt>\c GENERATE_LATEX <dd>
- \addindex GENERATE_LATEX
- If the \c GENERATE_LATEX tag is set to \c YES doxygen will
- generate \f$\mbox{\LaTeX}\f$ output.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_latex_output
-<dt>\c LATEX_OUTPUT <dd>
- \addindex LATEX_OUTPUT
- The \c LATEX_OUTPUT tag is used to specify where the \f$\mbox{\LaTeX}\f$ 
- docs will be put.
- If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
- put in front of it.
-
-The default directory is: <code>latex</code>.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_latex_cmd_name
-<dt>\c LATEX_CMD_NAME <dd>
- \addindex LATEX_CMD_NAME
- The \c LATEX_CMD_NAME tag can be used to specify the \f$\mbox{\LaTeX}\f$ command name to be invoked. 
- <br>Note that when enabling \ref cfg_use_pdflatex "USE_PDFLATEX" this option is only used for
- generating bitmaps for formulas in the HTML output, but not in the
- \c Makefile that is written to the output directory.
-
-The default file is: <code>latex</code>.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_makeindex_cmd_name
-<dt>\c MAKEINDEX_CMD_NAME <dd>
- \addindex MAKEINDEX_CMD_NAME
- The \c MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
- generate index for \f$\mbox{\LaTeX}\f$.
-
-The default file is: <code>makeindex</code>.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_compact_latex
-<dt>\c COMPACT_LATEX <dd>
- \addindex COMPACT_LATEX
- If the \c COMPACT_LATEX tag is set to \c YES doxygen generates more compact
- \f$\mbox{\LaTeX}\f$ documents. This may be useful for small projects and may help to
- save some trees in general.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_paper_type
-<dt>\c PAPER_TYPE <dd>
- \addindex PAPER_TYPE
- The \c PAPER_TYPE tag can be used to set the paper type that is used
- by the printer.
-
-Possible values are: 
-<code>a4</code> (210 x 297 mm), 
-<code>letter</code> (8.5 x 11 inches), 
-<code>legal</code> (8.5 x 14 inches) and 
-<code>executive</code> (7.25 x 10.5 inches).
-
-
-The default value is: <code>a4</code>.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_extra_packages
-<dt>\c EXTRA_PACKAGES <dd>
- \addindex EXTRA_PACKAGES
- The \c EXTRA_PACKAGES tag can be used to specify one or more \f$\mbox{\LaTeX}\f$ 
- package names that should be included in the \f$\mbox{\LaTeX}\f$ output.
- To get the times font for instance you can specify 
-\verbatim
-EXTRA_PACKAGES=times
-\endverbatim
- If left blank no extra packages will be included.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_latex_header
-<dt>\c LATEX_HEADER <dd>
- \addindex LATEX_HEADER
- The \c LATEX_HEADER tag can be used to specify a personal \f$\mbox{\LaTeX}\f$ 
- header for the generated \f$\mbox{\LaTeX}\f$ document. 
- The header should contain everything until the first chapter. 
-
- If it is left blank doxygen will generate a 
- standard header. See section \ref doxygen_usage for information on how to 
- let doxygen write the default header to a separate file.
- <br>Note: Only use a user-defined header if you know what you are doing!
-
- The following commands have a special meaning inside the header:
- <code>\$title</code>, <code>\$datetime</code>, <code>\$date</code>,
- <code>\$doxygenversion</code>, <code>\$projectname</code>, 
- <code>\$projectnumber</code>. 
- Doxygen will replace them by respectively 
- the title of the page, the current date and time, only the current date,
- the version number of doxygen, the project name (see \ref cfg_project_name "PROJECT_NAME"), or the
- project number (see \ref cfg_project_number "PROJECT_NUMBER").
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_latex_footer
-<dt>\c LATEX_FOOTER <dd>
- \addindex LATEX_FOOTER
- The \c LATEX_FOOTER tag can be used to specify a personal \f$\mbox{\LaTeX}\f$ footer for 
- the generated \f$\mbox{\LaTeX}\f$ document. The footer should contain everything after 
- the last chapter. If it is left blank doxygen will generate a 
- standard footer.
- <br>Note: Only use a user-defined footer if you know what you are doing!
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_latex_extra_files
-<dt>\c LATEX_EXTRA_FILES <dd>
- \addindex LATEX_EXTRA_FILES
- The \c LATEX_EXTRA_FILES tag can be used to specify one or more extra images
- or other source files which should be copied to the \ref cfg_latex_output "LATEX_OUTPUT"
- output directory.
- Note that the files will be copied as-is; there are no commands or markers
- available.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_pdf_hyperlinks
-<dt>\c PDF_HYPERLINKS <dd>
- \addindex PDF_HYPERLINKS
- If the \c PDF_HYPERLINKS tag is set to \c YES, the \f$\mbox{\LaTeX}\f$ that 
- is generated is prepared for conversion to PDF (using \c ps2pdf or \c pdflatex). 
- The PDF file will
- contain links (just like the HTML output) instead of page references.
- This makes the output suitable for online browsing using a PDF viewer.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_use_pdflatex
-<dt>\c USE_PDFLATEX <dd>
- \addindex USE_PDFLATEX
- If the \c LATEX_PDFLATEX tag is set to \c YES, doxygen will use
- \c pdflatex to generate the PDF file directly from the \f$\mbox{\LaTeX}\f$
- files.  Set this option to \c YES to get a higher quality PDF documentation.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_latex_batchmode
-<dt>\c LATEX_BATCHMODE <dd>
- \addindex LATEX_BATCHMODE
- If the \c LATEX_BATCHMODE tag is set to \c YES, doxygen will add the \c \\batchmode
- command to the generated \f$\mbox{\LaTeX}\f$ files. This will 
- instruct \f$\mbox{\LaTeX}\f$ to keep running if errors occur, instead of 
- asking the user for help. This option is also used when generating formulas 
- in HTML.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_latex_hide_indices
-<dt>\c LATEX_HIDE_INDICES <dd>
- \addindex LATEX_HIDE_INDICES
- If the \c LATEX_HIDE_INDICES tag is set to \c YES then doxygen will not
- include the index chapters (such as File Index, Compound Index, etc.) 
- in the output.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_latex_source_code
-<dt>\c LATEX_SOURCE_CODE <dd>
- \addindex LATEX_SOURCE_CODE
- If the \c LATEX_SOURCE_CODE tag is set to \c YES then doxygen will include 
- source code with syntax highlighting in the \f$\mbox{\LaTeX}\f$ output. 
- <br>Note that which sources are shown also depends on other settings 
- such as \ref cfg_source_browser "SOURCE_BROWSER".
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
- \anchor cfg_latex_bib_style
-<dt>\c LATEX_BIB_STYLE <dd>
- \addindex LATEX_BIB_STYLE
- The \c LATEX_BIB_STYLE tag can be used to specify the style to use for the 
- bibliography, e.g. \c plainnat, or \c ieeetr. 
- See http://en.wikipedia.org/wiki/BibTeX and \ref cmdcite "\\cite"
- for more info.
-
-The default value is: <code>plain</code>.
-
-
-This tag requires that the tag \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES.
-</dl>
-\section config_rtf Configuration options related to the RTF output
- \anchor cfg_generate_rtf
-<dl>
-
-<dt>\c GENERATE_RTF <dd>
- \addindex GENERATE_RTF
- If the \c GENERATE_RTF tag is set to \c YES doxygen will generate RTF output.
- The RTF output is optimized for Word 97 and may not look too pretty with
- other RTF readers/editors.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_rtf_output
-<dt>\c RTF_OUTPUT <dd>
- \addindex RTF_OUTPUT
- The \c RTF_OUTPUT tag is used to specify where the RTF docs will be put.
- If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
- put in front of it.
-
-The default directory is: <code>rtf</code>.
-
-
-This tag requires that the tag \ref cfg_generate_rtf "GENERATE_RTF" is set to \c YES.
- \anchor cfg_compact_rtf
-<dt>\c COMPACT_RTF <dd>
- \addindex COMPACT_RTF
- If the \c COMPACT_RTF tag is set to \c YES doxygen generates more compact
- RTF documents. This may be useful for small projects and may help to
- save some trees in general.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_rtf "GENERATE_RTF" is set to \c YES.
- \anchor cfg_rtf_hyperlinks
-<dt>\c RTF_HYPERLINKS <dd>
- \addindex RTF_HYPERLINKS
- If the \c RTF_HYPERLINKS tag is set to \c YES, the RTF that is generated
- will contain hyperlink fields. The RTF file will
- contain links (just like the HTML output) instead of page references.
- This makes the output suitable for online browsing using Word or some other
- Word compatible readers that support those fields.
-
- <br>Note: WordPad (write) and others do not support links.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_rtf "GENERATE_RTF" is set to \c YES.
- \anchor cfg_rtf_stylesheet_file
-<dt>\c RTF_STYLESHEET_FILE <dd>
- \addindex RTF_STYLESHEET_FILE
- Load stylesheet definitions from file. Syntax is similar to doxygen's
- config file, i.e. a series of assignments. You only have to provide
- replacements, missing definitions are set to their default value.
-<br>
- See also section \ref doxygen_usage for information on how to generate
- the default style sheet that doxygen normally uses.
-
-
-This tag requires that the tag \ref cfg_generate_rtf "GENERATE_RTF" is set to \c YES.
- \anchor cfg_rtf_extensions_file
-<dt>\c RTF_EXTENSIONS_FILE <dd>
- \addindex RTF_EXTENSIONS_FILE
- Set optional variables used in the generation of an RTF document.
- Syntax is similar to doxygen's config file. 
- A template extensions file can be generated using 
- <code>doxygen -e rtf extensionFile</code>.
-
-
-This tag requires that the tag \ref cfg_generate_rtf "GENERATE_RTF" is set to \c YES.
-</dl>
-\section config_man Configuration options related to the man page output
- \anchor cfg_generate_man
-<dl>
-
-<dt>\c GENERATE_MAN <dd>
- \addindex GENERATE_MAN
- If the \c GENERATE_MAN tag is set to \c YES doxygen will
- generate man pages for classes and files.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_man_output
-<dt>\c MAN_OUTPUT <dd>
- \addindex MAN_OUTPUT
- The \c MAN_OUTPUT tag is used to specify where the man pages will be put.
- If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be
- put in front of it. 
- A directory \c man3 will be created inside the directory specified by 
- \c MAN_OUTPUT.
-
-The default directory is: <code>man</code>.
-
-
-This tag requires that the tag \ref cfg_generate_man "GENERATE_MAN" is set to \c YES.
- \anchor cfg_man_extension
-<dt>\c MAN_EXTENSION <dd>
- \addindex MAN_EXTENSION
- The \c MAN_EXTENSION tag determines the extension that is added to
- the generated man pages. In case
- the manual section does not start with a number, the number 3 is prepended.
- The dot (.) at the beginning of the \c MAN_EXTENSION tag is optional.
-
-The default value is: <code>.3</code>.
-
-
-This tag requires that the tag \ref cfg_generate_man "GENERATE_MAN" is set to \c YES.
- \anchor cfg_man_links
-<dt>\c MAN_LINKS <dd>
- \addindex MAN_LINKS
- If the \c MAN_LINKS tag is set to \c YES and doxygen generates man output, 
- then it will generate one additional man file for each entity documented in 
- the real man page(s). These additional files only source the real man page, 
- but without them the \c man command would be unable to find the correct page.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_man "GENERATE_MAN" is set to \c YES.
-</dl>
-\section config_xml Configuration options related to the XML output
- \anchor cfg_generate_xml
-<dl>
-
-<dt>\c GENERATE_XML <dd>
- \addindex GENERATE_XML
- If the \c GENERATE_XML tag is set to \c YES doxygen will
- generate an XML file that captures the structure of
- the code including all documentation.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_xml_output
-<dt>\c XML_OUTPUT <dd>
- \addindex XML_OUTPUT
- The \c XML_OUTPUT tag is used to specify where the XML pages will be put. 
- If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be 
- put in front of it.
-
-The default directory is: <code>xml</code>.
-
-
-This tag requires that the tag \ref cfg_generate_xml "GENERATE_XML" is set to \c YES.
- \anchor cfg_xml_schema
-<dt>\c XML_SCHEMA <dd>
- \addindex XML_SCHEMA
- The \c XML_SCHEMA tag can be used to specify a XML schema,
- which can be used by a validating XML parser to check the
- syntax of the XML files.
-
-
-This tag requires that the tag \ref cfg_generate_xml "GENERATE_XML" is set to \c YES.
- \anchor cfg_xml_dtd
-<dt>\c XML_DTD <dd>
- \addindex XML_DTD
- The \c XML_DTD tag can be used to specify a XML DTD,
- which can be used by a validating XML parser to check the
- syntax of the XML files.
-
-
-This tag requires that the tag \ref cfg_generate_xml "GENERATE_XML" is set to \c YES.
- \anchor cfg_xml_programlisting
-<dt>\c XML_PROGRAMLISTING <dd>
- \addindex XML_PROGRAMLISTING
- If the \c XML_PROGRAMLISTING tag is set to \c YES doxygen will
- dump the program listings (including syntax highlighting
- and cross-referencing information) to the XML output. Note that
- enabling this will significantly increase the size of the XML output.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_generate_xml "GENERATE_XML" is set to \c YES.
-</dl>
-\section config_docbook Configuration options related to the DOCBOOK output
- \anchor cfg_generate_docbook
-<dl>
-
-<dt>\c GENERATE_DOCBOOK <dd>
- \addindex GENERATE_DOCBOOK
-If the \c GENERATE_DOCBOOK tag is set to \c YES doxygen will generate Docbook files 
-that can be used to generate PDF.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_docbook_output
-<dt>\c DOCBOOK_OUTPUT <dd>
- \addindex DOCBOOK_OUTPUT
-The \c DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. 
-If a relative path is entered the value of \ref cfg_output_directory "OUTPUT_DIRECTORY" will be put in 
-front of it.
-
-The default directory is: <code>docbook</code>.
-
-
-This tag requires that the tag \ref cfg_generate_docbook "GENERATE_DOCBOOK" is set to \c YES.
-</dl>
-\section config_autogen Configuration options for the AutoGen Definitions output
- \anchor cfg_generate_autogen_def
-<dl>
-
-<dt>\c GENERATE_AUTOGEN_DEF <dd>
- \addindex GENERATE_AUTOGEN_DEF
- If the \c GENERATE_AUTOGEN_DEF tag is set to \c YES doxygen will
- generate an AutoGen Definitions (see http://autogen.sf.net) file
- that captures the structure of the code including all
- documentation. Note that this feature is still experimental 
- and incomplete at the moment.
-
-
-The default value is: <code>NO</code>.
-
-</dl>
-\section config_perlmod Configuration options related to the Perl module output
- \anchor cfg_generate_perlmod
-<dl>
-
-<dt>\c GENERATE_PERLMOD <dd>
- \addindex GENERATE_PERLMOD
- If the \c GENERATE_PERLMOD tag is set to \c YES doxygen will
- generate a Perl module file that captures the structure of
- the code including all documentation.
- <br>Note that this 
- feature is still experimental and incomplete at the
- moment.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_perlmod_latex
-<dt>\c PERLMOD_LATEX <dd>
- \addindex PERLMOD_LATEX
- If the \c PERLMOD_LATEX tag is set to \c YES doxygen will generate 
- the necessary \c Makefile rules, \c Perl scripts and \f$\mbox{\LaTeX}\f$ code to be able 
- to generate PDF and DVI output from the Perl module output.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_generate_perlmod "GENERATE_PERLMOD" is set to \c YES.
- \anchor cfg_perlmod_pretty
-<dt>\c PERLMOD_PRETTY <dd>
- \addindex PERLMOD_PRETTY
- If the \c PERLMOD_PRETTY tag is set to \c YES the Perl module output will be 
- nicely formatted so it can be parsed by a human reader.  This is useful 
- if you want to understand what is going on. On the other hand, if this
- tag is set to \c NO the size of the Perl module output will be much smaller
- and Perl will parse it just the same.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_generate_perlmod "GENERATE_PERLMOD" is set to \c YES.
- \anchor cfg_perlmod_makevar_prefix
-<dt>\c PERLMOD_MAKEVAR_PREFIX <dd>
- \addindex PERLMOD_MAKEVAR_PREFIX
- The names of the make variables in the generated `doxyrules.make` file 
- are prefixed with the string contained in \c PERLMOD_MAKEVAR_PREFIX. 
- This is useful so different `doxyrules.make` files included by the same
- `Makefile` don't overwrite each other's variables.
-
-
-This tag requires that the tag \ref cfg_generate_perlmod "GENERATE_PERLMOD" is set to \c YES.
-</dl>
-\section config_preprocessor Configuration options related to the preprocessor
- \anchor cfg_enable_preprocessing
-<dl>
-
-<dt>\c ENABLE_PREPROCESSING <dd>
- \addindex ENABLE_PREPROCESSING
- If the \c ENABLE_PREPROCESSING tag is set to \c YES doxygen will
- evaluate all C-preprocessor directives found in the sources and include
- files.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_macro_expansion
-<dt>\c MACRO_EXPANSION <dd>
- \addindex MACRO_EXPANSION
- If the \c MACRO_EXPANSION tag is set to \c YES doxygen will expand all macro
- names in the source code. If set to \c NO only conditional 
- compilation will be performed. Macro expansion can be done in a controlled
- way by setting \ref cfg_expand_only_predef "EXPAND_ONLY_PREDEF" to \c YES.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" is set to \c YES.
- \anchor cfg_expand_only_predef
-<dt>\c EXPAND_ONLY_PREDEF <dd>
- \addindex EXPAND_ONLY_PREDEF
- If the \c EXPAND_ONLY_PREDEF and \ref cfg_macro_expansion "MACRO_EXPANSION" tags are both set to \c YES
- then the macro expansion is limited to the macros specified with the
- \ref cfg_predefined "PREDEFINED" and \ref cfg_expand_as_defined "EXPAND_AS_DEFINED" tags.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" is set to \c YES.
- \anchor cfg_search_includes
-<dt>\c SEARCH_INCLUDES <dd>
- \addindex SEARCH_INCLUDES
- If the \c SEARCH_INCLUDES tag is set to \c YES the includes files
- in the \ref cfg_include_path "INCLUDE_PATH" will be searched if a \c \#include is found.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" is set to \c YES.
- \anchor cfg_include_path
-<dt>\c INCLUDE_PATH <dd>
- \addindex INCLUDE_PATH
- The \c INCLUDE_PATH tag can be used to specify one or more directories that
- contain include files that are not input files but should be processed by
- the preprocessor.
-
-
-This tag requires that the tag \ref cfg_search_includes "SEARCH_INCLUDES" is set to \c YES.
- \anchor cfg_include_file_patterns
-<dt>\c INCLUDE_FILE_PATTERNS <dd>
- \addindex INCLUDE_FILE_PATTERNS
- You can use the \c INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
- patterns (like `*.h` and `*.hpp`) to filter out the header-files in the 
- directories. If left blank, the patterns specified with \ref cfg_file_patterns "FILE_PATTERNS" will 
- be used.
-
-
-This tag requires that the tag \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" is set to \c YES.
- \anchor cfg_predefined
-<dt>\c PREDEFINED <dd>
- \addindex PREDEFINED
- The \c PREDEFINED tag can be used to specify one or more macro names that
- are defined before the preprocessor is started (similar to the `-D` option of
- e.g. \c gcc). The argument of the tag is a list of macros of the form:
- <code>name</code> or <code>name=definition</code> (no spaces). 
- If the definition and the \c "=" are omitted,  \c "=1" is assumed. To prevent
- a macro definition from being undefined via \c \#undef or recursively expanded
- use the <code>:=</code> operator instead of the \c = operator.
-
-
-This tag requires that the tag \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" is set to \c YES.
- \anchor cfg_expand_as_defined
-<dt>\c EXPAND_AS_DEFINED <dd>
- \addindex EXPAND_AS_DEFINED
- If the \ref cfg_macro_expansion "MACRO_EXPANSION" and
- \ref cfg_expand_only_predef "EXPAND_ONLY_PREDEF" tags are set to \c YES then
- this tag can be used to specify a list of macro names that should be expanded.
- The macro definition that is found in the sources will be used.
- Use the \ref cfg_predefined "PREDEFINED" tag if you want to use a different macro definition that
- overrules the definition found in the source code.
-
-
-This tag requires that the tag \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" is set to \c YES.
- \anchor cfg_skip_function_macros
-<dt>\c SKIP_FUNCTION_MACROS <dd>
- \addindex SKIP_FUNCTION_MACROS
- If the \c SKIP_FUNCTION_MACROS tag is set to \c YES then 
- doxygen's preprocessor will remove all refrences to function-like macros that are alone 
- on a line, have an all uppercase name, and do not end with a semicolon. 
- Such function macros are typically 
- used for boiler-plate code, and will confuse the parser if not removed.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" is set to \c YES.
-</dl>
-\section config_external Configuration options related to external references
- \anchor cfg_tagfiles
-<dl>
-
-<dt>\c TAGFILES <dd>
- \addindex TAGFILES
- The \c TAGFILES tag can be used to specify one or more tag files. 
-
-For each 
-tag file the location of the external documentation should be added. The 
-format of a tag file without this location is as follows: 
-\verbatim
-  TAGFILES = file1 file2 ... 
-\endverbatim
-Adding location for the tag files is done as follows: 
-\verbatim
-  TAGFILES = file1=loc1 "file2 = loc2" ... 
-\endverbatim
-where `loc1` and `loc2` can be relative or absolute paths or URLs.
- See the section \ref external for more information about the use of tag files.
-
- \note
-  Each tag file must have an unique name 
-  (where the name does \e NOT include the path).
-  If a tag file is not located in the directory in which doxygen 
-  is run, you must also specify the path to the tagfile here.
-
- \anchor cfg_generate_tagfile
-<dt>\c GENERATE_TAGFILE <dd>
- \addindex GENERATE_TAGFILE
- When a file name is specified after \c GENERATE_TAGFILE, doxygen will create
- a tag file that is based on the input files it reads.
- See section \ref external for more information about the usage of 
- tag files.
-
- \anchor cfg_allexternals
-<dt>\c ALLEXTERNALS <dd>
- \addindex ALLEXTERNALS
- If the \c ALLEXTERNALS tag is set to \c YES all external class will be listed
- in the class index. If set to \c NO only the inherited external classes
- will be listed.
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_external_groups
-<dt>\c EXTERNAL_GROUPS <dd>
- \addindex EXTERNAL_GROUPS
- If the \c EXTERNAL_GROUPS tag is set to \c YES all external groups will be listed
- in the modules index. If set to \c NO, only the current project's groups will
- be listed.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_external_pages
-<dt>\c EXTERNAL_PAGES <dd>
- \addindex EXTERNAL_PAGES
- If the \c EXTERNAL_PAGES tag is set to \c YES all external pages will be listed 
- in the related pages index. If set to \c NO, only the current project's 
- pages will be listed.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_perl_path
-<dt>\c PERL_PATH <dd>
- \addindex PERL_PATH
- The \c PERL_PATH should be the absolute path and name of the perl script
- interpreter (i.e. the result of `'which perl'`).
-
-The default file (with absolute path) is: <code>/usr/bin/perl</code>.
-
-</dl>
-\section config_dot Configuration options related to the dot tool
- \anchor cfg_class_diagrams
-<dl>
-
-<dt>\c CLASS_DIAGRAMS <dd>
- \addindex CLASS_DIAGRAMS
- If the \c CLASS_DIAGRAMS tag is set to \c YES doxygen will
- generate a class diagram (in HTML and \f$\mbox{\LaTeX}\f$) for classes with base or
- super classes. Setting the tag to \c NO turns the diagrams off. Note that 
- this option also works with \ref cfg_have_dot "HAVE_DOT" disabled, but it is recommended to 
- install and use \c dot, since it yields more powerful graphs.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_mscgen_path
-<dt>\c MSCGEN_PATH <dd>
- \addindex MSCGEN_PATH
- You can define message sequence charts within doxygen comments using the \ref cmdmsc "\\msc" 
- command. Doxygen will then run the <a href="http://www.mcternan.me.uk/mscgen/">mscgen tool</a>) to 
- produce the chart and insert it in the documentation. The <code>MSCGEN_PATH</code> tag allows you to 
- specify the directory where the \c mscgen tool resides. If left empty the tool is assumed to 
- be found in the default search path.
-
- \anchor cfg_dia_path
-<dt>\c DIA_PATH <dd>
- \addindex DIA_PATH
-You can include diagrams made with dia in doxygen documentation. Doxygen will then run 
-dia to produce the diagram and insert it in the documentation. The DIA_PATH tag allows 
-you to specify the directory where the dia binary resides. If left empty dia is assumed 
-to be found in the default search path.
-
- \anchor cfg_hide_undoc_relations
-<dt>\c HIDE_UNDOC_RELATIONS <dd>
- \addindex HIDE_UNDOC_RELATIONS
- If set to \c YES, the inheritance and collaboration graphs will hide
- inheritance and usage relations if the target is undocumented
- or is not a class.
-
-
-The default value is: <code>YES</code>.
-
- \anchor cfg_have_dot
-<dt>\c HAVE_DOT <dd>
- \addindex HAVE_DOT
- If you set the \c HAVE_DOT tag to \c YES then doxygen will assume the \c dot tool is
- available from the \c path. This tool is part of 
- <a href="http://www.graphviz.org/">Graphviz</a>, a graph 
- visualization toolkit from AT\&T and Lucent Bell Labs. The other options in 
- this section have no effect if this option is set to \c NO
-
-
-The default value is: <code>NO</code>.
-
- \anchor cfg_dot_num_threads
-<dt>\c DOT_NUM_THREADS <dd>
- \addindex DOT_NUM_THREADS
- The \c DOT_NUM_THREADS specifies the number of \c dot invocations doxygen is 
- allowed to run in parallel. When set to \c 0 doxygen will 
- base this on the number of processors available in the system. You can set it 
- explicitly to a value larger than 0 to get control over the balance 
- between CPU load and processing speed.
-
-
- Minimum value: <code>0</code>, maximum value: <code>32</code>, default value: <code>0</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_dot_fontname
-<dt>\c DOT_FONTNAME <dd>
- \addindex DOT_FONTNAME
- When you want a differently looking font n the dot files that doxygen generates
- you can specify the font name 
- using \c DOT_FONTNAME. You need to make sure dot is able to find the font, 
- which can be done by putting it in a standard location or by setting the 
- \c DOTFONTPATH environment variable or by setting \ref cfg_dot_fontpath "DOT_FONTPATH" to the 
- directory containing the font.
-
-The default value is: <code>Helvetica</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_dot_fontsize
-<dt>\c DOT_FONTSIZE <dd>
- \addindex DOT_FONTSIZE
- The \c DOT_FONTSIZE tag can be used to set the size (in points) of the font of dot graphs.
-
-
- Minimum value: <code>4</code>, maximum value: <code>24</code>, default value: <code>10</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_dot_fontpath
-<dt>\c DOT_FONTPATH <dd>
- \addindex DOT_FONTPATH
- By default doxygen will tell \c dot to use the default font as specified with \ref cfg_dot_fontname "DOT_FONTNAME".
- If you specify a 
- different font using \ref cfg_dot_fontname "DOT_FONTNAME" you can set the path where \c dot 
- can find it using this tag.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_class_graph
-<dt>\c CLASS_GRAPH <dd>
- \addindex CLASS_GRAPH
- If the \c CLASS_GRAPH tag is set to \c YES then doxygen
- will generate a graph for each documented class showing the direct and
- indirect inheritance relations. Setting this tag to \c YES will force 
- the \ref cfg_class_diagrams "CLASS_DIAGRAMS" tag to \c NO.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_collaboration_graph
-<dt>\c COLLABORATION_GRAPH <dd>
- \addindex COLLABORATION_GRAPH
- If the \c COLLABORATION_GRAPH tag is set to \c YES then doxygen
- will generate a graph for each documented class showing the direct and
- indirect implementation dependencies (inheritance, containment, and
- class references variables) of the class with other documented classes.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_group_graphs
-<dt>\c GROUP_GRAPHS <dd>
- \addindex GROUP_GRAPHS
- If the \c GROUP_GRAPHS tag is set to \c YES then doxygen
- will generate a graph for groups, showing the direct groups dependencies.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_uml_look
-<dt>\c UML_LOOK <dd>
- \addindex UML_LOOK
- If the \c UML_LOOK tag is set to \c YES doxygen will generate inheritance and
- collaboration diagrams in a style similar to the OMG's Unified Modeling
- Language.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_uml_limit_num_fields
-<dt>\c UML_LIMIT_NUM_FIELDS <dd>
- \addindex UML_LIMIT_NUM_FIELDS
- If the \ref cfg_uml_look "UML_LOOK" tag is enabled, the fields and methods are shown inside 
- the class node. If there are many fields or methods and many nodes the 
- graph may become too big to be useful. The \c UML_LIMIT_NUM_FIELDS 
- threshold limits the number of items for each type to make the size more 
- manageable. Set this to 0 for no limit. Note that the threshold may be
- exceeded by 50% before the limit is enforced. So when you set the threshold
- to 10, up to 15 fields may appear, but if the number exceeds 15, the
- total amount of fields shown is limited to 10.
-
-
- Minimum value: <code>0</code>, maximum value: <code>100</code>, default value: <code>10</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_template_relations
-<dt>\c TEMPLATE_RELATIONS <dd>
- \addindex TEMPLATE_RELATIONS
- If the \c TEMPLATE_RELATIONS tag is set to \c YES then 
- the inheritance and collaboration graphs will show the relations between templates and their instances.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_include_graph
-<dt>\c INCLUDE_GRAPH <dd>
- \addindex INCLUDE_GRAPH
- If the \c INCLUDE_GRAPH, \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" and
- \ref cfg_search_includes "SEARCH_INCLUDES" 
- tags are set to \c YES then doxygen will generate a graph for each documented file
- showing the direct and indirect include dependencies of the file with other
- documented files.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_included_by_graph
-<dt>\c INCLUDED_BY_GRAPH <dd>
- \addindex INCLUDED_BY_GRAPH
- If the \c INCLUDED_BY_GRAPH, \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" and
- \ref cfg_search_includes "SEARCH_INCLUDES"
- tags are set to \c YES then doxygen will generate a graph for each documented file
- showing the direct and indirect include dependencies of the file with other
- documented files.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_call_graph
-<dt>\c CALL_GRAPH <dd>
- \addindex CALL_GRAPH
- If the \c CALL_GRAPH tag is set to \c YES then doxygen will 
- generate a call dependency graph for every global function or class method. 
- <br>Note that enabling this option will significantly increase the time of a run.
- So in most cases it will be better to enable call graphs for selected 
- functions only using the \ref cmdcallgraph "\\callgraph" command.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_caller_graph
-<dt>\c CALLER_GRAPH <dd>
- \addindex CALLER_GRAPH
- If the \c CALLER_GRAPH tag is set to \c YES then doxygen will 
- generate a caller dependency graph for every global function or class method. 
- <br>Note that enabling this option will significantly increase the time of a run.
- So in most cases it will be better to enable caller graphs for selected 
- functions only using the \ref cmdcallergraph "\\callergraph" command.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_graphical_hierarchy
-<dt>\c GRAPHICAL_HIERARCHY <dd>
- \addindex GRAPHICAL_HIERARCHY
- If the \c GRAPHICAL_HIERARCHY tag is set to \c YES then 
- doxygen will graphical hierarchy of all classes instead of a textual one.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_directory_graph
-<dt>\c DIRECTORY_GRAPH <dd>
- \addindex DIRECTORY_GRAPH
- If the \c DIRECTORY_GRAPH tag is set 
- to \c YES then doxygen will show the dependencies a directory has on other directories
- in a graphical way. The dependency relations are determined by the \c \#include
- relations between the files in the directories.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_dot_image_format
-<dt>\c DOT_IMAGE_FORMAT <dd>
- \addindex DOT_IMAGE_FORMAT
- The \c DOT_IMAGE_FORMAT tag can be used to set the image format of the images
- generated by \c dot.
- \note If you choose \c svg you need to set 
- \ref cfg_html_file_extension "HTML_FILE_EXTENSION" to \c xhtml in order to make the SVG files
- visible in IE 9+ (other browsers do not have this requirement).
-
-Possible values are: 
-<code>png</code>, 
-<code>jpg</code>, 
-<code>gif</code> and 
-<code>svg</code>.
-
-
-The default value is: <code>png</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_interactive_svg
-<dt>\c INTERACTIVE_SVG <dd>
- \addindex INTERACTIVE_SVG
- If \ref cfg_dot_image_format "DOT_IMAGE_FORMAT" is set to \c svg, then this option can be set to \c YES to
- enable generation of interactive SVG images that allow zooming and panning. 
- <br>Note that this requires a modern browser other than Internet Explorer. 
- Tested and working are Firefox, Chrome, Safari, and Opera.
- \note For IE 9+ you need to set \ref cfg_html_file_extension "HTML_FILE_EXTENSION" to \c xhtml in order 
- to make the SVG files visible. Older versions of IE do not have SVG support.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_dot_path
-<dt>\c DOT_PATH <dd>
- \addindex DOT_PATH
- The \c DOT_PATH tag can be used to specify the path where the \c dot tool can be found. 
- If left blank, it is assumed the \c dot tool can be found in the \c path.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_dotfile_dirs
-<dt>\c DOTFILE_DIRS <dd>
- \addindex DOTFILE_DIRS
- The \c DOTFILE_DIRS tag can be used to specify one or more directories that 
- contain dot files that are included in the documentation (see the
- \ref cmddotfile "\\dotfile" command).
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_mscfile_dirs
-<dt>\c MSCFILE_DIRS <dd>
- \addindex MSCFILE_DIRS
- The \c MSCFILE_DIRS tag can be used to specify one or more directories that 
- contain msc files that are included in the documentation (see the
- \ref cmdmscfile "\\mscfile" command).
-
- \anchor cfg_diafile_dirs
-<dt>\c DIAFILE_DIRS <dd>
- \addindex DIAFILE_DIRS
- The \c DIAFILE_DIRS tag can be used to specify one or more directories that 
- contain dia files that are included in the documentation (see the
- \ref cmdmscfile "\\diafile" command).
-
- \anchor cfg_dot_graph_max_nodes
-<dt>\c DOT_GRAPH_MAX_NODES <dd>
- \addindex DOT_GRAPH_MAX_NODES
- The \c DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
- nodes that will be shown in the graph. If the number of nodes in a graph
- becomes larger than this value, doxygen will truncate the graph, which is 
- visualized by representing a node as a red box. Note that doxygen if the number
- of direct children of the root node in a graph is already larger than
- \c DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
- that the size of a graph can be further restricted by \ref cfg_max_dot_graph_depth "MAX_DOT_GRAPH_DEPTH".
-
-
- Minimum value: <code>0</code>, maximum value: <code>10000</code>, default value: <code>50</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_max_dot_graph_depth
-<dt>\c MAX_DOT_GRAPH_DEPTH <dd>
- \addindex MAX_DOT_GRAPH_DEPTH
- The \c MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
- graphs generated by \c dot. A depth value of 3 means that only nodes reachable
- from the root by following a path via at most 3 edges will be shown. Nodes
- that lay further from the root node will be omitted. Note that setting this
- option to 1 or 2 may greatly reduce the computation time needed for large
- code bases. Also note that the size of a graph can be further restricted by
- \ref cfg_dot_graph_max_nodes "DOT_GRAPH_MAX_NODES". Using a depth of 0 means no depth restriction.
-
-
- Minimum value: <code>0</code>, maximum value: <code>1000</code>, default value: <code>0</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_dot_transparent
-<dt>\c DOT_TRANSPARENT <dd>
- \addindex DOT_TRANSPARENT
- Set the \c DOT_TRANSPARENT tag to \c YES to generate images with a transparent
- background. This is disabled by default, because dot on Windows does not 
- seem to support this out of the box.
- <br>
- Warning: Depending on the platform used, 
- enabling this option may lead to badly anti-aliased labels on the edges of 
- a graph (i.e. they become hard to read).
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_dot_multi_targets
-<dt>\c DOT_MULTI_TARGETS <dd>
- \addindex DOT_MULTI_TARGETS
- Set the \c DOT_MULTI_TARGETS tag to \c YES allow dot to generate multiple output
- files in one run (i.e. multiple -o and -T options on the command line). This
- makes \c dot run faster, but since only newer versions of \c dot (>1.8.10)
- support this, this feature is disabled by default.
-
-
-The default value is: <code>NO</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_generate_legend
-<dt>\c GENERATE_LEGEND <dd>
- \addindex GENERATE_LEGEND
- If the \c GENERATE_LEGEND tag is set to \c YES doxygen will
- generate a legend page explaining the meaning of the various boxes and
- arrows in the dot generated graphs.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
- \anchor cfg_dot_cleanup
-<dt>\c DOT_CLEANUP <dd>
- \addindex DOT_CLEANUP
-If the \c DOT_CLEANUP tag is set to \c YES doxygen will
-remove the intermediate dot files that are used to generate the various graphs.
-
-
-The default value is: <code>YES</code>.
-
-
-This tag requires that the tag \ref cfg_have_dot "HAVE_DOT" is set to \c YES.
-</dl>
-\section config_examples Examples
-
-Suppose you have a simple project consisting of two files: a source file 
-\c example.cc and a header file \c example.h.
-Then a minimal configuration file is as simple as:
-\verbatim
-INPUT            = example.cc example.h
-\endverbatim
-
-Assuming the example makes use of Qt classes and \c perl is located 
-in <code>/usr/bin</code>, a more realistic configuration file would be:
-\verbatim
-PROJECT_NAME     = Example
-INPUT            = example.cc example.h
-WARNINGS         = YES
-TAGFILES         = qt.tag
-PERL_PATH        = /usr/local/bin/perl
-SEARCHENGINE     = NO
-\endverbatim
-
-To generate the documentation for the 
-<a href="http://www.stack.nl/~dimitri/qdbttabular/index.html">QdbtTabular</a> package
-I have used the following configuration file:
-\verbatim
-PROJECT_NAME     = QdbtTabular
-OUTPUT_DIRECTORY = html
-WARNINGS         = YES
-INPUT            = examples/examples.doc src
-FILE_PATTERNS    = *.cc *.h
-INCLUDE_PATH     = examples
-TAGFILES         = qt.tag
-PERL_PATH        = /usr/bin/perl
-SEARCHENGINE     = YES
-\endverbatim
-
-To regenerate the Qt-1.44 documentation from the sources, you could use the
-following config file:
-\verbatim
-PROJECT_NAME         = Qt
-OUTPUT_DIRECTORY     = qt_docs
-HIDE_UNDOC_MEMBERS   = YES
-HIDE_UNDOC_CLASSES   = YES
-ENABLE_PREPROCESSING = YES
-MACRO_EXPANSION      = YES
-EXPAND_ONLY_PREDEF   = YES
-SEARCH_INCLUDES      = YES
-FULL_PATH_NAMES      = YES
-STRIP_FROM_PATH      = $(QTDIR)/
-PREDEFINED           = USE_TEMPLATECLASS Q_EXPORT= \
-                       QArrayT:=QArray \
-                       QListT:=QList \
-                       QDictT:=QDict \
-                       QQueueT:=QQueue \
-                       QVectorT:=QVector \
-                       QPtrDictT:=QPtrDict \
-                       QIntDictT:=QIntDict \
-                       QStackT:=QStack \
-                       QDictIteratorT:=QDictIterator \
-                       QListIteratorT:=QListIterator \
-                       QCacheT:=QCache \
-                       QCacheIteratorT:=QCacheIterator \
-                       QIntCacheT:=QIntCache \
-                       QIntCacheIteratorT:=QIntCacheIterator \
-                       QIntDictIteratorT:=QIntDictIterator \
-                       QPtrDictIteratorT:=QPtrDictIterator
-INPUT                = $(QTDIR)/doc \
-                       $(QTDIR)/src/widgets \
-                       $(QTDIR)/src/kernel \
-                       $(QTDIR)/src/dialogs \
-                       $(QTDIR)/src/tools
-FILE_PATTERNS        = *.cpp *.h q*.doc
-INCLUDE_PATH         = $(QTDIR)/include 
-RECURSIVE            = YES
-\endverbatim
-
-For the Qt-2.1 sources I recommend to use the following settings:
-\verbatim
-PROJECT_NAME          = Qt
-PROJECT_NUMBER        = 2.1
-HIDE_UNDOC_MEMBERS    = YES
-HIDE_UNDOC_CLASSES    = YES
-SOURCE_BROWSER        = YES
-INPUT                 = $(QTDIR)/src
-FILE_PATTERNS         = *.cpp *.h q*.doc
-RECURSIVE             = YES
-EXCLUDE_PATTERNS      = *codec.cpp moc_* */compat/* */3rdparty/*
-ALPHABETICAL_INDEX    = YES
-COLS_IN_ALPHA_INDEX   = 3
-IGNORE_PREFIX         = Q
-ENABLE_PREPROCESSING  = YES
-MACRO_EXPANSION       = YES
-INCLUDE_PATH          = $(QTDIR)/include
-PREDEFINED            = Q_PROPERTY(x)= \
-                        Q_OVERRIDE(x)= \
-                        Q_EXPORT= \
-                        Q_ENUMS(x)= \
-                        "QT_STATIC_CONST=static const " \
-                        _WS_X11_ \
-                        INCLUDE_MENUITEM_DEF
-EXPAND_ONLY_PREDEF    = YES
-EXPAND_AS_DEFINED     = Q_OBJECT_FAKE Q_OBJECT ACTIVATE_SIGNAL_WITH_PARAM \
-                        Q_VARIANT_AS
-\endverbatim
-
-Here doxygen's preprocessor is used to substitute some
-macro names that are normally substituted by the C preprocessor,
-but without doing full macro expansion.
-
-
-\htmlonly
-Go to the <a href="commands.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
index 70d52e4..db41f95 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -37,10 +37,10 @@ The simplest form of an alias is a simple substitution of the form
  ALIASES += sideeffect="\par Side Effects:\n" 
 \endverbatim
  will allow you to
- put the command \\sideeffect (or \@sideeffect) in the documentation, which 
+ put the command `\sideeffect` (or `@sideeffect`) in the documentation, which 
  will result in a user-defined paragraph with heading <b>Side Effects:</b>.
 
-Note that you can put \\n's in the value part of an alias to insert newlines.
+Note that you can put `\n`'s in the value part of an alias to insert newlines.
 
 Also note that you can redefine existing special commands if you wish.
 
@@ -50,7 +50,7 @@ combination with aliases.
 \section custcmd_complex Aliases with arguments
 Aliases can also have one or more arguments. In the alias definition you then need
 to specify the number of arguments between curly braces. In the value part of the
-definition you can place \\x markers, where 'x' represents the argument number starting
+definition you can place `\x` markers, where '`x`' represents the argument number starting
 with 1.
 
 Here is an example of an alias definition with a single argument:
@@ -85,11 +85,11 @@ inside the comment block and it will expand to
 where the command with a single argument would still work as shown before.
 
 Aliases can also be expressed in terms of other aliases, e.g. a new command
-\\reminder can be expressed as a \\xrefitem via an intermediate \\xreflist command
+`\reminder` can be expressed as a \ref cmdxrefitem "\\xrefitem" via an intermediate `\xreflist` command
 as follows:
 \verbatim
-ALIASES += xreflist{3}="\xrefitem \1 \"\2\" \"\3\" " \
-ALIASES += reminder="\xreflist{reminders,Reminder,Reminders}" \
+ALIASES += xreflist{3}="\xrefitem \1 \"\2\" \"\3\" "
+ALIASES += reminder="\xreflist{reminders,Reminder,Reminders}"
 \endverbatim
 
 Note that if for aliases with more than one argument a comma is used as a separator,
@@ -98,7 +98,7 @@ i.e.
 \verbatim
 \l{SomeClass,Some text\, with an escaped comma} 
 \endverbatim
-given the alias definition of \\l in the example above.
+given the alias definition of `\l` in the example above.
 
 \section custcmd_nesting Nesting custom command
 
index 6e321bd..7252a4a 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -389,7 +389,7 @@ result this works even for very large projects where reading all XML
 files as one big DOM tree would not fit into memory.
 
 See <a href="https://github.com/michaeljones/breathe">the Breathe project</a> for
-a example that uses doxygen XML output from Python to bridge it with the 
+an example that uses doxygen XML output from Python to bridge it with the 
 <a href="http://sphinx.pocoo.org/">Sphinx</a> document generator.
 
 
index 59a81cc..bafb21d 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -83,7 +83,7 @@
   <li> A <b>dotted dark green</b> arrow indicates private inheritance.
   </ul>
 
-  The elements in the class diagram in \f$\mbox{\LaTeX}\f$ have the 
+  The elements in the class diagram in \LaTeX have the 
   following meaning:
   <ul>
   <li> A \b white box indicates a class.
        edge of the arrow is labeled with the variable(s) responsible for the
        relation.
        Class \c A uses class \c B, if class \c A has a member variable \c m 
-       of type C, where B is a subtype of C (e.g. `C` could be `B`, `B*`, `T\<B\>*`). 
+       of type C, where B is a subtype of C (e.g. `C` could be `B`, `B*`, `T<B>*`). 
   </ul>
 
 
index 1b96361..6ef6bf0 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -460,11 +460,18 @@ settings where overruled.
 When using doxygen for Fortran code you should
 set \ref cfg_optimize_for_fortran "OPTIMIZE_FOR_FORTRAN" to \c YES.
 
+The parser tries to guess if the source code is fixed format Fortran or
+free format Fortran code. This may not always be correct. If not
+one should use \ref cfg_extension_mapping "EXTENSION_MAPPING" to correct this.
+By setting `EXTENSION_MAPPING =  f=FortranFixed f90=FortranFree` files with
+extension \c f90 are interpreted as fixed format Fortran code and files with
+extension \c f are interpreted as free format Fortran code.
+
 For Fortran "!>" or "!<" starts a comment and "!!" or "!>" can be used to 
-continuate a one line comment into a multi-line comment.
+continue an one line comment into a multi-line comment.
 
 Here is an example of a documented Fortran subroutine:
-\verbatim
+\code{.f}
   !> Build the restriction matrix for the aggregation 
   !! method.
   !! @param aggr information about the aggregates
@@ -474,18 +481,20 @@ Here is an example of a documented Fortran subroutine:
     Type(SpMtx), intent(in) :: A !< our fine level matrix
     Type(Aggrs), intent(in) :: aggr
     Type(SpMtx), intent(out) :: Restrict !< Our restriction matrix
-\endverbatim
+    !...
+  end subroutine
+\endcode
 
-As a alternative you can also use comments in fixed format code:
+As an alternative you can also use comments in fixed format code:
 
-\verbatim
+\code{.f}
 C> Function comment
 C> another line of comment
       function A(i)
 C> input parameter
         integer i
       end function A
-\endverbatim
+\endcode
 
 \subsection tclblocks Comment blocks in Tcl
 
@@ -541,7 +550,7 @@ commands without the leading namespace use p.e.:
 \verbatim TCL_SUBST = class itcl:class body itcl:body \endverbatim
 -->
 
-Following is a example using doxygen style comments:
+Following is an example using doxygen style comments:
 
 \include tclexample.tcl
  \htmlonly
index c227791..f3a7abc 100644 (file)
@@ -45,6 +45,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-2013
+Doxygen version VERSION, Copyright Dimitri van Heesch 1997-2014
 .SH SEE ALSO
 doxywizard(1).
index 45bec34..8013dad 100644 (file)
 }
 
 \newcommand{\doxyref}[3]{\textbf{#1} (\textnormal{#2}\,\pageref{#3})}
+\newcommand{\lcurly}{\{}
+\newcommand{\rcurly}{\}}
 \newenvironment{DoxyCompactList}
 {\begin{list}{}{
   \setlength{\leftmargin}{0.5cm}
index f62f017..4bac9a9 100644 (file)
@@ -1,7 +1,7 @@
 %
 % 
 %
-% Copyright (C) 1997-2013 by Dimitri van Heesch.
+% Copyright (C) 1997-2014 by Dimitri van Heesch.
 %
 % Permission to use, copy, modify, and distribute this software and its
 % documentation under the terms of the GNU General Public License is hereby 
@@ -24,7 +24,9 @@
 \usepackage{color}
 \usepackage{ifthen}
 \usepackage[table]{xcolor}
+\PassOptionsToPackage{warn}{textcomp}
 \usepackage{textcomp}
+\usepackage[nointegrals]{wasysym}
 \usepackage{alltt}
 \usepackage{ifpdf}
 \ifpdf
@@ -51,6 +53,7 @@
 \usepackage[titles]{tocloft}
 \usepackage{amssymb}
 \usepackage{doxygen}
+\newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}}
 \lstset{language=C++,inputencoding=utf8,basicstyle=\footnotesize,breaklines=true,breakatwhitespace=true,tabsize=8,numbers=left }
 \makeindex
 \setcounter{tocdepth}{3}
index ddad5d7..d84432e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van 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 @@
 /*! \page doxygen_usage Doxygen usage
 
 Doxygen is a command line based utility.  Calling \c doxygen with the
-\c --help option at the command line will give you a brief description of the 
+`--help` option at the command line will give you a brief description of the 
 usage of the program.
 
 All options consist of a leading character <tt>-</tt>, 
@@ -71,7 +71,7 @@ doxygen -w html header.html footer.html stylesheet.css <config_file>
   a file named `Doxyfile` and process that. When this is also not found it
   will used the default settings.
 
-<li>For \f$\mbox{\LaTeX}\f$ output, you can generate the first and last part of \c refman.tex 
+<li>For \LaTeX output, you can generate the first and last part of \c refman.tex 
     (see \ref cfg_latex_header "LATEX_HEADER" and
      \ref cfg_latex_footer "LATEX_FOOTER") and the style sheet included
     by that header (normally <code>doxygen.sty</code>), using the following
@@ -79,7 +79,7 @@ doxygen -w html header.html footer.html stylesheet.css <config_file>
 \verbatim
 doxygen -w latex header.tex footer.tex doxygen.sty <config_file>
 \endverbatim
-If you need non-default options (for instance to use extra \f$\mbox{\LaTeX}\f$ packages) 
+If you need non-default options (for instance to use extra \LaTeX packages) 
 you need to make a config file with those options set correctly and then specify
 that config file after the generated files (make a backup of the configuration
 file first so you don't loose it in case you forget to specify one of the 
index e6fe814..bec143c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -80,7 +80,7 @@ The latter does not affect the way doxygen parses your source code.
 \image latex doxywizard_page3.png "Wizard dialog: Output to produce" width=13cm
 
 You can select one or more of the output formats that doxygen should
-produce. For HTML and LaTeX there are additional options. 
+produce. For HTML and \LaTeX there are additional options. 
 
 \image html doxywizard_page4.png "Wizard dialog: Diagrams to generate"
 \image latex doxywizard_page4.png "Wizard dialog: Diagrams to generate" width=13cm
index 501254d..be7d764 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index bc937e4..e07edd7 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index a4308b6..92d78f0 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -154,10 +154,6 @@ configuration file for project \e a you write:
 \verbatim
 TAGFILES = b.tag=b.chm::
 \endverbatim
-or you can use \c installdox to set the links as follows:
-\verbatim
-installdox -lb.tag@b.chm::
-\endverbatim
 
 <li><b>I don't like the quick index that is put above each HTML page, what do I do?</b>
 
index 87ca4bc..bd548c2 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -37,7 +37,7 @@
 <li>Comes with a GUI frontend (Doxywizard) to ease editing the options and 
     run doxygen. The GUI is available on Windows, Linux, and MacOSX.
 <li>Automatically generates class and collaboration diagrams in HTML (as clickable 
-    image maps) and \f$\mbox{\LaTeX}\f$ (as Encapsulated PostScript images).
+    image maps) and \LaTeX (as Encapsulated PostScript images).
 <li>Uses the `dot` tool of the Graphviz tool kit to generate
     include dependency graphs, collaboration diagrams, call graphs, directory structure
     graphs, and graphical class hierarchy graphs. 
 <li>Generates a list of all members of a class (including any inherited
     members) along with their protection level.
 <li>Outputs documentation in on-line format (XHTML and UNIX man page) and 
-    off-line format (\f$\mbox{\LaTeX}\f$ and RTF) simultaneously 
+    off-line format (\LaTeX and RTF) simultaneously 
     (any of these can be disabled if desired). All formats are optimized for 
     ease of reading. <br>
     Furthermore, compressed HTML can be generated from HTML output using 
     Microsoft's HTML Help Workshop (Windows only) and PDF can be generated 
-    from the \f$\mbox{\LaTeX}\f$ output.
+    from the \LaTeX output.
 <li>Support for various third party help formats including HTML Help,
     docsets, Qt-Help, and eclipse help.
 <li>Includes a full C preprocessor to allow proper parsing of conditional 
@@ -72,7 +72,7 @@
 <li>Includes an Javascript based live search feature to search for symbols
     as you type (for small to medium sized projects).
 <li>You can type normal HTML tags in your documentation. Doxygen will convert
-    them to their equivalent \f$\mbox{\LaTeX}\f$, RTF, and man-page 
+    them to their equivalent \LaTeX, RTF, and man-page 
     counterparts automatically.
 <li>Allows references to documentation generated for other (doxygen documented) 
     projects (or another part of the same project) in a location independent way.
index ddae9ef..1a6208e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
  */
 /*! \page formulas Including formulas 
 
-Doxygen allows you to put \f$\mbox{\LaTeX}\f$ formulas in the
-output (this works only for the HTML and \f$\mbox{\LaTeX}\f$ output, 
+Doxygen allows you to put \LaTeX formulas in the
+output (this works only for the HTML and \LaTeX output, 
 not for the RTF nor for the man page output). To be able to include 
 formulas (as images) in the HTML documentation, you will also need to 
 have the following tools installed
 <ul>
-<li>\c latex: the \f$\mbox{\LaTeX}\f$ compiler, needed to parse the formulas. 
+<li>\c latex: the \LaTeX compiler, needed to parse the formulas. 
     To test I have used the teTeX 1.0 distribution.
 <li>\c dvips: a tool to convert DVI files to PostScript files 
     I have used version 5.92b from Radical Eye software for testing.
@@ -76,7 +76,7 @@ There are three ways to include formulas in the documentation.
   \f]
 <li>Formulas or other latex elements that are not in a math 
     environment can be specified using \\f{environment}, where
-    \c environment is the name of the \f$\mbox{\LaTeX}\f$ environment, 
+    \c environment is the name of the \LaTeX environment, 
     the corresponding end command is \\f}. Here is an example for an 
     equation array
 \verbatim
@@ -96,7 +96,7 @@ There are three ways to include formulas in the documentation.
    \f}
 </ol>
 For the first two commands one should make sure formulas contain 
-valid commands in \f$\mbox{\LaTeX}\f$'s math-mode. For the third command
+valid commands in \LaTeX's math-mode. For the third command
 the section should contain valid command for the specific environment.
 
 \warning Currently, doxygen is not very fault tolerant in recovering 
index d7f6275..4397b76 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 2afb213..b07509c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -25,7 +25,7 @@ of a HTML tag are passed on to the HTML output only
 <ul>
 <li><tt>\<A HREF="..."\></tt> Starts a hyperlink 
                        (if supported by the output format). 
-<li><tt>\<A NAME="..."\></tt> Starts an named anchor 
+<li><tt>\<A NAME="..."\></tt> Starts a named anchor 
                        (if supported by the output format).
 <li><tt>\</A\></tt>    Ends a link or anchor 
 <li><tt>\<B\></tt>     Starts a piece of text displayed in a bold font.
@@ -109,106 +109,270 @@ of a HTML tag are passed on to the HTML output only
 <li><tt>\</VAR\></tt>  Ends a <tt>\<VAR\></tt> section.
 </ul>
 
-The special HTML character entities that are recognized by Doxygen:
-
+The special HTML4 character entities.<br>
+The list of entities with their descriptions has been taken from <a href="http://www.w3.org/TR/html4/sgml/entities.html">Character entity references in HTML 4</a>.
+( Portions &copy; International Organization for Standardization 1986
+  Permission to copy in any form is granted for use with
+  conforming SGML systems and applications as defined in
+  ISO 8879, provided this notice is included in all copies.)
+<ul>
+<li><tt>\&nbsp;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            no-break space = non-breaking space: &nbsp;
+<li><tt>\&iexcl;</tt>`&nbsp;&nbsp;&nbsp;`                 inverted exclamation mark: &iexcl;
+<li><tt>\&cent;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            cent sign: &cent;
+<li><tt>\&pound;</tt>`&nbsp;&nbsp;&nbsp;`                 pound sign: &pound;
+<li><tt>\&curren;</tt>`&nbsp;&nbsp;`                      currency sign: &curren;
+<li><tt>\&yen;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       yen sign = yuan sign: &yen;
+<li><tt>\&brvbar;</tt>`&nbsp;&nbsp;`                      broken bar = broken vertical bar: &brvbar;
+<li><tt>\&sect;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            section sign: &sect;
+<li><tt>\&uml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       diaeresis = spacing diaeresis: &uml;
+<li><tt>\&copy;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            copyright sign: &copy;
+<li><tt>\&ordf;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            feminine ordinal indicator: &ordf;
+<li><tt>\&laquo;</tt>`&nbsp;&nbsp;&nbsp;`                 left-pointing double angle quotation mark = left pointing guillemet: &laquo;
+<li><tt>\&not;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       not sign: &not;
+<li><tt>\&shy;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       soft hyphen = discretionary hyphen: &shy;
+<li><tt>\&reg;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       registered sign = registered trade mark sign: &reg;
+<li><tt>\&macr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            macron = spacing macron = overline = APL overbar: &macr;
+<li><tt>\&deg;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       degree sign: &deg;
+<li><tt>\&plusmn;</tt>`&nbsp;&nbsp;`                      plus-minus sign = plus-or-minus sign: &plusmn;
+<li><tt>\&sup2;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            superscript two = superscript digit two = squared: &sup2;
+<li><tt>\&sup3;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            superscript three = superscript digit three = cubed: &sup3;
+<li><tt>\&acute;</tt>`&nbsp;&nbsp;&nbsp;`                 acute accent = spacing acute: &acute;
+<li><tt>\&micro;</tt>`&nbsp;&nbsp;&nbsp;`                 micro sign: &micro;
+<li><tt>\&para;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            pilcrow sign = paragraph sign: &para;
+<li><tt>\&middot;</tt>`&nbsp;&nbsp;`                      middle dot = Georgian comma = Greek middle dot: &middot;
+<li><tt>\&cedil;</tt>`&nbsp;&nbsp;&nbsp;`                 cedilla = spacing cedilla: &cedil;
+<li><tt>\&sup1;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            superscript one = superscript digit one: &sup1;
+<li><tt>\&ordm;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            masculine ordinal indicator: &ordm;
+<li><tt>\&raquo;</tt>`&nbsp;&nbsp;&nbsp;`                 right-pointing double angle quotation mark = right pointing guillemet: &raquo;
+<li><tt>\&frac14;</tt>`&nbsp;&nbsp;`                      vulgar fraction one quarter = fraction one quarter: &frac14;
+<li><tt>\&frac12;</tt>`&nbsp;&nbsp;`                      vulgar fraction one half = fraction one half: &frac12;
+<li><tt>\&frac34;</tt>`&nbsp;&nbsp;`                      vulgar fraction three quarters = fraction three quarters: &frac34;
+<li><tt>\&iquest;</tt>`&nbsp;&nbsp;`                      inverted question mark = turned question mark: &iquest;
+<li><tt>\&Agrave;</tt>`&nbsp;&nbsp;`                      latin capital letter A with grave = latin capital letter A grave: &Agrave;
+<li><tt>\&Aacute;</tt>`&nbsp;&nbsp;`                      latin capital letter A with acute: &Aacute;
+<li><tt>\&Acirc;</tt>`&nbsp;&nbsp;&nbsp;`                 latin capital letter A with circumflex: &Acirc;
+<li><tt>\&Atilde;</tt>`&nbsp;&nbsp;`                      latin capital letter A with tilde: &Atilde;
+<li><tt>\&Auml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin capital letter A with diaeresis: &Auml;
+<li><tt>\&Aring;</tt>`&nbsp;&nbsp;&nbsp;`                 latin capital letter A with ring above = latin capital letter A ring: &Aring;
+<li><tt>\&AElig;</tt>`&nbsp;&nbsp;&nbsp;`                 latin capital letter AE = latin capital ligature AE: &AElig;
+<li><tt>\&Ccedil;</tt>`&nbsp;&nbsp;`                      latin capital letter C with cedilla: &Ccedil;
+<li><tt>\&Egrave;</tt>`&nbsp;&nbsp;`                      latin capital letter E with grave: &Egrave;
+<li><tt>\&Eacute;</tt>`&nbsp;&nbsp;`                      latin capital letter E with acute: &Eacute;
+<li><tt>\&Ecirc;</tt>`&nbsp;&nbsp;&nbsp;`                 latin capital letter E with circumflex: &Ecirc;
+<li><tt>\&Euml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin capital letter E with diaeresis: &Euml;
+<li><tt>\&Igrave;</tt>`&nbsp;&nbsp;`                      latin capital letter I with grave: &Igrave;
+<li><tt>\&Iacute;</tt>`&nbsp;&nbsp;`                      latin capital letter I with acute: &Iacute;
+<li><tt>\&Icirc;</tt>`&nbsp;&nbsp;&nbsp;`                 latin capital letter I with circumflex: &Icirc;
+<li><tt>\&Iuml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin capital letter I with diaeresis: &Iuml;
+<li><tt>\&ETH;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       latin capital letter ETH: &ETH;
+<li><tt>\&Ntilde;</tt>`&nbsp;&nbsp;`                      latin capital letter N with tilde: &Ntilde;
+<li><tt>\&Ograve;</tt>`&nbsp;&nbsp;`                      latin capital letter O with grave: &Ograve;
+<li><tt>\&Oacute;</tt>`&nbsp;&nbsp;`                      latin capital letter O with acute: &Oacute;
+<li><tt>\&Ocirc;</tt>`&nbsp;&nbsp;&nbsp;`                 latin capital letter O with circumflex: &Ocirc;
+<li><tt>\&Otilde;</tt>`&nbsp;&nbsp;`                      latin capital letter O with tilde: &Otilde;
+<li><tt>\&Ouml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin capital letter O with diaeresis: &Ouml;
+<li><tt>\&times;</tt>`&nbsp;&nbsp;&nbsp;`                 multiplication sign: &times;
+<li><tt>\&Oslash;</tt>`&nbsp;&nbsp;`                      latin capital letter O with stroke = latin capital letter O slash: &Oslash;
+<li><tt>\&Ugrave;</tt>`&nbsp;&nbsp;`                      latin capital letter U with grave: &Ugrave;
+<li><tt>\&Uacute;</tt>`&nbsp;&nbsp;`                      latin capital letter U with acute: &Uacute;
+<li><tt>\&Ucirc;</tt>`&nbsp;&nbsp;&nbsp;`                 latin capital letter U with circumflex: &Ucirc;
+<li><tt>\&Uuml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin capital letter U with diaeresis: &Uuml;
+<li><tt>\&Yacute;</tt>`&nbsp;&nbsp;`                      latin capital letter Y with acute: &Yacute;
+<li><tt>\&THORN;</tt>`&nbsp;&nbsp;&nbsp;`                 latin capital letter THORN: &THORN;
+<li><tt>\&szlig;</tt>`&nbsp;&nbsp;&nbsp;`                 latin small letter sharp s = ess-zed: &szlig;
+<li><tt>\&agrave;</tt>`&nbsp;&nbsp;`                      latin small letter a with grave = latin small letter a grave: &agrave;
+<li><tt>\&aacute;</tt>`&nbsp;&nbsp;`                      latin small letter a with acute: &aacute;
+<li><tt>\&acirc;</tt>`&nbsp;&nbsp;&nbsp;`                 latin small letter a with circumflex: &acirc;
+<li><tt>\&atilde;</tt>`&nbsp;&nbsp;`                      latin small letter a with tilde: &atilde;
+<li><tt>\&auml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin small letter a with diaeresis: &auml;
+<li><tt>\&aring;</tt>`&nbsp;&nbsp;&nbsp;`                 latin small letter a with ring above = latin small letter a ring: &aring;
+<li><tt>\&aelig;</tt>`&nbsp;&nbsp;&nbsp;`                 latin small letter ae = latin small ligature ae: &aelig;
+<li><tt>\&ccedil;</tt>`&nbsp;&nbsp;`                      latin small letter c with cedilla: &ccedil;
+<li><tt>\&egrave;</tt>`&nbsp;&nbsp;`                      latin small letter e with grave: &egrave;
+<li><tt>\&eacute;</tt>`&nbsp;&nbsp;`                      latin small letter e with acute: &eacute;
+<li><tt>\&ecirc;</tt>`&nbsp;&nbsp;&nbsp;`                 latin small letter e with circumflex: &ecirc;
+<li><tt>\&euml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin small letter e with diaeresis: &euml;
+<li><tt>\&igrave;</tt>`&nbsp;&nbsp;`                      latin small letter i with grave: &igrave;
+<li><tt>\&iacute;</tt>`&nbsp;&nbsp;`                      latin small letter i with acute: &iacute;
+<li><tt>\&icirc;</tt>`&nbsp;&nbsp;&nbsp;`                 latin small letter i with circumflex: &icirc;
+<li><tt>\&iuml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin small letter i with diaeresis: &iuml;
+<li><tt>\&eth;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       latin small letter eth: &eth;
+<li><tt>\&ntilde;</tt>`&nbsp;&nbsp;`                      latin small letter n with tilde: &ntilde;
+<li><tt>\&ograve;</tt>`&nbsp;&nbsp;`                      latin small letter o with grave: &ograve;
+<li><tt>\&oacute;</tt>`&nbsp;&nbsp;`                      latin small letter o with acute: &oacute;
+<li><tt>\&ocirc;</tt>`&nbsp;&nbsp;&nbsp;`                 latin small letter o with circumflex: &ocirc;
+<li><tt>\&otilde;</tt>`&nbsp;&nbsp;`                      latin small letter o with tilde: &otilde;
+<li><tt>\&ouml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin small letter o with diaeresis: &ouml;
+<li><tt>\&divide;</tt>`&nbsp;&nbsp;`                      division sign: &divide;
+<li><tt>\&oslash;</tt>`&nbsp;&nbsp;`                      latin small letter o with stroke, = latin small letter o slash: &oslash;
+<li><tt>\&ugrave;</tt>`&nbsp;&nbsp;`                      latin small letter u with grave: &ugrave;
+<li><tt>\&uacute;</tt>`&nbsp;&nbsp;`                      latin small letter u with acute: &uacute;
+<li><tt>\&ucirc;</tt>`&nbsp;&nbsp;&nbsp;`                 latin small letter u with circumflex: &ucirc;
+<li><tt>\&uuml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin small letter u with diaeresis: &uuml;
+<li><tt>\&yacute;</tt>`&nbsp;&nbsp;`                      latin small letter y with acute: &yacute;
+<li><tt>\&thorn;</tt>`&nbsp;&nbsp;&nbsp;`                 latin small letter thorn: &thorn;
+<li><tt>\&yuml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin small letter y with diaeresis: &yuml;
+<li><tt>\&fnof;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin small f with hook = function = florin: &fnof;
+<li><tt>\&Alpha;</tt>`&nbsp;&nbsp;&nbsp;`                 greek capital letter alpha: &Alpha;
+<li><tt>\&Beta;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            greek capital letter beta: &Beta;
+<li><tt>\&Gamma;</tt>`&nbsp;&nbsp;&nbsp;`                 greek capital letter gamma: &Gamma;
+<li><tt>\&Delta;</tt>`&nbsp;&nbsp;&nbsp;`                 greek capital letter delta: &Delta;
+<li><tt>\&Epsilon;</tt>`&nbsp;`                           greek capital letter epsilon: &Epsilon;
+<li><tt>\&Zeta;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            greek capital letter zeta: &Zeta;
+<li><tt>\&Eta;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek capital letter eta: &Eta;
+<li><tt>\&Theta;</tt>`&nbsp;&nbsp;&nbsp;`                 greek capital letter theta: &Theta;
+<li><tt>\&Iota;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            greek capital letter iota: &Iota;
+<li><tt>\&Kappa;</tt>`&nbsp;&nbsp;&nbsp;`                 greek capital letter kappa: &Kappa;
+<li><tt>\&Lambda;</tt>`&nbsp;&nbsp;`                      greek capital letter lambda: &Lambda;
+<li><tt>\&Mu;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  greek capital letter mu: &Mu;
+<li><tt>\&Nu;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  greek capital letter nu: &Nu;
+<li><tt>\&Xi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  greek capital letter xi: &Xi;
+<li><tt>\&Omicron;</tt>`&nbsp;`                           greek capital letter omicron: &Omicron;
+<li><tt>\&Pi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  greek capital letter pi: &Pi;
+<li><tt>\&Rho;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek capital letter rho: &Rho;
+<li><tt>\&Sigma;</tt>`&nbsp;&nbsp;&nbsp;`                 greek capital letter sigma: &Sigma;
+<li><tt>\&Tau;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek capital letter tau: &Tau;
+<li><tt>\&Upsilon;</tt>`&nbsp;`                           greek capital letter upsilon: &Upsilon;
+<li><tt>\&Phi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek capital letter phi: &Phi;
+<li><tt>\&Chi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek capital letter chi: &Chi;
+<li><tt>\&Psi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek capital letter psi: &Psi;
+<li><tt>\&Omega;</tt>`&nbsp;&nbsp;&nbsp;`                 greek capital letter omega: &Omega;
+<li><tt>\&alpha;</tt>`&nbsp;&nbsp;&nbsp;`                 greek small letter alpha: &alpha;
+<li><tt>\&beta;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            greek small letter beta: &beta;
+<li><tt>\&gamma;</tt>`&nbsp;&nbsp;&nbsp;`                 greek small letter gamma: &gamma;
+<li><tt>\&delta;</tt>`&nbsp;&nbsp;&nbsp;`                 greek small letter delta: &delta;
+<li><tt>\&epsilon;</tt>`&nbsp;`                           greek small letter epsilon: &epsilon;
+<li><tt>\&zeta;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            greek small letter zeta: &zeta;
+<li><tt>\&eta;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek small letter eta: &eta;
+<li><tt>\&theta;</tt>`&nbsp;&nbsp;&nbsp;`                 greek small letter theta: &theta;
+<li><tt>\&iota;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            greek small letter iota: &iota;
+<li><tt>\&kappa;</tt>`&nbsp;&nbsp;&nbsp;`                 greek small letter kappa: &kappa;
+<li><tt>\&lambda;</tt>`&nbsp;&nbsp;`                      greek small letter lambda: &lambda;
+<li><tt>\&mu;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  greek small letter mu: &mu;
+<li><tt>\&nu;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  greek small letter nu: &nu;
+<li><tt>\&xi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  greek small letter xi: &xi;
+<li><tt>\&omicron;</tt>`&nbsp;`                           greek small letter omicron: &omicron;
+<li><tt>\&pi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  greek small letter pi: &pi;
+<li><tt>\&rho;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek small letter rho: &rho;
+<li><tt>\&sigmaf;</tt>`&nbsp;&nbsp;`                      greek small letter final sigma: &sigmaf;
+<li><tt>\&sigma;</tt>`&nbsp;&nbsp;&nbsp;`                 greek small letter sigma: &sigma;
+<li><tt>\&tau;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek small letter tau: &tau;
+<li><tt>\&upsilon;</tt>`&nbsp;`                           greek small letter upsilon: &upsilon;
+<li><tt>\&phi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek small letter phi: &phi;
+<li><tt>\&chi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek small letter chi: &chi;
+<li><tt>\&psi;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek small letter psi: &psi;
+<li><tt>\&omega;</tt>`&nbsp;&nbsp;&nbsp;`                 greek small letter omega: &omega;
+<li><tt>\&thetasym;</tt>                                  greek small letter theta symbol: &thetasym;
+<li><tt>\&upsih;</tt>`&nbsp;&nbsp;&nbsp;`                 greek upsilon with hook symbol: &upsih;
+<li><tt>\&piv;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       greek pi symbol: &piv;
+<li><tt>\&bull;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            bullet = black small circle: &bull;
+<li><tt>\&hellip;</tt>`&nbsp;&nbsp;`                      horizontal ellipsis = three dot leader: &hellip;
+<li><tt>\&prime;</tt>`&nbsp;&nbsp;&nbsp;`                 prime = minutes = feet: &prime;
+<li><tt>\&Prime;</tt>`&nbsp;&nbsp;&nbsp;`                 double prime = seconds = inches: &Prime;
+<li><tt>\&oline;</tt>`&nbsp;&nbsp;&nbsp;`                 overline = spacing overscore: &oline;
+<li><tt>\&frasl;</tt>`&nbsp;&nbsp;&nbsp;`                 fraction slash: &frasl;
+<li><tt>\&weierp;</tt>`&nbsp;&nbsp;`                      script capital P = power set = Weierstrass p: &weierp;
+<li><tt>\&image;</tt>`&nbsp;&nbsp;&nbsp;`                 blackletter capital I = imaginary part: &image;
+<li><tt>\&real;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            blackletter capital R = real part symbol: &real;
+<li><tt>\&trade;</tt>`&nbsp;&nbsp;&nbsp;`                 trade mark sign: &trade;
+<li><tt>\&alefsym;</tt>`&nbsp;`                           alef symbol = first transfinite cardinal: &alefsym;
+<li><tt>\&larr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            leftwards arrow: &larr;
+<li><tt>\&uarr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            upwards arrow: &uarr;
+<li><tt>\&rarr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            rightwards arrow: &rarr;
+<li><tt>\&darr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            downwards arrow: &darr;
+<li><tt>\&harr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            left right arrow: &harr;
+<li><tt>\&crarr;</tt>`&nbsp;&nbsp;&nbsp;`                 downwards arrow with corner leftwards = carriage return: &crarr;
+<li><tt>\&lArr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            leftwards double arrow: &lArr;
+<li><tt>\&uArr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            upwards double arrow: &uArr;
+<li><tt>\&rArr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            rightwards double arrow: &rArr;
+<li><tt>\&dArr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            downwards double arrow: &dArr;
+<li><tt>\&hArr;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            left right double arrow: &hArr;
+<li><tt>\&forall;</tt>`&nbsp;&nbsp;`                      for all: &forall;
+<li><tt>\&part;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            partial differential: &part;
+<li><tt>\&exist;</tt>`&nbsp;&nbsp;&nbsp;`                 there exists: &exist;
+<li><tt>\&empty;</tt>`&nbsp;&nbsp;&nbsp;`                 empty set = null set = diameter: &empty;
+<li><tt>\&nabla;</tt>`&nbsp;&nbsp;&nbsp;`                 nabla = backward difference: &nabla;
+<li><tt>\&isin;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            element of: &isin;
+<li><tt>\&notin;</tt>`&nbsp;&nbsp;&nbsp;`                 not an element of: &notin;
+<li><tt>\&ni;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  contains as member: &ni;
+<li><tt>\&prod;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            n-ary product = product sign: &prod;
+<li><tt>\&sum;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       n-ary sumation: &sum;
+<li><tt>\&minus;</tt>`&nbsp;&nbsp;&nbsp;`                 minus sign: &minus;
+<li><tt>\&lowast;</tt>`&nbsp;&nbsp;`                      asterisk operator: &lowast;
+<li><tt>\&radic;</tt>`&nbsp;&nbsp;&nbsp;`                 square root = radical sign: &radic;
+<li><tt>\&prop;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            proportional to: &prop;
+<li><tt>\&infin;</tt>`&nbsp;&nbsp;&nbsp;`                 infinity: &infin;
+<li><tt>\&ang;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       angle: &ang;
+<li><tt>\&and;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       logical and = wedge: &and;
+<li><tt>\&or;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  logical or = vee: &or;
+<li><tt>\&cap;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       intersection = cap: &cap;
+<li><tt>\&cup;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       union = cup: &cup;
+<li><tt>\&int;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       integral: &int;
+<li><tt>\&there4;</tt>`&nbsp;&nbsp;`                      therefore: &there4;
+<li><tt>\&sim;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       tilde operator = varies with = similar to: &sim;
+<li><tt>\&cong;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            approximately equal to: &cong;
+<li><tt>\&asymp;</tt>`&nbsp;&nbsp;&nbsp;`                 almost equal to = asymptotic to: &asymp;
+<li><tt>\&ne;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  not equal to: &ne;
+<li><tt>\&equiv;</tt>`&nbsp;&nbsp;&nbsp;`                 identical to: &equiv;
+<li><tt>\&le;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  less-than or equal to: &le;
+<li><tt>\&ge;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  greater-than or equal to: &ge;
+<li><tt>\&sub;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       subset of: &sub;
+<li><tt>\&sup;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       superset of: &sup;
+<li><tt>\&nsub;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            not a subset of: &nsub;
+<li><tt>\&sube;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            subset of or equal to: &sube;
+<li><tt>\&supe;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            superset of or equal to: &supe;
+<li><tt>\&oplus;</tt>`&nbsp;&nbsp;&nbsp;`                 circled plus = direct sum: &oplus;
+<li><tt>\&otimes;</tt>`&nbsp;&nbsp;`                      circled times = vector product: &otimes;
+<li><tt>\&perp;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            up tack = orthogonal to = perpendicular: &perp;
+<li><tt>\&sdot;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            dot operator: &sdot;
+<li><tt>\&lceil;</tt>`&nbsp;&nbsp;&nbsp;`                 left ceiling = apl upstile: &lceil;
+<li><tt>\&rceil;</tt>`&nbsp;&nbsp;&nbsp;`                 right ceiling: &rceil;
+<li><tt>\&lfloor;</tt>`&nbsp;&nbsp;`                      left floor = apl downstile: &lfloor;
+<li><tt>\&rfloor;</tt>`&nbsp;&nbsp;`                      right floor: &rfloor;
+<li><tt>\&lang;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            left-pointing angle bracket = bra: &lang;
+<li><tt>\&rang;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            right-pointing angle bracket = ket: &rang;
+<li><tt>\&loz;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       lozenge: &loz;
+<li><tt>\&spades;</tt>`&nbsp;&nbsp;`                      black spade suit: &spades;
+<li><tt>\&clubs;</tt>`&nbsp;&nbsp;&nbsp;`                 black club suit = shamrock: &clubs;
+<li><tt>\&hearts;</tt>`&nbsp;&nbsp;`                      black heart suit = valentine: &hearts;
+<li><tt>\&diams;</tt>`&nbsp;&nbsp;&nbsp;`                 black diamond suit: &diams;
+<li><tt>\&quot;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            quotation mark = APL quote: &quot;
+<li><tt>\&amp;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       ampersand: &amp;
+<li><tt>\&lt;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  less-than sign: &lt;
+<li><tt>\&gt;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  greater-than sign: &gt;
+<li><tt>\&OElig;</tt>`&nbsp;&nbsp;&nbsp;`                 latin capital ligature OE: &OElig;
+<li><tt>\&oelig;</tt>`&nbsp;&nbsp;&nbsp;`                 latin small ligature oe: &oelig;
+<li><tt>\&Scaron;</tt>`&nbsp;&nbsp;`                      latin capital letter S with caron: &Scaron;
+<li><tt>\&scaron;</tt>`&nbsp;&nbsp;`                      latin small letter s with caron: &scaron;
+<li><tt>\&Yuml;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            latin capital letter Y with diaeresis: &Yuml;
+<li><tt>\&circ;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            modifier letter circumflex accent: &circ;
+<li><tt>\&tilde;</tt>`&nbsp;&nbsp;&nbsp;`                 small tilde: &tilde;
+<li><tt>\&ensp;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            en space: &ensp;
+<li><tt>\&emsp;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            em space: &emsp;
+<li><tt>\&thinsp;</tt>`&nbsp;&nbsp;`                      thin space: &thinsp;
+<li><tt>\&zwnj;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            zero width non-joiner: &zwnj;
+<li><tt>\&zwj;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       zero width joiner: &zwj;
+<li><tt>\&lrm;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       left-to-right mark: &lrm;
+<li><tt>\&rlm;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`       right-to-left mark: &rlm;
+<li><tt>\&ndash;</tt>`&nbsp;&nbsp;&nbsp;`                 en dash: &ndash;
+<li><tt>\&mdash;</tt>`&nbsp;&nbsp;&nbsp;`                 em dash: &mdash;
+<li><tt>\&lsquo;</tt>`&nbsp;&nbsp;&nbsp;`                 left single quotation mark: &lsquo;
+<li><tt>\&rsquo;</tt>`&nbsp;&nbsp;&nbsp;`                 right single quotation mark: &rsquo;
+<li><tt>\&sbquo;</tt>`&nbsp;&nbsp;&nbsp;`                 single low-9 quotation mark: &sbquo;
+<li><tt>\&ldquo;</tt>`&nbsp;&nbsp;&nbsp;`                 left double quotation mark: &ldquo;
+<li><tt>\&rdquo;</tt>`&nbsp;&nbsp;&nbsp;`                 right double quotation mark: &rdquo;
+<li><tt>\&bdquo;</tt>`&nbsp;&nbsp;&nbsp;`                 double low-9 quotation mark: &bdquo;
+<li><tt>\&dagger;</tt>`&nbsp;&nbsp;`                      dagger: &dagger;
+<li><tt>\&Dagger;</tt>`&nbsp;&nbsp;`                      double dagger: &Dagger;
+<li><tt>\&permil;</tt>`&nbsp;&nbsp;`                      per mille sign: &permil;
+<li><tt>\&lsaquo;</tt>`&nbsp;&nbsp;`                      single left-pointing angle quotation mark: &lsaquo;
+<li><tt>\&rsaquo;</tt>`&nbsp;&nbsp;`                      single right-pointing angle quotation mark: &rsaquo;
+<li><tt>\&euro;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;`            euro sign: &euro;
+</ul>
+Doxygen extensions:
 <ul>
-<li><tt>\&copy;</tt> the copyright symbol
-<li><tt>\&trade;</tt> the trade mark symbol
-<li><tt>\&reg;</tt> the registered trade mark symbol
-<li><tt>\&lt;</tt> less-than symbol
-<li><tt>\&gt;</tt> greater-than symbol
-<li><tt>\&amp;</tt> ampersand
-<li><tt>\&apos;</tt> single quotation mark (straight)
-<li><tt>\&quot;</tt> double quotation mark (straight)
-<li><tt>\&lsquo;</tt> left single quotation mark
-<li><tt>\&rsquo;</tt> right single quotation mark
-<li><tt>\&ldquo;</tt> left double quotation mark
-<li><tt>\&rdquo;</tt> right double quotation mark
-<li><tt>\&ndash;</tt> n-dash (for numeric ranges, e.g. 2&ndash;8)
-<li><tt>\&mdash;</tt> m-dash (for parenthetical punctuation &mdash; like this)
-<li><tt>\&?uml;</tt>   where ? is one of {A,E,I,O,U,Y,a,e,i,o,u,y}, 
-       writes a character with a diaeresis accent (like &auml;).
-<li><tt>\&?acute;</tt> where ? is one of {A,E,I,O,U,Y,a,e,i,o,u,y},
-       writes a character with a acute accent (like &aacute;). 
-<li><tt>\&?grave;</tt> where ? is one of {A,E,I,O,U,a,e,i,o,u,y},
-       writes a character with a grave accent (like &agrave;).
-<li><tt>\&?circ;</tt>  where ? is one of {A,E,I,O,U,a,e,i,o,u,y},
-       writes a character with a circumflex accent (like &acirc;).
-<li><tt>\&?tilde;</tt> where ? is one of {A,N,O,a,n,o},
-       writes a character with a tilde accent (like &atilde;).
-<li><tt>\&szlig;</tt> write a sharp s (i.e. &szlig;) to the output.
-<li><tt>\&?cedil;</tt> where ? is one of {c,C},
-       writes a c-cedille (like &ccedil;).
-<li><tt>\&?ring;</tt> where ? is one of {a,A},
-       writes an <tt>a</tt> with a ring (like &aring;).
-<li><tt>\&nbsp;</tt> a non breakable space.
-<li><tt>\&Gamma;</tt> Greek letter Gamma &Gamma;.
-<li><tt>\&Delta;</tt> Greek letter Delta &Delta;.
-<li><tt>\&Theta;</tt> Greek letter Theta &Theta;.
-<li><tt>\&Lambda;</tt> Greek letter Lambda &Lambda;.
-<li><tt>\&Xi;</tt> Greek letter Xi &Xi;.
-<li><tt>\&Pi;</tt> Greek letter Pi &Pi;.
-<li><tt>\&Sigma;</tt> Greek letter Sigma &Sigma;.
-<li><tt>\&Upsilon;</tt> Greek letter Upsilon &Upsilon;.
-<li><tt>\&Phi;</tt> Greek letter Phi &Phi;.
-<li><tt>\&Psi;</tt> Greek letter Psi &Psi;.
-<li><tt>\&Omega;</tt> Greek letter Omega &Omega;.
-<li><tt>\&alpha;</tt> Greek letter alpha &alpha;.
-<li><tt>\&beta;</tt> Greek letter beta &beta;.
-<li><tt>\&gamma;</tt> Greek letter gamma &gamma;.
-<li><tt>\&delta;</tt> Greek letter delta &delta;.
-<li><tt>\&epsilon;</tt> Greek letter epsilon &epsilon;.
-<li><tt>\&zeta;</tt> Greek letter zeta &zeta;.
-<li><tt>\&eta;</tt> Greek letter eta &eta;.
-<li><tt>\&theta;</tt> Greek letter theta &theta;.
-<li><tt>\&iota;</tt> Greek letter iota &iota;.
-<li><tt>\&kappa;</tt> Greek letter kappa &kappa;.
-<li><tt>\&lambda;</tt> Greek letter lambda &lambda;.
-<li><tt>\&mu;</tt> Greek letter mu &mu;.
-<li><tt>\&nu;</tt> Greek letter nu &nu;.
-<li><tt>\&xi;</tt> Greek letter xi &xi;.
-<li><tt>\&pi;</tt> Greek letter pi &pi;.
-<li><tt>\&rho;</tt> Greek letter rho &rho;.
-<li><tt>\&sigma;</tt> Greek letter sigma &sigma;.
-<li><tt>\&tau;</tt> Greek letter tau &tau;.
-<li><tt>\&upsilon;</tt> Greek letter upsilon &upsilon;.
-<li><tt>\&phi;</tt> Greek letter phi &phi;.
-<li><tt>\&chi;</tt> Greek letter chi &chi;.
-<li><tt>\&psi;</tt> Greek letter psi &psi;.
-<li><tt>\&omega;</tt> Greek letter omega &omega;.
-<li><tt>\&sigmaf;</tt> Greek final sigma &sigmaf;.
-<li><tt>\&sect;</tt> section sign &sect;.
-<li><tt>\&deg;</tt> degree &deg;.
-<li><tt>\&prime;</tt> prime &prime;.
-<li><tt>\&Prime;</tt> double prime &Prime;.
-<li><tt>\&infin;</tt> infinity &infin;.
-<li><tt>\&empty;</tt> empty set &empty;.
-<li><tt>\&plusmn;</tt> plus or minus &plusmn;.
-<li><tt>\&times;</tt> multiplication sign &times;.
-<li><tt>\&minus;</tt> minus sign &minus;.
-<li><tt>\&sdot;</tt> centered dot &sdot;.
-<li><tt>\&part;</tt> partial derivative &part;.
-<li><tt>\&nabla;</tt> nabla symbol &nabla;.
-<li><tt>\&radic;</tt> square root &radic;.
-<li><tt>\&perp;</tt> perpendicular symbol &perp;.
-<li><tt>\&sum;</tt> sum &sum;.
-<li><tt>\&int;</tt> integral &int;.
-<li><tt>\&prod;</tt> product &prod;.
-<li><tt>\&sim;</tt> similar to &sim;.
-<li><tt>\&asymp;</tt> approximately equal to &asymp;.
-<li><tt>\&ne;</tt> not equal to &ne;.
-<li><tt>\&equiv;</tt> equivalent to &equiv;.
-<li><tt>\&prop;</tt> proportional to &prop;.
-<li><tt>\&le;</tt> less than or equal to &le;.
-<li><tt>\&ge;</tt> greater than or equal to &ge;.
-<li><tt>\&larr;</tt> left arrow &larr;.
-<li><tt>\&rarr;</tt> right arrow &rarr;.
-<li><tt>\&isin;</tt> in the set &isin;.
-<li><tt>\&notin;</tt> not in the set &notin;.
-<li><tt>\&lceil;</tt> left ceiling sign &lceil;.
-<li><tt>\&rceil;</tt> right ceiling sign &rceil;.
-<li><tt>\&lfloor;</tt> left floor sign &lfloor;.
-<li><tt>\&rfloor;</tt> right floor sign &rfloor;.
+<li><tt>\&tm;</tt>`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`  trade mark sign: &tm;
+<li><tt>\&apos;</tt>`&nbsp;&nbsp;&nbsp;`            apostrophe: &apos;
 </ul>
 
 Finally, to put invisible comments inside comment blocks, HTML style
index 298d413..0cb1e59 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -35,7 +35,7 @@ languages such as C, Objective-C, C#, PHP, Java, Python, IDL
 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 
+     off-line reference manual (in \LaTeX) from a set 
      of documented source files. 
      There is also support for generating output in RTF (MS-Word), 
      PostScript, hyperlinked PDF, compressed HTML, and Unix man pages.
@@ -118,7 +118,7 @@ The third part provides information for developers:
 \addindex license
 \addindex GPL
 
-Copyright &copy; 1997-2013 by 
+Copyright &copy; 1997-2014 by 
 <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>.<p>
 
 Permission to use, copy, modify, and distribute this software and its
index 94f1099..1219b7c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -21,7 +21,7 @@
 
 First go to the 
 <a href="http://www.doxygen.org/download.html">download</a> page
-to get the latest distribution, if you did not downloaded doxygen already.
+to get the latest distribution, if you have not downloaded doxygen already.
 
 \section install_src_unix Compiling from source on UNIX
 
@@ -51,9 +51,9 @@ tools should be installed.
     \addindex Qt
     version 4.3 or higher (but currently, Qt 5.x is not supported).
     This is needed to build the GUI front-end doxywizard. 
-<li>A \f$\mbox{\LaTeX}\f$ distribution: for instance
+<li>A \LaTeX distribution: for instance
     <a href="http://www.tug.org/interest.html#free">TeX Live</a>
-    This is needed for generating LaTeX, Postscript, and PDF output.
+    This is needed for generating \LaTeX, Postscript, and PDF output.
 <li><a href="http://www.graphviz.org/">
     the Graph visualization toolkit version 1.8.10 or higher</a>
     Needed for the include dependency graphs, 
@@ -61,7 +61,7 @@ tools should be installed.
     If you compile graphviz yourself, make sure you do include
     freetype support (which requires the freetype library and header files), 
     otherwise the graphs will not render proper text labels.
-<li>For formulas or if you do not wish to use pdflatex, the ghostscript interpreter
+<li>For formulas or if you do not wish to use `pdflatex, the ghostscript interpreter
     is needed. You can find it at 
     <a href="http://www.ghostscript.com/">www.ghostscript.com</a>.
 <li>In order to generate doxygen's own documentation, Python is needed, you
@@ -94,7 +94,7 @@ Compilation is now done by performing the following steps:
 
     If you have Qt-4.3 or higher installed and want to build the GUI 
     front-end, you should run the configure script with 
-    the <code>--with-doxywizard</code> option:
+    the `--with-doxywizard` option:
 
         configure --with-doxywizard
 
@@ -148,10 +148,10 @@ Use <code>make install_docs</code> to install the
 documentation and examples into <code>\<docdir\>/doxygen</code>. 
 
 <code>\<prefix\></code> defaults to <code>/usr/local</code> but can be changed with 
-the <code>--prefix</code> option of the configure script. 
+the `--prefix` option of the configure script. 
 The default <code>\<docdir\></code> directory is 
 <code>\<prefix\>/share/doc/packages</code> and can be changed with
-the <code>--docdir</code> option of the configure script.
+the `--docdir` option of the configure script.
 
 Alternatively, you can also copy the binaries from the <code>bin</code> 
 directory manually to some <code>bin</code> directory in your search path.
@@ -226,14 +226,14 @@ Manually adding `-Bdynamic` after the target rule in
 
 Older versions of the GNU compiler have problems with constant strings
 containing characters with character codes larger than 127. Therefore 
-the compiler will fail to compile some of the translator_xx.h files. 
+the compiler will fail to compile some of the `translator_xx.h` files. 
 A workaround, if you are planning to use the English translation only, 
-is to configure doxygen with the <code>--english-only</code> option.  
+is to configure doxygen with the `--english-only` option.  
 
 On some platforms (such as OpenBSD) using some versions of gcc with
 -O2 can lead to eating all memory during the compilation of files 
-such as config.cpp. As a workaround use --debug as a configure option 
-or omit the -O2 for the particular files in the Makefile.
+such as config.cpp. As a workaround use `--debug` as a configure option 
+or omit the `-O2` for the particular files in the Makefile.
 
 Gcc versions before 2.95 may produce broken binaries due to bugs in 
 these compilers. 
@@ -402,7 +402,7 @@ Compilation is now done by performing the following steps:
     the command-line (add them to the PATH environment variable if
     needed).
 
-    Notice: The use of LaTeX is optional and only needed for compilation
+    Notice: The use of \LaTeX is optional and only needed for compilation
     of the documentation into PostScript or PDF. 
     It is \e not needed for compiling the doxygen's binaries. 
     
@@ -437,7 +437,7 @@ Compilation is now done by performing the following steps:
     The generated HTML docs are located in the <code>..\\html</code>
     subdirectory.
 
-    The sources for LaTeX documentation are located in the <code>..\\latex</code>
+    The sources for \LaTeX documentation are located in the <code>..\\latex</code>
     subdirectory. From those sources, the DVI, PostScript, and PDF
     documentation can be generated. 
 </ol>
@@ -469,14 +469,14 @@ In order to generate PDF output or use scientific formulas you will also need to
 install <a href="http://en.wikipedia.org/wiki/LaTeX">LaTeX</a> and 
 <a href="http://en.wikipedia.org/wiki/Ghostscript">Ghostscript</a>. 
 
-For LaTeX a number of distributions exists. Popular ones that should work with
+For \LaTeX a number of distributions exists. Popular ones that should work with
 doxygen are <a href="http://www.miktex.org">MikTex</a> 
 and <a href="http://www.tug.org/protext/">proTeXt</a>.
 
 Ghostscript can be <a href="http://sourceforge.net/projects/ghostscript/">downloaded</a> 
 from Sourceforge.
 
-After installing LaTeX and Ghostscript you'll need to make sure the tools
+After installing \LaTeX and Ghostscript you'll need to make sure the tools
 latex.exe, pdflatex.exe, and gswin32c.exe are present in the search path of a
 command box. Follow <a href="http://www.computerhope.com/issues/ch000549.htm">these</a>
 instructions if you are unsure and run the commands from a command box to verify it works.
@@ -493,7 +493,7 @@ There are a couple of tools you may want to install to use all of doxygen's
 features:
 
 <ul>
-<li>To generate LaTeX documentation or formulas in HTML you need the tools:
+<li>To generate \LaTeX documentation or formulas in HTML you need the tools:
     <code>latex</code>, <code>dvips</code> and <code>gswin32</code>. 
     To get these working under Windows
     install the fpTeX distribution. You can find more info at:
@@ -504,8 +504,8 @@ features:
     Make sure the tools are available from a dos box, by adding the 
     directory they are in to the search path.
 
-    For your information, the LaTeX is freely available set of so
-    called macros and styles on the top of the famous TeX program
+    For your information, \LaTeX is a freely available set of so
+    called macros and styles on the top of the famous \TeX program
     (by famous Donald Knuth) and the accompanied utilities (all
     available for free). It is used for high quality
     typesetting. The result -- in the form of so called
@@ -515,7 +515,7 @@ features:
     to convert the <code>dvi</code> to the high quality PostScript
     (i.e. PostScript that can be processed by utilities like 
     <code>psnup</code>, <code>psbook</code>, <code>psselect</code>,
-    and others). The derived version of TeX (the pdfTeX) can be used
+    and others). The derived version of \TeX (the pdfTeX) can be used
     to produce PDF output instead of DVI, or the PDF can be produced
     from PostScript using the utility <code>ps2pdf</code>.
 
diff --git a/doc/language.doc b/doc/language.doc
deleted file mode 100644 (file)
index f923be3..0000000
+++ /dev/null
@@ -1,774 +0,0 @@
-/******************************************************************************
- * Do not edit this file. It was generated by the translator.py script.
- * Instead edit language.tpl and maintainers.txt
- *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page langhowto Internationalization
-
-<h3>Support for multiple languages</h3>
-
-Doxygen has built-in support for multiple languages. This means that the
-text fragments, generated by doxygen, can be produced in languages other
-than English (the default). The output language is chosen through the
-configuration option \ref cfg_output_language "OUTPUT_LANGUAGE" in the 
-configuration file (with default name and known as Doxyfile).
-
-Currently (version 1.8.5), 40 languages
-are supported (sorted alphabetically):
-Afrikaans, Arabic, Armenian, Brazilian Portuguese, Catalan, Chinese,
-Chinese Traditional, Croatian, Czech, Danish, Dutch, English,
-Esperanto, Finnish, French, German, Greek, Hungarian, Indonesian,
-Italian, Japanese (+En), Korean (+En), Latvian, Lithuanian,
-Macedonian, Norwegian, Persian, Polish, Portuguese, Romanian, Russian,
-Serbian, SerbianCyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
-Ukrainian, and Vietnamese..
-
-The table of information related to the supported languages follows.
-It is sorted by language alphabetically.  The <b>Status</b> column
-was generated from sources and shows approximately the last version
-when the translator was updated.
-
-\htmlonly
-<table align="center" cellspacing="0" cellpadding="0" border="0">
-<tr bgcolor="#000000">
-<td>
-  <table cellspacing="1" cellpadding="2" border="0">
-  <tr bgcolor="#4040c0">
-  <td ><b><font size="+1" color="#ffffff"> Language </font></b></td>
-  <td ><b><font size="+1" color="#ffffff"> Maintainer </font></b></td>
-  <td ><b><font size="+1" color="#ffffff"> Contact address </font>
-          <font size="-2" color="#ffffff">(replace the at and dot)</font></b></td>
-  <td ><b><font size="+1" color="#ffffff"> Status </font></b></td>
-  </tr>
-  <!-- table content begin -->
-
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Afrikaans</td>
-    <td>Johan Prinsloo</td>
-    <td>johan at zippysnoek dot com</td>
-    <td bgcolor="#ffcccc">1.6.0</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ff5555">Arabic</td>
-    <td>Moaz Reyad<br/>Muhammad Bashir Al-Noimi</td>
-    <td><span style="color: brown">[resigned]</span><br/>mbnoimi at gmail dot com</td>
-    <td bgcolor="#ff5555">1.4.6</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Armenian</td>
-    <td>Armen Tangamyan</td>
-    <td>armen dot tangamyan at anu dot edu dot au</td>
-    <td bgcolor="#ffffcc">1.8.0</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Brazilian Portuguese</td>
-    <td>Fabio "FJTC" Jun Takada Chino</td>
-    <td>jun-chino at uol dot com dot br</td>
-    <td bgcolor="#ffffcc">1.8.0</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Catalan</td>
-    <td>Maximiliano Pin<br/>Albert Mora</td>
-    <td>max dot pin at bitroit dot com<br/><span style="color: brown">[unreachable]</span></td>
-    <td bgcolor="#ffffcc">1.8.0</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Chinese</td>
-    <td>Lian Yang<br/>Li Daobing<br/>Wei Liu</td>
-    <td>lian dot yang dot cn at gmail dot com<br/>lidaobing at gmail dot com<br/>liuwei at asiainfo dot com</td>
-    <td bgcolor="#ffffcc">1.8.2</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Chinese Traditional</td>
-    <td>Daniel YC Lin<br/>Gary Lee</td>
-    <td>dlin dot tw at gmail dot com<br/>garywlee at gmail dot com</td>
-    <td bgcolor="#ffffff">almost up-to-date</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Croatian</td>
-    <td>Boris Bralo</td>
-    <td>boris dot bralo at gmail dot com</td>
-    <td bgcolor="#ffffcc">1.8.2</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Czech</td>
-    <td>Petr Přikryl</td>
-    <td>prikryl at atlas dot cz</td>
-    <td bgcolor="#ccffcc">up-to-date</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Danish</td>
-    <td>Poul-Erik Hansen<br/>Erik Søe Sørensen</td>
-    <td>pouhan at gnotometrics dot dk<br/>eriksoe+doxygen at daimi dot au dot dk</td>
-    <td bgcolor="#ffffcc">1.8.0</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Dutch</td>
-    <td>Dimitri van Heesch</td>
-    <td>dimitri at stack dot nl</td>
-    <td bgcolor="#ccffcc">up-to-date</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">English</td>
-    <td>Dimitri van Heesch</td>
-    <td>dimitri at stack dot nl</td>
-    <td bgcolor="#ccffcc">up-to-date</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Esperanto</td>
-    <td>Ander Martínez</td>
-    <td>ander dot basaundi at gmail dot com</td>
-    <td bgcolor="#ffffcc">1.8.4</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Finnish</td>
-    <td>Antti Laine</td>
-    <td>antti dot a dot laine at tut dot fi</td>
-    <td bgcolor="#ffcccc">1.6.0</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">French</td>
-    <td>David Martinet<br/>Xavier Outhier<br/>Benoît BROSSE</td>
-    <td>contact at e-concept-applications dot fr<br/>xouthier at yahoo dot fr<br/>Benoit dot BROSSE at ingenico dot com</td>
-    <td bgcolor="#ccffcc">up-to-date</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">German</td>
-    <td>Peter Grotrian<br/>Jens Seidel</td>
-    <td>Peter dot Grotrian at pdv-FS dot de<br/>jensseidel at users dot sf dot net</td>
-    <td bgcolor="#ffffcc">1.8.4</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Greek</td>
-    <td>Paul Gessos</td>
-    <td>gessos dot paul at yahoo dot gr</td>
-    <td bgcolor="#ffffcc">1.8.4</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ff5555">Hungarian</td>
-    <td>Ákos Kiss<br/>Földvári György</td>
-    <td>akiss at users dot sourceforge dot net<br/><span style="color: brown">[unreachable]</span></td>
-    <td bgcolor="#ff5555">1.4.6</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Indonesian</td>
-    <td>Hendy Irawan</td>
-    <td>ceefour at gauldong dot net</td>
-    <td bgcolor="#ffffcc">1.8.0</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Italian</td>
-    <td>Alessandro Falappa<br/>Ahmed Aldo Faisal</td>
-    <td>alessandro at falappa dot net<br/>aaf23 at cam dot ac dot uk</td>
-    <td bgcolor="#ffffcc">1.8.2</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Japanese</td>
-    <td>Suzumizaki-Kimikata<br/>Hiroki Iseri<br/>Ryunosuke Satoh<br/>Kenji Nagamatsu<br/>Iwasa Kazmi</td>
-    <td>szmml at h12u.com<br/>goyoki at gmail dot com<br/>sun594 at hotmail dot com<br/><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[unreachable]</span></td>
-    <td bgcolor="#ccffcc">up-to-date</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">JapaneseEn</td>
-    <td>see the Japanese language</td>
-    <td>&nbsp;</td>
-    <td bgcolor="#ccffcc">English based</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Korean</td>
-    <td>Kim Taedong<br/>SooYoung Jung<br/>Richard Kim</td>
-    <td>fly1004 at gmail dot com<br/>jung5000 at gmail dot com<br/><span style="color: brown">[unreachable]</span></td>
-    <td bgcolor="#ccffcc">up-to-date</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">KoreanEn</td>
-    <td>see the Korean language</td>
-    <td>&nbsp;</td>
-    <td bgcolor="#ccffcc">English based</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Latvian</td>
-    <td>Lauris</td>
-    <td>lauris at nix.lv</td>
-    <td bgcolor="#ffffcc">1.8.4</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ff5555">Lithuanian</td>
-    <td>Tomas Simonaitis<br/>Mindaugas Radzius<br/>Aidas Berukstis<br/><span style="color: red; background-color: yellow">-- searching for the maintainer --</span></td>
-    <td><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[Please, try to help to find someone.]</span></td>
-    <td bgcolor="#ff5555">1.4.6</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Macedonian</td>
-    <td>Slave Jovanovski</td>
-    <td>slavejovanovski at yahoo dot com</td>
-    <td bgcolor="#ffcccc">1.6.0</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ff5555">Norwegian</td>
-    <td>Lars Erik Jordet</td>
-    <td>lejordet at gmail dot com</td>
-    <td bgcolor="#ff5555">1.4.6</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Persian</td>
-    <td>Ali Nadalizadeh</td>
-    <td>nadalizadeh at gmail dot com</td>
-    <td bgcolor="#ffcccc">1.7.5</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Polish</td>
-    <td>Piotr Kaminski<br/>Grzegorz Kowal<br/>Krzysztof Kral</td>
-    <td><span style="color: brown">[unreachable]</span><br/><span style="color: brown">[unreachable]</span><br/>krzysztof dot kral at gmail dot com</td>
-    <td bgcolor="#ffffcc">1.8.2</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Portuguese</td>
-    <td>Rui Godinho Lopes<br/>Fabio "FJTC" Jun Takada Chino</td>
-    <td><span style="color: brown">[resigned]</span><br/>jun-chino at uol dot com dot br</td>
-    <td bgcolor="#ffffcc">1.8.0</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Romanian</td>
-    <td>Ionut Dumitrascu<br/>Alexandru Iosup</td>
-    <td>reddumy at yahoo dot com<br/>aiosup at yahoo dot com</td>
-    <td bgcolor="#ffffff">almost up-to-date</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Russian</td>
-    <td>Brilliantov Kirill Vladimirovich<br/>Alexandr Chelpanov</td>
-    <td>brilliantov at byterg dot ru<br/>cav at cryptopro dot ru</td>
-    <td bgcolor="#ffffff">almost up-to-date</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Serbian</td>
-    <td>Dejan Milosavljevic</td>
-    <td><span style="color: brown">[unreachable]</span></td>
-    <td bgcolor="#ffcccc">1.6.0</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">SerbianCyrillic</td>
-    <td>Nedeljko Stefanovic</td>
-    <td>stenedjo at yahoo dot com</td>
-    <td bgcolor="#ffcccc">1.6.0</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Slovak</td>
-    <td>Kali+Laco Švec<br/>Petr Přikryl</td>
-    <td><span style="color: brown">[the Slovak language advisors]</span><br/>prikryl at atlas dot cz</td>
-    <td bgcolor="#ccffcc">up-to-date</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ff5555">Slovene</td>
-    <td>Matjaž Ostroveršnik</td>
-    <td>matjaz dot ostroversnik at ostri dot org</td>
-    <td bgcolor="#ff5555">1.4.6</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Spanish</td>
-    <td>Bartomeu<br/>Francisco Oltra Thennet<br/>David Vaquero</td>
-    <td>bartomeu at loteria3cornella dot com<br/><span style="color: brown">[unreachable]</span><br/>david at grupoikusnet dot com</td>
-    <td bgcolor="#ccffcc">up-to-date</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Swedish</td>
-    <td>Mikael Hallin</td>
-    <td>mikaelhallin at yahoo dot se</td>
-    <td bgcolor="#ffcccc">1.6.0</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Turkish</td>
-    <td>Emin Ilker Cetinbas</td>
-    <td>niw3 at yahoo dot com</td>
-    <td bgcolor="#ffcccc">1.7.5</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Ukrainian</td>
-    <td>Olexij Tkatchenko<br/>Petro  Yermolenko</td>
-    <td><span style="color: brown">[resigned]</span><br/>python at i dot ua</td>
-    <td bgcolor="#ffffcc">1.8.4</td>
-  </tr>
-  <tr bgcolor="#ffffff">
-    <td bgcolor="#ffffff">Vietnamese</td>
-    <td>Dang Minh Tuan</td>
-    <td>tuanvietkey at gmail dot com</td>
-    <td bgcolor="#ffcccc">1.6.0</td>
-  </tr>
-  <!-- table content end -->
-  </table>
-</td>
-</tr>
-</table>
-\endhtmlonly
-
-
-\latexonly
-\footnotesize
-\begin{longtable}{|l|l|l|l|}
-  \hline
-  {\bf Language} & {\bf Maintainer} & {\bf Contact address} & {\bf Status} \\
-  \hline
-
-  \hline
-  Afrikaans & Johan Prinsloo & {\tt\tiny johan at zippysnoek dot com} & 1.6.0 \\
-  \hline
-  Arabic & Moaz Reyad & {\tt\tiny [resigned] moazreyad at yahoo dot com} & 1.4.6 \\
-  ~ & Muhammad Bashir Al-Noimi & {\tt\tiny mbnoimi at gmail dot com} & ~ \\
-  \hline
-  Armenian & Armen Tangamyan & {\tt\tiny armen dot tangamyan at anu dot edu dot au} & 1.8.0 \\
-  \hline
-  Brazilian Portuguese & Fabio "FJTC" Jun Takada Chino & {\tt\tiny jun-chino at uol dot com dot br} & 1.8.0 \\
-  \hline
-  Catalan & Maximiliano Pin & {\tt\tiny max dot pin at bitroit dot com} & 1.8.0 \\
-  ~ & Albert Mora & {\tt\tiny [unreachable] amora at iua dot upf dot es} & ~ \\
-  \hline
-  Chinese & Lian Yang & {\tt\tiny lian dot yang dot cn at gmail dot com} & 1.8.2 \\
-  ~ & Li Daobing & {\tt\tiny lidaobing at gmail dot com} & ~ \\
-  ~ & Wei Liu & {\tt\tiny liuwei at asiainfo dot com} & ~ \\
-  \hline
-  Chinese Traditional & Daniel YC Lin & {\tt\tiny dlin dot tw at gmail dot com} & almost up-to-date \\
-  ~ & Gary Lee & {\tt\tiny garywlee at gmail dot com} & ~ \\
-  \hline
-  Croatian & Boris Bralo & {\tt\tiny boris dot bralo at gmail dot com} & 1.8.2 \\
-  \hline
-  Czech & Petr Přikryl & {\tt\tiny prikryl at atlas dot cz} & up-to-date \\
-  \hline
-  Danish & Poul-Erik Hansen & {\tt\tiny pouhan at gnotometrics dot dk} & 1.8.0 \\
-  ~ & Erik Søe Sørensen & {\tt\tiny eriksoe+doxygen at daimi dot au dot dk} & ~ \\
-  \hline
-  Dutch & Dimitri van Heesch & {\tt\tiny dimitri at stack dot nl} & up-to-date \\
-  \hline
-  English & Dimitri van Heesch & {\tt\tiny dimitri at stack dot nl} & up-to-date \\
-  \hline
-  Esperanto & Ander Martínez & {\tt\tiny ander dot basaundi at gmail dot com} & 1.8.4 \\
-  \hline
-  Finnish & Antti Laine & {\tt\tiny antti dot a dot laine at tut dot fi} & 1.6.0 \\
-  \hline
-  French & David Martinet & {\tt\tiny contact at e-concept-applications dot fr} & up-to-date \\
-  ~ & Xavier Outhier & {\tt\tiny xouthier at yahoo dot fr} & ~ \\
-  ~ & Benoît BROSSE & {\tt\tiny Benoit dot BROSSE at ingenico dot com} & ~ \\
-  \hline
-  German & Peter Grotrian & {\tt\tiny Peter dot Grotrian at pdv-FS dot de} & 1.8.4 \\
-  ~ & Jens Seidel & {\tt\tiny jensseidel at users dot sf dot net} & ~ \\
-  \hline
-  Greek & Paul Gessos & {\tt\tiny gessos dot paul at yahoo dot gr} & 1.8.4 \\
-  \hline
-  Hungarian & Ákos Kiss & {\tt\tiny akiss at users dot sourceforge dot net} & 1.4.6 \\
-  ~ & Földvári György & {\tt\tiny [unreachable] foldvari lost at cyberspace} & ~ \\
-  \hline
-  Indonesian & Hendy Irawan & {\tt\tiny ceefour at gauldong dot net} & 1.8.0 \\
-  \hline
-  Italian & Alessandro Falappa & {\tt\tiny alessandro at falappa dot net} & 1.8.2 \\
-  ~ & Ahmed Aldo Faisal & {\tt\tiny aaf23 at cam dot ac dot uk} & ~ \\
-  \hline
-  Japanese & Suzumizaki-Kimikata & {\tt\tiny szmml at h12u.com} & up-to-date \\
-  ~ & Hiroki Iseri & {\tt\tiny goyoki at gmail dot com} & ~ \\
-  ~ & Ryunosuke Satoh & {\tt\tiny sun594 at hotmail dot com} & ~ \\
-  ~ & Kenji Nagamatsu & {\tt\tiny [unreachable] naga at joyful dot club dot ne dot jp} & ~ \\
-  ~ & Iwasa Kazmi & {\tt\tiny [unreachable] iwasa at cosmo-system dot jp} & ~ \\
-  \hline
-  JapaneseEn & see the Japanese language & {\tt\tiny ~} & English based \\
-  \hline
-  Korean & Kim Taedong & {\tt\tiny fly1004 at gmail dot com} & up-to-date \\
-  ~ & SooYoung Jung & {\tt\tiny jung5000 at gmail dot com} & ~ \\
-  ~ & Richard Kim & {\tt\tiny [unreachable] ryk at dspwiz dot com} & ~ \\
-  \hline
-  KoreanEn & see the Korean language & {\tt\tiny ~} & English based \\
-  \hline
-  Latvian & Lauris & {\tt\tiny lauris at nix.lv} & 1.8.4 \\
-  \hline
-  Lithuanian & Tomas Simonaitis & {\tt\tiny [unreachable] haden at homelan dot lt} & 1.4.6 \\
-  ~ & Mindaugas Radzius & {\tt\tiny [unreachable] mindaugasradzius at takas dot lt} & ~ \\
-  ~ & Aidas Berukstis & {\tt\tiny [unreachable] aidasber at takas dot lt} & ~ \\
-  ~ & -- searching for the maintainer -- & {\tt\tiny [Please, try to help to find someone.]} & ~ \\
-  \hline
-  Macedonian & Slave Jovanovski & {\tt\tiny slavejovanovski at yahoo dot com} & 1.6.0 \\
-  \hline
-  Norwegian & Lars Erik Jordet & {\tt\tiny lejordet at gmail dot com} & 1.4.6 \\
-  \hline
-  Persian & Ali Nadalizadeh & {\tt\tiny nadalizadeh at gmail dot com} & 1.7.5 \\
-  \hline
-  Polish & Piotr Kaminski & {\tt\tiny [unreachable] Piotr dot Kaminski at ctm dot gdynia dot pl} & 1.8.2 \\
-  ~ & Grzegorz Kowal & {\tt\tiny [unreachable] g\_kowal at poczta dot onet dot pl} & ~ \\
-  ~ & Krzysztof Kral & {\tt\tiny krzysztof dot kral at gmail dot com} & ~ \\
-  \hline
-  Portuguese & Rui Godinho Lopes & {\tt\tiny [resigned] rgl at ruilopes dot com} & 1.8.0 \\
-  ~ & Fabio "FJTC" Jun Takada Chino & {\tt\tiny jun-chino at uol dot com dot br} & ~ \\
-  \hline
-  Romanian & Ionut Dumitrascu & {\tt\tiny reddumy at yahoo dot com} & almost up-to-date \\
-  ~ & Alexandru Iosup & {\tt\tiny aiosup at yahoo dot com} & ~ \\
-  \hline
-  Russian & Brilliantov Kirill Vladimirovich & {\tt\tiny brilliantov at byterg dot ru} & almost up-to-date \\
-  ~ & Alexandr Chelpanov & {\tt\tiny cav at cryptopro dot ru} & ~ \\
-  \hline
-  Serbian & Dejan Milosavljevic & {\tt\tiny [unreachable] dmilos at email dot com} & 1.6.0 \\
-  \hline
-  SerbianCyrillic & Nedeljko Stefanovic & {\tt\tiny stenedjo at yahoo dot com} & 1.6.0 \\
-  \hline
-  Slovak & Kali+Laco Švec & {\tt\tiny [the Slovak language advisors]} & up-to-date \\
-  ~ & Petr Přikryl & {\tt\tiny prikryl at atlas dot cz} & ~ \\
-  \hline
-  Slovene & Matjaž Ostroveršnik & {\tt\tiny matjaz dot ostroversnik at ostri dot org} & 1.4.6 \\
-  \hline
-  Spanish & Bartomeu & {\tt\tiny bartomeu at loteria3cornella dot com} & up-to-date \\
-  ~ & Francisco Oltra Thennet & {\tt\tiny [unreachable] foltra at puc dot cl} & ~ \\
-  ~ & David Vaquero & {\tt\tiny david at grupoikusnet dot com} & ~ \\
-  \hline
-  Swedish & Mikael Hallin & {\tt\tiny mikaelhallin at yahoo dot se} & 1.6.0 \\
-  \hline
-  Turkish & Emin Ilker Cetinbas & {\tt\tiny niw3 at yahoo dot com} & 1.7.5 \\
-  \hline
-  Ukrainian & Olexij Tkatchenko & {\tt\tiny [resigned] olexij at tkatchenko dot com} & 1.8.4 \\
-  ~ & Petro  Yermolenko & {\tt\tiny python at i dot ua} & ~ \\
-  \hline
-  Vietnamese & Dang Minh Tuan & {\tt\tiny tuanvietkey at gmail dot com} & 1.6.0 \\
-  \hline
-\end{longtable}
-\normalsize
-\endlatexonly
-
-
-Most people on the list have indicated that they were also busy
-doing other things, so if you want to help to speed things up please
-let them (or me) know.
-
-If you want to add support for a language that is not yet listed
-please read the next section.
-
-
-<h3>Adding a new language to doxygen</h3>
-
-This short HOWTO explains how to add support for the new language to doxygen:
-
-Just follow the following steps:
-<ol>
-<li>Tell me for which language you want to add support. If no one else
-    is already working on support for that language, you will be
-    assigned as the maintainer for the language.
-<li>Create a copy of `doxygen/src/translator_en.h` and name it
-    `doxygen/src/translator_<your_2_letter_country_code>.h`
-    I'll use `xx` in the rest of this document (and `XX` for the uppercase version).
-<li>Edit `doxygen/src/language.cpp`:
-    Add the following code:
-\verbatim
-#ifdef LANG_XX
-#include<translator_xx.h>
-#endif
-\endverbatim
-    Remember to use the same symbol `LANG_XX` that was added to `doxygen/src/lang_cfg.h`.
-    <p>Now, in <code>setTranslator()</code> add
-\verbatim
-#ifdef LANG_XX
-    else if (L_EQUAL("your_language_name"))
-    {
-      theTranslator = new TranslatorYourLanguage;
-    }
-#endif
-\endverbatim
-    after the <code>if { ... }</code>. I.e., it must be placed after the code
-    for creating the English translator at the beginning, and before the
-    <code>else { ... }</code> part that creates the translator for the
-    default language (English again).
-<li>Edit <code>doxygen/src/translator_xx.h</code>:
-   <ul>
-   <li>Use the UTF-8 capable editor and open the file using the UTF-8 mode.
-   <li>Rename <code>TRANSLATOR_EN_H</code> to <code>TRANSLATOR_XX_H</code>
-       twice (i.e. in the \c \#ifndef and \c \#define preprocessor commands at
-       the beginning of the file).
-   <li>Rename \c TranslatorEnglish to \c TranslatorYourLanguage
-   <li>In the member <code>idLanguage()</code> change "english" into the
-     name of your language (use lower case characters only). Depending
-     on the language you may also wish to change the member functions
-     `latexLanguageSupportCommand()` and other (you will recognize them when
-     you start the work).
-   <li>Edit all the strings that are returned by the member functions that
-     start with \c tr.
-     Try to match punctuation and capitals!
-     To enter special characters (with accents) you can:
-     <ul>
-     <li>  Enter them directly if your keyboard supports that. Recall that
-           the text is expected to be saved using the UTF-8 encoding. Doxygen
-           will translate the characters to proper \f$\mbox{\LaTeX}\f$ and
-           leaves the HTML and man output in UTF-8.
-     <li>  Use HTML codes like \c \&auml; for an \c a with an \c umlaut (i.e. \c &auml;).
-           See the HTML specification for the codes.
-     </ul>
-   </ul>
-<li>
-    <ul>
-      <li>On *nix systems:<br>
-    <ul>
-        <li>Rerun the `configure` script from the root (i.e. in the \c doxygen  directory) so
-        that it generates `doxygen/src/lang_cfg.h`.
-        This file should now contain a  \c \#define for your language code.<br>
-        <li>Run \c make again from the root (i.e. in the \c doxygen
-        directory) of the distribution, in order to regenerate the `Makefile`s.
-    </ul>
-      <li> On Windows:<br>
-    <ul>
-       <li>stop Visual Stdio<br>
-       <li>open a command window<br>
-       <li>goto the directory `doxygen\src`<br>
-       <li>give the command `python languages.py > ..\winbuild\Languages.rules`<br>
-       <li>close the command window<br>
-       <li>start Visual Studio again<br>
-       <li>Your language should now be selectable in the `General` part of the `Settings` of the `Properties`
-       window of `lang_cfg.py`, by default Your language will be `on`. Rebuild `doxygen` (and `doxywizard`) now.
-    </ul>
-    </ul>
-<li>Now you can use <code>OUTPUT_LANGUAGE = your_language_name</code>
-    in the config file to generate output in your language.
-<li>Send <code>translator_xx.h</code> to me so I can add it to doxygen.
-    Send also your name and e-mail address to be included in the
-    \c maintainers.txt list. You can also clone the doxygen repository
-    at GitHub and make a Pull Request later.
-</ol>
-
-
-<h3>Maintaining a language</h3>
-
-New versions of doxygen may use new translated sentences.  In such
-situation, the \c Translator class requires implementation of new
-methods -- its interface changes.  Of course, the English
-sentences need to be translated to the other languages.  At least,
-new methods have to be implemented by the language-related
-translator class; otherwise, doxygen wouldn't even compile.  Waiting
-until all language maintainers have translated the new sentences and
-sent the results would not be very practical. The following text
-describes the usage of translator adapters to solve the problem.
-
-<b>The role of Translator Adapters.</b>
-Whenever the \c Translator class interface changes in the new
-release, the new class \c TranslatorAdapter_x_y_z is added to the \c
-translator_adapter.h file (here x, y, and z are numbers that
-correspond to the current official version of doxygen). All
-translators that previously derived from the \c Translator class now
-derive from this adapter class.
-
-The \c TranslatorAdapter_x_y_z class implements the new, required
-methods.  If the new method replaces some similar but obsolete
-method(s) (e.g. if the number of arguments changed and/or the
-functionality of the older method was changed or enriched), the \c
-TranslatorAdapter_x_y_z class may use the obsolete method to get the
-result which is as close as possible to the older result in the
-target language.  If it is not possible, the result (the default
-translation) is obtained using the English translator, which is (by
-definition) always up-to-date.
-
-<b>For example,</b> when the new \c trFile() method with
-parameters (to determine the capitalization of the first letter and
-the singular/plural form) was introduced to replace the older method
-\c trFiles() without arguments, the following code appeared in one
-of the translator adapter classes:
-
-\verbatim
-    /*! This is the default implementation of the obsolete method
-     * used in the documentation of a group before the list of
-     * links to documented files.  This is possibly localized.
-     */
-    virtual QCString trFiles()
-    { return "Files"; }
-
-    /*! This is the localized implementation of newer equivalent
-     * using the obsolete method trFiles().
-     */
-    virtual QCString trFile(bool first_capital, bool singular)
-    {
-      if (first_capital && !singular)
-        return trFiles();  // possibly localized, obsolete method
-      else
-        return english.trFile(first_capital, singular);
-    }
-\endverbatim
-
-The \c trFiles() is not present in the \c TranslatorEnglish class,
-because it was removed as obsolete.  However, it was used until now
-and its call was replaced by
-
-\verbatim
-    trFile(true, false)
-\endverbatim
-
-in the doxygen source files.  Probably, many language translators
-implemented the obsolete method, so it perfectly makes sense to use
-the same language dependent result in those cases. The \c
-TranslatorEnglish does not implement the old method.  It derives
-from the abstract \c Translator class.  On the other hand, the old
-translator for a different language does not implement the new \c
-trFile() method.  Because of that it is derived from another base
-class -- \c TranslatorAdapter_x_y_z. The \c TranslatorAdapter_x_y_z
-class has to implement the new, required \c trFile() method.
-However, the translator adapter would not be compiled if the \c
-trFiles() method was not implemented. This is the reason for
-implementing the old method in the translator adapter class (using
-the same code, that was removed from the TranslatorEnglish).
-
-The simplest way would be to pass the arguments to the English
-translator and to return its result.  Instead, the adapter uses the
-old \c trFiles() in one special case -- when the new
-<code>trFile(true,&nbsp;false)</code> is called.  This is the
-mostly used case at the time of introducing the new method -- see
-above.  While this may look too complicated, the technique allows
-the developers of the core sources to change the Translator
-interface, while the users may not even notice the change.  Of
-course, when the new \c trFile() is used with different arguments,
-the English result is returned and it will be noticed by non English
-users.  Here the maintainer of the language translator should
-implement at least that one particular method.
-
-<b>What says the base class of a language translator?</b>
-If the language translator class inherits from any adapter class then
-maintenance is needed.  In such case, the language translator is
-considered not up-to-date.  On the other hand, if the language
-translator derives directly from the abstract class \c Translator, the
-language translator is up-to-date.
-
-The translator adapter classes are chained so that the older
-translator adapter class uses the one-step-newer translator adapter
-as the base class.  The newer adapter does less \e adapting work
-than the older one.  The oldest adapter class derives (indirectly)
-from all of the adapter classes.  The name of the adapter class is
-chosen so that its suffix is derived from the previous official
-version of doxygen that did not need the adapter.  This way, one can
-say approximately, when the language translator class was last
-updated -- see details below.
-
-The newest translator adapter derives from the abstract \c
-TranslatorAdapterBase class that derives directly from the abstract
-\c Translator class.  It adds only the private English-translator
-member for easy implementation of the default translation inside the
-adapter classes, and it also enforces implementation of one method
-for notifying the user that the language translation is not up-to-date
-(because of that some sentences in the generated files may appear in
-English).
-
-Once the oldest adapter class is not used by any of the language
-translators, it can be removed from the doxygen project.  The
-maintainers should try to reach the state with the minimal number of
-translator adapter classes.
-
-<b>To simplify the maintenance of the language translator classes</b>
-for the supported languages, the \c translator.py Python
-script was developed (located in \c doxygen/doc directory).
-It extracts the important information about obsolete and
-new methods from the source files for each of the languages.
-The information is stored in the translator report ASCII file
-(\c translator_report.txt).
-
-\htmlonly If you compiled this documentation
-from sources and if you have also doxygen sources available the
-link <a href="../doc/translator_report.txt"
-><code>doxygen/doc/translator_report.txt</code></a> should be valid.\endhtmlonly
-
-Looking at the base class of the language translator, the script
-guesses also the status of the translator -- see the last column of
-the table with languages above.  The \c translator.py is called
-automatically when the doxygen documentation is generated.  You can
-also run the script manually whenever you feel that it can help you.
-Of course, you are not forced to use the results of the script.  You
-can find the same information by looking at the adapter class and
-its base classes.
-
-<b>How should I update my language translator?</b> First, you
-should be the language maintainer, or you should let him/her know
-about the changes.  The following text was written for the language
-maintainers as the primary audience.
-
-There are several approaches to be taken when updating your
-language.  If you are not extremely busy, you should always chose
-the most radical one.  When the update takes much more time than you
-expected, you can always decide use some suitable translator adapter to
-finish the changes later and still make your translator working.
-
-<b>The most radical way of updating the language translator</b> is
-to make your translator class derive directly
-from the abstract class \c Translator and provide translations for the
-methods that are required to be implemented -- the compiler will
-tell you if you forgot to implement some of them.  If you are in
-doubt, have a look at the \c TranslatorEnglish class to recognize the
-purpose of the implemented method.  Looking at the previously used
-adapter class may help you sometimes, but it can also be misleading
-because the adapter classes do implement also the obsolete methods
-(see the previous \c trFiles() example).
-
-In other words, the up-to-date language translators do not need the
-\c TranslatorAdapter_x_y_z classes at all, and you do not need to
-implement anything else than the methods required by the Translator
-class (i.e. the pure virtual methods of the \c Translator -- they
-end with <code>=0;</code>).
-
-If everything compiles fine, try to run \c translator.py, and have a
-look at the translator report (ASCII file) at the \c doxygen/doc
-directory. Your translator is marked as up-to-date only if the script
-does not detect anything special. If the translator uses the \c Translator
-base class, there still may be some remarks related to your source code.
-In the case, the translator is marked as <em>almost up-to-date</em>.
-Namely, the obsolete methods--that are not used at all--may be listed in the
-section for your language. Simply, remove their code (and run the \c
-translator.py again). Also, you will be informed when you forgot to
-change the base class of your translator class to some newer adapter
-class or directly to the Translator class.
-
-<b>If you do not have time to finish all the updates</b> you should
-still start with <em>the most radical approach</em> as described
-above.  You can always change the base class to the translator
-adapter class that implements all of the not-yet-implemented methods.
-
-<b>If you prefer to update your translator gradually</b>, have a look
-at \c TranslatorEnglish (the \c translator_en.h file). Inside, you
-will find the comments like <code>new since 1.2.4</code> that separate
-always a number of methods that were implemented in the stated
-version. Do implement the group of methods that are placed below the
-comment that uses the same version numbers as your translator adapter
-class. (For example, your translator class have to use the \c
-TranslatorAdapter_1_2_4, if it does not implement the methods below
-the comment <code>new since 1.2.4</code>. When you implement them,
-your class should use a newer translator adapter.
-
-Run the \c translator.py script occasionally and give it your \c xx
-identification (from \c translator_xx.h) to create the translator
-report shorter (also produced faster) -- it will contain only the
-information related to your translator. Once you reach the state when
-the base class should be changed to some newer adapter, you will see
-the note in the translator report.
-
-Warning: Don't forget to compile doxygen to discover, whether it is
-compilable. The \c translator.py does not check if everything is
-correct with respect to the compiler. Because of that, it may lie
-sometimes about the necessary base class.
-
-<b>The most obsolete language translators</b> would lead to
-implementation of too complicated adapters. Because of that, doxygen
-developers may decide to derive such translators from the \c
-TranslatorEnglish class, which is by definition always up-to-date.
-
-When doing so, all the missing methods will be replaced by the
-English translation.  This means that not-implemented methods will
-always return the English result.  Such translators are marked using
-the word \c obsolete.  You should read it <b>really obsolete</b>. No
-guess about the last update can be done.
-
-Often, it is possible to construct better result from the obsolete
-methods.  Because of that, the translator adapter classes should be
-used if possible.  On the other hand, implementation of adapters for
-really obsolete translators brings too much maintenance and
-run-time overhead.
-
-\htmlonly
-Go to the <a href="perlmod.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
-
index 25c498f..78e3e97 100644 (file)
@@ -5,7 +5,7 @@ change the language.doc, make the changes here and inside maintainers.txt.
 /******************************************************************************
  * %(editnote)s
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -98,7 +98,7 @@ Just follow the following steps:
      <ul>
      <li>  Enter them directly if your keyboard supports that. Recall that
            the text is expected to be saved using the UTF-8 encoding. Doxygen
-           will translate the characters to proper \f$\mbox{\LaTeX}\f$ and
+           will translate the characters to proper \LaTeX and
            leaves the HTML and man output in UTF-8.
      <li>  Use HTML codes like \c \&auml; for an \c a with an \c umlaut (i.e. \c &auml;).
            See the HTML specification for the codes.
index 1c76647..30afcd5 100644 (file)
@@ -151,7 +151,7 @@ Francisco Oltra Thennet: [unreachable] foltra at puc dot cl
 David Vaquero: david at grupoikusnet dot com
 
 TranslatorSwedish
-Mikael Hallin: mikaelhallin at yahoo dot se
+Björn Palmqvist: bjorn.palmqvist at aidium.se
 
 TranslatorTurkish
 Emin Ilker Cetinbas: niw3 at yahoo dot com
index 90caebe..e97b29e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -65,11 +65,11 @@ Just like Markdown, doxygen supports two types of headers
 
 Level 1 or 2 headers can be made as the follows
 
-    This is an level 1 header
-    =========================
+    This is a level 1 header
+    ========================
 
-    This is an level 2 header
-    -------------------------
+    This is a level 2 header
+    ------------------------
 
 A header is followed by a line containing only ='s or -'s.
 Note that the exact amount of ='s or -'s is not important as long as
@@ -530,7 +530,7 @@ stars, so the following will appear as-is:
     a_nice_identifier
 
 Furthermore, a `*` or `_` only starts an emphasis if
-- it is followed by an alphanumberical character, and
+- it is followed by an alphanumerical character, and
 - it is preceded by a space, newline, or one the following characters `<{([,:;`
 
 An emphasis ends if
@@ -574,7 +574,7 @@ following as one list with 3 numbered items:
 
 Doxygen however requires that the numbers used as marks are in 
 strictly ascending order, so the above example would produce 3 lists 
-with one item. An item with a equal or lower number than 
+with one item. An item with an equal or lower number than 
 the preceding item, will start a new list. For example:
 
     1. Item1 of list 1
index face02a..2cb81bd 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -22,7 +22,7 @@ The following output formats are \e directly supported by doxygen:
 <dl>
 <dt><b>HTML</b>
 <dd>Generated if \ref cfg_generate_html "GENERATE_HTML" is set to \c YES in the configuration file.
-<dt>\f$\mbox{\LaTeX}\f$
+<dt>\LaTeX
 <dd>Generated if \ref cfg_generate_latex "GENERATE_LATEX" is set to \c YES in the configuration file.
 <dt><b>Man pages</b>
 <dd>Generated if \ref cfg_generate_man "GENERATE_MAN" is set to \c YES in the configuration file.
@@ -51,11 +51,11 @@ The following output formats are \e indirectly supported by doxygen:
 <dd>Compiled from HTML with a special index file that is generated when
     \ref cfg_generate_docset "GENERATE_DOCSET" is set to \c YES.
 <dt><b>PostScript</b>
-<dd>Generated from the \f$\mbox{\LaTeX}\f$ output by 
+<dd>Generated from the \LaTeX output by 
     running <code>make ps</code> in the output directory.
     For the best results \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS" should be set to \c NO.
 <dt><b>PDF</b>\htmlonly &nbsp;&nbsp;&nbsp;\endhtmlonly
-<dd>Generated from the \f$\mbox{\LaTeX}\f$ output by
+<dd>Generated from the \LaTeX output by
     running <code>make pdf</code> in the output directory.
     To improve the PDF output, you typically would want to enable the use 
     of \c pdflatex by setting \ref cfg_use_pdflatex "USE_PDFLATEX" to \c YES in the 
index 6a04434..8616dc6 100644 (file)
@@ -15,10 +15,10 @@ use.
 and could be changed in incompatible ways in future versions, although 
 this should not be very probable.  It is also lacking some features of 
 other Doxygen backends.  However, it can be already used to generate 
-useful output, as shown by the Perl Module-based LaTeX generator.
+useful output, as shown by the Perl Module-based \LaTeX generator.
 
 <p>Please report any bugs or problems you find in the Perl Module 
-backend or the Perl Module-based LaTeX generator to the 
+backend or the Perl Module-based \LaTeX generator to the 
 doxygen-develop mailing list.  Suggestions are welcome as well.
 
 \section using_perlmod_fmt Usage
@@ -49,26 +49,27 @@ file is intended to be included by your own Makefile.
 
 <p>To make use of the documentation stored in DoxyDocs.pm you can use
 one of the default Perl Module-based generators provided by Doxygen
-(at the moment this includes the Perl Module-based LaTeX generator,
+(at the moment this includes the Perl Module-based \LaTeX generator,
 see \ref perlmod_latex "below") or write your own customized
 generator.  This should not be too hard if you have some knowledge of
 Perl and it's the main purpose of including the Perl Module backend in
 Doxygen.  See \ref doxydocs_format "below" for details on how
 to do this.
 
+<-- want to use \LaTeX but not possible in headings -->
 \section perlmod_latex Using the LaTeX generator.
 
-<p>The Perl Module-based LaTeX generator is pretty experimental and
+<p>The Perl Module-based \LaTeX generator is pretty experimental and
 incomplete at the moment, but you could find it useful nevertheless.
 It can generate documentation for functions, typedefs and variables
 within files and classes and can be customized quite a lot by
-redefining TeX macros.  However, there is still no documentation on
+redefining \TeX macros.  However, there is still no documentation on
 how to do this.
 
 <p>Setting the \ref cfg_perlmod_latex "PERLMOD_LATEX" tag to \c YES in the 
 \c Doxyfile enables the creation of some additional files in the `perlmod/` 
 subdirectory of your output directory.  These files contain the Perl 
-scripts and LaTeX code necessary to generate PDF and DVI output from 
+scripts and \LaTeX code necessary to generate PDF and DVI output from 
 the Perl Module output, using `pdflatex` and `latex` respectively.  Rules 
 to automate the use of these files are also added to 
 `doxyrules.make` and the `Makefile`.
@@ -78,29 +79,29 @@ to automate the use of these files are also added to
 <ul>
 
 <li>`doxylatex.pl`: This Perl script uses `DoxyDocs.pm` and 
-DoxyModel.pm to generate `doxydocs.tex`, a TeX file containing 
-the documentation in a format that can be accessed by LaTeX code. This 
+DoxyModel.pm to generate `doxydocs.tex`, a \TeX file containing 
+the documentation in a format that can be accessed by \LaTeX code. This 
 file is not directly LaTeXable.
 
-<li>`doxyformat.tex`: This file contains the \f$\mbox{\LaTeX}\f$ code that 
-transforms the documentation from doxydocs.tex into LaTeX text 
-suitable to be \f$\mbox{\LaTeX}\f$'ed and presented to the user.
+<li>`doxyformat.tex`: This file contains the \LaTeX code that 
+transforms the documentation from doxydocs.tex into \LaTeX text 
+suitable to be \LaTeX'ed and presented to the user.
 
 <li>`doxylatex-template.pl`:  This Perl script uses `DoxyModel.pm` 
-to generate `doxytemplate.tex`, a \f$\mbox{\TeX}\f$ file defining default 
+to generate `doxytemplate.tex`, a \TeX file defining default 
 values for some macros.  doxytemplate.tex is included by 
 doxyformat.tex to avoid the need of explicitly defining some macros.
 
-<li>`doxylatex.tex`:  This is a very simple \f$\mbox{\LaTeX}\f$ document that 
+<li>`doxylatex.tex`:  This is a very simple \LaTeX document that 
 loads some packages and includes doxyformat.tex and doxydocs.tex. This 
-document is \f$\mbox{\LaTeX}\f$'ed to produce the PDF and DVI documentation by the 
+document is \LaTeX'ed to produce the PDF and DVI documentation by the 
 rules added to `doxyrules.make`.
 
 </ul>
 
 \subsection pm_pdf_gen Creation of PDF and DVI output 
 
-<p>To try this you need to have installed LaTeX, PDFLaTeX and the 
+<p>To try this you need to have installed `latex`, `pdflatex` and the 
 packages used by `doxylatex.tex`.
 
 <ol>
index 6ad07ed..0ba9b12 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 55b23dc..25dcc3a 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -164,7 +164,7 @@ has its own advantages and disadvantages:
    doxygen as a help plugin. It will then appear as a topic in the help 
    browser that can be started from "Help contents" in the Help menu.
    Eclipse will generate a search index for the documentation when you
-   first search for an keyword.
+   first search for a keyword.
 
    To enable the help plugin set 
    \ref cfg_generate_eclipsehelp "GENERATE_ECLIPSEHELP" to \c YES,
index a84be00..a465d3f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -165,7 +165,7 @@ doxygen <config-file>
 Depending on your settings doxygen will create \c html, \c rtf, 
 \c latex, \c xml, \c man, and/or docbook directories inside the output directory. 
 As the names suggest these directories contain the
-generated documentation in HTML, RTF, \f$\mbox{\LaTeX}\f$, XML,
+generated documentation in HTML, RTF, \LaTeX, XML,
 Unix-Man page, and DocBook format.
 
 The default output directory is the directory in which \c doxygen
@@ -193,8 +193,8 @@ require a browser that supports Dynamic HTML and Javascript enabled.
 
 \subsection latex_out LaTeX output
 \addindex LaTeX
-The generated \f$\mbox{\LaTeX}\f$ documentation must first be compiled by 
-a \f$\mbox{\LaTeX}\f$ compiler (I use a recent teTeX distribution for Linux
+The generated \LaTeX documentation must first be compiled by 
+a \LaTeX compiler (I use a recent teTeX distribution for Linux
 and MacOSX and MikTex for Windows). 
 To simplify the process of compiling the generated
 documentation, \c doxygen writes a \c Makefile into the \c latex directory
@@ -302,7 +302,7 @@ structural command; just putting a special documentation block in front or
 behind them will work fine. 
 
 The text inside a special documentation block is parsed
-before it is written to the HTML and/or \f$\mbox{\LaTeX}\f$ output files.
+before it is written to the HTML and/or \LaTeX output files.
 
 \addindex parsing
 During parsing the following steps take place:
@@ -323,7 +323,7 @@ During parsing the following steps take place:
   text. See section \ref autolink
   for more information on how the automatic link generation works.
 - HTML tags that are in the documentation are interpreted and converted 
-  to \f$\mbox{\LaTeX}\f$ equivalents for the \f$\mbox{\LaTeX}\f$ output. 
+  to \LaTeX equivalents for the \LaTeX output. 
   See section \ref htmlcmds for an overview of all supported HTML tags.
 
 \htmlonly
index c71e63d..d36e330 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -109,7 +109,7 @@ helpful and it will cost me much more time to figure out what you mean.
 In the worst-case your bug report may even be completely ignored by me, so
 always try to include the following information in your bug report: 
 - The version of doxygen you are using (for instance 1.5.3, use 
-  <code>doxygen --version</code> if you are not sure).
+  `doxygen --version` if you are not sure).
 - The name and version number of your operating system (for instance 
   SuSE Linux 6.4)
 - It is usually a good idea to send along the configuration file as well, 
index 5df9b7b..0e8aa64 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index c50ab96..674ad13 100644 (file)
@@ -13,7 +13,7 @@ class Test
  *  Our main function starts like this:
  *  \skip main
  *  \until {
- *  First we create a object \c t of the Test class.
+ *  First we create an object \c t of the Test class.
  *  \skipline Test
  *  Then we call the example member function 
  *  \line example
index 211e56e..e2c6345 100644 (file)
@@ -21,7 +21,7 @@ entity mux_using_with is
     );
 end entity;
 
---! @brief Architure definition of the MUX
+--! @brief Architecture definition of the MUX
 --! @details More details about this mux element.
 architecture behavior of mux_using_with is
 begin
index 8cf7118..5516174 100644 (file)
@@ -6,5 +6,5 @@ win32:INCLUDEPATH          += .
 win32-g++:TMAKE_CFLAGS     += -D__CYGWIN__ -DALL_STATIC
 DESTDIR                    =  ../lib
 TARGET                     =  md5
-OBJECTS_DIR                =  ../objects
+OBJECTS_DIR                =  ../objects/md5
 
index fee2bd5..bc1eb53 100644 (file)
@@ -276,10 +276,10 @@ PERL_PATH              = /usr/bin/perl
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool
 #---------------------------------------------------------------------------
-CLASS_DIAGRAMS         = NO
+CLASS_DIAGRAMS         = YES
 MSCGEN_PATH            =
 HIDE_UNDOC_RELATIONS   = YES
-HAVE_DOT               = YES
+HAVE_DOT               = NO
 DOT_NUM_THREADS        = 0
 DOT_FONTNAME           =
 DOT_FONTSIZE           = 10
index c8e1f5a..ca66cc1 100644 (file)
@@ -27,6 +27,4 @@ clean: Makefile.qtools
 
 distclean: clean
 
-realclean: distclean
-
 FORCE:
index 682b270..efc5bd0 100644 (file)
@@ -52,7 +52,7 @@
 
 #else
 
-template<class type> class Q_EXPORT QDict : public QGDict
+template<class type> class Q_EXPORT QDict : private QGDict
 {
 public:
     QDict(int size=17, bool caseSensitive=TRUE)
@@ -61,26 +61,40 @@ public:
    ~QDict()                            { clear(); }
     QDict<type> &operator=(const QDict<type> &d)
                        { return (QDict<type>&)QGDict::operator=(d); }
+
+    // capacity
     uint  count()   const              { return QGDict::count(); }
     uint  size()    const              { return QGDict::size(); }
     bool  isEmpty() const              { return QGDict::count() == 0; }
 
+    // modifiers
     void  insert( const QString &k, const type *d )
                                        { QGDict::look_string(k,(Item)d,1); }
     void  replace( const QString &k, const type *d )
                                        { QGDict::look_string(k,(Item)d,2); }
     bool  remove( const QString &k )   { return QGDict::remove_string(k); }
     type *take( const QString &k )     { return (type *)QGDict::take_string(k); }
+    void  clear()                      { QGDict::clear(); }
+    void  resize( uint n )             { QGDict::resize(n); }
+
+    // search
     type *find( const QString &k ) const
                { return (type *)((QGDict*)this)->QGDict::look_string(k,0,0); }
     type *operator[]( const QString &k ) const
                { return (type *)((QGDict*)this)->QGDict::look_string(k,0,0); }
 
-    void  clear()                      { QGDict::clear(); }
-    void  resize( uint n )             { QGDict::resize(n); }
+    // operations
     void  statistics() const           { QGDict::statistics(); }
 private:
     void  deleteItem( Item d );
+
+    // new to be reimplemented methods
+    virtual int compareValues(const type *t1,const type *t2) const
+    { return const_cast<QDict<type>*>(this)->QGDict::compareItems((QCollection::Item)t1,(QCollection::Item)t2); }
+
+    // reimplemented methods
+    virtual int compareItems(QCollection::Item i1,QCollection::Item i2)
+    { return compareValues((const type*)i1,(const type*)i2); }
 };
 
 #if defined(Q_DELETING_VOID_UNDEFINED)
index dd74271..cec3897 100644 (file)
@@ -44,8 +44,8 @@
 #endif // QT_H
 
 #ifndef QT_NO_DIR
-typedef QList<QFileInfo> QFileInfoList;
-typedef QListIterator<QFileInfo> QFileInfoListIterator;
+typedef QInternalList<QFileInfo> QFileInfoList;
+typedef QInternalListIterator<QFileInfo> QFileInfoListIterator;
 class QStringList;
 
 
index 511c867..683c2a7 100644 (file)
@@ -36,7 +36,7 @@
 **********************************************************************/
 
 #include "qgcache.h"
-#include "qlist.h"
+#include "qinternallist.h"
 #include "qdict.h"
 #include "qstring.h"
 
@@ -73,7 +73,7 @@ struct QCacheItem
   QCList class (internal list of cache items)
  *****************************************************************************/
 
-class QCList : private QList<QCacheItem>
+class QCList : private QInternalList<QCacheItem>
 {
 friend class QGCacheIterator;
 friend class QCListIt;
@@ -88,13 +88,13 @@ public:
 
     void       setAutoDelete( bool del ) { QCollection::setAutoDelete(del); }
 
-    bool       removeFirst()   { return QList<QCacheItem>::removeFirst(); }
-    bool       removeLast()    { return QList<QCacheItem>::removeLast(); }
+    bool       removeFirst()   { return QInternalList<QCacheItem>::removeFirst(); }
+    bool       removeLast()    { return QInternalList<QCacheItem>::removeLast(); }
 
-    QCacheItem *first()                { return QList<QCacheItem>::first(); }
-    QCacheItem *last()         { return QList<QCacheItem>::last(); }
-    QCacheItem *prev()         { return QList<QCacheItem>::prev(); }
-    QCacheItem *next()         { return QList<QCacheItem>::next(); }
+    QCacheItem *first()                { return QInternalList<QCacheItem>::first(); }
+    QCacheItem *last()         { return QInternalList<QCacheItem>::last(); }
+    QCacheItem *prev()         { return QInternalList<QCacheItem>::prev(); }
+    QCacheItem *next()         { return QInternalList<QCacheItem>::next(); }
 
 #if defined(DEBUG)
     int                inserts;                        // variables for statistics
@@ -125,7 +125,7 @@ void QCList::insert( QCacheItem *ci )
        item = next();
     }
     if ( item )
-       QList<QCacheItem>::insert( at(), ci );
+       QInternalList<QCacheItem>::insert( at(), ci );
     else
        append( ci );
 #if defined(DEBUG)
@@ -136,7 +136,7 @@ void QCList::insert( QCacheItem *ci )
 
 inline void QCList::insert( int i, QCacheItem *ci )
 {
-    QList<QCacheItem>::insert( i, ci );
+    QInternalList<QCacheItem>::insert( i, ci );
 #if defined(DEBUG)
     ASSERT( ci->node == 0 );
 #endif
@@ -166,11 +166,11 @@ inline void QCList::reference( QCacheItem *ci )
 }
 
 
-class QCListIt: public QListIterator<QCacheItem>
+class QCListIt: public QInternalListIterator<QCacheItem>
 {
 public:
-    QCListIt( const QCList *p ): QListIterator<QCacheItem>( *p ) {}
-    QCListIt( const QCListIt *p ): QListIterator<QCacheItem>( *p ) {}
+    QCListIt( const QCList *p ): QInternalListIterator<QCacheItem>( *p ) {}
+    QCListIt( const QCListIt *p ): QInternalListIterator<QCacheItem>( *p ) {}
 };
 
 
index 534a93c..2530986 100644 (file)
@@ -36,7 +36,7 @@
 **********************************************************************/
 
 #include "qgdict.h"
-#include "qlist.h"
+#include "qinternallist.h"
 #include "qstring.h"
 #include "qdatastream.h"
 #include <ctype.h>
@@ -63,14 +63,14 @@ static const int op_insert  = 1;
 static const int op_replace = 2;
 
 
-class QGDItList : public QList<QGDictIterator>
+class QGDItList : public QInternalList<QGDictIterator>
 {
 public:
-    QGDItList() : QList<QGDictIterator>() {}
-    QGDItList( const QGDItList &list ) : QList<QGDictIterator>(list) {}
+    QGDItList() : QInternalList<QGDictIterator>() {}
+    QGDItList( const QGDItList &list ) : QInternalList<QGDictIterator>(list) {}
    ~QGDItList() { clear(); }
     QGDItList &operator=(const QGDItList &list)
-       { return (QGDItList&)QList<QGDictIterator>::operator=(list); }
+       { return (QGDItList&)QInternalList<QGDictIterator>::operator=(list); }
 };
 
 
diff --git a/qtools/qinternallist.h b/qtools/qinternallist.h
new file mode 100644 (file)
index 0000000..09dbfce
--- /dev/null
@@ -0,0 +1,139 @@
+/****************************************************************************
+** 
+**
+** Definition of QList template/macro class
+**
+** Created : 920701
+**
+** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+**   information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QINTERNALLIST_H
+#define QINTERNALLIST_H
+
+#ifndef QT_H
+#include "qglist.h"
+#endif // QT_H
+
+
+template<class type> class Q_EXPORT QInternalList : public QGList
+{
+public:
+    QInternalList()                            {}
+    QInternalList( const QInternalList<type> &l ) : QGList(l) {}
+   ~QInternalList()                            { clear(); }
+    QInternalList<type> &operator=(const QInternalList<type> &l)
+                       { return (QInternalList<type>&)QGList::operator=(l); }
+    bool operator==( const QInternalList<type> &list ) const
+    { return QGList::operator==( list ); }
+    uint  count()   const              { return QGList::count(); }
+    bool  isEmpty() const              { return QGList::count() == 0; }
+    bool  insert( uint i, const type *d){ return QGList::insertAt(i,(QCollection::Item)d); }
+    void  inSort( const type *d )      { QGList::inSort((QCollection::Item)d); }
+    void  prepend( const type *d )     { QGList::insertAt(0,(QCollection::Item)d); }
+    void  append( const type *d )      { QGList::append((QCollection::Item)d); }
+    bool  remove( uint i )             { return QGList::removeAt(i); }
+    bool  remove()                     { return QGList::remove((QCollection::Item)0); }
+    bool  remove( const type *d )      { return QGList::remove((QCollection::Item)d); }
+    bool  removeRef( const type *d )   { return QGList::removeRef((QCollection::Item)d); }
+    void  removeNode( QLNode *n )      { QGList::removeNode(n); }
+    bool  removeFirst()                        { return QGList::removeFirst(); }
+    bool  removeLast()                 { return QGList::removeLast(); }
+    type *take( uint i )               { return (type *)QGList::takeAt(i); }
+    type *take()                       { return (type *)QGList::take(); }
+    type *takeNode( QLNode *n )                { return (type *)QGList::takeNode(n); }
+    void  clear()                      { QGList::clear(); }
+    void  sort()                       { QGList::sort(); }
+    int          find( const type *d )         { return QGList::find((QCollection::Item)d); }
+    int          findNext( const type *d )     { return QGList::find((QCollection::Item)d,FALSE); }
+    int          findRef( const type *d )      { return QGList::findRef((QCollection::Item)d); }
+    int          findNextRef( const type *d ){ return QGList::findRef((QCollection::Item)d,FALSE);}
+    uint  contains( const type *d ) const { return QGList::contains((QCollection::Item)d); }
+    uint  containsRef( const type *d ) const
+                                       { return QGList::containsRef((QCollection::Item)d); }
+    type *at( uint i )                 { return (type *)QGList::at(i); }
+    int          at() const                    { return QGList::at(); }
+    type *current()  const             { return (type *)QGList::get(); }
+    QLNode *currentNode()  const       { return QGList::currentNode(); }
+    type *getFirst() const             { return (type *)QGList::cfirst(); }
+    type *getLast()  const             { return (type *)QGList::clast(); }
+    type *first()                      { return (type *)QGList::first(); }
+    type *last()                       { return (type *)QGList::last(); }
+    type *next()                       { return (type *)QGList::next(); }
+    type *prev()                       { return (type *)QGList::prev(); }
+    void  toVector( QGVector *vec )const{ QGList::toVector(vec); }
+private:
+    void  deleteItem( QCollection::Item d );
+};
+
+#if defined(Q_DELETING_VOID_UNDEFINED)
+template<> inline void QInternalList<void>::deleteItem( QCollection::Item )
+{
+}
+#endif
+
+template<class type> inline void QInternalList<type>::deleteItem( QCollection::Item d )
+{
+    if ( del_item ) delete (type *)d;
+}
+
+
+template<class type> class Q_EXPORT QInternalListIterator : public QGListIterator
+{
+public:
+    QInternalListIterator(const QInternalList<type> &l) :QGListIterator((QGList &)l) {}
+   ~QInternalListIterator()          {}
+    uint  count()   const     { return list->count(); }
+    bool  isEmpty() const     { return list->count() == 0; }
+    bool  atFirst() const     { return QGListIterator::atFirst(); }
+    bool  atLast()  const     { return QGListIterator::atLast(); }
+    type *toFirst()          { return (type *)QGListIterator::toFirst(); }
+    type *toLast()           { return (type *)QGListIterator::toLast(); }
+    operator type *() const   { return (type *)QGListIterator::get(); }
+    type *operator*()         { return (type *)QGListIterator::get(); }
+
+    // No good, since QList<char> (ie. QStrList fails...
+    //
+    // MSVC++ gives warning
+    // Sunpro C++ 4.1 gives error
+    //    type *operator->()        { return (type *)QGListIterator::get(); }
+
+    type *current()   const   { return (type *)QGListIterator::get(); }
+    type *operator()()       { return (type *)QGListIterator::operator()();}
+    type *operator++()       { return (type *)QGListIterator::operator++(); }
+    type *operator+=(uint j)  { return (type *)QGListIterator::operator+=(j);}
+    type *operator--()       { return (type *)QGListIterator::operator--(); }
+    type *operator-=(uint j)  { return (type *)QGListIterator::operator-=(j);}
+    QInternalListIterator<type>& operator=(const QInternalListIterator<type>&it)
+                             { QGListIterator::operator=(it); return *this; }
+};
+
+
+#endif // QINTERNALLIST_H
index a4608fb..e9b908d 100644 (file)
 **
 **********************************************************************/
 
+/* This is a stripped version of the original QList, which has been renamed to
+   QInternalList. This implementation doesn't expose the current node and index,
+   nor direct access to the list nodes.
+   This makes it possible to have more constant methods. It also provides
+   a typesafe method to compare elements called compareValues() and a typesafe
+   methods to create and delete elements called newValue() and deleteValue().
+ */
+
 #ifndef QLIST_H
 #define QLIST_H
 
@@ -43,7 +51,7 @@
 #endif // QT_H
 
 
-template<class type> class Q_EXPORT QList : public QGList
+template<class type> class Q_EXPORT QList : private QGList
 {
 public:
     QList()                            {}
@@ -53,57 +61,67 @@ public:
                        { return (QList<type>&)QGList::operator=(l); }
     bool operator==( const QList<type> &list ) const
     { return QGList::operator==( list ); }
+
+    // capacity
     uint  count()   const              { return QGList::count(); }
     bool  isEmpty() const              { return QGList::count() == 0; }
+
+    // modifiers add
     bool  insert( uint i, const type *d){ return QGList::insertAt(i,(QCollection::Item)d); }
     void  inSort( const type *d )      { QGList::inSort((QCollection::Item)d); }
     void  prepend( const type *d )     { QGList::insertAt(0,(QCollection::Item)d); }
     void  append( const type *d )      { QGList::append((QCollection::Item)d); }
+
+    // modifiers remove
     bool  remove( uint i )             { return QGList::removeAt(i); }
-    bool  remove()                     { return QGList::remove((QCollection::Item)0); }
     bool  remove( const type *d )      { return QGList::remove((QCollection::Item)d); }
     bool  removeRef( const type *d )   { return QGList::removeRef((QCollection::Item)d); }
-    void  removeNode( QLNode *n )      { QGList::removeNode(n); }
     bool  removeFirst()                        { return QGList::removeFirst(); }
     bool  removeLast()                 { return QGList::removeLast(); }
     type *take( uint i )               { return (type *)QGList::takeAt(i); }
-    type *take()                       { return (type *)QGList::take(); }
-    type *takeNode( QLNode *n )                { return (type *)QGList::takeNode(n); }
     void  clear()                      { QGList::clear(); }
+
+    // operations
     void  sort()                       { QGList::sort(); }
-    int          find( const type *d )         { return QGList::find((QCollection::Item)d); }
-    int          findNext( const type *d )     { return QGList::find((QCollection::Item)d,FALSE); }
-    int          findRef( const type *d )      { return QGList::findRef((QCollection::Item)d); }
-    int          findNextRef( const type *d ){ return QGList::findRef((QCollection::Item)d,FALSE);}
+
+    // search
+    int          find( const type *d ) const    { return const_cast<QList<type>*>(this)->QGList::find((QCollection::Item)d); }
+    int          findRef( const type *d ) const { return const_cast<QList<type>*>(this)->QGList::findRef((QCollection::Item)d); }
     uint  contains( const type *d ) const { return QGList::contains((QCollection::Item)d); }
-    uint  containsRef( const type *d ) const
-                                       { return QGList::containsRef((QCollection::Item)d); }
-    type *at( uint i )                 { return (type *)QGList::at(i); }
-    int          at() const                    { return QGList::at(); }
-    type *current()  const             { return (type *)QGList::get(); }
-    QLNode *currentNode()  const       { return QGList::currentNode(); }
+    uint  containsRef( const type *d ) const { return QGList::containsRef((QCollection::Item)d); }
+
+    // element access
+    type *at( uint i ) const           { return (type *)const_cast<QList<type>*>(this)->QGList::at(i); }
     type *getFirst() const             { return (type *)QGList::cfirst(); }
     type *getLast()  const             { return (type *)QGList::clast(); }
-    type *first()                      { return (type *)QGList::first(); }
-    type *last()                       { return (type *)QGList::last(); }
-    type *next()                       { return (type *)QGList::next(); }
-    type *prev()                       { return (type *)QGList::prev(); }
-    void  toVector( QGVector *vec )const{ QGList::toVector(vec); }
+
+    // ownership
+    void setAutoDelete( bool enable )   { QGList::setAutoDelete(enable); }
+
 private:
-    void  deleteItem( QCollection::Item d );
+    // new to be reimplemented methods
+    virtual int compareValues(const type *t1,const type *t2) const
+    { return const_cast<QList<type>*>(this)->QGList::compareItems((QCollection::Item)t1,(QCollection::Item)t2); }
+    virtual type *newValue(type *item) const
+    { return item; }
+    virtual void deleteValue(type *item) const
+    { if (del_item) delete item; }
+
+    // reimplemented methods
+    virtual Item newItem( Item item)
+    { return (Item)newValue((type*)item); }
+    virtual void deleteItem( QCollection::Item item )
+    { deleteValue((type *)item); }
+    virtual int compareItems(QCollection::Item i1,QCollection::Item i2)
+    { return compareValues((const type*)i1,(const type*)i2); }
 };
 
 #if defined(Q_DELETING_VOID_UNDEFINED)
-template<> inline void QList<void>::deleteItem( QCollection::Item )
+template<> inline void QList<void>::deleteValue(void *) const
 {
 }
 #endif
 
-template<class type> inline void QList<type>::deleteItem( QCollection::Item d )
-{
-    if ( del_item ) delete (type *)d;
-}
-
 
 template<class type> class Q_EXPORT QListIterator : public QGListIterator
 {
index c6a1864..ebf97c5 100644 (file)
 
 #ifndef QT_H
 #include "qstring.h"
-#include "qlist.h"
+#include "qinternallist.h"
 #include "qdatastream.h"
 #endif // QT_H
 
 
 #if defined(Q_TEMPLATEDLL)
-template class Q_EXPORT QList<char>;
-template class Q_EXPORT QListIterator<char>;
+template class Q_EXPORT QInternalList<char>;
+template class Q_EXPORT QInternalListIterator<char>;
 #endif
 
-typedef QList<char>            QStrListBase;
-typedef QListIterator<char>    QStrListIterator;
+typedef QInternalList<char>    QStrListBase;
+typedef QInternalListIterator<char>    QStrListIterator;
 
 
 class Q_EXPORT QStrList : public QStrListBase
index 9721c25..168445f 100644 (file)
@@ -38,7 +38,7 @@
 #include "qtextcodec.h"
 #ifndef QT_NO_TEXTCODEC
 
-#include "qlist.h"
+#include "qinternallist.h"
 #ifndef QT_NO_CODECS
 #include "qutfcodec.h"
 //#include "qgbkcodec.h"
@@ -60,7 +60,7 @@
 #include <locale.h>
 
 
-static QList<QTextCodec> * all = 0;
+static QInternalList<QTextCodec> * all = 0;
 static bool destroying_is_ok; // starts out as 0
 
 /*!  Deletes all the created codecs.
@@ -84,7 +84,7 @@ void QTextCodec::deleteAllCodecs()
         return;
 
     destroying_is_ok = TRUE;
-    QList<QTextCodec> * ball = all;
+    QInternalList<QTextCodec> * ball = all;
     all = 0;
     ball->clear();
     delete ball;
@@ -101,7 +101,7 @@ static void realSetup()
     if ( destroying_is_ok )
         qWarning( "creating new codec during codec cleanup" );
 #endif
-    all = new QList<QTextCodec>;
+    all = new QInternalList<QTextCodec>;
     all->setAutoDelete( TRUE );
     setupBuiltinCodecs();
 }
@@ -354,7 +354,7 @@ QTextCodec* QTextCodec::codecForIndex(int i)
 QTextCodec* QTextCodec::codecForMib(int mib)
 {
     setup();
-    QListIterator<QTextCodec> i(*all);
+    QInternalListIterator<QTextCodec> i(*all);
     QTextCodec* result;
     for ( ; (result=i); ++i ) {
         if ( result->mibEnum()==mib )
@@ -626,7 +626,7 @@ QTextCodec* QTextCodec::codecForLocale()
 QTextCodec* QTextCodec::codecForName(const char* hint, int accuracy)
 {
     setup();
-    QListIterator<QTextCodec> i(*all);
+    QInternalListIterator<QTextCodec> i(*all);
     QTextCodec* result = 0;
     int best=accuracy;
     for ( QTextCodec* cursor; (cursor=i); ++i ) {
@@ -653,7 +653,7 @@ QTextCodec* QTextCodec::codecForName(const char* hint, int accuracy)
 QTextCodec* QTextCodec::codecForContent(const char* chars, int len)
 {
     setup();
-    QListIterator<QTextCodec> i(*all);
+    QInternalListIterator<QTextCodec> i(*all);
     QTextCodec* result = 0;
     int best=0;
     for ( QTextCodec* cursor; (cursor=i); ++i ) {
index 3eabed9..f287d34 100644 (file)
@@ -26,7 +26,7 @@ HEADERS               = qarray.h \
                  qgvector.h \
                  qintdict.h \
                  qiodevice.h \
-                 qlist.h \
+                 qinternallist.h \
                  qptrdict.h \
                  qqueue.h \
                  qregexp.h \
@@ -98,5 +98,5 @@ INCLUDEPATH = .
 TMAKE_CXXFLAGS += -DQT_LITE_UNICODE
 win32:TMAKE_CXXFLAGS += -DQT_NODLL
 win32-g++:TMAKE_CXXFLAGS += -D__CYGWIN__ -DALL_STATIC
-OBJECTS_DIR = ../objects
+OBJECTS_DIR = ../objects/qtools
 DESTDIR = ../lib
index 77eb039..80b7b67 100644 (file)
@@ -42,7 +42,7 @@
 #include <windows.h>
 #include "qwaitcondition.h"
 #include "qmutex.h"
-#include "qlist.h"
+#include "qinternallist.h"
 
 //***********************************************************************
 // QWaitConditionPrivate
@@ -61,7 +61,7 @@ public:
     HANDLE event;
 };
 
-class EventQueue : public QList<QWaitConditionEvent>
+class EventQueue : public QInternalList<QWaitConditionEvent>
 {
   public:
     EventQueue() { setAutoDelete(TRUE); }
index 7d1d0d9..875cf1d 100644 (file)
@@ -2,7 +2,7 @@
 #
 #
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van 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 @@
 # input used in their production; they are not affected by this license.
 #
 
+GENERATED_SRC = ../generated_src/doxygen
+
 all: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile
        $(MAKE) -f Makefile.libdoxycfg $@
        $(MAKE) -f Makefile.libdoxygen $@
@@ -42,20 +44,11 @@ clean: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen
 
 # also clean flex/bison generated files
 distclean: clean
-       -$(RM) scanner.cpp code.cpp config.cpp pre.cpp constexp.cpp \
+       -cd $(GENERATED_SRC) && $(RM) scanner.cpp code.cpp config.cpp pre.cpp constexp.cpp \
               ce_parse.cpp ce_parse.h tag.cpp commentscan.cpp \
               declinfo.cpp defargs.cpp commentcnv.cpp doctokenizer.cpp \
               pycode.cpp pyscanner.cpp fortrancode.cpp fortranscanner.cpp \
               vhdlscanner.cpp vhdlcode.cpp tclscanner.cpp vhdlparser.h \
               vhdlparser.cpp
 
-# clean also the generated files which are in SVN
-realclean: distclean
-       -$(RM) index.xsd.h compound.xsd.h layout_default.xml.h \
-              header.html.h footer.html.h search_functions.php.h search_opensearch.php.h \
-              search.js.h search.css.h doxygen.css.h navtree.js.h resize.js.h \
-              doxygen.sty.h jquery_fx.js.h jquery_p1.js.h jquery_p2.js.h \
-              jquery_p3.js.h jquery_ui.js.h navtree.css.h svgpan.js.h dynsections.js.h \
-              doxygen.bst.h bib2xhtml.pl.h configoptions.cpp jquery_pt.js.h extsearch.js.h
-
 FORCE:
index eba452c..ed09869 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index cfb89c4..7fb7d40 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 3e3eb43..a3056ba 100644 (file)
@@ -239,6 +239,7 @@ void CiteDict::generatePage() const
   QFileInfo fi(citeListFile);
   QCString input(fi.size()+1);
   f.readBlock(input.data(),fi.size());
+  f.close();
   input.at(fi.size())='\0';
   int p=0,s;
   //printf("input=[%s]\n",input.data());
@@ -310,7 +311,7 @@ void CiteDict::generatePage() const
   thisDir.remove(bib2xhtmlFile);
   while (!tempFiles.isEmpty()) 
   {
-    QCString *s=tempFiles.take();
+    QCString *s=tempFiles.take(0);
     thisDir.remove(*s);
   }
 }
index 6404431..eded587 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -897,8 +897,9 @@ static void writeTemplateSpec(OutputList &ol,Definition *d,
     for (spi.toFirst();(al=spi.current());++spi)
     {
       ol.docify("template<");
-      Argument *a=al->first();
-      while (a)
+      QListIterator<Argument> ali(*al);
+      Argument *a;
+      while ((a=ali.current()))
       {
         ol.docify(a->type);
         if (!a->name.isEmpty())
@@ -911,7 +912,8 @@ static void writeTemplateSpec(OutputList &ol,Definition *d,
           ol.docify(" = ");
           ol.docify(a->defval);
         }
-        a=al->next();
+        ++ali;
+        a=ali.current();
         if (a) ol.docify(", ");
       }
       ol.docify(">");
@@ -1084,8 +1086,9 @@ void ClassDef::showUsedFiles(OutputList &ol)
   ol.parseText(generatedFromFiles());
 
   bool first=TRUE;
-  FileDef *fd = m_impl->files.first();
-  while (fd)
+  QListIterator<FileDef> li(m_impl->files);
+  FileDef *fd;
+  for (;(fd=li.current());++li)
   {
     if (first)
     {
@@ -1139,8 +1142,6 @@ void ClassDef::showUsedFiles(OutputList &ol)
     ol.popGeneratorState();
 
     ol.endItemListItem();
-
-    fd=m_impl->files.next();
   }
   if (!first) ol.endItemList();
 
@@ -1153,22 +1154,20 @@ int ClassDef::countInheritanceNodes()
   BaseClassDef *ibcd;
   if (m_impl->inheritedBy)
   {
-    ibcd=m_impl->inheritedBy->first();
-    while (ibcd)
+    BaseClassListIterator it(*m_impl->inheritedBy);
+    for (;(ibcd=it.current());++it)
     {
       ClassDef *icd=ibcd->classDef;
       if ( icd->isVisibleInHierarchy()) count++;
-      ibcd=m_impl->inheritedBy->next();
     }
   }
   if (m_impl->inherits)
   {
-    ibcd=m_impl->inherits->first();
-    while (ibcd)
+    BaseClassListIterator it(*m_impl->inherits);
+    for (;(ibcd=it.current());++it)
     {
       ClassDef *icd=ibcd->classDef;
       if ( icd->isVisibleInHierarchy()) count++;
-      ibcd=m_impl->inherits->next();
     }
   }
   return count;
@@ -1767,20 +1766,24 @@ void ClassDef::writeMoreLink(OutputList &ol,const QCString &anchor)
   }
 }
 
+bool ClassDef::visibleInParentsDeclList() const
+{
+  static bool extractPrivate      = Config_getBool("EXTRACT_PRIVATE");
+  static bool hideUndocClasses = Config_getBool("HIDE_UNDOC_CLASSES");
+  static bool extractLocalClasses = Config_getBool("EXTRACT_LOCAL_CLASSES");
+  bool linkable = isLinkable();
+  return (name().find('@')==-1 && !isExtension() &&
+          (protection()!=::Private || extractPrivate) &&
+          (linkable || (!hideUndocClasses && (!isLocal() || extractLocalClasses)))
+         );
+}
 
 void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *header,bool localNames)
 {
   //static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
   //static bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
-  static bool hideUndocClasses = Config_getBool("HIDE_UNDOC_CLASSES");
-  static bool extractLocalClasses = Config_getBool("EXTRACT_LOCAL_CLASSES");
-  bool isLink = isLinkable();
   SrcLangExt lang = getLanguage();
-  if (isLink ||
-      (!hideUndocClasses &&
-       (!isLocal() || extractLocalClasses)
-      )
-     )
+  if (visibleInParentsDeclList())
   {
     if (!found) // first class
     {
@@ -1820,7 +1823,7 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade
       ol.writeString(" ");
       ol.insertMemberAlign();
     }
-    if (isLink)
+    if (isLinkable())
     {
       ol.writeObjectLink(getReference(),
           getOutputFileBase(),
@@ -2100,7 +2103,8 @@ void ClassDef::writeMemberPages(OutputList &ol)
   MemberList *ml;
   for (mli.toFirst();(ml=mli.current());++mli)
   {
-    if (ml->listType()&MemberListType_detailedLists)
+    ml->countDocMembers();
+    if (ml->numDocMembers()>0 && (ml->listType()&MemberListType_detailedLists))
     {
       ml->writeDocumentationPage(ol,displayName(),this);
     }
@@ -2127,7 +2131,7 @@ void ClassDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
       for (mnii.toFirst();(mi=mnii.current());++mnii)
       {
         MemberDef *md=mi->memberDef;
-        if (md->getClassDef()==this && md->isLinkable())
+        if (md->getClassDef()==this && md->isLinkable() && !md->isEnumValue())
         {
           ol.writeString("          <tr><td class=\"navtab\">");
           if (md->isLinkableInProject())
@@ -2224,8 +2228,9 @@ void ClassDef::writeMemberList(OutputList &ol)
   MemberNameInfo *mni;
   for (mnii.toFirst();(mni=mnii.current());++mnii)
   {
-    MemberInfo *mi=mni->first();
-    while (mi)
+    MemberNameInfoIterator it(*mni);
+    MemberInfo *mi;
+    for (;(mi=it.current());++it)
     {
       MemberDef *md=mi->memberDef;
       ClassDef  *cd=md->getClassDef();
@@ -2421,7 +2426,6 @@ void ClassDef::writeMemberList(OutputList &ol)
           ol.writeString("</tr>\n");
         }
       }
-      mi=mni->next();
     }
   }
   //ol.endItemList();
@@ -3407,10 +3411,11 @@ QCString ClassDef::compoundTypeString() const
 
 QCString ClassDef::getOutputFileBase() const
 {
-  if (!Doxygen::generatingXmlOutput)
+  static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
+  static bool inlineSimpleClasses = Config_getBool("INLINE_SIMPLE_STRUCTS");
+  static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
+  if (!Doxygen::generatingXmlOutput && !separateMemberPages)
   {
-    static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
-    static bool inlineSimpleClasses = Config_getBool("INLINE_SIMPLE_STRUCTS");
     Definition *scope=0;
     if (inlineGroupedClasses && partOfGroups()!=0)
     {
@@ -3728,7 +3733,7 @@ void ClassDef::getTemplateParameterLists(QList<ArgumentList> &lists) const
 }
 
 QCString ClassDef::qualifiedNameWithTemplateParameters(
-    QList<ArgumentList> *actualParams) const
+    QList<ArgumentList> *actualParams,int *actualParamIndex) const
 {
   //static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
   static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES");
@@ -3740,7 +3745,7 @@ QCString ClassDef::qualifiedNameWithTemplateParameters(
     if (d->definitionType()==Definition::TypeClass)
     {
       ClassDef *cd=(ClassDef *)d;
-      scName = cd->qualifiedNameWithTemplateParameters(actualParams);
+      scName = cd->qualifiedNameWithTemplateParameters(actualParams,actualParamIndex);
     }
     else if (!hideScopeNames)
     {
@@ -3765,13 +3770,14 @@ QCString ClassDef::qualifiedNameWithTemplateParameters(
   ArgumentList *al=0;
   if (templateArguments())
   {
-    if (actualParams && (al=actualParams->current()))
+    if (actualParams && *actualParamIndex<(int)actualParams->count())
     {
+      al = actualParams->at(*actualParamIndex);
       if (!isSpecialization)
       {
         scName+=tempArgListToString(al);
       }
-      actualParams->next();
+      (*actualParamIndex)++;
     }
     else
     {
@@ -3893,14 +3899,14 @@ MemberList *ClassDef::createMemberList(MemberListType lt)
 
 MemberList *ClassDef::getMemberList(MemberListType lt)
 {
-  MemberList *ml = m_impl->memberLists.first();
-  while (ml)
+  QListIterator<MemberList> mli(m_impl->memberLists);
+  MemberList *ml;
+  for (;(ml=mli.current());++mli)
   {
     if (ml->listType()==lt)
     {
       return ml;
     }
-    ml = m_impl->memberLists.next();
   }
   return 0;
 }
@@ -3919,11 +3925,15 @@ void ClassDef::addMemberToList(MemberListType lt,MemberDef *md,bool isBrief)
 
 void ClassDef::sortMemberLists()
 {
-  MemberList *ml = m_impl->memberLists.first();
-  while (ml)
+  QListIterator<MemberList> mli(m_impl->memberLists);
+  MemberList *ml;
+  for (;(ml=mli.current());++mli)
   {
     if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
-    ml = m_impl->memberLists.next();
+  }
+  if (m_impl->innerClasses)
+  {
+    m_impl->innerClasses->sort();
   }
 }
 
@@ -3948,6 +3958,17 @@ int ClassDef::countMemberDeclarations(MemberListType lt,ClassDef *inheritedFrom,
       count+=ml2->numDecMembers();
       //printf("-> ml2=%d\n",ml2->numDecMembers());
     }
+    // also include grouped members that have their own section in the class (see bug 722759)
+    if (inheritedFrom && m_impl->memberGroupSDict)
+    {
+      MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
+      MemberGroup *mg;
+      for (;(mg=mgli.current());++mgli)
+      {
+        count+=mg->countGroupedInheritedMembers(lt);
+        if (lt2!=1) count+=mg->countGroupedInheritedMembers((MemberListType)lt2);
+      }
+    }
     static bool inlineInheritedMembers = Config_getBool("INLINE_INHERITED_MEMB");
     if (!inlineInheritedMembers) // show inherited members as separate lists
     {
@@ -4437,11 +4458,11 @@ MemberDef *ClassDef::isSmartPointer() const
 void ClassDef::reclassifyMember(MemberDef *md,MemberType t)
 {
   md->setMemberType(t);
-  MemberList *ml = m_impl->memberLists.first();
-  while (ml)
+  QListIterator<MemberList> mli(m_impl->memberLists);
+  MemberList *ml;
+  for (;(ml=mli.current());++mli)
   {
     ml->remove(md);
-    ml = m_impl->memberLists.next();
   }
   insertMember(md);
 }
@@ -4526,11 +4547,11 @@ void ClassDef::setTagLessReference(ClassDef *cd)
 
 void ClassDef::removeMemberFromLists(MemberDef *md)
 {
-  MemberList *ml = m_impl->memberLists.first();
-  while (ml)
+  QListIterator<MemberList> mli(m_impl->memberLists);
+  MemberList *ml;
+  for (;(ml=mli.current());++mli)
   {
     ml->remove(md);
-    ml = m_impl->memberLists.next();
   }
 }
 
index 4e76117..8c5bebf 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -168,6 +168,9 @@ class ClassDef : public Definition
     /** the class is visible in a class diagram, or class hierarchy */
     bool isVisibleInHierarchy();
     
+    /** show this class in the declaration section of its parent? */
+    bool visibleInParentsDeclList() const;
+
     /** Returns the template arguments of this class 
      *  Will return 0 if not applicable.
      */
@@ -243,7 +246,7 @@ class ClassDef : public Definition
     void getTemplateParameterLists(QList<ArgumentList> &lists) const;
 
     QCString qualifiedNameWithTemplateParameters(
-        QList<ArgumentList> *actualParams=0) const;
+        QList<ArgumentList> *actualParams=0,int *actualParamIndex=0) const;
 
     /** Returns TRUE if there is at least one pure virtual member in this
      *  class.
@@ -310,14 +313,13 @@ class ClassDef : public Definition
     QCString generatedFromFiles() const;
     const FileList &usedFiles() const;
 
-    QCString includeStatement() const;
-
     const ArgumentList *typeConstraints() const;
     const ExampleSDict *exampleList() const;
     bool hasExamples() const;
     QCString getMemberListFileName() const;
     bool subGrouping() const;
 
+
     //-----------------------------------------------------------------------------------
     // --- setters ----
     //-----------------------------------------------------------------------------------
@@ -432,6 +434,8 @@ class ClassDef : public Definition
                                  QPtrDict<void> *visitedClasses);
     void getTitleForMemberListType(MemberListType type,
                QCString &title,QCString &subtitle);
+    QCString includeStatement() const;
+
     
     ClassDefImpl *m_impl;
 
@@ -528,11 +532,11 @@ class BaseClassList : public QList<BaseClassDef>
 {
   public:
    ~BaseClassList() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+    int compareValues(const BaseClassDef *item1,const BaseClassDef *item2) const
     {
-      ClassDef *c1=((BaseClassDef *)item1)->classDef;
-      ClassDef *c2=((BaseClassDef *)item2)->classDef;
-      if (c1==0 || c2==0) 
+      const ClassDef *c1=item1->classDef;
+      const ClassDef *c2=item2->classDef;
+      if (c1==0 || c2==0)
         return FALSE;
       else
         return qstricmp(c1->name(),c2->name());
index f19c374..5751356 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -33,30 +33,25 @@ ClassList::~ClassList()
 {
 }
 
-static int compItems(void *item1,void *item2)
+static int compItems(const ClassDef *c1,const ClassDef *c2)
 {
-  ClassDef *c1=(ClassDef *)item1;
-  ClassDef *c2=(ClassDef *)item2;
   static bool b = Config_getBool("SORT_BY_SCOPE_NAME");
-  //printf("compItems: %d %s<->%s\n",b,c1->name().data(),c2->name().data());
   if (b)
   {
-     return qstricmp(c1->name(),
-                    c2->name());
+     return qstricmp(c1->name(), c2->name());
   }
   else
   {
-     return qstricmp(c1->className(),
-                    c2->className());
+     return qstricmp(c1->className(), c2->className());
   }
 }
 
-int ClassList::compareItems(QCollection::Item item1, QCollection::Item item2)
+int ClassList::compareValues(const ClassDef *item1, const ClassDef *item2) const
 {
   return compItems(item1,item2);
 }
 
-int ClassSDict::compareItems(QCollection::Item item1, QCollection::Item item2)
+int ClassSDict::compareValues(const ClassDef *item1, const ClassDef *item2) const
 {
   return compItems(item1,item2);
 }
index adc781c..3f15b3e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -28,12 +28,13 @@ class Definition;
 
 /** A list of ClassDef objects. */
 class ClassList : public QList<ClassDef>
-{ 
+{
   public:
     ClassList();
    ~ClassList();
-   
-   int compareItems(QCollection::Item item1,QCollection::Item item2);
+
+  private:
+    int compareValues(const ClassDef *item1,const ClassDef *item2) const;
 };
 
 /** An iterator for ClassDef objects in a ClassList. */
@@ -57,11 +58,12 @@ class ClassSDict : public SDict<ClassDef>
   public:
     ClassSDict(int size=17) : SDict<ClassDef>(size) {}
    ~ClassSDict() {}
-   int compareItems(QCollection::Item item1,QCollection::Item item2);
-   void writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter=0,
+    void writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter=0,
                          const char *header=0,bool localNames=FALSE);
-   void writeDocumentation(OutputList &ol,Definition *container=0);
-   bool declVisible(const ClassDef::CompoundType *filter=0) const;
+    void writeDocumentation(OutputList &ol,Definition *container=0);
+    bool declVisible(const ClassDef::CompoundType *filter=0) const;
+  private:
+    int compareValues(const ClassDef *item1,const ClassDef *item2) const;
 };
 
 class GenericsCollection : public QIntDict<ClassDef>
index c728be3..45469f2 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -63,6 +63,7 @@ CommandMap cmdMap[] =
   { "internal",      CMD_INTERNAL },
   { "invariant",     CMD_INVARIANT },
   { "javalink",      CMD_JAVALINK },
+  { "latexinclude",  CMD_LATEXINCLUDE },
   { "latexonly",     CMD_LATEXONLY },
   { "li",            CMD_LI },
   { "line",          CMD_LINE },
@@ -135,6 +136,8 @@ CommandMap cmdMap[] =
   { "parblock",      CMD_PARBLOCK },
   { "endparblock",   CMD_ENDPARBLOCK },
   { "diafile",       CMD_DIAFILE },
+  { "--",            CMD_NDASH },
+  { "---",           CMD_MDASH },
   { 0,               0 },
 };
 
index 0017c02..d89e368 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -124,7 +124,10 @@ enum CommandType
   CMD_ENDINTERNAL  = 94,
   CMD_PARBLOCK     = 95,
   CMD_ENDPARBLOCK  = 96,
-  CMD_DIAFILE      = 97
+  CMD_DIAFILE      = 97,
+  CMD_LATEXINCLUDE = 98,
+  CMD_NDASH        = 99,
+  CMD_MDASH        = 100
 };
 
 enum HtmlTagType
index 8aadc0b..72a906c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index ba35f7d..0d23553 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -111,6 +111,7 @@ static int           g_lastSkipCppContext;
 static int           g_lastVerbStringContext;
 static int           g_memCallContext;
 static int          g_lastCContext;
+static int           g_skipInlineInitContext;
 
 static bool          g_insideObjC;
 static bool          g_insideJava;
@@ -299,21 +300,18 @@ ClassDef *VariableContext::findVariable(const QCString &name)
 {
   if (name.isEmpty()) return 0;
   ClassDef *result = 0;
-  //QListIterator<Scope> sli(m_scopes);
+  QListIterator<Scope> sli(m_scopes);
   Scope *scope;
   QCString key = name;
   // search from inner to outer scope
-  scope = m_scopes.last();
-  //for (sli.toLast();(scope=sli.current());--sli)
-  while (scope)
+  for (sli.toLast();(scope=sli.current());--sli)
   {
     result = scope->find(key);
-    if (result) 
+    if (result)
     {
       DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
       return result;
     }
-    scope = m_scopes.prev();
   }
   // nothing found -> also try the global scope
   result=m_globalScope.find(name);
@@ -671,9 +669,10 @@ static void setParameterList(MemberDef *md)
 {
   g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
   ArgumentList *al = md->argumentList();
-  if (al==0) return; 
-  Argument *a = al->first();
-  while (a)
+  if (al==0) return;
+  ArgumentListIterator it(*al);
+  Argument *a;
+  for (;(a=it.current());++it)
   {
     g_parmName = a->name.copy();
     g_parmType = a->type.copy();
@@ -684,7 +683,6 @@ static void setParameterList(MemberDef *md)
     g_parmType.stripPrefix("const ");
     g_parmType=g_parmType.stripWhiteSpace();
     g_theVarContext.addVariable(g_parmType,g_parmName);
-    a = al->next();
   }
 }
 
@@ -803,13 +801,14 @@ static MemberDef *setCallContextForVar(const QCString &name)
     }
     else if (mn->count()>1) // global defined more than once
     {
-      MemberDef *md=mn->first();
-      while (md)
+      MemberNameIterator it(*mn);
+      MemberDef *md;
+      for (;(md=it.current());++it)
       {
        //printf("mn=%p md=%p md->getBodyDef()=%p g_sourceFileDef=%p\n",
        //    mn,md,
        //    md->getBodyDef(),g_sourceFileDef);
-       
+
        // in case there are multiple members we could link to, we 
        // only link to members if defined in the same file or 
        // defined as external.
@@ -821,7 +820,6 @@ static MemberDef *setCallContextForVar(const QCString &name)
          //printf("returning member %s in source file %s\n",md->name().data(),g_sourceFileDef->name().data());
           return md;
         }
-       md=mn->next();
       }
       return 0;
     }
@@ -1801,6 +1799,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 %x      OldStyleArgs
 %x     UsingName
 %x      RawString
+%x      InlineInit
 
 %%
 
@@ -2545,7 +2544,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          g_name+=yytext; 
                                          BEGIN( FuncCall );
                                        }
-<FuncCall,Body,MemberCall,MemberCall2,SkipInits>{RAWBEGIN}     {
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>{RAWBEGIN}  {
                                           QCString text=yytext;
                                           int i=text.find('R');
                                           g_code->codify(text.left(i+1));
@@ -2557,14 +2556,14 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                           g_delimiter=g_delimiter.left(g_delimiter.length()-1);
                                          BEGIN( RawString );
                                         }
-<FuncCall,Body,MemberCall,MemberCall2,SkipInits>\"     {
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\"  {
                                          startFontClass("stringliteral");
                                          g_code->codify(yytext);
                                          g_lastStringContext=YY_START;
                                          g_inForEachExpression = FALSE;
                                          BEGIN( SkipString );
                                        }
-<FuncCall,Body,MemberCall,MemberCall2,SkipInits>\'     {
+<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\'  {
                                          startFontClass("stringliteral");
                                          g_code->codify(yytext);
                                          g_lastStringContext=YY_START;
@@ -2918,6 +2917,35 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          g_theVarContext.addVariable(g_parmType,g_parmName);
                                          g_parmType.resize(0);g_parmName.resize(0);
                                        }
+<MemberCall2,FuncCall>"{"              {
+                                          if (g_bracketCount>0)
+                                          {
+                                            g_code->codify(yytext);
+                                            g_skipInlineInitContext=YY_START;
+                                            g_curlyCount=0;
+                                            BEGIN(InlineInit);
+                                          }
+                                          else
+                                          {
+                                            REJECT;
+                                          }
+                                        }
+<InlineInit>"{"                         { g_curlyCount++;
+                                          g_code->codify(yytext);
+                                        }
+<InlineInit>"}"                         {
+                                          g_code->codify(yytext);
+                                          if (--g_curlyCount<=0)
+                                          {
+                                            BEGIN(g_skipInlineInitContext);
+                                          }
+                                        }
+<InlineInit>\n                          {
+                                          codifyLines(yytext);
+                                        }
+<InlineInit>.                           {
+                                          g_code->codify(yytext);
+                                        }
 <MemberCall2,FuncCall>"("              {
                                          g_parmType.resize(0);g_parmName.resize(0);
                                          g_code->codify(yytext);
@@ -3254,8 +3282,8 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                          }
                                        }
 <SkipCPP>\n/.*\n                       { 
-                                         codifyLines(yytext);
                                          endFontClass();
+                                         codifyLines(yytext);
                                          BEGIN( g_lastSkipCppContext ) ;
                                        }
 <*>\n{B}*"//@"[{}].*\n                 { // remove one-line group marker
index 1c1fcb9..6255a73 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van 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 @@
  */
 
 #ifndef _COMMENTCNV_H
-#define _COMMNETCNV_H
+#define _COMMENTCNV_H
 
 class BufStr;
 
index d59ef51..4cc9da9 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -52,6 +52,13 @@ struct CondCtx
   bool skip;
 };
   
+struct CommentCtx
+{
+  CommentCtx(int line) 
+    : lineNr(line) {}
+  int lineNr;
+};
+  
 static BufStr * g_inBuf;
 static BufStr * g_outBuf;
 static int      g_inBufPos;
@@ -64,6 +71,7 @@ static QCString g_fileName;
 static int      g_lineNr;
 static int      g_condCtx;
 static QStack<CondCtx> g_condStack;
+static QStack<CommentCtx> g_commentStack;
 static QCString g_blockName;
 static int      g_lastCommentContext;
 static bool     g_inSpecialComment;
@@ -256,8 +264,10 @@ void replaceComment(int offset);
                                     {
                                        g_pythonDocString = TRUE;
                                        g_nestingCount=0;
+                                       g_commentStack.clear(); /*  to be on the save side */
                                        copyToOutput(yytext,(int)yyleng);
                                       BEGIN(CComment);
+                                       g_commentStack.push(new CommentCtx(g_lineNr));
                                     }
                                    }
 <Scan>![><!]/.*\n         {
@@ -269,7 +279,9 @@ void replaceComment(int offset);
                                     {
                                        copyToOutput(yytext,(int)yyleng); 
                                        g_nestingCount=0;
+                                       g_commentStack.clear(); /*  to be on the save side */
                                       BEGIN(CComment);
+                                       g_commentStack.push(new CommentCtx(g_lineNr));
                                     }
                                   }
 <Scan>[Cc\*][><!]/.*\n    {
@@ -284,7 +296,9 @@ void replaceComment(int offset);
                                        {
                                          copyToOutput(yytext,(int)yyleng); 
                                          g_nestingCount=0;
+                                         g_commentStack.clear(); /*  to be on the save side */
                                         BEGIN(CComment);
+                                         g_commentStack.push(new CommentCtx(g_lineNr));
                                       }
                                       else
                                       {
@@ -378,8 +392,10 @@ void replaceComment(int offset);
 <Scan>"/*"[*!]?                           { /* start of a C comment */
                                     g_specialComment=(int)yyleng==3;
                                      g_nestingCount=0;
+                                     g_commentStack.clear(); /*  to be on the save side */
                                      copyToOutput(yytext,(int)yyleng); 
                                     BEGIN(CComment); 
+                                     g_commentStack.push(new CommentCtx(g_lineNr));
                                    }
 <Scan>"#"("#")?                           {
                                      if (g_lang!=SrcLangExt_Python)
@@ -390,7 +406,9 @@ void replaceComment(int offset);
                                     {
                                        copyToOutput(yytext,(int)yyleng); 
                                        g_nestingCount=0;
+                                       g_commentStack.clear(); /*  to be on the save side */
                                       BEGIN(CComment);
+                                       g_commentStack.push(new CommentCtx(g_lineNr));
                                     }
                                   }
 <Scan>"--!"                       {
@@ -402,7 +420,9 @@ void replaceComment(int offset);
                                     {
                                        copyToOutput(yytext,(int)yyleng); 
                                        g_nestingCount=0;
+                                       g_commentStack.clear(); /*  to be on the save side */
                                       BEGIN(CComment);
+                                       g_commentStack.push(new CommentCtx(g_lineNr));
                                     }
                                   }
 <Scan>![><!]                      {
@@ -414,7 +434,9 @@ void replaceComment(int offset);
                                     {
                                        copyToOutput(yytext,(int)yyleng); 
                                        g_nestingCount=0;
+                                       g_commentStack.clear(); /*  to be on the save side */
                                       BEGIN(CComment);
+                                       g_commentStack.push(new CommentCtx(g_lineNr));
                                     }
                                   }
 <CComment>"{@code"/[ \t\n]        {
@@ -606,6 +628,7 @@ void replaceComment(int offset);
                                    }
 <CComment>"/"+"*"                  { /* nested C comment */
                                      g_nestingCount++;
+                                     g_commentStack.push(new CommentCtx(g_lineNr));
                                      copyToOutput(yytext,(int)yyleng); 
                                    }
 <CComment>"*"+"/"                  { /* end of C comment */
@@ -615,14 +638,15 @@ void replaceComment(int offset);
                                     }
                                     else
                                     {
+                                      copyToOutput(yytext,(int)yyleng);
                                        if (g_nestingCount<=0)
                                        {
-                                        copyToOutput(yytext,(int)yyleng);
                                         BEGIN(Scan);
                                        }
                                        else
                                        {
                                          g_nestingCount--;
+                                         delete g_commentStack.pop();
                                        }
                                     }
                                    }
@@ -731,7 +755,7 @@ void replaceComment(int offset);
 <CComment,ReadLine>[\\@][\\@][~a-z_A-Z][a-z_A-Z0-9]*[ \t]* { // escaped command
                                     copyToOutput(yytext,(int)yyleng);
                                   }
-<CComment,ReadLine>[\\@]"cond"[ \t]+      { // conditional section
+<CComment,ReadLine>[\\@]"cond"/[^a-z_A-Z0-9]      { // conditional section
                                     g_condCtx = YY_START; 
                                     BEGIN(CondLine);
                                   }
@@ -951,6 +975,8 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
   g_lineNr   = 1;
   g_condStack.clear();
   g_condStack.setAutoDelete(TRUE);
+  g_commentStack.clear();
+  g_commentStack.setAutoDelete(TRUE);
 
   printlex(yy_flex_debug, TRUE, __FILE__, fileName);
   isFixedForm = FALSE;
@@ -963,6 +989,7 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
   {
     g_nestingCount=0;
     BEGIN(CComment);
+    g_commentStack.push(new CommentCtx(g_lineNr));
   }
   else
   {
@@ -977,6 +1004,23 @@ void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
     warn(g_fileName,ctx->lineNr,"Conditional section%sdoes not have "
        "a corresponding \\endcond command within this file.",sectionInfo.data());
   }
+  if (g_nestingCount>0 || (YY_START==CComment && g_lang!=SrcLangExt_Markdown))
+  {
+    QCString tmp= "(probable line reference: ";
+    bool first = TRUE;
+    while (!g_commentStack.isEmpty())
+    {
+      CommentCtx *ctx = g_commentStack.pop();
+      if (!first) tmp += ", ";
+      tmp += QCString().setNum(ctx->lineNr);
+      first = FALSE;
+      delete ctx;
+    }
+    tmp += ")";
+    warn(g_fileName,g_lineNr,"Reached end of file while still inside a (nested) comment. "
+        "Nesting level %d %s",g_nestingCount+1,tmp.data()); // add one for "normal" expected end of comment
+  }
+  g_commentStack.clear();
   if (Debug::isFlagSet(Debug::CommentCnv))
   {
     g_outBuf->at(g_outBuf->curPos())='\0';
index e296b89..ce28ea2 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 0d08e5c..bd20bf0 100644 (file)
@@ -1,6 +1,6 @@
 /*****************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -234,6 +234,7 @@ static DocCmdMap docCmdMap[] =
   { "include",         0,                       TRUE  },
   { "includelineno",   0,                       TRUE  },
   { "invariant",       0,                       TRUE  },
+  { "latexinclude",    0,                       FALSE },
   { "li",              0,                       TRUE  },
   { "line",            0,                       TRUE  },
   { "note",            0,                       TRUE  },
@@ -553,7 +554,7 @@ static void addXRefItem(const char *listName,const char *itemTitle,
     item->text += " <p>";
     if (Doxygen::markdownSupport)
     {
-      item->text += processMarkdown(yyFileName,current,outputXRef);
+      item->text += processMarkdown(yyFileName,yyLineNr,current,outputXRef);
     }
     else
     {
@@ -575,7 +576,7 @@ static void addXRefItem(const char *listName,const char *itemTitle,
     ASSERT(item!=0);
     if (Doxygen::markdownSupport)
     {
-      item->text = processMarkdown(yyFileName,current,outputXRef);
+      item->text = processMarkdown(yyFileName,yyLineNr,current,outputXRef);
     }
     else
     {
@@ -593,11 +594,26 @@ static void addXRefItem(const char *listName,const char *itemTitle,
     {
       docEntry->doc += cmdString;
     }
-    SectionInfo *si=new SectionInfo(listName,anchorLabel,
-                                   g_sectionTitle,SectionInfo::Anchor,
-                                    g_sectionLevel);
-    Doxygen::sectionDict->append(anchorLabel,si);
-    docEntry->anchors->append(si);
+    SectionInfo *si = Doxygen::sectionDict->find(anchorLabel);
+    if (si)
+    {
+      if (si->lineNr != -1)
+      {
+        warn(listName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",anchorLabel,si->fileName.data(),si->lineNr);
+      }
+      else
+      {
+        warn(listName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s)",anchorLabel,si->fileName.data());
+      }
+    }
+    else
+    {
+      si=new SectionInfo(listName,yyLineNr,anchorLabel,
+                         g_sectionTitle,SectionInfo::Anchor,
+                         g_sectionLevel);
+      Doxygen::sectionDict->append(anchorLabel,si);
+      docEntry->anchors->append(si);
+    }
   }
   outputXRef.resize(0);
 }
@@ -643,18 +659,32 @@ static SectionInfo::SectionType sectionLevelToType(int level)
 
 static void addSection()
 {
-  // create a new section element
-  g_sectionTitle+=yytext;
-  g_sectionTitle=g_sectionTitle.stripWhiteSpace();
-  SectionInfo *si = new SectionInfo(yyFileName,g_sectionLabel,
+  SectionInfo *si = Doxygen::sectionDict->find(g_sectionLabel);
+  if (si)
+  {
+    if (si->lineNr != -1)
+    {
+      warn(yyFileName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",g_sectionLabel.data(),si->fileName.data(),si->lineNr);
+    }
+    else
+    {
+      warn(yyFileName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s)",g_sectionLabel.data(),si->fileName.data());
+    }
+  }
+  else
+  {
+    // create a new section element
+    g_sectionTitle+=yytext;
+    g_sectionTitle=g_sectionTitle.stripWhiteSpace();
+    si = new SectionInfo(yyFileName,yyLineNr,g_sectionLabel,
                           g_sectionTitle,sectionLevelToType(g_sectionLevel),g_sectionLevel);
 
-  // add section to this entry
-  current->anchors->append(si);
-
-  // add section to the global dictionary
-  Doxygen::sectionDict->append(g_sectionLabel,si);
+    // add section to this entry
+    current->anchors->append(si);
 
+    // add section to the global dictionary
+    Doxygen::sectionDict->append(g_sectionLabel,si);
+  }
 }
 
 //-----------------------------------------------------------------------------
@@ -850,7 +880,7 @@ DCMD1     ("arg"|"attention"|"author"|"cite"|"code")
 DCMD2     ("date"|"dot"|"msc"|"dotfile"|"example")
 DCMD3     ("htmlinclude"|"htmlonly"|"image"|"include")
 DCMD4     ("includelineno"|"internal"|"invariant")
-DCMD5     ("latexonly"|"li"|"line"|"manonly"|"name") 
+DCMD5     ("latexinclude"|"latexonly"|"li"|"line"|"manonly"|"name")
 DCMD6     ("note"|"par"|"paragraph"|"param"|"post")
 DCMD7     ("pre"|"remarks"|(("relate"[sd])("also")?))
 DCMD8     ("remarks"|("return"[s]?)|"retval"|"sa"|"section")
@@ -1170,6 +1200,12 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 <Comment>^{B}*([\-:|]{B}*)*("--"|"---")({B}*[\-:|])*{B}*/\n { // horizontal line (dashed)
                                          addOutput(yytext); 
                                         }
+<Comment>{CMD}"---"                     { // escaped mdash
+                                          addOutput(yytext);
+                                        }
+<Comment>{CMD}"--"                      { // escaped mdash
+                                          addOutput(yytext);
+                                        }
 <Comment>"---"                          { // mdash
                                           addOutput(insidePre || Doxygen::markdownSupport ? yytext : "&mdash;");
                                         }
@@ -1701,9 +1737,24 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
   /* ----- handle arguments of the anchor command ------- */
 
 <AnchorLabel>{LABELID}                 { // found argument
-                                          SectionInfo  *si = new SectionInfo(yyFileName,yytext,0,SectionInfo::Anchor,0);
-                                          Doxygen::sectionDict->append(yytext,si);
-                                         current->anchors->append(si);
+                                          SectionInfo *si = Doxygen::sectionDict->find(yytext);
+                                          if (si)
+                                          {
+                                            if (si->lineNr != -1)
+                                            {
+                                              warn(yyFileName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",yytext,si->fileName.data(),si->lineNr);
+                                            }
+                                            else
+                                            {
+                                              warn(yyFileName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s)",yytext,si->fileName.data());
+                                            }
+                                          }
+                                          else
+                                          {
+                                            si = new SectionInfo(yyFileName,yyLineNr,yytext,0,SectionInfo::Anchor,0);
+                                            Doxygen::sectionDict->append(yytext,si);
+                                           current->anchors->append(si);
+                                          }
                                          addOutput(yytext);
                                          BEGIN( Comment );
                                        }
@@ -1765,7 +1816,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 
   /* ----- handle arguments of if/ifnot commands ------- */
 
-<GuardParam>"("                         {
+<GuardParam>{B}*"("                         {
                                           g_guardExpr=yytext;
                                           g_roundCount=1;
                                           BEGIN(GuardExpr);
@@ -1791,7 +1842,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                           unput(*yytext);
                                           BEGIN(GuardParam);
                                         }
-<GuardParam>[a-z_A-Z0-9.\-]+            { // parameter of if/ifnot guard
+<GuardParam>{B}*[a-z_A-Z0-9.\-]+            { // parameter of if/ifnot guard
                                           handleGuard(yytext);
                                        }
 <GuardParam>{DOCNL}                    { // end of argument
@@ -1842,8 +1893,14 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                          }
                                          else
                                          {
-                                           delete guards.pop();
-                                           BEGIN( GuardParamEnd );
+                                           GuardedSection *s = guards.pop();
+                                            bool parentVisible = s->parentVisible();
+                                            delete s;
+                                            if (parentVisible)
+                                            {
+                                             enabledSectionFound=TRUE;
+                                             BEGIN( GuardParamEnd );
+                                            }
                                          }
                                        }
 <SkipGuardedSection>{CMD}"else"/{NW}   {
@@ -2403,6 +2460,11 @@ static bool handleParBlock(const QCString &)
     warn(yyFileName,yyLineNr,
        "found \\parblock command while already in a parblock!");
   }
+  if (!g_spaceBeforeCmd.isEmpty()) 
+  {
+    addOutput(g_spaceBeforeCmd);
+    g_spaceBeforeCmd.resize(0);
+  }
   addOutput("@parblock ");
   g_insideParBlock = TRUE;
   return FALSE;
@@ -2865,9 +2927,9 @@ bool parseCommentBlock(/* in */     ParserInterface *parser,
 
   if (Doxygen::markdownSupport)
   {
-    current->brief      = processMarkdown(fileName,current,current->brief);
-    current->doc        = processMarkdown(fileName,current,current->doc);
-    current->inbodyDocs = processMarkdown(fileName,current,current->inbodyDocs);
+    current->brief      = processMarkdown(fileName,lineNr,current,current->brief);
+    current->doc        = processMarkdown(fileName,lineNr,current,current->doc);
+    current->inbodyDocs = processMarkdown(fileName,lineNr,current,current->inbodyDocs);
   }
 
   Debug::print(Debug::CommentScan,0,
@@ -3079,7 +3141,7 @@ static void groupAddDocs(Entry *e,const char *fileName)
 static void handleGuard(const QCString &expr)
 {
   CondParser prs;
-  bool sectionEnabled=prs.parse(yyFileName,yyLineNr,expr);
+  bool sectionEnabled=prs.parse(yyFileName,yyLineNr,expr.stripWhiteSpace());
   bool parentEnabled = TRUE;
   if (!guards.isEmpty()) parentEnabled = guards.top()->isEnabled();
   if (parentEnabled)
index c1eb0ab..2521a2e 100644 (file)
       <xsd:element name="anchor" type="docAnchorType" />
       <xsd:element name="formula" type="docFormulaType" />
       <xsd:element name="ref" type="docRefTextType" />
-      <xsd:element name="copy" type="docEmptyType" />
-      <xsd:element name="trademark" type="docEmptyType" />
-      <xsd:element name="registered" type="docEmptyType" />
-      <xsd:element name="lsquo" type="docEmptyType" />
-      <xsd:element name="rsquo" type="docEmptyType" />
-      <xsd:element name="ldquo" type="docEmptyType" />
-      <xsd:element name="rdquo" type="docEmptyType" />
-      <xsd:element name="ndash" type="docEmptyType" />
-      <xsd:element name="mdash" type="docEmptyType" />
-      <xsd:element name="umlaut" type="docCharType" />
-      <xsd:element name="acute" type="docCharType" />
-      <xsd:element name="grave" type="docCharType" />
-      <xsd:element name="circ" type="docCharType" />
-      <xsd:element name="slash" type="docCharType" />
-      <xsd:element name="tilde" type="docCharType" />
-      <xsd:element name="cedil" type="docCharType" />
-      <xsd:element name="ring" type="docCharType" />
-      <xsd:element name="szlig" type="docEmptyType" />
-      <xsd:element name="nonbreakablespace" type="docEmptyType" />
-      <xsd:element name="aelig" type="docEmptyType" />
-      <xsd:element name="AElig" type="docEmptyType" />
-      <xsd:element name="Gamma" type="docEmptyType" />
-      <xsd:element name="Delta" type="docEmptyType" />
-      <xsd:element name="Theta" type="docEmptyType" />
-      <xsd:element name="Lambda" type="docEmptyType" />
-      <xsd:element name="Xi" type="docEmptyType" />
-      <xsd:element name="Pi" type="docEmptyType" />
-      <xsd:element name="Sigma" type="docEmptyType" />
-      <xsd:element name="Upsilon" type="docEmptyType" />
-      <xsd:element name="Phi" type="docEmptyType" />
-      <xsd:element name="Psi" type="docEmptyType" />
-      <xsd:element name="Omega" type="docEmptyType" />
-      <xsd:element name="alpha" type="docEmptyType" />
-      <xsd:element name="beta" type="docEmptyType" />
-      <xsd:element name="gamma" type="docEmptyType" />
-      <xsd:element name="delta" type="docEmptyType" />
-      <xsd:element name="epsilon" type="docEmptyType" />
-      <xsd:element name="zeta" type="docEmptyType" />
-      <xsd:element name="eta" type="docEmptyType" />
-      <xsd:element name="theta" type="docEmptyType" />
-      <xsd:element name="iota" type="docEmptyType" />
-      <xsd:element name="kappa" type="docEmptyType" />
-      <xsd:element name="lambda" type="docEmptyType" />
-      <xsd:element name="mu" type="docEmptyType" />
-      <xsd:element name="nu" type="docEmptyType" />
-      <xsd:element name="xi" type="docEmptyType" />
-      <xsd:element name="pi" type="docEmptyType" />
-      <xsd:element name="rho" type="docEmptyType" />
-      <xsd:element name="sigma" type="docEmptyType" />
-      <xsd:element name="tau" type="docEmptyType" />
-      <xsd:element name="upsilon" type="docEmptyType" />
-      <xsd:element name="phi" type="docEmptyType" />
-      <xsd:element name="chi" type="docEmptyType" />
-      <xsd:element name="psi" type="docEmptyType" />
-      <xsd:element name="omega" type="docEmptyType" />
-      <xsd:element name="sigmaf" type="docEmptyType" />
-      <xsd:element name="sect" type="docEmptyType" />
-      <xsd:element name="deg" type="docEmptyType" />
-      <xsd:element name="prime" type="docEmptyType" />
-      <xsd:element name="Prime" type="docEmptyType" />
-      <xsd:element name="infin" type="docEmptyType" />
-      <xsd:element name="empty" type="docEmptyType" />
-      <xsd:element name="plusmn" type="docEmptyType" />
-      <xsd:element name="times" type="docEmptyType" />
-      <xsd:element name="minus" type="docEmptyType" />
-      <xsd:element name="sdot" type="docEmptyType" />
-      <xsd:element name="part" type="docEmptyType" />
-      <xsd:element name="nabla" type="docEmptyType" />
-      <xsd:element name="radic" type="docEmptyType" />
-      <xsd:element name="perp" type="docEmptyType" />
-      <xsd:element name="sum" type="docEmptyType" />
-      <xsd:element name="int" type="docEmptyType" />
-      <xsd:element name="prod" type="docEmptyType" />
-      <xsd:element name="sim" type="docEmptyType" />
-      <xsd:element name="asymp" type="docEmptyType" />
-      <xsd:element name="ne" type="docEmptyType" />
-      <xsd:element name="equiv" type="docEmptyType" />
-      <xsd:element name="prop" type="docEmptyType" />
-      <xsd:element name="le" type="docEmptyType" />
-      <xsd:element name="ge" type="docEmptyType" />
-      <xsd:element name="larr" type="docEmptyType" />
-      <xsd:element name="rarr" type="docEmptyType" />
-      <xsd:element name="isin" type="docEmptyType" />
-      <xsd:element name="notin" type="docEmptyType" />
-      <xsd:element name="lceil" type="docEmptyType" />
-      <xsd:element name="rceil" type="docEmptyType" />
-      <xsd:element name="lfloor" type="docEmptyType" />
-      <xsd:element name="rfloor" type="docEmptyType" />
+      <!-- Automatically insert here the HTML entities -->
     </xsd:choice>
   </xsd:group>
 
       <xsd:element name="title" type="docTitleType" minOccurs="0" />
       <xsd:sequence minOccurs="0" maxOccurs="unbounded">
         <xsd:element name="para" type="docParaType" minOccurs="1" maxOccurs="unbounded" />
-        <xsd:element name="simplesectsep" type="docEmptyType" minOccurs="0"/>
       </xsd:sequence>
     </xsd:sequence>
     <xsd:attribute name="kind" type="DoxSimpleSectKind" />
     </xsd:sequence>
   </xsd:complexType>
 
-  <xsd:complexType name="docCharType">
-    <xsd:attribute name="char" type="DoxCharRange"/> 
-  </xsd:complexType>
-
   <xsd:complexType name="docEmptyType"/>
 
   <!-- Simple types -->
index c99a232..67da1e3 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index a4dfee8..0310f36 100644 (file)
@@ -2,7 +2,7 @@
 #define CONDPARSER_H
 
 /**
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 3dcf8de..505e4d1 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -165,7 +165,7 @@ class ConfigEnum : public ConfigOption
 class ConfigString : public ConfigOption
 {
   public:
-    enum WidgetType { String, File, Dir };
+    enum WidgetType { String, File, Dir, Image };
     ConfigString(const char *name,const char *doc) 
       : ConfigOption(O_String)
     {
@@ -493,13 +493,14 @@ class Config
      *  \returns TRUE if successful, or FALSE if the string could not be
      *  parsed.
      */ 
-    bool parseString(const char *fn,const char *str);
+    //bool parseString(const char *fn,const char *str);
+    bool parseString(const char *fn,const char *str,bool upd = FALSE);
 
     /*! Parse a configuration file with name \a fn.
      *  \returns TRUE if successful, FALSE if the file could not be 
      *  opened or read.
      */ 
-    bool parse(const char *fn);
+    bool parse(const char *fn,bool upd = FALSE);
 
     /*! Called from the constructor, will add doxygen's default options
      *  to the configuration object 
index 05df386..133bc11 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -435,6 +435,7 @@ static QCString          includeName;
 static QStrList          includePathList;
 static QStack<ConfigFileState> includeStack;  
 static int               includeDepth;
+static bool              config_upd = FALSE;
 
 static QCString     tabSizeString;
 static QCString     maxInitLinesString;
@@ -672,15 +673,31 @@ static void readIncludeFile(const char *incName)
                                                 BEGIN(GetString);
                                                 break;
                                               case ConfigOption::O_Obsolete:
-                                                config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n"
-                                                           "To avoid this warning please remove this line from your configuration "
-                                                           "file or upgrade it using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data()); 
+                                                 if (config_upd)
+                                                 {
+                                                  config_err("Warning: Tag `%s' at line %d of file `%s' has become obsolete.\n"
+                                                             "         This tag has been removed.\n", cmd.data(),yyLineNr,yyFileName.data());
+                                                 }
+                                                 else
+                                                 {
+                                                  config_err("Warning: Tag `%s' at line %d of file `%s' has become obsolete.\n"
+                                                             "         To avoid this warning please remove this line from your configuration "
+                                                             "file or upgrade it using \"doxygen -u\"\n", cmd.data(),yyLineNr,yyFileName.data()); 
+                                                 }
                                                 BEGIN(SkipInvalid);
                                                 break;
                                               case ConfigOption::O_Disabled:
-                                                config_err("Warning: Tag `%s' at line %d of file %s belongs to an option that was not enabled at compile time.\n"
-                                                           "To avoid this warning please remove this line from your configuration "
-                                                           "file, upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", cmd.data(),yyLineNr,yyFileName.data()); 
+                                                 if (config_upd)
+                                                 {
+                                                  config_err("Warning: Tag `%s' at line %d of file `%s' belongs to an option that was not enabled at compile time.\n"
+                                                             "         This tag has been removed.\n", cmd.data(),yyLineNr,yyFileName.data());
+                                                 }
+                                                 else
+                                                 {
+                                                  config_err("Warning: Tag `%s' at line %d of file `%s' belongs to an option that was not enabled at compile time.\n"
+                                                             "         To avoid this warning please remove this line from your configuration "
+                                                           "file or upgrade it using \"doxygen -u\", or recompile doxygen with this feature enabled.\n", cmd.data(),yyLineNr,yyFileName.data()); 
+                                                 }
                                                 BEGIN(SkipInvalid);
                                                 break;
                                             }
@@ -847,11 +864,11 @@ void Config::writeTemplate(FTextStream &t,bool sl,bool upd)
   {
     t << convertToComment(m_header,"");
   }
-  ConfigOption *option = m_options->first();
-  while (option)
+  QListIterator<ConfigOption> it = iterator();
+  ConfigOption *option;
+  for (;(option=it.current());++it)
   {
     option->writeTemplate(t,sl,upd);
-    option = m_options->next();
   }
   /* print last lines of user comment that were at the end of the file */
   if (m_userComment)
@@ -863,11 +880,11 @@ void Config::writeTemplate(FTextStream &t,bool sl,bool upd)
 
 void Config::convertStrToVal()
 {
-  ConfigOption *option = m_options->first();
-  while (option)
+  QListIterator<ConfigOption> it = iterator();
+  ConfigOption *option;
+  for (;(option=it.current());++it)
   {
     option->convertStrToVal();
-    option = m_options->next();
   }
 }
 
@@ -1003,11 +1020,11 @@ void ConfigEnum::substEnvVars()
 
 void Config::substituteEnvironmentVars()
 {
-  ConfigOption *option = m_options->first();
-  while (option)
+  QListIterator<ConfigOption> it = iterator();
+  ConfigOption *option;
+  for (;(option=it.current());++it)
   {
     option->substEnvVars();
-    option = m_options->next();
   }
 }
 
@@ -1573,20 +1590,43 @@ void Config::check()
   }                               
 
   checkFileName("GENERATE_TAGFILE");
+
+#if 0 // TODO: this breaks test 25; SOURCEBROWSER = NO and SOURCE_TOOLTIPS = YES.
+      // So this and other regressions should be analysed and fixed before this can be enabled
+  // disable any boolean options that depend on disabled options
+  QListIterator<ConfigOption> it = iterator();
+  ConfigOption *option;
+  for (it.toFirst();(option=it.current());++it)
+  {
+    QCString depName = option->dependsOn(); // option has a dependency
+    if (!depName.isEmpty())
+    {
+      ConfigOption * dep = Config::instance()->get(depName);
+      if (dep->kind()==ConfigOption::O_Bool &&
+          Config_getBool(depName)==FALSE) // dependent option is disabled
+      {
+        if (option->kind()==ConfigOption::O_Bool)
+        {
+          printf("disabling option %s\n",option->name().data());
+          Config_getBool(option->name())=FALSE; // also disable this option
+        }
+      }
+    }
+  }
+#endif
 }
 
 void Config::init()
 {
-  ConfigOption *option = m_options->first();
-  while (option)
+  QListIterator<ConfigOption> it = iterator();
+  ConfigOption *option;
+  for (;(option=it.current());++it)
   {
     option->init();
-    option = m_options->next();
   }
 
   // sanity check if all depends relations are valid
-  option = m_options->first();
-  while (option)
+  for (it.toFirst();(option=it.current());++it)
   {
     QCString depName = option->dependsOn();
     if (!depName.isEmpty())
@@ -1599,7 +1639,6 @@ void Config::init()
         exit(1);
       }
     }
-    option = m_options->next();
   }
 }
 
@@ -1668,7 +1707,7 @@ static QCString configFileToString(const char *name)
   return "";
 }
 
-bool Config::parseString(const char *fn,const char *str)
+bool Config::parseString(const char *fn,const char *str,bool update)
 {
   config = Config::instance();
   inputString   = str;
@@ -1680,17 +1719,19 @@ bool Config::parseString(const char *fn,const char *str)
   includeDepth  = 0;
   configYYrestart( configYYin );
   BEGIN( Start );
+  config_upd = update;
   configYYlex();
+  config_upd = FALSE;
   inputString = 0;
   return TRUE;
 }
 
-bool Config::parse(const char *fn)
+bool Config::parse(const char *fn,bool update)
 {
   int retval;
   encoding = "UTF-8";
   printlex(yy_flex_debug, TRUE, __FILE__, fn);
-  retval =  parseString(fn,configFileToString(fn)); 
+  retval =  parseString(fn,configFileToString(fn), update); 
   printlex(yy_flex_debug, FALSE, __FILE__, fn);
   return retval;
 }
index eff8cff..c832112 100644 (file)
@@ -6,7 +6,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -247,7 +247,7 @@ Go to the <a href="commands.html">next</a> section or return to the
       </docs>
     </option>
 
-    <option type='string' id='PROJECT_LOGO' format='file' defval=''>
+    <option type='string' id='PROJECT_LOGO' format='image' defval=''>
       <docs>
 <![CDATA[
  With the \c PROJECT_LOGO tag one can specify an logo or icon that is 
@@ -279,6 +279,16 @@ Go to the <a href="commands.html">next</a> section or return to the
 ]]>
       </docs>
     </option>
+    <option type='bool' id='ALLOW_UNICODE_NAMES' defval='0'>
+      <docs>
+<![CDATA[
+ If the \c ALLOW_UNICODE_NAMES tag is set to \c YES,
+ doxygen will allow non-ASCII characters to appear in the names of generated files. 
+ If set to \c NO, non-ASCII characters will be escaped, for example _xE3_x81_x84 
+ will be used for Unicode U+3044.
+]]>
+      </docs>
+    </option>
     <option type='enum' id='OUTPUT_LANGUAGE' defval='English'>
       <docs>
 <![CDATA[
@@ -578,7 +588,10 @@ Go to the <a href="commands.html">next</a> section or return to the
  Doxygen has a built-in mapping, but you can override or extend it using this tag.
  The format is <code>ext=language</code>, where \c 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. 
+ Objective-C, Python, Fortran (fixed format Fortran: FortranFixed,
+ free formatted Fortran: FortranFree, unknown formatted Fortran: Fortran. In
+ the later case the parser tries to guess whether the code is fixed or free
+ formatted code, this is the default for Fortran type files), VHDL. 
 
  For instance to make doxygen treat
  <code>.inc</code> files as Fortran files (default is PHP), and <code>.f</code> files as C (default is Fortran),
@@ -1553,7 +1566,7 @@ to disable this feature.
       <docs>
 <![CDATA[
   If the \c CLANG_ASSISTED_PARSING tag is set to \c YES, then doxygen will use the 
-  <a href="http://clang.llvm.org/">clang parser</a> for more acurate parsing 
+  <a href="http://clang.llvm.org/">clang parser</a> for more accurate parsing 
   at the cost of reduced performance. This can be particularly helpful with 
   template rich C++ code for which doxygen's built-in parser lacks the 
   necessary type information.
@@ -2016,7 +2029,8 @@ The \c DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
 <![CDATA[
  The \c BINARY_TOC flag
  controls whether a binary table of contents is generated (\c YES) or a
- normal table of contents (\c NO) in the `.chm` file.
+ normal table of contents (\c NO) in the `.chm` file. Furthermore it enables
+ the `Previous` and `Next` buttons.
 ]]>
       </docs>
     </option>
@@ -2328,7 +2342,7 @@ MATHJAX_CODEFILE = disableRenderer.js
 When the \c SERVER_BASED_SEARCH tag is enabled the search engine will be 
 implemented using a web server instead of a web client using Javascript. 
 
-There are two flavours of web server based searching depending on the 
+There are two flavors of web server based searching depending on the 
 \ref cfg_external_search "EXTERNAL_SEARCH" setting. When disabled, 
 doxygen will generate a PHP script for searching and an index file used 
 by the script. When \ref cfg_external_search "EXTERNAL_SEARCH" is 
@@ -2679,6 +2693,15 @@ EXTRA_PACKAGES=times
 ]]>
       </docs>
     </option>
+    <option type='string' id='MAN_SUBDIR' format='string' defval='' depends='GENERATE_MAN'>
+      <docs>
+<![CDATA[
+ The \c MAN_SUBDIR tag determines the name of the directory created within \c MAN_OUTPUT
+ in which the man pages are placed. If defaults to man followed by \c MAN_EXTENSION
+ with the initial . removed.
+]]>
+      </docs>
+    </option>
     <option type='bool' id='MAN_LINKS' defval='0' depends='GENERATE_MAN'>
       <docs>
 <![CDATA[
@@ -2709,24 +2732,6 @@ EXTRA_PACKAGES=times
 ]]>
       </docs>
     </option>
-    <option type='string' id='XML_SCHEMA' format='string' defval='' depends='GENERATE_XML'>
-      <docs>
-<![CDATA[
- The \c XML_SCHEMA tag can be used to specify a XML schema,
- which can be used by a validating XML parser to check the
- syntax of the XML files.
-]]>
-      </docs>
-    </option>
-    <option type='string' id='XML_DTD' format='string' defval='' depends='GENERATE_XML'>
-      <docs>
-<![CDATA[
- The \c XML_DTD tag can be used to specify a XML DTD,
- which can be used by a validating XML parser to check the
- syntax of the XML files.
-]]>
-      </docs>
-    </option>
     <option type='bool' id='XML_PROGRAMLISTING' defval='1' depends='GENERATE_XML'>
       <docs>
 <![CDATA[
@@ -2921,7 +2926,7 @@ put in front of it.
       <docs>
 <![CDATA[
  If the \c SKIP_FUNCTION_MACROS tag is set to \c YES then 
- doxygen's preprocessor will remove all refrences to function-like macros that are alone 
+ doxygen's preprocessor will remove all references to function-like macros that are alone 
  on a line, have an all uppercase name, and do not end with a semicolon. 
  Such function macros are typically 
  used for boiler-plate code, and will confuse the parser if not removed. 
@@ -2949,7 +2954,7 @@ where `loc1` and `loc2` can be relative or absolute paths or URLs.
  See the section \ref external for more information about the use of tag files.
 
  \note
-  Each tag file must have an unique name 
+  Each tag file must have a unique name 
   (where the name does \e NOT include the path).
   If a tag file is not located in the directory in which doxygen 
   is run, you must also specify the path to the tagfile here.
@@ -3362,5 +3367,7 @@ remove the intermediate dot files that are used to generate the various graphs.
     <option type='obsolete' id='SHOW_DIRECTORIES'/>
     <option type='obsolete' id='HTML_ALIGN_MEMBERS'/>
     <option type='obsolete' id='SYMBOL_CACHE_SIZE'/>
+    <option type='obsolete' id='XML_SCHEMA'/>
+    <option type='obsolete' id='XML_DTD'/>
   </group>
 </doxygenconfig>
index 4aed8bf..8ec0caa 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 # python script to generate configoptions.cpp and config.doc from config.xml
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby
@@ -201,6 +201,19 @@ def prepCDocs(node):
                                else:
                                        if abspath == '1':
                                                doc += "<br/>The file has to be specified with full path."
+                       elif file =='image':
+                               abspath = node.getAttribute('abspath')
+                               if defval != '':
+                                       if abspath != '1':
+                                               doc += "<br/>The default image is: <code>%s</code>." % (
+                                                       defval)
+                                       else:
+                                               doc += "<br/>%s: %s%s%s." % (
+                                                       "The default image (with absolute path) is",
+                                                       "<code>",defval,"</code>")
+                               else:
+                                       if abspath == '1':
+                                               doc += "<br/>The image has to be specified with full path."
                        else: # format == 'string':
                                if defval != '':
                                        doc += "<br/>The default value is: <code>%s</code>." % (
@@ -262,6 +275,8 @@ def parseOption(node):
                        print "  cs->setDefaultValue(\"%s\");" % (defval)
                if format == 'file':
                        print "  cs->setWidgetType(ConfigString::File);"
+               elif format == 'image':
+                       print "  cs->setWidgetType(ConfigString::Image);"
                elif format == 'dir':
                        print "  cs->setWidgetType(ConfigString::Dir);"
                if depends != '':
@@ -453,6 +468,21 @@ def parseOptionDoc(node, first):
                                        if abspath == '1':
                                                print ""
                                                print "The file has to be specified with full path."
+                       elif file =='image':
+                               abspath = node.getAttribute('abspath')
+                               if defval != '':
+                                       print ""
+                                       if abspath != '1':
+                                               print "The default image is: <code>%s</code>." % (
+                                                       defval)
+                                       else:
+                                               print "%s: %s%s%s." % (
+                                                       "The default image (with absolute path) is",
+                                                       "<code>",defval,"</code>")
+                               else:
+                                       if abspath == '1':
+                                               print ""
+                                               print "The image has to be specified with full path."
                        else: # format == 'string':
                                if defval != '':
                                        print ""
index 8b4fc22..be8ecf6 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 1828b0b..27ca039 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index b333c72..bb4f842 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 421e26e..1475c1c 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index e573dde..2d46c86 100644 (file)
@@ -27,6 +27,8 @@
 // TODO: pass the current file to Dot*::writeGraph, so the user can put dot graphs in other
 //       files as well
 
+#define ADD_PROPERTY(name) addProperty(#name,this,&Private::name);
+
 struct ContextGlobals
 {
   enum OutputFormat
@@ -65,12 +67,37 @@ template<class T> class ScopedPtr
     void reset(T *p=0) { if (p!=m_ptr) { delete m_ptr; m_ptr = p; } }
 };
 
+/** @brief Reference counting smart pointer */
+template<class T> class SharedPtr
+{
+  private:
+    T *m_ptr;
+    SharedPtr(const SharedPtr &);
+    SharedPtr &operator=(const SharedPtr &p);
+    void operator==(const SharedPtr &) const;
+    void operator!=(const SharedPtr &) const;
+
+  public:
+    typedef T Type;
+    explicit SharedPtr(T *p=0) : m_ptr(p) { if (m_ptr) m_ptr->addRef(); }
+    ~SharedPtr() { if (m_ptr) m_ptr->release(); };
+    T &operator*() const { return *m_ptr; }
+    T *operator->() const { return m_ptr; }
+    T *get() const { return m_ptr; }
+    operator bool() const { return m_ptr!=0; }
+    void reset(T *p=0)
+    {
+      if (p) p->addRef();
+      if (m_ptr) m_ptr->release();
+      m_ptr = p;
+    }
+};
+
 /** @brief Template List iterator support */
-template<class T>
 class GenericConstIterator : public TemplateListIntf::ConstIterator
 {
   public:
-    GenericConstIterator(const QList<T> &list)
+    GenericConstIterator(const QList<TemplateVariant> &list)
       : m_it(list) { }
     virtual ~GenericConstIterator() {}
     void toFirst()
@@ -93,7 +120,7 @@ class GenericConstIterator : public TemplateListIntf::ConstIterator
     {
       if (m_it.current())
       {
-        v = m_it.current();
+        v = *m_it.current();
         return TRUE;
       }
       else
@@ -103,17 +130,16 @@ class GenericConstIterator : public TemplateListIntf::ConstIterator
       }
     }
   private:
-    QListIterator<T> m_it;
+    QListIterator<TemplateVariant> m_it;
 };
 
 //------------------------------------------------------------------------
 
 /** @brief standard template list implementation */
-template<class T>
 class GenericNodeListContext : public TemplateListIntf
 {
   public:
-    GenericNodeListContext()
+    GenericNodeListContext() : m_refCount(0)
     {
       m_children.setAutoDelete(TRUE);
     }
@@ -128,31 +154,45 @@ class GenericNodeListContext : public TemplateListIntf
       TemplateVariant result;
       if (index>=0 && index<count())
       {
-        result = m_children.at(index);
+        result = *m_children.at(index);
       }
       return result;
     }
     TemplateListIntf::ConstIterator *createIterator() const
     {
-      return new GenericConstIterator<T>(m_children);
+      return new GenericConstIterator(m_children);
     }
 
-    void append(T *ctn)
+    void append(const TemplateVariant &ctn)
     {
-      m_children.append(ctn);
+      m_children.append(new TemplateVariant(ctn));
     }
     bool isEmpty() const
     {
       return m_children.isEmpty();
     }
+    int addRef()
+    {
+      return ++m_refCount;
+    }
+    int release()
+    {
+      int count = --m_refCount;
+      if (count<=0)
+      {
+        delete this;
+      }
+      return count;
+    }
   private:
-    mutable QList<T> m_children;
+    mutable QList<TemplateVariant> m_children;
+    int m_refCount;
 };
 
 //------------------------------------------------------------------------
 
 /** @brief Helper class to map a property name to a handler member function */
-class PropertyMapper
+class PropertyMapper 
 {
   private:
     struct PropertyFuncIntf
@@ -224,29 +264,34 @@ class PropertyMapper
 class ConfigContext::Private
 {
   public:
-    Private() { cachedLists.setAutoDelete(TRUE); }
+    Private() { m_cachedLists.setAutoDelete(TRUE); }
+   ~Private() { }
     TemplateVariant fetchList(const QCString &name,const QStrList *list)
     {
-      TemplateList *tlist = cachedLists.find(name);
-      if (tlist==0)
+      TemplateVariant *v = m_cachedLists.find(name);
+      if (v==0)
       {
-        tlist = new TemplateList;
-        cachedLists.insert(name,tlist);
+        TemplateList *tlist = TemplateList::alloc();
+        m_cachedLists.insert(name,new TemplateVariant(tlist));
         QStrListIterator li(*list);
         char *s;
         for (li.toFirst();(s=li.current());++li)
         {
           tlist->append(s);
         }
+        return tlist;
+      }
+      else
+      {
+        return *v;
       }
-      return tlist;
     }
   private:
-    QDict<TemplateList> cachedLists;
+    QDict<TemplateVariant> m_cachedLists;
 };
 //%% }
 
-ConfigContext::ConfigContext()
+ConfigContext::ConfigContext() : RefCountedContext("ConfigContext")
 {
   p = new Private;
 }
@@ -310,7 +355,7 @@ class DoxygenContext::Private : public PropertyMapper
 };
 //%% }
 
-DoxygenContext::DoxygenContext()
+DoxygenContext::DoxygenContext() : RefCountedContext("DoxygenContext")
 {
   p = new Private;
 }
@@ -453,6 +498,18 @@ class TranslateContext::Private : public PropertyMapper
       }
       return TemplateVariant();
     }
+    TemplateVariant handleIncludeDependencyGraph(const QValueList<TemplateVariant> &args) const
+    {
+      if (args.count()==1)
+      {
+        return theTranslator->trInclDepGraph(args[0].toString());
+      }
+      else
+      {
+        err("tr.includeDependencyGraph should take one string argument, got %d\n",args.count());
+      }
+      return TemplateVariant();
+    }
 
 
 
@@ -483,11 +540,17 @@ class TranslateContext::Private : public PropertyMapper
     TemplateVariant classes() const
     {
       return theTranslator->trClasses();
+      // TODO: VHDL: trVhdlType(VhdlDocGen::ENTITY,FALSE)
+      // TODO: Fortran: trDataTypes()
     }
     TemplateVariant classList() const
     {
       return theTranslator->trCompoundList();
     }
+    TemplateVariant classListDescription() const
+    {
+      return theTranslator->trCompoundListDescription();
+    }
     TemplateVariant classIndex() const
     {
       return theTranslator->trCompoundIndex();
@@ -669,6 +732,47 @@ class TranslateContext::Private : public PropertyMapper
     {
       return theTranslator->trAdditionalInheritedMembers();
     }
+    TemplateVariant includeDependencyGraph() const
+    {
+      return TemplateVariant::Delegate::fromMethod<Private,&Private::handleIncludeDependencyGraph>(this);
+    }
+    TemplateVariant includedByDependencyGraph() const
+    {
+      return theTranslator->trInclByDepGraph();
+    }
+    TemplateVariant gotoSourceCode() const
+    {
+      return theTranslator->trGotoSourceCode();
+    }
+    TemplateVariant gotoDocumentation() const
+    {
+      return theTranslator->trGotoDocumentation();
+    }
+    TemplateVariant constantgroups() const
+    {
+      return theTranslator->trConstantGroups();
+    }
+    TemplateVariant classDocumentation() const
+    {
+      return theTranslator->trClassDocumentation();
+    }
+    TemplateVariant compoundMembers() const
+    {
+      return theTranslator->trCompoundMembers();
+    }
+    TemplateVariant detailLevel() const
+    {
+      return theTranslator->trDetailLevel();
+    }
+    TemplateVariant fileListDescription() const
+    {
+      bool extractAll = Config_getBool("EXTRACT_ALL");
+      return theTranslator->trFileListDescription(extractAll);
+    }
+    TemplateVariant directories() const
+    {
+      return theTranslator->trDirectories();
+    }
     Private()
     {
       //%% string generatedBy
@@ -683,6 +787,8 @@ class TranslateContext::Private : public PropertyMapper
       addProperty("classes",           this,&Private::classes);
       //%% string classList
       addProperty("classList",         this,&Private::classList);
+      //%% string classListDescription
+      addProperty("classListDescription", this,&Private::classListDescription);
       //%% string classIndex
       addProperty("classIndex",        this,&Private::classIndex);
       //%% string classHierarchy
@@ -761,6 +867,26 @@ class TranslateContext::Private : public PropertyMapper
       addProperty("inheritedFrom",      this,&Private::inheritedFrom);
       //%% string addtionalInheritedMembers
       addProperty("additionalInheritedMembers",this,&Private::additionalInheritedMembers);
+      //%% string includeDependencyGraph:container_name
+      addProperty("includeDependencyGraph",this,&Private::includeDependencyGraph);
+      //%% string includedByDependencyGraph
+      addProperty("includedByDependencyGraph",this,&Private::includedByDependencyGraph);
+      //%% string gotoSourceCode
+      addProperty("gotoSourceCode",     this,&Private::gotoSourceCode);
+      //%% string gotoDocumentation
+      addProperty("gotoDocumentation",  this,&Private::gotoDocumentation);
+      //%% string constantgroups
+      addProperty("constantgroups",     this,&Private::constantgroups);
+      //%% string classDocumentation
+      addProperty("classDocumentation", this,&Private::classDocumentation);
+      //%% string compoundMembers
+      addProperty("compoundMembers",    this,&Private::compoundMembers);
+      //%% string detailLevel
+      addProperty("detailLevel",        this,&Private::detailLevel);
+      //%% string fileListDescription
+      addProperty("fileListDescription",this,&Private::fileListDescription);
+      //%% string directories
+      addProperty("directories",        this,&Private::directories);
 
       m_javaOpt    = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
       m_fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
@@ -773,7 +899,7 @@ class TranslateContext::Private : public PropertyMapper
 };
 //%% }
 
-TranslateContext::TranslateContext()
+TranslateContext::TranslateContext() : RefCountedContext("TranslateContext")
 {
   p = new Private;
 }
@@ -823,6 +949,31 @@ static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const Q
   return TemplateVariant(s.data(),TRUE);
 }
 
+static TemplateVariant parseCode(FileDef *fd,const QCString &relPath)
+{
+  static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES");
+  ParserInterface *pIntf = Doxygen::parserManager->getParser(fd->getDefFileExtension());
+  pIntf->resetCodeParserState();
+  QGString s;
+  FTextStream t(&s);
+  HtmlCodeGenerator codeGen(t,relPath);
+  pIntf->parseCode(codeGen,0,
+        fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources
+        fd->getLanguage(),  // lang
+        FALSE,              // isExampleBlock
+        0,                  // exampleName
+        fd,                 // fileDef
+        -1,                 // startLine
+        -1,                 // endLine
+        FALSE,              // inlineFragment
+        0,                  // memberDef
+        TRUE,               // showLineNumbers
+        0,                  // searchCtx
+        TRUE                // collectXRefs, TODO: should become FALSE
+        );
+  return TemplateVariant(s.data(),TRUE);
+}
+
 //------------------------------------------------------------------------
 
 //%% struct Symbol: shared info for all symbols
@@ -864,29 +1015,33 @@ class DefinitionContext : public PropertyMapper
       //%% list[Definition] navigationPath: Breadcrumb navigation path to this item
       addProperty("navigationPath",this,&DefinitionContext::navigationPath);
 
+      m_cache.sourceDef.reset(TemplateList::alloc());
+      m_cache.lineLink.reset(TemplateStruct::alloc());
+      m_cache.fileLink.reset(TemplateStruct::alloc());
+
       if (m_def && !m_def->getSourceFileBase().isEmpty())
       {
-        m_sourceDef.append(&m_lineLink);
-        m_sourceDef.append(&m_fileLink);
-        m_lineLink.set("text",m_def->getStartBodyLine());
-        m_lineLink.set("isLinkable",TRUE);
-        m_lineLink.set("fileName",m_def->getSourceFileBase());
-        m_lineLink.set("anchor",m_def->getSourceAnchor());
+        m_cache.lineLink->set("text",m_def->getStartBodyLine());
+        m_cache.lineLink->set("isLinkable",TRUE);
+        m_cache.lineLink->set("fileName",m_def->getSourceFileBase());
+        m_cache.lineLink->set("anchor",m_def->getSourceAnchor());
         if (m_def->definitionType()==Definition::TypeFile)
         {
-          m_fileLink.set("text",m_def->name());
+          m_cache.fileLink->set("text",m_def->name());
         }
         else if (m_def->getBodyDef())
         {
-          m_fileLink.set("text",m_def->getBodyDef()->name());
+          m_cache.fileLink->set("text",m_def->getBodyDef()->name());
         }
         else
         {
-          m_fileLink.set("text",name());
+          m_cache.fileLink->set("text",name());
         }
-        m_fileLink.set("isLinkable",TRUE);
-        m_fileLink.set("fileName",m_def->getSourceFileBase());
-        m_fileLink.set("anchor",QCString());
+        m_cache.fileLink->set("isLinkable",TRUE);
+        m_cache.fileLink->set("fileName",m_def->getSourceFileBase());
+        m_cache.fileLink->set("anchor",QCString());
+        m_cache.sourceDef->append(m_cache.lineLink.get());
+        m_cache.sourceDef->append(m_cache.fileLink.get());
       }
     }
     TemplateVariant fileName() const
@@ -997,9 +1152,9 @@ class DefinitionContext : public PropertyMapper
     }
     TemplateVariant sourceDef() const
     {
-      if (m_sourceDef.count()==2)
+      if (m_cache.sourceDef->count()==2)
       {
-        return &m_sourceDef;
+        return m_cache.sourceDef.get();
       }
       else
       {
@@ -1018,16 +1173,21 @@ class DefinitionContext : public PropertyMapper
       {
         fillPath(((const FileDef*)def)->getDirDef(),list);
       }
-      NavPathElemContext *elem = new NavPathElemContext(def);
-      list->append(elem);
-      m_cache.navPathElems.append(elem);
+      list->append(NavPathElemContext::alloc(def));
     }
     TemplateVariant navigationPath() const
     {
       if (!m_cache.navPath)
       {
-        TemplateList *list = new TemplateList;
-        fillPath(m_def,list);
+        TemplateList *list = TemplateList::alloc();
+        if (m_def->getOuterScope() && m_def->getOuterScope()!=Doxygen::globalScope)
+        {
+          fillPath(m_def->getOuterScope(),list);
+        }
+        else if (m_def->definitionType()==Definition::TypeFile && ((const FileDef *)m_def)->getDirDef())
+        {
+          fillPath(((const FileDef *)m_def)->getDirDef(),list);
+        }
         m_cache.navPath.reset(list);
       }
       return m_cache.navPath.get();
@@ -1037,17 +1197,16 @@ class DefinitionContext : public PropertyMapper
     Definition      *m_def;
     struct Cachable
     {
-      Cachable() { navPathElems.setAutoDelete(TRUE); }
+      Cachable() { }
       ScopedPtr<TemplateVariant> details;
       ScopedPtr<TemplateVariant> brief;
       ScopedPtr<TemplateVariant> inbodyDocs;
-      ScopedPtr<TemplateList>    navPath;
-      QList<NavPathElemContext>  navPathElems;
+      SharedPtr<TemplateList>    navPath;
+      SharedPtr<TemplateList>    sourceDef;
+      SharedPtr<TemplateStruct>  fileLink;
+      SharedPtr<TemplateStruct>  lineLink;
     };
     mutable Cachable m_cache;
-    TemplateList m_sourceDef;
-    TemplateStruct m_fileLink;
-    TemplateStruct m_lineLink;
 };
 //%% }
 
@@ -1058,9 +1217,8 @@ class DefinitionContext : public PropertyMapper
 class IncludeInfoContext::Private : public PropertyMapper
 {
   public:
-    Private(IncludeInfo *info,SrcLangExt lang) :
+    Private(const IncludeInfo *info,SrcLangExt lang) :
       m_info(info),
-      m_fileContext(info && info->fileDef ? info->fileDef : 0),
       m_lang(lang)
     {
       if (m_info)
@@ -1082,9 +1240,13 @@ class IncludeInfoContext::Private : public PropertyMapper
     }
     TemplateVariant file() const
     {
-      if (m_info->fileDef)
+      if (!m_fileContext && m_info && m_info->fileDef)
+      {
+        m_fileContext.reset(FileContext::alloc(m_info->fileDef));
+      }
+      if (m_fileContext)
       {
-        return &m_fileContext;
+        return m_fileContext.get();
       }
       else
       {
@@ -1096,12 +1258,12 @@ class IncludeInfoContext::Private : public PropertyMapper
       return m_info->includeName;
     }
   private:
-    IncludeInfo *m_info;
-    FileContext m_fileContext;
+    const IncludeInfo *m_info;
+    mutable SharedPtr<FileContext> m_fileContext;
     SrcLangExt m_lang;
 };
 
-IncludeInfoContext::IncludeInfoContext(IncludeInfo *info,SrcLangExt lang)
+IncludeInfoContext::IncludeInfoContext(const IncludeInfo *info,SrcLangExt lang) : RefCountedContext("IncludeContext")
 {
   p = new Private(info,lang);
 }
@@ -1119,14 +1281,59 @@ TemplateVariant IncludeInfoContext::get(const char *n) const
 
 //------------------------------------------------------------------------
 
+//%% list IncludeInfoList[Class] : list of nested classes
+class IncludeInfoListContext::Private : public GenericNodeListContext
+{
+  public:
+    Private(const QList<IncludeInfo> &list,SrcLangExt lang)
+    {
+      QListIterator<IncludeInfo> li(list);
+      IncludeInfo *ii;
+      for (li.toFirst();(ii=li.current());++li)
+      {
+        if (!ii->indirect)
+        {
+          append(IncludeInfoContext::alloc(ii,lang));
+        }
+      }
+    }
+};
+
+IncludeInfoListContext::IncludeInfoListContext(const QList<IncludeInfo> &list,SrcLangExt lang) : RefCountedContext("IncludeListContext")
+{
+  p = new Private(list,lang);
+}
+
+IncludeInfoListContext::~IncludeInfoListContext()
+{
+  delete p;
+}
+
+// TemplateListIntf
+int IncludeInfoListContext::count() const
+{
+  return p->count();
+}
+
+TemplateVariant IncludeInfoListContext::at(int index) const
+{
+  return p->at(index);
+}
+
+TemplateListIntf::ConstIterator *IncludeInfoListContext::createIterator() const
+{
+  return p->createIterator();
+}
+
+//------------------------------------------------------------------------
+
 //%% struct Class(Symbol): class information
 //%% {
 class ClassContext::Private : public DefinitionContext<ClassContext::Private>
 {
   public:
-    Private(ClassDef *cd) : DefinitionContext<ClassContext::Private>(cd) ,
-       m_classDef(cd), m_usedFiles(cd),
-       m_includeInfo(cd ? cd->includeInfo() : 0, cd ? cd->getLanguage() : SrcLangExt_Unknown)
+    Private(ClassDef *cd) : DefinitionContext<ClassContext::Private>(cd),
+       m_classDef(cd)
     {
       addProperty("title",                     this,&Private::title);
       addProperty("highlight",                 this,&Private::highlight);
@@ -1139,7 +1346,6 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
       addProperty("hasCollaborationDiagram",   this,&Private::hasCollaborationDiagram);
       addProperty("collaborationDiagram",      this,&Private::collaborationDiagram);
       addProperty("includeInfo",               this,&Private::includeInfo);
-      addProperty("includeStatement",          this,&Private::includeStatement);
       addProperty("inherits",                  this,&Private::inherits);
       addProperty("inheritedBy",               this,&Private::inheritedBy);
       addProperty("unoIDLServices",            this,&Private::unoIDLServices);
@@ -1182,7 +1388,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
       addProperty("detailedVariables",         this,&Private::detailedVariables);
       addProperty("detailedProperties",        this,&Private::detailedProperties);
       addProperty("detailedEvents",            this,&Private::detailedEvents);
-      addProperty("nestedClasses",             this,&Private::nestedClasses);
+      addProperty("classes",                   this,&Private::classes);
       addProperty("compoundType",              this,&Private::compoundType);
       addProperty("templateDecls",             this,&Private::templateDecls);
       addProperty("typeConstraints",           this,&Private::typeConstraints);
@@ -1215,7 +1421,11 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
     }
     TemplateVariant usedFiles() const
     {
-      return TemplateVariant(&m_usedFiles);
+      if (!m_cache.usedFiles)
+      {
+        m_cache.usedFiles.reset(UsedFilesContext::alloc(m_classDef));
+      }
+      return m_cache.usedFiles.get();
     }
     DotClassGraph *getClassGraph() const
     {
@@ -1317,24 +1527,24 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
 
     TemplateVariant includeInfo() const
     {
-      if (m_classDef->includeInfo())
+      if (!m_cache.includeInfo && m_classDef->includeInfo())
+      {
+        m_cache.includeInfo.reset(IncludeInfoContext::alloc(m_classDef->includeInfo(),m_classDef->getLanguage()));
+      }
+      if (m_cache.includeInfo)
       {
-        return TemplateVariant(&m_includeInfo);
+        return m_cache.includeInfo.get();
       }
       else
       {
         return TemplateVariant(FALSE);
       }
     }
-    TemplateVariant includeStatement() const
-    {
-      return m_classDef->includeStatement();
-    }
     TemplateVariant inherits() const
     {
       if (!m_cache.inheritsList)
       {
-        m_cache.inheritsList.reset(new InheritanceListContext(m_classDef->baseClasses(),TRUE));
+        m_cache.inheritsList.reset(InheritanceListContext::alloc(m_classDef->baseClasses(),TRUE));
       }
       return m_cache.inheritsList.get();
     }
@@ -1342,11 +1552,11 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
     {
       if (!m_cache.inheritedByList)
       {
-        m_cache.inheritedByList.reset(new InheritanceListContext(m_classDef->subClasses(),FALSE));
+        m_cache.inheritedByList.reset(InheritanceListContext::alloc(m_classDef->subClasses(),FALSE));
       }
       return m_cache.inheritedByList.get();
     }
-    TemplateVariant getMemberList(ScopedPtr<MemberListInfoContext> &list,
+    TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
                                   MemberListType type,const char *title,bool detailed=FALSE) const
     {
       if (!list)
@@ -1354,7 +1564,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
         MemberList *ml = m_classDef->getMemberList(type);
         if (ml)
         {
-          list.reset(new MemberListInfoContext(m_classDef,relPathAsString(),ml,title,detailed));
+          list.reset(MemberListInfoContext::alloc(m_classDef,relPathAsString(),ml,title,detailed));
         }
       }
       if (list)
@@ -1530,34 +1740,26 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
     {
       return getMemberList(m_cache.detailedEvents,MemberListType_eventMembers,theTranslator->trEventDocumentation(),TRUE);
     }
-    TemplateVariant nestedClasses() const
+    TemplateVariant classes() const
     {
-      static bool extractPrivate      = Config_getBool("EXTRACT_PRIVATE");
-      static bool hideUndocClasses    = Config_getBool("HIDE_UNDOC_CLASSES");
-      static bool extractLocalClasses = Config_getBool("EXTRACT_LOCAL_CLASSES");
-      if (!m_cache.nestedClasses)
+      if (!m_cache.classes)
       {
-        NestedClassListContext *classList = new NestedClassListContext;
+        NestedClassListContext *classList = NestedClassListContext::alloc();
         if (m_classDef->getClassSDict())
         {
           ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
           ClassDef *cd;
           for (sdi.toFirst();(cd=sdi.current());++sdi)
           {
-            bool linkable = cd->isLinkable();
-            if (cd->name().find('@')==-1 && !cd->isExtension() &&
-                (cd->protection()!=::Private || extractPrivate) &&
-                (linkable ||
-                 (!hideUndocClasses && (!cd->isLocal() || extractLocalClasses)))
-               )
+            if (cd->visibleInParentsDeclList())
             {
               classList->append(cd);
             }
           }
         }
-        m_cache.nestedClasses.reset(classList);
+        m_cache.classes.reset(classList);
       }
-      return m_cache.nestedClasses.get();
+      return m_cache.classes.get();
     }
     TemplateVariant compoundType() const
     {
@@ -1575,10 +1777,9 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
         ClassDef *cd=(ClassDef *)d;
         if (cd->templateArguments())
         {
-          ArgumentListContext *al = new ArgumentListContext(cd->templateArguments(),cd,relPathAsString());
+          ArgumentListContext *al = ArgumentListContext::alloc(cd->templateArguments(),cd,relPathAsString());
           // since a TemplateVariant does take ownership of the object, we add it
           // a separate list just to be able to delete it and avoid a memory leak
-          m_cache.templateArgList.append(al);
           tl->append(al);
         }
       }
@@ -1591,8 +1792,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
         Example *ex;
         for (it.toFirst();(ex=it.current());++it)
         {
-          TemplateStruct *s = new TemplateStruct;
-          m_cache.exampleList.append(s);
+          TemplateStruct *s = TemplateStruct::alloc();
           s->set("text",ex->name);
           s->set("isLinkable",TRUE);
           s->set("anchor",ex->anchor);
@@ -1605,7 +1805,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
     {
       if (!m_cache.templateDecls)
       {
-        TemplateList *tl = new TemplateList;
+        TemplateList *tl = TemplateList::alloc();
         addTemplateDecls(m_classDef,tl);
         m_cache.templateDecls.reset(tl);
       }
@@ -1615,11 +1815,11 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
     {
       if (!m_cache.typeConstraints && m_classDef->typeConstraints())
       {
-        m_cache.typeConstraints.reset(new ArgumentListContext(m_classDef->typeConstraints(),m_classDef,relPathAsString()));
+        m_cache.typeConstraints.reset(ArgumentListContext::alloc(m_classDef->typeConstraints(),m_classDef,relPathAsString()));
       }
       else
       {
-        m_cache.typeConstraints.reset(new ArgumentListContext);
+        m_cache.typeConstraints.reset(ArgumentListContext::alloc());
       }
       return m_cache.typeConstraints.get();
     }
@@ -1627,7 +1827,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
     {
       if (!m_cache.examples)
       {
-        TemplateList *exampleList = new TemplateList;
+        TemplateList *exampleList = TemplateList::alloc();
         addExamples(exampleList);
         m_cache.examples.reset(exampleList);
       }
@@ -1682,20 +1882,23 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
         addMembers(m_classDef,MemberListType_priAttribs);
         addMembers(m_classDef,MemberListType_priStaticAttribs);
         addMembers(m_classDef,MemberListType_related);
-        m_cache.members.reset(new MemberListContext(&m_cache.allMembers));
+        m_cache.members.reset(MemberListContext::alloc(&m_cache.allMembers));
       }
       return m_cache.members.get();
     }
     TemplateVariant allMembersList() const
     {
-      if (!m_cache.allMembersList && m_classDef->memberNameInfoSDict())
-      {
-        AllMembersListContext *ml = new AllMembersListContext(m_classDef->memberNameInfoSDict());
-        m_cache.allMembersList.reset(ml);
-      }
-      else
+      if (!m_cache.allMembersList)
       {
-        m_cache.allMembersList.reset(new AllMembersListContext);
+        if (m_classDef->memberNameInfoSDict())
+        {
+          AllMembersListContext *ml = AllMembersListContext::alloc(m_classDef->memberNameInfoSDict());
+          m_cache.allMembersList.reset(ml);
+        }
+        else
+        {
+          m_cache.allMembersList.reset(AllMembersListContext::alloc());
+        }
       }
       return m_cache.allMembersList.get();
     }
@@ -1709,11 +1912,11 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
       {
         if (m_classDef->getMemberGroupSDict())
         {
-          m_cache.memberGroups.reset(new MemberGroupListContext(m_classDef,relPathAsString(),m_classDef->getMemberGroupSDict(),m_classDef->subGrouping()));
+          m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_classDef,relPathAsString(),m_classDef->getMemberGroupSDict(),m_classDef->subGrouping()));
         }
         else
         {
-          m_cache.memberGroups.reset(new MemberGroupListContext);
+          m_cache.memberGroups.reset(MemberGroupListContext::alloc());
         }
       }
       return m_cache.memberGroups.get();
@@ -1722,7 +1925,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
     {
       if (!m_cache.additionalInheritedMembers)
       {
-        InheritedMemberInfoListContext *ctx = new InheritedMemberInfoListContext;
+        InheritedMemberInfoListContext *ctx = InheritedMemberInfoListContext::alloc();
         ctx->addMemberList(m_classDef,MemberListType_pubTypes,theTranslator->trPublicTypes());
         ctx->addMemberList(m_classDef,MemberListType_services,theTranslator->trServices());
         ctx->addMemberList(m_classDef,MemberListType_interfaces,theTranslator->trInterfaces());
@@ -1763,78 +1966,72 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
 
   private:
     ClassDef *m_classDef;
-    UsedFilesContext m_usedFiles;
-    IncludeInfoContext m_includeInfo;
     struct Cachable
     {
-      Cachable() : inheritanceNodes(-1)
-      {
-        templateArgList.setAutoDelete(TRUE);
-        exampleList.setAutoDelete(TRUE);
-        allMembers.setAutoDelete(TRUE);
-      }
-      ScopedPtr<InheritanceListContext> inheritsList;
-      ScopedPtr<InheritanceListContext> inheritedByList;
+      Cachable() : inheritanceNodes(-1) { }
+      SharedPtr<IncludeInfoContext>     includeInfo;
+      SharedPtr<InheritanceListContext> inheritsList;
+      SharedPtr<InheritanceListContext> inheritedByList;
       ScopedPtr<DotClassGraph>          classGraph;
       ScopedPtr<DotClassGraph>          collaborationGraph;
-      ScopedPtr<NestedClassListContext> nestedClasses;
-      ScopedPtr<MemberListInfoContext> publicTypes;
-      ScopedPtr<MemberListInfoContext> publicMethods;
-      ScopedPtr<MemberListInfoContext> publicStaticMethods;
-      ScopedPtr<MemberListInfoContext> publicAttributes;
-      ScopedPtr<MemberListInfoContext> publicStaticAttributes;
-      ScopedPtr<MemberListInfoContext> publicSlots;
-      ScopedPtr<MemberListInfoContext> protectedTypes;
-      ScopedPtr<MemberListInfoContext> protectedMethods;
-      ScopedPtr<MemberListInfoContext> protectedStaticMethods;
-      ScopedPtr<MemberListInfoContext> protectedAttributes;
-      ScopedPtr<MemberListInfoContext> protectedStaticAttributes;
-      ScopedPtr<MemberListInfoContext> protectedSlots;
-      ScopedPtr<MemberListInfoContext> privateTypes;
-      ScopedPtr<MemberListInfoContext> privateMethods;
-      ScopedPtr<MemberListInfoContext> privateStaticMethods;
-      ScopedPtr<MemberListInfoContext> privateAttributes;
-      ScopedPtr<MemberListInfoContext> privateStaticAttributes;
-      ScopedPtr<MemberListInfoContext> privateSlots;
-      ScopedPtr<MemberListInfoContext> packageTypes;
-      ScopedPtr<MemberListInfoContext> packageMethods;
-      ScopedPtr<MemberListInfoContext> packageStaticMethods;
-      ScopedPtr<MemberListInfoContext> packageAttributes;
-      ScopedPtr<MemberListInfoContext> packageStaticAttributes;
-      ScopedPtr<MemberListInfoContext> unoIDLServices;
-      ScopedPtr<MemberListInfoContext> unoIDLInterfaces;
-      ScopedPtr<MemberListInfoContext> signals;
-      ScopedPtr<MemberListInfoContext> properties;
-      ScopedPtr<MemberListInfoContext> events;
-      ScopedPtr<MemberListInfoContext> friends;
-      ScopedPtr<MemberListInfoContext> related;
-      ScopedPtr<MemberListInfoContext> detailedTypedefs;
-      ScopedPtr<MemberListInfoContext> detailedEnums;
-      ScopedPtr<MemberListInfoContext> detailedServices;
-      ScopedPtr<MemberListInfoContext> detailedInterfaces;
-      ScopedPtr<MemberListInfoContext> detailedConstructors;
-      ScopedPtr<MemberListInfoContext> detailedMethods;
-      ScopedPtr<MemberListInfoContext> detailedRelated;
-      ScopedPtr<MemberListInfoContext> detailedVariables;
-      ScopedPtr<MemberListInfoContext> detailedProperties;
-      ScopedPtr<MemberListInfoContext> detailedEvents;
-      ScopedPtr<MemberGroupListContext> memberGroups;
-      ScopedPtr<AllMembersListContext> allMembersList;
-      ScopedPtr<ArgumentListContext>   typeConstraints;
-      ScopedPtr<TemplateList>          examples;
-      ScopedPtr<TemplateList>          templateDecls;
-      ScopedPtr<InheritedMemberInfoListContext> additionalInheritedMembers;
-      ScopedPtr<MemberListContext>     members;
-      QList<ArgumentListContext>       templateArgList;
-      int                              inheritanceNodes;
-      QList<TemplateStruct>            exampleList;
-      MemberList                       allMembers;
+      SharedPtr<NestedClassListContext> classes;
+      SharedPtr<MemberListInfoContext>  publicTypes;
+      SharedPtr<MemberListInfoContext>  publicMethods;
+      SharedPtr<MemberListInfoContext>  publicStaticMethods;
+      SharedPtr<MemberListInfoContext>  publicAttributes;
+      SharedPtr<MemberListInfoContext>  publicStaticAttributes;
+      SharedPtr<MemberListInfoContext>  publicSlots;
+      SharedPtr<MemberListInfoContext>  protectedTypes;
+      SharedPtr<MemberListInfoContext>  protectedMethods;
+      SharedPtr<MemberListInfoContext>  protectedStaticMethods;
+      SharedPtr<MemberListInfoContext>  protectedAttributes;
+      SharedPtr<MemberListInfoContext>  protectedStaticAttributes;
+      SharedPtr<MemberListInfoContext>  protectedSlots;
+      SharedPtr<MemberListInfoContext>  privateTypes;
+      SharedPtr<MemberListInfoContext>  privateMethods;
+      SharedPtr<MemberListInfoContext>  privateStaticMethods;
+      SharedPtr<MemberListInfoContext>  privateAttributes;
+      SharedPtr<MemberListInfoContext>  privateStaticAttributes;
+      SharedPtr<MemberListInfoContext>  privateSlots;
+      SharedPtr<MemberListInfoContext>  packageTypes;
+      SharedPtr<MemberListInfoContext>  packageMethods;
+      SharedPtr<MemberListInfoContext>  packageStaticMethods;
+      SharedPtr<MemberListInfoContext>  packageAttributes;
+      SharedPtr<MemberListInfoContext>  packageStaticAttributes;
+      SharedPtr<MemberListInfoContext>  unoIDLServices;
+      SharedPtr<MemberListInfoContext>  unoIDLInterfaces;
+      SharedPtr<MemberListInfoContext>  signals;
+      SharedPtr<MemberListInfoContext>  properties;
+      SharedPtr<MemberListInfoContext>  events;
+      SharedPtr<MemberListInfoContext>  friends;
+      SharedPtr<MemberListInfoContext>  related;
+      SharedPtr<MemberListInfoContext>  detailedTypedefs;
+      SharedPtr<MemberListInfoContext>  detailedEnums;
+      SharedPtr<MemberListInfoContext>  detailedServices;
+      SharedPtr<MemberListInfoContext>  detailedInterfaces;
+      SharedPtr<MemberListInfoContext>  detailedConstructors;
+      SharedPtr<MemberListInfoContext>  detailedMethods;
+      SharedPtr<MemberListInfoContext>  detailedRelated;
+      SharedPtr<MemberListInfoContext>  detailedVariables;
+      SharedPtr<MemberListInfoContext>  detailedProperties;
+      SharedPtr<MemberListInfoContext>  detailedEvents;
+      SharedPtr<MemberGroupListContext> memberGroups;
+      SharedPtr<AllMembersListContext>  allMembersList;
+      SharedPtr<ArgumentListContext>    typeConstraints;
+      SharedPtr<TemplateList>           examples;
+      SharedPtr<TemplateList>           templateDecls;
+      SharedPtr<InheritedMemberInfoListContext> additionalInheritedMembers;
+      SharedPtr<MemberListContext>      members;
+      SharedPtr<UsedFilesContext>       usedFiles;
+      SharedPtr<TemplateList>           exampleList;
+      int                               inheritanceNodes;
+      MemberList                        allMembers;
     };
     mutable Cachable m_cache;
 };
 //%% }
 
-ClassContext::ClassContext(ClassDef *cd)
+ClassContext::ClassContext(ClassDef *cd) : RefCountedContext("ClassContext")
 {
   //printf("ClassContext::ClassContext(%s)\n",cd?cd->name().data():"<none>");
   p = new Private(cd);
@@ -1862,6 +2059,8 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
       addProperty("title",this,&Private::title);
       addProperty("highlight",this,&Private::highlight);
       addProperty("subhighlight",this,&Private::subHighlight);
+      addProperty("compoundType",this,&Private::compoundType);
+      addProperty("hasDetails",this,&Private::hasDetails);
     }
     TemplateVariant title() const
     {
@@ -1875,12 +2074,20 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
     {
       return TemplateVariant("");
     }
+    TemplateVariant compoundType() const
+    {
+      return m_namespaceDef->compoundTypeString();
+    }
+    TemplateVariant hasDetails() const
+    {
+      return m_namespaceDef->hasDetailedDescription();
+    }
   private:
     NamespaceDef *m_namespaceDef;
 };
 //%% }
 
-NamespaceContext::NamespaceContext(NamespaceDef *nd)
+NamespaceContext::NamespaceContext(NamespaceDef *nd) : RefCountedContext("NamespaceContext")
 {
   p = new Private(nd);
 }
@@ -1904,10 +2111,36 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
   public:
     Private(FileDef *fd) : DefinitionContext<FileContext::Private>(fd) , m_fileDef(fd)
     {
-      addProperty("title",this,&Private::title);
-      addProperty("highlight",this,&Private::highlight);
-      addProperty("subhighlight",this,&Private::subHighlight);
-      addProperty("versionInfo",this,&Private::versionInfo);
+      if (fd==0) abort();
+      addProperty("title",                     this,&Private::title);
+      addProperty("highlight",                 this,&Private::highlight);
+      addProperty("subhighlight",              this,&Private::subHighlight);
+      addProperty("versionInfo",               this,&Private::versionInfo);
+      addProperty("includeList",               this,&Private::includeList);
+      addProperty("hasIncludeGraph",           this,&Private::hasIncludeGraph);
+      addProperty("hasIncludedByGraph",        this,&Private::hasIncludedByGraph);
+      addProperty("includeGraph",              this,&Private::includeGraph);
+      addProperty("includedByGraph",           this,&Private::includedByGraph);
+      addProperty("hasDetails",                this,&Private::hasDetails);
+      addProperty("hasSourceFile",             this,&Private::hasSourceFile);
+      addProperty("sources",                   this,&Private::sources);
+      addProperty("version",                   this,&Private::version);
+      addProperty("classes",                   this,&Private::classes);
+      addProperty("namespaces",                this,&Private::namespaces);
+      addProperty("constantgroups",            this,&Private::constantgroups);
+      addProperty("macros",                    this,&Private::macros);
+      addProperty("typedefs",                  this,&Private::typedefs);
+      addProperty("enums",                     this,&Private::enums);
+      addProperty("functions",                 this,&Private::functions);
+      addProperty("variables",                 this,&Private::variables);
+      addProperty("memberGroups",              this,&Private::memberGroups);
+      addProperty("detailedMacros",            this,&Private::detailedMacros);
+      addProperty("detailedTypedefs",          this,&Private::detailedTypedefs);
+      addProperty("detailedEnums",             this,&Private::detailedEnums);
+      addProperty("detailedFunctions",         this,&Private::detailedFunctions);
+      addProperty("detailedVariables",         this,&Private::detailedVariables);
+      addProperty("inlineClasses",             this,&Private::inlineClasses);
+      addProperty("compoundType",              this,&Private::compoundType);
     }
     TemplateVariant title() const
     {
@@ -1925,108 +2158,461 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
     {
       return m_fileDef->getVersion();
     }
-  private:
-    FileDef *m_fileDef;
-};
-//%% }
-
-FileContext::FileContext(FileDef *fd)
-{
-  p = new Private(fd);
-}
-
-FileContext::~FileContext()
-{
-  delete p;
-}
-
-TemplateVariant FileContext::get(const char *n) const
-{
-  return p->get(n);
-}
-
-//------------------------------------------------------------------------
-
-//%% struct Dir(Symbol): directory information
-//%% {
-class DirContext::Private : public DefinitionContext<DirContext::Private>
-{
-  public:
-    Private(DirDef *dd) : DefinitionContext<DirContext::Private>(dd) , m_dirDef(dd)
+    TemplateVariant includeList() const
     {
-      addProperty("title",this,&Private::title);
-      addProperty("highlight",this,&Private::highlight);
-      addProperty("subhighlight",this,&Private::subHighlight);
-      addProperty("dirName",this,&Private::dirName);
+      if (!m_cache.includeInfoList && m_fileDef->includeFileList())
+      {
+        m_cache.includeInfoList.reset(IncludeInfoListContext::alloc(
+              *m_fileDef->includeFileList(),m_fileDef->getLanguage()));
+      }
+      if (m_cache.includeInfoList)
+      {
+        return m_cache.includeInfoList.get();
+      }
+      else
+      {
+        return TemplateVariant(FALSE);
+      }
     }
-    TemplateVariant title() const
+    DotInclDepGraph *getIncludeGraph() const
     {
-      return TemplateVariant(m_dirDef->shortTitle());
+      if (!m_cache.includeGraph)
+      {
+        m_cache.includeGraph.reset(new DotInclDepGraph(m_fileDef,FALSE));
+      }
+      return m_cache.includeGraph.get();
     }
-    TemplateVariant highlight() const
+    TemplateVariant hasIncludeGraph() const
     {
-      return TemplateVariant("files");
+      static bool haveDot = Config_getBool("HAVE_DOT");
+      DotInclDepGraph *incGraph = getIncludeGraph();
+      return (haveDot && !incGraph->isTooBig() && !incGraph->isTrivial());
     }
-    TemplateVariant subHighlight() const
+    TemplateVariant includeGraph() const
     {
-      return TemplateVariant("");
+      static bool haveDot = Config_getBool("HAVE_DOT");
+      QGString result;
+      if (haveDot)
+      {
+        DotInclDepGraph *cg = getIncludeGraph();
+        FTextStream t(&result);
+        cg->writeGraph(t,BITMAP,
+            g_globals.outputDir,
+            g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+            relPathAsString(),TRUE,g_globals.dynSectionId
+            );
+      }
+      g_globals.dynSectionId++;
+      return TemplateVariant(result.data(),TRUE);
     }
-    TemplateVariant dirName() const
+    DotInclDepGraph *getIncludedByGraph() const
     {
-      return TemplateVariant(m_dirDef->shortName());
+      if (!m_cache.includedByGraph)
+      {
+        m_cache.includedByGraph.reset(new DotInclDepGraph(m_fileDef,TRUE));
+      }
+      return m_cache.includedByGraph.get();
     }
-  private:
-    DirDef *m_dirDef;
-};
-//%% }
-
-DirContext::DirContext(DirDef *fd)
-{
-  p = new Private(fd);
-}
-
-DirContext::~DirContext()
-{
-  delete p;
-}
-
-TemplateVariant DirContext::get(const char *n) const
-{
-  return p->get(n);
-}
-
-
-//------------------------------------------------------------------------
-
-//%% struct Page(Symbol): page information
-//%% {
-class PageContext::Private : public DefinitionContext<PageContext::Private>
-{
-  public:
-    Private(PageDef *pd) : DefinitionContext<PageContext::Private>(pd) , m_pageDef(pd)
+    TemplateVariant hasIncludedByGraph() const
     {
-      addProperty("title",this,&Private::title);
-      addProperty("highlight",this,&Private::highlight);
-      addProperty("subhighlight",this,&Private::subHighlight);
+      static bool haveDot = Config_getBool("HAVE_DOT");
+      DotInclDepGraph *incGraph = getIncludedByGraph();
+      return (haveDot && !incGraph->isTooBig() && !incGraph->isTrivial());
     }
-    TemplateVariant title() const
+    TemplateVariant includedByGraph() const
     {
-      return TemplateVariant(m_pageDef->title());
+      static bool haveDot = Config_getBool("HAVE_DOT");
+      QGString result;
+      if (haveDot)
+      {
+        DotInclDepGraph *cg = getIncludedByGraph();
+        FTextStream t(&result);
+        cg->writeGraph(t,BITMAP,
+            g_globals.outputDir,
+            g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+            relPathAsString(),TRUE,g_globals.dynSectionId
+            );
+      }
+      g_globals.dynSectionId++;
+      return TemplateVariant(result.data(),TRUE);
     }
-    TemplateVariant highlight() const
+    TemplateVariant hasDetails() const
     {
-      return TemplateVariant("pages");
+      return m_fileDef->hasDetailedDescription();
     }
-    TemplateVariant subHighlight() const
+    TemplateVariant hasSourceFile() const
     {
-      return TemplateVariant("");
+      return m_fileDef->generateSourceFile();
     }
-  private:
-    PageDef *m_pageDef;
-};
-//%% }
+    TemplateVariant sources() const
+    {
+      if (!m_cache.sources)
+      {
+        if (m_fileDef->generateSourceFile())
+        {
+          m_cache.sources.reset(new TemplateVariant(parseCode(m_fileDef,relPathAsString())));
+        }
+        else
+        {
+          m_cache.sources.reset(new TemplateVariant(""));
+        }
+      }
+      return *m_cache.sources;
+    }
+    TemplateVariant version() const
+    {
+      return m_fileDef->fileVersion();
+    }
+    TemplateVariant classes() const
+    {
+      if (!m_cache.classes)
+      {
+        NestedClassListContext *classList = NestedClassListContext::alloc();
+        if (m_fileDef->getClassSDict())
+        {
+          ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
+          ClassDef *cd;
+          for (sdi.toFirst();(cd=sdi.current());++sdi)
+          {
+            if (cd->visibleInParentsDeclList())
+            {
+              classList->append(cd);
+            }
+          }
+        }
+        m_cache.classes.reset(classList);
+      }
+      return m_cache.classes.get();
+    }
+    TemplateVariant namespaces() const
+    {
+      if (!m_cache.namespaces)
+      {
+        NestedNamespaceListContext *namespaceList = NestedNamespaceListContext::alloc();
+        if (m_fileDef->getNamespaceSDict())
+        {
+          NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict());
+          NamespaceDef *nd;
+          for (sdi.toFirst();(nd=sdi.current());++sdi)
+          {
+            if (nd->isLinkable() && !nd->isConstantGroup())
+            {
+              namespaceList->append(nd);
+            }
+          }
+        }
+        m_cache.namespaces.reset(namespaceList);
+      }
+      return m_cache.namespaces.get();
+    }
+    TemplateVariant constantgroups() const
+    {
+      if (!m_cache.constantgroups)
+      {
+        NestedNamespaceListContext *namespaceList = NestedNamespaceListContext::alloc();
+        if (m_fileDef->getNamespaceSDict())
+        {
+          NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict());
+          NamespaceDef *nd;
+          for (sdi.toFirst();(nd=sdi.current());++sdi)
+          {
+            if (nd->isLinkable() && nd->isConstantGroup())
+            {
+              namespaceList->append(nd);
+            }
+          }
+        }
+        m_cache.constantgroups.reset(namespaceList);
+      }
+      return m_cache.constantgroups.get();
+    }
+    TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
+                                  MemberListType type,const char *title,bool detailed=FALSE) const
+    {
+      if (!list)
+      {
+        MemberList *ml = m_fileDef->getMemberList(type);
+        if (ml)
+        {
+          list.reset(MemberListInfoContext::alloc(m_fileDef,relPathAsString(),ml,title,detailed));
+        }
+      }
+      if (list)
+      {
+        return list.get();
+      }
+      else
+      {
+        return TemplateVariant(FALSE);
+      }
+    }
+    TemplateVariant macros() const
+    {
+      return getMemberList(m_cache.macros,MemberListType_decDefineMembers,theTranslator->trDefines());
+    }
+    TemplateVariant typedefs() const
+    {
+      return getMemberList(m_cache.typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
+    }
+    TemplateVariant enums() const
+    {
+      return getMemberList(m_cache.enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
+    }
+    TemplateVariant functions() const
+    {
+      // TODO: Fortran: trSubprograms()
+      // TODO: VHDL:    VhdlDocGen::trFunctionAndProc()
+      return getMemberList(m_cache.functions,MemberListType_decFuncMembers,theTranslator->trFunctions());
+    }
+    TemplateVariant variables() const
+    {
+      return getMemberList(m_cache.variables,MemberListType_decVarMembers,theTranslator->trVariables());
+    }
+    TemplateVariant memberGroups() const
+    {
+      if (!m_cache.memberGroups)
+      {
+        if (m_fileDef->getMemberGroupSDict())
+        {
+          m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_fileDef,relPathAsString(),m_fileDef->getMemberGroupSDict(),m_fileDef->subGrouping()));
+        }
+        else
+        {
+          m_cache.memberGroups.reset(MemberGroupListContext::alloc());
+        }
+      }
+      return m_cache.memberGroups.get();
+    }
+    TemplateVariant detailedMacros() const
+    {
+      return getMemberList(m_cache.detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation());
+    }
+    TemplateVariant detailedTypedefs() const
+    {
+      return getMemberList(m_cache.detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
+    }
+    TemplateVariant detailedEnums() const
+    {
+      return getMemberList(m_cache.detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
+    }
+    TemplateVariant detailedFunctions() const
+    {
+      // TODO: Fortran: trSubprogramDocumentation()
+      return getMemberList(m_cache.detailedFunctions,MemberListType_docFuncMembers,theTranslator->trFunctionDocumentation());
+    }
+    TemplateVariant detailedVariables() const
+    {
+      return getMemberList(m_cache.detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
+    }
+    TemplateVariant inlineClasses() const
+    {
+      if (!m_cache.inlineClasses)
+      {
+        NestedClassListContext *classList = NestedClassListContext::alloc();
+        if (m_fileDef->getClassSDict())
+        {
+          ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
+          ClassDef *cd;
+          for (sdi.toFirst();(cd=sdi.current());++sdi)
+          {
+            if (cd->name().find('@')==-1 &&
+                cd->isLinkableInProject() &&
+                cd->isEmbeddedInOuterScope() &&
+                cd->partOfGroups()==0)
+            {
+              classList->append(cd);
+            }
+          }
+        }
+        m_cache.inlineClasses.reset(classList);
+      }
+      return m_cache.inlineClasses.get();
+    }
+    TemplateVariant compoundType() const
+    {
+      return theTranslator->trFile(FALSE,TRUE);
+    }
+
+  private:
+    FileDef *m_fileDef;
+    struct Cachable
+    {
+      SharedPtr<IncludeInfoListContext>     includeInfoList;
+      ScopedPtr<DotInclDepGraph>            includeGraph;
+      ScopedPtr<DotInclDepGraph>            includedByGraph;
+      ScopedPtr<TemplateVariant>            sources;
+      SharedPtr<NestedClassListContext>     classes;
+      SharedPtr<NestedNamespaceListContext> namespaces;
+      SharedPtr<NestedNamespaceListContext> constantgroups;
+      SharedPtr<MemberListInfoContext>      macros;
+      SharedPtr<MemberListInfoContext>      typedefs;
+      SharedPtr<MemberListInfoContext>      enums;
+      SharedPtr<MemberListInfoContext>      functions;
+      SharedPtr<MemberListInfoContext>      variables;
+      SharedPtr<MemberGroupListContext>     memberGroups;
+      SharedPtr<MemberListInfoContext>      detailedMacros;
+      SharedPtr<MemberListInfoContext>      detailedTypedefs;
+      SharedPtr<MemberListInfoContext>      detailedEnums;
+      SharedPtr<MemberListInfoContext>      detailedFunctions;
+      SharedPtr<MemberListInfoContext>      detailedVariables;
+      SharedPtr<NestedClassListContext>     inlineClasses;
+    };
+    mutable Cachable m_cache;
+};
+//%% }
+
+FileContext::FileContext(FileDef *fd) : RefCountedContext("FileContext")
+{
+  p = new Private(fd);
+}
+
+FileContext::~FileContext()
+{
+  delete p;
+}
+
+TemplateVariant FileContext::get(const char *n) const
+{
+  return p->get(n);
+}
+
+//------------------------------------------------------------------------
+
+//%% struct Dir(Symbol): directory information
+//%% {
+class DirContext::Private : public DefinitionContext<DirContext::Private>
+{
+  public:
+    Private(DirDef *dd) : DefinitionContext<DirContext::Private>(dd) , m_dirDef(dd)
+    {
+      addProperty("title",         this,&Private::title);
+      addProperty("highlight",     this,&Private::highlight);
+      addProperty("subhighlight",  this,&Private::subHighlight);
+      addProperty("dirName",       this,&Private::dirName);
+      addProperty("dirs",          this,&Private::dirs);
+      addProperty("files",         this,&Private::files);
+      addProperty("hasDetails",    this,&Private::hasDetails);
+      addProperty("compoundType",  this,&Private::compoundType);
+    }
+    TemplateVariant title() const
+    {
+      return TemplateVariant(m_dirDef->shortTitle());
+    }
+    TemplateVariant highlight() const
+    {
+      return TemplateVariant("files");
+    }
+    TemplateVariant subHighlight() const
+    {
+      return TemplateVariant("");
+    }
+    TemplateVariant dirName() const
+    {
+      return TemplateVariant(m_dirDef->shortName());
+    }
+    TemplateVariant dirs() const
+    {
+      if (!m_cache.dirs)
+      {
+        m_cache.dirs.reset(TemplateList::alloc());
+        const DirList &subDirs = m_dirDef->subDirs();
+        QListIterator<DirDef> it(subDirs);
+        DirDef *dd;
+        for (it.toFirst();(dd=it.current());++it)
+        {
+          DirContext *dc = new DirContext(dd);
+          m_cache.dirs->append(dc);
+        }
+      }
+      return m_cache.dirs.get();
+    }
+    TemplateVariant files() const
+    {
+      // FileList *list = m_dirDef->getFiles();
+      if (!m_cache.files)
+      {
+        m_cache.files.reset(TemplateList::alloc());
+        FileList *files = m_dirDef->getFiles();
+        if (files)
+        {
+          QListIterator<FileDef> it(*files);
+          FileDef *fd;
+          for (it.toFirst();(fd=it.current());++it)
+          {
+            FileContext *fc = FileContext::alloc(fd);
+            m_cache.files->append(fc);
+          }
+        }
+      }
+      return m_cache.files.get();
+    }
+    TemplateVariant hasDetails() const
+    {
+      return m_dirDef->hasDetailedDescription();
+    }
+    TemplateVariant compoundType() const
+    {
+      return theTranslator->trDir(FALSE,TRUE);
+    }
+
+  private:
+    DirDef *m_dirDef;
+    struct Cachable
+    {
+      Cachable() {}
+      SharedPtr<TemplateList>  dirs;
+      SharedPtr<TemplateList>  files;
+    };
+    mutable Cachable m_cache;
+};
+//%% }
+
+DirContext::DirContext(DirDef *fd) : RefCountedContext("DirContext")
+{
+  p = new Private(fd);
+}
+
+DirContext::~DirContext()
+{
+  delete p;
+}
+
+TemplateVariant DirContext::get(const char *n) const
+{
+  return p->get(n);
+}
 
-PageContext::PageContext(PageDef *pd)
+//------------------------------------------------------------------------
+
+//%% struct Page(Symbol): page information
+//%% {
+class PageContext::Private : public DefinitionContext<PageContext::Private>
+{
+  public:
+    Private(PageDef *pd) : DefinitionContext<PageContext::Private>(pd) , m_pageDef(pd)
+    {
+      addProperty("title",this,&Private::title);
+      addProperty("highlight",this,&Private::highlight);
+      addProperty("subhighlight",this,&Private::subHighlight);
+    }
+    TemplateVariant title() const
+    {
+      return TemplateVariant(m_pageDef->title());
+    }
+    TemplateVariant highlight() const
+    {
+      return TemplateVariant("pages");
+    }
+    TemplateVariant subHighlight() const
+    {
+      return TemplateVariant("");
+    }
+  private:
+    PageDef *m_pageDef;
+};
+//%% }
+
+PageContext::PageContext(PageDef *pd) : RefCountedContext("PageContext")
 {
   p = new Private(pd);
 }
@@ -2077,7 +2663,7 @@ class TextGeneratorHtml : public TextGeneratorIntf
 
     void writeBreak(int indent) const
     {
-      m_ts << "<br/>";
+      m_ts << "<br />";
       for (int i=0;i<indent;i++)
       {
         m_ts << "&#160;";
@@ -2160,21 +2746,70 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
   public:
     Private(MemberDef *md) : DefinitionContext<MemberContext::Private>(md) , m_memberDef(md)
     {
-      addProperty("declType",            this,&Private::declType);
-      addProperty("declArgs",            this,&Private::declArgs);
+      addProperty("isSignal",            this,&Private::isSignal);
+      addProperty("isSlot",              this,&Private::isSlot);
+      addProperty("isVariable",          this,&Private::isVariable);
+      addProperty("isEnumeration",       this,&Private::isEnumeration);
+      addProperty("isEnumValue",         this,&Private::isEnumValue);
+      addProperty("isTypedef",           this,&Private::isTypedef);
+      addProperty("isFunction",          this,&Private::isFunction);
+      addProperty("isFunctionPtr",       this,&Private::isFunctionPtr);
+      addProperty("isDefine",            this,&Private::isDefine);
+      addProperty("isFriend",            this,&Private::isFriend);
+      addProperty("isProperty",          this,&Private::isProperty);
+      addProperty("isEvent",             this,&Private::isEvent);
+      addProperty("isRelated",           this,&Private::isRelated);
+      addProperty("isForeign",           this,&Private::isForeign);
       addProperty("isStatic",            this,&Private::isStatic);
+      addProperty("isInline",            this,&Private::isInline);
+      addProperty("isExplicit",          this,&Private::isExplicit);
+      addProperty("isMutable",           this,&Private::isMutable);
+      addProperty("isGettable",          this,&Private::isGettable);
+      addProperty("isSettable",          this,&Private::isSettable);
+      addProperty("isReadable",          this,&Private::isReadable);
+      addProperty("isWritable",          this,&Private::isWritable);
+      addProperty("isAddable",           this,&Private::isAddable);
+      addProperty("isRemovable",         this,&Private::isRemovable);
+      addProperty("isRaisable",          this,&Private::isRaisable);
+      addProperty("isFinal",             this,&Private::isFinal);
+      addProperty("isAbstract",          this,&Private::isAbstract);
+      addProperty("isOverride",          this,&Private::isOverride);
+      addProperty("isInitonly",          this,&Private::isInitonly);
+      addProperty("isOptional",          this,&Private::isOptional);
+      addProperty("isRequired",          this,&Private::isRequired);
+      addProperty("isNonAtomic",         this,&Private::isNonAtomic);
+      addProperty("isCopy",              this,&Private::isCopy);
+      addProperty("isAssign",            this,&Private::isAssign);
+      addProperty("isRetain",            this,&Private::isRetain);
+      addProperty("isWeak",              this,&Private::isWeak);
+      addProperty("isStrong",            this,&Private::isStrong);
+      addProperty("isUnretained",        this,&Private::isUnretained);
+      addProperty("isNew",               this,&Private::isNew);
+      addProperty("isSealed",            this,&Private::isSealed);
+      addProperty("isImplementation",    this,&Private::isImplementation);
+      addProperty("isExternal",          this,&Private::isExternal);
+      addProperty("isAlias",             this,&Private::isAlias);
+      addProperty("isDefault",           this,&Private::isDefault);
+      addProperty("isDelete",            this,&Private::isDelete);
+      addProperty("isNoExcept",          this,&Private::isNoExcept);
+      addProperty("isAttribute",         this,&Private::isAttribute);
+      addProperty("isUNOProperty",       this,&Private::isUNOProperty);
+      addProperty("isReadonly",          this,&Private::isReadonly);
+      addProperty("isBound",             this,&Private::isBound);
+      addProperty("isConstrained",       this,&Private::isConstrained);
+      addProperty("isTransient",         this,&Private::isTransient);
+      addProperty("isMaybeVoid",         this,&Private::isMaybeVoid);
+      addProperty("isMaybeDefault",      this,&Private::isMaybeDefault);
+      addProperty("isMaybeAmbiguous",    this,&Private::isMaybeAmbiguous);
+      addProperty("isPublished",         this,&Private::isPublished);
+      addProperty("isTemplateSpecialization",this,&Private::isTemplateSpecialization);
       addProperty("isObjCMethod",        this,&Private::isObjCMethod);
       addProperty("isObjCProperty",      this,&Private::isObjCProperty);
-      addProperty("isDefine",            this,&Private::isDefine);
-      addProperty("isImplementation",    this,&Private::isImplementation);
-      addProperty("isEvent",             this,&Private::isEvent);
-      addProperty("isProperty",          this,&Private::isProperty);
-      addProperty("isEnumeration",       this,&Private::isEnumeration);
-      addProperty("isEnumValue",         this,&Private::isEnumValue);
       addProperty("isAnonymous",         this,&Private::isAnonymous);
+      addProperty("declType",            this,&Private::declType);
+      addProperty("declArgs",            this,&Private::declArgs);
       addProperty("anonymousType",       this,&Private::anonymousType);
       addProperty("anonymousMember",     this,&Private::anonymousMember);
-      addProperty("isRelated",           this,&Private::isRelated);
       addProperty("hasDetails",          this,&Private::hasDetails);
       addProperty("exception",           this,&Private::exception);
       addProperty("bitfields",           this,&Private::bitfields);
@@ -2214,19 +2849,26 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
       addProperty("callGraph",           this,&Private::callGraph);
       addProperty("hasCallerGraph",      this,&Private::hasCallerGraph);
       addProperty("callerGraph",         this,&Private::callerGraph);
+      addProperty("fieldType",           this,&Private::fieldType);
 
+      m_cache.propertyAttrs.reset(TemplateList::alloc());
       if (md && md->isProperty())
       {
-        if (md->isGettable()) m_propertyAttrs.append("get");
-        if (md->isSettable()) m_propertyAttrs.append("set");
+        if (md->isGettable()) m_cache.propertyAttrs->append("get");
+        if (md->isSettable()) m_cache.propertyAttrs->append("set");
       }
+      m_cache.eventAttrs.reset(TemplateList::alloc());
       if (md && md->isEvent())
       {
-        if (md->isAddable())   m_eventAttrs.append("add");
-        if (md->isRemovable()) m_eventAttrs.append("remove");
-        if (md->isRaisable())  m_eventAttrs.append("raise");
+        if (md->isAddable())   m_cache.eventAttrs->append("add");
+        if (md->isRemovable()) m_cache.eventAttrs->append("remove");
+        if (md->isRaisable())  m_cache.eventAttrs->append("raise");
       }
     }
+    TemplateVariant fieldType() const
+    {
+      return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->fieldType());
+    }
     TemplateVariant declType() const
     {
       return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->getDeclType());
@@ -2251,17 +2893,209 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     {
       return m_memberDef->isObjCMethod();
     }
-    TemplateVariant isObjCProperty() const
+    TemplateVariant isObjCProperty() const
+    {
+      return m_memberDef->isObjCProperty();
+    }
+    TemplateVariant isImplementation() const
+    {
+      return m_memberDef->isImplementation();
+    }
+    TemplateVariant isSignal() const
+    {
+      return m_memberDef->isSignal();
+    }
+    TemplateVariant isSlot() const
+    {
+      return m_memberDef->isSlot();
+    }
+    TemplateVariant isTypedef() const
+    {
+      return m_memberDef->isTypedef();
+    }
+    TemplateVariant isFunction() const
+    {
+      return m_memberDef->isFunction();
+    }
+    TemplateVariant isFunctionPtr() const
+    {
+      return m_memberDef->isFunctionPtr();
+    }
+    TemplateVariant isFriend() const
+    {
+      return m_memberDef->isFriend();
+    }
+    TemplateVariant isForeign() const
+    {
+      return m_memberDef->isForeign();
+    }
+    TemplateVariant isEvent() const
+    {
+      return m_memberDef->isEvent();
+    }
+    TemplateVariant isInline() const
+    {
+      return m_memberDef->isInline();
+    }
+    TemplateVariant isExplicit() const
+    {
+      return m_memberDef->isExplicit();
+    }
+    TemplateVariant isMutable() const
+    {
+      return m_memberDef->isMutable();
+    }
+    TemplateVariant isGettable() const
+    {
+      return m_memberDef->isSettable();
+    }
+    TemplateVariant isSettable() const
+    {
+      return m_memberDef->isSettable();
+    }
+    TemplateVariant isReadable() const
+    {
+      return m_memberDef->isReadable();
+    }
+    TemplateVariant isWritable() const
+    {
+      return m_memberDef->isWritable();
+    }
+    TemplateVariant isAddable() const
+    {
+      return m_memberDef->isAddable();
+    }
+    TemplateVariant isRemovable() const
+    {
+      return m_memberDef->isRemovable();
+    }
+    TemplateVariant isRaisable() const
+    {
+      return m_memberDef->isRaisable();
+    }
+    TemplateVariant isFinal() const
+    {
+      return m_memberDef->isFinal();
+    }
+    TemplateVariant isAbstract() const
+    {
+      return m_memberDef->isAbstract();
+    }
+    TemplateVariant isOverride() const
+    {
+      return m_memberDef->isOverride();
+    }
+    TemplateVariant isInitonly() const
+    {
+      return m_memberDef->isInitonly();
+    }
+    TemplateVariant isOptional() const
+    {
+      return m_memberDef->isOptional();
+    }
+    TemplateVariant isRequired() const
+    {
+      return m_memberDef->isRequired();
+    }
+    TemplateVariant isNonAtomic() const
+    {
+      return m_memberDef->isNonAtomic();
+    }
+    TemplateVariant isCopy() const
+    {
+      return m_memberDef->isCopy();
+    }
+    TemplateVariant isAssign() const
+    {
+      return m_memberDef->isAssign();
+    }
+    TemplateVariant isRetain() const
+    {
+      return m_memberDef->isRetain();
+    }
+    TemplateVariant isWeak() const
+    {
+      return m_memberDef->isWeak();
+    }
+    TemplateVariant isStrong() const
+    {
+      return m_memberDef->isStrong();
+    }
+    TemplateVariant isUnretained() const
+    {
+      return m_memberDef->isUnretained();
+    }
+    TemplateVariant isNew() const
+    {
+      return m_memberDef->isNew();
+    }
+    TemplateVariant isSealed() const
+    {
+      return m_memberDef->isSealed();
+    }
+    TemplateVariant isExternal() const
+    {
+      return m_memberDef->isExternal();
+    }
+    TemplateVariant isAlias() const
+    {
+      return m_memberDef->isAlias();
+    }
+    TemplateVariant isDefault() const
+    {
+      return m_memberDef->isDefault();
+    }
+    TemplateVariant isDelete() const
+    {
+      return m_memberDef->isDelete();
+    }
+    TemplateVariant isNoExcept() const
+    {
+      return m_memberDef->isNoExcept();
+    }
+    TemplateVariant isAttribute() const
+    {
+      return m_memberDef->isAttribute();
+    }
+    TemplateVariant isUNOProperty() const
+    {
+      return m_memberDef->isUNOProperty();
+    }
+    TemplateVariant isReadonly() const
+    {
+      return m_memberDef->isReadonly();
+    }
+    TemplateVariant isBound() const
+    {
+      return m_memberDef->isBound();
+    }
+    TemplateVariant isConstrained() const
+    {
+      return m_memberDef->isConstrained();
+    }
+    TemplateVariant isTransient() const
+    {
+      return m_memberDef->isTransient();
+    }
+    TemplateVariant isMaybeVoid() const
+    {
+      return m_memberDef->isMaybeVoid();
+    }
+    TemplateVariant isMaybeDefault() const
+    {
+      return m_memberDef->isMaybeDefault();
+    }
+    TemplateVariant isMaybeAmbiguous() const
     {
-      return m_memberDef->isObjCProperty();
+      return m_memberDef->isMaybeAmbiguous();
     }
-    TemplateVariant isImplementation() const
+    TemplateVariant isPublished() const
     {
-      return m_memberDef->isImplementation();
+      return m_memberDef->isPublished();
     }
-    TemplateVariant isEvent() const
+    TemplateVariant isTemplateSpecialization() const
     {
-      return m_memberDef->isEvent();
+      return m_memberDef->isTemplateSpecialization();
     }
     TemplateVariant isProperty() const
     {
@@ -2271,6 +3105,10 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     {
       return m_memberDef->isEnumValue();
     }
+    TemplateVariant isVariable() const
+    {
+      return m_memberDef->isVariable();
+    }
     TemplateVariant isEnumeration() const
     {
       return m_memberDef->isEnumerate();
@@ -2318,7 +3156,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
         ClassDef *cd = m_memberDef->getClassDefOfAnonymousType();
         if (cd)
         {
-          m_cache.anonymousType.reset(new ClassContext(cd));
+          m_cache.anonymousType.reset(ClassContext::alloc(cd));
         }
       }
       if (m_cache.anonymousType)
@@ -2337,7 +3175,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
         MemberDef *md = m_memberDef->fromAnonymousMember();
         if (md)
         {
-          m_cache.anonymousMember.reset(new MemberContext(md));
+          m_cache.anonymousMember.reset(MemberContext::alloc(md));
         }
       }
       if (m_cache.anonymousMember)
@@ -2372,11 +3210,11 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
         MemberList *ml = m_memberDef->enumFieldList();
         if (ml)
         {
-          m_cache.enumValues.reset(new MemberListContext(ml));
+          m_cache.enumValues.reset(MemberListContext::alloc(ml));
         }
         else
         {
-          m_cache.enumValues.reset(new MemberListContext);
+          m_cache.enumValues.reset(MemberListContext::alloc());
         }
       }
       return m_cache.enumValues.get();
@@ -2385,7 +3223,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     {
       if (!m_cache.templateArgs && m_memberDef->templateArguments())
       {
-        m_cache.templateArgs.reset(new ArgumentListContext(m_memberDef->templateArguments(),m_memberDef,relPathAsString()));
+        m_cache.templateArgs.reset(ArgumentListContext::alloc(m_memberDef->templateArguments(),m_memberDef,relPathAsString()));
       }
       if (m_cache.templateArgs)
       {
@@ -2407,17 +3245,17 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     TemplateVariant propertyAttrs() const
     {
-      return &m_propertyAttrs;
+      return m_cache.propertyAttrs.get();
     }
     TemplateVariant eventAttrs() const
     {
-      return &m_eventAttrs;
+      return m_cache.eventAttrs.get();
     }
     TemplateVariant getClass() const
     {
       if (!m_cache.classDef && m_memberDef->getClassDef())
       {
-        m_cache.classDef.reset(new ClassContext(m_memberDef->getClassDef()));
+        m_cache.classDef.reset(ClassContext::alloc(m_memberDef->getClassDef()));
       }
       if (m_cache.classDef)
       {
@@ -2445,11 +3283,11 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
         ArgumentList *defArgList = getDefArgList();
         if (defArgList && !m_memberDef->isProperty())
         {
-          m_cache.arguments.reset(new ArgumentListContext(defArgList,m_memberDef,relPathAsString()));
+          m_cache.arguments.reset(ArgumentListContext::alloc(defArgList,m_memberDef,relPathAsString()));
         }
         else
         {
-          m_cache.arguments.reset(new ArgumentListContext);
+          m_cache.arguments.reset(ArgumentListContext::alloc());
         }
       }
       return m_cache.arguments.get();
@@ -2496,8 +3334,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
         {
           if (tal->count()>0)
           {
-            ArgumentListContext *al = new ArgumentListContext(tal,m_memberDef,relPathAsString());
-            m_cache.templateArgList.append(al);
+            ArgumentListContext *al = ArgumentListContext::alloc(tal,m_memberDef,relPathAsString());
             tl->append(al);
           }
         }
@@ -2515,17 +3352,15 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
           {
             if (tal->count()>0)
             {
-              ArgumentListContext *al = new ArgumentListContext(tal,m_memberDef,relPathAsString());
-              m_cache.templateArgList.append(al);
+              ArgumentListContext *al = ArgumentListContext::alloc(tal,m_memberDef,relPathAsString());
               tl->append(al);
             }
           }
         }
         if (m_memberDef->templateArguments()) // function template prefix
         {
-          ArgumentListContext *al = new ArgumentListContext(
+          ArgumentListContext *al = ArgumentListContext::alloc(
               m_memberDef->templateArguments(),m_memberDef,relPathAsString());
-          m_cache.templateArgList.append(al);
           tl->append(al);
         }
       }
@@ -2534,7 +3369,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     {
       if (!m_cache.templateDecls)
       {
-        TemplateList *tl = new TemplateList;
+        TemplateList *tl = TemplateList::alloc();
         addTemplateDecls(tl);
         m_cache.templateDecls.reset(tl);
       }
@@ -2546,7 +3381,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
       {
         QStrList sl;
         m_memberDef->getLabels(sl,m_memberDef->getOuterScope());
-        TemplateList *tl = new TemplateList;
+        TemplateList *tl = TemplateList::alloc();
         if (sl.count()>0)
         {
           QStrListIterator it(sl);
@@ -2593,14 +3428,13 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
       if (!m_cache.implements)
       {
         MemberDef *md = m_memberDef->reimplements();
-        m_cache.implements.reset(new TemplateList);
+        m_cache.implements.reset(TemplateList::alloc());
         if (md)
         {
           ClassDef *cd = md->getClassDef();
           if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
           {
-            MemberContext *mc = new MemberContext(md);
-            m_cache.implementsMember.reset(mc);
+            MemberContext *mc = MemberContext::alloc(md);
             m_cache.implements->append(mc);
           }
         }
@@ -2612,14 +3446,13 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
       if (!m_cache.reimplements)
       {
         MemberDef *md = m_memberDef->reimplements();
-        m_cache.reimplements.reset(new TemplateList);
+        m_cache.reimplements.reset(TemplateList::alloc());
         if (md)
         {
           ClassDef *cd = md->getClassDef();
           if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
           {
-            MemberContext *mc = new MemberContext(md);
-            m_cache.reimplementsMember.reset(mc);
+            MemberContext *mc = MemberContext::alloc(md);
             m_cache.reimplements->append(mc);
           }
         }
@@ -2631,7 +3464,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
       if (!m_cache.implementedBy)
       {
         MemberList *ml = m_memberDef->reimplementedBy();
-        m_cache.implementedBy.reset(new TemplateList);
+        m_cache.implementedBy.reset(TemplateList::alloc());
         if (ml)
         {
           MemberListIterator mli(*ml);
@@ -2642,7 +3475,6 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
             if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
             {
               MemberContext *mc = new MemberContext(md);
-              m_cache.implementedByMembers.append(mc);
               m_cache.implementedBy->append(mc);
             }
           }
@@ -2654,7 +3486,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     {
       if (!m_cache.reimplementedBy)
       {
-        m_cache.reimplementedBy.reset(new TemplateList);
+        m_cache.reimplementedBy.reset(TemplateList::alloc());
         MemberList *ml = m_memberDef->reimplementedBy();
         if (ml)
         {
@@ -2666,7 +3498,6 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
             if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
             {
               MemberContext *mc = new MemberContext(md);
-              m_cache.reimplementedByMembers.append(mc);
               m_cache.reimplementedBy->append(mc);
             }
           }
@@ -2682,8 +3513,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
         Example *ex;
         for (it.toFirst();(ex=it.current());++it)
         {
-          TemplateStruct *s = new TemplateStruct;
-          m_cache.exampleList.append(s);
+          TemplateStruct *s = TemplateStruct::alloc();
           s->set("text",ex->name);
           s->set("isLinkable",TRUE);
           s->set("anchor",ex->anchor);
@@ -2696,7 +3526,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     {
       if (!m_cache.examples)
       {
-        TemplateList *exampleList = new TemplateList;
+        TemplateList *exampleList = TemplateList::alloc();
         addExamples(exampleList);
         m_cache.examples.reset(exampleList);
       }
@@ -2706,21 +3536,21 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     {
       if (!m_cache.typeConstraints && m_memberDef->typeConstraints())
       {
-        m_cache.typeConstraints.reset(new ArgumentListContext(m_memberDef->typeConstraints(),m_memberDef,relPathAsString()));
+        m_cache.typeConstraints.reset(ArgumentListContext::alloc(m_memberDef->typeConstraints(),m_memberDef,relPathAsString()));
       }
       else
       {
-        m_cache.typeConstraints.reset(new ArgumentListContext);
+        m_cache.typeConstraints.reset(ArgumentListContext::alloc());
       }
       return m_cache.typeConstraints.get();
     }
     TemplateVariant functionQualifier() const
     {
       if (!m_memberDef->isObjCMethod() &&
-          (m_memberDef->isFunction()  || m_memberDef->isSlot() || 
+          (m_memberDef->isFunction()  || m_memberDef->isSlot() ||
            m_memberDef->isPrototype() || m_memberDef->isSignal()
           )
-         ) 
+         )
       {
         return "()";
       }
@@ -2733,7 +3563,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     {
       if (!m_cache.sourceRefs)
       {
-        m_cache.sourceRefs.reset(new MemberListContext(m_memberDef->getReferencesMembers(),TRUE));
+        m_cache.sourceRefs.reset(MemberListContext::alloc(m_memberDef->getReferencesMembers(),TRUE));
       }
       return m_cache.sourceRefs.get();
     }
@@ -2741,7 +3571,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     {
       if (!m_cache.sourceRefBys)
       {
-        m_cache.sourceRefBys.reset(new MemberListContext(m_memberDef->getReferencedByMembers(),TRUE));
+        m_cache.sourceRefBys.reset(MemberListContext::alloc(m_memberDef->getReferencedByMembers(),TRUE));
       }
       return m_cache.sourceRefBys.get();
     }
@@ -2862,48 +3692,39 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     {
       Cachable() : initializerParsed(FALSE), sourceCodeParsed(FALSE)
       {
-        implementedByMembers.setAutoDelete(TRUE);
-        reimplementedByMembers.setAutoDelete(TRUE);
-        templateArgList.setAutoDelete(TRUE);
-        exampleList.setAutoDelete(TRUE);
-      }
-      ScopedPtr<ArgumentListContext> templateArgs;
-      ScopedPtr<ArgumentListContext> arguments;
-      ScopedPtr<MemberListContext>   enumValues;
-      ScopedPtr<ClassContext>        classDef;
-      ScopedPtr<ClassContext>        anonymousType;
-      ScopedPtr<TemplateList>        templateDecls;
+      }
+      SharedPtr<ArgumentListContext> templateArgs;
+      SharedPtr<ArgumentListContext> arguments;
+      SharedPtr<MemberListContext>   enumValues;
+      SharedPtr<ClassContext>        classDef;
+      SharedPtr<ClassContext>        anonymousType;
+      SharedPtr<TemplateList>        templateDecls;
       ScopedPtr<TemplateVariant>     paramDocs;
-      ScopedPtr<TemplateList>        implements;
-      ScopedPtr<MemberContext>       implementsMember;
-      ScopedPtr<TemplateList>        reimplements;
-      ScopedPtr<MemberContext>       reimplementsMember;
-      ScopedPtr<TemplateList>        implementedBy;
-      ScopedPtr<MemberListContext>   sourceRefs;
-      ScopedPtr<MemberListContext>   sourceRefBys;
+      SharedPtr<TemplateList>        implements;
+      SharedPtr<TemplateList>        reimplements;
+      SharedPtr<TemplateList>        implementedBy;
+      SharedPtr<MemberListContext>   sourceRefs;
+      SharedPtr<MemberListContext>   sourceRefBys;
       ScopedPtr<DotCallGraph>        callGraph;
       ScopedPtr<DotCallGraph>        callerGraph;
-      ScopedPtr<MemberContext>       anonymousMember;
-      QList<MemberContext>           implementedByMembers;
-      ScopedPtr<TemplateList>        reimplementedBy;
-      QList<MemberContext>           reimplementedByMembers;
-      QList<ArgumentListContext>     templateArgList;
-      ScopedPtr<TemplateList>        labels;
+      SharedPtr<MemberContext>       anonymousMember;
+      SharedPtr<TemplateList>        reimplementedBy;
+      SharedPtr<TemplateList>        labels;
       TemplateVariant                initializer;
       bool                           initializerParsed;
       TemplateVariant                sourceCode;
       bool                           sourceCodeParsed;
-      ScopedPtr<TemplateList>        examples;
-      QList<TemplateStruct>          exampleList;
-      ScopedPtr<ArgumentListContext> typeConstraints;
+      SharedPtr<TemplateList>        examples;
+      SharedPtr<TemplateList>        exampleList;
+      SharedPtr<ArgumentListContext> typeConstraints;
+      SharedPtr<TemplateList>        propertyAttrs;
+      SharedPtr<TemplateList>        eventAttrs;
     };
     mutable Cachable m_cache;
-    TemplateList m_propertyAttrs;
-    TemplateList m_eventAttrs;
 };
 //%% }
 
-MemberContext::MemberContext(MemberDef *md)
+MemberContext::MemberContext(MemberDef *md) : RefCountedContext("MemberContext")
 {
   p = new Private(md);
 }
@@ -2949,7 +3770,7 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
 };
 //%% }
 
-ModuleContext::ModuleContext(GroupDef *gd)
+ModuleContext::ModuleContext(GroupDef *gd) : RefCountedContext("ModuleContext")
 {
   p = new Private(gd);
 }
@@ -2967,11 +3788,11 @@ TemplateVariant ModuleContext::get(const char *n) const
 //------------------------------------------------------------------------
 
 //%% list NestedClassList[Class] : list of nested classes
-class NestedClassListContext::Private : public GenericNodeListContext<ClassContext>
+class NestedClassListContext::Private : public GenericNodeListContext
 {
 };
 
-NestedClassListContext::NestedClassListContext()
+NestedClassListContext::NestedClassListContext() : RefCountedContext("NestedClassListContext")
 {
   p = new Private;
 }
@@ -3001,14 +3822,55 @@ void NestedClassListContext::append(ClassDef *cd)
 {
   if (cd)
   {
-    p->append(new ClassContext(cd));
+    p->append(ClassContext::alloc(cd));
+  }
+}
+
+//------------------------------------------------------------------------
+
+//%% list NestedClassList[Class] : list of nested namespaces
+class NestedNamespaceListContext::Private : public GenericNodeListContext
+{
+};
+
+NestedNamespaceListContext::NestedNamespaceListContext() : RefCountedContext("NestedNamespaceListContext")
+{
+  p = new Private;
+}
+
+NestedNamespaceListContext::~NestedNamespaceListContext()
+{
+  delete p;
+}
+
+// TemplateListIntf
+int NestedNamespaceListContext::count() const
+{
+  return p->count();
+}
+
+TemplateVariant NestedNamespaceListContext::at(int index) const
+{
+  return p->at(index);
+}
+
+TemplateListIntf::ConstIterator *NestedNamespaceListContext::createIterator() const
+{
+  return p->createIterator();
+}
+
+void NestedNamespaceListContext::append(NamespaceDef *cd)
+{
+  if (cd)
+  {
+    p->append(NamespaceContext::alloc(cd));
   }
 }
 
 //------------------------------------------------------------------------
 
 //%% list ClassList[Class] : list of classes
-class ClassListContext::Private : public GenericNodeListContext<ClassContext>
+class ClassListContext::Private : public GenericNodeListContext
 {
   public:
     void addClasses(const ClassSDict &classSDict)
@@ -3026,13 +3888,13 @@ class ClassListContext::Private : public GenericNodeListContext<ClassContext>
         }
         if (cd->isLinkableInProject() && cd->templateMaster()==0)
         {
-          append(new ClassContext(cd));
+          append(ClassContext::alloc(cd));
         }
       }
     }
 };
 
-ClassListContext::ClassListContext()
+ClassListContext::ClassListContext() : RefCountedContext("ClassListContext")
 {
   p = new Private;
   p->addClasses(*Doxygen::classSDict);
@@ -3067,7 +3929,7 @@ TemplateListIntf::ConstIterator *ClassListContext::createIterator() const
 class ClassInheritanceNodeContext::Private : public PropertyMapper
 {
   public:
-    Private(ClassDef *cd) : m_classContext(cd)
+    Private(ClassDef *cd) : m_classDef(cd)
     {
       //%% bool is_leaf_node: true if this node does not have any children
       addProperty("is_leaf_node",this,&Private::isLeafNode);
@@ -3131,15 +3993,24 @@ class ClassInheritanceNodeContext::Private : public PropertyMapper
     }
     TemplateVariant getClass() const
     {
-      return TemplateVariant(&m_classContext);
+      if (!m_cache.classContext)
+      {
+        m_cache.classContext.reset(ClassContext::alloc(m_classDef));
+      }
+      return m_cache.classContext.get();
     }
   private:
-    GenericNodeListContext<ClassInheritanceNodeContext> m_children;
-    ClassContext m_classContext;
+    ClassDef *m_classDef;
+    GenericNodeListContext m_children;
+    struct Cachable
+    {
+      SharedPtr<ClassContext> classContext;
+    };
+    mutable Cachable m_cache;
 };
 //%% }
 
-ClassInheritanceNodeContext::ClassInheritanceNodeContext(ClassDef *cd)
+ClassInheritanceNodeContext::ClassInheritanceNodeContext(ClassDef *cd) : RefCountedContext("ClassInheritanceNodeContext")
 {
   p = new Private(cd);
 }
@@ -3162,8 +4033,7 @@ void ClassInheritanceNodeContext::addChildren(const BaseClassList *bcl,bool hide
 //------------------------------------------------------------------------
 
 //%% list ClassInheritance[ClassInheritanceNode]: list of classes
-class ClassInheritanceContext::Private : public
-    GenericNodeListContext<ClassInheritanceNodeContext>
+class ClassInheritanceContext::Private : public GenericNodeListContext
 {
   public:
     void addClasses(const ClassSDict &classSDict)
@@ -3175,7 +4045,7 @@ class ClassInheritanceContext::Private : public
         bool b;
         if (cd->getLanguage()==SrcLangExt_VHDL)
         {
-          if (!(VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS)
+          if ((VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
           {
             continue;
           }
@@ -3190,7 +4060,7 @@ class ClassInheritanceContext::Private : public
           if (cd->isVisibleInHierarchy()) // should it be visible
           {
             // new root level class
-            ClassInheritanceNodeContext *tnc = new ClassInheritanceNodeContext(cd);
+            ClassInheritanceNodeContext *tnc = ClassInheritanceNodeContext::alloc(cd);
             append(tnc);
             bool hasChildren = !cd->visited && classHasVisibleChildren(cd);
             if (cd->getLanguage()==SrcLangExt_VHDL && hasChildren)
@@ -3209,7 +4079,7 @@ class ClassInheritanceContext::Private : public
     }
 };
 
-ClassInheritanceContext::ClassInheritanceContext()
+ClassInheritanceContext::ClassInheritanceContext() : RefCountedContext("ClassInheritanceContext")
 {
   p = new Private;
   initClassHierarchy(Doxygen::classSDict);
@@ -3253,7 +4123,11 @@ class ClassHierarchyContext::Private : public PropertyMapper
   public:
     TemplateVariant tree() const
     {
-      return TemplateVariant(&m_classTree);
+      if (!m_cache.classTree)
+      {
+        m_cache.classTree.reset(ClassInheritanceContext::alloc());
+      }
+      return m_cache.classTree.get();
     }
     TemplateVariant fileName() const
     {
@@ -3294,11 +4168,15 @@ class ClassHierarchyContext::Private : public PropertyMapper
       addProperty("title",this,&Private::title);
     }
   private:
-    ClassInheritanceContext m_classTree;
+    struct Cachable
+    {
+      SharedPtr<ClassInheritanceContext> classTree;
+    };
+    mutable Cachable m_cache;
 };
 //%% }
 
-ClassHierarchyContext::ClassHierarchyContext()
+ClassHierarchyContext::ClassHierarchyContext() : RefCountedContext("ClassHierarchyContext")
 {
   p = new Private;
 }
@@ -3320,10 +4198,11 @@ TemplateVariant ClassHierarchyContext::get(const char *name) const
 class NestingNodeContext::Private : public PropertyMapper
 {
   public:
-    Private(Definition *d,bool addCls) : m_def(d),
-       m_classContext(m_def->definitionType()==Definition::TypeClass?(ClassDef*)d:0),
-       m_namespaceContext(m_def->definitionType()==Definition::TypeNamespace?(NamespaceDef*)d:0)
+    Private(const NestingNodeContext *parent,const NestingNodeContext *thisNode,
+        Definition *d,int index,int level,bool addCls)
+      : m_parent(parent), m_def(d), m_level(level), m_index(index)
     {
+      m_children.reset(NestingContext::alloc(thisNode,level+1));
       //%% bool is_leaf_node: true if this node does not have any children
       addProperty("is_leaf_node",this,&Private::isLeafNode);
       //%% Nesting children: list of nested classes/namespaces
@@ -3332,22 +4211,44 @@ class NestingNodeContext::Private : public PropertyMapper
       addProperty("class",this,&Private::getClass);
       //%% [optional] Namespace namespace: namespace info (if this node represents a namespace)
       addProperty("namespace",this,&Private::getNamespace);
+      //%% [optional] File file: file info (if this node represents a file)
+      addProperty("file",this,&Private::getFile);
+      //%% [optional] Dir dir: directory info (if this node represents a directory)
+      addProperty("dir",this,&Private::getDir);
+      //%% int id
+      addProperty("id",this,&Private::id);
+      //%% string level
+      addProperty("level",this,&Private::level);
+      //%% string name
+      addProperty("name",this,&Private::name);
+      //%% string brief
+      addProperty("brief",this,&Private::brief);
+      //%% bool isLinkable
+      addProperty("isLinkable",this,&Private::isLinkable);
+      addProperty("anchor",this,&Private::anchor);
+      addProperty("fileName",this,&Private::fileName);
+
       addNamespaces(addCls);
       addClasses();
+      addDirFiles();
     }
     TemplateVariant isLeafNode() const
     {
-      return m_children.count()==0;
+      return m_children->count()==0;
     }
     TemplateVariant children() const
     {
-      return TemplateVariant(&m_children);
+      return m_children.get();
     }
     TemplateVariant getClass() const
     {
-      if (m_def->definitionType()==Definition::TypeClass)
+      if (!m_cache.classContext && m_def->definitionType()==Definition::TypeClass)
+      {
+        m_cache.classContext.reset(ClassContext::alloc((ClassDef*)m_def));
+      }
+      if (m_cache.classContext)
       {
-        return TemplateVariant(&m_classContext);
+        return m_cache.classContext.get();
       }
       else
       {
@@ -3356,21 +4257,104 @@ class NestingNodeContext::Private : public PropertyMapper
     }
     TemplateVariant getNamespace() const
     {
-      if (m_def->definitionType()==Definition::TypeNamespace)
+      if (!m_cache.namespaceContext && m_def->definitionType()==Definition::TypeNamespace)
+      {
+        m_cache.namespaceContext.reset(NamespaceContext::alloc((NamespaceDef*)m_def));
+      }
+      if (m_cache.namespaceContext)
+      {
+        return m_cache.namespaceContext.get();
+      }
+      else
+      {
+        return TemplateVariant(FALSE);
+      }
+    }
+    TemplateVariant getDir() const
+    {
+      if (!m_cache.dirContext && m_def->definitionType()==Definition::TypeDir)
+      {
+        m_cache.dirContext.reset(DirContext::alloc((DirDef*)m_def));
+      }
+      if (m_cache.dirContext)
+      {
+        return m_cache.dirContext.get();
+      }
+      else
+      {
+        return TemplateVariant(FALSE);
+      }
+    }
+    TemplateVariant getFile() const
+    {
+      if (!m_cache.fileContext && m_def->definitionType()==Definition::TypeFile)
+      {
+        m_cache.fileContext.reset(FileContext::alloc((FileDef*)m_def));
+      }
+      if (m_cache.fileContext)
       {
-        return TemplateVariant(&m_namespaceContext);
+        return m_cache.fileContext.get();
       }
       else
       {
         return TemplateVariant(FALSE);
       }
     }
+    TemplateVariant level() const
+    {
+      return m_level;
+    }
+    TemplateVariant id() const
+    {
+      QCString result;
+      if (m_parent) result=m_parent->id();
+      result+=QCString().setNum(m_index)+"_";
+      return result;
+    }
+    TemplateVariant name() const
+    {
+      return m_def->displayName(FALSE);
+    }
+    QCString relPathAsString() const
+    {
+      static bool createSubdirs = Config_getBool("CREATE_SUBDIRS");
+      return createSubdirs ? QCString("../../") : QCString("");
+    }
+    TemplateVariant brief() const
+    {
+      if (!m_cache.brief)
+      {
+        if (m_def->hasBriefDescription())
+        {
+          m_cache.brief.reset(new TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(),
+                              "",m_def->briefDescription(),TRUE)));
+        }
+        else
+        {
+          m_cache.brief.reset(new TemplateVariant(""));
+        }
+      }
+      return *m_cache.brief;
+    }
+    TemplateVariant isLinkable() const
+    {
+      return m_def->isLinkable();
+    }
+    TemplateVariant anchor() const
+    {
+      return m_def->anchor();
+    }
+    TemplateVariant fileName() const
+    {
+      return m_def->getOutputFileBase();
+    }
+
     void addClasses()
     {
       ClassDef *cd = m_def->definitionType()==Definition::TypeClass ? (ClassDef*)m_def : 0;
       if (cd && cd->getClassSDict())
       {
-        m_children.addClasses(*cd->getClassSDict(),FALSE);
+        m_children->addClasses(*cd->getClassSDict(),FALSE);
       }
     }
     void addNamespaces(bool addClasses)
@@ -3378,24 +4362,47 @@ class NestingNodeContext::Private : public PropertyMapper
       NamespaceDef *nd = m_def->definitionType()==Definition::TypeNamespace ? (NamespaceDef*)m_def : 0;
       if (nd && nd->getNamespaceSDict())
       {
-        m_children.addNamespaces(*nd->getNamespaceSDict(),FALSE,addClasses);
+        m_children->addNamespaces(*nd->getNamespaceSDict(),FALSE,addClasses);
       }
       if (addClasses && nd && nd->getClassSDict())
       {
-        m_children.addClasses(*nd->getClassSDict(),FALSE);
+        m_children->addClasses(*nd->getClassSDict(),FALSE);
+      }
+    }
+    void addDirFiles()
+    {
+      DirDef *dd = m_def->definitionType()==Definition::TypeDir ? (DirDef*)m_def : 0;
+      if (dd)
+      {
+        m_children->addDirs(dd->subDirs());
+        if (dd && dd->getFiles())
+        {
+          m_children->addFiles(*dd->getFiles());
+        }
       }
     }
-    Definition *m_def;
   private:
-    NestingContext m_children;
-    ClassContext m_classContext;
-    NamespaceContext m_namespaceContext;
+    const NestingNodeContext *m_parent;
+    Definition *m_def;
+    SharedPtr<NestingContext> m_children;
+    int m_level;
+    int m_index;
+    struct Cachable
+    {
+      SharedPtr<ClassContext>     classContext;
+      SharedPtr<NamespaceContext> namespaceContext;
+      SharedPtr<DirContext>       dirContext;
+      SharedPtr<FileContext>      fileContext;
+      ScopedPtr<TemplateVariant>  brief;
+    };
+    mutable Cachable m_cache;
 };
 //%% }
 
-NestingNodeContext::NestingNodeContext(Definition *d,bool addClass)
+NestingNodeContext::NestingNodeContext(const NestingNodeContext *parent,
+                                       Definition *d,int index,int level,bool addClass) : RefCountedContext("NestingNodeContext")
 {
-  p = new Private(d,addClass);
+  p = new Private(parent,this,d,index,level,addClass);
 }
 
 NestingNodeContext::~NestingNodeContext()
@@ -3408,12 +4415,20 @@ TemplateVariant NestingNodeContext::get(const char *n) const
   return p->get(n);
 }
 
+QCString NestingNodeContext::id() const
+{
+  return p->id().toString();
+}
+
 //------------------------------------------------------------------------
 
 //%% list Nesting[NestingNode]: namespace and class nesting relations
-class NestingContext::Private : public GenericNodeListContext<NestingNodeContext>
+class NestingContext::Private : public GenericNodeListContext
 {
   public:
+    Private(const NestingNodeContext *parent,int level)
+      : m_parent(parent), m_level(level), m_index(0) {}
+
     void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses)
     {
       NamespaceSDict::Iterator nli(nsDict);
@@ -3427,8 +4442,9 @@ class NestingContext::Private : public GenericNodeListContext<NestingNodeContext
           bool isLinkable  = nd->isLinkableInProject();
           if (isLinkable || hasChildren)
           {
-            NestingNodeContext *nnc = new NestingNodeContext(nd,addClasses);
+            NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,nd,m_index,m_level,addClasses);
             append(nnc);
+            m_index++;
           }
         }
       }
@@ -3455,17 +4471,73 @@ class NestingContext::Private : public GenericNodeListContext<NestingNodeContext
         {
           if (classVisibleInIndex(cd) && cd->templateMaster()==0)
           {
-            NestingNodeContext *nnc = new NestingNodeContext(cd,TRUE);
+            NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE);
             append(nnc);
+            m_index++;
+          }
+        }
+      }
+    }
+    void addDirs(const DirSDict &dirDict)
+    {
+      SDict<DirDef>::Iterator dli(dirDict);
+      DirDef *dd;
+      for (dli.toFirst();(dd=dli.current());++dli)
+      {
+        if (dd->getOuterScope()==Doxygen::globalScope)
+        {
+          append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE));
+          m_index++;
+        }
+      }
+    }
+    void addDirs(const DirList &dirList)
+    {
+      QListIterator<DirDef> li(dirList);
+      DirDef *dd;
+      for (li.toFirst();(dd=li.current());++li)
+      {
+        append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE));
+        m_index++;
+      }
+    }
+    void addFiles(const FileNameList &fnList)
+    {
+      FileNameListIterator fnli(fnList);
+      FileName *fn;
+      for (fnli.toFirst();(fn=fnli.current());++fnli)
+      {
+        FileNameIterator fni(*fn);
+        FileDef *fd;
+        for (;(fd=fni.current());++fni)
+        {
+          if (fd->getDirDef()==0) // top level file
+          {
+            append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE));
+            m_index++;
           }
         }
       }
     }
+    void addFiles(const FileList &fList)
+    {
+      QListIterator<FileDef> li(fList);
+      FileDef *fd;
+      for (li.toFirst();(fd=li.current());++li)
+      {
+        append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE));
+        m_index++;
+      }
+    }
+  private:
+    const NestingNodeContext *m_parent;
+    int m_level;
+    int m_index;
 };
 
-NestingContext::NestingContext()
+NestingContext::NestingContext(const NestingNodeContext *parent,int level) : RefCountedContext("NestingContext")
 {
-  p = new Private;
+  p = new Private(parent,level);
 }
 
 NestingContext::~NestingContext()
@@ -3499,16 +4571,129 @@ void NestingContext::addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bo
   p->addNamespaces(nsDict,rootOnly,addClasses);
 }
 
+void NestingContext::addDirs(const DirSDict &dirs)
+{
+  p->addDirs(dirs);
+}
+
+void NestingContext::addDirs(const DirList &dirs)
+{
+  p->addDirs(dirs);
+}
+
+void NestingContext::addFiles(const FileNameList &files)
+{
+  p->addFiles(files);
+}
+
+void NestingContext::addFiles(const FileList &files)
+{
+  p->addFiles(files);
+}
+
+
 //------------------------------------------------------------------------
 
+static int computeMaxDepth(const TemplateListIntf *list)
+{
+  int maxDepth=0;
+  if (list)
+  {
+    TemplateListIntf::ConstIterator *it = list->createIterator();
+    TemplateVariant v;
+    for (it->toFirst();it->current(v);it->toNext())
+    {
+      const TemplateStructIntf *s = v.toStruct();
+      TemplateVariant child = s->get("children");
+      int d = computeMaxDepth(child.toList())+1;
+      if (d>maxDepth) maxDepth=d;
+    }
+    delete it;
+  }
+  return maxDepth;
+}
+
+static int computeNumNodesAtLevel(const TemplateStructIntf *s,int level,int maxLevel)
+{
+  int num=0;
+  if (level<maxLevel)
+  {
+    num++;
+    TemplateVariant child = s->get("children");
+    if (child.toList())
+    {
+      TemplateListIntf::ConstIterator *it = child.toList()->createIterator();
+      TemplateVariant v;
+      for (it->toFirst();it->current(v);it->toNext())
+      {
+        num+=computeNumNodesAtLevel(v.toStruct(),level+1,maxLevel);
+      }
+      delete it;
+    }
+  }
+  return num;
+}
+
+static int computePreferredDepth(const TemplateListIntf *list,int maxDepth)
+{
+  int preferredNumEntries = Config_getInt("HTML_INDEX_NUM_ENTRIES");
+  int preferredDepth=1;
+  if (preferredNumEntries>0)
+  {
+    int depth = maxDepth;
+    for (int i=1;i<=depth;i++)
+    {
+      int num=0;
+      TemplateListIntf::ConstIterator *it = list->createIterator();
+      TemplateVariant v;
+      for (it->toFirst();it->current(v);it->toNext())
+      {
+        num+=computeNumNodesAtLevel(v.toStruct(),0,i);
+      }
+      delete it;
+      if (num<=preferredNumEntries)
+      {
+        preferredDepth=i;
+      }
+      else
+      {
+        break;
+      }
+    }
+  }
+  return preferredDepth;
+}
+
+
 //%% struct ClassTree: Class nesting relations
 //%% {
 class ClassTreeContext::Private : public PropertyMapper
 {
   public:
+    Private()
+    {
+      m_classTree.reset(NestingContext::alloc(0,0));
+      if (Doxygen::namespaceSDict)
+      {
+        m_classTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,TRUE);
+      }
+      if (Doxygen::classSDict)
+      {
+        m_classTree->addClasses(*Doxygen::classSDict,TRUE);
+      }
+      //%% Nesting tree
+      addProperty("tree",this,&Private::tree);
+      addProperty("fileName",this,&Private::fileName);
+      addProperty("relPath",this,&Private::relPath);
+      addProperty("highlight",this,&Private::highlight);
+      addProperty("subhighlight",this,&Private::subhighlight);
+      addProperty("title",this,&Private::title);
+      addProperty("preferredDepth",this,&Private::preferredDepth);
+      addProperty("maxDepth",this,&Private::maxDepth);
+    }
     TemplateVariant tree() const
     {
-      return TemplateVariant(&m_classTree);
+      return m_classTree.get();
     }
     TemplateVariant fileName() const
     {
@@ -3543,30 +4728,39 @@ class ClassTreeContext::Private : public PropertyMapper
         return theTranslator->trClasses();
       }
     }
-    Private()
+    TemplateVariant maxDepth() const
     {
-      if (Doxygen::namespaceSDict)
+      if (!m_cache.maxDepthComputed)
       {
-        m_classTree.addNamespaces(*Doxygen::namespaceSDict,TRUE,TRUE);
+        m_cache.maxDepth = computeMaxDepth(m_classTree.get());
+        m_cache.maxDepthComputed=TRUE;
       }
-      if (Doxygen::classSDict)
+      return m_cache.maxDepth;
+    }
+    TemplateVariant preferredDepth() const
+    {
+      if (!m_cache.preferredDepthComputed)
       {
-        m_classTree.addClasses(*Doxygen::classSDict,TRUE);
+        m_cache.preferredDepth = computePreferredDepth(m_classTree.get(),maxDepth().toInt());
+        m_cache.preferredDepthComputed=TRUE;
       }
-      //%% Nesting tree
-      addProperty("tree",this,&Private::tree);
-      addProperty("fileName",this,&Private::fileName);
-      addProperty("relPath",this,&Private::relPath);
-      addProperty("highlight",this,&Private::highlight);
-      addProperty("subhighlight",this,&Private::subhighlight);
-      addProperty("title",this,&Private::title);
+      return m_cache.preferredDepth;
     }
   private:
-    NestingContext m_classTree;
+    SharedPtr<NestingContext> m_classTree;
+    struct Cachable
+    {
+      Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
+      int   maxDepth;
+      bool  maxDepthComputed;
+      int   preferredDepth;
+      bool  preferredDepthComputed;
+    };
+    mutable Cachable m_cache;
 };
 //%% }
 
-ClassTreeContext::ClassTreeContext()
+ClassTreeContext::ClassTreeContext() : RefCountedContext("ClassTreeContext")
 {
   p = new Private;
 }
@@ -3584,7 +4778,7 @@ TemplateVariant ClassTreeContext::get(const char *name) const
 //------------------------------------------------------------------------
 
 //%% list NamespaceList[Namespace] : list of namespaces
-class NamespaceListContext::Private : public GenericNodeListContext<NamespaceContext>
+class NamespaceListContext::Private : public GenericNodeListContext
 {
   public:
     void addNamespaces(const NamespaceSDict &nsDict)
@@ -3595,13 +4789,13 @@ class NamespaceListContext::Private : public GenericNodeListContext<NamespaceCon
       {
         if (nd->isLinkableInProject())
         {
-          append(new NamespaceContext(nd));
+          append(NamespaceContext::alloc(nd));
         }
       }
     }
 };
 
-NamespaceListContext::NamespaceListContext()
+NamespaceListContext::NamespaceListContext() : RefCountedContext("NamespaceListContext")
 {
   p = new Private;
   p->addNamespaces(*Doxygen::namespaceSDict);
@@ -3675,9 +4869,10 @@ class NamespaceTreeContext::Private : public PropertyMapper
     }
     Private()
     {
+      m_namespaceTree.reset(NestingContext::alloc(0,0));
       if (Doxygen::namespaceSDict)
       {
-        m_namespaceTree.addNamespaces(*Doxygen::namespaceSDict,TRUE,FALSE);
+        m_namespaceTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,FALSE);
       }
       //%% Nesting tree
       addProperty("tree",this,&Private::tree);
@@ -3688,11 +4883,11 @@ class NamespaceTreeContext::Private : public PropertyMapper
       addProperty("title",this,&Private::title);
     }
   private:
-    NestingContext m_namespaceTree;
+    SharedPtr<NestingContext> m_namespaceTree;
 };
 //%% }
 
-NamespaceTreeContext::NamespaceTreeContext()
+NamespaceTreeContext::NamespaceTreeContext() : RefCountedContext("NamespaceTreeContext")
 {
   p = new Private;
 }
@@ -3710,7 +4905,7 @@ TemplateVariant NamespaceTreeContext::get(const char *name) const
 //------------------------------------------------------------------------
 
 //%% list FileList[File] : list of files
-class FileListContext::Private : public GenericNodeListContext<FileContext>
+class FileListContext::Private : public GenericNodeListContext
 {
   public:
     void addFiles(const FileNameList &fnList)
@@ -3729,14 +4924,14 @@ class FileListContext::Private : public GenericNodeListContext<FileContext>
           bool nameOk = !fd->isDocumentationFile();
           if (nameOk && (doc || src) && !fd->isReference())
           {
-            append(new FileContext(fd));
+            append(FileContext::alloc(fd));
           }
         }
       }
     }
 };
 
-FileListContext::FileListContext()
+FileListContext::FileListContext() : RefCountedContext("FileListContext")
 {
   p = new Private;
   if (Doxygen::inputNameList) p->addFiles(*Doxygen::inputNameList);
@@ -3765,246 +4960,100 @@ TemplateListIntf::ConstIterator *FileListContext::createIterator() const
 
 //------------------------------------------------------------------------
 
-//%% list UsedFiles[File] : list of files
-class UsedFilesContext::Private : public GenericNodeListContext<FileContext>
+//%% list DirList[Dir] : list of files
+class DirListContext::Private : public GenericNodeListContext
 {
   public:
-    void addFile(FileDef *fd)
+    Private()
     {
-      append(new FileContext(fd));
+      DirDef *dir;
+      DirSDict::Iterator sdi(*Doxygen::directories);
+      for (sdi.toFirst();(dir=sdi.current());++sdi)
+      {
+        append(DirContext::alloc(dir));
+      }
     }
 };
 
-UsedFilesContext::UsedFilesContext(ClassDef *cd)
+DirListContext::DirListContext() : RefCountedContext("DirListContext")
 {
   p = new Private;
-  if (cd)
-  {
-    QListIterator<FileDef> li(cd->usedFiles());
-    FileDef *fd;
-    for (li.toFirst();(fd=li.current());++li)
-    {
-      p->addFile(fd);
-    }
-  }
 }
 
-UsedFilesContext::~UsedFilesContext()
+DirListContext::~DirListContext()
 {
   delete p;
 }
 
 // TemplateListIntf
-int UsedFilesContext::count() const
+int DirListContext::count() const
 {
   return p->count();
 }
 
-TemplateVariant UsedFilesContext::at(int index) const
+TemplateVariant DirListContext::at(int index) const
 {
   return p->at(index);
 }
 
-TemplateListIntf::ConstIterator *UsedFilesContext::createIterator() const
+TemplateListIntf::ConstIterator *DirListContext::createIterator() const
 {
   return p->createIterator();
 }
 
-void UsedFilesContext::addFile(FileDef *fd)
-{
-  p->addFile(fd);
-}
 
 //------------------------------------------------------------------------
 
-
-//%% struct DirFileNode: node is a directory hierarchy
-//%% {
-class DirFileNodeContext::Private : public PropertyMapper
+//%% list UsedFiles[File] : list of files
+class UsedFilesContext::Private : public GenericNodeListContext
 {
   public:
-    Private(Definition *d) : m_def(d),
-       m_dirContext (m_def->definitionType()==Definition::TypeDir  ? (DirDef*)d  : 0),
-       m_fileContext(m_def->definitionType()==Definition::TypeFile ? (FileDef*)d : 0)
-    {
-      //%% bool is_leaf_node: true if this node does not have any children
-      addProperty("is_leaf_node",this,&Private::isLeafNode);
-      //%% DirFile children: list of nested classes/namespaces
-      addProperty("children",this,&Private::children);
-      //%% [optional] Dir dir: directory info (if this node represents a directory)
-      addProperty("dir",this,&Private::getDir);
-      //%% [optional] File file: file info (if this node represents a file)
-      addProperty("file",this,&Private::getFile);
-      addDirFiles();
-    }
-    TemplateVariant isLeafNode() const
-    {
-      return m_children.count()==0;
-    }
-    TemplateVariant children() const
-    {
-      return TemplateVariant(&m_children);
-    }
-    TemplateVariant getDir() const
-    {
-      if (m_def->definitionType()==Definition::TypeDir)
-      {
-        return TemplateVariant(&m_dirContext);
-      }
-      else
-      {
-        return TemplateVariant(FALSE);
-      }
-    }
-    TemplateVariant getFile() const
-    {
-      if (m_def->definitionType()==Definition::TypeFile)
-      {
-        return TemplateVariant(&m_fileContext);
-      }
-      else
-      {
-        return TemplateVariant(FALSE);
-      }
-    }
-    void addDirFiles()
+    void addFile(FileDef *fd)
     {
-      DirDef *dd = m_def->definitionType()==Definition::TypeDir ? (DirDef*)m_def : 0;
-      if (dd)
-      {
-        m_children.addDirs(dd->subDirs());
-        if (dd && dd->getFiles())
-        {
-          m_children.addFiles(*dd->getFiles());
-        }
-      }
+      append(FileContext::alloc(fd));
     }
-  private:
-    Definition *m_def;
-    DirFileContext m_children;
-    DirContext m_dirContext;
-    FileContext m_fileContext;
 };
-//%% }
-
-DirFileNodeContext::DirFileNodeContext(Definition *d)
-{
-  p = new Private(d);
-}
-
-DirFileNodeContext::~DirFileNodeContext()
-{
-  delete p;
-}
 
-TemplateVariant DirFileNodeContext::get(const char *n) const
+UsedFilesContext::UsedFilesContext(ClassDef *cd) : RefCountedContext("UsedFilesContext")
 {
-  return p->get(n);
-}
-
-
-//------------------------------------------------------------------------
-
-//%% list DirFile[DirFileNode]: list of directories and/or files
-class DirFileContext::Private : public GenericNodeListContext<DirFileNodeContext>
-{
-  public:
-    void addDirs(const DirSDict &dirDict)
-    {
-      SDict<DirDef>::Iterator dli(dirDict);
-      DirDef *dd;
-      for (dli.toFirst();(dd=dli.current());++dli)
-      {
-        if (dd->getOuterScope()==Doxygen::globalScope)
-        {
-          append(new DirFileNodeContext(dd));
-        }
-      }
-    }
-    void addDirs(const DirList &dirList)
-    {
-      QListIterator<DirDef> li(dirList);
-      DirDef *dd;
-      for (li.toFirst();(dd=li.current());++li)
-      {
-        append(new DirFileNodeContext(dd));
-      }
-    }
-    void addFiles(const FileNameList &fnList)
-    {
-      FileNameListIterator fnli(fnList);
-      FileName *fn;
-      for (fnli.toFirst();(fn=fnli.current());++fnli)
-      {
-        FileNameIterator fni(*fn);
-        FileDef *fd;
-        for (;(fd=fni.current());++fni)
-        {
-          if (fd->getDirDef()==0) // top level file
-          {
-            append(new DirFileNodeContext(fd));
-          }
-        }
-      }
-    }
-    void addFiles(const FileList &fList)
+  p = new Private;
+  if (cd)
+  {
+    QListIterator<FileDef> li(cd->usedFiles());
+    FileDef *fd;
+    for (li.toFirst();(fd=li.current());++li)
     {
-      QListIterator<FileDef> li(fList);
-      FileDef *fd;
-      for (li.toFirst();(fd=li.current());++li)
-      {
-        append(new DirFileNodeContext(fd));
-      }
+      p->addFile(fd);
     }
-};
-
-DirFileContext::DirFileContext()
-{
-  p = new Private;
+  }
 }
 
-DirFileContext::~DirFileContext()
+UsedFilesContext::~UsedFilesContext()
 {
   delete p;
 }
 
 // TemplateListIntf
-int DirFileContext::count() const
+int UsedFilesContext::count() const
 {
   return p->count();
 }
 
-TemplateVariant DirFileContext::at(int index) const
+TemplateVariant UsedFilesContext::at(int index) const
 {
   return p->at(index);
 }
 
-TemplateListIntf::ConstIterator *DirFileContext::createIterator() const
+TemplateListIntf::ConstIterator *UsedFilesContext::createIterator() const
 {
   return p->createIterator();
 }
 
-void DirFileContext::addDirs(const DirSDict &dirs)
-{
-  p->addDirs(dirs);
-}
-
-void DirFileContext::addDirs(const DirList &dirs)
-{
-  p->addDirs(dirs);
-}
-
-void DirFileContext::addFiles(const FileNameList &files)
-{
-  p->addFiles(files);
-}
-
-void DirFileContext::addFiles(const FileList &files)
+void UsedFilesContext::addFile(FileDef *fd)
 {
-  p->addFiles(files);
+  p->addFile(fd);
 }
 
-
 //------------------------------------------------------------------------
 
 //%% struct FileTree: tree of directories and files
@@ -4012,6 +5061,28 @@ void DirFileContext::addFiles(const FileList &files)
 class FileTreeContext::Private : public PropertyMapper
 {
   public:
+    Private()
+    {
+      // Add dirs tree
+      m_dirFileTree.reset(NestingContext::alloc(0,0));
+      if (Doxygen::directories)
+      {
+        m_dirFileTree->addDirs(*Doxygen::directories);
+      }
+      if (Doxygen::inputNameList)
+      {
+        m_dirFileTree->addFiles(*Doxygen::inputNameList);
+      }
+      //%% DirFile tree:
+      addProperty("tree",this,&Private::tree);
+      addProperty("fileName",this,&Private::fileName);
+      addProperty("relPath",this,&Private::relPath);
+      addProperty("highlight",this,&Private::highlight);
+      addProperty("subhighlight",this,&Private::subhighlight);
+      addProperty("title",this,&Private::title);
+      addProperty("preferredDepth",this,&Private::preferredDepth);
+      addProperty("maxDepth",this,&Private::maxDepth);
+    }
     TemplateVariant tree() const
     {
       return TemplateVariant(&m_dirFileTree);
@@ -4036,31 +5107,39 @@ class FileTreeContext::Private : public PropertyMapper
     {
       return theTranslator->trFileList();
     }
-    Private()
+    TemplateVariant maxDepth() const
     {
-      // Add dirs tree
-      if (Doxygen::directories)
+      if (!m_cache.maxDepthComputed)
       {
-        m_dirFileTree.addDirs(*Doxygen::directories);
+        m_cache.maxDepth = computeMaxDepth(m_dirFileTree.get());
+        m_cache.maxDepthComputed=TRUE;
       }
-      if (Doxygen::inputNameList)
+      return m_cache.maxDepth;
+    }
+    TemplateVariant preferredDepth() const
+    {
+      if (!m_cache.preferredDepthComputed)
       {
-        m_dirFileTree.addFiles(*Doxygen::inputNameList);
+        m_cache.preferredDepth = computePreferredDepth(m_dirFileTree.get(),maxDepth().toInt());
+        m_cache.preferredDepthComputed=TRUE;
       }
-      //%% DirFile tree:
-      addProperty("tree",this,&Private::tree);
-      addProperty("fileName",this,&Private::fileName);
-      addProperty("relPath",this,&Private::relPath);
-      addProperty("highlight",this,&Private::highlight);
-      addProperty("subhighlight",this,&Private::subhighlight);
-      addProperty("title",this,&Private::title);
+      return m_cache.preferredDepth;
     }
   private:
-    DirFileContext m_dirFileTree;
+    SharedPtr<NestingContext> m_dirFileTree;
+    struct Cachable
+    {
+      Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
+      int   maxDepth;
+      bool  maxDepthComputed;
+      int   preferredDepth;
+      bool  preferredDepthComputed;
+    };
+    mutable Cachable m_cache;
 };
 //%% }
 
-FileTreeContext::FileTreeContext()
+FileTreeContext::FileTreeContext() : RefCountedContext("FileTreeContext")
 {
   p = new Private;
 }
@@ -4082,8 +5161,10 @@ TemplateVariant FileTreeContext::get(const char *name) const
 class PageNodeContext::Private : public PropertyMapper
 {
   public:
-    Private(PageDef *pd) : m_pageDef(pd), m_pageContext(pd)
+    Private(PageDef *pd) : m_pageDef(pd)
     {
+      m_children.reset(PageNodeListContext::alloc());
+      m_pageContext.reset(PageContext::alloc(pd));
       //%% bool is_leaf_node: true if this node does not have any children
       addProperty("is_leaf_node",this,&Private::isLeafNode);
       //%% PageList children: list of nested classes/namespaces
@@ -4094,31 +5175,31 @@ class PageNodeContext::Private : public PropertyMapper
     }
     TemplateVariant isLeafNode() const
     {
-      return m_children.count()==0;
+      return m_children->count()==0;
     }
     TemplateVariant children() const
     {
-      return TemplateVariant(&m_children);
+      return m_children.get();
     }
     TemplateVariant getPage() const
     {
-      return TemplateVariant(&m_pageContext);
+      return m_pageContext.get();
     }
     void addPages()
     {
       if (m_pageDef->getSubPages())
       {
-        m_children.addPages(*m_pageDef->getSubPages(),FALSE);
+        m_children->addPages(*m_pageDef->getSubPages(),FALSE);
       }
     }
   private:
-    PageDef *m_pageDef;
-    PageNodeListContext m_children;
-    PageContext m_pageContext;
+    PageDef                       *m_pageDef;
+    SharedPtr<PageNodeListContext> m_children;
+    SharedPtr<PageContext>         m_pageContext;
 };
 //%% }
 
-PageNodeContext::PageNodeContext(PageDef *pd)
+PageNodeContext::PageNodeContext(PageDef *pd) : RefCountedContext("PageNodeContext")
 {
   p = new Private(pd);
 }
@@ -4136,7 +5217,7 @@ TemplateVariant PageNodeContext::get(const char *n) const
 //------------------------------------------------------------------------
 
 //%% list PageList[PageNode]: list of directories and/or files
-class PageNodeListContext::Private : public GenericNodeListContext<PageNodeContext>
+class PageNodeListContext::Private : public GenericNodeListContext
 {
   public:
     void addPages(const PageSDict &pages,bool rootOnly)
@@ -4149,13 +5230,13 @@ class PageNodeListContext::Private : public GenericNodeListContext<PageNodeConte
             pd->getOuterScope()==0 ||
             pd->getOuterScope()->definitionType()!=Definition::TypePage)
         {
-          append(new PageNodeContext(pd));
+          append(PageNodeContext::alloc(pd));
         }
       }
     }
 };
 
-PageNodeListContext::PageNodeListContext()
+PageNodeListContext::PageNodeListContext() : RefCountedContext("PageNodeListContext")
 {
   p = new Private;
 }
@@ -4195,7 +5276,7 @@ class PageTreeContext::Private : public PropertyMapper
   public:
     TemplateVariant tree() const
     {
-      return TemplateVariant(&m_pageList);
+      return m_pageList.get();
     }
     TemplateVariant fileName() const
     {
@@ -4219,10 +5300,11 @@ class PageTreeContext::Private : public PropertyMapper
     }
     Private()
     {
+      m_pageList.reset(PageNodeListContext::alloc());
       // Add pages
       if (Doxygen::pageSDict)
       {
-        m_pageList.addPages(*Doxygen::pageSDict,TRUE);
+        m_pageList->addPages(*Doxygen::pageSDict,TRUE);
       }
 
       //%% PageNodeList tree:
@@ -4234,11 +5316,11 @@ class PageTreeContext::Private : public PropertyMapper
       addProperty("title",this,&Private::title);
     }
   private:
-    PageNodeListContext m_pageList;
+    SharedPtr<PageNodeListContext> m_pageList;
 };
 //%% }
 
-PageTreeContext::PageTreeContext()
+PageTreeContext::PageTreeContext() : RefCountedContext("PageTreeContext")
 {
   p = new Private;
 }
@@ -4262,7 +5344,7 @@ class PageListContext::Private : public PropertyMapper
   public:
     TemplateVariant items() const
     {
-      return TemplateVariant(&m_pageList);
+      return m_pageList.get();
     }
     TemplateVariant fileName() const
     {
@@ -4286,6 +5368,7 @@ class PageListContext::Private : public PropertyMapper
     }
     Private()
     {
+      m_pageList.reset(new GenericNodeListContext);
       // Add pages
       PageSDict::Iterator pdi(*Doxygen::pageSDict);
       PageDef *pd=0;
@@ -4293,7 +5376,7 @@ class PageListContext::Private : public PropertyMapper
       {
         if (!pd->getGroupDef() && !pd->isReference())
         {
-          m_pageList.append(new PageContext(pd));
+          m_pageList->append(PageContext::alloc(pd));
         }
       }
 
@@ -4306,11 +5389,11 @@ class PageListContext::Private : public PropertyMapper
       addProperty("title",this,&Private::title);
     }
   private:
-    GenericNodeListContext<PageContext> m_pageList;
+    SharedPtr<GenericNodeListContext> m_pageList;
 };
 //%% }
 
-PageListContext::PageListContext()
+PageListContext::PageListContext() : RefCountedContext("PageListContext")
 {
   p = new Private;
 }
@@ -4333,8 +5416,10 @@ TemplateVariant PageListContext::get(const char *name) const
 class ModuleNodeContext::Private : public PropertyMapper
 {
   public:
-    Private(GroupDef *gd) : m_groupDef(gd), m_moduleContext(gd)
+    Private(GroupDef *gd) : m_groupDef(gd)
     {
+      m_children.reset(ModuleListContext::alloc());
+      m_moduleContext.reset(ModuleContext::alloc(gd));
       //%% bool is_leaf_node: true if this node does not have any children
       addProperty("is_leaf_node",this,&Private::isLeafNode);
       //%% ModuleList children: list of submodules
@@ -4345,31 +5430,31 @@ class ModuleNodeContext::Private : public PropertyMapper
     }
     TemplateVariant isLeafNode() const
     {
-      return m_children.count()==0;
+      return m_children->count()==0;
     }
     TemplateVariant children() const
     {
-      return TemplateVariant(&m_children);
+      return m_children.get();
     }
     TemplateVariant getModule() const
     {
-      return TemplateVariant(&m_moduleContext);
+      return m_moduleContext.get();
     }
     void addModules()
     {
       if (m_groupDef->getSubGroups())
       {
-        m_children.addModules(*m_groupDef->getSubGroups());
+        m_children->addModules(*m_groupDef->getSubGroups());
       }
     }
   private:
-    GroupDef *m_groupDef;
-    ModuleListContext m_children;
-    ModuleContext m_moduleContext;
+    GroupDef                    *m_groupDef;
+    SharedPtr<ModuleListContext> m_children;
+    SharedPtr<ModuleContext>     m_moduleContext;
 };
 //%% }
 
-ModuleNodeContext::ModuleNodeContext(GroupDef *gd)
+ModuleNodeContext::ModuleNodeContext(GroupDef *gd) : RefCountedContext("ModuleNodeContext")
 {
   p = new Private(gd);
 }
@@ -4387,7 +5472,7 @@ TemplateVariant ModuleNodeContext::get(const char *n) const
 //------------------------------------------------------------------------
 
 //%% list ModuleList[ModuleNode]: list of directories and/or files
-class ModuleListContext::Private : public GenericNodeListContext<ModuleNodeContext>
+class ModuleListContext::Private : public GenericNodeListContext
 {
   public:
     void addModules(const GroupSDict &modules)
@@ -4399,7 +5484,7 @@ class ModuleListContext::Private : public GenericNodeListContext<ModuleNodeConte
       {
         if (!gd->isASubGroup() && gd->isVisible() && (!gd->isReference() || externalGroups))
         {
-          append(new ModuleNodeContext(gd));
+          append(ModuleNodeContext::alloc(gd));
         }
       }
     }
@@ -4409,12 +5494,12 @@ class ModuleListContext::Private : public GenericNodeListContext<ModuleNodeConte
       GroupDef *gd;
       for (gli.toFirst();(gd=gli.current());++gli)
       {
-        append(new ModuleNodeContext(gd));
+        append(ModuleNodeContext::alloc(gd));
       }
     }
 };
 
-ModuleListContext::ModuleListContext()
+ModuleListContext::ModuleListContext() : RefCountedContext("ModuleListContext")
 {
   p = new Private;
 }
@@ -4484,10 +5569,11 @@ class ModuleTreeContext::Private : public PropertyMapper
     }
     Private()
     {
+      m_moduleList.reset(ModuleListContext::alloc());
       // Add modules
       if (Doxygen::groupSDict)
       {
-        m_moduleList.addModules(*Doxygen::groupSDict);
+        m_moduleList->addModules(*Doxygen::groupSDict);
       }
 
       //%% ModuleList tree:
@@ -4499,11 +5585,11 @@ class ModuleTreeContext::Private : public PropertyMapper
       addProperty("title",this,&Private::title);
     }
   private:
-    ModuleListContext m_moduleList;
+    SharedPtr<ModuleListContext> m_moduleList;
 };
 //%% }
 
-ModuleTreeContext::ModuleTreeContext()
+ModuleTreeContext::ModuleTreeContext() : RefCountedContext("ModuleTreeContext")
 {
   p = new Private;
 }
@@ -4570,7 +5656,7 @@ class NavPathElemContext::Private : public PropertyMapper
 };
 //%% }
 
-NavPathElemContext::NavPathElemContext(Definition *def)
+NavPathElemContext::NavPathElemContext(Definition *def) : RefCountedContext("NavPathElemContext")
 {
   p = new Private(def);
 }
@@ -4619,10 +5705,11 @@ class ExampleListContext::Private : public PropertyMapper
     }
     Private()
     {
+      m_pageList.reset(PageNodeListContext::alloc());
       // Add pages
       if (Doxygen::exampleSDict)
       {
-        m_pageList.addPages(*Doxygen::exampleSDict,FALSE);
+        m_pageList->addPages(*Doxygen::exampleSDict,FALSE);
       }
 
       //%% PageNodeList items:
@@ -4634,11 +5721,11 @@ class ExampleListContext::Private : public PropertyMapper
       addProperty("title",this,&Private::title);
     }
   private:
-    PageNodeListContext m_pageList;
+    SharedPtr<PageNodeListContext> m_pageList;
 };
 //%% }
 
-ExampleListContext::ExampleListContext()
+ExampleListContext::ExampleListContext() : RefCountedContext("ExampleListContext")
 {
   p = new Private;
 }
@@ -4661,26 +5748,31 @@ TemplateVariant ExampleListContext::get(const char *name) const
 class InheritanceNodeContext::Private : public PropertyMapper
 {
   public:
-    Private(ClassDef *cd,const QCString &name) : m_classContext(cd), m_name(name)
+    Private(ClassDef *cd,const QCString &name) : m_classDef(cd), m_name(name)
     {
       addProperty("class",this,&Private::getClass);
       addProperty("name",this,&Private::name);
     }
     TemplateVariant getClass() const
     {
-      return &m_classContext;
+      if (!m_classContext)
+      {
+        m_classContext.reset(ClassContext::alloc(m_classDef));
+      }
+      return m_classContext.get();
     }
     TemplateVariant name() const
     {
       return m_name;
     }
   private:
-    ClassContext m_classContext;
+    ClassDef *m_classDef;
+    mutable SharedPtr<ClassContext> m_classContext;
     QCString m_name;
 };
 //%% }
 
-InheritanceNodeContext::InheritanceNodeContext(ClassDef *cd,const QCString &name)
+InheritanceNodeContext::InheritanceNodeContext(ClassDef *cd,const QCString &name) : RefCountedContext("InheritanceNodeContext")
 {
   p = new Private(cd,name);
 }
@@ -4698,16 +5790,16 @@ TemplateVariant InheritanceNodeContext::get(const char *name) const
 //------------------------------------------------------------------------
 
 //%% list InheritanceList[InheritanceNode] : list of inherited classes
-class InheritanceListContext::Private : public GenericNodeListContext<InheritanceNodeContext>
+class InheritanceListContext::Private : public GenericNodeListContext
 {
   public:
     void addClass(ClassDef *cd,const QCString &name)
     {
-      append(new InheritanceNodeContext(cd,name));
+      append(InheritanceNodeContext::alloc(cd,name));
     }
 };
 
-InheritanceListContext::InheritanceListContext(const BaseClassList *list, bool baseClasses)
+InheritanceListContext::InheritanceListContext(const BaseClassList *list, bool baseClasses) : RefCountedContext("InheritanceListContext")
 {
   p = new Private;
   if (list)
@@ -4757,21 +5849,21 @@ TemplateListIntf::ConstIterator *InheritanceListContext::createIterator() const
 //------------------------------------------------------------------------
 
 //%% list MemberList[Member] : list of inherited classes
-class MemberListContext::Private : public GenericNodeListContext<MemberContext>
+class MemberListContext::Private : public GenericNodeListContext
 {
   public:
     void addMember(MemberDef *md)
     {
-      append(new MemberContext(md));
+      append(MemberContext::alloc(md));
     }
 };
 
-MemberListContext::MemberListContext()
+MemberListContext::MemberListContext() : RefCountedContext("MemberListContext")
 {
   p = new Private;
 }
 
-MemberListContext::MemberListContext(const MemberList *list)
+MemberListContext::MemberListContext(const MemberList *list) : RefCountedContext("MemberListContext")
 {
   p = new Private;
   if (list)
@@ -4791,7 +5883,7 @@ MemberListContext::MemberListContext(const MemberList *list)
   }
 }
 
-MemberListContext::MemberListContext(MemberSDict *list,bool doSort)
+MemberListContext::MemberListContext(MemberSDict *list,bool doSort) : RefCountedContext("MemberListContext")
 {
   p = new Private;
   if (list)
@@ -4877,7 +5969,7 @@ class MemberInfoContext::Private : public PropertyMapper
     {
       if (!m_member && m_memberInfo->memberDef)
       {
-        m_member.reset(new MemberContext(m_memberInfo->memberDef));
+        m_member.reset(MemberContext::alloc(m_memberInfo->memberDef));
       }
       if (m_member)
       {
@@ -4890,11 +5982,11 @@ class MemberInfoContext::Private : public PropertyMapper
     }
   private:
     const MemberInfo *m_memberInfo;
-    mutable ScopedPtr<MemberContext> m_member;
+    mutable SharedPtr<MemberContext> m_member;
 };
 //%% }
 
-MemberInfoContext::MemberInfoContext(const MemberInfo *mi)
+MemberInfoContext::MemberInfoContext(const MemberInfo *mi) : RefCountedContext("MemberInfoContext")
 {
   p = new Private(mi);
 }
@@ -4913,7 +6005,7 @@ TemplateVariant MemberInfoContext::get(const char *name) const
 //------------------------------------------------------------------------
 
 //%% list AllMembersList[MemberList] : list of inherited classes
-class AllMembersListContext::Private : public GenericNodeListContext<MemberInfoContext>
+class AllMembersListContext::Private : public GenericNodeListContext
 {
   public:
     Private(const MemberNameInfoSDict *ml)
@@ -4939,7 +6031,7 @@ class AllMembersListContext::Private : public GenericNodeListContext<MemberInfoC
                   )
                  )
               {
-                append(new MemberInfoContext(mi));
+                append(MemberInfoContext::alloc(mi));
               }
             }
           }
@@ -4948,12 +6040,12 @@ class AllMembersListContext::Private : public GenericNodeListContext<MemberInfoC
     }
 };
 
-AllMembersListContext::AllMembersListContext()
+AllMembersListContext::AllMembersListContext() : RefCountedContext("AllMembersListContext")
 {
   p = new Private(0);
 }
 
-AllMembersListContext::AllMembersListContext(const MemberNameInfoSDict *ml)
+AllMembersListContext::AllMembersListContext(const MemberNameInfoSDict *ml) : RefCountedContext("AllMembersListContext")
 {
   p = new Private(ml);
 }
@@ -4989,8 +6081,7 @@ class MemberGroupInfoContext::Private : public PropertyMapper
     Private(Definition *def,const QCString &relPath,const MemberGroup *mg) :
       m_def(def),
       m_relPath(relPath),
-      m_memberListContext(mg->members()),
-      m_memberGroups(def,relPath,0), m_memberGroup(mg)
+      m_memberGroup(mg)
     {
       addProperty("members",      this,&Private::members);
       addProperty("title",        this,&Private::groupTitle);
@@ -5002,7 +6093,11 @@ class MemberGroupInfoContext::Private : public PropertyMapper
     }
     TemplateVariant members() const
     {
-      return &m_memberListContext;
+      if (!m_cache.memberListContext)
+      {
+        m_cache.memberListContext.reset(MemberListContext::alloc(m_memberGroup->members()));
+      }
+      return m_cache.memberListContext.get();
     }
     TemplateVariant groupTitle() const
     {
@@ -5018,26 +6113,30 @@ class MemberGroupInfoContext::Private : public PropertyMapper
     }
     TemplateVariant memberGroups() const
     {
-      return &m_memberGroups;
+      if (!m_cache.memberGroups)
+      {
+        m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_def,m_relPath,0));
+      }
+      return m_cache.memberGroups.get();
     }
     TemplateVariant docs() const
     {
-      if (!m_docs)
+      if (!m_cache.docs)
       {
         QCString docs = m_memberGroup->documentation();
         if (!docs.isEmpty())
         {
-          m_docs.reset(new TemplateVariant(
+          m_cache.docs.reset(new TemplateVariant(
                            parseDoc(m_def,"[@name docs]",-1, // TODO store file & line
                                     m_relPath,
                                     m_memberGroup->documentation()+"\n",FALSE)));
         }
         else
         {
-          m_docs.reset(new TemplateVariant(""));
+          m_cache.docs.reset(new TemplateVariant(""));
         }
       }
-      return *m_docs;
+      return *m_cache.docs;
     }
     TemplateVariant inherited() const
     {
@@ -5046,15 +6145,19 @@ class MemberGroupInfoContext::Private : public PropertyMapper
   private:
     Definition *m_def;
     QCString m_relPath;
-    MemberListContext m_memberListContext;
-    MemberGroupListContext m_memberGroups;
     const MemberGroup *m_memberGroup;
-    mutable ScopedPtr<TemplateVariant> m_docs;
+    struct Cachable
+    {
+      SharedPtr<MemberListContext>      memberListContext;
+      SharedPtr<MemberGroupListContext> memberGroups;
+      ScopedPtr<TemplateVariant>        docs;
+    };
+    mutable Cachable m_cache;
 };
 //%% }
 
 MemberGroupInfoContext::MemberGroupInfoContext(Definition *def,
-       const QCString &relPath,const MemberGroup *mg)
+       const QCString &relPath,const MemberGroup *mg) : RefCountedContext("MemberGroupInfoContext")
 {
   p = new Private(def,relPath,mg);
 }
@@ -5072,21 +6175,21 @@ TemplateVariant MemberGroupInfoContext::get(const char *name) const
 //------------------------------------------------------------------------
 
 //%% list MemberGroupList[MemberGroupInfo] : list of member groups
-class MemberGroupListContext::Private : public GenericNodeListContext<MemberGroupInfoContext>
+class MemberGroupListContext::Private : public GenericNodeListContext
 {
   public:
     void addMemberGroup(Definition *def,const QCString &relPath,const MemberGroup *mg)
     {
-      append(new MemberGroupInfoContext(def,relPath,mg));
+      append(MemberGroupInfoContext::alloc(def,relPath,mg));
     }
 };
 
-MemberGroupListContext::MemberGroupListContext()
+MemberGroupListContext::MemberGroupListContext() : RefCountedContext("MemberGroupListContext")
 {
   p = new Private;
 }
 
-MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list)
+MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list) : RefCountedContext("MemberGroupListContext")
 {
   p = new Private;
   if (list)
@@ -5100,7 +6203,7 @@ MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &r
   }
 }
 
-MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping)
+MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping) : RefCountedContext("MemberGroupListContext")
 {
   p = new Private;
   if (dict)
@@ -5148,9 +6251,8 @@ class MemberListInfoContext::Private : public PropertyMapper
   public:
     Private(Definition *def,const QCString &relPath,const MemberList *ml,const QCString &title,const QCString &subtitle) :
       m_def(def),
-      m_memberListContext(ml),
-      m_memberGroups(def,relPath,ml ? ml->getMemberGroupList() : 0),
       m_memberList(ml),
+      m_relPath(relPath),
       m_title(title),
       m_subtitle(subtitle)
     {
@@ -5163,7 +6265,11 @@ class MemberListInfoContext::Private : public PropertyMapper
     }
     TemplateVariant members() const
     {
-      return &m_memberListContext;
+      if (!m_cache.memberListContext)
+      {
+        m_cache.memberListContext.reset(MemberListContext::alloc(m_memberList));
+      }
+      return m_cache.memberListContext.get();
     }
     TemplateVariant title() const
     {
@@ -5179,20 +6285,24 @@ class MemberListInfoContext::Private : public PropertyMapper
     }
     TemplateVariant memberGroups() const
     {
-      return &m_memberGroups;
+      if (!m_cache.memberGroups)
+      {
+        m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_def,m_relPath,m_memberList->getMemberGroupList()));
+      }
+      return m_cache.memberGroups.get();
     }
     TemplateVariant inherited() const
     {
-      if (!m_inherited && (m_memberList->listType()&MemberListType_detailedLists)==0 &&
+      if (!m_cache.inherited && (m_memberList->listType()&MemberListType_detailedLists)==0 &&
           m_def->definitionType()==Definition::TypeClass)
       {
-        InheritedMemberInfoListContext *ctx = new InheritedMemberInfoListContext;
+        InheritedMemberInfoListContext *ctx = InheritedMemberInfoListContext::alloc();
         ctx->addMemberList((ClassDef*)m_def,m_memberList->listType(),m_title,FALSE);
-        m_inherited.reset(ctx);
+        m_cache.inherited.reset(ctx);
       }
-      if (m_inherited)
+      if (m_cache.inherited)
       {
-        return m_inherited.get();
+        return m_cache.inherited.get();
       }
       else
       {
@@ -5201,18 +6311,23 @@ class MemberListInfoContext::Private : public PropertyMapper
     }
   private:
     Definition *m_def;
-    MemberListContext m_memberListContext;
-    MemberGroupListContext m_memberGroups;
     const MemberList *m_memberList;
+    QCString m_relPath;
     QCString m_title;
     QCString m_subtitle;
-    mutable ScopedPtr<InheritedMemberInfoListContext> m_inherited;
+    struct Cachable
+    {
+      SharedPtr<MemberListContext> memberListContext;
+      SharedPtr<MemberGroupListContext> memberGroups;
+      SharedPtr<InheritedMemberInfoListContext> inherited;
+    };
+    mutable Cachable m_cache;
 };
 //%% }
 
 MemberListInfoContext::MemberListInfoContext(
            Definition *def,const QCString &relPath,const MemberList *ml,
-           const QCString &title,const QCString &subtitle)
+           const QCString &title,const QCString &subtitle) : RefCountedContext("MemberListInfoContext")
 {
   p = new Private(def,relPath,ml,title,subtitle);
 }
@@ -5251,7 +6366,7 @@ class InheritedMemberInfoContext::Private : public PropertyMapper
     {
       if (!m_classCtx)
       {
-        m_classCtx.reset(new ClassContext(m_class));
+        m_classCtx.reset(ClassContext::alloc(m_class));
       }
       return m_classCtx.get();
     }
@@ -5263,7 +6378,7 @@ class InheritedMemberInfoContext::Private : public PropertyMapper
     {
       if (!m_memberListCtx)
       {
-        m_memberListCtx.reset(new MemberListContext(m_memberList));
+        m_memberListCtx.reset(MemberListContext::alloc(m_memberList));
       }
       return m_memberListCtx.get();
     }
@@ -5274,26 +6389,27 @@ class InheritedMemberInfoContext::Private : public PropertyMapper
     }
     TemplateVariant inheritedFrom() const
     {
-      if (m_inheritedFrom.count()==0)
+      if (!m_inheritedFrom)
       {
-        m_inheritedFrom.append(title());
-        m_inheritedFrom.append(getClass());
+        m_inheritedFrom.reset(TemplateList::alloc());
+        m_inheritedFrom->append(title());
+        m_inheritedFrom->append(getClass());
       }
-      return &m_inheritedFrom;
+      return m_inheritedFrom.get();
     }
 
   private:
     ClassDef *  m_class;
     MemberList *m_memberList;
     QCString    m_title;
-    mutable ScopedPtr<ClassContext> m_classCtx;
-    mutable ScopedPtr<MemberListContext> m_memberListCtx;
-    mutable TemplateList m_inheritedFrom;
+    mutable SharedPtr<ClassContext> m_classCtx;
+    mutable SharedPtr<MemberListContext> m_memberListCtx;
+    mutable SharedPtr<TemplateList> m_inheritedFrom;
 };
 //%% }
 
 InheritedMemberInfoContext::InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,
-                                                       const QCString &title)
+                                                       const QCString &title) : RefCountedContext("InheritedMemberInfoContext")
 {
   p = new Private(cd,ml,title);
 }
@@ -5311,7 +6427,7 @@ TemplateVariant InheritedMemberInfoContext::get(const char *name) const
 //------------------------------------------------------------------------
 
 //%% list InheritedMemberList[InheritedMemberInfo] : list of inherited classes
-class InheritedMemberInfoListContext::Private : public GenericNodeListContext<InheritedMemberInfoContext>
+class InheritedMemberInfoListContext::Private : public GenericNodeListContext
 {
   public:
     void addMemberList(ClassDef *inheritedFrom,MemberList *ml,MemberList *combinedList)
@@ -5385,7 +6501,7 @@ class InheritedMemberInfoListContext::Private : public GenericNodeListContext<In
         addMemberListIncludingGrouped(inheritedFrom,ml2,combinedList);
         addMemberGroupsOfClass(inheritedFrom,cd,lt,combinedList);
         if (lt2!=-1) addMemberGroupsOfClass(inheritedFrom,cd,(MemberListType)lt2,combinedList);
-        append(new InheritedMemberInfoContext(cd,combinedList,title));
+        append(InheritedMemberInfoContext::alloc(cd,combinedList,title));
       }
     }
     void findInheritedMembers(ClassDef *inheritedFrom,ClassDef *cd,MemberListType lt,
@@ -5424,7 +6540,7 @@ class InheritedMemberInfoListContext::Private : public GenericNodeListContext<In
     }
 };
 
-InheritedMemberInfoListContext::InheritedMemberInfoListContext()
+InheritedMemberInfoListContext::InheritedMemberInfoListContext() : RefCountedContext("InheritedMemberInfoListContext")
 {
   p = new Private;
 }
@@ -5433,7 +6549,7 @@ void InheritedMemberInfoListContext::addMemberList(
     ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList)
 {
   QPtrDict<void> visited(17);
-  bool memberInSection = cd->countMembersIncludingGrouped(lt,cd,FALSE);
+  bool memberInSection = cd->countMembersIncludingGrouped(lt,cd,FALSE)>0;
   bool show = (additionalList && !memberInSection) || // inherited member to show in the additional inherited members list
               (!additionalList && memberInSection);   // inherited member to show in a member list of the class
   //printf("%s:%s show=%d\n",cd->name().data(),MemberList::listTypeAsString(lt).data(),show);
@@ -5542,7 +6658,7 @@ class ArgumentContext::Private : public PropertyMapper
 };
 //%% }
 
-ArgumentContext::ArgumentContext(const Argument *al,Definition *def,const QCString &relPath)
+ArgumentContext::ArgumentContext(const Argument *al,Definition *def,const QCString &relPath) : RefCountedContext("ArgumentContext")
 {
   p = new Private(al,def,relPath);
 }
@@ -5560,22 +6676,22 @@ TemplateVariant ArgumentContext::get(const char *name) const
 //------------------------------------------------------------------------
 
 //%% list ArgumentList[Argument] : list of inherited classes
-class ArgumentListContext::Private : public GenericNodeListContext<ArgumentContext>
+class ArgumentListContext::Private : public GenericNodeListContext
 {
   public:
     void addArgument(const Argument *arg,Definition *def,const QCString &relPath)
     {
-      append(new ArgumentContext(arg,def,relPath));
+      append(ArgumentContext::alloc(arg,def,relPath));
     }
 };
 
-ArgumentListContext::ArgumentListContext()
+ArgumentListContext::ArgumentListContext() : RefCountedContext("ArgumentListContext")
 {
   p = new Private;
 }
 
 ArgumentListContext::ArgumentListContext(const ArgumentList *list,
-                        Definition *def,const QCString &relPath)
+                        Definition *def,const QCString &relPath) : RefCountedContext("ArgumentListContext")
 {
   p = new Private;
   if (list)
@@ -5692,74 +6808,88 @@ class HtmlSpaceless : public TemplateSpacelessIntf
 
 //------------------------------------------------------------------------
 
+#if DEBUG_REF
+int RefCountedContext::s_totalCount;
+#endif
+
 void generateOutputViaTemplate()
 {
+  {
   TemplateEngine e;
   TemplateContext *ctx = e.createContext();
   if (ctx)
   {
-    DoxygenContext        doxygen;
-    ConfigContext         config;
-    TranslateContext      tr;
-    ClassListContext      classList;
-    ClassTreeContext      classTree;
-    ClassHierarchyContext classHierarchy;
-    NamespaceListContext  namespaceList;
-    NamespaceTreeContext  namespaceTree;
-    FileListContext       fileList;
-    FileTreeContext       fileTree;
-    PageTreeContext       pageTree;
-    PageListContext       pageList;
-    ModuleTreeContext     moduleTree;
-    ExampleListContext    exampleList;
+    SharedPtr<DoxygenContext>        doxygen         (DoxygenContext::alloc());
+    SharedPtr<ConfigContext>         config          (ConfigContext::alloc());
+    SharedPtr<TranslateContext>      tr              (TranslateContext::alloc());
+    SharedPtr<ClassListContext>      classList       (ClassListContext::alloc());
+    SharedPtr<ClassTreeContext>      classTree       (ClassTreeContext::alloc());
+    SharedPtr<ClassHierarchyContext> classHierarchy  (ClassHierarchyContext::alloc());
+    SharedPtr<NamespaceListContext>  namespaceList   (NamespaceListContext::alloc());
+    SharedPtr<NamespaceTreeContext>  namespaceTree   (NamespaceTreeContext::alloc());
+    SharedPtr<DirListContext>        dirList         (DirListContext::alloc());
+    SharedPtr<FileListContext>       fileList        (FileListContext::alloc());
+    SharedPtr<FileTreeContext>       fileTree        (FileTreeContext::alloc());
+    SharedPtr<PageTreeContext>       pageTree        (PageTreeContext::alloc());
+    SharedPtr<PageListContext>       pageList        (PageListContext::alloc());
+    SharedPtr<ModuleTreeContext>     moduleTree      (ModuleTreeContext::alloc());
+    SharedPtr<ExampleListContext>    exampleList     (ExampleListContext::alloc());
 
     //%% Doxygen doxygen:
-    ctx->set("doxygen",&doxygen);
+    ctx->set("doxygen",doxygen.get());
     //%% Translator tr:
-    ctx->set("tr",&tr);
+    ctx->set("tr",tr.get());
     //%% Config config:
-    ctx->set("config",&config);
+    ctx->set("config",config.get());
     //%% ClassList classList:
-    ctx->set("classList",&classList); // not used for standard HTML
+    ctx->set("classList",classList.get()); // not used for standard HTML
     //%% ClassTree classTree:
-    ctx->set("classTree",&classTree);
+    ctx->set("classTree",classTree.get());
     // classIndex
     //%% ClassHierarchy classHierarchy:
-    ctx->set("classHierarchy",&classHierarchy);
+    ctx->set("classHierarchy",classHierarchy.get());
     //%% NamespaceList namespaceList:
-    ctx->set("namespaceList",&namespaceList);
+    ctx->set("namespaceList",namespaceList.get());
     //%% NamespaceTree namespaceTree:
-    ctx->set("namespaceTree",&namespaceTree);
+    ctx->set("namespaceTree",namespaceTree.get());
     //%% FileList fileList:
-    ctx->set("fileList",&fileList);
+    ctx->set("fileList",fileList.get());
     //%% FileTree fileTree:
-    ctx->set("fileTree",&fileTree);
+    ctx->set("fileTree",fileTree.get());
     //%% PageList pageList
-    ctx->set("pageList",&pageList);
+    ctx->set("pageList",pageList.get());
     //%% PageTree pageTree
-    ctx->set("pageTree",&pageTree);
+    ctx->set("pageTree",pageTree.get());
     //%% ModuleTree moduleTree
-    ctx->set("moduleTree",&moduleTree);
+    ctx->set("moduleTree",moduleTree.get());
     //%% ExampleList exampleList
-    ctx->set("exampleList",&exampleList);
+    ctx->set("exampleList",exampleList.get());
+    //%% DirList dirList
+    ctx->set("dirList",dirList.get());
 
     // render HTML output
-    Template *tpl = e.loadByName("htmllayout.tpl");
+    Template *tpl = e.loadByName("htmllayout.tpl",1);
     if (tpl)
     {
       g_globals.outputFormat = ContextGlobals::Html;
       g_globals.dynSectionId    = 0;
       g_globals.outputDir    = Config_getString("HTML_OUTPUT");
-      HtmlEscaper esc;
-      ctx->setEscapeIntf(&esc);
+      HtmlEscaper htmlEsc;
+      ctx->setEscapeIntf(Config_getString("HTML_FILE_EXTENSION"),&htmlEsc);
       HtmlSpaceless spl;
       ctx->setSpacelessIntf(&spl);
       ctx->setOutputDirectory(g_globals.outputDir);
       FTextStream ts;
       tpl->render(ts,ctx);
     }
+    e.unload(tpl);
 
     // TODO: render other outputs
   }
+  delete ctx;
+  }
+#if DEBUG_REF
+  printf("==== total ref count %d\n",RefCountedContext::s_totalCount);
+#endif
 }
 
index f027749..18fa519 100644 (file)
@@ -3,6 +3,8 @@
 
 #include "types.h"
 #include "template.h"
+#include <qlist.h>
+#include <stdio.h>
 
 class Definition;
 class ClassDef;
@@ -37,147 +39,266 @@ class MemberGroupList;
 
 //----------------------------------------------------
 
-class ConfigContext : public TemplateStructIntf
+#define DEBUG_REF 0
+
+/** @brief Helper class to support reference counting */
+#if DEBUG_REF
+class RefCountedContext
 {
   public:
-    ConfigContext();
-   ~ConfigContext();
+    RefCountedContext(const char *className) : m_refCount(0)
+    {
+      m_className=className;
+      m_insideRelease = FALSE;
+    }
+    virtual ~RefCountedContext()
+    {
+      if (!m_insideRelease) abort();
+    }
+    int addRef()
+    {
+      ++s_totalCount;
+      printf("%p:%s::addRef()=%d\n",this,m_className.data(),m_refCount);
+      return ++m_refCount;
+    }
+    int release()
+    {
+      --s_totalCount;
+      printf("%p:%s::release()=%d\n",this,m_className.data(),m_refCount-1);
+      int count = --m_refCount;
+      if (count<=0)
+      {
+        m_insideRelease=TRUE;
+        delete this;
+      }
+      return count;
+    }
+  private:
+    int m_refCount;
+    QCString m_className;
+    bool m_insideRelease;
+  public:
+    static int s_totalCount;
+};
+
+#else // release version
+
+class RefCountedContext
+{
+  public:
+    RefCountedContext(const char *) : m_refCount(0) {}
+    virtual ~RefCountedContext() {}
+    int addRef() { return ++m_refCount; }
+    int release()
+    {
+      int count = --m_refCount;
+      if (count<=0)
+      {
+        delete this;
+      }
+      return count;
+    }
+  private:
+    int m_refCount;
+};
+#endif
+
+
+//----------------------------------------------------
+
+class ConfigContext : public RefCountedContext, public TemplateStructIntf
+{
+  public:
+    static ConfigContext *alloc() { return new ConfigContext; }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    ConfigContext();
+   ~ConfigContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class DoxygenContext : public TemplateStructIntf
+class DoxygenContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    DoxygenContext();
-   ~DoxygenContext();
+    static DoxygenContext *alloc() { return new DoxygenContext; }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    DoxygenContext();
+   ~DoxygenContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class TranslateContext : public TemplateStructIntf
+class TranslateContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    TranslateContext();
-   ~TranslateContext();
+    static TranslateContext *alloc() { return new TranslateContext; }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    TranslateContext();
+   ~TranslateContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class UsedFilesContext : public TemplateListIntf
+class UsedFilesContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    UsedFilesContext(ClassDef *cd);
-   ~UsedFilesContext();
+    static UsedFilesContext *alloc(ClassDef *cd) { return new UsedFilesContext(cd); }
 
     // TemplateListIntf
     virtual int count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
     void addFile(FileDef *fd);
 
   private:
+    UsedFilesContext(ClassDef *cd);
+   ~UsedFilesContext();
+
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class IncludeInfoContext : public TemplateStructIntf
+class IncludeInfoContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    IncludeInfoContext(IncludeInfo *,SrcLangExt lang);
-   ~IncludeInfoContext();
+    static IncludeInfoContext *alloc(const IncludeInfo *info,SrcLangExt lang)
+    { return new IncludeInfoContext(info,lang); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    IncludeInfoContext(const IncludeInfo *,SrcLangExt lang);
+   ~IncludeInfoContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class ClassContext : public TemplateStructIntf
+class IncludeInfoListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    ClassContext(ClassDef *);
-   ~ClassContext();
+    static IncludeInfoListContext *alloc(const QList<IncludeInfo> &list,SrcLangExt lang)
+    { return new IncludeInfoListContext(list,lang); }
+
+    // TemplateListIntf
+    virtual int count() const;
+    virtual TemplateVariant at(int index) const;
+    virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
+
+  private:
+    IncludeInfoListContext(const QList<IncludeInfo> &list,SrcLangExt lang);
+   ~IncludeInfoListContext();
+    class Private;
+    Private *p;
+};
+
+
+//----------------------------------------------------
+
+class ClassContext : public RefCountedContext, public TemplateStructIntf
+{
+  public:
+    static ClassContext *alloc(ClassDef *cd) { return new ClassContext(cd); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    ClassContext(ClassDef *);
+   ~ClassContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class NamespaceContext : public TemplateStructIntf
+class NamespaceContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    NamespaceContext(NamespaceDef *);
-   ~NamespaceContext();
+    static NamespaceContext *alloc(NamespaceDef *nd) { return new NamespaceContext(nd); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    NamespaceContext(NamespaceDef *);
+   ~NamespaceContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class FileContext : public TemplateStructIntf
+class FileContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    FileContext(FileDef *);
-   ~FileContext();
+    static FileContext *alloc(FileDef *fd) { return new FileContext(fd); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    FileContext(FileDef *);
+   ~FileContext();
     class Private;
     Private *p;
 };
 //----------------------------------------------------
 
-class DirContext : public TemplateStructIntf
+class DirContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    DirContext(DirDef *);
-   ~DirContext();
+    static DirContext *alloc(DirDef *dd) { return new DirContext(dd); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    DirContext(DirDef *);
+   ~DirContext();
     class Private;
     Private *p;
 };
@@ -185,32 +306,38 @@ class DirContext : public TemplateStructIntf
 
 //----------------------------------------------------
 
-class PageContext : public TemplateStructIntf
+class PageContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    PageContext(PageDef *);
-   ~PageContext();
+    static PageContext *alloc(PageDef *pd) { return new PageContext(pd); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    PageContext(PageDef *);
+   ~PageContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class MemberContext : public TemplateStructIntf
+class MemberContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    MemberContext(MemberDef *);
-   ~MemberContext();
+    static MemberContext *alloc(MemberDef *md) { return new MemberContext(md); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    MemberContext(MemberDef *);
+   ~MemberContext();
     class Private;
     Private *p;
 };
@@ -218,414 +345,501 @@ class MemberContext : public TemplateStructIntf
 
 //----------------------------------------------------
 
-class ModuleContext : public TemplateStructIntf
+class ModuleContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    ModuleContext(GroupDef *);
-   ~ModuleContext();
+    static ModuleContext *alloc(GroupDef *gd) { return new ModuleContext(gd); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    ModuleContext(GroupDef *);
+   ~ModuleContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class NestedClassListContext : public TemplateListIntf
+class NestedClassListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
+    static NestedClassListContext *alloc() { return new NestedClassListContext; }
+
+    // TemplateListIntf
+    virtual int  count() const;
+    virtual TemplateVariant at(int index) const;
+    virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
+
+    void append(ClassDef *cd);
+
+  private:
     NestedClassListContext();
    ~NestedClassListContext();
+    class Private;
+    Private *p;
+};
+
+//----------------------------------------------------
+
+class NestedNamespaceListContext : public RefCountedContext, public TemplateListIntf
+{
+  public:
+    static NestedNamespaceListContext *alloc() { return new NestedNamespaceListContext; }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
-    void append(ClassDef *cd);
+    void append(NamespaceDef *cd);
 
   private:
+    NestedNamespaceListContext();
+   ~NestedNamespaceListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class ClassListContext : public TemplateListIntf
+class ClassListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    ClassListContext();
-   ~ClassListContext();
+    static ClassListContext *alloc() { return new ClassListContext; }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    ClassListContext();
+   ~ClassListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class ClassInheritanceNodeContext : public TemplateStructIntf
+class ClassInheritanceNodeContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    ClassInheritanceNodeContext(ClassDef *);
-   ~ClassInheritanceNodeContext();
+    static ClassInheritanceNodeContext *alloc(ClassDef *cd)
+    { return new ClassInheritanceNodeContext(cd); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
     void addChildren(const BaseClassList *bcl,bool hideSuper);
+
   private:
+    ClassInheritanceNodeContext(ClassDef *);
+   ~ClassInheritanceNodeContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class ClassInheritanceContext : public TemplateListIntf
+class ClassInheritanceContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    ClassInheritanceContext();
-   ~ClassInheritanceContext();
+    static ClassInheritanceContext *alloc() { return new ClassInheritanceContext; }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    ClassInheritanceContext();
+   ~ClassInheritanceContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class ClassHierarchyContext : public TemplateStructIntf
+class ClassHierarchyContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    ClassHierarchyContext();
-   ~ClassHierarchyContext();
+    static ClassHierarchyContext *alloc() { return new ClassHierarchyContext; }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    ClassHierarchyContext();
+   ~ClassHierarchyContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class NestingNodeContext : public TemplateStructIntf
+class NestingNodeContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    NestingNodeContext(Definition *,bool addClasses);
-   ~NestingNodeContext();
+    static NestingNodeContext *alloc(const NestingNodeContext *parent,Definition *def,
+                                     int index,int level,bool addClasses)
+    { return new NestingNodeContext(parent,def,index,level,addClasses); }
+
+    QCString id() const;
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    NestingNodeContext(const NestingNodeContext *parent,
+                       Definition *,int index,int level,bool addClasses);
+   ~NestingNodeContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class NestingContext : public TemplateListIntf
+class NestingContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    NestingContext();
-   ~NestingContext();
+    static NestingContext *alloc(const NestingNodeContext *parent,int level)
+    { return new NestingContext(parent,level); }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
     void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses);
     void addClasses(const ClassSDict &clDict,bool rootOnly);
+    void addDirs(const DirSDict &);
+    void addDirs(const DirList &);
+    void addFiles(const FileNameList &);
+    void addFiles(const FileList &);
+
   private:
+    NestingContext(const NestingNodeContext *parent,int level);
+   ~NestingContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class ClassTreeContext : public TemplateStructIntf
+class ClassTreeContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    ClassTreeContext();
-   ~ClassTreeContext();
+    static ClassTreeContext *alloc() { return new ClassTreeContext; }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    ClassTreeContext();
+   ~ClassTreeContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class NamespaceListContext : public TemplateListIntf
+class NamespaceListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    NamespaceListContext();
-   ~NamespaceListContext();
+    static NamespaceListContext *alloc() { return new NamespaceListContext; }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    NamespaceListContext();
+   ~NamespaceListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class NamespaceTreeContext : public TemplateStructIntf
-{
-  public:
-    NamespaceTreeContext();
-   ~NamespaceTreeContext();
-
-    // TemplateStructIntf methods
-    virtual TemplateVariant get(const char *name) const;
-
-  private:
-    class Private;
-    Private *p;
-};
-
-//----------------------------------------------------
-
-class DirFileNodeContext : public TemplateStructIntf
+class NamespaceTreeContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    DirFileNodeContext(Definition *);
-   ~DirFileNodeContext();
+    static NamespaceTreeContext *alloc() { return new NamespaceTreeContext; }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    NamespaceTreeContext();
+   ~NamespaceTreeContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class DirFileContext : public TemplateListIntf
+class DirListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    DirFileContext();
-   ~DirFileContext();
+    static DirListContext *alloc() { return new DirListContext; }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
-    void addDirs(const DirSDict &);
-    void addDirs(const DirList &);
-    void addFiles(const FileNameList &);
-    void addFiles(const FileList &);
   private:
+    DirListContext();
+   ~DirListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class FileListContext : public TemplateListIntf
+class FileListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    FileListContext();
-   ~FileListContext();
+    static FileListContext *alloc() { return new FileListContext; }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    FileListContext();
+   ~FileListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class FileTreeContext : public TemplateStructIntf
+class FileTreeContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    FileTreeContext();
-   ~FileTreeContext();
+    static FileTreeContext *alloc() { return new FileTreeContext; }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    FileTreeContext();
+   ~FileTreeContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class PageNodeContext : public TemplateStructIntf
+class PageNodeContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    PageNodeContext(PageDef *);
-   ~PageNodeContext();
+    static PageNodeContext *alloc(PageDef *pd) { return new PageNodeContext(pd); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    PageNodeContext(PageDef *);
+   ~PageNodeContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class PageNodeListContext : public TemplateListIntf
+class PageNodeListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    PageNodeListContext();
-   ~PageNodeListContext();
+    static PageNodeListContext *alloc() { return new PageNodeListContext; }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
     void addPages(const PageSDict &,bool rootOnly);
+
   private:
+    PageNodeListContext();
+   ~PageNodeListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class PageListContext : public TemplateStructIntf
+class PageListContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    PageListContext();
-   ~PageListContext();
+    static PageListContext *alloc() { return new PageListContext; }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    PageListContext();
+   ~PageListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class PageTreeContext : public TemplateStructIntf
+class PageTreeContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    PageTreeContext();
-   ~PageTreeContext();
+    static PageTreeContext *alloc() { return new PageTreeContext; }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    PageTreeContext();
+   ~PageTreeContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class ModuleNodeContext : public TemplateStructIntf
+class ModuleNodeContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    ModuleNodeContext(GroupDef *);
-   ~ModuleNodeContext();
+    static ModuleNodeContext *alloc(GroupDef *gd) { return new ModuleNodeContext(gd); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    ModuleNodeContext(GroupDef *);
+   ~ModuleNodeContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class ModuleListContext : public TemplateListIntf
+class ModuleListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    ModuleListContext();
-   ~ModuleListContext();
+    static ModuleListContext *alloc() { return new ModuleListContext(); }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
     void addModules(const GroupSDict &);
     void addModules(const GroupList &);
+
   private:
+    ModuleListContext();
+   ~ModuleListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class ModuleTreeContext : public TemplateStructIntf
+class ModuleTreeContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    ModuleTreeContext();
-   ~ModuleTreeContext();
+    static ModuleTreeContext *alloc() { return new ModuleTreeContext(); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    ModuleTreeContext();
+   ~ModuleTreeContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class ExampleListContext : public TemplateStructIntf
+class ExampleListContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    ExampleListContext();
-   ~ExampleListContext();
+    static ExampleListContext *alloc() { return new ExampleListContext(); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    ExampleListContext();
+   ~ExampleListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class NavPathElemContext : public TemplateStructIntf
+class NavPathElemContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    NavPathElemContext(Definition *def);
-   ~NavPathElemContext();
+    static NavPathElemContext *alloc(Definition *def) { return new NavPathElemContext(def); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    NavPathElemContext(Definition *def);
+   ~NavPathElemContext();
     class Private;
     Private *p;
 };
@@ -633,90 +847,118 @@ class NavPathElemContext : public TemplateStructIntf
 
 //----------------------------------------------------
 
-class InheritanceNodeContext : public TemplateStructIntf
+class InheritanceNodeContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    InheritanceNodeContext(ClassDef *cd,const QCString &name);
-   ~InheritanceNodeContext();
+    static InheritanceNodeContext *alloc(ClassDef *cd,const QCString &name)
+    { return new InheritanceNodeContext(cd,name); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    InheritanceNodeContext(ClassDef *cd,const QCString &name);
+   ~InheritanceNodeContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class InheritanceListContext : public TemplateListIntf
+class InheritanceListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    InheritanceListContext(const BaseClassList *list,bool baseClasses);
-   ~InheritanceListContext();
+    static InheritanceListContext *alloc(const BaseClassList *list,bool baseClasses)
+    { return new InheritanceListContext(list,baseClasses); }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    InheritanceListContext(const BaseClassList *list,bool baseClasses);
+   ~InheritanceListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class MemberListContext : public TemplateListIntf
+class MemberListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    MemberListContext();
-    MemberListContext(const MemberList *ml);
-    MemberListContext(MemberSDict *ml,bool doSort);
-   ~MemberListContext();
+    static MemberListContext *alloc()
+    { return new MemberListContext; }
+    static MemberListContext *alloc(const MemberList *ml)
+    { return new MemberListContext(ml); }
+    static MemberListContext *alloc(MemberSDict *ml,bool doSort)
+    { return new MemberListContext(ml,doSort); }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    MemberListContext();
+    MemberListContext(const MemberList *ml);
+    MemberListContext(MemberSDict *ml,bool doSort);
+   ~MemberListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class MemberGroupInfoContext : public TemplateStructIntf
+class MemberGroupInfoContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    MemberGroupInfoContext(Definition *def,const QCString &relPath,const MemberGroup *mg);
-   ~MemberGroupInfoContext();
+    static MemberGroupInfoContext *alloc(Definition *def,const QCString &relPath,const MemberGroup *mg)
+    { return new MemberGroupInfoContext(def,relPath,mg); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    MemberGroupInfoContext(Definition *def,const QCString &relPath,const MemberGroup *mg);
+   ~MemberGroupInfoContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class MemberGroupListContext : public TemplateListIntf
+class MemberGroupListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    MemberGroupListContext();
-    MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list);
-    MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *mgDict,bool subGrouping);
-   ~MemberGroupListContext();
+    static MemberGroupListContext *alloc()
+    { return new MemberGroupListContext; }
+    static MemberGroupListContext *alloc(Definition *def,const QCString &relPath,const MemberGroupList *list)
+    { return new MemberGroupListContext(def,relPath,list); }
+    static MemberGroupListContext *alloc(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping)
+    { return new MemberGroupListContext(def,relPath,dict,subGrouping); }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    MemberGroupListContext();
+    MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list);
+    MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *mgDict,bool subGrouping);
+   ~MemberGroupListContext();
     class Private;
     Private *p;
 };
@@ -724,123 +966,154 @@ class MemberGroupListContext : public TemplateListIntf
 
 //----------------------------------------------------
 
-class MemberListInfoContext : public TemplateStructIntf
+class MemberListInfoContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    MemberListInfoContext(Definition *def,const QCString &relPath,
+    static MemberListInfoContext *alloc(Definition *def,const QCString &relPath,
                           const MemberList *ml,const QCString &title,
-                          const QCString &subtitle=QCString());
-   ~MemberListInfoContext();
+                          const QCString &subtitle=QCString())
+    { return new MemberListInfoContext(def,relPath,ml,title,subtitle); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    MemberListInfoContext(Definition *def,const QCString &relPath,
+                          const MemberList *ml,const QCString &title,
+                          const QCString &subtitle=QCString());
+   ~MemberListInfoContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class MemberInfoContext : public TemplateStructIntf
+class MemberInfoContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    MemberInfoContext(const MemberInfo *mi);
-   ~MemberInfoContext();
+    static MemberInfoContext *alloc(const MemberInfo *mi) { return new MemberInfoContext(mi); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    MemberInfoContext(const MemberInfo *mi);
+   ~MemberInfoContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class InheritedMemberInfoContext : public TemplateStructIntf
+class InheritedMemberInfoContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,const QCString &title);
-   ~InheritedMemberInfoContext();
+    static InheritedMemberInfoContext *alloc(ClassDef *cd,MemberList *ml,const QCString &title)
+    { return new InheritedMemberInfoContext(cd,ml,title); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,const QCString &title);
+   ~InheritedMemberInfoContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class InheritedMemberInfoListContext : public TemplateListIntf
+class InheritedMemberInfoListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    InheritedMemberInfoListContext();
+    static InheritedMemberInfoListContext *alloc() { return new InheritedMemberInfoListContext; }
     void addMemberList(ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList=TRUE);
-   ~InheritedMemberInfoListContext();
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    InheritedMemberInfoListContext();
+   ~InheritedMemberInfoListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class AllMembersListContext : public TemplateListIntf
+class AllMembersListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    AllMembersListContext();
-    AllMembersListContext(const MemberNameInfoSDict *ml);
-   ~AllMembersListContext();
+    static AllMembersListContext *alloc()
+    { return new AllMembersListContext; }
+    static AllMembersListContext *alloc(const MemberNameInfoSDict *ml)
+    { return new AllMembersListContext(ml); }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    AllMembersListContext();
+    AllMembersListContext(const MemberNameInfoSDict *ml);
+   ~AllMembersListContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class ArgumentContext : public TemplateStructIntf
+class ArgumentContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    ArgumentContext(const Argument *arg,Definition *def,const QCString &relPath);
-   ~ArgumentContext();
+    static ArgumentContext *alloc(const Argument *arg,Definition *def,const QCString &relPath)
+    { return new ArgumentContext(arg,def,relPath); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    ArgumentContext(const Argument *arg,Definition *def,const QCString &relPath);
+   ~ArgumentContext();
     class Private;
     Private *p;
 };
 
 //----------------------------------------------------
 
-class ArgumentListContext : public TemplateListIntf
+class ArgumentListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    ArgumentListContext();
-    ArgumentListContext(const ArgumentList *al,Definition *def,const QCString &relPath);
-   ~ArgumentListContext();
+    static ArgumentListContext *alloc() { return new ArgumentListContext; }
+    static ArgumentListContext *alloc(const ArgumentList *al,Definition *def,const QCString &relPath)
+    { return new ArgumentListContext(al,def,relPath); }
 
     // TemplateListIntf
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
 
   private:
+    ArgumentListContext();
+    ArgumentListContext(const ArgumentList *al,Definition *def,const QCString &relPath);
+   ~ArgumentListContext();
     class Private;
     Private *p;
 };
index 7efb4f8..a99ec56 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 3f3ac3a..67c5433 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 8b8df0d..e841428 100644 (file)
@@ -252,7 +252,7 @@ public:
             COND_DOC_ERROR(idx < 0, QString("Anonymous namespace found."));
 
             m_namespaceStack.append(openNamespace(attributes.value(idx)));
-            openScopes(m_namespaceStack.last());
+            openScopes(m_namespaceStack.getLast());
         }
 
         if (EXTENSION("struct"))
@@ -291,7 +291,7 @@ public:
             m_currentEntry->type = getType(attributes).utf8();
 
             QString type(getDBusType(m_currentEntry->type));
-            m_structStack.last()->type.append(type.utf8());
+            m_structStack.getLast()->type.append(type.utf8());
         }
 
         if (EXTENSION("enum") || EXTENSION("flagset"))
@@ -348,9 +348,9 @@ public:
         // Clean up elements stack:
         // Since we made sure to get the elements in the proper order when
         // adding we do not need to do so again here.
-        COND_DOC_ERROR(m_elementStack.last()->element != qName.utf8(),
+        COND_DOC_ERROR(m_elementStack.getLast()->element != qName.utf8(),
                        QString("Malformed XML: Unexpected closing element found.").
-                       arg(m_elementStack.last()->element).utf8());
+                       arg(m_elementStack.getLast()->element).utf8());
         m_elementStack.removeLast();
 
         // Interface:
@@ -389,7 +389,7 @@ public:
 
         if (EXTENSION("namespace"))
         {
-            Entry * current = m_namespaceStack.last();
+            Entry * current = m_namespaceStack.getLast();
             CONDITION(!current, "end of namespace without start.");
             m_namespaceStack.removeLast();
 
@@ -399,7 +399,7 @@ public:
 
         if (EXTENSION("struct"))
         {
-            StructData * data = m_structStack.last();
+            StructData * data = m_structStack.getLast();
             CONDITION(!data, "end of struct without start.");
 
             data->entry->endBodyLine = lineNumber();
@@ -418,7 +418,7 @@ public:
 
         if (EXTENSION("member"))
         {
-           StructData * data = m_structStack.last();
+           StructData * data = m_structStack.getLast();
            CONDITION(!data, "end of member outside struct.");
            data->entry->addSubEntry(m_currentEntry);
         }
@@ -625,7 +625,7 @@ private:
         QCString scoped_name;
         if (!m_scopeStack.isEmpty())
         {
-            scoped_name = m_scopeStack.last()->scope->name;
+            scoped_name = m_scopeStack.getLast()->scope->name;
             scoped_name.append("::");
         }
         if (!type.isEmpty())
@@ -686,7 +686,7 @@ private:
             Entry * current_namespace = openNamespace(scope);
 
             if (!m_scopeStack.isEmpty())
-            { m_scopeStack.last()->scope->addSubEntry(current_namespace); }
+            { m_scopeStack.getLast()->scope->addSubEntry(current_namespace); }
 
             m_scopeStack.append(new ScopeData(current_namespace, m_scopeCount));
         }
@@ -699,7 +699,7 @@ private:
         object->name = scoped_name;
 
         if (!m_scopeStack.isEmpty())
-        { m_scopeStack.last()->scope->addSubEntry(object); }
+        { m_scopeStack.getLast()->scope->addSubEntry(object); }
         m_scopeStack.append(new ScopeData(object, m_scopeCount));
 
         ++m_scopeCount;
@@ -721,13 +721,13 @@ private:
 
     void closeScopes()
     {
-        const int current_scope_count(m_scopeStack.last()->count);
+        const int current_scope_count(m_scopeStack.getLast()->count);
 
         // Do not close the root scope.
         if (current_scope_count == 0)
         { return; }
 
-        while (current_scope_count == m_scopeStack.last()->count)
+        while (current_scope_count == m_scopeStack.getLast()->count)
         { m_scopeStack.removeLast(); }
     }
 
index a5000ff..e27ce11 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index e1affab..e17c03c 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 3d8cb87..5f11a1c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 58ecb05..f238be3 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 1dbabdb..6ebfe1d 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 5f64b66..164c100 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 4e0e5b8..358cd24 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 290a415..696fb5c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 76a64e1..75459c9 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 843ecec..7971cc4 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -54,9 +54,10 @@ class DefineList : public QList<Define>
   public:
     DefineList() : QList<Define>() {}
    ~DefineList() {}
-    int compareItems(QCollection::Item i1,QCollection::Item i2) 
+  private:
+    int compareValues(const Define *d1,const Define *d2) const
     {
-      return qstricmp(((Define *)i1)->name,((Define *)i2)->name); 
+      return qstricmp(d1->name,d2->name);
     }
 };
 
@@ -67,12 +68,12 @@ class DefineName : public QList<Define>
     DefineName(const char *n) : QList<Define>() { name=n; }
    ~DefineName() {}
     const char *nameString() const { return name; }
-    int compareItems(QCollection::Item i1,QCollection::Item i2) 
+
+  private:
+    int compareValues(const Define *d1,const Define *d2) const
     {
-      return qstricmp(((Define *)i1)->name,((Define *)i2)->name); 
+      return qstricmp(d1->name,d2->name);
     }
-    
-  private:
     QCString name;
 };
 
@@ -82,10 +83,10 @@ class DefineNameList : public QList<DefineName>
   public:
     DefineNameList() : QList<DefineName>() {}
    ~DefineNameList() {}
-    int compareItems(QCollection::Item i1,QCollection::Item i2)
+  private:
+    int compareValues(const DefineName *n1,const DefineName *n2) const
     {
-      return qstricmp(((DefineName *)i1)->nameString(),
-                    ((DefineName *)i2)->nameString());
+      return qstricmp(n1->nameString(),n2->nameString());
     }
 };
 
index 46147fc..c4b9f77 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -417,8 +417,9 @@ void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
 {
   if (!anchorList) return;
   //printf("%s: addSectionsToDefinition(%d)\n",name().data(),anchorList->count());
-  SectionInfo *si=anchorList->first();
-  while (si)
+  QListIterator<SectionInfo> it(*anchorList);
+  SectionInfo *si;
+  for (;(si=it.current());++it)
   {
     //printf("Add section `%s' to definition `%s'\n",
     //    si->label.data(),name().data());
@@ -429,7 +430,7 @@ void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
       gsi = new SectionInfo(*si);
       Doxygen::sectionDict->append(si->label,gsi);
     }
-    if (m_impl->sectionDict==0) 
+    if (m_impl->sectionDict==0)
     {
       m_impl->sectionDict = new SectionDict(17);
     }
@@ -438,7 +439,6 @@ void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
       m_impl->sectionDict->append(gsi->label,gsi);
       gsi->definition = this;
     }
-    si=anchorList->next();
   }
 }
 
index f444cc5..dfd9dad 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -371,11 +371,9 @@ class DefinitionList : public QList<Definition>, public DefinitionIntf
   public:
     ~DefinitionList() {}
     DefType definitionType() const { return TypeSymbolList; }
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+    int compareValues(const Definition *item1,const Definition *item2) const
     {
-      return qstricmp(((Definition *)item1)->name(),
-                     ((Definition *)item2)->name()
-                    );
+      return qstricmp(item1->name(),item2->name());
     }
 
 };
index 1032564..955171c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 01d5962..ca10332 100644 (file)
--- a/src/dia.h
+++ b/src/dia.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 80d0646..e50baec 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -209,18 +209,17 @@ static uint virtToMask(Specifier p)
 // pre: dil is not empty
 static Protection getMinProtectionLevel(DiagramItemList *dil)
 {
-  DiagramItem *di=dil->first();
+  QListIterator<DiagramItem> it(*dil);
+  DiagramItem *di=it.current();
   Protection result=di->protection();
-  di=dil->next();
-  while (di)
+  for (++it;(di=it.current());++it)
   {
     Protection p=di->protection();
-    if (p!=result) 
+    if (p!=result)
     {
       if (result==Protected && p==Public) result=p;
       else if (result==Private) result=p;
-    } 
-    di=dil->next();
+    }
   }
   return result;
 }
@@ -371,12 +370,12 @@ void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
   if (bcl)
   {
     /* there are base/sub classes */
-    BaseClassDef *bcd=bcl->first();
-    while (bcd)
+    BaseClassListIterator it(*bcl);
+    BaseClassDef *bcd;
+    for (;(bcd=it.current());++it)
     {
       ClassDef *ccd=bcd->classDef;
       if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/) count++;
-      bcd=bcl->next();
     }
   }
   if (count>0 && (prot!=Private || !doBases))
@@ -392,8 +391,9 @@ void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
       row=diagram->at(level+1);
     }
     /* insert base classes in the next row */
-    BaseClassDef *bcd=bcl->first();
-    while (bcd)
+    BaseClassListIterator it(*bcl);
+    BaseClassDef *bcd;
+    for (;(bcd=it.current());++it)
     {
       ClassDef *ccd=bcd->classDef;
       if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/)
@@ -402,7 +402,6 @@ void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
             doBases?bcd->virt:Normal,
             doBases?bcd->templSpecifiers.data():"");
       }
-      bcd=bcl->next();
     }
   }
 }
@@ -423,12 +422,12 @@ TreeDiagram::~TreeDiagram()
 void TreeDiagram::moveChildren(DiagramItem *root,int dx)
 {
   DiagramItemList *dil=root->getChildren();
-  DiagramItem *di=dil->first();
-  while (di)
+  QListIterator<DiagramItem> it(*dil);
+  DiagramItem *di;
+  for (;(di=it.current());++it)
   {
     di->move(dx,0);
     moveChildren(di,dx);
-    di=dil->next();
   }
 }
 
@@ -463,11 +462,11 @@ bool TreeDiagram::layoutTree(DiagramItem *root,int r)
     }
 
     // recurse to children
-    DiagramItem *di=dil->first();
-    while (di && !moved && !di->isInList())
+    QListIterator<DiagramItem> it(*dil);
+    DiagramItem *di;
+    for (;(di=it.current()) && !moved && !di->isInList();++it)
     {
       moved = layoutTree(di,r+1);
-      di=dil->next();
     }
   }
   return moved;
@@ -475,47 +474,49 @@ bool TreeDiagram::layoutTree(DiagramItem *root,int r)
 
 void TreeDiagram::computeLayout()
 {
-  DiagramRow *row=first();
-  while (row && row->count()<maxTreeWidth) row=next();
+  QListIterator<DiagramRow> it(*this);
+  DiagramRow *row;
+  for (;(row=it.current()) && row->count()<maxTreeWidth;++it) {}
   if (row)
   {
     //printf("computeLayout() list row at %d\n",row->number());
-    DiagramItem *di=row->first();
+    QListIterator<DiagramItem> rit(*row);
+    DiagramItem *di;
     DiagramItem *opi=0;
     int delta=0;
     bool first=TRUE;
-    while (di)
+    for (;(di=rit.current());++rit)
     {
       DiagramItem *pi=di->parentItem();
       if (pi==opi && !first) { delta-=gridWidth; }
       first = pi!=opi;
       opi=pi;
-      di->move(delta,0); // collapse all items in the same 
+      di->move(delta,0); // collapse all items in the same
                          // list (except the first)
       di->putInList();
-      di=row->next();
     }
   }
 
   // re-organize the diagram items
   DiagramItem *root=getFirst()->getFirst();
   while (layoutTree(root,0)) { }
-  
+
   // move first items of the lists
   if (row)
   {
-    DiagramItem *di=row->first();
-    while (di)
+    QListIterator<DiagramItem> rit(*row);
+    DiagramItem *di;
+    while ((di=rit.current()))
     {
       DiagramItem *pi=di->parentItem();
       if (pi->getChildren()->count()>1)
       {
         di->move(gridWidth,0);
-        while (di && di->parentItem()==pi) di=row->next();
+        while (di && di->parentItem()==pi) { ++rit; di=rit.current(); }
       }
       else
       {
-        di=row->next();
+        ++rit;
       }
     }
   }
@@ -525,24 +526,25 @@ uint TreeDiagram::computeRows()
 {
   //printf("TreeDiagram::computeRows()=%d\n",count());
   int count=0;
-  DiagramRow *row=first();
-  while (row && !row->getFirst()->isInList())
+  QListIterator<DiagramRow> it(*this);
+  DiagramRow *row;
+  for (;(row=it.current()) && !row->getFirst()->isInList();++it)
   {
     count++;
-    row=next();
   }
   //printf("count=%d row=%p\n",count,row);
   if (row)
   {
     int maxListLen=0;
     int curListLen=0;
-    DiagramItem *di=row->first(),*opi=0;
-    while (di)
+    DiagramItem *opi=0;
+    QListIterator<DiagramItem> rit(*row);
+    DiagramItem *di;
+    for (;(di=rit.current());++rit)
     {
       if (di->parentItem()!=opi) curListLen=1; else curListLen++; 
       if (curListLen>maxListLen) maxListLen=curListLen;
       opi=di->parentItem();
-      di=row->next();
     }
     //printf("maxListLen=%d\n",maxListLen);
     count+=maxListLen;
@@ -550,43 +552,22 @@ uint TreeDiagram::computeRows()
   return count;
 }
 
-#if 0
-uint TreeDiagram::computeCols()
-{
-  uint count=0;
-  DiagramRow *row=first();
-  while (row && !row->getFirst()->isInList())
-  {
-    if (row->count()>count) count=row->count();
-    row=next();
-  }
-  if (row)
-  {
-    row=prev();
-    uint cols=row->count();
-    if (row->getLast()->getChildren()->count()>1) cols++;
-    if (cols>count) count=cols;
-  }
-  return count;
-};
-#endif
-
 void TreeDiagram::computeExtremes(uint *maxLabelLen,uint *maxXPos)
 {
   uint ml=0,mx=0;
-  DiagramRow *dr=first();
+  QListIterator<DiagramRow> it(*this);
+  DiagramRow *dr;
   bool done=FALSE;
-  while (dr && !done)
+  for (;(dr=it.current()) && !done;++it)
   {
-    DiagramItem *di=dr->first();
-    while (di)
+    QListIterator<DiagramItem> rit(*dr);
+    DiagramItem *di;
+    for (;(di=rit.current());++rit)
     {
       if (di->isInList()) done=TRUE;
       if (maxXPos) mx=QMAX(mx,(uint)di->xPos());
       if (maxLabelLen) ml=QMAX(ml,Image::stringLength(di->label()));
-      di=dr->next();
     }
-    dr=next();
   }
   if (maxLabelLen) *maxLabelLen=ml;
   if (maxXPos)     *maxXPos=mx;
@@ -599,20 +580,22 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
                             QCString relPath,
                             bool generateMap)
 {
-  DiagramRow *dr=first();
-  if (!doBase) dr=next();
+  QListIterator<DiagramRow> it(*this);
+  DiagramRow *dr;
+  if (!doBase) ++it;
   bool done=FALSE;
   bool firstRow = doBase;
-  while (dr && !done)
+  for (;(dr=it.current()) && !done;++it)
   {
     int x=0,y=0;
     float xf=0.0f,yf=0.0f;
-    DiagramItem *di=dr->first();
+    QListIterator<DiagramItem> rit(*dr);
+    DiagramItem *di = rit.current();
     if (di->isInList()) // put boxes in a list
     {
       DiagramItem *opi=0;
-      if (doBase) di=dr->last();
-      while (di) 
+      if (doBase) rit.toLast(); else rit.toFirst();
+      while ((di=rit.current()))
       {
         if (di->parentItem()==opi)
         {
@@ -673,13 +656,13 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
           writeVectorBox(t,di,xf,yf,di->getChildren()->count()>0);
         }
         
-        if (doBase) di=dr->prev(); else di=dr->next();
+        if (doBase) --rit; else ++rit;
       }
       done=TRUE;
     }
     else // draw a tree of boxes
     {
-      while (di)
+      for (rit.toFirst();(di=rit.current());++rit)
       {
         if (bitmap)
         {
@@ -714,11 +697,8 @@ void TreeDiagram::drawBoxes(FTextStream &t,Image *image,
           }
           writeVectorBox(t,di,xf,yf);
         }
-
-        di=dr->next();
       }
     }
-    dr=next();
     firstRow=FALSE;
   }
 }
@@ -728,16 +708,18 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
                                  uint baseRows,uint superRows,
                                  uint cellWidth,uint cellHeight)
 {
-  DiagramRow *dr=first();
+  QListIterator<DiagramRow> it(*this);
+  DiagramRow *dr;
   bool done=FALSE;
-  while (dr && !done) // for each row
+  for (;(dr=it.current()) && !done;++it) // for each row
   {
-    DiagramItem *di=dr->first();
+    QListIterator<DiagramItem> rit(*dr);
+    DiagramItem *di = rit.current();
     if (di->isInList()) // row consists of list connectors
     {
       int x=0,y=0,ys=0;
       float xf=0.0f,yf=0.0f,ysf=0.0f;
-      while (di)
+      for (;(di=rit.current());++rit)
       {
         DiagramItem *pi=di->parentItem();
         DiagramItemList *dil=pi->getChildren();
@@ -849,7 +831,7 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
                 yf -= 1.0f;
               }
             }
-            di=dr->next();
+            ++rit; di=rit.current();
           }
           // add last horizonal line and a vertical connection line
           if (bitmap)
@@ -895,13 +877,12 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
             }
           }
         }
-        di=dr->next();
       }
       done=TRUE; // the tree is drawn now
     }
     else // normal tree connector
     {
-      while (di)
+      for (;(di=rit.current());++rit)
       {
         int x=0,y=0;
         DiagramItemList *dil = di->getChildren();
@@ -988,8 +969,8 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
             }
           }
           /* write input line */
-          DiagramItem *first = dil->first();
-          DiagramItem *last  = dil->last();
+          DiagramItem *first = dil->getFirst();
+          DiagramItem *last  = dil->getLast();
           if (first!=last && !first->isInList()) /* connect with all base classes */
           {
             if (bitmap)
@@ -1027,9 +1008,7 @@ void TreeDiagram::drawConnectors(FTextStream &t,Image *image,
             }
           }
         }
-        di=dr->next();
       }
-      dr=next();
     }
   }
 }
@@ -1053,8 +1032,8 @@ ClassDiagram::ClassDiagram(ClassDef *root)
   clearVisitFlags();
   super = new TreeDiagram(root,FALSE);
   super->computeLayout();
-  DiagramItem *baseItem  = base->first()->first();
-  DiagramItem *superItem = super->first()->first();
+  DiagramItem *baseItem  = base->getFirst()->getFirst();
+  DiagramItem *superItem = super->getFirst()->getFirst();
   int xbase  = baseItem->xPos();
   int xsuper = superItem->xPos();
   if (xbase>xsuper)
@@ -1307,35 +1286,34 @@ void ClassDiagram::writeFigure(FTextStream &output,const char *path,
   t << "boxfont setfont\n";
   t << "1 boundaspect scale\n";
 
-  
+
   bool done=FALSE;
-  DiagramRow *dr=base->first();
-  while (dr && !done)
+  QListIterator<DiagramRow> bit(*base);
+  DiagramRow *dr;
+  for (;(dr=bit.current()) && !done;++bit)
   {
-    DiagramItem *di=dr->first();
-    while (di)
+    QListIterator<DiagramItem> rit(*dr);
+    DiagramItem *di;
+    for (;(di=rit.current());++rit)
     {
       done=di->isInList();
       t << "(" << di->label() << ") cw\n";
-      di=dr->next();
     }
-    dr=base->next();
   }
-  dr=super->first();
-  dr=super->next();
+  QListIterator<DiagramRow> sit(*super);
+  ++sit;
   done=FALSE;
-  while (dr && !done)
+  for (;(dr=sit.current()) && !done;++sit)
   {
-    DiagramItem *di=dr->first();
-    while (di)
+    QListIterator<DiagramItem> rit(*dr);
+    DiagramItem *di;
+    for (;(di=rit.current());++rit)
     {
       done=di->isInList();
       t << "(" << di->label() << ") cw\n";
-      di=dr->next();
     }
-    dr=super->next();
   }
-  
+
   t << "/boxwidth boxwidth marginwidth 2 mul add def\n"
     << "/xspacing boxwidth distx add def\n"
     << "/yspacing boxheight disty add def\n"
index 62cab2e..6ce83f3 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 5df047a..284d1ee 100644 (file)
@@ -150,6 +150,7 @@ void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title)
         // ol.newParagraph();  // FIXME:PARA
         ol.enableAll();
         ol.disableAllBut(OutputGenerator::Man);
+        ol.enable(OutputGenerator::Latex);
         ol.writeString("\n\n");
       ol.popGeneratorState();
     }
@@ -224,8 +225,9 @@ void DirDef::writeSubDirList(OutputList &ol)
     ol.parseText(theTranslator->trDir(TRUE,FALSE));
     ol.endMemberHeader();
     ol.startMemberList();
-    DirDef *dd=m_subdirs.first();
-    while (dd)
+    QListIterator<DirDef> it(m_subdirs);
+    DirDef *dd;
+    for (;(dd=it.current());++it)
     {
       ol.startMemberDeclaration();
       ol.startMemberItem(dd->getOutputFileBase(),0);
@@ -250,7 +252,6 @@ void DirDef::writeSubDirList(OutputList &ol)
         ol.endMemberDescription();
       }
       ol.endMemberDeclaration(0,0);
-      dd=m_subdirs.next();
     }
 
     ol.endMemberList();
@@ -266,8 +267,9 @@ void DirDef::writeFileList(OutputList &ol)
     ol.parseText(theTranslator->trFile(TRUE,FALSE));
     ol.endMemberHeader();
     ol.startMemberList();
-    FileDef *fd=m_fileList->first();
-    while (fd)
+    QListIterator<FileDef> it(*m_fileList);
+    FileDef *fd;
+    for (;(fd=it.current());++it)
     {
       ol.startMemberDeclaration();
       ol.startMemberItem(fd->getOutputFileBase(),0);
@@ -313,7 +315,6 @@ void DirDef::writeFileList(OutputList &ol)
         ol.endMemberDescription();
       }
       ol.endMemberDeclaration(0,0);
-      fd=m_fileList->next();
     }
     ol.endMemberList();
   }
@@ -334,6 +335,12 @@ QCString DirDef::shortTitle() const
   return theTranslator->trDirReference(m_shortName);
 }
 
+bool DirDef::hasDetailedDescription() const
+{
+  static bool repeatBrief = Config_getBool("REPEAT_BRIEF");
+  return (!briefDescription().isEmpty() && repeatBrief) || !documentation().isEmpty();
+}
+
 void DirDef::writeDocumentation(OutputList &ol)
 {
   static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
@@ -584,10 +591,8 @@ bool DirDef::depGraphIsTrivial() const
 
 //----------------------------------------------------------------------
 
-int FilePairDict::compareItems(QCollection::Item item1,QCollection::Item item2)
+int FilePairDict::compareValues(const FilePair *left,const FilePair *right) const
 {
-  FilePair *left  = (FilePair*)item1;
-  FilePair *right = (FilePair*)item2;
   int orderHi = qstricmp(left->source()->name(),right->source()->name());
   int orderLo = qstricmp(left->destination()->name(),right->destination()->name());
   return orderHi==0 ? orderLo : orderHi;
index 8b11b2e..8f4fbc2 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -37,7 +37,7 @@ class DirDef;
 class DirList : public QList<DirDef>
 {
   public:
-   int compareItems(QCollection::Item item1,QCollection::Item item2);
+   int compareValues(const DirDef *item1,const DirDef *item2) const;
 };
 
 /** A model of a directory symbol. */
@@ -67,6 +67,7 @@ class DirDef : public Definition
     bool isParentOf(DirDef *dir) const;
     bool depGraphIsTrivial() const;
     QCString shortTitle() const;
+    bool hasDetailedDescription() const;
 
     // generate output
     void writeDocumentation(OutputList &ol);
@@ -122,7 +123,8 @@ class FilePairDict : public SDict<FilePair>
 {
   public:
     FilePairDict(int size) : SDict<FilePair>(size) {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2);
+  private:
+    int compareValues(const FilePair *item1,const FilePair *item2) const;
 };
 
 /** Usage information of a directory. */
@@ -160,9 +162,9 @@ class DirRelation
     UsedDir *m_dst;
 };
 
-inline int DirList::compareItems(QCollection::Item item1,QCollection::Item item2)
+inline int DirList::compareValues(const DirDef *item1,const DirDef *item2) const
 {
-  return qstricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
+  return qstricmp(item1->shortName(),item2->shortName());
 }
 
 /** A sorted dictionary of DirDef objects. */
@@ -170,9 +172,9 @@ class DirSDict : public SDict<DirDef>
 {
   public:
     DirSDict(int size) : SDict<DirDef>(size) {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+    int compareValues(const DirDef *item1,const DirDef *item2) const
     {
-      return qstricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
+      return qstricmp(item1->shortName(),item2->shortName());
     }
 };
 
index 47d3b98..2011333 100644 (file)
@@ -2,7 +2,7 @@
 *
 * 
 *
-* Copyright (C) 1997-2012 by Dimitri van Heesch.
+* Copyright (C) 1997-2014 by Dimitri van Heesch.
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation under the terms of the GNU General Public License is hereby
 
 //------------------
 
-static const char index_xsd[] =
-#include "index.xsd.h"
-;
-
-//------------------
-//
-static const char compound_xsd[] =
-#include "compound.xsd.h"
-;
-
-//------------------
-
 class DocbookSectionMapper : public QIntDict<char>
 {
   public:
index 344cb5b..0431cf2 100644 (file)
@@ -2,7 +2,7 @@
 *
 * 
 *
-* Copyright (C) 1997-2012 by Dimitri van Heesch.
+* Copyright (C) 1997-2014 by Dimitri van Heesch.
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation under the terms of the GNU General Public License is hereby
index aaea045..6867dce 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -33,6 +33,7 @@
 #include "filedef.h"
 #include "msc.h"
 #include "dia.h"
+#include "htmlentity.h"
 
 DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci)
   : DocVisitor(DocVisitor_Docbook), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
@@ -73,109 +74,14 @@ void DocbookDocVisitor::visit(DocWhiteSpace *w)
 void DocbookDocVisitor::visit(DocSymbol *s)
 {
   if (m_hide) return;
-  switch(s->symbol())
+  const char *res = HtmlEntityMapper::instance()->docbook(s->symbol());
+  if (res)
   {
-    case DocSymbol::BSlash:  m_t << "\\"; break;
-    case DocSymbol::At:      m_t << "@"; break;
-    case DocSymbol::Less:    m_t << "&lt;"; break;
-    case DocSymbol::Greater: m_t << "&gt;"; break;
-    case DocSymbol::Amp:     m_t << "&amp;"; break;
-    case DocSymbol::Dollar:  m_t << "$"; break;
-    case DocSymbol::Hash:    m_t << "#"; break;
-    case DocSymbol::DoubleColon: m_t << "::"; break;
-    case DocSymbol::Percent: m_t << "%"; break;
-    case DocSymbol::Copy:    m_t << "&#x00A9;"; break;
-    case DocSymbol::Tm:      m_t << "&#8482;"; break;
-    case DocSymbol::Reg:     m_t << "&#174;"; break;
-    case DocSymbol::Apos:    m_t << "&apos;"; break;
-    case DocSymbol::Quot:    m_t << "&quot;"; break;
-    case DocSymbol::Lsquo:   m_t << "&#8216;"; break;
-    case DocSymbol::Rsquo:   m_t << "&#8217;"; break;
-    case DocSymbol::Ldquo:   m_t << "&#8220;"; break;
-    case DocSymbol::Rdquo:   m_t << "&#8221;"; break;
-    case DocSymbol::Ndash:   m_t << "&#8211;"; break;
-    case DocSymbol::Mdash:   m_t << "&#8212;"; break;
-    case DocSymbol::Uml:     m_t << "&#168;"; break;
-    case DocSymbol::Acute:   m_t << "&#180;"; break;
-    case DocSymbol::Grave:   m_t << "&#192;"; break;
-    case DocSymbol::Circ:    m_t << "&#710;"; break;
-    case DocSymbol::Tilde:   m_t << "&#732;"; break;
-    case DocSymbol::Szlig:   m_t << "&#223;"; break;
-    case DocSymbol::Cedil:   m_t << "&#184;"; break;
-    case DocSymbol::Ring:    m_t << "&#197;"; break;
-    case DocSymbol::Slash:   m_t << "&#216;"; break;
-    case DocSymbol::Nbsp:    m_t << "&#160;"; break;
-    case DocSymbol::Aelig:   m_t << "&#230;"; break;
-    case DocSymbol::AElig:   m_t << "&#198;"; break;
-    case DocSymbol::GrkGamma:      m_t << "&#915;"; break;
-    case DocSymbol::GrkDelta:      m_t << "&#916;"; break;
-    case DocSymbol::GrkTheta:      m_t << "&#920;"; break;
-    case DocSymbol::GrkLambda:     m_t << "&#923;"; break;
-    case DocSymbol::GrkXi:         m_t << "&#926;"; break;
-    case DocSymbol::GrkPi:         m_t << "&#928;"; break;
-    case DocSymbol::GrkSigma:      m_t << "&#931;"; break;
-    case DocSymbol::GrkUpsilon:    m_t << "&#933;"; break;
-    case DocSymbol::GrkPhi:        m_t << "&#934;"; break;
-    case DocSymbol::GrkPsi:        m_t << "&#936;"; break;
-    case DocSymbol::GrkOmega:      m_t << "&#937;"; break;
-    case DocSymbol::Grkalpha:      m_t << "&#945;"; break;
-    case DocSymbol::Grkbeta:       m_t << "&#946;"; break;
-    case DocSymbol::Grkgamma:      m_t << "&#947;"; break;
-    case DocSymbol::Grkdelta:      m_t << "&#948;"; break;
-    case DocSymbol::Grkepsilon:    m_t << "&#949;"; break;
-    case DocSymbol::Grkzeta:       m_t << "&#950;"; break;
-    case DocSymbol::Grketa:        m_t << "&#951;"; break;
-    case DocSymbol::Grktheta:      m_t << "&#952;"; break;
-    case DocSymbol::Grkiota:       m_t << "&#953;"; break;
-    case DocSymbol::Grkkappa:      m_t << "&#954;"; break;
-    case DocSymbol::Grklambda:     m_t << "&#955;"; break;
-    case DocSymbol::Grkmu:         m_t << "&#956;"; break;
-    case DocSymbol::Grknu:         m_t << "&#957;"; break;
-    case DocSymbol::Grkxi:         m_t << "&#958;"; break;
-    case DocSymbol::Grkpi:         m_t << "&#960;"; break;
-    case DocSymbol::Grkrho:        m_t << "&#961;"; break;
-    case DocSymbol::Grksigma:      m_t << "&#963;"; break;
-    case DocSymbol::Grktau:        m_t << "&#964;"; break;
-    case DocSymbol::Grkupsilon:    m_t << "&#965;"; break;
-    case DocSymbol::Grkphi:        m_t << "&#966;"; break;
-    case DocSymbol::Grkchi:        m_t << "&#967;"; break;
-    case DocSymbol::Grkpsi:        m_t << "&#968;"; break;
-    case DocSymbol::Grkomega:      m_t << "&#969;"; break;
-    case DocSymbol::Grkvarsigma:   m_t << "&#962;"; break;
-    case DocSymbol::Section:       m_t << "<simplesect/>"; break;
-    case DocSymbol::Degree:        m_t << "&#176;"; break;
-    case DocSymbol::Prime:         m_t << "&#8242;"; break;
-    case DocSymbol::DoublePrime:   m_t << "&#8243;"; break;
-    case DocSymbol::Infinity:      m_t << "&#8734;"; break;
-    case DocSymbol::EmptySet:      m_t << "&#8709;"; break;
-    case DocSymbol::PlusMinus:     m_t << "&#177;"; break;
-    case DocSymbol::Times:         m_t << "&#215;"; break;
-    case DocSymbol::Minus:         m_t << "&#8722;"; break;
-    case DocSymbol::CenterDot:     m_t << "&#8901;"; break;
-    case DocSymbol::Partial:       m_t << "&#8706;"; break;
-    case DocSymbol::Nabla:         m_t << "&#8711;"; break;
-    case DocSymbol::SquareRoot:    m_t << "&#8730;"; break;
-    case DocSymbol::Perpendicular: m_t << "&#8869;"; break;
-    case DocSymbol::Sum:           m_t << "&#8721;"; break;
-    case DocSymbol::Integral:      m_t << "&#8747;"; break;
-    case DocSymbol::Product:       m_t << "&#8719;"; break;
-    case DocSymbol::Similar:       m_t << "&#8764;"; break;
-    case DocSymbol::Approx:        m_t << "&#8776;"; break;
-    case DocSymbol::NotEqual:      m_t << "&#8800;"; break;
-    case DocSymbol::Equivalent:    m_t << "&#8801;"; break;
-    case DocSymbol::Proportional:  m_t << "&#8733;"; break;
-    case DocSymbol::LessEqual:     m_t << "&#8804;"; break;
-    case DocSymbol::GreaterEqual:  m_t << "&#8805;"; break;
-    case DocSymbol::LeftArrow:     m_t << "&#8592;"; break;
-    case DocSymbol::RightArrow:    m_t << "&#8594;"; break;
-    case DocSymbol::SetIn:         m_t << "&#8712;"; break;
-    case DocSymbol::SetNotIn:      m_t << "&#8713;"; break;
-    case DocSymbol::LeftCeil:      m_t << "&#8968;"; break;
-    case DocSymbol::RightCeil:     m_t << "&#8969;"; break;
-    case DocSymbol::LeftFloor:     m_t << "&#8970;"; break;
-    case DocSymbol::RightFloor:    m_t << "&#8971;"; break;
-    default:
-                                   err("unknown symbol found\n");
+    m_t << res;
+  }
+  else
+  {
+    err("DocBook: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
   }
 }
 
@@ -379,6 +285,8 @@ void DocbookDocVisitor::visit(DocInclude *inc)
       break;
     case DocInclude::HtmlInclude:
       break;
+    case DocInclude::LatexInclude:
+      break;
     case DocInclude::VerbInclude:
       m_t << "<verbatim>";
       filter(inc->text());
@@ -453,7 +361,7 @@ void DocbookDocVisitor::visit(DocIndexEntry *ie)
 
 void DocbookDocVisitor::visit(DocSimpleSectSep *)
 {
-  m_t << "<simplesect/>";
+  m_t << "<simplesectsep/>";
 }
 
 void DocbookDocVisitor::visit(DocCite *cite)
index a03e04a..20d424e 100644 (file)
@@ -2,7 +2,7 @@
 *
 * 
 *
-* Copyright (C) 1997-2012 by Dimitri van Heesch.
+* Copyright (C) 1997-2014 by Dimitri van Heesch.
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation under the terms of the GNU General Public License is hereby
index 4a18b4e..e5e2895 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -53,6 +53,7 @@
 #include "config.h"
 #include "growbuf.h"
 #include "markdown.h"
+#include "htmlentity.h"
 
 // debug off
 #define DBG(x) do {} while(0)
@@ -1244,34 +1245,43 @@ reparsetoken:
       switch (Mappers::cmdMapper->map(tokenName))
       {
         case CMD_BSLASH:
-          children.append(new DocSymbol(parent,DocSymbol::BSlash));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_BSlash));
           break;
         case CMD_AT:
-          children.append(new DocSymbol(parent,DocSymbol::At));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_At));
           break;
         case CMD_LESS:
-          children.append(new DocSymbol(parent,DocSymbol::Less));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Less));
           break;
         case CMD_GREATER:
-          children.append(new DocSymbol(parent,DocSymbol::Greater));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Greater));
           break;
         case CMD_AMP:
-          children.append(new DocSymbol(parent,DocSymbol::Amp));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Amp));
           break;
         case CMD_DOLLAR:
-          children.append(new DocSymbol(parent,DocSymbol::Dollar));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Dollar));
           break;
         case CMD_HASH:
-          children.append(new DocSymbol(parent,DocSymbol::Hash));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Hash));
           break;
         case CMD_DCOLON:
-          children.append(new DocSymbol(parent,DocSymbol::DoubleColon));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_DoubleColon));
           break;
         case CMD_PERCENT:
-          children.append(new DocSymbol(parent,DocSymbol::Percent));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Percent));
+          break;
+        case CMD_NDASH:
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Minus));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Minus));
+          break;
+        case CMD_MDASH:
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Minus));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Minus));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Minus));
           break;
         case CMD_QUOTE:
-          children.append(new DocSymbol(parent,DocSymbol::Quot));
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Quot));
           break;
         case CMD_EMPHASIS:
           {
@@ -1319,7 +1329,7 @@ reparsetoken:
           {
             doctokenizerYYsetStateHtmlOnly();
             tok = doctokenizerYYlex();
-            children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
+            children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName,g_token->name=="block"));
             if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"htmlonly section ended without end marker");
             doctokenizerYYsetStatePara();
           }
@@ -1488,11 +1498,10 @@ reparsetoken:
       break;
     case TK_SYMBOL: 
       {
-        char letter='\0';
-        DocSymbol::SymType s = DocSymbol::decodeSymbol(tokenName,&letter);
-        if (s!=DocSymbol::Unknown)
+        DocSymbol::SymType s = DocSymbol::decodeSymbol(tokenName);
+        if (s!=DocSymbol::Sym_Unknown)
         {
-          children.append(new DocSymbol(parent,s,letter));
+          children.append(new DocSymbol(parent,s));
         }
         else
         {
@@ -1571,138 +1580,10 @@ static void handleImg(DocNode *parent,QList<DocNode> &children,const HtmlAttribL
 
 //---------------------------------------------------------------------------
 
-DocSymbol::SymType DocSymbol::decodeSymbol(const QCString &symName,char *letter)
-{
-  int l=symName.length();
-  DBG(("decodeSymbol(%s) l=%d\n",qPrint(symName),l));
-  // TODO: replace this with a hash
-  if      (symName=="&copy;")  return DocSymbol::Copy;
-  else if (symName=="&trade;") return DocSymbol::Tm;
-  else if (symName=="&tm;")    return DocSymbol::Tm; // alias for &trade;
-  else if (symName=="&reg;")   return DocSymbol::Reg;
-  else if (symName=="&lt;")    return DocSymbol::Less;
-  else if (symName=="&gt;")    return DocSymbol::Greater;
-  else if (symName=="&amp;")   return DocSymbol::Amp;
-  else if (symName=="&apos;")  return DocSymbol::Apos;
-  else if (symName=="&quot;")  return DocSymbol::Quot;
-  else if (symName=="&lsquo;") return DocSymbol::Lsquo;
-  else if (symName=="&rsquo;") return DocSymbol::Rsquo;
-  else if (symName=="&ldquo;") return DocSymbol::Ldquo;
-  else if (symName=="&rdquo;") return DocSymbol::Rdquo;
-  else if (symName=="&ndash;") return DocSymbol::Ndash;
-  else if (symName=="&mdash;") return DocSymbol::Mdash;
-  else if (symName=="&szlig;") return DocSymbol::Szlig;
-  else if (symName=="&nbsp;")  return DocSymbol::Nbsp;
-  else if (symName=="&AElig;") return DocSymbol::AElig;
-  else if (symName=="&aelig;") return DocSymbol::Aelig;
-  else if (symName=="&Gamma;")     return DocSymbol::GrkGamma;
-  else if (symName=="&Delta;")     return DocSymbol::GrkDelta;
-  else if (symName=="&Theta;")     return DocSymbol::GrkTheta;
-  else if (symName=="&Lambda;")    return DocSymbol::GrkLambda;
-  else if (symName=="&Xi;")        return DocSymbol::GrkXi;
-  else if (symName=="&Pi;")        return DocSymbol::GrkPi;
-  else if (symName=="&Sigma;")     return DocSymbol::GrkSigma;
-  else if (symName=="&Upsilon;")   return DocSymbol::GrkUpsilon;
-  else if (symName=="&Phi;")       return DocSymbol::GrkPhi;
-  else if (symName=="&Psi;")       return DocSymbol::GrkPsi;
-  else if (symName=="&Omega;")     return DocSymbol::GrkOmega;
-  else if (symName=="&alpha;")     return DocSymbol::Grkalpha;
-  else if (symName=="&beta;")      return DocSymbol::Grkbeta;
-  else if (symName=="&gamma;")     return DocSymbol::Grkgamma;
-  else if (symName=="&delta;")     return DocSymbol::Grkdelta;
-  else if (symName=="&epsilon;")   return DocSymbol::Grkepsilon;
-  else if (symName=="&zeta;")      return DocSymbol::Grkzeta;
-  else if (symName=="&eta;")       return DocSymbol::Grketa;
-  else if (symName=="&theta;")     return DocSymbol::Grktheta;
-  else if (symName=="&iota;")      return DocSymbol::Grkiota;
-  else if (symName=="&kappa;")     return DocSymbol::Grkkappa;
-  else if (symName=="&lambda;")    return DocSymbol::Grklambda;
-  else if (symName=="&mu;")        return DocSymbol::Grkmu;
-  else if (symName=="&nu;")        return DocSymbol::Grknu;
-  else if (symName=="&xi;")        return DocSymbol::Grkxi;
-  else if (symName=="&pi;")        return DocSymbol::Grkpi;
-  else if (symName=="&rho;")       return DocSymbol::Grkrho;
-  else if (symName=="&sigma;")     return DocSymbol::Grksigma;
-  else if (symName=="&tau;")       return DocSymbol::Grktau;
-  else if (symName=="&upsilon;")   return DocSymbol::Grkupsilon;
-  else if (symName=="&phi;")       return DocSymbol::Grkphi;
-  else if (symName=="&chi;")       return DocSymbol::Grkchi;
-  else if (symName=="&psi;")       return DocSymbol::Grkpsi;
-  else if (symName=="&omega;")     return DocSymbol::Grkomega;
-  else if (symName=="&sigmaf;")    return DocSymbol::Grkvarsigma;
-  else if (symName=="&sect;")      return DocSymbol::Section;
-  else if (symName=="&deg;")       return DocSymbol::Degree;
-  else if (symName=="&prime;")     return DocSymbol::Prime;
-  else if (symName=="&Prime;")     return DocSymbol::DoublePrime;
-  else if (symName=="&infin;")     return DocSymbol::Infinity;
-  else if (symName=="&empty;")     return DocSymbol::EmptySet;
-  else if (symName=="&plusmn;")    return DocSymbol::PlusMinus;
-  else if (symName=="&times;")     return DocSymbol::Times;
-  else if (symName=="&minus;")     return DocSymbol::Minus;
-  else if (symName=="&sdot;")      return DocSymbol::CenterDot;
-  else if (symName=="&part;")      return DocSymbol::Partial;
-  else if (symName=="&nabla;")     return DocSymbol::Nabla;
-  else if (symName=="&radic;")     return DocSymbol::SquareRoot;
-  else if (symName=="&perp;")      return DocSymbol::Perpendicular;
-  else if (symName=="&sum;")       return DocSymbol::Sum;
-  else if (symName=="&int;")       return DocSymbol::Integral;
-  else if (symName=="&prod;")      return DocSymbol::Product;
-  else if (symName=="&sim;")       return DocSymbol::Similar;
-  else if (symName=="&asymp;")     return DocSymbol::Approx;
-  else if (symName=="&ne;")        return DocSymbol::NotEqual;
-  else if (symName=="&equiv;")     return DocSymbol::Equivalent;
-  else if (symName=="&prop;")      return DocSymbol::Proportional;
-  else if (symName=="&le;")        return DocSymbol::LessEqual;
-  else if (symName=="&ge;")        return DocSymbol::GreaterEqual;
-  else if (symName=="&larr;")      return DocSymbol::LeftArrow;
-  else if (symName=="&rarr;")      return DocSymbol::RightArrow;
-  else if (symName=="&isin;")      return DocSymbol::SetIn;
-  else if (symName=="&notin;")     return DocSymbol::SetNotIn;
-  else if (symName=="&lceil;")     return DocSymbol::LeftCeil;
-  else if (symName=="&rceil;")     return DocSymbol::RightCeil;
-  else if (symName=="&lfloor;")    return DocSymbol::LeftFloor;
-  else if (symName=="&rfloor;")    return DocSymbol::RightFloor;
-  else if (l==6 && symName.right(4)=="uml;")  
-  {
-    *letter=symName.at(1);
-    return DocSymbol::Uml;
-  }
-  else if (l==8 && symName.right(6)=="acute;")  
-  {
-    *letter=symName.at(1);
-    return DocSymbol::Acute;
-  }
-  else if (l==8 && symName.right(6)=="grave;")
-  {
-    *letter=symName.at(1);
-    return DocSymbol::Grave;
-  }
-  else if (l==7 && symName.right(5)=="circ;")
-  {
-    *letter=symName.at(1);
-    return DocSymbol::Circ;
-  }
-  else if (l==8 && symName.right(6)=="tilde;")
-  {
-    *letter=symName.at(1);
-    return DocSymbol::Tilde;
-  }
-  else if (l==8 && symName.right(6)=="cedil;")
-  {
-    *letter=symName.at(1);
-    return DocSymbol::Cedil;
-  }
-  else if (l==7 && symName.right(5)=="ring;")
-  {
-    *letter=symName.at(1);
-    return DocSymbol::Ring;
-  }
-  else if (l==8 && symName.right(6)=="slash;")
-  {
-    *letter=symName.at(1);
-    return DocSymbol::Slash;
-  }
-  return DocSymbol::Unknown;
+DocSymbol::SymType DocSymbol::decodeSymbol(const QCString &symName)
+{
+  DBG(("decodeSymbol(%s)\n",qPrint(symName)));
+  return HtmlEntityMapper::instance()->name2sym(symName);
 }
 
 //---------------------------------------------------------------------------
@@ -1719,9 +1600,9 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children,
   // first parse any number of paragraphs
   bool isFirst=TRUE;
   DocPara *lastPar=0;
-  if (!children.isEmpty() && children.last()->kind()==DocNode::Kind_Para)
+  if (!children.isEmpty() && children.getLast()->kind()==DocNode::Kind_Para)
   { // last child item was a paragraph
-    lastPar = (DocPara*)children.last();
+    lastPar = (DocPara*)children.getLast();
     isFirst=FALSE;
   }
   do
@@ -1873,12 +1754,12 @@ DocAnchor::DocAnchor(DocNode *parent,const QCString &id,bool newAnchor)
 
 DocVerbatim::DocVerbatim(DocNode *parent,const QCString &context,
     const QCString &text, Type t,bool isExample,
-    const QCString &exampleFile,const QCString &lang) 
+    const QCString &exampleFile,bool isBlock,const QCString &lang)
   : m_context(context), m_text(text), m_type(t),
-    m_isExample(isExample), m_exampleFile(exampleFile), 
-    m_relPath(g_relPath), m_lang(lang)
-{ 
-  m_parent = parent; 
+    m_isExample(isExample), m_exampleFile(exampleFile),
+    m_relPath(g_relPath), m_lang(lang), m_isBlock(isBlock)
+{
+  m_parent = parent;
 }
 
 
@@ -1905,6 +1786,9 @@ void DocInclude::parse()
     case HtmlInclude:
       readTextFileByName(m_file,m_text);
       break;
+    case LatexInclude:
+      readTextFileByName(m_file,m_text);
+      break;
     case Snippet:
       readTextFileByName(m_file,m_text);
       // check here for the existence of the blockId inside the file, so we
@@ -3369,26 +3253,25 @@ int DocIndexEntry::parse()
         break;
       case TK_SYMBOL:
         {
-          char letter='\0';
-          DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name,&letter);
+          DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name);
           switch (s)
           {
-            case DocSymbol::BSlash:  m_entry+='\\'; break;
-            case DocSymbol::At:      m_entry+='@';  break;
-            case DocSymbol::Less:    m_entry+='<';  break;
-            case DocSymbol::Greater: m_entry+='>';  break;
-            case DocSymbol::Amp:     m_entry+='&';  break;
-            case DocSymbol::Dollar:  m_entry+='$';  break;
-            case DocSymbol::Hash:    m_entry+='#';  break;
-            case DocSymbol::Percent: m_entry+='%';  break;
-            case DocSymbol::Apos:    m_entry+='\''; break;
-            case DocSymbol::Quot:    m_entry+='"';  break;
-            case DocSymbol::Lsquo:   m_entry+='`';  break;
-            case DocSymbol::Rsquo:   m_entry+='\'';  break;
-            case DocSymbol::Ldquo:   m_entry+="``";  break;
-            case DocSymbol::Rdquo:   m_entry+="''";  break;
-            case DocSymbol::Ndash:   m_entry+="--";  break;
-            case DocSymbol::Mdash:   m_entry+="---";  break;
+            case DocSymbol::Sym_BSlash:  m_entry+='\\'; break;
+            case DocSymbol::Sym_At:      m_entry+='@';  break;
+            case DocSymbol::Sym_Less:    m_entry+='<';  break;
+            case DocSymbol::Sym_Greater: m_entry+='>';  break;
+            case DocSymbol::Sym_Amp:     m_entry+='&';  break;
+            case DocSymbol::Sym_Dollar:  m_entry+='$';  break;
+            case DocSymbol::Sym_Hash:    m_entry+='#';  break;
+            case DocSymbol::Sym_Percent: m_entry+='%';  break;
+            case DocSymbol::Sym_apos:    m_entry+='\''; break;
+            case DocSymbol::Sym_Quot:    m_entry+='"';  break;
+            case DocSymbol::Sym_lsquo:   m_entry+='`';  break;
+            case DocSymbol::Sym_rsquo:   m_entry+='\'';  break;
+            case DocSymbol::Sym_ldquo:   m_entry+="``";  break;
+            case DocSymbol::Sym_rdquo:   m_entry+="''";  break;
+            case DocSymbol::Sym_ndash:   m_entry+="--";  break;
+            case DocSymbol::Sym_mdash:   m_entry+="---";  break;
             default:
               warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected symbol found as argument of \\addindex");
               break;
@@ -3407,6 +3290,8 @@ int DocIndexEntry::parse()
         case CMD_HASH:    m_entry+='#';  break;
         case CMD_DCOLON:  m_entry+="::"; break;
         case CMD_PERCENT: m_entry+='%';  break;
+        case CMD_NDASH:   m_entry+="--";  break;
+        case CMD_MDASH:   m_entry+="---";  break;
         case CMD_QUOTE:   m_entry+='"';  break;
         default:
           warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command %s found as argument of \\addindex",
@@ -4654,8 +4539,8 @@ int DocSimpleSect::parse(bool userTitle,bool needsSeparator)
   }
   else
   {
-    ASSERT(m_children.last()->kind()==DocNode::Kind_Para);
-    ((DocPara *)m_children.last())->markLast(FALSE);
+    ASSERT(m_children.getLast()->kind()==DocNode::Kind_Para);
+    ((DocPara *)m_children.getLast())->markLast(FALSE);
   }
   par->markLast();
   if (needsSeparator) m_children.append(new DocSimpleSectSep(this));
@@ -4705,8 +4590,8 @@ int DocSimpleSect::parseXml()
     }
     else
     {
-      ASSERT(m_children.last()->kind()==DocNode::Kind_Para);
-      ((DocPara *)m_children.last())->markLast(FALSE);
+      ASSERT(m_children.getLast()->kind()==DocNode::Kind_Para);
+      ((DocPara *)m_children.getLast())->markLast(FALSE);
     }
     par->markLast();
     m_children.append(par);
@@ -4730,14 +4615,14 @@ int DocSimpleSect::parseXml()
 void DocSimpleSect::appendLinkWord(const QCString &word)
 {
   DocPara *p;
-  if (m_children.isEmpty() || m_children.last()->kind()!=DocNode::Kind_Para)
+  if (m_children.isEmpty() || m_children.getLast()->kind()!=DocNode::Kind_Para)
   {
     p = new DocPara(this);
     m_children.append(p);
   }
   else
   {
-    p = (DocPara *)m_children.last();
+    p = (DocPara *)m_children.getLast();
     
     // Comma-seperate <seealso> links.
     p->injectToken(TK_WORD,",");
@@ -4881,7 +4766,7 @@ int DocParamList::parseXml(const QCString &paramName)
       }
       else
       {
-        m_paragraphs.last()->markLast(FALSE);
+        m_paragraphs.getLast()->markLast(FALSE);
       }
       par->markLast();
       m_paragraphs.append(par);
@@ -4932,8 +4817,8 @@ int DocParamSect::parse(const QCString &cmdName,bool xmlContext, Direction d)
   }
   else
   {
-    ASSERT(m_children.last()->kind()==DocNode::Kind_ParamList);
-    ((DocParamList *)m_children.last())->markLast(FALSE);
+    ASSERT(m_children.getLast()->kind()==DocNode::Kind_ParamList);
+    ((DocParamList *)m_children.getLast())->markLast(FALSE);
     pl->markLast();
   }
   m_children.append(pl);
@@ -4945,6 +4830,10 @@ int DocParamSect::parse(const QCString &cmdName,bool xmlContext, Direction d)
   {
     retval = pl->parse(cmdName);
   }
+  if (retval==RetVal_EndParBlock)
+  {
+    retval = RetVal_OK;
+  }
   
   DBG(("DocParamSect::parse() end retval=%d\n",retval));
   DocNode *n=g_nodeStack.pop();
@@ -4959,12 +4848,12 @@ int DocPara::handleSimpleSection(DocSimpleSect::Type t, bool xmlContext)
   DocSimpleSect *ss=0;
   bool needsSeparator = FALSE;
   if (!m_children.isEmpty() &&                           // previous element
-      m_children.last()->kind()==Kind_SimpleSect &&      // was a simple sect
-      ((DocSimpleSect *)m_children.last())->type()==t && // of same type
+      m_children.getLast()->kind()==Kind_SimpleSect &&      // was a simple sect
+      ((DocSimpleSect *)m_children.getLast())->type()==t && // of same type
       t!=DocSimpleSect::User)                            // but not user defined
   {
     // append to previous section
-    ss=(DocSimpleSect *)m_children.last();
+    ss=(DocSimpleSect *)m_children.getLast();
     needsSeparator = TRUE;
   }
   else // start new section
@@ -4991,11 +4880,11 @@ int DocPara::handleParamSection(const QCString &cmdName,
 {
   DocParamSect *ps=0;
   if (!m_children.isEmpty() &&                        // previous element
-      m_children.last()->kind()==Kind_ParamSect &&    // was a param sect
-      ((DocParamSect *)m_children.last())->type()==t) // of same type
+      m_children.getLast()->kind()==Kind_ParamSect &&    // was a param sect
+      ((DocParamSect *)m_children.getLast())->type()==t) // of same type
   {
     // append to previous section
-    ps=(DocParamSect *)m_children.last();
+    ps=(DocParamSect *)m_children.getLast();
   }
   else // start new section
   {
@@ -5086,13 +4975,15 @@ void DocPara::handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type
     return;
   }
   DocIncOperator *op = new DocIncOperator(this,t,g_token->name,g_context,g_isExample,g_exampleName);
-  DocNode *n1 = m_children.last();
-  DocNode *n2 = n1!=0 ? m_children.prev() : 0;
+  QListIterator<DocNode> it(m_children);
+  DocNode *n1 = it.toLast();
+  --it;
+  DocNode *n2 = n1!=0 ? it.current() : 0;
   bool isFirst = n1==0 || // no last node
-                 (n1->kind()!=DocNode::Kind_IncOperator && 
+                 (n1->kind()!=DocNode::Kind_IncOperator &&
                   n1->kind()!=DocNode::Kind_WhiteSpace
                  ) || // last node is not operator or whitespace
-                 (n1->kind()==DocNode::Kind_WhiteSpace && 
+                 (n1->kind()==DocNode::Kind_WhiteSpace &&
                   n2!=0 && n2->kind()!=DocNode::Kind_IncOperator
                  ); // previous not is not operator
   op->markFirst(isFirst);
@@ -5400,7 +5291,7 @@ int DocPara::handleStartCode()
     if (g_token->verb.at(i)=='\n') li=i+1;
     i++;
   }
-  m_children.append(new DocVerbatim(this,g_context,stripIndentation(g_token->verb.mid(li)),DocVerbatim::Code,g_isExample,g_exampleName,lang));
+  m_children.append(new DocVerbatim(this,g_context,stripIndentation(g_token->verb.mid(li)),DocVerbatim::Code,g_isExample,g_exampleName,FALSE,lang));
   if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"code section ended without end marker");
   doctokenizerYYsetStatePara();
   return retval;
@@ -5464,37 +5355,46 @@ int DocPara::handleCommand(const QCString &cmdName)
       if (retval!=TK_WORD) m_children.append(new DocWhiteSpace(this," "));
       break;
     case CMD_BSLASH:
-      m_children.append(new DocSymbol(this,DocSymbol::BSlash));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_BSlash));
       break;
     case CMD_AT:
-      m_children.append(new DocSymbol(this,DocSymbol::At));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_At));
       break;
     case CMD_LESS:
-      m_children.append(new DocSymbol(this,DocSymbol::Less));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Less));
       break;
     case CMD_GREATER:
-      m_children.append(new DocSymbol(this,DocSymbol::Greater));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Greater));
       break;
     case CMD_AMP:
-      m_children.append(new DocSymbol(this,DocSymbol::Amp));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Amp));
       break;
     case CMD_DOLLAR:
-      m_children.append(new DocSymbol(this,DocSymbol::Dollar));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Dollar));
       break;
     case CMD_HASH:
-      m_children.append(new DocSymbol(this,DocSymbol::Hash));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Hash));
       break;
     case CMD_PIPE:
-      m_children.append(new DocSymbol(this,DocSymbol::Pipe));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Pipe));
       break;
     case CMD_DCOLON:
-      m_children.append(new DocSymbol(this,DocSymbol::DoubleColon));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_DoubleColon));
       break;
     case CMD_PERCENT:
-      m_children.append(new DocSymbol(this,DocSymbol::Percent));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Percent));
+      break;
+    case CMD_NDASH:
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+      break;
+    case CMD_MDASH:
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
       break;
     case CMD_QUOTE:
-      m_children.append(new DocSymbol(this,DocSymbol::Quot));
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Quot));
       break;
     case CMD_SA:
       g_inSeeBlock=TRUE;
@@ -5588,7 +5488,7 @@ int DocPara::handleCommand(const QCString &cmdName)
       {
         doctokenizerYYsetStateHtmlOnly();
         retval = doctokenizerYYlex();
-        m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
+        m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName,g_token->name=="block"));
         if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"htmlonly section ended without end marker");
         doctokenizerYYsetStatePara();
       }
@@ -5751,6 +5651,9 @@ int DocPara::handleCommand(const QCString &cmdName)
     case CMD_HTMLINCLUDE:
       handleInclude(cmdName,DocInclude::HtmlInclude);
       break;
+    case CMD_LATEXINCLUDE:
+      handleInclude(cmdName,DocInclude::LatexInclude);
+      break;
     case CMD_VERBINCLUDE:
       handleInclude(cmdName,DocInclude::VerbInclude);
       break;
@@ -6468,7 +6371,7 @@ reparsetoken:
                // remove leading whitespace 
                !m_children.isEmpty()  && 
                // and whitespace after certain constructs
-               (k=m_children.last()->kind())!=DocNode::Kind_HtmlDescList &&
+               (k=m_children.getLast()->kind())!=DocNode::Kind_HtmlDescList &&
                k!=DocNode::Kind_HtmlTable &&
                k!=DocNode::Kind_HtmlList &&
                k!=DocNode::Kind_SimpleSect &&
@@ -6685,11 +6588,10 @@ reparsetoken:
         break;
       case TK_SYMBOL:     
         {
-          char letter='\0';
-          DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name,&letter);
-          if (s!=DocSymbol::Unknown)
+          DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name);
+          if (s!=DocSymbol::Sym_Unknown)
           {
-            m_children.append(new DocSymbol(this,s,letter));
+            m_children.append(new DocSymbol(this,s));
           }
           else
           {
@@ -6904,11 +6806,10 @@ void DocText::parse()
        break;
       case TK_SYMBOL:     
         {
-          char letter='\0';
-          DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name,&letter);
-          if (s!=DocSymbol::Unknown)
+          DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name);
+          if (s!=DocSymbol::Sym_Unknown)
           {
-            m_children.append(new DocSymbol(this,s,letter));
+            m_children.append(new DocSymbol(this,s));
           }
           else
           {
@@ -6921,34 +6822,43 @@ void DocText::parse()
         switch (Mappers::cmdMapper->map(g_token->name))
         {
           case CMD_BSLASH:
-            m_children.append(new DocSymbol(this,DocSymbol::BSlash));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_BSlash));
             break;
           case CMD_AT:
-            m_children.append(new DocSymbol(this,DocSymbol::At));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_At));
             break;
           case CMD_LESS:
-            m_children.append(new DocSymbol(this,DocSymbol::Less));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Less));
             break;
           case CMD_GREATER:
-            m_children.append(new DocSymbol(this,DocSymbol::Greater));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Greater));
             break;
           case CMD_AMP:
-            m_children.append(new DocSymbol(this,DocSymbol::Amp));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Amp));
             break;
           case CMD_DOLLAR:
-            m_children.append(new DocSymbol(this,DocSymbol::Dollar));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Dollar));
             break;
           case CMD_HASH:
-            m_children.append(new DocSymbol(this,DocSymbol::Hash));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Hash));
             break;
           case CMD_DCOLON:
-            m_children.append(new DocSymbol(this,DocSymbol::DoubleColon));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_DoubleColon));
             break;
           case CMD_PERCENT:
-            m_children.append(new DocSymbol(this,DocSymbol::Percent));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Percent));
+            break;
+          case CMD_NDASH:
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+            break;
+          case CMD_MDASH:
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
             break;
           case CMD_QUOTE:
-            m_children.append(new DocSymbol(this,DocSymbol::Quot));
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Quot));
             break;
           default:
             warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command `%s' found",
index 050c871..fb4f084 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -336,34 +336,84 @@ class DocStyleChange : public DocNode
 class DocSymbol : public DocNode
 {
   public:
-    enum SymType { Unknown=0, BSlash, At, Less, Greater, Amp, Dollar, Hash,
-                   DoubleColon, Percent, Copy, Tm, Reg, Apos, Quot, Uml, Acute, 
-                   Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Slash, 
-                   Lsquo, Rsquo, Ldquo, Rdquo, Ndash, Mdash, Aelig, AElig,
-                   GrkGamma, GrkDelta, GrkTheta, GrkLambda, GrkXi, GrkPi,
-                   GrkSigma, GrkUpsilon, GrkPhi, GrkPsi, GrkOmega, Grkalpha,
-                   Grkbeta, Grkgamma, Grkdelta, Grkepsilon, Grkzeta, Grketa,
-                   Grktheta, Grkiota, Grkkappa, Grklambda, Grkmu, Grknu, Grkxi,
-                   Grkpi, Grkrho, Grksigma, Grktau, Grkupsilon, Grkphi, Grkchi,
-                   Grkpsi, Grkomega, Grkvarsigma, Section, Degree, Prime,
-                   DoublePrime, Infinity, EmptySet, PlusMinus, Times, Minus,
-                   CenterDot, Partial, Nabla, SquareRoot, Perpendicular, Sum,
-                   Integral, Product, Similar, Approx, NotEqual, Equivalent,
-                   Proportional, LessEqual, GreaterEqual, LeftArrow, RightArrow,
-                   SetIn, SetNotIn, LeftCeil, RightCeil, LeftFloor, RightFloor,
-                   Pipe
+    enum SymType { Sym_Unknown = -1,
+                   Sym_nbsp, Sym_iexcl, Sym_cent, Sym_pound, Sym_curren,
+                   Sym_yen, Sym_brvbar, Sym_sect, Sym_uml, Sym_copy,
+                   Sym_ordf, Sym_laquo, Sym_not, Sym_shy, Sym_reg,
+                   Sym_macr, Sym_deg, Sym_plusmn, Sym_sup2, Sym_sup3,
+                   Sym_acute, Sym_micro, Sym_para, Sym_middot, Sym_cedil,
+                   Sym_sup1, Sym_ordm, Sym_raquo, Sym_frac14, Sym_frac12,
+                   Sym_frac34, Sym_iquest, Sym_Agrave, Sym_Aacute, Sym_Acirc,
+                   Sym_Atilde, Sym_Auml, Sym_Aring, Sym_AElig, Sym_Ccedil,
+                   Sym_Egrave, Sym_Eacute, Sym_Ecirc, Sym_Euml, Sym_Igrave,
+                   Sym_Iacute, Sym_Icirc, Sym_Iuml, Sym_ETH, Sym_Ntilde,
+                   Sym_Ograve, Sym_Oacute, Sym_Ocirc, Sym_Otilde, Sym_Ouml,
+                   Sym_times, Sym_Oslash, Sym_Ugrave, Sym_Uacute, Sym_Ucirc,
+                   Sym_Uuml, Sym_Yacute, Sym_THORN, Sym_szlig, Sym_agrave,
+                   Sym_aacute, Sym_acirc, Sym_atilde, Sym_auml, Sym_aring,
+                   Sym_aelig, Sym_ccedil, Sym_egrave, Sym_eacute, Sym_ecirc,
+                   Sym_euml, Sym_igrave, Sym_iacute, Sym_icirc, Sym_iuml,
+                   Sym_eth, Sym_ntilde, Sym_ograve, Sym_oacute, Sym_ocirc,
+                   Sym_otilde, Sym_ouml, Sym_divide, Sym_oslash, Sym_ugrave,
+                   Sym_uacute, Sym_ucirc, Sym_uuml, Sym_yacute, Sym_thorn,
+                   Sym_yuml, Sym_fnof, Sym_Alpha, Sym_Beta, Sym_Gamma,
+                   Sym_Delta, Sym_Epsilon, Sym_Zeta, Sym_Eta, Sym_Theta,
+                   Sym_Iota, Sym_Kappa, Sym_Lambda, Sym_Mu, Sym_Nu,
+                   Sym_Xi, Sym_Omicron, Sym_Pi, Sym_Rho, Sym_Sigma,
+                   Sym_Tau, Sym_Upsilon, Sym_Phi, Sym_Chi, Sym_Psi,
+                   Sym_Omega, Sym_alpha, Sym_beta, Sym_gamma, Sym_delta,
+                   Sym_epsilon, Sym_zeta, Sym_eta, Sym_theta, Sym_iota,
+                   Sym_kappa, Sym_lambda, Sym_mu, Sym_nu, Sym_xi,
+                   Sym_omicron, Sym_pi, Sym_rho, Sym_sigmaf, Sym_sigma,
+                   Sym_tau, Sym_upsilon, Sym_phi, Sym_chi, Sym_psi,
+                   Sym_omega, Sym_thetasym, Sym_upsih, Sym_piv, Sym_bull,
+                   Sym_hellip, Sym_prime, Sym_Prime, Sym_oline, Sym_frasl,
+                   Sym_weierp, Sym_image, Sym_real, Sym_trade, Sym_alefsym,
+                   Sym_larr, Sym_uarr, Sym_rarr, Sym_darr, Sym_harr,
+                   Sym_crarr, Sym_lArr, Sym_uArr, Sym_rArr, Sym_dArr,
+                   Sym_hArr, Sym_forall, Sym_part, Sym_exist, Sym_empty,
+                   Sym_nabla, Sym_isin, Sym_notin, Sym_ni, Sym_prod,
+                   Sym_sum, Sym_minus, Sym_lowast, Sym_radic, Sym_prop,
+                   Sym_infin, Sym_ang, Sym_and, Sym_or, Sym_cap,
+                   Sym_cup, Sym_int, Sym_there4, Sym_sim, Sym_cong,
+                   Sym_asymp, Sym_ne, Sym_equiv, Sym_le, Sym_ge,
+                   Sym_sub, Sym_sup, Sym_nsub, Sym_sube, Sym_supe,
+                   Sym_oplus, Sym_otimes, Sym_perp, Sym_sdot, Sym_lceil,
+                   Sym_rceil, Sym_lfloor, Sym_rfloor, Sym_lang, Sym_rang,
+                   Sym_loz, Sym_spades, Sym_clubs, Sym_hearts, Sym_diams,
+                   Sym_quot, Sym_amp, Sym_lt, Sym_gt, Sym_OElig,
+                   Sym_oelig, Sym_Scaron, Sym_scaron, Sym_Yuml, Sym_circ,
+                   Sym_tilde, Sym_ensp, Sym_emsp, Sym_thinsp, Sym_zwnj,
+                   Sym_zwj, Sym_lrm, Sym_rlm, Sym_ndash, Sym_mdash,
+                   Sym_lsquo, Sym_rsquo, Sym_sbquo, Sym_ldquo, Sym_rdquo,
+                   Sym_bdquo, Sym_dagger, Sym_Dagger, Sym_permil, Sym_lsaquo,
+                   Sym_rsaquo, Sym_euro,
+
+                   /* doxygen extensions */
+                   Sym_tm, Sym_apos,
+
+                   /* doxygen commands mapped */
+                   Sym_BSlash, Sym_At, Sym_Less, Sym_Greater, Sym_Amp,
+                   Sym_Dollar, Sym_Hash, Sym_DoubleColon, Sym_Percent, Sym_Pipe,
+                   Sym_Quot, Sym_Minus
                  };
-    DocSymbol(DocNode *parent,SymType s,char letter='\0') : 
-      m_symbol(s), m_letter(letter) { m_parent = parent; }
+    enum PerlType { Perl_unknown = 0, Perl_string, Perl_char, Perl_symbol, Perl_umlaut,
+                    Perl_acute, Perl_grave, Perl_circ, Perl_slash, Perl_tilde,
+                    Perl_cedilla, Perl_ring
+                  };
+    typedef struct PerlSymb {
+      const char     *symb;
+      const PerlType  type;
+    }PerlSymb;
+    DocSymbol(DocNode *parent,SymType s) : 
+      m_symbol(s) { m_parent = parent; }
     SymType symbol() const     { return m_symbol; }
-    char letter() const        { return m_letter; }
     Kind kind() const          { return Kind_Symbol; }
     void accept(DocVisitor *v) { v->visit(this); }
-    static SymType decodeSymbol(const QCString &symName,char *letter);
+    static SymType decodeSymbol(const QCString &symName);
 
   private:
     SymType  m_symbol;
-    char     m_letter;
 };
 
 /** Node representing some amount of white space */
@@ -386,7 +436,7 @@ class DocVerbatim : public DocNode
     enum Type { Code, HtmlOnly, ManOnly, LatexOnly, RtfOnly, XmlOnly, Verbatim, Dot, Msc, DocbookOnly };
     DocVerbatim(DocNode *parent,const QCString &context,
                 const QCString &text, Type t,bool isExample,
-                const QCString &exampleFile,const QCString &lang=QCString());
+                const QCString &exampleFile,bool isBlock=FALSE,const QCString &lang=QCString());
     Kind kind() const            { return Kind_Verbatim; }
     Type type() const            { return m_type; }
     QCString text() const        { return m_text; }
@@ -396,6 +446,7 @@ class DocVerbatim : public DocNode
     QCString exampleFile() const { return m_exampleFile; }
     QCString relPath() const     { return m_relPath; }
     QCString language() const    { return m_lang; }
+    bool isBlock() const         { return m_isBlock; }
 
   private:
     QCString  m_context;
@@ -405,6 +456,7 @@ class DocVerbatim : public DocNode
     QCString  m_exampleFile;
     QCString  m_relPath;
     QCString  m_lang;
+    bool      m_isBlock;
 };
 
 
@@ -412,7 +464,7 @@ class DocVerbatim : public DocNode
 class DocInclude : public DocNode
 {
   public:
-    enum Type { Include, DontInclude, VerbInclude, HtmlInclude, IncWithLines, Snippet };
+  enum Type { Include, DontInclude, VerbInclude, HtmlInclude, LatexInclude, IncWithLines, Snippet };
     DocInclude(DocNode *parent,const QCString &file,
                const QCString context, Type t,
                bool isExample,const QCString exampleFile,
index 2aa2918..52d24bb 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -72,7 +72,7 @@ void DocSets::initialize()
         "DOCSET_RESOURCES=$(DOCSET_CONTENTS)/Resources\n"
         "DOCSET_DOCUMENTS=$(DOCSET_RESOURCES)/Documents\n"
         "DESTDIR=~/Library/Developer/Shared/Documentation/DocSets\n"
-        "XCODE_INSTALL=$(shell xcode-select -print-path)\n"
+        "XCODE_INSTALL=\"$(shell xcode-select -print-path)\"\n"
         "\n"
         "all: docset\n"
         "\n"
index c5f0dc7..eac5bfc 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index ca0490c..1db764e 100644 (file)
@@ -3,7 +3,7 @@
  * $Id: $
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 5ba1a72..7ffbbb3 100644 (file)
@@ -3,7 +3,7 @@
  * $Id: $
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -350,7 +350,7 @@ HFILEMASK ("."{FILESCHAR}*{FILEECHAR}+)*
 FILEMASK  ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK}
 LINKMASK  [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)? 
 VERBATIM  "verbatim"{BLANK}*
-SPCMD1    {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM})
+SPCMD1    {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM}|"--"|"---")
 SPCMD2    {CMD}[\\@<>&$#%~".|]
 SPCMD3    {CMD}form#[0-9]+
 SPCMD4    {CMD}"::"
@@ -406,6 +406,7 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
 %x St_CodeOpt
 %x St_XmlCode
 %x St_HtmlOnly
+%x St_HtmlOnlyOption
 %x St_ManOnly
 %x St_LatexOnly
 %x St_RtfOnly
@@ -627,8 +628,16 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
 <St_Para>"$"{ID}":"[^\n$]+"$" { /* RCS tag */
                          QCString tagName(yytext+1);
                         int index=tagName.find(':');
-                        g_token->name = tagName.left(index+1);
-                        g_token->text = tagName.mid(index+2,tagName.length()-index-3);
+                        g_token->name = tagName.left(index);
+                        int text_begin = index+2;
+                        int text_end = tagName.length()-1;
+                        if (tagName[text_begin-1]==':') /* check for Subversion fixed-length keyword */
+                        {
+                                ++text_begin;
+                                if (tagName[text_end-1]=='#')
+                                        --text_end;
+                        }
+                        g_token->text = tagName.mid(text_begin,text_end-text_begin);
                         return TK_RCSTAG;
                       }
 <St_Para,St_HtmlOnly>"$("{ID}")"   { /* environment variable */
@@ -759,6 +768,14 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
 <St_Code,St_XmlCode>.           {
                         g_token->verb+=yytext;
                       }
+<St_HtmlOnlyOption>" [block]" { // the space is added in commentscan.l
+                         g_token->name="block";
+                         BEGIN(St_HtmlOnly);
+                        }
+<St_HtmlOnlyOption>.|\n {
+                         unput(*yytext);
+                         BEGIN(St_HtmlOnly);
+                        }
 <St_HtmlOnly>{CMD}"endhtmlonly" {
                          return RetVal_OK;
                        }
@@ -1024,7 +1041,7 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2}
                         g_token->name = types+"#"+params.mid(i);
                         return TK_WORD;
                       }
-<St_Param>[^ \t\n,]+   {
+<St_Param>[^ \t\n,@\\]+  {
                         g_token->name = yytext;
                          if (g_token->name.at(yyleng-1)==':')
                          {
@@ -1247,7 +1264,8 @@ void doctokenizerYYsetStateXmlCode()
 void doctokenizerYYsetStateHtmlOnly()
 {
   g_token->verb="";
-  BEGIN(St_HtmlOnly);
+  g_token->name="";
+  BEGIN(St_HtmlOnlyOption);
 }
 
 void doctokenizerYYsetStateManOnly()
index d12295c..a444b47 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 8d9ba3f..051a438 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -783,10 +783,11 @@ class DotNodeList : public QList<DotNode>
   public:
     DotNodeList() : QList<DotNode>() {}
    ~DotNodeList() {}
-   int compareItems(QCollection::Item item1,QCollection::Item item2)
-   {
-     return qstricmp(((DotNode *)item1)->m_label,((DotNode *)item2)->m_label);
-   }
+  private:
+    int compareValues(const DotNode *n1,const DotNode *n2) const
+    {
+      return qstricmp(n1->m_label,n2->m_label);
+    }
 };
 
 //--------------------------------------------------------------------
@@ -1101,7 +1102,7 @@ bool DotFilePatcher::run()
       }
       else // error invalid map id!
       {
-        err("Found invalid bounding FIG id in file %s!\n",mapId,m_patchFile.data());
+        err("Found invalid bounding FIG %d in file %s!\n",mapId,m_patchFile.data());
         t << line;
       }
     }
@@ -1223,7 +1224,7 @@ DotManager *DotManager::instance()
   return m_theInstance;
 }
 
-DotManager::DotManager() : m_dotMaps(1007)
+DotManager::DotManager() : m_dotMaps(1009)
 {
   m_dotRuns.setAutoDelete(TRUE);
   m_dotMaps.setAutoDelete(TRUE);
@@ -2461,8 +2462,12 @@ void DotGfxHierarchyTable::addClassList(ClassSDict *cl)
   for (cli.toLast();(cd=cli.current());--cli)
   {
     //printf("Trying %s subClasses=%d\n",cd->name().data(),cd->subClasses()->count());
-    if (cd->getLanguage()==SrcLangExt_VHDL  && !(VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS)
-      continue; 
+    if (cd->getLanguage()==SrcLangExt_VHDL &&
+        (VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS
+       )
+    {
+      continue;
+    }
     if (!hasVisibleRoot(cd->baseClasses()) &&
         cd->isVisibleInHierarchy()
        ) // root node in the forest
index 75474ed..6ff89be 100644 (file)
--- a/src/dot.h
+++ b/src/dot.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 41fca96..26eda84 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -220,7 +220,7 @@ class Statistics
     }
     void end()
     {
-      stats.last()->elapsed=((double)time.elapsed())/1000.0;
+      stats.getLast()->elapsed=((double)time.elapsed())/1000.0;
     }
     void print()
     {
@@ -996,8 +996,9 @@ static Definition *findScope(Entry *root,int level=0)
  *  full qualified name \a name. Creates an artificial scope if the scope is
  *  not found and set the parent/child scope relation if the scope is found.
  */
-static Definition *buildScopeFromQualifiedName(const QCString name,int level,SrcLangExt lang)
+static Definition *buildScopeFromQualifiedName(const QCString name,int level,SrcLangExt lang,TagInfo *tagInfo)
 {
+  //printf("buildScopeFromQualifiedName(%s) level=%d\n",name.data(),level);
   int i=0;
   int p=0,l;
   Definition *prevScope=Doxygen::globalScope;
@@ -1020,9 +1021,11 @@ static Definition *buildScopeFromQualifiedName(const QCString name,int level,Src
     else if (nd==0 && cd==0) // scope is not known!
     {
       // introduce bogus namespace
-      //printf("++ adding dummy namespace %s to %s\n",nsName.data(),prevScope->name().data());
+      //printf("++ adding dummy namespace %s to %s tagInfo=%p\n",nsName.data(),prevScope->name().data(),tagInfo);
       nd=new NamespaceDef(
-        "[generated]",1,1,fullScope);
+        "[generated]",1,1,fullScope,
+        tagInfo?tagInfo->tagName:QCString(),
+        tagInfo?tagInfo->fileName:QCString());
       nd->setLanguage(lang);
 
       // add namespace to the list
@@ -1109,7 +1112,7 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr
           // so use this instead.
           QCString fqn = QCString(ui.currentKey())+
                          scope.right(scope.length()-p);
-          resultScope = buildScopeFromQualifiedName(fqn,fqn.contains("::"),startScope->getLanguage());
+          resultScope = buildScopeFromQualifiedName(fqn,fqn.contains("::"),startScope->getLanguage(),0);
           //printf("Creating scope from fqn=%s result %p\n",fqn.data(),resultScope);
           if (resultScope) 
           {
@@ -1295,22 +1298,23 @@ static void addClassToContext(EntryNav *rootNav)
 
     QCString tagName;
     QCString refFileName;
-    if (rootNav->tagInfo())
+    TagInfo *tagInfo = rootNav->tagInfo();
+    if (tagInfo)
     {
-      tagName     = rootNav->tagInfo()->tagName;
-      refFileName = rootNav->tagInfo()->fileName;
+      tagName     = tagInfo->tagName;
+      refFileName = tagInfo->fileName;
       int i;
       if ((i=fullName.find("::"))!=-1) 
         // symbols imported via tag files may come without the parent scope, 
         // so we artificially create it here
       {
-        buildScopeFromQualifiedName(fullName,fullName.contains("::"),root->lang);
+        buildScopeFromQualifiedName(fullName,fullName.contains("::"),root->lang,tagInfo);
       }
     }
     cd=new ClassDef(root->fileName,root->startLine,root->startColumn,
         fullName,sec,tagName,refFileName,TRUE,root->spec&Entry::Enum);
-    Debug::print(Debug::Classes,0,"  New class `%s' (sec=0x%08x)! #tArgLists=%d\n",
-        fullName.data(),sec,root->tArgLists ? (int)root->tArgLists->count() : -1);
+    Debug::print(Debug::Classes,0,"  New class `%s' (sec=0x%08x)! #tArgLists=%d tagInfo=%p\n",
+        fullName.data(),sec,root->tArgLists ? (int)root->tArgLists->count() : -1, tagInfo);
     cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
     cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
     cd->setLanguage(root->lang);    
@@ -1443,7 +1447,7 @@ static void resolveClassNestingRelations()
       //printf("processing unresolved=%s, iteration=%d\n",cd->name().data(),iteration);
       /// create the scope artificially
       // anyway, so we can at least relate scopes properly.
-      Definition *d = buildScopeFromQualifiedName(name,name.contains("::"),cd->getLanguage());
+      Definition *d = buildScopeFromQualifiedName(name,name.contains("::"),cd->getLanguage(),0);
       if (d!=cd && !cd->getDefFileName().isEmpty()) 
                  // avoid recursion in case of redundant scopes, i.e: namespace N { class N::C {}; }
                  // for this case doxygen assumes the exitance of a namespace N::N in which C is to be found!
@@ -1748,13 +1752,16 @@ static void buildNamespaceList(EntryNav *rootNav)
       {
         QCString tagName;
         QCString tagFileName;
-        if (rootNav->tagInfo())
+        TagInfo *tagInfo = rootNav->tagInfo();
+        if (tagInfo)
         {
-          tagName=rootNav->tagInfo()->tagName;
-          tagFileName=rootNav->tagInfo()->fileName;
+          tagName     = tagInfo->tagName;
+          tagFileName = tagInfo->fileName;
         }
-        //printf("++ new namespace %s lang=%s\n",fullName.data(),langToString(root->lang).data());
-        NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,root->startColumn,fullName,tagName,tagFileName,root->type,root->spec&Entry::Published);
+        //printf("++ new namespace %s lang=%s tagName=%s\n",fullName.data(),langToString(root->lang).data(),tagName.data());
+        NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,
+                             root->startColumn,fullName,tagName,tagFileName,
+                             root->type,root->spec&Entry::Published);
         nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
         nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
         nd->addSectionsToDefinition(root->anchors);
@@ -1786,7 +1793,7 @@ static void buildNamespaceList(EntryNav *rootNav)
         if (d==0) // we didn't find anything, create the scope artificially
                   // anyway, so we can at least relate scopes properly.
         {
-          Definition *d = buildScopeFromQualifiedName(fullName,fullName.contains("::"),nd->getLanguage());
+          Definition *d = buildScopeFromQualifiedName(fullName,fullName.contains("::"),nd->getLanguage(),tagInfo);
           d->addInnerCompound(nd);
           nd->setOuterScope(d);
           // TODO: Due to the order in which the tag file is written
@@ -2319,7 +2326,7 @@ static MemberDef *addVariableToClass(
       root->fileName,root->startLine,root->startColumn,
       root->type,name,root->args,root->exception,
       prot,Normal,root->stat,related,
-      mtype,root->tArgLists ? root->tArgLists->last() : 0,0);
+      mtype,root->tArgLists ? root->tArgLists->getLast() : 0,0);
   md->setTagInfo(rootNav->tagInfo());
   md->setMemberClass(cd); // also sets outer scope (i.e. getOuterScope())
   //md->setDefFile(root->fileName);
@@ -2556,7 +2563,7 @@ static MemberDef *addVariableToFile(
       root->fileName,root->startLine,root->startColumn,
       root->type,name,root->args,0,
       Public, Normal,root->stat,Member,
-      mtype,root->tArgLists ? root->tArgLists->last() : 0,0);
+      mtype,root->tArgLists ? root->tArgLists->getLast() : 0,0);
   md->setTagInfo(rootNav->tagInfo());
   md->setMemberSpecifiers(root->spec);
   md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -3245,7 +3252,7 @@ static void addMethodToClass(EntryNav *rootNav,ClassDef *cd,
       root->stat && root->relatesType != MemberOf,
       root->relates.isEmpty() ? Member :
           root->relatesType == MemberOf ? Foreign : Related,
-      mtype,root->tArgLists ? root->tArgLists->last() : 0,root->argList);
+      mtype,root->tArgLists ? root->tArgLists->getLast() : 0,root->argList);
   md->setTagInfo(rootNav->tagInfo());
   md->setMemberClass(cd);
   md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -3535,9 +3542,9 @@ static void buildFunctionList(EntryNav *rootNav)
                )
             {
               GroupDef *gd=0;
-              if (root->groups->first()!=0)
+              if (root->groups->getFirst()!=0)
               {
-                gd = Doxygen::groupSDict->find(root->groups->first()->groupname.data());
+                gd = Doxygen::groupSDict->find(root->groups->getFirst()->groupname.data());
               }
               //printf("match!\n");
               //printf("mnd=%p rnd=%p nsName=%s rnsName=%s\n",mnd,rnd,nsName.data(),rnsName.data());
@@ -3598,7 +3605,7 @@ static void buildFunctionList(EntryNav *rootNav)
                 md->enableCallerGraph(md->hasCallerGraph() || root->callerGraph);
 
                 // merge ingroup specifiers
-                if (md->getGroupDef()==0 && root->groups->first()!=0)
+                if (md->getGroupDef()==0 && root->groups->getFirst()!=0)
                 {
                   addMemberToGroups(root,md);
                 }
@@ -3607,7 +3614,7 @@ static void buildFunctionList(EntryNav *rootNav)
                   //printf("existing member is grouped, new member not\n");
                   root->groups->append(new Grouping(md->getGroupDef()->name(), md->getGroupPri()));
                 }
-                else if (md->getGroupDef()!=0 && root->groups->first()!=0)
+                else if (md->getGroupDef()!=0 && root->groups->getFirst()!=0)
                 {
                   //printf("both members are grouped\n");
                 }
@@ -3629,7 +3636,7 @@ static void buildFunctionList(EntryNav *rootNav)
           //       root->type.data(),rname.data(),root->args.data(),root->bodyLine);
 
           // new global function
-          ArgumentList *tArgList = root->tArgLists ? root->tArgLists->last() : 0;
+          ArgumentList *tArgList = root->tArgLists ? root->tArgLists->getLast() : 0;
           QCString name=removeRedundantWhiteSpace(rname);
           md=new MemberDef(
               root->fileName,root->startLine,root->startColumn,
@@ -5039,8 +5046,9 @@ static void computeTemplateClassRelations()
         ArgumentList *templArgs = new ArgumentList;
         stringToArgumentList(templSpec,templArgs);
         QList<BaseInfo> *baseList=root->extends;
-        BaseInfo *bi=baseList->first();
-        while (bi) // for each base class of the template
+        QListIterator<BaseInfo> it(*baseList);
+        BaseInfo *bi;
+        for (;(bi=it.current());++it) // for each base class of the template
         {
           // check if the base class is a template argument
           BaseInfo tbi(bi->name,bi->prot,bi->virt);
@@ -5082,7 +5090,6 @@ static void computeTemplateClassRelations()
             }
             delete actualTemplateNames;
           }
-          bi=baseList->next();
         }
         delete templArgs;
       } // class has no base classes
@@ -5102,17 +5109,17 @@ static void computeMemberReferences()
   for (cli.toFirst();(cd=cli.current());++cli)
   {
     cd->computeAnchors();
-  } 
-  FileName *fn=Doxygen::inputNameList->first();
-  while (fn)
+  }
+  FileNameListIterator fnli(*Doxygen::inputNameList);
+  FileName *fn;
+  for (fnli.toFirst();(fn=fnli.current());++fnli)
   {
-    FileDef *fd=fn->first();
-    while (fd)
+    FileNameIterator fni(*fn);
+    FileDef *fd;
+    for (;(fd=fni.current());++fni)
     {
       fd->computeAnchors();
-      fd=fn->next();
     }
-    fn=Doxygen::inputNameList->next();
   }
   NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
   NamespaceDef *nd=0;
@@ -5143,8 +5150,8 @@ static void addListReferences()
       md->visited=FALSE;
     }
   }
-  MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
-  for (fnli.toFirst();(mn=fnli.current());++fnli)
+  MemberNameSDict::Iterator fmnli(*Doxygen::functionNameSDict);
+  for (fmnli.toFirst();(mn=fmnli.current());++fmnli)
   {
     MemberNameIterator mni(*mn);
     MemberDef *md=0;
@@ -5159,30 +5166,34 @@ static void addListReferences()
   for (cli.toFirst();(cd=cli.current());++cli)
   {
     cd->addListReferences();
-  } 
-  FileName *fn=Doxygen::inputNameList->first();
-  while (fn)
+  }
+
+  FileNameListIterator fnli(*Doxygen::inputNameList);
+  FileName *fn;
+  for (fnli.toFirst();(fn=fnli.current());++fnli)
   {
-    FileDef *fd=fn->first();
-    while (fd)
+    FileNameIterator fni(*fn);
+    FileDef *fd;
+    for (;(fd=fni.current());++fni)
     {
       fd->addListReferences();
-      fd=fn->next();
     }
-    fn=Doxygen::inputNameList->next();
   }
+
   NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
   NamespaceDef *nd=0;
   for (nli.toFirst();(nd=nli.current());++nli)
   {
     nd->addListReferences();
   }
+
   GroupSDict::Iterator gli(*Doxygen::groupSDict);
   GroupDef *gd;
   for (gli.toFirst();(gd=gli.current());++gli)
   {
     gd->addListReferences();
   }
+
   PageSDict::Iterator pdi(*Doxygen::pageSDict);
   PageDef *pd=0;
   for (pdi.toFirst();(pd=pdi.current());++pdi)
@@ -5200,6 +5211,7 @@ static void addListReferences()
           name,pd->title(),0);
     }
   }
+
   DirSDict::Iterator ddi(*Doxygen::directories);
   DirDef *dd = 0;
   for (ddi.toFirst();(dd=ddi.current());++ddi)
@@ -5486,7 +5498,7 @@ static bool findGlobalMember(EntryNav *rootNav,
         {
           //printf("Comparing return types '%s'<->'%s'\n",
           //    md->typeString(),type);
-          if (md->templateArguments()->count()!=root->tArgLists->last()->count() ||
+          if (md->templateArguments()->count()!=root->tArgLists->getLast()->count() ||
               qstrcmp(md->typeString(),type)!=0)
           {
             //printf(" ---> no matching\n");
@@ -5555,6 +5567,15 @@ static bool isSpecialization(
     return FALSE;
 }
 
+static bool scopeIsTemplate(Definition *d)
+{
+  bool result=FALSE;
+  if (d && d->definitionType()==Definition::TypeClass)
+  {
+    result = ((ClassDef*)d)->templateArguments() || scopeIsTemplate(d->getOuterScope());
+  }
+  return result;
+}
 
 static QCString substituteTemplatesInString(
     const QList<ArgumentList> &srcTempArgLists,
@@ -5579,10 +5600,12 @@ static QCString substituteTemplatesInString(
     {
       ArgumentListIterator tsali(*srclali.current());
       ArgumentListIterator tdali(*dstlali.current());
+      ArgumentListIterator *fali=0;
       Argument *tsa =0,*tda=0, *fa=0;
       if (funcTempArgList)
       {
-        fa=funcTempArgList->first();
+        fali = new ArgumentListIterator(*funcTempArgList);
+        fa = fali->current();
       }
 
       for (tsali.toFirst();(tsa=tsali.current()) && !found;++tsali)
@@ -5615,11 +5638,13 @@ static QCString substituteTemplatesInString(
             found=TRUE;
           }
         }
-        if (tda) 
-          ++tdali; 
-        else if (fa
-          fa=funcTempArgList->next();
+        if (tda)
+          ++tdali;
+        else if (fali)
+        { ++(*fali); fa=fali->current(); }
       }
+
+      delete fali;
       //printf("   srcList='%s' dstList='%s faList='%s'\n",
       //  argListToString(srclali.current()).data(),
       //  argListToString(dstlali.current()).data(),
@@ -5643,8 +5668,9 @@ static void substituteTemplatesInArgList(
                  )
 {
   ArgumentListIterator sali(*src);
+  ArgumentListIterator dali(*dst);
   Argument *sa=0;
-  Argument *da=dst->first();
+  Argument *da=dali.current();
 
   for (sali.toFirst();(sa=sali.current());++sali) // for each member argument
   {
@@ -5666,7 +5692,8 @@ static void substituteTemplatesInArgList(
     {
       da->type=dstType;
       da->type=dstArray;
-      da=dst->next();
+      ++dali;
+      da=dali.current();
     }
   }
   dst->constSpecifier     = src->constSpecifier;
@@ -5862,7 +5889,7 @@ static void findMember(EntryNav *rootNav,
   // this as a normal method of a template class.
   if (!(root->tArgLists && 
         root->tArgLists->count()>0 &&
-        root->tArgLists->first()->count()==0
+        root->tArgLists->getFirst()->count()==0
        )
      ) 
   {
@@ -5906,10 +5933,10 @@ static void findMember(EntryNav *rootNav,
   ClassDef *cd=getClass(scopeName);
   if (cd)
   {
-    if (root->tArgLists) root->tArgLists->first();
     if (funcSpec.isEmpty())
     {
-      tempScopeName=cd->qualifiedNameWithTemplateParameters(root->tArgLists);
+      int argListIndex=0;
+      tempScopeName=cd->qualifiedNameWithTemplateParameters(root->tArgLists,&argListIndex);
     }
     else
     {
@@ -5918,7 +5945,7 @@ static void findMember(EntryNav *rootNav,
   }
   //printf("scopeName=%s cd=%p root->tArgLists=%p result=%s\n",
   //    scopeName.data(),cd,root->tArgLists,tempScopeName.data());
-  
+
   //printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
   // rebuild the function declaration (needed to get the scope right).
   if (!scopeName.isEmpty() && !isRelated && !isFriend && !Config_getBool("HIDE_SCOPE_NAMES"))
@@ -6128,20 +6155,22 @@ static void findMember(EntryNav *rootNav,
                 Debug::print(Debug::FindMembers,0,
                    "5b. 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() ||
+                    md->templateArguments()->count(),root->tArgLists->getLast()->count());
+                if (md->templateArguments()->count()!=root->tArgLists->getLast()->count() ||
                     qstrcmp(memType,funcType))
                 {
                   //printf(" ---> no matching\n");
                   matching = FALSE;
                 }
               }
-              bool classIsTemplate = md->getClassDef() && md->getClassDef()->templateArguments();
+              bool rootIsUserDoc = (root->section&Entry::MEMBERDOC_SEC)!=0;
+              bool classIsTemplate = scopeIsTemplate(md->getClassDef());
               bool mdIsTemplate    = md->templateArguments()!=0;
               bool classOrMdIsTemplate = mdIsTemplate || classIsTemplate;
               bool rootIsTemplate  = root->tArgLists!=0;
               //printf("classIsTemplate=%d mdIsTemplate=%d rootIsTemplate=%d\n",classIsTemplate,mdIsTemplate,rootIsTemplate);
-              if ((mdIsTemplate || rootIsTemplate) && // either md or root is a template
+              if (!rootIsUserDoc && // don't check out-of-line @fn references, see bug722457
+                  (mdIsTemplate || rootIsTemplate) && // either md or root is a template
                   ((classOrMdIsTemplate && !rootIsTemplate) || (!classOrMdIsTemplate && rootIsTemplate))
                  )
               {
@@ -6467,11 +6496,12 @@ static void findMember(EntryNav *rootNav,
           MemberName *mn = Doxygen::functionNameSDict->find(funcName);
           if (mn)
           {
-            mdDefine = mn->first();
+            MemberNameIterator mni(*mn);
+            mdDefine = mni.current();
             while (mdDefine && !isDefine)
             {
               isDefine = isDefine || mdDefine->isDefine();
-              if (!isDefine) mdDefine = mn->next();
+              if (!isDefine) { ++mni; mdDefine=mni.current(); }
             }
           }
         }
@@ -6485,8 +6515,9 @@ static void findMember(EntryNav *rootNav,
         }
         else
         {
-          MemberDef *rmd=mn->first();
-          while (rmd && newMember) // see if we got another member with matching arguments
+          MemberNameIterator mni(*mn);
+          MemberDef *rmd;
+          while ((rmd=mni.current()) && newMember) // see if we got another member with matching arguments
           {
             ArgumentList *rmdAl = rmd->argumentList();
 
@@ -6495,7 +6526,7 @@ static void findMember(EntryNav *rootNav,
               !matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmdAl,
                                cd,fd,root->argList,
                                TRUE);
-            if (newMember) rmd=mn->next();
+            if (newMember) ++mni;
           }
           if (!newMember && rmd) // member already exists as rmd -> add docs
           {
@@ -6543,7 +6574,7 @@ static void findMember(EntryNav *rootNav,
               root->stat && !isMemberOf,
               isMemberOf ? Foreign : isRelated ? Related : Member,
               mtype,
-              (root->tArgLists ? root->tArgLists->last() : 0),
+              (root->tArgLists ? root->tArgLists->getLast() : 0),
               funcArgs.isEmpty() ? 0 : root->argList);
 
           if (isDefine && mdDefine)
@@ -6579,8 +6610,9 @@ static void findMember(EntryNav *rootNav,
             MemberName *rmn=Doxygen::functionNameSDict->find(funcName);
             if (rmn)
             {
-              MemberDef *rmd=rmn->first();
-              while (rmd && !found) // see if we got another member with matching arguments
+              MemberNameIterator rmni(*rmn);
+              MemberDef *rmd;
+              while ((rmd=rmni.current()) && !found) // see if we got another member with matching arguments
               {
                 ArgumentList *rmdAl = rmd->argumentList();
                 // check for matching argument lists
@@ -6592,7 +6624,7 @@ static void findMember(EntryNav *rootNav,
                 {
                   found=TRUE;
                 }
-                if (!found) rmd=rmn->next();
+                if (!found) ++rmni;
               }
               if (rmd) // member found -> copy line number info
               {
@@ -7423,7 +7455,7 @@ static void findEnumDocumentation(EntryNav *rootNav)
               md->setRefItems(root->sli);
 
               GroupDef *gd=md->getGroupDef();
-              if (gd==0 &&root->groups->first()!=0) // member not grouped but out-of-line documentation is
+              if (gd==0 &&root->groups->getFirst()!=0) // member not grouped but out-of-line documentation is
               {
                 addMemberToGroups(root,md);
               }
@@ -7457,7 +7489,7 @@ static void findEnumDocumentation(EntryNav *rootNav)
               md->setMemberGroupId(root->mGrpId);
 
               GroupDef *gd=md->getGroupDef();
-              if (gd==0 && root->groups->first()!=0) // member not grouped but out-of-line documentation is
+              if (gd==0 && root->groups->getFirst()!=0) // member not grouped but out-of-line documentation is
               {
                 addMemberToGroups(root,md);
               }
@@ -7574,11 +7606,12 @@ static void computeMemberRelations()
   for ( ; (mn=mnli.current()) ; ++mnli ) // for each member name
   {
     MemberNameIterator mdi(*mn);
+    MemberNameIterator bmdi(*mn);
     MemberDef *md;
+    MemberDef *bmd;
     for ( ; (md=mdi.current()) ; ++mdi ) // for each member with a specific name
     {
-      MemberDef *bmd = mn->first(); // for each other member with the same name
-      while (bmd)
+      for ( bmdi.toFirst() ; (bmd=bmdi.current()); ++bmdi ) // for each other member with the same name
       {
         ClassDef *mcd  = md->getClassDef();
         if (mcd && mcd->baseClasses())
@@ -7625,10 +7658,9 @@ static void computeMemberRelations()
             }
           }
         }
-        bmd = mn->next();
       }
     }
-  }  
+  }
 }
 
 
@@ -8132,16 +8164,16 @@ static void addMembersToMemberGroup()
     cd->addMembersToMemberGroup();
   }
   // for each file
-  FileName *fn=Doxygen::inputNameList->first();
-  while (fn)
+  FileNameListIterator fnli(*Doxygen::inputNameList);
+  FileName *fn;
+  for (fnli.toFirst();(fn=fnli.current());++fnli)
   {
-    FileDef *fd=fn->first();
-    while (fd)
+    FileNameIterator fni(*fn);
+    FileDef *fd;
+    for (fni.toFirst();(fd=fni.current());++fni)
     {
       fd->addMembersToMemberGroup();
-      fd=fn->next();
     }
-    fn=Doxygen::inputNameList->next();
   }
   // for each namespace
   NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
@@ -8171,16 +8203,16 @@ static void distributeMemberGroupDocumentation()
     cd->distributeMemberGroupDocumentation();
   }
   // for each file
-  FileName *fn=Doxygen::inputNameList->first();
-  while (fn)
+  FileNameListIterator fnli(*Doxygen::inputNameList);
+  FileName *fn;
+  for (fnli.toFirst();(fn=fnli.current());++fnli)
   {
-    FileDef *fd=fn->first();
-    while (fd)
+    FileNameIterator fni(*fn);
+    FileDef *fd;
+    for (fni.toFirst();(fd=fni.current());++fni)
     {
       fd->distributeMemberGroupDocumentation();
-      fd=fn->next();
     }
-    fn=Doxygen::inputNameList->next();
   }
   // for each namespace
   NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
@@ -8210,16 +8242,16 @@ static void findSectionsInDocumentation()
     cd->findSectionsInDocumentation();
   }
   // for each file
-  FileName *fn=Doxygen::inputNameList->first();
-  while (fn)
+  FileNameListIterator fnli(*Doxygen::inputNameList);
+  FileName *fn;
+  for (fnli.toFirst();(fn=fnli.current());++fnli)
   {
-    FileDef *fd=fn->first();
-    while (fd)
+    FileNameIterator fni(*fn);
+    FileDef *fd;
+    for (fni.toFirst();(fd=fni.current());++fni)
     {
       fd->findSectionsInDocumentation();
-      fd=fn->next();
     }
-    fn=Doxygen::inputNameList->next();
   }
   // for each namespace
   NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
@@ -8380,17 +8412,16 @@ static void findDefineDocumentation(EntryNav *rootNav)
     MemberName *mn=Doxygen::functionNameSDict->find(root->name);
     if (mn)
     {
+      MemberNameIterator mni(*mn);
+      MemberDef *md;
       int count=0;
-      MemberDef *md=mn->first();
-      while (md)
+      for (;(md=mni.current());++mni)
       {
         if (md->memberType()==MemberType_Define) count++;
-        md=mn->next();
       }
       if (count==1)
       {
-        md=mn->first();
-        while (md)
+        for (mni.toFirst();(md=mni.current());++mni)
         {
           if (md->memberType()==MemberType_Define)
           {
@@ -8409,20 +8440,18 @@ static void findDefineDocumentation(EntryNav *rootNav)
             if (root->mGrpId!=-1) md->setMemberGroupId(root->mGrpId);
             addMemberToGroups(root,md);
           }
-          md=mn->next();
         }
       }
-      else if (count>1 && 
-               (!root->doc.isEmpty() || 
-                !root->brief.isEmpty() || 
+      else if (count>1 &&
+               (!root->doc.isEmpty() ||
+                !root->brief.isEmpty() ||
                 root->bodyLine!=-1
                )
-              ) 
+              )
         // multiple defines don't know where to add docs
         // but maybe they are in different files together with their documentation
       {
-        md=mn->first();
-        while (md)
+        for (mni.toFirst();(md=mni.current());++mni)
         {
           if (md->memberType()==MemberType_Define)
           {
@@ -8456,7 +8485,6 @@ static void findDefineDocumentation(EntryNav *rootNav)
               addMemberToGroups(root,md);
             }
           }
-          md=mn->next();
         }
         //warn("define %s found in the following files:\n",root->name.data());
         //warn("Cannot determine where to add the documentation found "
@@ -8615,15 +8643,30 @@ static void findMainPage(EntryNav *rootNav)
       Doxygen::mainPage->setShowToc(root->stat);
       addPageToContext(Doxygen::mainPage,rootNav);
           
-      // a page name is a label as well!
-      SectionInfo *si=new SectionInfo(
-          indexName,
+      SectionInfo *si = Doxygen::sectionDict->find(Doxygen::mainPage->name());
+      if (si)
+      {
+        if (si->lineNr != -1)
+        {
+          warn(root->fileName,root->startLine,"multiple use of section label '%s', (first occurrence: %s, line %d)",Doxygen::mainPage->name().data(),si->fileName.data(),si->lineNr);
+        }
+        else
+        {
+          warn(root->fileName,root->startLine,"multiple use of section label '%s', (first occurrence: %s)",Doxygen::mainPage->name().data(),si->fileName.data());
+        }
+      }
+      else
+      {
+        // a page name is a label as well! but should no be double either
+        si=new SectionInfo(
+          indexName, root->startLine,
           Doxygen::mainPage->name(),
           Doxygen::mainPage->title(),
           SectionInfo::Page,
           0); // level 0
-      Doxygen::sectionDict->append(indexName,si);
-      Doxygen::mainPage->addSectionsToDefinition(root->anchors);
+        Doxygen::sectionDict->append(indexName,si);
+        Doxygen::mainPage->addSectionsToDefinition(root->anchors);
+      }
     }
     else
     {
@@ -9255,16 +9298,15 @@ static void parseFiles(Entry *root,EntryNav *rootNav)
 
     // create a dictionary with files to process
     QDict<void> g_filesToProcess(10007);
-    QCString *s=g_inputFiles.first();
-    while (s)
+    StringListIterator it(g_inputFiles);
+    QCString *s;
+    for (;(s=it.current());++it)
     {
       g_filesToProcess.insert(*s,(void*)0x8);
-      s=g_inputFiles.next();
     }
-    s=g_inputFiles.first();
 
     // process source files (and their include dependencies)
-    while (s)
+    for (it.toFirst();(s=it.current());++it)
     {
       bool ambig;
       FileDef *fd=findFileDef(Doxygen::inputNameDict,s->data(),ambig);
@@ -9298,11 +9340,9 @@ static void parseFiles(Entry *root,EntryNav *rootNav)
         parser->finishTranslationUnit();
         g_processedFiles.insert(*s,(void*)0x8);
       }
-      s=g_inputFiles.next();
     }
     // process remaining files
-    s=g_inputFiles.first();
-    while (s)
+    for (it.toFirst();(s=it.current());++it)
     {
       if (!g_processedFiles.find(*s)) // not yet processed
       {
@@ -9316,14 +9356,14 @@ static void parseFiles(Entry *root,EntryNav *rootNav)
         parser->finishTranslationUnit();
         g_processedFiles.insert(*s,(void*)0x8);
       }
-      s=g_inputFiles.next();
     }
   }
   else // normal pocessing
 #endif
   {
-    QCString *s=g_inputFiles.first();
-    while (s)
+    StringListIterator it(g_inputFiles);
+    QCString *s;
+    for (;(s=it.current());++it)
     {
       bool ambig;
       QStrList filesInSameTu;
@@ -9332,7 +9372,6 @@ static void parseFiles(Entry *root,EntryNav *rootNav)
       ParserInterface * parser = getParserForFile(s->data());
       parser->startTranslationUnit(s->data());
       parseFile(parser,root,rootNav,fd,s->data(),FALSE,filesInSameTu);
-      s=g_inputFiles.next();
     }
   }
 }
@@ -9800,7 +9839,7 @@ static void devUsage()
 
 static void usage(const char *name)
 {
-  msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2013\n\n",versionString);
+  msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2014\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);
@@ -9853,13 +9892,15 @@ void initDoxygen()
   initPreprocessor();
 
   Doxygen::parserManager = new ParserManager;
-  Doxygen::parserManager->registerParser("c",       new CLanguageScanner, TRUE);
-  Doxygen::parserManager->registerParser("python",  new PythonLanguageScanner);
-  Doxygen::parserManager->registerParser("fortran", new FortranLanguageScanner);
-  Doxygen::parserManager->registerParser("vhdl",    new VHDLLanguageScanner);
-  Doxygen::parserManager->registerParser("dbusxml", new DBusXMLScanner);
-  Doxygen::parserManager->registerParser("tcl",     new TclLanguageScanner);
-  Doxygen::parserManager->registerParser("md",      new MarkdownFileParser);
+  Doxygen::parserManager->registerParser("c",            new CLanguageScanner, TRUE);
+  Doxygen::parserManager->registerParser("python",       new PythonLanguageScanner);
+  Doxygen::parserManager->registerParser("fortran",      new FortranLanguageScanner);
+  Doxygen::parserManager->registerParser("fortranfree",  new FortranLanguageScannerFree);
+  Doxygen::parserManager->registerParser("fortranfixed", new FortranLanguageScannerFixed);
+  Doxygen::parserManager->registerParser("vhdl",         new VHDLLanguageScanner);
+  Doxygen::parserManager->registerParser("dbusxml",      new DBusXMLScanner);
+  Doxygen::parserManager->registerParser("tcl",          new TclLanguageScanner);
+  Doxygen::parserManager->registerParser("md",           new MarkdownFileParser);
 
   // register any additional parsers here...
 
@@ -10327,7 +10368,7 @@ void readConfiguration(int argc, char **argv)
   }
 
 
-  if (!Config::instance()->parse(configName))
+  if (!Config::instance()->parse(configName,updateConfig))
   {
     err("could not open or read configuration file %s!\n",configName);
     cleanUpDoxygen();
index 3c981f3..2f4bf70 100644 (file)
@@ -670,12 +670,12 @@ span.mlabel {
 
 /* @end */
 
-/* these are for tree view when not used as main index */
+/* these are for tree view inside a (index) page */
 
 div.directory {
         margin: 10px 0px;
-        border-top: 1px solid #A8B8D9;
-        border-bottom: 1px solid #A8B8D9;
+        border-top: 1px solid ##AA;
+        border-bottom: 1px solid ##AA;
         width: 100%;
 }
 
@@ -734,6 +734,80 @@ div.directory {
        color: ##50;
 }
 
+.arrow {
+    color: ##AA;
+    -webkit-user-select: none;
+    -khtml-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    cursor: pointer;
+    font-size: 80%;
+    display: inline-block;
+    width: 16px;
+    height: 22px;
+}
+
+.icon {
+    font-family: Arial, Helvetica;
+    font-weight: bold;
+    font-size: 12px;
+    height: 14px;
+    width: 16px;
+    display: inline-block;
+    background-color: ##88;
+    color: white;
+    text-align: center;
+    border-radius: 4px;
+    margin-left: 2px;
+    margin-right: 2px;
+}
+
+.icona {
+    width: 24px;
+    height: 22px;
+    display: inline-block;
+}
+
+.iconfopen {
+    width: 24px;
+    height: 18px;
+    margin-bottom: 4px;
+    background-image:url('ftv2folderopen.png');
+    background-position: 0px -4px;
+    background-repeat: repeat-y;
+    vertical-align:top;
+    display: inline-block;
+}
+
+.iconfclosed {
+    width: 24px;
+    height: 18px;
+    margin-bottom: 4px;
+    background-image:url('ftv2folderclosed.png');
+    background-position: 0px -4px;
+    background-repeat: repeat-y;
+    vertical-align:top;
+    display: inline-block;
+}
+
+.icondoc {
+    width: 24px;
+    height: 18px;
+    margin-bottom: 4px;
+    background-image:url('ftv2doc.png');
+    background-position: 0px -4px;
+    background-repeat: repeat-y;
+    vertical-align:top;
+    display: inline-block;
+}
+
+table.directory {
+    font: 400 14px Roboto,sans-serif;
+}
+
+/* @end */
+
 div.dynheader {
         margin-top: 8px;
        -webkit-touch-callout: none;
index ff9c620..6f766c0 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -65,6 +65,7 @@ class SectionDict;
 struct MemberGroupInfo;
 
 typedef QList<QCString>    StringList;
+typedef QListIterator<QCString>    StringListIterator;
 //typedef QDict<FileDef>     FileDict;
 //typedef QDict<GroupDef>    GroupDict;
 
index d9589e7..8bca741 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
@@ -28,6 +28,7 @@ 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 %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%% -Wl,--as-needed -lole32
 win32-g++:TMAKE_CXXFLAGS   += -fno-exceptions -fno-rtti
+DEPENDPATH                 += ../generated_src/doxygen
 INCLUDEPATH                += ../qtools ../libmd5 .
 DESTDIR                    =  ../bin
 TARGET                     =  doxygen
@@ -35,5 +36,5 @@ unix:TARGETDEPS            =  ../lib/libdoxygen.a ../lib/libdoxycfg.a
 win32:TARGETDEPS           =  ..\lib\doxygen.lib ..\lib\doxycfg.lib
 win32-g++:TARGETDEPS       =  ../lib/libdoxygen.a ../lib/libdoxycfg.a
 win32-mingw:TARGETDEPS     =  ../lib/libdoxygen.a ../lib/libdoxycfg.a
-OBJECTS_DIR                =  ../objects
+OBJECTS_DIR                =  ../objects/doxygen
 
index 199abf8..072104b 100644 (file)
   \textbf{#1} (\textnormal{#2}\,\pageref{#3})%
 }
 
+% Used by @addindex
+\newcommand{\lcurly}{\{}
+\newcommand{\rcurly}{\}}
+
 % Used for syntax highlighting
 \definecolor{comment}{rgb}{0.5,0.0,0.0}
 \definecolor{keyword}{rgb}{0.0,0.5,0.0}
index ed092c7..85e1836 100644 (file)
@@ -24,19 +24,20 @@ function updateStripes()
   $('table.directory tr').
        removeClass('even').filter(':visible:even').addClass('even');
 }
+
 function toggleLevel(level)
 {
-  $('table.directory tr').each(function()
+  $('table.directory tr').each(function() {
     var l = this.id.split('_').length-1;
     var i = $('#img'+this.id.substring(3));
     var a = $('#arr'+this.id.substring(3));
     if (l<level+1) {
-      i.attr('src','ftv2folderopen.png');
-      a.attr('src','ftv2mnode.png');
+      i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
+      a.html('&#9660;');
       $(this).show();
     } else if (l==level+1) {
-      i.attr('src','ftv2folderclosed.png');
-      a.attr('src','ftv2pnode.png');
+      i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
+      a.html('&#9658;');
       $(this).show();
     } else {
       $(this).hide();
@@ -47,34 +48,33 @@ function toggleLevel(level)
 
 function toggleFolder(id)
 {
-  //The clicked row
+  // the clicked row
   var currentRow = $('#row_'+id);
-  var currentRowImages = currentRow.find("img");
 
-  //All rows after the clicked row
+  // all rows after the clicked row
   var rows = currentRow.nextAll("tr");
 
-  //Only match elements AFTER this one (can't hide elements before)
-  var childRows = rows.filter(function() {
-    var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
-    return this.id.match(re);
-  });
+  var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
 
-  //First row is visible we are HIDING
-  if (childRows.filter(':first').is(':visible')===true) {
-    currentRowImages.filter("[id^=arr]").attr('src', 'ftv2pnode.png');
-    currentRowImages.filter("[id^=img]").attr('src', 'ftv2folderclosed.png');
-    rows.filter("[id^=row_"+id+"]").hide();
-  } else { //We are SHOWING
-    //All sub images
-    var childImages = childRows.find("img");
-    var childImg = childImages.filter("[id^=img]");
-    var childArr = childImages.filter("[id^=arr]");
+  // only match elements AFTER this one (can't hide elements before)
+  var childRows = rows.filter(function() { return this.id.match(re); });
 
-    currentRow.find("[id^=arr]").attr('src', 'ftv2mnode.png'); //open row
-    currentRow.find("[id^=img]").attr('src', 'ftv2folderopen.png'); //open row
-    childImg.attr('src','ftv2folderclosed.png'); //children closed
-    childArr.attr('src','ftv2pnode.png'); //children closed
+  // first row is visible we are HIDING
+  if (childRows.filter(':first').is(':visible')===true) {
+    // replace down arrow by right arrow for current row
+    var currentRowSpans = currentRow.find("span");
+    currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+    currentRowSpans.filter(".arrow").html('&#9658;');
+    rows.filter("[id^=row_"+id+"]").hide(); // hide all children
+  } else { // we are SHOWING
+    // replace right arrow by down arrow for current row
+    var currentRowSpans = currentRow.find("span");
+    currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
+    currentRowSpans.filter(".arrow").html('&#9660;');
+    // replace down arrows by right arrows for child rows
+    var childRowsSpans = childRows.find("span");
+    childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+    childRowsSpans.filter(".arrow").html('&#9658;');
     childRows.show(); //show all children
   }
   updateStripes();
index 213b0fa..6680aeb 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index c21c4ae..f0ab78e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 15263ab..ee3d0ae 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index cecd095..a861906 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 8a2b529..7c86554 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -38,9 +38,10 @@ class ExampleSDict : public SDict<Example>
   public:
     ExampleSDict(int size=17) : SDict<Example>(size) {}
    ~ExampleSDict() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+  private:
+    int compareValues(const Example *item1,const Example *item2) const
     {
-      return qstricmp(((Example *)item1)->name,((Example *)item2)->name);
+      return qstricmp(item1->name,item2->name);
     }
 };
 
index e286284..5752e8c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -170,12 +170,19 @@ void FileDef::findSectionsInDocumentation()
   }
 }
 
+bool FileDef::hasDetailedDescription() const
+{
+  static bool repeatBrief = Config_getBool("REPEAT_BRIEF");
+  static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
+  return ((!briefDescription().isEmpty() && repeatBrief) || 
+          !documentation().stripWhiteSpace().isEmpty() || // avail empty section
+          (sourceBrowser && getStartBodyLine()!=-1 && getBodyDef())
+         );
+}
+
 void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title)
 {
-  if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || 
-      !documentation().stripWhiteSpace().isEmpty() || // avail empty section
-      (Config_getBool("SOURCE_BROWSER") && getStartBodyLine()!=-1 && getBodyDef())
-     )
+  if (hasDetailedDescription())
   {
     ol.pushGeneratorState();
       ol.disable(OutputGenerator::Html);
@@ -203,6 +210,7 @@ void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title)
         // ol.newParagraph(); // FIXME:PARA
         ol.enableAll();
         ol.disableAllBut(OutputGenerator::Man);
+        ol.enable(OutputGenerator::Latex);
         ol.writeString("\n\n");
       ol.popGeneratorState();
     }
@@ -379,7 +387,7 @@ void FileDef::writeIncludedByGraph(OutputList &ol)
     {
        warn_uncond("Included by graph for '%s' not generated, too many nodes. Consider increasing DOT_GRAPH_MAX_NODES.\n",name().data());
     }
-    if (!incDepGraph.isTrivial())
+    else if (!incDepGraph.isTrivial())
     {
       ol.startTextBlock(); 
       ol.disable(OutputGenerator::Man);
@@ -772,7 +780,7 @@ void FileDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
     MemberDef *md;
     for (mli.toFirst();(md=mli.current());++mli)
     {
-      if (md->getFileDef()==this && md->getNamespaceDef()==0 && md->isLinkable())
+      if (md->getFileDef()==this && md->getNamespaceDef()==0 && md->isLinkable() && !md->isEnumValue())
       {
         ol.writeString("          <tr><td class=\"navtab\">");
         if (md->isLinkableInProject())
@@ -830,9 +838,9 @@ void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu)
       getDirDef()->writeNavigationPath(ol);
       ol.endQuickIndices();
     }
-    startTitle(ol,getOutputFileBase());
+    startTitle(ol,getSourceFileBase());
     ol.parseText(name());
-    endTitle(ol,getOutputFileBase(),title);
+    endTitle(ol,getSourceFileBase(),title);
   }
   else
   {
@@ -1402,7 +1410,7 @@ static Directory *findDirNode(Directory *root,const QCString &name)
           // add new branch to the root
           if (!root->children().isEmpty())
           {
-            root->children().last()->setLast(FALSE); 
+            root->children().getLast()->setLast(FALSE); 
           }
           root->addChild(base);
           return newBranch;
@@ -1422,7 +1430,7 @@ static Directory *findDirNode(Directory *root,const QCString &name)
     Directory *newBranch = new Directory(root,baseName);
     if (!root->children().isEmpty())
     {
-      root->children().last()->setLast(FALSE); 
+      root->children().getLast()->setLast(FALSE); 
     }
     root->addChild(newBranch);
     return newBranch;
@@ -1437,7 +1445,7 @@ static void mergeFileDef(Directory *root,FileDef *fd)
   Directory *dirNode = findDirNode(root,filePath);
   if (!dirNode->children().isEmpty())
   {
-    dirNode->children().last()->setLast(FALSE); 
+    dirNode->children().getLast()->setLast(FALSE); 
   }
   DirEntry *e=new DirEntry(dirNode,fd);
   dirNode->addChild(e);
@@ -1715,25 +1723,24 @@ void FileDef::addMemberToList(MemberListType lt,MemberDef *md)
 
 void FileDef::sortMemberLists()
 {
-  MemberList *ml = m_memberLists.first();
-  while (ml)
+  QListIterator<MemberList> mli(m_memberLists);
+  MemberList *ml;
+  for (;(ml=mli.current());++mli)
   {
     if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
-    ml = m_memberLists.next();
   }
 }
 
 MemberList *FileDef::getMemberList(MemberListType lt) const
 {
-  FileDef *that = (FileDef*)this;
-  MemberList *ml = that->m_memberLists.first();
-  while (ml)
+  QListIterator<MemberList> mli(m_memberLists);
+  MemberList *ml;
+  for (;(ml=mli.current());++mli)
   {
     if (ml->listType()==lt)
     {
       return ml;
     }
-    ml = that->m_memberLists.next();
   }
   return 0;
 }
@@ -1800,3 +1807,7 @@ QCString FileDef::title() const
   return theTranslator->trFileReference(name());
 }
 
+QCString FileDef::fileVersion() const
+{
+  return m_fileVersion;
+}
index d1d7496..a95cd77 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -133,6 +133,10 @@ class FileDef : public Definition
     ClassSDict *getClassSDict() const             { return m_classSDict; }
 
     QCString title() const;
+    bool hasDetailedDescription() const;
+    QCString fileVersion() const;
+
+    bool subGrouping() const { return m_subGrouping; }
     
     //---------------------------------
 
@@ -237,13 +241,11 @@ class FileList : public QList<FileDef>
     FileList(const char *path) : QList<FileDef>(), m_pathName(path) {}
    ~FileList() {}
     QCString path() const { return m_pathName; }
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+  private:
+    int compareValues(const FileDef *md1,const FileDef *md2) const
     {
-      FileDef *md1 = (FileDef *)item1;
-      FileDef *md2 = (FileDef *)item2;
       return qstricmp(md1->name(),md2->name());
     }
-  private:
     QCString m_pathName;
 };
 
@@ -252,10 +254,9 @@ class OutputNameList : public QList<FileList>
   public:
     OutputNameList() : QList<FileList>() {}
    ~OutputNameList() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+ private:
+    int compareValues(const FileList *fl1,const FileList *fl2) const
     {
-      FileList *fl1 = (FileList *)item1;
-      FileList *fl2 = (FileList *)item2;
       return qstricmp(fl1->path(),fl2->path());
     }
 };
index da0dccc..35a1841 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -34,18 +34,17 @@ FileName::~FileName()
 void FileName::generateDiskNames()
 {
   //QCString commonPrefix;
-  FileDef *fd=first();
+  QListIterator<FileDef> it(*this);
+  FileDef *fd;
   int count=0;
-  while (fd) 
-  { 
-    if (!fd->isReference()) count++; 
-    fd=next(); 
+  for (;(fd=it.current());++it)
+  {
+    if (!fd->isReference()) count++;
   }
   if (count==1)
   {
-    fd=first();
     // skip references
-    while (fd && fd->isReference()) fd=next();
+    for (it.toFirst();(fd=it.current()) && fd->isReference();++it) { }
     // name if unique, so diskname is simply the name
     //printf("!!!!!!!! Unique disk name=%s for fd=%s\n",name.data(),fd->diskname.data());
     fd->m_diskName=name;
@@ -57,12 +56,11 @@ void FileName::generateDiskNames()
     bool found=FALSE;
     while (!found) // search for the common prefix of all paths
     {
-      fd=first();
-      while (fd && fd->isReference()) fd=next();
+      for (it.toFirst();(fd=it.current()) && fd->isReference();++it) { }
       char c=fd->m_path.at(i);
       if (c=='/') j=i; // remember last position of dirname
-      fd=next();
-      while (fd && !found)
+      ++it;
+      while ((fd=it.current()) && !found)
       {
         if (!fd->isReference())
         {
@@ -75,15 +73,14 @@ void FileName::generateDiskNames()
           }
           else if (fd->m_path[i]!=c)
           {
-            found=TRUE;  
+            found=TRUE;
           }
-        } 
-        fd=next();
+        }
+        ++it;
       }
       i++;
     }
-    fd=first();
-    while (fd)
+    for (it.toFirst();(fd=it.current());++it)
     {
       //printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
       if (!fd->isReference())
@@ -93,15 +90,12 @@ void FileName::generateDiskNames()
         //printf("!!!!!!!! non unique disk name=%s for fd=%s\n",(prefix+name).data(),fd->diskname.data());
         fd->m_diskName=prefix+name;
       }
-      fd=next();
     }
   }
 }
 
-int FileName::compareItems(QCollection::Item item1, QCollection::Item item2)
+int FileName::compareValues(const FileDef *f1, const FileDef *f2) const
 {
-  FileName *f1=(FileName *)item1;
-  FileName *f2=(FileName *)item2;
   return qstricmp(f1->fileName(),f2->fileName());
 }
 
@@ -120,20 +114,16 @@ FileNameList::~FileNameList()
 
 void FileNameList::generateDiskNames()
 {
-  FileName *fn=first();
-  while (fn)
+  FileNameListIterator it(*this);
+  FileName *fn;
+  for (;(fn=it.current());++it)
   {
     fn->generateDiskNames();
-    fn=next();
   }
 }
 
-int FileNameList::compareItems(QCollection::Item item1, QCollection::Item item2)
+int FileNameList::compareValues(const FileName *f1, const FileName *f2) const
 {
-  FileName *f1=(FileName *)item1;
-  FileName *f2=(FileName *)item2;
-  //printf("FileNameList::compareItems `%s'<->`%s'\n",
-  //    f1->fileName(),f2->fileName());
   return Config_getBool("FULL_PATH_NAMES") ?
          qstricmp(f1->fullName(),f2->fullName()) :
          qstricmp(f1->fileName(),f2->fileName());
index 1cd160c..ac7b164 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 
 /** Class representing all files with a certain base name */
 class FileName : public FileList
-{ 
+{
   public:
     FileName(const char *fn,const char *name);
    ~FileName();
     const char *fileName() const { return name; }
     const char *fullName() const { return fName; }
     void generateDiskNames();
-    int compareItems(QCollection::Item item1,QCollection::Item item2);
 
   private:
+    int compareValues(const FileDef *item1,const FileDef *item2) const;
     QCString name;
     QCString fName;
 };
@@ -52,7 +52,8 @@ class FileNameList : public QList<FileName>
     FileNameList();
    ~FileNameList();
     void generateDiskNames();
-    int compareItems(QCollection::Item item1,QCollection::Item item2);
+  private:
+    int compareValues(const FileName *item1,const FileName *item2) const;
 };
 
 /** Iterator for FileName objects in a FileNameList. */
index a6ee5b4..0d72923 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 0d3c4cd..9e835e1 100644 (file)
@@ -1,7 +1,7 @@
 /******************************************************************************
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 79821bf..47f7d4b 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 3913ebb..b64ede7 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
  *
  */
 
-#ifndef CODE_H
-#define CODE_H
+#ifndef FORTRANCODE_H
+#define FORTRANCODE_H
+
+#include "types.h"
 
 class CodeOutputInterface;
 class FileDef;
@@ -28,7 +30,7 @@ void parseFortranCode(CodeOutputInterface &,const char *,const QCString &,
             bool ,const char *,FileDef *fd,
             int startLine,int endLine,bool inlineFragment,
             MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx,
-            bool collectRefs);
+            bool collectRefs, FortranFormat format);
 void resetFortranCodeParserState();
 void codeFreeScanner();
 
index 8ee825b..c31080b 100644 (file)
@@ -154,12 +154,14 @@ static int             bracketCount = 0;
 
 // simplified way to know if this is fixed form
 // duplicate in fortranscanner.l
-static bool recognizeFixedForm(const char* contents)
+static bool recognizeFixedForm(const char* contents, FortranFormat format)
 {
   int column=0;
   bool skipLine=FALSE;
 
-  for (int i=0;;i++) 
+  if (format == FortranFormat_Fixed) return TRUE;
+  if (format == FortranFormat_Free)  return FALSE;
+  for (int i=0;;i++)
   {
     column++;
 
@@ -437,9 +439,11 @@ static bool getFortranDefs(const QCString &memberName, const QCString &moduleNam
   if (memberName.isEmpty()) return FALSE; /* empty name => nothing to link */
 
   // look in local variables
-  for (Scope *scope=scopeStack.last(); scope!=NULL; scope=scopeStack.prev())
+  QListIterator<Scope> it(scopeStack);
+  Scope *scope;
+  for (it.toLast();(scope=it.current());--it)
   {
-    if(scope->localVars.find(memberName))
+    if (scope->localVars.find(memberName))
       return FALSE;
   }
 
@@ -636,13 +640,13 @@ static void endScope()
 static void addUse(const QCString &moduleName) 
 {
   if (!scopeStack.isEmpty())
-    scopeStack.last()->useNames.append(moduleName);
+    scopeStack.getLast()->useNames.append(moduleName);
 }
 
 static void addLocalVar(const QCString &varName) 
 {
   if (!scopeStack.isEmpty())
-    scopeStack.last()->localVars.insert(varName, (void*)1);
+    scopeStack.getLast()->localVars.insert(varName, (void*)1);
 }
 
 //----------------------------------------------------------------------------
@@ -681,14 +685,14 @@ NUM_TYPE  (complex|integer|logical|real)
 LOG_OPER  (\.and\.|\.eq\.|\.eqv\.|\.ge\.|\.gt\.|\.le\.|\.lt\.|\.ne\.|\.neqv\.|\.or\.|\.not\.)
 KIND      {ARGS}
 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_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|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|IMPURE|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)
+FLOW  (DO|SELECT|CASE|SELECTCASE|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT)
 COMMANDS  (FORMAT|CONTAINS|MODULE{BS_}PROCEDURE|WRITE|READ|ALLOCATE|ALLOCATED|ASSOCIATED|DEALLOCATE|SIZE|INQUIRE|OPEN|CLOSE|DATA|COMMON)
 IGNORE (CALL)
 PREFIX    (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|IMPURE|PURE|ELEMENTAL)?
@@ -1106,7 +1110,7 @@ void parseFortranCode(CodeOutputInterface &od,const char *className,const QCStri
                   bool exBlock, const char *exName,FileDef *fd,
                  int startLine,int endLine,bool inlineFragment,
                  MemberDef *memberDef,bool,Definition *searchCtx,
-                  bool collectXRefs)
+                  bool collectXRefs, FortranFormat format)
 {
   //printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd);
 
@@ -1120,7 +1124,7 @@ void parseFortranCode(CodeOutputInterface &od,const char *className,const QCStri
   g_code = &od;
   g_inputString   = s;
   g_inputPosition = 0;
-  g_isFixedForm = recognizeFixedForm((const char*)s);
+  g_isFixedForm = recognizeFixedForm((const char*)s,format);
   g_currentFontClass = 0;
   g_needsTermination = FALSE;
   g_searchCtx = searchCtx;
index 41f7790..92a8669 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van 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,7 @@
 class FortranLanguageScanner : public ParserInterface
 {
   public:
+    FortranLanguageScanner(FortranFormat format=FortranFormat_Unknown) : m_format(format) { }
     virtual ~FortranLanguageScanner() {}
     void startTranslationUnit(const char *) {}
     void finishTranslationUnit() {}
@@ -53,6 +54,21 @@ class FortranLanguageScanner : public ParserInterface
                   );
     void resetCodeParserState();
     void parsePrototype(const char *text);
+
+  private:
+    FortranFormat m_format;
+};
+
+class FortranLanguageScannerFree : public FortranLanguageScanner
+{
+  public:
+    FortranLanguageScannerFree() : FortranLanguageScanner(FortranFormat_Free) { }
+};
+
+class FortranLanguageScannerFixed : public FortranLanguageScanner
+{
+  public:
+    FortranLanguageScannerFixed() : FortranLanguageScanner(FortranFormat_Fixed) { }
 };
 
 #endif
index 4cdea23..f6616ad 100644 (file)
@@ -187,7 +187,7 @@ static InterfaceType     ifType = IF_NONE;
 static bool              functionLine = FALSE;
 
 static char              stringStartSymbol; // single or double quote
-static bool             parsingPrototype = FALSE; // see parsePrototype()
+static bool              parsingPrototype = FALSE; // see parsePrototype()
 
 //! Accumulated modifiers of current statement, eg variable declaration.
 static SymbolModifiers currentModifiers;
@@ -255,7 +255,7 @@ NUM_TYPE  (complex|integer|logical|real)
 LOG_OPER  (\.and\.|\.eq\.|\.eqv\.|\.ge\.|\.gt\.|\.le\.|\.lt\.|\.ne\.|\.neqv\.|\.or\.|\.not\.)
 KIND      {ARGS}
 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}?)
+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|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS}?|DEFERRED|NON_OVERRIDABLE)
@@ -567,7 +567,7 @@ SCOPENAME ({ID}{BS}"::"{BS})*
 
  /*------- type definition  -------------------------------------------------------------------------------*/
 
-<Start,ModuleBody>^{BS}type/[^a-z0-9   {
+<Start,ModuleBody>^{BS}type/[^a-z0-9_]   {
                                           if(YY_START == Start)
                                           {
                                             addModule(NULL); 
@@ -1313,11 +1313,14 @@ void truncatePrepass(int index)
 
 // simplified way to know if this is fixed form
 // duplicate in fortrancode.l
-static bool recognizeFixedForm(const char* contents)
+static bool recognizeFixedForm(const char* contents, FortranFormat format)
 {
   int column=0;
   bool skipLine=FALSE;
 
+  if (format == FortranFormat_Fixed) return TRUE;
+  if (format == FortranFormat_Free)  return FALSE;
+
   for(int i=0;;i++) {
     column++;
 
@@ -2126,7 +2129,7 @@ static void handleCommentBlock(const QCString &doc,bool brief)
   int lineNr = brief ? current->briefLine : current->docLine;
   while (parseCommentBlock(
        g_thisParser,
-       docBlockInBody ? subrCurrent.first() : current,
+       docBlockInBody ? subrCurrent.getFirst() : current,
        doc,        // text
        yyFileName, // file
        lineNr,
@@ -2153,7 +2156,7 @@ static void subrHandleCommentBlock(const QCString &doc,bool brief)
 {
   QCString loc_doc;
   Entry *tmp_entry = current; 
-  current = subrCurrent.first(); // temporarily switch to the entry of the subroutine / function
+  current = subrCurrent.getFirst(); // temporarily switch to the entry of the subroutine / function
 
   // Still in the specification section so no inbodyDocs yet, but parameter documentation
   current->inbodyDocs = "";
@@ -2243,7 +2246,7 @@ level--;
 #endif
 
 
-static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
+static void parseMain(const char *fileName,const char *fileBuf,Entry *rt, FortranFormat format)
 {
   char *tmpBuf = NULL;
   initParser();
@@ -2263,7 +2266,7 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
   inputFile.setName(fileName);
   if (inputFile.open(IO_ReadOnly))
   {
-    isFixedForm = recognizeFixedForm(fileBuf);
+    isFixedForm = recognizeFixedForm(fileBuf,format);
 
     if (isFixedForm) 
     {
@@ -2342,7 +2345,7 @@ void FortranLanguageScanner::parseInput(const char *fileName,
 
   printlex(yy_flex_debug, TRUE, __FILE__, fileName);
 
-  ::parseMain(fileName,fileBuf,root);
+  ::parseMain(fileName,fileBuf,root,m_format);
 
   printlex(yy_flex_debug, FALSE, __FILE__, fileName);
 }
@@ -2365,7 +2368,7 @@ void FortranLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
 {
   ::parseFortranCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
                      fileDef,startLine,endLine,inlineFragment,memberDef,
-                     showLineNumbers,searchCtx,collectXRefs);
+                     showLineNumbers,searchCtx,collectXRefs,m_format);
 }
 
 bool FortranLanguageScanner::needsPreprocessing(const QCString &extension)
index f72185f..3038af3 100644 (file)
@@ -165,6 +165,7 @@ FTextStream::FTextStream( FILE *fh )
 {
   m_dev = new QFile;
   ((QFile *)m_dev)->open( IO_WriteOnly, fh);
+  m_owndev = TRUE;
 }
 
 FTextStream::~FTextStream()
index 11d3b1d..4613a92 100644 (file)
@@ -1,7 +1,7 @@
 /******************************************************************************
  * ftvhelp.cpp,v 1.0 2000/09/06 16:09:00
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -234,6 +234,7 @@ static unsigned char doc_a_png[528] =
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
 
+#if 0
 static unsigned char module_png[528] =
 {
   255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
@@ -338,6 +339,7 @@ static unsigned char letter_a_png[528] =
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 };
+#endif
 
 
 static unsigned char arrow_right_png[352] =
@@ -507,6 +509,7 @@ struct FTVImageInfo
 
 //extern FTVImageInfo image_info[];
 
+#if 0
 #define FTVIMG_blank        0
 #define FTVIMG_doc          1
 #define FTVIMG_folderclosed 2
@@ -553,6 +556,7 @@ static FTVImageInfo image_info[] =
   { "M",  "ftv2mo.png",           0 /*ftv2vertline_png*/     /*,352*/,24,22 },
   {   0,  0,                      0                          /*,  0*/, 0, 0 }
 };
+#endif
 
 static ColoredImgDataItem ftv_image_data[] =
 {
@@ -560,9 +564,9 @@ static ColoredImgDataItem ftv_image_data[] =
   { "ftv2doc.png",          24,  22, doc_png,          doc_a_png          },
   { "ftv2folderclosed.png", 24,  22, folderclosed_png, folderclosed_a_png },
   { "ftv2folderopen.png",   24,  22, folderopen_png,   folderopen_a_png   },
-  { "ftv2ns.png",           24,  22, namespace_png,    letter_a_png       },
-  { "ftv2mo.png",           24,  22, module_png,       letter_a_png       },
-  { "ftv2cl.png",           24,  22, class_png,        letter_a_png       },
+//  { "ftv2ns.png",           24,  22, namespace_png,    letter_a_png       },
+//  { "ftv2mo.png",           24,  22, module_png,       letter_a_png       },
+//  { "ftv2cl.png",           24,  22, class_png,        letter_a_png       },
   { "ftv2lastnode.png",     16,  22, blank_png,        blank_png          },
   { "ftv2link.png",         24,  22, doc_png,          doc_a_png          },
   { "ftv2mlastnode.png",    16,  22, arrow_down_png,   arrow_down_a_png   },
@@ -780,68 +784,27 @@ QCString FTVHelp::generateIndentLabel(FTVNode *n,int level)
   {
     result=generateIndentLabel(n->parent,level+1);
   }
-  result+=QCString().sprintf("%d_",n->index);
+  result+=QCString().setNum(n->index)+"_";
   return result;
 }
 
-void FTVHelp::generateIndent(FTextStream &t, FTVNode *n,int level, bool opened)
+void FTVHelp::generateIndent(FTextStream &t, FTVNode *n,bool opened)
 {
-  if (n->parent)
+  int indent=0;
+  FTVNode *p = n->parent;
+  while (p) { indent++; p=p->parent; }
+  if (n->isDir)
   {
-    generateIndent(t,n->parent,level+1,opened);
+    QCString dir = opened ? "&#9660;" : "&#9658;";
+    t << "<span style=\"width:" << (indent*16) << "px;display:inline-block;\">&#160;</span>"
+      << "<span id=\"arr_" << generateIndentLabel(n,0) << "\" class=\"arrow\" ";
+    t << "onclick=\"toggleFolder('" << generateIndentLabel(n,0) << "')\"";
+    t << ">" << dir
+      << "</span>";
   }
-  // from the root up to node n do...
-  if (level==0) // item before a dir or document
+  else
   {
-    if (n->isLast)
-    {
-      if (n->isDir)
-      {
-        t << "<img id=\"arr_" << generateIndentLabel(n,0) 
-          << "\" ";
-        if (opened)
-          t << FTV_IMGATTRIBS(mlastnode);
-        else 
-          t << FTV_IMGATTRIBS(plastnode);
-        t << "onclick=\"toggleFolder('" 
-          << generateIndentLabel(n,0) 
-          << "')\"/>";
-      }
-      else
-      {
-        t << "<img " << FTV_IMGATTRIBS(lastnode) << "/>";
-      }
-    }
-    else
-    {
-      if (n->isDir)
-      {
-        t << "<img id=\"arr_" << generateIndentLabel(n,0)
-          << "\" ";
-        if (opened)
-          t << FTV_IMGATTRIBS(mnode);
-        else
-          t << FTV_IMGATTRIBS(pnode);
-        t << "onclick=\"toggleFolder('" 
-          << generateIndentLabel(n,0)
-          << "')\"/>";
-      }
-      else
-      {
-        t << "<img " << FTV_IMGATTRIBS(node) << "/>";
-      }
-    }
-  }
-  else // item at another level
-  {
-    if (n->isLast)
-    {
-      t << "<img " << FTV_IMGATTRIBS(blank) << "/>";
-    }
-    else
-    {
-      t << "<img " << FTV_IMGATTRIBS(vertline) << "/>";
-    }
+    t << "<span style=\"width:" << ((indent+1)*16) << "px;display:inline-block;\">&#160;</span>";
   }
 }
 
@@ -912,7 +875,7 @@ void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level,in
       index++;
     t << "><td class=\"entry\">";
     bool nodeOpened = level+1<maxLevel;
-    generateIndent(t,n,0,nodeOpened);
+    generateIndent(t,n,nodeOpened);
     if (n->isDir)
     {
       if (n->def && n->def->definitionType()==Definition::TypeGroup)
@@ -925,29 +888,19 @@ void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level,in
       }
       else if (n->def && n->def->definitionType()==Definition::TypeNamespace)
       {
-        t << "<img ";
-        t << FTV_IMGATTRIBS(ns);
-        t << "/>";
+        t << "<span class=\"icona\"><span class=\"icon\">N</span></span>";
       }
       else if (n->def && n->def->definitionType()==Definition::TypeClass)
       {
-        t << "<img ";
-        t << FTV_IMGATTRIBS(cl);
-        t << "/>";
+        t << "<span class=\"icona\"><span class=\"icon\">C</span></span>";
       }
       else
       {
-        t << "<img ";
-        t << "id=\"img_" << generateIndentLabel(n,0) 
-          << "\" ";
-        if (nodeOpened)
-          t << FTV_IMGATTRIBS(folderopen);
-        else
-          t << FTV_IMGATTRIBS(folderclosed);
-        t << "onclick=\"toggleFolder('"
-          << generateIndentLabel(n,0)
-          << "')\"";
-        t << "/>";
+        t << "<span id=\"img_" << generateIndentLabel(n,0)
+          << "\" class=\"iconf"
+          << (nodeOpened?"open":"closed")
+          << "\" onclick=\"toggleFolder('" << generateIndentLabel(n,0)
+          << "')\">&#160;</span>";
       }
       generateLink(t,n);
       t << "</td><td class=\"desc\">";
@@ -983,21 +936,15 @@ void FTVHelp::generateTree(FTextStream &t, const QList<FTVNode> &nl,int level,in
       }
       else if (n->def && n->def->definitionType()==Definition::TypeNamespace)
       {
-        t << "<img ";
-        t << FTV_IMGATTRIBS(ns);
-        t << "/>";
+        t << "<span class=\"icona\"><span class=\"icon\">N</span></span>";
       }
       else if (n->def && n->def->definitionType()==Definition::TypeClass)
       {
-        t << "<img ";
-        t << FTV_IMGATTRIBS(cl);
-        t << "/>";
+        t << "<span class=\"icona\"><span class=\"icon\">C</span></span>";
       }
       else
       {
-        t << "<img ";
-        t << FTV_IMGATTRIBS(doc);
-        t << "/>";
+        t << "<span class=\"icondoc\"></span>";
       }
       if (srcRef)
       {
@@ -1023,15 +970,16 @@ struct NavIndexEntry
   QCString path;
 };
 
-class NavIndexEntryList : public QList<NavIndexEntry> 
+class NavIndexEntryList : public QList<NavIndexEntry>
 {
   public:
     NavIndexEntryList() : QList<NavIndexEntry>() { setAutoDelete(TRUE); }
    ~NavIndexEntryList() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+  private:
+    int compareValues(const NavIndexEntry *item1,const NavIndexEntry *item2) const
     {
       // sort list based on url
-      return qstrcmp(((NavIndexEntry*)item1)->url,((NavIndexEntry*)item2)->url);
+      return qstrcmp(item1->url,item2->url);
     }
 };
 
index 9794d8b..bddb2f0 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -64,7 +64,7 @@ class FTVHelp : public IndexIntf
     //bool generateJSTree(FTextStream &tidx,FTextStream &t,const QList<FTVNode> &nl,int level,bool &first);
     //bool generateJSTreeTopLevel(FTextStream &tidx,FTextStream &t,const QList<FTVNode> &nl,int level,bool &first);
     QCString generateIndentLabel(FTVNode *n,int level);
-    void generateIndent(FTextStream &t,FTVNode *n,int level,bool opened);
+    void generateIndent(FTextStream &t,FTVNode *n,bool opened);
     void generateLink(FTextStream &t,FTVNode *n);
     //void generateJSLink(FTextStream &t,FTVNode *n);
     QList<FTVNode> *m_indentNodes;
index 9426c24..85bfb8f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -581,6 +581,7 @@ void GroupDef::writeDetailedDescription(OutputList &ol,const QCString &title)
       // ol.newParagraph(); // FIXME:PARA
       ol.enableAll();
       ol.disableAllBut(OutputGenerator::Man);
+      ol.enable(OutputGenerator::Latex);
       ol.writeString("\n\n");
       ol.popGeneratorState();
     }
@@ -659,8 +660,9 @@ void GroupDef::writeFiles(OutputList &ol,const QCString &title)
     ol.parseText(title);
     ol.endMemberHeader();
     ol.startMemberList();
-    FileDef *fd=fileList->first();
-    while (fd)
+    QListIterator<FileDef> it(*fileList);
+    FileDef *fd;
+    for (;(fd=it.current());++it)
     {
       ol.startMemberDeclaration();
       ol.startMemberItem(fd->getOutputFileBase(),0);
@@ -679,7 +681,6 @@ void GroupDef::writeFiles(OutputList &ol,const QCString &title)
         ol.endMemberDescription();
       }
       ol.endMemberDeclaration(0,0);
-      fd=fileList->next();
     }
     ol.endMemberList();
   }
@@ -697,11 +698,11 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title)
   int count=0;
   if (groupList->count()>0)
   {
-    GroupDef *gd=groupList->first();
-    while (gd)
+    QListIterator<GroupDef> it(*groupList);
+    GroupDef *gd;
+    for (;(gd=it.current());++it)
     {
       if (gd->isVisible()) count++;
-      gd=groupList->next();
     }
   }
   if (count>0)
@@ -714,8 +715,9 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title)
     {
       groupList->sort();
     }
-    GroupDef *gd=groupList->first();
-    while (gd)
+    QListIterator<GroupDef> it(*groupList);
+    GroupDef *gd;
+    for (;(gd=it.current());++it)
     {
       if (gd->isVisible())
       {
@@ -738,7 +740,6 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title)
         }
         ol.endMemberDeclaration(0,0);
       }
-      gd=groupList->next();
     }
     ol.endMemberList();
   }
@@ -753,8 +754,9 @@ void GroupDef::writeDirs(OutputList &ol,const QCString &title)
     ol.parseText(title);
     ol.endMemberHeader();
     ol.startMemberList();
-    DirDef *dd=dirList->first();
-    while (dd)
+    QListIterator<DirDef> it(*dirList);
+    DirDef *dd;
+    for (;(dd=it.current());++it)
     {
       ol.startMemberDeclaration();
       ol.startMemberItem(dd->getOutputFileBase(),0);
@@ -773,7 +775,6 @@ void GroupDef::writeDirs(OutputList &ol,const QCString &title)
         ol.endMemberDescription();
       }
       ol.endMemberDeclaration(0,0);
-      dd=dirList->next();
     }
 
     ol.endMemberList();
@@ -1133,7 +1134,7 @@ void GroupDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
   MemberDef *md;
   for (mli.toFirst();(md=mli.current());++mli)
   {
-    if (md->getGroupDef()==this && md->isLinkable())
+    if (md->getGroupDef()==this && md->isLinkable() && !md->isEnumValue())
     {
       ol.writeString("          <tr><td class=\"navtab\">");
       if (md->isLinkableInProject())
@@ -1436,26 +1437,24 @@ void GroupDef::addMemberToList(MemberListType lt,MemberDef *md)
 
 void GroupDef::sortMemberLists()
 {
-  MemberList *ml = m_memberLists.first();
-  while (ml)
+  QListIterator<MemberList> mli(m_memberLists);
+  MemberList *ml;
+  for (;(ml=mli.current());++mli)
   {
     if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
-    ml = m_memberLists.next();
   }
 }
 
-
 MemberList *GroupDef::getMemberList(MemberListType lt) const
 {
-  GroupDef *that = (GroupDef*)this;
-  MemberList *ml = that->m_memberLists.first();
-  while (ml)
+  QListIterator<MemberList> mli(m_memberLists);
+  MemberList *ml;
+  for (;(ml=mli.current());++mli)
   {
     if (ml->listType()==lt)
     {
       return ml;
     }
-    ml = that->m_memberLists.next();
   }
   return 0;
 }
index bd53ff5..481bece 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -159,9 +159,10 @@ class GroupSDict : public SDict<GroupDef>
   public:
     GroupSDict(uint size) : SDict<GroupDef>(size) {}
     virtual ~GroupSDict() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+  private:
+    int compareValues(const GroupDef *item1,const GroupDef *item2) const
     {
-      return qstrcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
+      return qstrcmp(item1->groupTitle(),item2->groupTitle());
     }
 };
 
@@ -169,9 +170,9 @@ class GroupSDict : public SDict<GroupDef>
 class GroupList : public QList<GroupDef>
 {
   public:
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+    int compareValues(const GroupDef *item1,const GroupDef *item2) const
     {
-      return qstrcmp(((GroupDef*)item1)->groupTitle(),((GroupDef*)item2)->groupTitle());
+      return qstrcmp(item1->groupTitle(),item2->groupTitle());
     }
 };
 
index 5f0c71a..1e18ae1 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 474b098..5173b2b 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 203fb48..e7fd204 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van 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,33 +40,31 @@ class HtmlAttribList : public QList<HtmlAttrib>
     { clear(); QList<HtmlAttrib>::operator=(l); return *this; }
     QCString find(const QCString name) const
     {
-      HtmlAttribList *that = (HtmlAttribList *)this;
+      QListIterator<HtmlAttrib> it(*this);
       QCString result;
-      HtmlAttrib *attr=that->first();
-      while (attr)
+      HtmlAttrib *attr;
+      for (;(attr=it.current());++it)
       {
         if (attr->name==name) return attr->value;
-        attr=that->next();
       }
       return result;
     }
     QCString toString() const
     {
-      HtmlAttribList *that = (HtmlAttribList *)this;
+      QListIterator<HtmlAttrib> it(*this);
       QCString result;
-      HtmlAttrib *attr=that->first();
-      while (attr)
+      HtmlAttrib *attr;
+      for (;(attr=it.current());++it)
       {
         result+=" "+attr->name+"=\""+attr->value+"\"";
-        attr=that->next();
       }
       return result;
     }
   private:
-    QCollection::Item newItem( QCollection::Item d ) 
-    { return (QCollection::Item)new HtmlAttrib(*(HtmlAttrib *)d); }
-    void deleteItem(QCollection::Item d) 
-    { delete (HtmlAttrib *)d; }
+    HtmlAttrib *newValue( HtmlAttrib *v ) const
+    { return new HtmlAttrib(*v); }
+    void deleteValue(HtmlAttrib *v) const
+    { delete v;  }
 };
 
 /*! @brief Html attribute list iterator */
index 6ccbda4..c70f2c5 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -33,6 +33,7 @@
 #include "vhdldocgen.h"
 #include "filedef.h"
 #include "memberdef.h"
+#include "htmlentity.h"
 
 static const int NUM_HTML_LIST_TYPES = 4;
 static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
@@ -43,27 +44,30 @@ static QCString convertIndexWordToAnchor(const QString &word)
   QCString result;
   const char *str = word.data();
   unsigned char c;
-  while ((c = *str++)) 
-  {
-    if ((c >= 'a' && c <= 'z') || // ALPHA
-        (c >= 'A' && c <= 'A') || // ALPHA
-        (c >= '0' && c <= '9') || // DIGIT
-        c == '-' || 
-        c == '.' || 
-        c == '_' || 
-        c == '~'
-       )
-    {
-      result += c;
-    }
-    else 
+  if (str)
+  {
+    while ((c = *str++))
     {
-      char enc[4];
-      enc[0] = '%';
-      enc[1] = hex[(c & 0xf0) >> 4];
-      enc[2] = hex[c & 0xf];
-      enc[3] = 0;
-      result += enc;
+      if ((c >= 'a' && c <= 'z') || // ALPHA
+          (c >= 'A' && c <= 'A') || // ALPHA
+          (c >= '0' && c <= '9') || // DIGIT
+          c == '-' ||
+          c == '.' ||
+          c == '_' ||
+          c == '~'
+         )
+      {
+        result += c;
+      }
+      else
+      {
+        char enc[4];
+        enc[0] = '%';
+        enc[1] = hex[(c & 0xf0) >> 4];
+        enc[2] = hex[c & 0xf];
+        enc[3] = 0;
+        result += enc;
+      }
     }
   }
   return result;
@@ -91,7 +95,6 @@ static bool mustBeOutsideParagraph(DocNode *n)
         case DocNode::Kind_Internal:
           /* <div> */
         case DocNode::Kind_Include:
-        case DocNode::Kind_Verbatim:
         case DocNode::Kind_Image:
         case DocNode::Kind_SecRefList:
           /* <hr> */
@@ -106,6 +109,11 @@ static bool mustBeOutsideParagraph(DocNode *n)
           /* \parblock */
         case DocNode::Kind_ParBlock:
           return TRUE;
+        case DocNode::Kind_Verbatim:
+          {
+            DocVerbatim *dv = (DocVerbatim*)n;
+            return dv->type()!=DocVerbatim::HtmlOnly || dv->isBlock();
+          }
         case DocNode::Kind_StyleChange:
           return ((DocStyleChange*)n)->style()==DocStyleChange::Preformatted ||
                  ((DocStyleChange*)n)->style()==DocStyleChange::Div ||
@@ -182,110 +190,14 @@ void HtmlDocVisitor::visit(DocWhiteSpace *w)
 void HtmlDocVisitor::visit(DocSymbol *s)
 {
   if (m_hide) return;
-  switch(s->symbol())
-  {
-    case DocSymbol::BSlash:        m_t << "\\"; break;
-    case DocSymbol::At:            m_t << "@"; break;
-    case DocSymbol::Less:          m_t << "&lt;"; break;
-    case DocSymbol::Greater:       m_t << "&gt;"; break;
-    case DocSymbol::Amp:           m_t << "&amp;"; break;
-    case DocSymbol::Dollar:        m_t << "$"; break;
-    case DocSymbol::Hash:          m_t << "#"; break;
-    case DocSymbol::DoubleColon:   m_t << "::"; break;
-    case DocSymbol::Percent:       m_t << "%"; break;
-    case DocSymbol::Pipe:          m_t << "|"; break;
-    case DocSymbol::Copy:          m_t << "&copy;"; break;
-    case DocSymbol::Tm:            m_t << "&trade;"; break;
-    case DocSymbol::Reg:           m_t << "&reg;"; break;
-    case DocSymbol::Apos:          m_t << "'"; break;
-    case DocSymbol::Quot:          m_t << "\""; break;
-    case DocSymbol::Lsquo:         m_t << "&lsquo;"; break;
-    case DocSymbol::Rsquo:         m_t << "&rsquo;"; break;
-    case DocSymbol::Ldquo:         m_t << "&ldquo;"; break;
-    case DocSymbol::Rdquo:         m_t << "&rdquo;"; break;
-    case DocSymbol::Ndash:         m_t << "&ndash;"; break;
-    case DocSymbol::Mdash:         m_t << "&mdash;"; break;
-    case DocSymbol::Uml:           m_t << "&" << s->letter() << "uml;"; break;
-    case DocSymbol::Acute:         m_t << "&" << s->letter() << "acute;"; break;
-    case DocSymbol::Grave:         m_t << "&" << s->letter() << "grave;"; break;
-    case DocSymbol::Circ:          m_t << "&" << s->letter() << "circ;"; break;
-    case DocSymbol::Slash:         m_t << "&" << s->letter() << "slash;"; break;
-    case DocSymbol::Tilde:         m_t << "&" << s->letter() << "tilde;"; break;
-    case DocSymbol::Szlig:         m_t << "&szlig;"; break;
-    case DocSymbol::Cedil:         m_t << "&" << s->letter() << "cedil;"; break;
-    case DocSymbol::Ring:          m_t << "&" << s->letter() << "ring;"; break;
-    case DocSymbol::Nbsp:          m_t << "&#160;"; break;
-    case DocSymbol::AElig:         m_t << "&AElig;"; break;
-    case DocSymbol::Aelig:         m_t << "&aelig;"; break;
-    case DocSymbol::GrkGamma:      m_t << "&Gamma;"; break;
-    case DocSymbol::GrkDelta:      m_t << "&Delta;"; break;
-    case DocSymbol::GrkTheta:      m_t << "&Theta;"; break;
-    case DocSymbol::GrkLambda:     m_t << "&Lambda;"; break;
-    case DocSymbol::GrkXi:         m_t << "&Xi;"; break;
-    case DocSymbol::GrkPi:         m_t << "&Pi;"; break;
-    case DocSymbol::GrkSigma:      m_t << "&Sigma;"; break;
-    case DocSymbol::GrkUpsilon:    m_t << "&Upsilon;"; break;
-    case DocSymbol::GrkPhi:        m_t << "&Phi;"; break;
-    case DocSymbol::GrkPsi:        m_t << "&Psi;"; break;
-    case DocSymbol::GrkOmega:      m_t << "&Omega;"; break;
-    case DocSymbol::Grkalpha:      m_t << "&alpha;"; break;
-    case DocSymbol::Grkbeta:       m_t << "&beta;"; break;
-    case DocSymbol::Grkgamma:      m_t << "&gamma;"; break;
-    case DocSymbol::Grkdelta:      m_t << "&delta;"; break;
-    case DocSymbol::Grkepsilon:    m_t << "&epsilon;"; break;
-    case DocSymbol::Grkzeta:       m_t << "&zeta;"; break;
-    case DocSymbol::Grketa:        m_t << "&eta;"; break;
-    case DocSymbol::Grktheta:      m_t << "&theta;"; break;
-    case DocSymbol::Grkiota:       m_t << "&iota;"; break;
-    case DocSymbol::Grkkappa:      m_t << "&kappa;"; break;
-    case DocSymbol::Grklambda:     m_t << "&lambda;"; break;
-    case DocSymbol::Grkmu:         m_t << "&mu;"; break;
-    case DocSymbol::Grknu:         m_t << "&nu;"; break;
-    case DocSymbol::Grkxi:         m_t << "&xi;"; break;
-    case DocSymbol::Grkpi:         m_t << "&pi;"; break;
-    case DocSymbol::Grkrho:        m_t << "&rho;"; break;
-    case DocSymbol::Grksigma:      m_t << "&sigma;"; break;
-    case DocSymbol::Grktau:        m_t << "&tau;"; break;
-    case DocSymbol::Grkupsilon:    m_t << "&upsilon;"; break;
-    case DocSymbol::Grkphi:        m_t << "&phi;"; break;
-    case DocSymbol::Grkchi:        m_t << "&chi;"; break;
-    case DocSymbol::Grkpsi:        m_t << "&psi;"; break;
-    case DocSymbol::Grkomega:      m_t << "&omega;"; break;
-    case DocSymbol::Grkvarsigma:   m_t << "&sigmaf;"; break;
-    case DocSymbol::Section:       m_t << "&sect;"; break;
-    case DocSymbol::Degree:        m_t << "&deg;"; break;
-    case DocSymbol::Prime:         m_t << "&prime;"; break;
-    case DocSymbol::DoublePrime:   m_t << "&Prime;"; break;
-    case DocSymbol::Infinity:      m_t << "&infin;"; break;
-    case DocSymbol::EmptySet:      m_t << "&empty;"; break;
-    case DocSymbol::PlusMinus:     m_t << "&plusmn;"; break;
-    case DocSymbol::Times:         m_t << "&times;"; break;
-    case DocSymbol::Minus:         m_t << "&minus;"; break;
-    case DocSymbol::CenterDot:     m_t << "&sdot;"; break;
-    case DocSymbol::Partial:       m_t << "&part;"; break;
-    case DocSymbol::Nabla:         m_t << "&nabla;"; break;
-    case DocSymbol::SquareRoot:    m_t << "&radic;"; break;
-    case DocSymbol::Perpendicular: m_t << "&perp;"; break;
-    case DocSymbol::Sum:           m_t << "&sum;"; break;
-    case DocSymbol::Integral:      m_t << "&int;"; break;
-    case DocSymbol::Product:       m_t << "&prod;"; break;
-    case DocSymbol::Similar:       m_t << "&sim;"; break;
-    case DocSymbol::Approx:        m_t << "&asymp;"; break;
-    case DocSymbol::NotEqual:      m_t << "&ne;"; break;
-    case DocSymbol::Equivalent:    m_t << "&equiv;"; break;
-    case DocSymbol::Proportional:  m_t << "&prop;"; break;
-    case DocSymbol::LessEqual:     m_t << "&le;"; break;
-    case DocSymbol::GreaterEqual:  m_t << "&ge;"; break;
-    case DocSymbol::LeftArrow:     m_t << "&larr;"; break;
-    case DocSymbol::RightArrow:    m_t << "&rarr;"; break;
-    case DocSymbol::SetIn:         m_t << "&isin;"; break;
-    case DocSymbol::SetNotIn:      m_t << "&notin;"; break;
-    case DocSymbol::LeftCeil:      m_t << "&lceil;"; break;
-    case DocSymbol::RightCeil:     m_t << "&rceil;"; break;
-    case DocSymbol::LeftFloor:     m_t << "&lfloor;"; break;
-    case DocSymbol::RightFloor:    m_t << "&rfloor;"; break;
-    default:
-       err("unknown symbol found\n");
+  const char *res = HtmlEntityMapper::instance()->html(s->symbol());
+  if (res)
+  {
+    m_t << res;
+  }
+  else
+  {
+    err("HTML: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
   }
 }
 
@@ -332,7 +244,7 @@ void HtmlDocVisitor::visit(DocURL *u)
 void HtmlDocVisitor::visit(DocLineBreak *)
 {
   if (m_hide) return;
-  m_t << "<br/>\n";
+  m_t << "<br />\n";
 }
 
 void HtmlDocVisitor::visit(DocHorRuler *hr)
@@ -452,7 +364,9 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
       forceStartParagraph(s);
       break;
     case DocVerbatim::HtmlOnly: 
+      if (s->isBlock()) forceEndParagraph(s);
       m_t << s->text(); 
+      if (s->isBlock()) forceStartParagraph(s);
       break;
     case DocVerbatim::ManOnly: 
     case DocVerbatim::LatexOnly: 
@@ -585,6 +499,8 @@ void HtmlDocVisitor::visit(DocInclude *inc)
     case DocInclude::HtmlInclude: 
       m_t << inc->text(); 
       break;
+    case DocInclude::LatexInclude:
+      break;
     case DocInclude::VerbInclude: 
       forceEndParagraph(inc);
       m_t << /*PREFRAG_START <<*/ "<pre class=\"fragment\">";
@@ -1873,7 +1789,7 @@ void HtmlDocVisitor::visitPre(DocVhdlFlow *vf)
     m_t << "</a>";
     if (vf->hasCaption())
     {
-      m_t << "<br/>";
+      m_t << "<br />";
     }
   }
 }
@@ -2040,7 +1956,7 @@ void HtmlDocVisitor::writeMscFile(const QCString &fileName,
 }
 
 void HtmlDocVisitor::writeDiaFile(const QCString &fileName,
-                                  const QCString &,
+                                  const QCString &relPath,
                                   const QCString &)
 {
   QCString baseName=fileName;
@@ -2057,7 +1973,7 @@ void HtmlDocVisitor::writeDiaFile(const QCString &fileName,
   QCString outDir = Config_getString("HTML_OUTPUT");
   writeDiaGraphFromFile(fileName,outDir,baseName,DIA_BITMAP);
 
-  m_t << "<img src=\"" << outDir << '/' << baseName << ".png" << "\" />" << endl;
+  m_t << "<img src=\"" << relPath << baseName << ".png" << "\" />" << endl;
 }
 
 /** Used for items found inside a paragraph, which due to XHTML restrictions
@@ -2092,7 +2008,7 @@ void HtmlDocVisitor::forceEndParagraph(DocNode *n)
     //printf("forceEnd first=%d last=%d\n",isFirst,isLast);
     if (isFirst && isLast) return;
 
-    m_t << "</p>" << endl;
+    m_t << "</p>";
   }
 }
 
index fd7c23a..ddefecd 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van 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/htmlentity.cpp b/src/htmlentity.cpp
new file mode 100644 (file)
index 0000000..c49491e
--- /dev/null
@@ -0,0 +1,500 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "htmlentity.h"
+#include "message.h"
+#include "ftextstream.h"
+
+//! Number of doxygen commands mapped as if it were HTML entities
+static const int g_numberHtmlMappedCmds = 11;
+
+//! @brief Structure defining all HTML4 entities, doxygen extensions and doxygen commands representing special symbols.
+//! @details In case an entity does not exist a NULL is given for the entity. The first column contains the symbolic code
+//!          for the entity, see also doxparser.h The second column contains the name of the enitity (without the starting \& and
+//!          ending ;)
+static struct htmlEntityInfo
+{
+  DocSymbol::SymType symb;
+  const char *item;
+  const char *UTF8;
+  const char *html;
+  const char *xml;
+  const char *docbook;
+  const char *latex;
+  const char *man;
+  const char *rtf;
+  DocSymbol::PerlSymb perl;
+} g_htmlEntities[] =
+{
+#undef SYM
+// helper macro to force consistent entries for the symbol and item columns
+#define SYM(s) DocSymbol::Sym_##s,"&"#s";"
+  // HTML4 entities
+  // symb+item     UTF-8           html          xml                     docbook          latex                     man       rtf            perl
+  { SYM(nbsp),     "\xc2\xa0",     "&#160;",     "<nonbreakablespace/>", "&#160;",        "~",                      " ",      "\\~",         { " ",          DocSymbol::Perl_char    }},
+  { SYM(iexcl),    "\xc2\xa1",     "&iexcl;",    "<iexcl/>",             "&#161;",        "!`",                     NULL,     "\\'A1",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(cent),     "\xc2\xa2",     "&cent;",     "<cent/>",              "&#162;",        "\\textcent{}",           NULL,     "\\'A2",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(pound),    "\xc2\xa3",     "&pound;",    "<pound/>",             "&#163;",        "{$\\pounds$}",           NULL,     "\\'A3",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(curren),   "\xc2\xa4",     "&curren;",   "<curren/>",            "&#164;",        "\\textcurrency{}",       NULL,     "\\'A4",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(yen),      "\xc2\xa5",     "&yen;",      "<yen/>",               "&#165;",        "{$\\yen$}",              NULL,     "\\'A5",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(brvbar),   "\xc2\xa6",     "&brvbar;",   "<brvbar/>",            "&#166;",        "\\textbrokenbar{}",      NULL,     "\\'A6",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(sect),     "\xc2\xa7",     "&sect;",     "<sect/>",              "<simplesect/>", "{$\\S$}",                NULL,     "\\'A7",       { "sect",       DocSymbol::Perl_symbol  }},
+  { SYM(uml),      "\xc2\xa8",     "&uml;",      "<umlaut/>",            "&#168;",        "\\textasciidieresis{}",  " \\*(4", "\\'A8",       { " ",          DocSymbol::Perl_umlaut  }},
+  { SYM(copy),     "\xc2\xa9",     "&copy;",     "<copy/>",              "&#169;",        "\\copyright{}",          "(C)",    "\\'A9",       { "copyright",  DocSymbol::Perl_symbol  }},
+  { SYM(ordf),     "\xc2\xaa",     "&ordf;",     "<ordf/>",              "&#170;",        "\\textordfeminine{}",    NULL,     "\\'AA",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(laquo),    "\xc2\xab",     "&laquo;",    "<laquo/>",             "&#171;",        "\\guillemotleft{}",      NULL,     "\\'AB",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(not),      "\xc2\xac",     "&not;",      "<not/>",               "&#172;",        "\\textlnot",             NULL,     "\\'AC",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(shy),      "\xc2\xad",     "&shy;",      "<shy/>",               "&#173;",        "{$\\-$}",                NULL,     "\\-",         { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(reg),      "\xc2\xae",     "&reg;",      "<registered/>",        "&#174;",        "\\textregistered{}",     "(R)",    "\\'AE",       { "registered", DocSymbol::Perl_symbol  }},
+  { SYM(macr),     "\xc2\xaf",     "&macr;",     "<macr/>",              "&#175;",        "\\={}",                  NULL,     "\\'AF",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(deg),      "\xc2\xb0",     "&deg;",      "<deg/>",               "&#176;",        "\\textdegree",           NULL,     "\\'B0",       { "deg",        DocSymbol::Perl_symbol  }},
+  { SYM(plusmn),   "\xc2\xb1",     "&plusmn;",   "<plusmn/>",            "&#177;",        "{$\\pm$}",               NULL,     "\\'B1",       { "+/-",        DocSymbol::Perl_string  }},
+  { SYM(sup2),     "\xc2\xb2",     "&sup2;",     "<sup2/>",              "&#178;",        "\\texttwosuperior{}",    NULL,     "\\'B2",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(sup3),     "\xc2\xb3",     "&sup3;",     "<sup3/>",              "&#179;",        "\\textthreesuperior{}",  NULL,     "\\'B3",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(acute),    "\xc2\xb4",     "&acute;",    "<acute/>",             "&#180;",        "\\'{}",                  NULL,     "\\'B4",       { " ",          DocSymbol::Perl_acute   }},
+  { SYM(micro),    "\xc2\xb5",     "&micro;",    "<micro/>",             "&#181;",        "{$\\mu$}",               NULL,     "\\'B5",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(para),     "\xc2\xb6",     "&para;",     "<para/>",              "&#182;",        "{$\\P$}",                NULL,     "\\'B6",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(middot),   "\xc2\xb7",     "&middot;",   "<middot/>",            "&#183;",        "\\textperiodcentered{}", NULL,     "\\'B7",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(cedil),    "\xc2\xb8",     "&cedil;",    "<cedil/>",             "&#184;",        "\\c{}",                  " \\*,",  "\\'B8",       { " ",          DocSymbol::Perl_cedilla }},
+  { SYM(sup1),     "\xc2\xb9",     "&sup1;",     "<sup1/>",              "&#185;",        "\\textonesuperior{}",    NULL,     "\\'B9",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(ordm),     "\xc2\xba",     "&ordm;",     "<ordm/>",              "&#186;",        "\\textordmasculine{}",   NULL,     "\\'BA",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(raquo),    "\xc2\xbb",     "&raquo;",    "<raquo/>",             "&#187;",        "\\guillemotright{}",     NULL,     "\\'BB",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(frac14),   "\xc2\xbc",     "&frac14;",   "<frac14/>",            "&#188;",        "{$\\frac14$}",           "1/4",    "\\'BC",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(frac12),   "\xc2\xbd",     "&frac12;",   "<frac12/>",            "&#189;",        "{$\\frac12$}",           "1/2",    "\\'BD",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(frac34),   "\xc2\xbe",     "&frac34;",   "<frac34/>",            "&#190;",        "{$\\frac34$}",           "3/4",    "\\'BE",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(iquest),   "\xc2\xbf",     "&iquest;",   "<iquest/>",            "&#191;",        "?`",                     NULL,     "\\'BF",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(Agrave),   "\xc3\x80",     "&Agrave;",   "<Agrave/>",            "&#192;",        "\\`{A}",                 "A\\*:",  "\\'C0",       { "A",          DocSymbol::Perl_grave   }},
+  { SYM(Aacute),   "\xc3\x81",     "&Aacute;",   "<Aacute/>",            "&#193;",        "\\'{A}",                 "A\\*(`", "\\'C1",       { "A",          DocSymbol::Perl_acute   }},
+  { SYM(Acirc),    "\xc3\x82",     "&Acirc;",    "<Acirc/>",             "&#194;",        "\\^{A}",                 "A\\*^",  "\\'C2",       { "A",          DocSymbol::Perl_circ    }},
+  { SYM(Atilde),   "\xc3\x83",     "&Atilde;",   "<Atilde/>",            "&#195;",        "\\~{A}",                 "A\\*~",  "\\'C3",       { "A",          DocSymbol::Perl_tilde   }},
+  { SYM(Auml),     "\xc3\x84",     "&Auml;",     "<Aumlaut/>",           "&#196;",        "\\\"{A}",                "A\\*(4", "\\'C4",       { "A",          DocSymbol::Perl_umlaut  }},
+  { SYM(Aring),    "\xc3\x85",     "&Aring;",    "<Aring/>",             "&#197;",        "\\AA",                   "A\\*o",  "\\'C5",       { "A",          DocSymbol::Perl_ring    }},
+  { SYM(AElig),    "\xc3\x86",     "&AElig;",    "<AElig/>",             "&#198;",        "{\\AE}",                 NULL,     "\\'C6",       { "AElig",      DocSymbol::Perl_symbol  }},
+  { SYM(Ccedil),   "\xc3\x87",     "&Ccedil;",   "<Ccedil/>",            "&#199;",        "\\c{C}",                 "C\\*,",  "\\'C7",       { "C",          DocSymbol::Perl_cedilla }},
+  { SYM(Egrave),   "\xc3\x88",     "&Egrave;",   "<Egrave/>",            "&#200;",        "\\`{E}",                 "E\\*:",  "\\'C8",       { "E",          DocSymbol::Perl_grave   }},
+  { SYM(Eacute),   "\xc3\x89",     "&Eacute;",   "<Eacute/>",            "&#201;",        "\\'{E}",                 "E\\*(`", "\\'C9",       { "E",          DocSymbol::Perl_acute   }},
+  { SYM(Ecirc),    "\xc3\x8a",     "&Ecirc;",    "<Ecirc/>",             "&#202;",        "\\^{E}",                 "E\\*^",  "\\'CA",       { "E",          DocSymbol::Perl_circ    }},
+  { SYM(Euml),     "\xc3\x8b",     "&Euml;",     "<Eumlaut/>",           "&#203;",        "\\\"{E}",                "E\\*(4", "\\'CB",       { "E",          DocSymbol::Perl_umlaut  }},
+  { SYM(Igrave),   "\xc3\x8c",     "&Igrave;",   "<Igrave/>",            "&#204;",        "\\`{I}",                 "I\\*:",  "\\'CC",       { "I",          DocSymbol::Perl_grave   }},
+  { SYM(Iacute),   "\xc3\x8d",     "&Iacute;",   "<Iacute/>",            "&#205;",        "\\'{I}",                 "I\\*(`", "\\'CD",       { "I",          DocSymbol::Perl_acute   }},
+  { SYM(Icirc),    "\xc3\x8e",     "&Icirc;",    "<Icirc/>",             "&#206;",        "\\^{I}",                 "I\\*^",  "\\'CE",       { "I",          DocSymbol::Perl_circ    }},
+  { SYM(Iuml),     "\xc3\x8f",     "&Iuml;",     "<Iumlaut/>",           "&#207;",        "\\\"{I}",                "I\\*(4", "\\'CF",       { "I",          DocSymbol::Perl_umlaut  }},
+  { SYM(ETH),      "\xc3\x90",     "&ETH;",      "<ETH/>",               "&#208;",        "\\DH",                   NULL,     "\\'D0",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(Ntilde),   "\xc3\x91",     "&Ntilde;",   "<Ntilde/>",            "&#209;",        "\\~{N}",                 "N\\*~",  "\\'D1",       { "N",          DocSymbol::Perl_tilde   }},
+  { SYM(Ograve),   "\xc3\x92",     "&Ograve;",   "<Ograve/>",            "&#210;",        "\\`{O}",                 "O\\*:",  "\\'D2",       { "O",          DocSymbol::Perl_grave   }},
+  { SYM(Oacute),   "\xc3\x93",     "&Oacute;",   "<Oacute/>",            "&#211;",        "\\'{O}",                 "O\\*(`", "\\'D3",       { "O",          DocSymbol::Perl_acute   }},
+  { SYM(Ocirc),    "\xc3\x94",     "&Ocirc;",    "<Ocirc/>",             "&#212;",        "\\^{O}",                 "O\\*^",  "\\'D4",       { "O",          DocSymbol::Perl_circ    }},
+  { SYM(Otilde),   "\xc3\x95",     "&Otilde;",   "<Otilde/>",            "&#213;",        "\\~{O}",                 "O\\*~",  "\\'D5",       { "O",          DocSymbol::Perl_tilde   }},
+  { SYM(Ouml),     "\xc3\x96",     "&Ouml;",     "<Oumlaut/>",           "&#214;",        "\\\"{O}",                "O\\*(4", "\\'D6",       { "O",          DocSymbol::Perl_umlaut  }},
+  { SYM(times),    "\xc3\x97",     "&times;",    "<times/>",             "&#215;",        "{$\\times$}",            NULL,     "\\'D7",       { "*",          DocSymbol::Perl_char    }},
+  { SYM(Oslash),   "\xc3\x98",     "&Oslash;",   "<Oslash/>",            "&#216;",        "{\\O}",                  "O\x08/", "\\'D8",       { "O",          DocSymbol::Perl_slash   }},
+  { SYM(Ugrave),   "\xc3\x99",     "&Ugrave;",   "<Ugrave/>",            "&#217;",        "\\`{U}",                 "U\\*:",  "\\'D9",       { "U",          DocSymbol::Perl_grave   }},
+  { SYM(Uacute),   "\xc3\x9a",     "&Uacute;",   "<Uacute/>",            "&#218;",        "\\'{U}",                 "U\\*(`", "\\'DA",       { "U",          DocSymbol::Perl_acute   }},
+  { SYM(Ucirc),    "\xc3\x9b",     "&Ucirc;",    "<Ucirc/>",             "&#219;",        "\\^{U}",                 "U\\*^",  "\\'DB",       { "U",          DocSymbol::Perl_circ    }},
+  { SYM(Uuml),     "\xc3\x9c",     "&Uuml;",     "<Uumlaut/>",           "&#220;",        "\\\"{U}",                "U\\*(4", "\\'DC",       { "U",          DocSymbol::Perl_umlaut  }},
+  { SYM(Yacute),   "\xc3\x9d",     "&Yacute;",   "<Yacute/>",            "&#221;",        "\\'{Y}",                 "Y\\*(`", "\\'DD",       { "Y",          DocSymbol::Perl_acute   }},
+  { SYM(THORN),    "\xc3\x9e",     "&THORN;",    "<THORN/>",             "&#222;",        "\\TH",                   NULL,     "\\'DE",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(szlig),    "\xc3\x9f",     "&szlig;",    "<szlig/>",             "&#223;",        "{\\ss}",                 "s\\*:",  "\\'DF",       { "szlig",      DocSymbol::Perl_symbol  }},
+  { SYM(agrave),   "\xc3\xa0",     "&agrave;",   "<agrave/>",            "&#224;",        "\\`{a}",                 "a\\*:",  "\\'E0",       { "a",          DocSymbol::Perl_grave   }},
+  { SYM(aacute),   "\xc3\xa1",     "&aacute;",   "<aacute/>",            "&#225;",        "\\'{a}",                 "a\\*(`", "\\'E1",       { "a",          DocSymbol::Perl_acute   }},
+  { SYM(acirc),    "\xc3\xa2",     "&acirc;",    "<acirc/>",             "&#226;",        "\\^{a}",                 "a\\*^",  "\\'E2",       { "a",          DocSymbol::Perl_circ    }},
+  { SYM(atilde),   "\xc3\xa3",     "&atilde;",   "<atilde/>",            "&#227;",        "\\~{a}",                 "a\\*~",  "\\'E3",       { "a",          DocSymbol::Perl_tilde   }},
+  { SYM(auml),     "\xc3\xa4",     "&auml;",     "<aumlaut/>",           "&#228;",        "\\\"{a}",                "a\\*(4", "\\'E4",       { "a",          DocSymbol::Perl_umlaut  }},
+  { SYM(aring),    "\xc3\xa5",     "&aring;",    "<aring/>",             "&#229;",        "\\aa",                   "a\\*o",  "\\'E5",       { "a",          DocSymbol::Perl_ring    }},
+  { SYM(aelig),    "\xc3\xa6",     "&aelig;",    "<aelig/>",             "&#230;",        "{\\ae}",                 NULL,     "\\'E6",       { "aelig",      DocSymbol::Perl_symbol  }},
+  { SYM(ccedil),   "\xc3\xa7",     "&ccedil;",   "<ccedil/>",            "&#231;",        "\\c{c}",                 "c\\*,",  "\\'E7",       { "c",          DocSymbol::Perl_cedilla }},
+  { SYM(egrave),   "\xc3\xa8",     "&egrave;",   "<egrave/>",            "&#232;",        "\\`{e}",                 "e\\*:",  "\\'E8",       { "e",          DocSymbol::Perl_grave   }},
+  { SYM(eacute),   "\xc3\xa9",     "&eacute;",   "<eacute/>",            "&#233;",        "\\'{e}",                 "e\\*(`", "\\'E9",       { "e",          DocSymbol::Perl_acute   }},
+  { SYM(ecirc),    "\xc3\xaa",     "&ecirc;",    "<ecirc/>",             "&#234;",        "\\^{e}",                 "e\\*^",  "\\'EA",       { "e",          DocSymbol::Perl_circ    }},
+  { SYM(euml),     "\xc3\xab",     "&euml;",     "<eumlaut/>",           "&#235;",        "\\\"{e}",                "e\\*(4", "\\'EB",       { "e",          DocSymbol::Perl_umlaut  }},
+  { SYM(igrave),   "\xc3\xac",     "&igrave;",   "<igrave/>",            "&#236;",        "\\`{\\i}",               "i\\*:",  "\\'EC",       { "i",          DocSymbol::Perl_grave   }},
+  { SYM(iacute),   "\xc3\xad",     "&iacute;",   "<iacute/>",            "&#237;",        "\\'{\\i}",               "i\\*(`", "\\'ED",       { "i",          DocSymbol::Perl_acute   }},
+  { SYM(icirc),    "\xc3\xae",     "&icirc;",    "<icirc/>",             "&#238;",        "\\^{\\i}",               "i\\*^",  "\\'EE",       { "i",          DocSymbol::Perl_circ    }},
+  { SYM(iuml),     "\xc3\xaf",     "&iuml;",     "<iumlaut/>",           "&#239;",        "\\\"{\\i}",              "i\\*(4", "\\'EF",       { "i",          DocSymbol::Perl_umlaut  }},
+  { SYM(eth),      "\xc3\xb0",     "&eth;",      "<eth/>",               "&#240;",        "\\dh",                   NULL,     "\\'F0",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(ntilde),   "\xc3\xb1",     "&ntilde;",   "<ntilde/>",            "&#241;",        "\\~{n}",                 "n\\*~",  "\\'F1",       { "n",          DocSymbol::Perl_tilde   }},
+  { SYM(ograve),   "\xc3\xb2",     "&ograve;",   "<ograve/>",            "&#242;",        "\\`{o}",                 "o\\*:",  "\\'F2",       { "o",          DocSymbol::Perl_grave   }},
+  { SYM(oacute),   "\xc3\xb3",     "&oacute;",   "<oacute/>",            "&#243;",        "\\'{o}",                 "o\\*(`", "\\'F3",       { "o",          DocSymbol::Perl_acute   }},
+  { SYM(ocirc),    "\xc3\xb4",     "&ocirc;",    "<ocirc/>",             "&#244;",        "\\^{o}",                 "o\\*^",  "\\'F4",       { "o",          DocSymbol::Perl_circ    }},
+  { SYM(otilde),   "\xc3\xb5",     "&otilde;",   "<otilde/>",            "&#245;",        "\\~{o}",                 "o\\*~",  "\\'F5",       { "o",          DocSymbol::Perl_tilde   }},
+  { SYM(ouml),     "\xc3\xb6",     "&ouml;",     "<oumlaut/>",           "&#246;",        "\\\"{o}",                "o\\*(4", "\\'F6",       { "o",          DocSymbol::Perl_umlaut  }},
+  { SYM(divide),   "\xc3\xb7",     "&divide;",   "<divide/>",            "&#247;",        "{$\\div$}",              NULL,     "\\'F7",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(oslash),   "\xc3\xb8",     "&oslash;",   "<oslash/>",            "&#248;",        "{\\o}",                  "o\x08/", "\\'F8",       { "o",          DocSymbol::Perl_slash   }},
+  { SYM(ugrave),   "\xc3\xb9",     "&ugrave;",   "<ugrave/>",            "&#249;",        "\\`{u}",                 "u\\*:",  "\\'F9",       { "u",          DocSymbol::Perl_grave   }},
+  { SYM(uacute),   "\xc3\xba",     "&uacute;",   "<uacute/>",            "&#250;",        "\\'{u}",                 "u\\*(`", "\\'FA",       { "u",          DocSymbol::Perl_acute   }},
+  { SYM(ucirc),    "\xc3\xbb",     "&ucirc;",    "<ucirc/>",             "&#251;",        "\\^{u}",                 "u\\*^",  "\\'FB",       { "u",          DocSymbol::Perl_circ    }},
+  { SYM(uuml),     "\xc3\xbc",     "&uuml;",     "<uumlaut/>",           "&#252;",        "\\\"{u}",                "u\\*(4", "\\'FC",       { "u",          DocSymbol::Perl_umlaut  }},
+  { SYM(yacute),   "\xc3\xbd",     "&yacute;",   "<yacute/>",            "&#253;",        "\\'{y}",                 "y\\*(`", "\\'FD",       { "y",          DocSymbol::Perl_acute   }},
+  { SYM(thorn),    "\xc3\xbe",     "&thorn;",    "<thorn/>",             "&#254;",        "\\th",                   NULL,     "\\'FE",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(yuml),     "\xc3\xbf",     "&yuml;",     "<yumlaut/>",           "&#255;",        "\\\"{y}",                "y\\*(4", "\\'FF",       { "y",          DocSymbol::Perl_umlaut  }},
+  { SYM(fnof),     "\xc6\x92",     "&fnof;",     "<fnof/>",              "&#402;",        "\\textflorin",           NULL,     "\\'83",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(Alpha),    "\xce\x91",     "&Alpha;",    "<Alpha/>",             "&#913;",        "A",                      NULL,     "\\u0913?",    { "A",          DocSymbol::Perl_char    }},
+  { SYM(Beta),     "\xce\x92",     "&Beta;",     "<Beta/>",              "&#914;",        "B",                      NULL,     "\\u0914?",    { "B",          DocSymbol::Perl_char    }},
+  { SYM(Gamma),    "\xce\x93",     "&Gamma;",    "<Gamma/>",             "&#915;",        "{$\\Gamma$}",            NULL,     "\\u0915?",    { "Gamma",      DocSymbol::Perl_symbol  }},
+  { SYM(Delta),    "\xce\x94",     "&Delta;",    "<Delta/>",             "&#916;",        "{$\\Delta$}",            NULL,     "\\u0916?",    { "Delta",      DocSymbol::Perl_symbol  }},
+  { SYM(Epsilon),  "\xce\x95",     "&Epsilon;",  "<Epsilon/>",           "&#917;",        "E",                      NULL,     "\\u0917?",    { "E",          DocSymbol::Perl_char    }},
+  { SYM(Zeta),     "\xce\x96",     "&Zeta;",     "<Zeta/>",              "&#918;",        "Z",                      NULL,     "\\u0918?",    { "Z",          DocSymbol::Perl_char    }},
+  { SYM(Eta),      "\xce\x97",     "&Eta;",      "<Eta/>",               "&#919;",        "H",                      NULL,     "\\u0919?",    { "H",          DocSymbol::Perl_char    }},
+  { SYM(Theta),    "\xce\x98",     "&Theta;",    "<Theta/>",             "&#920;",        "{$\\Theta$}",            NULL,     "\\u0920?",    { "Theta",      DocSymbol::Perl_symbol  }},
+  { SYM(Iota),     "\xce\x99",     "&Iota;",     "<Iota/>",              "&#921;",        "I",                      NULL,     "\\u0921?",    { "I",          DocSymbol::Perl_char    }},
+  { SYM(Kappa),    "\xce\x9a",     "&Kappa;",    "<Kappa/>",             "&#922;",        "K",                      NULL,     "\\u0922?",    { "K",          DocSymbol::Perl_char    }},
+  { SYM(Lambda),   "\xce\x9b",     "&Lambda;",   "<Lambda/>",            "&#923;",        "{$\\Lambda$}",           NULL,     "\\u0923?",    { "Lambda",     DocSymbol::Perl_symbol  }},
+  { SYM(Mu),       "\xce\x9c",     "&Mu;",       "<Mu/>",                "&#924;",        "M",                      NULL,     "\\u0924?",    { "M",          DocSymbol::Perl_char    }},
+  { SYM(Nu),       "\xce\x9d",     "&Nu;",       "<Nu/>",                "&#925;",        "N",                      NULL,     "\\u0925?",    { "N",          DocSymbol::Perl_char    }},
+  { SYM(Xi),       "\xce\x9e",     "&Xi;",       "<Xi/>",                "&#926;",        "{$\\Xi$}",               NULL,     "\\u0926?",    { "Xi",         DocSymbol::Perl_symbol  }},
+  { SYM(Omicron),  "\xce\x9f",     "&Omicron;",  "<Omicron/>",           "&#927;",        "O",                      NULL,     "\\u0927?",    { "O",          DocSymbol::Perl_char    }},
+  { SYM(Pi),       "\xce\xa0",     "&Pi;",       "<Pi/>",                "&#928;",        "{$\\Pi$}",               NULL,     "\\u0928?",    { "Pi",         DocSymbol::Perl_symbol  }},
+  { SYM(Rho),      "\xce\xa1",     "&Rho;",      "<Rho/>",               "&#929;",        "P",                      NULL,     "\\u0929?",    { "P",          DocSymbol::Perl_char    }},
+  { SYM(Sigma),    "\xce\xa3",     "&Sigma;",    "<Sigma/>",             "&#931;",        "{$\\Sigma$}",            NULL,     "\\u0931?",    { "Sigma",      DocSymbol::Perl_symbol  }},
+  { SYM(Tau),      "\xce\xa4",     "&Tau;",      "<Tau/>",               "&#932;",        "T",                      NULL,     "\\u0932?",    { "T",          DocSymbol::Perl_char    }},
+  { SYM(Upsilon),  "\xce\xa5",     "&Upsilon;",  "<Upsilon/>",           "&#933;",        "{$\\Upsilon$}",          NULL,     "\\u0933?",    { "Upsilon",    DocSymbol::Perl_symbol  }},
+  { SYM(Phi),      "\xce\xa6",     "&Phi;",      "<Phi/>",               "&#934;",        "{$\\Phi$}",              NULL,     "\\u0934?",    { "Phi",        DocSymbol::Perl_symbol  }},
+  { SYM(Chi),      "\xce\xa7",     "&Chi;",      "<Chi/>",               "&#935;",        "X",                      NULL,     "\\u0935?",    { "X",          DocSymbol::Perl_char    }},
+  { SYM(Psi),      "\xce\xa8",     "&Psi;",      "<Psi/>",               "&#936;",        "{$\\Psi$}",              NULL,     "\\u0936?",    { "Psi",        DocSymbol::Perl_symbol  }},
+  { SYM(Omega),    "\xce\xa9",     "&Omega;",    "<Omega/>",             "&#937;",        "{$\\Omega$}",            NULL,     "\\u0937?",    { "Omega",      DocSymbol::Perl_symbol  }},
+  { SYM(alpha),    "\xce\xb1",     "&alpha;",    "<alpha/>",             "&#945;",        "{$\\alpha$}",            NULL,     "\\u0945?",    { "alpha",      DocSymbol::Perl_symbol  }},
+  { SYM(beta),     "\xce\xb2",     "&beta;",     "<beta/>",              "&#946;",        "{$\\beta$}",             NULL,     "\\u0946?",    { "beta",       DocSymbol::Perl_symbol  }},
+  { SYM(gamma),    "\xce\xb3",     "&gamma;",    "<gamma/>",             "&#947;",        "{$\\gamma$}",            NULL,     "\\u0947?",    { "gamma",      DocSymbol::Perl_symbol  }},
+  { SYM(delta),    "\xce\xb4",     "&delta;",    "<delta/>",             "&#948;",        "{$\\delta$}",            NULL,     "\\u0948?",    { "delta",      DocSymbol::Perl_symbol  }},
+  { SYM(epsilon),  "\xce\xb5",     "&epsilon;",  "<epsilon/>",           "&#949;",        "{$\\varepsilon$}",       NULL,     "\\u0949?",    { "epsilon",    DocSymbol::Perl_symbol  }},
+  { SYM(zeta),     "\xce\xb6",     "&zeta;",     "<zeta/>",              "&#950;",        "{$\\zeta$}",             NULL,     "\\u0950?",    { "zeta",       DocSymbol::Perl_symbol  }},
+  { SYM(eta),      "\xce\xb7",     "&eta;",      "<eta/>",               "&#951;",        "{$\\eta$}",              NULL,     "\\u0951?",    { "eta",        DocSymbol::Perl_symbol  }},
+  { SYM(theta),    "\xce\xb8",     "&theta;",    "<theta/>",             "&#952;",        "{$\\theta$}",            NULL,     "\\u0952?",    { "theta",      DocSymbol::Perl_symbol  }},
+  { SYM(iota),     "\xce\xb9",     "&iota;",     "<iota/>",              "&#953;",        "{$\\iota$}",             NULL,     "\\u0953?",    { "iota",       DocSymbol::Perl_symbol  }},
+  { SYM(kappa),    "\xce\xba",     "&kappa;",    "<kappa/>",             "&#954;",        "{$\\kappa$}",            NULL,     "\\u0954?",    { "kappa",      DocSymbol::Perl_symbol  }},
+  { SYM(lambda),   "\xce\xbb",     "&lambda;",   "<lambda/>",            "&#955;",        "{$\\lambda$}",           NULL,     "\\u0955?",    { "lambda",     DocSymbol::Perl_symbol  }},
+  { SYM(mu),       "\xce\xbc",     "&mu;",       "<mu/>",                "&#956;",        "{$\\mu$}",               NULL,     "\\u0956?",    { "mu",         DocSymbol::Perl_symbol  }},
+  { SYM(nu),       "\xce\xbd",     "&nu;",       "<nu/>",                "&#957;",        "{$\\nu$}",               NULL,     "\\u0957?",    { "nu",         DocSymbol::Perl_symbol  }},
+  { SYM(xi),       "\xce\xbe",     "&xi;",       "<xi/>",                "&#958;",        "{$\\xi$}",               NULL,     "\\u0958?",    { "xi",         DocSymbol::Perl_symbol  }},
+  { SYM(omicron),  "\xce\xbf",     "&omicron;",  "<omicron/>",           "&#959;",        "{$\\omicron$}",          NULL,     "\\u0959?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(pi),       "\xcf\x80",     "&pi;",       "<pi/>",                "&#960;",        "{$\\pi$}",               NULL,     "\\u0960?",    { "pi",         DocSymbol::Perl_symbol  }},
+  { SYM(rho),      "\xcf\x81",     "&rho;",      "<rho/>",               "&#961;",        "{$\\rho$}",              NULL,     "\\u0961?",    { "rho",        DocSymbol::Perl_symbol  }},
+  { SYM(sigmaf),   "\xcf\x82",     "&sigmaf;",   "<sigmaf/>",            "&#962;",        "{$\\varsigma$}",         NULL,     "\\u0962?",    { "sigma",      DocSymbol::Perl_symbol  }},
+  { SYM(sigma),    "\xcf\x83",     "&sigma;",    "<sigma/>",             "&#963;",        "{$\\sigma$}",            NULL,     "\\u0963?",    { "sigma",      DocSymbol::Perl_symbol  }},
+  { SYM(tau),      "\xcf\x84",     "&tau;",      "<tau/>",               "&#964;",        "{$\\tau$}",              NULL,     "\\u0964?",    { "tau",        DocSymbol::Perl_symbol  }},
+  { SYM(upsilon),  "\xcf\x85",     "&upsilon;",  "<upsilon/>",           "&#965;",        "{$\\upsilon$}",          NULL,     "\\u0965?",    { "upsilon",    DocSymbol::Perl_symbol  }},
+  { SYM(phi),      "\xcf\x86",     "&phi;",      "<phi/>",               "&#966;",        "{$\\varphi$}",           NULL,     "\\u0966?",    { "phi",        DocSymbol::Perl_symbol  }},
+  { SYM(chi),      "\xcf\x87",     "&chi;",      "<chi/>",               "&#967;",        "{$\\chi$}",              NULL,     "\\u0967?",    { "chi",        DocSymbol::Perl_symbol  }},
+  { SYM(psi),      "\xcf\x88",     "&psi;",      "<psi/>",               "&#968;",        "{$\\psi$}",              NULL,     "\\u0968?",    { "psi",        DocSymbol::Perl_symbol  }},
+  { SYM(omega),    "\xcf\x89",     "&omega;",    "<omega/>",             "&#969;",        "{$\\omega$}",            NULL,     "\\u0969?",    { "omega",      DocSymbol::Perl_symbol  }},
+  { SYM(thetasym), "\xcf\x91",     "&thetasym;", "<thetasym/>",          "&#977;",        "{$\\vartheta$}",         NULL,     "\\u977?",     { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(upsih),    "\xcf\x92",     "&upsih;",    "<upsih/>",             "&#978;",        "{$\\Upsilon$}",          NULL,     "\\u978?",     { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(piv),      "\xcf\x96",     "&piv;",      "<piv/>",               "&#982;",        "{$\\varpi$}",            NULL,     "\\u982?",     { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(bull),     "\xe2\x80\xa2", "&bull;",     "<bull/>",              "&#8226;",       "\\textbullet{}",         NULL,     "\\'95",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(hellip),   "\xe2\x80\xa6", "&hellip;",   "<hellip/>",            "&#8230;",       "{$\\cdots$}",            NULL,     "\\'85",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(prime),    "\xe2\x80\xb2", "&prime;",    "<prime/>",             "&#8242;",       "'",                      NULL,     "\\u8242?",    { "\\\'",       DocSymbol::Perl_string  }},
+  { SYM(Prime),    "\xe2\x80\xb3", "&Prime;",    "<Prime/>",             "&#8243;",       "''",                     NULL,     "\\u8243?",    { "\"",         DocSymbol::Perl_char    }},
+  { SYM(oline),    "\xe2\x80\xbe", "&oline;",    "<oline/>",             "&#8254;",       "{$\\overline{\\,}$}",    NULL,     "\\u8254?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(frasl),    "\xe2\x81\x84", "&frasl;",    "<frasl/>",             "&#8260;",       "/",                      NULL,     "\\u8260?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(weierp),   "\xe2\x84\x98", "&weierp;",   "<weierp/>",            "&#8472;",       "{$\\wp$}",               NULL,     "\\u8472?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(image),    "\xe2\x84\x91", "&image;",    "<image/>",             "&#8465;",       "{$\\Im$}",               NULL,     "\\u8465?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(real),     "\xe2\x84\x9c", "&real;",     "<real/>",              "&#8476;",       "{$\\Re$}",               NULL,     "\\u8476?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(trade),    "\xe2\x84\xa2", "&trade;",    "<trademark/>",         "&#8482;",       "\\texttrademark{}",      "(TM)",   "\\'99",       { "trademark",  DocSymbol::Perl_symbol  }},
+  { SYM(alefsym),  "\xe2\x85\xb5", "&alefsym;",  "<alefsym/>",           "&#8501;",       "{$\\aleph$}",            NULL,     "\\u8501?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(larr),     "\xe2\x86\x90", "&larr;",     "<larr/>",              "&#8592;",       "{$\\leftarrow$}",        NULL,     "\\u8592?",    { "<-",         DocSymbol::Perl_string  }},
+  { SYM(uarr),     "\xe2\x86\x91", "&uarr;",     "<uarr/>",              "&#8593;",       "{$\\uparrow$}",          NULL,     "\\u8593?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(rarr),     "\xe2\x86\x92", "&rarr;",     "<rarr/>",              "&#8594;",       "{$\\rightarrow$}",       NULL,     "\\u8594?",    { "->",         DocSymbol::Perl_string  }},
+  { SYM(darr),     "\xe2\x86\x93", "&darr;",     "<darr/>",              "&#8595;",       "{$\\downarrow$}",        NULL,     "\\u8595?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(harr),     "\xe2\x86\x94", "&harr;",     "<harr/>",              "&#8596;",       "{$\\leftrightarrow$}",   NULL,     "\\u8596?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(crarr),    "\xe2\x86\xb5", "&crarr;",    "<crarr/>",             "&#8629;",       "{$\\hookleftarrow$}",    NULL,     "\\u8629?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(lArr),     "\xe2\x87\x90", "&lArr;",     "<lArr/>",              "&#8656;",       "{$\\Leftarrow$}",        NULL,     "\\u8656?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(uArr),     "\xe2\x87\x91", "&uArr;",     "<uArr/>",              "&#8657;",       "{$\\Uparrow$}",          NULL,     "\\u8657?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(rArr),     "\xe2\x87\x92", "&rArr;",     "<rArr/>",              "&#8658;",       "{$\\Rightarrow$}",       NULL,     "\\u8658?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(dArr),     "\xe2\x87\x93", "&dArr;",     "<dArr/>",              "&#8659;",       "{$\\Downarrow$}",        NULL,     "\\u8659?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(hArr),     "\xe2\x87\x94", "&hArr;",     "<hArr/>",              "&#8660;",       "{$\\Leftrightarrow$}",   NULL,     "\\u8660?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(forall),   "\xe2\x88\x80", "&forall;",   "<forall/>",            "&#8704;",       "{$\\forall$}",           NULL,     "\\u8704?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(part),     "\xe2\x88\x82", "&part;",     "<part/>",              "&#8706;",       "{$\\partial$}",          NULL,     "\\u8706?",    { "partial",    DocSymbol::Perl_symbol  }},
+  { SYM(exist),    "\xe2\x88\x83", "&exist;",    "<exist/>",             "&#8707;",       "{$\\exists$}",           NULL,     "\\u8707?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(empty),    "\xe2\x88\x85", "&empty;",    "<empty/>",             "&#8709;",       "{$\\emptyset$}",         NULL,     "\\u8709?",    { "empty",      DocSymbol::Perl_symbol  }},
+  { SYM(nabla),    "\xe2\x88\x87", "&nabla;",    "<nabla/>",             "&#8711;",       "{$\\nabla$}",            NULL,     "\\u8711?",    { "nabla",      DocSymbol::Perl_symbol  }},
+  { SYM(isin),     "\xe2\x88\x88", "&isin;",     "<isin/>",              "&#8712;",       "{$\\in$}",               NULL,     "\\u8712?",    { "in",         DocSymbol::Perl_symbol  }},
+  { SYM(notin),    "\xe2\x88\x89", "&notin;",    "<notin/>",             "&#8713;",       "{$\\notin$}",            NULL,     "\\u8713?",    { "notin",      DocSymbol::Perl_symbol  }},
+  { SYM(ni),       "\xe2\x88\x8b", "&ni;",       "<ni/>",                "&#8715;",       "{$\\ni$}",               NULL,     "\\u8715?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(prod),     "\xe2\x88\x8f", "&prod;",     "<prod/>",              "&#8719;",       "{$\\prod$}",             NULL,     "\\u8719?",    { "prod",       DocSymbol::Perl_symbol  }},
+  { SYM(sum),      "\xe2\x88\x91", "&sum;",      "<sum/>",               "&#8721;",       "{$\\sum$}",              NULL,     "\\u8721?",    { "sum",        DocSymbol::Perl_symbol  }},
+  { SYM(minus),    "\xe2\x88\x92", "&minus;",    "<minus/>",             "&#8722;",       "-",                      NULL,     "\\u8722?",    { "-",          DocSymbol::Perl_char    }},
+  { SYM(lowast),   "\xe2\x88\x97", "&lowast;",   "<lowast/>",            "&#8727;",       "{$\\ast$}",              NULL,     "\\u8727?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(radic),    "\xe2\x88\x9a", "&radic;",    "<radic/>",             "&#8730;",       "{$\\surd$}",             NULL,     "\\u8730?",    { "sqrt",       DocSymbol::Perl_symbol  }},
+  { SYM(prop),     "\xe2\x88\x9d", "&prop;",     "<prop/>",              "&#8733;",       "{$\\propto$}",           NULL,     "\\u8733?",    { "propto",     DocSymbol::Perl_symbol  }},
+  { SYM(infin),    "\xe2\x88\x9e", "&infin;",    "<infin/>",             "&#8734;",       "{$\\infty$}",            NULL,     "\\u8734?",    { "inf",        DocSymbol::Perl_symbol  }},
+  { SYM(ang),      "\xe2\x88\xa0", "&ang;",      "<ang/>",               "&#8736;",       "{$\\angle$}",            NULL,     "\\u8736?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(and),      "\xe2\x88\xa7", "&and;",      "<and/>",               "&#8743;",       "{$\\wedge$}",            NULL,     "\\u8743?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(or),       "\xe2\x88\xa8", "&or;",       "<or/>",                "&#8744;",       "{$\\vee$}",              NULL,     "\\u8744?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(cap),      "\xe2\x88\xa9", "&cap;",      "<cap/>",               "&#8745;",       "{$\\cap$}",              NULL,     "\\u8745?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(cup),      "\xe2\x88\xaa", "&cup;",      "<cup/>",               "&#8746;",       "{$\\cup$}",              NULL,     "\\u8746?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(int),      "\xe2\x88\xab", "&int;",      "<int/>",               "&#8747;",       "{$\\int$}",              NULL,     "\\u8747?",    { "int",        DocSymbol::Perl_symbol  }},
+  { SYM(there4),   "\xe2\x88\xb4", "&there4;",   "<there4/>",            "&#8756;",       "{$\\therefore$}",        NULL,     "\\u8756?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(sim),      "\xe2\x88\xbc", "&sim;",      "<sim/>",               "&#8764;",       "{$\\sim$}",              NULL,     "\\u8764?",    { "~",          DocSymbol::Perl_char    }},
+  { SYM(cong),     "\xe2\x89\x85", "&cong;",     "<cong/>",              "&#8773;",       "{$\\cong$}",             NULL,     "\\u8773?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(asymp),    "\xe2\x89\x88", "&asymp;",    "<asymp/>",             "&#8776;",       "{$\\approx$}",           NULL,     "\\u8776?",    { "approx",     DocSymbol::Perl_symbol  }},
+  { SYM(ne),       "\xe2\x89\xa0", "&ne;",       "<ne/>",                "&#8800;",       "{$\\ne$}",               NULL,     "\\u8800?",    { "!=",         DocSymbol::Perl_string  }},
+  { SYM(equiv),    "\xe2\x89\xa1", "&equiv;",    "<equiv/>",             "&#8801;",       "{$\\equiv$}",            NULL,     "\\u8801?",    { "equiv",      DocSymbol::Perl_symbol  }},
+  { SYM(le),       "\xe2\x89\xa4", "&le;",       "<le/>",                "&#8804;",       "{$\\le$}",               NULL,     "\\u8804?",    { "<=",         DocSymbol::Perl_string  }},
+  { SYM(ge),       "\xe2\x89\xa5", "&ge;",       "<ge/>",                "&#8805;",       "{$\\ge$}",               NULL,     "\\u8805?",    { ">=",         DocSymbol::Perl_string  }},
+  { SYM(sub),      "\xe2\x8a\x82", "&sub;",      "<sub/>",               "&#8834;",       "{$\\subset$}",           NULL,     "\\u8834?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(sup),      "\xe2\x8a\x83", "&sup;",      "<sup/>",               "&#8835;",       "{$\\supset$}",           NULL,     "\\u8835?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(nsub),     "\xe2\x8a\x84", "&nsub;",     "<nsub/>",              "&#8836;",       "{$\\not\\subset$}",      NULL,     "\\u8836?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(sube),     "\xe2\x8a\x86", "&sube;",     "<sube/>",              "&#8838;",       "{$\\subseteq$}",         NULL,     "\\u8838?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(supe),     "\xe2\x8a\x87", "&supe;",     "<supe/>",              "&#8839;",       "{$\\supseteq$}",         NULL,     "\\u8839?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(oplus),    "\xe2\x8a\x95", "&oplus;",    "<oplus/>",             "&#8853;",       "{$\\oplus$}",            NULL,     "\\u8853?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(otimes),   "\xe2\x8a\x97", "&otimes;",   "<otimes/>",            "&#8855;",       "{$\\otimes$}",           NULL,     "\\u8855?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(perp),     "\xe2\x8a\xa5", "&perp;",     "<perp/>",              "&#8869;",       "{$\\perp$}",             NULL,     "\\u8869?",    { "perp",       DocSymbol::Perl_symbol  }},
+  { SYM(sdot),     "\xe2\x8b\x85", "&sdot;",     "<sdot/>",              "&#8901;",       "{$\\cdot$}",             NULL,     "\\u8901?",    { ".",          DocSymbol::Perl_char    }},
+  { SYM(lceil),    "\xe2\x8c\x88", "&lceil;",    "<lceil/>",             "&#8968;",       "{$\\lceil$}",            NULL,     "\\u8968?",    { "lceil",      DocSymbol::Perl_symbol  }},
+  { SYM(rceil),    "\xe2\x8c\x89", "&rceil;",    "<rceil/>",             "&#8969;",       "{$\\rceil$}",            NULL,     "\\u8969?",    { "rceil",      DocSymbol::Perl_symbol  }},
+  { SYM(lfloor),   "\xe2\x8c\x8a", "&lfloor;",   "<lfloor/>",            "&#8970;",       "{$\\lfloor$}",           NULL,     "\\u8970?",    { "lfloor",     DocSymbol::Perl_symbol  }},
+  { SYM(rfloor),   "\xe2\x8c\x8b", "&rfloor;",   "<rfloor/>",            "&#8971;",       "{$\\rfloor$}",           NULL,     "\\u8971?",    { "rfloor",     DocSymbol::Perl_symbol  }},
+  { SYM(lang),     "\xe2\x8c\xa9", "&lang;",     "<lang/>",              "&#9001;",       "{$\\langle$}",           NULL,     "\\u9001?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(rang),     "\xe2\x8c\xaa", "&rang;",     "<rang/>",              "&#9002;",       "{$\\rangle$}",           NULL,     "\\u9002?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(loz),      "\xe2\x97\x8a", "&loz;",      "<loz/>",               "&#9674;",       "{$\\lozenge$}",          NULL,     "\\u9674?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(spades),   "\xe2\x99\xa0", "&spades;",   "<spades/>",            "&#9824;",       "{$\\spadesuit$}",        NULL,     "\\u9824?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(clubs),    "\xe2\x99\xa3", "&clubs;",    "<clubs/>",             "&#9827;",       "{$\\clubsuit$}",         NULL,     "\\u9827?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(hearts),   "\xe2\x99\xa5", "&hearts;",   "<hearts/>",            "&#9829;",       "{$\\heartsuit$}",        NULL,     "\\u9829?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(diams),    "\xe2\x99\xa6", "&diams;",    "<diams/>",             "&#9830;",       "{$\\diamondsuit$}",      NULL,     "\\u9830?",    { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(quot),     "\"",           "&quot;",     "\"",                   "&quot;",        "\"",                     "\"",     "\"",          { "\"",         DocSymbol::Perl_char    }},
+  { SYM(amp),      "&",            "&amp;",      "&amp;",                "&amp;",         "\\&",                    "&",      "&",           { "&",          DocSymbol::Perl_char    }},
+  { SYM(lt),       "<",            "&lt;",       "&lt;",                 "&lt;",          "<",                      "<",      "<",           { "<",          DocSymbol::Perl_char    }},
+  { SYM(gt),       ">",            "&gt;",       "&gt;",                 "&gt;",          ">",                      ">",      ">",           { ">",          DocSymbol::Perl_char    }},
+  { SYM(OElig),    "\xc5\x92",     "&OElig;",    "<OElig/>",             "&#338;",        "\\OE",                   NULL,     "\\'8C",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(oelig),    "\xc5\x93",     "&oelig;",    "<oelig/>",             "&#339;",        "\\oe",                   NULL,     "\\'9C",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(Scaron),   "\xc5\xa0",     "&Scaron;",   "<Scaron/>",            "&#352;",        "\\v{S}",                 NULL,     "\\'8A",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(scaron),   "\xc5\xa1",     "&scaron;",   "<scaron/>",            "&#353;",        "\\v{s}",                 NULL,     "\\'9A",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(Yuml),     "\xc5\xb8",     "&Yuml;",     "<Yumlaut/>",           "&#376;",        "\\\"{Y}",                "Y\\*(4", "\\'9F",       { "Y",          DocSymbol::Perl_umlaut  }},
+  { SYM(circ),     "\xcb\x86",     "&circ;",     "<circ/>",              "&#710;",        "{$\\circ$}",             NULL,     "\\'88",       { " ",          DocSymbol::Perl_circ    }},
+  { SYM(tilde),    "\xcb\x9c",     "&tilde;",    "<tilde/>",             "&#732;",        "\\~{}",                  "~",      "\\'98",       { " ",          DocSymbol::Perl_tilde   }},
+  { SYM(ensp),     "\xe2\x80\x82", "&ensp;",     "<ensp/>",              "&#8194;",       "\\enskip{}",             NULL,     "{\\enspace}", { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(emsp),     "\xe2\x80\x83", "&emsp;",     "<emsp/>",              "&#8195;",       "\\quad{}",               NULL,     "{\\emspace}", { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(thinsp),   "\xe2\x80\x89", "&thinsp;",   "<thinsp/>",            "&#8201;",       "\\,",                    NULL,     "{\\qmspace}", { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(zwnj),     "\xe2\x80\x8c", "&zwnj;",     "<zwnj/>",              "&#8204;",       "{}",                     NULL,     "\\zwnj",      { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(zwj),      "\xe2\x80\x8d", "&zwj;",      "<zwj/>",               "&#8205;",       "",                       NULL,     "\\zwj",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(lrm),      "\xe2\x80\x8e", "&lrm;",      "<lrm/>",               "&#8206;",       "",                       NULL,     "\\ltrmark",   { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(rlm),      "\xe2\x80\x8f", "&rlm;",      "<rlm/>",               "&#8207;",       "",                       NULL,     "\\rtlmark",   { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(ndash),    "\xe2\x80\x93", "&ndash;",    "<ndash/>",             "&#8211;",       "--",                     "--",     "\\'96",       { "-",          DocSymbol::Perl_char    }},
+  { SYM(mdash),    "\xe2\x80\x94", "&mdash;",    "<mdash/>",             "&#8212;",       "---",                    "---",    "\\'97",       { "--",         DocSymbol::Perl_string  }},
+  { SYM(lsquo),    "\xe2\x80\x98", "&lsquo;",    "<lsquo/>",             "&#8216;",       "`",                      "`",      "\\'91",       { "\\\'",       DocSymbol::Perl_string  }},
+  { SYM(rsquo),    "\xe2\x80\x99", "&rsquo;",    "<rsquo/>",             "&#8217;",       "'",                      "'",      "\\'92",       { "\\\'",       DocSymbol::Perl_string  }},
+  { SYM(sbquo),    "\xe2\x80\x9a", "&sbquo;",    "<sbquo/>",             "&#8218;",       "\\quotesinglbase{}",     NULL,     "\\'82",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(ldquo),    "\xe2\x80\x9c", "&ldquo;",    "<ldquo/>",             "&#8220;",       "``",                     "``",     "\\'93",       { "\"",         DocSymbol::Perl_char    }},
+  { SYM(rdquo),    "\xe2\x80\x9d", "&rdquo;",    "<rdquo/>",             "&#8221;",       "''",                     "''",     "\\'94",       { "\"",         DocSymbol::Perl_char    }},
+  { SYM(bdquo),    "\xe2\x80\x9e", "&bdquo;",    "<bdquo/>",             "&#8222;",       "\\quotedblbase{}",       NULL,     "\\'84",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(dagger),   "\xe2\x80\xa0", "&dagger;",   "<dagger/>",            "&#8224;",       "{$\\dagger$}",           NULL,     "\\'86",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(Dagger),   "\xe2\x80\xa1", "&Dagger;",   "<Dagger/>",            "&#8225;",       "{$\\ddagger$}",          NULL,     "\\'87",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(permil),   "\xe2\x80\xb0", "&permil;",   "<permil/>",            "&#8240;",       "{$\\permil{}$}",         NULL,     "\\'89",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(lsaquo),   "\xe2\x80\xb9", "&lsaquo;",   "<lsaquo/>",            "&#8249;",       "\\guilsinglleft{}",      NULL,     "\\'8B",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(rsaquo),   "\xe2\x80\xba", "&rsaquo;",   "<rsaquo/>",            "&#8250;",       "\\guilsinglright{}",     NULL,     "\\'9B",       { NULL,         DocSymbol::Perl_unknown }},
+  { SYM(euro),     "\xe2\x82\xac", "&euro;",     "<euro/>",              "&#8364;",       "\\texteuro{}",           NULL,     "\\'80",       { NULL,         DocSymbol::Perl_unknown }},
+
+  // doxygen extension to the HTML4 table of HTML entities
+  { SYM(tm),       "\xe2\x84\xa2", "&trade;",    "<trademark/>",         "&#8482;",       "\\texttrademark{}",      "(TM)",   "\\'99",       { "trademark",  DocSymbol::Perl_symbol  }},
+  { SYM(apos),     "'",            "'",          "'",                    "&apos;",        "'",                      "'",      "'",           { "\\\'",       DocSymbol::Perl_string  }},
+
+  // doxygen commands represented as HTML entities
+  { SYM(BSlash),   "\\",           "\\",         "\\",                   "\\",            "\\textbackslash{}",      "\\\\",   "\\\\",        { "\\\\",       DocSymbol::Perl_string  }},
+  { SYM(At),       "@",            "@",          "@",                    "@",             "@",                      "@",      "@",           { "@",          DocSymbol::Perl_char    }},
+  { SYM(Less),     "<",            "&lt;",       "&lt;",                 "&lt;",          "<",                      "<",      "<",           { "<",          DocSymbol::Perl_char    }},
+  { SYM(Greater),  ">",            "&gt;",       "&gt;",                 "&gt;",          ">",                      ">",      ">",           { ">",          DocSymbol::Perl_char    }},
+  { SYM(Amp),      "&",            "&amp;",      "&amp;",                "&amp;",         "\\&",                    "&",      "&",           { "&",          DocSymbol::Perl_char    }},
+  { SYM(Dollar),   "$",            "$",          "$",                    "$",             "\\$",                    "$",      "$",           { "$",          DocSymbol::Perl_char    }},
+  { SYM(Hash),     "#;",           "#",          "#",                    "#",             "\\#",                    "#",      "#",           { "#",          DocSymbol::Perl_char    }},
+  { SYM(DoubleColon), "::",        "::",         "::",                   "::",            "::",                     "::",     "::",          { "::",         DocSymbol::Perl_string  }},
+  { SYM(Percent),  "%",            "%",          "%",                    "%",             "\\%",                    "%",      "%",           { "%",          DocSymbol::Perl_char    }},
+  { SYM(Pipe),     "|",            "|",          "|",                    "|",             "$|$",                    "|",      "|",           { "|",          DocSymbol::Perl_char    }},
+  { SYM(Quot),     "\"",           "\"",         "\"",                   "&quot;",        "\"",                     "\"",     "\"",          { "\"",         DocSymbol::Perl_char    }},
+  { SYM(Minus),    "-",            "-",          "-",                    "-",             "-\\/",                   "-",      "-",           { "-",          DocSymbol::Perl_char    }}
+};
+
+static const int g_numHtmlEntities = (int)(sizeof(g_htmlEntities)/ sizeof(*g_htmlEntities));
+
+HtmlEntityMapper *HtmlEntityMapper::s_instance = 0;
+
+HtmlEntityMapper::HtmlEntityMapper()
+{
+  m_name2sym = new QDict<int>(1009);
+  m_name2sym->setAutoDelete(TRUE);
+  for (int i = 0; i < g_numHtmlEntities; i++)
+  {
+    m_name2sym->insert(g_htmlEntities[i].item,new int(g_htmlEntities[i].symb));
+  }
+  validate();
+}
+
+HtmlEntityMapper::~HtmlEntityMapper()
+{
+  delete m_name2sym;
+}
+
+/** Returns the one and only instance of the HTML entity mapper */
+HtmlEntityMapper *HtmlEntityMapper::instance()
+{
+  if (s_instance==0)
+  {
+    s_instance = new HtmlEntityMapper;
+  }
+  return s_instance;
+}
+
+/** Deletes the one and only instance of the HTML entity mapper */
+void HtmlEntityMapper::deleteInstance()
+{
+  delete s_instance;
+  s_instance=0;
+}
+
+
+/*! @brief Access routine to the UTF8 code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @param useInPrintf If TRUE the result will be escaped such that it can be
+ *                    used in a printf string pattern
+ * @return the UTF8 code of the HTML entity,
+ *         in case the UTF code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::utf8(DocSymbol::SymType symb,bool useInPrintf) const
+{
+  if (useInPrintf && symb==DocSymbol::Sym_Percent)
+  {
+    return "%%"; // escape for printf
+  }
+  else
+  {
+    return g_htmlEntities[symb].UTF8;
+  }
+}
+
+/*! @brief Access routine to the html code of the HTML entity
+ *
+ * @param symb        Code of the requested HTML entity
+ * @param useInPrintf If TRUE the result will be escaped such that it can be
+ *                    used in a printf string pattern
+ * @return the html representation of the HTML entity,
+ *         in case the html code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::html(DocSymbol::SymType symb,bool useInPrintf) const
+{
+  if (useInPrintf && symb==DocSymbol::Sym_Percent)
+  {
+    return "%%"; // escape for printf
+  }
+  else
+  {
+    return g_htmlEntities[symb].html;
+  }
+}
+
+/*! @brief Access routine to the XML code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @return the XML code of the HTML entity,
+ *         in case the XML code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::xml(DocSymbol::SymType symb) const
+{
+  return g_htmlEntities[symb].xml;
+}
+
+/*! @brief Access routine to the docbook code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @return the docbook code of the HTML entity,
+ *         in case the docbook code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::docbook(DocSymbol::SymType symb) const
+{
+  return g_htmlEntities[symb].docbook;
+}
+
+/*! @brief Access routine to the LaTeX code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @return the LaTeX code of the HTML entity,
+ *         in case the LaTeX code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::latex(DocSymbol::SymType symb) const
+{
+  return g_htmlEntities[symb].latex;
+}
+
+/*! @brief Access routine to the man code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @return the man of the HTML entity,
+ *         in case the man code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::man(DocSymbol::SymType symb) const
+{
+  return g_htmlEntities[symb].man;
+}
+
+/*! @brief Access routine to the RTF code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @return the RTF of the HTML entity,
+ *         in case the RTF code is unknown \c NULL is returned.
+ */
+const char *HtmlEntityMapper::rtf(DocSymbol::SymType symb) const
+{
+  return g_htmlEntities[symb].rtf;
+}
+
+/*! @brief Access routine to the perl struct with the perl code of the HTML entity
+ *
+ * @param symb Code of the requested HTML entity
+ * @return the pointer to perl struct with the perl code of the HTML entity,
+ *         in case the perl code does not exists the NULL pointer is entered in the
+ *         \c symb field and in the `DocSymbol::Perl_unknown` in the \c type field.
+ */
+const DocSymbol::PerlSymb *HtmlEntityMapper::perl(DocSymbol::SymType symb) const
+{
+  return &g_htmlEntities[symb].perl;
+}
+
+/*!
+ * @brief Give code of the requested HTML entity name
+ * @param symName HTML entity name without \c & and \c;
+ * @return the code for the requested HTML entity name,
+ *         in case the requested HTML item does not exist `DocSymbol::Sym_unknown` is returned.
+ */
+DocSymbol::SymType HtmlEntityMapper::name2sym(const QCString &symName) const
+{
+  int *pSymb = m_name2sym->find(symName);
+  return pSymb ? ((DocSymbol::SymType)*pSymb) : DocSymbol::Sym_Unknown;
+}
+
+void HtmlEntityMapper::writeXMLSchema(FTextStream &t)
+{
+  for (int i=0;i<g_numHtmlEntities - g_numberHtmlMappedCmds;i++)
+  {
+    QCString bareName = g_htmlEntities[i].xml;
+    if (!bareName.isEmpty() && bareName.at(0)=='<' && bareName.right(2)=="/>")
+    {
+      bareName = bareName.mid(1,bareName.length()-3); // strip < and />
+      t << "      <xsd:element name=\"" << bareName << "\" type=\"docEmptyType\" />\n";
+    }
+  }
+}
+
+/*! @brief Routine to check if the entries of the html_entities are numbered correctly
+ *  @details in case of a mismatch a warning message is given.
+ */
+void HtmlEntityMapper::validate()
+{
+  for (int i = 0; i < g_numHtmlEntities; i++)
+  {
+    if (i != g_htmlEntities[i].symb)
+    {
+      warn_uncond("Internal inconsistency, htmlentries code %d (item=%s)\n",i,g_htmlEntities[i].item);
+    }
+  }
+}
diff --git a/src/htmlentity.h b/src/htmlentity.h
new file mode 100644 (file)
index 0000000..d3b268c
--- /dev/null
@@ -0,0 +1,47 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#ifndef HTMLENTITY_H
+#define HTMLENTITY_H
+
+#include <qdict.h>
+#include "docparser.h"
+
+class FTextStream;
+
+/** @brief Singleton helper class to map html entities to other formats */
+class HtmlEntityMapper
+{
+  public:
+    static HtmlEntityMapper *instance();
+    static void deleteInstance();
+    DocSymbol::SymType name2sym(const QCString &symName) const;
+    const char *utf8(DocSymbol::SymType symb,bool useInPrintf=FALSE) const;
+    const char *html(DocSymbol::SymType symb,bool useInPrintf=FALSE) const;
+    const char *xml(DocSymbol::SymType symb) const;
+    const char *docbook(DocSymbol::SymType symb) const;
+    const char *latex(DocSymbol::SymType symb) const;
+    const char *man(DocSymbol::SymType symb) const;
+    const char *rtf(DocSymbol::SymType symb) const;
+    const DocSymbol::PerlSymb *perl(DocSymbol::SymType symb) const;
+    void  writeXMLSchema(FTextStream &t);
+  private:
+    void  validate();
+    HtmlEntityMapper();
+   ~HtmlEntityMapper();
+    static HtmlEntityMapper *s_instance;
+    QDict<int> *m_name2sym;
+};
+
+#endif
index 059d0e7..0d399d3 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -1683,7 +1683,7 @@ void HtmlGenerator::startFile(const char *name,const char *,
   Doxygen::indexList->addIndexFile(fileName);
   
   lastFile = fileName;
-  t << substituteHtmlKeywords(g_header,convertToHtml(title),relPath);
+  t << substituteHtmlKeywords(g_header,convertToHtml(filterTitle(title)),relPath);
 
   t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen " 
     << versionString << " -->" << endl;
@@ -2181,25 +2181,11 @@ void HtmlGenerator::endClassDiagram(const ClassDiagram &d,
 void HtmlGenerator::startMemberList()  
 { 
   DBG_HTML(t << "<!-- startMemberList -->" << endl)
-  //if (Config_getBool("HTML_ALIGN_MEMBERS"))
-  //{
-  //}
-  //else
-  //{
-  //  t << "<ul>" << endl; 
-  //}
 }
 
 void HtmlGenerator::endMemberList()    
 { 
   DBG_HTML(t << "<!-- endMemberList -->" << endl)
-  //if (Config_getBool("HTML_ALIGN_MEMBERS"))
-  //{
-  //}
-  //else
-  //{
-  //  t << "</ul>" << endl; 
-  //}
 }
 
 // anonymous type:
@@ -2254,93 +2240,63 @@ void HtmlGenerator::endMemberTemplateParams(const char *anchor,const char *inher
 void HtmlGenerator::insertMemberAlign(bool templ) 
 { 
   DBG_HTML(t << "<!-- insertMemberAlign -->" << endl)
-  //if (Config_getBool("HTML_ALIGN_MEMBERS"))
-  //{
-    QCString className = templ ? "memTemplItemRight" : "memItemRight";
-    t << "&#160;</td><td class=\"" << className << "\" valign=\"bottom\">"; 
-  //}
+  QCString className = templ ? "memTemplItemRight" : "memItemRight";
+  t << "&#160;</td><td class=\"" << className << "\" valign=\"bottom\">"; 
 }
 
 void HtmlGenerator::startMemberDescription(const char *anchor,const char *inheritId) 
 { 
   DBG_HTML(t << "<!-- startMemberDescription -->" << endl)
-  //if (Config_getBool("HTML_ALIGN_MEMBERS"))
-  //{
     if (m_emptySection)
     {
       t << "<table class=\"memberdecls\">" << endl;
       m_emptySection=FALSE;
     }
-    t << "<tr class=\"memdesc:" << anchor;
-    if (inheritId)
-    {
-      t << " inherit " << inheritId;
-    }
-    t << "\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">"; 
-  //}
-  //else
-  //{
-  //  t << "<dl class=\"el\"><dd class=\"mdescRight\">";
-  //}
+  t << "<tr class=\"memdesc:" << anchor;
+  if (inheritId)
+  {
+    t << " inherit " << inheritId;
+  }
+  t << "\"><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">"; 
 }
 
 void HtmlGenerator::endMemberDescription()   
 { 
   DBG_HTML(t << "<!-- endMemberDescription -->" << endl)
-  //if (Config_getBool("HTML_ALIGN_MEMBERS"))
-  //{
-    t << "<br/></td></tr>" << endl; 
-  //}
-  //else
-  //{
-  //  t << "<br/></dl>";
-  //}
+  t << "<br /></td></tr>" << endl; 
 }
 
 void HtmlGenerator::startMemberSections()
 {
   DBG_HTML(t << "<!-- startMemberSections -->" << endl)
-  //if (Config_getBool("HTML_ALIGN_MEMBERS"))
-  //{
-    m_emptySection=TRUE; // we postpone writing <table> until we actually
-                         // write a row to prevent empty tables, which 
-                         // are not valid XHTML!
-  //}
+  m_emptySection=TRUE; // we postpone writing <table> until we actually
+                       // write a row to prevent empty tables, which 
+                       // are not valid XHTML!
 }
 
 void HtmlGenerator::endMemberSections()
 {
   DBG_HTML(t << "<!-- endMemberSections -->" << endl)
-  //if (Config_getBool("HTML_ALIGN_MEMBERS"))
-  //{
-    if (!m_emptySection)
-    {
-      t << "</table>" << endl;
-    }
-  //}
+  if (!m_emptySection)
+  {
+    t << "</table>" << endl;
+  }
 }
 
 void HtmlGenerator::startMemberHeader(const char *anchor)
 {
   DBG_HTML(t << "<!-- startMemberHeader -->" << endl)
-  //if (Config_getBool("HTML_ALIGN_MEMBERS"))
-  //{
-    if (!m_emptySection)
-    {
-      t << "</table>";
-      m_emptySection=TRUE;
-    }
-    if (m_emptySection)
-    {
-      t << "<table class=\"memberdecls\">" << endl;
-      m_emptySection=FALSE;
-    }
-    t << "<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\">";
-  //}
-  //else
-  //{
-  //  startGroupHeader(FALSE);
-  //}
+  if (!m_emptySection)
+  {
+    t << "</table>";
+    m_emptySection=TRUE;
+  }
+  if (m_emptySection)
+  {
+    t << "<table class=\"memberdecls\">" << endl;
+    m_emptySection=FALSE;
+  }
+  t << "<tr class=\"heading\"><td colspan=\"2\"><h2 class=\"groupheader\">";
   if (anchor)
   {
     t << "<a name=\"" << anchor << "\"></a>" << endl;
@@ -2350,28 +2306,19 @@ void HtmlGenerator::startMemberHeader(const char *anchor)
 void HtmlGenerator::endMemberHeader()
 {
   DBG_HTML(t << "<!-- endMemberHeader -->" << endl)
-  //if (Config_getBool("HTML_ALIGN_MEMBERS"))
-  //{
-    t << "</h2></td></tr>" << endl;
-  //}
-  //else
-  //{
-  //  endGroupHeader(FALSE);
-  //}
+  t << "</h2></td></tr>" << endl;
 }
 
 void HtmlGenerator::startMemberSubtitle()
 {
   DBG_HTML(t << "<!-- startMemberSubtitle -->" << endl)
-  //if (Config_getBool("HTML_ALIGN_MEMBERS")) 
-    t << "<tr><td class=\"ititle\" colspan=\"2\">";
+  t << "<tr><td class=\"ititle\" colspan=\"2\">";
 }
 
 void HtmlGenerator::endMemberSubtitle()
 {
   DBG_HTML(t << "<!-- endMemberSubtitle -->" << endl)
-  //if (Config_getBool("HTML_ALIGN_MEMBERS")) 
-    t << "</td></tr>" << endl;
+  t << "</td></tr>" << endl;
 }
 
 void HtmlGenerator::startIndexList() 
@@ -3324,11 +3271,11 @@ void HtmlGenerator::lineBreak(const char *style)
 {
   if (style)
   {
-    t << "<br class=\"" << style << "\"/>" << endl;
+    t << "<br class=\"" << style << "\" />" << endl;
   }
   else
   {
-    t << "<br/>" << endl;
+    t << "<br />" << endl;
   }
 }
 
index 366027d..7b63a6b 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -280,9 +280,9 @@ class HtmlGenerator : public OutputGenerator
     { t << "</table>" << endl; }
     void startDescTableTitle()
     //{ t << "<tr><td valign=\"top\"><em>"; }
-    { t << "<tr><td class=\"fieldname\"><em>"; }
+    { t << "<tr><td class=\"fieldname\">"; }
     void endDescTableTitle()
-    { t << "</em>&#160;</td>"; }
+    { t << "&#160;</td>"; }
     void startDescTableData()
     //{ t << "<td>" << endl; }
     { t << "<td class=\"fielddoc\">" << endl; }
index 23d5194..c1e535d 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -35,6 +35,7 @@
 #include "groupdef.h"
 #include "memberdef.h"
 #include "filedef.h"
+#include "util.h"
 
 //----------------------------------------------------------------------------
 
@@ -54,9 +55,10 @@ class IndexFieldSDict : public SDict<IndexField>
   public:
     IndexFieldSDict() : SDict<IndexField>(17) {}
    ~IndexFieldSDict() {}
-    int compareItems(QCollection::Item item1, QCollection::Item item2)
+ private:
+    int compareValues(const IndexField *item1, const IndexField *item2) const
     {
-      return qstricmp(((IndexField *)item1)->name,((IndexField *)item2)->name);
+      return qstricmp(item1->name,item2->name);
     }
 };
 
@@ -493,9 +495,22 @@ void HtmlHelp::createProjectFile()
     //       the font-size one is not normally settable by the HTML Help Workshop
     //       utility but the way to set it is described here:
     //          http://support.microsoft.com/?scid=kb%3Ben-us%3B240062&x=17&y=18
-    t << "main=\"" << recode(Config_getString("PROJECT_NAME")) << "\",\"index.hhc\","
+    // NOTE: the 0x70387e number in addition to the above the Next and Prev button
+    //       are shown. They can only be shown in case of a binary toc.
+    //          dee http://www.mif2go.com/xhtml/htmlhelp_0016_943addingtabsandtoolbarbuttonstohtmlhelp.htm#Rz108x95873
+    //       Value has been taken from htmlhelp.h file of the HTML Help Workshop
+    if (Config_getBool("BINARY_TOC"))
+    {
+      t << "main=\"" << recode(Config_getString("PROJECT_NAME")) << "\",\"index.hhc\","
+         "\"index.hhk\",\"" << indexName << "\",\"" << 
+         indexName << "\",,,,,0x23520,,0x70387e,,,,,,,,0" << endl << endl;
+    }
+    else
+    {
+      t << "main=\"" << recode(Config_getString("PROJECT_NAME")) << "\",\"index.hhc\","
          "\"index.hhk\",\"" << indexName << "\",\"" << 
          indexName << "\",,,,,0x23520,,0x10387e,,,,,,,,0" << endl << endl;
+    }
     
     t << "[FILES]" << endl;
     char *s = indexFiles.first();
@@ -618,14 +633,17 @@ void HtmlHelp::addContentsItem(bool isDir,
                                Definition * /* def */)
 {
   // If we're using a binary toc then folders cannot have links. 
-  if(Config_getBool("BINARY_TOC") && isDir) 
-  {
-    file = 0;
-    anchor = 0;
-  }
+  // Tried this and I didn't see any problems, when not using
+  // the resetting of file and anchor the TOC works better
+  // (prev / next button)
+  //if(Config_getBool("BINARY_TOC") && isDir) 
+  //{
+    //file = 0;
+    //anchor = 0;
+  //}
   int i; for (i=0;i<dc;i++) cts << "  ";
   cts << "<LI><OBJECT type=\"text/sitemap\">";
-  cts << "<param name=\"Name\" value=\"" << recode(name) << "\">";
+  cts << "<param name=\"Name\" value=\"" << convertToHtml(recode(name),TRUE) << "\">";
   if (file)      // made file optional param - KPW
   {
     if (file && (file[0]=='!' || file[0]=='^')) // special markers for user defined URLs
@@ -691,6 +709,6 @@ void HtmlHelp::addIndexItem(Definition *context,MemberDef *md,
 
 void HtmlHelp::addImageFile(const char *fileName)
 {
-  imageFiles.append(fileName);
+  if (!imageFiles.contains(fileName)) imageFiles.append(fileName);
 }
 
index 85e46e0..574cec9 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 49485af..3283754 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index d2311a1..ad11a64 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index ae96c80..2013a7c 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -122,10 +122,8 @@ class MemberIndexList : public QList<MemberDef>
     typedef MemberDef ElementType;
     MemberIndexList(uint letter) : QList<MemberDef>(), m_letter(letter) {}
     ~MemberIndexList() {}
-    int compareItems(QCollection::Item item1, QCollection::Item item2)
+    int compareValues(const MemberDef *md1, const MemberDef *md2) const
     {
-      MemberDef *md1=(MemberDef *)item1;
-      MemberDef *md2=(MemberDef *)item2;
       int result = qstricmp(md1->name(),md2->name());
       if (result==0)
       {
@@ -347,7 +345,7 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
                 (!md->isStatic() || extractStatic)
                )
             {
-              if (md->getOuterScope()==def)
+              if (md->getOuterScope()==def || md->getOuterScope()==Doxygen::globalScope)
               {
                 Doxygen::indexList->addContentsItem(isDir,
                   md->name(),md->getReference(),md->getOutputFileBase(),md->anchor(),FALSE,addToIndex);
@@ -368,15 +366,18 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
               MemberDef *emd;
               for (emli.toFirst();(emd=emli.current());++emli)
               {
-                if (emd->getOuterScope()==def)
+                if (!hideUndocMembers || emd->hasDocumentation())
                 {
-                  Doxygen::indexList->addContentsItem(FALSE,
-                      emd->name(),emd->getReference(),emd->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
-                }
-                else // inherited member
-                {
-                  Doxygen::indexList->addContentsItem(FALSE,
-                      emd->name(),def->getReference(),def->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
+                  if (emd->getOuterScope()==def || emd->getOuterScope()==Doxygen::globalScope)
+                  {
+                    Doxygen::indexList->addContentsItem(FALSE,
+                        emd->name(),emd->getReference(),emd->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
+                  }
+                  else // inherited member
+                  {
+                    Doxygen::indexList->addContentsItem(FALSE,
+                        emd->name(),def->getReference(),def->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
+                  }
                 }
               }
               if (!isAnonymous)
@@ -400,9 +401,10 @@ void addMembersToIndex(T *def,LayoutDocManager::LayoutPart part,
           {
             if (cd->isLinkable() && (cd->partOfGroups()==0 || def->definitionType()==Definition::TypeGroup))
             {
+              static bool inlineSimpleStructs = Config_getBool("INLINE_SIMPLE_STRUCTS");
               bool isNestedClass = def->definitionType()==Definition::TypeClass;
               addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor(),
-                                addToIndex && isNestedClass,
+                                addToIndex && (isNestedClass || (cd->isSimple() && inlineSimpleStructs)),
                                 preventSeparateIndex || cd->isEmbeddedInOuterScope());
             }
           }
@@ -628,9 +630,10 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
   FileList *fileList=dd->getFiles();
   int fileCount=0;
   if (fileList && fileList->count()>0)
-  { 
-    FileDef *fd=fileList->first();
-    while (fd)
+  {
+    QListIterator<FileDef> it(*fileList);
+    FileDef *fd;
+    for (;(fd=it.current());++it)
     {
       //static bool allExternals = Config_getBool("ALLEXTERNALS");
       //if ((allExternals && fd->isLinkable()) || fd->isLinkableInProject())
@@ -646,13 +649,11 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
       {
         fileCount++;
       }
-      fd=fileList->next();
     }
     if (fileCount>0)
     {
       startIndexHierarchy(ol,level+1);
-      fd=fileList->first();
-      while (fd)
+      for (it.toFirst();(fd=it.current());++it)
       {
         bool doc,src;
         doc = fileVisibleInIndex(fd,src);
@@ -678,7 +679,6 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
                 0,FALSE,FALSE,fd); 
           }
         }
-        fd=fileList->next();
       }
       endIndexHierarchy(ol,level+1); 
     }
@@ -689,8 +689,9 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
     // write files of this directory
     if (fileCount>0)
     {
-      FileDef *fd=fileList->first();
-      while (fd)
+      QListIterator<FileDef> it(*fileList);
+      FileDef *fd;
+      for (;(fd=it.current());++it)
       {
         //static bool allExternals = Config_getBool("ALLEXTERNALS");
         //if ((allExternals && fd->isLinkable()) || fd->isLinkableInProject())
@@ -706,7 +707,6 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv
                FALSE, convertToHtml(fd->name(),TRUE), 0, 
                fd->getSourceFileBase(), 0, FALSE, TRUE, fd);
         }
-        fd=fileList->next();
       }
     }
   }
@@ -811,7 +811,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT
     bool b;
     if (cd->getLanguage()==SrcLangExt_VHDL)
     {
-      if (!(VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS)      
+      if ((VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
       {
         continue;
       }
@@ -1085,6 +1085,82 @@ static void countFiles(int &htmlFiles,int &files)
   }
 }
 
+static void writeSingleFileIndex(OutputList &ol,FileDef *fd)
+{
+  //printf("Found filedef %s\n",fd->name().data());
+  bool doc = fd->isLinkableInProject();
+  bool src = fd->generateSourceFile();
+  bool nameOk = !fd->isDocumentationFile();
+  if (nameOk && (doc || src) && !fd->isReference())
+  {
+    QCString path;
+    if (Config_getBool("FULL_PATH_NAMES"))
+    {
+      path=stripFromPath(fd->getPath().copy());
+    }
+    QCString fullName=fd->name();
+    if (!path.isEmpty())
+    {
+      if (path.at(path.length()-1)!='/') fullName.prepend("/");
+      fullName.prepend(path);
+    }
+
+    ol.startIndexKey();
+    ol.docify(path);
+    if (doc)
+    {
+      ol.writeObjectLink(0,fd->getOutputFileBase(),0,fd->name());
+      //if (addToIndex)
+      //{
+      //  addMembersToIndex(fd,LayoutDocManager::File,fullName,QCString());
+      //}
+    }
+    else
+    {
+      ol.startBold();
+      ol.docify(fd->name());
+      ol.endBold();
+      //if (addToIndex)
+      //{
+      //  Doxygen::indexList->addContentsItem(FALSE,fullName,0,0,0);
+      //}
+    }
+    if (src)
+    {
+      ol.pushGeneratorState();
+      ol.disableAllBut(OutputGenerator::Html);
+      ol.docify(" ");
+      ol.startTextLink(fd->includeName(),0);
+      ol.docify("[");
+      ol.parseText(theTranslator->trCode());
+      ol.docify("]");
+      ol.endTextLink();
+      ol.popGeneratorState();
+    }
+    ol.endIndexKey();
+    bool hasBrief = !fd->briefDescription().isEmpty();
+    ol.startIndexValue(hasBrief);
+    if (hasBrief)
+    {
+      //ol.docify(" (");
+      ol.generateDoc(
+          fd->briefFile(),fd->briefLine(),
+          fd,0,
+          fd->briefDescription(TRUE),
+          FALSE, // index words
+          FALSE, // isExample
+          0,     // example name
+          TRUE,  // single line
+          TRUE   // link from index
+          );
+      //ol.docify(")");
+    }
+    ol.endIndexValue(fd->getOutputFileBase(),hasBrief);
+    //ol.popGeneratorState();
+    // --------------------------------------------------------
+  }
+}
+
 //----------------------------------------------------------------------------
 
 static void writeFileIndex(OutputList &ol)
@@ -1131,135 +1207,67 @@ static void writeFileIndex(OutputList &ol)
   OutputNameDict outputNameDict(1009);
   OutputNameList outputNameList;
   outputNameList.setAutoDelete(TRUE);
-  
+
   if (Config_getBool("FULL_PATH_NAMES"))
   {
     // re-sort input files in (dir,file) output order instead of (file,dir) input order 
-    FileName *fn=Doxygen::inputNameList->first();
-    while (fn)
+    FileNameListIterator fnli(*Doxygen::inputNameList);
+    FileName *fn;
+    for (fnli.toFirst();(fn=fnli.current());++fnli)
     {
-      FileDef *fd=fn->first();
-      while (fd)
+      FileNameIterator fni(*fn);
+      FileDef *fd;
+      for (;(fd=fni.current());++fni)
       {
         QCString path=fd->getPath();
         if (path.isEmpty()) path="[external]";
         FileList *fl = outputNameDict.find(path);
         if (fl)
         {
-          fl->inSort(fd);
+          fl->append(fd);
           //printf("+ inserting %s---%s\n",fd->getPath().data(),fd->name().data());
         }
         else
         {
           //printf("o inserting %s---%s\n",fd->getPath().data(),fd->name().data());
           fl = new FileList(path);
-          fl->inSort(fd);
-          outputNameList.inSort(fl);
+          fl->append(fd);
+          outputNameList.append(fl);
           outputNameDict.insert(path,fl);
         }
-        fd=fn->next();
       }
-      fn=Doxygen::inputNameList->next();
     }
   }
-  
+
   ol.startIndexList();
-  FileList *fl=0;
   if (Config_getBool("FULL_PATH_NAMES"))
   {
-    fl = outputNameList.first();
+    outputNameList.sort();
+    QListIterator<FileList> fnli(outputNameList);
+    FileList *fl;
+    for (fnli.toFirst();(fl=fnli.current());++fnli)
+    {
+      fl->sort();
+      QListIterator<FileDef> it(*fl);
+      FileDef *fd;
+      for (;(fd=it.current());++it)
+      {
+        writeSingleFileIndex(ol,fd);
+      }
+    }
   }
   else
   {
-    fl = Doxygen::inputNameList->first();
-  }
-  while (fl)
-  {
-    FileDef *fd=fl->first();
-    while (fd)
+    FileNameListIterator fnli(*Doxygen::inputNameList);
+    FileName *fn;
+    for (fnli.toFirst();(fn=fnli.current());++fnli)
     {
-      //printf("Found filedef %s\n",fd->name().data());
-      bool doc = fd->isLinkableInProject();
-      bool src = fd->generateSourceFile();
-      bool nameOk = !fd->isDocumentationFile();
-      if (nameOk && (doc || src) && 
-              !fd->isReference())
+      FileNameIterator fni(*fn);
+      FileDef *fd;
+      for (;(fd=fni.current());++fni)
       {
-        QCString path;
-        if (Config_getBool("FULL_PATH_NAMES")) 
-        {
-          path=stripFromPath(fd->getPath().copy());
-        }
-        QCString fullName=fd->name();
-        if (!path.isEmpty()) 
-        {
-          if (path.at(path.length()-1)!='/') fullName.prepend("/");
-          fullName.prepend(path);
-        }
-
-        ol.startIndexKey();
-        ol.docify(path);
-        if (doc)
-        {
-          ol.writeObjectLink(0,fd->getOutputFileBase(),0,fd->name());
-          //if (addToIndex)
-          //{
-          //  addMembersToIndex(fd,LayoutDocManager::File,fullName,QCString());
-          //}
-        }
-        else
-        {
-          ol.startBold();
-          ol.docify(fd->name());
-          ol.endBold();
-          //if (addToIndex)
-          //{
-          //  Doxygen::indexList->addContentsItem(FALSE,fullName,0,0,0);
-          //}
-        }
-        if (src)
-        {
-          ol.pushGeneratorState();
-          ol.disableAllBut(OutputGenerator::Html);
-          ol.docify(" ");
-          ol.startTextLink(fd->includeName(),0);
-          ol.docify("[");
-          ol.parseText(theTranslator->trCode());
-          ol.docify("]");
-          ol.endTextLink();
-          ol.popGeneratorState();
-        }
-        ol.endIndexKey();
-        bool hasBrief = !fd->briefDescription().isEmpty();
-        ol.startIndexValue(hasBrief);
-        if (hasBrief)
-        {
-          //ol.docify(" (");
-          ol.generateDoc(
-              fd->briefFile(),fd->briefLine(),
-              fd,0,
-              fd->briefDescription(TRUE),
-              FALSE, // index words
-              FALSE, // isExample
-              0,     // example name
-              TRUE,  // single line
-              TRUE   // link from index
-             );
-          //ol.docify(")");
-        }
-        ol.endIndexValue(fd->getOutputFileBase(),hasBrief);
-        //ol.popGeneratorState();
-        // --------------------------------------------------------
+        writeSingleFileIndex(ol,fd);
       }
-      fd=fl->next();
-    }
-    if (Config_getBool("FULL_PATH_NAMES"))
-    {
-      fl=outputNameList.next();
-    }
-    else
-    {
-      fl=Doxygen::inputNameList->next();
     }
   }
   ol.endIndexList();
@@ -1360,7 +1368,10 @@ void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalO
               )
              )
           {
-            addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor(),cd->partOfGroups()==0);
+            addMembersToIndex(cd,LayoutDocManager::Class,
+                              cd->displayName(FALSE),
+                              cd->anchor(),
+                              cd->partOfGroups()==0 && !cd->isSimple());
           }
           if (count>0)
           {
@@ -1402,7 +1413,7 @@ static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv,
           }
         }
 
-        if (isLinkable || hasChildren)
+        if ((isLinkable && !showClasses) || hasChildren)
         {
           ftv->addContentsItem(hasChildren,nd->localName(),ref,file,0,FALSE,TRUE,nd); 
 
@@ -1672,17 +1683,14 @@ class PrefixIgnoreClassList : public ClassList
   public:
     typedef ClassDef ElementType;
     PrefixIgnoreClassList(uint letter) : m_letter(letter) {}
-    virtual int compareItems(QCollection::Item item1, QCollection::Item item2)
+    uint letter() const { return m_letter; }
+  private:
+    virtual int compareValue(const ClassDef *c1, const ClassDef *c2) const
     {
-      ClassDef *c1=(ClassDef *)item1;
-      ClassDef *c2=(ClassDef *)item2;
-
       QCString n1 = c1->className();
       QCString n2 = c2->className();
       return qstricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2));
     }
-    uint letter() const { return m_letter; }
-  private:
     uint m_letter;
 };
 
@@ -1734,12 +1742,6 @@ class UsedIndexLetters : public SIntDict<uint>
 {
   public:
     UsedIndexLetters() : SIntDict<uint>(257) { setAutoDelete(TRUE); }
-    int compareItems( QCollection::Item item1, QCollection::Item item2)
-    {
-      int *p1=(int *)item1;
-      int *p2=(int *)item2;
-      return *p1 - *p2; // subtracting is done by int not uint.
-    }
     void add(uint letter)
     {
       uint *v = find(letter);
@@ -1748,6 +1750,11 @@ class UsedIndexLetters : public SIntDict<uint>
         append(letter,new uint(letter));
       }
     }
+  private:
+    int compareValues( const uint *p1, const uint *p2) const
+    {
+      return (int)*p1 - (int)*p2; // subtracting is done by int not uint.
+    }
 };
 
 // write an alphabetical index of all class with a header for each letter
@@ -3095,7 +3102,7 @@ static void writePages(PageDef *pd,FTVHelp *ftv)
     if (pd->title().isEmpty())
       pageTitle=pd->name();
     else
-      pageTitle=pd->title();
+      pageTitle=filterTitle(pd->title());
 
     if (ftv)
     {
@@ -3166,9 +3173,10 @@ static void writePageIndex(OutputList &ol)
     PageDef *pd=0;
     for (pdi.toFirst();(pd=pdi.current());++pdi)
     {
-      if (pd->getOuterScope()==0 || 
-          pd->getOuterScope()->definitionType()!=Definition::TypePage
-         )  // not a sub page
+      if ((pd->getOuterScope()==0 ||
+          pd->getOuterScope()->definitionType()!=Definition::TypePage) && // not a sub page
+          !pd->isReference() // not an external page
+         )
       {
         writePages(pd,ftv);
       }
index ae15f16..6805655 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van 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/lang_cfg.h b/src/lang_cfg.h
deleted file mode 100644 (file)
index 769696c..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-#define LANG_AM
-#define LANG_AR
-#define LANG_BR
-#define LANG_CA
-#define LANG_CN
-#define LANG_CZ
-#define LANG_DE
-#define LANG_DK
-#define LANG_EN
-#define LANG_EO
-#define LANG_ES
-#define LANG_FA
-#define LANG_FI
-#define LANG_FR
-#define LANG_GR
-#define LANG_HR
-#define LANG_HU
-#define LANG_ID
-#define LANG_IT
-#define LANG_JE
-#define LANG_JP
-#define LANG_KE
-#define LANG_KR
-#define LANG_LT
-#define LANG_LV
-#define LANG_MK
-#define LANG_NL
-#define LANG_NO
-#define LANG_PL
-#define LANG_PT
-#define LANG_RO
-#define LANG_RU
-#define LANG_SC
-#define LANG_SI
-#define LANG_SK
-#define LANG_SR
-#define LANG_SV
-#define LANG_TR
-#define LANG_TW
-#define LANG_UA
-#define LANG_VI
-#define LANG_ZA
index c993323..3b57de1 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
 
 Translator *theTranslator=0;
 
-static const char obsoleteMsg[] =
-        "---------\n"
-        "ERROR: The selected language is no longer supported!\n"
-        "If you want doxygen to produce output in this language \n"
-        "you are kindly requested to help bringing the documentation \n"
-        "up to date. Please read the development section of the manual \n"
-        "for more information or contact Petr Prikryl (Prikryl@skil.cz).\n"
-        "Thanks in advance!\n"
-        "---------\n";
-
 bool setTranslator(const char *langName)
 {
   if (L_EQUAL("english"))
index 9550cb9..4780ab3 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 0005e88..7ce382a 100755 (executable)
@@ -25,8 +25,8 @@ print """\
                 <CustomBuildRule
                         Name="Languages"
                         DisplayName="Settings"
-                        CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] &gt; $(InputDir)../src/$(InputName).h"
-                        Outputs="$(InputDir)../src/$(InputName).h"
+                        CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] &gt; $(InpDir)/$(InputName).h"
+                        Outputs="$(IntDir)/$(InputName).h"
                         FileExtensions="*.py"
                         AdditionalDependencies=""
                         ExecutionDescription="Executing languages ..."
index 91064a3..eed36bc 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #include "cite.h"
 #include "filedef.h"
 #include "config.h"
+#include "htmlentity.h"
 
 static QCString escapeLabelName(const char *s)
 {
   QCString result;
   const char *p=s;
   char c;
-  while ((c=*p++))
+  if (p)
   {
-    switch (c)
+    while ((c=*p++))
     {
-      case '%': result+="\\%"; break;
-      case '|': result+="\\texttt{\"|}"; break;
-      case '!': result+="\"!"; break;
-      default: result+=c;
+      switch (c)
+      {
+        case '%': result+="\\%"; break;
+        case '|': result+="\\texttt{\"|}"; break;
+        case '!': result+="\"!"; break;
+        case '{': result+="\\lcurly{}"; break;
+        case '}': result+="\\rcurly{}"; break;
+        case '~': result+="````~"; break; // to get it a bit better in index together with other special characters
+        default: result+=c;
+      }
     }
   }
   return result;
@@ -69,17 +76,22 @@ QCString LatexDocVisitor::escapeMakeIndexChars(const char *s)
   const char *p=s;
   char str[2]; str[1]=0;
   char c;
-  while ((c=*p++))
+  if (p)
   {
-    switch (c)
+    while ((c=*p++))
     {
-      case '!': m_t << "\"!"; break;
-      case '"': m_t << "\"\""; break;
-      case '@': m_t << "\"@"; break;
-      case '|': m_t << "\\texttt{\"|}"; break;
-      case '[': m_t << "["; break;
-      case ']': m_t << "]"; break;
-      default:  str[0]=c; filter(str); break;
+      switch (c)
+      {
+        case '!': m_t << "\"!"; break;
+        case '"': m_t << "\"\""; break;
+        case '@': m_t << "\"@"; break;
+        case '|': m_t << "\\texttt{\"|}"; break;
+        case '[': m_t << "["; break;
+        case ']': m_t << "]"; break;
+        case '{': m_t << "\\lcurly{}"; break;
+        case '}': m_t << "\\rcurly{}"; break;
+        default:  str[0]=c; filter(str); break;
+      }
     }
   }
   return result;
@@ -130,135 +142,25 @@ void LatexDocVisitor::visit(DocWhiteSpace *w)
 void LatexDocVisitor::visit(DocSymbol *s)
 {
   if (m_hide) return;
-  switch(s->symbol())
-  {
-    case DocSymbol::BSlash:  m_t << "\\textbackslash{}"; break;
-    case DocSymbol::At:      m_t << "@"; break;
-    case DocSymbol::Less:    if (m_insidePre) m_t << "<"; else m_t << "$<$"; 
-                             break;
-    case DocSymbol::Greater: if (m_insidePre) m_t << ">"; else m_t << "$>$"; break;
-    case DocSymbol::Amp:     m_t << "\\&"; break;
-    case DocSymbol::Dollar:  m_t << "\\$"; break;
-    case DocSymbol::Hash:    m_t << "\\#"; break;
-    case DocSymbol::DoubleColon:  m_t << "::"; break;
-    case DocSymbol::Percent: m_t << "\\%"; break;
-    case DocSymbol::Pipe:    m_t << "$|$"; break;
-    case DocSymbol::Copy:    m_t << "\\copyright{}"; break;
-    case DocSymbol::Tm:      m_t << "\\texttrademark{}"; break;
-    case DocSymbol::Reg:     m_t << "\\textregistered{}"; break;
-    case DocSymbol::Apos:    m_t << "'"; break;
-    case DocSymbol::Quot:    m_t << "\""; break;
-    case DocSymbol::Lsquo:   m_t << "`"; break;
-    case DocSymbol::Rsquo:   m_t << "'"; break;
-    case DocSymbol::Ldquo:   m_t << "``"; break;
-    case DocSymbol::Rdquo:   m_t << "''"; break;
-    case DocSymbol::Ndash:   m_t << "--"; break;
-    case DocSymbol::Mdash:   m_t << "---"; break;
-    case DocSymbol::Uml:     
-                             if (s->letter()=='i') 
-                               m_t << "\\\"{\\i}"; 
-                             else                  
-                               m_t << "\\\"{" << s->letter() << "}"; 
-                             break;
-    case DocSymbol::Acute:   
-                             if (s->letter()=='i') 
-                               m_t << "\\'{\\i}"; 
-                             else                  
-                               m_t << "\\'{" << s->letter() << "}"; 
-                             break;
-    case DocSymbol::Grave:   
-                             if (s->letter()=='i') 
-                               m_t << "\\`{\\i}"; 
-                             else                  
-                               m_t << "\\`{" << s->letter() << "}"; 
-                             break;
-    case DocSymbol::Circ:    
-                             if (s->letter()=='i') 
-                               m_t << "\\^{\\i}"; 
-                             else                  
-                               m_t << "\\^{" << s->letter() << "}"; 
-                             break;
-    case DocSymbol::Slash:   if (tolower(s->letter())=='o')
-                               m_t << "{\\" << s->letter() << "}";
-                             else
-                               m_t << s->letter();
-                             break;
-    case DocSymbol::Tilde:   m_t << "\\~{"  << s->letter() << "}"; break;
-    case DocSymbol::Szlig:   m_t << "{\\ss}"; break;
-    case DocSymbol::Cedil:   m_t << "\\c{" << s->letter() << "}"; break;
-    case DocSymbol::Ring:    m_t << "\\" << s->letter() << s->letter(); break;
-    case DocSymbol::Nbsp:    m_t << "~"; break;
-    case DocSymbol::AElig:   m_t << "{\\AE}"; break;
-    case DocSymbol::Aelig:   m_t << "{\\ae}"; break;
-    case DocSymbol::GrkGamma:      m_t << "{$\\Gamma$}"; break;
-    case DocSymbol::GrkDelta:      m_t << "{$\\Delta$}"; break;
-    case DocSymbol::GrkTheta:      m_t << "{$\\Theta$}"; break;
-    case DocSymbol::GrkLambda:     m_t << "{$\\Lambda$}"; break;
-    case DocSymbol::GrkXi:         m_t << "{$\\Xi$}"; break;
-    case DocSymbol::GrkPi:         m_t << "{$\\Pi$}"; break;
-    case DocSymbol::GrkSigma:      m_t << "{$\\Sigma$}"; break;
-    case DocSymbol::GrkUpsilon:    m_t << "{$\\Upsilon$}"; break;
-    case DocSymbol::GrkPhi:        m_t << "{$\\Phi$}"; break;
-    case DocSymbol::GrkPsi:        m_t << "{$\\Psi$}"; break;
-    case DocSymbol::GrkOmega:      m_t << "{$\\Omega$}"; break;
-    case DocSymbol::Grkalpha:      m_t << "{$\\alpha$}"; break;
-    case DocSymbol::Grkbeta:       m_t << "{$\\beta$}"; break;
-    case DocSymbol::Grkgamma:      m_t << "{$\\gamma$}"; break;
-    case DocSymbol::Grkdelta:      m_t << "{$\\delta$}"; break;
-    case DocSymbol::Grkepsilon:    m_t << "{$\\varepsilon$}"; break;
-    case DocSymbol::Grkzeta:       m_t << "{$\\zeta$}"; break;
-    case DocSymbol::Grketa:        m_t << "{$\\eta$}"; break;
-    case DocSymbol::Grktheta:      m_t << "{$\\theta$}"; break;
-    case DocSymbol::Grkiota:       m_t << "{$\\iota$}"; break;
-    case DocSymbol::Grkkappa:      m_t << "{$\\kappa$}"; break;
-    case DocSymbol::Grklambda:     m_t << "{$\\lambda$}"; break;
-    case DocSymbol::Grkmu:         m_t << "{$\\mu$}"; break;
-    case DocSymbol::Grknu:         m_t << "{$\\nu$}"; break;
-    case DocSymbol::Grkxi:         m_t << "{$\\xi$}"; break;
-    case DocSymbol::Grkpi:         m_t << "{$\\pi$}"; break;
-    case DocSymbol::Grkrho:        m_t << "{$\\rho$}"; break;
-    case DocSymbol::Grksigma:      m_t << "{$\\sigma$}"; break;
-    case DocSymbol::Grktau:        m_t << "{$\\tau$}"; break;
-    case DocSymbol::Grkupsilon:    m_t << "{$\\upsilon$}"; break;
-    case DocSymbol::Grkphi:        m_t << "{$\\varphi$}"; break;
-    case DocSymbol::Grkchi:        m_t << "{$\\chi$}"; break;
-    case DocSymbol::Grkpsi:        m_t << "{$\\psi$}"; break;
-    case DocSymbol::Grkomega:      m_t << "{$\\omega$}"; break;
-    case DocSymbol::Grkvarsigma:   m_t << "{$\\varsigma$}"; break;
-    case DocSymbol::Section:       m_t << "{$\\S$}"; break;
-    case DocSymbol::Degree:        m_t << "\\textdegree"; break;
-    case DocSymbol::Prime:         m_t << "'"; break;
-    case DocSymbol::DoublePrime:   m_t << "''"; break;
-    case DocSymbol::Infinity:      m_t << "{$\\infty$}"; break;
-    case DocSymbol::EmptySet:      m_t << "{$\\emptyset$}"; break;
-    case DocSymbol::PlusMinus:     m_t << "{$\\pm$}"; break;
-    case DocSymbol::Times:         m_t << "{$\\times$}"; break;
-    case DocSymbol::Minus:         m_t << "-"; break;
-    case DocSymbol::CenterDot:     m_t << "{$\\cdot$}"; break;
-    case DocSymbol::Partial:       m_t << "{$\\partial$}"; break;
-    case DocSymbol::Nabla:         m_t << "{$\\nabla$}"; break;
-    case DocSymbol::SquareRoot:    m_t << "{$\\surd$}"; break;
-    case DocSymbol::Perpendicular: m_t << "{$\\perp$}"; break;
-    case DocSymbol::Sum:           m_t << "{$\\sum$}"; break;
-    case DocSymbol::Integral:      m_t << "{$\\int$}"; break;
-    case DocSymbol::Product:       m_t << "{$\\prod$}"; break;
-    case DocSymbol::Similar:       m_t << "{$\\sim$}"; break;
-    case DocSymbol::Approx:        m_t << "{$\\approx$}"; break;
-    case DocSymbol::NotEqual:      m_t << "{$\\ne$}"; break;
-    case DocSymbol::Equivalent:    m_t << "{$\\equiv$}"; break;
-    case DocSymbol::Proportional:  m_t << "{$\\propto$}"; break;
-    case DocSymbol::LessEqual:     m_t << "{$\\le$}"; break;
-    case DocSymbol::GreaterEqual:  m_t << "{$\\ge$}"; break;
-    case DocSymbol::LeftArrow:     m_t << "{$\\leftarrow$}"; break;
-    case DocSymbol::RightArrow:    m_t << "{$\\rightarrow$}"; break;
-    case DocSymbol::SetIn:         m_t << "{$\\in$}"; break;
-    case DocSymbol::SetNotIn:      m_t << "{$\\notin$}"; break;
-    case DocSymbol::LeftCeil:      m_t << "{$\\lceil$}"; break;
-    case DocSymbol::RightCeil:     m_t << "{$\\rceil$}"; break;
-    case DocSymbol::LeftFloor:     m_t << "{$\\lfloor$}"; break;
-    case DocSymbol::RightFloor:    m_t << "{$\\rfloor$}"; break;
-    default:
-                             err("unknown symbol found\n");
+  const char *res = HtmlEntityMapper::instance()->latex(s->symbol());
+  if (res)
+  {
+    if (((s->symbol() == DocSymbol::Sym_lt) || (s->symbol() == DocSymbol::Sym_Less))&& (!m_insidePre))
+    {
+      m_t << "$<$";
+    }
+    else if (((s->symbol() == DocSymbol::Sym_gt) || (s->symbol() == DocSymbol::Sym_Greater)) && (!m_insidePre))
+    {
+      m_t << "$>$";
+    }
+    else
+    {
+      m_t << res;
+    }
+  }
+  else
+  {
+    err("LaTeX: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
   }
 }
 
@@ -279,8 +181,7 @@ void LatexDocVisitor::visit(DocURL *u)
 void LatexDocVisitor::visit(DocLineBreak *)
 {
   if (m_hide) return;
-  if (m_insideTable) m_t << "\\newline\n";
-  else m_t << "\\par\n";
+  m_t << "~\\newline\n";
 }
 
 void LatexDocVisitor::visit(DocHorRuler *)
@@ -304,10 +205,10 @@ void LatexDocVisitor::visit(DocStyleChange *s)
       if (s->enable()) m_t << "{\\ttfamily ";   else m_t << "}";
       break;
     case DocStyleChange::Subscript:
-      if (s->enable()) m_t << "$_{\\mbox{";    else m_t << "}}$ ";
+      if (s->enable()) m_t << "\\textsubscript{";    else m_t << "}";
       break;
     case DocStyleChange::Superscript:
-      if (s->enable()) m_t << "$^{\\mbox{";    else m_t << "}}$ ";
+      if (s->enable()) m_t << "\\textsuperscript{";    else m_t << "}";
       break;
     case DocStyleChange::Center:
       if (s->enable()) m_t << "\\begin{center}"; else m_t << "\\end{center} ";
@@ -466,6 +367,9 @@ void LatexDocVisitor::visit(DocInclude *inc)
       break;
     case DocInclude::HtmlInclude: 
       break;
+    case DocInclude::LatexInclude:
+      m_t << inc->text();
+      break;
     case DocInclude::VerbInclude: 
       m_t << "\n\\begin{DoxyVerbInclude}\n";
       m_t << inc->text();
@@ -1573,13 +1477,13 @@ void LatexDocVisitor::visitPost(DocText *)
 void LatexDocVisitor::visitPre(DocHtmlBlockQuote *)
 {
   if (m_hide) return;
-  m_t << "\\begin{quotation}" << endl;
+  m_t << "\\begin{quote}" << endl;
 }
 
 void LatexDocVisitor::visitPost(DocHtmlBlockQuote *)
 {
   if (m_hide) return;
-  m_t << "\\end{quotation}" << endl;
+  m_t << "\\end{quote}" << endl;
 }
 
 void LatexDocVisitor::visitPre(DocVhdlFlow *)
@@ -1646,8 +1550,8 @@ void LatexDocVisitor::endLink(const QCString &ref,const QCString &file,const QCS
     m_t << "{"; 
     filter(theTranslator->trPageAbbreviation());
     m_t << "}{" << file;
-    if (!anchor.isEmpty()) m_t << "_" << anchor;
-    m_t << "}";
+    if (!file.isEmpty() && !anchor.isEmpty()) m_t << "_";
+    m_t << anchor << "}";
   }
 }
 
index 4073b7f..d386569 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index e473e79..90591c5 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -293,7 +293,10 @@ static void writeDefaultHeaderPart1(FTextStream &t)
        "\\usepackage{makeidx}\n"
        "\\usepackage{multicol}\n"
        "\\usepackage{multirow}\n"
+       "\\usepackage{fixltx2e}\n" // for \textsubscript
+       "\\PassOptionsToPackage{warn}{textcomp}\n"
        "\\usepackage{textcomp}\n"
+       "\\usepackage[nointegrals]{wasysym}\n"
        "\\usepackage[table]{xcolor}\n"
        "\n";
 
@@ -323,6 +326,7 @@ static void writeDefaultHeaderPart1(FTextStream &t)
        "  \\fontseries{bc}\\selectfont%\n"
        "  \\color{darkgray}%\n"
        "}\n"
+       "\\newcommand{\\+}{\\discretionary{\\mbox{\\scriptsize$\\hookleftarrow$}}{}{}}\n"
        "\n";
 
   // Define page & text layout
@@ -464,7 +468,11 @@ static void writeDefaultHeaderPart1(FTextStream &t)
   {
     // To avoid duplicate page anchors due to reuse of same numbers for
     // the index (be it as roman numbers)
-    t << "\\hypersetup{pageanchor=false}\n";
+    t << "\\hypersetup{pageanchor=false,\n"
+      << "             bookmarks=true,\n"
+      << "             bookmarksnumbered=true,\n"
+      << "             pdfencoding=unicode\n"
+      << "            }\n";
   }
   t << "\\pagenumbering{roman}\n"
        "\\begin{titlepage}\n"
@@ -592,6 +600,14 @@ void LatexGenerator::startProjectNumber()
   t << "\\\\[1ex]\\large "; 
 }
 
+static QCString convertToLaTeX(const QCString &s)
+{
+  QGString result;
+  FTextStream t(&result);
+  filterLatexString(t,s,FALSE,FALSE,FALSE);
+  return result.data();
+}
+
 void LatexGenerator::startIndexSection(IndexSections is)
 {
   bool &compactLatex = Config_getBool("COMPACT_LATEX");
@@ -608,9 +624,9 @@ void LatexGenerator::startIndexSection(IndexSections is)
         {
           QCString header = fileToString(latexHeader);
           t << substituteKeywords(header,0,
-              Config_getString("PROJECT_NAME"),
-              Config_getString("PROJECT_NUMBER"),
-              Config_getString("PROJECT_BRIEF"));
+                   convertToLaTeX(Config_getString("PROJECT_NAME")),
+                   convertToLaTeX(Config_getString("PROJECT_NUMBER")),
+                   convertToLaTeX(Config_getString("PROJECT_BRIEF")));
         }
       }
       break;
@@ -726,11 +742,13 @@ void LatexGenerator::startIndexSection(IndexSections is)
     case isFileDocumentation:
       {
         bool isFirst=TRUE;
-        FileName *fn=Doxygen::inputNameList->first();
-        while (fn)
+        FileNameListIterator fnli(*Doxygen::inputNameList); 
+        FileName *fn;
+        for (fnli.toFirst();(fn=fnli.current());++fnli)
         {
-          FileDef *fd=fn->first();
-          while (fd)
+          FileNameIterator fni(*fn);
+          FileDef *fd;
+          for (;(fd=fni.current());++fni)
           {
             if (fd->isLinkableInProject())
             {
@@ -742,9 +760,7 @@ void LatexGenerator::startIndexSection(IndexSections is)
                 break;
               }
             }
-            fd=fn->next();
           }
-          fn=Doxygen::inputNameList->next();
         }
       }
       break;
@@ -919,11 +935,13 @@ void LatexGenerator::endIndexSection(IndexSections is)
     case isFileDocumentation:
       {
         bool isFirst=TRUE;
-        FileName *fn=Doxygen::inputNameList->first();
-        while (fn)
+        FileNameListIterator fnli(*Doxygen::inputNameList); 
+        FileName *fn;
+        for (fnli.toFirst();(fn=fnli.current());++fnli)
         {
-          FileDef *fd=fn->first();
-          while (fd)
+          FileNameIterator fni(*fn);
+          FileDef *fd;
+          for (;(fd=fni.current());++fni)
           {
             if (fd->isLinkableInProject())
             {
@@ -949,9 +967,7 @@ void LatexGenerator::endIndexSection(IndexSections is)
                 }
               }
             }
-            fd=fn->next();
           }
-          fn=Doxygen::inputNameList->next();
         }
       }
       break;
@@ -1006,9 +1022,9 @@ void LatexGenerator::endIndexSection(IndexSections is)
       {
         QCString footer = fileToString(latexFooter);
         t << substituteKeywords(footer,0,
-              Config_getString("PROJECT_NAME"),
-              Config_getString("PROJECT_NUMBER"),
-              Config_getString("PROJECT_BRIEF"));
+                   convertToLaTeX(Config_getString("PROJECT_NAME")),
+                   convertToLaTeX(Config_getString("PROJECT_NUMBER")),
+                   convertToLaTeX(Config_getString("PROJECT_BRIEF")));
       }
       break;
   }
@@ -1362,8 +1378,10 @@ void LatexGenerator::startMemberDoc(const char *clname,
     t << "}";
     if (clname)
     {
-      t << "!" << clname << "@{";
-      docify(clname);
+      t << "!";
+      escapeLabelName(clname);
+      t << "@{";
+      escapeMakeIndexChars(clname);
       t << "}"; 
     }
     t << "}" << endl;
@@ -2000,13 +2018,18 @@ void LatexGenerator::escapeLabelName(const char *s)
   {
     switch (c)
     {
+      case '|': t << "\\texttt{\"|}"; break;
+      case '!': t << "\"!"; break;
       case '%': t << "\\%";       break;
+      case '{': t << "\\lcurly{}"; break;
+      case '}': t << "\\rcurly{}"; break;
+      case '~': t << "````~"; break; // to get it a bit better in index together with other special characters
       // NOTE: adding a case here, means adding it to while below as well!
       default:  
         i=0;
         // collect as long string as possible, before handing it to docify
         result[i++]=c;
-        while ((c=*p) && c!='%')
+        while ((c=*p) && c!='|' && c!='!' && c!='%' && c!='{' && c!='}' && c!='~')
         {
           result[i++]=c;
           p++;
@@ -2029,16 +2052,20 @@ void LatexGenerator::escapeMakeIndexChars(const char *s)
   {
     switch (c)
     {
+      case '!': t << "\"!"; break;
       case '"': t << "\"\""; break;
       case '@': t << "\"@"; break;
+      case '|': t << "\\texttt{\"|}"; break;
       case '[': t << "["; break;
       case ']': t << "]"; break;
+      case '{': t << "\\lcurly{}"; break;
+      case '}': t << "\\rcurly{}"; break;
       // NOTE: adding a case here, means adding it to while below as well!
       default:  
         i=0;
         // collect as long string as possible, before handing it to docify
         result[i++]=c;
-        while ((c=*p) && c!='"' && c!='@' && c!='[' && c!=']')
+        while ((c=*p) && c!='"' && c!='@' && c!='[' && c!=']' && c!='!' && c!='{' && c!='}' && c!='|')
         {
           result[i++]=c;
           p++;
index 8e29c01..f68612d 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index bc00745..739a2a3 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 2506076..d50bc7c 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 6a63828..ab7c36c 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
 TEMPLATE     = libdoxycfg.t
 CONFIG       = console warn_on staticlib $extraopts
 HEADERS      =  config.h configoptions.h portable.h
-SOURCES      = config.cpp configoptions.cpp portable.cpp portable_c.c
+SOURCES      = ../generated_src/doxygen/config.cpp ../generated_src/doxygen/configoptions.cpp portable.cpp portable_c.c
 win32:TMAKE_CXXFLAGS       += -DQT_NODLL
 win32-g++:TMAKE_CXXFLAGS   += -fno-exceptions -fno-rtti
-INCLUDEPATH                += ../qtools
-win32:INCLUDEPATH          += .
+DEPENDPATH                 += ../generated_src/doxygen
+INCLUDEPATH                += ../generated_src/doxygen . ../qtools
 DESTDIR                    =  ../lib
 TARGET                     =  doxycfg
-OBJECTS_DIR                =  ../objects
+OBJECTS_DIR                =  ../objects/doxygen
index 3a2ce0a..89833f6 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
@@ -45,9 +45,9 @@ sub GenerateDep {
 
 ####################
 
-#$ GenerateDep("config.cpp","config.l");
-       $(LEX) -PconfigYY -t config.l >config.cpp 
+#$ GenerateDep("../generated_src/doxygen/config.cpp","config.l");
+       $(LEX) -PconfigYY -t config.l >../generated_src/doxygen/config.cpp 
 
-configoptions.cpp: config.xml configgen.py
-       $(PYTHON) configgen.py -cpp config.xml >configoptions.cpp
+../generated_src/doxygen/configoptions.cpp: config.xml configgen.py
+       $(PYTHON) configgen.py -cpp config.xml >../generated_src/doxygen/configoptions.cpp
 
index b230b2f..457db58 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van 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,6 @@
 TEMPLATE     = libdoxygen.t
 CONFIG       = console warn_on staticlib $extraopts
 HEADERS      = arguments.h \
-                bib2xhtml.pl.h \
                 bufstr.h \
                cite.h \
                clangparser.h \
@@ -27,7 +26,6 @@ HEADERS      =        arguments.h \
                 code.h \
                commentcnv.h \
                commentscan.h \
-                compound.xsd.h \
                condparser.h \
                 config.h \
                context.h \
@@ -47,41 +45,27 @@ HEADERS      =      arguments.h \
                 docvisitor.h \
                dot.h \
                doxygen.h \
-               doxygen.bst.h \
-               doxygen.css.h \
-               doxygen.sty.h \
                eclipsehelp.h \
                entry.h \
                example.h \
                filedef.h \
                filename.h \
-               footer.html.h \
                formula.h \
                ftextstream.h \
                ftvhelp.h \
                groupdef.h \
-               header.html.h \
                htags.h \
                htmlattrib.h \
                 htmldocvisitor.h \
                htmlgen.h \
                htmlhelp.h \
+               htmlentity.h \
                image.h \
                index.h \
-                index.xsd.h \
-               jquery_p1.js.h \
-               jquery_p2.js.h \
-               jquery_p3.js.h \
-               jquery_ui.js.h \
-               jquery_fx.js.h \
-               jquery_pt.js.h \
-               svgpan.js.h \
-               dynsections.js.h \
                language.h \
                 latexdocvisitor.h \
                latexgen.h \
                 layout.h \
-                layout_default.xml.h \
                logos.h \
                mandocvisitor.h \
                mangen.h \
@@ -96,8 +80,6 @@ HEADERS      =        arguments.h \
                 msc.h \
                 dia.h \
                namespacedef.h \
-               navtree.css.h \
-               navtree.js.h \
                 objcache.h \
                outputgen.h \
                outputlist.h \
@@ -114,17 +96,11 @@ HEADERS      =     arguments.h \
                qhp.h \
                qhpxmlwriter.h \
                reflist.h \
-               resize.js.h \
                 rtfdocvisitor.h \
                rtfgen.h \
                rtfstyle.h \
                scanner.h \
                searchindex.h \
-               search.css.h \
-               search.js.h \
-               extsearch.js.h \
-               search_functions.php.h \
-               search_opensearch.php.h \
                section.h \
                sortdict.h \
                 store.h \
@@ -143,34 +119,26 @@ HEADERS      =    arguments.h \
                xmldocvisitor.h \
                 xmlgen.h \
                 docbookvisitor.h \
-                docbookgen.h
+                docbookgen.h \
 
 SOURCES      = arguments.cpp \
-                constexp.cpp \
-                ce_parse.cpp \
                cite.cpp \
                clangparser.cpp \
                classdef.cpp \
                classlist.cpp \
                 cmdmapper.cpp \
-               code.cpp \
-               commentcnv.cpp \
-               commentscan.cpp \
                condparser.cpp \
                context.cpp \
                cppvalue.cpp \
                 dbusxmlscanner.cpp \
                debug.cpp \
                 defgen.cpp \
-               declinfo.cpp \
-               defargs.cpp \
                define.cpp \
                definition.cpp \
                diagram.cpp \
                 dirdef.cpp \
                 docparser.cpp \
                docsets.cpp \
-                doctokenizer.cpp \
                dot.cpp \
                doxygen.cpp \
                eclipsehelp.cpp \
@@ -180,13 +148,12 @@ SOURCES      =    arguments.cpp \
                formula.cpp \
                ftextstream.cpp \
                ftvhelp.cpp \
-               fortrancode.cpp \
-               fortranscanner.cpp \    
                groupdef.cpp \
                htags.cpp \
                 htmldocvisitor.cpp \
                htmlgen.cpp \
                htmlhelp.cpp \
+               htmlentity.cpp \
                image.cpp \
                index.cpp \
                language.cpp \
@@ -213,46 +180,53 @@ SOURCES      =    arguments.cpp \
                outputlist.cpp \
                pagedef.cpp \
                perlmodgen.cpp \
-               pre.cpp \
-               pycode.cpp \
-               pyscanner.cpp \    
                qhp.cpp \
                qhpxmlwriter.cpp \
                reflist.cpp \
                 rtfdocvisitor.cpp \
                rtfgen.cpp \
                rtfstyle.cpp \
-               scanner.cpp \
                searchindex.cpp \
                 store.cpp \
                tagreader.cpp \
-                tclscanner.cpp \
                template.cpp \
                 textdocvisitor.cpp \
                 tooltip.cpp \
                util.cpp \
-               version.cpp \
-               vhdlcode.cpp \
                vhdldocgen.cpp \
-               vhdlparser.cpp \
-               vhdlscanner.cpp \
                xmldocvisitor.cpp \
                 xmlgen.cpp \
                 docbookvisitor.cpp \
-                docbookgen.cpp
+                docbookgen.cpp \
+                ../generated_src/doxygen/ce_parse.cpp \
+                ../generated_src/doxygen/constexp.cpp \
+               ../generated_src/doxygen/vhdlcode.cpp \
+               ../generated_src/doxygen/vhdlparser.cpp \
+               ../generated_src/doxygen/vhdlscanner.cpp \
+               ../generated_src/doxygen/code.cpp \
+               ../generated_src/doxygen/commentcnv.cpp \
+               ../generated_src/doxygen/commentscan.cpp \
+               ../generated_src/doxygen/declinfo.cpp \
+               ../generated_src/doxygen/defargs.cpp \
+                ../generated_src/doxygen/doctokenizer.cpp \
+               ../generated_src/doxygen/pre.cpp \
+               ../generated_src/doxygen/pycode.cpp \
+               ../generated_src/doxygen/pyscanner.cpp \
+               ../generated_src/doxygen/scanner.cpp \
+                ../generated_src/doxygen/tclscanner.cpp \
+               ../generated_src/doxygen/fortrancode.cpp \
+               ../generated_src/doxygen/fortranscanner.cpp \
+               ../generated_src/doxygen/version.cpp
 
-win32:TMAKE_CXXFLAGS       += -DQT_NODLL 
+win32:TMAKE_CXXFLAGS       += -DQT_NODLL
 win32-msvc:TMAKE_CXXFLAGS  += -Zm200
 win32-g++:TMAKE_CXXFLAGS   += -fno-exceptions
-linux-g++:TMAKE_CXXFLAGS    += -fno-exceptions
-INCLUDEPATH                += ../qtools
-#INCLUDEPATH                += ../libpng
-INCLUDEPATH                += ../libmd5
+linux-g++:TMAKE_CXXFLAGS   += -fno-exceptions
+INCLUDEPATH                += ../generated_src/doxygen ../src ../qtools ../libmd5
 INCLUDEPATH                += %%SQLITE3_INC%%
+DEPENDPATH                 += ../generated_src/doxygen
 win32:INCLUDEPATH          += .
-#win32-g++:INCLUDEPATH      = ../qtools /usr/include/libpng12 ../libmd5
-win32-g++:INCLUDEPATH      = ../qtools ../libmd5
 DESTDIR                    =  ../lib
 TARGET                     =  doxygen
-OBJECTS_DIR                =  ../objects
+OBJECTS_DIR                =  ../objects/doxygen
 
index f131f70..173f90b 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2013 by Dimitri van Heesch.
+# Copyright (C) 1997-2014 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
@@ -21,10 +21,12 @@ YACC       = %%BISON%%
 PYTHON     = %%PYTHON%%
 PERL       = %%PERL%%
 INCBUFSIZE = $(PYTHON) increasebuffer.py
+GENERATED_SRC = ../generated_src/doxygen
+GENERATED_OBJ = ../objects/doxygen
 
 #${
 sub GenerateDep {
-    my($obj,$src,$dep) = @_;
+    my($obj,$src,@deps) = @_;
     my(@objv,$srcv,$i,$s,$o,$d,$c);
     @objv = split(/\s+/,$obj);
     @srcv = split(/\s+/,$src);
@@ -33,7 +35,9 @@ sub GenerateDep {
         $o = $objv[$i];
         next if $s eq "";
         $text .= $o . ": " . $s;
-       $text .= " ${linebreak}\n\t\t" . $dep if $dep ne "";
+        foreach my $dep (@deps) {
+         $text .= " ${linebreak}\n\t\t" . $dep if $dep ne "";
+        }
         if ( $moc_output{$s} ne "" ) {
             $text .= " ${linebreak}\n\t\t" . $moc_output{$s};
         }
@@ -49,170 +53,164 @@ sub GenerateLex {
     if ($caseOpt) {
         $text .= "-i ";
     }
-    $text .= "-P".$name."YY -t ".$name.".l | \$(INCBUFSIZE) >".$name.".cpp";
+    $text .= "-P".$name."YY -t ".$name.".l | \$(INCBUFSIZE) > \$(GENERATED_SRC)/".$name.".cpp";
 }
 #$} 
 
 ####################
 
-#$ GenerateDep("scanner.cpp","scanner.l");
+#$ GenerateDep("\$(GENERATED_SRC)/scanner.cpp","scanner.l");
 #$ GenerateLex("scanner",0);
 
-#$ GenerateDep("code.cpp","code.l");
+#$ GenerateDep("\$(GENERATED_SRC)/code.cpp","code.l");
 #$ GenerateLex("code",0);
 
-#$ GenerateDep("pyscanner.cpp","pyscanner.l");
+#$ GenerateDep("\$(GENERATED_SRC)/pyscanner.cpp","pyscanner.l");
 #$ GenerateLex("pyscanner",0);
 
-#$ GenerateDep("pycode.cpp","pycode.l");
+#$ GenerateDep("\$(GENERATED_SRC)/pycode.cpp","pycode.l");
 #$ GenerateLex("pycode",0);
 
-#$ GenerateDep("fortranscanner.cpp","fortranscanner.l");
+#$ GenerateDep("\$(GENERATED_SRC)/fortranscanner.cpp","fortranscanner.l");
 #$ GenerateLex("fortranscanner",1);
 
-#$ GenerateDep("fortrancode.cpp","fortrancode.l");
+#$ GenerateDep("\$(GENERATED_SRC)/fortrancode.cpp","fortrancode.l");
 #$ GenerateLex("fortrancode",1);
 
-#$ GenerateDep("vhdlcode.cpp","vhdlcode.l");
+#$ GenerateDep("\$(GENERATED_SRC)/vhdlcode.cpp","vhdlcode.l");
 #$ GenerateLex("vhdlcode",1);
 
-#$ GenerateDep("tclscanner.cpp","tclscanner.l");
+#$ GenerateDep("\$(GENERATED_SRC)/tclscanner.cpp","tclscanner.l");
 #$ GenerateLex("tclscanner",1);
 
-#$ GenerateDep("pre.cpp","pre.l");
+#$ GenerateDep("\$(GENERATED_SRC)/pre.cpp","pre.l");
 #$ GenerateLex("pre",0);
 
-#$ GenerateDep("declinfo.cpp","declinfo.l");
+#$ GenerateDep("\$(GENERATED_SRC)/declinfo.cpp","declinfo.l");
 #$ GenerateLex("declinfo",0);
 
-#$ GenerateDep("defargs.cpp","defargs.l");
+#$ GenerateDep("\$(GENERATED_SRC)/defargs.cpp","defargs.l");
 #$ GenerateLex("defargs",0);
 
-#$ GenerateDep("doctokenizer.cpp","doctokenizer.l");
+#$ GenerateDep("\$(GENERATED_SRC)/doctokenizer.cpp","doctokenizer.l");
 #$ GenerateLex("doctokenizer",0);
 
-#$ GenerateDep("commentcnv.cpp","commentcnv.l");
+#$ GenerateDep("\$(GENERATED_SRC)/commentcnv.cpp","commentcnv.l");
 #$ GenerateLex("commentcnv",0);
 
-#$ GenerateDep("commentscan.cpp","commentscan.l");
+#$ GenerateDep("\$(GENERATED_SRC)/commentscan.cpp","commentscan.l");
 #$ GenerateLex("commentscan",0);
 
-#$ GenerateDep("constexp.cpp","constexp.l","ce_parse.h");
+#$ GenerateDep("\$(GENERATED_SRC)/constexp.cpp","constexp.l","\$(GENERATED_SRC)/ce_parse.h");
 #$ GenerateLex("constexp",0);
 
-#$ GenerateDep("ce_parse.cpp","constexp.y");
-       $(YACC) -l -p constexpYY constexp.y -o ce_parse.cpp 
+#$ GenerateDep("\$(GENERATED_SRC)/ce_parse.cpp","constexp.y");
+       $(YACC) -l -p constexpYY constexp.y -o \$(GENERATED_SRC)/ce_parse.cpp 
 
-#$ GenerateDep("ce_parse.h","constexp.y");
-       $(YACC) -l -d -p ce_parsexpYY constexp.y -o ce_parse.c 
-       -rm ce_parse.c
+#$ GenerateDep("\$(GENERATED_SRC)/ce_parse.h","constexp.y");
+       $(YACC) -l -d -p ce_parsexpYY constexp.y -o \$(GENERATED_SRC)/ce_parse.c 
+       -rm $(GENERATED_SRC)/ce_parse.c
 
-#$ GenerateDep("vhdlscanner.cpp","vhdlscanner.l","vhdlparser.h");
+#$ GenerateDep("\$(GENERATED_SRC)/vhdlscanner.cpp","vhdlscanner.l","\$(GENERATED_SRC)/vhdlparser.h");
 #$ GenerateLex("vhdlscanner",1);
 
-#$ GenerateDep("vhdlparser.cpp","vhdlparser.y");
-       $(YACC) -l -p vhdlscannerYY vhdlparser.y -o vhdlparser.cpp      
+#$ GenerateDep("\$(GENERATED_SRC)/vhdlparser.cpp","vhdlparser.y");
+       $(YACC) -l -p vhdlscannerYY vhdlparser.y -o \$(GENERATED_SRC)/vhdlparser.cpp    
 
-#$ GenerateDep("vhdlparser.h","vhdlparser.y");
-       $(YACC) -l -d -p vhdlscannerYY vhdlparser.y -o vhdlparser.c 
-       -rm vhdlparser.c        
+#$ GenerateDep("\$(GENERATED_SRC)/vhdlparser.h","vhdlparser.y");
+       $(YACC) -l -d -p vhdlscannerYY vhdlparser.y -o \$(GENERATED_SRC)/vhdlparser.c 
+       -rm $(GENERATED_SRC)/vhdlparser.c       
        
-#$ GenerateDep("layout.cpp","layout_default.xml.h");
-
 TO_C_CMD=$(PYTHON) to_c_cmd.py < $< > $@
 
-cite.cpp: doxygen.bst.h bib2xhtml.pl.h
+#$ GenerateDep("layout.cpp","\$(GENERATED_SRC)/layout_default.xml.h");
 
-ftvhelp.cpp: navtree.js.h resize.js.h navtree.css.h
+#$ GenerateDep("cite.cpp","\$(GENERATED_SRC)/doxygen.bst.h","\$(GENERATED_SRC)/bib2xhtml.pl.h");
 
-htmlgen.cpp: header.html.h footer.html.h doxygen.css.h search_functions.php.h \
-             search_opensearch.php.h search.css.h jquery_p1.js.h jquery_p2.js.h \
-            jquery_p3.js.h jquery_ui.js.h jquery_fx.js.h jquery_pt.js.h \
-            svgpan.js.h dynsections.js.h extsearch.js.h
+#$ GenerateDep("ftvhelp.cpp","\$(GENERATED_SRC)/navtree.js.h","\$(GENERATED_SRC)/resize.js.h","\$(GENERATED_SRC)/navtree.css.h");
 
-layout.cpp: layout_default.xml.h
+#$ GenerateDep("htmlgen.cpp","\$(GENERATED_SRC)/header.html.h","\$(GENERATED_SRC)/footer.html.h","\$(GENERATED_SRC)/doxygen.css.h","\$(GENERATED_SRC)/search_functions.php.h","\$(GENERATED_SRC)/search_opensearch.php.h","\$(GENERATED_SRC)/search.css.h","\$(GENERATED_SRC)/jquery_p1.js.h","\$(GENERATED_SRC)/jquery_p2.js.h","\$(GENERATED_SRC)/jquery_p3.js.h","\$(GENERATED_SRC)/jquery_ui.js.h","\$(GENERATED_SRC)/jquery_fx.js.h","\$(GENERATED_SRC)/jquery_pt.js.h","\$(GENERATED_SRC)/svgpan.js.h","\$(GENERATED_SRC)/dynsections.js.h","\$(GENERATED_SRC)/extsearch.js.h");
 
-xmlgen.cpp: index.xsd.h compound.xsd.h
+#$ GenerateDep("xmlgen.cpp","\$(GENERATED_SRC)/index.xsd.h","\$(GENERATED_SRC)/compound.xsd.h");
 
-latexgen.cpp: doxygen.sty.h
+#$ GenerateDep("latexgen.cpp","\$(GENERATED_SRC)/doxygen.sty.h");
 
-searchindex.cpp: search.js.h
+#$ GenerateDep("searchindex.cpp","\$(GENERATED_SRC)/search.js.h");
 
-index.xsd.h: index.xsd
+$(GENERATED_SRC)/index.xsd.h: index.xsd
        $(TO_C_CMD)
 
-compound.xsd.h: compound.xsd
+$(GENERATED_SRC)/compound.xsd.h: compound.xsd
        $(TO_C_CMD)
 
-layout_default.xml.h: layout_default.xml
+$(GENERATED_SRC)/layout_default.xml.h: layout_default.xml
        $(TO_C_CMD)
 
-header.html.h: header.html
+$(GENERATED_SRC)/header.html.h: header.html
        $(TO_C_CMD)
 
-footer.html.h: footer.html
+$(GENERATED_SRC)/footer.html.h: footer.html
        $(TO_C_CMD)
 
-search_functions.php.h: search_functions.php
+$(GENERATED_SRC)/search_functions.php.h: search_functions.php
        $(TO_C_CMD)
 
-search_opensearch.php.h: search_opensearch.php
+$(GENERATED_SRC)/search_opensearch.php.h: search_opensearch.php
        $(TO_C_CMD)
 
-search.js.h: search.js
+$(GENERATED_SRC)/search.js.h: search.js
        $(TO_C_CMD)
 
-search.css.h: search.css
+$(GENERATED_SRC)/search.css.h: search.css
        $(TO_C_CMD)
 
-extsearch.js.h: extsearch.js
+$(GENERATED_SRC)/extsearch.js.h: extsearch.js
        $(TO_C_CMD)
 
-doxygen.css.h: doxygen.css
+$(GENERATED_SRC)/doxygen.css.h: doxygen.css
        $(TO_C_CMD)
 
-doxygen.sty.h: doxygen.sty
+$(GENERATED_SRC)/doxygen.sty.h: doxygen.sty
        $(TO_C_CMD)
 
-
-navtree.js.h: navtree.js
+$(GENERATED_SRC)/navtree.js.h: navtree.js
        $(TO_C_CMD)
 
-resize.js.h: resize.js
+$(GENERATED_SRC)/resize.js.h: resize.js
        $(TO_C_CMD)
 
-jquery_p1.js.h: jquery_p1.js
+$(GENERATED_SRC)/jquery_p1.js.h: jquery_p1.js
        $(TO_C_CMD)
 
-jquery_p2.js.h: jquery_p2.js
+$(GENERATED_SRC)/jquery_p2.js.h: jquery_p2.js
        $(TO_C_CMD)
 
-jquery_p3.js.h: jquery_p3.js
+$(GENERATED_SRC)/jquery_p3.js.h: jquery_p3.js
        $(TO_C_CMD)
 
-jquery_ui.js.h: jquery_ui.js
+$(GENERATED_SRC)/jquery_ui.js.h: jquery_ui.js
        $(TO_C_CMD)
 
-jquery_fx.js.h: jquery_fx.js
+$(GENERATED_SRC)/jquery_fx.js.h: jquery_fx.js
        $(TO_C_CMD)
 
-jquery_pt.js.h: jquery_pt.js
+$(GENERATED_SRC)/jquery_pt.js.h: jquery_pt.js
        $(TO_C_CMD)
 
-navtree.css.h: navtree.css
+$(GENERATED_SRC)/navtree.css.h: navtree.css
        $(TO_C_CMD)
 
-svgpan.js.h: svgpan.js
+$(GENERATED_SRC)/svgpan.js.h: svgpan.js
        $(TO_C_CMD)
 
-dynsections.js.h: dynsections.js
+$(GENERATED_SRC)/dynsections.js.h: dynsections.js
        $(TO_C_CMD)
 
-doxygen.bst.h: doxygen.bst
+$(GENERATED_SRC)/doxygen.bst.h: doxygen.bst
        $(TO_C_CMD)
 
-bib2xhtml.pl.h: bib2xhtml.pl
+$(GENERATED_SRC)/bib2xhtml.pl.h: bib2xhtml.pl
        $(TO_C_CMD)
 
-version.cpp: ../configure
-       $(PYTHON) version.py
+$(GENERATED_SRC)/version.cpp: ../configure
+       $(PYTHON) version.py $(GENERATED_SRC)
index df8378e..b237d5a 100644 (file)
@@ -1146,10 +1146,10 @@ static unsigned encodeLZ77_brute(uivector* out, const unsigned char* in, size_t
 }
 #endif
 
+/*
 static const unsigned HASH_NUM_VALUES = 65536;
 static const unsigned HASH_NUM_CHARACTERS = 6;
 static const unsigned HASH_SHIFT = 2;
-/*
 Good and fast values: HASH_NUM_VALUES=65536, HASH_NUM_CHARACTERS=6, HASH_SHIFT=2
 making HASH_NUM_CHARACTERS larger (like 8), makes the file size larger but is a bit faster
 making HASH_NUM_CHARACTERS smaller (like 3), makes the file size smaller but is slower
index 6aea996..9a9e5db 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 13406e1..083d772 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 09798ec..b64f700 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 729f3d4..5403324 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -29,6 +29,7 @@
 #include "message.h"
 #include "parserintf.h"
 #include "filedef.h"
+#include "htmlentity.h"
 
 ManDocVisitor::ManDocVisitor(FTextStream &t,CodeOutputInterface &ci,
                              const char *langExt) 
@@ -75,42 +76,15 @@ void ManDocVisitor::visit(DocWhiteSpace *w)
 void ManDocVisitor::visit(DocSymbol *s)
 {
   if (m_hide) return;
-  switch(s->symbol())
+  const char *res = HtmlEntityMapper::instance()->man(s->symbol());
+  if (res)
   {
-    case DocSymbol::BSlash:  m_t << "\\\\"; break;
-    case DocSymbol::At:      m_t << "@"; break;
-    case DocSymbol::Less:    m_t << "<"; break;
-    case DocSymbol::Greater: m_t << ">"; break;
-    case DocSymbol::Amp:     m_t << "&"; break;
-    case DocSymbol::Dollar:  m_t << "$"; break;
-    case DocSymbol::Hash:    m_t << "#"; break;
-    case DocSymbol::DoubleColon: m_t << "::"; break;
-    case DocSymbol::Percent: m_t << "%"; break;
-    case DocSymbol::Pipe:    m_t << "|"; break;
-    case DocSymbol::Copy:    m_t << "(C)"; break;
-    case DocSymbol::Tm:      m_t << "(TM)"; break;
-    case DocSymbol::Reg:     m_t << "(R)"; break;
-    case DocSymbol::Apos:    m_t << "'"; break;
-    case DocSymbol::Quot:    m_t << "\""; break;
-    case DocSymbol::Lsquo:   m_t << "`"; break;
-    case DocSymbol::Rsquo:   m_t << "'"; break;
-    case DocSymbol::Ldquo:   m_t << "``"; break;
-    case DocSymbol::Rdquo:   m_t << "''"; break;
-    case DocSymbol::Ndash:   m_t << "--"; break;
-    case DocSymbol::Mdash:   m_t << "---"; break;
-    case DocSymbol::Uml:     m_t << s->letter() << "\\*(4"; break;
-    case DocSymbol::Acute:   m_t << s->letter() << "\\*(`"; break;
-    case DocSymbol::Grave:   m_t << s->letter() << "\\*:"; break;
-    case DocSymbol::Circ:    m_t << s->letter() << "\\*^"; break;
-    case DocSymbol::Slash:   m_t << s->letter(); break; /* todo: implement this */
-    case DocSymbol::Tilde:   m_t << s->letter() << "\\*~"; break;
-    case DocSymbol::Szlig:   m_t << "s\\*:"; break;
-    case DocSymbol::Cedil:   m_t << s->letter() << "\\*,"; break;
-    case DocSymbol::Ring:    m_t << s->letter() << "\\*o"; break;
-    case DocSymbol::Nbsp:    m_t << " "; break;
-    default:
-         // unsupport symbol for man page :-(
-         break;
+    m_t << res;
+  }
+  else
+  {
+    // no error or warning to be supplied
+    // err("man: non supported HTML-entity found: &%s;\n",get_symbol_item(s->symbol()));
   }
   m_firstCol=FALSE;
 }
@@ -288,6 +262,8 @@ void ManDocVisitor::visit(DocInclude *inc)
       break;
     case DocInclude::HtmlInclude: 
       break;
+    case DocInclude::LatexInclude:
+      break;
     case DocInclude::VerbInclude: 
       if (!m_firstCol) m_t << endl;
       m_t << ".PP" << endl;
index 7012152..a5906d0 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index a50ee73..cf6795b 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -64,9 +64,19 @@ static QCString getExtension()
   return ext;
 }
 
+static QCString getSubdir()
+{
+  QCString dir = Config_getString("MAN_SUBDIR");
+  if (dir.isEmpty())
+  {
+    dir = "man" + getExtension();
+  }
+  return dir;
+}
+
 ManGenerator::ManGenerator() : OutputGenerator()
 {
-  dir=Config_getString("MAN_OUTPUT")+"/man" + getExtension();
+  dir=Config_getString("MAN_OUTPUT") + "/" + getSubdir();
   firstCol=TRUE;
   paragraph=TRUE;
   col=0;
@@ -106,10 +116,10 @@ void ManGenerator::init()
     err("Could not create output directory %s\n",manOutput.data());
     exit(1);
   }
-  d.setPath(manOutput+"/man"+ext);
-  if (!d.exists() && !d.mkdir(manOutput+"/man"+ext))
+  d.setPath(manOutput + "/" + getSubdir());
+  if (!d.exists() && !d.mkdir(manOutput + "/" + getSubdir()))
   {
-    err("Could not create output directory %s/man%s\n",manOutput.data(),ext.data());
+    err("Could not create output directory %s/%s\n",manOutput.data(), getSubdir().data());
     exit(1);
   }
   createSubDirs(d);
@@ -445,7 +455,7 @@ void ManGenerator::startDoxyAnchor(const char *,const char *manName,
              FTextStream linkstream;
              linkstream.setDevice(&linkfile);
              //linkstream.setEncoding(QTextStream::UnicodeUTF8);
-             linkstream << ".so man" << getExtension() << "/" << buildFileName( manName ) << endl;
+             linkstream << ".so " << getSubdir() << "/" << buildFileName( manName ) << endl;
        }
     }
     linkfile.close();
index 7ac5ae1..98ef959 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index ac824f4..291e1dc 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van 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,6 +48,7 @@
 #include "commentcnv.h"
 #include "config.h"
 #include "section.h"
+#include "message.h"
 
 //-----------
 
@@ -90,6 +91,7 @@ static QDict<LinkRef> g_linkRefs(257);
 static action_t       g_actions[256];
 static Entry         *g_current;
 static QCString       g_fileName;
+static int            g_lineNr;
 
 // In case a markdown page starts with a level1 header, that header is used
 // as a title of the page, in effect making it a level0 header, so the
@@ -1002,6 +1004,16 @@ static int processSpecialCommand(GrowBuf &out, const char *data, int offset, int
     if (c=='[' || c==']' || c=='*' || c=='+' || c=='-' ||
         c=='!' || c=='(' || c==')' || c=='.' || c=='`' || c=='_') 
     {
+      if (c=='-' && size>3 && data[2]=='-' && data[3]=='-') // \---
+      {
+        out.addStr(&data[1],3);
+        return 4;
+      }
+      else if (c=='-' && size>2 && data[2]=='-') // \--
+      {
+        out.addStr(&data[1],2);
+        return 3;
+      }
       out.addStr(&data[1],1);
       return 2;
     }
@@ -1133,8 +1145,8 @@ static int isLinkRef(const char *data,int size,
   while (i<size && data[i]==' ') i++;
   if (i<size && data[i]=='\n')
   {
-    i++;
     eol=i;
+    i++;
     while (i<size && data[i]==' ') i++;
   }
   if (i>=size) 
@@ -1152,6 +1164,7 @@ static int isLinkRef(const char *data,int size,
     int titleStart=i;
     // search for end of the line
     while (i<size && data[i]!='\n') i++;
+    eol = i;
 
     // search back to matching character
     int end=i-1;
@@ -1166,8 +1179,7 @@ static int isLinkRef(const char *data,int size,
   //printf("end of isLinkRef: i=%d size=%d data[i]='%c' eol=%d\n",
   //    i,size,data[i],eol);
   if      (i>=size)       return i;    // end of buffer while ref id was found
-  else if (data[i]=='\n') return i+1;  // end of line while ref id was found
-  else if (eol)           return eol;  // no optional title found
+  else if (eol)           return eol;  // end of line while ref id was found
   return 0;                            // invalid link ref
 }
 
@@ -1467,7 +1479,7 @@ int findTableColumns(const char *data,int size,int &start,int &end,int &columns)
   eol=i+1;
   i--;
   while (i>0 && data[i]==' ') i--;
-  if (i>0 && data[i]=='|') i--,n++; // trailing | does not count
+  if (i>0 && data[i-1]!='\\' && data[i]=='|') i--,n++; // trailing or escaped | does not count
   end = i;
 
   // count columns between start and end
@@ -1690,12 +1702,27 @@ void writeOneLineHeaderOrRuler(GrowBuf &out,const char *data,int size)
       out.addStr(" ");
       out.addStr(header);
       out.addStr("\n");
-      SectionInfo *si = new SectionInfo(g_fileName,id,header,type,level);
-      if (g_current)
+      SectionInfo *si = Doxygen::sectionDict->find(header);
+      if (si)
       {
-        g_current->anchors->append(si);
+        if (si->lineNr != -1)
+        {
+          warn(g_fileName,g_lineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",header.data(),si->fileName.data(),si->lineNr);
+        }
+        else
+        {
+          warn(g_fileName,g_lineNr,"multiple use of section label '%s', (first occurrence: %s)",header.data(),si->fileName.data());
+        }
+      }
+      else
+      {
+        si = new SectionInfo(g_fileName,g_lineNr,id,header,type,level);
+        if (g_current)
+        {
+          g_current->anchors->append(si);
+        }
+        Doxygen::sectionDict->append(header,si);
       }
-      Doxygen::sectionDict->append(header,si);
     }
     else
     {
@@ -1725,7 +1752,7 @@ static int writeBlockQuote(GrowBuf &out,const char *data,int size)
   {
     // find end of this line
     end=i+1;
-    while (end<size && data[end-1]!='\n') end++;
+    while (end<=size && data[end-1]!='\n') end++;
     int j=i;
     int level=0;
     int indent=i;
@@ -1753,7 +1780,7 @@ static int writeBlockQuote(GrowBuf &out,const char *data,int size)
     {
       for (l=level;l<curLevel;l++)
       {
-        out.addStr("\n</blockquote>\n");
+        out.addStr("</blockquote>\n");
       }
     }
     curLevel=level;
@@ -1766,7 +1793,7 @@ static int writeBlockQuote(GrowBuf &out,const char *data,int size)
   // end of comment within blockquote => add end markers
   for (l=0;l<curLevel;l++)
   {
-    out.addStr("\n</blockquote>\n");
+    out.addStr("</blockquote>\n");
   }
   return i;
 }
@@ -1781,7 +1808,7 @@ static int writeCodeBlock(GrowBuf &out,const char *data,int size,int refIndent)
   {
     // find end of this line
     end=i+1;
-    while (end<size && data[end-1]!='\n') end++;
+    while (end<=size && data[end-1]!='\n') end++;
     int j=i;
     int indent=0;
     while (j<end && data[j]==' ') j++,indent++;
@@ -1828,7 +1855,7 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size,
   // find end of the line
   int nb=0;
   end=i+1;
-  while (end<size && data[end-1]!='\n')
+  while (end<=size && data[end-1]!='\n')
   {
     // while looking for the end of the line we might encounter a block
     // that needs to be passed unprocessed.
@@ -1892,12 +1919,12 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size,
     }
     else if (nb==0 && data[end-1]=='`') 
     {
-      while (end<size && data[end-1]=='`') end++,nb++;
+      while (end<=size && data[end-1]=='`') end++,nb++;
     }
     else if (nb>0 && data[end-1]=='`')
     {
       int enb=0;
-      while (end<size && data[end-1]=='`') end++,enb++;
+      while (end<=size && data[end-1]=='`') end++,enb++;
       if (enb==nb) nb=0;
     }
     else
@@ -1908,12 +1935,29 @@ static void findEndOfLine(GrowBuf &out,const char *data,int size,
   //printf("findEndOfLine pi=%d i=%d end=%d {%s}\n",pi,i,end,QCString(data+i).left(end-i).data());
 }
 
+static void writeFencedCodeBlock(GrowBuf &out,const char *data,const char *lng,
+                int blockStart,int blockEnd)
+{
+  QCString lang = lng;
+  if (!lang.isEmpty() && lang.at(0)=='.') lang=lang.mid(1);
+  out.addStr("@code");
+  if (!lang.isEmpty())
+  {
+    out.addStr("{"+lang+"}");
+  }
+  out.addStr(data+blockStart,blockEnd-blockStart);
+  out.addStr("\n");
+  out.addStr("@endcode");
+}
+
 static QCString processQuotations(const QCString &s,int refIndent)
 {
   GrowBuf out;
   const char *data = s.data();
   int size = s.length();
   int i=0,end=0,pi=-1;
+  int blockStart,blockEnd,blockOffset;
+  QCString lang;
   while (i<size)
   {
     findEndOfLine(out,data,size,pi,i,end);
@@ -1921,7 +1965,15 @@ static QCString processQuotations(const QCString &s,int refIndent)
 
     if (pi!=-1)
     {
-      if (isBlockQuote(data+pi,i-pi,refIndent))
+      if (isFencedCodeBlock(data+pi,size-pi,refIndent,lang,blockStart,blockEnd,blockOffset))
+      {
+        writeFencedCodeBlock(out,data+pi,lang,blockStart,blockEnd);
+        i=pi+blockOffset;
+        pi=-1;
+        end=i+1;
+        continue;
+      }
+      else if (isBlockQuote(data+pi,i-pi,refIndent))
       {
         i = pi+writeBlockQuote(out,data+pi,size-pi);
         pi=-1;
@@ -1968,7 +2020,7 @@ static QCString processBlocks(const QCString &s,int indent)
   // get indent for the first line
   end = i+1;
   int sp=0;
-  while (end<size && data[end-1]!='\n') 
+  while (end<=size && data[end-1]!='\n') 
   {
     if (data[end-1]==' ') sp++;
     end++;
@@ -2020,13 +2072,28 @@ static QCString processBlocks(const QCString &s,int indent)
             out.addStr(" ");
             out.addStr(header);
             out.addStr("\n\n");
-            SectionInfo *si = new SectionInfo(g_fileName,id,header,
-                level==1 ? SectionInfo::Section : SectionInfo::Subsection,level);
-            if (g_current)
+            SectionInfo *si = Doxygen::sectionDict->find(header);
+            if (si)
             {
-              g_current->anchors->append(si);
+              if (si->lineNr != -1)
+              {
+                warn(g_fileName,g_lineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",header.data(),si->fileName.data(),si->lineNr);
+              }
+              else
+              {
+                warn(g_fileName,g_lineNr,"multiple use of section label '%s', (first occurrence: %s)",header.data(),si->fileName.data());
+              }
+            }
+            else
+            {
+              si = new SectionInfo(g_fileName,g_lineNr,id,header,
+                      level==1 ? SectionInfo::Section : SectionInfo::Subsection,level);
+              if (g_current)
+              {
+                g_current->anchors->append(si);
+              }
+              Doxygen::sectionDict->append(header,si);
             }
-            Doxygen::sectionDict->append(header,si);
           }
           else
           {
@@ -2057,15 +2124,7 @@ static QCString processBlocks(const QCString &s,int indent)
       {
         //printf("Found FencedCodeBlock lang='%s' start=%d end=%d code={%s}\n",
         //       lang.data(),blockStart,blockEnd,QCString(data+pi+blockStart).left(blockEnd-blockStart).data());
-        if (!lang.isEmpty() && lang.at(0)=='.') lang=lang.mid(1);
-        out.addStr("@code");
-        if (!lang.isEmpty())
-        {
-          out.addStr("{"+lang+"}");
-        }
-        out.addStr(data+pi+blockStart,blockEnd-blockStart);       
-        out.addStr("\n");
-        out.addStr("@endcode");
+        writeFencedCodeBlock(out,data+pi,lang,blockStart,blockEnd);
         i=pi+blockOffset;
         pi=-1;
         end=i+1;
@@ -2101,7 +2160,7 @@ static QCString processBlocks(const QCString &s,int indent)
     {
       //printf("found link ref: id='%s' link='%s' title='%s'\n",
       //    id.data(),link.data(),title.data());
-      g_linkRefs.insert(id,new LinkRef(link,title));
+      g_linkRefs.insert(id.lower(),new LinkRef(link,title));
     }
     else
     {
@@ -2152,7 +2211,6 @@ static QCString extractPageTitle(QCString &docs,QCString &id)
   {
     docs=docs.mid(end1);
   }
-  id = extractTitleId(title);
   //printf("extractPageTitle(title='%s' docs='%s' id='%s')\n",title.data(),docs.data(),id.data());
   return title;
 }
@@ -2214,7 +2272,7 @@ static QCString detab(const QCString &s,int &refIndent)
 
 //---------------------------------------------------------------------------
 
-QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &input)
+QCString processMarkdown(const QCString &fileName,const int lineNr,Entry *e,const QCString &input)
 {
   static bool init=FALSE;
   if (!init)
@@ -2237,6 +2295,7 @@ QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &input
   g_linkRefs.clear();
   g_current = e;
   g_fileName = fileName;
+  g_lineNr   = lineNr;
   static GrowBuf out;
   if (input.isEmpty()) return input;
   out.clear();
@@ -2279,14 +2338,7 @@ void MarkdownFileParser::parseInput(const char *fileName,
   current->fileName = fileName;
   current->docFile  = fileName;
   current->docLine  = 1;
-  int len = qstrlen(fileBuf);
-  BufStr input(len);
-  BufStr output(len);
-  input.addArray(fileBuf,qstrlen(fileBuf));
-  input.addChar('\0');
-  convertCppComments(&input,&output,fileName);
-  output.addChar('\0');
-  QCString docs = output.data();
+  QCString docs = fileBuf;
   QCString id;
   QCString title=extractPageTitle(docs,id).stripWhiteSpace();
   QCString titleFn = QFileInfo(fileName).baseName().utf8();
index d3a845e..5e35259 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -22,7 +22,7 @@
 class Entry;
 
 /** processes string \a s and converts markdown into doxygen/html commands. */
-QCString processMarkdown(const QCString &fileName,Entry *e,const QCString &s);
+QCString processMarkdown(const QCString &fileName,const int lineNr,Entry *e,const QCString &s);
 QCString markdownFileNameToId(const QCString &fileName);
 
 class MarkdownFileParser : public ParserInterface
index a6b3e75..04f426d 100644 (file)
@@ -139,6 +139,7 @@ void marshalSectionInfoList(StorageIntf *s, QList<SectionInfo> *anchors)
       marshalQCString(s,si->ref);
       marshalInt(s,(int)si->type);
       marshalQCString(s,si->fileName);
+      marshalInt(s,si->lineNr);
       marshalInt(s,si->level);
     }
   }
@@ -546,8 +547,9 @@ QList<SectionInfo> *unmarshalSectionInfoList(StorageIntf *s)
     QCString ref   = unmarshalQCString(s);
     SectionInfo::SectionType type = (SectionInfo::SectionType)unmarshalInt(s);
     QCString fileName = unmarshalQCString(s);
+    int lineNr = unmarshalInt(s);
     int level = unmarshalInt(s);
-    result->append(new SectionInfo(fileName,label,title,type,level,ref));
+    result->append(new SectionInfo(fileName,lineNr,label,title,type,level,ref));
   }
   return result;
 }
index 977a89b..0c61276 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 4d7ea9f..a1b23e8 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -133,13 +133,14 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
   if (md->getLanguage()==SrcLangExt_Tcl)
   {
     if (defArgList->count()==0) return FALSE;
-    Argument *a=defArgList->first();
+    ArgumentListIterator ali(*defArgList);
+    Argument *a;
     ol.endMemberDocName();
     ol.startParameterList(FALSE);
     ol.startParameterType(TRUE,0);
     ol.endParameterType();
     ol.startParameterName(FALSE);
-    while (a)
+    for (;(a=ali.current());++ali)
     {
       if (a->defval.isEmpty())
       {
@@ -149,7 +150,6 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
       {
         ol.docify("?"+a->name+"? ");
       }
-      a=defArgList->next();
     }
     ol.endParameterName(TRUE,FALSE,FALSE);
     return TRUE;
@@ -181,7 +181,6 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
   ol.popGeneratorState();
   //printf("===> name=%s isDefine=%d\n",md->name().data(),md->isDefine());
 
-  Argument *a=defArgList->first();
   QCString cName;
   if (cd)
   {
@@ -208,6 +207,8 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
   bool first=TRUE;
   bool paramTypeStarted=FALSE;
   bool isDefine = md->isDefine();
+  ArgumentListIterator ali(*defArgList);
+  Argument *a=ali.current();
   while (a)
   {
     if (isDefine || first)
@@ -302,7 +303,8 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
       ol.endTypewriter();
 
     }
-    a=defArgList->next();
+    ++ali;
+    a=ali.current();
     if (a)
     {
       if (!md->isObjCMethod()) ol.docify(", "); // there are more arguments
@@ -432,7 +434,8 @@ static void writeExceptionList(OutputList &ol, ClassDef *cd, MemberDef *md)
 static void writeTemplatePrefix(OutputList &ol,ArgumentList *al)
 {
   ol.docify("template<");
-  Argument *a=al->first();
+  ArgumentListIterator ali(*al);
+  Argument *a = ali.current();
   while (a)
   {
     ol.docify(a->type);
@@ -443,7 +446,8 @@ static void writeTemplatePrefix(OutputList &ol,ArgumentList *al)
       ol.docify(" = ");
       ol.docify(a->defval);
     }
-    a=al->next();
+    ++ali;
+    a=ali.current();
     if (a) ol.docify(", ");
   }
   ol.docify("> ");
@@ -975,7 +979,7 @@ QCString MemberDef::getOutputFileBase() const
       );
     return "dummy";
   }
-  else if (separateMemberPages)
+  else if (separateMemberPages && isDetailedSectionLinkable())
   {
     if (getEnumScope()) // enum value, which is part of enum's documentation
     {
@@ -1348,7 +1352,7 @@ bool MemberDef::isBriefSectionVisible() const
   bool visibleIfNotDefaultCDTor = !(cOrDTor &&
                                    m_impl->defArgList &&
                                    (m_impl->defArgList->isEmpty() ||
-                                    m_impl->defArgList->first()->type == "void"
+                                    m_impl->defArgList->getFirst()->type == "void"
                                    ) &&
                                    !hasDocs
                                   );
@@ -1414,6 +1418,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
   if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
 
   _writeTagData(compoundType);
+  _addToSearchIndex();
 
   QCString cname  = d->name();
   QCString cdname = d->displayName();
@@ -1568,7 +1573,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
                );
   }
   bool htmlOn = ol.isEnabled(OutputGenerator::Html);
-  if (htmlOn && /*Config_getBool("HTML_ALIGN_MEMBERS") &&*/ !ltype.isEmpty())
+  if (htmlOn && !ltype.isEmpty())
   {
     ol.disable(OutputGenerator::Html);
   }
@@ -1787,11 +1792,12 @@ void MemberDef::writeDeclaration(OutputList &ol,
       ol.writeDoc(rootNode,getOuterScope()?getOuterScope():d,this);
       if (detailsVisible)
       {
+        static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
         ol.pushGeneratorState();
         ol.disableAllBut(OutputGenerator::Html);
         //ol.endEmphasis();
         ol.docify(" ");
-        if (m_impl->group!=0 && gd==0) // forward link to the group
+        if (separateMemberPages || (m_impl->group!=0 && gd==0)) // forward link to the page or group
         {
           ol.startTextLink(getOutputFileBase(),anchor());
         }
@@ -1895,7 +1901,7 @@ bool MemberDef::isDetailedSectionVisible(bool inGroup,bool inFile) const
   static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
   bool groupFilter = getGroupDef()==0 || inGroup || separateMemPages;
   bool fileFilter  = getNamespaceDef()==0 || !inFile;
-  bool simpleFilter = !hideUndocMembers && inlineSimpleStructs &&
+  bool simpleFilter = (hasBriefDescription() || !hideUndocMembers) && inlineSimpleStructs &&
                       getClassDef()!=0 && getClassDef()->isSimple();
 
   bool visible = isDetailedSectionLinkable() && groupFilter && fileFilter &&
@@ -2286,8 +2292,9 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container,
     //printf("** %s: enum values=%d\n",name().data(),fmdl!=0 ? fmdl->count() : 0);
     if (fmdl)
     {
-      MemberDef *fmd=fmdl->first();
-      while (fmd)
+      MemberListIterator it(*fmdl);
+      MemberDef *fmd;
+      for (;(fmd=it.current());++it)
       {
         //printf("Enum %p: isLinkable()=%d\n",fmd,fmd->isLinkable());
         if (fmd->isLinkable())
@@ -2312,7 +2319,7 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container,
           Doxygen::indexList->addIndexItem(container,fmd);
 
           //ol.writeListItem();
-          ol.startDescTableTitle(); // this enables emphasis!
+          ol.startDescTableTitle();
           ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name(),fmd->argsString());
           first=FALSE;
           //ol.startEmphasis();
@@ -2349,7 +2356,6 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container,
           }
           ol.endDescTableData();
         }
-        fmd=fmdl->next();
       }
     }
     if (!first)
@@ -2696,6 +2702,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
         if (sp!=-1)
         {
           ldef=ldef.left(sp+1)+ldef.mid(ep+2);
+        } else {
+          ldef=ldef.mid(ep+2);
         }
       }
       // strip keywords
@@ -3036,6 +3044,18 @@ static Definition *getClassFromType(Definition *scope,const QCString &type,SrcLa
 }
 #endif
 
+QCString MemberDef::fieldType() const
+{
+  QCString type = m_impl->accessorType;
+  if (type.isEmpty())
+  {
+    type = m_impl->type;
+  }
+
+  if (isTypedef()) type.prepend("typedef ");
+  return simplifyTypeForTable(type);
+}
+
 void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
 {
   Definition *scope  = getOuterScope();
@@ -3056,15 +3076,7 @@ void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
   ol.startInlineMemberType();
   ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
 
-  QCString type = m_impl->accessorType;
-  if (type.isEmpty())
-  {
-    type = m_impl->type;
-  }
-
-  if (isTypedef()) type.prepend("typedef ");
-
-  QCString ts = simplifyTypeForTable(type);
+  QCString ts = fieldType();
 
   if (cd) // cd points to an anonymous struct pointed to by this member
           // so we add a link to it from the type column.
@@ -3599,7 +3611,6 @@ void MemberDef::_writeTagData(const DefType compoundType)
     }
     writeDocAnchorsToTagFile();
     Doxygen::tagFile << "    </member>" << endl;
-    _addToSearchIndex();
   }
   m_impl->tagDataWritten |= typeMask;
 }
@@ -3709,11 +3720,11 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
   uint numVisibleEnumValues=0;
   if (fmdl)
   {
-    MemberDef *fmd=fmdl->first();
-    while (fmd)
+    MemberListIterator mli(*fmdl);
+    MemberDef *fmd;
+    for (mli.toFirst();(fmd=mli.current());++mli)
     {
       if (fmd->isBriefSectionVisible()) numVisibleEnumValues++;
-      fmd=fmdl->next();
     }
   }
   if (numVisibleEnumValues==0 && !isBriefSectionVisible())
@@ -3729,6 +3740,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
     if (isLinkableInProject() || hasDocumentedEnumValues())
     {
       _writeTagData(compoundType);
+      _addToSearchIndex();
       writeLink(typeDecl,cd,nd,fd,gd);
     }
     else
@@ -3753,7 +3765,8 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
     typeDecl.docify("{ ");
     if (fmdl)
     {
-      MemberDef *fmd=fmdl->first();
+      MemberListIterator mli(*fmdl);
+      MemberDef *fmd=mli.current();
       bool fmdVisible = fmd->isBriefSectionVisible();
       while (fmd)
       {
@@ -3776,6 +3789,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
           if (fmd->hasDocumentation()) // enum value has docs
           {
             fmd->_writeTagData(compoundType);
+            fmd->_addToSearchIndex();
             fmd->writeLink(typeDecl,cd,nd,fd,gd);
           }
           else // no docs for this enum value
@@ -3793,7 +3807,8 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
         }
 
         bool prevVisible = fmdVisible;
-        fmd=fmdl->next();
+        ++mli;
+        fmd=mli.current();
         if (fmd && (fmdVisible=fmd->isBriefSectionVisible()))
         {
           typeDecl.writeString(", ");
@@ -3855,6 +3870,11 @@ void MemberDef::setAccessorType(ClassDef *cd,const char *t)
   m_impl->accessorType = t;
 }
 
+ClassDef *MemberDef::accessorClass() const
+{
+  return m_impl->accessorClass;
+}
+
 void MemberDef::findSectionsInDocumentation()
 {
   docFindSections(documentation(),this,0,docFile());
index 47912b8..3259102 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -81,6 +81,7 @@ class MemberDef : public Definition
     ClassDef *getClassDef() const;
     FileDef  *getFileDef() const;
     NamespaceDef* getNamespaceDef() const;
+    ClassDef *accessorClass() const;
 
     // grabbing the property read/write accessor names
     const char *getReadAccessor() const;
@@ -251,7 +252,7 @@ class MemberDef : public Definition
     // overrules
     QCString documentation() const;
     QCString briefDescription(bool abbr=FALSE) const;
-
+    QCString fieldType() const;
 
 
     //-----------------------------------------------------------------------------------
index 2df4a89..84567e2 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -75,7 +75,7 @@ void MemberGroup::insertMember(MemberDef *md)
   //       md->getSectionList(m_parent),
   //       md,md->name().data());
 
-  MemberDef *firstMd = memberList->first();
+  MemberDef *firstMd = memberList->getFirst();
   if (inSameSection && memberList->count()>0 && 
       firstMd->getSectionList(m_parent)!=md->getSectionList(m_parent))
   {
@@ -215,8 +215,9 @@ int MemberGroup::countInheritableMembers(ClassDef *inheritedFrom) const
 void MemberGroup::distributeMemberGroupDocumentation()
 {
   //printf("MemberGroup::distributeMemberGroupDocumentation() %s\n",grpHeader.data());
-  MemberDef *md=memberList->first();
-  while (md)
+  MemberListIterator li(*memberList);
+  MemberDef *md;
+  for (li.toFirst();(md=li.current());++li)
   {
     //printf("checking md=%s\n",md->name().data());
     // find the first member of the group with documentation
@@ -228,16 +229,15 @@ void MemberGroup::distributeMemberGroupDocumentation()
       //printf("found it!\n");
       break;
     }
-    md=memberList->next();
   }
   if (md) // distribute docs of md to other members of the list
   {
     //printf("Member %s has documentation!\n",md->name().data());
-    MemberDef *omd=memberList->first();
-    while (omd)
+    MemberDef *omd;
+    for (li.toFirst();(omd=li.current());++li)
     {
-      if (md!=omd && omd->documentation().isEmpty() && 
-                     omd->briefDescription().isEmpty() && 
+      if (md!=omd && omd->documentation().isEmpty() &&
+                     omd->briefDescription().isEmpty() &&
                      omd->inbodyDocumentation().isEmpty()
          )
       {
@@ -246,7 +246,6 @@ void MemberGroup::distributeMemberGroupDocumentation()
         omd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
         omd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
       }
-      omd=memberList->next();
     }
   }
 }
index c5a2d0c..42e60c5 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van 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,9 +125,10 @@ class MemberGroupSDict : public SIntDict<MemberGroup>
   public:
     MemberGroupSDict(int size=17) : SIntDict<MemberGroup>(size) {}
    ~MemberGroupSDict() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+ private:
+    int compareValues(const MemberGroup *item1,const MemberGroup *item2) const
     {
-      return ((MemberGroup *)item1)->groupId() - ((MemberGroup*)item2)->groupId();
+      return item1->groupId() - item2->groupId();
     }
 };
 
index 101293a..28ed37e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van 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,11 +55,9 @@ MemberList::~MemberList()
   delete memberGroupList;
 }
 
-int MemberList::compareItems(QCollection::Item item1, QCollection::Item item2)
+int MemberList::compareValues(const MemberDef *c1, const MemberDef *c2) const
 {
   static bool sortConstructorsFirst = Config_getBool("SORT_MEMBERS_CTORS_1ST");
-  MemberDef *c1=(MemberDef *)item1;
-  MemberDef *c2=(MemberDef *)item2;
   if (sortConstructorsFirst) {
     int ord1 = c1->isConstructor() ? 2 : (c1->isDestructor() ? 1 : 0);
     int ord2 = c2->isConstructor() ? 2 : (c2->isDestructor() ? 1 : 0);
@@ -381,9 +379,18 @@ void MemberList::writePlainDeclarations(OutputList &ol,
               }
               ol.startMemberDeclaration();
               ol.startMemberItem(md->anchor(),0,inheritId);
+              bool detailsLinkable = md->isDetailedSectionLinkable();
+              if (!detailsLinkable)
+              {
+                ol.startDoxyAnchor(md->getOutputFileBase(),0,md->anchor(),md->name(),QCString());
+              }
               ol.writeString("enum ");
               ol.insertMemberAlign();
               md->writeEnumDeclaration(ol,cd,nd,fd,gd,compoundType);
+              if (!detailsLinkable)
+              {
+                ol.endDoxyAnchor(md->getOutputFileBase(),md->anchor());
+              }
               ol.endMemberItem();
               if (!md->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
               {
@@ -696,52 +703,53 @@ void MemberList::writeDocumentationPage(OutputList &ol,
   MemberDef *md;
   for ( ; (md=mli.current()) ; ++mli)
   {
-    QCString diskName=md->getOutputFileBase();
-    QCString title=md->qualifiedName();
-    startFile(ol,diskName,md->name(),title,HLI_None,!generateTreeView,
-              container->getOutputFileBase());
-    if (!generateTreeView)
+    if (md->isDetailedSectionLinkable())
     {
-      container->writeNavigationPath(ol);
-      ol.endQuickIndices();
-    }
-    ol.startContents();
-
+      QCString diskName=md->getOutputFileBase();
+      QCString title=md->qualifiedName();
+      startFile(ol,diskName,md->name(),title,HLI_None,!generateTreeView,diskName);
+      if (!generateTreeView)
+      {
+        container->writeNavigationPath(ol);
+        ol.endQuickIndices();
+      }
+      ol.startContents();
 
-    if (generateTreeView)
-    {
-      md->writeDocumentation(this,ol,scopeName,container,m_inGroup);
-      ol.endContents();
-      endFileWithNavPath(container,ol);
-    }
-    else
-    {
-      ol.writeString("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n"
-          "  <tr>\n"
-          "   <td valign=\"top\">\n");
+      if (generateTreeView)
+      {
+        md->writeDocumentation(this,ol,scopeName,container,m_inGroup);
+        ol.endContents();
+        endFileWithNavPath(container,ol);
+      }
+      else
+      {
+        ol.writeString("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n"
+            "  <tr>\n"
+            "   <td valign=\"top\">\n");
 
-      container->writeQuickMemberLinks(ol,md);
+        container->writeQuickMemberLinks(ol,md);
 
-      ol.writeString("   </td>\n");
-      ol.writeString("   <td valign=\"top\" class=\"mempage\">\n");
+        ol.writeString("   </td>\n");
+        ol.writeString("   <td valign=\"top\" class=\"mempage\">\n");
 
-      md->writeDocumentation(this,ol,scopeName,container,m_inGroup);
+        md->writeDocumentation(this,ol,scopeName,container,m_inGroup);
 
-      ol.writeString("    </td>\n");
-      ol.writeString("  </tr>\n");
-      ol.writeString("</table>\n");
+        ol.writeString("    </td>\n");
+        ol.writeString("  </tr>\n");
+        ol.writeString("</table>\n");
 
-      endFile(ol);
+        endFile(ol);
+      }
     }
-  }
-  if (memberGroupList)
-  {
-    //printf("MemberList::writeDocumentation()  --  member groups\n");
-    MemberGroupListIterator mgli(*memberGroupList);
-    MemberGroup *mg;
-    for (;(mg=mgli.current());++mgli)
+    if (memberGroupList)
     {
-      mg->writeDocumentationPage(ol,scopeName,container);
+      //printf("MemberList::writeDocumentation()  --  member groups\n");
+      MemberGroupListIterator mgli(*memberGroupList);
+      MemberGroup *mg;
+      for (;(mg=mgli.current());++mgli)
+      {
+        mg->writeDocumentationPage(ol,scopeName,container);
+      }
     }
   }
 }
@@ -938,15 +946,9 @@ QCString MemberList::listTypeAsString(MemberListType type)
 
 //--------------------------------------------------------------------------
 
-int MemberSDict::compareItems(QCollection::Item item1, QCollection::Item item2)
+int MemberSDict::compareValues(const MemberDef *c1, const MemberDef *c2) const
 {
-  // NOTE: this function can be triggered from unmarshalMemberSDict
-  // so it may not result in called to MemberDef::makeResident().
-  // As a result, the data returned by MemberDef::name() and 
-  // MemberDef::getDefLine() will always be kept in memory.
-  MemberDef *c1=(MemberDef *)item1;
-  MemberDef *c2=(MemberDef *)item2;
-  //printf("MemberSDict::compareItems(%s,%s)\n",c1->name().data(),c2->name().data());
+  //printf("MemberSDict::compareValues(%s,%s)\n",c1->name().data(),c2->name().data());
   int cmp = qstricmp(c1->name(),c2->name());
   if (cmp)
   {
index 9dfa104..607eb01 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van 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,6 @@ class MemberList : public QList<MemberDef>
     bool insert(uint index,const MemberDef *md);
     void inSort(const MemberDef *md);
     void append(const MemberDef *md);
-    int compareItems(QCollection::Item item1,QCollection::Item item2);
     int varCount() const       { ASSERT(m_numDecMembers!=-1); return m_varCnt;     }
     int funcCount() const      { ASSERT(m_numDecMembers!=-1); return m_funcCnt;    }
     int enumCount() const      { ASSERT(m_numDecMembers!=-1); return m_enumCnt;    }
@@ -82,6 +81,7 @@ class MemberList : public QList<MemberDef>
     void unmarshal(StorageIntf *s);
 
   private:
+    int compareValues(const MemberDef *item1,const MemberDef *item2) const;
     int m_varCnt;
     int m_funcCnt;
     int m_enumCnt;
@@ -121,7 +121,8 @@ class MemberSDict : public SDict<MemberDef>
   public:
     MemberSDict(int size=17) : SDict<MemberDef>(size) {}
     virtual ~MemberSDict() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2);
+  private:
+    int compareValues(const MemberDef *item1,const MemberDef *item2) const;
 };
 
 
index 58eaf8c..a2f7296 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -30,10 +30,8 @@ MemberName::~MemberName()
 {
 }
 
-int MemberName::compareItems(QCollection::Item item1, QCollection::Item item2)
+int MemberName::compareValues(const MemberDef *m1, const MemberDef *m2) const
 {
-  MemberDef *m1=(MemberDef *)item1;
-  MemberDef *m2=(MemberDef *)item2;
   ClassDef *c1=m1->getClassDef();
   ClassDef *c2=m2->getClassDef();
   FileDef  *f1=m1->getFileDef();
@@ -52,10 +50,8 @@ MemberNameInfo::MemberNameInfo(const char *n) : QList<MemberInfo>()
   setAutoDelete(TRUE);
 }
 
-int MemberNameInfo::compareItems(QCollection::Item item1, QCollection::Item item2)
+int MemberNameInfo::compareValues(const MemberInfo *m1,const MemberInfo *m2) const
 {
-  MemberInfo *m1=(MemberInfo *)item1;
-  MemberInfo *m2=(MemberInfo *)item2;
   ClassDef *c1=m1->memberDef->getClassDef();
   ClassDef *c2=m2->memberDef->getClassDef();
   FileDef  *f1=m1->memberDef->getFileDef();
@@ -72,12 +68,10 @@ MemberNameIterator::MemberNameIterator(const MemberName &mnlist) :
 {
 }
 
-int MemberNameSDict::compareItems(QCollection::Item item1, QCollection::Item item2)
+int MemberNameSDict::compareValues(const MemberName *n1,const MemberName *n2) const
 {
-  MemberName *n1=(MemberName *)item1;
-  MemberName *n2=(MemberName *)item2;
   return qstricmp(n1->memberName()+getPrefixIndex(n1->memberName()),
-                 n2->memberName()+getPrefixIndex(n2->memberName())
-                );
+                  n2->memberName()+getPrefixIndex(n2->memberName())
+                 );
 }
 
index 0004aea..7a2fdc5 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 
 /** Class representing all MemberDef objects with the same name */
 class MemberName : public QList<MemberDef>
-{ 
+{
   public:
     MemberName(const char *name);
    ~MemberName();
     const char *memberName() const { return name; }
-   
-    int compareItems(QCollection::Item item1,QCollection::Item item2);
+
   private:
+    int compareValues(const MemberDef *item1,const MemberDef *item2) const;
     QCString name;
 };
 
@@ -49,7 +49,8 @@ class MemberNameSDict : public SDict<MemberName>
     MemberNameSDict(int size) : SDict<MemberName>(size) {}
    ~MemberNameSDict() {}
 
-   int compareItems(QCollection::Item item1,QCollection::Item item2);
+  private:
+   int compareValues(const MemberName *item1,const MemberName *item2) const;
 };
 
 /** Data associated with a MemberDef in an inheritance relation. */
@@ -74,8 +75,8 @@ class MemberNameInfo : public QList<MemberInfo>
     MemberNameInfo(const char *name);  
    ~MemberNameInfo() {}
     const char *memberName() const { return name; }
-    int compareItems(QCollection::Item item1,QCollection::Item item2);
   private:
+    int compareValues(const MemberInfo *item1,const MemberInfo *item2) const;
     QCString name;
 };
 
@@ -93,11 +94,10 @@ class MemberNameInfoSDict : public SDict<MemberNameInfo>
   public:
     MemberNameInfoSDict(int size) : SDict<MemberNameInfo>(size) {}
    ~MemberNameInfoSDict() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2) 
-    { return qstricmp(
-                    ((MemberNameInfo *)item1)->memberName(),
-                    ((MemberNameInfo *)item2)->memberName()
-                   );
+  private:
+    int compareValues(const MemberNameInfo *item1,const MemberNameInfo *item2) const
+    {
+      return qstricmp(item1->memberName(), item2->memberName());
     }
 };
 
index dd3549a..8e4ecbd 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -13,7 +13,6 @@
  *
  */
 
-#include <stdarg.h>
 #include <stdio.h>
 #include <qdatetime.h>
 #include "config.h"
@@ -22,6 +21,7 @@
 #include "doxygen.h"
 #include "portable.h"
 #include "filedef.h"
+#include "message.h"
 
 static QCString outputFormat;
 static const char *warning_str = "warning: ";
@@ -110,7 +110,7 @@ void msg(const char *fmt, ...)
     va_list args;
     va_start(args, fmt);
     vfprintf(stdout, fmt, args);
-    va_end(args); 
+    va_end(args);
   }
 }
 
@@ -172,6 +172,11 @@ void warn(const char *file,int line,const char *fmt, ...)
   va_end(args); 
 }
 
+void va_warn(const char *file,int line,const char *fmt,va_list args)
+{
+  do_warn("WARNINGS", file, line, warning_str, fmt, args);
+}
+
 void warn_simple(const char *file,int line,const char *text)
 {
   if (!Config_getBool("WARNINGS")) return; // warning type disabled
index b7bdfe4..481e8bf 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #define MESSAGE_H
 
 #include <stdio.h>
+#include <stdarg.h>
 
 extern void msg(const char *fmt, ...);
 extern void warn(const char *file,int line,const char *fmt, ...);
+extern void va_warn(const char *file,int line,const char *fmt, va_list args);
 extern void warn_simple(const char *file,int line,const char *text);
 extern void warn_undoc(const char *file,int line,const char *fmt, ...);
 extern void warn_doc_error(const char *file,int line,const char *fmt, ...);
index 3592e76..ebbba0f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 961f544..5d71ebd 100644 (file)
--- a/src/msc.h
+++ b/src/msc.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index d00d845..2aa5728 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -68,6 +68,10 @@ NamespaceDef::NamespaceDef(const char *df,int dl,int dc,
   {
     m_type = CONSTANT_GROUP;
   }
+  else if (type && !strcmp("library", type))
+  {
+    m_type = LIBRARY;
+  }
   else
   {
     m_type = NAMESPACE;
@@ -248,11 +252,17 @@ void NamespaceDef::computeAnchors()
   if (allMemberList) setAnchors(allMemberList);
 }
 
+bool NamespaceDef::hasDetailedDescription() const
+{
+  static bool repeatBrief = Config_getBool("REPEAT_BRIEF");
+  return ((!briefDescription().isEmpty() && repeatBrief) ||
+          !documentation().isEmpty());
+}
+
+
 void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title)
 {
-  if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || 
-      !documentation().isEmpty()
-     )
+  if (hasDetailedDescription())
   {
     ol.pushGeneratorState();
       ol.disable(OutputGenerator::Html);
@@ -280,6 +290,7 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title
         //ol.newParagraph(); // FIXME:PARA
         ol.enableAll();
         ol.disableAllBut(OutputGenerator::Man);
+        ol.enable(OutputGenerator::Latex);
         ol.writeString("\n\n");
       ol.popGeneratorState();
     }
@@ -293,7 +304,7 @@ void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title
 
 void NamespaceDef::writeBriefDescription(OutputList &ol)
 {
-  if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
+  if (hasBriefDescription())
   {
     DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
                         briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
@@ -306,9 +317,7 @@ void NamespaceDef::writeBriefDescription(OutputList &ol)
       ol.writeString(" \n");
       ol.enable(OutputGenerator::RTF);
 
-      if (Config_getBool("REPEAT_BRIEF") ||
-          !documentation().isEmpty()
-         )
+      if (hasDetailedDescription())
       {
         ol.disableAllBut(OutputGenerator::Html);
         ol.startTextLink(0,"details");
@@ -655,7 +664,7 @@ void NamespaceDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) co
     MemberDef *md;
     for (mli.toFirst();(md=mli.current());++mli)
     {
-      if (md->getNamespaceDef()==this && md->isLinkable())
+      if (md->getNamespaceDef()==this && md->isLinkable() && !md->isEnumValue())
       {
         ol.writeString("          <tr><td class=\"navtab\">");
         if (md->isLinkableInProject())
@@ -916,29 +925,9 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,
           continue; // will be output in another pass, see layout_default.xml
       ol.startMemberDeclaration();
       ol.startMemberItem(nd->getOutputFileBase(),0);
-      if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp)
-      {
-        ol.docify("package ");
-      }
-      else if (lang==SrcLangExt_Fortran)
-      {
-        ol.docify("module ");
-      }
-      else if (lang==SrcLangExt_IDL)
-      {
-        if (nd->isModule())
-        {
-          ol.docify("module ");
-        }
-        else if (nd->isConstantGroup())
-        {
-          ol.docify("constants");
-        }
-        else
-        {
-          err("Internal inconsistency: namespace in IDL not module or cg\n");
-        }
-      }
+      QCString ct = nd->compoundTypeString();
+      ol.docify(ct);
+      ol.docify(" ");
       ol.insertMemberAlign();
       QCString name;
       if (localName)
@@ -1007,11 +996,19 @@ void NamespaceDef::addMemberToList(MemberListType lt,MemberDef *md)
 
 void NamespaceDef::sortMemberLists()
 {
-  MemberList *ml = m_memberLists.first();
-  while (ml)
+  QListIterator<MemberList> mli(m_memberLists);
+  MemberList *ml;
+  for (mli.toFirst();(ml=mli.current());++mli)
   {
     if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
-    ml = m_memberLists.next();
+  }
+  if (classSDict)
+  {
+    classSDict->sort();
+  }
+  if (namespaceSDict)
+  {
+    namespaceSDict->sort();
   }
 }
 
@@ -1019,15 +1016,14 @@ void NamespaceDef::sortMemberLists()
 
 MemberList *NamespaceDef::getMemberList(MemberListType lt) const
 {
-  NamespaceDef *that = (NamespaceDef*)this;
-  MemberList *ml = that->m_memberLists.first();
-  while (ml)
+  QListIterator<MemberList> mli(m_memberLists);
+  MemberList *ml;
+  for (mli.toFirst();(ml=mli.current());++mli)
   {
     if (ml->listType()==lt)
     {
       return ml;
     }
-    ml = that->m_memberLists.next();
   }
   return 0;
 }
@@ -1103,3 +1099,37 @@ QCString NamespaceDef::title() const
   }
   return pageTitle;
 }
+
+QCString NamespaceDef::compoundTypeString() const
+{
+  SrcLangExt lang = getLanguage();
+  if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp)
+  {
+    return "package";
+  }
+  else if (lang==SrcLangExt_Fortran)
+  {
+    return "module";
+  }
+  else if (lang==SrcLangExt_IDL)
+  {
+    if (isModule())
+    {
+      return "module";
+    }
+    else if (isConstantGroup())
+    {
+      return "constants";
+    }
+    else if (isLibrary())
+    {
+      return "library";
+    }
+    else
+    {
+      err("Internal inconsistency: namespace in IDL not module, library or constant group\n");
+    }
+  }
+  return "";
+}
+
index 2037d23..4613480 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -68,9 +68,11 @@ class NamespaceDef : public Definition
 
     bool isConstantGroup() const { return CONSTANT_GROUP == m_type; }
     bool isModule()        const { return MODULE == m_type; }
+    bool isLibrary() const { return LIBRARY == m_type; }
 
     bool isLinkableInProject() const;
     bool isLinkable() const;
+    bool hasDetailedDescription() const;
     void addMembersToMemberGroup();
     void distributeMemberGroupDocumentation();
     void findSectionsInDocumentation();
@@ -94,6 +96,7 @@ class NamespaceDef : public Definition
     NamespaceSDict *getNamespaceSDict() const { return namespaceSDict; }
 
     QCString title() const;
+    QCString compoundTypeString() const;
 
     bool visited;
 
@@ -130,20 +133,18 @@ class NamespaceDef : public Definition
     ClassSDict           *classSDict;
     NamespaceSDict       *namespaceSDict;
     bool                  m_subGrouping;
-    enum { NAMESPACE, MODULE, CONSTANT_GROUP } m_type;
+    enum { NAMESPACE, MODULE, CONSTANT_GROUP, LIBRARY } m_type;
     bool m_isPublished;
 };
 
 /** A list of NamespaceDef objects. */
 class NamespaceList : public QList<NamespaceDef>
-{ 
+{
   public:
    ~NamespaceList() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+    int compareValues(const NamespaceDef *nd1,const NamespaceDef *nd2) const
     {
-      return qstricmp(((NamespaceDef *)item1)->name(),
-                    ((NamespaceDef *)item2)->name()
-                   );
+      return qstricmp(nd1->name(), nd2->name());
     }
 };
 
@@ -169,15 +170,14 @@ class NamespaceSDict : public SDict<NamespaceDef>
   public:
     NamespaceSDict(int size=17) : SDict<NamespaceDef>(size) {}
    ~NamespaceSDict() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
-    {
-      return qstricmp(((NamespaceDef *)item1)->name(),
-                    ((NamespaceDef *)item2)->name()
-                   );
-    }
     void writeDeclaration(OutputList &ol,const char *title,
             bool isConstantGroup=false, bool localName=FALSE);
     bool declVisible() const;
+  private:
+    int compareValues(const NamespaceDef *item1,const NamespaceDef *item2) const
+    {
+      return qstricmp(item1->name(),item2->name());
+    }
 };
 
 
index 1d739b2..3914be8 100644 (file)
@@ -1,5 +1,3 @@
-var SYNCONMSG = 'click to disable panel synchronisation';
-var SYNCOFFMSG = 'click to enable panel synchronisation';
 var navTreeSubIndices = new Array();
 
 function getData(varName)
@@ -22,6 +20,21 @@ function stripPath2(uri)
   return m ? uri.substring(i-6) : s;
 }
 
+function hashValue()
+{
+  return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,'');
+}
+
+function hashUrl()
+{
+  return '#'+hashValue();
+}
+
+function pathName()
+{
+  return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, '');
+}
+
 function localStorageSupported()
 {
   try {
@@ -44,7 +57,7 @@ function deleteLink()
 {
   if (localStorageSupported()) {
     window.localStorage.setItem('navpath','');
-  } 
+  }
 }
 
 function cachedLink()
@@ -116,11 +129,13 @@ var animationInProgress = false;
 function gotoAnchor(anchor,aname,updateLocation)
 {
   var pos, docContent = $('#doc-content');
-  if (anchor.parent().attr('class')=='memItemLeft' ||
-      anchor.parent().attr('class')=='fieldtype' ||
-      anchor.parent().is(':header')) 
+  var ancParent = $(anchor.parent());
+  if (ancParent.hasClass('memItemLeft') ||
+      ancParent.hasClass('fieldname') ||
+      ancParent.hasClass('fieldtype') ||
+      ancParent.is(':header'))
   {
-    pos = anchor.parent().position().top;
+    pos = ancParent.position().top;
   } else if (anchor.position()) {
     pos = anchor.position().top;
   }
@@ -178,7 +193,7 @@ function newNode(o, po, text, link, childrenData, lastNode)
     a.className = stripPath(link.replace('#',':'));
     if (link.indexOf('#')!=-1) {
       var aname = '#'+link.split('#')[1];
-      var srcPage = stripPath($(location).attr('pathname'));
+      var srcPage = stripPath(pathName());
       var targetPage = stripPath(link.split('#')[0]);
       a.href = srcPage!=targetPage ? url : "javascript:void(0)"; 
       a.onclick = function(){
@@ -272,14 +287,13 @@ function glowEffect(n,duration)
 
 function highlightAnchor()
 {
-  var aname = $(location).attr('hash');
+  var aname = hashUrl();
   var anchor = $(aname);
   if (anchor.parent().attr('class')=='memItemLeft'){
-    var rows = $('.memberdecls tr[class$="'+
-               window.location.hash.substring(1)+'"]');
+    var rows = $('.memberdecls tr[class$="'+hashValue()+'"]');
     glowEffect(rows.children(),300); // member without details
-  } else if (anchor.parents().slice(2).prop('tagName')=='TR') {
-    glowEffect(anchor.parents('div.memitem'),1000); // enum value
+  } else if (anchor.parent().attr('class')=='fieldname'){
+    glowEffect(anchor.parent().parent(),1000); // enum value
   } else if (anchor.parent().attr('class')=='fieldtype'){
     glowEffect(anchor.parent().parent(),1000); // struct field
   } else if (anchor.parent().is(":header")) {
@@ -294,7 +308,7 @@ function selectAndHighlight(hash,n)
 {
   var a;
   if (hash) {
-    var link=stripPath($(location).attr('pathname'))+':'+hash.substring(1);
+    var link=stripPath(pathName())+':'+hash.substring(1);
     a=$('.item a[class$="'+link+'"]');
   }
   if (a && a.length) {
@@ -405,14 +419,13 @@ function navTo(o,root,hash,relpath)
   if (link) {
     var parts = link.split('#');
     root = parts[0];
-    if (parts.length>1) hash = '#'+parts[1];
+    if (parts.length>1) hash = '#'+parts[1].replace(/[^\w\-]/g,'');
     else hash='';
   }
   if (hash.match(/^#l\d+$/)) {
     var anchor=$('a[name='+hash.substring(1)+']');
     glowEffect(anchor.parent(),1000); // line number
     hash=''; // strip line number anchors
-    //root=root.replace(/_source\./,'.'); // source link to doc link
   }
   var url=root+hash;
   var i=-1;
@@ -446,7 +459,7 @@ function toggleSyncButton(relpath)
   if (navSync.hasClass('sync')) {
     navSync.removeClass('sync');
     showSyncOff(navSync,relpath);
-    storeLink(stripPath2($(location).attr('pathname'))+$(location).attr('hash'));
+    storeLink(stripPath2(pathName())+hashUrl());
   } else {
     navSync.addClass('sync');
     showSyncOn(navSync,relpath);
@@ -486,7 +499,7 @@ function initNavTree(toroot,relpath)
   }
 
   $(window).load(function(){
-    navTo(o,toroot,window.location.hash,relpath);
+    navTo(o,toroot,hashUrl(),relpath);
     showRoot();
   });
 
@@ -494,21 +507,20 @@ function initNavTree(toroot,relpath)
      if (window.location.hash && window.location.hash.length>1){
        var a;
        if ($(location).attr('hash')){
-         var clslink=stripPath($(location).attr('pathname'))+':'+
-                               $(location).attr('hash').substring(1);
-         a=$('.item a[class$="'+clslink+'"]');
+         var clslink=stripPath(pathName())+':'+hashValue();
+         a=$('.item a[class$="'+clslink.replace(/</g,'\\3c ')+'"]');
        }
        if (a==null || !$(a).parent().parent().hasClass('selected')){
          $('.item').removeClass('selected');
          $('.item').removeAttr('id');
        }
-       var link=stripPath2($(location).attr('pathname'));
-       navTo(o,link,$(location).attr('hash'),relpath);
+       var link=stripPath2(pathName());
+       navTo(o,link,hashUrl(),relpath);
      } else if (!animationInProgress) {
        $('#doc-content').scrollTop(0);
        $('.item').removeClass('selected');
        $('.item').removeAttr('id');
-       navTo(o,toroot,window.location.hash,relpath);
+       navTo(o,toroot,hashUrl(),relpath);
      }
   })
 }
index 3a538a3..a59c67b 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index d93c1f6..6e6e95d 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 89686e0..ee9bc48 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 95c467d..aaf1ba7 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index f5df477..59c3efb 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 OutputList::OutputList(bool)
 {
   //printf("OutputList::OutputList()\n");
-  outputs = new QList<OutputGenerator>;
-  outputs->setAutoDelete(TRUE);
+  m_outputs.setAutoDelete(TRUE);
 }
 
 OutputList::~OutputList()
 {
   //printf("OutputList::~OutputList()\n");
-  delete outputs;
 }
 
 void OutputList::add(const OutputGenerator *og)
 {
-  if (og) outputs->append(og);
+  if (og) m_outputs.append(og);
 }
 
 void OutputList::disableAllBut(OutputGenerator::OutputType o)
 {
-  OutputGenerator *og=outputs->first();
-  while (og)
+  QListIterator<OutputGenerator> it(m_outputs);
+  OutputGenerator *og;
+  for (it.toFirst();(og=it.current());++it)
   {
     og->disableIfNot(o);
-    og=outputs->next();
   }
 }
 
 void OutputList::enableAll()
 {
-  OutputGenerator *og=outputs->first();
-  while (og)
+  QListIterator<OutputGenerator> it(m_outputs);
+  OutputGenerator *og;
+  for (it.toFirst();(og=it.current());++it)
   {
     og->enable();
-    og=outputs->next();
   }
 }
 
 void OutputList::disableAll()
 {
-  OutputGenerator *og=outputs->first();
-  while (og)
+  QListIterator<OutputGenerator> it(m_outputs);
+  OutputGenerator *og;
+  for (it.toFirst();(og=it.current());++it)
   {
     og->disable();
-    og=outputs->next();
   }
 }
 
 void OutputList::disable(OutputGenerator::OutputType o)
 {
-  OutputGenerator *og=outputs->first();
-  while (og)
+  QListIterator<OutputGenerator> it(m_outputs);
+  OutputGenerator *og;
+  for (it.toFirst();(og=it.current());++it)
   {
     og->disableIf(o);
-    og=outputs->next();
   }
 }
 
 void OutputList::enable(OutputGenerator::OutputType o)
 {
-  OutputGenerator *og=outputs->first();
-  while (og)
+  QListIterator<OutputGenerator> it(m_outputs);
+  OutputGenerator *og;
+  for (it.toFirst();(og=it.current());++it)
   {
     og->enableIf(o);
-    og=outputs->next();
   }
 }
 
 bool OutputList::isEnabled(OutputGenerator::OutputType o)
 {
   bool result=FALSE;
-  OutputGenerator *og=outputs->first();
-  while (og)
+  QListIterator<OutputGenerator> it(m_outputs);
+  OutputGenerator *og;
+  for (it.toFirst();(og=it.current());++it)
   {
     result=result || og->isEnabled(o);
-    og=outputs->next();
   }
   return result;
 }
 
 void OutputList::pushGeneratorState()
 {
-  OutputGenerator *og=outputs->first();
-  while (og)
+  QListIterator<OutputGenerator> it(m_outputs);
+  OutputGenerator *og;
+  for (it.toFirst();(og=it.current());++it)
   {
     og->pushGeneratorState();
-    og=outputs->next();
   }
 }
 
 void OutputList::popGeneratorState()
 {
-  OutputGenerator *og=outputs->first();
-  while (og)
+  QListIterator<OutputGenerator> it(m_outputs);
+  OutputGenerator *og;
+  for (it.toFirst();(og=it.current());++it)
   {
     og->popGeneratorState();
-    og=outputs->next();
   }
 }
 
@@ -138,12 +136,12 @@ bool OutputList::generateDoc(const char *fileName,int startLine,
 {
   int count=0;
   if (docStr.isEmpty()) return TRUE;
-  
-  OutputGenerator *og=outputs->first();
-  while (og)
+
+  QListIterator<OutputGenerator> it(m_outputs);
+  OutputGenerator *og;
+  for (it.toFirst();(og=it.current());++it)
   {
     if (og->isEnabled()) count++;
-    og=outputs->next();
   }
   if (count==0) return TRUE; // no output formats enabled.
 
@@ -163,13 +161,13 @@ bool OutputList::generateDoc(const char *fileName,int startLine,
 
 void OutputList::writeDoc(DocRoot *root,Definition *ctx,MemberDef *md)
 {
-  OutputGenerator *og=outputs->first();
-  while (og)
+  QListIterator<OutputGenerator> it(m_outputs);
+  OutputGenerator *og;
+  for (it.toFirst();(og=it.current());++it)
   {
     //printf("og->printDoc(extension=%s)\n",
     //    ctx?ctx->getDefFileExtension().data():"<null>");
     if (og->isEnabled()) og->writeDoc(root,ctx,md);
-    og=outputs->next();
   }
 
   VhdlDocGen::setFlowMember(0);
@@ -178,21 +176,19 @@ void OutputList::writeDoc(DocRoot *root,Definition *ctx,MemberDef *md)
 bool OutputList::parseText(const QCString &textStr)
 {
   int count=0;
-  OutputGenerator *og=outputs->first();
-  while (og)
+  QListIterator<OutputGenerator> it(m_outputs);
+  OutputGenerator *og;
+  for (it.toFirst();(og=it.current());++it)
   {
     if (og->isEnabled()) count++;
-    og=outputs->next();
   }
   if (count==0) return TRUE; // no output formats enabled.
 
   DocText *root = validatingParseText(textStr);
 
-  og=outputs->first();
-  while (og)
+  for (it.toFirst();(og=it.current());++it)
   {
     if (og->isEnabled()) og->writeDoc(root,0,0);
-    og=outputs->next();
   }
 
   bool isEmpty = root->isEmpty();
@@ -211,11 +207,11 @@ bool OutputList::parseText(const QCString &textStr)
 // zero arguments
 void OutputList::forall(void (OutputGenerator::*func)())
 {
-  OutputGenerator *og=outputs->first();
-  while (og)
+  QListIterator<OutputGenerator> it(m_outputs);
+  OutputGenerator *og;
+  for (it.toFirst();(og=it.current());++it)
   {
     if (og->isEnabled()) (og->*func)();
-    og=outputs->next();
   }
 }
 
@@ -223,98 +219,98 @@ void OutputList::forall(void (OutputGenerator::*func)())
 #define FORALL1(a1,p1)                                        \
 void OutputList::forall(void (OutputGenerator::*func)(a1),a1) \
 {                                                             \
-  OutputGenerator *og=outputs->first();                       \
-  while (og)                                                  \
+  QListIterator<OutputGenerator> it(m_outputs);               \
+  OutputGenerator *og;                                        \
+  for (it.toFirst();(og=it.current());++it)                   \
   {                                                           \
     if (og->isEnabled()) (og->*func)(p1);                     \
-    og=outputs->next();                                       \
   }                                                           \
-}                     
+}
 
 // two arguments
 #define FORALL2(a1,a2,p1,p2)                                        \
 void OutputList::forall(void (OutputGenerator::*func)(a1,a2),a1,a2) \
 {                                                                   \
-  OutputGenerator *og=outputs->first();                             \
-  while (og)                                                        \
+  QListIterator<OutputGenerator> it(m_outputs);                     \
+  OutputGenerator *og;                                              \
+  for (it.toFirst();(og=it.current());++it)                         \
   {                                                                 \
     if (og->isEnabled()) (og->*func)(p1,p2);                        \
-    og=outputs->next();                                             \
   }                                                                 \
-}                     
+}
 
 // three arguments
 #define FORALL3(a1,a2,a3,p1,p2,p3)                                        \
 void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3),a1,a2,a3) \
 {                                                                         \
-  OutputGenerator *og=outputs->first();                                   \
-  while (og)                                                              \
+  QListIterator<OutputGenerator> it(m_outputs);                           \
+  OutputGenerator *og;                                                    \
+  for (it.toFirst();(og=it.current());++it)                               \
   {                                                                       \
     if (og->isEnabled()) (og->*func)(p1,p2,p3);                           \
-    og=outputs->next();                                                   \
   }                                                                       \
-}                     
+}
 
 // four arguments
 #define FORALL4(a1,a2,a3,a4,p1,p2,p3,p4)                                        \
 void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4),a1,a2,a3,a4) \
 {                                                                               \
-  OutputGenerator *og=outputs->first();                                         \
-  while (og)                                                                    \
+  QListIterator<OutputGenerator> it(m_outputs);                                 \
+  OutputGenerator *og;                                                          \
+  for (it.toFirst();(og=it.current());++it)                                     \
   {                                                                             \
     if (og->isEnabled()) (og->*func)(p1,p2,p3,p4);                              \
-    og=outputs->next();                                                         \
   }                                                                             \
-}                     
+}
 
 // five arguments
 #define FORALL5(a1,a2,a3,a4,a5,p1,p2,p3,p4,p5)                                        \
 void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5),a1,a2,a3,a4,a5) \
 {                                                                                     \
-  OutputGenerator *og=outputs->first();                                               \
-  while (og)                                                                          \
+  QListIterator<OutputGenerator> it(m_outputs);                                       \
+  OutputGenerator *og;                                                                \
+  for (it.toFirst();(og=it.current());++it)                                           \
   {                                                                                   \
     if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5);                                 \
-    og=outputs->next();                                                               \
   }                                                                                   \
-}                     
+}
 
 // six arguments
 #define FORALL6(a1,a2,a3,a4,a5,a6,p1,p2,p3,p4,p5,p6)                                  \
 void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5,a6),a1,a2,a3,a4,a5,a6) \
 {                                                                                     \
-  OutputGenerator *og=outputs->first();                                               \
-  while (og)                                                                          \
+  QListIterator<OutputGenerator> it(m_outputs);                                       \
+  OutputGenerator *og;                                                                \
+  for (it.toFirst();(og=it.current());++it)                                           \
   {                                                                                   \
     if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5,p6);                              \
-    og=outputs->next();                                                               \
   }                                                                                   \
-}                     
+}
 
 // seven arguments
 #define FORALL7(a1,a2,a3,a4,a5,a6,a7,p1,p2,p3,p4,p5,p6,p7)                      \
 void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5,a6,a7),a1,a2,a3,a4,a5,a6,a7) \
 {                                                                                     \
-  OutputGenerator *og=outputs->first();                                               \
-  while (og)                                                                          \
+  QListIterator<OutputGenerator> it(m_outputs);                                       \
+  OutputGenerator *og;                                                                \
+  for (it.toFirst();(og=it.current());++it)                                           \
   {                                                                                   \
     if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5,p6,p7);                           \
-    og=outputs->next();                                                               \
   }                                                                                   \
-}                     
+}
 
 
 // eight arguments
 #define FORALL8(a1,a2,a3,a4,a5,a6,a7,a8,p1,p2,p3,p4,p5,p6,p7,p8)                      \
 void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5,a6,a7,a8),a1,a2,a3,a4,a5,a6,a7,a8) \
 {                                                                                     \
-  OutputGenerator *og=outputs->first();                                               \
-  while (og)                                                                          \
+  QListIterator<OutputGenerator> it(m_outputs);                                       \
+  OutputGenerator *og;                                                                \
+  for (it.toFirst();(og=it.current());++it)                                           \
   {                                                                                   \
     if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5,p6,p7,p8);                        \
-    og=outputs->next();                                                               \
   }                                                                                   \
-}                     
+}
 
 // now instantiate only the ones we need.
 
index a12d9f5..f578d64 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -58,7 +58,7 @@ class OutputList : public OutputDocInterface
     virtual ~OutputList();
 
     void add(const OutputGenerator *);
-    uint count() const { return outputs->count(); }
+    uint count() const { return m_outputs.count(); }
     
     void disableAllBut(OutputGenerator::OutputType o);
     void enableAll();
@@ -483,28 +483,28 @@ class OutputList : public OutputDocInterface
     { forall(&OutputGenerator::addWord,word,hiPriority); }
 
     void startPlainFile(const char *name)
-    { 
-      OutputGenerator *og=outputs->first();
-      while (og)
+    {
+      QListIterator<OutputGenerator> it(m_outputs);
+      OutputGenerator *og;
+      for (;(og=it.current());++it)
       {
         if (og->isEnabled()) (og->startPlainFile)(name);
-        og=outputs->next();
       }
     }
-    void endPlainFile() 
-    { 
-      OutputGenerator *og=outputs->first();
-      while (og)
+    void endPlainFile()
+    {
+      QListIterator<OutputGenerator> it(m_outputs);
+      OutputGenerator *og;
+      for (;(og=it.current());++it)
       {
         if (og->isEnabled()) (og->endPlainFile)();
-        og=outputs->next();
       }
     }
 
   private:
     void debug();
     void clear();
-    
+
     void forall(void (OutputGenerator::*func)());
     FORALLPROTO1(const char *);
     FORALLPROTO1(char);
@@ -546,9 +546,9 @@ class OutputList : public OutputDocInterface
     FORALLPROTO5(const char *,const char *,const char *,const char *,bool);
     FORALLPROTO6(const char *,const char *,const char *,const char *,const char *,const char *);
     FORALLPROTO6(const char *,const DocLinkInfo &,const char *,const char *,const SourceLinkInfo &,const SourceLinkInfo &);
-  
+
     OutputList(const OutputList &ol);
-    QList<OutputGenerator> *outputs;
+    QList<OutputGenerator> m_outputs;
 };
 
 #endif
index 3c9e1b6..e75327c 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 141c03b..890829e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -81,9 +81,10 @@ class PageSDict : public SDict<PageDef>
   public:
     PageSDict(int size) : SDict<PageDef>(size) {}
     virtual ~PageSDict() {}
-    int compareItems(QCollection::Item i1,QCollection::Item i2)
+  private:
+    int compareValues(const PageDef *i1,const PageDef *i2) const
     {
-      return qstricmp(((PageDef *)i1)->name(),((PageDef *)i2)->name());
+      return qstricmp(i1->name(),i2->name());
     }
 };
 
index d474d8f..c389597 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -184,8 +184,8 @@ class ParserManager
      */
     ParserInterface *getParser(const char *extension)
     {
-      if (extension==0) return m_defaultParser;
       QCString ext = QCString(extension).lower();
+      if (ext.isEmpty()) ext=".no_extension";
       ParserInterface *intf = m_extensions.find(ext);
       if (intf==0 && ext.length()>4)
       {
index 5537438..948836b 100644 (file)
@@ -3,7 +3,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  * Authors: Dimitri van Heesch, Miguel Lobo.
  *
  * Permission to use, copy, modify, and distribute this software and its
@@ -41,6 +41,8 @@
 #include "namespacedef.h"
 #include "membergroup.h"
 #include "section.h"
+#include "util.h"
+#include "htmlentity.h"
 
 #define PERLOUTPUT_MAX_INDENTATION 40
 
@@ -540,140 +542,71 @@ void PerlModDocVisitor::visit(DocWhiteSpace *)
 
 void PerlModDocVisitor::visit(DocSymbol *sy)
 {
-  char c = 0;
-  const char *s = 0;
-  const char *accent = 0;
-  const char *symbol = 0;
-  switch(sy->symbol())
+  const DocSymbol::PerlSymb *res = HtmlEntityMapper::instance()->perl(sy->symbol());
+  const char *accent=0;
+  if (res-> symb)
   {
-    case DocSymbol::At:      c = '@'; break;
-    case DocSymbol::Less:    c = '<'; break;
-    case DocSymbol::Greater: c = '>'; break;
-    case DocSymbol::Amp:     c = '&'; break;
-    case DocSymbol::Dollar:  c = '$'; break;
-    case DocSymbol::Hash:    c = '#'; break;
-    case DocSymbol::DoubleColon: s = "::"; break;
-    case DocSymbol::Percent: c = '%'; break;
-    case DocSymbol::Pipe:    c = '|'; break;
-    case DocSymbol::Quot:    c = '"'; break;
-    case DocSymbol::Lsquo:   s = "\\\'"; break;
-    case DocSymbol::Rsquo:   s = "\\\'"; break;
-    case DocSymbol::Ldquo:   c = '"'; break;
-    case DocSymbol::Rdquo:   c = '"'; break;
-    case DocSymbol::Ndash:   c = '-'; break;
-    case DocSymbol::Mdash:   s = "--"; break;
-    case DocSymbol::Nbsp:    c = ' '; break;
-    case DocSymbol::Uml:     accent = "umlaut"; break;
-    case DocSymbol::Acute:   accent = "acute"; break;
-    case DocSymbol::Grave:   accent = "grave"; break;
-    case DocSymbol::Circ:    accent = "circ"; break;
-    case DocSymbol::Slash:   accent = "slash"; break;
-    case DocSymbol::Tilde:   accent = "tilde"; break;
-    case DocSymbol::Cedil:   accent = "cedilla"; break;
-    case DocSymbol::Ring:    accent = "ring"; break;
-    case DocSymbol::BSlash:  s = "\\\\"; break;
-    case DocSymbol::Copy:    symbol = "copyright"; break;
-    case DocSymbol::Tm:      symbol = "trademark"; break;
-    case DocSymbol::Reg:     symbol = "registered"; break;
-    case DocSymbol::Szlig:   symbol = "szlig"; break;
-    case DocSymbol::Apos:    s = "\\\'"; break;
-    case DocSymbol::Aelig:   symbol = "aelig"; break;
-    case DocSymbol::AElig:   symbol = "AElig"; break;
-    case DocSymbol::GrkGamma:      symbol = "Gamma"; break;
-    case DocSymbol::GrkDelta:      symbol = "Delta"; break;
-    case DocSymbol::GrkTheta:      symbol = "Theta"; break;
-    case DocSymbol::GrkLambda:     symbol = "Lambda"; break;
-    case DocSymbol::GrkXi:         symbol = "Xi"; break;
-    case DocSymbol::GrkPi:         symbol = "Pi"; break;
-    case DocSymbol::GrkSigma:      symbol = "Sigma"; break;
-    case DocSymbol::GrkUpsilon:    symbol = "Upsilon"; break;
-    case DocSymbol::GrkPhi:        symbol = "Phi"; break;
-    case DocSymbol::GrkPsi:        symbol = "Psi"; break;
-    case DocSymbol::GrkOmega:      symbol = "Omega"; break;
-    case DocSymbol::Grkalpha:      symbol = "alpha"; break;
-    case DocSymbol::Grkbeta:       symbol = "beta"; break;
-    case DocSymbol::Grkgamma:      symbol = "gamma"; break;
-    case DocSymbol::Grkdelta:      symbol = "delta"; break;
-    case DocSymbol::Grkepsilon:    symbol = "epsilon"; break;
-    case DocSymbol::Grkzeta:       symbol = "zeta"; break;
-    case DocSymbol::Grketa:        symbol = "eta"; break;
-    case DocSymbol::Grktheta:      symbol = "theta"; break;
-    case DocSymbol::Grkiota:       symbol = "iota"; break;
-    case DocSymbol::Grkkappa:      symbol = "kappa"; break;
-    case DocSymbol::Grklambda:     symbol = "lambda"; break;
-    case DocSymbol::Grkmu:         symbol = "mu"; break;
-    case DocSymbol::Grknu:         symbol = "nu"; break;
-    case DocSymbol::Grkxi:         symbol = "xi"; break;
-    case DocSymbol::Grkpi:         symbol = "pi"; break;
-    case DocSymbol::Grkrho:        symbol = "rho"; break;
-    case DocSymbol::Grksigma:      symbol = "sigma"; break;
-    case DocSymbol::Grktau:        symbol = "tau"; break;
-    case DocSymbol::Grkupsilon:    symbol = "upsilon"; break;
-    case DocSymbol::Grkphi:        symbol = "phi"; break;
-    case DocSymbol::Grkchi:        symbol = "chi"; break;
-    case DocSymbol::Grkpsi:        symbol = "psi"; break;
-    case DocSymbol::Grkomega:      symbol = "omega"; break;
-    case DocSymbol::Grkvarsigma:   symbol = "sigma"; break;
-    case DocSymbol::Section:       symbol = "sect"; break;
-    case DocSymbol::Degree:        symbol = "deg"; break;
-    case DocSymbol::Prime:         s = "\\\'"; break;
-    case DocSymbol::DoublePrime:   c = '"'; break;
-    case DocSymbol::Infinity:      symbol = "inf"; break;
-    case DocSymbol::EmptySet:      symbol = "empty"; break;
-    case DocSymbol::PlusMinus:     s = "+/-"; break;
-    case DocSymbol::Times:         c = '*'; break;
-    case DocSymbol::Minus:         c = '-'; break;
-    case DocSymbol::CenterDot:     c = '.'; break;
-    case DocSymbol::Partial:       symbol = "partial"; break;
-    case DocSymbol::Nabla:         symbol = "nabla"; break;
-    case DocSymbol::SquareRoot:    symbol = "sqrt"; break;
-    case DocSymbol::Perpendicular: symbol = "perp"; break;
-    case DocSymbol::Sum:           symbol = "sum"; break;
-    case DocSymbol::Integral:      symbol = "int"; break;
-    case DocSymbol::Product:       symbol = "prod"; break;
-    case DocSymbol::Similar:       c = '~'; break;
-    case DocSymbol::Approx:        symbol = "approx"; break;
-    case DocSymbol::NotEqual:      s = "!="; break;
-    case DocSymbol::Equivalent:    symbol = "equiv"; break;
-    case DocSymbol::Proportional:  symbol = "propto"; break;
-    case DocSymbol::LessEqual:     s = "<="; break;
-    case DocSymbol::GreaterEqual:  s = ">="; break;
-    case DocSymbol::LeftArrow:     s = "<-"; break;
-    case DocSymbol::RightArrow:    s = "->"; break;
-    case DocSymbol::SetIn:         symbol = "in"; break;
-    case DocSymbol::SetNotIn:      symbol = "notin"; break;
-    case DocSymbol::LeftCeil:      symbol = "lceil"; break;
-    case DocSymbol::RightCeil:     symbol = "rceil"; break;
-    case DocSymbol::LeftFloor:     symbol = "lfloor"; break;
-    case DocSymbol::RightFloor:    symbol = "rfloor"; break;
-    case DocSymbol::Unknown: err("unknown symbol found\n");
-                             break;
-  }
-  if (c != 0) 
-  {
-    enterText();
-    m_output.add(c);
-  } 
-  else if (s != 0) 
-  {
-    enterText();
-    m_output.add(s);
-  } 
-  else if (symbol != 0) 
-  {
-    leaveText();
-    openItem("symbol");
-    m_output.addFieldQuotedString("symbol", symbol);
-    closeItem();
-  } 
-  else if (accent != 0) 
+    switch (res->type)
+    {
+      case DocSymbol::Perl_string:
+        enterText();
+        m_output.add(res->symb);
+        break;
+      case DocSymbol::Perl_char:
+        enterText();
+        m_output.add(res->symb[0]);
+        break;
+      case DocSymbol::Perl_symbol:
+        leaveText();
+        openItem("symbol");
+        m_output.addFieldQuotedString("symbol", res->symb);
+        closeItem();
+        break;
+      default:
+        switch(res->type)
+        {
+          case DocSymbol::Perl_umlaut:
+            accent = "umlaut";
+            break;
+          case DocSymbol::Perl_acute:
+            accent = "acute";
+            break;
+          case DocSymbol::Perl_grave:
+            accent = "grave";
+            break;
+          case DocSymbol::Perl_circ:
+            accent = "circ";
+            break;
+          case DocSymbol::Perl_slash:
+            accent = "slash";
+            break;
+          case DocSymbol::Perl_tilde:
+            accent = "tilde";
+            break;
+          case DocSymbol::Perl_cedilla:
+            accent = "cedilla";
+            break;
+          case DocSymbol::Perl_ring:
+            accent = "ring";
+            break;
+          default:
+            break;
+        }
+        leaveText();
+        if (accent)
+        {
+          openItem("accent");
+          m_output
+            .addFieldQuotedString("accent", accent)
+            .addFieldQuotedChar("letter", res->symb[0]);
+          closeItem();
+        }
+        break;
+    }
+  }
+  else
   {
-    leaveText();
-    openItem("accent");
-    m_output
-      .addFieldQuotedString("accent", accent)
-      .addFieldQuotedChar("letter", sy->letter());
-    closeItem();
+    err("perl: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(sy->symbol(),TRUE));
   }
 }
 
@@ -771,6 +704,7 @@ void PerlModDocVisitor::visit(DocInclude *inc)
     return;
   case DocInclude::DontInclude:        return;
   case DocInclude::HtmlInclude:        type = "htmlonly"; break;
+  case DocInclude::LatexInclude: type = "latexonly"; break;
   case DocInclude::VerbInclude:        type = "preformatted"; break;
   case DocInclude::Snippet: return;
   }
@@ -2098,7 +2032,7 @@ void PerlModGenerator::generatePerlModForGroup(GroupDef *gd)
   {
     m_output.openList("files");
     QListIterator<FileDef> fli(*fl);
-    FileDef *fd = fl->first();
+    FileDef *fd;
     for (fli.toFirst();(fd=fli.current());++fli)
       m_output.openHash()
        .addFieldQuotedString("name", fd->name())
@@ -2192,7 +2126,7 @@ void PerlModGenerator::generatePerlModForPage(PageDef *pd)
     
   SectionInfo *si = Doxygen::sectionDict->find(pd->name());
   if (si)
-    m_output.addFieldQuotedString("title", si->title);
+    m_output.addFieldQuotedString("title4", filterTitle(si->title));
 
   addPerlModDocBlock(m_output,"detailed",pd->docFile(),pd->docLine(),0,0,pd->documentation());
   m_output.closeHash();
index 7f593b2..f908959 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 7deb23c..b624be5 100644 (file)
--- a/src/pre.h
+++ b/src/pre.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 775d448..6d818f3 100644 (file)
--- a/src/pre.l
+++ b/src/pre.l
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 37929fc..0381c93 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -21,6 +21,7 @@
 
 #include <qglobal.h>
 #include "docvisitor.h"
+#include "htmlentity.h"
 
 /*! Concrete visitor implementation for pretty printing */
 class PrintDocVisitor : public DocVisitor
@@ -56,106 +57,14 @@ class PrintDocVisitor : public DocVisitor
     void visit(DocSymbol *s)
     {
       indent_leaf();
-      switch(s->symbol())
+      const char *res = HtmlEntityMapper::instance()->utf8(s->symbol(),TRUE);
+      if (res)
       {
-        case DocSymbol::BSlash:  printf("\\"); break;
-        case DocSymbol::At:      printf("@"); break;
-        case DocSymbol::Less:    printf("<"); break;
-        case DocSymbol::Greater: printf(">"); break;
-        case DocSymbol::Amp:     printf("&"); break;
-        case DocSymbol::Dollar:  printf("$"); break;
-        case DocSymbol::Hash:    printf("#"); break;
-        case DocSymbol::Percent: printf("%%"); break;
-        case DocSymbol::Pipe:    printf("|"); break;
-        case DocSymbol::Copy:    printf("&copy;"); break;
-        case DocSymbol::Apos:    printf("'"); break;
-        case DocSymbol::Quot:    printf("\""); break;
-        case DocSymbol::Lsquo:   printf("&lsquo;"); break;
-        case DocSymbol::Rsquo:   printf("&rsquo;"); break;
-        case DocSymbol::Ldquo:   printf("&ldquo;"); break;
-        case DocSymbol::Rdquo:   printf("&rdquo;"); break;
-        case DocSymbol::Ndash:   printf("&ndash;"); break;
-        case DocSymbol::Mdash:   printf("&mdash;"); break;
-        case DocSymbol::Uml:     printf("&%cuml;",s->letter()); break;
-        case DocSymbol::Acute:   printf("&%cacute;",s->letter()); break;
-        case DocSymbol::Grave:   printf("&%cgrave;",s->letter()); break;
-        case DocSymbol::Circ:    printf("&%ccirc;",s->letter()); break;
-        case DocSymbol::Tilde:   printf("&%ctilde;",s->letter()); break;
-        case DocSymbol::Szlig:   printf("&szlig;"); break;
-        case DocSymbol::Cedil:   printf("&%ccedul;",s->letter()); break;
-        case DocSymbol::Ring:    printf("&%cring;",s->letter()); break;
-        case DocSymbol::Nbsp:    printf("&nbsp;"); break;
-        case DocSymbol::Aelig:   printf("&aelig;"); break;
-        case DocSymbol::AElig:   printf("&AElig;"); break;
-        case DocSymbol::GrkGamma:      printf("&Gamma;"); break;
-        case DocSymbol::GrkDelta:      printf("&Delta;"); break;
-        case DocSymbol::GrkTheta:      printf("&Theta;"); break;
-        case DocSymbol::GrkLambda:     printf("&Lambda;"); break;
-        case DocSymbol::GrkXi:         printf("&Xi;"); break;
-        case DocSymbol::GrkPi:         printf("&Pi;"); break;
-        case DocSymbol::GrkSigma:      printf("&Sigma;"); break;
-        case DocSymbol::GrkUpsilon:    printf("&Upsilon;"); break;
-        case DocSymbol::GrkPhi:        printf("&Phi;"); break;
-        case DocSymbol::GrkPsi:        printf("&Psi;"); break;
-        case DocSymbol::GrkOmega:      printf("&Omega;"); break;
-        case DocSymbol::Grkalpha:      printf("&alpha;"); break;
-        case DocSymbol::Grkbeta:       printf("&beta;"); break;
-        case DocSymbol::Grkgamma:      printf("&gamma;"); break;
-        case DocSymbol::Grkdelta:      printf("&delta;"); break;
-        case DocSymbol::Grkepsilon:    printf("&epsilon;"); break;
-        case DocSymbol::Grkzeta:       printf("&zeta;"); break;
-        case DocSymbol::Grketa:        printf("&eta;"); break;
-        case DocSymbol::Grktheta:      printf("&theta;"); break;
-        case DocSymbol::Grkiota:       printf("&iota;"); break;
-        case DocSymbol::Grkkappa:      printf("&kappa;"); break;
-        case DocSymbol::Grklambda:     printf("&lambda;"); break;
-        case DocSymbol::Grkmu:         printf("&mu;"); break;
-        case DocSymbol::Grknu:         printf("&nu;"); break;
-        case DocSymbol::Grkxi:         printf("&xi;"); break;
-        case DocSymbol::Grkpi:         printf("&pi;"); break;
-        case DocSymbol::Grkrho:        printf("&rho;"); break;
-        case DocSymbol::Grksigma:      printf("&sigma;"); break;
-        case DocSymbol::Grktau:        printf("&tau;"); break;
-        case DocSymbol::Grkupsilon:    printf("&upsilon;"); break;
-        case DocSymbol::Grkphi:        printf("&phi;"); break;
-        case DocSymbol::Grkchi:        printf("&chi;"); break;
-        case DocSymbol::Grkpsi:        printf("&psi;"); break;
-        case DocSymbol::Grkomega:      printf("&omega;"); break;
-        case DocSymbol::Grkvarsigma:   printf("&sigmaf;"); break;
-        case DocSymbol::Section:       printf("&sect;"); break;
-        case DocSymbol::Degree:        printf("&deg;"); break;
-        case DocSymbol::Prime:         printf("&prime;"); break;
-        case DocSymbol::DoublePrime:   printf("&Prime;"); break;
-        case DocSymbol::Infinity:      printf("&infin;"); break;
-        case DocSymbol::EmptySet:      printf("&empty;"); break;
-        case DocSymbol::PlusMinus:     printf("&plusmn;"); break;
-        case DocSymbol::Times:         printf("&times;"); break;
-        case DocSymbol::Minus:         printf("&minus;"); break;
-        case DocSymbol::CenterDot:     printf("&sdot;"); break;
-        case DocSymbol::Partial:       printf("&part;"); break;
-        case DocSymbol::Nabla:         printf("&nabla;"); break;
-        case DocSymbol::SquareRoot:    printf("&radic;"); break;
-        case DocSymbol::Perpendicular: printf("&perp;"); break;
-        case DocSymbol::Sum:           printf("&sum;"); break;
-        case DocSymbol::Integral:      printf("&int;"); break;
-        case DocSymbol::Product:       printf("&prod;"); break;
-        case DocSymbol::Similar:       printf("&sim;"); break;
-        case DocSymbol::Approx:        printf("&asymp;"); break;
-        case DocSymbol::NotEqual:      printf("&ne;"); break;
-        case DocSymbol::Equivalent:    printf("&equiv;"); break;
-        case DocSymbol::Proportional:  printf("&prop;"); break;
-        case DocSymbol::LessEqual:     printf("&le;"); break;
-        case DocSymbol::GreaterEqual:  printf("&ge;"); break;
-        case DocSymbol::LeftArrow:     printf("&larr;"); break;
-        case DocSymbol::RightArrow:    printf("&rarr;"); break;
-        case DocSymbol::SetIn:         printf("&isin;"); break;
-        case DocSymbol::SetNotIn:      printf("&notin;"); break;
-        case DocSymbol::LeftCeil:      printf("&lceil;"); break;
-        case DocSymbol::RightCeil:     printf("&rceil;"); break;
-        case DocSymbol::LeftFloor:     printf("&lfloor;"); break;
-        case DocSymbol::RightFloor:    printf("&rfloor;"); break;
-        default:
-          printf("unknown symbol found\n");
+        printf("%s",res);
+      }
+      else
+      {
+        printf("print: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
       }
     }
     void visit(DocURL *u)
@@ -256,6 +165,7 @@ class PrintDocVisitor : public DocVisitor
         case DocInclude::IncWithLines: printf("incwithlines"); break;
         case DocInclude::DontInclude: printf("dontinclude"); break;
         case DocInclude::HtmlInclude: printf("htmlinclude"); break;
+        case DocInclude::LatexInclude: printf("latexinclude"); break;
         case DocInclude::VerbInclude: printf("verbinclude"); break;
         case DocInclude::Snippet: printf("snippet"); break;
       }
index 6382975..9b0dacb 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 8512711..585b587 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 4b99706..e4e974f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 671d330..c67875e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -645,6 +645,8 @@ STARTDOCSYMS      "##"
 }
 
 <FromMod>{
+  "."                 { // python3 style imports
+                      }
   {IDENTIFIER}({B}"."{B}{IDENTIFIER})* { // from package import 
                         g_packageName=yytext;
                      }
index ab49733..c9ff3ca 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 70bd9ba..ee6ac91 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 3124582..97b1420 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -44,10 +44,9 @@ class SortedRefItems : public SDict<RefItem>
   public:
     SortedRefItems(int size=17) : SDict<RefItem>(size) {}
     virtual ~SortedRefItems() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+  private:
+    int compareValues(const RefItem *r1,const RefItem *r2) const
     {
-      RefItem *r1 = (RefItem*)item1;
-      RefItem *r2 = (RefItem*)item2;
       return qstricmp(r1->title,r2->title);
     }
 };
index 7c2fef8..67faf98 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -32,6 +32,7 @@
 #include "dia.h"
 #include "filedef.h"
 #include "config.h"
+#include "htmlentity.h"
 
 //#define DBG_RTF(x) m_t << x
 #define DBG_RTF(x) do {} while(0)
@@ -121,198 +122,14 @@ void RTFDocVisitor::visit(DocSymbol *s)
 {
   if (m_hide) return;
   DBG_RTF("{\\comment RTFDocVisitor::visit(DocSymbol)}\n");
-  switch(s->symbol())
+  const char *res = HtmlEntityMapper::instance()->rtf(s->symbol());
+  if (res)
   {
-    case DocSymbol::BSlash:  m_t << "\\\\"; break;
-    case DocSymbol::At:      m_t << "@"; break;
-    case DocSymbol::Less:    m_t << "<"; break;
-    case DocSymbol::Greater: m_t << ">"; break;
-    case DocSymbol::Amp:     m_t << "&"; break;
-    case DocSymbol::Dollar:  m_t << "$"; break;
-    case DocSymbol::Hash:    m_t << "#"; break;
-    case DocSymbol::DoubleColon:  m_t << "::"; break;
-    case DocSymbol::Percent: m_t << "%"; break;
-    case DocSymbol::Pipe:    m_t << "|"; break;
-    case DocSymbol::Copy:    m_t << "(C)"; break;
-    case DocSymbol::Tm:      m_t << "(TM)"; break;
-    case DocSymbol::Reg:     m_t << "(R)"; break;
-    case DocSymbol::Apos:    m_t << "'"; break;
-    case DocSymbol::Quot:    m_t << "\""; break;
-    case DocSymbol::Lsquo:   m_t << "`"; break;
-    case DocSymbol::Rsquo:   m_t << "'"; break;
-    case DocSymbol::Ldquo:   m_t << "\""; break;
-    case DocSymbol::Rdquo:   m_t << "\""; break;
-    case DocSymbol::Ndash:   m_t << "-"; break;
-    case DocSymbol::Mdash:   m_t << "--"; break;
-    case DocSymbol::Uml:     switch(s->letter())
-                             {
-                               case 'A' : m_t << '\304'; break;
-                               case 'E' : m_t << '\313'; break;
-                               case 'I' : m_t << '\317'; break;
-                               case 'O' : m_t << '\326'; break;
-                               case 'U' : m_t << '\334'; break;
-                               case 'Y' : m_t << 'Y';    break;
-                               case 'a' : m_t << '\344'; break;
-                               case 'e' : m_t << '\353'; break;
-                               case 'i' : m_t << '\357'; break;
-                               case 'o' : m_t << '\366'; break;
-                               case 'u' : m_t << '\374'; break;
-                               case 'y' : m_t << '\377'; break;
-                               default: m_t << '?'; break;
-                             }
-                             break;
-    case DocSymbol::Acute:   switch(s->letter())
-                             {
-                               case 'A' : m_t << '\301'; break;
-                               case 'E' : m_t << '\311'; break;
-                               case 'I' : m_t << '\315'; break;
-                               case 'O' : m_t << '\323'; break;
-                               case 'U' : m_t << '\332'; break;
-                               case 'Y' : m_t << '\335'; break;
-                               case 'a' : m_t << '\341'; break;
-                               case 'e' : m_t << '\351'; break;
-                               case 'i' : m_t << '\355'; break;
-                               case 'o' : m_t << '\363'; break;
-                               case 'u' : m_t << '\372'; break;
-                               case 'y' : m_t << '\375'; break;
-                               default: m_t << '?'; break;
-                             }
-                             break;
-    case DocSymbol::Grave:   switch(s->letter())
-                             {
-                               case 'A' : m_t << '\300'; break;
-                               case 'E' : m_t << '\310'; break;
-                               case 'I' : m_t << '\314'; break;
-                               case 'O' : m_t << '\322'; break;
-                               case 'U' : m_t << '\331'; break;
-                               case 'a' : m_t << '\340'; break;
-                               case 'e' : m_t << '\350'; break;
-                               case 'i' : m_t << '\354'; break;
-                               case 'o' : m_t << '\362'; break;
-                               case 'u' : m_t << '\371'; break;
-                               default: m_t << '?'; break;
-                             }
-                             break;
-    case DocSymbol::Circ:    switch(s->letter())
-                             {
-                               case 'A' : m_t << '\302'; break;
-                               case 'E' : m_t << '\312'; break;
-                               case 'I' : m_t << '\316'; break;
-                               case 'O' : m_t << '\324'; break;
-                               case 'U' : m_t << '\333'; break;
-                               case 'a' : m_t << '\342'; break;
-                               case 'e' : m_t << '\352'; break;
-                               case 'i' : m_t << '\356'; break;
-                               case 'o' : m_t << '\364'; break;
-                               case 'u' : m_t << '\373'; break;
-                               default: m_t << '?'; break;
-                             }
-                             break;
-    case DocSymbol::Tilde:   switch(s->letter())
-                             {
-                               case 'A' : m_t << '\303'; break;
-                               case 'N' : m_t << '\321'; break;
-                               case 'O' : m_t << '\325'; break;
-                               case 'a' : m_t << '\343'; break;
-                               case 'n' : m_t << '\361'; break;
-                               case 'o' : m_t << '\365'; break;
-                               default: m_t << '?'; break;
-                             }
-                             break;
-    case DocSymbol::Cedil:   switch(s->letter())
-                             {
-                               case 'C' : m_t << '\307'; break;
-                               case 'c' : m_t << '\347'; break;
-                               default: m_t << '?'; break;
-                             }
-                             break;
-    case DocSymbol::Slash:   switch(s->letter())
-                             {
-                               case 'O' : m_t << '\330'; break;
-                               case 'o' : m_t << '\370'; break;
-                               default: m_t << '?'; break;
-                             }
-                             break;
-    case DocSymbol::Ring:    switch(s->letter())
-                             {
-                               case 'A' : m_t << '\305'; break;
-                               case 'a' : m_t << '\345'; break;
-                               default: m_t << '?'; break;
-                             }
-                             break;
-    case DocSymbol::Szlig:   m_t << "\337"; break;
-    case DocSymbol::Nbsp:    m_t << "\\~ "; break;
-    case DocSymbol::Aelig:   m_t << "\346"; break;
-    case DocSymbol::AElig:   m_t << "\306"; break;
-    case DocSymbol::GrkGamma:        m_t << "Gamma "; break;
-    case DocSymbol::GrkDelta:        m_t << "Delta "; break;
-    case DocSymbol::GrkTheta:        m_t << "Theta "; break;
-    case DocSymbol::GrkLambda:       m_t << "Lambda "; break;
-    case DocSymbol::GrkXi:           m_t << "Xi "; break;
-    case DocSymbol::GrkPi:           m_t << "Pi "; break;
-    case DocSymbol::GrkSigma:        m_t << "Sigma "; break;
-    case DocSymbol::GrkUpsilon:      m_t << "Upsilon "; break;
-    case DocSymbol::GrkPhi:          m_t << "Phi "; break;
-    case DocSymbol::GrkPsi:          m_t << "Psi "; break;
-    case DocSymbol::GrkOmega:        m_t << "Omega "; break;
-    case DocSymbol::Grkalpha:        m_t << "alpha "; break;
-    case DocSymbol::Grkbeta:         m_t << "beta "; break;
-    case DocSymbol::Grkgamma:        m_t << "gamma "; break;
-    case DocSymbol::Grkdelta:        m_t << "delta "; break;
-    case DocSymbol::Grkepsilon:      m_t << "epsilon "; break;
-    case DocSymbol::Grkzeta:         m_t << "zeta "; break;
-    case DocSymbol::Grketa:          m_t << "eta "; break;
-    case DocSymbol::Grktheta:        m_t << "theta "; break;
-    case DocSymbol::Grkiota:         m_t << "iota "; break;
-    case DocSymbol::Grkkappa:        m_t << "kappa "; break;
-    case DocSymbol::Grklambda:       m_t << "lambda "; break;
-    case DocSymbol::Grkmu:           m_t << "mu "; break;
-    case DocSymbol::Grknu:           m_t << "nu "; break;
-    case DocSymbol::Grkxi:           m_t << "xi "; break;
-    case DocSymbol::Grkpi:           m_t << "pi "; break;
-    case DocSymbol::Grkrho:          m_t << "rho "; break;
-    case DocSymbol::Grksigma:        m_t << "sigma "; break;
-    case DocSymbol::Grktau:          m_t << "tau "; break;
-    case DocSymbol::Grkupsilon:      m_t << "upsilon "; break;
-    case DocSymbol::Grkphi:          m_t << "phi "; break;
-    case DocSymbol::Grkchi:          m_t << "chi "; break;
-    case DocSymbol::Grkpsi:          m_t << "psi "; break;
-    case DocSymbol::Grkomega:        m_t << "omega "; break;
-    case DocSymbol::Grkvarsigma:     m_t << "sigma "; break;
-    case DocSymbol::Section:         m_t << "\247"; break;
-    case DocSymbol::Degree:          m_t << "\260"; break;
-    case DocSymbol::Prime:           m_t << "'"; break;
-    case DocSymbol::DoublePrime:     m_t << "\""; break;
-    case DocSymbol::Infinity:        m_t << "inf "; break;
-    case DocSymbol::EmptySet:        m_t << "empty "; break;
-    case DocSymbol::PlusMinus:       m_t << "\261"; break;
-    case DocSymbol::Times:           m_t << "\327"; break;
-    case DocSymbol::Minus:           m_t << "-"; break;
-    case DocSymbol::CenterDot:       m_t << "."; break;
-    case DocSymbol::Partial:         m_t << "partial "; break;
-    case DocSymbol::Nabla:           m_t << "nabla "; break;
-    case DocSymbol::SquareRoot:      m_t << "sqrt "; break;
-    case DocSymbol::Perpendicular:   m_t << "perp "; break;
-    case DocSymbol::Sum:             m_t << "sum "; break;
-    case DocSymbol::Integral:        m_t << "int "; break;
-    case DocSymbol::Product:         m_t << "prod "; break;
-    case DocSymbol::Similar:         m_t << "~"; break;
-    case DocSymbol::Approx:          m_t << "approx "; break;
-    case DocSymbol::NotEqual:        m_t << "!="; break;
-    case DocSymbol::Equivalent:      m_t << "equiv "; break;
-    case DocSymbol::Proportional:    m_t << "propto "; break;
-    case DocSymbol::LessEqual:       m_t << "<="; break;
-    case DocSymbol::GreaterEqual:    m_t << ">="; break;
-    case DocSymbol::LeftArrow:       m_t << "<-"; break;
-    case DocSymbol::RightArrow:      m_t << "->"; break;
-    case DocSymbol::SetIn:           m_t << "in "; break;
-    case DocSymbol::SetNotIn:        m_t << "notin "; break;
-    case DocSymbol::LeftCeil:        m_t << "lceil "; break;
-    case DocSymbol::RightCeil:       m_t << "rceil "; break;
-    case DocSymbol::LeftFloor:       m_t << "lfloor "; break;
-    case DocSymbol::RightFloor:      m_t << "rfloor "; break;
-    default:
-                             err("unknown symbol found\n");
+    m_t << res;
+  }
+  else
+  {
+    err("RTF: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
   }
   m_lastIsPara=FALSE;
 }
@@ -565,6 +382,8 @@ void RTFDocVisitor::visit(DocInclude *inc)
       break;
     case DocInclude::HtmlInclude: 
       break;
+    case DocInclude::LatexInclude:
+      break;
     case DocInclude::VerbInclude: 
       m_t << "{" << endl;
       m_t << "\\par" << endl;
index 9572b73..efc9d21 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index d8c34ee..8699c4e 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Parker Waechter & Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Parker Waechter & Dimitri van Heesch.
  *
  * Style sheet additions by Alexander Bartolich
  *
@@ -492,11 +492,13 @@ void RTFGenerator::startIndexSection(IndexSections is)
       {
         //File Documentation
         bool isFirst=TRUE;
-        FileName *fn=Doxygen::inputNameList->first();
-        while (fn)
+        FileNameListIterator fnli(*Doxygen::inputNameList); 
+        FileName *fn;
+        for (fnli.toFirst();(fn=fnli.current());++fnli)
         {
-          FileDef *fd=fn->first();
-          while (fd)
+          FileNameIterator fni(*fn);
+          FileDef *fd;
+          for (;(fd=fni.current());++fni)
           {
             if (fd->isLinkableInProject())
             {
@@ -507,9 +509,7 @@ void RTFGenerator::startIndexSection(IndexSections is)
                 break;
               }
             }
-            fd=fn->next();
           }
-          fn=Doxygen::inputNameList->next();
         }
       }
       break;
@@ -792,13 +792,15 @@ void RTFGenerator::endIndexSection(IndexSections is)
     case isFileDocumentation:
       {
         bool isFirst=TRUE;
-        FileName *fn=Doxygen::inputNameList->first();
 
         t << "{\\tc \\v " << theTranslator->trFileDocumentation() << "}"<< endl;
-        while (fn)
+        FileNameListIterator fnli(*Doxygen::inputNameList);
+        FileName *fn;
+        for (fnli.toFirst();(fn=fnli.current());++fnli)
         {
-          FileDef *fd=fn->first();
-          while (fd)
+          FileNameIterator fni(*fn);
+          FileDef *fd;
+          for (;(fd=fni.current());++fni)
           {
             if (fd->isLinkableInProject())
             {
@@ -819,9 +821,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
                 t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
               }
             }
-            fd=fn->next();
           }
-          fn=Doxygen::inputNameList->next();
         }
       }
       break;
index 6206311..7b31673 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Parker Waechter & Dimitri van Heesch.
+ * Copyright (C) 1997-2014 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 
index 2bede42..f44951a 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 52488f1..4f0a03f 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 767fea0..8c8c3d9 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index bbe90a3..a7ac841 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -5023,6 +5023,7 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
 
                                            tempEntry = current; // temporarily switch to the previous entry
                                            current = previous;
+                                           previous = 0;
 
                                            docBlockContext   = SkipCurlyEndDoc;
                                            docBlockInBody    = FALSE;
@@ -5062,7 +5063,11 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                        }
 <SkipCurlyEndDoc>"}"                   {
                                          //addToBody("}");
-                                         current = tempEntry;
+                                          if (tempEntry) // we can only switch back to current if no new item was created
+                                         {
+                                           current = tempEntry;
+                                           tempEntry = 0;
+                                         }
                                          BEGIN( lastCurlyContext );
                                        }
 <SkipCurly>\"                          { 
@@ -5115,6 +5120,11 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                          lastCContext = YY_START;
                                          BEGIN(SkipCxxComment);
                                        }
+<SkipInits>"("                          {
+                                          roundCount=0;
+                                          lastSkipRoundContext=YY_START;
+                                          BEGIN(SkipRound);
+                                        }
 <SkipInits>\"                          {
                                          lastStringContext=YY_START;
                                          BEGIN( SkipString ); 
@@ -5510,7 +5520,7 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                            BEGIN( CopyArgComment );
                                        }
 <CSConstraintType,CSConstraintName>"#" { // artificially inserted token to signal end of comment block
-                                          current->typeConstr->last()->docs = fullArgString;
+                                          current->typeConstr->getLast()->docs = fullArgString;
                                        }
 <CSConstraintType>"{"                  { // end of type constraint reached
                                           // parse documentation of the constraints
@@ -5528,24 +5538,24 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                         }
 <CSConstraintName>{ID}                  {
                                           // parameter name
-                                          current->typeConstr->last()->name=yytext;
+                                          current->typeConstr->getLast()->name=yytext;
                                         }
 <CSConstraintType>"where"              { // another constraint for a different param
                                          current->typeConstr->append(new Argument);
                                           BEGIN( CSConstraintName );
                                        }
 <CSConstraintType>({ID}".")*{ID}("<"{ID}">")?("()")?  {
-                                          if (current->typeConstr->last()->type.isEmpty())
+                                          if (current->typeConstr->getLast()->type.isEmpty())
                                               // first type constraint for this parameter
                                           {
-                                            current->typeConstr->last()->type=yytext;
+                                            current->typeConstr->getLast()->type=yytext;
                                           }
                                           else // new type constraint for same parameter
                                           {
-                                            QCString name = current->typeConstr->last()->name;
+                                            QCString name = current->typeConstr->getLast()->name;
                                             current->typeConstr->append(new Argument);
-                                            current->typeConstr->last()->name=name;
-                                            current->typeConstr->last()->type=yytext;
+                                            current->typeConstr->getLast()->name=name;
+                                            current->typeConstr->getLast()->type=yytext;
                                           }
                                         }
 <CSConstraintName,CSConstraintType>\n  {
@@ -5766,7 +5776,8 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                          specName = &current->name;
                                          BEGIN ( Specialization );
                                        }
-<Bases>"<"                             { 
+<Bases>{BN}*"<"                         {
+                                          lineCount();
                                          sharpCount=1; 
                                          roundCount=0;
                                          lastSkipSharpContext = YY_START;
@@ -6194,7 +6205,7 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                           g_nestedComment=FALSE;
                                          BEGIN(DocCopyBlock);
                                         }
-<DocBlock>"<"{PRE}">"                  {
+<DocBlock>{B}*"<"{PRE}">"              {
                                           docBlock+=yytext;
                                          docBlockName="<pre>";
                                           g_fencedSize=0;
@@ -6210,6 +6221,7 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                        }
 <DocBlock>"~~~"[~]*                     {
                                           docBlock+=yytext;
+                                          docBlockName="~~~";
                                           g_fencedSize=yyleng;
                                           g_nestedComment=FALSE;
                                           BEGIN(DocCopyBlock);
@@ -6293,6 +6305,18 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                            REJECT;
                                          }
                                        }
+<DocCopyBlock>^{B}*"*"+/({ID}|"(")     { // Assume *var or *(... is part of source code (see bug723516)
+                                         if (docBlockName=="code")
+                                          {
+                                            QCString indent;
+                                            indent.fill(' ',computeIndent(yytext,-1));
+                                            docBlock+=indent+"*";
+                                          }
+                                          else
+                                          {
+                                            REJECT;
+                                          }
+                                        }
 <DocCopyBlock>^{B}*"*"+/{BN}*          { // start of a comment line with one *
                                          if (docBlockName=="code")
                                           {
@@ -6497,7 +6521,14 @@ static void startCommentBlock(bool brief)
 
 static void newEntry()
 {
-  current_root->addSubEntry(current);
+  if (tempEntry==0) // if temp entry is not 0, it holds current, 
+                    // and current is actually replaced by previous which was 
+                    // already added to current_root, so we should not add it again 
+                    // (see bug723314)
+  {
+    current_root->addSubEntry(current);
+  }
+  tempEntry = 0;
   previous = current;
   current = new Entry ;
   initEntry();
index f023e4d..a550eb1 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -632,16 +632,14 @@ class SearchIndexList : public SDict< SearchDefinitionList >
       }
       l->append(d);
     }
-    int compareItems(QCollection::Item item1, QCollection::Item item2)
+    uint letter() const { return m_letter; }
+  private:
+    int compareValues(const SearchDefinitionList *md1, const SearchDefinitionList *md2) const
     {
-      QList<Definition> *md1=(QList<Definition> *)item1;
-      QList<Definition> *md2=(QList<Definition> *)item2;
-      QCString n1 = md1->first()->localName();
-      QCString n2 = md2->first()->localName();
+      QCString n1 = md1->getFirst()->localName();
+      QCString n2 = md2->getFirst()->localName();
       return qstricmp(n1.data(),n2.data());
     }
-    uint letter() const { return m_letter; }
-  private:
     uint m_letter;
 };
 
@@ -1029,7 +1027,7 @@ void writeJavascriptSearchIndex()
             " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl;
           t << "<html><head><title></title>" << endl;
           t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl;
-          t << "<meta name=\"generator\" content=\"Doxygen " << versionString << "\">" << endl;
+          t << "<meta name=\"generator\" content=\"Doxygen " << versionString << "\"/>" << endl;
           t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>" << endl;
           t << "<script type=\"text/javascript\" src=\"" << baseName << ".js\"></script>" << endl;
           t << "<script type=\"text/javascript\" src=\"search.js\"></script>" << endl;
@@ -1077,7 +1075,7 @@ void writeJavascriptSearchIndex()
         int itemCount=0;
         for (li.toFirst();(dl=li.current());++li)
         {
-          Definition *d = dl->first();
+          Definition *d = dl->getFirst();
           QCString id = d->localName();
 
           if (!firstEntry)
index 2ce80e8..872c0d3 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 486656d..a1f859e 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -33,25 +33,32 @@ struct SectionInfo
                      Paragraph     = 4, 
                      Anchor        = 5 
                    };
-  SectionInfo(const char *f,const char *l,const char *t,
+  SectionInfo(const char *f,const int lin,const char *l,const char *t,
               SectionType st,int lev,const char *r=0) :
-    label(l), title(t), type(st), ref(r), definition(0), 
-    fileName(f), generated(FALSE), level(lev)
-  { 
+    label(l), title(t), type(st), ref(r), definition(0),
+    fileName(f), lineNr(lin), generated(FALSE), level(lev)
+  {
   }
   SectionInfo(const SectionInfo &s)
   {
-    label=s.label.copy(); title=s.title.copy(); ref=s.ref.copy();
-    type =s.type; definition=s.definition;
-    fileName=s.fileName.copy(); generated=s.generated;
+    label=s.label.copy();
+    title=s.title.copy();
+    type =s.type;
+    ref=s.ref.copy();
+    definition=s.definition;
+    fileName=s.fileName.copy();
+    lineNr=s.lineNr;
+    generated=s.generated;
+    level=s.level;
   }
  ~SectionInfo() {}
-  QCString label; 
+  QCString label;
   QCString title;
   SectionType type;
   QCString ref;
   Definition *definition;
   QCString fileName;
+  int lineNr;
   bool generated;
   int level;
 };
diff --git a/src/settings.h b/src/settings.h
deleted file mode 100644 (file)
index a9fd128..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef SETTINGS_H
-#define SETTINGS_H
-
-#define USE_SQLITE3  0
-#define USE_LIBCLANG 0
-
-#define IS_SUPPORTED(x) \
-  ((USE_SQLITE3  && strcmp("USE_SQLITE3",(x))==0)  || \
-   (USE_LIBCLANG && strcmp("USE_LIBCLANG",(x))==0) || \
-  0)
-
-#endif
index af24e7b..a9dfa13 100755 (executable)
@@ -1,11 +1,12 @@
 # 
 
 import sys
+import os
 
 f_sqlite3 = sys.argv[1]
 f_libclang = sys.argv[2]
 
-f1 = open('../src/settings.h','w')
+f1 = open(os.path.join(sys.argv[3],'settings.h'),'w')
 f1.write("#ifndef SETTINGS_H\n")
 f1.write("#define SETTINGS_H\n")
 f1.write("\n")
index e111075..f79a335 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -73,7 +73,7 @@ const uint SDict_primes[] =
 template<class T> class SDict;
 template<class T> class SIntDict;
 
-/** internal wrapper class that redirects compareItems() to the 
+/** internal wrapper class that redirects compareValues() to the 
  *  dictionary 
  */
 template<class T>
@@ -82,9 +82,9 @@ class SList : public QList<T>
   public:
     SList(SDict<T> *owner) : m_owner(owner) {}
     virtual ~SList() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+    int compareValues(const T *item1,const T *item2) const
     {
-      return m_owner->compareItems(item1,item2);
+      return m_owner->compareValues(item1,item2);
     }
   private:
     SDict<T> *m_owner;  
@@ -264,7 +264,7 @@ class SDict
      *  Overload this to properly sort items.
      *  \sa inSort()
      */
-    virtual int compareItems(QCollection::Item item1,QCollection::Item item2)
+    virtual int compareValues(const T *item1,const T *item2) const
     {
       return item1!=item2;
     }
@@ -421,7 +421,7 @@ class SDict
     };
 };
 
-/** internal wrapper class that redirects compareItems() to the 
+/** internal wrapper class that redirects compareValues() to the 
  *  dictionary 
  */
 template<class T>
@@ -430,11 +430,11 @@ class SIntList : public QList<T>
   public:
     SIntList(SIntDict<T> *owner) : m_owner(owner) {}
     virtual ~SIntList() {}
-    int compareItems(QCollection::Item item1,QCollection::Item item2)
+  private:
+    int compareValues(const T *item1,const T *item2) const
     {
-      return m_owner->compareItems(item1,item2);
+      return m_owner->compareValues(item1,item2);
     }
-  private:
     SIntDict<T> *m_owner;  
 };
 
@@ -573,7 +573,7 @@ class SIntDict
      *  Overload this to properly sort items.
      *  \sa inSort()
      */
-    virtual int compareItems(QCollection::Item item1,QCollection::Item item2)
+    virtual int compareValues(const T *item1,const T *item2) const
     {
       return item1!=item2;
     }
index a59a3d0..42a0307 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
 //#define DBG_CTX(x) printf x
 #define DBG_CTX(x) do { } while(0)
 
-static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def);
-
-//////////////////////////////////////////////////////
-const char *i_q_includes="INSERT OR REPLACE INTO includes "
-                            "( local, id_src, dst ) "
-                            "VALUES "
-                            "(:local,:id_src,:dst )" ;
-const char *c_q_includes="SELECT count(*) FROM includes WHERE local=:local and id_src=:id_src and dst=:dst";
-static sqlite3_stmt *c_s_includes=0;
-static sqlite3_stmt *i_s_includes=0;
-//////////////////////////////////////////////////////
-const char *i_q_innerclass="INSERT OR REPLACE INTO innerclass "
-                            "( refid, prot, name )"
-                            "VALUES "
-                            "(:refid,:prot,:name )";
-static sqlite3_stmt *i_s_innerclass=0;
-//////////////////////////////////////////////////////
-const char *i_q_files="INSERT OR REPLACE INTO files "
-                            "( name )"
-                            "VALUES "
-                            "(:name )";
-const char *id_q_files="SELECT id FROM files WHERE name=:name";
-static sqlite3_stmt *id_s_files=0;
-static sqlite3_stmt *i_s_files=0;
-//////////////////////////////////////////////////////
-const char *i_q_xrefs="INSERT OR REPLACE INTO xrefs "
-                            "( src, dst, id_file, line, column )"
-                            "VALUES "
-                            "(:src,:dst,:id_file,:line,:column )";
-static sqlite3_stmt *i_s_xrefs=0;
-//////////////////////////////////////////////////////
-const char *i_q_memberdef="INSERT OR REPLACE INTO memberdef "
-                            "( refid, prot, static, const, explicit, inline, final, sealed, new, optional, required, virt, mutable, initonly, readable, writable, gettable, settable, accessor, addable, removable, raisable, name, type, definition, argsstring, scope, initializer, kind, id_bfile, bline, bcolumn, id_file, line, column)"
-                            "VALUES "
-                            "(:refid,:prot,:static,:const,:explicit,:inline,:final,:sealed,:new,:optional,:required,:virt,:mutable,:initonly,:readable,:writable,:gettable,:settable,:accessor,:addable,:removable,:raisable,:name,:type,:definition,:argsstring,:scope,:initializer,:kind,:id_bfile,:bline,:bcolumn,:id_file,:line,:column)";
-const char *id_q_memberdef="SELECT id FROM memberdef WHERE refid=:refid and id is not null";
-static sqlite3_stmt *id_s_memberdef=0;
-static sqlite3_stmt *i_s_memberdef=0;
-//////////////////////////////////////////////////////
-const char *i_q_compounddef="INSERT OR REPLACE INTO compounddef "
-                            "( name, kind, prot, refid, id_file, line, column ) "
-                            "VALUES "
-                            "(:name,:kind,:prot,:refid,:id_file,:line,:column )";
-static sqlite3_stmt *i_s_compounddef=0;
-//////////////////////////////////////////////////////
-const char *i_q_basecompoundref="INSERT OR REPLACE INTO  basecompoundref "
-                            "( base, derived, refid, prot, virt ) "
-                            "VALUES "
-                            "(:base,:derived,:refid,:prot,:virt )" ;
-static sqlite3_stmt *i_s_basecompoundref=0;
-//////////////////////////////////////////////////////
-const char *i_q_derivedcompoundref="INSERT OR REPLACE INTO  derivedcompoundref "
-                            "( refid, prot, virt, base, derived ) "
-                            "VALUES "
-                            "(:refid,:prot,:virt,:base,:derived )" ;
-static sqlite3_stmt *i_s_derivedcompoundref=0;
-//////////////////////////////////////////////////////
-
-const char * schema_queries[][2] =
-{
-  {
-    "compounddef",
-    "CREATE TABLE IF NOT EXISTS compounddef ("
-      "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
-      "name TEXT NOT NULL,"
-      "kind TEXT NOT NULL,"
-      "prot INTEGER NOT NULL,"
-      "refid TEXT NOT NULL,"
-      "id_file INTEGER NOT NULL,"
-      "line INTEGER NOT NULL,"
-      "column INTEGER NOT NULL)"
-  },
-  {
-    "basecompoundref",
-    "CREATE TABLE IF NOT EXISTS basecompoundref ("
-      "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
-      "base TEXT NOT NULL,"
-      "derived TEXT NOT NULL,"
-      "refid TEXT NOT NULL,"
-      "prot INTEGER NOT NULL,"
-      "virt INTEGER NOT NULL)"
-  },
-  {
-    "derivedcompoundref",
-    "CREATE TABLE IF NOT EXISTS derivedcompoundref ("
-      "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
-      "base TEXT NOT NULL,"
-      "derived TEXT NOT NULL,"
-      "refid TEXT NOT NULL,"
-      "prot INTEGER NOT NULL,"
-      "virt INTEGER NOT NULL)"
-  },
-  {
-    "includes",
+const char * schema_queries[][2] = {
+  { "includes",
     "CREATE TABLE IF NOT EXISTS includes ("
-      "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+      "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
       "local INTEGER NOT NULL,"
       "id_src INTEGER NOT NULL,"
-      "dst TEXT NOT NULL)"
+      "id_dst INTEGER NOT NULL);"
+    "CREATE UNIQUE INDEX idx_includes ON includes "
+      "(local, id_src, id_dst);"
   },
-  {
-    "innerclass",
+  { "innerclass",
     "CREATE TABLE IF NOT EXISTS innerclass ("
-      "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+      "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
       "refid TEXT NOT NULL,"
       "prot INTEGER NOT NULL,"
       "name TEXT NOT NULL)"
   },
-  {
-    "files",
+  { "files",
     "CREATE TABLE IF NOT EXISTS files ("
-    "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
-    "name TEXT NOT NULL)"
+      "name TEXT PRIMARY KEY NOT NULL);"
   },
-  {
-    "xrefs",
+  { "refids",
+    "CREATE TABLE IF NOT EXISTS refids ("
+      "refid TEXT PRIMARY KEY NOT NULL);"
+  },
+  { "xrefs",
     "CREATE TABLE IF NOT EXISTS xrefs ("
-    "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
-    "src TEXT NOT NULL, "
-    "dst TEXT NOT NULL, "
-    "id_file INTEGER NOT NULL, "
-    "line INTEGER, "
-    "column INTEGER)"
+      "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+      "refid_src INTEGER NOT NULL, "
+      "refid_dst INTEGER NOT NULL, "
+      "id_file INTEGER NOT NULL, "
+      "line INTEGER NOT NULL, "
+      "column INTEGER NOT NULL);"
+    "CREATE UNIQUE INDEX idx_xrefs ON xrefs "
+      "(refid_src, refid_dst, id_file, line, column);"
   },
-  {
-    "memberdef",
+  { "memberdef",
     "CREATE TABLE IF NOT EXISTS memberdef ("
-      "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+      "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+      "id_file INTEGER NOT NULL,"
+      "line INTEGER NOT NULL,"
+      "column INTEGER NOT NULL,"
+      "refid TEXT NOT NULL,"
       "name TEXT NOT NULL,"
       "definition TEXT,"
       "type TEXT,"
       "argsstring TEXT,"
       "scope TEXT,"
       "initializer TEXT,"
-      "prot INTEGER NOT NULL,"
-      "static INTEGER NOT NULL,"
+      "prot INTEGER,"
       "const INTEGER,"
+      "virt INTEGER,"
+      "static INTEGER NOT NULL,"
       "explicit INTEGER,"
       "inline INTEGER,"
       "final INTEGER,"
@@ -189,7 +105,6 @@ const char * schema_queries[][2] =
       "new INTEGER,"
       "optional INTEGER,"
       "required INTEGER,"
-      "virt INTEGER,"
       "mutable INTEGER,"
       "initonly INTEGER,"
       "readable INTEGER,"
@@ -201,14 +116,177 @@ const char * schema_queries[][2] =
       "removable INTEGER,"
       "raisable INTEGER,"
       "kind INTEGER,"
+      "id_bodyfile INTEGER,"
+      "bodystart INTEGER,"
+      "bodyend INTEGER,"
+      "detaileddescription TEXT,"
+      "briefdescription TEXT,"
+      "inbodydescription TEXT"
+      ")"
+  },
+  { "compounddef",
+    "CREATE TABLE IF NOT EXISTS compounddef ("
+      "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+      "name TEXT NOT NULL,"
+      "kind TEXT NOT NULL,"
+      "prot INTEGER NOT NULL,"
       "refid TEXT NOT NULL,"
-      "id_bfile INTEGER,"
-      "bline INTEGER,"
-      "bcolumn INTEGER,"
       "id_file INTEGER NOT NULL,"
       "line INTEGER NOT NULL,"
       "column INTEGER NOT NULL)"
   },
+  { "basecompoundref",
+    "CREATE TABLE IF NOT EXISTS basecompoundref ("
+      "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+      "base TEXT NOT NULL,"
+      "derived TEXT NOT NULL,"
+      "refid TEXT NOT NULL,"
+      "prot INTEGER NOT NULL,"
+      "virt INTEGER NOT NULL)"
+  },
+  { "derivedcompoundref",
+    "CREATE TABLE IF NOT EXISTS derivedcompoundref ("
+      "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+      "base TEXT NOT NULL,"
+      "derived TEXT NOT NULL,"
+      "refid TEXT NOT NULL,"
+      "prot INTEGER NOT NULL,"
+      "virt INTEGER NOT NULL)"
+  },
+  { "params",
+    "CREATE TABLE IF NOT EXISTS params ("
+      "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+      "attributes TEXT,"
+      "type TEXT,"
+      "declname TEXT,"
+      "defnname TEXT,"
+      "array TEXT,"
+      "defval TEXT,"
+      "briefdescription TEXT)"
+  },
+  { "memberdef_params",
+    "CREATE TABLE IF NOT EXISTS memberdef_params ("
+      "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+      "id_memberdef INTEGER NOT NULL,"
+      "id_param INTEGER NOT NULL)"
+  },
+  { "innernamespaces",
+    "CREATE TABLE IF NOT EXISTS innernamespaces ("
+      "rowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
+      "refid TEXT NOT NULL,"
+      "name TEXT NOT NULL)"
+  }
+};
+
+//////////////////////////////////////////////////////
+struct SqlStmt {
+  const char   *query;
+  sqlite3_stmt *stmt;
+};
+//////////////////////////////////////////////////////
+SqlStmt incl_insert = { "INSERT INTO includes "
+  "( local, id_src, id_dst ) "
+    "VALUES "
+    "(:local,:id_src,:id_dst )"
+    ,NULL
+};
+SqlStmt incl_select = { "SELECT COUNT(*) FROM includes WHERE "
+  "local=:local AND id_src=:id_src AND id_dst=:id_dst"
+    ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt innerclass_insert={"INSERT INTO innerclass "
+    "( refid, prot, name )"
+    "VALUES "
+    "(:refid,:prot,:name )"
+    ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt files_select = {"SELECT rowid FROM files WHERE name=:name"
+  ,NULL
+};
+SqlStmt files_insert = {"INSERT INTO files "
+  "( name )"
+    "VALUES "
+    "(:name )"
+    ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt refids_select =  {"SELECT rowid FROM refids WHERE "
+  "refid=:refid"
+    ,NULL
+};
+SqlStmt refids_insert = {"INSERT INTO refids "
+  "( refid )"
+    "VALUES "
+    "(:refid )"
+    ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt xrefs_insert= {"INSERT INTO xrefs "
+  "( refid_src, refid_dst, id_file, line, column )"
+    "VALUES "
+    "(:refid_src,:refid_dst,:id_file,:line,:column )"
+    ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt memberdef_insert={"INSERT INTO memberdef "
+    "( refid, prot, static, const, explicit, inline, final, sealed, new, optional, required, virt, mutable, initonly, readable, writable, gettable, settable, accessor, addable, removable, raisable, name, type, definition, argsstring, scope, initializer, kind, id_bodyfile, bodystart, bodyend, id_file, line, column, detaileddescription, briefdescription, inbodydescription)"
+    "VALUES "
+    "(:refid,:prot,:static,:const,:explicit,:inline,:final,:sealed,:new,:optional,:required,:virt,:mutable,:initonly,:readable,:writable,:gettable,:settable,:accessor,:addable,:removable,:raisable,:name,:type,:definition,:argsstring,:scope,:initializer,:kind,:id_bodyfile,:bodystart,:bodyend,:id_file,:line,:column,:detaileddescription,:briefdescription,:inbodydescription)"
+    ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt compounddef_insert={"INSERT INTO compounddef "
+    "( name, kind, prot, refid, id_file, line, column ) "
+    "VALUES "
+    "(:name,:kind,:prot,:refid,:id_file,:line,:column )"
+    ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt basecompoundref_insert={"INSERT INTO  basecompoundref "
+    "( base, derived, refid, prot, virt ) "
+    "VALUES "
+    "(:base,:derived,:refid,:prot,:virt )"
+    ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt derivedcompoundref_insert={"INSERT INTO  derivedcompoundref "
+    "( refid, prot, virt, base, derived ) "
+    "VALUES "
+    "(:refid,:prot,:virt,:base,:derived )"
+    ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt params_select = { "SELECT rowid FROM  params WHERE "
+    "(attributes IS NULL OR attributes=:attributes) AND "
+    "(type IS NULL OR type=:type) AND "
+    "(declname IS NULL OR declname=:declname) AND "
+    "(defnname IS NULL OR defnname=:defnname) AND "
+    "(array IS NULL OR array=:array) AND "
+    "(defval IS NULL OR defval=:defval) AND "
+    "(briefdescription IS NULL OR briefdescription=:briefdescription)"
+    ,NULL
+};
+SqlStmt params_insert = { "INSERT INTO  params "
+  "( attributes, type, declname, defnname, array, defval, briefdescription ) "
+    "VALUES "
+    "(:attributes,:type,:declname,:defnname,:array,:defval,:briefdescription)"
+    ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt memberdef_params_insert={ "INSERT INTO  memberdef_params "
+    "( id_memberdef, id_param)"
+    "VALUES "
+    "(:id_memberdef,:id_param)"
+    ,NULL
+};
+//////////////////////////////////////////////////////
+SqlStmt innernamespace_insert={"INSERT INTO  innernamespaces "
+    "( refid, name)"
+    "VALUES "
+    "(:refid,:name)",
+    NULL
 };
 
 
@@ -242,78 +320,194 @@ class TextGeneratorSqlite3Impl : public TextGeneratorIntf
 };
 
 
-static void bindTextParameter(sqlite3_stmt *stmt,const char *name,const char *value, bool _static=TRUE)
+static void bindTextParameter(SqlStmt &s,const char *name,const char *value, bool _static=TRUE)
 {
-  int idx = sqlite3_bind_parameter_index(stmt, name);
-  sqlite3_bind_text(stmt, idx, value, -1, _static==TRUE?SQLITE_STATIC:SQLITE_TRANSIENT);
+  int idx = sqlite3_bind_parameter_index(s.stmt, name);
+  sqlite3_bind_text(s.stmt, idx, value, -1, _static==TRUE?SQLITE_STATIC:SQLITE_TRANSIENT);
 }
 
-static void bindIntParameter(sqlite3_stmt *stmt,const char *name,int value)
+static void bindIntParameter(SqlStmt &s,const char *name,int value)
 {
-  int idx = sqlite3_bind_parameter_index(stmt, name);
-  sqlite3_bind_int(stmt, idx, value);
+  int idx = sqlite3_bind_parameter_index(s.stmt, name);
+  sqlite3_bind_int(s.stmt, idx, value);
 }
 
-static int step(sqlite3 *db, sqlite3_stmt *stmt,bool getRowId=FALSE)
+static int step(sqlite3 *db, SqlStmt &s,bool getRowId=FALSE, bool select=FALSE)
 {
-  int id=-1;
-  int rc = sqlite3_step(stmt);
+  int rowid=-1;
+  int rc = sqlite3_step(s.stmt);
   if (rc!=SQLITE_DONE && rc!=SQLITE_ROW)
   {
     msg("sqlite3_step failed: %s\n", sqlite3_errmsg(db));
+    sqlite3_clear_bindings(s.stmt);
     return -1;
   }
-  if (getRowId) id = sqlite3_column_int(stmt, 0);
-  sqlite3_reset(stmt);
-  return id;
+  if (getRowId && select) rowid = sqlite3_column_int(s.stmt, 0); // works on selects, doesnt on inserts
+  if (getRowId && !select) rowid = sqlite3_last_insert_rowid(db); //works on inserts, doesnt on selects
+  sqlite3_reset(s.stmt);
+  sqlite3_clear_bindings(s.stmt); // XXX When should this really be called
+  return rowid;
 }
 
 static int insertFile(sqlite3 *db, const char* name)
 {
-  int id=-1;
-  if (name==0) return -1;
+  int rowid=-1;
+  if (name==0) return rowid;
 
-  // see if it's already in DB
-  bindTextParameter(id_s_files,":name",name);
-  id=step(db,id_s_files,TRUE);
-  if (id==0)
+  bindTextParameter(files_select,":name",name);
+  rowid=step(db,files_select,TRUE,TRUE);
+  if (rowid==0)
   {
-    // insert it
-    bindTextParameter(i_s_files,":name",name);
+    bindTextParameter(files_insert,":name",name);
+    rowid=step(db,files_insert,TRUE);
+  }
+  return rowid;
+}
+
+static int insertRefid(sqlite3 *db, const char *refid)
+{
+  int rowid=-1;
+  if (refid==0) return rowid;
 
-    step(db,i_s_files);
-    id=sqlite3_last_insert_rowid(db);
+  bindTextParameter(refids_select,":refid",refid);
+  rowid=step(db,refids_select,TRUE,TRUE);
+  if (rowid==0)
+  {
+    bindTextParameter(refids_insert,":refid",refid);
+    rowid=step(db,refids_insert,TRUE);
   }
-  return id;
+  return rowid;
 }
 
-static int insertMemberReference(sqlite3 *db, const char*src, const char*dst, const char *file, int line, int column)
+
+static void insertMemberReference(sqlite3 *db, const char*src, const char*dst, const char *file, int line, int column)
 {
   int id_file = insertFile(db,file);
-  bindTextParameter(i_s_xrefs,":src",src);
-  bindTextParameter(i_s_xrefs,":dst",dst);
-
-  bindIntParameter(i_s_xrefs,":id_file",id_file);
-  bindIntParameter(i_s_xrefs,":line",line);
-  bindIntParameter(i_s_xrefs,":column",column);
+  int refid_src = insertRefid(db,src);
+  int refid_dst = insertRefid(db,dst);
+  if (id_file==-1||refid_src==-1||refid_dst==-1)
+    return;
 
-return step(db,i_s_xrefs);
+  bindIntParameter(xrefs_insert,":refid_src",refid_src);
+  bindIntParameter(xrefs_insert,":refid_dst",refid_dst);
+  bindIntParameter(xrefs_insert,":id_file",id_file);
+  bindIntParameter(xrefs_insert,":line",line);
+  bindIntParameter(xrefs_insert,":column",1);
+  step(db,xrefs_insert);
 }
 
 static void insertMemberReference(sqlite3 *db, MemberDef *src, MemberDef *dst, const char*floc)
 {
   if (dst->getStartBodyLine()!=-1 && dst->getBodyDef())
   {
-    char file[4096] = { 0 };
+    static char file[4096];
     int line=0,column=0;
     if (floc)
     {
-      sscanf(floc,"%[^:]:%d:%d",file,&line,&column);
+      int rv = sscanf(floc,"%[^:]:%d:%d",file,&line,&column);
+      if (rv!=3)
+      {
+        msg("unable to read file loc from[%s]\n",floc);
+        return;
+      }
     }
     insertMemberReference(db,src->anchor().data(),dst->anchor().data(),file,line,column);
   }
 }
 
+static void insertMemberFunctionParams(sqlite3 *db,int id_memberdef,MemberDef *md,Definition *def)
+{
+  ArgumentList *declAl = md->declArgumentList();
+  ArgumentList *defAl = md->argumentList();
+  if (declAl!=0 && declAl->count()>0)
+  {
+    ArgumentListIterator declAli(*declAl);
+    ArgumentListIterator defAli(*defAl);
+    Argument *a;
+    for (declAli.toFirst();(a=declAli.current());++declAli)
+    {
+      Argument *defArg = defAli.current();
+
+      if (!a->attrib.isEmpty())
+      {
+        bindTextParameter(params_select,":attributes",a->attrib.data());
+        bindTextParameter(params_insert,":attributes",a->attrib.data());
+      }
+      if (!a->type.isEmpty())
+      {
+        StringList l;
+        linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->type);
+
+        StringListIterator li(l);
+        QCString *s;
+        while ((s=li.current()))
+        {
+          insertMemberReference(db,md->anchor().data(),s->data(),def->getDefFileName().data(),md->getDefLine(),1);
+          ++li;
+        }
+        bindTextParameter(params_select,":type",a->type.data());
+        bindTextParameter(params_insert,":type",a->type.data());
+      }
+      if (!a->name.isEmpty())
+      {
+        bindTextParameter(params_select,":declname",a->name.data());
+        bindTextParameter(params_insert,":declname",a->name.data());
+      }
+      if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
+      {
+        bindTextParameter(params_select,":defnname",defArg->name.data());
+        bindTextParameter(params_insert,":defnname",defArg->name.data());
+      }
+      if (!a->array.isEmpty())
+      {
+        bindTextParameter(params_select,":array",a->array.data());
+        bindTextParameter(params_insert,":array",a->array.data());
+      }
+      if (!a->defval.isEmpty())
+      {
+        StringList l;
+        linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->defval);
+        bindTextParameter(params_select,":defval",a->defval.data());
+        bindTextParameter(params_insert,":defval",a->defval.data());
+      }
+      if (defArg) ++defAli;
+
+      int id_param=step(db,params_select,TRUE,TRUE);
+      if (id_param==0) {
+        id_param=step(db,params_insert,TRUE);
+      }
+
+      bindIntParameter(memberdef_params_insert,":id_memberdef",id_memberdef);
+      bindIntParameter(memberdef_params_insert,":id_param",id_param);
+      step(db,memberdef_params_insert);
+    }
+  }
+}
+
+static void insertMemberDefineParams(sqlite3 *db,int id_memberdef,MemberDef *md,Definition *def)
+{
+    if (md->argumentList()->count()==0) // special case for "foo()" to
+                                        // disguish it from "foo".
+    {
+      DBG_CTX(("no params\n"));
+    }
+    else
+    {
+      ArgumentListIterator ali(*md->argumentList());
+      Argument *a;
+      for (ali.toFirst();(a=ali.current());++ali)
+      {
+        bindTextParameter(params_insert,":defnname",a->type.data());
+        int id_param=step(db,params_insert,TRUE);
+
+        bindIntParameter(memberdef_params_insert,":id_memberdef",id_memberdef);
+        bindIntParameter(memberdef_params_insert,":id_param",id_param);
+        step(db,memberdef_params_insert);
+      }
+    }
+}
+
+
 static void stripQualifiers(QCString &typeStr)
 {
   bool done=FALSE;
@@ -327,13 +521,13 @@ static void stripQualifiers(QCString &typeStr)
   }
 }
 
-static int prepareStatement(sqlite3 *db, const char* query, sqlite3_stmt **statement)
+static int prepareStatement(sqlite3 *db, SqlStmt &s)
 {
   int rc;
-  rc = sqlite3_prepare_v2(db,query,-1,statement,0);
+  rc = sqlite3_prepare_v2(db,s.query,-1,&s.stmt,0);
   if (rc!=SQLITE_OK)
   {
-    msg("prepare failed for %s\n%s\n", query, sqlite3_errmsg(db));
+    msg("prepare failed for %s\n%s\n", s.query, sqlite3_errmsg(db));
     return -1;
   }
   return rc;
@@ -342,17 +536,22 @@ static int prepareStatement(sqlite3 *db, const char* query, sqlite3_stmt **state
 static int prepareStatements(sqlite3 *db)
 {
   if (
-  -1==prepareStatement(db, id_q_memberdef, &id_s_memberdef) ||
-  -1==prepareStatement(db, id_q_files, &id_s_files) ||
-  -1==prepareStatement(db, i_q_files, &i_s_files) ||
-  -1==prepareStatement(db, i_q_xrefs, &i_s_xrefs) ||
-  -1==prepareStatement(db, i_q_innerclass, &i_s_innerclass) ||
-  -1==prepareStatement(db, i_q_memberdef, &i_s_memberdef) ||
-  -1==prepareStatement(db, i_q_compounddef, &i_s_compounddef) ||
-  -1==prepareStatement(db, i_q_basecompoundref, &i_s_basecompoundref) ||
-  -1==prepareStatement(db, i_q_derivedcompoundref, &i_s_derivedcompoundref) ||
-  -1==prepareStatement(db, i_q_includes, &i_s_includes)||
-  -1==prepareStatement(db, c_q_includes, &c_s_includes)
+  -1==prepareStatement(db, memberdef_insert) ||
+  -1==prepareStatement(db, files_insert) ||
+  -1==prepareStatement(db, files_select) ||
+  -1==prepareStatement(db, refids_insert) ||
+  -1==prepareStatement(db, refids_select) ||
+  -1==prepareStatement(db, incl_insert)||
+  -1==prepareStatement(db, incl_select)||
+  -1==prepareStatement(db, params_insert) ||
+  -1==prepareStatement(db, params_select) ||
+  -1==prepareStatement(db, xrefs_insert) ||
+  -1==prepareStatement(db, innerclass_insert) ||
+  -1==prepareStatement(db, compounddef_insert) ||
+  -1==prepareStatement(db, basecompoundref_insert) ||
+  -1==prepareStatement(db, derivedcompoundref_insert) ||
+  -1==prepareStatement(db, memberdef_params_insert)||
+  -1==prepareStatement(db, innernamespace_insert)
   )
   {
     return -1;
@@ -377,6 +576,7 @@ static void pragmaTuning(sqlite3 *db)
   char * sErrMsg = 0;
   sqlite3_exec(db, "PRAGMA synchronous = OFF", NULL, NULL, &sErrMsg);
   sqlite3_exec(db, "PRAGMA journal_mode = MEMORY", NULL, NULL, &sErrMsg);
+  sqlite3_exec(db, "PRAGMA temp_store = MEMORY;", NULL, NULL, &sErrMsg);
 }
 
 static int initializeSchema(sqlite3* db)
@@ -387,7 +587,6 @@ static int initializeSchema(sqlite3* db)
   msg("Initializing DB schema...\n");
   for (unsigned int k = 0; k < sizeof(schema_queries) / sizeof(schema_queries[0]); k++)
   {
-    //const char *tname = schema_queries[k][0];
     const char *q = schema_queries[k][1];
     // create table
     rc = sqlite3_prepare_v2(db, q, -1, &stmt, 0);
@@ -418,18 +617,17 @@ static void writeInnerClasses(sqlite3*db,const ClassSDict *cl)
   {
     if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes
     {
-      bindTextParameter(i_s_innerclass,":refid",cd->getOutputFileBase(),FALSE);
-      bindIntParameter(i_s_innerclass,":prot",cd->protection());
-      bindTextParameter(i_s_innerclass,":name",cd->name());
-      if (-1==step(db,i_s_innerclass))
-          return;
+      bindTextParameter(innerclass_insert,":refid",cd->getOutputFileBase(),FALSE);
+      bindIntParameter(innerclass_insert,":prot",cd->protection());
+      bindTextParameter(innerclass_insert,":name",cd->name());
+      step(db,innerclass_insert);
     }
   }
 }
 
-static void writeInnerNamespaces(sqlite3 * /*db*/,const NamespaceSDict *nl)
+
+static void writeInnerNamespaces(sqlite3 *db,const NamespaceSDict *nl)
 {
-#warning WorkInProgress
   if (nl)
   {
     NamespaceSDict::Iterator nli(*nl);
@@ -438,25 +636,62 @@ static void writeInnerNamespaces(sqlite3 * /*db*/,const NamespaceSDict *nl)
     {
       if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
       {
-//        t << "    <innernamespace refid=\"" << nd->getOutputFileBase()
-//          << "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
+        bindTextParameter(innernamespace_insert,":refid",nd->getOutputFileBase(),FALSE);
+        bindTextParameter(innernamespace_insert,":name",nd->name(),FALSE);
+        step(db,innernamespace_insert);
       }
     }
   }
 }
 
-static void writeTemplateArgumentList(sqlite3* /*db*/,
-                                      ArgumentList * /*al*/,
-                                      Definition * /*scope*/,
-                                      FileDef * /*fileScope*/,
-                                      int /*indent*/)
+
+static void writeTemplateArgumentList(sqlite3* db,
+                                      ArgumentList * al,
+                                      Definition * scope,
+                                      FileDef * fileScope)
 {
-#warning WorkInProgress
+  if (al)
+  {
+    ArgumentListIterator ali(*al);
+    Argument *a;
+    for (ali.toFirst();(a=ali.current());++ali)
+    {
+      if (!a->type.isEmpty())
+      {
+        #warning linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->type);
+        bindTextParameter(params_select,":type",a->type);
+        bindTextParameter(params_insert,":type",a->type);
+      }
+      if (!a->name.isEmpty())
+      {
+        bindTextParameter(params_select,":declname",a->name);
+        bindTextParameter(params_insert,":declname",a->name);
+        bindTextParameter(params_select,":defnname",a->name);
+        bindTextParameter(params_insert,":defnname",a->name);
+      }
+      if (!a->defval.isEmpty())
+      {
+        #warning linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->defval);
+        bindTextParameter(params_select,":defval",a->defval);
+        bindTextParameter(params_insert,":defval",a->defval);
+      }
+      if (!step(db,params_select,TRUE,TRUE))
+        step(db,params_insert);
+    }
+  }
 }
 
+static void writeMemberTemplateLists(sqlite3* db,MemberDef *md)
+{
+  ArgumentList *templMd = md->templateArguments();
+  if (templMd) // function template prefix
+  {
+    writeTemplateArgumentList(db,templMd,md->getClassDef(),md->getFileDef());
+  }
+}
 static void writeTemplateList(sqlite3*db,ClassDef *cd)
 {
-  writeTemplateArgumentList(db,cd->templateArguments(),cd,0,4);
+  writeTemplateArgumentList(db,cd->templateArguments(),cd,0);
 }
 ////////////////////////////////////////////
 
@@ -476,7 +711,6 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
   // + template arguments
   //     (templateArguments(), definitionTemplateParameterLists())
   // - call graph
-  msg("=====%s\n",md->name().data());
 
   // enum values are written as part of the enum
   if (md->memberType()==MemberType_EnumValue) return;
@@ -487,10 +721,11 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
   //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
   QCString memType;
   // memberdef
-  bindTextParameter(i_s_memberdef,":refid",md->anchor().data(),FALSE);
-  bindIntParameter(i_s_memberdef,":kind",md->memberType());
-  bindIntParameter(i_s_memberdef,":prot",md->protection());
-  bindIntParameter(i_s_memberdef,":static",md->isStatic());
+  bindTextParameter(memberdef_insert,":refid",md->anchor().data(),FALSE);
+  bindIntParameter(memberdef_insert,":kind",md->memberType());
+  bindIntParameter(memberdef_insert,":prot",md->protection());
+
+  bindIntParameter(memberdef_insert,":static",md->isStatic());
 
   bool isFunc=FALSE;
   switch (md->memberType())
@@ -510,45 +745,44 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
     ArgumentList *al = md->argumentList();
     if (al!=0 && al->constSpecifier)
     {
-      bindIntParameter(i_s_memberdef,":const",al->constSpecifier);
+      bindIntParameter(memberdef_insert,":const",al->constSpecifier);
     }
-
-    bindIntParameter(i_s_memberdef,":explicit",md->isExplicit());
-    bindIntParameter(i_s_memberdef,":inline",md->isInline());
-    bindIntParameter(i_s_memberdef,":final",md->isFinal());
-    bindIntParameter(i_s_memberdef,":sealed",md->isSealed());
-    bindIntParameter(i_s_memberdef,":new",md->isNew());
-    bindIntParameter(i_s_memberdef,":optional",md->isOptional());
-    bindIntParameter(i_s_memberdef,":required",md->isRequired());
-    bindIntParameter(i_s_memberdef,":virt",md->virtualness());
+    bindIntParameter(memberdef_insert,":explicit",md->isExplicit());
+    bindIntParameter(memberdef_insert,":inline",md->isInline());
+    bindIntParameter(memberdef_insert,":final",md->isFinal());
+    bindIntParameter(memberdef_insert,":sealed",md->isSealed());
+    bindIntParameter(memberdef_insert,":new",md->isNew());
+    bindIntParameter(memberdef_insert,":optional",md->isOptional());
+    bindIntParameter(memberdef_insert,":required",md->isRequired());
+    
+    bindIntParameter(memberdef_insert,":virt",md->virtualness());
   }
   // place in the arguments and linkify the arguments
 
   if (md->memberType() == MemberType_Variable)
   {
-    bindIntParameter(i_s_memberdef,":mutable",md->isMutable());
-    bindIntParameter(i_s_memberdef,":initonly",md->isInitonly());
+    bindIntParameter(memberdef_insert,":mutable",md->isMutable());
+    bindIntParameter(memberdef_insert,":initonly",md->isInitonly());
   }
   else if (md->memberType() == MemberType_Property)
   {
-    bindIntParameter(i_s_memberdef,":readable",md->isReadable());
-    bindIntParameter(i_s_memberdef,":writable",md->isWritable());
-    bindIntParameter(i_s_memberdef,":gettable",md->isGettable());
-    bindIntParameter(i_s_memberdef,":settable",md->isSettable());
-
+    bindIntParameter(memberdef_insert,":readable",md->isReadable());
+    bindIntParameter(memberdef_insert,":writable",md->isWritable());
+    bindIntParameter(memberdef_insert,":gettable",md->isGettable());
+    bindIntParameter(memberdef_insert,":settable",md->isSettable());
     if (md->isAssign() || md->isCopy() || md->isRetain())
     {
       int accessor = md->isAssign() ? md->isAssign() :
           (md->isCopy() ? md->isCopy() : md->isRetain()) ;
 
-      bindIntParameter(i_s_memberdef,":accessor",accessor);
+      bindIntParameter(memberdef_insert,":accessor",accessor);
     }
   }
   else if (md->memberType() == MemberType_Event)
   {
-    bindIntParameter(i_s_memberdef,":addable",md->isAddable());
-    bindIntParameter(i_s_memberdef,":removable",md->isRemovable());
-    bindIntParameter(i_s_memberdef,":raisable",md->isRaisable());
+    bindIntParameter(memberdef_insert,":addable",md->isAddable());
+    bindIntParameter(memberdef_insert,":removable",md->isRemovable());
+    bindIntParameter(memberdef_insert,":raisable",md->isRaisable());
   }
 
   // + declaration/definition arg lists
@@ -556,121 +790,55 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
       md->memberType()!=MemberType_Enumeration
      )
   {
+    if (md->memberType()!=MemberType_Typedef)
+    {
+      writeMemberTemplateLists(db,md);
+    }
     QCString typeStr = md->typeString();
     stripQualifiers(typeStr);
     StringList l;
     linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,typeStr);
     if (typeStr.data())
     {
-      bindTextParameter(i_s_memberdef,":type",typeStr.data(),FALSE);
+      bindTextParameter(memberdef_insert,":type",typeStr.data(),FALSE);
     }
 
     if (md->definition())
     {
-      bindTextParameter(i_s_memberdef,":definition",md->definition());
+      bindTextParameter(memberdef_insert,":definition",md->definition());
     }
 
     if (md->argsString())
     {
-      bindTextParameter(i_s_memberdef,":argsstring",md->argsString());
+      bindTextParameter(memberdef_insert,":argsstring",md->argsString());
     }
   }
 
-  bindTextParameter(i_s_memberdef,":name",md->name());
+  bindTextParameter(memberdef_insert,":name",md->name());
 
   if (md->memberType() == MemberType_Property)
   {
     if (md->isReadable())
     {
-      DBG_CTX(("<read>\n"));
+      bindIntParameter(memberdef_insert,":readable",1);
     }
     if (md->isWritable())
     {
-      DBG_CTX(("<write>\n"));
-    }
-  }
-  if (isFunc) //function
-  {
-    ArgumentList *declAl = md->declArgumentList();
-    ArgumentList *defAl = md->argumentList();
-    if (declAl!=0 && declAl->count()>0)
-    {
-      ArgumentListIterator declAli(*declAl);
-      ArgumentListIterator defAli(*defAl);
-      Argument *a;
-      for (declAli.toFirst();(a=declAli.current());++declAli)
-      {
-        Argument *defArg = defAli.current();
-        DBG_CTX(("<param>\n"));
-        if (!a->attrib.isEmpty())
-        {
-          DBG_CTX(("<attributes>:%s\n",a->attrib.data()));
-        }
-        if (!a->type.isEmpty())
-        {
-          StringList l;
-          linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->type);
-
-          QCString *s=l.first();
-          while (s)
-          {
-            insertMemberReference(db,md->anchor().data(),s->data(),def->getDefFileName().data(),md->getDefLine(),1);
-            s=l.next();
-          }
-        }
-        if (!a->name.isEmpty())
-        {
-          DBG_CTX(("<declname>%s\n",a->name.data()));
-        }
-        if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
-        {
-          DBG_CTX(("<defname>%s\n",defArg->name.data()));
-        }
-        if (!a->array.isEmpty())
-        {
-          DBG_CTX(("<array>%s",a->array.data()));
-        }
-        if (!a->defval.isEmpty())
-        {
-          StringList l;
-          linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->defval);
-        }
-        if (defArg) ++defAli;
-      }
-    }
-  }
-  else if (md->memberType()==MemberType_Define &&
-          md->argsString()) // define
-  {
-    if (md->argumentList()->count()==0) // special case for "foo()" to
-                                        // disguish it from "foo".
-    {
-      DBG_CTX(("no params\n"));
-    }
-    else
-    {
-      ArgumentListIterator ali(*md->argumentList());
-      Argument *a;
-      for (ali.toFirst();(a=ali.current());++ali)
-      {
-        DBG_CTX(("<param><defname>%s\n",a->type.data()));
-      }
+      bindIntParameter(memberdef_insert,":writable",1);
     }
   }
 
 
   // Extract references from initializer
-  // avoid that extremely large tables are written to the output.
-  // todo: it's better to adhere to MAX_INITIALIZER_LINES.
-  // drm_mod_register_buffer,
-  if (!md->initializer().isEmpty() && md->initializer().length()<2000)
+  if (md->hasMultiLineInitializer() || md->hasOneLineInitializer())
   {
-    bindTextParameter(i_s_memberdef,":initializer",md->initializer().data());
+    bindTextParameter(memberdef_insert,":initializer",md->initializer().data());
 
     StringList l;
     linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,md->initializer());
-    QCString *s=l.first();
-    while (s)
+    StringListIterator li(l);
+    QCString *s;
+    while ((s=li.current()))
     {
       if (md->getBodyDef())
       {
@@ -681,48 +849,58 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
               md->getStartBodyLine()));
         insertMemberReference(db,md->anchor().data(),s->data(),md->getBodyDef()->getDefFileName().data(),md->getStartBodyLine(),1);
       }
-      s=l.next();
+      ++li;
     }
   }
 
   if ( md->getScopeString() )
   {
-    bindTextParameter(i_s_memberdef,":scope",md->getScopeString().data(),FALSE);
+    bindTextParameter(memberdef_insert,":scope",md->getScopeString().data(),FALSE);
   }
 
+  // +Brief, detailed and inbody description
+  bindTextParameter(memberdef_insert,":briefdescription",md->briefDescription(),FALSE);
+  bindTextParameter(memberdef_insert,":detaileddescription",md->documentation(),FALSE);
+  bindTextParameter(memberdef_insert,":inbodydescription",md->inbodyDocumentation(),FALSE);
+
   // File location
   if (md->getDefLine() != -1)
   {
     int id_file = insertFile(db,md->getDefFileName());
     if (id_file!=-1)
     {
-      bindIntParameter(i_s_memberdef,":id_file",id_file);
-      bindIntParameter(i_s_memberdef,":line",md->getDefLine());
-      bindIntParameter(i_s_memberdef,":column",md->getDefColumn());
+      bindIntParameter(memberdef_insert,":id_file",id_file);
+      bindIntParameter(memberdef_insert,":line",md->getDefLine());
+      bindIntParameter(memberdef_insert,":column",md->getDefColumn());
 
       if (md->getStartBodyLine()!=-1)
       {
-        int id_bfile = insertFile(db,md->getBodyDef()->absFilePath());
-        if (id_bfile == -1)
+        int id_bodyfile = insertFile(db,md->getBodyDef()->absFilePath());
+        if (id_bodyfile == -1)
         {
-            sqlite3_clear_bindings(i_s_memberdef);
-            return;
+            sqlite3_clear_bindings(memberdef_insert.stmt);
+        }
+        else
+        {
+            bindIntParameter(memberdef_insert,":id_bodyfile",id_bodyfile);
+            bindIntParameter(memberdef_insert,":bodystart",md->getStartBodyLine());
+            bindIntParameter(memberdef_insert,":bodyend",md->getEndBodyLine());
         }
-
-        bindIntParameter(i_s_memberdef,":id_ibfile",id_bfile);
-        bindIntParameter(i_s_memberdef,":bline",md->getStartBodyLine());
-
-        // XXX implement getStartBodyColumn
-        bindIntParameter(i_s_memberdef,":bcolumn",1);
       }
     }
   }
 
-  if (-1==step(db,i_s_memberdef))
+  int id_memberdef=step(db,memberdef_insert,TRUE);
+
+  if (isFunc)
+  {
+    insertMemberFunctionParams(db,id_memberdef,md,def);
+  }
+  else if (md->memberType()==MemberType_Define &&
+          md->argsString())
   {
-      sqlite3_clear_bindings(i_s_memberdef);
+    insertMemberDefineParams(db,id_memberdef,md,def);
   }
-  /*int id_src =*/ sqlite3_last_insert_rowid(db);
 
   // + source references
   // The cross-references in initializers only work when both the src and dst
@@ -737,7 +915,6 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
       insertMemberReference(db,md,rmd,mdi.currentKey());
     }
   }
-
   // + source referenced by
   mdict = md->getReferencedByMembers();
   if (mdict!=0)
@@ -762,7 +939,6 @@ static void generateSqlite3Section(sqlite3*db,
   int count=0;
   for (mli.toFirst();(md=mli.current());++mli)
   {
-    msg("I:%s\n",md->name().data());
     // namespace members are also inserted in the file scope, but
     // to prevent this duplication in the XML output, we filter those here.
     if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
@@ -808,24 +984,17 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
 
   msg("Generating Sqlite3 output for class %s\n",cd->name().data());
 
-  //int idx,rc;
-  //sqlite3_stmt *stmt ;
-
-  // + compounddef
-  //stmt = i_s_compounddef;
-
-  bindTextParameter(i_s_compounddef,":name",cd->name());
-  bindTextParameter(i_s_compounddef,":kind",cd->compoundTypeString(),FALSE);
-  bindIntParameter(i_s_compounddef,":prot",cd->protection());
-  bindTextParameter(i_s_compounddef,":refid",cd->getOutputFileBase(),FALSE);
+  bindTextParameter(compounddef_insert,":name",cd->name());
+  bindTextParameter(compounddef_insert,":kind",cd->compoundTypeString(),FALSE);
+  bindIntParameter(compounddef_insert,":prot",cd->protection());
+  bindTextParameter(compounddef_insert,":refid",cd->getOutputFileBase(),FALSE);
 
   int id_file = insertFile(db,cd->getDefFileName().data());
-  bindIntParameter(i_s_compounddef,":id_file",id_file);
-  bindIntParameter(i_s_compounddef,":line",cd->getDefLine());
-  bindIntParameter(i_s_compounddef,":column",cd->getDefColumn());
+  bindIntParameter(compounddef_insert,":id_file",id_file);
+  bindIntParameter(compounddef_insert,":line",cd->getDefLine());
+  bindIntParameter(compounddef_insert,":column",cd->getDefColumn());
 
-  if (-1==step(db,i_s_compounddef))
-    return;
+  step(db,compounddef_insert);
 
   // + list of direct super classes
   if (cd->baseClasses())
@@ -834,21 +1003,20 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
     BaseClassDef *bcd;
     for (bcli.toFirst();(bcd=bcli.current());++bcli)
     {
-      bindTextParameter(i_s_basecompoundref,":refid",bcd->classDef->getOutputFileBase());
-      bindIntParameter(i_s_basecompoundref,":prot",bcd->prot);
-      bindIntParameter(i_s_basecompoundref,":virt",bcd->virt);
+      bindTextParameter(basecompoundref_insert,":refid",bcd->classDef->getOutputFileBase(),FALSE);
+      bindIntParameter(basecompoundref_insert,":prot",bcd->prot);
+      bindIntParameter(basecompoundref_insert,":virt",bcd->virt);
 
       if (!bcd->templSpecifiers.isEmpty())
       {
-        bindTextParameter(i_s_basecompoundref,":base",insertTemplateSpecifierInScope(bcd->classDef->name(),bcd->templSpecifiers));
+        bindTextParameter(basecompoundref_insert,":base",insertTemplateSpecifierInScope(bcd->classDef->name(),bcd->templSpecifiers),FALSE);
       }
       else
       {
-        bindTextParameter(i_s_basecompoundref,":base",bcd->classDef->displayName());
+        bindTextParameter(basecompoundref_insert,":base",bcd->classDef->displayName(),FALSE);
       }
-      bindTextParameter(i_s_basecompoundref,":derived",cd->displayName());
-      if (-1==step(db,i_s_basecompoundref))
-        continue;
+      bindTextParameter(basecompoundref_insert,":derived",cd->displayName(),FALSE);
+      step(db,basecompoundref_insert);
     }
   }
 
@@ -859,13 +1027,12 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
     BaseClassDef *bcd;
     for (bcli.toFirst();(bcd=bcli.current());++bcli)
     {
-      bindTextParameter(i_s_derivedcompoundref,":base",cd->displayName());
-      bindTextParameter(i_s_derivedcompoundref,":dervied",bcd->classDef->displayName());
-      bindTextParameter(i_s_derivedcompoundref,":refid",bcd->classDef->getOutputFileBase());
-      bindIntParameter(i_s_derivedcompoundref,":prot",bcd->prot);
-      bindIntParameter(i_s_derivedcompoundref,":virt",bcd->virt);
-      if (-1==step(db,i_s_derivedcompoundref))
-        continue;
+      bindTextParameter(derivedcompoundref_insert,":base",cd->displayName());
+      bindTextParameter(derivedcompoundref_insert,":dervied",bcd->classDef->displayName());
+      bindTextParameter(derivedcompoundref_insert,":refid",bcd->classDef->getOutputFileBase());
+      bindIntParameter(derivedcompoundref_insert,":prot",bcd->prot);
+      bindIntParameter(derivedcompoundref_insert,":virt",bcd->virt);
+      step(db,derivedcompoundref_insert);
     }
   }
 
@@ -877,21 +1044,22 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
     if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
     if (!nm.isEmpty())
     {
-      bindIntParameter(c_s_includes,":local",ii->local);
-      bindIntParameter(c_s_includes,":id_src",id_file);
-      bindTextParameter(c_s_includes,":dst",nm);
-      int count=step(db,c_s_includes,TRUE);
-      if (count==0)
-      {
-        bindIntParameter(i_s_includes,":local",ii->local);
-        bindIntParameter(i_s_includes,":id_src",id_file);
-        bindTextParameter(i_s_includes,":dst",nm);
-        if (-1==step(db,i_s_includes))
-          return;
+      int id_dst=insertFile(db,nm);
+      if (id_dst!=-1) {
+        bindIntParameter(incl_select,":local",ii->local);
+        bindIntParameter(incl_select,":id_src",id_file);
+        bindIntParameter(incl_select,":id_dst",id_dst);
+        int count=step(db,incl_select,TRUE,TRUE);
+        if (count==0)
+        {
+          bindIntParameter(incl_insert,":local",ii->local);
+          bindIntParameter(incl_insert,":id_src",id_file);
+          bindIntParameter(incl_insert,":id_dst",id_dst);
+          step(db,incl_insert);
+        }
       }
     }
   }
-
   // + list of inner classes
   writeInnerClasses(db,cd->getClassSDict());
 
@@ -990,12 +1158,17 @@ static void generateSqlite3ForFile(sqlite3 *db, FileDef *fd)
     QListIterator<IncludeInfo> ili(*fd->includeFileList());
     for (ili.toFirst();(ii=ili.current());++ili)
     {
-      int id_file=insertFile(db,fd->absFilePath().data());
-      bindIntParameter(i_s_includes,":local",ii->local);
-      bindIntParameter(i_s_includes,":id_src",id_file);
-      bindTextParameter(i_s_includes,":dst",ii->includeName.data(),FALSE);
-      if (-1==step(db,i_s_includes))
-        continue;
+      int id_src=insertFile(db,fd->absFilePath().data());
+      int id_dst=insertFile(db,ii->includeName.data());
+      bindIntParameter(incl_select,":local",ii->local);
+      bindIntParameter(incl_select,":id_src",id_src);
+      bindIntParameter(incl_select,":id_dst",id_dst);
+      if (step(db,incl_select,TRUE,TRUE)==0) {
+        bindIntParameter(incl_insert,":local",ii->local);
+        bindIntParameter(incl_insert,":id_src",id_src);
+        bindIntParameter(incl_insert,":id_dst",id_dst);
+        step(db,incl_insert);
+      }
     }
   }
 
@@ -1005,13 +1178,17 @@ static void generateSqlite3ForFile(sqlite3 *db, FileDef *fd)
     QListIterator<IncludeInfo> ili(*fd->includedByFileList());
     for (ili.toFirst();(ii=ili.current());++ili)
     {
-      int id_file=insertFile(db,ii->includeName);
-      bindIntParameter(i_s_includes,":local",ii->local);
-      bindIntParameter(i_s_includes,":id_src",id_file);
-      bindTextParameter(i_s_includes,":dst",fd->absFilePath().data(),FALSE);
-      if (-1==step(db,i_s_includes))
-        continue;
-
+      int id_src=insertFile(db,ii->includeName);
+      int id_dst=insertFile(db,fd->absFilePath());
+      bindIntParameter(incl_select,":local",ii->local);
+      bindIntParameter(incl_select,":id_src",id_src);
+      bindIntParameter(incl_select,":id_dst",id_dst);
+      if (step(db,incl_select,TRUE,TRUE)==0) {
+        bindIntParameter(incl_insert,":local",ii->local);
+        bindIntParameter(incl_insert,":id_src",id_src);
+        bindIntParameter(incl_insert,":id_dst",id_dst);
+        step(db,incl_insert);
+      }
     }
   }
 
@@ -1053,16 +1230,17 @@ static void generateSqlite3ForFile(sqlite3 *db, FileDef *fd)
 
 static void generateSqlite3ForGroup(sqlite3*db,GroupDef *gd)
 {
-    db=db;
-    gd=gd;
+#warning WorkInProgress
 }
 
 static void generateSqlite3ForDir(sqlite3 *db,DirDef *dd)
 {
+#warning WorkInProgress
 }
 
 static void generateSqlite3ForPage(sqlite3 *db,PageDef *pd,bool isExample)
 {
+#warning WorkInProgress
 }
 //////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////
@@ -1189,4 +1367,4 @@ void generateSqlite3()
   err("sqlite3 support has not been compiled in!");
 }
 #endif
-
+// vim: noai:ts=2:sw=2:ss=2:expandtab
index 689f1da..59664dd 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 7e5118a..8916015 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index d075dc0..597ea63 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 03cc020..036e24f 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -1120,7 +1120,7 @@ void TagFileParser::addDocAnchors(Entry *e,const TagAnchorInfoList &l)
     {
       //printf("New sectionInfo file=%s anchor=%s\n",
       //    ta->fileName.data(),ta->label.data());
-      SectionInfo *si=new SectionInfo(ta->fileName,ta->label,ta->title,
+      SectionInfo *si=new SectionInfo(ta->fileName,-1,ta->label,ta->title,
           SectionInfo::Anchor,0,m_tagName);
       Doxygen::sectionDict->append(ta->label,si);
       e->anchors->append(si);
@@ -1274,8 +1274,9 @@ static QCString stripPath(const QCString &s)
 void TagFileParser::buildLists(Entry *root)
 {
   // build class list
-  TagClassInfo *tci = m_tagFileClasses.first();
-  while (tci)
+  QListIterator<TagClassInfo> cit(m_tagFileClasses);
+  TagClassInfo *tci;
+  for (cit.toFirst();(tci=cit.current());++cit)
   {
     Entry *ce = new Entry;
     ce->section = Entry::CLASS_SEC;
@@ -1290,7 +1291,7 @@ void TagFileParser::buildLists(Entry *root)
       case TagClassInfo::Category:  ce->spec = Entry::Category;  break;
     }
     ce->name     = tci->name;
-    if (tci->kind==TagClassInfo::Protocol) 
+    if (tci->kind==TagClassInfo::Protocol)
     {
       ce->name+="-p";
     }
@@ -1309,14 +1310,14 @@ void TagFileParser::buildLists(Entry *root)
     }
     if (tci->templateArguments)
     {
-      if (ce->tArgLists==0) 
+      if (ce->tArgLists==0)
       {
         ce->tArgLists = new QList<ArgumentList>;
         ce->tArgLists->setAutoDelete(TRUE);
       }
       ArgumentList *al = new ArgumentList;
       ce->tArgLists->append(al);
-      
+
       QListIterator<QCString> sli(*tci->templateArguments);
       QCString *argName;
       for (;(argName=sli.current());++sli)
@@ -1330,12 +1331,12 @@ void TagFileParser::buildLists(Entry *root)
 
     buildMemberList(ce,tci->members);
     root->addSubEntry(ce);
-    tci = m_tagFileClasses.next();
   }
 
   // build file list
-  TagFileInfo *tfi = m_tagFileFiles.first();
-  while (tfi)
+  QListIterator<TagFileInfo> fit(m_tagFileFiles);
+  TagFileInfo *tfi;
+  for (fit.toFirst();(tfi=fit.current());++fit)
   {
     Entry *fe = new Entry;
     fe->section = guessSection(tfi->name);
@@ -1367,12 +1368,12 @@ void TagFileParser::buildLists(Entry *root)
     }
     buildMemberList(fe,tfi->members);
     root->addSubEntry(fe);
-    tfi = m_tagFileFiles.next();
   }
 
   // build namespace list
-  TagNamespaceInfo *tni = m_tagFileNamespaces.first();
-  while (tni)
+  QListIterator<TagNamespaceInfo> nit(m_tagFileNamespaces);
+  TagNamespaceInfo *tni;
+  for (nit.toFirst();(tni=nit.current());++nit)
   {
     Entry *ne    = new Entry;
     ne->section  = Entry::NAMESPACE_SEC;
@@ -1386,12 +1387,12 @@ void TagFileParser::buildLists(Entry *root)
 
     buildMemberList(ne,tni->members);
     root->addSubEntry(ne);
-    tni = m_tagFileNamespaces.next();
   }
 
   // build package list
-  TagPackageInfo *tpgi = m_tagFilePackages.first();
-  while (tpgi)
+  QListIterator<TagPackageInfo> pit(m_tagFilePackages);
+  TagPackageInfo *tpgi;
+  for (pit.toFirst();(tpgi=pit.current());++pit)
   {
     Entry *pe    = new Entry;
     pe->section  = Entry::PACKAGE_SEC;
@@ -1404,34 +1405,31 @@ void TagFileParser::buildLists(Entry *root)
 
     buildMemberList(pe,tpgi->members);
     root->addSubEntry(pe);
-    tpgi = m_tagFilePackages.next();
   }
 
-  // build group list, but only if config file says to include it
-  //if (Config_getBool("EXTERNAL_GROUPS")) 
-  //{
-    TagGroupInfo *tgi = m_tagFileGroups.first();
-    while (tgi)
-    {
-      Entry *ge    = new Entry;
-      ge->section  = Entry::GROUPDOC_SEC;
-      ge->name     = tgi->name;
-      ge->type     = tgi->title;
-      addDocAnchors(ge,tgi->docAnchors);
-      TagInfo *ti  = new TagInfo;
-      ti->tagName  = m_tagName;
-      ti->fileName = tgi->filename;
-      ge->tagInfo  = ti;
-      
-      buildMemberList(ge,tgi->members);
-      root->addSubEntry(ge);
-      tgi = m_tagFileGroups.next();
-    }
-  //}
+  // build group list
+  QListIterator<TagGroupInfo> git(m_tagFileGroups);
+  TagGroupInfo *tgi;
+  for (git.toFirst();(tgi=git.current());++git)
+  {
+    Entry *ge    = new Entry;
+    ge->section  = Entry::GROUPDOC_SEC;
+    ge->name     = tgi->name;
+    ge->type     = tgi->title;
+    addDocAnchors(ge,tgi->docAnchors);
+    TagInfo *ti  = new TagInfo;
+    ti->tagName  = m_tagName;
+    ti->fileName = tgi->filename;
+    ge->tagInfo  = ti;
+
+    buildMemberList(ge,tgi->members);
+    root->addSubEntry(ge);
+  }
 
   // build page list
-  TagPageInfo *tpi = m_tagFilePages.first();
-  while (tpi)
+  QListIterator<TagPageInfo> pgit(m_tagFilePages);
+  TagPageInfo *tpi;
+  for (pgit.toFirst();(tpi=pgit.current());++pgit)
   {
     Entry *pe    = new Entry;
     pe->section  = Entry::PAGEDOC_SEC;
@@ -1444,14 +1442,14 @@ void TagFileParser::buildLists(Entry *root)
     pe->tagInfo  = ti;
 
     root->addSubEntry(pe);
-    tpi = m_tagFilePages.next();
   }
 }
 
 void TagFileParser::addIncludes()
 {
-  TagFileInfo *tfi = m_tagFileFiles.first();
-  while (tfi)
+  QListIterator<TagFileInfo> fit(m_tagFileFiles);
+  TagFileInfo *tfi;
+  for (fit.toFirst();(tfi=fit.current());++fit)
   {
     //printf("tag file tagName=%s path=%s name=%s\n",m_tagName.data(),tfi->path.data(),tfi->name.data());
     FileName *fn = Doxygen::inputNameDict->find(tfi->name);
@@ -1489,9 +1487,8 @@ void TagFileParser::addIncludes()
             }
           }
         }
-      } 
+      }
     }
-    tfi = m_tagFileFiles.next();
   }
 }
 
index 73619db..1b5f7e3 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 02627b4..baa8e84 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  * Copyright (C) 2010-2011 by Rene Zaumseil
  *
  * Permission to use, copy, modify, and distribute this software and its
index 8144afd..64d3523 100644 (file)
@@ -29,7 +29,8 @@ class TemplateToken;
 
 //-------------------------------------------------------------------
 
-static QValueList<QCString> split(const QCString &str,const QCString &sep,bool allowEmptyEntries=FALSE,bool cleanup=TRUE)
+static QValueList<QCString> split(const QCString &str,const QCString &sep,
+                                  bool allowEmptyEntries=FALSE,bool cleanup=TRUE)
 {
   QValueList<QCString> lst;
 
@@ -102,8 +103,8 @@ class TemplateVariant::Private
     int                 intVal;
     QCString            strVal;
     bool                boolVal;
-    const TemplateStructIntf *strukt;
-    const TemplateListIntf   *list;
+    TemplateStructIntf *strukt;
+    TemplateListIntf   *list;
     Delegate            delegate;
     bool                raw;
 };
@@ -144,17 +145,20 @@ TemplateVariant::TemplateVariant(const QCString &s,bool raw)
   p->raw = raw;
 }
 
-TemplateVariant::TemplateVariant(const TemplateStructIntf *s)
+TemplateVariant::TemplateVariant(TemplateStructIntf *s)
 {
   p = new Private;
   p->type = Struct;
-  p->strukt = s; }
+  p->strukt = s;
+  p->strukt->addRef();
+}
 
-TemplateVariant::TemplateVariant(const TemplateListIntf *l)
+TemplateVariant::TemplateVariant(TemplateListIntf *l)
 {
   p = new Private;
   p->type = List;
   p->list = l;
+  p->list->addRef();
 }
 
 TemplateVariant::TemplateVariant(const TemplateVariant::Delegate &delegate)
@@ -166,6 +170,8 @@ TemplateVariant::TemplateVariant(const TemplateVariant::Delegate &delegate)
 
 TemplateVariant::~TemplateVariant()
 {
+  if (p->type==Struct) p->strukt->release();
+  else if (p->type==List) p->list->release();
   delete p;
 }
 
@@ -180,14 +186,20 @@ TemplateVariant::TemplateVariant(const TemplateVariant &v)
     case Bool:     p->boolVal = v.p->boolVal; break;
     case Integer:  p->intVal  = v.p->intVal;  break;
     case String:   p->strVal  = v.p->strVal;  break;
-    case Struct:   p->strukt  = v.p->strukt;  break;
-    case List:     p->list    = v.p->list;    break;
+    case Struct:   p->strukt  = v.p->strukt;  p->strukt->addRef(); break;
+    case List:     p->list    = v.p->list;    p->list->addRef();   break;
     case Function: p->delegate= v.p->delegate;break;
   }
 }
 
 TemplateVariant &TemplateVariant::operator=(const TemplateVariant &v)
 {
+  // assignment can change the type of the variable, so we have to be
+  // careful with reference counted content.
+  TemplateStructIntf *tmpStruct = p->type==Struct ? p->strukt : 0;
+  TemplateListIntf   *tmpList   = p->type==List   ? p->list   : 0;
+  Type tmpType = p->type;
+
   p->type    = v.p->type;
   p->raw     = v.p->raw;
   switch (p->type)
@@ -196,10 +208,14 @@ TemplateVariant &TemplateVariant::operator=(const TemplateVariant &v)
     case Bool:     p->boolVal = v.p->boolVal; break;
     case Integer:  p->intVal  = v.p->intVal;  break;
     case String:   p->strVal  = v.p->strVal;  break;
-    case Struct:   p->strukt  = v.p->strukt;  break;
-    case List:     p->list    = v.p->list;    break;
+    case Struct:   p->strukt  = v.p->strukt;  p->strukt->addRef(); break;
+    case List:     p->list    = v.p->list;    p->list->addRef();   break;
     case Function: p->delegate= v.p->delegate;break;
   }
+
+  // release overwritten reference counted values
+  if      (tmpType==Struct && tmpStruct) tmpStruct->release();
+  else if (tmpType==List   && tmpList  ) tmpList->release();
   return *this;
 }
 
@@ -289,12 +305,12 @@ int TemplateVariant::toInt() const
   return result;
 }
 
-const TemplateStructIntf *TemplateVariant::toStruct() const
+TemplateStructIntf *TemplateVariant::toStruct() const
 {
   return p->type==Struct ? p->strukt : 0;
 }
 
-const TemplateListIntf *TemplateVariant::toList() const
+TemplateListIntf *TemplateVariant::toList() const
 {
   return p->type==List ? p->list : 0;
 }
@@ -352,9 +368,10 @@ bool TemplateVariant::raw() const
 class TemplateStruct::Private
 {
   public:
-    Private() : fields(17)
+    Private() : fields(17), refCount(0)
     { fields.setAutoDelete(TRUE); }
     QDict<TemplateVariant> fields;
+    int refCount;
 };
 
 TemplateStruct::TemplateStruct()
@@ -367,6 +384,21 @@ TemplateStruct::~TemplateStruct()
   delete p;
 }
 
+int TemplateStruct::addRef()
+{
+  return ++p->refCount;
+}
+
+int TemplateStruct::release()
+{
+  int count = --p->refCount;
+  if (count<=0)
+  {
+    delete this;
+  }
+  return count;
+}
+
 void TemplateStruct::set(const char *name,const TemplateVariant &v)
 {
   TemplateVariant *pv = p->fields.find(name);
@@ -386,6 +418,11 @@ TemplateVariant TemplateStruct::get(const char *name) const
   return v ? *v : TemplateVariant();
 }
 
+TemplateStruct *TemplateStruct::alloc()
+{
+  return new TemplateStruct;
+}
+
 //- Template list implementation ----------------------------------------------
 
 
@@ -393,9 +430,10 @@ TemplateVariant TemplateStruct::get(const char *name) const
 class TemplateList::Private
 {
   public:
-    Private() : index(-1) {}
+    Private() : index(-1), refCount(0) {}
     QValueList<TemplateVariant> elems;
     int index;
+    int refCount;
 };
 
 
@@ -409,6 +447,21 @@ TemplateList::~TemplateList()
   delete p;
 }
 
+int TemplateList::addRef()
+{
+  return ++p->refCount;
+}
+
+int TemplateList::release()
+{
+  int count = --p->refCount;
+  if (count<=0)
+  {
+    delete this;
+  }
+  return count;
+}
+
 int TemplateList::count() const
 {
   return p->elems.count();
@@ -491,6 +544,11 @@ TemplateVariant TemplateList::at(int index) const
   }
 }
 
+TemplateList *TemplateList::alloc()
+{
+  return new TemplateList;
+}
+
 //- Operator types ------------------------------------------------------------
 
 /** @brief Class representing operators that can appear in template expressions */
@@ -503,6 +561,8 @@ class Operator
          not
          in
          ==, !=, <, >, <=, >=
+         +, -
+         *, /, %
          |
          :
          ,
@@ -510,7 +570,9 @@ class Operator
     enum Type
     {
       Or, And, Not, In, Equal, NotEqual, Less, Greater, LessEqual,
-      GreaterEqual, Filter, Colon, Comma, Last
+      GreaterEqual, Plus, Minus, Multiply, Divide, Modulo, Filter, Colon, Comma,
+      LeftParen, RightParen,
+      Last
     };
 
     static const char *toString(Type op)
@@ -527,9 +589,16 @@ class Operator
         case Greater:      return ">";
         case LessEqual:    return "<=";
         case GreaterEqual: return ">=";
+        case Plus:         return "+";
+        case Minus:        return "-";
+        case Multiply:     return "*";
+        case Divide:       return "/";
+        case Modulo:       return "%";
         case Filter:       return "|";
         case Colon:        return ":";
         case Comma:        return ",";
+        case LeftParen:    return "(";
+        case RightParen:   return ")";
         case Last:         return "?";
       }
       return "?";
@@ -555,13 +624,21 @@ class TemplateBlockContext
     QDict< QList<TemplateNodeBlock> > m_blocks;
 };
 
+/** @brief A container to store a key-value pair */
+struct TemplateKeyValue
+{
+  TemplateKeyValue() {}
+  TemplateKeyValue(const QCString &k,const TemplateVariant &v) : key(k), value(v) {}
+  QCString key;
+  TemplateVariant value;
+};
 
 /** @brief Internal class representing the implementation of a template
  *  context */
 class TemplateContextImpl : public TemplateContext
 {
   public:
-    TemplateContextImpl();
+    TemplateContextImpl(const TemplateEngine *e);
     virtual ~TemplateContextImpl();
 
     // TemplateContext methods
@@ -572,33 +649,50 @@ class TemplateContextImpl : public TemplateContext
     const TemplateVariant *getRef(const QCString &name) const;
     void setOutputDirectory(const QCString &dir)
     { m_outputDir = dir; }
-    void setEscapeIntf(TemplateEscapeIntf *intf)
-    { m_escapeIntf = intf; }
-    void setSpacelessIntf(TemplateSpacelessIntf *intf)
-    { m_spacelessIntf = intf; }
+    void setEscapeIntf(const QCString &ext,TemplateEscapeIntf *intf)
+    {
+      int i=(!ext.isEmpty() && ext.at(0)=='.') ? 1 : 0;
+      m_escapeIntfDict.insert(ext.mid(i),new TemplateEscapeIntf*(intf));
+    }
+    void selectEscapeIntf(const QCString &ext)
+    { TemplateEscapeIntf **ppIntf = m_escapeIntfDict.find(ext);
+      m_activeEscapeIntf = ppIntf ? *ppIntf : 0;
+    }
+    void setActiveEscapeIntf(TemplateEscapeIntf *intf) { m_activeEscapeIntf = intf; }
+    void setSpacelessIntf(TemplateSpacelessIntf *intf) { m_spacelessIntf = intf; }
 
     // internal methods
     TemplateBlockContext *blockContext();
     TemplateVariant getPrimary(const QCString &name) const;
     void setLocation(const QCString &templateName,int line)
     { m_templateName=templateName; m_line=line; }
-    QCString templateName() const { return m_templateName; }
-    int line() const { return m_line; }
-    QCString outputDirectory() const { return m_outputDir; }
-    TemplateEscapeIntf *escapeIntf() const { return m_escapeIntf; }
+    QCString templateName() const                { return m_templateName; }
+    int line() const                             { return m_line; }
+    QCString outputDirectory() const             { return m_outputDir; }
+    TemplateEscapeIntf *escapeIntf() const       { return m_activeEscapeIntf; }
     TemplateSpacelessIntf *spacelessIntf() const { return m_spacelessIntf; }
-    void enableSpaceless(bool b) { m_spacelessEnabled=b; }
-    bool spacelessEnabled() const { return m_spacelessEnabled && m_spacelessIntf; }
+    void enableSpaceless(bool b)                 { m_spacelessEnabled=b; }
+    bool spacelessEnabled() const                { return m_spacelessEnabled && m_spacelessIntf; }
+    void warn(const char *fileName,int line,const char *fmt,...) const;
+
+    // index related functions
+    void openSubIndex(const QCString &indexName);
+    void closeSubIndex(const QCString &indexName);
+    void addIndexEntry(const QCString &indexName,const QValueList<TemplateKeyValue> &arguments);
 
   private:
+    const TemplateEngine *m_engine;
     QCString m_templateName;
     int m_line;
     QCString m_outputDir;
     QList< QDict<TemplateVariant> > m_contextStack;
     TemplateBlockContext m_blockContext;
-    TemplateEscapeIntf *m_escapeIntf;
+    QDict<TemplateEscapeIntf*> m_escapeIntfDict;
+    TemplateEscapeIntf *m_activeEscapeIntf;
     TemplateSpacelessIntf *m_spacelessIntf;
     bool m_spacelessEnabled;
+    TemplateAutoRef<TemplateStruct> m_indices;
+    QDict< QStack<TemplateVariant> > m_indexStacks;
 };
 
 //-----------------------------------------------------------------------------
@@ -874,7 +968,7 @@ class ExprAstVariable : public ExprAst
       TemplateVariant v = c->get(m_name);
       if (!v.isValid())
       {
-        warn(ci->templateName(),ci->line(),"undefined variable '%s' in expression",m_name.data());
+        ci->warn(ci->templateName(),ci->line(),"undefined variable '%s' in expression",m_name.data());
       }
       return v;
     }
@@ -887,7 +981,7 @@ class ExprAstFunctionVariable : public ExprAst
   public:
     ExprAstFunctionVariable(ExprAst *var,const QList<ExprAst> &args)
       : m_var(var), m_args(args)
-    { TRACE(("ExprAstFunctionVariable(%s)\n",var->name().data()));
+    { TRACE(("ExprAstFunctionVariable()\n"));
       m_args.setAutoDelete(TRUE);
     }
     virtual TemplateVariant resolve(TemplateContext *c)
@@ -928,7 +1022,7 @@ class ExprAstFilter : public ExprAst
       TemplateVariant result = TemplateFilterFactory::instance()->apply(m_name,v,arg,ok);
       if (!ok)
       {
-        warn(ci->templateName(),ci->line(),"unknown filter '%s'",m_name.data());
+        ci->warn(ci->templateName(),ci->line(),"unknown filter '%s'",m_name.data());
       }
       return result;
     }
@@ -979,6 +1073,28 @@ class ExprAstNegate : public ExprAst
     ExprAst *m_expr;
 };
 
+class ExprAstUnary : public ExprAst
+{
+  public:
+    ExprAstUnary(Operator::Type op,ExprAst *exp) : m_operator(op), m_exp(exp)
+    { TRACE(("ExprAstUnary %s\n",Operator::toString(op))); }
+   ~ExprAstUnary() { delete m_exp; }
+    virtual TemplateVariant resolve(TemplateContext *c)
+    {
+      TemplateVariant exp = m_exp->resolve(c);
+      switch (m_operator)
+      {
+        case Operator::Minus:
+          return -exp.toInt();
+        default:
+          return TemplateVariant();
+      }
+    }
+  private:
+    Operator::Type m_operator;
+    ExprAst *m_exp;
+};
+
 /** @brief Class representing a binary operator in the AST */
 class ExprAstBinary : public ExprAst
 {
@@ -989,6 +1105,7 @@ class ExprAstBinary : public ExprAst
    ~ExprAstBinary() { delete m_lhs; delete m_rhs; }
     virtual TemplateVariant resolve(TemplateContext *c)
     {
+      TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
       TemplateVariant lhs = m_lhs->resolve(c);
       TemplateVariant rhs = m_rhs ? m_rhs->resolve(c) : TemplateVariant();
       switch(m_operator)
@@ -1037,6 +1154,44 @@ class ExprAstBinary : public ExprAst
           {
             return lhs.toInt()>=rhs.toInt();
           }
+        case Operator::Plus:
+          {
+            return TemplateVariant(lhs.toInt() + rhs.toInt());
+          }
+        case Operator::Minus:
+          {
+            return TemplateVariant(lhs.toInt() - rhs.toInt());
+          }
+        case Operator::Multiply:
+          {
+            return TemplateVariant(lhs.toInt() * rhs.toInt());
+          }
+        case Operator::Divide:
+          {
+            int denom = rhs.toInt();
+            if (denom!=0)
+            {
+              return TemplateVariant(lhs.toInt() / denom);
+            }
+            else // divide by zero
+            {
+              ci->warn(ci->templateName(),ci->line(),"division by zero while evaluating expression is undefined");
+              return 0;
+            }
+          }
+        case Operator::Modulo:
+          {
+            int denom = rhs.toInt();
+            if (denom!=0)
+            {
+              return TemplateVariant(lhs.toInt() % denom);
+            }
+            else // module zero
+            {
+              ci->warn(ci->templateName(),ci->line(),"modulo zero while evaluating expression is undefined");
+              return 0;
+            }
+          }
         default:
           return TemplateVariant();
       }
@@ -1047,6 +1202,46 @@ class ExprAstBinary : public ExprAst
     ExprAst *m_rhs;
 };
 
+//----------------------------------------------------------
+
+/** @brief Base class of all nodes in a template's AST */
+class TemplateNode
+{
+  public:
+    TemplateNode(TemplateNode *parent) : m_parent(parent) {}
+    virtual ~TemplateNode() {}
+
+    virtual void render(FTextStream &ts, TemplateContext *c) = 0;
+
+    TemplateNode *parent() { return m_parent; }
+
+  private:
+    TemplateNode *m_parent;
+};
+
+//----------------------------------------------------------
+
+/** @brief Parser for templates */
+class TemplateParser
+{
+  public:
+    TemplateParser(const TemplateEngine *engine,
+                   const QCString &templateName,QList<TemplateToken> &tokens);
+    void parse(TemplateNode *parent,int line,const QStrList &stopAt,
+               QList<TemplateNode> &nodes);
+    bool hasNextToken() const;
+    TemplateToken *takeNextToken();
+    void removeNextToken();
+    void prependToken(const TemplateToken *token);
+    const TemplateToken *currentToken() const;
+    QCString templateName() const { return m_templateName; }
+    void warn(const char *fileName,int line,const char *fmt,...) const;
+  private:
+    const TemplateEngine *m_engine;
+    QCString m_templateName;
+    QList<TemplateToken> &m_tokens;
+};
+
 //--------------------------------------------------------------------
 
 /** @brief Recursive decent parser for Django style template expressions.
@@ -1054,8 +1249,8 @@ class ExprAstBinary : public ExprAst
 class ExpressionParser
 {
   public:
-    ExpressionParser(const QCString &templateName,int line)
-      : m_templateName(templateName), m_line(line), m_tokenStream(0)
+    ExpressionParser(const TemplateParser *parser,int line)
+      : m_parser(parser), m_line(line), m_tokenStream(0)
     {
     }
     virtual ~ExpressionParser()
@@ -1067,23 +1262,7 @@ class ExpressionParser
       if (expr==0) return 0;
       m_tokenStream = expr;
       getNextToken();
-      return parseOrExpression();
-    }
-
-    ExprAst *parsePrimary(const char *expr)
-    {
-      if (expr==0) return 0;
-      m_tokenStream = expr;
-      getNextToken();
-      return parsePrimaryExpression();
-    }
-
-    ExprAst *parseVariable(const char *varExpr)
-    {
-      if (varExpr==0) return 0;
-      m_tokenStream = varExpr;
-      getNextToken();
-      return parseFilteredVariable();
+      return parseExpression();
     }
 
   private:
@@ -1106,6 +1285,14 @@ class ExpressionParser
         Operator::Type op;
     };
 
+    ExprAst *parseExpression()
+    {
+      TRACE(("{parseExpression(%s)\n",m_tokenStream));
+      ExprAst *result = parseOrExpression();
+      TRACE(("}parseExpression(%s)\n",m_tokenStream));
+      return result;
+    }
+
     ExprAst *parseOrExpression()
     {
       TRACE(("{parseOrExpression(%s)\n",m_tokenStream));
@@ -1153,7 +1340,7 @@ class ExpressionParser
         ExprAst *expr = parseCompareExpression();
         if (expr==0)
         {
-          warn(m_templateName,m_line,"argument missing for not operator");
+          warn(m_parser->templateName(),m_line,"argument missing for not operator");
           return 0;
         }
         result = new ExprAstNegate(expr);
@@ -1169,7 +1356,7 @@ class ExpressionParser
     ExprAst *parseCompareExpression()
     {
       TRACE(("{parseCompareExpression(%s)\n",m_tokenStream));
-      ExprAst *lhs = parsePrimaryExpression();
+      ExprAst *lhs = parseAdditiveExpression();
       if (lhs)
       {
         Operator::Type op = m_curToken.op;
@@ -1192,6 +1379,74 @@ class ExpressionParser
       return lhs;
     }
 
+    ExprAst *parseAdditiveExpression()
+    {
+      TRACE(("{parseAdditiveExpression(%s)\n",m_tokenStream));
+      ExprAst *lhs = parseMultiplicativeExpression();
+      if (lhs)
+      {
+        while (m_curToken.type==ExprToken::Operator &&
+               (m_curToken.op==Operator::Plus || m_curToken.op==Operator::Minus))
+        {
+          Operator::Type op = m_curToken.op;
+          getNextToken();
+          ExprAst *rhs = parseMultiplicativeExpression();
+          lhs = new ExprAstBinary(op,lhs,rhs);
+        }
+      }
+      TRACE(("}parseAdditiveExpression(%s)\n",m_tokenStream));
+      return lhs;
+    }
+
+    ExprAst *parseMultiplicativeExpression()
+    {
+      TRACE(("{parseMultiplicativeExpression(%s)\n",m_tokenStream));
+      ExprAst *lhs = parseUnaryExpression();
+      if (lhs)
+      {
+        while (m_curToken.type==ExprToken::Operator &&
+               (m_curToken.op==Operator::Multiply || m_curToken.op==Operator::Divide || m_curToken.op==Operator::Modulo))
+        {
+          Operator::Type op = m_curToken.op;
+          getNextToken();
+          ExprAst *rhs = parseUnaryExpression();
+          lhs = new ExprAstBinary(op,lhs,rhs);
+        }
+      }
+      TRACE(("}parseMultiplicativeExpression(%s)\n",m_tokenStream));
+      return lhs;
+    }
+
+    ExprAst *parseUnaryExpression()
+    {
+      TRACE(("{parseUnaryExpression(%s)\n",m_tokenStream));
+      ExprAst *result=0;
+      if (m_curToken.type==ExprToken::Operator)
+      {
+        if (m_curToken.op==Operator::Plus)
+        {
+          getNextToken();
+          result = parsePrimaryExpression();
+        }
+        else if (m_curToken.op==Operator::Minus)
+        {
+          getNextToken();
+          ExprAst *rhs = parsePrimaryExpression();
+          result = new ExprAstUnary(m_curToken.op,rhs);
+        }
+        else
+        {
+          result = parsePrimaryExpression();
+        }
+      }
+      else
+      {
+        result = parsePrimaryExpression();
+      }
+      TRACE(("}parseUnaryExpression(%s)\n",m_tokenStream));
+      return result;
+    }
+
     ExprAst *parsePrimaryExpression()
     {
       TRACE(("{parsePrimary(%s)\n",m_tokenStream));
@@ -1207,16 +1462,29 @@ class ExpressionParser
         case ExprToken::Literal:
           result = parseLiteral();
           break;
-        default:
-          if (m_curToken.type==ExprToken::Operator)
+        case ExprToken::Operator:
+          if (m_curToken.op==Operator::LeftParen)
           {
-            warn(m_templateName,m_line,"unexpected operator '%s' in expression",
-                Operator::toString(m_curToken.op));
+            getNextToken(); // skip over opening bracket
+            result = parseExpression();
+            if (m_curToken.type!=ExprToken::Operator ||
+                m_curToken.op!=Operator::RightParen)
+            {
+              warn(m_parser->templateName(),m_line,"missing closing parenthesis");
+            }
+            else
+            {
+              getNextToken(); // skip over closing bracket
+            }
           }
           else
           {
-            warn(m_templateName,m_line,"unexpected token in expression");
+            warn(m_parser->templateName(),m_line,"unexpected operator '%s' in expression",
+                Operator::toString(m_curToken.op));
           }
+          break;
+        default:
+          warn(m_parser->templateName(),m_line,"unexpected token in expression");
       }
       TRACE(("}parsePrimary(%s)\n",m_tokenStream));
       return result;
@@ -1321,147 +1589,185 @@ class ExpressionParser
       if (p==0 || *p=='\0') return FALSE;
       while (*p==' ') p++; // skip over spaces
       char c=*p;
-      if (strncmp(p,"not ",4)==0)
-      {
-        m_curToken.type = ExprToken::Operator;
-        m_curToken.op = Operator::Not;
-        p+=4;
-      }
-      else if (strncmp(p,"and ",4)==0)
-      {
-        m_curToken.type = ExprToken::Operator;
-        m_curToken.op = Operator::And;
-        p+=4;
-      }
-      else if (strncmp(p,"or ",3)==0)
-      {
-        m_curToken.type = ExprToken::Operator;
-        m_curToken.op = Operator::Or;
-        p+=3;
-      }
-      else if (c=='=' && *(p+1)=='=')
-      {
-        m_curToken.type = ExprToken::Operator;
-        m_curToken.op = Operator::Equal;
-        p+=2;
-      }
-      else if (c=='!' && *(p+1)=='=')
-      {
-        m_curToken.type = ExprToken::Operator;
-        m_curToken.op = Operator::NotEqual;
-        p+=2;
-      }
-      else if (c=='<' && *(p+1)=='=')
-      {
-        m_curToken.type = ExprToken::Operator;
-        m_curToken.op = Operator::LessEqual;
-        p+=2;
-      }
-      else if (c=='>' && *(p+1)=='=')
-      {
-        m_curToken.type = ExprToken::Operator;
-        m_curToken.op = Operator::GreaterEqual;
-        p+=2;
-      }
-      else if (c=='<')
-      {
-        m_curToken.type = ExprToken::Operator;
-        m_curToken.op = Operator::Less;
-        p++;
-      }
-      else if (c=='>')
+      const char *q = p;
+      switch (c)
       {
-        m_curToken.type = ExprToken::Operator;
-        m_curToken.op = Operator::Greater;
-        p++;
-      }
-      else if (c=='|')
-      {
-        m_curToken.type = ExprToken::Operator;
-        m_curToken.op = Operator::Filter;
-        p++;
-      }
-      else if (c==':')
-      {
-        m_curToken.type = ExprToken::Operator;
-        m_curToken.op = Operator::Colon;
-        p++;
+        case '=':
+          if (c=='=' && *(p+1)=='=') // equal
+          {
+            m_curToken.op = Operator::Equal;
+            p+=2;
+          }
+          break;
+        case '!':
+          if (c=='!' && *(p+1)=='=') // not equal
+          {
+            m_curToken.op = Operator::NotEqual;
+            p+=2;
+          }
+          break;
+        case '<':
+          if (c=='<' && *(p+1)=='=') // less or equal
+          {
+            m_curToken.op = Operator::LessEqual;
+            p+=2;
+          }
+          else // less
+          {
+            m_curToken.op = Operator::Less;
+            p++;
+          }
+          break;
+        case '>':
+          if (c=='>' && *(p+1)=='=') // greater or equal
+          {
+            m_curToken.op = Operator::GreaterEqual;
+            p+=2;
+          }
+          else // greater
+          {
+            m_curToken.op = Operator::Greater;
+            p++;
+          }
+          break;
+        case '(':
+          m_curToken.op = Operator::LeftParen;
+          p++;
+          break;
+        case ')':
+          m_curToken.op = Operator::RightParen;
+          p++;
+          break;
+        case '|':
+          m_curToken.op = Operator::Filter;
+          p++;
+          break;
+        case '+':
+          m_curToken.op = Operator::Plus;
+          p++;
+          break;
+        case '-':
+          m_curToken.op = Operator::Minus;
+          p++;
+          break;
+        case '*':
+          m_curToken.op = Operator::Multiply;
+          p++;
+          break;
+        case '/':
+          m_curToken.op = Operator::Divide;
+          p++;
+          break;
+        case '%':
+          m_curToken.op = Operator::Modulo;
+          p++;
+          break;
+        case ':':
+          m_curToken.op = Operator::Colon;
+          p++;
+          break;
+        case ',':
+          m_curToken.op = Operator::Comma;
+          p++;
+          break;
+        case 'n':
+          if (strncmp(p,"not ",4)==0)
+          {
+            m_curToken.op = Operator::Not;
+            p+=4;
+          }
+          break;
+        case 'a':
+          if (strncmp(p,"and ",4)==0)
+          {
+            m_curToken.op = Operator::And;
+            p+=4;
+          }
+          break;
+        case 'o':
+          if (strncmp(p,"or ",3)==0)
+          {
+            m_curToken.op = Operator::Or;
+            p+=3;
+          }
+          break;
+        default:
+          break;
       }
-      else if (c==',')
+      if (p!=q) // found an operator
       {
         m_curToken.type = ExprToken::Operator;
-        m_curToken.op = Operator::Comma;
-        p++;
-      }
-      else if ((c=='-' && *(p+1)>='0' && *(p+1)<='9') || (c>='0' && c<='9'))
-      {
-        m_curToken.type = ExprToken::Number;
-        const char *np = p;
-        if (c=='-') np++;
-        m_curToken.num = 0;
-        while (*np>='0' && *np<='9')
-        {
-          m_curToken.num*=10;
-          m_curToken.num+=*np-'0';
-          np++;
-        }
-        if (c=='-') m_curToken.num=-m_curToken.num;
-        p=np;
       }
-      else if (c=='_' || (c>='a' && c<='z') || (c>='A' && c<='Z'))
+      else // no token found yet
       {
-        m_curToken.type = ExprToken::Identifier;
-        s[0]=c;
-        m_curToken.id = s;
-        p++;
-        while ((c=*p) &&
-            (c=='_' || c=='.' ||
-             (c>='a' && c<='z') ||
-             (c>='A' && c<='Z') ||
-             (c>='0' && c<='9'))
-            )
-        {
-          s[0]=c;
-          m_curToken.id+=s;
-          p++;
-        }
-        if (m_curToken.id=="True") // treat true literal as numerical 1
-        {
-          m_curToken.type = ExprToken::Number;
-          m_curToken.num = 1;
-        }
-        else if (m_curToken.id=="False") // treat false literal as numerical 0
+        if (c>='0' && c<='9') // number?
         {
           m_curToken.type = ExprToken::Number;
+          const char *np = p;
           m_curToken.num = 0;
+          while (*np>='0' && *np<='9')
+          {
+            m_curToken.num*=10;
+            m_curToken.num+=*np-'0';
+            np++;
+          }
+          p=np;
         }
-      }
-      else if (c=='"' || c=='\'')
-      {
-        m_curToken.type = ExprToken::Literal;
-        m_curToken.id.resize(0);
-        p++;
-        char tokenChar = c;
-        char cp=0;
-        while ((c=*p) && (c!=tokenChar || (c==tokenChar && cp=='\\')))
+        else if (c=='_' || (c>='a' && c<='z') || (c>='A' && c<='Z')) // identifier?
         {
+          m_curToken.type = ExprToken::Identifier;
           s[0]=c;
-          if (c!='\\' || cp=='\\') // don't add escapes
+          m_curToken.id = s;
+          p++;
+          while ((c=*p) &&
+              (c=='_' || c=='.' ||
+               (c>='a' && c<='z') ||
+               (c>='A' && c<='Z') ||
+               (c>='0' && c<='9'))
+              )
           {
+            s[0]=c;
             m_curToken.id+=s;
+            p++;
+          }
+          if (m_curToken.id=="True") // treat true literal as numerical 1
+          {
+            m_curToken.type = ExprToken::Number;
+            m_curToken.num = 1;
+          }
+          else if (m_curToken.id=="False") // treat false literal as numerical 0
+          {
+            m_curToken.type = ExprToken::Number;
+            m_curToken.num = 0;
           }
-          cp=c;
+        }
+        else if (c=='"' || c=='\'') // string literal
+        {
+          m_curToken.type = ExprToken::Literal;
+          m_curToken.id.resize(0);
           p++;
+          char tokenChar = c;
+          char cp=0;
+          while ((c=*p) && (c!=tokenChar || (c==tokenChar && cp=='\\')))
+          {
+            s[0]=c;
+            if (c!='\\' || cp=='\\') // don't add escapes
+            {
+              m_curToken.id+=s;
+            }
+            cp=c;
+            p++;
+          }
+          if (*p==tokenChar) p++;
         }
-        if (*p==tokenChar) p++;
       }
-      else
+      if (p==q) // still no valid token found -> error
       {
         m_curToken.type = ExprToken::Unknown;
         char s[2];
         s[0]=c;
         s[1]=0;
-        warn(m_templateName,m_line,"Found unknown token %s while parsing %s",s,m_tokenStream);
+        warn(m_parser->templateName(),m_line,"Found unknown token %s while parsing %s",s,m_tokenStream);
         m_curToken.id = s;
         p++;
       }
@@ -1472,51 +1778,14 @@ class ExpressionParser
       return TRUE;
     }
 
+    const TemplateParser *m_parser;
     ExprToken m_curToken;
-    QCString m_templateName;
     int m_line;
     const char *m_tokenStream;
 };
 
 //----------------------------------------------------------
 
-/** @brief Base class of all nodes in a template's AST */
-class TemplateNode
-{
-  public:
-    TemplateNode(TemplateNode *parent) : m_parent(parent) {}
-    virtual ~TemplateNode() {}
-
-    virtual void render(FTextStream &ts, TemplateContext *c) = 0;
-
-    TemplateNode *parent() { return m_parent; }
-
-  private:
-    TemplateNode *m_parent;
-};
-
-//----------------------------------------------------------
-
-/** @brief Parser for templates */
-class TemplateParser
-{
-  public:
-    TemplateParser(const QCString &templateName,QList<TemplateToken> &tokens);
-    void parse(TemplateNode *parent,int line,const QStrList &stopAt,
-               QList<TemplateNode> &nodes);
-    bool hasNextToken() const;
-    TemplateToken *takeNextToken();
-    void removeNextToken();
-    void prependToken(const TemplateToken *token);
-    const TemplateToken *currentToken() const;
-    QCString templateName() const { return m_templateName; }
-  private:
-    QCString m_templateName;
-    QList<TemplateToken> &m_tokens;
-};
-
-//----------------------------------------------------------
-
 /** @brief Class representing a lexical token in a template */
 class TemplateToken
 {
@@ -1558,28 +1827,30 @@ class TemplateImpl : public TemplateNode, public Template
 {
   public:
     TemplateImpl(TemplateEngine *e,const QCString &name,const QCString &data);
-    ~TemplateImpl() {}
     void render(FTextStream &ts, TemplateContext *c);
 
     TemplateEngine *engine() const { return m_engine; }
     TemplateBlockContext *blockContext() { return &m_blockContext; }
 
   private:
+    TemplateEngine *m_engine;
     QCString m_name;
     TemplateNodeList m_nodes;
-    TemplateEngine *m_engine;
     TemplateBlockContext m_blockContext;
 };
 
 //----------------------------------------------------------
 
 
-TemplateContextImpl::TemplateContextImpl()
-  : m_templateName("<unknown>"), m_line(1), m_escapeIntf(0),
-    m_spacelessIntf(0), m_spacelessEnabled(FALSE)
+TemplateContextImpl::TemplateContextImpl(const TemplateEngine *e)
+  : m_engine(e), m_templateName("<unknown>"), m_line(1), m_activeEscapeIntf(0),
+    m_spacelessIntf(0), m_spacelessEnabled(FALSE), m_indices(TemplateStruct::alloc())
 {
+  m_indexStacks.setAutoDelete(TRUE);
   m_contextStack.setAutoDelete(TRUE);
+  m_escapeIntfDict.setAutoDelete(TRUE);
   push();
+  set("index",m_indices.get());
 }
 
 TemplateContextImpl::~TemplateContextImpl()
@@ -1589,12 +1860,12 @@ TemplateContextImpl::~TemplateContextImpl()
 
 void TemplateContextImpl::set(const char *name,const TemplateVariant &v)
 {
-  TemplateVariant *pv = m_contextStack.first()->find(name);
+  TemplateVariant *pv = m_contextStack.getFirst()->find(name);
   if (pv)
   {
-    m_contextStack.first()->remove(name);
+    m_contextStack.getFirst()->remove(name);
   }
-  m_contextStack.first()->insert(name,new TemplateVariant(v));
+  m_contextStack.getFirst()->insert(name,new TemplateVariant(v));
 }
 
 TemplateVariant TemplateContextImpl::get(const QCString &name) const
@@ -1695,13 +1966,125 @@ void TemplateContextImpl::pop()
 {
   if (!m_contextStack.removeFirst())
   {
-    warn(m_templateName,m_line,"pop() called on empty context stack!\n");
+    warn(m_templateName,m_line,"pop() called on empty context stack!\n");
+  }
+}
+
+TemplateBlockContext *TemplateContextImpl::blockContext()
+{
+  return &m_blockContext;
+}
+
+void TemplateContextImpl::warn(const char *fileName,int line,const char *fmt,...) const
+{
+  va_list args;
+  va_start(args,fmt);
+  va_warn(fileName,line,fmt,args);
+  va_end(args);
+  m_engine->printIncludeContext(fileName,line);
+}
+
+void TemplateContextImpl::openSubIndex(const QCString &indexName)
+{
+  //printf("TemplateContextImpl::openSubIndex(%s)\n",indexName.data());
+  QStack<TemplateVariant> *stack = m_indexStacks.find(indexName);
+  if (!stack || stack->isEmpty() || stack->top()->type()==TemplateVariant::List) // error: no stack yet or no entry
+  {
+    warn(m_templateName,m_line,"opensubindex for index %s without preceding indexentry",indexName.data());
+    return;
+  }
+  // get the parent entry to add the list to
+  TemplateStruct *entry = dynamic_cast<TemplateStruct*>(stack->top()->toStruct());
+  if (entry)
+  {
+    // add new list to the stack
+    TemplateList *list = TemplateList::alloc();
+    stack->push(new TemplateVariant(list));
+    entry->set("children",list);
+    entry->set("is_leaf_node",false);
+  }
+}
+
+void TemplateContextImpl::closeSubIndex(const QCString &indexName)
+{
+  //printf("TemplateContextImpl::closeSubIndex(%s)\n",indexName.data());
+  QStack<TemplateVariant> *stack = m_indexStacks.find(indexName);
+  if (!stack || stack->count()<3)
+  {
+    warn(m_templateName,m_line,"closesubindex for index %s without matching open",indexName.data());
+  }
+  else // stack->count()>=2
+  {
+    if (stack->top()->type()==TemplateVariant::Struct)
+    {
+      delete stack->pop(); // pop struct
+      delete stack->pop(); // pop list
+    }
+    else // empty list! correct "is_left_node" attribute of the parent entry
+    {
+      delete stack->pop(); // pop list
+      TemplateStruct *entry = dynamic_cast<TemplateStruct*>(stack->top()->toStruct());
+      if (entry)
+      {
+        entry->set("is_leaf_node",true);
+      }
+    }
+  }
+}
+
+void TemplateContextImpl::addIndexEntry(const QCString &indexName,const QValueList<TemplateKeyValue> &arguments)
+{
+  QValueListConstIterator<TemplateKeyValue> it = arguments.begin();
+  //printf("TemplateContextImpl::addIndexEntry(%s)\n",indexName.data());
+  //while (it!=arguments.end())
+  //{
+  //  printf("  key=%s value=%s\n",(*it).key.data(),(*it).value.toString().data());
+  //  ++it;
+  //}
+  QStack<TemplateVariant> *stack = m_indexStacks.find(indexName);
+  if (!stack) // no stack yet, create it!
+  {
+    stack = new QStack<TemplateVariant>;
+    stack->setAutoDelete(TRUE);
+    m_indexStacks.insert(indexName,stack);
+  }
+  TemplateList *list  = 0;
+  if (stack->isEmpty()) // first item, create empty list and add it to the index
+  {
+    list = TemplateList::alloc();
+    stack->push(new TemplateVariant(list));
+    m_indices->set(indexName,list); // make list available under index
+  }
+  else // stack not empty
+  {
+    if (stack->top()->type()==TemplateVariant::Struct) // already an entry in the list
+    {
+      // remove current entry from the stack
+      delete stack->pop();
+    }
+    else // first entry after opensubindex
+    {
+      ASSERT(stack->top()->type()==TemplateVariant::List);
+    }
+    // get list to add new item
+    list = dynamic_cast<TemplateList*>(stack->top()->toList());
+  }
+  TemplateStruct *entry = TemplateStruct::alloc();
+  // add user specified fields to the entry
+  for (it=arguments.begin();it!=arguments.end();++it)
+  {
+    entry->set((*it).key,(*it).value);
+  }
+  if (list->count()>0)
+  {
+    TemplateStruct *lastEntry = dynamic_cast<TemplateStruct*>(list->at(list->count()-1).toStruct());
+    lastEntry->set("last",false);
   }
-}
-
-TemplateBlockContext *TemplateContextImpl::blockContext()
-{
-  return &m_blockContext;
+  entry->set("is_leaf_node",true);
+  entry->set("first",list->count()==0);
+  entry->set("last",true);
+  stack->push(new TemplateVariant(entry));
+  list->append(entry);
 }
 
 //----------------------------------------------------------
@@ -1743,8 +2126,12 @@ class TemplateNodeVariable : public TemplateNode
       : TemplateNode(parent), m_templateName(parser->templateName()), m_line(line)
     {
       TRACE(("TemplateNodeVariable(%s)\n",var.data()));
-      ExpressionParser expParser(m_templateName,line);
-      m_var = expParser.parseVariable(var);
+      ExpressionParser expParser(parser,line);
+      m_var = expParser.parse(var);
+      if (m_var==0)
+      {
+        parser->warn(m_templateName,line,"invalid expression '%s' for variable",var.data());
+      }
     }
     ~TemplateNodeVariable()
     {
@@ -1755,19 +2142,22 @@ class TemplateNodeVariable : public TemplateNode
     {
       TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
       ci->setLocation(m_templateName,m_line);
-      TemplateVariant v = m_var->resolve(c);
-      if (v.type()==TemplateVariant::Function)
-      {
-        v = v.call(QValueList<TemplateVariant>());
-      }
-      //printf("TemplateNodeVariable::render(%s) raw=%d\n",value.data(),v.raw());
-      if (ci->escapeIntf() && !v.raw())
-      {
-        ts << ci->escapeIntf()->escape(v.toString());
-      }
-      else
+      if (m_var)
       {
-        ts << v.toString();
+        TemplateVariant v = m_var->resolve(c);
+        if (v.type()==TemplateVariant::Function)
+        {
+          v = v.call(QValueList<TemplateVariant>());
+        }
+        //printf("TemplateNodeVariable::render(%s) raw=%d\n",value.data(),v.raw());
+        if (ci->escapeIntf() && !v.raw())
+        {
+          ts << ci->escapeIntf()->escape(v.toString());
+        }
+        else
+        {
+          ts << v.toString();
+        }
       }
     }
 
@@ -1818,22 +2208,45 @@ class TemplateNodeIf : public TemplateNodeCreator<TemplateNodeIf>
     TemplateNodeIf(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) :
       TemplateNodeCreator<TemplateNodeIf>(parser,parent,line)
     {
+      m_ifGuardedNodes.setAutoDelete(TRUE);
       TRACE(("{TemplateNodeIf(%s)\n",data.data()));
       if (data.isEmpty())
       {
-        warn(m_templateName,line,"missing argument for if tag");
+        parser->warn(m_templateName,line,"missing argument for if tag");
       }
       QStrList stopAt;
       stopAt.append("endif");
+      stopAt.append("elif");
       stopAt.append("else");
-      parser->parse(this,line,stopAt,m_trueNodes);
+
+      // if 'nodes'
+      GuardedNodes *guardedNodes = new GuardedNodes;
+      ExpressionParser ex(parser,line);
+      guardedNodes->line = line;
+      guardedNodes->guardAst = ex.parse(data);
+      parser->parse(this,line,stopAt,guardedNodes->trueNodes);
+      m_ifGuardedNodes.append(guardedNodes);
       TemplateToken *tok = parser->takeNextToken();
-      ExpressionParser ex(parser->templateName(),line);
-      m_guardAst = ex.parse(data);
 
+      // elif 'nodes'
+      while (tok && tok->data.left(5)=="elif ")
+      {
+        ExpressionParser ex(parser,line);
+        guardedNodes = new GuardedNodes;
+        guardedNodes->line = tok->line;
+        guardedNodes->guardAst = ex.parse(tok->data.mid(5));
+        parser->parse(this,tok->line,stopAt,guardedNodes->trueNodes);
+        m_ifGuardedNodes.append(guardedNodes);
+        // proceed to the next token
+        delete tok;
+        tok = parser->takeNextToken();
+      }
+
+      // else 'nodes'
       if (tok && tok->data=="else")
       {
-        stopAt.removeLast();
+        stopAt.removeLast(); // remove "else"
+        stopAt.removeLast(); // remove "elif"
         parser->parse(this,line,stopAt,m_falseNodes);
         parser->removeNextToken(); // skip over endif
       }
@@ -1842,29 +2255,48 @@ class TemplateNodeIf : public TemplateNodeCreator<TemplateNodeIf>
     }
     ~TemplateNodeIf()
     {
-      delete m_guardAst;
     }
 
     void render(FTextStream &ts, TemplateContext *c)
     {
-      dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line);
+      TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+      ci->setLocation(m_templateName,m_line);
       //printf("TemplateNodeIf::render #trueNodes=%d #falseNodes=%d\n",m_trueNodes.count(),m_falseNodes.count());
-      if (m_guardAst)
+      bool processed=FALSE;
+      QListIterator<GuardedNodes> li(m_ifGuardedNodes);
+      GuardedNodes *nodes;
+      for (li.toFirst();(nodes=li.current()) && !processed;++li)
       {
-        TemplateVariant guardValue = m_guardAst->resolve(c);
-        if (guardValue.toBool()) // guard is true, render corresponding nodes
+        if (nodes->guardAst)
         {
-          m_trueNodes.render(ts,c);
+          TemplateVariant guardValue = nodes->guardAst->resolve(c);
+          if (guardValue.toBool()) // render nodes for the first guard that evaluated to 'true'
+          {
+            nodes->trueNodes.render(ts,c);
+           processed=TRUE;
+          }
         }
-        else // guard is false, render corresponding nodes
+        else
         {
-          m_falseNodes.render(ts,c);
+          ci->warn(m_templateName,nodes->line,"invalid expression for if/elif");
         }
       }
+      if (!processed)
+      {
+        // all guards are false, render 'else' nodes
+        m_falseNodes.render(ts,c);
+      }
     }
   private:
-    ExprAst *m_guardAst;
-    TemplateNodeList m_trueNodes;
+    struct GuardedNodes
+    {
+      GuardedNodes() : guardAst(0) {}
+     ~GuardedNodes() { delete guardAst; }
+      int line;
+      ExprAst *guardAst;
+      TemplateNodeList trueNodes;
+    };
+    QList<GuardedNodes> m_ifGuardedNodes;
     TemplateNodeList m_falseNodes;
 };
 
@@ -1877,8 +2309,8 @@ class TemplateNodeRepeat : public TemplateNodeCreator<TemplateNodeRepeat>
       : TemplateNodeCreator<TemplateNodeRepeat>(parser,parent,line)
     {
       TRACE(("{TemplateNodeRepeat(%s)\n",data.data()));
-      ExpressionParser expParser(parser->templateName(),line);
-      m_expr = expParser.parseVariable(data);
+      ExpressionParser expParser(parser,line);
+      m_expr = expParser.parse(data);
       QStrList stopAt;
       stopAt.append("endrepeat");
       parser->parse(this,line,stopAt,m_repeatNodes);
@@ -1891,28 +2323,29 @@ class TemplateNodeRepeat : public TemplateNodeCreator<TemplateNodeRepeat>
     }
     void render(FTextStream &ts, TemplateContext *c)
     {
-      dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line);
+      TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+      ci->setLocation(m_templateName,m_line);
       TemplateVariant v;
       if (m_expr && (v=m_expr->resolve(c)).type()==TemplateVariant::Integer)
       {
         int i, n = v.toInt();
         for (i=0;i<n;i++)
         {
-          TemplateStruct s;
-          s.set("counter0",    (int)i);
-          s.set("counter",     (int)(i+1));
-          s.set("revcounter",  (int)(n-i));
-          s.set("revcounter0", (int)(n-i-1));
-          s.set("first",i==0);
-          s.set("last", i==n-1);
-          c->set("repeatloop",&s);
+          TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
+          s->set("counter0",    (int)i);
+          s->set("counter",     (int)(i+1));
+          s->set("revcounter",  (int)(n-i));
+          s->set("revcounter0", (int)(n-i-1));
+          s->set("first",i==0);
+          s->set("last", i==n-1);
+          c->set("repeatloop",s.get());
           // render all items for this iteration of the loop
           m_repeatNodes.render(ts,c);
         }
       }
       else // simple type...
       {
-        warn(m_templateName,m_line,"for requires a variable of list type!");
+        ci->warn(m_templateName,m_line,"for requires a variable of list type!");
       }
     }
   private:
@@ -1922,6 +2355,176 @@ class TemplateNodeRepeat : public TemplateNodeCreator<TemplateNodeRepeat>
 
 //----------------------------------------------------------
 
+/** @brief Class representing a 'range' tag in a template */
+class TemplateNodeRange : public TemplateNodeCreator<TemplateNodeRange>
+{
+  public:
+    TemplateNodeRange(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data)
+      : TemplateNodeCreator<TemplateNodeRange>(parser,parent,line)
+    {
+      TRACE(("{TemplateNodeRange(%s)\n",data.data()));
+      QCString start,end;
+      int i1 = data.find(" from ");
+      int i2 = data.find(" to ");
+      int i3 = data.find(" downto ");
+      if (i1==-1)
+      {
+        if (data.right(5)==" from")
+        {
+          parser->warn(m_templateName,line,"range missing after 'from' keyword");
+        }
+        else if (data=="from")
+        {
+          parser->warn(m_templateName,line,"range needs an iterator variable and a range");
+        }
+        else
+        {
+          parser->warn(m_templateName,line,"range is missing 'from' keyword");
+        }
+      }
+      else if (i2==-1 && i3==-1)
+      {
+        if (data.right(3)==" to")
+        {
+          parser->warn(m_templateName,line,"range is missing end value after 'to' keyword");
+        }
+        else if (data.right(7)==" downto")
+        {
+          parser->warn(m_templateName,line,"range is missing end value after 'downto' keyword");
+        }
+        else
+        {
+          parser->warn(m_templateName,line,"range is missing 'to' or 'downto' keyword");
+        }
+      }
+      else
+      {
+        m_var = data.left(i1).stripWhiteSpace();
+        if (m_var.isEmpty())
+        {
+          parser->warn(m_templateName,line,"range needs an iterator variable");
+        }
+        start = data.mid(i1+6,i2-i1-6).stripWhiteSpace();
+        if (i2!=-1)
+        {
+          end = data.right(data.length()-i2-4).stripWhiteSpace();
+          m_down = FALSE;
+        }
+        else if (i3!=-1)
+        {
+          end = data.right(data.length()-i3-8).stripWhiteSpace();
+          m_down = TRUE;
+        }
+      }
+      ExpressionParser expParser(parser,line);
+      m_startExpr = expParser.parse(start);
+      m_endExpr   = expParser.parse(end);
+
+      QStrList stopAt;
+      stopAt.append("endrange");
+      parser->parse(this,line,stopAt,m_loopNodes);
+      parser->removeNextToken(); // skip over endrange
+      TRACE(("}TemplateNodeRange(%s)\n",data.data()));
+    }
+
+    ~TemplateNodeRange()
+    {
+      delete m_startExpr;
+      delete m_endExpr;
+    }
+
+    void render(FTextStream &ts, TemplateContext *c)
+    {
+      TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+      ci->setLocation(m_templateName,m_line);
+      //printf("TemplateNodeRange::render #loopNodes=%d\n",
+      //    m_loopNodes.count());
+      if (m_startExpr && m_endExpr)
+      {
+        TemplateVariant vs = m_startExpr->resolve(c);
+        TemplateVariant ve = m_endExpr->resolve(c);
+        if (vs.type()==TemplateVariant::Integer && ve.type()==TemplateVariant::Integer)
+        {
+          int s = vs.toInt();
+          int e = ve.toInt();
+          int l = m_down ? s-e+1 : e-s+1;
+          if (l>0)
+          {
+            c->push();
+            //int index = m_reversed ? list.count() : 0;
+            TemplateVariant v;
+            const TemplateVariant *parentLoop = c->getRef("forloop");
+            uint index = 0;
+            int i = m_down ? e : s;
+            bool done=false;
+            while (!done)
+            {
+              // set the forloop meta-data variable
+              TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
+              s->set("counter0",    (int)index);
+              s->set("counter",     (int)(index+1));
+              s->set("revcounter",  (int)(l-index));
+              s->set("revcounter0", (int)(l-index-1));
+              s->set("first",index==0);
+              s->set("last", (int)index==l-1);
+              s->set("parentloop",parentLoop ? *parentLoop : TemplateVariant());
+              c->set("forloop",s.get());
+
+              // set the iterator variable
+              c->set(m_var,i);
+
+              // render all items for this iteration of the loop
+              m_loopNodes.render(ts,c);
+
+              index++;
+              if (m_down)
+              {
+                i--;
+                done = i<e;
+              }
+              else
+              {
+                i++;
+                done = i>e;
+              }
+            }
+            c->pop();
+          }
+          else
+          {
+            ci->warn(m_templateName,m_line,"range %d %s %d is empty!",
+                s,m_down?"downto":"to",e);
+          }
+        }
+        else if (vs.type()!=TemplateVariant::Integer)
+        {
+          ci->warn(m_templateName,m_line,"range requires a start value of integer type!");
+        }
+        else if (ve.type()!=TemplateVariant::Integer)
+        {
+          ci->warn(m_templateName,m_line,"range requires an end value of integer type!");
+        }
+      }
+      else if (!m_startExpr)
+      {
+        ci->warn(m_templateName,m_line,"range has empty start value");
+      }
+      else if (!m_endExpr)
+      {
+        ci->warn(m_templateName,m_line,"range has empty end value");
+      }
+    }
+
+  private:
+    bool m_down;
+    ExprAst *m_startExpr;
+    ExprAst *m_endExpr;
+    QCString m_var;
+    TemplateNodeList m_loopNodes;
+};
+
+//----------------------------------------------------------
+
 /** @brief Class representing a 'for' tag in a template */
 class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
 {
@@ -1936,15 +2539,15 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
       {
         if (data.right(3)==" in")
         {
-          warn(m_templateName,line,"for is missing container after 'in' keyword");
+          parser->warn(m_templateName,line,"for is missing container after 'in' keyword");
         }
         else if (data=="in")
         {
-          warn(m_templateName,line,"for needs at least one iterator variable");
+          parser->warn(m_templateName,line,"for needs at least one iterator variable");
         }
         else
         {
-          warn(m_templateName,line,"for is missing 'in' keyword");
+          parser->warn(m_templateName,line,"for is missing 'in' keyword");
         }
       }
       else
@@ -1952,7 +2555,7 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
         m_vars = split(data.left(i),",");
         if (m_vars.count()==0)
         {
-          warn(m_templateName,line,"for needs at least one iterator variable");
+          parser->warn(m_templateName,line,"for needs at least one iterator variable");
         }
 
         int j = data.find(" reversed",i);
@@ -1965,11 +2568,11 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
         }
         if (exprStr.isEmpty())
         {
-          warn(m_templateName,line,"for is missing container after 'in' keyword");
+          parser->warn(m_templateName,line,"for is missing container after 'in' keyword");
         }
       }
-      ExpressionParser expParser(parser->templateName(),line);
-      m_expr = expParser.parseVariable(exprStr);
+      ExpressionParser expParser(parser,line);
+      m_expr = expParser.parse(exprStr);
 
       QStrList stopAt;
       stopAt.append("endfor");
@@ -1993,7 +2596,8 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
 
     void render(FTextStream &ts, TemplateContext *c)
     {
-      dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line);
+      TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+      ci->setLocation(m_templateName,m_line);
       //printf("TemplateNodeFor::render #loopNodes=%d #emptyNodes=%d\n",
       //    m_loopNodes.count(),m_emptyNodes.count());
       if (m_expr)
@@ -2018,15 +2622,15 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
               (it->current(v));
               m_reversed ? it->toPrev() : it->toNext())
           {
-            TemplateStruct s;
-            s.set("counter0",    (int)index);
-            s.set("counter",     (int)(index+1));
-            s.set("revcounter",  (int)(listSize-index));
-            s.set("revcounter0", (int)(listSize-index-1));
-            s.set("first",index==0);
-            s.set("last", index==listSize-1);
-            s.set("parentloop",parentLoop ? *parentLoop : TemplateVariant());
-            c->set("forloop",&s);
+            TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
+            s->set("counter0",    (int)index);
+            s->set("counter",     (int)(index+1));
+            s->set("revcounter",  (int)(listSize-index));
+            s->set("revcounter0", (int)(listSize-index-1));
+            s->set("first",index==0);
+            s->set("last", index==listSize-1);
+            s->set("parentloop",parentLoop ? *parentLoop : TemplateVariant());
+            c->set("forloop",s.get());
 
             // add variables for this loop to the context
             //obj->addVariableToContext(index,m_vars,c);
@@ -2058,7 +2662,7 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor>
         }
         else // simple type...
         {
-          warn(m_templateName,m_line,"for requires a variable of list type!");
+          ci->warn(m_templateName,m_line,"for requires a variable of list type!");
         }
       }
     }
@@ -2090,14 +2694,15 @@ class TemplateNodeMsg : public TemplateNodeCreator<TemplateNodeMsg>
     void render(FTextStream &, TemplateContext *c)
     {
       TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+      ci->setLocation(m_templateName,m_line);
       TemplateEscapeIntf *escIntf = ci->escapeIntf();
-      ci->setEscapeIntf(0); // avoid escaping things we send to standard out
+      ci->setActiveEscapeIntf(0); // avoid escaping things we send to standard out
       bool enable = ci->spacelessEnabled();
       ci->enableSpaceless(FALSE);
       FTextStream ts(stdout);
       m_nodes.render(ts,c);
       ts << endl;
-      ci->setEscapeIntf(escIntf);
+      ci->setActiveEscapeIntf(escIntf);
       ci->enableSpaceless(enable);
     }
   private:
@@ -2118,7 +2723,7 @@ class TemplateNodeBlock : public TemplateNodeCreator<TemplateNodeBlock>
       m_blockName = data;
       if (m_blockName.isEmpty())
       {
-        warn(parser->templateName(),line,"block tag without name");
+        parser->warn(parser->templateName(),line,"block tag without name");
       }
       QStrList stopAt;
       stopAt.append("endblock");
@@ -2152,18 +2757,22 @@ class TemplateNodeBlock : public TemplateNodeCreator<TemplateNodeBlock>
             m_nodes.render(ss,c); // render parent of nb to string
           }
           // add 'block.super' variable to allow access to parent block content
-          TemplateStruct superBlock;
-          superBlock.set("super",TemplateVariant(super.data(),TRUE));
-          ci->set("block",&superBlock);
+          TemplateAutoRef<TemplateStruct> superBlock(TemplateStruct::alloc());
+          superBlock->set("super",TemplateVariant(super.data(),TRUE));
+          ci->set("block",superBlock.get());
           // render the overruled block contents
+          t->engine()->enterBlock(nb->m_templateName,nb->m_blockName,nb->m_line);
           nb->m_nodes.render(ts,c);
+          t->engine()->leaveBlock();
           ci->pop();
           // re-add block to the context
           ci->blockContext()->push(nb);
         }
         else // block has no overrule
         {
+          t->engine()->enterBlock(m_templateName,m_blockName,m_line);
           m_nodes.render(ts,c);
+          t->engine()->leaveBlock();
         }
       }
     }
@@ -2188,12 +2797,12 @@ class TemplateNodeExtend : public TemplateNodeCreator<TemplateNodeExtend>
       : TemplateNodeCreator<TemplateNodeExtend>(parser,parent,line)
     {
       TRACE(("{TemplateNodeExtend(%s)\n",data.data()));
-      ExpressionParser ep(m_templateName,line);
+      ExpressionParser ep(parser,line);
       if (data.isEmpty())
       {
-        warn(m_templateName,line,"extend tag is missing template file argument");
+        parser->warn(m_templateName,line,"extend tag is missing template file argument");
       }
-      m_extendExpr = ep.parsePrimary(data);
+      m_extendExpr = ep.parse(data);
       QStrList stopAt;
       parser->parse(this,line,stopAt,m_nodes);
       TRACE(("}TemplateNodeExtend(%s)\n",data.data()));
@@ -2205,20 +2814,21 @@ class TemplateNodeExtend : public TemplateNodeCreator<TemplateNodeExtend>
 
     void render(FTextStream &ts, TemplateContext *c)
     {
-      dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line);
+      TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+      ci->setLocation(m_templateName,m_line);
       if (m_extendExpr==0) return;
 
       QCString extendFile = m_extendExpr->resolve(c).toString();
       if (extendFile.isEmpty())
       {
-        warn(m_templateName,m_line,"invalid parameter for extend command");
+        ci->warn(m_templateName,m_line,"invalid parameter for extend command");
       }
 
       // goto root of tree (template node)
       TemplateImpl *t = getTemplate();
       if (t)
       {
-        Template *bt = t->engine()->loadByName(extendFile);
+        Template *bt = t->engine()->loadByName(extendFile,m_line);
         TemplateImpl *baseTemplate = bt ? dynamic_cast<TemplateImpl*>(bt) : 0;
         if (baseTemplate)
         {
@@ -2248,11 +2858,11 @@ class TemplateNodeExtend : public TemplateNodeCreator<TemplateNodeExtend>
 
           // clean up
           bc->clear();
-          //delete baseTemplate;
+          t->engine()->unload(t);
         }
         else
         {
-          warn(m_templateName,m_line,"failed to load template %s for extend",extendFile.data());
+          ci->warn(m_templateName,m_line,"failed to load template %s for extend",extendFile.data());
         }
       }
     }
@@ -2270,12 +2880,12 @@ class TemplateNodeInclude : public TemplateNodeCreator<TemplateNodeInclude>
       : TemplateNodeCreator<TemplateNodeInclude>(parser,parent,line)
     {
       TRACE(("TemplateNodeInclude(%s)\n",data.data()));
-      ExpressionParser ep(m_templateName,line);
+      ExpressionParser ep(parser,line);
       if (data.isEmpty())
       {
-        warn(m_templateName,line,"include tag is missing template file argument");
+        parser->warn(m_templateName,line,"include tag is missing template file argument");
       }
-      m_includeExpr = ep.parsePrimary(data);
+      m_includeExpr = ep.parse(data);
     }
    ~TemplateNodeInclude()
     {
@@ -2283,28 +2893,30 @@ class TemplateNodeInclude : public TemplateNodeCreator<TemplateNodeInclude>
     }
     void render(FTextStream &ts, TemplateContext *c)
     {
-      dynamic_cast<TemplateContextImpl*>(c)->setLocation(m_templateName,m_line);
+      TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c);
+      ci->setLocation(m_templateName,m_line);
       if (m_includeExpr)
       {
         QCString includeFile = m_includeExpr->resolve(c).toString();
         if (includeFile.isEmpty())
         {
-          warn(m_templateName,m_line,"invalid parameter for include command\n");
+          ci->warn(m_templateName,m_line,"invalid parameter for include command\n");
         }
         else
         {
           TemplateImpl *t = getTemplate();
           if (t)
           {
-            Template *it = t->engine()->loadByName(includeFile);
+            Template *it = t->engine()->loadByName(includeFile,m_line);
             TemplateImpl *incTemplate = it ? dynamic_cast<TemplateImpl*>(it) : 0;
             if (incTemplate)
             {
               incTemplate->render(ts,c);
+              t->engine()->unload(t);
             }
             else
             {
-              warn(m_templateName,m_line,"failed to load template '%s' for include",includeFile.data()?includeFile.data():"");
+              ci->warn(m_templateName,m_line,"failed to load template '%s' for include",includeFile.data()?includeFile.data():"");
             }
           }
         }
@@ -2325,32 +2937,32 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate>
       : TemplateNodeCreator<TemplateNodeCreate>(parser,parent,line)
     {
       TRACE(("TemplateNodeCreate(%s)\n",data.data()));
-      ExpressionParser ep(m_templateName,line);
+      ExpressionParser ep(parser,line);
       if (data.isEmpty())
       {
-        warn(m_templateName,line,"create tag is missing arguments");
+        parser->warn(m_templateName,line,"create tag is missing arguments");
       }
       int i = data.find(" from ");
       if (i==-1)
       {
         if (data.right(3)==" from")
         {
-          warn(m_templateName,line,"create is missing template name after 'from' keyword");
+          parser->warn(m_templateName,line,"create is missing template name after 'from' keyword");
         }
         else if (data=="from")
         {
-          warn(m_templateName,line,"create needs a file name and a template name");
+          parser->warn(m_templateName,line,"create needs a file name and a template name");
         }
         else
         {
-          warn(m_templateName,line,"create is missing 'from' keyword");
+          parser->warn(m_templateName,line,"create is missing 'from' keyword");
         }
       }
       else
       {
-        ExpressionParser ep(m_templateName,line);
-        m_fileExpr = ep.parsePrimary(data.left(i).stripWhiteSpace());
-        m_templateExpr = ep.parsePrimary(data.mid(i+6).stripWhiteSpace());
+        ExpressionParser ep(parser,line);
+        m_fileExpr = ep.parse(data.left(i).stripWhiteSpace());
+        m_templateExpr = ep.parse(data.mid(i+6).stripWhiteSpace());
       }
     }
    ~TemplateNodeCreate()
@@ -2368,21 +2980,27 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate>
         QCString outputFile = m_fileExpr->resolve(c).toString();
         if (templateFile.isEmpty())
         {
-          warn(m_templateName,m_line,"empty template name parameter for create command\n");
+          ci->warn(m_templateName,m_line,"empty template name parameter for create command\n");
         }
         else if (outputFile.isEmpty())
         {
-          warn(m_templateName,m_line,"empty file name parameter for create command\n");
+          ci->warn(m_templateName,m_line,"empty file name parameter for create command\n");
         }
         else
         {
           TemplateImpl *t = getTemplate();
           if (t)
           {
-            Template *ct = t->engine()->loadByName(templateFile);
+            Template *ct = t->engine()->loadByName(templateFile,m_line);
             TemplateImpl *createTemplate = ct ? dynamic_cast<TemplateImpl*>(ct) : 0;
             if (createTemplate)
             {
+              QCString extension=outputFile;
+              int i=extension.findRev('.');
+              if (i!=-1)
+              {
+                extension=extension.right(extension.length()-i-1);
+              }
               if (!ci->outputDirectory().isEmpty())
               {
                 outputFile.prepend(ci->outputDirectory()+"/");
@@ -2390,18 +3008,21 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate>
               QFile f(outputFile);
               if (f.open(IO_WriteOnly))
               {
+                TemplateEscapeIntf *escIntf = ci->escapeIntf();
+                ci->selectEscapeIntf(extension);
                 FTextStream ts(&f);
                 createTemplate->render(ts,c);
-                //delete createTemplate;
+                t->engine()->unload(t);
+                ci->setActiveEscapeIntf(escIntf);
               }
               else
               {
-                warn(m_templateName,m_line,"failed to open output file '%s' for create command",outputFile.data());
+                ci->warn(m_templateName,m_line,"failed to open output file '%s' for create command",outputFile.data());
               }
             }
             else
             {
-              warn(m_templateName,m_line,"failed to load template '%s' for include",templateFile.data());
+              ci->warn(m_templateName,m_line,"failed to load template '%s' for include",templateFile.data());
             }
           }
         }
@@ -2431,12 +3052,12 @@ class TemplateNodeTree : public TemplateNodeCreator<TemplateNodeTree>
       : TemplateNodeCreator<TemplateNodeTree>(parser,parent,line)
     {
       TRACE(("{TemplateNodeTree(%s)\n",data.data()));
-      ExpressionParser ep(m_templateName,line);
+      ExpressionParser ep(parser,line);
       if (data.isEmpty())
       {
-        warn(m_templateName,line,"recursetree tag is missing data argument");
+        parser->warn(m_templateName,line,"recursetree tag is missing data argument");
       }
-      m_treeExpr = ep.parsePrimary(data);
+      m_treeExpr = ep.parse(data);
       QStrList stopAt;
       stopAt.append("endrecursetree");
       parser->parse(this,line,stopAt,m_treeNodes);
@@ -2508,7 +3129,7 @@ class TemplateNodeTree : public TemplateNodeCreator<TemplateNodeTree>
       }
       else
       {
-        warn(m_templateName,m_line,"recursetree's argument should be a list type");
+        ci->warn(m_templateName,m_line,"recursetree's argument should be a list type");
       }
     }
 
@@ -2519,6 +3140,148 @@ class TemplateNodeTree : public TemplateNodeCreator<TemplateNodeTree>
 
 //----------------------------------------------------------
 
+/** @brief Class representing an 'indexentry' tag in a template */
+class TemplateNodeIndexEntry : public TemplateNodeCreator<TemplateNodeIndexEntry>
+{
+    struct Mapping
+    {
+      Mapping(const QCString &n,ExprAst *e) : name(n), value(e) {}
+     ~Mapping() { delete value; }
+      QCString name;
+      ExprAst *value;
+    };
+  public:
+    TemplateNodeIndexEntry(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data)
+      : TemplateNodeCreator<TemplateNodeIndexEntry>(parser,parent,line)
+    {
+      TRACE(("{TemplateNodeIndexEntry(%s)\n",data.data()));
+      m_args.setAutoDelete(TRUE);
+      ExpressionParser expParser(parser,line);
+      QValueList<QCString> args = split(data," ");
+      QValueListIterator<QCString> it = args.begin();
+      if (it==args.end() || (*it).find('=')!=-1)
+      {
+        parser->warn(parser->templateName(),line,"Missing name for indexentry tag");
+      }
+      else
+      {
+        m_name = *it;
+        ++it;
+        while (it!=args.end())
+        {
+          QCString arg = *it;
+          int j=arg.find('=');
+          if (j>0)
+          {
+            ExprAst *expr = expParser.parse(arg.mid(j+1));
+            if (expr)
+            {
+              m_args.append(new Mapping(arg.left(j),expr));
+            }
+          }
+          else
+          {
+            parser->warn(parser->templateName(),line,"invalid argument '%s' for indexentry tag",arg.data());
+          }
+          ++it;
+        }
+      }
+      TRACE(("}TemplateNodeIndexEntry(%s)\n",data.data()));
+    }
+    void render(FTextStream &, TemplateContext *c)
+    {
+      if (!m_name.isEmpty())
+      {
+        TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+        ci->setLocation(m_templateName,m_line);
+        QListIterator<Mapping> it(m_args);
+        Mapping *mapping;
+        QValueList<TemplateKeyValue> list;
+        for (it.toFirst();(mapping=it.current());++it)
+        {
+          list.append(TemplateKeyValue(mapping->name,mapping->value->resolve(c)));
+        }
+        ci->addIndexEntry(m_name,list);
+      }
+    }
+  private:
+    QCString m_name;
+    QList<Mapping> m_args;
+};
+
+//----------------------------------------------------------
+
+/** @brief Class representing an 'opensubindex' tag in a template */
+class TemplateNodeOpenSubIndex : public TemplateNodeCreator<TemplateNodeOpenSubIndex>
+{
+  public:
+    TemplateNodeOpenSubIndex(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data)
+      : TemplateNodeCreator<TemplateNodeOpenSubIndex>(parser,parent,line)
+    {
+      TRACE(("{TemplateNodeOpenSubIndex(%s)\n",data.data()));
+      m_name = data.stripWhiteSpace();
+      if (m_name.isEmpty())
+      {
+        parser->warn(parser->templateName(),line,"Missing argument for opensubindex tag");
+      }
+      else if (m_name.find(' ')!=-1)
+      {
+        parser->warn(parser->templateName(),line,"Expected single argument for opensubindex tag got '%s'",data.data());
+        m_name="";
+      }
+      TRACE(("}TemplateNodeOpenSubIndex(%s)\n",data.data()));
+    }
+    void render(FTextStream &, TemplateContext *c)
+    {
+      if (!m_name.isEmpty())
+      {
+        TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+        ci->setLocation(m_templateName,m_line);
+        ci->openSubIndex(m_name);
+      }
+    }
+  private:
+    QCString m_name;
+};
+
+//----------------------------------------------------------
+
+/** @brief Class representing an 'closesubindex' tag in a template */
+class TemplateNodeCloseSubIndex : public TemplateNodeCreator<TemplateNodeCloseSubIndex>
+{
+  public:
+    TemplateNodeCloseSubIndex(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data)
+      : TemplateNodeCreator<TemplateNodeCloseSubIndex>(parser,parent,line)
+    {
+      TRACE(("{TemplateNodeCloseSubIndex(%s)\n",data.data()));
+      m_name = data.stripWhiteSpace();
+      if (m_name.isEmpty())
+      {
+        parser->warn(parser->templateName(),line,"Missing argument for closesubindex tag");
+      }
+      else if (m_name.find(' ')!=-1 || m_name.isEmpty())
+      {
+        parser->warn(parser->templateName(),line,"Expected single argument for closesubindex tag got '%s'",data.data());
+        m_name="";
+      }
+      TRACE(("}TemplateNodeCloseSubIndex(%s)\n",data.data()));
+    }
+    void render(FTextStream &, TemplateContext *c)
+    {
+      if (!m_name.isEmpty())
+      {
+        TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+        ci->setLocation(m_templateName,m_line);
+        ci->closeSubIndex(m_name);
+      }
+    }
+  private:
+    QCString m_name;
+};
+
+
+//----------------------------------------------------------
+
 /** @brief Class representing an 'with' tag in a template */
 class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
 {
@@ -2535,7 +3298,7 @@ class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
     {
       TRACE(("{TemplateNodeWith(%s)\n",data.data()));
       m_args.setAutoDelete(TRUE);
-      ExpressionParser expParser(parser->templateName(),line);
+      ExpressionParser expParser(parser,line);
       QValueList<QCString> args = split(data," ");
       QValueListIterator<QCString> it = args.begin();
       while (it!=args.end())
@@ -2544,7 +3307,7 @@ class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
         int j=arg.find('=');
         if (j>0)
         {
-          ExprAst *expr = expParser.parsePrimary(arg.mid(j+1));
+          ExprAst *expr = expParser.parse(arg.mid(j+1));
           if (expr)
           {
             m_args.append(new Mapping(arg.left(j),expr));
@@ -2552,7 +3315,7 @@ class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
         }
         else
         {
-          warn(parser->templateName(),line,"invalid argument '%s' for with tag",arg.data());
+          parser->warn(parser->templateName(),line,"invalid argument '%s' for with tag",arg.data());
         }
         ++it;
       }
@@ -2568,6 +3331,7 @@ class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
     void render(FTextStream &ts, TemplateContext *c)
     {
       TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+      ci->setLocation(m_templateName,m_line);
       c->push();
       QListIterator<Mapping> it(m_args);
       Mapping *mapping;
@@ -2596,12 +3360,12 @@ class TemplateNodeCycle : public TemplateNodeCreator<TemplateNodeCycle>
       TRACE(("{TemplateNodeCycle(%s)\n",data.data()));
       m_args.setAutoDelete(TRUE);
       m_index=0;
-      ExpressionParser expParser(parser->templateName(),line);
+      ExpressionParser expParser(parser,line);
       QValueList<QCString> args = split(data," ");
       QValueListIterator<QCString> it = args.begin();
       while (it!=args.end())
       {
-        ExprAst *expr = expParser.parsePrimary(*it);
+        ExprAst *expr = expParser.parse(*it);
         if (expr)
         {
           m_args.append(expr);
@@ -2610,13 +3374,14 @@ class TemplateNodeCycle : public TemplateNodeCreator<TemplateNodeCycle>
       }
       if (m_args.count()<2)
       {
-          warn(parser->templateName(),line,"expected at least two arguments for cycle command, got %d",m_args.count());
+          parser->warn(parser->templateName(),line,"expected at least two arguments for cycle command, got %d",m_args.count());
       }
       TRACE(("}TemplateNodeCycle(%s)\n",data.data()));
     }
     void render(FTextStream &ts, TemplateContext *c)
     {
       TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+      ci->setLocation(m_templateName,m_line);
       if (m_index<m_args.count())
       {
         TemplateVariant v = m_args.at(m_index)->resolve(c);
@@ -2661,7 +3426,7 @@ class TemplateNodeSet : public TemplateNodeCreator<TemplateNodeSet>
     {
       TRACE(("{TemplateNodeSet(%s)\n",data.data()));
       m_args.setAutoDelete(TRUE);
-      ExpressionParser expParser(parser->templateName(),line);
+      ExpressionParser expParser(parser,line);
       QValueList<QCString> args = split(data," ");
       QValueListIterator<QCString> it = args.begin();
       while (it!=args.end())
@@ -2670,7 +3435,7 @@ class TemplateNodeSet : public TemplateNodeCreator<TemplateNodeSet>
         int j=arg.find('=');
         if (j>0)
         {
-          ExprAst *expr = expParser.parsePrimary(arg.mid(j+1));
+          ExprAst *expr = expParser.parse(arg.mid(j+1));
           if (expr)
           {
             m_args.append(new Mapping(arg.left(j),expr));
@@ -2678,7 +3443,7 @@ class TemplateNodeSet : public TemplateNodeCreator<TemplateNodeSet>
         }
         else
         {
-          warn(parser->templateName(),line,"invalid argument '%s' for with tag",arg.data());
+          parser->warn(parser->templateName(),line,"invalid argument '%s' for with tag",arg.data());
         }
         ++it;
       }
@@ -2687,6 +3452,7 @@ class TemplateNodeSet : public TemplateNodeCreator<TemplateNodeSet>
     void render(FTextStream &, TemplateContext *c)
     {
       TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+      ci->setLocation(m_templateName,m_line);
       QListIterator<Mapping> it(m_args);
       Mapping *mapping;
       for (it.toFirst();(mapping=it.current());++it)
@@ -2718,6 +3484,7 @@ class TemplateNodeSpaceless : public TemplateNodeCreator<TemplateNodeSpaceless>
     void render(FTextStream &ts, TemplateContext *c)
     {
       TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+      ci->setLocation(m_templateName,m_line);
       bool wasSpaceless = ci->spacelessEnabled();
       ci->enableSpaceless(TRUE);
       m_nodes.render(ts,c);
@@ -2741,14 +3508,14 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers>
       int w = data.find(" with ");
       if (i==-1 || w==-1 || w<i)
       {
-        warn(m_templateName,line,"markers tag as wrong format. Expected: markers <var> in <list> with <string_with_markers>");
+        parser->warn(m_templateName,line,"markers tag as wrong format. Expected: markers <var> in <list> with <string_with_markers>");
       }
       else
       {
-        ExpressionParser expParser(parser->templateName(),line);
+        ExpressionParser expParser(parser,line);
         m_var = data.left(i);
-        m_listExpr = expParser.parseVariable(data.mid(i+4,w-i-4));
-        m_patternExpr = expParser.parseVariable(data.right(data.length()-w-6));
+        m_listExpr = expParser.parse(data.mid(i+4,w-i-4));
+        m_patternExpr = expParser.parse(data.right(data.length()-w-6));
       }
       QStrList stopAt;
       stopAt.append("endmarkers");
@@ -2785,9 +3552,9 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers>
               for (it->toFirst(); (it->current(var)) && i<entryIndex; it->toNext(),i++) {}
               if (ok && i==entryIndex) // found element
               {
-                TemplateStruct s;
-                s.set("id",(int)i);
-                c->set("markers",&s);
+                TemplateAutoRef<TemplateStruct> s(TemplateStruct::alloc());
+                s->set("id",(int)i);
+                c->set("markers",s.get());
                 c->set(m_var,var); // define local variable to hold element of list type
                 bool wasSpaceless = ci->spacelessEnabled();
                 ci->enableSpaceless(TRUE);
@@ -2796,11 +3563,11 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers>
               }
               else if (!ok)
               {
-                warn(m_templateName,m_line,"markers pattern string has invalid markers '%s'",str.data());
+                ci->warn(m_templateName,m_line,"markers pattern string has invalid markers '%s'",str.data());
               }
               else if (i<entryIndex)
               {
-                warn(m_templateName,m_line,"markers list does not an element for marker position %d",i);
+                ci->warn(m_templateName,m_line,"markers list does not an element for marker position %d",i);
               }
               index=newIndex+matchLen; // set index just after marker
             }
@@ -2809,12 +3576,12 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers>
           }
           else
           {
-            warn(m_templateName,m_line,"markers requires a parameter of string type after 'with'!");
+            ci->warn(m_templateName,m_line,"markers requires a parameter of string type after 'with'!");
           }
         }
         else
         {
-          warn(m_templateName,m_line,"markers requires a parameter of list type after 'in'!");
+          ci->warn(m_templateName,m_line,"markers requires a parameter of list type after 'in'!");
         }
       }
     }
@@ -2881,12 +3648,16 @@ static TemplateNodeFactory::AutoRegister<TemplateNodeTree>      autoRefTree("rec
 static TemplateNodeFactory::AutoRegister<TemplateNodeWith>      autoRefWith("with");
 static TemplateNodeFactory::AutoRegister<TemplateNodeBlock>     autoRefBlock("block");
 static TemplateNodeFactory::AutoRegister<TemplateNodeCycle>     autoRefCycle("cycle");
+static TemplateNodeFactory::AutoRegister<TemplateNodeRange>     autoRefRange("range");
 static TemplateNodeFactory::AutoRegister<TemplateNodeExtend>    autoRefExtend("extend");
 static TemplateNodeFactory::AutoRegister<TemplateNodeCreate>    autoRefCreate("create");
 static TemplateNodeFactory::AutoRegister<TemplateNodeRepeat>    autoRefRepeat("repeat");
 static TemplateNodeFactory::AutoRegister<TemplateNodeInclude>   autoRefInclude("include");
 static TemplateNodeFactory::AutoRegister<TemplateNodeMarkers>   autoRefMarkers("markers");
 static TemplateNodeFactory::AutoRegister<TemplateNodeSpaceless> autoRefSpaceless("spaceless");
+static TemplateNodeFactory::AutoRegister<TemplateNodeIndexEntry> autoRefIndexEntry("indexentry");
+static TemplateNodeFactory::AutoRegister<TemplateNodeOpenSubIndex> autoRefOpenSubIndex("opensubindex");
+static TemplateNodeFactory::AutoRegister<TemplateNodeCloseSubIndex> autoRefCloseSubIndex("closesubindex");
 
 //----------------------------------------------------------
 
@@ -2970,19 +3741,20 @@ void TemplateBlockContext::push(TemplateNodeBlock *block)
 class TemplateLexer
 {
   public:
-    TemplateLexer(const QCString &fileName,const QCString &data);
+    TemplateLexer(const TemplateEngine *engine,const QCString &fileName,const QCString &data);
     void tokenize(QList<TemplateToken> &tokens);
   private:
     void addToken(QList<TemplateToken> &tokens,
                   const char *data,int line,int startPos,int endPos,
                   TemplateToken::Type type);
     void reset();
+    const TemplateEngine *m_engine;
     QCString m_fileName;
     QCString m_data;
 };
 
-TemplateLexer::TemplateLexer(const QCString &fileName,const QCString &data) :
-  m_fileName(fileName), m_data(data)
+TemplateLexer::TemplateLexer(const TemplateEngine *engine,const QCString &fileName,const QCString &data) :
+  m_engine(engine), m_fileName(fileName), m_data(data)
 {
 }
 
@@ -3049,6 +3821,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
         if (c=='\n')
         {
           warn(m_fileName,line,"unexpected new line inside {%%...%%} block");
+          m_engine->printIncludeContext(m_fileName,line);
         }
         else if (c=='%') // %} or something else
         {
@@ -3072,6 +3845,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
           if (c=='\n')
           {
             warn(m_fileName,line,"unexpected new line inside {%%...%%} block");
+            m_engine->printIncludeContext(m_fileName,line);
           }
           state=StateTag;
         }
@@ -3080,6 +3854,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
         if (c=='\n')
         {
           warn(m_fileName,line,"unexpected new line inside {#...#} block");
+          m_engine->printIncludeContext(m_fileName,line);
         }
         else if (c=='#') // #} or something else
         {
@@ -3101,6 +3876,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
           if (c=='\n')
           {
             warn(m_fileName,line,"unexpected new line inside {#...#} block");
+            m_engine->printIncludeContext(m_fileName,line);
           }
           state=StateComment;
         }
@@ -3125,6 +3901,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
         if (c=='\n')
         {
           warn(m_fileName,line,"unexpected new line inside {{...}} block");
+          m_engine->printIncludeContext(m_fileName,line);
         }
         else if (c=='}') // }} or something else
         {
@@ -3148,6 +3925,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
           if (c=='\n')
           {
             warn(m_fileName,line,"unexpected new line inside {{...}} block");
+            m_engine->printIncludeContext(m_fileName,line);
           }
           state=StateVariable;
         }
@@ -3192,9 +3970,10 @@ void TemplateLexer::addToken(QList<TemplateToken> &tokens,
 
 //----------------------------------------------------------
 
-TemplateParser::TemplateParser(const QCString &templateName,
+TemplateParser::TemplateParser(const TemplateEngine *engine,
+                               const QCString &templateName,
                                QList<TemplateToken> &tokens) :
-   m_templateName(templateName), m_tokens(tokens)
+   m_engine(engine), m_templateName(templateName), m_tokens(tokens)
 {
 }
 
@@ -3214,10 +3993,10 @@ void TemplateParser::parse(
       case TemplateToken::Text:
         nodes.append(new TemplateNodeText(this,parent,tok->line,tok->data));
         break;
-      case TemplateToken::Variable:
+      case TemplateToken::Variable: // {{ var }}
         nodes.append(new TemplateNodeVariable(this,parent,tok->line,tok->data));
         break;
-      case TemplateToken::Block:
+      case TemplateToken::Block:    // {% tag %}
         {
           QCString command = tok->data;
           int sep = command.find(' ');
@@ -3247,7 +4026,8 @@ void TemplateParser::parse(
                    command=="endblock"       || command=="endwith"      ||
                    command=="endrecursetree" || command=="endspaceless" ||
                    command=="endmarkers"     || command=="endmsg"       ||
-                   command=="endrepeat")
+                   command=="endrepeat"      || command=="elif"         ||
+                   command=="endrange")
           {
             warn(m_templateName,tok->line,"Found tag '%s' without matching start tag",command.data());
           }
@@ -3288,7 +4068,7 @@ TemplateToken *TemplateParser::takeNextToken()
 
 const TemplateToken *TemplateParser::currentToken() const
 {
-  return m_tokens.first();
+  return m_tokens.getFirst();
 };
 
 void TemplateParser::removeNextToken()
@@ -3301,6 +4081,15 @@ void TemplateParser::prependToken(const TemplateToken *token)
   m_tokens.prepend(token);
 }
 
+void TemplateParser::warn(const char *fileName,int line,const char *fmt,...) const
+{
+  va_list args;
+  va_start(args,fmt);
+  va_warn(fileName,line,fmt,args);
+  va_end(args);
+  m_engine->printIncludeContext(fileName,line);
+}
+
 
 
 //----------------------------------------------------------
@@ -3311,11 +4100,11 @@ TemplateImpl::TemplateImpl(TemplateEngine *engine,const QCString &name,const QCS
 {
   m_name = name;
   m_engine = engine;
-  TemplateLexer lexer(name,data);
+  TemplateLexer lexer(engine,name,data);
   QList<TemplateToken> tokens;
   tokens.setAutoDelete(TRUE);
   lexer.tokenize(tokens);
-  TemplateParser parser(name,tokens);
+  TemplateParser parser(engine,name,tokens);
   parser.parse(this,1,QStrList(),m_nodes);
 }
 
@@ -3348,11 +4137,35 @@ void TemplateImpl::render(FTextStream &ts, TemplateContext *c)
 /** @brief Private data of the template engine */
 class TemplateEngine::Private
 {
+    class IncludeEntry
+    {
+      public:
+        enum Type { Template, Block };
+        IncludeEntry(Type type,const QCString &fileName,const QCString &blockName,int line)
+          : m_type(type), m_fileName(fileName), m_blockName(blockName), m_line(line) {}
+        Type type() const { return m_type; }
+        QCString fileName() const { return m_fileName; }
+        QCString blockName() const { return m_blockName; }
+        int line() const { return m_line; }
+
+      private:
+        Type m_type;
+        QCString m_fileName;
+        QCString m_blockName;
+        int m_line;
+    };
   public:
-    Private(TemplateEngine *engine) : m_templateCache(17), m_engine(engine)
-    { m_templateCache.setAutoDelete(TRUE); }
-    Template *loadByName(const QCString &fileName) const
+    Private(TemplateEngine *engine) : m_templateCache(17) /*, m_indent(0)*/, m_engine(engine)
+    {
+      m_templateCache.setAutoDelete(TRUE);
+      m_includeStack.setAutoDelete(TRUE);
+    }
+    Template *loadByName(const QCString &fileName,int line)
     {
+      //for (int i=0;i<m_indent;i++) printf("  ");
+      //m_indent++;
+      //printf("loadByName(%s,%d) {\n",fileName.data(),line);
+      m_includeStack.append(new IncludeEntry(IncludeEntry::Template,fileName,QCString(),line));
       Template *templ = m_templateCache.find(fileName);
       if (templ==0)
       {
@@ -3379,10 +4192,60 @@ class TemplateEngine::Private
       }
       return templ;
     }
+    void unload(Template * /*t*/)
+    {
+      //(void)t;
+      //m_indent--;
+      //for (int i=0;i<m_indent;i++) printf("  ");
+      //printf("}\n");
+      m_includeStack.removeLast();
+    }
+
+    void enterBlock(const QCString &fileName,const QCString &blockName,int line)
+    {
+      //for (int i=0;i<m_indent;i++) printf("  ");
+      //m_indent++;
+      //printf("enterBlock(%s,%s,%d) {\n",fileName.data(),blockName.data(),line);
+      m_includeStack.append(new IncludeEntry(IncludeEntry::Block,fileName,blockName,line));
+    }
+
+    void leaveBlock()
+    {
+      //m_indent--;
+      //for (int i=0;i<m_indent;i++) printf("  ");
+      //printf("}\n");
+      m_includeStack.removeLast();
+    }
+
+    void printIncludeContext(const char *fileName,int line) const
+    {
+      QListIterator<IncludeEntry> li(m_includeStack);
+      li.toLast();
+      IncludeEntry *ie=li.current();
+      while ((ie=li.current()))
+      {
+        --li;
+        IncludeEntry *next=li.current();
+        if (ie->type()==IncludeEntry::Template)
+        {
+          if (next)
+          {
+            warn(fileName,line,"  inside template '%s' included from template '%s' at line %d",ie->fileName().data(),next->fileName().data(),ie->line());
+          }
+        }
+        else // ie->type()==IncludeEntry::Block
+        {
+          warn(fileName,line,"  included by block '%s' inside template '%s' at line %d",ie->blockName().data(),
+              ie->fileName().data(),ie->line());
+        }
+      }
+    }
 
   private:
-    mutable QDict<Template> m_templateCache;
+    QDict<Template> m_templateCache;
+    //mutable int m_indent;
     TemplateEngine *m_engine;
+    QList<IncludeEntry> m_includeStack;
 };
 
 TemplateEngine::TemplateEngine()
@@ -3397,11 +4260,31 @@ TemplateEngine::~TemplateEngine()
 
 TemplateContext *TemplateEngine::createContext() const
 {
-  return new TemplateContextImpl;
+  return new TemplateContextImpl(this);
+}
+
+Template *TemplateEngine::loadByName(const QCString &fileName,int line)
+{
+  return p->loadByName(fileName,line);
+}
+
+void TemplateEngine::unload(Template *t)
+{
+  p->unload(t);
+}
+
+void TemplateEngine::enterBlock(const QCString &fileName,const QCString &blockName,int line)
+{
+  p->enterBlock(fileName,blockName,line);
+}
+
+void TemplateEngine::leaveBlock()
+{
+  p->leaveBlock();
 }
 
-Template *TemplateEngine::loadByName(const QCString &fileName)
+void TemplateEngine::printIncludeContext(const char *fileName,int line) const
 {
-  return p->loadByName(fileName);
+  p->printIncludeContext(fileName,line);
 }
 
index 9e3b106..cb4a96f 100644 (file)
@@ -10,32 +10,32 @@ class TemplateListIntf;
 class TemplateStructIntf;
 class TemplateEngine;
 
-/** @defgroup template_api Template API 
+/** @defgroup template_api Template API
  *
- *  This is the API for a 
- *  <a href="https://docs.djangoproject.com/en/1.6/topics/templates/">Django</a> 
+ *  This is the API for a
+ *  <a href="https://docs.djangoproject.com/en/1.6/topics/templates/">Django</a>
  *  compatible template system written in C++.
- *  It is somewhat inspired by Stephen Kelly's 
+ *  It is somewhat inspired by Stephen Kelly's
  *  <a href="http://www.gitorious.org/grantlee/pages/Home">Grantlee</a>.
  *
- *  A template is simply a text file. 
- *  A template contains \b variables, which get replaced with values when the 
+ *  A template is simply a text file.
+ *  A template contains \b variables, which get replaced with values when the
  *  template is evaluated, and \b tags, which control the logic of the template.
  *
  *  Variables look like this: `{{ variable }}`
- *  When the template engine encounters a variable, it evaluates that variable and 
- *  replaces it with the result. Variable names consist of any combination of 
+ *  When the template engine encounters a variable, it evaluates that variable and
+ *  replaces it with the result. Variable names consist of any combination of
  *  alphanumeric characters and the underscore ("_").
  *  Use a dot (.) to access attributes of a structured variable.
- *  
+ *
  *  One can modify variables for display by using \b filters, for example:
  *  `{{ value|default:"nothing" }}`
  *
- *  Tags look like this: `{% tag %}`. Tags are more complex than variables: 
- *  Some create text in the output, some control flow by performing loops or logic, 
+ *  Tags look like this: `{% tag %}`. Tags are more complex than variables:
+ *  Some create text in the output, some control flow by performing loops or logic,
  *  and some load external information into the template to be used by later variables.
  *
- *  To comment-out part of a line in a template, use the comment syntax: 
+ *  To comment-out part of a line in a template, use the comment syntax:
  *  `{# comment text #}`.
  *
  *  Supported Django tags:
@@ -144,17 +144,15 @@ class TemplateVariant
     /** Constructs a new variant with a string value \a s. */
     TemplateVariant(const QCString &s,bool raw=FALSE);
 
-    /** Constructs a new variant with a struct value \a s. 
-     *  @note. Only a pointer to the struct is stored. The caller
-     *  is responsible to manage the memory for the struct object.
+    /** Constructs a new variant with a struct value \a s.
+     *  @note. The variant will hold a reference to the object.
      */
-    TemplateVariant(const TemplateStructIntf *s);
+    TemplateVariant(TemplateStructIntf *s);
 
-    /** Constructs a new variant with a list value \a l. 
-     *  @note. Only a pointer to the struct is stored. The caller
-     *  is responsible to manage the memory for the list object.
+    /** Constructs a new variant with a list value \a l.
+     *  @note. The variant will hold a reference to the object.
      */
-    TemplateVariant(const TemplateListIntf *l);
+    TemplateVariant(TemplateListIntf *l);
 
     /** Constructs a new variant which represents a method call
      *  @param[in] delegate Delegate object to invoke when
@@ -168,7 +166,7 @@ class TemplateVariant
     /** Destroys the Variant object */
     ~TemplateVariant();
 
-    /** Constructs a copy of the variant, \a v, 
+    /** Constructs a copy of the variant, \a v,
      *  passed as the argument to this constructor.
      */
     TemplateVariant(const TemplateVariant &v);
@@ -176,7 +174,7 @@ class TemplateVariant
     /** Assigns the value of the variant \a v to this variant. */
     TemplateVariant &operator=(const TemplateVariant &v);
 
-    /** Compares this QVariant with v and returns true if they are equal; 
+    /** Compares this QVariant with v and returns true if they are equal;
      *  otherwise returns false.
      */
     bool operator==(TemplateVariant &other);
@@ -190,22 +188,22 @@ class TemplateVariant
     /** Returns the variant as an integer. */
     int                 toInt() const;
 
-    /** Returns the pointer to list referenced by this variant 
-     *  or 0 if this variant does not have list type. 
+    /** Returns the pointer to list referenced by this variant
+     *  or 0 if this variant does not have list type.
      */
-    const TemplateListIntf   *toList() const;
+    TemplateListIntf   *toList() const;
 
-    /** Returns the pointer to struct referenced by this variant 
-     *  or 0 if this variant does not have struct type. 
+    /** Returns the pointer to struct referenced by this variant
+     *  or 0 if this variant does not have struct type.
      */
-    const TemplateStructIntf *toStruct() const;
+    TemplateStructIntf *toStruct() const;
 
     /** Return the result of apply this function with \a args.
      *  Returns an empty string if the variant type is not a function.
      */
     TemplateVariant call(const QValueList<TemplateVariant> &args);
 
-    /** Sets whether or not the value of the Variant should be 
+    /** Sets whether or not the value of the Variant should be
      *  escaped or written as-is (raw).
      *  @param[in] b TRUE means write as-is, FALSE means apply escaping.
      */
@@ -223,7 +221,28 @@ class TemplateVariant
 
 //------------------------------------------------------------------------
 
-/** @brief Abstract read-only interface for a context value of type list. 
+template<class T> class TemplateAutoRef
+{
+  public:
+    TemplateAutoRef(T *obj) : m_obj(obj)
+    {
+      m_obj->addRef();
+    }
+   ~TemplateAutoRef()
+    {
+      m_obj->release();
+    }
+    T &operator*() const { return *m_obj; }
+    T *operator->() const { return m_obj; }
+    T *get() const { return m_obj; }
+
+  private:
+   T *m_obj;
+};
+
+//------------------------------------------------------------------------
+
+/** @brief Abstract read-only interface for a context value of type list.
  *  @note The values of the list are TemplateVariants.
  */
 class TemplateListIntf
@@ -245,7 +264,7 @@ class TemplateListIntf
         virtual void toPrev() = 0;
         /* Returns TRUE if the iterator points to a valid element
          * in the list, or FALSE otherwise.
-         * If TRUE is returned, the value pointed to be the 
+         * If TRUE is returned, the value pointed to be the
          * iterator is assigned to \a v.
          */
         virtual bool current(TemplateVariant &v) const = 0;
@@ -260,30 +279,41 @@ class TemplateListIntf
     /** Returns the element at index position \a index. */
     virtual TemplateVariant  at(int index) const = 0;
 
-    /** Creates a new iterator for this list. 
+    /** Creates a new iterator for this list.
      *  @note the user should call delete on the returned pointer.
      */
     virtual TemplateListIntf::ConstIterator *createIterator() const = 0;
+
+    /** Increase object's reference count */
+    virtual int addRef() = 0;
+
+    /** Decreases object's referenc count, destroy object if 0 */
+    virtual int release() = 0;
 };
 
 /** @brief Default implementation of a context value of type list. */
 class TemplateList : public TemplateListIntf
 {
   public:
-    /** Creates a list */
-    TemplateList();
-    /** Destroys the list */
-   ~TemplateList();
-
     // TemplateListIntf methods
     virtual int  count() const;
     virtual TemplateVariant at(int index) const;
     virtual TemplateListIntf::ConstIterator *createIterator() const;
-    
+    virtual int addRef();
+    virtual int release();
+
+    /** Creates an instance with ref count set to 0 */
+    static TemplateList *alloc();
+
     /** Appends element \a v to the end of the list */
     virtual void append(const TemplateVariant &v);
 
   private:
+    /** Creates a list */
+    TemplateList();
+    /** Destroys the list */
+   ~TemplateList();
+
     friend class TemplateListConstIterator;
     class Private;
     Private *p;
@@ -302,6 +332,12 @@ class TemplateStructIntf
      *  @param[in] name The name of the field.
      */
     virtual TemplateVariant get(const char *name) const = 0;
+
+    /** Increase object's reference count */
+    virtual int addRef() = 0;
+
+    /** Decreases object's referenc count, destroy object if 0 */
+    virtual int release() = 0;
 };
 
 
@@ -309,13 +345,13 @@ class TemplateStructIntf
 class TemplateStruct : public TemplateStructIntf
 {
   public:
-    /** Creates a struct */
-    TemplateStruct();
-    /** Destroys the struct */
-    virtual ~TemplateStruct();
-
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
+    virtual int addRef();
+    virtual int release();
+
+    /** Creates an instance with ref count set to 0. */
+    static TemplateStruct *alloc();
 
     /** Sets the value the field of a struct
      *  @param[in] name The name of the field.
@@ -323,7 +359,13 @@ class TemplateStruct : public TemplateStructIntf
      */
     virtual void set(const char *name,const TemplateVariant &v);
 
+
   private:
+    /** Creates a struct */
+    TemplateStruct();
+    /** Destroys the struct */
+    virtual ~TemplateStruct();
+
     class Private;
     Private *p;
 };
@@ -350,14 +392,14 @@ class TemplateSpacelessIntf
 
 //------------------------------------------------------------------------
 
-/** @brief Abstract interface for a template context. 
- *  
+/** @brief Abstract interface for a template context.
+ *
  *  A Context consists of a stack of dictionaries.
  *  A dictionary consists of a mapping of string keys onto TemplateVariant values.
  *  A key is searched starting with the dictionary at the top of the stack
  *  and searching downwards until it is found. The stack is used to create
  *  local scopes.
- *  @note This object must be created by TemplateEngine
+ *  @note This object must be created by TemplateEngine::createContext()
  */
 class TemplateContext
 {
@@ -370,10 +412,10 @@ class TemplateContext
     /** Pop the current scope from the stack. */
     virtual void pop() = 0;
 
-    /** Sets a value in the current scope. 
+    /** Sets a value in the current scope.
      *  @param[in] name The name of the value; the key in the dictionary.
      *  @param[in] v The value associated with the key.
-     *  @note When a given key is already present, 
+     *  @note When a given key is already present,
      *  its value will be replaced by \a v
      */
     virtual void set(const char *name,const TemplateVariant &v) = 0;
@@ -399,7 +441,7 @@ class TemplateContext
     /** Sets the interface that will be used for escaping the result
      *  of variable expansion before writing it to the output.
      */
-    virtual void setEscapeIntf(TemplateEscapeIntf *intf) = 0;
+    virtual void setEscapeIntf(const QCString &extension, TemplateEscapeIntf *intf) = 0;
 
     /** Sets the interface that will be used inside a spaceless block
      *  to remove any redundant whitespace.
@@ -409,8 +451,8 @@ class TemplateContext
 
 //------------------------------------------------------------------------
 
-/** @brief Abstract interface for a template. 
- *  @note Must be created by TemplateEngine
+/** @brief Abstract interface for a template.
+ *  @note Must be created and is deleted by the TemplateEngine
  */
 class Template
 {
@@ -418,7 +460,7 @@ class Template
     /** Destructor */
     virtual ~Template() {}
 
-    /** Renders a template instance to a stream. 
+    /** Renders a template instance to a stream.
      *  @param[in] ts The text stream to write the results to.
      *  @param[in] c The context containing data that can be used
      *  when instantiating the template.
@@ -444,13 +486,25 @@ class TemplateEngine
     TemplateContext *createContext() const;
 
     /** Creates a new template whole contents are in a file.
-     *  @param[in] fileName The name of the file containing the 
+     *  @param[in] fileName The name of the file containing the
      *             template data
+     *  @param[in] fromLine The line number of the statement that triggered the load
      *  @return the new template, the caller will be the owner.
      */
-    Template *loadByName(const QCString &fileName);
+    Template *loadByName(const QCString &fileName,int fromLine);
+
+    /** Indicates that template \a t is no longer needed. The engine
+     *  may decide to delete it.
+     */
+    void unload(Template *t);
+
+    void printIncludeContext(const char *fileName,int line) const;
 
   private:
+    friend class TemplateNodeBlock;
+    void enterBlock(const QCString &fileName,const QCString &blockName,int line);
+    void leaveBlock();
+
     class Private;
     Private *p;
 };
index 9275846..6f3151f 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
 #include <qdir.h>
 #include "textdocvisitor.h"
 #include "message.h"
+#include "util.h"
+#include "htmlentity.h"
 
 //-------------------------------------------------------------------------
 
 void TextDocVisitor::visit(DocSymbol *s)
 {
-  switch(s->symbol())
+  const char *res = HtmlEntityMapper::instance()->html(s->symbol());
+  if (res)
   {
-    case DocSymbol::BSlash:  m_t << "\\"; break;
-    case DocSymbol::At:      m_t << "@"; break;
-    case DocSymbol::Less:    m_t << "&lt;"; break;
-    case DocSymbol::Greater: m_t << "&gt;"; break;
-    case DocSymbol::Amp:     m_t << "&amp;"; break;
-    case DocSymbol::Dollar:  m_t << "$"; break;
-    case DocSymbol::Hash:    m_t << "#"; break;
-    case DocSymbol::DoubleColon: m_t << "::"; break;
-    case DocSymbol::Percent: m_t << "%"; break;
-    case DocSymbol::Pipe:    m_t << "|"; break;
-    case DocSymbol::Copy:    m_t << "&copy;"; break;
-    case DocSymbol::Tm:      m_t << "&tm;"; break;
-    case DocSymbol::Reg:     m_t << "&reg;"; break;
-    case DocSymbol::Apos:    m_t << "'"; break;
-    case DocSymbol::Quot:    m_t << "\""; break;
-    case DocSymbol::Lsquo:   m_t << "&lsquo;"; break;
-    case DocSymbol::Rsquo:   m_t << "&rsquo;"; break;
-    case DocSymbol::Ldquo:   m_t << "&ldquo;"; break;
-    case DocSymbol::Rdquo:   m_t << "&rdquo;"; break;
-    case DocSymbol::Ndash:   m_t << "&ndash;"; break;
-    case DocSymbol::Mdash:   m_t << "&mdash;"; break;
-    case DocSymbol::Uml:     m_t << "&" << s->letter() << "uml;"; break;
-    case DocSymbol::Acute:   m_t << "&" << s->letter() << "acute;"; break;
-    case DocSymbol::Grave:   m_t << "&" << s->letter() << "grave;"; break;
-    case DocSymbol::Circ:    m_t << "&" << s->letter() << "circ;"; break;
-    case DocSymbol::Slash:   m_t << "&" << s->letter() << "slash;"; break;
-    case DocSymbol::Tilde:   m_t << "&" << s->letter() << "tilde;"; break;
-    case DocSymbol::Szlig:   m_t << "&szlig;"; break;
-    case DocSymbol::Cedil:   m_t << "&" << s->letter() << "cedil;"; break;
-    case DocSymbol::Ring:    m_t << "&" << s->letter() << "ring;"; break;
-    case DocSymbol::Nbsp:    m_t << "&nbsp;"; break;
-    case DocSymbol::Aelig:   m_t << "&aelig;"; break;
-    case DocSymbol::AElig:   m_t << "&AElig;"; break;
-    case DocSymbol::GrkGamma:      m_t << "&Gamma;"; break;
-    case DocSymbol::GrkDelta:      m_t << "&Delta;"; break;
-    case DocSymbol::GrkTheta:      m_t << "&Theta;"; break;
-    case DocSymbol::GrkLambda:     m_t << "&Lambda;"; break;
-    case DocSymbol::GrkXi:         m_t << "&Xi;"; break;
-    case DocSymbol::GrkPi:         m_t << "&Pi;"; break;
-    case DocSymbol::GrkSigma:      m_t << "&Sigma;"; break;
-    case DocSymbol::GrkUpsilon:    m_t << "&Upsilon;"; break;
-    case DocSymbol::GrkPhi:        m_t << "&Phi;"; break;
-    case DocSymbol::GrkPsi:        m_t << "&Psi;"; break;
-    case DocSymbol::GrkOmega:      m_t << "&Omega;"; break;
-    case DocSymbol::Grkalpha:      m_t << "&alpha;"; break;
-    case DocSymbol::Grkbeta:       m_t << "&beta;"; break;
-    case DocSymbol::Grkgamma:      m_t << "&gamma;"; break;
-    case DocSymbol::Grkdelta:      m_t << "&delta;"; break;
-    case DocSymbol::Grkepsilon:    m_t << "&epsilon;"; break;
-    case DocSymbol::Grkzeta:       m_t << "&zeta;"; break;
-    case DocSymbol::Grketa:        m_t << "&eta;"; break;
-    case DocSymbol::Grktheta:      m_t << "&theta;"; break;
-    case DocSymbol::Grkiota:       m_t << "&iota;"; break;
-    case DocSymbol::Grkkappa:      m_t << "&kappa;"; break;
-    case DocSymbol::Grklambda:     m_t << "&lambda;"; break;
-    case DocSymbol::Grkmu:         m_t << "&mu;"; break;
-    case DocSymbol::Grknu:         m_t << "&nu;"; break;
-    case DocSymbol::Grkxi:         m_t << "&xi;"; break;
-    case DocSymbol::Grkpi:         m_t << "&pi;"; break;
-    case DocSymbol::Grkrho:        m_t << "&rho;"; break;
-    case DocSymbol::Grksigma:      m_t << "&sigma;"; break;
-    case DocSymbol::Grktau:        m_t << "&tau;"; break;
-    case DocSymbol::Grkupsilon:    m_t << "&upsilon;"; break;
-    case DocSymbol::Grkphi:        m_t << "&phi;"; break;
-    case DocSymbol::Grkchi:        m_t << "&chi;"; break;
-    case DocSymbol::Grkpsi:        m_t << "&psi;"; break;
-    case DocSymbol::Grkomega:      m_t << "&omega;"; break;
-    case DocSymbol::Grkvarsigma:   m_t << "&sigmaf;"; break;
-    case DocSymbol::Section:       m_t << "&sect;"; break;
-    case DocSymbol::Degree:        m_t << "&deg;"; break;
-    case DocSymbol::Prime:         m_t << "&prime;"; break;
-    case DocSymbol::DoublePrime:   m_t << "&Prime;"; break;
-    case DocSymbol::Infinity:      m_t << "&infin;"; break;
-    case DocSymbol::EmptySet:      m_t << "&empty;"; break;
-    case DocSymbol::PlusMinus:     m_t << "&plusmn;"; break;
-    case DocSymbol::Times:         m_t << "&times;"; break;
-    case DocSymbol::Minus:         m_t << "&minus;"; break;
-    case DocSymbol::CenterDot:     m_t << "&sdot;"; break;
-    case DocSymbol::Partial:       m_t << "&part;"; break;
-    case DocSymbol::Nabla:         m_t << "&nabla;"; break;
-    case DocSymbol::SquareRoot:    m_t << "&radic;"; break;
-    case DocSymbol::Perpendicular: m_t << "&perp;"; break;
-    case DocSymbol::Sum:           m_t << "&sum;"; break;
-    case DocSymbol::Integral:      m_t << "&int;"; break;
-    case DocSymbol::Product:       m_t << "&prod;"; break;
-    case DocSymbol::Similar:       m_t << "&sim;"; break;
-    case DocSymbol::Approx:        m_t << "&asymp;"; break;
-    case DocSymbol::NotEqual:      m_t << "&ne;"; break;
-    case DocSymbol::Equivalent:    m_t << "&equiv;"; break;
-    case DocSymbol::Proportional:  m_t << "&prop;"; break;
-    case DocSymbol::LessEqual:     m_t << "&le;"; break;
-    case DocSymbol::GreaterEqual:  m_t << "&ge;"; break;
-    case DocSymbol::LeftArrow:     m_t << "&larr;"; break;
-    case DocSymbol::RightArrow:    m_t << "&rarr;"; break;
-    case DocSymbol::SetIn:         m_t << "&isin;"; break;
-    case DocSymbol::SetNotIn:      m_t << "&notin;"; break;
-    case DocSymbol::LeftCeil:      m_t << "&lceil;"; break;
-    case DocSymbol::RightCeil:     m_t << "&rceil;"; break;
-    case DocSymbol::LeftFloor:     m_t << "&lfloor;"; break;
-    case DocSymbol::RightFloor:    m_t << "&rfloor;"; break;
-    default:
-                             err("unknown symbol found\n");
+    m_t << res;
+  }
+  else
+  {
+    err("text: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
   }
 }
 
index 9045d21..b17065d 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 041aa16..8085bff 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index b4a4af4..ea8948d 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 49a8135..32eaf09 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index fd8b1dd..9eaba0e 100644 (file)
@@ -2,7 +2,7 @@
  *\r
  *\r
  *\r
- * Copyright (C) 1997-2013 by Dimitri van Heesch.\r
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.\r
  *\r
  * Permission to use, copy, modify, and distribute this software and its\r
  * documentation under the terms of the GNU General Public License is hereby\r
index 143170d..5d37b69 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index f9dba84..b381495 100644 (file)
@@ -1,5 +1,5 @@
 /******************************************************************************
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 1291a8c..5c3e595 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index f8e03c5..fc01ce0 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 2793519..b83eb92 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index d13d99c..d936bf1 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 16ffae4..74b07f4 100644 (file)
@@ -3,7 +3,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 0535b6b..ca0a151 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -530,7 +530,7 @@ class TranslatorEnglish : public Translator
 
     /*! this text is generated when the \\sa command is used. */
     virtual QCString trSeeAlso()
-    { return "See Also"; }
+    { return "See also"; }
 
     /*! this text is generated when the \\param command is used. */
     virtual QCString trParameters()
index 3c5b9a5..e1513cb 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index d6738e0..ba6e823 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index bcc0572..7b6f9d7 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index fa42259..eeeb9a5 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 28468e7..2c548c2 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 1523445..fa7a682 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 5c79f61..70dba21 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 157247c..610af8e 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 7ecdbe7..5647bc0 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 912f389..59799a3 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 894452a..4dbcb4e 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index febf353..ae3605a 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 357465d..56a70b3 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 348fa10..6919763 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 9edbe57..000dc6e 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 054310c..135cd11 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2012 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index b753756..510561e 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 2525b4f..2ffacb6 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 3d20f08..2662e47 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index d819f66..6f2e14c 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 8e91181..95a62b0 100644 (file)
@@ -1,5 +1,5 @@
 /******************************************************************************
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 9bbadeb..ea0988d 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 07aa63b..54174d7 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -532,7 +532,7 @@ class TranslatorRussian : public Translator
      * related classes
      */
     virtual QCString trRelatedFunctionDocumentation()
-    { return "Документация по друзьям класса и функциям, отноносящимся"
+    { return "Документация по друзьям класса и функциям, относящимся"
         " к классу"; }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1678,7 +1678,7 @@ class TranslatorRussian : public Translator
         case ClassDef::Union:      result+="объединению"; break;
         case ClassDef::Interface:  result+="интерфейсу"; break;
         case ClassDef::Protocol:   result+="протоколу"; break;
-        case ClassDef::Category:   result+="кетегории"; break;
+        case ClassDef::Category:   result+="категории"; break;
         case ClassDef::Exception:  result+="исключению"; break;
         default: break;
       }
@@ -1954,7 +1954,7 @@ class TranslatorRussian : public Translator
     {
       // single is true implies a single file
       QCString result=(QCString)"Документация для этого сервиса "
-                                "Ñ\81генеÑ\80иÑ\80ованна Ð¸Ð· Ñ\81ледÑ\83Ñ\8eÑ\89его Ñ\84айл";
+                                "сгенерирована из следующего файл";
       if (single) result+="а:"; else result+="ов:";
       return result;
     }
@@ -1963,7 +1963,7 @@ class TranslatorRussian : public Translator
     {
       // single is true implies a single file
       QCString result=(QCString)"Документация по этому одиночке "
-                                "Ñ\81генеÑ\80иÑ\80ованна Ð¸Ð· Ñ\81ледÑ\83Ñ\8eÑ\89его Ñ\84айл";
+                                "сгенерирована из следующего файл";
       if (single) result+="а:"; else result+="ов:";
       return result;
     }
index af2d7df..84e8756 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 57ca5c4..33bc27a 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 8c51147..0fc826b 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 11ebac2..f58ac13 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 4ef2bc4..f4d0a35 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -21,6 +21,7 @@ Svensk översättning av:
 Samuel Hägglund      <sahag96@ite.mh.se>
 Xet Erixon           <xet@xeqt.com>
 Mikael Hallin        <mikaelhallin@yahoo.se>           2003-07-28
+Björn Palmqvist      <bjorn@aidium.se>                 2014-02-01
 ==================================================================================
 Uppdateringar.
 1999/04/29
@@ -69,7 +70,7 @@ Problem!
 #ifndef TRANSLATOR_SE_H
 #define TRANSLATOR_SE_H
 
-class TranslatorSwedish : public TranslatorAdapter_1_6_0
+class TranslatorSwedish : public Translator
 {
   public:
 
@@ -389,7 +390,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
     { return "Dokumentation över typdefinitioner"; }
 
     virtual QCString trEnumerationTypeDocumentation()
-    { return "Dokumentation över egenuppräknande typer"; }
+    { return "Dokumentation över egenuppräknande typer"; }
 
     virtual QCString trFunctionDocumentation()
     { return "Dokumentation över funktioner"; }
@@ -1085,7 +1086,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
      */
     virtual QCString trNamespace(bool first_capital, bool singular)
     {
-      QCString result((first_capital ? "Namnrymd" : "namnrynd"));
+      QCString result((first_capital ? "Namnrymd" : "namnrymd"));
       if (!singular)  result+="er";
       return result;
     }
@@ -1604,6 +1605,262 @@ class TranslatorSwedish : public TranslatorAdapter_1_6_0
     {
       return "Typbegränsningar";
     }
+       
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.0 (mainly for the new search engine)
+//////////////////////////////////////////////////////////////////////////
+
+    /*! directory relation for \a name */
+    virtual QCString trDirRelation(const char *name)
+    {
+      return QCString(name)+" Relation";
+    }
+
+    /*! Loading message shown when loading search results */
+    virtual QCString trLoading()
+    {
+      return "Laddar...";
+    }
+
+    /*! Label used for search results in the global namespace */
+    virtual QCString trGlobalNamespace()
+    {
+      return "Globalnamnrymd";
+    }
+
+    /*! Message shown while searching */
+    virtual QCString trSearching()
+    {
+      return "Söker...";
+    }
+
+    /*! Text shown when no search results are found */
+    virtual QCString trNoMatches()
+    {
+      return "Inga träffar";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.6.3 (missing items for the directory pages)
+//////////////////////////////////////////////////////////////////////////
+
+    /*! when clicking a directory dependency label, a page with a
+     *  table is shown. The heading for the first column mentions the
+     *  source file that has a relation to another file.
+     */
+    virtual QCString trFileIn(const char *name)
+    {
+      return (QCString)"Fil i "+name;
+    }
+
+    /*! when clicking a directory dependency label, a page with a
+     *  table is shown. The heading for the second column mentions the
+     *  destination file that is included.
+     */
+    virtual QCString trIncludesFileIn(const char *name)
+    {
+      return (QCString)"Inkluderar fil i "+name;
+    }
+
+    /** Compiles a date string.
+     *  @param year Year in 4 digits
+     *  @param month Month of the year: 1=January
+     *  @param day Day of the Month: 1..31
+     *  @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+     *  @param hour Hour of the day: 0..23
+     *  @param minutes Minutes in the hour: 0..59
+     *  @param seconds Seconds within the minute: 0..59
+     *  @param includeTime Include time in the result string?
+     */
+    virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+                                int hour,int minutes,int seconds,
+                                bool includeTime)
+    {
+      static const char *days[]   = { "Mån","Tis","Ons","Tor","Fre","Lör","Sön" };
+      static const char *months[] = { "Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Oct","Nov","Dec" };
+      QCString sdate;
+      sdate.sprintf("%s %d %s %d",days[dayOfWeek-1],day,months[month-1],year);
+      if (includeTime)
+      {
+        QCString stime;
+        stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+        sdate+=stime;
+      }
+      return sdate;
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.7.5
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Header for the page with bibliographic citations */
+    virtual QCString trCiteReferences()
+    { return "Bibliografiska Referenser"; }
+
+    /*! Text for copyright paragraph */
+    virtual QCString trCopyright()
+    { return "Copyright"; }
+
+    /*! Header for the graph showing the directory dependencies */
+    virtual QCString trDirDepGraph(const char *name)
+    { return QCString("Katalogberoendegraf för ")+name+":"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.0
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Detail level selector shown for hierarchical indices */
+    virtual QCString trDetailLevel()
+    { return "detaljnivå"; }
+
+    /*! Section header for list of template parameters */
+    virtual QCString trTemplateParameters()
+    { return "Mall Parametrar"; }
+
+    /*! Used in dot graph when UML_LOOK is enabled and there are many fields */
+    virtual QCString trAndMore(const QCString &number)
+    { return "och "+number+" mera..."; }
+
+    /*! Used file list for a Java enum */
+    virtual QCString trEnumGeneratedFromFiles(bool single)
+    { QCString result = "Dokumentationen för denna enum var genererad från föjlande fil";
+      if (!single) result += "er";
+      result+=":";
+      return result;
+    }
+
+    /*! Header of a Java enum page (Java enums are represented as classes). */
+    virtual QCString trEnumReference(const char *name)
+    { return QCString(name)+" Enum Referens"; }
+
+    /*! Used for a section containing inherited members */
+    virtual QCString trInheritedFrom(const char *members,const char *what)
+    { return QCString(members)+" ärvd ifrån "+what; }
+
+    /*! Header of the sections with inherited members specific for the
+     *  base class(es)
+     */
+    virtual QCString trAdditionalInheritedMembers()
+    { return "Ytterliga Ärvda Medlemmar"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.2
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a tooltip for the toggle button that appears in the
+     *  navigation tree in the HTML output when GENERATE_TREEVIEW is
+     *  enabled. This tooltip explains the meaning of the button.
+     */
+    virtual QCString trPanelSynchronisationTooltip(bool enable)
+    {
+      QCString opt = enable ? "aktivera" : "inaktivera"; 
+      return "klicka för att "+opt+" panel synkronisering";
+    }
+
+    /*! Used in a method of an Objective-C class that is declared in a
+     *  a category. Note that the @1 marker is required and is replaced
+     *  by a link.
+     */
+    virtual QCString trProvidedByCategory()
+    {
+      return "Tillhandahålls av kategori @1.";
+    }
+
+    /*! Used in a method of an Objective-C category that extends a class.
+     *  Note that the @1 marker is required and is replaced by a link to
+     *  the class method.
+     */
+    virtual QCString trExtendsClass()
+    {
+      return "Utökar klass @1.";
+    }
+
+    /*! Used as the header of a list of class methods in Objective-C.
+     *  These are similar to static public member functions in C++.
+     */
+    virtual QCString trClassMethods()
+    {
+      return "Klassmetoder";
+    }
+
+    /*! Used as the header of a list of instance methods in Objective-C.
+     *  These are similar to public member functions in C++.
+     */
+    virtual QCString trInstanceMethods()
+    {
+      return "Instansmetoder";
+    }
+
+    /*! Used as the header of the member functions of an Objective-C class.
+     */
+    virtual QCString trMethodDocumentation()
+    {
+      return "Metoddokumentation";
+    }
+
+    /*! Used as the title of the design overview picture created for the
+     *  VHDL output.
+     */
+    virtual QCString trDesignOverview()
+    {
+      return "Designöversikt";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+    /** old style UNO IDL services: implemented interfaces */
+    virtual QCString trInterfaces()
+    { return "Exporterade Interface"; }
+
+    /** old style UNO IDL services: inherited services */
+    virtual QCString trServices()
+    { return "Inkuderade Tjänster"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroups()
+    { return "Konstant Grupper"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroupReference(const char *namespaceName)
+    {
+      QCString result=namespaceName;
+      result+=" Konstant Grupp Referens";
+      return result;
+    }
+    /** UNO IDL service page title */
+    virtual QCString trServiceReference(const char *sName)
+    {
+      QCString result=(QCString)sName;
+      result+=" Tjänstereferens";
+      return result;
+    }
+    /** UNO IDL singleton page title */
+    virtual QCString trSingletonReference(const char *sName)
+    {
+      QCString result=(QCString)sName;
+      result+=" Singleton Referens";
+      return result;
+    }
+    /** UNO IDL service page */
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"Dokumentationen för denna tjänst "
+                                "genererades från följande fil";
+      if (single) result+=":"; else result+="er:";
+      return result;
+    }
+    /** UNO IDL singleton page */
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"Dokumentationen för denna singleton"
+                                "genererades från följande fil";
+      if (single) result+=":"; else result+="er:";
+      return result;
+    }
 
 /*---------- For internal use: ----------------------------------------*/
   protected:
index 2dbfcd8..56b4a19 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 86e0a02..581d7fe 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 9c89c40..b7ca86a 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 6657c6b..54c68b8 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 184eaa9..f47052e 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
index 0c269be..688d664 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -210,4 +210,11 @@ enum MemberType
   MemberType_Service,
 };
 
+enum FortranFormat
+{
+  FortranFormat_Unknown,
+  FortranFormat_Free,
+  FortranFormat_Fixed
+};
+
 #endif
index 545cd43..fecf632 100644 (file)
@@ -1,8 +1,7 @@
 /*****************************************************************************
- *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -61,6 +60,7 @@
 #include "filename.h"
 #include "membergroup.h"
 #include "dirdef.h"
+#include "htmlentity.h"
 
 #define ENABLE_TRACINGSUPPORT 0
 
@@ -2143,11 +2143,12 @@ QCString argListToString(ArgumentList *al,bool useCanonicalType,bool showDefVals
 {
   QCString result;
   if (al==0) return result;
-  Argument *a=al->first();
+  ArgumentListIterator ali(*al);
+  Argument *a=ali.current();
   result+="(";
   while (a)
   {
-    QCString type1 = useCanonicalType && !a->canType.isEmpty() ? 
+    QCString type1 = useCanonicalType && !a->canType.isEmpty() ?
       a->canType : a->type;
     QCString type2;
     int i=type1.find(")("); // hack to deal with function pointers
@@ -2172,8 +2173,9 @@ QCString argListToString(ArgumentList *al,bool useCanonicalType,bool showDefVals
     {
       result+="="+a->defval;
     }
-    a = al->next();
-    if (a) result+=", "; 
+    ++ali;
+    a = ali.current();
+    if (a) result+=", ";
   }
   result+=")";
   if (al->constSpecifier) result+=" const";
@@ -2188,7 +2190,8 @@ QCString tempArgListToString(ArgumentList *al)
   QCString result;
   if (al==0) return result;
   result="<";
-  Argument *a=al->first();
+  ArgumentListIterator ali(*al);
+  Argument *a=ali.current();
   while (a)
   {
     if (!a->name.isEmpty()) // add template argument name
@@ -2216,7 +2219,8 @@ QCString tempArgListToString(ArgumentList *al)
         result+=a->type;
       }
     }
-    a=al->next();
+    ++ali;
+    a=ali.current();
     if (a) result+=", ";
   }
   result+=">";
@@ -2486,13 +2490,13 @@ int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level)
   int m=maxInheritanceDepth; 
   if (cd->baseClasses())
   {
-    BaseClassDef *bcdi = cd->baseClasses()->first();
-    while (bcdi)
+    BaseClassListIterator bcli(*cd->baseClasses());
+    BaseClassDef *bcdi;
+    for (;(bcdi=bcli.current());++bcli)
     {
       int mc=minClassDistance(bcdi->classDef,bcd,level+1);
       if (mc<m) m=mc;
       if (m<0) break;
-      bcdi = cd->baseClasses()->next();
     }
   }
   return m;
@@ -2516,13 +2520,13 @@ Protection classInheritedProtectionLevel(ClassDef *cd,ClassDef *bcd,Protection p
   }
   else if (cd->baseClasses())
   {
-    BaseClassDef *bcdi = cd->baseClasses()->first();
-    while (bcdi && prot!=Private)
+    BaseClassListIterator bcli(*cd->baseClasses());
+    BaseClassDef *bcdi;
+    for (;(bcdi=bcli.current()) && prot!=Private;++bcli)
     {
       Protection baseProt = classInheritedProtectionLevel(bcdi->classDef,bcd,bcdi->prot,level+1);
       if (baseProt==Private)   prot=Private;
       else if (baseProt==Protected) prot=Protected;
-      bcdi = cd->baseClasses()->next();
     }
   }
 exit:
@@ -4285,10 +4289,10 @@ bool getDefs(const QCString &scName,
       //printf("found %d members\n",members.count());
       if (members.count()!=1 && args && !qstrcmp(args,"()"))
       {
-        // no exact match found, but if args="()" an arbitrary 
+        // no exact match found, but if args="()" an arbitrary
         // member will do
-        md=mn->last();
-        while (md /* && md->isLinkable()*/)
+        MemberListIterator mni(*mn);
+        for (mni.toLast();(md=mni.current());--mni)
         {
           //printf("Found member `%s'\n",md->name().data());
           //printf("member is linkable md->name()=`%s'\n",md->name().data());
@@ -4302,7 +4306,6 @@ bool getDefs(const QCString &scName,
           {
             members.append(md);
           }
-          md=mn->prev();
         }
       }
       //printf("found %d candidate members\n",members.count());
@@ -4311,23 +4314,22 @@ bool getDefs(const QCString &scName,
         if (currentFile)
         {
           //printf("multiple results; pick one from file:%s\n", currentFile->name().data());
-          md = members.first();
-          while (md) 
+          QListIterator<MemberDef> mit(members);
+          for (mit.toFirst();(md=mit.current());++mit)
           {
             if (md->getFileDef() && md->getFileDef()->name() == currentFile->name()) 
             {
               break; // found match in the current file
             }
-            md=members.next();
           }
           if (!md) // member not in the current file
           {
-            md=members.last();
+            md=members.getLast();
           }
-        } 
-        else 
+        }
+        else
         {
-          md=members.last();
+          md=members.getLast();
         }
       }
       if (md && (md->getEnumScope()==0 || !md->getEnumScope()->isStrong())) 
@@ -5142,6 +5144,7 @@ bool hasVisibleRoot(BaseClassList *bcl)
 QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscore)
 {
   static bool caseSenseNames = Config_getBool("CASE_SENSE_NAMES");
+  static bool allowUnicodeNames = Config_getBool("ALLOW_UNICODE_NAMES");
   static GrowBuf growBuf;
   growBuf.clear();
   char c;
@@ -5177,15 +5180,57 @@ QCString escapeCharsInString(const char *name,bool allowDots,bool allowUnderscor
       default: 
                 if (c<0)
                 {
-                  static char map[] = "0123456789ABCDEF";
                   char ids[5];
-                  unsigned char id = (unsigned char)c;
-                  ids[0]='_';
-                  ids[1]='x';
-                  ids[2]=map[id>>4];
-                  ids[3]=map[id&0xF];
-                  ids[4]=0;
-                  growBuf.addStr(ids);
+                  const unsigned char uc = (unsigned char)c;
+                  bool doEscape = TRUE;
+                  if (allowUnicodeNames && uc <= 0xf7)
+                  {
+                    const char* pt = p;
+                    ids[ 0 ] = c;
+                    int l = 0;
+                    if ((uc&0xE0)==0xC0)
+                    {
+                      l=2; // 11xx.xxxx: >=2 byte character
+                    }
+                    if ((uc&0xF0)==0xE0)
+                    {
+                      l=3; // 111x.xxxx: >=3 byte character
+                    }
+                    if ((uc&0xF8)==0xF0)
+                    {
+                      l=4; // 1111.xxxx: >=4 byte character
+                    }
+                    doEscape = l==0;
+                    for (int m=1; m<l && !doEscape; ++m)
+                    {
+                      unsigned char ct = (unsigned char)*pt;
+                      if (ct==0 || (ct&0xC0)!=0x80) // invalid unicode character
+                      {
+                        doEscape=TRUE;
+                      }
+                      else
+                      {
+                        ids[ m ] = *pt++;
+                      }
+                    }
+                    if ( !doEscape ) // got a valid unicode character
+                    {
+                      ids[ l ] = 0;
+                      growBuf.addStr( ids );
+                      p += l - 1;
+                    }
+                  }
+                  if (doEscape) // not a valid unicode char or escaping needed
+                  {
+                    static char map[] = "0123456789ABCDEF";
+                    unsigned char id = (unsigned char)c;
+                    ids[0]='_';
+                    ids[1]='x';
+                    ids[2]=map[id>>4];
+                    ids[3]=map[id&0xF];
+                    ids[4]=0;
+                    growBuf.addStr(ids);
+                  }
                 }
                 else if (caseSenseNames || !isupper(c))
                 {
@@ -5632,146 +5677,8 @@ QCString convertToJSString(const char *s)
 
 QCString convertCharEntitiesToUTF8(const QCString &s)
 {
-  static QDict<char> entityMap(127);
-  static bool init=TRUE;
   QCString result;
-  static QRegExp entityPat("&[a-zA-Z]+;");
-
-  if (init)
-  {
-    entityMap.insert("copy",       "\xC2\xA9");
-    entityMap.insert("tm",         "\xE2\x84\xA2");
-    entityMap.insert("trade",      "\xE2\x84\xA2");
-    entityMap.insert("reg",        "\xC2\xAE");
-    entityMap.insert("lsquo",      "\xE2\x80\x98");
-    entityMap.insert("rsquo",      "\xE2\x80\x99");
-    entityMap.insert("ldquo",      "\xE2\x80\x9C");
-    entityMap.insert("rdquo",      "\xE2\x80\x9D");
-    entityMap.insert("ndash",      "\xE2\x80\x93");
-    entityMap.insert("mdash",      "\xE2\x80\x94");
-    entityMap.insert("Auml",       "\xC3\x84");
-    entityMap.insert("Euml",       "\xC3\x8B");
-    entityMap.insert("Iuml",       "\xC3\x8F");
-    entityMap.insert("Ouml",       "\xC3\x96");
-    entityMap.insert("Uuml",       "\xC3\x9C");
-    entityMap.insert("Yuml",       "\xC5\xB8");
-    entityMap.insert("auml",       "\xC3\xA4");
-    entityMap.insert("euml",       "\xC3\xAB");
-    entityMap.insert("iuml",       "\xC3\xAF");
-    entityMap.insert("ouml",       "\xC3\xB6");
-    entityMap.insert("uuml",       "\xC3\xBC");
-    entityMap.insert("yuml",       "\xC3\xBF");
-    entityMap.insert("Aacute",     "\xC3\x81");
-    entityMap.insert("Eacute",     "\xC3\x89");
-    entityMap.insert("Iacute",     "\xC3\x8D");
-    entityMap.insert("Oacute",     "\xC3\x93");
-    entityMap.insert("Uacute",     "\xC3\x9A");
-    entityMap.insert("aacute",     "\xC3\xA1");
-    entityMap.insert("eacute",     "\xC3\xA9");
-    entityMap.insert("iacute",     "\xC3\xAD");
-    entityMap.insert("oacute",     "\xC3\xB3");
-    entityMap.insert("uacute",     "\xC3\xBA");
-    entityMap.insert("Agrave",     "\xC3\x80");
-    entityMap.insert("Egrave",     "\xC3\x88");
-    entityMap.insert("Igrave",     "\xC3\x8C");
-    entityMap.insert("Ograve",     "\xC3\x92");
-    entityMap.insert("Ugrave",     "\xC3\x99");
-    entityMap.insert("agrave",     "\xC3\xA0");
-    entityMap.insert("egrave",     "\xC3\xA8");
-    entityMap.insert("igrave",     "\xC3\xAC");
-    entityMap.insert("ograve",     "\xC3\xB2");
-    entityMap.insert("ugrave",     "\xC3\xB9");
-    entityMap.insert("Acirc",      "\xC3\x82");
-    entityMap.insert("Ecirc",      "\xC3\x8A");
-    entityMap.insert("Icirc",      "\xC3\x8E");
-    entityMap.insert("Ocirc",      "\xC3\x94");
-    entityMap.insert("Ucirc",      "\xC3\x9B");
-    entityMap.insert("acirc",      "\xC3\xA2");
-    entityMap.insert("ecirc",      "\xC3\xAA");
-    entityMap.insert("icirc",      "\xC3\xAE");
-    entityMap.insert("ocirc",      "\xC3\xB4");
-    entityMap.insert("ucirc",      "\xC3\xBB");
-    entityMap.insert("Atilde",     "\xC3\x83");
-    entityMap.insert("Ntilde",     "\xC3\x91");
-    entityMap.insert("Otilde",     "\xC3\x95");
-    entityMap.insert("atilde",     "\xC3\xA3");
-    entityMap.insert("ntilde",     "\xC3\xB1");
-    entityMap.insert("otilde",     "\xC3\xB5");
-    entityMap.insert("szlig",      "\xC3\x9F");
-    entityMap.insert("Ccedil",     "\xC3\x87");
-    entityMap.insert("ccedil",     "\xC3\xA7");
-    entityMap.insert("Aring",      "\xC3\x85");
-    entityMap.insert("aring",      "\xC3\xA5");
-    entityMap.insert("nbsp",       "\xC2\xA0");
-    entityMap.insert("Gamma",      "\xCE\x93");
-    entityMap.insert("Delta",      "\xCE\x94");
-    entityMap.insert("Theta",      "\xCE\x98");
-    entityMap.insert("Lambda",     "\xCE\x9B");
-    entityMap.insert("Xi",         "\xCE\x9E");
-    entityMap.insert("Pi",         "\xCE\xA0");
-    entityMap.insert("Sigma",      "\xCE\xA3");
-    entityMap.insert("Upsilon",    "\xCE\xA5");
-    entityMap.insert("Phi",        "\xCE\xA6");
-    entityMap.insert("Psi",        "\xCE\xA8");
-    entityMap.insert("Omega",      "\xCE\xA9");
-    entityMap.insert("alpha",      "\xCE\xB1");
-    entityMap.insert("beta",       "\xCE\xB2");
-    entityMap.insert("gamma",      "\xCE\xB3");
-    entityMap.insert("delta",      "\xCE\xB4");
-    entityMap.insert("epsilon",    "\xCE\xB5");
-    entityMap.insert("zeta",       "\xCE\xB6");
-    entityMap.insert("eta",        "\xCE\xB8");
-    entityMap.insert("theta",      "\xCE\xB8");
-    entityMap.insert("iota",       "\xCE\xB9");
-    entityMap.insert("kappa",      "\xCE\xBA");
-    entityMap.insert("lambda",     "\xCE\xBB");
-    entityMap.insert("mu",         "\xCE\xBC");
-    entityMap.insert("nu",         "\xCE\xBD");
-    entityMap.insert("xi",         "\xCE\xBE");
-    entityMap.insert("pi",         "\xCF\x80");
-    entityMap.insert("rho",        "\xCF\x81");
-    entityMap.insert("sigma",      "\xCF\x83");
-    entityMap.insert("tau",        "\xCF\x84");
-    entityMap.insert("upsilon",    "\xCF\x85");
-    entityMap.insert("phi",        "\xCF\x86");
-    entityMap.insert("chi",        "\xCF\x87");
-    entityMap.insert("psi",        "\xCF\x88");
-    entityMap.insert("omega",      "\xCF\x89");
-    entityMap.insert("sigmaf",     "\xCF\x82");
-    entityMap.insert("sect",       "\xC2\xA7");
-    entityMap.insert("deg",        "\xC2\xB0");
-    entityMap.insert("prime",      "\xE2\x80\xB2");
-    entityMap.insert("Prime",      "\xE2\x80\xB2");
-    entityMap.insert("infin",      "\xE2\x88\x9E");
-    entityMap.insert("empty",      "\xE2\x88\x85");
-    entityMap.insert("plusmn",     "\xC2\xB1");
-    entityMap.insert("times",      "\xC3\x97");
-    entityMap.insert("minus",      "\xE2\x88\x92");
-    entityMap.insert("sdot",       "\xE2\x8B\x85");
-    entityMap.insert("part",       "\xE2\x88\x82");
-    entityMap.insert("nabla",      "\xE2\x88\x87");
-    entityMap.insert("radic",      "\xE2\x88\x9A");
-    entityMap.insert("perp",       "\xE2\x8A\xA5");
-    entityMap.insert("sum",        "\xE2\x88\x91");
-    entityMap.insert("int",        "\xE2\x88\xAB");
-    entityMap.insert("prod",       "\xE2\x88\x8F");
-    entityMap.insert("sim",        "\xE2\x88\xBC");
-    entityMap.insert("asymp",      "\xE2\x89\x88");
-    entityMap.insert("ne",         "\xE2\x89\xA0");
-    entityMap.insert("equiv",      "\xE2\x89\xA1");
-    entityMap.insert("prop",       "\xE2\x88\x9D");
-    entityMap.insert("le",         "\xE2\x89\xA4");
-    entityMap.insert("ge",         "\xE2\x89\xA5");
-    entityMap.insert("larr",       "\xE2\x86\x90");
-    entityMap.insert("rarr",       "\xE2\x86\x92");
-    entityMap.insert("isin",       "\xE2\x88\x88");
-    entityMap.insert("notin",      "\xE2\x88\x89");
-    entityMap.insert("lceil",      "\xE2\x8C\x88");
-    entityMap.insert("rceil",      "\xE2\x8C\x89");
-    entityMap.insert("lfloor",     "\xE2\x8C\x8A");
-    entityMap.insert("rfloor",     "\xE2\x8C\x8B");
-    init=FALSE;
-  }
+  static QRegExp entityPat("&[a-zA-Z]+[0-9]*;");
 
   if (s.length()==0) return result;
   static GrowBuf growBuf;
@@ -5779,13 +5686,14 @@ QCString convertCharEntitiesToUTF8(const QCString &s)
   int p,i=0,l;
   while ((p=entityPat.match(s,i,&l))!=-1)
   {
-    if (p>i) 
+    if (p>i)
     {
       growBuf.addStr(s.mid(i,p-i));
     }
-    QCString entity = s.mid(p+1,l-2);
-    char *code = entityMap.find(entity);
-    if (code)
+    QCString entity = s.mid(p,l);
+    DocSymbol::SymType symType = HtmlEntityMapper::instance()->name2sym(entity);
+    const char *code=0;
+    if (symType!=DocSymbol::Sym_Unknown && (code=HtmlEntityMapper::instance()->utf8(symType)))
     {
       growBuf.addStr(code);
     }
@@ -5829,8 +5737,9 @@ void addMembersToMemberGroup(MemberList *ml,
       MemberList *fmdl=md->enumFieldList();
       if (fmdl!=0)
       {
-        MemberDef *fmd=fmdl->first();
-        while (fmd)
+        MemberListIterator fmli(*fmdl);
+        MemberDef *fmd;
+        for (fmli.toFirst();(fmd=fmli.current());++fmli)
         {
           int groupId=fmd->getMemberGroupId();
           if (groupId!=-1)
@@ -5861,7 +5770,6 @@ void addMembersToMemberGroup(MemberList *ml,
               fmd->setMemberGroup(mg);
             }
           }
-          fmd=fmdl->next();
         }
       }
     }
@@ -6059,15 +5967,16 @@ QCString substituteTemplateArgumentsInString(
     result += name.mid(p,i-p);
     QCString n = name.mid(i,l);
     ArgumentListIterator formAli(*formalArgs);
+    ArgumentListIterator actAli(*actualArgs);
     Argument *formArg;
-    Argument *actArg=actualArgs->first();
+    Argument *actArg;
 
     // if n is a template argument, then we substitute it
     // for its template instance argument.
     bool found=FALSE;
     for (formAli.toFirst();
-        (formArg=formAli.current()) && !found;
-        ++formAli,actArg=actualArgs->next()
+        (formArg=formAli.current()) && !found && (actArg=actAli.current());
+        ++formAli,++actAli
         )
     {
       if (formArg->type.left(6)=="class " && formArg->name.isEmpty())
@@ -6371,14 +6280,29 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle,
       {
         file=pd->getOutputFileBase();
       }
-      SectionInfo *si=new SectionInfo(
-          file,pd->name(),pd->title(),SectionInfo::Page,0,pd->getReference());
-      //printf("si->label=`%s' si->definition=%s si->fileName=`%s'\n",
-      //      si->label.data(),si->definition?si->definition->name().data():"<none>",
-      //      si->fileName.data());
-      //printf("  SectionInfo: sec=%p sec->fileName=%s\n",si,si->fileName.data());
-      //printf("Adding section key=%s si->fileName=%s\n",pageName.data(),si->fileName.data());
-      Doxygen::sectionDict->append(pd->name(),si);
+      SectionInfo *si = Doxygen::sectionDict->find(pd->name());
+      if (si)
+      {
+        if (si->lineNr != -1)
+        {
+          warn(file,-1,"multiple use of section label '%s', (first occurrence: %s, line %d)",pd->name().data(),si->fileName.data(),si->lineNr);
+        }
+        else
+        {
+          warn(file,-1,"multiple use of section label '%s', (first occurrence: %s)",pd->name().data(),si->fileName.data());
+        }
+      }
+      else
+      {
+        si=new SectionInfo(
+            file,-1,pd->name(),pd->title(),SectionInfo::Page,0,pd->getReference());
+        //printf("si->label=`%s' si->definition=%s si->fileName=`%s'\n",
+        //      si->label.data(),si->definition?si->definition->name().data():"<none>",
+        //      si->fileName.data());
+        //printf("  SectionInfo: sec=%p sec->fileName=%s\n",si,si->fileName.data());
+        //printf("Adding section key=%s si->fileName=%s\n",pageName.data(),si->fileName.data());
+        Doxygen::sectionDict->append(pd->name(),si);
+      }
     }
   }
   return pd;
@@ -6481,9 +6405,9 @@ void filterLatexString(FTextStream &t,const char *str,
         case '^':  t << "$^\\wedge$";    break;
         case '&':  t << "\\&";           break;
         case '*':  t << "$\\ast$";       break;
-        case '_':  if (!insideTabbing) t << "\\-";  
+        case '_':  if (!insideTabbing) t << "\\+";  
                    t << "\\_"; 
-                   if (!insideTabbing) t << "\\-";  
+                   if (!insideTabbing) t << "\\+";  
                    break;
         case '{':  t << "\\{";           break;
         case '}':  t << "\\}";           break;
@@ -6504,14 +6428,9 @@ void filterLatexString(FTextStream &t,const char *str,
                    break;
         case '-':  t << "-\\/";
                    break;
-        case '\\': if (*p=='<') 
-                   { t << "$<$"; p++; }
-                   else if (*p=='>')
-                   { t << "$>$"; p++; } 
-                   else  
-                   { t << "\\textbackslash{}"; }
+        case '\\': t << "\\textbackslash{}";
                    break;           
-        case '"':  { t << "\\char`\\\"{}"; }
+        case '"':  t << "\\char`\\\"{}";
                    break;
 
         default:   
@@ -6520,7 +6439,7 @@ void filterLatexString(FTextStream &t,const char *str,
                        ((c>='A' && c<='Z' && pc!=' ' && pc!='\0') || (c==':' && pc!=':') || (pc=='.' && isId(c)))
                       )
                    {
-                     t << "\\-";
+                     t << "\\+";
                    }
                    t << (char)c;
       }
@@ -6720,23 +6639,25 @@ static struct Lang2ExtMap
 } 
 g_lang2extMap[] =
 {
-//  language       parser     parser option
-  { "idl",         "c",       SrcLangExt_IDL      },
-  { "java",        "c",       SrcLangExt_Java     },
-  { "javascript",  "c",       SrcLangExt_JS       },
-  { "csharp",      "c",       SrcLangExt_CSharp   },
-  { "d",           "c",       SrcLangExt_D        },
-  { "php",         "c",       SrcLangExt_PHP      },
-  { "objective-c", "c",       SrcLangExt_ObjC     },
-  { "c",           "c",       SrcLangExt_Cpp      },
-  { "c++",         "c",       SrcLangExt_Cpp      },
-  { "python",      "python",  SrcLangExt_Python   },
-  { "fortran",     "fortran", SrcLangExt_Fortran  },
-  { "vhdl",        "vhdl",    SrcLangExt_VHDL     },
-  { "dbusxml",     "dbusxml", SrcLangExt_XML      },
-  { "tcl",         "tcl",     SrcLangExt_Tcl      },
-  { "md",          "md",      SrcLangExt_Markdown },
-  { 0,             0,        (SrcLangExt)0        }
+//  language       parser           parser option
+  { "idl",         "c",             SrcLangExt_IDL      },
+  { "java",        "c",             SrcLangExt_Java     },
+  { "javascript",  "c",             SrcLangExt_JS       },
+  { "csharp",      "c",             SrcLangExt_CSharp   },
+  { "d",           "c",             SrcLangExt_D        },
+  { "php",         "c",             SrcLangExt_PHP      },
+  { "objective-c", "c",             SrcLangExt_ObjC     },
+  { "c",           "c",             SrcLangExt_Cpp      },
+  { "c++",         "c",             SrcLangExt_Cpp      },
+  { "python",      "python",        SrcLangExt_Python   },
+  { "fortran",     "fortran",       SrcLangExt_Fortran  },
+  { "fortranfree", "fortranfree",   SrcLangExt_Fortran  },
+  { "fortranfixed", "fortranfixed", SrcLangExt_Fortran  },
+  { "vhdl",        "vhdl",          SrcLangExt_VHDL     },
+  { "dbusxml",     "dbusxml",       SrcLangExt_XML      },
+  { "tcl",         "tcl",           SrcLangExt_Tcl      },
+  { "md",          "md",            SrcLangExt_Markdown },
+  { 0,             0,              (SrcLangExt)0        }
 };
 
 bool updateLanguageMapping(const QCString &extension,const QCString &language)
@@ -6919,14 +6840,25 @@ const char *writeUtf8Char(FTextStream &t,const char *s)
   t << c;
   if (c<0) // multibyte character
   {
-    t << *s++;
-    if (((uchar)c&0xE0)==0xE0)
+    if (((uchar)c&0xE0)==0xC0)
+    {
+      t << *s++; // 11xx.xxxx: >=2 byte character
+    }
+    if (((uchar)c&0xF0)==0xE0)
     {
       t << *s++; // 111x.xxxx: >=3 byte character
     }
-    if (((uchar)c&0xF0)==0xF0)
+    if (((uchar)c&0xF8)==0xF0)
+    {
+      t << *s++; // 1111.xxxx: >=4 byte character
+    }
+    if (((uchar)c&0xFC)==0xF8)
     {
-      t << *s++; // 1111.xxxx: 4 byte character
+      t << *s++; // 1111.1xxx: >=5 byte character
+    }
+    if (((uchar)c&0xFE)==0xFC)
+    {
+      t << *s++; // 1111.1xxx: 6 byte character
     }
   }
   return s;
@@ -6939,14 +6871,25 @@ int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos)
   char c = utf8Str[startPos];
   if (c<0) // multibyte utf-8 character
   {
-    bytes++;   // 1xxx.xxxx: >=2 byte character
-    if (((uchar)c&0xE0)==0xE0)
+    if (((uchar)c&0xE0)==0xC0)
+    {
+      bytes++; // 11xx.xxxx: >=2 byte character
+    }
+    if (((uchar)c&0xF0)==0xE0)
     {
       bytes++; // 111x.xxxx: >=3 byte character
     }
-    if (((uchar)c&0xF0)==0xF0)
+    if (((uchar)c&0xF8)==0xF0)
+    {
+      bytes++; // 1111.xxxx: >=4 byte character
+    }
+    if (((uchar)c&0xFC)==0xF8)
     {
-      bytes++; // 1111.xxxx: 4 byte character
+      bytes++; // 1111.1xxx: >=5 byte character
+    }
+    if (((uchar)c&0xFE)==0xFC)
+    {
+      bytes++; // 1111.1xxx: 6 byte character
     }
   }
   else if (c=='&') // skip over character entities
@@ -7517,9 +7460,14 @@ bool patternMatch(const QFileInfo &fi,const QStrList *patList)
   { 
     QStrListIterator it(*patList);
     QCString pattern;
+
+    QCString fn = fi.fileName().data();
+    QCString fp = fi.filePath().data();
+    QCString afp= fi.absFilePath().data();
+
     for (it.toFirst();(pattern=it.current());++it)
     {
-      if (!pattern.isEmpty() && !found)
+      if (!pattern.isEmpty())
       {
         int i=pattern.find('=');
         if (i!=-1) pattern=pattern.left(i); // strip of the extension specific filter name
@@ -7529,9 +7477,10 @@ bool patternMatch(const QFileInfo &fi,const QStrList *patList)
 #else                // unix
         QRegExp re(pattern,TRUE,TRUE);  // case sensitive match
 #endif
-        found = found || re.match(fi.fileName().data())!=-1 || 
-                         re.match(fi.filePath().data())!=-1 ||
-                         re.match(fi.absFilePath().data())!=-1;
+        found = re.match(fn)!=-1 ||
+                re.match(fp)!=-1 ||
+                re.match(afp)!=-1;
+        if (found) break;
         //printf("Matching `%s' against pattern `%s' found=%d\n",
         //    fi->fileName().data(),pattern.data(),found);
       }
@@ -8025,7 +7974,7 @@ bool namespaceHasVisibleChild(NamespaceDef *nd,bool includeClasses)
     NamespaceDef *cnd;
     for (cnli.toFirst();(cnd=cnli.current());++cnli)
     {
-      if (cnd->isLinkable() && cnd->localName().find('@')==-1)
+      if (cnd->isLinkableInProject() && cnd->localName().find('@')==-1)
       {
         return TRUE;
       }
@@ -8271,3 +8220,4 @@ void convertProtectionLevel(
   //printf("convertProtectionLevel(type=%d prot=%d): %d,%d\n",
   //    inListType,inProt,*outListType1,*outListType2);
 }
+
index a36a769..c131dd0 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van 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,6 +26,7 @@
 #include <ctype.h>
 #include "types.h"
 #include "sortdict.h"
+#include "docparser.h"
 
 //--------------------------------------------------------------------
 
@@ -95,12 +96,6 @@ class LetterToIndexMap : public SIntDict<T>
 {
   public:
     LetterToIndexMap() { SIntDict<T>::setAutoDelete(TRUE); }
-    int compareItems(QCollection::Item item1, QCollection::Item item2)
-    {
-      T *l1=(T *)item1;
-      T *l2=(T *)item2;
-      return (int)l1->letter()-(int)l2->letter();
-    }
     void append(uint letter,typename T::ElementType *elem)
     {
       T *l = SIntDict<T>::find((int)letter);
@@ -111,6 +106,11 @@ class LetterToIndexMap : public SIntDict<T>
       }
       l->append(elem);
     }
+  private:
+    int compareValues(const T *l1, const T *l2) const
+    {
+      return (int)l1->letter()-(int)l2->letter();
+    }
 };
 
 //--------------------------------------------------------------------
@@ -414,6 +414,7 @@ QCString externalRef(const QCString &relPath,const QCString &ref,bool href);
 int nextUtf8CharPosition(const QCString &utf8Str,int len,int startPos);
 const char *writeUtf8Char(FTextStream &t,const char *s);
 
+
 /** Data associated with a HSV colored image. */
 struct ColoredImgDataItem
 {
index 9d523c1..b31fe4f 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index c53303d..003cf95 100755 (executable)
@@ -9,6 +9,7 @@
 # the collected information is written to: `../VERSION` and `../src/version.cpp`
 #
 import sys
+import os
 #
 # set 'default' values
 #
@@ -46,7 +47,7 @@ mnt = mnt.replace('\n','')
 # close files
 #
 f1 = open('../VERSION','w')
-f2 = open('../src/version.cpp','w')
+f2 = open(os.path.join(sys.argv[1],'version.cpp'),'w')
 if (mnt == 'NO'):
     f1.write(major + '.' + minor + '.' + revision)
     f2.write('char versionString[]="' + major + '.' + minor + '.' + revision + '";')
index 94ba3c0..d8586ab 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -436,9 +436,10 @@ static void setParameterList(MemberDef *md)
 {
   g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
   ArgumentList *al = md->argumentList();
-  if (al==0) return; 
-  Argument *a = al->first();
-  while (a)
+  if (al==0) return;
+  ArgumentListIterator ali(*al);
+  Argument *a;
+  for (ali.toFirst();(a=ali.current());++ali)
   {
     g_parmName = a->name.copy();
     g_parmType = a->type.copy();
@@ -449,7 +450,6 @@ static void setParameterList(MemberDef *md)
     g_parmType.stripPrefix("const ");
     g_parmType=g_parmType.stripWhiteSpace();
    // g_theVarContext.addVariable(g_parmType,g_parmName);
-    a = al->next();
   }
 }
 
index aa0207a..4ff5f9d 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
@@ -167,7 +167,8 @@ static void createSVG()
     QRegExp ep("[\\s]");
     QCString vlargs="-Tsvg \""+ov+"\" "+dir ;
 
-    if (portable_system("dot",vlargs)!=0)
+    QCString dotExe   = Config_getString("DOT_PATH")+"dot";
+    if (portable_system(dotExe,vlargs)!=0)
     {
       err("could not create dot file");
     }
@@ -2221,7 +2222,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
   }
 
   bool htmlOn = ol.isEnabled(OutputGenerator::Html);
-  if (htmlOn && /*Config_getBool("HTML_ALIGN_MEMBERS") &&*/ !ltype.isEmpty())
+  if (htmlOn && !ltype.isEmpty())
   {
     ol.disable(OutputGenerator::Html);
   }
@@ -2772,7 +2773,6 @@ static void writeUCFLink(const MemberDef* mdef,OutputList &ol)
 
 bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne)
 {
-  FileName *fn=Doxygen::inputNameList->first();
   //LayoutNavEntry *cc = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Files);
 
   LayoutNavEntry *kk = lne->parent();//   find(LayoutNavEntry::Files);
@@ -2788,17 +2788,22 @@ bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne)
     kk->addChild(oo); 
   }
 
-  while (fn)
+  FileNameListIterator fnli(*Doxygen::inputNameList); 
+  FileName *fn;
+  for (fnli.toFirst();(fn=fnli.current());++fnli)
   {
-    FileDef *fd=fn->first();
-    if (fd->name().contains(".ucf") || fd->name().contains(".qsf"))
+    FileNameIterator fni(*fn);
+    FileDef *fd;
+    for (;(fd=fni.current());++fni)
     {
-      file = convertNameToFile(fd->name().data(),FALSE,FALSE);
-      LayoutNavEntry *ucf=new LayoutNavEntry(lne,LayoutNavEntry::MainPage,TRUE,file,co,"");
-      kk->addChild(ucf);
-      break;
+      if (fd->name().contains(".ucf") || fd->name().contains(".qsf"))
+      {
+        file = convertNameToFile(fd->name().data(),FALSE,FALSE);
+        LayoutNavEntry *ucf=new LayoutNavEntry(lne,LayoutNavEntry::MainPage,TRUE,file,co,"");
+        kk->addChild(ucf);
+        break;
+      }
     }
-    fn=Doxygen::inputNameList->next();
   }
   return  FALSE;
 }
@@ -3880,8 +3885,9 @@ void FlowChart::createSVG()
   ov+="/flow_design.dot";
 
   QCString vlargs="-Tsvg "+ov+dir ;
+  QCString dotExe   = Config_getString("DOT_PATH")+"dot";
 
-  if (portable_system("dot",vlargs)!=0)
+  if (portable_system(dotExe,vlargs)!=0)
   {
     err("could not create dot file");
   }
index 7c78373..45ceb06 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 4e4e675..247ac8a 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -2364,7 +2364,7 @@ static void addConfigureNode(const char* a,const char*b, bool,bool isLeaf,bool i
 
   if(!configL.isEmpty())
   {
-    VhdlConfNode* vc=configL.last();
+    VhdlConfNode* vc=configL.getLast();
     level=vc->level;
     if (levelCounter==0)
       pushLabel(forL,ent);
index 1d799d0..9b7c292 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 716c0c0..a3603c8 100644 (file)
@@ -543,7 +543,7 @@ BR                         [ \t\n\r]
 .      { /* unknown characters */ }
                                                                        
 
-<*>{BR}*"--!"[^{}\n]*[^\n]*\n/{B}*"--!" { // multi line comment
+<*>{B}*"--!"[^{}\n]*[^\n]*\n/{B}*"--!" { // multi line comment
   if (iDocLine==-1) iDocLine=yyLineNr;
   QCString qc(vhdlscannerYYtext);
   int len=qc.contains('\n')+yyLineNr-1;
@@ -988,7 +988,7 @@ static bool  checkMultiComment(QCString& qcs,int line)
   qcs.stripPrefix("--!");
   while (!pTemp->isEmpty())
   {
-    Entry *e=(Entry*)pTemp->first();
+    Entry *e=(Entry*)pTemp->getFirst();
     e->briefLine=line;
     e->brief+=qcs;
     iDocLine=-1;
index 8df1acf..f74a6a2 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -30,6 +30,7 @@
 #include "parserintf.h"
 #include "filename.h"
 #include "config.h"
+#include "htmlentity.h"
 
 XmlDocVisitor::XmlDocVisitor(FTextStream &t,CodeOutputInterface &ci) 
   : DocVisitor(DocVisitor_XML), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE) 
@@ -70,110 +71,14 @@ void XmlDocVisitor::visit(DocWhiteSpace *w)
 void XmlDocVisitor::visit(DocSymbol *s)
 {
   if (m_hide) return;
-  switch(s->symbol())
+  const char *res = HtmlEntityMapper::instance()->xml(s->symbol());
+  if (res)
   {
-    case DocSymbol::BSlash:        m_t << "\\"; break;
-    case DocSymbol::At:            m_t << "@"; break;
-    case DocSymbol::Less:          m_t << "&lt;"; break;
-    case DocSymbol::Greater:       m_t << "&gt;"; break;
-    case DocSymbol::Amp:           m_t << "&amp;"; break;
-    case DocSymbol::Dollar:        m_t << "$"; break;
-    case DocSymbol::Hash:          m_t << "#"; break;
-    case DocSymbol::DoubleColon:   m_t << "::"; break;
-    case DocSymbol::Percent:       m_t << "%"; break;
-    case DocSymbol::Pipe:          m_t << "|"; break;
-    case DocSymbol::Copy:          m_t << "<copy/>"; break;
-    case DocSymbol::Tm:            m_t << "<trademark/>"; break;
-    case DocSymbol::Reg:           m_t << "<registered/>"; break;
-    case DocSymbol::Apos:          m_t << "'"; break;
-    case DocSymbol::Quot:          m_t << "\""; break;
-    case DocSymbol::Lsquo:         m_t << "<lsquo/>"; break;
-    case DocSymbol::Rsquo:         m_t << "<rsquo/>"; break;
-    case DocSymbol::Ldquo:         m_t << "<ldquo/>"; break;
-    case DocSymbol::Rdquo:         m_t << "<rdquo/>"; break;
-    case DocSymbol::Ndash:         m_t << "<ndash/>"; break;
-    case DocSymbol::Mdash:         m_t << "<mdash/>"; break;
-    case DocSymbol::Uml:           m_t << "<umlaut char=\"" << s->letter() << "\"/>"; break;
-    case DocSymbol::Acute:         m_t << "<acute char=\"" << s->letter() << "\"/>"; break;
-    case DocSymbol::Grave:         m_t << "<grave char=\"" << s->letter() << "\"/>"; break;
-    case DocSymbol::Circ:          m_t << "<circ char=\"" << s->letter() << "\"/>"; break;
-    case DocSymbol::Tilde:         m_t << "<tilde char=\"" << s->letter() << "\"/>"; break;
-    case DocSymbol::Szlig:         m_t << "<szlig/>"; break;
-    case DocSymbol::Cedil:         m_t << "<cedil char=\"" << s->letter() << "\"/>"; break;
-    case DocSymbol::Ring:          m_t << "<ring char=\"" << s->letter() << "\"/>"; break;
-    case DocSymbol::Slash:         m_t << "<slash char=\"" << s->letter() << "\"/>"; break;
-    case DocSymbol::Nbsp:          m_t << "<nonbreakablespace/>"; break;
-    case DocSymbol::Aelig:         m_t << "<aelig/>"; break;
-    case DocSymbol::AElig:         m_t << "<AElig/>"; break;
-    case DocSymbol::GrkGamma:      m_t << "<Gamma/>"; break;
-    case DocSymbol::GrkDelta:      m_t << "<Delta/>"; break;
-    case DocSymbol::GrkTheta:      m_t << "<Theta/>"; break;
-    case DocSymbol::GrkLambda:     m_t << "<Lambda/>"; break;
-    case DocSymbol::GrkXi:         m_t << "<Xi/>"; break;
-    case DocSymbol::GrkPi:         m_t << "<Pi/>"; break;
-    case DocSymbol::GrkSigma:      m_t << "<Sigma/>"; break;
-    case DocSymbol::GrkUpsilon:    m_t << "<Upsilon/>"; break;
-    case DocSymbol::GrkPhi:        m_t << "<Phi/>"; break;
-    case DocSymbol::GrkPsi:        m_t << "<Psi/>"; break;
-    case DocSymbol::GrkOmega:      m_t << "<Omega/>"; break;
-    case DocSymbol::Grkalpha:      m_t << "<alpha/>"; break;
-    case DocSymbol::Grkbeta:       m_t << "<beta/>"; break;
-    case DocSymbol::Grkgamma:      m_t << "<gamma/>"; break;
-    case DocSymbol::Grkdelta:      m_t << "<delta/>"; break;
-    case DocSymbol::Grkepsilon:    m_t << "<epsilon/>"; break;
-    case DocSymbol::Grkzeta:       m_t << "<zeta/>"; break;
-    case DocSymbol::Grketa:        m_t << "<eta/>"; break;
-    case DocSymbol::Grktheta:      m_t << "<theta/>"; break;
-    case DocSymbol::Grkiota:       m_t << "<iota/>"; break;
-    case DocSymbol::Grkkappa:      m_t << "<kappa/>"; break;
-    case DocSymbol::Grklambda:     m_t << "<lambda/>"; break;
-    case DocSymbol::Grkmu:         m_t << "<mu/>"; break;
-    case DocSymbol::Grknu:         m_t << "<nu/>"; break;
-    case DocSymbol::Grkxi:         m_t << "<xi/>"; break;
-    case DocSymbol::Grkpi:         m_t << "<pi/>"; break;
-    case DocSymbol::Grkrho:        m_t << "<rho/>"; break;
-    case DocSymbol::Grksigma:      m_t << "<sigma/>"; break;
-    case DocSymbol::Grktau:        m_t << "<tau/>"; break;
-    case DocSymbol::Grkupsilon:    m_t << "<upsilon/>"; break;
-    case DocSymbol::Grkphi:        m_t << "<phi/>"; break;
-    case DocSymbol::Grkchi:        m_t << "<chi/>"; break;
-    case DocSymbol::Grkpsi:        m_t << "<psi/>"; break;
-    case DocSymbol::Grkomega:      m_t << "<omega/>"; break;
-    case DocSymbol::Grkvarsigma:   m_t << "<sigmaf/>"; break;
-    case DocSymbol::Section:       m_t << "<sect/>"; break;
-    case DocSymbol::Degree:        m_t << "<deg/>"; break;
-    case DocSymbol::Prime:         m_t << "<prime/>"; break;
-    case DocSymbol::DoublePrime:   m_t << "<Prime/>"; break;
-    case DocSymbol::Infinity:      m_t << "<infin/>"; break;
-    case DocSymbol::EmptySet:      m_t << "<empty/>"; break;
-    case DocSymbol::PlusMinus:     m_t << "<plusmn/>"; break;
-    case DocSymbol::Times:         m_t << "<times/>"; break;
-    case DocSymbol::Minus:         m_t << "<minus/>"; break;
-    case DocSymbol::CenterDot:     m_t << "<sdot/>"; break;
-    case DocSymbol::Partial:       m_t << "<part/>"; break;
-    case DocSymbol::Nabla:         m_t << "<nabla/>"; break;
-    case DocSymbol::SquareRoot:    m_t << "<radic/>"; break;
-    case DocSymbol::Perpendicular: m_t << "<perp/>"; break;
-    case DocSymbol::Sum:           m_t << "<sum/>"; break;
-    case DocSymbol::Integral:      m_t << "<int/>"; break;
-    case DocSymbol::Product:       m_t << "<prod/>"; break;
-    case DocSymbol::Similar:       m_t << "<sim/>"; break;
-    case DocSymbol::Approx:        m_t << "<asymp/>"; break;
-    case DocSymbol::NotEqual:      m_t << "<ne/>"; break;
-    case DocSymbol::Equivalent:    m_t << "<equiv/>"; break;
-    case DocSymbol::Proportional:  m_t << "<prop/>"; break;
-    case DocSymbol::LessEqual:     m_t << "<le/>"; break;
-    case DocSymbol::GreaterEqual:  m_t << "<ge/>"; break;
-    case DocSymbol::LeftArrow:     m_t << "<larr/>"; break;
-    case DocSymbol::RightArrow:    m_t << "<rarr/>"; break;
-    case DocSymbol::SetIn:         m_t << "<isin/>"; break;
-    case DocSymbol::SetNotIn:      m_t << "<notin/>"; break;
-    case DocSymbol::LeftCeil:      m_t << "<lceil/>"; break;
-    case DocSymbol::RightCeil:     m_t << "<rceil/>"; break;
-    case DocSymbol::LeftFloor:     m_t << "<lfloor/>"; break;
-    case DocSymbol::RightFloor:    m_t << "<rfloor/>"; break;
-    default:
-                             err("unknown symbol found\n");
+    m_t << res;
+  }
+  else
+  {
+    err("XML: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
   }
 }
 
@@ -350,6 +255,11 @@ void XmlDocVisitor::visit(DocInclude *inc)
       filter(inc->text());
       m_t << "</htmlonly>";
       break;
+    case DocInclude::LatexInclude:
+      m_t << "<latexonly>";
+      filter(inc->text());
+      m_t << "</latexonly>";
+      break;
     case DocInclude::VerbInclude: 
       m_t << "<verbatim>";
       filter(inc->text());
@@ -427,9 +337,13 @@ void XmlDocVisitor::visit(DocIndexEntry *ie)
          "</indexentry>";
 }
 
-void XmlDocVisitor::visit(DocSimpleSectSep *)
+void XmlDocVisitor::visit(DocSimpleSectSep *sep)
 {
-  m_t << "<simplesectsep/>";
+  if (sep->parent() && sep->parent()->kind()==DocNode::Kind_SimpleSect)
+  {
+    visitPost((DocSimpleSect*)sep->parent()); // end current section
+    visitPre((DocSimpleSect*)sep->parent());  // start new section
+  }
 }
 
 void XmlDocVisitor::visit(DocCite *cite)
index 6dc189c..3e2236c 100644 (file)
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index 570901f..efddcd4 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -45,6 +45,7 @@
 #include "membergroup.h"
 #include "dirdef.h"
 #include "section.h"
+#include "htmlentity.h"
 
 // no debug info
 #define XML_DB(x) do {} while(0)
@@ -1844,7 +1845,7 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample)
     SectionInfo *si = Doxygen::sectionDict->find(pd->name());
     if (si)
     {
-      t << "    <title>" << convertToXML(convertCharEntitiesToUTF8(si->title)) 
+      t << "    <title>" << convertToXML(convertCharEntitiesToUTF8(filterTitle(si->title))) 
         << "</title>" << endl;
     }
   }
@@ -1897,7 +1898,32 @@ void generateXML()
     err("Cannot open file %s for writing!\n",fileName.data());
     return;
   }
-  f.writeBlock(compound_xsd,qstrlen(compound_xsd));
+
+  // write compound.xsd, but replace special marker with the entities
+  const char *startLine = compound_xsd;
+  while (*startLine)
+  {
+    // find end of the line
+    const char *endLine = startLine+1;
+    while (*endLine && *(endLine-1)!='\n') endLine++; // skip to end of the line including \n
+    int len=endLine-startLine;
+    if (len>0)
+    {
+      QCString s(len+1);
+      qstrncpy(s.data(),startLine,len);
+      s[len]='\0';
+      if (s.find("<!-- Automatically insert here the HTML entities -->")!=-1)
+      {
+        FTextStream t(&f);
+        HtmlEntityMapper::instance()->writeXMLSchema(t);
+      }
+      else
+      {
+        f.writeBlock(startLine,len);
+      }
+    }
+    startLine=endLine;
+  }
   f.close();
 
   fileName=outputDirectory+"/index.xml";
index b89b10f..9c9ae17 100644 (file)
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2013 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
index edb2904..1afe69b 100644 (file)
@@ -7,7 +7,8 @@
       <para>
         <simplesect kind="author">
           <para>John Doe </para>
-          <simplesectsep/>
+        </simplesect>
+        <simplesect kind="author">
           <para>Jane Doe </para>
         </simplesect>
         <simplesect kind="authors">
index d5bccda..87ceb53 100644 (file)
@@ -6,6 +6,8 @@
     <detaileddescription>
       <para>Text. <htmlonly> 
 HTML
+</htmlonly> <htmlonly>
+HTML with block
 </htmlonly> <rtfonly> 
 RTF
 </rtfonly> <manonly> 
index be21136..f8e2ce1 100644 (file)
@@ -5,6 +5,9 @@
  * \htmlonly
  * HTML
  * \endhtmlonly
+ * \htmlonly[block]
+ * HTML with block
+ * \endhtmlonly
  * \rtfonly
  * RTF
  * \endrtfonly
diff --git a/testing/054/054__parblock_8cpp.xml b/testing/054/054__parblock_8cpp.xml
new file mode 100644 (file)
index 0000000..a562a6d
--- /dev/null
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+  <compounddef id="054__parblock_8cpp" kind="file">
+    <compoundname>054_parblock.cpp</compoundname>
+    <sectiondef kind="func">
+      <memberdef kind="function" id="054__parblock_8cpp_1a2dd0ac47f42a9994b91d34403be05fe9" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+        <type>void</type>
+        <definition>void function</definition>
+        <argsstring>(int client, int *resource, int parblock, int *test, int p)</argsstring>
+        <name>function</name>
+        <param>
+          <type>int</type>
+          <declname>client</declname>
+        </param>
+        <param>
+          <type>int *</type>
+          <declname>resource</declname>
+        </param>
+        <param>
+          <type>int</type>
+          <declname>parblock</declname>
+        </param>
+        <param>
+          <type>int *</type>
+          <declname>test</declname>
+        </param>
+        <param>
+          <type>int</type>
+          <declname>p</declname>
+        </param>
+        <briefdescription>
+        </briefdescription>
+        <detaileddescription>
+          <para>call by target-specific code to manage resources required by the client.</para>
+          <para>
+            <parameterlist kind="param">
+              <parameteritem>
+                <parameternamelist>
+                  <parametername direction="in">client</parametername>
+                </parameternamelist>
+                <parameterdescription>
+                  <para>ID of client requesting resource. </para>
+                </parameterdescription>
+              </parameteritem>
+              <parameteritem>
+                <parameternamelist>
+                  <parametername direction="out">resource</parametername>
+                </parameternamelist>
+                <parameterdescription>
+                  <para>Requested resource </para>
+                </parameterdescription>
+              </parameteritem>
+              <parameteritem>
+                <parameternamelist>
+                  <parametername direction="in">parblock</parametername>
+                </parameternamelist>
+                <parameterdescription>
+                  <para>
+                    <parblock>
+                      <para>This is a test for the @parblock command.</para>
+                      <para>A list if values for the parblock param:<itemizedlist><listitem><para>Item 1. This is short one-line description.</para></listitem><listitem><para>Item 2. This is a long bullet item; sometimes they wrap on multiple lines like this one.</para></listitem></itemizedlist>
+</para>
+                      <para>This is the second paragraph description for the @parblock parameter. Always end the text inside the @parblock command with an @endparblock command. </para>
+                    </parblock>
+                  </para>
+                </parameterdescription>
+              </parameteritem>
+              <parameteritem>
+                <parameternamelist>
+                  <parametername direction="out">test</parametername>
+                </parameternamelist>
+                <parameterdescription>
+                  <para>This is a test parameter for this function to see if it is included in the parameter table </para>
+                </parameterdescription>
+              </parameteritem>
+              <parameteritem>
+                <parameternamelist>
+                  <parametername direction="in">p</parametername>
+                </parameternamelist>
+                <parameterdescription>
+                  <para>
+                    <parblock>
+                      <para>First paragraph of the param description. <verbatim>                  Second paragraph of the param description.
+</verbatim> </para>
+                    </parblock>
+                  </para>
+                </parameterdescription>
+              </parameteritem>
+            </parameterlist>
+          </para>
+        </detaileddescription>
+        <inbodydescription>
+        </inbodydescription>
+        <location file="054_parblock.cpp" line="32" column="1"/>
+      </memberdef>
+    </sectiondef>
+    <briefdescription>
+    </briefdescription>
+    <detaileddescription>
+    </detaileddescription>
+    <location file="054_parblock.cpp"/>
+  </compounddef>
+</doxygen>
diff --git a/testing/054_parblock.cpp b/testing/054_parblock.cpp
new file mode 100644 (file)
index 0000000..186feb5
--- /dev/null
@@ -0,0 +1,32 @@
+// objective: test the \parblock command
+// check: 054__parblock_8cpp.xml
+
+/** @file */
+
+/**
+ call by target-specific code to manage resources required by the client.
+
+ @param[in]  client    ID of client requesting resource.
+ @param[out] resource  Requested resource
+ @param[in]  parblock  @parblock This is a test for the \@parblock
+                       command.
+
+                       A list if values for the parblock param:
+                       - Item 1. This is short one-line description.
+                       - Item 2. This is a long bullet item;
+                         sometimes they wrap on multiple lines like this
+                         one.
+
+                       This is the second paragraph description for the
+                       \@parblock parameter. Always end the text inside
+                       the \@parblock command with an \@endparblock
+                       command.
+                       @endparblock
+ @param[out] test      This is a test parameter for this function to see if
+                       it is included in the parameter table
+ @param[in]  p         @parblock First paragraph of the param description.
+
+                       Second paragraph of the param description.
+                       @endparblock
+ */
+void function(int client,int *resource,int parblock,int *test,int p);
diff --git a/testing/055/md_055_markdown.xml b/testing/055/md_055_markdown.xml
new file mode 100644 (file)
index 0000000..4006db8
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+  <compounddef id="md_055_markdown" kind="page">
+    <compoundname>md_055_markdown</compoundname>
+    <title>055_markdown</title>
+    <detaileddescription>
+      <para>
+        <heading level="1">Foo</heading>
+      </para>
+      <para>
+        <heading level="2">Bar</heading>
+      </para>
+      <para>
+        <ulink url="http://example.com/inline">Inline link</ulink>
+      </para>
+      <para>
+        <ulink url="http://example.com/reference">Reference link</ulink>
+      </para>
+      <para>
+        <heading level="2">Baz</heading>
+      </para>
+      <para>More text</para>
+      <para>
+        <ulink url="http://example.com/last-line">Upper-cased reference link on last line</ulink>
+      </para>
+    </detaileddescription>
+  </compounddef>
+</doxygen>
diff --git a/testing/055_markdown.md b/testing/055_markdown.md
new file mode 100644 (file)
index 0000000..aeb9f1a
--- /dev/null
@@ -0,0 +1,22 @@
+<!--
+// objective: test markdown parsing
+// check: md_055_markdown.xml
+-->
+
+# Foo
+
+## Bar
+
+[Inline link](http://example.com/inline)
+
+[Reference link][1]
+
+[1]: http://example.com/reference
+
+## Baz
+
+More text
+
+[Upper-cased reference link on last line][U]
+
+[U]: http://example.com/last-line
diff --git a/testing/056/indexpage.xml b/testing/056/indexpage.xml
new file mode 100644 (file)
index 0000000..8376a74
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+  <compounddef id="indexpage" kind="page">
+    <compoundname>index</compoundname>
+    <title>My Project</title>
+    <detaileddescription>
+      <para>Some text. <latexonly>\section{Hello world}
+</latexonly> More text. </para>
+    </detaileddescription>
+  </compounddef>
+</doxygen>
diff --git a/testing/056_latexinclude.dox b/testing/056_latexinclude.dox
new file mode 100644 (file)
index 0000000..6a8052a
--- /dev/null
@@ -0,0 +1,8 @@
+// objective: test the \latexinclude command
+// check: indexpage.xml
+// config: EXAMPLE_PATH = .
+/** \mainpage
+ * Some text.
+ * \latexinclude sample.tex
+ * More text.
+ */
diff --git a/testing/sample.tex b/testing/sample.tex
new file mode 100644 (file)
index 0000000..9a1717e
--- /dev/null
@@ -0,0 +1 @@
+\section{Hello world}
diff --git a/testing/testsqlite3.py b/testing/testsqlite3.py
new file mode 100755 (executable)
index 0000000..e8ab16c
--- /dev/null
@@ -0,0 +1,146 @@
+#! /usr/bin/python
+from xml.etree import cElementTree as ET
+import os
+import sqlite3
+import sys
+import getopt
+
+# map XML attributes/elements to SQL rows
+# --POC: iterate through the children and attributes of the memberdef elelement
+#        and search it in doxygen_sqlite3.db
+
+g_conn=None
+val=[]
+def print_unprocessed_attributes(node):
+    for key in node.attrib:
+        print "WARNING: '%s' has unprocessed attr '%s'" % (node.tag,key)
+
+def extract_attribute(node,attribute,pnl):
+    if not attribute in node.attrib:
+        return
+    pnl.append("%s = ?" % attribute)
+    val.append(node.attrib[attribute])
+    node.attrib.pop(attribute)
+
+def extract_element(node,chld,pnl):
+    # deal with <tag />
+    if chld.text == None:
+        if len(chld.attrib)==0:
+            node.remove(chld)
+        return
+
+    a=chld.text.strip()
+    if not a == "":
+        pnl.append("%s =?" % chld.tag)
+        val.append(chld.text.strip())
+    else:
+        pnl.append("%s IS NULL OR %s = ''" % (chld.tag,chld.tag))
+    node.remove(chld)
+
+def process_memberdef(node):
+    q=[]
+    for chld in node.getchildren():
+        if chld.tag == "referencedby":
+            continue
+        if chld.tag == "references":
+            continue
+        if chld.tag == "param":
+            continue
+        if chld.tag == "type":
+            continue
+        if chld.tag == "location":
+            extract_attribute(chld,"line",q)
+            extract_attribute(chld,"column",q)
+            extract_attribute(chld,"bodystart",q)
+            extract_attribute(chld,"bodyend",q)
+
+            q.append("id_bodyfile=(select id from files where name=?)")
+            val.append(chld.attrib["bodyfile"])
+            chld.attrib.pop("bodyfile")
+
+            q.append("id_file=(select id from files where name=?)")
+            val.append(chld.attrib["file"])
+            chld.attrib.pop("file")
+
+            print_unprocessed_attributes(chld)
+            if len(chld.attrib) == 0:
+                node.remove(chld)
+        else:
+            extract_element(node,chld,q)
+
+    for chld in node.getchildren():
+        print "WARNING: '%s' has unprocessed child elem '%s'" % (node.tag,chld.tag)
+
+    extract_attribute(node,"kind",q)
+    extract_attribute(node,"prot",q)
+    extract_attribute(node,"static",q)
+    extract_attribute(node,"mutable",q)
+    extract_attribute(node,"const",q)
+    extract_attribute(node,"virt",q)
+    extract_attribute(node,"explicit",q)
+    extract_attribute(node,"inline",q)
+
+    q.append("refid=?")
+    val.append(node.attrib['id'])
+    node.attrib.pop('id')
+
+    print_unprocessed_attributes(node)
+
+    query="SELECT * FROM memberdef WHERE %s" % " AND ".join(q)
+    r=[]
+    try:
+        r = g_conn.execute(query,val).fetchall()
+    except sqlite3.OperationalError,e:
+        print "SQL_ERROR:%s"%e
+
+    del val[:]
+    if not len(r) > 0:
+        print "TEST_ERROR: Member not found in SQL DB"
+
+
+def load_xml(name):
+    context = ET.iterparse(name, events=("start", "end"))
+    event, root = context.next()
+    for event, elem in context:
+        if event == "end" and elem.tag == "memberdef":
+            process_memberdef(elem)
+    print "\n== Unprocessed XML =="
+#    ET.dump(root)
+
+
+def open_db(dbname):
+    global g_conn
+
+    if dbname == None:
+        dbname = "doxygen_sqlite3.db"
+
+    if not os.path.isfile(dbname):
+        raise BaseException("No such file %s" % dbname )
+
+    g_conn = sqlite3.connect(dbname)
+    g_conn.execute('PRAGMA temp_store = MEMORY;')
+    g_conn.row_factory = sqlite3.Row
+
+def main(argv):
+    try:
+        opts, args = getopt.getopt(argv, "hd:x:",["help"])
+    except getopt.GetoptError:
+        sys.exit(1)
+
+    dbname=None
+    xmlfile=None
+
+    for a, o in opts:
+        if a in ('-h', '--help'):
+            sys.exit(0)
+        elif a in ('-d'):
+            dbname=o
+            continue
+        elif a in ('-x'):
+            xmlfile=o
+            continue
+    open_db(dbname)
+    load_xml(xmlfile)
+
+if __name__ == '__main__':
+    main(sys.argv[1:])
index 1162b76..8aebf31 100644 (file)
@@ -17,7 +17,7 @@ TMAKE_CFLAGS_SHLIB    = -fPIC
 TMAKE_CFLAGS_YACC      = -Wno-unused -Wno-parentheses
 
 TMAKE_CXX              = c++
-TMAKE_CXXFLAGS         = $$TMAKE_CFLAGS -D__FreeBSD__=6 -DYY_TYPEDEF_YY_SIZE_T -Dyy_size_t=int
+TMAKE_CXXFLAGS         = $$TMAKE_CFLAGS -DYY_TYPEDEF_YY_SIZE_T -Dyy_size_t=int
 TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
 TMAKE_CXXFLAGS_WARN_OFF        = $$TMAKE_CFLAGS_WARN_OFF
 TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
index 878e122..ddc024d 100644 (file)
@@ -17,7 +17,7 @@ TMAKE_CFLAGS_SHLIB    = -fPIC
 TMAKE_CFLAGS_YACC      = -Wno-unused -Wno-parentheses
 
 TMAKE_CXX              = c++
-TMAKE_CXXFLAGS         = $$TMAKE_CFLAGS -D__FreeBSD__=6 -mmacosx-version-min=10.5 -DYY_TYPEDEF_YY_SIZE_T -Dyy_size_t=int
+TMAKE_CXXFLAGS         = $$TMAKE_CFLAGS -mmacosx-version-min=10.5 -DYY_TYPEDEF_YY_SIZE_T -Dyy_size_t=int
 TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
 TMAKE_CXXFLAGS_WARN_OFF        = $$TMAKE_CFLAGS_WARN_OFF
 TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
index d2e3a40..9d7a4a8 100644 (file)
@@ -17,7 +17,7 @@ TMAKE_CFLAGS_SHLIB    = -fPIC
 TMAKE_CFLAGS_YACC      = -Wno-unused -Wno-parentheses
 
 TMAKE_CXX              = c++
-TMAKE_CXXFLAGS         = $$TMAKE_CFLAGS -D__FreeBSD__=6 -mmacosx-version-min=10.5 -DYY_TYPEDEF_YY_SIZE_T -Dyy_size_t=int
+TMAKE_CXXFLAGS         = $$TMAKE_CFLAGS -mmacosx-version-min=10.5 -DYY_TYPEDEF_YY_SIZE_T -Dyy_size_t=int
 TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
 TMAKE_CXXFLAGS_WARN_OFF        = $$TMAKE_CFLAGS_WARN_OFF
 TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
index 83fc890..33494a2 100644 (file)
        $project{"VER_MIN"} =~ s/^\d+\.//;
     }    
     if ( Config("staticlib") ) {
-       $project{"TARGET"} = $project{"DESTDIR"} . "lib" . $project{"TARGET"}
-    } else {
-       $project{"TARGET"} = $project{"DESTDIR"} . $project{"TARGET"}
+       $project{"TARGET"} = "lib" . $project{"TARGET"}
     }
 #$}
 #!
index ba8e762..4988d59 100644 (file)
        $project{"VER_MIN"} =~ s/^\d+\.//;
     }    
     if ( Config("staticlib") ) {
-       $project{"TARGET"} = $project{"DESTDIR"} . "lib" . $project{"TARGET"};
-    } else {
-       $project{"TARGET"} = $project{"DESTDIR"} . $project{"TARGET"};
+       $project{"TARGET"} = "lib" . $project{"TARGET"};
     }
 #$}
 #!
index 3b6baf5..040fc65 100644 (file)
@@ -7,8 +7,8 @@
                <CustomBuildRule
                        Name="Config"
                        DisplayName="Config"
-                       CommandLine="python $(ProjectDir)..\src\configgen.py -cpp [AllOptions] [AdditionalOptions] [inputs] &gt; $(InputDir)../src/$(InputName)options.cpp"
-                       Outputs="$(InputDir)../src/$(InputName)options.cpp"
+                       CommandLine="python $(ProjectDir)..\src\configgen.py -cpp [AllOptions] [AdditionalOptions] [inputs] &gt; $(IntDir)/$(InputName)options.cpp"
+                       Outputs="$(IntDir)/$(InputName)options.cpp"
                        FileExtensions="*.xml"
                        AdditionalDependencies="$(ProjectDir)..\src\configgen.py"
                        ExecutionDescription="Executing configgen for doxygen..."
@@ -18,8 +18,8 @@
                <CustomBuildRule
                        Name="Config_dw"
                        DisplayName="Config"
-                       CommandLine="python $(ProjectDir)..\src\configgen.py -wiz [AllOptions] [AdditionalOptions] [inputs]  &gt; $(InputDir)../addon/doxywizard/$(InputName)doc.cpp"
-                       Outputs="$(InputDir)../addon/doxywizard/$(InputName)doc.cpp"
+                       CommandLine="python $(ProjectDir)..\src\configgen.py -wiz [AllOptions] [AdditionalOptions] [inputs]  &gt; $(IntDir)/$(InputName)doc.cpp"
+                       Outputs="$(IntDir)/$(InputName)doc.cpp"
                        FileExtensions="*.xml"
                        AdditionalDependencies="$(ProjectDir)..\src\configgen.py"
                        ExecutionDescription="Executing configgen for doxywizard ..."
index fa8c577..98e1c36 100644 (file)
@@ -9,9 +9,6 @@ EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qtools", "qtools.vcproj", "{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doxywizard", "Doxywizard.vcproj", "{77C9C2D3-EA3F-3D59-8B4C-0ED852890172}"
-       ProjectSection(ProjectDependencies) = postProject
-               {309C9A4A-94D2-4837-9A11-45B0A6CF35C3} = {309C9A4A-94D2-4837-9A11-45B0A6CF35C3}
-       EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doxysearch", "doxysearch.vcproj", "{F3F3408F-F6F7-46C7-BF1E-1FA056E0AE20}"
 EndProject
index 760ad50..3b6ba8e 100644 (file)
@@ -23,6 +23,9 @@
                        RelativePath=".\Settings.rules"\r
                />\r
                <ToolFile\r
+                       RelativePath=".\Unistd.rules"\r
+               />\r
+               <ToolFile\r
                        RelativePath=".\Version.rules"\r
                />\r
                <ToolFile\r
@@ -39,7 +42,7 @@
                <Configuration\r
                        Name="Debug|Win32"\r
                        OutputDirectory="..\bin\Debug"\r
-                       IntermediateDirectory=".\Debug"\r
+                       IntermediateDirectory=".\Debug\doxygen"\r
                        ConfigurationType="1"\r
                        InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
                        UseOfMFC="0"\r
@@ -66,6 +69,9 @@
                                Name="Settings"\r
                        />\r
                        <Tool\r
+                               Name="Unistd"\r
+                       />\r
+                       <Tool\r
                                Name="Gen_head"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCMIDLTool"\r
-                               TypeLibraryName=".\Debug\Doxygen.tlb"\r
+                               TypeLibraryName=".\Debug\doxygen\Doxygen.tlb"\r
                                HeaderFileName=""\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                AdditionalOptions="/Zm200 "\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,."\r
+                               AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,$(IntDir),."\r
                                PreprocessorDefinitions="_CONSOLE;WIN32;_DEBUG; _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;LIBICONV_STATIC;CHARSET_STATIC"\r
                                MinimalRebuild="true"\r
                                BasicRuntimeChecks="3"\r
                                RuntimeLibrary="1"\r
-                               PrecompiledHeaderFile=".\Debug/Doxygen.pch"\r
-                               AssemblerListingLocation=".\Debug/"\r
-                               ObjectFile=".\Debug/"\r
-                               ProgramDataBaseFileName=".\Debug\$(TargetName).pdb"\r
+                               PrecompiledHeaderFile=".\Debug\doxygen/Doxygen.pch"\r
+                               AssemblerListingLocation=".\Debug\doxygen/"\r
+                               ObjectFile=".\Debug\doxygen/"\r
+                               ProgramDataBaseFileName=".\Debug\doxygen\$(TargetName).pdb"\r
                                WarningLevel="3"\r
                                SuppressStartupBanner="true"\r
                                DebugInformationFormat="3"\r
                                GenerateManifest="false"\r
                                IgnoreDefaultLibraryNames="libcmtd.lib"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile=".\Debug\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Debug\doxygen\$(TargetName).pdb"\r
                                SubSystem="1"\r
                                LargeAddressAware="2"\r
                                RandomizedBaseAddress="1"\r
                        <Tool\r
                                Name="VCBscMakeTool"\r
                                SuppressStartupBanner="true"\r
-                               OutputFile=".\Debug/Doxygen.bsc"\r
+                               OutputFile=".\Debug\doxygen/Doxygen.bsc"\r
                        />\r
                        <Tool\r
                                Name="VCFxCopTool"\r
                <Configuration\r
                        Name="Debug|x64"\r
                        OutputDirectory="..\bin\Debug64"\r
-                       IntermediateDirectory=".\Debug64"\r
+                       IntermediateDirectory=".\Debug64\doxygen"\r
                        ConfigurationType="1"\r
                        InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
                        UseOfMFC="0"\r
                                Name="Settings"\r
                        />\r
                        <Tool\r
+                               Name="Unistd"\r
+                       />\r
+                       <Tool\r
                                Name="Gen_head"\r
                        />\r
                        <Tool\r
                        <Tool\r
                                Name="VCMIDLTool"\r
                                TargetEnvironment="3"\r
-                               TypeLibraryName=".\Debug64\Doxygen.tlb"\r
+                               TypeLibraryName=".\Debug64\doxygen\Doxygen.tlb"\r
                                HeaderFileName=""\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                AdditionalOptions="/Zm200 /bigobj"\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,."\r
+                               AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,$(IntDir),."\r
                                PreprocessorDefinitions="_CONSOLE;WIN32;_DEBUG; _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;LIBICONV_STATIC;CHARSET_STATIC"\r
                                MinimalRebuild="true"\r
                                BasicRuntimeChecks="3"\r
                                RuntimeLibrary="1"\r
-                               PrecompiledHeaderFile=".\Debug64/Doxygen.pch"\r
-                               AssemblerListingLocation=".\Debug64/"\r
-                               ObjectFile=".\Debug64/"\r
-                               ProgramDataBaseFileName=".\Debug64\$(TargetName).pdb"\r
+                               PrecompiledHeaderFile=".\Debug64\doxygen/Doxygen.pch"\r
+                               AssemblerListingLocation=".\Debug64\doxygen/"\r
+                               ObjectFile=".\Debug64\doxygen/"\r
+                               ProgramDataBaseFileName=".\Debug64\doxygen\$(TargetName).pdb"\r
                                WarningLevel="3"\r
                                SuppressStartupBanner="true"\r
                                DebugInformationFormat="3"\r
                                AdditionalLibraryDirectories="Debug64"\r
                                GenerateManifest="false"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile=".\Debug64\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Debug64\doxygen\$(TargetName).pdb"\r
                                SubSystem="1"\r
                                LargeAddressAware="2"\r
                                RandomizedBaseAddress="1"\r
                        <Tool\r
                                Name="VCBscMakeTool"\r
                                SuppressStartupBanner="true"\r
-                               OutputFile=".\Debug64/Doxygen.bsc"\r
+                               OutputFile=".\Debug64\doxygen/Doxygen.bsc"\r
                        />\r
                        <Tool\r
                                Name="VCFxCopTool"\r
                <Configuration\r
                        Name="Release|Win32"\r
                        OutputDirectory="..\bin\Release"\r
-                       IntermediateDirectory=".\Release"\r
+                       IntermediateDirectory=".\Release\doxygen"\r
                        ConfigurationType="1"\r
                        InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
                        UseOfMFC="0"\r
                                Name="Settings"\r
                        />\r
                        <Tool\r
+                               Name="Unistd"\r
+                       />\r
+                       <Tool\r
                                Name="Gen_head"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCMIDLTool"\r
-                               TypeLibraryName=".\Release\Doxygen.tlb"\r
+                               TypeLibraryName=".\Release\doxygen\Doxygen.tlb"\r
                                HeaderFileName=""\r
                        />\r
                        <Tool\r
                                InlineFunctionExpansion="2"\r
                                OmitFramePointers="true"\r
                                WholeProgramOptimization="true"\r
-                               AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,."\r
+                               AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,$(IntDir),."\r
                                PreprocessorDefinitions="WIN32;_CINDEX_LIB_;_CINDEX_LIB_;NDEBUG;_CONSOLE; _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;LIBICONV_STATIC;CHARSET_STATIC"\r
                                StringPooling="true"\r
                                RuntimeLibrary="0"\r
                                EnableFunctionLevelLinking="true"\r
-                               PrecompiledHeaderFile=".\Release/Doxygen.pch"\r
-                               AssemblerListingLocation=".\Release/"\r
-                               ObjectFile=".\Release/"\r
-                               ProgramDataBaseFileName=".\Release\$(TargetName).pdb"\r
+                               PrecompiledHeaderFile=".\Release\doxygen/Doxygen.pch"\r
+                               AssemblerListingLocation=".\Release\doxygen/"\r
+                               ObjectFile=".\Release\doxygen/"\r
+                               ProgramDataBaseFileName=".\Release\doxygen\$(TargetName).pdb"\r
                                WarningLevel="3"\r
                                SuppressStartupBanner="true"\r
                                DebugInformationFormat="3"\r
                                LinkIncremental="1"\r
                                SuppressStartupBanner="true"\r
                                AdditionalLibraryDirectories="Release"\r
-                               ProgramDatabaseFile=".\Release\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Release\doxygen\$(TargetName).pdb"\r
                                SubSystem="1"\r
                                LargeAddressAware="2"\r
                                RandomizedBaseAddress="1"\r
                        <Tool\r
                                Name="VCBscMakeTool"\r
                                SuppressStartupBanner="true"\r
-                               OutputFile=".\Release/Doxygen.bsc"\r
+                               OutputFile=".\Release\doxygen/Doxygen.bsc"\r
                        />\r
                        <Tool\r
                                Name="VCFxCopTool"\r
                <Configuration\r
                        Name="Release|x64"\r
                        OutputDirectory="..\bin\Release64"\r
-                       IntermediateDirectory=".\Release64"\r
+                       IntermediateDirectory=".\Release64\doxygen"\r
                        ConfigurationType="1"\r
                        InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
                        UseOfMFC="0"\r
                                Name="Settings"\r
                        />\r
                        <Tool\r
+                               Name="Unistd"\r
+                       />\r
+                       <Tool\r
                                Name="Gen_head"\r
                        />\r
                        <Tool\r
                        <Tool\r
                                Name="VCMIDLTool"\r
                                TargetEnvironment="3"\r
-                               TypeLibraryName=".\Release64\Doxygen.tlb"\r
+                               TypeLibraryName=".\Release64\doxygen\Doxygen.tlb"\r
                                HeaderFileName=""\r
                        />\r
                        <Tool\r
                                InlineFunctionExpansion="2"\r
                                OmitFramePointers="true"\r
                                WholeProgramOptimization="true"\r
-                               AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,."\r
+                               AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,$(IntDir),."\r
                                PreprocessorDefinitions="WIN32;_CINDEX_LIB_;_CINDEX_LIB_;NDEBUG;_CONSOLE; _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;LIBICONV_STATIC;CHARSET_STATIC"\r
                                StringPooling="true"\r
                                RuntimeLibrary="0"\r
                                EnableFunctionLevelLinking="true"\r
-                               PrecompiledHeaderFile=".\Release64/Doxygen.pch"\r
-                               AssemblerListingLocation=".\Release64/"\r
-                               ObjectFile=".\Release64/"\r
-                               ProgramDataBaseFileName=".\Release64\$(TargetName).pdb"\r
+                               PrecompiledHeaderFile=".\Release64\doxygen/Doxygen.pch"\r
+                               AssemblerListingLocation=".\Release64\doxygen/"\r
+                               ObjectFile=".\Release64\doxygen/"\r
+                               ProgramDataBaseFileName=".\Release64\doxygen\$(TargetName).pdb"\r
                                WarningLevel="3"\r
                                SuppressStartupBanner="true"\r
                                DebugInformationFormat="3"\r
                                LinkIncremental="1"\r
                                SuppressStartupBanner="true"\r
                                AdditionalLibraryDirectories="Release64"\r
-                               ProgramDatabaseFile=".\Release64\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Release64\doxygen\$(TargetName).pdb"\r
                                SubSystem="1"\r
                                LargeAddressAware="2"\r
                                RandomizedBaseAddress="1"\r
                        <Tool\r
                                Name="VCBscMakeTool"\r
                                SuppressStartupBanner="true"\r
-                               OutputFile=".\Release64/Doxygen.bsc"\r
+                               OutputFile=".\Release64\doxygen/Doxygen.bsc"\r
                        />\r
                        <Tool\r
                                Name="VCFxCopTool"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\ce_parse.cpp"\r
+                               RelativePath="$(IntDir)\ce_parse.cpp"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\code.cpp"\r
+                               RelativePath="$(IntDir)\code.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\commentcnv.cpp"\r
+                               RelativePath="$(IntDir)\commentcnv.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\commentscan.cpp"\r
+                               RelativePath="$(IntDir)\commentscan.cpp"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\config.cpp"\r
+                               RelativePath="$(IntDir)\config.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\configoptions.cpp"\r
+                               RelativePath="$(IntDir)\configoptions.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\constexp.cpp"\r
+                               RelativePath="$(IntDir)\constexp.cpp"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\declinfo.cpp"\r
+                               RelativePath="$(IntDir)\declinfo.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\defargs.cpp"\r
+                               RelativePath="$(IntDir)\defargs.cpp"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\doctokenizer.cpp"\r
+                               RelativePath="$(IntDir)\doctokenizer.cpp"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\fortrancode.cpp"\r
+                               RelativePath="$(IntDir)\fortrancode.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\fortranscanner.cpp"\r
+                               RelativePath="$(IntDir)\fortranscanner.cpp"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\src\htmlentity.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\src\htmlgen.cpp"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\pre.cpp"\r
+                               RelativePath="$(IntDir)\pre.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\pycode.cpp"\r
+                               RelativePath="$(IntDir)\pycode.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\pyscanner.cpp"\r
+                               RelativePath="$(IntDir)\pyscanner.cpp"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\scanner.cpp"\r
+                               RelativePath="$(IntDir)\scanner.cpp"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\tclscanner.cpp"\r
+                               RelativePath="$(IntDir)\tclscanner.cpp"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\version.cpp"\r
+                               RelativePath="$(IntDir)\version.cpp"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\vhdlparser.cpp"\r
+                               RelativePath="$(IntDir)\vhdlparser.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\vhdlparser.hpp"\r
+                               RelativePath="$(IntDir)\vhdlparser.h"\r
                                >\r
                        </File>\r
                        <File\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="Running bison on constexp.y"\r
-                                               CommandLine="bison -l -d -p ce_parseexpYY $(InputPath) -o $(InputDir)\..\src\ce_parse.c&#x0D;&#x0A;bison -l -p constexpYY $(InputPath) -o $(InputDir)..\src\ce_parse.cpp&#x0D;&#x0A;del $(InputDir)..\src\ce_parse.c&#x0D;&#x0A;"\r
-                                               Outputs="$(InputDir)\..\src\ce_parse.cpp"\r
+                                               CommandLine="bison -l -d -p ce_parseexpYY $(InputPath) -o $(IntDir)\ce_parse.c&#x0D;&#x0A;bison -l -p constexpYY $(InputPath) -o $(IntDir)\ce_parse.cpp&#x0D;&#x0A;del $(IntDir)\ce_parse.c&#x0D;&#x0A;"\r
+                                               Outputs="$(IntDir)\ce_parse.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="Running bison on constexp.y"\r
-                                               CommandLine="bison -l -d -p ce_parseexpYY $(InputPath) -o $(InputDir)\..\src\ce_parse.c&#x0D;&#x0A;bison -l -p constexpYY $(InputPath) -o $(InputDir)..\src\ce_parse.cpp&#x0D;&#x0A;del $(InputDir)..\src\ce_parse.c&#x0D;&#x0A;"\r
-                                               Outputs="$(InputDir)\..\src\ce_parse.cpp"\r
+                                               CommandLine="bison -l -d -p ce_parseexpYY $(InputPath) -o $(IntDir)\ce_parse.c&#x0D;&#x0A;bison -l -p constexpYY $(InputPath) -o $(IntDir)\ce_parse.cpp&#x0D;&#x0A;del $(IntDir)\ce_parse.c&#x0D;&#x0A;"\r
+                                               Outputs="$(IntDir)\ce_parse.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="Running bison on constexp.y"\r
-                                               CommandLine="bison -l -d -p ce_parseexpYY $(InputPath) -o $(InputDir)\..\src\ce_parse.c&#x0D;&#x0A;bison -l -p constexpYY $(InputPath) -o $(InputDir)..\src\ce_parse.cpp&#x0D;&#x0A;del $(InputDir)..\src\ce_parse.c&#x0D;&#x0A;"\r
-                                               Outputs="$(InputDir)\..\src\ce_parse.cpp"\r
+                                               CommandLine="bison -l -d -p ce_parseexpYY $(InputPath) -o $(IntDir)\ce_parse.c&#x0D;&#x0A;bison -l -p constexpYY $(InputPath) -o $(IntDir)\ce_parse.cpp&#x0D;&#x0A;del $(IntDir)\ce_parse.c&#x0D;&#x0A;"\r
+                                               Outputs="$(IntDir)\ce_parse.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="Running bison on constexp.y"\r
-                                               CommandLine="bison -l -d -p ce_parseexpYY $(InputPath) -o $(InputDir)\..\src\ce_parse.c&#x0D;&#x0A;bison -l -p constexpYY $(InputPath) -o $(InputDir)..\src\ce_parse.cpp&#x0D;&#x0A;del $(InputDir)..\src\ce_parse.c&#x0D;&#x0A;"\r
-                                               Outputs="$(InputDir)\..\src\ce_parse.cpp"\r
+                                               CommandLine="bison -l -d -p ce_parseexpYY $(InputPath) -o $(IntDir)\ce_parse.c&#x0D;&#x0A;bison -l -p constexpYY $(InputPath) -o $(IntDir)\ce_parse.cpp&#x0D;&#x0A;del $(IntDir)\ce_parse.c&#x0D;&#x0A;"\r
+                                               Outputs="$(IntDir)\ce_parse.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                        </File>\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="Running bison on vhdlparser.y"\r
-                                               CommandLine="bison -l -d -p vhdlscannerYY $(InputPath) -o $(InputDir)\..\src\vhdlparser.c&#x0D;&#x0A;bison -l -p vhdlscannerYY $(InputPath) -o $(InputDir)\..\src\vhdlparser.cpp&#x0D;&#x0A;del $(InputDir)\..\src\vhdlparser.c&#x0D;&#x0A;"\r
-                                               Outputs="$(InputDir)$(InputName).cpp"\r
+                                               CommandLine="bison -l -d -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.c&#x0D;&#x0A;bison -l -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.cpp&#x0D;&#x0A;del $(IntDir)\vhdlparser.c&#x0D;&#x0A;"\r
+                                               Outputs="$(IntDir)\vhdlparser.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="Running bison on vhdlparser.y"\r
-                                               CommandLine="bison -l -d -p vhdlscannerYY $(InputPath) -o $(InputDir)\..\src\vhdlparser.c&#x0D;&#x0A;bison -l -p vhdlscannerYY $(InputPath) -o $(InputDir)\..\src\vhdlparser.cpp&#x0D;&#x0A;del $(InputDir)\..\src\vhdlparser.c&#x0D;&#x0A;"\r
-                                               Outputs="$(InputDir)$(InputName).cpp"\r
+                                               CommandLine="bison -l -d -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.c&#x0D;&#x0A;bison -l -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.cpp&#x0D;&#x0A;del $(IntDir)\vhdlparser.c&#x0D;&#x0A;"\r
+                                               Outputs="$(IntDir)\vhdlparser.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="Running bison on vhdlparser.y"\r
-                                               CommandLine="bison -l -d -p vhdlscannerYY $(InputPath) -o $(InputDir)\..\src\vhdlparser.c&#x0D;&#x0A;bison -l -p vhdlscannerYY $(InputPath) -o $(InputDir)\..\src\vhdlparser.cpp&#x0D;&#x0A;del $(InputDir)\..\src\vhdlparser.c&#x0D;&#x0A;"\r
-                                               Outputs="$(InputDir)$(InputName).cpp"\r
+                                               CommandLine="bison -l -d -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.c&#x0D;&#x0A;bison -l -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.cpp&#x0D;&#x0A;del $(IntDir)\vhdlparser.c&#x0D;&#x0A;"\r
+                                               Outputs="$(IntDir)\vhdlparser.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="Running bison on vhdlparser.y"\r
-                                               CommandLine="bison -l -d -p vhdlscannerYY $(InputPath) -o $(InputDir)\..\src\vhdlparser.c&#x0D;&#x0A;bison -l -p vhdlscannerYY $(InputPath) -o $(InputDir)\..\src\vhdlparser.cpp&#x0D;&#x0A;del $(InputDir)\..\src\vhdlparser.c&#x0D;&#x0A;"\r
-                                               Outputs="$(InputDir)$(InputName).cpp"\r
+                                               CommandLine="bison -l -d -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.c&#x0D;&#x0A;bison -l -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.cpp&#x0D;&#x0A;del $(IntDir)\vhdlparser.c&#x0D;&#x0A;"\r
+                                               Outputs="$(IntDir)\vhdlparser.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                        </File>\r
                                </FileConfiguration>
                        </File>\r
                        <File\r
+                               RelativePath="unistd.py"\r
+                               >\r
+                               <FileConfiguration
+                                       Name="Debug|win32"
+                                       >
+                                       <Tool
+                                               Name="Unistd"
+                                       />
+                               </FileConfiguration>
+                               <FileConfiguration
+                                       Name="Release|win32"
+                                       >
+                                       <Tool
+                                               Name="Unistd"
+                                       />
+                               </FileConfiguration>
+                               <FileConfiguration
+                                       Name="Debug|x64"
+                                       >
+                                       <Tool
+                                               Name="Unistd"
+                                       />
+                               </FileConfiguration>
+                               <FileConfiguration
+                                       Name="Release|x64"
+                                       >
+                                       <Tool
+                                               Name="Unistd"
+                                       />
+                               </FileConfiguration>
+                       </File>\r
+                       <File\r
                                RelativePath="..\src\version.py"\r
                                >\r
                                <FileConfiguration
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\bib2xhtml.pl.h"\r
+                               RelativePath="$(IntDir)\bib2xhtml.pl.h"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\compound_xsd.h"\r
+                               RelativePath="$(IntDir)\compound_xsd.h"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\doxygen_bst.h"\r
+                               RelativePath="$(IntDir)\doxygen_bst.h"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\doxygen_css.h"\r
+                               RelativePath="$(IntDir)\doxygen_css.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="$(IntDir)\doxygen_sty.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="$(IntDir)\dynsections_js.h"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="$(IntDir)\extsearch_js.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\src\filedef.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="$(IntDir)\footer_html.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\src\formula.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="$(IntDir)\header_html.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\src\htags.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\src\htmlentity.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\src\htmlgen.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\index_xsd.h"\r
+                               RelativePath="$(INtDir)\index_xsd.h"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\lang_cfg.h"\r
+                               RelativePath="$(IntDir)\jquery_fx_js.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="$(IntDir)\jquery_p1_js.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="$(IntDir)\jquery_p2_js.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="$(IntDir)\jquery_p3_js.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="$(IntDir)\jquery_pt_js.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="$(IntDir)\jquery_ui_js.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="$(IntDir)\lang_cfg.h"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="$(IntDir)\layout_default_xml.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\src\lockingptr.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\navtree_js.h"\r
+                               RelativePath="$(IntDir)\navtree_js.h"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="$(IntDir)\resize_js.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\src\rtfdocvisitor.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\search_css.h"\r
+                               RelativePath="$(IntDir)\search_css.h"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\search_js.h"\r
+                               RelativePath="$(IntDir)\search_js.h"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\search_php.h"\r
+                               RelativePath="$(IntDir)\search_functionsjs.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="$(IntDir)\search_opensearch_js.h"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\settings.h"\r
+                               RelativePath="$(IntDir)\settings.h"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="$(IntDir)\svgpan_js.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\src\store.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\winbuild\unistd.h"\r
+                               RelativePath="$(IntDir)\unistd.h"\r
                                >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCustomBuildTool"\r
-                                               CommandLine="echo /* this is a dummy file, that is needed for compiling files that are &gt; $(InputPath)&#x0D;&#x0A;echo  * generated with flex under Windows 95/NT. &gt;&gt; $(InputPath)&#x0D;&#x0A;echo  */ &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #if defined(_MSC_VER) &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #include ^&lt;io.h^&gt; &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #endif &gt;&gt; $(InputPath)&#x0D;&#x0A;"\r
-                                               AdditionalDependencies="..\src\constexp.cpp;..\src\code.cpp;..\src\commentcnv.cpp;..\src\config.cpp;..\src\declinfo.cpp;..\src\defargs.cpp;..\src\doctokenizer.cpp;..\src\formula.cpp;..\src\pre.cpp;..\src\scanner.cpp;..\src\util.cpp;"\r
-                                               Outputs="$(InputPath)"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCustomBuildTool"\r
-                                               CommandLine="echo /* this is a dummy file, that is needed for compiling files that are &gt; $(InputPath)&#x0D;&#x0A;echo  * generated with flex under Windows 95/NT. &gt;&gt; $(InputPath)&#x0D;&#x0A;echo  */ &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #if defined(_MSC_VER) &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #include ^&lt;io.h^&gt; &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #endif &gt;&gt; $(InputPath)&#x0D;&#x0A;"\r
-                                               AdditionalDependencies="..\src\constexp.cpp;..\src\code.cpp;..\src\commentcnv.cpp;..\src\config.cpp;..\src\declinfo.cpp;..\src\defargs.cpp;..\src\doctokenizer.cpp;..\src\formula.cpp;..\src\pre.cpp;..\src\scanner.cpp;..\src\util.cpp;"\r
-                                               Outputs="$(InputPath)"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCustomBuildTool"\r
-                                               CommandLine="echo /* this is a dummy file, that is needed for compiling files that are &gt; $(InputPath)&#x0D;&#x0A;echo  * generated with flex under Windows 95/NT. &gt;&gt; $(InputPath)&#x0D;&#x0A;echo  */ &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #if defined(_MSC_VER) &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #include ^&lt;io.h^&gt; &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #endif &gt;&gt; $(InputPath)&#x0D;&#x0A;"\r
-                                               AdditionalDependencies="..\src\constexp.cpp;..\src\code.cpp;..\src\commentcnv.cpp;..\src\config.cpp;..\src\declinfo.cpp;..\src\defargs.cpp;..\src\doctokenizer.cpp;..\src\formula.cpp;..\src\pre.cpp;..\src\scanner.cpp;..\src\util.cpp;"\r
-                                               Outputs="$(InputPath)"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCustomBuildTool"\r
-                                               CommandLine="echo /* this is a dummy file, that is needed for compiling files that are &gt; $(InputPath)&#x0D;&#x0A;echo  * generated with flex under Windows 95/NT. &gt;&gt; $(InputPath)&#x0D;&#x0A;echo  */ &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #if defined(_MSC_VER) &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #include ^&lt;io.h^&gt; &gt;&gt; $(InputPath)&#x0D;&#x0A;echo #endif &gt;&gt; $(InputPath)&#x0D;&#x0A;"\r
-                                               AdditionalDependencies="..\src\constexp.cpp;..\src\code.cpp;..\src\commentcnv.cpp;..\src\config.cpp;..\src\declinfo.cpp;..\src\defargs.cpp;..\src\doctokenizer.cpp;..\src\formula.cpp;..\src\pre.cpp;..\src\scanner.cpp;..\src\util.cpp;"\r
-                                               Outputs="$(InputPath)"\r
-                                       />\r
-                               </FileConfiguration>\r
                        </File>\r
                        <File\r
                                RelativePath="..\src\util.h"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\vhdlcode.cpp"\r
+                               RelativePath="$(IntDir)\vhdlcode.cpp"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\vhdlscanner.cpp"\r
+                               RelativePath="$(IntDir)\vhdlscanner.cpp"\r
                                >\r
                        </File>\r
                        <File\r
index 939a167..c424dc6 100755 (executable)
@@ -23,6 +23,9 @@
                        RelativePath=".\Settings.rules"\r
                />\r
                <ToolFile\r
+                       RelativePath=".\Unistd.rules"\r
+               />\r
+               <ToolFile\r
                        RelativePath=".\Config.rules"\r
                />\r
        </ToolFiles>\r
@@ -30,7 +33,7 @@
                <Configuration\r
                        Name="Debug|Win32"\r
                        OutputDirectory="..\bin\Debug"\r
-                       IntermediateDirectory=".\Debug"\r
+                       IntermediateDirectory=".\Debug\doxywizard"\r
                        ConfigurationType="1"\r
                        UseOfMFC="0"\r
                        ATLMinimizesCRunTimeLibraryUsage="false"\r
@@ -58,6 +61,9 @@
                                Name="Settings"\r
                        />\r
                        <Tool\r
+                               Name="Unistd"\r
+                       />\r
+                       <Tool\r
                                Name="VCXMLDataGeneratorTool"\r
                        />\r
                        <Tool\r
@@ -73,7 +79,7 @@
                                Name="VCCLCompilerTool"\r
                                AdditionalOptions="-Zm200 -w34100 -w34189 -Zm200 -w34100 -w34189 -w34100 -w34189"\r
                                Optimization="4"\r
-                               AdditionalIncludeDirectories="&quot;$(QT_DIR)\include\QtCore&quot;,&quot;$(QT_DIR)\include\QtCore&quot;,&quot;$(QT_DIR)\include\QtGui&quot;,&quot;$(QT_DIR)\include\QtGui&quot;,&quot;$(QT_DIR)\include\QtXml&quot;,&quot;$(QT_DIR)\include\QtXml&quot;,&quot;$(QT_DIR)\include&quot;,&quot;..\addon\doxywizard&quot;,&quot;$(QT_DIR)\include\ActiveQt&quot;,&quot;moc&quot;,&quot;..\addon\doxywizard&quot;,&quot;.&quot;,$(QT_DIR)\mkspecs\win32-msvc2008"\r
+                               AdditionalIncludeDirectories="$(IntDir);&quot;$(QT_DIR)\include\QtCore&quot;,&quot;$(QT_DIR)\include\QtCore&quot;,&quot;$(QT_DIR)\include\QtGui&quot;,&quot;$(QT_DIR)\include\QtGui&quot;,&quot;$(QT_DIR)\include\QtXml&quot;,&quot;$(QT_DIR)\include\QtXml&quot;,&quot;$(QT_DIR)\include&quot;,&quot;..\addon\doxywizard&quot;,&quot;$(QT_DIR)\include\ActiveQt&quot;,&quot;moc&quot;,&quot;..\addon\doxywizard&quot;,&quot;.&quot;,$(QT_DIR)\mkspecs\win32-msvc2008"\r
                                PreprocessorDefinitions="_WINDOWS,UNICODE,WIN32,QT_LARGEFILE_SUPPORT,QT_NO_CAST_FROM_ASCII,QT_NO_CAST_TO_ASCII,QT_XML_LIB,QT_GUI_LIB,QT_CORE_LIB,QT_THREAD_SUPPORT"\r
                                GeneratePreprocessedFile="0"\r
                                ExceptionHandling="1"\r
@@ -81,9 +87,9 @@
                                BufferSecurityCheck="false"\r
                                TreatWChar_tAsBuiltInType="false"\r
                                RuntimeTypeInfo="true"\r
-                               AssemblerListingLocation="Debug\"\r
-                               ObjectFile="Debug\"\r
-                               ProgramDataBaseFileName=".\Debug\$(TargetName).pdb"\r
+                               AssemblerListingLocation="Debug\doxywizard\"\r
+                               ObjectFile="Debug\doxywizard\"\r
+                               ProgramDataBaseFileName=".\Debug\doxywizard\$(TargetName).pdb"\r
                                WarningLevel="3"\r
                                SuppressStartupBanner="true"\r
                                DebugInformationFormat="3"\r
                                AdditionalLibraryDirectories="$(QT_DIR)\lib"\r
                                IgnoreDefaultLibraryNames=""\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile=".\Debug\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Debug\doxywizard\$(TargetName).pdb"\r
                                SubSystem="2"\r
                                LargeAddressAware="2"\r
                                LinkTimeCodeGeneration="0"\r
                <Configuration\r
                        Name="Release|Win32"\r
                        OutputDirectory="..\bin\Release"\r
-                       IntermediateDirectory=".\Release"\r
+                       IntermediateDirectory=".\Release\doxywizard"\r
                        ConfigurationType="1"\r
                        UseOfMFC="0"\r
                        ATLMinimizesCRunTimeLibraryUsage="false"\r
                                Name="Settings"\r
                        />\r
                        <Tool\r
+                               Name="Unistd"\r
+                       />\r
+                       <Tool\r
                                Name="VCXMLDataGeneratorTool"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                AdditionalOptions="-Zm200 -w34100 -w34189 -Zm200 -w34100 -w34189 -w34100 -w34189"\r
                                Optimization="2"\r
-                               AdditionalIncludeDirectories="&quot;$(QT_DIR)\include\QtCore&quot;,&quot;$(QT_DIR)\include\QtCore&quot;,&quot;$(QT_DIR)\include\QtGui&quot;,&quot;$(QT_DIR)\include\QtGui&quot;,&quot;$(QT_DIR)\include\QtXml&quot;,&quot;$(QT_DIR)\include\QtXml&quot;,&quot;$(QT_DIR)\include&quot;,&quot;..\addon\doxywizard&quot;,&quot;$(QT_DIR)\include\ActiveQt&quot;,&quot;moc&quot;,&quot;..\addon\doxywizard&quot;,&quot;.&quot;,$(QT_DIR)\mkspecs\win32-msvc2008"\r
+                               AdditionalIncludeDirectories="$(IntDir);&quot;$(QT_DIR)\include\QtCore&quot;,&quot;$(QT_DIR)\include\QtCore&quot;,&quot;$(QT_DIR)\include\QtGui&quot;,&quot;$(QT_DIR)\include\QtGui&quot;,&quot;$(QT_DIR)\include\QtXml&quot;,&quot;$(QT_DIR)\include\QtXml&quot;,&quot;$(QT_DIR)\include&quot;,&quot;..\addon\doxywizard&quot;,&quot;$(QT_DIR)\include\ActiveQt&quot;,&quot;moc&quot;,&quot;..\addon\doxywizard&quot;,&quot;.&quot;,$(QT_DIR)\mkspecs\win32-msvc2008"\r
                                PreprocessorDefinitions="QT_NO_DEBUG,NDEBUG,_WINDOWS,UNICODE,WIN32,QT_LARGEFILE_SUPPORT,QT_NO_CAST_FROM_ASCII,QT_NO_CAST_TO_ASCII,QT_NO_DEBUG,QT_XML_LIB,QT_GUI_LIB,QT_CORE_LIB,QT_THREAD_SUPPORT,NDEBUG"\r
                                GeneratePreprocessedFile="0"\r
                                ExceptionHandling="1"\r
                                BufferSecurityCheck="false"\r
                                TreatWChar_tAsBuiltInType="false"\r
                                RuntimeTypeInfo="true"\r
-                               AssemblerListingLocation="Release\"\r
-                               ObjectFile="Release\"\r
-                               ProgramDataBaseFileName=".\Release\$(TargetName).pdb"\r
+                               AssemblerListingLocation="Release\doxywizard\"\r
+                               ObjectFile="Release\doxywizard\"\r
+                               ProgramDataBaseFileName=".\Release\doxywizard\$(TargetName).pdb"\r
                                WarningLevel="3"\r
                                SuppressStartupBanner="true"\r
                                DebugInformationFormat="0"\r
                                IgnoreAllDefaultLibraries="false"\r
                                IgnoreDefaultLibraryNames=""\r
                                GenerateDebugInformation="false"\r
-                               ProgramDatabaseFile=".\Release\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Release\doxywizard\$(TargetName).pdb"\r
                                SubSystem="2"\r
                                LargeAddressAware="2"\r
                                LinkTimeCodeGeneration="0"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\src\version.cpp"\r
+                               RelativePath="$(IntDir)\version.cpp"\r
                                >\r
                        </File>\r
                        <File\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\doxywizard.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\doxywizard.h -o moc\moc_doxywizard.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\doxywizard.h -o $(IntDir)\moc\moc_doxywizard.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\doxywizard.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_doxywizard.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_doxywizard.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\doxywizard.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\doxywizard.h -o moc\moc_doxywizard.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\doxywizard.h -o $(IntDir)\moc\moc_doxywizard.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\doxywizard.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_doxywizard.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_doxywizard.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                        </File>\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\expert.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\expert.h -o moc\moc_expert.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\expert.h -o $(IntDir)\moc\moc_expert.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\expert.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_expert.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_expert.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\expert.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\expert.h -o moc\moc_expert.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\expert.h -o $(IntDir)\moc\moc_expert.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\expert.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_expert.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_expert.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                        </File>\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\helplabel.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\helplabel.h -o moc\moc_helplabel.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\helplabel.h -o $(IntDir)\moc\moc_helplabel.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\helplabel.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_helplabel.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_helplabel.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\helplabel.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\helplabel.h -o moc\moc_helplabel.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\helplabel.h -o $(IntDir)\moc\moc_helplabel.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\helplabel.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_helplabel.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_helplabel.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                        </File>\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\inputbool.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputbool.h -o moc\moc_inputbool.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputbool.h -o $(IntDir)\moc\moc_inputbool.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\inputbool.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_inputbool.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_inputbool.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\inputbool.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputbool.h -o moc\moc_inputbool.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputbool.h -o $(IntDir)\moc\moc_inputbool.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\inputbool.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_inputbool.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_inputbool.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                        </File>\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\inputint.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputint.h -o moc\moc_inputint.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputint.h -o $(IntDir)\moc\moc_inputint.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\inputint.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_inputint.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_inputint.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\inputint.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputint.h -o moc\moc_inputint.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputint.h -o $(IntDir)\moc\moc_inputint.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\inputint.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_inputint.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_inputint.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                        </File>\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\inputstring.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputstring.h -o moc\moc_inputstring.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputstring.h -o $(IntDir)\moc\moc_inputstring.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\inputstring.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_inputstring.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_inputstring.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\inputstring.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputstring.h -o moc\moc_inputstring.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputstring.h -o $(IntDir)\moc\moc_inputstring.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\inputstring.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_inputstring.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_inputstring.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                        </File>\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\inputstrlist.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputstrlist.h -o moc\moc_inputstrlist.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputstrlist.h -o $(IntDir)\moc\moc_inputstrlist.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\inputstrlist.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_inputstrlist.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_inputstrlist.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\inputstrlist.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputstrlist.h -o moc\moc_inputstrlist.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\inputstrlist.h -o $(IntDir)\moc\moc_inputstrlist.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\inputstrlist.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_inputstrlist.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_inputstrlist.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                        </File>\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\wizard.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\wizard.h -o moc\moc_wizard.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\wizard.h -o $(IntDir)\moc\moc_wizard.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\wizard.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_wizard.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_wizard.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="MOC ..\addon\doxywizard\wizard.h"\r
-                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\wizard.h -o moc\moc_wizard.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\moc.exe  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtCore&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtGui&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include\QtXml&quot; -I&quot;$(QT_DIR)\include&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;$(QT_DIR)\include\ActiveQt&quot; -I&quot;moc&quot; -I&quot;..\addon\doxywizard&quot; -I&quot;.&quot; -I$(QT_DIR)\mkspecs\win32-msvc2008 -D_MSC_VER=1400 -DWIN32 ..\addon\doxywizard\wizard.h -o $(IntDir)\moc\moc_wizard.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\wizard.h;$(QT_DIR)\bin\moc.exe"\r
-                                               Outputs="moc\moc_wizard.cpp"\r
+                                               Outputs="$(IntDir)\moc\moc_wizard.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                        </File>\r
                        UniqueIdentifier="{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}"\r
                        >\r
                        <File\r
-                               RelativePath="..\addon\doxywizard\config_doxyw.cpp"\r
+                               RelativePath="$(IntDir)\config_doxyw.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\addon\doxywizard\configdoc.cpp"\r
+                               RelativePath="$(IntDir)\configdoc.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="moc\moc_doxywizard.cpp"\r
+                               RelativePath="$(IntDir)\moc\moc_doxywizard.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="moc\moc_expert.cpp"\r
+                               RelativePath="$(IntDir)\moc\moc_expert.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="moc\moc_helplabel.cpp"\r
+                               RelativePath="$(IntDir)\moc\moc_helplabel.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="moc\moc_inputbool.cpp"\r
+                               RelativePath="$(IntDir)\moc\moc_inputbool.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="moc\moc_inputint.cpp"\r
+                               RelativePath="$(IntDir)\moc\moc_inputint.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="moc\moc_inputstring.cpp"\r
+                               RelativePath="$(IntDir)\moc\moc_inputstring.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="moc\moc_inputstrlist.cpp"\r
+                               RelativePath="$(IntDir)\moc\moc_inputstrlist.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="moc\moc_wizard.cpp"\r
+                               RelativePath="$(IntDir)\moc\moc_wizard.cpp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="rcc\qrc_doxywizard.cpp"\r
+                               RelativePath="$(IntDir)\rcc\qrc_doxywizard.cpp"\r
                                >\r
                        </File>\r
                </Filter>\r
                                </FileConfiguration>\r
                        </File>\r
                        <File\r
+                               RelativePath="unistd.py"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Debug|win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="Unistd"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="Unistd"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r\r
+                       <File\r
                                RelativePath="..\src\version.py"\r
                                >\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="RCC ..\addon\doxywizard\doxywizard.qrc"\r
-                                               CommandLine="$(QT_DIR)\bin\rcc.exe -name doxywizard ..\addon\doxywizard\doxywizard.qrc -o rcc\qrc_doxywizard.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\rcc.exe -name doxywizard ..\addon\doxywizard\doxywizard.qrc -o $(IntDir)\rcc\qrc_doxywizard.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\doxywizard.qrc;$(QT_DIR)\bin\rcc.exe"\r
-                                               Outputs="rcc\qrc_doxywizard.cpp"\r
+                                               Outputs="$(IntDir)\rcc\qrc_doxywizard.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                                <FileConfiguration\r
                                        <Tool\r
                                                Name="VCCustomBuildTool"\r
                                                Description="RCC ..\addon\doxywizard\doxywizard.qrc"\r
-                                               CommandLine="$(QT_DIR)\bin\rcc.exe -name doxywizard ..\addon\doxywizard\doxywizard.qrc -o rcc\qrc_doxywizard.cpp&#x0D;&#x0A;"\r
+                                               CommandLine="$(QT_DIR)\bin\rcc.exe -name doxywizard ..\addon\doxywizard\doxywizard.qrc -o $(IntDir)\rcc\qrc_doxywizard.cpp&#x0D;&#x0A;"\r
                                                AdditionalDependencies="..\addon\doxywizard\doxywizard.qrc;$(QT_DIR)\bin\rcc.exe"\r
-                                               Outputs="rcc\qrc_doxywizard.cpp"\r
+                                               Outputs="$(IntDir)\rcc\qrc_doxywizard.cpp"\r
                                        />\r
                                </FileConfiguration>\r
                        </File>\r
index 5b0b2b7..9f1e13d 100644 (file)
@@ -7,8 +7,8 @@
                <CustomBuildRule
                        Name="Gen_head"
                        DisplayName="Gen_head"
-                       CommandLine="python $(ProjectDir)..\src\to_c_cmd.py [AllOptions] [AdditionalOptions] [inputs] &lt; $(InputPath) &gt; $(InputPath).h"
-                       Outputs="$(InputPath).h"
+                       CommandLine="python $(ProjectDir)..\src\to_c_cmd.py [AllOptions] [AdditionalOptions] [inputs] &lt; $(InputPath) &gt; $(IntDir)/$(InputName)$(InputExt).h"
+                       Outputs="$(IntDir)/$(InputName)$(InputExt).h"
                        FileExtensions=".*"
                        AdditionalDependencies="$(ProjectDir)..\src\to_c_cmd.py"
                        ExecutionDescription="Executing to_c_cmd on $(InputPath) ..."
index ffa8cf5..0d57a05 100755 (executable)
@@ -7,8 +7,8 @@
                 <CustomBuildRule
                         Name="Languages"
                         DisplayName="Settings"
-                        CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] &gt; $(InputDir)../src/$(InputName).h"
-                        Outputs="$(InputDir)../src/$(InputName).h"
+                        CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] &gt; $(IntDir)/$(InputName).h"
+                        Outputs="$(IntDir)/$(InputName).h"
                         FileExtensions="*.py"
                         AdditionalDependencies=""
                         ExecutionDescription="Executing languages ..."
index 298c978..85b5e18 100644 (file)
@@ -7,8 +7,8 @@
                <CustomBuildRule
                        Name="Lex"
                        DisplayName="Lex"
-                       CommandLine="flex [AllOptions] -t -P$(InputName)YY [AdditionalOptions] [inputs] | python $(ProjectDir)..\src\increasebuffer.py &gt; $(InputDir)$(InputName).cpp"
-                       Outputs="$(InputDir)/$(InputName).cpp"
+                       CommandLine="flex [AllOptions] -t -P$(InputName)YY [AdditionalOptions] [inputs] | python $(ProjectDir)..\src\increasebuffer.py &gt; $(IntDir)/$(InputName).cpp"
+                       Outputs="$(IntDir)/$(InputName).cpp"
                        FileExtensions="*.l"
                        AdditionalDependencies="$(ProjectDir)..\src\increasebuffer.py"
                        ExecutionDescription="Executing Lex for $(InputPath) ..."
index 5de8bee..283cd49 100644 (file)
@@ -7,8 +7,8 @@
                <CustomBuildRule
                        Name="Settings"
                        DisplayName="Settings"
-                       CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] [inputs]"
-                       Outputs="$(InputDir)../src/$(InputName).h"
+                       CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] $(IntDir)"
+                       Outputs="$(IntDir)/$(InputName).h"
                        FileExtensions="*.py"
                        AdditionalDependencies="$(ProjectDir)..\configure"
                        ExecutionDescription="Executing Settings ..."
diff --git a/winbuild/Unistd.rules b/winbuild/Unistd.rules
new file mode 100755 (executable)
index 0000000..0f4ce02
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<VisualStudioToolFile
+       Name="unistd"
+       Version="8.00"
+       >
+       <Rules>
+               <CustomBuildRule
+                       Name="Unistd"
+                       DisplayName="Unistd"
+                       CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] $(IntDir)"
+                       Outputs="$(IntDir)/$(InputName).h"
+                       FileExtensions="*.py"
+                       ExecutionDescription="Executing Unistd ..."
+                       ShowOnlyRuleProperties="false"
+                       >
+               </CustomBuildRule>
+       </Rules>
+</VisualStudioToolFile>
index f19d094..43faeb1 100644 (file)
@@ -7,8 +7,8 @@
                <CustomBuildRule
                        Name="Version"
                        DisplayName="Version"
-                       CommandLine="python $(InputPath)"
-                       Outputs="$(InputDir)..\src\$(InputName).cpp"
+                       CommandLine="python $(InputPath) $(IntDir)"
+                       Outputs="$(IntDir)\$(InputName).cpp"
                        FileExtensions="*.py"
                        AdditionalDependencies="$(ProjectDir)..\configure"
                        ExecutionDescription="Executing Version ..."
index c54b118..499741f 100644 (file)
@@ -22,7 +22,7 @@
                <Configuration\r
                        Name="Debug|Win32"\r
                        OutputDirectory="..\bin\Debug"\r
-                       IntermediateDirectory=".\Debug"\r
+                       IntermediateDirectory=".\Debug\doxyindexer"\r
                        ConfigurationType="1"\r
                        CharacterSet="1"\r
                        BuildLogFile="$(IntDir)\$(TargetName)BuildLog.htm"\r
@@ -53,7 +53,7 @@
                                UsePrecompiledHeader="0"\r
                                WarningLevel="3"\r
                                DebugInformationFormat="4"\r
-                               ProgramDatabaseFileName=".\Debug\$(TargetName).pdb"\r
+                               ProgramDatabaseFileName=".\Debug\doxyindexer\$(TargetName).pdb"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
@@ -74,7 +74,7 @@
                                IgnoreAllDefaultLibraries="false"\r
                                IgnoreDefaultLibraryNames=""\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile=".\Debug\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Debug\doxyindexer\$(TargetName).pdb"\r
                                SubSystem="1"\r
                                TargetMachine="1"\r
                        />\r
                <Configuration\r
                        Name="Debug|x64"\r
                        OutputDirectory="..\bin\Debug64"\r
-                       IntermediateDirectory=".\Debug64"\r
+                       IntermediateDirectory=".\Debug64\doxyindexer"\r
                        ConfigurationType="1"\r
                        CharacterSet="1"\r
                        BuildLogFile="$(IntDir)\$(TargetName)BuildLog.htm"\r
                                UsePrecompiledHeader="0"\r
                                WarningLevel="3"\r
                                DebugInformationFormat="3"\r
-                               ProgramDatabaseFileName=".\Debug64\$(TargetName).pdb"\r
+                               ProgramDatabaseFileName=".\Debug64\doxyindexer\$(TargetName).pdb"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                LinkIncremental="2"\r
                                AdditionalLibraryDirectories="&quot;$(XAPIAN_DIR)\Debug64&quot;;Debug64"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile=".\Debug64\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Debug64\doxyindexer\$(TargetName).pdb"\r
                                SubSystem="1"\r
                                TargetMachine="17"\r
                        />\r
                </Configuration>\r
                <Configuration\r
                        Name="Release|Win32"\r
-                       OutputDirectory="..\bin\Relase"\r
-                       IntermediateDirectory=".\Release"\r
+                       OutputDirectory="..\bin\Release"\r
+                       IntermediateDirectory=".\Release\doxyindexer"\r
                        ConfigurationType="1"\r
                        CharacterSet="1"\r
                        BuildLogFile="$(IntDir)\$(TargetName)BuildLog.htm"\r
                                UsePrecompiledHeader="0"\r
                                WarningLevel="3"\r
                                DebugInformationFormat="3"\r
-                               ProgramDatabaseFileName=".\Release\$(TargetName).pdb"\r
+                               ProgramDatabaseFileName=".\Release\doxyindexer\$(TargetName).pdb"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                AdditionalLibraryDirectories="&quot;$(XAPIAN_DIR)\Release&quot;;Release"\r
                                GenerateManifest="false"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile=".\Release\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Release\doxyindexer\$(TargetName).pdb"\r
                                SubSystem="1"\r
                                OptimizeReferences="2"\r
                                EnableCOMDATFolding="2"\r
                </Configuration>\r
                <Configuration\r
                        Name="Release|x64"\r
-                       OutputDirectory="..\bin\Relase64"\r
-                       IntermediateDirectory=".\Release64"\r
+                       OutputDirectory="..\bin\Release64"\r
+                       IntermediateDirectory=".\Release64\doxyindexer"\r
                        ConfigurationType="1"\r
                        CharacterSet="1"\r
                        BuildLogFile="$(IntDir)\$(TargetName)BuildLog.htm"\r
                                UsePrecompiledHeader="0"\r
                                WarningLevel="3"\r
                                DebugInformationFormat="3"\r
-                               ProgramDatabaseFileName=".\Relase64\$(TargetName).pdb"\r
+                               ProgramDatabaseFileName=".\Release64\doxyindexer\$(TargetName).pdb"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                LinkIncremental="1"\r
                                AdditionalLibraryDirectories="&quot;$(XAPIAN_DIR)\Release64&quot;;Release64"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile=".\Release64\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Release64\doxyindexer\$(TargetName).pdb"\r
                                SubSystem="1"\r
                                OptimizeReferences="2"\r
                                EnableCOMDATFolding="2"\r
index 96e2d4e..a21168c 100644 (file)
@@ -22,7 +22,7 @@
                <Configuration\r
                        Name="Debug|Win32"\r
                        OutputDirectory="..\bin\Debug"\r
-                       IntermediateDirectory=".\Debug"\r
+                       IntermediateDirectory=".\Debug\doxysearch"\r
                        ConfigurationType="1"\r
                        CharacterSet="1"\r
                        BuildLogFile="$(IntDir)\$(TargetName)BuildLog.htm"\r
@@ -53,7 +53,7 @@
                                UsePrecompiledHeader="0"\r
                                WarningLevel="3"\r
                                DebugInformationFormat="4"\r
-                               ProgramDatabaseFileName=".\Debug\$(TargetName).pdb"\r
+                               ProgramDatabaseFileName=".\Debug\doxysearch\$(TargetName).pdb"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
@@ -71,7 +71,7 @@
                                LinkIncremental="1"\r
                                AdditionalLibraryDirectories="&quot;$(XAPIAN_DIR)\Debug&quot;"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile=".\Debug\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Debug\doxysearch\$(TargetName).pdb"\r
                                SubSystem="1"\r
                                TargetMachine="1"\r
                        />\r
                <Configuration\r
                        Name="Debug|x64"\r
                        OutputDirectory="..\bin\Debug64"\r
-                       IntermediateDirectory=".\Debug64"\r
+                       IntermediateDirectory=".\Debug64\doxysearch"\r
                        ConfigurationType="1"\r
                        CharacterSet="1"\r
                        BuildLogFile="$(IntDir)\$(TargetName)BuildLog.htm"\r
                                UsePrecompiledHeader="0"\r
                                WarningLevel="3"\r
                                DebugInformationFormat="3"\r
-                               ProgramDatabaseFileName=".\Debug64\$(TargetName).pdb"\r
+                               ProgramDatabaseFileName=".\Debug64\doxysearch\$(TargetName).pdb"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                LinkIncremental="2"\r
                                AdditionalLibraryDirectories="&quot;$(XAPIAN_DIR)\Debug64&quot;"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile=".\Debug64\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Debug64\doxysearch\$(TargetName).pdb"\r
                                SubSystem="1"\r
                                TargetMachine="17"\r
                        />\r
                <Configuration\r
                        Name="Release|Win32"\r
                        OutputDirectory="..\bin\Release"\r
-                       IntermediateDirectory=".\Release"\r
+                       IntermediateDirectory=".\Release\doxysearch"\r
                        ConfigurationType="1"\r
                        CharacterSet="1"\r
                        BuildLogFile="$(IntDir)\$(TargetName)BuildLog.htm"\r
                                UsePrecompiledHeader="0"\r
                                WarningLevel="3"\r
                                DebugInformationFormat="3"\r
-                               ProgramDatabaseFileName=".\Release\$(TargetName).pdb"\r
+                               ProgramDatabaseFileName=".\Release\doxysearch\$(TargetName).pdb"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                LinkIncremental="1"\r
                                AdditionalLibraryDirectories="&quot;$(XAPIAN_DIR)\Release&quot;"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile=".\Release\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Release\doxysearch\$(TargetName).pdb"\r
                                SubSystem="1"\r
                                OptimizeReferences="2"\r
                                EnableCOMDATFolding="2"\r
                <Configuration\r
                        Name="Release|x64"\r
                        OutputDirectory="..\bin\Release64"\r
-                       IntermediateDirectory=".\Release64"\r
+                       IntermediateDirectory=".\Release64\doxysearch"\r
                        ConfigurationType="1"\r
                        CharacterSet="1"\r
                        BuildLogFile="$(IntDir)\$(TargetName)BuildLog.htm"\r
                                UsePrecompiledHeader="0"\r
                                WarningLevel="3"\r
                                DebugInformationFormat="3"\r
-                               ProgramDatabaseFileName=".\Release64\$(TargetName).pdb"\r
+                               ProgramDatabaseFileName=".\Release64\doxysearch\$(TargetName).pdb"\r
                        />\r
                        <Tool\r
                                Name="VCManagedResourceCompilerTool"\r
                                LinkIncremental="1"\r
                                AdditionalLibraryDirectories="&quot;$(XAPIAN_DIR)\Release64&quot;"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile=".\Release64\$(TargetName).pdb"\r
+                               ProgramDatabaseFile=".\Release64\doxysearch\$(TargetName).pdb"\r
                                SubSystem="1"\r
                                OptimizeReferences="2"\r
                                EnableCOMDATFolding="2"\r
index a332d57..adc1ba9 100644 (file)
@@ -19,8 +19,8 @@
        <Configurations>
                <Configuration
                        Name="Release|Win32"
-                       OutputDirectory=".\Release"
-                       IntermediateDirectory=".\Release"
+                       OutputDirectory=".\Release\qtools"
+                       IntermediateDirectory=".\Release\qtools"
                        ConfigurationType="4"
                        InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
                        UseOfMFC="0"
                                StringPooling="true"
                                RuntimeLibrary="0"
                                EnableFunctionLevelLinking="true"
-                               PrecompiledHeaderFile=".\Release/qtools.pch"
-                               AssemblerListingLocation=".\Release/"
-                               ObjectFile=".\Release/"
-                               ProgramDatabaseFileName=".\Release\$(TargetName).pdb"
+                               PrecompiledHeaderFile=".\Release\qtools/qtools.pch"
+                               AssemblerListingLocation=".\Release\qtools/"
+                               ObjectFile=".\Release\qtools/"
+                               ProgramDatabaseFileName=".\Release\qtools\$(TargetName).pdb"
                                WarningLevel="3"
                                SuppressStartupBanner="true"
                                DebugInformationFormat="3"
@@ -87,7 +87,7 @@
                        <Tool
                                Name="VCBscMakeTool"
                                SuppressStartupBanner="true"
-                               OutputFile=".\Release/qtools.bsc"
+                               OutputFile=".\Release\qtools/qtools.bsc"
                        />
                        <Tool
                                Name="VCFxCopTool"
@@ -98,8 +98,8 @@
                </Configuration>
                <Configuration
                        Name="Release|x64"
-                       OutputDirectory=".\Release64"
-                       IntermediateDirectory=".\Release64"
+                       OutputDirectory=".\Release64\qtools"
+                       IntermediateDirectory=".\Release64\qtools"
                        ConfigurationType="4"
                        InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
                        UseOfMFC="0"
                                StringPooling="true"
                                RuntimeLibrary="0"
                                EnableFunctionLevelLinking="true"
-                               PrecompiledHeaderFile=".\Release64/qtools.pch"
-                               AssemblerListingLocation=".\Release64/"
-                               ObjectFile=".\Release64/"
-                               ProgramDatabaseFileName=".\Release64\$(TargetName).pdb"
+                               PrecompiledHeaderFile=".\Release64\qtools/qtools.pch"
+                               AssemblerListingLocation=".\Release64\qtools/"
+                               ObjectFile=".\Release64\qtools/"
+                               ProgramDatabaseFileName=".\Release64\qtools\$(TargetName).pdb"
                                WarningLevel="3"
                                SuppressStartupBanner="true"
                                DebugInformationFormat="3"
                        <Tool
                                Name="VCBscMakeTool"
                                SuppressStartupBanner="true"
-                               OutputFile=".\Release64/qtools.bsc"
+                               OutputFile=".\Release64\qtools/qtools.bsc"
                        />
                        <Tool
                                Name="VCFxCopTool"
                </Configuration>
                <Configuration
                        Name="Debug|Win32"
-                       OutputDirectory=".\Debug"
-                       IntermediateDirectory=".\Debug"
+                       OutputDirectory=".\Debug\qtools"
+                       IntermediateDirectory=".\Debug\qtools"
                        ConfigurationType="4"
                        InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
                        UseOfMFC="0"
                                MinimalRebuild="true"
                                BasicRuntimeChecks="3"
                                RuntimeLibrary="1"
-                               PrecompiledHeaderFile=".\Debug/qtools.pch"
-                               AssemblerListingLocation=".\Debug/"
-                               ObjectFile=".\Debug/"
-                               ProgramDatabaseFileName=".\Debug\$(TargetName).pdb"
+                               PrecompiledHeaderFile=".\Debug\qtools/qtools.pch"
+                               AssemblerListingLocation=".\Debug\qtools/"
+                               ObjectFile=".\Debug\qtools/"
+                               ProgramDatabaseFileName=".\Debug\qtools\$(TargetName).pdb"
                                WarningLevel="3"
                                SuppressStartupBanner="true"
                                DebugInformationFormat="3"
                        <Tool
                                Name="VCBscMakeTool"
                                SuppressStartupBanner="true"
-                               OutputFile=".\Debug/qtools.bsc"
+                               OutputFile=".\Debug\qtools/qtools.bsc"
                        />
                        <Tool
                                Name="VCFxCopTool"
                </Configuration>
                <Configuration
                        Name="Debug|x64"
-                       OutputDirectory=".\Debug64"
-                       IntermediateDirectory=".\Debug64"
+                       OutputDirectory=".\Debug64\qtools"
+                       IntermediateDirectory=".\Debug64\qtools"
                        ConfigurationType="4"
                        InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
                        UseOfMFC="0"
                                MinimalRebuild="true"
                                BasicRuntimeChecks="3"
                                RuntimeLibrary="1"
-                               PrecompiledHeaderFile=".\Debug64/qtools.pch"
-                               AssemblerListingLocation=".\Debug64/"
-                               ObjectFile=".\Debug64/"
-                               ProgramDatabaseFileName=".\Debug64\$(TargetName).pdb"
+                               PrecompiledHeaderFile=".\Debug64\qtools/qtools.pch"
+                               AssemblerListingLocation=".\Debug64\qtools/"
+                               ObjectFile=".\Debug64\qtools/"
+                               ProgramDatabaseFileName=".\Debug64\qtools\$(TargetName).pdb"
                                WarningLevel="3"
                                SuppressStartupBanner="true"
                                DebugInformationFormat="3"
                        <Tool
                                Name="VCBscMakeTool"
                                SuppressStartupBanner="true"
-                               OutputFile=".\Debug64/qtools.bsc"
+                               OutputFile=".\Debug64\qtools/qtools.bsc"
                        />
                        <Tool
                                Name="VCFxCopTool"
diff --git a/winbuild/runbison.bat b/winbuild/runbison.bat
deleted file mode 100644 (file)
index 4747582..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-bison -l -d -p ce_parseexpYY %1\..\src\constexp.y -o %1\..\src\ce_parse.c
-del %1\..\src\ce_parse.c
-bison -l -p constexpYY %1\..\src\constexp.y -o %1\..\src\ce_parse.cpp
-
-bison -l -d -p vhdlscannerYY %1\..\src\vhdlparser.y -o %1\..\src\vhdlparser.c
-del %1\..\src\vhdlparser.c
-bison -l -p vhdlscannerYY %1\..\src\vhdlparser.y -o %1\..\src\vhdlparser.cpp
diff --git a/winbuild/unistd.h b/winbuild/unistd.h
deleted file mode 100644 (file)
index 46a5fbc..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/* this is a dummy file, that is needed for compiling files that are 
- * generated with flex under Windows 95/NT. 
- */
-#if defined(_MSC_VER)
-#include <io.h>
-#endif
-
diff --git a/winbuild/unistd.py b/winbuild/unistd.py
new file mode 100644 (file)
index 0000000..93b9341
--- /dev/null
@@ -0,0 +1,16 @@
+# 
+
+import sys
+import os
+
+f1 = open(os.path.join(sys.argv[1],'unistd.h'),'w')
+
+f1.write("#ifndef UNISTD_H\n")
+f1.write("#define UNISTD_H\n")
+f1.write("/* this is a dummy file, that is needed for compiling files that are\n")
+f1.write(" * generated with flex under Windows 95/NT.\n")
+f1.write(" */\n")
+f1.write("#if defined(_MSC_VER)\n")
+f1.write("  #include <io.h>\n")
+f1.write("#endif\n")
+f1.write("#endif\n")
diff --git a/winbuild/version.bat b/winbuild/version.bat
deleted file mode 100644 (file)
index ce3ded6..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-@for /F "tokens=1* delims== " %%i in (..\configure) do @call :oneline "%%i" "%%j"
-@if "%mnt%"=="NO" goto :writereleaseversion
-@goto :writecvsversion
-:oneline
-@if "-%~1"=="-doxygen_version_major" call :aset major %2 
-@if "-%~1"=="-doxygen_version_minor" call :aset minor %2 
-@if "-%~1"=="-doxygen_version_revision" call :aset revision %2 
-@if "-%~1"=="-doxygen_version_mmn" call :aset mnt %2 
-@goto :EOF
-
-:aset
-@set %1=%~2
-@goto :EOF
-
-:writecvsversion
-echo %major%.%minor%.%revision%-%mnt%>..\VERSION
-echo char versionString[]="%major%.%minor%.%revision%-%mnt%";>..\src\version.cpp
-@goto :EOF
-
-:writereleaseversion
-echo %major%.%minor%.%revision%>..\VERSION
-echo char versionString[]="%major%.%minor%.%revision%";>..\src\version.cpp
-@goto :EOF