Imported Upstream version 1.8.11 upstream/1.8.11
authorDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 15 Oct 2021 01:52:56 +0000 (10:52 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 15 Oct 2021 01:52:56 +0000 (10:52 +0900)
264 files changed:
.gitignore
.travis.yml
CMakeLists.txt
VERSION
addon/doxyapp/CMakeLists.txt
addon/doxywizard/CMakeLists.txt
addon/doxywizard/config_doxyw.l
addon/doxywizard/doxywizard.cpp
addon/doxywizard/expert.cpp
addon/doxywizard/images/add.png [changed mode: 0644->0755]
addon/doxywizard/images/del.png [changed mode: 0644->0755]
addon/doxywizard/images/file.png [changed mode: 0644->0755]
addon/doxywizard/images/folder.png [changed mode: 0644->0755]
addon/doxywizard/images/refresh.png [changed mode: 0644->0755]
addon/doxywizard/images/tunecolor.png [changed mode: 0644->0755]
addon/doxywizard/inputbool.cpp
addon/doxywizard/inputint.cpp
addon/doxywizard/inputstring.cpp
addon/doxywizard/inputstrlist.cpp
addon/doxywizard/wizard.cpp
cmake/packaging.cmake [new file with mode: 0644]
cmake/run_translator.cmake [deleted file]
cmake/version.cmake
doc/.gitignore
doc/CMakeLists.txt
doc/Doxyfile
doc/arch.doc
doc/autolink.doc
doc/changelog.doc
doc/commands.doc
doc/diagrams.doc
doc/docblocks.doc
doc/doxygen.1
doc/doxygen.sty [deleted file]
doc/doxygen_manual.tex
doc/doxyindexer.1
doc/doxysearch.1
doc/doxywizard.1
doc/formulas.doc
doc/grouping.doc
doc/maintainers.txt
doc/manual.sty [new file with mode: 0644]
doc/markdown.doc
doc/tables.doc [new file with mode: 0644]
doc/translator.py
examples/CMakeLists.txt
examples/afterdoc.cfg
examples/afterdoc.h
examples/author.cfg
examples/autolink.cfg
examples/autolink.cpp
examples/class.cfg
examples/dbusxml.cfg
examples/define.cfg
examples/diagrams.cfg
examples/docstring.cfg
examples/enum.cfg
examples/enum.h
examples/example.cfg
examples/example.cpp
examples/example_test.cpp
examples/file.cfg
examples/func.cfg
examples/func.h
examples/group.cfg
examples/include.cfg
examples/include.cpp
examples/include_test.cpp [new file with mode: 0644]
examples/jdstyle.cfg
examples/jdstyle.cpp
examples/manual.cfg
examples/memgrp.cfg
examples/memgrp.cpp
examples/mux.cfg
examples/overload.cfg
examples/overload.cpp
examples/page.cfg
examples/par.cfg
examples/par.cpp
examples/pyexample.cfg
examples/qtstyle.cfg
examples/qtstyle.cpp
examples/relates.cfg
examples/restypedef.cfg
examples/strip_example.py [new file with mode: 0644]
examples/structcmd.cfg
examples/tclexample.cfg
libmd5/CMakeLists.txt
packages/rpm/doxygen.spec.in [deleted file]
qtools/CMakeLists.txt
qtools/Doxyfile
qtools/qcstring.cpp
qtools/qcstring.h
qtools/qfile_win32.cpp
qtools/qgdict.cpp
qtools/qstring.cpp
qtools/qstring.h
src/CMakeLists.txt
src/cite.cpp
src/classdef.cpp
src/cmdmapper.cpp
src/cmdmapper.h
src/code.l
src/commentcnv.l
src/commentscan.l
src/config.l
src/config.xml
src/context.cpp
src/context.h
src/defargs.l
src/definition.cpp
src/definition.h
src/diagram.cpp
src/dirdef.cpp
src/dirdef.h
src/docparser.cpp
src/docparser.h
src/docsets.cpp
src/doctokenizer.l
src/dot.cpp
src/dot.h
src/doxygen.cpp
src/doxygen.h
src/filedef.cpp
src/filedef.h
src/formula.cpp
src/fortrancode.l
src/fortranscanner.l
src/ftvhelp.cpp
src/groupdef.cpp
src/htags.cpp
src/htmldocvisitor.cpp
src/htmlentity.cpp
src/htmlgen.cpp
src/increasebuffer.py [deleted file]
src/index.cpp
src/index.h
src/latexdocvisitor.cpp
src/latexdocvisitor.h
src/latexgen.cpp
src/latexgen.h
src/layout.cpp
src/lodepng.cpp
src/main.cpp
src/markdown.cpp
src/memberdef.cpp
src/memberdef.h
src/membergroup.cpp
src/membergroup.h
src/memberlist.cpp
src/message.cpp
src/namespacedef.cpp
src/outputgen.cpp
src/pagedef.cpp
src/pagedef.h
src/plantuml.cpp
src/portable_c.c
src/pre.l
src/printdocvisitor.h
src/pycode.l
src/pyscanner.l
src/reflist.cpp
src/reflist.h
src/resourcemgr.h
src/rtfgen.cpp
src/scanner.l
src/searchindex.cpp
src/searchindex.h
src/section.h
src/settings.py [deleted file]
src/template.cpp
src/template.h
src/translator_br.h
src/translator_cn.h
src/translator_cz.h
src/translator_de.h
src/translator_en.h
src/translator_eo.h
src/translator_es.h
src/translator_fr.h
src/translator_gr.h
src/translator_it.h
src/translator_jp.h
src/translator_kr.h
src/translator_lv.h
src/translator_nl.h
src/translator_pt.h
src/translator_ro.h
src/translator_ru.h
src/translator_sk.h
src/translator_sv.h
src/translator_tw.h
src/translator_ua.h
src/util.cpp [changed mode: 0644->0755]
src/util.h [changed mode: 0644->0755]
src/version.py [deleted file]
src/vhdlcode.l
src/vhdldocgen.cpp
src/vhdldocgen.h
src/vhdljjparser.cpp
src/xmlcode.l
src/xmldocvisitor.cpp
templates/html/doxygen.css
templates/html/htmlallmembers.tpl
templates/html/htmlannotated.tpl
templates/html/htmlbase.tpl
templates/html/htmlclass.tpl
templates/html/htmlclasses.tpl
templates/html/htmldeclcomp.tpl
templates/html/htmldir.tpl
templates/html/htmldirtree.tpl
templates/html/htmlexample.tpl [new file with mode: 0644]
templates/html/htmlexamples.tpl [new file with mode: 0644]
templates/html/htmlfile.tpl
templates/html/htmlfiles.tpl
templates/html/htmlhierarchy.tpl
templates/html/htmlindexpages.tpl
templates/html/htmlinlineclasses.tpl [new file with mode: 0644]
templates/html/htmljsnavtree.tpl
templates/html/htmljssearchdata.tpl [new file with mode: 0644]
templates/html/htmljssearchindex.tpl [new file with mode: 0644]
templates/html/htmllayout.tpl
templates/html/htmlmembersindex.tpl
templates/html/htmlmemdecl.tpl
templates/html/htmlmemdef.tpl
templates/html/htmlmodule.tpl
templates/html/htmlmodules.tpl
templates/html/htmlnamespace.tpl
templates/html/htmlnamespaces.tpl
templates/html/htmlnavtree.tpl
templates/html/htmlobjlink.tpl
templates/html/htmlpage.tpl
templates/html/htmlpages.tpl
templates/html/htmlsearchresult.tpl [new file with mode: 0644]
templates/html/htmlsource.tpl
templates/html/htmltabs.tpl
templates/html/htmltypeconstraints.tpl
templates/html/resize.js
templates/latex/doxygen.sty
templates/latex/latexannotated.tpl [new file with mode: 0644]
templates/latex/latexclass.tpl [new file with mode: 0644]
templates/latex/latexfiles.tpl [new file with mode: 0644]
templates/latex/latexinclude.tpl [new file with mode: 0644]
templates/latex/latexlayout.tpl [new file with mode: 0644]
templates/latex/latexmakefile.tpl [new file with mode: 0644]
templates/latex/latexmodules.tpl [new file with mode: 0644]
templates/latex/latexnamespaces.tpl [new file with mode: 0644]
templates/latex/latexobjlink.tpl [new file with mode: 0644]
templates/latex/latexrefman.tpl [new file with mode: 0644]
templates/latex/latextypeconstraints.tpl [new file with mode: 0644]
testing/020/indexpage.xml
testing/051/indexpage.xml
testing/051_escape.dox
testing/runtests.py
vhdlparser/CMakeLists.txt
vhdlparser/CharStream.h
vhdlparser/ErrorHandler.h
vhdlparser/Makefile [moved from vhdlparser/Makefile.in with 57% similarity]
vhdlparser/TokenManager.h
vhdlparser/TokenMgrError.cc
vhdlparser/VhdlParser.cc
vhdlparser/VhdlParser.h
vhdlparser/vhdlparser.jj
vhdlparser/vhdlparser.pro.in [deleted file]

index 3e575a1..21ebe47 100644 (file)
@@ -13,5 +13,3 @@
 
 /doxygen_docs
 /doxygen.tag
-
-
index b6976ba..0ae48e8 100644 (file)
@@ -1,15 +1,21 @@
 language: cpp
 compiler:
   - gcc
+  - clang
+
 before_install:
+    - sudo apt-add-repository ppa:smspillaz/cmake-2.8.12 -y
+    - sudo add-apt-repository ppa:texlive-backports/ppa -y
     - sudo apt-get update -qq
-    - sudo apt-get install -qq  texlive texlive-extra-utils texlive-latex-extra libxml2-utils
-    - wget -qO- http://www.cmake.org/files/v3.1/cmake-3.1.0-Linux-x86_64.tar.gz | tar xvz
+
+install:
+    - sudo apt-get install -qq texlive texlive-extra-utils texlive-latex-extra libxml2-utils
+    - sudo apt-get install -qq cmake cmake-data
 
 script:
     - mkdir build
     - cd build
-    - ../cmake-3.1.0-Linux-x86_64/bin/cmake -G "Unix Makefiles" -Dbuild_doc=ON -Dbuild_wizard=ON ..
+    - cmake -G "Unix Makefiles" -Dbuild_doc=ON -Dbuild_wizard=ON ..
     - make
-    - make docs
     - make tests
+    - make docs
index b0def45..a020f41 100644 (file)
@@ -23,9 +23,10 @@ option(use_sqlite3     "Add support for sqlite3 output [experimental]." OFF)
 option(use_libclang    "Add support for libclang parsing." OFF)
 option(win_static      "Link with /MT in stead of /MD on windows" OFF)
 option(english_only    "Only compile in support for the English language" OFF)
+option(force_qt4       "Forces doxywizard to build using Qt4 even if Qt5 is installed" OFF)
 
 list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
-set(SOURCE "${CMAKE_SOURCE_DIR}")
+set(TOP "${CMAKE_SOURCE_DIR}")
 include(version)
 
 set(sqlite3  "0" CACHE INTERNAL "used in settings.h")
@@ -40,12 +41,15 @@ endif()
 
 if (${CMAKE_SYSTEM} MATCHES "Darwin")
     set(CMAKE_CXX_FLAGS "-Wno-deprecated-register -mmacosx-version-min=10.5 ${CMAKE_CXX_FLAGS}")
+    set(CMAKE_C_FLAGS "-Wno-deprecated-register -mmacosx-version-min=10.5 ${CMAKE_C_FLAGS}")
     find_library(CORESERVICES_LIB CoreServices)
     set(EXTRA_LIBS ${CORESERVICES_LIB})
 endif()
 
 if (WIN32)
-    set(ICONV_DIR "${CMAKE_SOURCE_DIR}/winbuild")
+    if(NOT ICONV_DIR)
+      set(ICONV_DIR "${CMAKE_SOURCE_DIR}/winbuild")
+    endif()
     set(CMAKE_REQUIRED_DEFINITIONS "-DLIBICONV_STATIC")
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") # needed for language.cpp on 64bit
     add_definitions(-DLIBICONV_STATIC -D_CRT_SECURE_NO_WARNINGS)
@@ -66,8 +70,6 @@ include_directories(${ICONV_INCLUDE_DIR})
 
 
 #set(DOXYDOCS ${CMAKE_SOURCE_DIR}/doc CACHE INTERNAL "Path to doxygen docs")
-set(DOC_INSTALL_DIR "share/doc/packages/doxygen" CACHE STRING "Relative path where to install the documentation")
-set(EXAMPLE_DIR ${CMAKE_SOURCE_DIR}/examples)
 set(DOXYDOCS ${PROJECT_BINARY_DIR}/doc)
 set(ENV{DOXYGEN_DOCDIR} ${DOXYDOCS})
 set(GENERATED_SRC "${CMAKE_BINARY_DIR}/generated_src" CACHE INTERNAL "Stores generated files")
@@ -136,3 +138,6 @@ add_subdirectory(addon/doxywizard)
 
 enable_testing()
 add_subdirectory(testing)
+
+include(cmake/packaging.cmake) # set CPACK_xxxx properties
+include(CPack)
diff --git a/VERSION b/VERSION
index d9a03a9..267637b 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.8.10
+1.8.11
index a039762..99a6fd4 100644 (file)
@@ -6,6 +6,7 @@ include_directories(
        ${CMAKE_SOURCE_DIR}/src
        ${CMAKE_SOURCE_DIR}/qtools
        ${ICONV_INCLUDE_DIR}
+       ${CLANG_INCLUDEDIR}
 )
 
 add_executable(doxyapp
@@ -21,6 +22,7 @@ ${ICONV_LIBRARIES}
 ${CMAKE_THREAD_LIBS_INIT}
 ${SQLITE3_LIBRARIES}
 ${EXTRA_LIBS}
+${CLANG_LIBS}
 )
 
 install(TARGETS doxyapp DESTINATION bin)
index 055aac3..bf2eda8 100644 (file)
@@ -1,5 +1,40 @@
 if (build_wizard)
 
+# search for Qt5
+if (NOT force_qt4)
+  find_package(Qt5Core QUIET)
+  if (Qt5Core_FOUND)
+    message(STATUS "Using Qt5")
+    find_package(Qt5 COMPONENTS Widgets Gui Xml)
+    macro(qt_use_modules)
+        qt5_use_modules(${ARGN})
+    endmacro()
+    macro(qt_wrap_cpp)
+        qt5_wrap_cpp(${ARGN})
+    endmacro()
+    macro(qt_add_resources)
+        qt5_add_resources(${ARGN})
+    endmacro()
+  endif()
+endif()
+# fallback to Qt4
+if (NOT Qt5Core_FOUND)
+  if (NOT force_qt4)
+    message(STATUS "Qt5 not found, searching for Qt4 instead...")
+  else()
+    message(STATUS "Using Qt4")
+  endif()
+  find_package(Qt4 REQUIRED COMPONENTS QtCore QtXml QtGui)
+  macro(qt_use_modules)
+  endmacro()
+  macro(qt_wrap_cpp)
+      qt4_wrap_cpp(${ARGN})
+  endmacro()
+  macro(qt_add_resources)
+      qt4_add_resources(${ARGN})
+  endmacro()
+endif()
+
 include_directories(
        .
        ${CMAKE_SOURCE_DIR}/src
@@ -10,10 +45,10 @@ include_directories(
 set(GENERATED_SRC_WIZARD ${GENERATED_SRC}/doxywizard)
 file(MAKE_DIRECTORY ${GENERATED_SRC_WIZARD})
 
-add_definitions(-DQT_ARCH_X86_64 -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DUNICODE)
-set(QT_USE_QTXML TRUE)
-find_package(Qt4 REQUIRED)
-include(${QT_USE_FILE})
+add_definitions(-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DUNICODE)
+if (NOT Qt5Core_FOUND)
+  include(${QT_USE_FILE})
+endif()
 
 # generate settings.h
 file(GENERATE OUTPUT ${GENERATED_SRC_WIZARD}/settings.h
@@ -41,9 +76,9 @@ OUTPUT ${GENERATED_SRC_WIZARD}/configdoc.cpp
 )
 set_source_files_properties(${GENERATED_SRC_WIZARD}/configdoc.cpp PROPERTIES GENERATED 1)
 
-FLEX_TARGET(config_doxyw config_doxyw.l ${GENERATED_SRC_WIZARD}/config_doxyw.cpp COMPILE_FLAGS "-Pconfig_doxywYY")
+FLEX_TARGET(config_doxyw config_doxyw.l ${GENERATED_SRC_WIZARD}/config_doxyw.cpp COMPILE_FLAGS "$(LEX_FLAGS) -Pconfig_doxywYY")
 
-QT4_WRAP_CPP(doxywizard_MOC
+qt_wrap_cpp(doxywizard_MOC
 doxywizard.h
 expert.h
 helplabel.h
@@ -54,9 +89,9 @@ inputstrlist.h
 wizard.h
 )
 
-QT4_ADD_RESOURCES(doxywizard_RESOURCES_RCC doxywizard.qrc)
+qt_add_resources(doxywizard_RESOURCES_RCC doxywizard.qrc)
 
-add_executable(doxywizard
+add_executable(doxywizard WIN32
 doxywizard.cpp
 expert.cpp
 wizard.cpp
@@ -71,8 +106,9 @@ ${GENERATED_SRC_WIZARD}/configdoc.cpp
 ${doxywizard_MOC}
 ${doxywizard_RESOURCES_RCC}
 )
+qt_use_modules(doxywizard Core Gui Widgets Xml)
 target_link_libraries(doxywizard
-${QT_LIBRARIES}
+${QT_LIBRARIES} ${QT_QTMAIN_LIBRARY}
 )
 
 install(TARGETS doxywizard DESTINATION bin)
index 829f807..90bd09e 100644 (file)
  */
 #include "config.h"
 #include "input.h"
-#include <QtCore>
+
+#include <QString>
+#include <QVariant>
+#include <QStack>
+#include <QTextCodec>
+#include <QByteArray>
+#include <QFileInfo>
+#include <QStringList>
+#include <QRegExp>
+#include <QTextStream>
 
 #define YY_NO_UNISTD_H 1
 
@@ -52,7 +61,7 @@ static QVariant                      *g_arg;
 static Input                         *g_curOption=0;
 static QString                        g_elemStr;
 static QTextCodec                    *g_codec     = QTextCodec::codecForName("UTF-8");
-static QString                        g_codecName = QString::fromAscii("UTF-8");
+static QString                        g_codecName = QString::fromLatin1("UTF-8");
 static int                            g_lastState;
 static QByteArray                     g_tmpString;
 
@@ -74,13 +83,13 @@ static int yyread(char *buf,int maxSize)
     }
 }
 
-static QString warning_str = QString::fromAscii("warning: ");
-static QString error_str = QString::fromAscii("error: ");
+static QString warning_str = QString::fromLatin1("warning: ");
+static QString error_str = QString::fromLatin1("error: ");
 
 void config_err(const char *fmt, ...)
 {
   QString msg = error_str;
-  msg.append(QString::fromAscii(fmt));
+  msg.append(QString::fromLatin1(fmt));
   va_list args;
   va_start(args, fmt);
   vfprintf(stderr, qPrintable(msg), args);
@@ -89,7 +98,7 @@ void config_err(const char *fmt, ...)
 void config_warn(const char *fmt, ...)
 {
   QString msg = warning_str;
-  msg.append(QString::fromAscii(fmt));
+  msg.append(QString::fromLatin1(fmt));
   va_list args;
   va_start(args, fmt);
   vfprintf(stderr, qPrintable(msg), args);
@@ -101,10 +110,10 @@ static void substEnvVarsInString(QString &s);
 
 static void checkEncoding()
 {
-  Input *option = g_options->value(QString::fromAscii("DOXYFILE_ENCODING"));
+  Input *option = g_options->value(QString::fromLatin1("DOXYFILE_ENCODING"));
   if (option && option->value().toString()!=g_codecName)
   {
-    QTextCodec *newCodec = QTextCodec::codecForName(option->value().toString().toAscii());
+    QTextCodec *newCodec = QTextCodec::codecForName(option->value().toString().toLatin1());
     if (newCodec)
     {
       g_codec = newCodec;
@@ -115,7 +124,7 @@ static void checkEncoding()
 
 static FILE *tryPath(const QString &path,const QString &fileName)
 {
-  QString absName=!path.isEmpty() ? path+QString::fromAscii("/")+fileName : fileName;
+  QString absName=!path.isEmpty() ? path+QString::fromLatin1("/")+fileName : fileName;
   QFileInfo fi(absName);
   if (fi.exists() && fi.isFile())
   {
@@ -144,7 +153,7 @@ static FILE *findFile(const QString &fileName)
     if (f) return f;
   }
   // try cwd if g_includePathList fails
-  return tryPath(QString::fromAscii("."),fileName);
+  return tryPath(QString::fromLatin1("."),fileName);
 }
 
 static void readIncludeFile(const QString &incName)
@@ -160,8 +169,8 @@ static void readIncludeFile(const QString &incName)
   substEnvVarsInString(inc);
   inc = inc.trimmed();
   uint incLen = inc.length();
-  if (inc.at(0)==QChar::fromAscii('"') && 
-      inc.at(incLen-1)==QChar::fromAscii('"')) // strip quotes
+  if (inc.at(0)==QChar::fromLatin1('"') && 
+      inc.at(incLen-1)==QChar::fromLatin1('"')) // strip quotes
   {
     inc=inc.mid(1,incLen-2);
   }
@@ -383,7 +392,7 @@ static void readIncludeFile(const QString &incName)
 
 static void substEnvVarsInString(QString &s)
 {
-  static QRegExp re(QString::fromAscii("\\$\\([a-z_A-Z0-9]+\\)"));
+  static QRegExp re(QString::fromLatin1("\\$\\([a-z_A-Z0-9]+\\)"));
   if (s.isEmpty()) return;
   int p=0;
   int i,l;
@@ -409,8 +418,8 @@ static void substEnvVarsInStrList(QStringList &sl)
   foreach (QString result, sl)
   {
     // an argument with quotes will have an extra space at the end, so wasQuoted will be TRUE.
-    bool wasQuoted = (result.indexOf(QChar::fromAscii(' '))!=-1) || 
-                     (result.indexOf(QChar::fromAscii('\t'))!=-1);
+    bool wasQuoted = (result.indexOf(QChar::fromLatin1(' '))!=-1) || 
+                     (result.indexOf(QChar::fromLatin1('\t'))!=-1);
     // here we strip the quote again
     substEnvVarsInString(result);
 
@@ -430,33 +439,33 @@ static void substEnvVarsInStrList(QStringList &sl)
       {
        QChar c=0;
        // skip until start of new word
-       while (i<l && ((c=result.at(i))==QChar::fromAscii(' ') || c==QChar::fromAscii('\t'))) i++; 
+       while (i<l && ((c=result.at(i))==QChar::fromLatin1(' ') || c==QChar::fromLatin1('\t'))) i++; 
        p=i; // p marks the start index of the word
        // skip until end of a word
-       while (i<l && ((c=result.at(i))!=QChar::fromAscii(' ') && 
-                     c!=QChar::fromAscii('\t') && 
-                     c!=QChar::fromAscii('"'))) i++;
+       while (i<l && ((c=result.at(i))!=QChar::fromLatin1(' ') && 
+                     c!=QChar::fromLatin1('\t') && 
+                     c!=QChar::fromLatin1('"'))) i++;
        if (i<l) // not at the end of the string
        {
-         if (c==QChar::fromAscii('"')) // word within quotes
+         if (c==QChar::fromLatin1('"')) // word within quotes
          {
            p=i+1;
            for (i++;i<l;i++)
            {
              c=result.at(i);
-             if (c==QChar::fromAscii('"')) // end quote
+             if (c==QChar::fromLatin1('"')) // end quote
              {
                 out += result.mid(p,i-p);
                p=i+1;
                break; 
              }
-             else if (c==QChar::fromAscii('\\')) // skip escaped stuff
+             else if (c==QChar::fromLatin1('\\')) // skip escaped stuff
              {
                i++;
              }
            }
          }
-         else if (c==QChar::fromAscii(' ') || c==QChar::fromAscii('\t')) // separator
+         else if (c==QChar::fromLatin1(' ') || c==QChar::fromLatin1('\t')) // separator
          {
             out += result.mid(p,i-p);
            p=i+1;
@@ -529,7 +538,7 @@ bool parseConfig(
 void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s)
 {
   QChar c;
-  bool needsEscaping=FALSE;
+  bool needsEscaping=false;
   // convert the string back to it original encoding
   //QByteArray se = codec->fromUnicode(s);
   t.setCodec(codec);
@@ -538,10 +547,10 @@ void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s)
   {
     while (!(c=*p++).isNull() && !needsEscaping) 
     {
-      needsEscaping = (c==QChar::fromAscii(' ')  || 
-                      c==QChar::fromAscii('\n') || 
-                      c==QChar::fromAscii('\t') || 
-                      c==QChar::fromAscii('"'));
+      needsEscaping = (c==QChar::fromLatin1(' ')  || 
+                      c==QChar::fromLatin1('\n') || 
+                      c==QChar::fromLatin1('\t') || 
+                      c==QChar::fromLatin1('"'));
     }
     if (needsEscaping)
     { 
@@ -549,9 +558,9 @@ void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s)
       p=s.data();
       while (!p->isNull())
       {
-       if (*p   ==QChar::fromAscii(' ') && 
-          *(p+1)==QChar::fromAscii('\0')) break; // skip inserted space at the end
-       if (*p   ==QChar::fromAscii('"')) t << "\\"; // escape quotes
+       if (*p   ==QChar::fromLatin1(' ') && 
+          *(p+1)==QChar::fromLatin1('\0')) break; // skip inserted space at the end
+       if (*p   ==QChar::fromLatin1('"')) t << "\\"; // escape quotes
        t << *p++;
       }
       t << "\"";
index 4c577cd..e292d0c 100644 (file)
@@ -1,9 +1,28 @@
-#include <QtGui>
 #include "doxywizard.h"
 #include "version.h"
 #include "expert.h"
 #include "wizard.h"
 
+#include <QMenu>
+#include <QMenuBar>
+#include <QPushButton>
+#include <QMessageBox>
+#include <QVBoxLayout>
+#include <QLineEdit>
+#include <QLabel>
+#include <QTextEdit>
+#include <QStatusBar>
+#include <QProcess>
+#include <QTimer>
+#include <QCloseEvent>
+#include <QApplication>
+#include <QDir>
+#include <QFileDialog>
+#include <QDesktopServices>
+#include <QUrl>
+#include <QTextStream>
+#include <QDebug>
+
 #ifdef WIN32
 #include <windows.h>
 #endif
@@ -19,7 +38,7 @@ MainWindow &MainWindow::instance()
 }
 
 MainWindow::MainWindow()
-  : m_settings(QString::fromAscii("Doxygen.org"), QString::fromAscii("Doxywizard"))
+  : m_settings(QString::fromLatin1("Doxygen.org"), QString::fromLatin1("Doxywizard"))
 {
   QMenu *file = menuBar()->addMenu(tr("File"));
   file->addAction(tr("Open..."), 
@@ -84,7 +103,7 @@ MainWindow::MainWindow()
   QGridLayout *grid = new QGridLayout;
   m_outputLog = new QTextEdit;
   m_outputLog->setReadOnly(true);
-  m_outputLog->setFontFamily(QString::fromAscii("courier"));
+  m_outputLog->setFontFamily(QString::fromLatin1("courier"));
   m_outputLog->setMinimumWidth(600);
   grid->addWidget(m_outputLog,0,0);
   grid->setColumnStretch(0,1);
@@ -183,16 +202,16 @@ void MainWindow::updateWorkingDir()
 
 void MainWindow::manual()
 {
-  QDesktopServices::openUrl(QUrl(QString::fromAscii("http://www.doxygen.org/manual.html")));
+  QDesktopServices::openUrl(QUrl(QString::fromLatin1("http://www.doxygen.org/manual.html")));
 }
 
 void MainWindow::about()
 {
   QString msg;
   QTextStream t(&msg,QIODevice::WriteOnly);
-  t << QString::fromAscii("<qt><center>A tool to configure and run doxygen version ")+
-       QString::fromAscii(versionString)+
-       QString::fromAscii(" on your source files.</center><p><br>"
+  t << QString::fromLatin1("<qt><center>A tool to configure and run doxygen version ")+
+       QString::fromLatin1(versionString)+
+       QString::fromLatin1(" on your source files.</center><p><br>"
        "<center>Written by<br> Dimitri van Heesch<br>&copy; 2000-2015</center><p>"
        "</qt>");
   QMessageBox::about(this,tr("Doxygen GUI"),msg);
@@ -273,7 +292,7 @@ bool MainWindow::saveConfig()
 bool MainWindow::saveConfigAs()
 {
   QString fileName = QFileDialog::getSaveFileName(this, QString(), 
-             m_workingDir->text()+QString::fromAscii("/Doxyfile"));
+             m_workingDir->text()+QString::fromLatin1("/Doxyfile"));
   if (fileName.isEmpty()) return false;
   saveConfig(fileName);
   return true;
@@ -289,7 +308,7 @@ void MainWindow::makeDefaults()
   {
     //printf("MainWindow:makeDefaults()\n");
     m_expert->saveSettings(&m_settings);
-    m_settings.setValue(QString::fromAscii("wizard/loadsettings"), true);
+    m_settings.setValue(QString::fromLatin1("wizard/loadsettings"), true);
     m_settings.sync();
   }
 }
@@ -306,7 +325,7 @@ void MainWindow::clearRecent()
     m_recentFiles.clear();
     for (int i=0;i<MAX_RECENT_FILES;i++)
     {
-      m_settings.setValue(QString().sprintf("recent/config%d",i++),QString::fromAscii(""));
+      m_settings.setValue(QString().sprintf("recent/config%d",i++),QString::fromLatin1(""));
     }
     m_settings.sync();
   }
@@ -323,7 +342,7 @@ void MainWindow::resetToDefaults()
   {
     //printf("MainWindow:resetToDefaults()\n");
     m_expert->resetToDefaults();
-    m_settings.setValue(QString::fromAscii("wizard/loadsettings"), false);
+    m_settings.setValue(QString::fromLatin1("wizard/loadsettings"), false);
     m_settings.sync();
     m_wizard->refresh();
   }
@@ -331,11 +350,11 @@ void MainWindow::resetToDefaults()
 
 void MainWindow::loadSettings()
 {
-  QVariant geometry     = m_settings.value(QString::fromAscii("main/geometry"), QVariant::Invalid);
-  QVariant state        = m_settings.value(QString::fromAscii("main/state"),    QVariant::Invalid);
-  QVariant wizState     = m_settings.value(QString::fromAscii("wizard/state"),  QVariant::Invalid);
-  QVariant loadSettings = m_settings.value(QString::fromAscii("wizard/loadsettings"),  QVariant::Invalid);
-  QVariant workingDir   = m_settings.value(QString::fromAscii("wizard/workingdir"), QVariant::Invalid);
+  QVariant geometry     = m_settings.value(QString::fromLatin1("main/geometry"), QVariant::Invalid);
+  QVariant state        = m_settings.value(QString::fromLatin1("main/state"),    QVariant::Invalid);
+  QVariant wizState     = m_settings.value(QString::fromLatin1("wizard/state"),  QVariant::Invalid);
+  QVariant loadSettings = m_settings.value(QString::fromLatin1("wizard/loadsettings"),  QVariant::Invalid);
+  QVariant workingDir   = m_settings.value(QString::fromLatin1("wizard/workingdir"), QVariant::Invalid);
 
   if (geometry  !=QVariant::Invalid) restoreGeometry(geometry.toByteArray());
   if (state     !=QVariant::Invalid) restoreState   (state.toByteArray());
@@ -362,12 +381,12 @@ void MainWindow::loadSettings()
 
 void MainWindow::saveSettings()
 {
-  QSettings settings(QString::fromAscii("Doxygen.org"), QString::fromAscii("Doxywizard"));
+  QSettings settings(QString::fromLatin1("Doxygen.org"), QString::fromLatin1("Doxywizard"));
 
-  m_settings.setValue(QString::fromAscii("main/geometry"), saveGeometry());
-  m_settings.setValue(QString::fromAscii("main/state"),    saveState());
-  m_settings.setValue(QString::fromAscii("wizard/state"),  m_wizard->saveState());
-  m_settings.setValue(QString::fromAscii("wizard/workingdir"), m_workingDir->text());
+  m_settings.setValue(QString::fromLatin1("main/geometry"), saveGeometry());
+  m_settings.setValue(QString::fromLatin1("main/state"),    saveState());
+  m_settings.setValue(QString::fromLatin1("wizard/state"),  m_wizard->saveState());
+  m_settings.setValue(QString::fromLatin1("wizard/workingdir"), m_workingDir->text());
 }
 
 void MainWindow::selectTab(int id)
@@ -405,7 +424,7 @@ void MainWindow::addRecentFile(const QString &fileName)
   }
   for (;i<MAX_RECENT_FILES;i++)
   {
-    m_settings.setValue(QString().sprintf("recent/config%d",i++),QString::fromAscii(""));
+    m_settings.setValue(QString().sprintf("recent/config%d",i++),QString::fromLatin1(""));
   }
 }
 
@@ -423,19 +442,19 @@ void MainWindow::runDoxygen()
   {
     QString doxygenPath; 
 #if defined(Q_OS_MACX)
-    doxygenPath = qApp->applicationDirPath()+QString::fromAscii("/../Resources/");
+    doxygenPath = qApp->applicationDirPath()+QString::fromLatin1("/../Resources/");
     qDebug() << tr("Doxygen path: ") << doxygenPath;
-    if ( !QFile(doxygenPath + QString::fromAscii("doxygen")).exists() ) 
+    if ( !QFile(doxygenPath + QString::fromLatin1("doxygen")).exists() ) 
     {
       // No Doxygen binary in the resources, if there is a system Doxygen binary, use that instead
-      if ( QFile(QString::fromAscii("/usr/local/bin/doxygen")).exists() )
+      if ( QFile(QString::fromLatin1("/usr/local/bin/doxygen")).exists() )
       {
-        doxygenPath = QString::fromAscii("/usr/local/bin/");
+        doxygenPath = QString::fromLatin1("/usr/local/bin/");
       }
       else 
       {
         qDebug() << tr("Can't find the doxygen command, make sure it's in your $$PATH");
-        doxygenPath = QString::fromAscii("");
+        doxygenPath = QString::fromLatin1("");
       }
     }
     qDebug() << tr("Getting doxygen from: ") << doxygenPath;
@@ -446,20 +465,20 @@ void MainWindow::runDoxygen()
     m_runProcess->setWorkingDirectory(m_workingDir->text());
     QStringList env=QProcess::systemEnvironment();
     // set PWD environment variable to m_workingDir
-    env.replaceInStrings(QRegExp(QString::fromAscii("^PWD=(.*)"),Qt::CaseInsensitive), 
-                         QString::fromAscii("PWD=")+m_workingDir->text());
+    env.replaceInStrings(QRegExp(QString::fromLatin1("^PWD=(.*)"),Qt::CaseInsensitive), 
+                         QString::fromLatin1("PWD=")+m_workingDir->text());
     m_runProcess->setEnvironment(env);
 
     QStringList args;
-    args << QString::fromAscii("-b"); // make stdout unbuffered
-    args << QString::fromAscii("-");  // read config from stdin
+    args << QString::fromLatin1("-b"); // make stdout unbuffered
+    args << QString::fromLatin1("-");  // read config from stdin
 
     m_outputLog->clear();
-    m_runProcess->start(doxygenPath + QString::fromAscii("doxygen"), args);
+    m_runProcess->start(doxygenPath + QString::fromLatin1("doxygen"), args);
 
     if (!m_runProcess->waitForStarted())
     {
-      m_outputLog->append(QString::fromAscii("*** Failed to run doxygen\n"));
+      m_outputLog->append(QString::fromLatin1("*** Failed to run doxygen\n"));
       return;
     }
     QTextStream t(m_runProcess);
@@ -468,7 +487,7 @@ void MainWindow::runDoxygen()
 
     if (m_runProcess->state() == QProcess::NotRunning)
     {
-      m_outputLog->append(QString::fromAscii("*** Failed to run doxygen\n"));
+      m_outputLog->append(QString::fromLatin1("*** Failed to run doxygen\n"));
     }
     else
     {
@@ -536,10 +555,10 @@ void MainWindow::showHtmlOutput()
   QFileInfo fi(indexFile);
   // TODO: the following doesn't seem to work with IE
 #ifdef WIN32
-  //QString indexUrl(QString::fromAscii("file:///"));
+  //QString indexUrl(QString::fromLatin1("file:///"));
   ShellExecute(NULL, L"open", (LPCWSTR)fi.absoluteFilePath().utf16(), NULL, NULL, SW_SHOWNORMAL);
 #else
-  QString indexUrl(QString::fromAscii("file://"));
+  QString indexUrl(QString::fromLatin1("file://"));
   indexUrl+=fi.absoluteFilePath();
   QDesktopServices::openUrl(QUrl(indexUrl));
 #endif
@@ -549,7 +568,7 @@ void MainWindow::saveLog()
 {
   QString fn = QFileDialog::getSaveFileName(this, tr("Save log file"), 
         m_workingDir->text()+
-        QString::fromAscii("/doxygen_log.txt"));
+        QString::fromLatin1("/doxygen_log.txt"));
   if (!fn.isEmpty())
   {
     QFile f(fn);
@@ -589,11 +608,11 @@ void MainWindow::updateTitle()
   QString title = tr("Doxygen GUI frontend");
   if (m_modified)
   {
-    title+=QString::fromAscii(" +");
+    title+=QString::fromLatin1(" +");
   }
   if (!m_fileName.isEmpty())
   {
-    title+=QString::fromAscii(" (")+m_fileName+QString::fromAscii(")");
+    title+=QString::fromLatin1(" (")+m_fileName+QString::fromLatin1(")");
   }
   setWindowTitle(title);
 }
index 3a03c69..66a0955 100644 (file)
@@ -1,5 +1,3 @@
-#include <QtGui>
-#include <QtXml>
 #include "expert.h"
 #include "inputbool.h"
 #include "inputstring.h"
@@ -11,7 +9,22 @@
 #include "configdoc.h"
 #include "settings.h"
 
-#define SA(x) QString::fromAscii(x)
+#include <QTreeWidget>
+#include <QStackedWidget>
+#include <QTextBrowser>
+#include <QSplitter>
+#include <QGridLayout>
+#include <QPushButton>
+#include <QScrollArea>
+#include <QFile>
+#include <QMessageBox>
+#include <QSettings>
+#include <QTextStream>
+#include <QTextCodec>
+#include <QFileInfo>
+
+#define SA(x) QString::fromLatin1(x)
+
 
 static QString convertToComment(const QString &s)
 {
@@ -48,7 +61,7 @@ Expert::Expert()
   m_treeWidget = new QTreeWidget;
   m_treeWidget->setColumnCount(1);
   m_topicStack = new QStackedWidget;
-  m_inShowHelp = FALSE;
+  m_inShowHelp = false;
 
   QFile file(SA(":/config.xml"));
   QString err;
@@ -69,7 +82,7 @@ Expert::Expert()
   createTopics(m_rootElement);
   m_helper = new QTextBrowser;
   m_helper->setReadOnly(true);
-  m_helper->setOpenExternalLinks(TRUE);
+  m_helper->setOpenExternalLinks(true);
   m_splitter = new QSplitter(Qt::Vertical);
   m_splitter->addWidget(m_treeWidget);
   m_splitter->addWidget(m_helper);
@@ -471,7 +484,7 @@ QWidget *Expert::createTopicWidget(QDomElement &elem)
   while (!child.isNull())
   {
     QString setting = child.attribute(SA("setting"));
-    if (setting.isEmpty() || IS_SUPPORTED(setting.toAscii()))
+    if (setting.isEmpty() || IS_SUPPORTED(setting.toLatin1()))
     {
       QString type = child.attribute(SA("type"));
       QString docs = getDocsForNode(child);
@@ -634,7 +647,7 @@ QWidget *Expert::createTopicWidget(QDomElement &elem)
     QString dependsOn = child.attribute(SA("depends"));
     QString id        = child.attribute(SA("id"));
     if (!dependsOn.isEmpty() && 
-        (setting.isEmpty() || IS_SUPPORTED(setting.toAscii())))
+        (setting.isEmpty() || IS_SUPPORTED(setting.toLatin1())))
     {
        Input *parentOption = m_options[dependsOn];
        if (parentOption==0)
@@ -740,7 +753,7 @@ void Expert::saveTopic(QTextStream &t,QDomElement &elem,QTextCodec *codec,
     QString setting = childElem.attribute(SA("setting"));
     QString type = childElem.attribute(SA("type"));
     QString name = childElem.attribute(SA("id"));
-    if (setting.isEmpty() || IS_SUPPORTED(setting.toAscii()))
+    if (setting.isEmpty() || IS_SUPPORTED(setting.toLatin1()))
     {
       QHash<QString,Input*>::const_iterator i = m_options.find(name);
       if (i!=m_options.end())
@@ -774,10 +787,10 @@ bool Expert::writeConfig(QTextStream &t,bool brief)
   }
 
   QTextCodec *codec = 0;
-  Input *option = m_options[QString::fromAscii("DOXYFILE_ENCODING")];
+  Input *option = m_options[QString::fromLatin1("DOXYFILE_ENCODING")];
   if (option)
   {
-    codec = QTextCodec::codecForName(option->value().toString().toAscii());
+    codec = QTextCodec::codecForName(option->value().toString().toLatin1());
     if (codec==0) // fallback: use UTF-8
     {
       codec = QTextCodec::codecForName("UTF-8");
@@ -809,16 +822,16 @@ void Expert::showHelp(Input *option)
 {
   if (!m_inShowHelp)
   {
-    m_inShowHelp = TRUE;
+    m_inShowHelp = true;
     m_helper->setText(
-        QString::fromAscii("<qt><b>")+option->id()+
-        QString::fromAscii("</b><br>")+
-        QString::fromAscii("<br/>")+
+        QString::fromLatin1("<qt><b>")+option->id()+
+        QString::fromLatin1("</b><br>")+
+        QString::fromLatin1("<br/>")+
         option->docs().
-        replace(QChar::fromAscii('\n'),QChar::fromAscii(' '))+
-        QString::fromAscii("</qt>")
+        replace(QChar::fromLatin1('\n'),QChar::fromLatin1(' '))+
+        QString::fromLatin1("</qt>")
         );
-    m_inShowHelp = FALSE;
+    m_inShowHelp = false;
   }
 }
 
@@ -862,7 +875,7 @@ void Expert::resetToDefaults()
 static bool stringVariantToBool(const QVariant &v)
 {
   QString s = v.toString().toLower();
-  return s==QString::fromAscii("yes") || s==QString::fromAscii("true") || s==QString::fromAscii("1");
+  return s==QString::fromLatin1("yes") || s==QString::fromLatin1("true") || s==QString::fromLatin1("1");
 } 
 
 static bool getBoolOption(
@@ -884,7 +897,7 @@ static QString getStringOption(
 
 bool Expert::htmlOutputPresent(const QString &workingDir) const
 {
-  bool generateHtml = getBoolOption(m_options,QString::fromAscii("GENERATE_HTML"));
+  bool generateHtml = getBoolOption(m_options,QString::fromLatin1("GENERATE_HTML"));
   if (!generateHtml || workingDir.isEmpty()) return false;
   QString indexFile = getHtmlOutputIndex(workingDir);
   QFileInfo fi(indexFile);
@@ -893,8 +906,8 @@ bool Expert::htmlOutputPresent(const QString &workingDir) const
 
 QString Expert::getHtmlOutputIndex(const QString &workingDir) const
 {
-  QString outputDir = getStringOption(m_options,QString::fromAscii("OUTPUT_DIRECTORY"));
-  QString htmlOutputDir = getStringOption(m_options,QString::fromAscii("HTML_OUTPUT"));
+  QString outputDir = getStringOption(m_options,QString::fromLatin1("OUTPUT_DIRECTORY"));
+  QString htmlOutputDir = getStringOption(m_options,QString::fromLatin1("HTML_OUTPUT"));
   //printf("outputDir=%s\n",qPrintable(outputDir));
   //printf("htmlOutputDir=%s\n",qPrintable(htmlOutputDir));
   QString indexFile = workingDir;
@@ -904,7 +917,7 @@ QString Expert::getHtmlOutputIndex(const QString &workingDir) const
   }
   else // append
   { 
-    indexFile += QString::fromAscii("/")+outputDir;
+    indexFile += QString::fromLatin1("/")+outputDir;
   }
   if (QFileInfo(htmlOutputDir).isAbsolute()) // override
   {
@@ -912,27 +925,27 @@ QString Expert::getHtmlOutputIndex(const QString &workingDir) const
   }
   else // append
   {
-    indexFile += QString::fromAscii("/")+htmlOutputDir;
+    indexFile += QString::fromLatin1("/")+htmlOutputDir;
   }
-  indexFile+=QString::fromAscii("/index.html");
+  indexFile+=QString::fromLatin1("/index.html");
   return indexFile;
 }
 
 bool Expert::pdfOutputPresent(const QString &workingDir) const
 {
-  bool generateLatex = getBoolOption(m_options,QString::fromAscii("GENERATE_LATEX"));
-  bool pdfLatex = getBoolOption(m_options,QString::fromAscii("USE_PDFLATEX"));
+  bool generateLatex = getBoolOption(m_options,QString::fromLatin1("GENERATE_LATEX"));
+  bool pdfLatex = getBoolOption(m_options,QString::fromLatin1("USE_PDFLATEX"));
   if (!generateLatex || !pdfLatex) return false;
-  QString latexOutput = getStringOption(m_options,QString::fromAscii("LATEX_OUTPUT"));
+  QString latexOutput = getStringOption(m_options,QString::fromLatin1("LATEX_OUTPUT"));
   QString indexFile;
   if (QFileInfo(latexOutput).isAbsolute())
   {
-    indexFile = latexOutput+QString::fromAscii("/refman.pdf");
+    indexFile = latexOutput+QString::fromLatin1("/refman.pdf");
   }
   else
   {
-    indexFile = workingDir+QString::fromAscii("/")+
-                latexOutput+QString::fromAscii("/refman.pdf");
+    indexFile = workingDir+QString::fromLatin1("/")+
+                latexOutput+QString::fromLatin1("/refman.pdf");
   }
   QFileInfo fi(indexFile);
   return fi.exists() && fi.isFile();
old mode 100644 (file)
new mode 100755 (executable)
index 30a7090..3af7eb7
Binary files a/addon/doxywizard/images/add.png and b/addon/doxywizard/images/add.png differ
old mode 100644 (file)
new mode 100755 (executable)
index ceb6a60..c2e3bc8
Binary files a/addon/doxywizard/images/del.png and b/addon/doxywizard/images/del.png differ
old mode 100644 (file)
new mode 100755 (executable)
index e204f67..14f2c95
Binary files a/addon/doxywizard/images/file.png and b/addon/doxywizard/images/file.png differ
old mode 100644 (file)
new mode 100755 (executable)
index 2e420e0..c91c582
Binary files a/addon/doxywizard/images/folder.png and b/addon/doxywizard/images/folder.png differ
old mode 100644 (file)
new mode 100755 (executable)
index fd6d565..413735b
Binary files a/addon/doxywizard/images/refresh.png and b/addon/doxywizard/images/refresh.png differ
old mode 100644 (file)
new mode 100755 (executable)
index bf7be83..4c7dd9d
Binary files a/addon/doxywizard/images/tunecolor.png and b/addon/doxywizard/images/tunecolor.png differ
index ec2035a..ef71dd9 100644 (file)
 
 #include "inputbool.h"
 #include "helplabel.h"
-#include <QtGui>
+
+#include <QCheckBox>
+#include <QTextStream>
+#include <QTextCodec>
+#include <QGridLayout>
 
 InputBool::InputBool( QGridLayout *layout, int &row, 
                       const QString &id, bool checked,
@@ -73,11 +77,11 @@ void InputBool::updateDefault()
 {
   if (m_state==m_default || !m_lab->isEnabled())
   {
-    m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
+    m_lab->setText(QString::fromLatin1("<qt>")+m_id+QString::fromLatin1("</qt"));
   }
   else
   {
-    m_lab->setText(QString::fromAscii("<qt><font color='red'>")+m_id+QString::fromAscii("</font></qt>"));
+    m_lab->setText(QString::fromLatin1("<qt><font color='red'>")+m_id+QString::fromLatin1("</font></qt>"));
   }
 }
 
@@ -89,9 +93,9 @@ QVariant &InputBool::value()
 void InputBool::update()
 {
   QString v = m_value.toString().toLower();
-  m_state = (v==QString::fromAscii("yes")  || 
-             v==QString::fromAscii("true") || 
-             v==QString::fromAscii("1"));
+  m_state = (v==QString::fromLatin1("yes")  || 
+             v==QString::fromLatin1("true") || 
+             v==QString::fromLatin1("1"));
   m_cb->setChecked( m_state );
   updateDefault();
   updateDependencies();
@@ -105,8 +109,8 @@ void InputBool::reset()
 void InputBool::writeValue(QTextStream &t,QTextCodec *codec)
 {
   if (m_state) 
-    t << codec->fromUnicode(QString::fromAscii("YES")); 
+    t << codec->fromUnicode(QString::fromLatin1("YES")); 
   else 
-    t << codec->fromUnicode(QString::fromAscii("NO"));
+    t << codec->fromUnicode(QString::fromLatin1("NO"));
 }
 
index 8fa46e8..a57e7f4 100644 (file)
 #include "inputint.h"
 #include "helplabel.h"
 
-#include <QtGui>
+#include <QSpinBox>
+#include <QGridLayout>
+#include <QWheelEvent>
+#include <QTextStream>
 
 class NoWheelSpinBox : public QSpinBox
 {
@@ -74,11 +77,11 @@ void InputInt::updateDefault()
   {
     if (m_val==m_default || !m_lab->isEnabled())
     {
-      m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
+      m_lab->setText(QString::fromLatin1("<qt>")+m_id+QString::fromLatin1("</qt"));
     }
     else
     {
-      m_lab->setText(QString::fromAscii("<qt><font color='red'>")+m_id+QString::fromAscii("</font></qt>"));
+      m_lab->setText(QString::fromLatin1("<qt><font color='red'>")+m_id+QString::fromLatin1("</font></qt>"));
     }
     emit changed(); 
   }
index 75de0b5..7fb6ec3 100644 (file)
 #include "doxywizard.h"
 #include "config.h"
 
-#include <QtGui>
+#include <QComboBox>
+#include <QLineEdit>
+#include <QGridLayout>
+#include <QWheelEvent>
+#include <QToolBar>
+#include <QFileInfo>
+#include <QFileDialog>
+#include <QTextCodec>
 
 class NoWheelComboBox : public QComboBox
 {
@@ -34,7 +41,7 @@ InputString::InputString( QGridLayout *layout,int &row,
                           StringMode m, const QString &docs,
                           const QString &absPath )
   : m_default(s), m_sm(m), m_index(0), m_docs(docs), m_id(id),
-    m_absPath(absPath==QString::fromAscii("1"))
+    m_absPath(absPath==QString::fromLatin1("1"))
 {
   m_lab = new HelpLabel(id);
   if (m==StringFixed)
@@ -61,7 +68,7 @@ InputString::InputString( QGridLayout *layout,int &row,
       m_br->setIconSize(QSize(24,24));
       if (m==StringFile || m==StringImage) 
       {
-        QAction *file = m_br->addAction(QIcon(QString::fromAscii(":/images/file.png")),QString(),this,SLOT(browse()));
+        QAction *file = m_br->addAction(QIcon(QString::fromLatin1(":/images/file.png")),QString(),this,SLOT(browse()));
         file->setToolTip(tr("Browse to a file"));
         layout->addWidget( m_br,row,2 );
         if (m==StringImage) 
@@ -75,7 +82,7 @@ InputString::InputString( QGridLayout *layout,int &row,
       }
       else 
       {
-        QAction *dir = m_br->addAction(QIcon(QString::fromAscii(":/images/folder.png")),QString(),this,SLOT(browse()));
+        QAction *dir = m_br->addAction(QIcon(QString::fromLatin1(":/images/folder.png")),QString(),this,SLOT(browse()));
         dir->setToolTip(tr("Browse to a folder"));
         layout->addWidget( m_br,row,2 );
       }
@@ -94,7 +101,7 @@ InputString::InputString( QGridLayout *layout,int &row,
                       this,   SLOT(setValue(const QString&)) );
   if (m_com) connect( m_com,  SIGNAL(activated(const QString &)), 
                       this,   SLOT(setValue(const QString &)) );
-  m_str = s+QChar::fromAscii('!'); // force update
+  m_str = s+QChar::fromLatin1('!'); // force update
   setValue(s);
   connect( m_lab, SIGNAL(enter()), SLOT(help()) );
   connect( m_lab, SIGNAL(reset()), SLOT(reset()) );
@@ -125,11 +132,11 @@ void InputString::updateDefault()
   {
     if (m_str==m_default || !m_lab->isEnabled())
     {
-      m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
+      m_lab->setText(QString::fromLatin1("<qt>")+m_id+QString::fromLatin1("</qt"));
     }
     else
     {
-      m_lab->setText(QString::fromAscii("<qt><font color='red'>")+m_id+QString::fromAscii("</font></qt>"));
+      m_lab->setText(QString::fromLatin1("<qt><font color='red'>")+m_id+QString::fromLatin1("</font></qt>"));
     }
     if (m_im)
     {
@@ -142,7 +149,7 @@ void InputString::updateDefault()
         QFile Fout(m_str);
         if(!Fout.exists()) 
         {
-          m_im->setText(tr("Sorry, cannot find file(")+m_str+QString::fromAscii(");"));
+          m_im->setText(tr("Sorry, cannot find file(")+m_str+QString::fromLatin1(");"));
         }
         else
         {
@@ -153,7 +160,7 @@ void InputString::updateDefault()
           }
           else
           {
-            m_im->setText(tr("Sorry, no preview available (")+m_str+QString::fromAscii(");"));
+            m_im->setText(tr("Sorry, no preview available (")+m_str+QString::fromLatin1(");"));
           }
         }
       }
index 777af6a..660ce40 100644 (file)
 #include "doxywizard.h"
 #include "config.h"
 
-#include <QtGui>
+#include <QToolBar>
+#include <QGridLayout>
+#include <QLineEdit>
+#include <QListWidget>
+#include <QFileInfo>
+#include <QFileDialog>
+#include <QTextStream>
+#include <QTextCodec>
 
 InputStrList::InputStrList( QGridLayout *layout,int &row,
                             const QString & id, 
@@ -32,13 +39,13 @@ InputStrList::InputStrList( QGridLayout *layout,int &row,
 
   QToolBar *toolBar = new QToolBar;
   toolBar->setIconSize(QSize(24,24));
-  m_add = toolBar->addAction(QIcon(QString::fromAscii(":/images/add.png")),QString(),
+  m_add = toolBar->addAction(QIcon(QString::fromLatin1(":/images/add.png")),QString(),
                              this,SLOT(addString()));
   m_add->setToolTip(tr("Add item"));
-  m_del = toolBar->addAction(QIcon(QString::fromAscii(":/images/del.png")),QString(),
+  m_del = toolBar->addAction(QIcon(QString::fromLatin1(":/images/del.png")),QString(),
                              this,SLOT(delString()));
   m_del->setToolTip(tr("Delete selected item"));
-  m_upd = toolBar->addAction(QIcon(QString::fromAscii(":/images/refresh.png")),QString(),
+  m_upd = toolBar->addAction(QIcon(QString::fromLatin1(":/images/refresh.png")),QString(),
                              this,SLOT(updateString()));
   m_upd->setToolTip(tr("Update selected item"));
 
@@ -52,13 +59,13 @@ InputStrList::InputStrList( QGridLayout *layout,int &row,
   {
     if (lm&ListFile)
     {
-      m_brFile = toolBar->addAction(QIcon(QString::fromAscii(":/images/file.png")),QString(),
+      m_brFile = toolBar->addAction(QIcon(QString::fromLatin1(":/images/file.png")),QString(),
                                     this,SLOT(browseFiles()));
       m_brFile->setToolTip(tr("Browse to a file"));
     } 
     if (lm&ListDir)
     {
-      m_brDir = toolBar->addAction(QIcon(QString::fromAscii(":/images/folder.png")),QString(),
+      m_brDir = toolBar->addAction(QIcon(QString::fromLatin1(":/images/folder.png")),QString(),
                                    this,SLOT(browseDir()));
       m_brDir->setToolTip(tr("Browse to a folder"));
     }
@@ -188,7 +195,7 @@ void InputStrList::browseDir()
     }
     if (dirName.isEmpty())
     {
-      dirName=QString::fromAscii(".");
+      dirName=QString::fromLatin1(".");
     }
     m_lb->addItem(dirName);
     m_strList.append(dirName);
@@ -225,11 +232,11 @@ void InputStrList::updateDefault()
 {
   if (m_strList==m_default || !m_lab->isEnabled())
   {
-    m_lab->setText(QString::fromAscii("<qt>")+m_id+QString::fromAscii("</qt"));
+    m_lab->setText(QString::fromLatin1("<qt>")+m_id+QString::fromLatin1("</qt"));
   }
   else
   {
-    m_lab->setText(QString::fromAscii("<qt><font color='red'>")+m_id+QString::fromAscii("</font></qt>"));
+    m_lab->setText(QString::fromLatin1("<qt><font color='red'>")+m_id+QString::fromLatin1("</font></qt>"));
   }
 }
 
@@ -240,7 +247,7 @@ void InputStrList::reset()
 
 void InputStrList::writeValue(QTextStream &t,QTextCodec *codec)
 {
-  bool first=TRUE;
+  bool first=true;
   foreach (QString s, m_strList) 
   {
     if (!first) 
@@ -248,7 +255,7 @@ void InputStrList::writeValue(QTextStream &t,QTextCodec *codec)
       t << " \\" << endl;
       t << "                         ";
     }
-    first=FALSE;
+    first=false;
     writeStringValue(t,codec,s);
   }
 }
index a8b7f94..b320aaa 100644 (file)
@@ -3,46 +3,64 @@
 #include "doxywizard.h"
 
 #include <math.h>
-#include <QtGui>
+
+#include <QGridLayout>
+#include <QImage>
+#include <QLabel>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QPixmap>
+#include <QPainter>
+#include <QMouseEvent>
+#include <QLineEdit>
+#include <QCheckBox>
+#include <QFileInfo>
+#include <QFileDialog>
+#include <QButtonGroup>
+#include <QGroupBox>
+#include <QRadioButton>
+#include <QTreeWidget>
+#include <QStackedWidget>
+#include <qdrawutil.h>
 
 // options configurable via the wizard
-#define STR_PROJECT_NAME          QString::fromAscii("PROJECT_NAME")
-#define STR_PROJECT_LOGO          QString::fromAscii("PROJECT_LOGO")
-#define STR_PROJECT_BRIEF         QString::fromAscii("PROJECT_BRIEF")
-#define STR_INPUT                 QString::fromAscii("INPUT")
-#define STR_OUTPUT_DIRECTORY      QString::fromAscii("OUTPUT_DIRECTORY")
-#define STR_PROJECT_NUMBER        QString::fromAscii("PROJECT_NUMBER")
-#define STR_RECURSIVE             QString::fromAscii("RECURSIVE")
-#define STR_OPTIMIZE_OUTPUT_FOR_C QString::fromAscii("OPTIMIZE_OUTPUT_FOR_C")
-#define STR_OPTIMIZE_OUTPUT_JAVA  QString::fromAscii("OPTIMIZE_OUTPUT_JAVA")
-#define STR_OPTIMIZE_FOR_FORTRAN  QString::fromAscii("OPTIMIZE_FOR_FORTRAN")
-#define STR_OPTIMIZE_OUTPUT_VHDL  QString::fromAscii("OPTIMIZE_OUTPUT_VHDL")
-#define STR_CPP_CLI_SUPPORT       QString::fromAscii("CPP_CLI_SUPPORT")
-#define STR_HIDE_SCOPE_NAMES      QString::fromAscii("HIDE_SCOPE_NAMES")
-#define STR_EXTRACT_ALL           QString::fromAscii("EXTRACT_ALL")
-#define STR_SOURCE_BROWSER        QString::fromAscii("SOURCE_BROWSER")
-#define STR_GENERATE_HTML         QString::fromAscii("GENERATE_HTML")
-#define STR_GENERATE_LATEX        QString::fromAscii("GENERATE_LATEX")
-#define STR_GENERATE_MAN          QString::fromAscii("GENERATE_MAN")
-#define STR_GENERATE_RTF          QString::fromAscii("GENERATE_RTF")
-#define STR_GENERATE_XML          QString::fromAscii("GENERATE_XML")
-#define STR_GENERATE_HTMLHELP     QString::fromAscii("GENERATE_HTMLHELP")
-#define STR_GENERATE_TREEVIEW     QString::fromAscii("GENERATE_TREEVIEW")
-#define STR_USE_PDFLATEX          QString::fromAscii("USE_PDFLATEX")
-#define STR_PDF_HYPERLINKS        QString::fromAscii("PDF_HYPERLINKS")
-#define STR_SEARCHENGINE          QString::fromAscii("SEARCHENGINE")
-#define STR_HAVE_DOT              QString::fromAscii("HAVE_DOT")
-#define STR_CLASS_DIAGRAMS        QString::fromAscii("CLASS_DIAGRAMS")
-#define STR_CLASS_GRAPH           QString::fromAscii("CLASS_GRAPH")
-#define STR_COLLABORATION_GRAPH   QString::fromAscii("COLLABORATION_GRAPH")
-#define STR_GRAPHICAL_HIERARCHY   QString::fromAscii("GRAPHICAL_HIERARCHY")
-#define STR_INCLUDE_GRAPH         QString::fromAscii("INCLUDE_GRAPH")
-#define STR_INCLUDED_BY_GRAPH     QString::fromAscii("INCLUDED_BY_GRAPH")
-#define STR_CALL_GRAPH            QString::fromAscii("CALL_GRAPH")
-#define STR_CALLER_GRAPH          QString::fromAscii("CALLER_GRAPH")
-#define STR_HTML_COLORSTYLE_HUE   QString::fromAscii("HTML_COLORSTYLE_HUE")
-#define STR_HTML_COLORSTYLE_SAT   QString::fromAscii("HTML_COLORSTYLE_SAT")
-#define STR_HTML_COLORSTYLE_GAMMA QString::fromAscii("HTML_COLORSTYLE_GAMMA")
+#define STR_PROJECT_NAME          QString::fromLatin1("PROJECT_NAME")
+#define STR_PROJECT_LOGO          QString::fromLatin1("PROJECT_LOGO")
+#define STR_PROJECT_BRIEF         QString::fromLatin1("PROJECT_BRIEF")
+#define STR_INPUT                 QString::fromLatin1("INPUT")
+#define STR_OUTPUT_DIRECTORY      QString::fromLatin1("OUTPUT_DIRECTORY")
+#define STR_PROJECT_NUMBER        QString::fromLatin1("PROJECT_NUMBER")
+#define STR_RECURSIVE             QString::fromLatin1("RECURSIVE")
+#define STR_OPTIMIZE_OUTPUT_FOR_C QString::fromLatin1("OPTIMIZE_OUTPUT_FOR_C")
+#define STR_OPTIMIZE_OUTPUT_JAVA  QString::fromLatin1("OPTIMIZE_OUTPUT_JAVA")
+#define STR_OPTIMIZE_FOR_FORTRAN  QString::fromLatin1("OPTIMIZE_FOR_FORTRAN")
+#define STR_OPTIMIZE_OUTPUT_VHDL  QString::fromLatin1("OPTIMIZE_OUTPUT_VHDL")
+#define STR_CPP_CLI_SUPPORT       QString::fromLatin1("CPP_CLI_SUPPORT")
+#define STR_HIDE_SCOPE_NAMES      QString::fromLatin1("HIDE_SCOPE_NAMES")
+#define STR_EXTRACT_ALL           QString::fromLatin1("EXTRACT_ALL")
+#define STR_SOURCE_BROWSER        QString::fromLatin1("SOURCE_BROWSER")
+#define STR_GENERATE_HTML         QString::fromLatin1("GENERATE_HTML")
+#define STR_GENERATE_LATEX        QString::fromLatin1("GENERATE_LATEX")
+#define STR_GENERATE_MAN          QString::fromLatin1("GENERATE_MAN")
+#define STR_GENERATE_RTF          QString::fromLatin1("GENERATE_RTF")
+#define STR_GENERATE_XML          QString::fromLatin1("GENERATE_XML")
+#define STR_GENERATE_HTMLHELP     QString::fromLatin1("GENERATE_HTMLHELP")
+#define STR_GENERATE_TREEVIEW     QString::fromLatin1("GENERATE_TREEVIEW")
+#define STR_USE_PDFLATEX          QString::fromLatin1("USE_PDFLATEX")
+#define STR_PDF_HYPERLINKS        QString::fromLatin1("PDF_HYPERLINKS")
+#define STR_SEARCHENGINE          QString::fromLatin1("SEARCHENGINE")
+#define STR_HAVE_DOT              QString::fromLatin1("HAVE_DOT")
+#define STR_CLASS_DIAGRAMS        QString::fromLatin1("CLASS_DIAGRAMS")
+#define STR_CLASS_GRAPH           QString::fromLatin1("CLASS_GRAPH")
+#define STR_COLLABORATION_GRAPH   QString::fromLatin1("COLLABORATION_GRAPH")
+#define STR_GRAPHICAL_HIERARCHY   QString::fromLatin1("GRAPHICAL_HIERARCHY")
+#define STR_INCLUDE_GRAPH         QString::fromLatin1("INCLUDE_GRAPH")
+#define STR_INCLUDED_BY_GRAPH     QString::fromLatin1("INCLUDED_BY_GRAPH")
+#define STR_CALL_GRAPH            QString::fromLatin1("CALL_GRAPH")
+#define STR_CALLER_GRAPH          QString::fromLatin1("CALLER_GRAPH")
+#define STR_HTML_COLORSTYLE_HUE   QString::fromLatin1("HTML_COLORSTYLE_HUE")
+#define STR_HTML_COLORSTYLE_SAT   QString::fromLatin1("HTML_COLORSTYLE_SAT")
+#define STR_HTML_COLORSTYLE_GAMMA QString::fromLatin1("HTML_COLORSTYLE_GAMMA")
 
 static bool g_optimizeMapping[6][6] = 
 {
@@ -76,7 +94,7 @@ static QString g_optimizeOptionNames[6] =
 static bool stringVariantToBool(const QVariant &v)
 {
   QString s = v.toString().toLower();
-  return s==QString::fromAscii("yes") || s==QString::fromAscii("true") || s==QString::fromAscii("1");
+  return s==QString::fromLatin1("yes") || s==QString::fromLatin1("true") || s==QString::fromLatin1("1");
 } 
 
 static bool getBoolOption(
@@ -111,7 +129,7 @@ static void updateBoolOption(
   bool bOld = stringVariantToBool(option->value());
   if (bOld!=bNew)
   {
-    option->value()=QString::fromAscii(bNew ? "true" : "false");
+    option->value()=QString::fromLatin1(bNew ? "true" : "false");
     option->update();
   }
 }
@@ -124,7 +142,7 @@ static void updateIntOption(
   int iOld = option->value().toInt();
   if (iOld!=iNew)
   {
-    option->value()=QString::fromAscii("%1").arg(iNew);
+    option->value()=QString::fromLatin1("%1").arg(iNew);
     option->update();
   }
 }
@@ -148,7 +166,7 @@ TuneColorDialog::TuneColorDialog(int hue,int sat,int gamma,QWidget *parent) : QD
 {
    setWindowTitle(tr("Tune the color of the HTML output"));
    QGridLayout *layout = new QGridLayout(this);
-   m_image = new QImage(QString::fromAscii(":/images/tunecolor.png"));
+   m_image = new QImage(QString::fromLatin1(":/images/tunecolor.png"));
    m_imageLab = new QLabel;
    updateImage(hue,sat,gamma);
    layout->addWidget(new QLabel(tr("Example output: use the sliders on the right to adjust the color")),0,0);
@@ -519,7 +537,7 @@ Step1::Step1(Wizard *wizard,const QHash<QString,Input*> &modelData) : m_wizard(w
 
   m_recursive = new QCheckBox(this);
   m_recursive->setText(tr("Scan recursively"));
-  m_recursive->setChecked(TRUE);
+  m_recursive->setChecked(true);
   layout->addWidget(m_recursive);
 
   //---------------------------------------------------
@@ -574,7 +592,7 @@ void Step1::selectProjectIcon()
     QFile Fout(iconName);
     if(!Fout.exists()) 
     {
-      m_projIconLab->setText(tr("Sorry, cannot find file(")+iconName+QString::fromAscii(");"));
+      m_projIconLab->setText(tr("Sorry, cannot find file(")+iconName+QString::fromLatin1(");"));
     }
     else
     {
@@ -585,7 +603,7 @@ void Step1::selectProjectIcon()
       }
       else
       {
-        m_projIconLab->setText(tr("Sorry, no preview available (")+iconName+QString::fromAscii(");"));
+        m_projIconLab->setText(tr("Sorry, no preview available (")+iconName+QString::fromLatin1(");"));
       }
     }
   }
@@ -604,7 +622,7 @@ void Step1::selectSourceDir()
   }
   if (dirName.isEmpty())
   {
-    dirName=QString::fromAscii(".");
+    dirName=QString::fromLatin1(".");
   }
   m_sourceDir->setText(dirName);
 }
@@ -621,7 +639,7 @@ void Step1::selectDestinationDir()
   }
   if (dirName.isEmpty())
   {
-    dirName=QString::fromAscii(".");
+    dirName=QString::fromLatin1(".");
   }
   m_destDir->setText(dirName);
 }
@@ -683,7 +701,7 @@ void Step1::init()
     QFile Fout(iconName);
     if(!Fout.exists()) 
     {
-      m_projIconLab->setText(tr("Sorry, cannot find file(")+iconName+QString::fromAscii(");"));
+      m_projIconLab->setText(tr("Sorry, cannot find file(")+iconName+QString::fromLatin1(");"));
     }
     else
     {
@@ -694,7 +712,7 @@ void Step1::init()
       }
       else
       {
-        m_projIconLab->setText(tr("Sorry, no preview available (")+iconName+QString::fromAscii(");"));
+        m_projIconLab->setText(tr("Sorry, no preview available (")+iconName+QString::fromLatin1(");"));
       }
     }
   }
@@ -1220,7 +1238,7 @@ Wizard::Wizard(const QHash<QString,Input*> &modelData, QWidget *parent) :
 {
   m_treeWidget = new QTreeWidget;
   m_treeWidget->setColumnCount(1);
-  m_treeWidget->setHeaderLabels(QStringList() << QString::fromAscii("Topics"));
+  m_treeWidget->setHeaderLabels(QStringList() << QString::fromLatin1("Topics"));
   QList<QTreeWidgetItem*> items;
   items.append(new QTreeWidgetItem((QTreeWidget*)0,QStringList(tr("Project"))));
   items.append(new QTreeWidgetItem((QTreeWidget*)0,QStringList(tr("Mode"))));
diff --git a/cmake/packaging.cmake b/cmake/packaging.cmake
new file mode 100644 (file)
index 0000000..0798b83
--- /dev/null
@@ -0,0 +1,112 @@
+##### set CPack properties #####
+#
+# Good doc/tutorial/example:
+# - http://www.cmake.org/Wiki/CMake:CPackPackageGenerators
+# - http://www.cmake.org/cmake/help/v3.3/module/CPack.html
+# - http://sourceforge.net/p/klusters/klusters/ci/master/tree/CMakeLists.txt
+#
+# This cmake script should generate same packages (deb,rpm) as:
+# - http://mirror.debian.ikoula.com/debian/pool/main/d/doxygen
+# - http://archive.ubuntu.com/ubuntu/pool/main/d/doxygen (http://old-releases.ubuntu.com/ubuntu/pool/main/d/doxygen)
+# - http://rpmfind.net/linux/rpm2html/search.php?query=doxygen
+
+set(CPACK_STRIP_FILES      ON)
+set(CPACK_PACKAGE_NAME     ${PROJECT_NAME} )
+set(CPACK_PACKAGE_VERSION  ${VERSION})
+set(CPACK_PACKAGE_CONTACT  "Dimitri van Heesch")
+set(CPACK_PACKAGE_VENDOR   "Dimitri van Heesch")
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Generate documentation from C, C++, Java, Python and other languages")
+set(CPACK_PACKAGE_DESCRIPTION "Doxygen is the de facto standard tool for generating documentation from annotated C++ sources.
+ But many other popular programming languages are supported:
+ C, Objective-C, C#, PHP, Java, Python, Fortran, VHDL, Tcl, D (some extent) and IDL (Corba, Microsoft, and UNO/OpenOffice flavors).
+ .
+ Three usages:
+ .
+    1. Generate documentation from annotated source files to various format:
+       - On-line documentation (HTML)
+       - Off-line reference manual (LaTeX, RTF, PostScript, hyperlinked PDF, compressed HTML, Unix man pages)
+ .
+    2. Extract the code structure from undocumented source files.
+       Also generate include dependency graphs, inheritance diagrams, and collaboration diagrams.
+       Useful to quickly understand code organization in large source distributions.
+ .
+    3. Create normal documentation (as the doxygen user manual and web-site http://doxygen.org/)
+ .
+ Install the doxygen-latex package to build LaTeX based documents.
+ Install the libclang1 package to use the 'clang assisted parsing'.")
+
+set(CPACK_RESOURCE_FILE_LICENSE     ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE)
+set(CPACK_RESOURCE_FILE_README      ${CMAKE_CURRENT_SOURCE_DIR}/README.md)
+
+# Variables specific to CPack RPM generator
+set(CPACK_RPM_PACKAGE_DESCRIPTION   ${CPACK_PACKAGE_DESCRIPTION})
+set(CPACK_RPM_PACKAGE_LICENSE       "GPLv2")
+set(CPACK_RPM_PACKAGE_GROUP         "Development/Tools")
+set(CPACK_RPM_PACKAGE_URL           "http://doxygen.org/")
+set(CPACK_RPM_PACKAGE_REQUIRES      "/sbin/chkconfig, /bin/mktemp, /bin/rm, /bin/mv, libstdc++ >= 2.96")
+set(CPACK_RPM_PACKAGE_SUGGESTS      "doxygen-latex, doxygen-doc, doxygen-gui, graphviz, libclang1")
+
+# Variables specific to CPack DEB generator
+set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION})
+set(CPACK_DEBIAN_PACKAGE_SECTION     "devel")
+set(CPACK_DEBIAN_PACKAGE_HOMEPAGE    "http://doxygen.org/")
+set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS   YES) #set(CPACK_DEBIAN_PACKAGE_DEPENDS    "libc6, libclang1-3.6, libgcc1, libsqlite3-0, libstdc++6, libxapian22")
+set(CPACK_DEBIAN_PACKAGE_SUGGESTS    "doxygen-latex, doxygen-doc, doxygen-gui, graphviz, libclang1")
+set(CPACK_DEBIAN_PACKAGE_CONFLICTS   "graphviz (<< 1.12)")
+set(CPACK_DEBIAN_PACKAGE_MAINTAINER  "Matthias Klose <doko@debian.org>")  # Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+
+# Variables specific to CPack NSIS generator
+set(CPACK_NSIS_MUI_ICON         ${CMAKE_CURRENT_SOURCE_DIR}/addon/doxywizard/doxywizard.ico)
+set(CPACK_NSIS_URL_INFO_ABOUT   "http://doxygen.org/")
+set(CPACK_NSIS_PACKAGE_NAME     ${PROJECT_NAME})
+
+# Variables specific to CPack DragNDrop generator
+set(CPACK_DMG_FORMAT            "UDBZ")         # UDRO=UDIF-Read-Only, UDZO=zlib, UDBZ=bzip2 -- See hdiutil
+set(CPACK_DMG_VOLUME_NAME       ${PROJECT_NAME})
+set(CPACK_DMG_BACKGROUND_IMAGE  ${CMAKE_CURRENT_SOURCE_DIR}/doc/doxygen_logo.eps)
+
+if(WIN32)
+    set(CPACK_GENERATOR "ZIP;NSIS")
+
+elseif(APPLE)
+    set(CPACK_GENERATOR       "ZIP;DragNDrop;PackageMaker;Bundle" )
+    set(CPACK_SYSTEM_NAME     "OSX" )
+
+elseif(UNIX)
+    # Determine distribution and release
+    execute_process(COMMAND lsb_release -si OUTPUT_VARIABLE distribution                   OUTPUT_STRIP_TRAILING_WHITESPACE)
+    execute_process(COMMAND lsb_release -sc OUTPUT_VARIABLE release                        OUTPUT_STRIP_TRAILING_WHITESPACE)
+    #xecute_process(COMMAND uname -i        OUTPUT_VARIABLE CPACK_RPM_PACKAGE_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE)
+    execute_process(COMMAND uname -m        OUTPUT_VARIABLE CPACK_RPM_PACKAGE_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+    if(distribution STREQUAL "Debian" OR distribution STREQUAL "Ubuntu")
+      set(CPACK_GENERATOR "DEB")
+      execute_process(COMMAND dpkg --print-architecture OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE)
+      set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE})
+
+    elseif(distribution MATCHES "RedHat.*")
+      # extract the major version from RedHat full version (e.g. 6.7 --> 6)
+      execute_process(COMMAND lsb_release -sr COMMAND sed s/[.].*//  OUTPUT_VARIABLE redhat_version_major OUTPUT_STRIP_TRAILING_WHITESPACE)
+      set(CPACK_GENERATOR "RPM")
+      set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_RPM_PACKAGE_RELEASE}.el${redhat_version_major}.${CPACK_RPM_PACKAGE_ARCHITECTURE})
+
+    elseif(distribution MATCHES "openSUSE.*")
+      set(CPACK_GENERATOR "RPM")
+      set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${release}.${CPACK_RPM_PACKAGE_ARCHITECTURE})
+
+    elseif(distribution STREQUAL "Fedora")
+      set(CPACK_GENERATOR "RPM")
+      set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}.fc${release}.${CPACK_RPM_PACKAGE_ARCHITECTURE})
+
+    elseif(distribution STREQUAL "Scientific")
+      set(CPACK_GENERATOR "RPM")
+      set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${release}.${CPACK_RPM_PACKAGE_ARCHITECTURE})
+
+    else()
+      set(CPACK_GENERATOR "RPM;TGZ;STGZ")
+      set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${release}.${CPACK_RPM_PACKAGE_ARCHITECTURE})
+    endif()
+
+else()
+    # other operating system (not Windows/Apple/Unix)
+endif()
diff --git a/cmake/run_translator.cmake b/cmake/run_translator.cmake
deleted file mode 100644 (file)
index 618bb82..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-include(${SOURCE}/cmake/version.cmake)
-find_program(PYTHON NAMES python)
-execute_process(
-    COMMAND ${PYTHON} ${CMAKE_SOURCE_DIR}/translator.py
-)
index 48de7b2..b59aa29 100644 (file)
@@ -1,2 +1,2 @@
-file (STRINGS "${SOURCE}/VERSION" VERSION)
+file (STRINGS "${TOP}/VERSION" VERSION)
 set(ENV{VERSION} "${VERSION}")
index d1d1371..751553b 100644 (file)
@@ -1,2 +1 @@
 *.bak
-mailto.txt
index af557d8..345e898 100644 (file)
+# vim:ts=4:sw=4:expandtab:autoindent:
+#
+# Copyright (C) 1997-2015 by Dimitri van 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.
+
 if (build_doc)
 
+include (${TOP}/cmake/version.cmake)
+string(TIMESTAMP DATE "%d-%m-%Y")
+
+find_package(PythonInterp REQUIRED)
 find_program(EPSTOPDF NAMES epstopdf )
-find_program(SED NAMES sed )
-find_program(MAKE NAMES make gmake nmake )
+find_program(PDFLATEX NAMES pdflatex )
+find_program(MAKEINDEX NAMES makeindex )
+
+if (doxygen_BINARY_DIR)
+    set(DOXYGEN_EXECUTABLE ${doxygen_BINARY_DIR}/bin/doxygen)
+else()
+    # when building only the doxygen_doc, from the doc/ directory, the
+    # doxygen project variables are unknown so look for doxygen in PATH
+    find_package(Doxygen)
+endif()
 
-file(GLOB DOC_FILES "*")
-file(GLOB LANG_FILES "${CMAKE_SOURCE_DIR}/src/translator_??.h")
+set(DOC_INSTALL_DIR "share/doc/packages/doxygen" CACHE STRING "Relative path where to install the documentation")
+set(DOC_FILES
+        arch.doc
+        archoverview.eps
+        archoverview.gif
+        autolink.doc
+        changelog.doc
+        commands.doc
+        custcmd.doc
+        customize.doc
+        diagrams.doc
+        docblocks.doc
+        Doxyfile
+        doxygen_manual.css
+        doxygen_usage.doc
+        doxywizard_expert.png
+        doxywizard.gif
+        doxywizard_main.png
+        doxywizard_menu.png
+        doxywizard_page1.png
+        doxywizard_page2.png
+        doxywizard_page3.png
+        doxywizard_page4.png
+        doxywizard_usage.doc
+        external.doc
+        extsearch.doc
+        extsearch_flow.dot
+        extsearch_flow.eps
+        extsearch_flow.png
+        faq.doc
+        features.doc
+        formulas.doc
+        tables.doc
+        grouping.doc
+        htmlcmds.doc
+        index.doc
+        index.hhp.txt
+        infoflow.eps
+        infoflow.fig
+        infoflow.png
+        install.doc
+        install_prefix
+        lists.doc
+        markdown.doc
+        output.doc
+        perlmod.doc
+        perlmod_tree.doc
+        preprocessing.doc
+        searching.doc
+        starting.doc
+        trouble.doc
+        xmlcmds.doc
+        language.tpl
+        maintainers.txt
+        translator.py
+)
+file(GLOB LANG_FILES "${TOP}/src/translator_??.h")
 
 file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/man)
 file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/src)
-file(COPY ${CMAKE_SOURCE_DIR}/src/translator.h DESTINATION ${PROJECT_BINARY_DIR}/src)
-file(COPY ${CMAKE_SOURCE_DIR}/src/translator_adapter.h DESTINATION ${PROJECT_BINARY_DIR}/src)
-file(COPY ${LANG_FILES} DESTINATION ${PROJECT_BINARY_DIR}/src)
-file(COPY ${CMAKE_SOURCE_DIR}/VERSION DESTINATION ${PROJECT_BINARY_DIR})
-
-# copy all doc files
-add_custom_target(copy_docs)
-foreach(doc_file ${DOC_FILES})
-  add_custom_command(TARGET copy_docs PRE_BUILD
-                     COMMAND ${CMAKE_COMMAND} -E
-                         copy ${doc_file} ${DOXYDOCS})
+file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/doc)
+
+file(COPY ${TOP}/VERSION                  DESTINATION ${PROJECT_BINARY_DIR}/)
+file(COPY ${TOP}/src/translator.h         DESTINATION ${PROJECT_BINARY_DIR}/src/)
+file(COPY ${TOP}/src/translator_adapter.h DESTINATION ${PROJECT_BINARY_DIR}/src/)
+file(COPY ${LANG_FILES}                   DESTINATION ${PROJECT_BINARY_DIR}/src/)
+
+foreach (f  ${DOC_FILES})
+add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/doc/${f}
+    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/doc/${f} ${PROJECT_BINARY_DIR}/doc/
+    DEPENDS ${CMAKE_SOURCE_DIR}/doc/${f}
+    )
+set_source_files_properties(${PROJECT_BINARY_DIR}/doc/${f} PROPERTIES GENERATED 1)
+list(APPEND OUT_DOC_FILES "${PROJECT_BINARY_DIR}/doc/${f}")
 endforeach()
 
-add_custom_target(docs
-       COMMENT "Generating documentation in ${DOXYDOCS}"
-       COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen
-       COMMAND ${CMAKE_COMMAND} -E remove_directory ../latex/refman.tex
-       COMMAND ${CMAKE_COMMAND} -E copy doxygen_logo.gif ../html
-       COMMAND ${CMAKE_COMMAND} -E copy doxygen_logo_low.gif ../html
-       COMMAND ${CMAKE_COMMAND} -E copy Makefile.latex ../latex/Makefile
-       COMMAND ${SED} -e "s/\$VERSION/${VERSION}/g" doxygen_manual.tex > ../latex/doxygen_manual.tex
-       COMMAND ${SED} -e "s/\$VERSION/${VERSION}/g" doxygen.sty > ../latex/doxygen.sty
-       COMMAND ${EPSTOPDF} doxygen_logo.eps --outfile=../latex/doxygen_logo.pdf
-        COMMAND ${MAKE} -C ../latex > latex_out.txt
-       DEPENDS doxygen copy_docs ${PROJECT_BINARY_DIR}/doc/language.doc config.doc examples
-                "${PROJECT_BINARY_DIR}/man/doxygen.1"
-                "${PROJECT_BINARY_DIR}/man/doxywizard.1"
-                "${PROJECT_BINARY_DIR}/man/doxysearch.1"
-                "${PROJECT_BINARY_DIR}/man/doxyindexer.1"
-       WORKING_DIRECTORY ${DOXYDOCS}
-       VERBATIM
-       )
-
-# language.doc
-add_custom_command(
-        COMMAND ${CMAKE_COMMAND} "-DSOURCE=${CMAKE_SOURCE_DIR}" -P ${CMAKE_SOURCE_DIR}/cmake/run_translator.cmake
-       DEPENDS ${DOXYDOCS}/translator.py
-       DEPENDS maintainers.txt language.tpl translator.py
-       OUTPUT ${PROJECT_BINARY_DIR}/doc/language.doc
-       WORKING_DIRECTORY ${DOXYDOCS}
-)
-set_source_files_properties(${DOXYDOCS}/language.doc PROPERTIES GENERATED 1)
+configure_file(${CMAKE_SOURCE_DIR}/doc/manual.sty         ${PROJECT_BINARY_DIR}/doc/manual.sty)
+configure_file(${CMAKE_SOURCE_DIR}/doc/doxygen_manual.tex ${PROJECT_BINARY_DIR}/doc/doxygen_manual.tex)
+configure_file(${CMAKE_SOURCE_DIR}/doc/doxygen.1          ${PROJECT_BINARY_DIR}/man/doxygen.1)
+configure_file(${CMAKE_SOURCE_DIR}/doc/doxywizard.1       ${PROJECT_BINARY_DIR}/man/doxywizard.1)
+configure_file(${CMAKE_SOURCE_DIR}/doc/doxysearch.1       ${PROJECT_BINARY_DIR}/man/doxysearch.1)
+configure_file(${CMAKE_SOURCE_DIR}/doc/doxyindexer.1      ${PROJECT_BINARY_DIR}/man/doxyindexer.1)
 
-# config.doc
+# doc/language.doc (see tag Doxyfile:INPUT)
 add_custom_command(
-       COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/src/configgen.py -doc ${CMAKE_SOURCE_DIR}/src/config.xml > config.doc
-       DEPENDS ${CMAKE_SOURCE_DIR}/src/config.xml ${CMAKE_SOURCE_DIR}/src/configgen.py
-       OUTPUT config.doc
-       WORKING_DIRECTORY ${DOXYDOCS}
+        COMMAND ${PYTHON_EXECUTABLE} translator.py
+        DEPENDS ${PROJECT_BINARY_DIR}/doc/maintainers.txt ${PROJECT_BINARY_DIR}/doc/language.tpl ${PROJECT_BINARY_DIR}/doc/translator.py
+        OUTPUT language.doc
+        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/doc
 )
-set_source_files_properties(${DOXYDOCS}/config.doc PROPERTIES GENERATED 1)
-
-string(TIMESTAMP TODAY "%d-%m-%Y")
+set_source_files_properties(language.doc PROPERTIES GENERATED 1)
 
+# doc/config.doc (see tag Doxyfile:INPUT)
 add_custom_command(
-       COMMAND ${SED} -e "s/DATE/${TODAY}/g" -e "s/VERSION/${VERSION}/g" doxygen.1 > "${PROJECT_BINARY_DIR}/man/doxygen.1"
-        OUTPUT "${PROJECT_BINARY_DIR}/man/doxygen.1"
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/src/configgen.py -doc ${TOP}/src/config.xml > config.doc
+        DEPENDS ${TOP}/src/config.xml ${TOP}/src/configgen.py
+        OUTPUT config.doc
+        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/doc/
 )
-
-add_custom_command(
-       COMMAND ${SED} -e "s/DATE/${TODAY}/g" -e "s/VERSION/${VERSION}/g" doxywizard.1 > "${PROJECT_BINARY_DIR}/man/doxywizard.1"
-        OUTPUT "${PROJECT_BINARY_DIR}/man/doxywizard.1"
-)
-
-add_custom_command(
-       COMMAND ${SED} -e "s/DATE/${TODAY}/g" -e "s/VERSION/${VERSION}/g" doxysearch.1 > "${PROJECT_BINARY_DIR}/man/doxysearch.1"
-        OUTPUT "${PROJECT_BINARY_DIR}/man/doxysearch.1"
+set_source_files_properties(config.doc PROPERTIES GENERATED 1)
+################################################################################
+add_custom_target(run_doxygen
+        COMMENT "Generating Latex and HTML documentation."
+        COMMAND ${DOXYGEN_EXECUTABLE}
+        DEPENDS ${PROJECT_BINARY_DIR}/doc/language.doc ${PROJECT_BINARY_DIR}/doc/config.doc
+        DEPENDS ${OUT_DOC_FILES}
+        DEPENDS examples
+        DEPENDS doxygen
+        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/doc/
 )
 
-add_custom_command(
-       COMMAND ${SED} -e "s/DATE/${TODAY}/g" -e "s/VERSION/${VERSION}/g" doxyindexer.1 > "${PROJECT_BINARY_DIR}/man/doxyindexer.1"
-        OUTPUT "${PROJECT_BINARY_DIR}/man/doxyindexer.1"
+add_custom_target(doxygen_pdf
+        COMMENT "Generating Doxygen Manual PDF."
+        COMMAND ${CMAKE_COMMAND} -E remove refman.tex
+        COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc/doxygen_manual.tex  .
+        COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/doc/manual.sty  .
+        COMMAND ${EPSTOPDF} ${CMAKE_SOURCE_DIR}/doc/doxygen_logo.eps --outfile=doxygen_logo.pdf
+        COMMAND ${PDFLATEX}  doxygen_manual.tex
+        COMMAND ${MAKEINDEX} doxygen_manual.idx
+        COMMAND ${PDFLATEX}  doxygen_manual.tex
+        DEPENDS run_doxygen
+        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/latex
 )
-
+add_custom_target(docs
+        COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/doc/doxygen_logo.gif      ${PROJECT_BINARY_DIR}/html/
+        COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/doc/doxygen_logo_low.gif  ${PROJECT_BINARY_DIR}/html/
+        DEPENDS ${PROJECT_BINARY_DIR}/man/doxygen.1
+                ${PROJECT_BINARY_DIR}/man/doxywizard.1
+                ${PROJECT_BINARY_DIR}/man/doxysearch.1
+                ${PROJECT_BINARY_DIR}/man/doxyindexer.1
+                doxygen_pdf
+        VERBATIM
+        )
+
+################################################################################
 install(FILES
         "${PROJECT_BINARY_DIR}/man/doxygen.1"
         "${PROJECT_BINARY_DIR}/man/doxywizard.1"
         "${PROJECT_BINARY_DIR}/man/doxysearch.1"
         "${PROJECT_BINARY_DIR}/man/doxyindexer.1"
-        DESTINATION man/man1
+        DESTINATION share/man/man1
 )
 
 install(FILES
@@ -101,4 +182,4 @@ install(DIRECTORY
         DESTINATION "${CMAKE_INSTALL_PREFIX}/${DOC_INSTALL_DIR}"
 )
 
-endif()
+endif(build_doc)
index ab97227..ceb6385 100644 (file)
@@ -16,7 +16,7 @@ PROJECT_NAME      = "Doxygen"
 OUTPUT_DIRECTORY  = ..
 HTML_HEADER       = 
 HTML_FOOTER       = 
-QUIET             = NO
+QUIET             = YES
 WARNINGS          = YES
 DISABLE_INDEX     = YES
 GENERATE_TREEVIEW = YES
@@ -34,7 +34,7 @@ ENABLE_PREPROCESSING = NO
 CASE_SENSE_NAMES  = NO
 IMAGE_PATH        = .
 INPUT             = index.doc install.doc starting.doc docblocks.doc markdown.doc \
-                    lists.doc grouping.doc formulas.doc diagrams.doc preprocessing.doc \
+                    lists.doc grouping.doc formulas.doc tables.doc diagrams.doc preprocessing.doc \
                     autolink.doc output.doc searching.doc extsearch.doc customize.doc custcmd.doc \
                     external.doc faq.doc trouble.doc features.doc \
                    doxygen_usage.doc doxywizard_usage.doc \
@@ -54,3 +54,4 @@ HTML_STYLESHEET   = doxygen_manual.css
 ALIASES           = LaTeX="\f$\mbox{\LaTeX}\f$"
 ALIASES          += TeX="\f$\mbox{\TeX}\f$"
 LATEX_BATCHMODE   = YES
+LATEX_EXTRA_STYLESHEET = manual.sty
index 95cb270..7876fb9 100644 (file)
@@ -203,49 +203,44 @@ from the correct line in the \c Makefile:
 
 $file = shift @ARGV;
 print "Toggle debugging mode for $file\n";
-
-# add or remove the -d flex flag in the makefile
-unless (rename "Makefile.libdoxygen","Makefile.libdoxygen.old") {
-  print STDERR "Error: cannot rename Makefile.libdoxygen!\n";
+if (!-e "../src/${file}.l")
+{
+  print STDERR "Error: file ../src/${file}.l does not exist!";
+  exit 1;
+}
+system("touch ../src/${file}.l");
+unless (rename "src/CMakeFiles/_doxygen.dir/build.make","src/CMakefiles/_doxygen.dir/build.make.old") {
+  print STDERR "Error: cannot rename src/CMakeFiles/_doxygen.dir/build.make!\n";
   exit 1;
 }
-if (open(F,"<Makefile.libdoxygen.old")) {
-  unless (open(G,">Makefile.libdoxygen")) {
-    print STDERR "Error: opening file Makefile.libdoxygen for writing\n";
-    exit 1; 
+if (open(F,"<src/CMakeFiles/_doxygen.dir/build.make.old")) {
+  unless (open(G,">src/CMakefiles/_doxygen.dir/build.make")) {
+    print STDERR "Error: opening file build.make for writing\n";
+    exit 1;
   }
-  print "Processing Makefile.libdoxygen...\n";
+  print "Processing build.make...\n";
   while (<F>) {
-    if ( s/\(LEX\) (-i )?-P([a-zA-Z]+)YY -t $file/(LEX) -d \1-P\2YY -t $file/g ) {
-      print "Enabling debug info for $file\n";
+    if ( s/flex \$\(LEX_FLAGS\) -P${file}YY/flex \$(LEX_FLAGS) -d -P${file}YY/ ) {
+      print "Enabling debug info for $file.l\n";
     }
-    elsif ( s/\(LEX\) -d (-i )?-P([a-zA-Z]+)YY -t $file/(LEX) \1-P\2YY -t $file/g ) {
+    elsif ( s/flex \$\(LEX_FLAGS\) -d -P${file}YY/flex \$(LEX_FLAGS) -P${file}YY/ ) {
       print "Disabling debug info for $file\n";
     }
     print G "$_";
   }
   close F;
-  unlink "Makefile.libdoxygen.old";
+  unlink "src/CMakeFiles/_doxygen.dir/build.make.old";
 }
 else {
-  print STDERR "Warning file Makefile.libdoxygen.old does not exist!\n"; 
+  print STDERR "Warning file src/CMakeFiles/_doxygen.dir/build.make does not exist!\n"; 
 }
 
 # touch the file
 $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
+Another way to get rules matching / debugging information
+from the flex code is setting LEX_FLAGS with cmake.
 
 Note that by running doxygen with `-d lex` you get information about which flex
 codefile is used.
index 9e0d35a..b434dd2 100644 (file)
@@ -77,7 +77,7 @@
     'fun(const std::string&,bool)' or '()' to match any prototype.
   \par Note 2:
     Member function modifiers (like 'const' and 'volatile') 
-    are required to identify the target, i.e. 'func(int) const' and 'fun(int)'
+    are required to identify the target, i.e. 'func(int) const' and 'func(int)'
     target different member functions.
   \par Note 3: 
     For JavaDoc compatibility a \# may be used instead of a :: in 
   patterns 3 and 7 in this case.
 
   \par Example:
-  \verbinclude autolink.cpp
+  \include autolink.cpp
   \htmlonly
   Click <a href="examples/autolink/html/index.html">here</a> 
   for the corresponding HTML documentation that is generated by Doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{autolink_example}{Autolink example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
   \section resolving typedefs
 
@@ -126,11 +130,15 @@ typedef struct StructName TypeName
   when either StructName itself or TypeName is encountered.
   
   \par Example:
-  \verbinclude restypedef.cpp
+  \include restypedef.cpp
   \htmlonly
   Click <a href="examples/restypedef/html/restypedef_8cpp.html">here</a> 
   for the corresponding HTML documentation that is generated by Doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{restypedef_8cpp}{Typedef example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
 \htmlonly
 Go to the <a href="output.html">next</a> section or return to the
index a2c540a..81efdfc 100644 (file)
 \tableofcontents
 \section log_1_8 1.8 Series
 
+\subsection log_1_8_11 Release 1.8.11
+\htmlonly
+<b>(release date 30-12-2015)</b>
+<a name="1.8.11"></a>
+</p>
+<ul>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=149792">149792</a> - Mainpage title has wrong style in RTF [<a href="http://github.com/doxygen/doxygen/commit/021dfd44f2dbeeaac1b9aff95ddc2a3eae173eb4">view</a> and [<a href="http://github.com/doxygen/doxygen/commit/83f23a4f7f7d1351ef89a4e54db6628a9d582dc5">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=333106">333106</a> - $line param [<a href="http://github.com/doxygen/doxygen/commit/993972cd242527ddf929756141a68cccfc8ecef9">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=361814">361814</a> - python: tuple assignment not recognized as variable initialization [<a href="http://github.com/doxygen/doxygen/commit/015955e0badb6082a1e553392acaeb6890734c31">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=485701">485701</a> - Fixes angle brackets (&lt; and &gt;) not escaped in HTML formula alt text [<a href="http://github.com/doxygen/doxygen/commit/64adce8b82c332b3855cdfaaa71afc984ffc4ca9">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=578720">578720</a> - [Python] Add pyw as a valid extension [<a href="http://github.com/doxygen/doxygen/commit/5924acd279f82d8db7ddb33a6ec67937084d7c31">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593642">593642</a> - Python: STRIP_CODE_COMMENTS Doesn&#39;t work within the source code [<a href="http://github.com/doxygen/doxygen/commit/4cad0c9ac3492dd504104b15c9a03ef903950e15">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595186">595186</a> - Python ignores \private tag [<a href="http://github.com/doxygen/doxygen/commit/8782107300b24ac5501d8a5ada9be0859a0ee432">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606104">606104</a> - Deprecated list: Wrong prefix &#39;&lt;globalScope&gt;::&#39; for global functions [<a href="http://github.com/doxygen/doxygen/commit/a5288aca31ccecb78b561b4f382fe6c559bea9f9">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629249">629249</a> - Incorrect &quot;References&quot; and &quot;Referenced by&quot; [<a href="http://github.com/doxygen/doxygen/commit/43c415708be4c2d4065ecda9870d361b0beb0f09">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641036">641036</a> - python script with #!/usr/bin/python are not documented correctly [<a href="http://github.com/doxygen/doxygen/commit/322d09de48c07cf7258825e3e7733d5d994e70cf">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646002">646002</a> - htmlonly content appears in generated XML output [<a href="http://github.com/doxygen/doxygen/commit/02ce4f0b2b58ef32dd783b359daf7cc01079462a">view</a>] and [<a href="http://github.com/doxygen/doxygen/commit/6004d659c1ca280acc6588351176be63b55faf70">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=648865">648865</a> - PYTHON: stops processing the file after encountering \&quot;&quot;&quot;&quot; [<a href="http://github.com/doxygen/doxygen/commit/59fdba0dd1e3765a2f53b222fdc9455114f720b1">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661814">661814</a> - writeMemberNavIndex template calls static fixSpaces [<a href="http://github.com/doxygen/doxygen/commit/69d5ffaa68210a6e63a618ef304c63462f6e1fac">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682373">682373</a> - Math does not work in LaTeX with custom header and footer. [<a href="http://github.com/doxygen/doxygen/commit/c713984bf6a4c9e8c2ea393b304682ce4a56358f">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=731509">731509</a> - Markdown backticks not processed within Markdown links. [<a href="http://github.com/doxygen/doxygen/commit/205f7335bca570e87afc0df07bd355848c7af2e3">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=732356">732356</a> - doxygen&#39;s \param command is confused by some python default values [<a href="http://github.com/doxygen/doxygen/commit/6447c90acb51807d272ce2f24a94574a413d36e0">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735152">735152</a> - Python: Allow undocumented &quot;cls&quot; parameter for class methods [<a href="http://github.com/doxygen/doxygen/commit/0a5dfb77a7d0dfaac2baf8f3e61014a29ba2883b">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=742715">742715</a> - Unnamed structs gives: QGDict::hashAsciiKey: Invalid null key [<a href="http://github.com/doxygen/doxygen/commit/17b66265ace3418413b5cfab0335b4378e9c176b">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=744938">744938</a> - PATCH: add option to build latex without timestamps [<a href="http://github.com/doxygen/doxygen/commit/9ef2dc156c37da7fb736c39c3c3fa5074e4d1829">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=745659">745659</a> - The table in classes.html has no class attribute [<a href="http://github.com/doxygen/doxygen/commit/0b4b2d76e4cc8fcb85d9b3ad7252e676e5a1d784">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=746162">746162</a> - formulas creating invalid HTML code [<a href="http://github.com/doxygen/doxygen/commit/d5905871951cde51c6dcaa01d745de2f884ce9a9">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=746361">746361</a> - Doxygen thinks C++ class is Objective-C [<a href="http://github.com/doxygen/doxygen/commit/8da86f8adfb826f13321c7d163431f9671ba20b7">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751300">751300</a> - Doxygen don&#39;t support longer key in bibtex [<a href="http://github.com/doxygen/doxygen/commit/b0fc11e4a891e51bb4d982730efecddac2ef807e">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751321">751321</a> - \cite still rejects valid BibTeX keys [<a href="http://github.com/doxygen/doxygen/commit/b1601548308c8a6ec586a406155d24f80d75aafd">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751755">751755</a> - using plantuml cause a popup &quot;openwith&quot; windows when calling java.exe [<a href="http://github.com/doxygen/doxygen/commit/51ee1b0633fbfa935da08c8a13f70da6fc1c074d">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=751984">751984</a> - PATCH: Honour SOURCE_DATE_EPOCH environment variable for reproducible output [<a href="http://github.com/doxygen/doxygen/commit/b31266c1076c6284116f17241d9e8aa048f88e60">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=752657">752657</a> - XML not documenting a class in python [<a href="http://github.com/doxygen/doxygen/commit/288afe7d4fe0953f5717b0ac85f805f78d96afa4">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=752658">752658</a> - XML empty &lt;argsstring/&gt; in python [<a href="http://github.com/doxygen/doxygen/commit/a1b3f7b1157b8e7b392bfcd6c6452c664bf5a7c2">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=752712">752712</a> - last entry missing in a @name group of typedefs [<a href="http://github.com/doxygen/doxygen/commit/21d14b3c7697f8807065070f5850259b1b6550e4">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=752845">752845</a> - Non-alphanumeric characters in Markdown links don&#39;t work properly [<a href="http://github.com/doxygen/doxygen/commit/e89eb77b14810649c679dc7d377ddb4e6a942d82">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=753500">753500</a> - $file when using @name is wrong [<a href="http://github.com/doxygen/doxygen/commit/790887ea3f63c051954a4cd49f044fa4f536867d">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=753909">753909</a> - Copy and paste of code fragment from CHM merges all pasted text into single line [<a href="http://github.com/doxygen/doxygen/commit/663544cc0caf9109ea10c33f38b1e07e7a01a575">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=754130">754130</a> - class=&quot;current&quot; not applied to &lt;li&gt; for module tab within &#39;group__*.html&#39; module html files [<a href="http://github.com/doxygen/doxygen/commit/0e2e8916f81892c891a33c5435024776ca0f570f">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=754184">754184</a> - \bug paragraph doesn&#39;t end with a new sectioning command [<a href="http://github.com/doxygen/doxygen/commit/13e2b18c93df1351c4e91d13a7fe224b4841fa73">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=754606">754606</a> - Double anchors when using groups [<a href="http://github.com/doxygen/doxygen/commit/e44780a7579ca865cc52801e920b1d20d2a3b438">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=755080">755080</a> - xrefitem link to list incorrect when using SHORT_NAMES [<a href="http://github.com/doxygen/doxygen/commit/af5c5b37c5464afb6a2df71edf6f9e82ece75187">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=755293">755293</a> - Tree view pane overlaps with content tabs [<a href="http://github.com/doxygen/doxygen/commit/8fc243491cbae2442c1e07faca99a8f6dc6f2e19">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=755783">755783</a> - RTF output has incomplete &quot;References&quot; and &quot;Referenced by&quot; sections [<a href="http://github.com/doxygen/doxygen/commit/6184c70c515941212380006a2e6c879e1663daec">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=755786">755786</a> - fatal: Cannot open &#39;graph_legend&#39;: No such file or directory [<a href="http://github.com/doxygen/doxygen/commit/08cf278fb80ffb7844b4339458cf4ad03453e827">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=755939">755939</a> - Warning refers to incorrect line for undocumented member function (C++) [<a href="http://github.com/doxygen/doxygen/commit/a112c70c7a5d590286e0fad1382b9bb3fd86118b">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=756241">756241</a> - Race condition in parallel DOT runs [<a href="http://github.com/doxygen/doxygen/commit/f196c9f1d69238a814ff3152103f3bd310efdf0d">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=756604">756604</a> - Unable to prevent a numbered list [<a href="http://github.com/doxygen/doxygen/commit/3fbb1b66bd5303fa789a36317694bd77eb22ee19">view</a>] and  [<a href="http://github.com/doxygen/doxygen/commit/5487f855ad12d0b7f3ba70aab72fd2debedae16d">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=756724">756724</a> - Inline markdown links don&#39;t support reference targets that contain ) [<a href="http://github.com/doxygen/doxygen/commit/59a42f974f15fa0154317900ffd9b82babd985ad">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=757300">757300</a> - Failed to document nested classes with &quot;reference to array&quot; parameters [<a href="http://github.com/doxygen/doxygen/commit/3bcef269a4fe5bfc1921d7ba934bc09c715eae9c">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=757621">757621</a> - unclosed tag, c# generics method with where [<a href="http://github.com/doxygen/doxygen/commit/1bb819f5b680d600f010761b21e44df2f5e35ccc">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=757812">757812</a> - Doxygen do not support comparison angle bracket in template [<a href="http://github.com/doxygen/doxygen/commit/f836266a4538153a1164642e168bb04c529a4d51">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=758132">758132</a> - Brief description of non documented functions [<a href="http://github.com/doxygen/doxygen/commit/7a2164d252a0cb5410ab13b0ca1611a8e94e3c99">view</a>] and [<a href="http://github.com/doxygen/doxygen/commit/1b402f49a0638dd0eec2a123462862c6d4c4084d">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=758495">758495</a> - Bug in VHDL parser + other fixes [<a href="http://github.com/doxygen/doxygen/commit/4bef27771fec1892331df637dd6184abac36fd8f">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=758900">758900</a> - C++ templated member-function appears both as public and private [<a href="http://github.com/doxygen/doxygen/commit/bb4e403968dc1ac4deb3b47c0b79b4304f1be288">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=759177">759177</a> - Markdown fenced code blocks not parsed properly in comment [<a href="http://github.com/doxygen/doxygen/commit/ae6311ea0855d576a7c4b589dd5f4b994a47fd6c">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=759247">759247</a> - C++11 unified initializer for array with templates treated as function [<a href="http://github.com/doxygen/doxygen/commit/692544fb47407a3f2c5a5a5e4b80185428adda25">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=759281">759281</a> - Doxygen parser confused by C++11 attributes [<a href="http://github.com/doxygen/doxygen/commit/6c005b1e9458430a77bfeba6d08deed4778ad71d">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=759381">759381</a> - unable to @ref or @link C++ templated operator overloads [<a href="http://github.com/doxygen/doxygen/commit/da09bff6dc9cad40c72b6a858728093cc41dff47">view</a>]</li>
+<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=759622">759622</a> - problems with charset using plantuml [<a href="http://github.com/doxygen/doxygen/commit/165498dc9ea33bc9991c5ab5234b5e51d74569d0">view</a>]</li>
+<li>Actually using value of GROUP_NESTED_COMPOUNDS option [<a href="http://github.com/doxygen/doxygen/commit/3b314b5d856f6f7a25d512737e640a6b7b17c8d4">view</a>]</li>
+<li>Add RPM build for Red Hat [<a href="http://github.com/doxygen/doxygen/commit/7f8f31cb8318e663f2ec145b63fb31278bdd7a76">view</a>]</li>
+<li>Add WARN_AS_ERROR option to stop execution at first warning (equivalent of compilers&#39; -Werror option) [<a href="http://github.com/doxygen/doxygen/commit/38277f1da56c212c9b33f774de412edef1156544">view</a>]</li>
+<li>Add examples to LaTeX / PDF doxygen manual [<a href="http://github.com/doxygen/doxygen/commit/3a236fd01dc23d2d979e06d848f61b002cb4e6ee">view</a> and [<a href="http://github.com/doxygen/doxygen/commit/5e11f885eea694c2ecfeae6ff5774b66eea312e4">view</a>]</li>
+<li>Add mathjax support to template &amp; context. [<a href="http://github.com/doxygen/doxygen/commit/56987af3987f40ac77e70cd39ebbdac3702c1ce2">view</a>]</li>
+<li>Add support for &quot;value&quot; attribute in FORTRAN scanner [<a href="http://github.com/doxygen/doxygen/commit/6dacbd9b22bdd6cd1a8c3e9b5ec8c2f7d15977b8">view</a>]</li>
+<li>Added documentation for creating tables [<a href="http://github.com/doxygen/doxygen/commit/23faa449843eeb4c9e40e650df8844abec024bb7">view</a>]</li>
+<li>Added javascript search engine data to the template context [<a href="http://github.com/doxygen/doxygen/commit/6bb0d2908b4ca7908a8e655a5abcf7615a5f4c77">view</a>]</li>
+<li>Added missing html resources to the html template file [<a href="http://github.com/doxygen/doxygen/commit/43a0883022f64539498b84220d487b16ffd49a7e">view</a>]</li>
+<li>Added missing information to template version of the all members list [<a href="http://github.com/doxygen/doxygen/commit/f16c156065ac8bc6242870c2ae701252b5d4f9b2">view</a>]</li>
+<li>Added support for directory dependency graphs to template engine [<a href="http://github.com/doxygen/doxygen/commit/abe254fbe2235f5b913653acd076d2acd579d5e1">view</a>]</li>
+<li>Adding compilation options for flex/lex and  bison/yacc [<a href="http://github.com/doxygen/doxygen/commit/beb2ff6c39fefbd6aaeecd5de9827d1b1947740b">view</a>]</li>
+<li>Adjusted used option for CLANG usage with CMake in documentation [<a href="http://github.com/doxygen/doxygen/commit/82063c0601b9f7b11c1774a1a42e13295c486467">view</a>]</li>
+<li>Alignment in LaTeX parameter table [<a href="http://github.com/doxygen/doxygen/commit/a0880ff1c41a1c57bc92c1ccf99cf750064e2995">view</a>]</li>
+<li>Avoid using Resource::data as string, as it is not null terminated. [<a href="http://github.com/doxygen/doxygen/commit/15a87a623791bf407b3076960cdd1133c8973357">view</a>]</li>
+<li>Better handling of implicit statement in source code browser [<a href="http://github.com/doxygen/doxygen/commit/404468ac5484d54e47129ce2a00b3ad6e1c2c72a">view</a>]</li>
+<li>Bug&Acirc;&nbsp;149792 - Mainpage title has wrong style in RTF [<a href="http://github.com/doxygen/doxygen/commit/077aeb768767e62407abb4759d44671619bc62fd">view</a>]</li>
+<li>Bump version so that the GIT repo represents the version for the &quot;next&quot; release [<a href="http://github.com/doxygen/doxygen/commit/42c376cdb41db392bd025611ccfcaddb49d05e92">view</a>]</li>
+<li>Cmake tries to remove directory refman.tex instead of file refman.tex [<a href="http://github.com/doxygen/doxygen/commit/63094c8bb34a2e02e8490860660303d849e4a984">view</a>]</li>
+<li>Copy user EXTRA_FILES at the end to overrule files generated by default by doxygen [<a href="http://github.com/doxygen/doxygen/commit/82f08138ad08fa5b8906c162283c4df0e9819d83">view</a>]</li>
+<li>Correct / set types for python variables [<a href="http://github.com/doxygen/doxygen/commit/c47920b217491fc861cdac73d44ab4f93d08423e">view</a>]</li>
+<li>Correcting print format error in config.l [<a href="http://github.com/doxygen/doxygen/commit/9947c11284542a74c56e52b55be032350c6bbc3e">view</a>]</li>
+<li>DO NOT hardcode x86-64 architecture. [<a href="http://github.com/doxygen/doxygen/commit/031780293d2838da2643b46878061598ebb56822">view</a>]</li>
+<li>Don&#39;t show a console when launching doxywizard on Windows. [<a href="http://github.com/doxygen/doxygen/commit/942efcb758977fe95fafc473813528085b56e4ee">view</a>]</li>
+<li>Fix computeCommonDirPrefix sometimes not finding the correct prefix [<a href="http://github.com/doxygen/doxygen/commit/c6bf96520bcff56d3fd67d4277c05b8db9ac2128">view</a>]</li>
+<li>Fix error documentation of in flex debug script [<a href="http://github.com/doxygen/doxygen/commit/09c4e990e4e214900e613343fb9bfbbb08f1bc53">view</a>]</li>
+<li>Fix for broken link in the manual [<a href="http://github.com/doxygen/doxygen/commit/355370151b61f79633b3867634d76eaf8bacce54">view</a>]</li>
+<li>Fix hexChar for inputs 0 &lt;= i &lt; 10 [<a href="http://github.com/doxygen/doxygen/commit/327422d131ed5e6ddf280043b5a56a6fb92d3bbc">view</a> and [<a href="http://github.com/doxygen/doxygen/commit/62da4521880a03b8a92887539eaf76ccad2ee770">view</a>]</li>
+<li>Fix spelling in doc/commands.doc (descriptionm) [<a href="http://github.com/doxygen/doxygen/commit/bd7da008fac074202e3265787907434fbfb40e71">view</a>]</li>
+<li>Fix typo in function name [<a href="http://github.com/doxygen/doxygen/commit/ace0af42e330a96ad691b2d9a08dd3ff4abb2629">view</a> and [<a href="http://github.com/doxygen/doxygen/commit/b890f40d195b9dc5db12aaa398707de138093c66">view</a>]</li>
+<li>Fixed a couple of small memory leaks [<a href="http://github.com/doxygen/doxygen/commit/85ddfc814f33943199928447b4627d05b0920b99">view</a>]</li>
+<li>Fixed a number of memory leaks in the template engine [<a href="http://github.com/doxygen/doxygen/commit/d14bcd1f8f5bd4a2034bae842000630f4e098eb6">view</a>]</li>
+<li>Fixed compiler warning for MacOSX [<a href="http://github.com/doxygen/doxygen/commit/0aa27346b8728f6698dd2b363959e89d02e03ff6">view</a>]</li>
+<li>Fixed link issue for MacOSX 10.11 [<a href="http://github.com/doxygen/doxygen/commit/0918a19225daedfbd5e23388124a5de3860d5420">view</a>]</li>
+<li>Fixed minor typos in comments [<a href="http://github.com/doxygen/doxygen/commit/29c500434d30cd4d9c20f6b295475ed42dba2930">view</a>]</li>
+<li>Fixed preprocessor macros for flex version check [<a href="http://github.com/doxygen/doxygen/commit/a8c73cdbe37cc53c398002d20e94037552a8fb55">view</a>]</li>
+<li>Fixed problem with latex and PDF bookmarks [<a href="http://github.com/doxygen/doxygen/commit/499ecaedf1ee1222535be27f77050ee633595685">view</a>]</li>
+<li>Fixed various issues found by PVS-Studio. [<a href="http://github.com/doxygen/doxygen/commit/48ced3ea8071b3141216482e2821e10250910947">view</a>]</li>
+<li>Fixes bug 485701: Angle brackets (&lt; and &gt;) not escaped in HTML formula alt text [<a href="http://github.com/doxygen/doxygen/commit/08aa01cb0ee9b2dd6403f753156d8b58d8e62145">view</a>]</li>
+<li>Fixes to support nested tables again [<a href="http://github.com/doxygen/doxygen/commit/883989fced827524354297009fde396ca6264a31">view</a>]</li>
+<li>Fortran module private variables and EXTRACT_PRIVATE = NO [<a href="http://github.com/doxygen/doxygen/commit/61820a08200ec62c754cacf8dd3a1121ce6dee69">view</a> and <a href="http://github.com/doxygen/doxygen/commit/8504fc3a06e3430242eab9ac1c1f20319112e6a9">view</a>]</li>
+<li>Improved handling of &lt;caption&gt; in tables for LaTeX output. [<a href="http://github.com/doxygen/doxygen/commit/fa6585b2fc6847c2b242b226b163810c7a6366de">view</a>]</li>
+<li>IncludeInfo class had uninitialized member variable [<a href="http://github.com/doxygen/doxygen/commit/76a9892b190efaeb3c764d824bd285ff3d2c57dc">view</a>]</li>
+<li>Made paragraph spacing more flexible in the LaTeX output to prevent page overflows [<a href="http://github.com/doxygen/doxygen/commit/17b3b41e12e890187f6b7dcc98ed9e2451b14018">view</a>]</li>
+<li>Made several improvements to the performance of template engine [<a href="http://github.com/doxygen/doxygen/commit/ded4e9a92670d0157cdcc5cbf7a4a1e3193e179a">view</a>]</li>
+<li>Make doxywizard compatible with Qt5 [<a href="http://github.com/doxygen/doxygen/commit/333c7c44f1aa3c62f9401b190e45eaff15056d5c">view</a>]</li>
+<li>Make list of default extensions consistent with language mapping list [<a href="http://github.com/doxygen/doxygen/commit/bf35f16863f067286260ad4b68ec4c0ae7febdf1">view</a>]</li>
+<li>Markdown with @cond and @endcond [<a href="http://github.com/doxygen/doxygen/commit/c5a7911741850777b699a63ae5b7702e379a5ada">view</a>]</li>
+<li>Markdown with @cond and @endcond [<a href="http://github.com/doxygen/doxygen/commit/dc26830396970d402ad42d20f1b99bd86f4a5961">view</a>]</li>
+<li>Merge remote-tracking branch &#39;upstream/master&#39; [<a href="http://github.com/doxygen/doxygen/commit/6aba65a4dfaec1aa1131e160ed252d0713403760">view</a>]</li>
+<li>Minor change to pycode.l:codifyLines [<a href="http://github.com/doxygen/doxygen/commit/bbd71be14986e637af9958b2cc18d1d62743ba8e">view</a>]</li>
+<li>Moved creation of inline class documentation to separate template file [<a href="http://github.com/doxygen/doxygen/commit/4bd50c9f0dc1d7b1413a6bda587b8a5999cd7a19">view</a>]</li>
+<li>RTF improvement: Example section was merged with next function title [<a href="http://github.com/doxygen/doxygen/commit/ca617e1e1cd42ee0080c8c13ce3884c8671629dd">view</a>]</li>
+<li>Remove obsolete py files [<a href="http://github.com/doxygen/doxygen/commit/183f36fe97cb95636f1947c2c4be61f7b78f87e0">view</a>]</li>
+<li>Removed BOM marker from greek translator to avoid Visual C warnings [<a href="http://github.com/doxygen/doxygen/commit/9ee8f777f5a4b7a49e644c2da5247fa509038feb">view</a>]</li>
+<li>Repaired breaking @include for LaTeX output [<a href="http://github.com/doxygen/doxygen/commit/ab861c197c596f78c7aea4f45c0e1252de10fc1f">view</a>]</li>
+<li>Revert &quot;Spelling correction for error message with USE_HTAGS usage&quot; [<a href="http://github.com/doxygen/doxygen/commit/a888543ca5f3fd28121f7eea4dbd25898fa7be57">view</a>]</li>
+<li>Revert using container-based infra as sudo is needed :-( [<a href="http://github.com/doxygen/doxygen/commit/f089c3fa4f47dc8bedd25d9d857d004525ee82c0">view</a>]</li>
+<li>Reverted change that caused doxygen to return error code 2 when it produced a warning [<a href="http://github.com/doxygen/doxygen/commit/f9e6fe0bf3886be7e603083b3b200dbd60fbd529">view</a>]</li>
+<li>Rework the generation of packages DEB/RPM/... (CPack) [<a href="http://github.com/doxygen/doxygen/commit/8c0c80e44e1e9cb1ce4e88a3e1d01b65536dc60c">view</a>]</li>
+<li>Right alignment of  in page table of contents [<a href="http://github.com/doxygen/doxygen/commit/a653f7499929f3f0a5b68614dec91242fbc0edf5">view</a>]</li>
+<li>Small correction of errors in case of CSharp XML tags [<a href="http://github.com/doxygen/doxygen/commit/68dd27139e50e048f081549394e6fc6dc04fc699">view</a>]</li>
+<li>Small documentation corrections [<a href="http://github.com/doxygen/doxygen/commit/564c8cd257e0dd1797d94633a0e92ddc5a496540">view</a>]</li>
+<li>Spelling correction for error message with USE_HTAGS usage [<a href="http://github.com/doxygen/doxygen/commit/0d060c455207ab32092e5a7edcd5457bb00f4653">view</a>] and [<a href="http://github.com/doxygen/doxygen/commit/5cc45244002d1d7560233cfae01f9d5d735e1a3f">view</a>]</li>
+<li>Started with generating LaTeX output via the template engine [<a href="http://github.com/doxygen/doxygen/commit/02a0c353a8947290a3191aead59db08dc84766ce">view</a>]</li>
+<li>Stop when doxygen configuration file (&quot;Doxyfile&quot;) cannot be read [<a href="http://github.com/doxygen/doxygen/commit/b8bd3d84590d9adee7084f066f0e3e8c75a99245">view</a>]</li>
+<li>Support flex-2.6.0 [<a href="http://github.com/doxygen/doxygen/commit/8c51120ad55b440b738ef0b96f8169d84a7ae88a">view</a>] and [<a href="http://github.com/doxygen/doxygen/commit/cf936efb8ae99dd297b6afb9c6a06beb81f5b0fb">view</a>]</li>
+<li>Support set in code highlighting [<a href="http://github.com/doxygen/doxygen/commit/1cbcce4ef3460f48ab9c8e9435eec21075dcc788">view</a>]</li>
+<li>Template enhancements and various other small fixes [<a href="http://github.com/doxygen/doxygen/commit/e58fb0a46f73f37d16859f43fda1eb5ba4a15c5d">view</a>]</li>
+<li>Title in case of USE_MDFILE_AS_MAINPAGE [<a href="http://github.com/doxygen/doxygen/commit/09251b805b3c9d96917fedebb3768945d7559b1e">view</a>]</li>
+<li>Tooltip can still contain &lt; and &gt; signs [<a href="http://github.com/doxygen/doxygen/commit/1df28fe4b9a0187f8fa6ed077e4a81002fa50fda">view</a>]</li>
+<li>Tweaked the htmlonly sections in the manual so it produces valid HTML output [<a href="http://github.com/doxygen/doxygen/commit/de03970396e6f7edec359e2b71f3d2aa9d6a6237">view</a>]</li>
+<li>Undo _doxygen to libdoxygen target change [<a href="http://github.com/doxygen/doxygen/commit/940048580f2d61a137e7abbb67b3aed567bfe865">view</a>]</li>
+<li>Updated instructions to toggle debugging flex code [<a href="http://github.com/doxygen/doxygen/commit/368f4f057be0ded4673be826c9a08cd771a023ce">view</a>]</li>
+<li>Updated italian translation and translator email address [<a href="http://github.com/doxygen/doxygen/commit/a9ad21b4e541d91c804ac39e393cc0c1db4f45f3">view</a>]</li>
+<li>Updated the Greek translation [<a href="http://github.com/doxygen/doxygen/commit/4e0b7f0b9a2a04d0bb5e66871da6d7ffa786836e">view</a>]</li>
+<li>Use CPack to generate rpm/deb packages [<a href="http://github.com/doxygen/doxygen/commit/ba6eb1478d24dc32d4e123951e2f62c75b4b88bd">view</a>]</li>
+<li>Use STATIC libraries to prevent them being shared [<a href="http://github.com/doxygen/doxygen/commit/37a148f6e35523fd2bbbdbc37e6ed838684c6d90">view</a>]</li>
+<li>Using tabu package for LaTeX tables [<a href="http://github.com/doxygen/doxygen/commit/647b6ac8669cd8ba1e8c60eeb3c2de961c7d6a1b">view</a>]</li>
+<li>[Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=755225">755225</a>] On Windows, generated layout is with UNIX EOL [<a href="http://github.com/doxygen/doxygen/commit/78a80001223af290c7c7321ad2d210fb3cd16f11">view</a>]</li>
+<li>[Doxygen-users] plugin / filter not behaving as expected [<a href="http://github.com/doxygen/doxygen/commit/0c7f182016c7c2604a484367738e76cb40c0541b">view</a>]</li>
+<li>add spaces like &quot;Doyxgen&quot;CN_SPC-&gt;&quot;Doyxgen&quot; CN_SPC [<a href="http://github.com/doxygen/doxygen/commit/35d1aa8bf9208302601fa96462e246c98aa0b0e5">view</a>]</li>
+<li>allow building with custom iconv on Windows [<a href="http://github.com/doxygen/doxygen/commit/3d684f6d123abdbf630bb19bc6095cc9d69efb68">view</a>]</li>
+<li>doc: generate Doxygen&#39;s documentation. [<a href="http://github.com/doxygen/doxygen/commit/3c4a1ea2ee56f2604c2277f13737d53b3a0b0353">view</a>]</li>
+<li>doc: put man pages under share/man/man1 [<a href="http://github.com/doxygen/doxygen/commit/95d28153779810dc95afafa38ed838f32516a1f4">view</a>]</li>
+<li>docparser: warn when finding a documented empty return type [<a href="http://github.com/doxygen/doxygen/commit/10989e2dade3bb35a421787c5315d2630d665842">view</a>]</li>
+<li>docs: add examples as a dependency of docs [<a href="http://github.com/doxygen/doxygen/commit/ec5fde6913935fbe2015220259b611a17a437de3">view</a>]</li>
+<li>doxyapp and CLANG linking [<a href="http://github.com/doxygen/doxygen/commit/a58a2cafbc136f7821b9313bd6c1413eaab3e868">view</a>]</li>
+<li>fixed for travis ci config file [<a href="http://github.com/doxygen/doxygen/commit/ecbb77b40892df8740476023545769ffbda6fd6f">view</a>]</li>
+<li>libpng warning: iCCP: known incorrect sRGB profile [<a href="http://github.com/doxygen/doxygen/commit/c82ac124812dd2f9a5e8b36fcdcf7daf20cfbdda">view</a>]</li>
+<li>rename build target _doxygen to libdoxygen [<a href="http://github.com/doxygen/doxygen/commit/4116648d3c62aee54c385644a4fe754ee7a4261d">view</a>]</li>
+<li>run_translator.cmake is no longer used [<a href="http://github.com/doxygen/doxygen/commit/45e153f2238d0fa031d147cfe207e52b913845eb">view</a>]</li>
+<li>runtests: Simplify dictionary usage [<a href="http://github.com/doxygen/doxygen/commit/95d99a4c857d7d5208d8faf974b01354a798eba4">view</a>]</li>
+</ul>
+<p>
+\endhtmlonly
+
 \subsection log_1_8_10 Release 1.8.10
 \htmlonly
 <b>(release date 27-06-2015)</b>
 <a name="1.8.10"></a>
+</p>
 <ul>
 <li>change the build system to use cmake [<a href="http://github.com/doxygen/doxygen/commit/2e099b1950eee2c3a0d5d8ae4b25575caeb938b1">view</a>],
 [<a href="http://github.com/doxygen/doxygen/commit/ba9bb02abf6f6922a83beb2092e7bc270e6f25c1">view</a>],
 <li>version.py pass configure file path as parameter [<a href="http://github.com/doxygen/doxygen/commit/75e8f4c80ab5c06a33eaaf7ec587ee35ed9c1b1a">view</a>]</li>
 <li>xml: use STRIP_FROM_PATH on @file attributes. [<a href="http://github.com/doxygen/doxygen/commit/29ae707794042a97412eaa137fa7b30f2367294d">view</a>], [<a href="http://github.com/doxygen/doxygen/commit/5a0379944f8bdf883fdb25e94e0cdb1e5d2f4366">view</a>]</li>
 </ul>
+<p>
 \endhtmlonly
 
 \subsection log_1_8_9_1 Release 1.8.9.1
 \htmlonly
 <b>(release date 04-01-2015)</b>
 <a name="1.8.9.1"></a>
+</p>
 <ul>
 <li>Fixed a couple of cases where sharing string data could lead to corruption [<a href="http://github.com/doxygen/doxygen/commit/312bef563a5be72f6423377247db1b80044bf711">view</a>]</li>
 <li>Various VHDL related fixes [<a href="http://github.com/doxygen/doxygen/commit/34b00c442308efe169cc89fad62588fdce1d84e8">view</a>]</li>
 <li>Suggestion to use stripPrefix has been implemented for RESULT. For consistency also implemented for arguments. [<a href="http://github.com/doxygen/doxygen/commit/6720a714461b9454c7cdbae7ceff7eb735feeb3b">view</a>]</li>
 <li>Switched back to version 6.2 of JavaCC for VHDL parser generation. [<a href="http://github.com/doxygen/doxygen/commit/088896f27f460b6ac03c2d64df148e3617c1e519">view</a>]</li>
 </ul>
+<p>
 \endhtmlonly
 
 \subsection log_1_8_9 Release 1.8.9
 \htmlonly
 <b>(release date 25-12-2014)</b>
 <a name="1.8.9"></a>
+</p>
 <ul>
 <li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634763">634763</a> - Fortran: external subroutine as dummy argument not recognized [<a href="http://github.com/doxygen/doxygen/commit/8f78eff7e8b2650f9a8364ff5c5b6925279e6b5a">view</a>]</li>
 <li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634763">634763</a> - Fortran: external subroutine as dummy argument not recognized [<a href="http://github.com/doxygen/doxygen/commit/fabd1194a2e3c2536dddc19945c568a690b17031">view</a>]</li>
 <li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=741417">741417</a> - Crash when building gtkmm documentation [<a href="http://github.com/doxygen/doxygen/commit/050fce2b73d6e4455808ab86da2fddcf2f26e9b5">view</a>]</li>
 <li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=741778">741778</a> - \cite confused by labels ending with a dot (improved warning message) [<a href="http://github.com/doxygen/doxygen/commit/78fd02dc41384d81baddf17ff0bb3431267452fc">view</a>]</li>
 <li>fix docbook output [<a href="http://github.com/doxygen/doxygen/commit/1a403d80160458091bab7c442e54f836c0b90bca">view</a>]
-    <ol><li>support other than english
-        <li>fix broken example link id
-        <li>fix incomplete TOC : no Classe etc.
-        <li>add brief description for Functions etc.
-        <li>Comply with REPEAT_BRIEF 
-        <li>Do not output duplicated contents when detailed descripton is missing.
-        <li>set table colwidth for Param/RetVal 
+    <ol><li>support other than english</li>
+        <li>fix broken example link id</li>
+        <li>fix incomplete TOC : no Classe etc.</li>
+        <li>add brief description for Functions etc.</li>
+        <li>Comply with REPEAT_BRIEF </li>
+        <li>Do not output duplicated contents when detailed descripton is missing.</li>
+        <li>set table colwidth for Param/RetVal</li>
     </ol>
 </li>
 <li>Add missing escape in doxysearch.cpp when result contained a double quote [<a href="http://github.com/doxygen/doxygen/commit/08c9689157d7edc5d8e3369ef96f2ccd4b01c10c">view</a>]</li>
 <li>various fixes and restructuring [<a href="http://github.com/doxygen/doxygen/commit/223e7de6478019c8eebcfd87085fe22d3bfeec0e">view</a>]</li>
 <li>Various latex problems [<a href="http://github.com/doxygen/doxygen/commit/fb4dad1e1d9774e92d1509d1c2d3f8cb341826a1">view</a>]</li>
 </ul>
+<p>
 \endhtmlonly
 \subsection log_1_8_8 Release 1.8.8
 \htmlonly
 <b>(release date 21-08-2014)</b>
 <a name="1.8.8"></a>
+</p>
 <h3>New features</h3>
 <ul>
 <li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=731947">731947</a> - Support for PlantUML [<a href="http://github.com/doxygen/doxygen/commit/7506404e646f1fcc5a26ca6fca91a7f65154f05a">view</a>]</li>
 <li>resolves the error of unbalanced tags opened/closed in docbook output: parser error : Opening and ending tag mismatch: para line 358 and tbody [<a href="http://github.com/doxygen/doxygen/commit/d7b0858e079419bb7ea862e16946218a9352d5b5">view</a>]</li>
 <li>winbuild/pack_the_distribution_for_windows.py minor updates [<a href="http://github.com/doxygen/doxygen/commit/6d969cab51f4c32784966a28b8b9d5fe2d5b2089">view</a>]</li>
 </ul>
+<p>
 \endhtmlonly
 
 \subsection log_1_8_7 Release 1.8.7
 \htmlonly
 <b>(release date 21-04-2014)</b>
 <a name="1.8.7"></a>
+</p>
 <ul>
 <li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=436885">436885</a> - c-source and h-source missing for latex [<a href="http://github.com/doxygen/doxygen/commit/d5d34325fb9bed776cf2b4facc0c341f701e780b">view</a>]</li>
 <li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625601">625601</a> - FORTRAN: recognition free versus fixed formatted code [<a href="http://github.com/doxygen/doxygen/commit/2dec1060623165057628ee678eb3580351922408">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>
+<p>
 \endhtmlonly
 
 \subsection log_1_8_6 Release 1.8.6
 \htmlonly
 <b>(release date 24-12-2013)</b>
 <a name="1.8.6"></a>
+</p>
 <h3>Bug fixes</h3>
 <ul>
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=154880">154880</a> - if "using namespace" used, call of a static member function in C++ is not recognized or recognized wrong
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647517">647517</a>  - make install prepends a slash to the installation path Removed superfluous /
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668424">668424</a> - HTML links in RTF output are broken
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683897">683897</a> - class list not sorted?
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692004">692004</a> - show includes for free functions
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693537">693537</a> - Create possibility to keep user comments in Doxyfile
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701949">701949</a> - Latex: Hyperlinks for \secreflist / \refitem
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702265">702265</a> - Generated Doxyfile differs from result of doxygen -u (partial fix)
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705910">705910</a> - Indexing and searching cannot treat non ASCII identifiers
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706520">706520</a> - Fortran: in body documentation lands on wrong place In some cases, in propriety code, with in body Fortran documentation doxygen crashed. I REOPENED Bug_706520 for this
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706804">706804</a> - Fortran: Doxygen mixes up function-attributes with the return type test string should not be equal to "function" but should contain "function"
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706813">706813</a> - RPM build via spec file fails
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706874">706874</a> - Doxygen crash if missing new-line in a snippet
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706916">706916</a> - C++ exception specifications are no longer parsed correctly
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707102">707102</a> - update the Japanese translation
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707353">707353</a> - Accept IDs using unicode(non ASCII) characters in python codes
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707389">707389</a> - GENERATE_TREEVIEW=YES disables touch scrolling with Android 3.x
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707431">707431</a> - Cannot @ref or @link C++ operator overloads
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707483">707483</a> - Wrong page number and header in pdf output
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707554">707554</a> - When I use @INCLUDE DoxyWizard is closed Current directory was not changed at the right time so the include files could not be found in the "current" directory (i.e. the directory where the Doxyfile resides too, as this directory is shown as the current directory in the doxywizard). This is also important when the doxywizard is started from a shortcut.
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707567">707567</a> - Asterisks in comment wrongly displayed for @code
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707641">707641</a> - `FILTER_SOURCE_FILES=YES` required to build CALL_GRAPHS https://bugzilla.gnome.org/show_bug.cgi?id=707641
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707685">707685</a> - Fortran: error message when missing last EOL In case the original buffer in either fixed or free format code does not contain an EOL as last character, add it.
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707713">707713</a> - Add support for dia diagrams
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707825">707825</a> - Const treatment
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707925">707925</a> - False warning for Java "warning: missing ( in exception list on member"
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707985">707985</a> - Strange output when : appended to an parameter description
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707995">707995</a> - @copydoc not working for const member overloads
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=708446">708446</a> - Deprecated list breaks HTML tree with xhtml extension
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=708455">708455</a> - Enabling INLINE_SIMPLE_STRUCTS messes up Data Structures in tree
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=708806">708806</a> - Wrong path to graph_legend figure in graph_legend.html when CREATE_SUBDIRS = YES
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709052">709052</a> - Templated and non-templated method mixup documentation
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709226">709226</a> - Struct member fields not documented with INLINE_SIMPLE_STRUCTS
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709526">709526</a> - C++ parsing problem with operators &lt;&lt;, &lt;, &gt;, &gt;&gt; inside templates
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709706">709706</a> - Terminating C comments within markdown files breaks aliases
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709780">709780</a> - Copying of files via \image tag can get confused by symlinks at the destination
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709803">709803</a> - Generated hhc file contains an error for a section of a mainpage
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709845">709845</a> - Fortran: problem with types with name starting with is
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709870">709870</a> - Broken links on members HTML page when using BUILTIN_STL_SUPPORT
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709921">709921</a> - position of linebreak in template argument list affects inheritance relation
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=710917">710917</a> - Segfault while parsing a C file
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=710998">710998</a> - latex_count=5 is not enough
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711004">711004</a> - Vertical bars cannot be sent straight to makeindex
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711097">711097</a> - Compiler warnings because char is unsigned on ARM/PPC: "comparison is always false"
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711378">711378</a> - Nested Aliases fail when the nested alias has two or more arguments.
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711639">711639</a> - [PATCH] #include does not work with absolute paths
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711723">711723</a> - Comment /**/ confuses doxygen
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711787">711787</a> - Long initialization line in C stops doxygen An extra "breakpoint" in the input string has been created in the form of a , (comma), so for initialization lines the line will be shorter and the , (comma) will be copied later on.
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=712795">712795</a> - segmentation fault in memberdef.cpp
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=712819">712819</a> - Some external namespaces appear in list despite having ALLEXTERNALS = NO
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=715172">715172</a> - Consistently document Fortran's equivalent function bodies
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719389">719389</a> - HTML escaping incorrectly applied in source tooltips
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719422">719422</a> - private java class is mentioned in inherited by list of super class
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719463">719463</a> - Invalid null key and segmentation fault
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719489">719489</a> - Label "abstract" instead of "pure virtual" for Java language
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719525">719525</a> - Can't build because the definitions of ***YY_flex_debug are missing.
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719591">719591</a> - expand_as_defined macro does not properly work
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719639">719639</a> - @xrefitem with empty heading string
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720046">720046</a> - Document inline objective-C blocks
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720092">720092</a> - USE_MDFILE_AS_MAINPAGE doesn't work if full path is specified.
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720580">720580</a> - inline source browser shows wrong code with muilti-line c++11's raw strings
-<li> Add support for honoring svg image format preference in msc
-<li> Added @parblock and @endparblock commands
-<li> Added compile support for Mavericks
-<li> Added fix to avoid errors with older compilers.
-<li> Added generated files to gitignore
-<li> Added missing docs tag
-<li> Added missing pthread lib to doxyapp
-<li> Added missing space after @parblock
-<li> Added rudimentary support for Django like template system for output creation.
-<li> Added the possibility to specify the -d option in the Visual studio GUI on windows for the lex rules
-<li> Adjust internationalization part to current situation
-<li> Alignment of @code and @verbatim section When having a code and a verbatim section the boxes are not alligned, this patch fixes this. Example code, aa.c; standard Doxyfile: /** \file
-<li> Allow @ref to unlabeled markdown page by name, i.e. @ref mypage.md
-<li> Allow links to other markdown pages of the form [link text](page.md)
-<li> Avoid accessing uninitialized memory in fileToString
-<li> Build problem with unistd.h and Cygwin The standard g++ compiler under windows (win32-g++) has unistd.gh file; Microsoft windows does not have it, therfore it is better to use the winbuild directory in case of windows adn no dependency otherwise
-<li> Consistency in language part of the documentation Made documentation more inline with other parts of the documentation (regarding the way e.g. filenames are presented) Corrected some spelling errors Corrected the warning in the language.doc by placing ta reference to the files from which language.doc is generated Corrected the color for the languages that are still v1.4.6 (language name now also red  in stead of a pink background, was confusing with languages that were 1.5 / 1.6 compatible)
-<li> Corrected some inconsistencies in the comments
-<li> Debug output for lexical analyzer
-<li> Deleted generated files from source repository
-<li> Doxygen didn't allow @ref to parameters of type reference to an array.
-<li> Doxysearch under Cygwin should not have extension cgi.exe but just .cgi
-<li> Esperanto not supported by htmlhelp compiler reverting for esperanto to default language (US English)
-<li> Fixed a number of compiler warnings reported by newer clang compiler
-<li> Fixed compilation issues in doxyapp
-<li> Fixed compile warning
-<li> Fixed compiler warning related to implicit size_t to int conversion
-<li> Fixed constness warning
-<li> Fixed invalid if statement found by cppcheck
-<li> Fixed issue with Romanian translator preventing treeview from working
-<li> Fixed regression autolinking C# template such as MyGenericClass&lt;T&gt;.g()
-<li> Fixed regression in argument matching for the template example
-<li> Fortran added keyword IMPURE
-<li> French translator up-to-date.
-<li> Internal documentation for debug possibilities Documentation regarding usage of -d option with [f]lex Initial documentation regarding the -d options with doxygen
-<li> LaTeX: Fix ToC entries of index/bibliography
-<li> Made lexer rule explicit
-<li> Make Python detection in configure work with version older than 2.7
-<li> Minor layout tweaks and extra guard
-<li> More fixes for the Windows build
-<li> Patch regarding generating the rules file for the windows build regarding languages, some inconsistencies in the (windows) build system, corrections to some spelling.
-<li> Regenerated language.doc
-<li> Removed japanese characters in maintainers.txt as they break the build
-<li> Removed redundant backslashes in regexp pattern
-<li> Report details about fork() failure in logs.
-<li> Russian translator updated, new Russian maintainer added.
-<li> Small spelling correction to generate an rtf extensions file -&gt; to generate a rtf extensions file
-<li> Some texts can be independent of \htmlonly / \latexonly
-<li> Space missing in error message. the word 'in' and the vale of filesOption were concatenated
-<li> This patch contains changes regarding the build system so that the *nix and Windows systems use the same information (consistency). Some use names routine names have been changed (from .l files with -P option) to reflect the file name that generated the routines, this makes it easier to create a general procedure. A number of include / header files are files are generated from different file types (html, xml, js), due some limitations of the windows build system the generated file names had to be changed (the extension in the windows build system is only available including the '.' so e.g. the file jquery_fx.js generates now jquery_fx.js.h instead of jquery_fx_js.h) In the windows version the creation of .cpp files from .l files has been adjusted to correct for the YY_BUF_SIZE problems. Furthermore on windows (and also used on *nix) some commends have been replaced with python scripts so that on windows only python is need (besides flex and and bison). On *nix also perl is required for the generation using tmake.
-<li> Updated Visual Studio project files to include new source files
-<li> Usage of the -d opion corrected Giving an error when a wrong -d option is given. Made some error mesages more consistent. Corrected usage of the exit call, in case of an error: exit(1) otherwise exit(0). A closer look should be made on exitDoxygen as it does not contain any exit statements and it is unclear (to me) when it is used.
-<li> VHDL-2008 and arrays on unconstrained elements
-<li> consider currentFile when searching for global symbols
-<li> doc/language.doc generated from the updated sources (bgcolored)
-<li> doc/language.tpl -- UTF-8 reflected in the langhowto template
-<li> doc/language.tpl -- trailing spaces removed
-<li> doc/translator.py -- coloured status in HTML
-<li> doxygen /** style creates spurious code blocks with markdown enabled
-<li> doxygen version 1.8.5 throws many "Internal Inconsistency" errors when parsing .idl files
-<li> doxygen.sty.h was not ignored and not included/generated properly
-<li> testing dir was missing from 'make archive'
-<li> usage: make -d print dev doxygen options
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=154880">154880</a> - if "using namespace" used, call of a static member function in C++ is not recognized or recognized wrong</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647517">647517</a>  - make install prepends a slash to the installation path Removed superfluous /</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668424">668424</a> - HTML links in RTF output are broken</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683897">683897</a> - class list not sorted?</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692004">692004</a> - show includes for free functions</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693537">693537</a> - Create possibility to keep user comments in Doxyfile</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701949">701949</a> - Latex: Hyperlinks for \secreflist / \refitem</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702265">702265</a> - Generated Doxyfile differs from result of doxygen -u (partial fix)</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705910">705910</a> - Indexing and searching cannot treat non ASCII identifiers</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706520">706520</a> - Fortran: in body documentation lands on wrong place In some cases, in propriety code, with in body Fortran documentation doxygen crashed. I REOPENED Bug_706520 for this</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706804">706804</a> - Fortran: Doxygen mixes up function-attributes with the return type test string should not be equal to "function" but should contain "function"</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706813">706813</a> - RPM build via spec file fails</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706874">706874</a> - Doxygen crash if missing new-line in a snippet</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706916">706916</a> - C++ exception specifications are no longer parsed correctly</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707102">707102</a> - update the Japanese translation</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707353">707353</a> - Accept IDs using unicode(non ASCII) characters in python codes</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707389">707389</a> - GENERATE_TREEVIEW=YES disables touch scrolling with Android 3.x</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707431">707431</a> - Cannot @ref or @link C++ operator overloads</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707483">707483</a> - Wrong page number and header in pdf output</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707554">707554</a> - When I use @INCLUDE DoxyWizard is closed Current directory was not changed at the right time so the include files could not be found in the "current" directory (i.e. the directory where the Doxyfile resides too, as this directory is shown as the current directory in the doxywizard). This is also important when the doxywizard is started from a shortcut.</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707567">707567</a> - Asterisks in comment wrongly displayed for @code</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707641">707641</a> - `FILTER_SOURCE_FILES=YES` required to build CALL_GRAPHS https://bugzilla.gnome.org/show_bug.cgi?id=707641</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707685">707685</a> - Fortran: error message when missing last EOL In case the original buffer in either fixed or free format code does not contain an EOL as last character, add it.</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707713">707713</a> - Add support for dia diagrams</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707825">707825</a> - Const treatment</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707925">707925</a> - False warning for Java "warning: missing ( in exception list on member"</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707985">707985</a> - Strange output when : appended to an parameter description</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707995">707995</a> - @copydoc not working for const member overloads</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=708446">708446</a> - Deprecated list breaks HTML tree with xhtml extension</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=708455">708455</a> - Enabling INLINE_SIMPLE_STRUCTS messes up Data Structures in tree</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=708806">708806</a> - Wrong path to graph_legend figure in graph_legend.html when CREATE_SUBDIRS = YES</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709052">709052</a> - Templated and non-templated method mixup documentation</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709226">709226</a> - Struct member fields not documented with INLINE_SIMPLE_STRUCTS</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709526">709526</a> - C++ parsing problem with operators &lt;&lt;, &lt;, &gt;, &gt;&gt; inside templates</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709706">709706</a> - Terminating C comments within markdown files breaks aliases</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709780">709780</a> - Copying of files via \image tag can get confused by symlinks at the destination</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709803">709803</a> - Generated hhc file contains an error for a section of a mainpage</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709845">709845</a> - Fortran: problem with types with name starting with is</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709870">709870</a> - Broken links on members HTML page when using BUILTIN_STL_SUPPORT</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709921">709921</a> - position of linebreak in template argument list affects inheritance relation</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=710917">710917</a> - Segfault while parsing a C file</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=710998">710998</a> - latex_count=5 is not enough</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711004">711004</a> - Vertical bars cannot be sent straight to makeindex</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711097">711097</a> - Compiler warnings because char is unsigned on ARM/PPC: "comparison is always false"</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711378">711378</a> - Nested Aliases fail when the nested alias has two or more arguments.</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711639">711639</a> - [PATCH] #include does not work with absolute paths</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711723">711723</a> - Comment /**/ confuses doxygen</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711787">711787</a> - Long initialization line in C stops doxygen An extra "breakpoint" in the input string has been created in the form of a , (comma), so for initialization lines the line will be shorter and the , (comma) will be copied later on.</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=712795">712795</a> - segmentation fault in memberdef.cpp</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=712819">712819</a> - Some external namespaces appear in list despite having ALLEXTERNALS = NO</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=715172">715172</a> - Consistently document Fortran's equivalent function bodies</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719389">719389</a> - HTML escaping incorrectly applied in source tooltips</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719422">719422</a> - private java class is mentioned in inherited by list of super class</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719463">719463</a> - Invalid null key and segmentation fault</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719489">719489</a> - Label "abstract" instead of "pure virtual" for Java language</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719525">719525</a> - Can't build because the definitions of ***YY_flex_debug are missing.</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719591">719591</a> - expand_as_defined macro does not properly work</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719639">719639</a> - @xrefitem with empty heading string</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720046">720046</a> - Document inline objective-C blocks</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720092">720092</a> - USE_MDFILE_AS_MAINPAGE doesn't work if full path is specified.</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720580">720580</a> - inline source browser shows wrong code with muilti-line c++11's raw strings</li>
+<li> Add support for honoring svg image format preference in msc</li>
+<li> Added @parblock and @endparblock commands</li>
+<li> Added compile support for Mavericks</li>
+<li> Added fix to avoid errors with older compilers.</li>
+<li> Added generated files to gitignore</li>
+<li> Added missing docs tag</li>
+<li> Added missing pthread lib to doxyapp</li>
+<li> Added missing space after @parblock</li>
+<li> Added rudimentary support for Django like template system for output creation.</li>
+<li> Added the possibility to specify the -d option in the Visual studio GUI on windows for the lex rules</li>
+<li> Adjust internationalization part to current situation</li>
+<li> Alignment of @code and @verbatim section When having a code and a verbatim section the boxes are not alligned, this patch fixes this. Example code, aa.c; standard Doxyfile: /** \file</li>
+<li> Allow @ref to unlabeled markdown page by name, i.e. @ref mypage.md</li>
+<li> Allow links to other markdown pages of the form [link text](page.md)</li>
+<li> Avoid accessing uninitialized memory in fileToString</li>
+<li> Build problem with unistd.h and Cygwin The standard g++ compiler under windows (win32-g++) has unistd.gh file; Microsoft windows does not have it, therfore it is better to use the winbuild directory in case of windows adn no dependency otherwise</li>
+<li> Consistency in language part of the documentation Made documentation more inline with other parts of the documentation (regarding the way e.g. filenames are presented) Corrected some spelling errors Corrected the warning in the language.doc by placing ta reference to the files from which language.doc is generated Corrected the color for the languages that are still v1.4.6 (language name now also red  in stead of a pink background, was confusing with languages that were 1.5 / 1.6 compatible)</li>
+<li> Corrected some inconsistencies in the comments</li>
+<li> Debug output for lexical analyzer</li>
+<li> Deleted generated files from source repository</li>
+<li> Doxygen didn't allow @ref to parameters of type reference to an array.</li>
+<li> Doxysearch under Cygwin should not have extension cgi.exe but just .cgi</li>
+<li> Esperanto not supported by htmlhelp compiler reverting for esperanto to default language (US English)</li>
+<li> Fixed a number of compiler warnings reported by newer clang compiler</li>
+<li> Fixed compilation issues in doxyapp</li>
+<li> Fixed compile warning</li>
+<li> Fixed compiler warning related to implicit size_t to int conversion</li>
+<li> Fixed constness warning</li>
+<li> Fixed invalid if statement found by cppcheck</li>
+<li> Fixed issue with Romanian translator preventing treeview from working</li>
+<li> Fixed regression autolinking C# template such as MyGenericClass&lt;T&gt;.g()</li>
+<li> Fixed regression in argument matching for the template example</li>
+<li> Fortran added keyword IMPURE</li>
+<li> French translator up-to-date.</li>
+<li> Internal documentation for debug possibilities Documentation regarding usage of -d option with [f]lex Initial documentation regarding the -d options with doxygen</li>
+<li> LaTeX: Fix ToC entries of index/bibliography</li>
+<li> Made lexer rule explicit</li>
+<li> Make Python detection in configure work with version older than 2.7</li>
+<li> Minor layout tweaks and extra guard</li>
+<li> More fixes for the Windows build</li>
+<li> Patch regarding generating the rules file for the windows build regarding languages, some inconsistencies in the (windows) build system, corrections to some spelling.</li>
+<li> Regenerated language.doc</li>
+<li> Removed japanese characters in maintainers.txt as they break the build</li>
+<li> Removed redundant backslashes in regexp pattern</li>
+<li> Report details about fork() failure in logs.</li>
+<li> Russian translator updated, new Russian maintainer added.</li>
+<li> Small spelling correction to generate an rtf extensions file -&gt; to generate a rtf extensions file</li>
+<li> Some texts can be independent of \htmlonly / \latexonly</li>
+<li> Space missing in error message. the word 'in' and the vale of filesOption were concatenated</li>
+<li> This patch contains changes regarding the build system so that the *nix and Windows systems use the same information (consistency). Some use names routine names have been changed (from .l files with -P option) to reflect the file name that generated the routines, this makes it easier to create a general procedure. A number of include / header files are files are generated from different file types (html, xml, js), due some limitations of the windows build system the generated file names had to be changed (the extension in the windows build system is only available including the '.' so e.g. the file jquery_fx.js generates now jquery_fx.js.h instead of jquery_fx_js.h) In the windows version the creation of .cpp files from .l files has been adjusted to correct for the YY_BUF_SIZE problems. Furthermore on windows (and also used on *nix) some commends have been replaced with python scripts so that on windows only python is need (besides flex and and bison). On *nix also perl is required for the generation using tmake.</li>
+<li> Updated Visual Studio project files to include new source files</li>
+<li> Usage of the -d opion corrected Giving an error when a wrong -d option is given. Made some error mesages more consistent. Corrected usage of the exit call, in case of an error: exit(1) otherwise exit(0). A closer look should be made on exitDoxygen as it does not contain any exit statements and it is unclear (to me) when it is used.</li>
+<li> VHDL-2008 and arrays on unconstrained elements</li>
+<li> consider currentFile when searching for global symbols</li>
+<li> doc/language.doc generated from the updated sources (bgcolored)</li>
+<li> doc/language.tpl -- UTF-8 reflected in the langhowto template</li>
+<li> doc/language.tpl -- trailing spaces removed</li>
+<li> doc/translator.py -- coloured status in HTML</li>
+<li> doxygen /** style creates spurious code blocks with markdown enabled</li>
+<li> doxygen version 1.8.5 throws many "Internal Inconsistency" errors when parsing .idl files</li>
+<li> doxygen.sty.h was not ignored and not included/generated properly</li>
+<li> testing dir was missing from 'make archive'</li>
+<li> usage: make -d print dev doxygen options</li>
 </ul>
+<p>
 \endhtmlonly
 
 \subsection log_1_8_5 Release 1.8.5
 \htmlonly
 <b>(release date 23-08-2013)</b>
 <a name="1.8.5"></a>
+</p>
 <h3>Changes</h3>
 <ul>
 <li>Doxygen's source code is now managed using git and GitHub. Automatic builds
-    and regression tests are scheduled via Travis CI.
+    and regression tests are scheduled via Travis CI.</li>
 <li>Configuration data for the config file, the documentation, and the wizard
-    are now produced from a single source (thanks to Albert)
-<li>All translation files have been migrated to UTF-8 (thanks to Petr Prikryl)
-<li>Added black box testing framework and a set of tests.
+    are now produced from a single source (thanks to Albert)</li>
+<li>All translation files have been migrated to UTF-8 (thanks to Petr Prikryl)</li>
+<li>Added black box testing framework and a set of tests.</li>
 </ul>
 <h3>New features</h3>
 <ul>
-<li>Added SOURCE_TOOLTIPS option for advanced tooltip support while source browsing.
+<li>Added SOURCE_TOOLTIPS option for advanced tooltip support while source browsing.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668007">668007</a> - HTML commands - documentation of &lt;/dd&gt; tag missing
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676879">676879</a> - parameter on doxywizard manual Added sentenc in respect to possible argument for doxywizard Added images to the LaTex / pdf version of the manual
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684324">684324</a> - Strange behavior when placing cite within brief. 
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688858">688858</a> - SHORT_NAMES break references to \page in PDF output
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691315">691315</a> - Line breaks are not copied/displayed properly when using @copydoc. 
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691830">691830</a> - Logical confusion with DISABLE_INDEX and GENERATE_TREEVIEW
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694147">694147</a> - #undef is ignored by doxygen
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698998">698998</a> - vhdldocgen fails to generate proper latex for VHDL record type
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700385">700385</a> - Incorrectly parsed Q_PROPERTY with 'unsigned int' type
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700646">700646</a> - XML output does not handle HTML entities in titles
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700693">700693</a> - Duplicate entry for class template member function with no parameter
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700696">700696</a> - Template static member functions duplicated as non-static public
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700709">700709</a> - typedef warning when "using" some operator functions
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700710">700710</a> - Docbook output produces invalid XML for &lt;programlisting&gt; elements
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700740">700740</a> - Doxygen does not create links on C++ 11 style enum classes
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700788">700788</a> - support @cite within brief description.
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700908">700908</a> - code after \@cond is removed
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701295">701295</a> - Doxygen 1.8.4 goes into an endless loop
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701314">701314</a> - URLs are not created on C# classes in some cases
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701550">701550</a> - Error List window in Visual Studio no longer recognizes doxygen warnings
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701771">701771</a> - EXPAND_AS_DEFINED not working with some project structures
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701919">701919</a> - VHDL cross-references fail when unpaired apostrophe present
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702066">702066</a> - VHDL: Bad HTML formatting when using inline sources
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702170">702170</a> - Missing space before optional option in method argument list
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702189">702189</a> - Markdown and @image
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702491">702491</a> - UTF-16LE BOM not handled by source browser and \snippet
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702590">702590</a> - Crash with TAB_SIZE=-1
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702676">702676</a> - Closing ) of function in function documentation is in wrong color
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703574">703574</a> - Add configure options to enable static SQLite and non-standard SQLite
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703112">703112</a> - Backward documentation comments are not allowed in Fortran type-bound procedures
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703133">703133</a> - "operator--()" transformed to "operator&amp;ndash;()" in @copydoc
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703170">703170</a> - Segmentation fault parsing a fortran file
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703213">703213</a> - Can't use @ref instead of \ref with msc
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703301">703301</a> - Misleading warning about DOT font
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703791">703791</a> - Out-of-line docs for class template specialisations failing
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704079">704079</a> - Generated XML is malformed
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704172">704172</a> - Nested Aliases fail when the nested alias has two or more arguments.
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704412">704412</a> - doxygen don't hide private Inherited Members
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704971">704971</a> - Can't build with MinGW
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704973">704973</a> - Doxywizard can't show file names using non-ASCII(Unicode)
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705190">705190</a> - Incorrectly parsed Q_PROPERTY with 'long long' or 'long int' type
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705217">705217</a> - Can't use unicode characters to execute external commands
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705218">705218</a> - QRegExp doesn't work with 80-FF
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705219">705219</a> - Accept IDs using unicode for C/C++ preprocessor
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705586">705586</a> - @code tag as the last line of a comment block causes the parser to hang
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705702">705702</a> - Post-comment blocks on C++11 using definitions attach to following entity
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706236">706236</a> - Confusing use of GENERATE_TAGFILE
-<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706520">706520</a> - Fortran: in body documentation lands on wrong place
-<li> Small typo correceted in doxywizard_usage.doc Generated config.doc file in git is not identical to the generated one
-<li> Various improvements to the (still experimental) sqlite3 support (thanks to Adrian Negreanu)
-<li> jquery: use the env MINIFIER if specified
-<li> Some words now in code style __attribute__ was seen (markdown) as the bold word attribute Reformulation of a sentence due to a not nice split of word (__declspec was split directly after __ in pdf)
-<li> Extended list with supported options for automatic link generation
-<li> Added -v option (analogous to --version). In case option started with -- and is not a known valuue (help or version) and error is given instead of starting Doxygen
-<li> Fixed regression when nested class were processed before their parent
-<li> Minor changes to the way the code for config options is generated (thanks to Albert for the patch)
-<li> Brief description did not appear in the page index, when a page did not have any details.
-<li> Using &amp; in the project name caused invalid HTML and LaTeX output
-<li> Fixed regression caused by the patch for bug 705219
-<li> Fixed issue running dot on files with non-ascii characters
-<li> Delayed expanding the HTML navigation tree until after the page has loaded
-<li> Made some fixed to the configure script for Cygwin (thanks to David Stacey)
-<li> config.xml is now used to generate configoptions.cpp and config.doc
-<li> Fixed whitespace issue when using \overload without arguments
-<li> Avoid space in the output after \n command following by a newline.
-<li> Fixed problem handling C comments inside a \code block.
-<li> Improved handling of \internal and \endinternal
-<li> Removed extra newline when reading in an input file
-<li> Make XML output adhere to MAX_INITIALIZER_LINES
-<li> Fixed issue handling \elseif after \ifnot
-<li> Fixed regression that could cause double nested classes
-<li> Fixed issue handling \docbookonly..\enddocbookonly section
-<li> The language specifier in e.g. \code{.py} was ignored for the XML output
-<li> Fix reference to scoped enum imported via a tag file.
-<li> Replaced utf8 character that broke latex compilation of the manual
-<li> Fixed unused parameter warnings
-<li> Add support for writing and importing C++11 style enums to and from tag files
-<li> Fixed regression introduced by fixed bug Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700740">700740</a>
-<li> Fixed type in function name
-<li> Remove some unneeded and still enabled debug info
-<li> Included fix for "Constant Groups" regression on file pages (thanks to Michael Stahl) 
-<li> Add scopes to Fortran prototype name parsing (thanks to Oleg Batrashev).
-<li> Prototype scan for function, does not yet catch parameter types (thanks to Oleg Batrashev).
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668007">668007</a> - HTML commands - documentation of &lt;/dd&gt; tag missing</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676879">676879</a> - parameter on doxywizard manual Added sentenc in respect to possible argument for doxywizard Added images to the LaTex / pdf version of the manual</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684324">684324</a> - Strange behavior when placing cite within brief. </li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688858">688858</a> - SHORT_NAMES break references to \page in PDF output</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691315">691315</a> - Line breaks are not copied/displayed properly when using @copydoc. </li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691830">691830</a> - Logical confusion with DISABLE_INDEX and GENERATE_TREEVIEW</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694147">694147</a> - #undef is ignored by doxygen</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698998">698998</a> - vhdldocgen fails to generate proper latex for VHDL record type</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700385">700385</a> - Incorrectly parsed Q_PROPERTY with 'unsigned int' type</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700646">700646</a> - XML output does not handle HTML entities in titles</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700693">700693</a> - Duplicate entry for class template member function with no parameter</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700696">700696</a> - Template static member functions duplicated as non-static public</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700709">700709</a> - typedef warning when "using" some operator functions</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700710">700710</a> - Docbook output produces invalid XML for &lt;programlisting&gt; elements</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700740">700740</a> - Doxygen does not create links on C++ 11 style enum classes</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700788">700788</a> - support @cite within brief description.</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700908">700908</a> - code after \@cond is removed</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701295">701295</a> - Doxygen 1.8.4 goes into an endless loop</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701314">701314</a> - URLs are not created on C# classes in some cases</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701550">701550</a> - Error List window in Visual Studio no longer recognizes doxygen warnings</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701771">701771</a> - EXPAND_AS_DEFINED not working with some project structures</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701919">701919</a> - VHDL cross-references fail when unpaired apostrophe present</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702066">702066</a> - VHDL: Bad HTML formatting when using inline sources</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702170">702170</a> - Missing space before optional option in method argument list</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702189">702189</a> - Markdown and @image</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702491">702491</a> - UTF-16LE BOM not handled by source browser and \snippet</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702590">702590</a> - Crash with TAB_SIZE=-1</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702676">702676</a> - Closing ) of function in function documentation is in wrong color</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703574">703574</a> - Add configure options to enable static SQLite and non-standard SQLite</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703112">703112</a> - Backward documentation comments are not allowed in Fortran type-bound procedures</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703133">703133</a> - "operator--()" transformed to "operator&amp;ndash;()" in @copydoc</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703170">703170</a> - Segmentation fault parsing a fortran file</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703213">703213</a> - Can't use @ref instead of \ref with msc</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703301">703301</a> - Misleading warning about DOT font</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703791">703791</a> - Out-of-line docs for class template specialisations failing</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704079">704079</a> - Generated XML is malformed</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704172">704172</a> - Nested Aliases fail when the nested alias has two or more arguments.</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704412">704412</a> - doxygen don't hide private Inherited Members</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704971">704971</a> - Can't build with MinGW</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704973">704973</a> - Doxywizard can't show file names using non-ASCII(Unicode)</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705190">705190</a> - Incorrectly parsed Q_PROPERTY with 'long long' or 'long int' type</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705217">705217</a> - Can't use unicode characters to execute external commands</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705218">705218</a> - QRegExp doesn't work with 80-FF</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705219">705219</a> - Accept IDs using unicode for C/C++ preprocessor</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705586">705586</a> - @code tag as the last line of a comment block causes the parser to hang</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705702">705702</a> - Post-comment blocks on C++11 using definitions attach to following entity</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706236">706236</a> - Confusing use of GENERATE_TAGFILE</li>
+<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706520">706520</a> - Fortran: in body documentation lands on wrong place</li>
+<li> Small typo correceted in doxywizard_usage.doc Generated config.doc file in git is not identical to the generated one</li>
+<li> Various improvements to the (still experimental) sqlite3 support (thanks to Adrian Negreanu)</li>
+<li> jquery: use the env MINIFIER if specified</li>
+<li> Some words now in code style __attribute__ was seen (markdown) as the bold word attribute Reformulation of a sentence due to a not nice split of word (__declspec was split directly after __ in pdf)</li>
+<li> Extended list with supported options for automatic link generation</li>
+<li> Added -v option (analogous to --version). In case option started with -- and is not a known valuue (help or version) and error is given instead of starting Doxygen</li>
+<li> Fixed regression when nested class were processed before their parent</li>
+<li> Minor changes to the way the code for config options is generated (thanks to Albert for the patch)</li>
+<li> Brief description did not appear in the page index, when a page did not have any details.</li>
+<li> Using &amp; in the project name caused invalid HTML and LaTeX output</li>
+<li> Fixed regression caused by the patch for bug 705219</li>
+<li> Fixed issue running dot on files with non-ascii characters</li>
+<li> Delayed expanding the HTML navigation tree until after the page has loaded</li>
+<li> Made some fixed to the configure script for Cygwin (thanks to David Stacey)</li>
+<li> config.xml is now used to generate configoptions.cpp and config.doc</li>
+<li> Fixed whitespace issue when using \overload without arguments</li>
+<li> Avoid space in the output after \n command following by a newline.</li>
+<li> Fixed problem handling C comments inside a \code block.</li>
+<li> Improved handling of \internal and \endinternal</li>
+<li> Removed extra newline when reading in an input file</li>
+<li> Make XML output adhere to MAX_INITIALIZER_LINES</li>
+<li> Fixed issue handling \elseif after \ifnot</li>
+<li> Fixed regression that could cause double nested classes</li>
+<li> Fixed issue handling \docbookonly..\enddocbookonly section</li>
+<li> The language specifier in e.g. \code{.py} was ignored for the XML output</li>
+<li> Fix reference to scoped enum imported via a tag file.</li>
+<li> Replaced utf8 character that broke latex compilation of the manual</li>
+<li> Fixed unused parameter warnings</li>
+<li> Add support for writing and importing C++11 style enums to and from tag files</li>
+<li> Fixed regression introduced by fixed bug Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700740">700740</a></li>
+<li> Fixed type in function name</li>
+<li> Remove some unneeded and still enabled debug info</li>
+<li> Included fix for "Constant Groups" regression on file pages (thanks to Michael Stahl) </li>
+<li> Add scopes to Fortran prototype name parsing (thanks to Oleg Batrashev).</li>
+<li> Prototype scan for function, does not yet catch parameter types (thanks to Oleg Batrashev).</li>
 </ul>
+<p>
 \endhtmlonly
 
 \subsection log_1_8_4 Release 1.8.4
 \htmlonly
 <b>(release date 19-05-2013)</b>
 <a name="1.8.4"></a>
+</p>
 <h3>Changes</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686384">686384</a>: When INLINE_SIMPLE_STRUCTS is enabled, also structs with
-       simple typedefs will be inlined.
+       simple typedefs will be inlined.</li>
 <li>   Doxywizard: scrolling with mouse wheel no longer affects the values in
-       the expert view.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681733">681733</a>: More consistent warnings and errors.
+       the expert view.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681733">681733</a>: More consistent warnings and errors.</li>
 </ul>
 <h3>New features</h3>
 <ul>
        option. Then you get two new configuration options: CLANG_ASSISTED_PARSING 
        to enable or disable parsing via clang and CLANG_OPTIONS to pass additional 
        compiler options needed to compile the files. Note that enabling this feature 
-       has a significant performance penality.
+       has a significant performance penality.</li>
 <li>   Included patch donated by Intel which adds Docbook support.
        This can be enabled via GENERATE_DOCBOOK and the output location can
        be controlled using DOCBOOK_OUTPUT. Docbook specific sections can be
-       added using \docbookonly ... \enddocbookonly
+       added using \docbookonly ... \enddocbookonly</li>
 <li>   Added support for UNO IDL (interace language used in Open/Libre Office), thanks to
-       Michael Stahl for the patch.
+       Michael Stahl for the patch.</li>
 <li>   Included patch by Adrian Negreanu which stores data gathered by 
        doxygen in a sqlite3 database. Currently still work in progress and
-       can only be enabled using --with-sqlite3 during ./configure.
+       can only be enabled using --with-sqlite3 during ./configure.</li>
 <li>   For interactive SVG graphs, edges are now highlighted when hovered by
-       the mouse.
+       the mouse.</li>
 <li>   Include patch by Adrian Negreanu to show duration statistics after a run.
-       You can enable this by running doxygen with the "-d Time" option.
+       You can enable this by running doxygen with the "-d Time" option.</li>
 <li>   Included patch by Markus Geimer which adds a new option 
        LATEX_EXTRA_FILES which works similarily to HTML_EXTRA_FILES in that
-       it copied specified files to the LaTeX output directory.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698223">698223</a>: Added support for C++11 keyword alignas
+       it copied specified files to the LaTeX output directory.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698223">698223</a>: Added support for C++11 keyword alignas</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693178">693178</a>: Added support for processing DocSets with Dash (thanks to
-       Bogdan Popescu for the patch 
+       Bogdan Popescu for the patch </li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684782">684782</a>: Added option EXTERNAL_PAGES which can be used to determine
        whether or not pages importated via tags will appear under related 
-       pages (similar to EXTERNAL_GROUPS).
+       pages (similar to EXTERNAL_GROUPS).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692227">692227</a>: Added new MathJax command MATHJAX_CODEFILE which supports
        including a file with MathJax related scripting to be inserted before
-       the MathJax script is loaded. Thanks to Albert for the patch.
+       the MathJax script is loaded. Thanks to Albert for the patch.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693537">693537</a>: Comments in the config file starting with ## will now be 
        kept when upgrading the file with doxygen -u (and doxygen -s -u).
-       Thanks to Albert for the patch.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693422">693422</a>: Adds support for Latvian (thanks to a patch by Lauris).
-<li>   Included language updates for Ukrainian, Romanian, and Korean
+       Thanks to Albert for the patch.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693422">693422</a>: Adds support for Latvian (thanks to a patch by Lauris).</li>
+<li>   Included language updates for Ukrainian, Romanian, and Korean</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=145294">145294</a>: Fixed parse issue when using less than inside a template
-       argument.
+       argument.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=325266">325266</a> man page output was missing a linebreak before .SH when
-       definition a group with a section.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=338205">338205</a>: @anchor were wrong when CREATE_SUBDIRS was enabled.
+       definition a group with a section.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=338205">338205</a>: @anchor were wrong when CREATE_SUBDIRS was enabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=427012">427012</a>: Putting a @todo in front of an anonoymous namespace caused
-       bogus entry in the todo list.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=564462">564462</a>: Fixed alignment issue with tabs and multibyte characters.
+       bogus entry in the todo list.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=564462">564462</a>: Fixed alignment issue with tabs and multibyte characters.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567542">567542</a>: Character entities in titles were not rendered correctly 
-       in the HTML navigation tree.
+       in the HTML navigation tree.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=571561">571561</a>: No space between * and tag (e.g. \endcode) made parser
-       misbehave
+       misbehave</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=583233">583233</a>: Included patch to limit generated Doxyfile comments to 80
-       columns
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592626">592626</a>: Fixed off-by-one with MAX_DOT_GRAPH_DEPTH.
+       columns</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592626">592626</a>: Fixed off-by-one with MAX_DOT_GRAPH_DEPTH.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619790">619790</a>: Improved linking to template specializations.
-       Thanks to David Haney for the patch.
+       Thanks to David Haney for the patch.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=627712">627712</a>: Doxygen Header in C Files makes empty Lines in HTML Source
-       Code when starts in Line 1
+       Code when starts in Line 1</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639954">639954</a>: Fortran: array constructors with brackets were not correctly
-       recognized.
+       recognized.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646428">646428</a>: The generated man pages had a .PP just before the subject 
-       description
+       description</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646431">646431</a>: On generated manpages the return section is incorrectly 
-       indented
+       indented</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650004">650004</a>: use \page now generates a man page were the . is not 
-       replaced by _8.
+       replaced by _8.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=657704">657704</a>: Fixed issue with PROJECT_LOGO when using backslashes in
-       the path.
+       the path.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666008">666008</a>: Fortran: Using @var at module levele didn't work.
-       expect a file/path name.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673218">673218</a>: Replaced "echo -n" with "printf" in the configure script.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674856">674856</a>: Removed warning when using \endinternal
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675607">675607</a>: Added &, @, and # as allowed characters for commands that
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679626">679626</a>: Included patch by Abert to correctly link pages in the manual
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681874">681874</a>: Added support for single column Markdown tables.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682369">682369</a>: Incomplete documentation on doxygen -w latex
+       expect a file/path name.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673218">673218</a>: Replaced "echo -n" with "printf" in the configure script.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674856">674856</a>: Removed warning when using \endinternal</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675607">675607</a>: Added &amp;, @, and # as allowed characters for commands that</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679626">679626</a>: Included patch by Abert to correctly link pages in the manual</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681874">681874</a>: Added support for single column Markdown tables.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682369">682369</a>: Incomplete documentation on doxygen -w latex</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683516">683516</a>: Doxygen crashed when structural commands (like \var) appeared 
-       in .md files.
+       in .md files.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686259">686259</a>: Fixed character encoding problem when multibytes characters
-       were used in anchors.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691071">691071</a>: Documentation before an anonymous member did not appear.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692162">692162</a>: Fixed Markdown related indentation problem.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692320">692320</a>: Regression: Text after @copydoc was not visible anymore.
+       were used in anchors.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691071">691071</a>: Documentation before an anonymous member did not appear.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692162">692162</a>: Fixed Markdown related indentation problem.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692320">692320</a>: Regression: Text after @copydoc was not visible anymore.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692537">692537</a>: Linked to external pages was done using the page label 
-       rather than the file name.
+       rather than the file name.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693331">693331</a>: build using ./configure ; make did not work if the path
-       contained a space.
+       contained a space.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693406">693406</a>: Tag files are now identfied by the full path instead of
-       only the name of the tag file.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694376">694376</a>: In some cases members were missing from the tag file.
+       only the name of the tag file.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694376">694376</a>: In some cases members were missing from the tag file.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694027">694027</a>: Fortran: derive intent from documentation in case no 
-       intent is specified
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694610">694610</a>: Warning was not reported at the correct line in two cases.
+       intent is specified</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694610">694610</a>: Warning was not reported at the correct line in two cases.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694631">694631</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694632">694632</a>: @cond..@endcond did not work properly for removing
-       macro definitions.
+       macro definitions.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694685">694685</a>: Fixed crash when adding two different functions with the
-       same name to the same group.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694726">694726</a>: VHDL: fixed issue generating LaTeX output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=695277">695277</a>: Fortran: improved handling of protected statement
+       same name to the same group.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694726">694726</a>: VHDL: fixed issue generating LaTeX output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=695277">695277</a>: Fortran: improved handling of protected statement</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=695974">695974</a>: Fortran: Fixed issue resulting in 
-       "Stack buffers nested too deeply" error.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=696708">696708</a>: @cond was not handled properly by the preprocessor.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=697233">697233</a>: @copyright command did not end a brief description.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=697249">697249</a>: Markdown tables caused errors reported at wrong line number.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=697494">697494</a>: Removed double entry from the messages produced by doxygen.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698818">698818</a>: Fixed problem handling @cond for #define's
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698007">698007</a>: Fixed potential crash when searching files.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=696925">696925</a>: #include's inside namespace could result in duplicate entries.
+       "Stack buffers nested too deeply" error.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=696708">696708</a>: @cond was not handled properly by the preprocessor.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=697233">697233</a>: @copyright command did not end a brief description.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=697249">697249</a>: Markdown tables caused errors reported at wrong line number.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=697494">697494</a>: Removed double entry from the messages produced by doxygen.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698818">698818</a>: Fixed problem handling @cond for #define's</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698007">698007</a>: Fixed potential crash when searching files.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=696925">696925</a>: #include's inside namespace could result in duplicate entries.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=696954">696954</a>: Doxywizard: Labels of items are now also grayed out 
-       when an item is disabled (thanks to Albert for the patch).
+       when an item is disabled (thanks to Albert for the patch).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699195">699195</a>: Changed Markdown page label to support multiple .md files
-       with the same name.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699218">699218</a>: Fixed issue with margin computation in resize.js.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699381">699381</a>: Lonely h4,h5,h6 end tag caused assert.
+       with the same name.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699218">699218</a>: Fixed issue with margin computation in resize.js.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699381">699381</a>: Lonely h4,h5,h6 end tag caused assert.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699437">699437</a>: Trailing comments were not always rendered properly if
-       MARKDOWN_SUPPORT was enabled.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699460">699460</a>: Updated doxygen man page (thanks to Manuel for the patch).
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699464">699464</a>: Added reference to \xmlonly and \docbookonly in \htmlonly
+       MARKDOWN_SUPPORT was enabled.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699460">699460</a>: Updated doxygen man page (thanks to Manuel for the patch).</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699464">699464</a>: Added reference to \xmlonly and \docbookonly in \htmlonly</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699731">699731</a>: LaTeX: switch to using the xtabular package instead of
-       longtable to prevent overfull vbox errors.
+       longtable to prevent overfull vbox errors.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699732">699732</a>: Template parameters and Exceptions were rendered differently
-       than Parameters and Return Values in the LaTeX output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700153">700153</a>: Tcl: Fixed crash when parsing certain Tcl code.
+       than Parameters and Return Values in the LaTeX output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700153">700153</a>: Tcl: Fixed crash when parsing certain Tcl code.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700345">700345</a>: Comment blocking ending with ///// made slashes appear in 
-       the output.
+       the output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700456">700456</a>: Added support for separating auto list items with an
-       empty paragraph.
-<li>   Included a couple of VHDL fixes (thanks to Martin Kreis for the patch)
-<li>   \include and \includelineno both showed line numbers.
+       empty paragraph.</li>
+<li>   Included a couple of VHDL fixes (thanks to Martin Kreis for the patch)</li>
+<li>   \include and \includelineno both showed line numbers.</li>
 <li>   Putting '// @endverbatim' inside a C comment block was not handled
-       properly by the preprocessor.
+       properly by the preprocessor.</li>
 <li>   Fixed various typo's in the manual and improved cross referencing
-       (thanks to Albert and Guillem Jover for their help)
-<li>   Added a couple of missing configuration dependencies.
+       (thanks to Albert and Guillem Jover for their help)</li>
+<li>   Added a couple of missing configuration dependencies.</li>
 </ul>
+<p>
 \endhtmlonly
 
 \subsection log_1_8_3_1 Release 1.8.3.1
 \htmlonly
 <b>(release date 20-01-2013)</b>
 <a name="1.8.3.1"></a>
+</p>
 <h3>Changes</h3>
 <ul>
 <li>   Changed to way the search results for multiple projects can be linked 
        together. A project is now no longer identified by the tag files name but
-       via new option EXTERNAL_SEARCH_ID giving a bit more flexibility.
+       via new option EXTERNAL_SEARCH_ID giving a bit more flexibility.</li>
 <li>   Disabled the disk cache for member data. Allows removing quite some complexity
        in doxygen and is not really needed now that 64bit systems with &gt;4GB RAM 
-       are becoming more common. Let me know if you think you benefit from this caching.
+       are becoming more common. Let me know if you think you benefit from this caching.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691607">691607</a>: Using $relpath$ in a custom footer could lead to ambiguities
        when followed by a name that could also be a marker, like 'search'.
        Now $relpath^ should be used instead. $relpath$ is still supported for
-       backward compatibility.
+       backward compatibility.</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   You can now use EXTENSION_MAPPING on files without any extension using
-       no_extension as placeholder (thanks to Jason Majors for the patch).
+       no_extension as placeholder (thanks to Jason Majors for the patch).</li>
 <li>   To make navindex section inside a layout file that links to 
-       a specific URL you can use usergroup with the url attribute.
+       a specific URL you can use usergroup with the url attribute.</li>
 <li>   To make navindex section without any link inside a layout file you 
-       can use usergroup with special title [none].
+       can use usergroup with special title [none].</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=644350">644350</a>: Fortran: Included patch to improve parsing line continuation 
-       characters.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=645423">645423</a>: Fortran: added support for protected attribute
+       characters.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=645423">645423</a>: Fortran: added support for protected attribute</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682550">682550</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691315">691315</a>: When using @copydoc, paragraphs breaks did not appear 
-       in the copied documentation.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686581">686581</a>: Fortran: handle single quotes in normal Fortran comment.
+       in the copied documentation.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686581">686581</a>: Fortran: handle single quotes in normal Fortran comment.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686689">686689</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691335">691335</a>: Scope of forwardly declared template class was lost 
-       in the output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689713">689713</a>: Tcl: Inline source code was not rendered correctly.
+       in the output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689713">689713</a>: Tcl: Inline source code was not rendered correctly.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690787">690787</a>: Fixed case were a cyclic inheritance relation could crash 
-       doxygen.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690831">690831</a>: Using @subpage in a -# style list was not handled properly.
+       doxygen.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690831">690831</a>: Using @subpage in a -# style list was not handled properly.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691000">691000</a>: For a mainpage without title the project name is now shown as
-       the title in the XML output.
+       the title in the XML output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691277">691277</a>: The generated list of citations is now no longer included in 
-       the tag file.
+       the tag file.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691073">691073</a>: Documenting strongly typed enum values outside of the enum 
-       did not work.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691310">691310</a>: Python: = was missing in the output for variable assignment.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691323">691323</a>: Doxygen could crash when creating inline msc graphs.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691340">691340</a>: Members didn't have a More.. link to jump to detailed docs.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691602">691602</a>: Doxygen did not probably distinguish between two template
+       did not work.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691310">691310</a>: Python: = was missing in the output for variable assignment.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691323">691323</a>: Doxygen could crash when creating inline msc graphs.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691340">691340</a>: Members didn't have a More.. link to jump to detailed docs.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691602">691602</a>: Doxygen did not probably distinguish between two template</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691798">691798</a>: regression: C++ style comments that started with a line of 
-       slashes did not get processed correctly anymore. 
+       slashes did not get processed correctly anymore. </li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692031">692031</a>: Fixed parse error when left shift operator occurred as a 
        default parameter.
-       members or functions that only differ in the return type.
+       members or functions that only differ in the return type.</li>
 <li>   Setting SEARCH_INCLUDES to NO resulted in no include graphs and no
-       include files being listed in the output.
-<li>   Improved support for MinGW (thanks to a patch by Brecht Sanders).
+       include files being listed in the output.</li>
+<li>   Improved support for MinGW (thanks to a patch by Brecht Sanders).</li>
 <li>   Removed the Graphviz/dot dependency when building the doxygen 
-       documentation.
-<li>   Anchors to sub pages were wrong in the XML output.
+       documentation.</li>
+<li>   Anchors to sub pages were wrong in the XML output.</li>
 <li>   Included VHDL patch by Martin Kreis that improves the flow chart 
-       generation.
+       generation.</li>
 <li>   corrected several code pages and fontsets for proper RTF output for
-       a number of languages such as Greek.
+       a number of languages such as Greek.</li>
 </ul>
+<p>
 \endhtmlonly
 \subsection log_1_8_3 Release 1.8.3
 \htmlonly
 <a name="1.8.3"></a>
 <b>(release date 26-12-2012)</b>
+</p>
 <h3>Changes</h3>
 <ul>
 <li>   Expanding the tree in an index page of the HTML output, will now 
        expand only one level instead of the whole sub-tree (thanks to
-       Pez Cuckow for the patch).
+       Pez Cuckow for the patch).</li>
 <li>   A blockquote in Markdown does no longer require a whitespace
-       after the last '&gt;' if the '&gt;' is followed by a newline.
+       after the last '&gt;' if the '&gt;' is followed by a newline.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682718">682718</a>: Included patch to add version info to all generated 
-       template files (headers, footers, stylesheets, layout files, etc).
+       template files (headers, footers, stylesheets, layout files, etc).</li>
 </ul>
 <h3>New features</h3>
 <ul>
        feature), SEARCHENGINE_URL (to specify the URL of the search engine),
        SEARCHDATA_FILE (to specify the name of the raw search data to index),
        EXTRA_SEARCH_MAPPINGS (for search through multiple projects).
-       See the <a href="extsearch.html">manual</a> for details.
+       See the <a href="extsearch.html">manual</a> for details.</li>
 <li>   Added USE_MDFILE_AS_MAINPAGE config option to select a markdown page to
-       be used as the main page.
+       be used as the main page.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=630645">630645</a>: This patch (contributed by Albert) adds support for 
        simple logic expressions for \cond, \if, and friends, i.e. you can do
-       \if (SOME_SECTION_NAME &amp;&amp; (!THIS_ALTERNATIVE || THAT_ALTERNATIVE))
+       \if (SOME_SECTION_NAME &amp;&amp; (!THIS_ALTERNATIVE || THAT_ALTERNATIVE))</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684152">684152</a>: Patch (contributed by Albert) adds a new configuration 
        option MATHJAX_FORMAT to select the MathJax output format. Options are
-       HTML-CSS, NativeMML, or SVG.
+       HTML-CSS, NativeMML, or SVG.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670853">670853</a>: Fixed compile issues with 0 to QCString cast for 
-       old compilers.
+       old compilers.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678139">678139</a>: A class A deriving from another class B inside a namespace
-       not known to doxygen, caused class B to appear in the global scope.
+       not known to doxygen, caused class B to appear in the global scope.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681209">681209</a>: Fixed problem processing .bib files when they were located
-       in a path containing spaces.
+       in a path containing spaces.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681830">681830</a>: Using \addindex in a page will now produce a link to the
-       word, instead of the start of the page.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681831">681831</a>: The TREEVIEW_WIDTH option did not have any effect.
+       word, instead of the start of the page.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681831">681831</a>: The TREEVIEW_WIDTH option did not have any effect.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681898">681898</a>: Jumping from a level 3 section to a level 1 section did
-       not appear correctly in the page TOC.
+       not appear correctly in the page TOC.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681976">681976</a>: C++11: Improved handling of noexcept expressions, e.g.:
-       <code>Test() noexcept ( noexcept(T::T()) ) = default;</code>
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682048">682048</a>: Improved SIGINT handling when running multiple dot instances.
+       <code>Test() noexcept ( noexcept(T::T()) ) = default;</code></li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682048">682048</a>: Improved SIGINT handling when running multiple dot instances.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682602">682602</a>: Fixed problem processing .bib files when using a non default
-       output directory.
+       output directory.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682713">682713</a>: Comment for IDL_PROPERTY_SUPPORT in the config file template 
-       did not have line wrapping.
+       did not have line wrapping.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682728">682728</a>: Setting SHOW_FILES to NO prevented call graphs from being
-       generated.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682740">682740</a>: Fortran: In initialization statement the "=" was missing
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683284">683284</a>: Fortran: ALIASes where not replaced in !! and !&lt; comments.
+       generated.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682740">682740</a>: Fortran: In initialization statement the "=" was missing</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683284">683284</a>: Fortran: ALIASes where not replaced in !! and !&lt; comments.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683976">683976</a>: Added meta tag "generator" to HTML output (thanks to
-       Albert for the patch).
+       Albert for the patch).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684781">684781</a>: Sections of the main page did not appear in the 
        navigation tree until the main page had sub pages.
        Also fixed bug in treeview that caused mainpage with title and
-       sections to appear at the same level as the sections.
+       sections to appear at the same level as the sections.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685125">685125</a>: Doxygen could select the wrong overloaded method when 
        the only difference in parameter types was the template type of 
-       a typedef.
+       a typedef.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685181">685181</a>: Inheriting member documentation did not work in combination
-       with Java interfaces.
+       with Java interfaces.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685623">685623</a>: Enum values did not appear in the detailed documentation 
-       when using C++11 style enums.
+       when using C++11 style enums.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685879">685879</a>: Even though HIDE_UNDOC_MEMBERS was enabled, the navigation
-       still showed undocumented members.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685940">685940</a>: Fixed back button behaviour when using the navigation tree.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686284">686284</a>: Added anchors to refs in the index.qhp TOC.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686826">686826</a>: Added XML declaration to index.qhp TOC.
+       still showed undocumented members.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685940">685940</a>: Fixed back button behaviour when using the navigation tree.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686284">686284</a>: Added anchors to refs in the index.qhp TOC.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686826">686826</a>: Added XML declaration to index.qhp TOC.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686956">686956</a>: When a class and its base class has the same nested class,
-       the collaboration diagram could point to the wrong class.
+       the collaboration diagram could point to the wrong class.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686983">686983</a>: Comments inside a function macro parameter appeared before 
-       the expanded macro, instead of being treated as part of the parameter.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=687301">687301</a>: Allow minus in the name of a HTML attribute.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=687572">687572</a>: Code fragments were wrapped too early in the latex output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688226">688226</a>: Fixed Qt version number in ./configure --help text.
+       the expanded macro, instead of being treated as part of the parameter.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=687301">687301</a>: Allow minus in the name of a HTML attribute.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=687572">687572</a>: Code fragments were wrapped too early in the latex output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688226">688226</a>: Fixed Qt version number in ./configure --help text.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688463">688463</a>: Included patch to prevent processing identifiers starting
-       with _ or __ as markdown.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688531">688531</a>: Horizontal ruler inside paragraph caused missing &lt;/p&gt;
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688542">688542</a>: Using "usergroup" in the layout.xml caused missing &lt;div&gt;
+       with _ or __ as markdown.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688531">688531</a>: Horizontal ruler inside paragraph caused missing &lt;/p&gt;</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688542">688542</a>: Using "usergroup" in the layout.xml caused missing &lt;div&gt;</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688739">688739</a>: Fixed problem with user defined entries in the eclipse help
-       index (thanks to Rene Papenhoven for the fix).
+       index (thanks to Rene Papenhoven for the fix).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688647">688647</a>: Fixed problem parsing initializer list with C++11 style
-       uniform types.
+       uniform types.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689341">689341</a>: \if around list item preceded by whitespace caused wrong
-       list in the output. 
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689461">689461</a>: Correct link in documentation of SIP_SUPPORT option.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689720">689720</a>: Fixed bug that could prevent refman.tex from being generated.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689833">689833</a>: Fixed missing space in Chinese translation.
+       list in the output. </li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689461">689461</a>: Correct link in documentation of SIP_SUPPORT option.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689720">689720</a>: Fixed bug that could prevent refman.tex from being generated.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689833">689833</a>: Fixed missing space in Chinese translation.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690093">690093</a>: Files added via HTML_EXTRA_STYLESHEET did not correct refer 
-       to files that where placed in a subdirectory.
+       to files that where placed in a subdirectory.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690190">690190</a>: Searching for multibyte characters did not work with the 
-       server based search engine.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690250">690250</a>: Fixed case where line numbers got out of sync with the code.
+       server based search engine.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690250">690250</a>: Fixed case where line numbers got out of sync with the code.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690341">690341</a>: First member of an anonymous C++11 style enum was not shown
-       properly.
+       properly.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690385">690385</a>: Fixed case where _'s where falsely converted to Markdown 
-       emphasis.
+       emphasis.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690403">690403</a>: Title not used when \ref'ing to a \section imported via 
-       a tag file.
+       a tag file.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690418">690418</a>: Behavior of @cond was accidentally reversed by new expression
-       parser.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690602">690602</a>: Fixed problems handling @cond inside /// comments.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690629">690629</a>: Fixed case where doxygen would during preprocessing.
+       parser.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690602">690602</a>: Fixed problems handling @cond inside /// comments.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690629">690629</a>: Fixed case where doxygen would during preprocessing.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690685">690685</a>: A file specified using HTML_EXTRA_STYLEHSHEET did not end
-       up in the Qt Help index.
-<li>   Improved the way enum's are rendered in the HTML output.
+       up in the Qt Help index.</li>
+<li>   Improved the way enum's are rendered in the HTML output.</li>
 <li>   When inlining structs (INLINE_SIMPLE_STRUCTS=YES) a &lt;p&gt; was missing
-       for members with a detailed description, causing invalid XHTML.
+       for members with a detailed description, causing invalid XHTML.</li>
 <li>   Fixed problem loading the navigation tree when using .xhtml as the
-       file extension.
+       file extension.</li>
 <li>   The navigation tree was not always correctly positioned upon initial
-       load when using Chrome.
+       load when using Chrome.</li>
 <li>   HTML Navigation tree showed static members even when EXTRACT_STATIC was
-       set to NO.
+       set to NO.</li>
 <li>   Same word could appear multiple times in the match list for an entry 
-       in the search results when using server based search.
+       in the search results when using server based search.</li>
 </ul>
+<p>
 \endhtmlonly
 \subsection log_1_8_2 Release 1.8.2
 \htmlonly
 <a name="1.8.2"></a>
 <b>(release date 11-08-2012)</b>
+</p>
 <h3>Changes</h3>
 <ul>
 <li>   Using a fenched block (~~~~) in Markdown without explicit extension will 
        now be interpreted as a @code..@endcode block instead 
-       of @verbatim..@endverbatim.
+       of @verbatim..@endverbatim.</li>
 <li>   Classes inheriting from an class that is outside the scope of doxygen
-       are still shown in diagrams. This does not hold for usage relations.
+       are still shown in diagrams. This does not hold for usage relations.</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   Added support for C++11:
        <ul>
        <li> strongly typed enums, e.g.:
-            <pre>enum class E</pre>
+            <pre>enum class E</pre></li>
        <li> enums with explicit type, e.g.: 
-            <pre>enum E : unsigned int { ... }</pre>
-       <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678097">678097</a>: added support for final keyword on classes and methods.
-       <li> support for override keyword for methods.
-       <li> <code>nullptr</code> is new a type keyword in code fragments.
+            <pre>enum E : unsigned int { ... }</pre></li>
+       <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678097">678097</a>: added support for final keyword on classes and methods.</li>
+       <li> support for override keyword for methods.</li>
+       <li> <code>nullptr</code> is new a type keyword in code fragments.</li>
        <li> support for variables with initializer lists, 
-         e.g.: <pre>const int var {10};</pre>
+         e.g.: <pre>const int var {10};</pre></li>
        <li> support for trailing return types, 
-         e.g.: <pre>auto foo() -&gt; Bar;</pre>
+         e.g.: <pre>auto foo() -&gt; Bar;</pre></li>
        <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672372">672372</a>: added support for template aliases, 
-         e.g.: <pre>template&lt;typename T&gt; using A = B&lt;T&gt;;</pre>
+         e.g.: <pre>template&lt;typename T&gt; using A = B&lt;T&gt;;</pre></li>
        <li> support for C++11 variadic templates, 
-         e.g.: <pre>template&lt;typename... Values&gt; class C;</pre>
-       <li> support for documenting template class declarations.
-       <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680098">680098</a>: <code>static_assert(...);</code> inside a class is now ignored.
+         e.g.: <pre>template&lt;typename... Values&gt; class C;</pre></li>
+       <li> support for documenting template class declarations.</li>
+       <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680098">680098</a>: <code>static_assert(...);</code> inside a class is now ignored.</li>
        <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679740">679740</a>: Add support parameters with default lambda functions, 
-         e.g.:  <pre>int foo(int i, std::function&lt;int(int)&gt; f = [](int x) -&gt; int { return x / 2; })</pre>
+         e.g.:  <pre>int foo(int i, std::function&lt;int(int)&gt; f = [](int x) -&gt; int { return x / 2; })</pre></li>
        <li> default initializers for non-static data members, 
-         e.g.:  <pre>class C { public: int x = 4; int y {6}; int z = y*func(); };</pre>
+         e.g.:  <pre>class C { public: int x = 4; int y {6}; int z = y*func(); };</pre></li>
        <li> support for decltype as a way selecting a type for a variable, 
-         e.g.: <pre>int x; decltype(x) y;</pre>
+         e.g.: <pre>int x; decltype(x) y;</pre></li>
        <li> support for new string literals, 
-         e.g.  <pre>u8"utf8", u"utf-16", U"utf-32", L"wchar"</pre>
+         e.g.  <pre>u8"utf8", u"utf-16", U"utf-32", L"wchar"</pre></li>
        <li> support for raw string literals (with and without user defined 
          delimiter), 
-         e.g.  <pre>R"(some"thing)", u8R"raw(some)"thing)raw"</pre>
+         e.g.  <pre>R"(some"thing)", u8R"raw(some)"thing)raw"</pre></li>
        <li> support for explictly deleted and defaulted special members 
-         (<code>=default</code> and <code>=delete</code>).
-       </ul>
+         (<code>=default</code> and <code>=delete</code>).</li>
+       </ul></li>
 <li>   Made several improvements to the way Objective-C categories and protocols 
        are handled:
        <ul>
        <li> Class extensions are now treated as part of the class, whereas 
-         categories are listed separately.
-       <li> Fixed parse problem where category had a { } section.
-       <li> Fixed parse problem for categories that implemented protocols.
-       <li> Fixed render bug for protocols in class diagrams.
-       <li> Attributes with the same name as a method are now no longer matched.
-       <li> Internal properties are now also marked with [implementation]
+         categories are listed separately.</li>
+       <li> Fixed parse problem where category had a { } section.</li>
+       <li> Fixed parse problem for categories that implemented protocols.</li>
+       <li> Fixed render bug for protocols in class diagrams.</li>
+       <li> Attributes with the same name as a method are now no longer matched.</li>
+       <li> Internal properties are now also marked with [implementation]</li>
        <li> Members of categories are shown in the class they extend as well, and 
-         cross reference links are made between these members.
+         cross reference links are made between these members.</li>
        <li> Class extension implementing protocols are now shown as protocols
-         inherited by the class itself, including the "Implemented by" relation.
-       </ul>
+         inherited by the class itself, including the "Implemented by" relation.</li>
+       </ul></li>
 <li>   Added option HTML_EXTRA_STYLESHEET which allows adding an additional
-       stylesheet without completely replacing doxygen.css.
+       stylesheet without completely replacing doxygen.css.</li>
 <li>   Added option AUTOLINK_SUPPORT which can be used to enable/disable
-       autolinking globally.
+       autolinking globally.</li>
 <li>   Included language updates for Czech, Spanish, Greek, Slovak, and 
-       Esparanto.
+       Esparanto.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
 <li>   Fixed render glitch where template member of a base class was not
-       properly hidden in the derived class.
+       properly hidden in the derived class.</li>
 <li>   Privately nested classes no longer appear in the declaration section 
-       of their parent if EXTRACT_PRIVATE is disabled.
+       of their parent if EXTRACT_PRIVATE is disabled.</li>
 <li>   In the declaration section the separator line was in between the
-       member and its brief description.
-<li>   Fixed a couple of compiler warning with the new XCode 4.4 compiler.
-<li>   Added compilation support for Mountain Lion (Mac OS X 10.8).
+       member and its brief description.</li>
+<li>   Fixed a couple of compiler warning with the new XCode 4.4 compiler.</li>
+<li>   Added compilation support for Mountain Lion (Mac OS X 10.8).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679631">679631</a>: Nested namespaces did not appear in the namespace list if the 
-       parent namespace was undocumented.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680227">680227</a>: Fixed some spelling errors in the code comments.
+       parent namespace was undocumented.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680227">680227</a>: Fixed some spelling errors in the code comments.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680398">680398</a>: Fortran:  comma at begin of argument list description in 
-       case of implicit type
+       case of implicit type</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680405">680405</a>: Fortran: Entities on line with USE, ONLY were not hyperlinked 
-       in code.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680408">680408</a>: Fortran: handle carriage return in non terminated strings.
+       in code.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680408">680408</a>: Fortran: handle carriage return in non terminated strings.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680492">680492</a>: Using Markdown formatting in @todo/@bug/.. like descriptions
-       did not work.
+       did not work.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680575">680575</a>: Fixed potential crash when &lt;code&gt; appeared inside &lt;summary&gt;
-       for C# code.
+       for C# code.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680697">680697</a>: \xrefitems of the same type are not grouped together under
-       the same heading (just like \todo and friends). 
+       the same heading (just like \todo and friends). </li>
 <li>   Fixed case where full directory path was shown even though
-       FULL_PATH_NAMES was set to NO.
+       FULL_PATH_NAMES was set to NO.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680709">680709</a>: HTML output of template-derived classes contained unescaped 
-       characters.
+       characters.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679963">679963</a>: "Class Index" appeared twice in the PDF TOC, Index at the 
-       end did not appear at all.
+       end did not appear at all.</li>
 <li>   In a declaration no link was created when referring to a class inside 
-       an undocumented namespace imported via a tag file.
+       an undocumented namespace imported via a tag file.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681281">681281</a>: Make default for TAB_SIZE 4 and added remark in Markdown
        section of the manual about the effect of TAB_SIZE on code block 
-       processing when using tabs in the comment block.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681023">681023</a>: Project logo was not included in the Qt help output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680992">680992</a>: Fixed a couple of typos in the comments.
+       processing when using tabs in the comment block.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681023">681023</a>: Project logo was not included in the Qt help output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680992">680992</a>: Fixed a couple of typos in the comments.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681350">681350</a>: Fixed a problem with Markdown processing of a @code block
-       inside an indented /// style comment.
+       inside an indented /// style comment.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679928">679928</a>: Disabled section level correction for Markdown pages as
-       is was confusing.
+       it was confusing.</li>
 </ul>
+<p>
 \endhtmlonly
 \subsection log_1_8_1_2 Release 1.8.1.2
 \htmlonly
 <a name="1.8.1.2"></a>
 <b>(release date 12-07-2012)</b>
+</p>
 <h3>Changes</h3>
 <ul>
 <li>   doxygen now strips the leading indentation shared by the lines in a 
-       @code..@endcode block.
+       @code..@endcode block.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678218">678218</a>: Changed title of the SVG graphs from 'G' to the root node
-       of the graph.
+       of the graph.</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   Added button in the navigation tree to allow enabling/disabling 
-       syncing the navigation tree with the content.
+       syncing the navigation tree with the content.</li>
 <li>   Extended the number of HTML entities with Greek letters and other 
-       symbols (thanks to Charles Karney for the patch).
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=663645">663645</a>: Added support for C++11 strongly typed enums 
-       (enum class E { ... }).
+       symbols (thanks to Charles Karney for the patch).</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=663645">663645</a>: Added support for C++11 strongly typed enums
+       (enum class E { ... }).</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=590518">590518</a>: Added missing class member initialization to a
-       class in doxmlparser and made the library compile again.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667678">667678</a>: Added support for Obj-C property attribute "unsafe_retained".
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674842">674842</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676984">676984</a>: Unmatched quote in a comment prevented alias expansion.
+       class in doxmlparser and made the library compile again.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667678">667678</a>: Added support for Obj-C property attribute "unsafe_retained".</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674842">674842</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676984">676984</a>: Unmatched quote in a comment prevented alias expansion.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676019">676019</a>: Fixed another case where local include path did not appear
-       correctly in the class documentation.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676966">676966</a>: Fortran: Some keyword were not colored in the source view.
+       correctly in the class documentation.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676966">676966</a>: Fortran: Some keyword were not colored in the source view.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676981">676981</a>: Fortran: Argument type was wrong type of in case of out of 
-       place !&gt; comment
+       place !&gt; comment</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677935">677935</a>: Included patch to fix problem compiling for x86 release on
-       Windows.
+       Windows.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677992">677992</a>: Section without title could result in an invalid Qt Help
-       index.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678022">678022</a>: Anonymous enum could result in an invalid Qt Help index.
+       index.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678022">678022</a>: Anonymous enum could result in an invalid Qt Help index.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678102">678102</a>: Superfluous trailing comma in javascript 
-       prevented navigation tree to load in IE7.
+       prevented navigation tree to load in IE7.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678177">678177</a>: a + at the start of a line inside a &lt;pre&gt; block, 
        triggered the start of a list. Also -- and --- where not kept untouched 
-       inside a &lt;pre&gt; block.
+       inside a &lt;pre&gt; block.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678180">678180</a>: ndash (--) appearing in a brief description could lead 
-       to invalid SVG images.
+       to invalid SVG images.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678288">678288</a>: -- and --- inside a Markdown code block were not handled
-       properly.
+       properly.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679331">679331</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675766">675766</a>: In body documentation with a different indentation then the
-       main documentation was not rendered correctly (MARKDOWN=YES).
+       main documentation was not rendered correctly (MARKDOWN=YES).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679436">679436</a>: Using an escaped pipe symbol in a Markdown table did not get 
-       unescaped in the output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679533">679533</a>: Code fragments did not appear properly in the doxygen manual.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679615">679615</a>: Added missing delete call in a piece of debugging code.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679626">679626</a>: Fixed some navigation issues in the manual
+       unescaped in the output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679533">679533</a>: Code fragments did not appear properly in the doxygen manual.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679615">679615</a>: Added missing delete call in a piece of debugging code.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679626">679626</a>: Fixed some navigation issues in the manual</li>
 <li>   Not all inherited members appeared in the "Additional inherited members"
-       list.
+       list.</li>
 <li>   Link to call after "Inherited members" was not correct when
-       CREATE_SUBDIRS was enabled.
-<li>   New VHDL diagram was not generated if the path contained spaces.
-<li>   Fixed a couple of problems handling Objective-C categories.
+       CREATE_SUBDIRS was enabled.</li>
+<li>   New VHDL diagram was not generated if the path contained spaces.</li>
+<li>   Fixed a couple of problems handling Objective-C categories.</li>
 </ul>
+<p>
 \endhtmlonly
 \subsection log_1_8_1_1 Release 1.8.1.1
 \htmlonly
 <a name="1.8.1.1"></a>
 <b>(release date 10-06-2012)</b>
+</p>
 <h3>Changes</h3>
 <ul>
-<li>   Integrated the root navigation tree in navtree.js for faster loading.
+<li>   Integrated the root navigation tree in navtree.js for faster loading.</li>
 <li>   When the navigation tree is enabled, clicking jump to a line in 
-       the source code view will now highlight the line.
+       the source code view will now highlight the line.</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   VHDL code now has a new Design Overview page (thanks for Martin Kreis
-       for the patch). Requires HAVE_DOT=YES, and DOT_IMAGE_FORMAT=svg.
+       for the patch). Requires HAVE_DOT=YES, and DOT_IMAGE_FORMAT=svg.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677678">677678</a>: Added support for strong and weak attributes in Objective-C
-       properties.
+       properties.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618462">618462</a>: Fortran: Appearance of comments in the HTML output 
-       are now customizable via CSS again.
+       are now customizable via CSS again.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673660">673660</a>: &lt;code&gt; inside a &lt;summary&gt; or &lt;remarks&gt; section is now treated
-       as @code (was already the code for C#).
+       as @code (was already the code for C#).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673921">673921</a>: When a comment started at indent &gt;= 4 after a /** and 
        continued at the same indent without leading * after a blank line, 
-       the continued part appeared at as a code block when Markdown was enabled.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675036">675036</a>: If a file was not indexed, the navigation tree became empty.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676019">676019</a>: Include path using quotes did not work as documented.
+       the continued part appeared at as a code block when Markdown was enabled.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675036">675036</a>: If a file was not indexed, the navigation tree became empty.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676019">676019</a>: Include path using quotes did not work as documented.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676877">676877</a>: @warning did not end at blank line when followed by
-       a numbered list.
+       a numbered list.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676902">676902</a>: An anonymous namespace could introduce an invalid entry in
-       the navigation list.
+       the navigation list.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676948">676948</a>: Breadcrumb navigation path had wrong links when 
-       CREATE_SUBDIRS was enabled.
+       CREATE_SUBDIRS was enabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677315">677315</a>: Fixed case where function was incorrectly detected as a 
-       variable.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677589">677589</a>: Fixed typo in the documentation of the LAYOUT_FILE option.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677771">677771</a>: Fixed visual misalignment for first argument.
+       variable.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677589">677589</a>: Fixed typo in the documentation of the LAYOUT_FILE option.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677771">677771</a>: Fixed visual misalignment for first argument.</li>
 <li>   The "arrow out" button in interactive SVG did not work when 
-       served from a web server, due to the use of an absolute path.
+       served from a web server, due to the use of an absolute path.</li>
 <li>   If a declation was too wide for a page, the content in HTML spilled 
-       over the boundary of its box, which looked ugly.
-<li>   Empty lines in a code fragment were collapsed.
+       over the boundary of its box, which looked ugly.</li>
+<li>   Empty lines in a code fragment were collapsed.</li>
 <li>   Navigation tree entries of the hierarchy appeared under class index as
-       well.
-<li>   Grouped globals and enum values were not added to the navigation index.
-<li>   Inlined class were not properly shows in the navigation index.
+       well.</li>
+<li>   Grouped globals and enum values were not added to the navigation index.</li>
+<li>   Inlined class were not properly shows in the navigation index.</li>
 <li>   Documented class in undocumented namespace did not show up in 
-       class list and navigation tree.
-<li>   ALLEXTERNALS=YES did not show all external classes in the class list.
+       class list and navigation tree.</li>
+<li>   ALLEXTERNALS=YES did not show all external classes in the class list.</li>
 <li>   External reference via URL did not work for new
-       "Additional Inherited Members" section + inherited from class link.
+       "Additional Inherited Members" section + inherited from class link.</li>
 <li>   Objective-C protocols and C# generics were not index and listed 
-       properly in the navigation tree and indices.
-<li>   Undocumented files could produce a broken link in the navigation tree.
+       properly in the navigation tree and indices.</li>
+<li>   Undocumented files could produce a broken link in the navigation tree.</li>
 <li>   Additional Inherited Members could turn up empty of all members of
-       the inherited class were grouped and SUBGROUPING was set to NO.
+       the inherited class were grouped and SUBGROUPING was set to NO.</li>
 </ul>
+<p>
 \endhtmlonly
 \subsection log_1_8_1 Release 1.8.1
 \htmlonly
 <a name="1.8.1"></a>
 <b>(release date 19-05-2012)</b>
+</p>
 <h3>Changes</h3>
 <ul>
 <li>   Changed the way indexes (Class,File,Namespace,Groups) are rendered:
        There are now shown in a uniform way in the HTML output as a tree.
        Trees can be expanded and collapsed interactively 
        (this makes USE_INLINE_TREES obsolete). 
-       <p>
+       </p><p>
        The class list now also shows namespaces and nested classes. 
        The file list now also shows directories (this makes SHOW_DIRECTORIES 
        obsolete). 
-       <p>
+       </p><p>
        Member sections are now each rendered in a separate table.
        This makes the HTML_ALIGN_MEMBERS option obsolete.
-       <p>
+       </p><p>
 <b>Note:</b> If you use a custom header for the HTML output (HTML_HEADER) 
 make sure you add the following:
+       </p>
        <pre>
 &lt;script type="text/javascript" src="$relpath$jquery.js"&gt;&lt;/script&gt;
-&lt;script type="text/javascript" src="$relpath$dynsections.js"&gt;&lt;/script&gt;</pre>
+&lt;script type="text/javascript" src="$relpath$dynsections.js"&gt;&lt;/script&gt;</pre><p>
        Otherwise the interactivity of the trees does not work.
-       <p>
-
-<li>   Included a couple of performance improvements (thanks to Dirk Reiners)
+       </p>
+</li>
+<li>   Included a couple of performance improvements (thanks to Dirk Reiners)</li>
 <li>   Changed the way member attributes (like protected, virtual, and static)
-       are rendered in the HTML output.
-<li>   Changed the look of the source code output.
+       are rendered in the HTML output.</li>
+<li>   Changed the look of the source code output.</li>
 <li>   Included language updates for Chinese, Czech, German, Esperanto, 
-       Italian, Slovak, Spanish, Hungarian, and Polish.
+       Italian, Slovak, Spanish, Hungarian, and Polish.</li>
 <li>   Syntax highlighing in source code fragments is no longer dependent
-       on LATEX_SOURCE_CODE being set to YES.
+       on LATEX_SOURCE_CODE being set to YES.</li>
 <li>   Added natural scrolling for tablet devices (like the iPad) 
-       when using the treeview.
+       when using the treeview.</li>
 <li>   For interactive SVGs the print button has been replaced by a 
        "arrow out" button that opens the original non-interactive SVG in a 
-       new window for easy printing or saving. 
+       new window for easy printing or saving. </li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661499">661499</a>: Long names are now wrapped in the dot nodes to avoid
-       very wide graphs.
+       very wide graphs.</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666527">666527</a>: Added support for &lt;inheritdoc/&gt; C# XML command
-       (thanks to John Werner for the patch).
+       (thanks to John Werner for the patch).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670965">670965</a>, Added support for resolving environment variables of the
-       form $(PROGRAMFILES(X86)) inside the config file
+       form $(PROGRAMFILES(X86)) inside the config file</li>
 <li>   Doxygen now shows Objective-C properties in collaboration diagrams
-       (thanks to Sven Weidauer for the patch).
-<li>   Added ability to search for group or page titles.
+       (thanks to Sven Weidauer for the patch).</li>
+<li>   Added ability to search for group or page titles.</li>
 <li>   Inherited class members are now shown as expandable sections in the
        member overview (default is collapsed). Each section is rendered as
-       a table. 
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674349">674349</a>: Included build support for NetBSD.
+       a table. </li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674349">674349</a>: Included build support for NetBSD.</li>
 <li>   A -- will now be rendered as an 'en dash', similarly, --- will produce an
-       mdash.
+       mdash.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=523156">523156</a>: Fortran: Prefix of routines got stripped.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666088">666088</a>: Include VHDL patch (thanks to Martin Kreis).
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=523156">523156</a>: Fortran: Prefix of routines got stripped.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666088">666088</a>: Include VHDL patch (thanks to Martin Kreis).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670235">670235</a>: Fixed include guard detection problem when using
-       #pragma once
+       #pragma once</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670805">670805</a>: A numbered list (1. 2. 3.) where each list item ended with 
        an empty line is no longer treated as a set of separate lists (all 
-       starting with 1.).
+       starting with 1.).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670889">670889</a>: Java: last enum value did not appear in the output unless it was
-       followed by a comma.
+       followed by a comma.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671023">671023</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671312">671312</a>: Regression: Autolist items starting on a new paragraph 
-       at indent level larger than 0 were not processed correctly. 
+       at indent level larger than 0 were not processed correctly. </li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671076">671076</a>: Sections could be missing from the navigation tree in 
-       some situations.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671158">671158</a>: @tableofcontents did not work for the main page (@mainpage)
+       some situations.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671158">671158</a>: @tableofcontents did not work for the main page (@mainpage)</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671159">671159</a>: Sections in a separate markdown page did not appear in the 
-       table of contents.
+       table of contents.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671166">671166</a>: Fortran: Fixed problem causing call/caller graphs not to be
-       generated.
+       generated.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671171">671171</a>: RPM spec file was updated to make it work with RHEL 6.2
-       (thanks to Peter Klotz for the patch)
+       (thanks to Peter Klotz for the patch)</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671240">671240</a>: Corrected line number of error message reported for
-       pages.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671291">671291</a>: C# regression: enum values where not shown in the docs.
+       pages.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671291">671291</a>: C# regression: enum values where not shown in the docs.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671395">671395</a>: When #some_member appeared at the start of a line it was
        seen as a level one header instead of a link to a member when
        Markdown processing was enable. Now at least one space is required
-       after the # to make it a header.
+       after the # to make it a header.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671426">671426</a>: Fixed case where doxygen could crash when a section and
-       subsection had the same label.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671591">671591</a>: docset creating could fail due to invalid Nodes.xml
+       subsection had the same label.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671591">671591</a>: docset creating could fail due to invalid Nodes.xml</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671702">671702</a>: Using \internal in a group or member did not hide it
-       from the navigation tree if there was no documentation.
+       from the navigation tree if there was no documentation.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671709">671709</a>: Backticks in C# comments did not appear as inline 
-       fragments, like was the case for other languages.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672119">672119</a>: PHP: defines are now shown as constants rather than enums.
+       fragments, like was the case for other languages.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672119">672119</a>: PHP: defines are now shown as constants rather than enums.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672662">672662</a>: File with .md or .markdown extension were not included
-       with the default setting of FILE_PATTERNS.
+       with the default setting of FILE_PATTERNS.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672366">672366</a>: mailto style URLs did not work correctly in combination with
-       CREATE_SUBDIRS = YES.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672472">672472</a>: Removed bogus &lt;/b&gt; when using @par.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672475">672475</a>: Added "warning:" prefix to "missing \endcode" message.
+       CREATE_SUBDIRS = YES.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672472">672472</a>: Removed bogus &lt;/b&gt; when using @par.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672475">672475</a>: Added "warning:" prefix to "missing \endcode" message.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672479">672479</a>: Doxygen comments after a macro definition were not
-       removed in the source browser view.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672526">672526</a>: Removed black line in front of custom paragraphs.
+       removed in the source browser view.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672526">672526</a>: Removed black line in front of custom paragraphs.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672536">672536</a>: PHP: use keyword was not handled correctly when importing
-       classes from another namespace.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672620">672620</a>: Switched to using "Macro" in the output instead of "Define".
+       classes from another namespace.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672620">672620</a>: Switched to using "Macro" in the output instead of "Define".</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672656">672656</a>: Using ![caption](filename.png) did not work correctly for 
-       local images pointed to with IMAGE_PATH.
+       local images pointed to with IMAGE_PATH.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673045">673045</a>: A block of ///'s inside a verbatim block inside a .md 
-       file was replaced by /** ..  */
+       file was replaced by /** ..  */</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673066">673066</a>: Doxygen now skips scanning files in directories starting with
-       a dot (e.g. .svn).
+       a dot (e.g. .svn).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673219">673219</a>: Included patch by Ryan Schmidt to make the Mac versions
-       in qglobal.h match that of Apple header files.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673870">673870</a>: Added C++11 classes when BUILTIN_STL_SUPPORT is enabled.
+       in qglobal.h match that of Apple header files.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673870">673870</a>: Added C++11 classes when BUILTIN_STL_SUPPORT is enabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673983">673983</a>: Using a backslash in a section cause 026E30F to appear in the
-       latex TOC.
+       latex TOC.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674563">674563</a>: Fortran: case sensitiveness for routines and functions 
-       did not work
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674583">674583</a>: Fortran: continuation by ampersand not placed in code output.
+       did not work</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674583">674583</a>: Fortran: continuation by ampersand not placed in code output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675757">675757</a>: Fixed indenting issue after the end of a markdown code block
-       inside a list.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676116">676116</a>: Use new index style for page index.
+       inside a list.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676116">676116</a>: Use new index style for page index.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676294">676294</a>: Fixed LaTeX error when backslash appeared in a hyperlinked
-       code fragment.
-<li>   Tag files had wrong character encoding set in the header.
-<li>   C# in/out did not appear in generics using covariance or contravariance.
+       code fragment.</li>
+<li>   Tag files had wrong character encoding set in the header.</li>
+<li>   C# in/out did not appear in generics using covariance or contravariance.</li>
 <li>   When marker of an alias appeared at the end of the alias text it was
-       not expanded.
-<li>   Aliases did not work in Markdown files.
-<li>   Fixed some problems with the navigation tree for IE9 and Opera.
+       not expanded.</li>
+<li>   Aliases did not work in Markdown files.</li>
+<li>   Fixed some problems with the navigation tree for IE9 and Opera.</li>
 <li>   Included patch by Jake Colman to make the configgen.py work with older
-       Python version such as 2.4.3.
-<li>   Fixed problem parsing \code{.py}...\endcode 
-<li>   UML_LIMIT_NUM_FIELDS did not work correctly in all cases.
+       Python version such as 2.4.3.</li>
+<li>   Fixed problem parsing \code{.py}...\endcode </li>
+<li>   UML_LIMIT_NUM_FIELDS did not work correctly in all cases.</li>
 <li>   Setting SORT_GROUP_NAMES to YES, had no effect on child groups within
-       a group.
+       a group.</li>
 </ul>
+<p>
 \endhtmlonly
 \subsection log_1_8_0 Release 1.8.0
 \htmlonly
 <a name="1.8.0"></a>
 <b>(release date 25-02-2012)</b>
+</p>
 <h3>Changes</h3>
 <ul>
 <li>   Auto list items can now consist of multiple paragraphs.
        The indentation of the (first line) of a new paragraph detemines
        to which list item the paragraph belongs or if it marks the end of the
-       list. 
+       list. </li>
 <li>   When UML_LOOK is enabled, relations shown on the edge of a graph
-       are not shown as attributes (conform to the UML notation)
-<li>   Updated the manual and improved the look.
+       are not shown as attributes (conform to the UML notation)</li>
+<li>   Updated the manual and improved the look.</li>
 <li>   Made the contents in the navigation tree more consistent for
-       groups, pages with subpages, and grouped subpages.
+       groups, pages with subpages, and grouped subpages.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669079">669079</a>: Latex: made the margins of latex page layout smaller using 
-       the geometry package.
+       the geometry package.</li>
 <li>   The tool doxytag has been declared obsolete and is removed
        (it wasn't working properly anyway). Same goes for the installdox 
-       script.
-<li>   Updated the copyright in source code and doxywizard "about" to 2012.
+       script.</li>
+<li>   Updated the copyright in source code and doxywizard "about" to 2012.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668008">668008</a>: HTML version of the manual now has the treeview enabled
-       for easier navigation.
+       for easier navigation.</li>
 </ul>
 <h3>New features</h3>
 <ul>
@@ -1651,132 +1838,134 @@ make sure you add the following:
        setting MARKDOWN_SUPPORT to NO. When enabled the following is 
        processed differently:
        <ul>
-       <li> tabs are converted to spaces according to TAB_SIZE.
+       <li> tabs are converted to spaces according to TAB_SIZE.</li>
        <li> blockquotes are created for lines that start with one or more &gt;'s
-            (amount of &gt;'s detemine the indentation level).
+            (amount of &gt;'s detemine the indentation level).</li>
        <li> emphasis using *emphasize this* or _emphasis this_ or
             strong emphasis using **emphasis this**. Unlike classic
-            Markdown 'some_great_indentifier' is not touched.
-       <li> code spans can be created using back-ticks, i.e. `here's an example`
+            Markdown 'some_great_indentifier' is not touched.</li>
+       <li> code spans can be created using back-ticks, i.e. `here's an example`</li>
        <li> Using three or more -'s or *'s alone on a line with only spaces
-            will produce a horizontal ruler.
+            will produce a horizontal ruler.</li>
        <li> A header can be created by putting a ===== (for h1) or ----- (for h2)
             on the next line or by using 1 to 6 #'s at the start of a line
-            for h1-h6.
-       <li> auto lists item can also start with + or * instead of only -
-       <li> ordered lists can be made using 1. 2. ... labels.
+            for h1-h6.</li>
+       <li> auto lists item can also start with + or * instead of only -</li>
+       <li> ordered lists can be made using 1. 2. ... labels.</li>
        <li> verbatim blocks can be produced by indenting 4 additional spaces.
             Note that doxygen uses a relative indent of 4 spaces, not an
-            absolute indent like Markdown does. 
-       <li> Markdown style hyperlinks and hyperlink references.
-       <li> Simple tables can be created using the <a href="http://michelf.com/projects/php-markdown/extra/#table">Markdown Extra format</a>.
-       <li> <a href="http://freewisdom.org/projects/python-markdown/Fenced_Code_Blocks">Fenced code blocks</a> are also supported, include language selection.
-       <li> files with extension .md or .markdown are converted to related pages.
+            absolute indent like Markdown does. </li>
+       <li> Markdown style hyperlinks and hyperlink references.</li>
+       <li> Simple tables can be created using the <a href="http://michelf.com/projects/php-markdown/extra/#table">Markdown Extra format</a>.</li>
+       <li> <a href="http://freewisdom.org/projects/python-markdown/Fenced_Code_Blocks">Fenced code blocks</a> are also supported, include language selection.</li>
+       <li> files with extension .md or .markdown are converted to related pages.</li>
        </ul>
-       See the section about Markdown support in the manual for details.
+       See the section about Markdown support in the manual for details.</li>
 <li>   It is now possible to add user defined tabs or groups of tabs to
        the navigation menu using the layout file (see the section of the manual
-       about customizing the output for details).
+       about customizing the output for details).</li>
 <li>   Added new command \tableofcontents (or [TOC] if you prefer Markdown)
        which can be used in a related page with sections to produce a 
        table of contents at the top of the HTML page (for other formats the
-       command has no effect).
+       command has no effect).</li>
 <li>   When using SVG images and INTERACTIVE_SVG is enabled, a print icon
        will be visible along with the navigation controls to facilitate 
-       printing of the part of the graph that is visible on screen.
+       printing of the part of the graph that is visible on screen.</li>
 <li>   Added obfuscation of email addresses for the HTML output to make
-       email harvesting more difficult.
+       email harvesting more difficult.</li>
 <li>   Added build targets for 64 bit Windows (thanks to Vladimir Simonov).
        The installer script is also updated to install a 64 bit version of
-       doxygen on 64 bit systems and the 32 bit version on 32 bit systems.
-<li>   Added support for using the HTML tag &lt;blockquote&gt; in comments.
+       doxygen on 64 bit systems and the 32 bit version on 32 bit systems.</li>
+<li>   Added support for using the HTML tag &lt;blockquote&gt; in comments.</li>
 <li>   Included patch by Gauthier Haderer that fixes some issues with the
-       dbus XML parser.
-<li>   Added support for Markdown style fenced code blocks.
+       dbus XML parser.</li>
+<li>   Added support for Markdown style fenced code blocks.</li>
 <li>   Added option to @code command to force parsing and syntax highlighting
-       according to a particular language.
-<li>   Section of pages are now added to the navigation index.
+       according to a particular language.</li>
+<li>   Section of pages are now added to the navigation index.</li>
 <li>   Added support for cell alignment and table header shading in
-       LaTeX and RTF output. 
+       LaTeX and RTF output. </li>
 <li>   Added -d filteroutput option to show the output of an input filter
-       (thanks to Albert for the patch).
+       (thanks to Albert for the patch).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668010">668010</a>: Latex: for Windows doxygen new generates a makepdf.bat
-       file in the latex output dir to create the latex documentation.
+       file in the latex output dir to create the latex documentation.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=498703">498703</a>: Fixed encoding issue in CHM index file for group titles.
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=498703">498703</a>: Fixed encoding issue in CHM index file for group titles.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=510975">510975</a>: FORTRAN: Keywords like .GT. recognized as symbols for 
-       cross ref.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=511906">511906</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=581303">581303</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622749">622749</a>: \copydoc did copy the brief description 
+       cross ref.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=511906">511906</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=581303">581303</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622749">622749</a>: \copydoc did copy the brief description
        into the detailed section, causing a difference between the original  
-       and the copy.
+       and the copy.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=555327">555327</a>: Using @ref for an example file, caused it to appear as
-       file::ext.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567494">567494</a>: Fortran: Included patch for blockdata sub-programs.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628417">628417</a>: Fortran: doxygen filter, preparsing fixed form of null
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662286">662286</a>: TCL: Inlcuded patch to fixed UTF-8 support.
+       file::ext.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567494">567494</a>: Fortran: Included patch for blockdata sub-programs.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628417">628417</a>: Fortran: doxygen filter, preparsing fixed form of null</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662286">662286</a>: TCL: Inlcuded patch to fixed UTF-8 support.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662289">662289</a>: TCL: Included patch to prevent ##### from appearing in the
-       output.
+       output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646319">646319</a>: Using a file name with path for HTML_STYLESHEET caused the
-       path to appear in the HTML output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664826">664826</a>: Fixed one more problem with include guard detection.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665629">665629</a>: Fixed parse problem when a #define appeared inside an enum.
+       path to appear in the HTML output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664826">664826</a>: Fixed one more problem with include guard detection.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665629">665629</a>: Fixed parse problem when a #define appeared inside an enum.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665855">665855</a>: Fixed problem parsing C++ template specialization of the
-       form A&lt;func(T*)&gt; such as used in boost::signal2 types.
+       form A&lt;func(T*)&gt; such as used in boost::signal2 types.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666047">666047</a>: A &lt;/p&gt; followed by an htmlonly..endhtmlonly section
-       caused invalid XHTML output.
+       caused invalid XHTML output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666085">666085</a>: Fixed include handling in case the include guard was 
-       documented.
+       documented.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666124">666124</a>: Fixed problem loading the navigation tree in IE8 when
-       serving pages via a web server.
+       serving pages via a web server.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666337">666337</a>: Included patch to avoid hypenation hints in front of the 
-       first captial in a word.
+       first captial in a word.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666568">666568</a>: When SHOW_FILES was NO, a grouped function did not appear
-       in the javascript based search index.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666909">666909</a>: \copybrief introduced extra spacing in the HTML output.
+       in the javascript based search index.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666909">666909</a>: \copybrief introduced extra spacing in the HTML output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666986">666986</a>: Fixed case where search engine specific code appeared
-       twice in the HTML output.
+       twice in the HTML output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666993">666993</a>: Fixed bug in the generated makefile causing index not
-       to be generated when using pdflatex.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667020">667020</a>: HTML output for example pages was not well-formed.
+       to be generated when using pdflatex.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667020">667020</a>: HTML output for example pages was not well-formed.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667192">667192</a>: Include statements in latex output where placed all on 
-       one line in the LaTeX output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667835">667835</a>: PHP: Fixed problem handling heredoc blocks
+       one line in the LaTeX output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667835">667835</a>: PHP: Fixed problem handling heredoc blocks</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667844">667844</a>: For aliases with a single argument it is no longer required 
-       to escape commas that appear inside the argument text.
+       to escape commas that appear inside the argument text.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668037">668037</a>: Latex: tables can now span multiple pages by using the xtab
-       package.
+       package.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668218">668218</a>: Doxygen will ignore the common prefix shared by all
        directories when computing a names for the directory's output files.
-       This will make the names of the output more stable.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668519">668519</a>: Added missing newline in man page output.
+       This will make the names of the output more stable.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668519">668519</a>: Added missing newline in man page output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669071">669071</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669072">669072</a>: Fixed parse problem for Q_PROPERTY when a template
-       with a namespaced type was used.
+       with a namespaced type was used.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669078">669078</a>: Included patch which changes MATHJAX_RELPATH to use the
-       content delivery network by default.
+       content delivery network by default.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669138">669138</a>: Fortran: Fixed problem handling multiple definition 
-       statements on one line.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669406">669406</a>: Using -d Preprocessor now also works when QUIET is YES.
+       statements on one line.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669406">669406</a>: Using -d Preprocessor now also works when QUIET is YES.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669434">669434</a>: Latex: citations where only generated properly if the
-       bib files specified via CITE_BIB_FILES did not have a path.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669758">669758</a>: Tcl: Same function in multiple Tcl namespaces not added.
+       bib files specified via CITE_BIB_FILES did not have a path.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669758">669758</a>: Tcl: Same function in multiple Tcl namespaces not added.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670289">670289</a>: Fixed case where doxygen would not correctly detect
-       &gt;&gt; as a termination of a nested template.
+       &gt;&gt; as a termination of a nested template.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670571">670571</a>: subpages generate empty pages in latex/rtf output and
-       broken links when SHORT_NAME was set to YES.
-<li>   Included VHDL fixes provided by Martin Kreis.
+       broken links when SHORT_NAME was set to YES.</li>
+<li>   Included VHDL fixes provided by Martin Kreis.</li>
 <li>   The word "dummy" wrongly appeared before the first parameter type in 
-       the LaTeX output for an Objective-C method.
-<li>   Fixed several small glitches in the tree view javascript code.
+       the LaTeX output for an Objective-C method.</li>
+<li>   Fixed several small glitches in the tree view javascript code.</li>
 <li>   Included a patch by Vladimir Simonov to make it possible to compile
-       doxygen with Visual Studio 2005.
-<li>   Fixed some typos in the manual (thanks Albert).
+       doxygen with Visual Studio 2005.</li>
+<li>   Fixed some typos in the manual (thanks Albert).</li>
 </ul>
+<p>
 \endhtmlonly
 \section log_1_7 1.7 Series
 \htmlonly
 <a name="1.7.6.1"></a>
+</p>
 <h1>Doxygen Release 1.7.6.1</h1>
 <h2>(release date 10-12-2011)</h2>
 <h3>Changes</h3>
@@ -1784,26 +1973,26 @@ make sure you add the following:
 <li>   Doxygen now reports its cache usage (for the symbol and the 
        lookup cache) at the end of a run (if QUIET=NO), and recommends 
        settings for SYMBOL_CACHE_SIZE and LOOKUP_CACHE_SIZE for your 
-       project if either cache is too small.
+       project if either cache is too small.</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   Added new option LOOKUP_CACHE_SIZE to control the internal cache
-       doxygen uses to find symbols given their name and a context.
-<li>   Python: added support for @staticmethod
+       doxygen uses to find symbols given their name and a context.</li>
+<li>   Python: added support for @staticmethod</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
-<li>   Python: scopes are now shown with . instead of ::
+<li>   Python: scopes are now shown with . instead of ::</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665313">665313</a>: Space before @if was not preserved, causing problems
-       with inline @if .. @endif constructs.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665583">665583</a>: Fixed XHTML validity problem when using mscgen graphs.
+       with inline @if .. @endif constructs.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665583">665583</a>: Fixed XHTML validity problem when using mscgen graphs.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665641">665641</a>: Fixed XHTML validity problem when GENERATE_TREEVIEW was
-       disabled.
+       disabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665720">665720</a>: Included patch to fix hang issue when non-empty 
-       INCLUDE_PATH was used.
+       INCLUDE_PATH was used.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665778">665778</a>: Fixed parse issue when a comma appeared as part of an 
-       enum's value.
+       enum's value.</li>
 </ul>
 <a name="1.7.6"></a>
 <h1>Doxygen Release 1.7.6</h1>
@@ -1812,105 +2001,105 @@ make sure you add the following:
 <ul>
 <li>   To improve the performance of loading the navigation tree,
        the data is now split into multiple javascript files which
-       are loaded dynamically.
+       are loaded dynamically.</li>
 <li>   The selected member is now briefly highlighted in the HTML output
-       (when GENERATE_TREEVIEW is enabled).
+       (when GENERATE_TREEVIEW is enabled).</li>
 <li>   The navigation tree (GENERATE_TREEVIEW) now shows the same information
-       as the index.
+       as the index.</li>
 <li>   The navindex section of layout now also controls what is shown in
-       the navigation tree.
-<li>   Improved HTML output support for IE9.
-<li>   Included redesigned VHDL parser (thanks to Martin Kreis for the patch)
+       the navigation tree.</li>
+<li>   Improved HTML output support for IE9.</li>
+<li>   Included redesigned VHDL parser (thanks to Martin Kreis for the patch)</li>
 <li>   When a class/structs has many (&gt;15) members of the same type, only 
-       the first 10 are shown in the UML diagram.  
-<li>   Made the output of the javascript based search engine more compact.
+       the first 10 are shown in the UML diagram.  </li>
+<li>   Made the output of the javascript based search engine more compact.</li>
 </ul>
 <h3>New features</h3>
 <ul>
-<li>   Update of the French translation.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607305">607305</a>: Added support for PHP heredoc and nowdoc constructs.
+<li>   Update of the French translation.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607305">607305</a>: Added support for PHP heredoc and nowdoc constructs.</li>
 <li>   Added support for cross-referencing in case of operator-&gt; overloading.
        This includes support for std::auto_ptr,std::smart_ptr,std::unique_ptr 
-       and std::weak_ptr when BUILTIN_STL_SUPPORT is enabled.
+       and std::weak_ptr when BUILTIN_STL_SUPPORT is enabled.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
 <li>   Regression: some information was no longer available for a class, 
-       due to accidental deletion of a code block.
-<li>   Regression: fixed matching problem in the code parser.
+       due to accidental deletion of a code block.</li>
+<li>   Regression: fixed matching problem in the code parser.</li>
 <li>   Included fixes for TCL to support commands with \ and command 
-       definitions preceded by whitespace (thanks to Rene Zaumseil)
+       definitions preceded by whitespace (thanks to Rene Zaumseil)</li>
 <li>   When using "static int a,b" variable "b" incorrectly appeared in the 
-       output even though EXTRACT_STATIC was set to NO.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521717">521717</a>: .spec file was only updated after running ./configure
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656642">656642</a>: Fixed potential crash when using doxygen for large projects.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656878">656878</a>: Fixed problem running bibtex with \cite command on Windows.
+       output even though EXTRACT_STATIC was set to NO.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521717">521717</a>: .spec file was only updated after running ./configure</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656642">656642</a>: Fixed potential crash when using doxygen for large projects.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656878">656878</a>: Fixed problem running bibtex with \cite command on Windows.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=657152">657152</a>: Fixed constant expression evaluation error in the 
-       preprocessor.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652277">652277</a>: Removed bogus ' from the man page output.
+       preprocessor.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652277">652277</a>: Removed bogus ' from the man page output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=659244">659244</a>: Quotes in the brief description could appear unescaped in 
-       the tooltip.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641336">641336</a>: #includes with ../ were not always processed correctly.
+       the tooltip.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641336">641336</a>: #includes with ../ were not always processed correctly.</li>
 <li>   Fixed potential crash when INLINE_GROUPED_CLASSES and INLINE_SIMPLE_STRUCTS 
-       are set to YES.
+       are set to YES.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658896">658896</a>: Fixed preprocessor problem handling #defines whose value was
-       a constant string containing ///.
+       a constant string containing ///.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=660332">660332</a>: Using a \ at the end of a comment line could cause 
-       parsing problems for C# as the \ was treated as a line continuation.
+       parsing problems for C# as the \ was treated as a line continuation.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658033">658033</a>: Fixed parser problem when using multiple member groups 
-       inside a macro definition.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=503239">503239</a>: Fixed several issues related to \cite handling.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658587">658587</a>: Improved the way macro definitions are collected.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=660501">660501</a>: Fixed LaTeX error when using \name with a description.
+       inside a macro definition.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=503239">503239</a>: Fixed several issues related to \cite handling.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658587">658587</a>: Improved the way macro definitions are collected.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=660501">660501</a>: Fixed LaTeX error when using \name with a description.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661292">661292</a>: The documentation for \mainpage incorrectly mentioned that
        one has to use \ref main in case GENERATE_TREEVIEW was set to YES, which
-       is no longer the case.
+       is no longer the case.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=659096">659096</a>: Nested aliases definitions where not always expanded properly
-       (regression w.r.t version 1.7.4)
+       (regression w.r.t version 1.7.4)</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658038">658038</a>: Fixed preprocessor problem where the @ character inside a
-       macro definition could appear as @@.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658646">658646</a>: Fixed problem running mscgen for LaTeX and RTF output.
+       macro definition could appear as @@.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658646">658646</a>: Fixed problem running mscgen for LaTeX and RTF output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661723">661723</a>: Using ClassName%'s did not work anymore, and also
-       ClassName's wasn't autolinked.
+       ClassName's wasn't autolinked.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662044">662044</a>: Fixed potential printing of null pointer when using
-       a version filter that returned blanks.
+       a version filter that returned blanks.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625518">625518</a>: Fortran: first problem where subroutine using results 
-       variable appeared as a function.
+       variable appeared as a function.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654153">654153</a>: If an URL appeared at the end of a sentence, the period
-       was included in the URL.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656560">656560</a>: Fortran: Added support for the Double Complex type.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=663640">663640</a>: Included workaround for Solaris CC issue in index.cpp
+       was included in the URL.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656560">656560</a>: Fortran: Added support for the Double Complex type.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=663640">663640</a>: Included workaround for Solaris CC issue in index.cpp</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662190">662190</a>: Included patch to fix some TCL issues and add the TCL_SUBST 
-       configuration option.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661672">661672</a>: Fortran: Added support for ALIAS expansion in comment blocks.
+       configuration option.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661672">661672</a>: Fortran: Added support for ALIAS expansion in comment blocks.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=663101">663101</a>: Fixed case where a macro was not corrected found in the header
-       file when it could only be found via INCLUDE_PATH.
+       file when it could only be found via INCLUDE_PATH.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664718">664718</a>: using multiple &lt;para&gt;'s inside a &lt;summary&gt; block caused 
-       text to be joined without spacing.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656556">656556</a>: Java enums are now parsed as classes. 
+       text to be joined without spacing.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656556">656556</a>: Java enums are now parsed as classes. </li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664826">664826</a>: Fixed problem in the preprocessor regarding the handling 
-       of include guards.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664893">664893</a>: Fixed typo in the docs for EXCLUDE_SYMLINKS.
+       of include guards.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664893">664893</a>: Fixed typo in the docs for EXCLUDE_SYMLINKS.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665466">665466</a>: Using a relative URL with &lt;a href&gt; did not work when
-       CREATE_SUBDIRS was enabled.
+       CREATE_SUBDIRS was enabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665464">665464</a>: Using an absolute URL with &lt;img&gt; did not work when
-       CREATE_SUBDIRS was enabled.
+       CREATE_SUBDIRS was enabled.</li>
 </ul>
 <a name="1.7.5.1"></a>
 <h1>Doxygen Release 1.7.5.1</h1>
 <h2>(release date 21-08-2011)</h2>
 <h3>New features</h3>
 <ul>
-<li>Update of the French translation.
+<li>Update of the French translation.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
-<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521717">521717</a>: .spec file was only updated after running ./configure
-<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656642">656642</a>: Fixed potential crash when using doxygen for large projects.
-<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656878">656878</a>: Fixed problem running bibtex with \cite command on Windows.
+<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521717">521717</a>: .spec file was only updated after running ./configure</li>
+<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656642">656642</a>: Fixed potential crash when using doxygen for large projects.</li>
+<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656878">656878</a>: Fixed problem running bibtex with \cite command on Windows.</li>
 <li>Regression: some information was no longer available for a class, 
-    due to accidental deletion of a code block.
-<li>Regression: fixed matching problem in the code parser.
+    due to accidental deletion of a code block.</li>
+<li>Regression: fixed matching problem in the code parser.</li>
 </ul>
 <a name="1.7.5"></a>
 <h1>Doxygen Release 1.7.5</h1>
@@ -1918,142 +2107,142 @@ make sure you add the following:
 <h3>Changes</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641904">641904</a>: Function in the call graphs are now shown based on first 
-       appearance rather then alphabetical order.
+       appearance rather then alphabetical order.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616213">616213</a>: When customizing the HTML header $title now only generates
        the title excluding the project name (which can still be added using
-       $projectname)
-<li>   Improved the look of the class index: all items now have equal spacing.
+       $projectname)</li>
+<li>   Improved the look of the class index: all items now have equal spacing.</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   New option INTERACTIVE_SVG which when set to YES in combination
        with DOT_IMAGE_FORMAT=svg will make doxygen
        generate interactive SVG diagrams that support zooming and 
-       panning via the mouse (only for large graphs). 
+       panning via the mouse (only for large graphs). </li>
 <li>   Added support for the Tcl programming language 
-       (thanks to Rene Zaumseil and Samuel Bentley for the patch).
-<li>   Added @copyright command.
+       (thanks to Rene Zaumseil and Samuel Bentley for the patch).</li>
+<li>   Added @copyright command.</li>
 <li>   added option MATHJAX_EXTENSIONS to provide additional extensions for
-       MathJax (thanks to David Munger for the patch).
+       MathJax (thanks to David Munger for the patch).</li>
 <li>   added option INLINE_SIMPLE_STRUCTS which when enabled shows the fields
        of simple classes and structs (with only public data fields) as a table
        and inline in context (file/group/namespace/class) provided this context 
-       is documented.
+       is documented.</li>
 <li>   When using the server based search engine (SEARCHENGINE=YES and
        SERVER_BASED_SEARCH=YES) doxygen now advertises a opensearch provider
        for your project, that allows integrating the search directly in
-       the search field of the browser (thanks to Phil Lello for the patch).
+       the search field of the browser (thanks to Phil Lello for the patch).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=503239">503239</a>: Added new option CITE_BIB_FILES and LATEX_BIB_STYLE and a new 
        command \cite, allowing you to make references to literature (as defined 
        in one or more .bib files). This also works for output formats other 
        than LaTeX. The tool bibtex is required for this to work though. Thanks
-       to David Munger for the initial patch upon which this feature is based.
-<li>   PHP namespaces are now shown as A\B in the output.
+       to David Munger for the initial patch upon which this feature is based.</li>
+<li>   PHP namespaces are now shown as A\B in the output.</li>
 <li>   Added new \snippet command that can be used to include marked 
        sections from a source file. See 
-       http://www.doxygen.org/commands.html#cmdsnippet for more info.
+       http://www.doxygen.org/commands.html#cmdsnippet for more info.</li>
 <li>   Added translation support for Armenian, thank to Armen Tangamyan.
-       and included translation updates for a number of languages.
+       and included translation updates for a number of languages.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
 <li>   Fixed a couple of potential race conditions found by Helgrind while 
-       running dot from multiple threads.
+       running dot from multiple threads.</li>
 <li>   Graphs did not appear when enabling both INTERACTIVE_SVG and 
-       HTML_DYNAMIC_SECTIONS.
+       HTML_DYNAMIC_SECTIONS.</li>
 <li>   PDFs generated by newer versions of dot (i.e. 2.28) did not appear 
-       in the output, because doxygen failed to extract the bounding box.
-<li>   Improved call graph and cross-reference support for Python.
+       in the output, because doxygen failed to extract the bounding box.</li>
+<li>   Improved call graph and cross-reference support for Python.</li>
 <li>   INTERACTIVE_SVG now also works with IE9 if the html file extension is
-       set to xhtml.
+       set to xhtml.</li>
 <li>   Fixed several cases where the LaTeX output could produce too long
-       lines.
+       lines.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=318061">318061</a>: Putting two functions in the same group that only
-       different in the number of template arguments did not work.
+       different in the number of template arguments did not work.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=437346">437346</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=564614">564614</a>: Fixed proper encoding of multibyte output in RTF
-       depending on the code page (thanks to Hirao for the patch).
+       depending on the code page (thanks to Hirao for the patch).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521717">521717</a>: The .spec file in the source distribution did not get
-       updated to the latest version.
+       updated to the latest version.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521861">521861</a>: Fortran: Continuation character was not recognised in 
-       fixed format code.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=522496">522496</a>: Fortran: @param checking was not case insensitive.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=560105">560105</a>: Fixed problem combining @cond with preprocessor directives.
+       fixed format code.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=522496">522496</a>: Fortran: @param checking was not case insensitive.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=560105">560105</a>: Fixed problem combining @cond with preprocessor directives.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=577359">577359</a>: Using "struct A : C, D {};" showed a private inheritance
-       relation for D.
+       relation for D.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=584194">584194</a>: Some links to typedef where pointing to the typedef'ed
-       class instead. 
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619560">619560</a>: Anonymous enums caused an invalid entry in the LaTeX TOC.
+       class instead. </li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619560">619560</a>: Anonymous enums caused an invalid entry in the LaTeX TOC.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622935">622935</a>: Deriving from an unknown template class could cause the
-       class to appear with a -g postfix in C# 
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625731">625731</a>: Fortran: Fixed issue handling private subroutines.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632946">632946</a>: LaTeX now starts a new page when starting a new module.
+       class to appear with a -g postfix in C# </li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625731">625731</a>: Fortran: Fixed issue handling private subroutines.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632946">632946</a>: LaTeX now starts a new page when starting a new module.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634837">634837</a>: Fortran: Prefix of function was overwritten and the word 
-       'function' not specified.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637099">637099</a>: Fortran: Included fix for using collaboration diagrams.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642468">642468</a>: Added PHP support for namespace with curly braces.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643219">643219</a>: Fortran: Improved handling of semicolons.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643617">643617</a>: Fortran: Added support for "type is".
+       'function' not specified.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637099">637099</a>: Fortran: Included fix for using collaboration diagrams.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642468">642468</a>: Added PHP support for namespace with curly braces.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643219">643219</a>: Fortran: Improved handling of semicolons.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643617">643617</a>: Fortran: Added support for "type is".</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643944">643944</a>: A macro added to a group appeared twice in the group 
-       documentation if was also made related to a class using \relates.
+       documentation if was also made related to a class using \relates.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646321">646321</a>: Fixed problem were the search box was missing when using
-       a custom HTML header.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646447">646447</a>: Fixed unterminated img tab in the XHTML output.
+       a custom HTML header.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646447">646447</a>: Fixed unterminated img tab in the XHTML output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646463">646463</a>: Fixed problem handling MSCFILE_DIRS option with multiple
-       paths.
+       paths.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646533">646533</a>: Included patch to sort overloaded members by appearance in
-       the code.
+       the code.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646747">646747</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646879">646879</a>: Putting an autolist inside a @todo, @bug or similar
-       section did not work anymore.
+       section did not work anymore.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646922">646922</a>: Referring to a logo with a relative path, caused 
-       a broken image target when using a custom HTML header.
+       a broken image target when using a custom HTML header.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647499">647499</a>: Fixed HTML rendering problem on older browsers when 
-       GENERATE_TREEVIEW was enabled.
+       GENERATE_TREEVIEW was enabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647768">647768</a>: Linking to a section on the main page could result in a
-       broken link when GENERATE_TREEVIEW was enabled.
+       broken link when GENERATE_TREEVIEW was enabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647889">647889</a>: Fixed invalid warning when using @deparated method with
-       default values for parameters.
+       default values for parameters.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=648302">648302</a>: A function made related using @relates could end up in
        the wrong class if there was already a method with a matching
-       argument list in that other class.
+       argument list in that other class.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=649103">649103</a>: Return types containing multiple *'s ended up in the
-       output with only one * in some cases.
+       output with only one * in some cases.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650397">650397</a>: Fixed problem with alias substitution if the alias had
-       more then 9 parameters.
+       more then 9 parameters.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650430">650430</a>: For nested anonymous structs @xx markers could appear in
-       the output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650463">650463</a>: Added compilation support for MacOSX 10.7 (aka Lion).
+       the output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650463">650463</a>: Added compilation support for MacOSX 10.7 (aka Lion).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650958">650958</a>: Fixed issue printing HTML pages when the
-       GENERATE_TREEVIEW option is set to YES.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=651611">651611</a>: Fixed broken link to an undocumented namespace.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652138">652138</a>: Fixed potential crash while parsing Fortran code.
+       GENERATE_TREEVIEW option is set to YES.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=651611">651611</a>: Fixed broken link to an undocumented namespace.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652138">652138</a>: Fixed potential crash while parsing Fortran code.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652188">652188</a>: Fixed problem parsing comment which included 
-       an unterminated alias within quotes (i.e. "\word{")
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652277">652277</a>: Lines starting with . did not appear in the man page output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652389">652389</a>: Fortran: Fixed text is detailed function section.
+       an unterminated alias within quotes (i.e. "\word{")</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652277">652277</a>: Lines starting with . did not appear in the man page output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652389">652389</a>: Fortran: Fixed text is detailed function section.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652396">652396</a>: When enabling INTERACTIVE_SVG wide graphs are now also
-       fit to the screen width.
+       fit to the screen width.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652695">652695</a>: Added missing space between parameter type and name in 
-       the RTF output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652741">652741</a>: Use background-color instead of background in doxygen.css.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653344">653344</a>: Fixed potential segfault while creating man pages.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653666">653666</a>: Fortran: add a space to "type" in argument list.
+       the RTF output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652741">652741</a>: Use background-color instead of background in doxygen.css.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653344">653344</a>: Fixed potential segfault while creating man pages.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653666">653666</a>: Fortran: add a space to "type" in argument list.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653801">653801</a>: Fixed problem handling include guard when multiple 
-       blocks guarded by the same guard were used in a header file. 
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653963">653963</a>: Fortran: Unified handling of @params at various places.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654108">654108</a>: make clean failed on a system without qmake.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654244">654244</a>: Fixed compile issue for HP Itanium.
+       blocks guarded by the same guard were used in a header file. </li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653963">653963</a>: Fortran: Unified handling of @params at various places.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654108">654108</a>: make clean failed on a system without qmake.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654244">654244</a>: Fixed compile issue for HP Itanium.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654779">654779</a>: Fortran: Interface was seen as a class with constructor / 
-       destructor.
+       destructor.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654869">654869</a>: Using the word "property" as a type in C caused wrong 
-       results.
+       results.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654866">654866</a>: Fortran: fixed issue parsing function type that looked like
-       C function pointers.
+       C function pointers.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=655178">655178</a>: Fortran: Fixed parse issue when using variable name 
-                  starting with the word interface.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=655591">655591</a>: Improved error handling for empty html style list.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=655935">655935</a>: Fixed case where %s could end up in a warning messge.
+                  starting with the word interface.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=655591">655591</a>: Improved error handling for empty html style list.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=655935">655935</a>: Fixed case where %s could end up in a warning messge.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656005">656005</a>: Methods of Objective-C categories defined in an .m file are
-       now marked as private.
+       now marked as private.</li>
 </ul>
 <a name="1.7.4"></a>
 <h1>Doxygen Release 1.7.4</h1>
@@ -2061,86 +2250,86 @@ make sure you add the following:
 <h3>Changes</h3>
 <ul>
 <li>   doxygen -w html now reads the default Doxyfile even if not specified
-       explicitly
+       explicitly</li>
 <li>   doxygen -w html now produces a template header and footer that can
-       be used independent of the configuration options used.
+       be used independent of the configuration options used.</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   New option INLINE_GROUPED_CLASSES that when enabled shows grouped
-       classes inside the group documentation, instead of on a separate page.
-<li>   Included updates for the Italian and Russian translation.
+       classes inside the group documentation, instead of on a separate page.</li>
+<li>   Included updates for the Italian and Russian translation.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640875">640875</a>: Added option HTML_EXTRA_FILES which makes it easier to copy
-       additional files to the HTML output and also add them to the index files.
+       additional files to the HTML output and also add them to the index files.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642579">642579</a>: Included patch that adds new LATEX_FOOTER option to 
-       customize the end of refman.tex in the LaTeX output.
+       customize the end of refman.tex in the LaTeX output.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=140259">140259</a>: Jumping to a @section did not work in the RTF output.
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=140259">140259</a>: Jumping to a @section did not work in the RTF output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521854">521854</a>: Fortran: included patch for supporting multiple argument 
-                  declarations on one line.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521861">521861</a>: Fixed problem with line continuation in Fortran.
+                  declarations on one line.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521861">521861</a>: Fixed problem with line continuation in Fortran.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=566921">566921</a>: %A::B now prevents a link for A::B, instead of only for A
-                  and generating a warning that ::B cannot be linked.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=598481">598481</a>: Fortran: Added support for extends keyword.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618374">618374</a>: Added support for inlining code in the VHDL output.
+                  and generating a warning that ::B cannot be linked.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=598481">598481</a>: Fortran: Added support for extends keyword.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618374">618374</a>: Added support for inlining code in the VHDL output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625519">625519</a>: Fortran: argument name starting with a reserved word was
-                  not handled properly.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634415">634415</a>: Fixed problem parsing an array of character literals.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=635537">635537</a>: Links to file members were not made when found in tag files.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638637">638637</a>: The Doxyfile documentation contained some very long lines.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638655">638655</a>: Double quote in page or group title broke treeview.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638733">638733</a>: Improved documentation for DOT_IMAGE_FORMAT option.
+                  not handled properly.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634415">634415</a>: Fixed problem parsing an array of character literals.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=635537">635537</a>: Links to file members were not made when found in tag files.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638637">638637</a>: The Doxyfile documentation contained some very long lines.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638655">638655</a>: Double quote in page or group title broke treeview.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638733">638733</a>: Improved documentation for DOT_IMAGE_FORMAT option.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638829">638829</a>: Added documentation to warn for consequences of using
-                  HTML_HEADER.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638856">638856</a>: Fixed problem autolinking to struct field using #S::a
+                  HTML_HEADER.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638856">638856</a>: Fixed problem autolinking to struct field using #S::a</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639272">639272</a>: using @dot...@endot produced an image referenced with
-                  absolute path.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639521">639521</a>: \mscfile did not work properly for LaTeX output.
+                  absolute path.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639521">639521</a>: \mscfile did not work properly for LaTeX output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639716">639716</a>: Fixed problem where #include's could cause phantom __pad__
-                  members to appear in the output (appeared on Windows only).
+                  members to appear in the output (appeared on Windows only).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640259">640259</a>: Options PROJECT_LOGO and PROJECT_BRIEF were missing
-                  from the manual.
+                  from the manual.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640463">640463</a>: Fixed problem parsing PHP "use" statement when the argument
-                  did not have a namespace scope.
+                  did not have a namespace scope.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640588">640588</a>: Included fix for proper splitting of multiple arguments
-                  given to the QHP_CUST_FILTER_ATTRS option.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640646">640646</a>: Long error messages could cause memory corruption.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640742">640742</a>: XML: switched indent option to no in the combine.xslt script.
+                  given to the QHP_CUST_FILTER_ATTRS option.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640646">640646</a>: Long error messages could cause memory corruption.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640742">640742</a>: XML: switched indent option to no in the combine.xslt script.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640754">640754</a>: Comment with XML style list of type table was not rendered 
-                  properly.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640822">640822</a>: Added support for overloading of C# indexer operators.
+                  properly.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640822">640822</a>: Added support for overloading of C# indexer operators.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640828">640828</a>: Internal section marked with @internal was not shown as
-                  such anymore in the XML output.
+                  such anymore in the XML output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640847">640847</a>: PHP: Fixed parse problem referring to class in global  
-                  namespace.
+                  namespace.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640924">640924</a>: Included patch by Haffmans to make the custom header and
-                  footer independent of the chosen config options.
+                  footer independent of the chosen config options.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640927">640927</a>: Included fix to prevent a warning in the server side PHP
-                  search script.
+                  search script.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641026">641026</a>: Included patch to fix broken hyperlink to page entry 
-                  in xreflists.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641188">641188</a>: Header of \page was wrong in Man page output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641336">641336</a>: #include's to other directories were not always linked.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641673">641673</a>: Using "use Foo\Foo;" in PHP could cause doxygen to hang.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641814">641814</a>: In some cases the HTML output could contain an extra &lt;/p&gt;.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642030">642030</a>: Tooltips with HTML entities could be wrongly truncated.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642475">642475</a>: Include graphs could be incomplete.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643056">643056</a>: Fixed problem with macro expansion.
+                  in xreflists.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641188">641188</a>: Header of \page was wrong in Man page output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641336">641336</a>: #include's to other directories were not always linked.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641673">641673</a>: Using "use Foo\Foo;" in PHP could cause doxygen to hang.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641814">641814</a>: In some cases the HTML output could contain an extra &lt;/p&gt;.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642030">642030</a>: Tooltips with HTML entities could be wrongly truncated.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642475">642475</a>: Include graphs could be incomplete.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643056">643056</a>: Fixed problem with macro expansion.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643279">643279</a>: Fixed potential crash when generating a warning for
-                  void f(int %x) style parameter, which is valid in C++/CLI.
+                  void f(int %x) style parameter, which is valid in C++/CLI.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643280">643280</a>: Included patch to enabled LargeAddressAware for Windows 
-                  builds.
+                  builds.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643276">643276</a>: Fixed cases where FILE_VERSION_FILTER was called for 
-                  dummy files with name "generated".
+                  dummy files with name "generated".</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643655">643655</a>: Fixed argument matching issue when one of match candidates
-                  was a typedef of a method pointer.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=645754">645754</a>: mscfile tag was closed with dotfile in the XML output.
+                  was a typedef of a method pointer.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=645754">645754</a>: mscfile tag was closed with dotfile in the XML output.</li>
 <li>   doxygen -w html now ignores the values for HTML_HEADER and HTML_FOOTER
-       found in the config file.
+       found in the config file.</li>
 <li>   Importing a group via a tag file could overrule a local group with 
-       the same name even when EXTERNAL_GROUPS was disabled.
+       the same name even when EXTERNAL_GROUPS was disabled.</li>
 </ul>
 <a name="1.7.3"></a>
 <h1>Doxygen Release 1.7.3</h1>
@@ -2152,81 +2341,81 @@ make sure you add the following:
        Disabling the index (with DISABLE_INDEX) still shows the new header
        (you can still customize this using HTML_HEADER). This now works
        nicely in combination with GENERATE_TREEVIEW = YES and/or
-       SEARCH_ENGINE = YES.
+       SEARCH_ENGINE = YES.</li>
 <li>   Redesigned the treeview feature. Instead of using frames, the
        navigation tree is now loaded on each page dynamically. This allows
        bookmarking a page and always keeps the top menu visible. Also the
        current item is automatically highlighted in the tree.
        Also updated the icons in the treeview to match the overall look'n'feel.
        Note: if you now use a custom HTML header, please update it using
-       doxygen with the -w and the edit the default header.
+       doxygen with the -w and the edit the default header.</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=499544">499544</a>: Added SVG support to doxygen's dot output 
-       (setting DOT_IMAGE_FORMAT to svg now works as expected)
+       (setting DOT_IMAGE_FORMAT to svg now works as expected)</li>
 <li>   Added control to the wizard to configure the color of the output
-       visually.
+       visually.</li>
 <li>   Added options to specify project synopsis and select a 
-       project logo to the wizard.
+       project logo to the wizard.</li>
 <li>   Added option PROJECT_LOGO which can be used to specify an image
        which will be shown in the header of each HTML page along with
-       the project name (PROJECT_NAME option).
+       the project name (PROJECT_NAME option).</li>
 <li>   Added option PROJECT_BRIEF which can be used to specify a brief
        description which will be shown in the header of each HTML page
-       just below the project name.
+       just below the project name.</li>
 <li>   Added new option FILTER_SOURCE_PATTERNS which can be used 
        in combination with FILTER_SOURCE_FILES to filter files used for 
        the source browser based on file extension, which can overwrite 
-       the filter set by FILTER_PATTERNS and/or INPUT_FILTER.
+       the filter set by FILTER_PATTERNS and/or INPUT_FILTER.</li>
 <li>   Added new option STRICT_PROTO_MATCHING which is disabled by default,
        and makes the parameter matching to be less strict, resulting in 
-       fewer "No matching class member found" warnings.
+       fewer "No matching class member found" warnings.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=306076">306076</a>: code blocks with using directives did not get hyperlinked.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=313527">313527</a>: enum values with bitfields did not get parsed correctly.
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=306076">306076</a>: code blocks with using directives did not get hyperlinked.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=313527">313527</a>: enum values with bitfields did not get parsed correctly.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=565715">565715</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=630582">630582</a>: Included a patch that fixes a couple of Fortran issues
-       (thanks to Albert).
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615507">615507</a>: Fixed problem handling @cond..@endcond in Fortran code.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619040">619040</a>: Scope was missing in Tokens.xml when using docsets.
+       (thanks to Albert).</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615507">615507</a>: Fixed problem handling @cond..@endcond in Fortran code.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619040">619040</a>: Scope was missing in Tokens.xml when using docsets.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625517">625517</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=523156">523156</a>: Applied patch tp avoid stripping prefixes for Fortran 
-       subroutines.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626476">626476</a>: allow label before end statement in Fortran
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=630901">630901</a>: &lt;/see&gt; was not handled properly in comment block.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632311">632311</a>: Fixed potential crash for empty verbatim section.
+       subroutines.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626476">626476</a>: allow label before end statement in Fortran</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=630901">630901</a>: &lt;/see&gt; was not handled properly in comment block.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632311">632311</a>: Fixed potential crash for empty verbatim section.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632426">632426</a>: closing brace of a function with one parameter has wrong
-       color in HTML.
+       color in HTML.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632543">632543</a>: Added support for Fortan TYPEs with languge bindings.
-       (thanks to a patch by Daniel Franke)
+       (thanks to a patch by Daniel Franke)</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632879">632879</a>: An explicit link request such as #blah did not longer produce
-       a warning if no symbol named blah was found.
+       a warning if no symbol named blah was found.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=633891">633891</a>: warnings in "inbody" documentation were shown with "unknown"
-       file name.
+       file name.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634116">634116</a>: Titles customized via the layout file did not appear in
-       the title page and navigation tree, only in the top menu.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634600">634600</a>: Fixed problem resolving typedef.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634775">634775</a>: Fixed a problem were // inside a code block got removed.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634857">634857</a>: Added support for escaping :: by using \:: (or @::)
+       the title page and navigation tree, only in the top menu.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634600">634600</a>: Fixed problem resolving typedef.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634775">634775</a>: Fixed a problem were // inside a code block got removed.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634857">634857</a>: Added support for escaping :: by using \:: (or @::)</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634962">634962</a>: #include with relative path to parent dir did not get
-       hyperlinked.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634986">634986</a>: Removed double definition of docParamName in compound.xsd.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=635198">635198</a>: C++/CLI Finalizer methods were not parsed properly.
+       hyperlinked.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634986">634986</a>: Removed double definition of docParamName in compound.xsd.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=635198">635198</a>: C++/CLI Finalizer methods were not parsed properly.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636475">636475</a>: Objective-C method names can now be used as the 
-       the first argument of \ref.
+       the first argument of \ref.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636588">636588</a>: Fixed a couple of problems in the compound.xsd schema used
-       for XML output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636598">636598</a>: DISTRIBUTE_GROUP_DOC now works again for enum values.
+       for XML output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636598">636598</a>: DISTRIBUTE_GROUP_DOC now works again for enum values.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636947">636947</a>: Improved matching of typedef'ed array parameter and non 
-       typedef'ed array parameter.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637610">637610</a>: Added a number of fixed for Fortran interfaces.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637712">637712</a>: Handle files with the .for extension as Fortran.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637987">637987</a>: Fixed error in the grouping documentation.
+       typedef'ed array parameter.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637610">637610</a>: Added a number of fixed for Fortran interfaces.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637712">637712</a>: Handle files with the .for extension as Fortran.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637987">637987</a>: Fixed error in the grouping documentation.</li>
 <li>   Fixed line number sync problem when using Objective-C #import 
-       statements.
-<li>   Fixed problem handling /** @cond */ in the preprocessor.
-<li>   Member groups could get reordered in the output.
+       statements.</li>
+<li>   Fixed problem handling /** @cond */ in the preprocessor.</li>
+<li>   Member groups could get reordered in the output.</li>
 </ul>
 <a name="1.7.2"></a>
 <h1>Doxygen Release 1.7.2</h1>
@@ -2234,106 +2423,106 @@ make sure you add the following:
 
 <h3>Changes</h3>
 <ul>
-<li>   Changed the default font of the LaTeX output to helvetica.
+<li>   Changed the default font of the LaTeX output to helvetica.</li>
 <li>   Changed the way parameters and return values are represented in the
-       LaTeX and RTF output. They are now listed using tables.
+       LaTeX and RTF output. They are now listed using tables.</li>
 </ul>
 <h3>New features</h3>
 <ul>
-<li>   added support for Apple's block object extension for C/Obj-C/C++.
-<li>   added support for detecting Python constructors and destructors.
+<li>   added support for Apple's block object extension for C/Obj-C/C++.</li>
+<li>   added support for detecting Python constructors and destructors.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624575">624575</a>: Added \endinternal command that can be used to force
-       the end of a section started with \internal.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=552605">552605</a>: Added parsing support for PHP 5.3+ style namespaces.
+       the end of a section started with \internal.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=552605">552605</a>: Added parsing support for PHP 5.3+ style namespaces.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582532">582532</a>: added \mscfile command which can be used to insert a 
        message sequence chart given a .msc file. 
        Also added a new config option MSCFILE_DIRS to provide directories
-       were msc files are searched (Thanks to Adrien for the patch).
+       were msc files are searched (Thanks to Adrien for the patch).</li>
 <li>   Added support for type specifiers for documenting PHP parameters,
-       format: "@param type $paramname docs"
+       format: "@param type $paramname docs"</li>
 <li>   Added support for rendering formulas in the HTML output 
        using MathJax instead of using prerendered bitmaps. 
        For this purpose the options USE_MATHJAX and MATHJAX_RELPATH were
-       added.
+       added.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=306076">306076</a>: Fixed case where using of a namespace did not work inside
-       an example.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=336053">336053</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=487871">487871</a>: /// were not stripped from formulas and \dot..\enddot
+       an example.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=336053">336053</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=487871">487871</a>: /// were not stripped from formulas and \dot..\enddot</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=563698">563698</a>: dropped support for a4wide paper format for LaTeX, since
-       it is on the LaTeX taboo list.
+       it is on the LaTeX taboo list.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=571014">571014</a>: Behaviour of CLASS_DIAGRAM=NO in combination with
-       HAVE_DOT=YES, was not propely documented.
+       HAVE_DOT=YES, was not propely documented.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=576291">576291</a>: Python comments for next class or method could end up in
-       code of a method/class when enabling INLINE_SOURCES.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611174">611174</a>: Fixed problem handling nestes classes in Python.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621733">621733</a>: removed unexpected warnings about undocumented return types
+       code of a method/class when enabling INLINE_SOURCES.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611174">611174</a>: Fixed problem handling nestes classes in Python.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621733">621733</a>: removed unexpected warnings about undocumented return types</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622737">622737</a>: Undefined function macros could cause constant expression
-       errors.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622780">622780</a>: updated copyright statement in PDF docs.
+       errors.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622780">622780</a>: updated copyright statement in PDF docs.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622935">622935</a>: C# generics appeared with -g extension in the output in 
-       some situations.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623023">623023</a>: Fixed parsing problem for "int &amp;foo1(),&amp;foo2();"
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623052">623052</a>: Link to destructor was wrong in the member index.
+       some situations.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623023">623023</a>: Fixed parsing problem for "int &amp;foo1(),&amp;foo2();"</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623052">623052</a>: Link to destructor was wrong in the member index.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623424">623424</a>: Fixed problem where struct description gets added to variable
-       of struct type.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623673">623673</a>: Anchors were missing in the Qhp index for members.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623733">623733</a>: Fixed potential crash due to uninitialized line number.
+       of struct type.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623673">623673</a>: Anchors were missing in the Qhp index for members.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623733">623733</a>: Fixed potential crash due to uninitialized line number.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623765">623765</a>: closed.png was wrongly linked when GENERATE_SUBDIRS and
-       HTML_DYNAMIC_SECTIONS were enabled.
+       HTML_DYNAMIC_SECTIONS were enabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624014">624014</a>: Function macro was not handled properly when there was
-       a line continuation directly after the name.
+       a line continuation directly after the name.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624095">624095</a>: Linking to a class via a tag file did not work if the class
-       was in an undocumented namespace.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624104">624104</a>: Fixed a couple of typos in lodepng.h
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624323">624323</a>: Graph legend image was missing form the index files.
+       was in an undocumented namespace.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624104">624104</a>: Fixed a couple of typos in lodepng.h</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624323">624323</a>: Graph legend image was missing form the index files.</li>
 <li>   Fixed a number of typos in the config file documentation 
-       (thanks to Jens Schweikhardt)
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624514">624514</a>: Some enums were not cross-referenced.
+       (thanks to Jens Schweikhardt)</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624514">624514</a>: Some enums were not cross-referenced.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624829">624829</a>: Missing \endcond could cause preprocessor issues in 
-       next file(s) to be parsed.
+       next file(s) to be parsed.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625070">625070</a>: a function definition in a namespace, documented in the
-       header did not always get cross-referenced.
+       header did not always get cross-referenced.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625296">625296</a>: Removed superfluous &lt;td&gt;&lt;/td&gt; from parameter list in
-       HTML output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625317">625317</a>: Unterminated comment could crash doxygen.
+       HTML output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625317">625317</a>: Unterminated comment could crash doxygen.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625531">625531</a>: Inherited documentation was only included for the
-       last derived class in case of multiple inheritance.
+       last derived class in case of multiple inheritance.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625578">625578</a>: In the HTML output &lt;/div&gt; was missing for built-in
-       class diagrams.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625555">625555</a>: References in example files with underscores were wrong.
+       class diagrams.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625555">625555</a>: References in example files with underscores were wrong.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625982">625982</a>: When using japanese characters mixed with ascii characters
-       doxygen incorrected ended the brief description with a dot.
+       doxygen incorrected ended the brief description with a dot.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625952">625952</a>: setting MULTILINE_CPP_IS_BRIEF to YES, cause /// to appear
-       in the output.
+       in the output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626033">626033</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567774">567774</a>: EXTENSION_MAPPING did not work if a the mapped 
        language was handled by the same parser as used for the original  
-       extension.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626175">626175</a>: Fixed bracket bug in LaTeX fancy headers.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626508">626508</a>: Allow hyphen in key argument of \xrefitem.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626647">626647</a>: \copydoc did not work for array type arguments (e.g. int[]).
+       extension.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626175">626175</a>: Fixed bracket bug in LaTeX fancy headers.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626508">626508</a>: Allow hyphen in key argument of \xrefitem.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626647">626647</a>: \copydoc did not work for array type arguments (e.g. int[]).</li>
 <li>   Use \dotfile did not produce the correct map file, so URLs in dot
-       files did not work.
+       files did not work.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=627371">627371</a>: #define's in files only found via INCLUDE_PATH were not
-       correctly handled.
+       correctly handled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628065">628065</a>: auto brief description ending with .) cause the ) to
-       end up in the detailed part.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628242">628242</a>: Fixed encoding issue for the Spanish translation.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628678">628678</a>: Fixed segmentation fault in case of very long errors.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629040">629040</a>: Fixed type in search page of the documentation.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629182">629182</a>: Fixed problem detecting include guard.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629270">629270</a>: Made file extension to parser mapping case insensitive.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629485">629485</a>: Latex makefile clean target used rm command also for Windows.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629942">629942</a>: the EXCLUDE_SYMBOLS option was missing form the online docs.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=631094">631094</a>: \htmlinclude and \verbinclude ended the brief description.
+       end up in the detailed part.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628242">628242</a>: Fixed encoding issue for the Spanish translation.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628678">628678</a>: Fixed segmentation fault in case of very long errors.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629040">629040</a>: Fixed type in search page of the documentation.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629182">629182</a>: Fixed problem detecting include guard.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629270">629270</a>: Made file extension to parser mapping case insensitive.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629485">629485</a>: Latex makefile clean target used rm command also for Windows.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629942">629942</a>: the EXCLUDE_SYMBOLS option was missing form the online docs.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=631094">631094</a>: \htmlinclude and \verbinclude ended the brief description.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=631380">631380</a>: Inconsistent behaviour when a brief description was given 
-       following by a detailed comment block with JAVADOC_AUTOBRIEF enabled.
+       following by a detailed comment block with JAVADOC_AUTOBRIEF enabled.</li>
 <li>   Fixed a number of typos in the documentation 
-       (thanks to Albert van der Meer)
+       (thanks to Albert van der Meer)</li>
 <li>   Fixed potential hangup when scanning directories defined as 
-       symlinks to absolute paths.
-<li>   HTML attributes other than src were not copied for the &lt;img&gt; tag.
+       symlinks to absolute paths.</li>
+<li>   HTML attributes other than src were not copied for the &lt;img&gt; tag.</li>
 </ul>
 <a name="1.7.1"></a>
 <h1>Doxygen Release 1.7.1</h1>
@@ -2342,49 +2531,49 @@ make sure you add the following:
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621695">621695</a>: Made warning and error messages appear with lower case 
        "warning:" and "error:" prefix to make it easier to use the messages 
-       from Visual Studio.
+       from Visual Studio.</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621908">621908</a>: Added new config option FORMULA_TRANSPARENT which allows
        selecting between transparent (YES) or non-transparent (NO) PNGs for
-       formulas in the HTML output.
-<li>   Update for Turkish translation.
+       formulas in the HTML output.</li>
+<li>   Update for Turkish translation.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=533821">533821</a>: Inheritance relation for a C# class deriving from
-       a generic class was not handled correctly.
+       a generic class was not handled correctly.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=554638">554638</a>: Changing DOT_IMAGE_FORMAT did not cause the graphs to be
-       regenerated.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=576533">576533</a>: A field of the form "enum E *p" was ignore.
+       regenerated.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=576533">576533</a>: A field of the form "enum E *p" was ignore.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597016">597016</a>: Hide scope name was not working properly for todo items
-       inside class members, where the class was inside a namespace.
+       inside class members, where the class was inside a namespace.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617761">617761</a>: In dot graphs now also @ref worked (previously only \ref was
-       supported).
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621653">621653</a>: Fixed error when compiling doxygen for Solaris 8.
+       supported).</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621653">621653</a>: Fixed error when compiling doxygen for Solaris 8.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621733">621733</a>: Removed bogus warning about undocument return type for 
-       define when WARN_NO_PARAMDOC was enabled.
+       define when WARN_NO_PARAMDOC was enabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621780">621780</a>: Fixed parsing support for a function that returns a 
-       struct definition.
+       struct definition.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621785">621785</a>: Doxygen could hang when using \copydoc in a function with
-       \param.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621805">621805</a>: Using //!&lt; after a #define no longer worked.
+       \param.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621805">621805</a>: Using //!&lt; after a #define no longer worked.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621854">621854</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622219">622219</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622593">622593</a>: html help compiler (and also the Qt 
-       help compiler) was called before all dot images were generated.
+       help compiler) was called before all dot images were generated.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621984">621984</a>: Using a auto-list in combination with \subpage cause the
-       items to be inlined.
+       items to be inlined.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622018">622018</a>: Fixed problem parsing a @param command where the
-       text part started with a formula.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622019">622019</a>: Added some instructions how to document Fortran code.
+       text part started with a formula.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622019">622019</a>: Added some instructions how to document Fortran code.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622041">622041</a>: Using \var multiple times in a comment block did not
-       work properly.
+       work properly.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622413">622413</a>: Tooltips could get wrongly truncated when multi-byte
-       UTF-8 characters were used.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622471">622471</a>: Argument matching failed for typedef in another namespace.
-<li>   Fixed crash situation while handling commands inside a @ref section.
+       UTF-8 characters were used.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622471">622471</a>: Argument matching failed for typedef in another namespace.</li>
+<li>   Fixed crash situation while handling commands inside a @ref section.</li>
 <li>   Treeview icons were missing in the HTML output when setting
-       GENERATE_TREEVIEW to NO and USE_INLINE_TREES to YES.
+       GENERATE_TREEVIEW to NO and USE_INLINE_TREES to YES.</li>
 </ul>
 
 <a name="1.7.0"></a>
@@ -2392,192 +2581,194 @@ make sure you add the following:
 <h2>(release date 15-06-2010)</h2>
 <h3>Changes</h3>
 <ul>
-<li>   Changed the look of the HTML output.
+<li>   Changed the look of the HTML output.</li>
 <li>   Made several internal changes that should have a positive effect on the 
-       overall performance.
+       overall performance.</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   The color of the HTML output can now easily be adjusted using three new 
        options: HTML_COLORSTYLE_HUE, HTML_COLORSTYLE_SAT, 
        and HTML_COLORSTYLE_GAMMA, which control respectively the hue, 
-       saturation, and gamma of all elements in the HTML output.
+       saturation, and gamma of all elements in the HTML output.</li>
 <li>   Moved dot invocations to the end of a doxygen run. Doxygen will now
        run multiple instances of dot in parallel (for better CPU utilisation
        on multi-core systems). The new config option DOT_NUM_THREADS 
-       determines the number of threads used (were 0 is auto-detect).
+       determines the number of threads used (were 0 is auto-detect).</li>
 <li>   Added option EXT_LINKS_IN_WINDOW which controls whether or not
-       links to symbols imported via tag files will be opened in a new window.
-<li>   Included various language updates (thanks to Petr for coordinating).
+       links to symbols imported via tag files will be opened in a new window.</li>
+<li>   Included various language updates (thanks to Petr for coordinating).</li>
 <li>   Included patch by Stefan Oberhumer that allows customizing the
-       way parameter lists are shown in the LaTeX output.
+       way parameter lists are shown in the LaTeX output.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=306076">306076</a>: source browser could miss links for used namespaces.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=361476">361476</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=620924">620924</a>: \if and \endif did not work properly inside auto lists.
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=306076">306076</a>: source browser could miss links for used namespaces.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=361476">361476</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=620924">620924</a>: \if and \endif did not work properly inside auto lists.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=557164">557164</a>: No warning for missing return type documentation even though
-       WARN_NO_PARAMDOC was set to YES.
+       WARN_NO_PARAMDOC was set to YES.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=577005">577005</a>: Handling of nesting \defgroup's was not always working
-       properly.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=578739">578739</a>: &oslash; was not translated correctly in the LaTeX output.
+       properly.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=578739">578739</a>: &oslash; was not translated correctly in the LaTeX output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=583526">583526</a>: Use relative paths for mscgen diagrams to avoid errors in the
-       LaTeX output.
+       LaTeX output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592991">592991</a>: The "Use current settings at startup" feature of Doxywizard
-       was broken.
+       was broken.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593679">593679</a>: Links in the search results were broken if they pointed to
-       symbols imported via tag files using an absolute path or URL.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593760">593760</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615682">615682</a>: Fixed man page output problem when using @par.
+       symbols imported via tag files using an absolute path or URL.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593760">593760</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615682">615682</a>: Fixed man page output problem when using @par.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594021">594021</a>: A C comment before a #endif caused the preprocessor 
-       statement to be ignored.
+       statement to be ignored.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597013">597013</a>: When HIDE_SCOPE_NAMES was enabled also the scope for
        nested classes was stripped. Now only the namespace scope will be 
-       stripped as before.
+       stripped as before.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600829">600829</a>: Autolinks to namespace members did not work if
-       an explicit # or :: was used.
+       an explicit # or :: was used.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=602732">602732</a>: Slashes inside strings in java annotations were not handled
-       properly.
+       properly.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606335">606335</a>: Fixed the "show html output" button in doxywizard 
-       for Windows when IE was set as the default browser.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608292">608292</a>: Formatting was lost for section copied with \copydoc.
+       for Windows when IE was set as the default browser.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608292">608292</a>: Formatting was lost for section copied with \copydoc.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608359">608359</a>: Fixed C++ parse issue for "class : public base {} var;" 
-       construct.
+       construct.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611056">611056</a>: Generated HTML footer file did not have UTF-8 encoding and
-       the relative path marker needed when using CREATE_SUBDIRS = YES.
+       the relative path marker needed when using CREATE_SUBDIRS = YES.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611193">611193</a>: Fixed parsing problem with try-functions having multiple
-       catch handlers.
+       catch handlers.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611642">611642</a>: Specialized private template member function appeared as 
-       public.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611888">611888</a>: Include dependency graphs were sometimes wrong.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612170">612170</a>: Some lines in the generated Doxyfile where too long.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612275">612275</a>: Fixed auto-link problem for certain URLs.
+       public.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611888">611888</a>: Include dependency graphs were sometimes wrong.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612170">612170</a>: Some lines in the generated Doxyfile where too long.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612275">612275</a>: Fixed auto-link problem for certain URLs.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612292">612292</a>: Improved handling of ellipsis inside brief description when
-       JAVADOC_AUTOBRIEF is enabled.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612364">612364</a>: Accessibility of macros was not handled properly in all cases.
+       JAVADOC_AUTOBRIEF is enabled.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612364">612364</a>: Accessibility of macros was not handled properly in all cases.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612310">612310</a>: Enabling REFERENCED_BY_RELATION without SOURCE_BROWSER could
-       result in broken links.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612458">612458</a>: Fixed problem handling @copydoc for function operators.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612609">612609</a>: A raw C# string constant could end up in the next string.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612969">612969</a>: subpages were not part of the XML output.
+       result in broken links.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612458">612458</a>: Fixed problem handling @copydoc for function operators.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612609">612609</a>: A raw C# string constant could end up in the next string.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612969">612969</a>: subpages were not part of the XML output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=613024">613024</a>: First list item in the paragraph after a @todo
-       item was not parsed properly.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614204">614204</a>: Generated man page links were having a heading underscore.
+       item was not parsed properly.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614204">614204</a>: Generated man page links were having a heading underscore.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614443">614443</a>: Made include guard detect a bit more strict to avoid false
-       positives.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614447">614447</a>: The labels of CVS tags were missing a colon.
+       positives.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614447">614447</a>: The labels of CVS tags were missing a colon.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614438">614438</a>: Fixed problem parsing Q_PROPERTY with template type and
-       spaces.
+       spaces.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615165">615165</a>: Made the date string in the HTML footer translatable, 
-       along with some other sentences on the directory pages.
+       along with some other sentences on the directory pages.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612858">612858</a>: Inline attribute was shown also for non-inline template 
-       members.
+       members.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615583">615583</a>: Fixed problem handling @copy for operators with 
-       const qualifier.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615755">615755</a>: Fixed problem handling '"' inside comments.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615957">615957</a>: Made the LaTeX output a bit less spatious using \input.
+       const qualifier.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615755">615755</a>: Fixed problem handling '"' inside comments.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615957">615957</a>: Made the LaTeX output a bit less spatious using \input.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615695">615695</a>: Fixed preprocessor issue where a macro that was redefined
-       was not resolved.
-<li>   Fixed character encoding issue on the search results page.
+       was not resolved.</li>
+<li>   Fixed character encoding issue on the search results page.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615670">615670</a>: C# namespaces are now extracted also without comment block
-       (the language spec does not allow XML documentation).
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616209">616209</a>: included patch that fixes some typos in the code.
+       (the language spec does not allow XML documentation).</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616209">616209</a>: included patch that fixes some typos in the code.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616344">616344</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=610604">610604</a>: Pages with an underscore in the label generated a 
-       file name containing two underscores.
+       file name containing two underscores.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616387">616387</a>: text of the form something.symbol got autolinked when
-       symbol had a global scope.
+       symbol had a global scope.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616761">616761</a>: Call graph could be wrong when local variable has the same
-       name as a global function.
+       name as a global function.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616947">616947</a>: Added documentation patch on how to create URL links with 
-       custom text.
+       custom text.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616988">616988</a>: Doxywizard now removes non-existant files from the 
-       recent list and has an option to clear the list completely.
+       recent list and has an option to clear the list completely.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617051">617051</a>: A macro defined via PREDEFINED did not always overrule a
-       macro definition in the code.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617278">617278</a>: Enabling call graphs produced invalid XHTML output.
+       macro definition in the code.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617278">617278</a>: Enabling call graphs produced invalid XHTML output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617871">617871</a>: Non ascii characters in file or directory names 
-       caused problems on Windows.
+       caused problems on Windows.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618079">618079</a>: An ALIAS with parameters spanning multiple lines
-       caused problems with /// style comments. 
+       caused problems with /// style comments. </li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618632">618632</a>: Included patch to prevent image overflowing the page in 
-       the LaTeX output.
+       the LaTeX output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619728">619728</a>: Fixed problem using EXTENSION_MAPPING for C# (thanks to
-       Vsevolod Kukol for the patch).
+       Vsevolod Kukol for the patch).</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619978">619978</a>: Links to external files could be wrong when CREATE_SUBDIR
-       was enabled.
+       was enabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=620229">620229</a>: /* characters in a print broke parsing within an conditional
-       section.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=620926">620926</a>: \if and \endif did not work properly inside HTML tables.
+       section.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=620926">620926</a>: \if and \endif did not work properly inside HTML tables.</li>
 <li>   Using @include in combination with LATEX_SOURCE_CODE caused wrong
-       output.
+       output.</li>
 <li>   Included a patch by Guido Tack which adds two new options
        for docsets (DOCSET_PUBLISHER_ID and DOCSET_PUBLISHER_NAME) and 
-       fixes an issue with linking to docset members.
+       fixes an issue with linking to docset members.</li>
 <li>   Included patch by Stefan Oberhumer to support escaped {}'s in alias
-       definition and parameters.
+       definition and parameters.</li>
 
 </ul>
+<p>
 \endhtmlonly
 \section log_1_6 1.6 Series
 \htmlonly
 <a name="1.6.3"></a>
+</p>
 <h1>Doxygen Release 1.6.3</h1>
 <h2>(release date 21-02-2010)</h2>
 <h3>New features</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608480">608480</a>: Using \dir without argument will create directory 
                   documentation for the directory in which the \dir command 
-                  was found.
+                  was found.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=590161">590161</a>: perlmod output was wrong when using paragraph commands.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600525">600525</a>: Included patch for VHDL.
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=590161">590161</a>: perlmod output was wrong when using paragraph commands.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600525">600525</a>: Included patch for VHDL.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=605698">605698</a>: Replaced size attribute of hr tag by class attribute in the
-                  HTML output.
+                  HTML output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606030">606030</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606192">606192</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607563">607563</a>: 
                   Using \dot produced "Error opening map file" or 
-                  could even crash doxygen.
+                  could even crash doxygen.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606084">606084</a>: Loading a new config file in doxywizard did not reset all
-                  values of a previously loaded config file.
+                  values of a previously loaded config file.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606104">606104</a>: Grouped members with todo-like items were shown with 
-                  "GlobalScope" prefix.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606156">606156</a>: Fixed RTF rendering problem with group index.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606206">606206</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=610133">610133</a>: Added missing line break in LaTeX output.
+                  "GlobalScope" prefix.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606156">606156</a>: Fixed RTF rendering problem with group index.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606206">606206</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=610133">610133</a>: Added missing line break in LaTeX output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606330">606330</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608056">608056</a>: The title of pages whose label had an underscore
-                  was not shown
+                  was not shown</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606717">606717</a>: Include guard not starting with #ifndef SOME_GUARD_H were not
-                  recognised as such.
+                  recognised as such.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606718">606718</a>: Setting SEARCHENGINE to YES and GENERATE_HTML to NO caused
-                  error that search results directory could not be created.
+                  error that search results directory could not be created.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606772">606772</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608493">608493</a>: typedef'ed enums or struct with the same as the 
-                  typedef did no longer show up.
+                  typedef did no longer show up.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607088">607088</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607946">607946</a>: Related pages (manual and automatic like the todo page) 
-                  caused broken links when SHORT_NAMES was enabled.
+                  caused broken links when SHORT_NAMES was enabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607432">607432</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608002">608002</a>: Automatically generated related pages (like the 
-                  todo page) caused broken links when CREATE_SUBDIR was enabled.
+                  todo page) caused broken links when CREATE_SUBDIR was enabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607736">607736</a>: comments after #if could cause next function call not to be
-                  cross-referenced.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607743">607743</a>: \internal inside a conditional section caused warning.
+                  cross-referenced.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607743">607743</a>: \internal inside a conditional section caused warning.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608016">608016</a>: Using \internal inside a \section did not end at the
-       next \section as documented.
+       next \section as documented.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608018">608018</a>: \internal command produced message with .: in 
-       the LaTeX output.
+       the LaTeX output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608072">608072</a>: HTML Tables with custom attributes were not rendered 
-                  properly.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608227">608227</a>: Man pages with underscore got double underscore in the name.
+                  properly.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608227">608227</a>: Man pages with underscore got double underscore in the name.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608590">608590</a>: Buffer overflow when using non-ascii characters as class
-                  name.
+                  name.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608921">608921</a>: Macro definition had effect even if the definition was not
-                  actually included.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=609504">609504</a>: config.h and config.l where missing from the SVN repository.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=609624">609624</a>: Todo items were merged for overloaded functions.
+                  actually included.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=609504">609504</a>: config.h and config.l where missing from the SVN repository.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=609624">609624</a>: Todo items were merged for overloaded functions.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=609709">609709</a>: C# enum values with @todo items were missing from the todo
-                  list.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=610437">610437</a>: Removed bogus warning when using &lt;br/&gt; tag.
+                  list.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=610437">610437</a>: Removed bogus warning when using &lt;br/&gt; tag.</li>
 <li>   Fixed parsing problem for function pointer type starting with
-       "typedef enum".
+       "typedef enum".</li>
 <li>   Preprocessor did not take EXCLUDE_PATTERNS into account, which 
-       could cause parse issues when importing a .tlb file.
+       could cause parse issues when importing a .tlb file.</li>
 </ul>
 
 
@@ -2587,104 +2778,104 @@ make sure you add the following:
 <h3>Changes</h3>
 <ul>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594787">594787</a>: Autolinking to all-lower case words has been disabled,
-                  in accordance with the documentation.
+                  in accordance with the documentation.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=604543">604543</a>: Doxygen now allows any extension supported by dot via the
-       DOT_IMAGE_FORMAT option.
+       DOT_IMAGE_FORMAT option.</li>
 <li>   Switched back to using PNGs for built-in diagrams and formulas using
-       the Lode Vandevenne's PNG encoder.
+       the Lode Vandevenne's PNG encoder.</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   Added new option SERVER_BASED_SEARCH to re-enable searching via a
        PHP enabled web browser instead of only using javascript locally.
        This method better scales to larger projects and allows full text
-       search.
+       search.</li>
 <li>   Added new options GENERATE_ECLIPSEHELP and ECLIPSE_DOC_ID
        to generate an index file that can be used to embed doxygen's HTML 
        output into Eclipse as a help plugin 
-       (thanks to a patch by Ondrej Starek).
+       (thanks to a patch by Ondrej Starek).</li>
 <li>   Wrote new <a href="http://www.doxygen.org/searching.html">documentation</a> 
-       regarding the methods of searching in the HTML output.
+       regarding the methods of searching in the HTML output.</li>
 <li>   Included patch by Ed Rosten to render formulas with 
-       proper anti-aliasing on non-white backgrounds using transparency.
+       proper anti-aliasing on non-white backgrounds using transparency.</li>
 <li>   Add new option FORCE_LOCAL_INCLUDES to make the default #include
-       appearance in class documentation with "" i.s.o sharp brackets.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=558457">558457</a>: Make \addindex put keywords into the .qhp file.
+       appearance in class documentation with "" i.s.o sharp brackets.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=558457">558457</a>: Make \addindex put keywords into the .qhp file.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595214">595214</a>: #cmakedefine is now treated the same was as #define
-                  (for users of the CMake build system).
-<li>   Added compilation support for OSX 10.6 (aka Snow Leopard)
-<li>   Included language update for Brazilian.
+                  (for users of the CMake build system).</li>
+<li>   Added compilation support for OSX 10.6 (aka Snow Leopard)</li>
+<li>   Included language update for Brazilian.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
-<li>   Doxywizard did not warn when it failed to save its config file.
+<li>   Doxywizard did not warn when it failed to save its config file.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=557035">557035</a>: Empty class definitions were not included in Tokens file
-                  for docsets.
+                  for docsets.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=563233">563233</a>: GENERATE_QHP details was considered even though it is
-                  not defined.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567346">567346</a>: Comment parser could get stuck in certain cases.
+                  not defined.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567346">567346</a>: Comment parser could get stuck in certain cases.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=570369">570369</a>: GENERATE_QHP should generate keywords for classes in
-                  generated *.qhc.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=571964">571964</a>: Fixed two issues in the compound.xsd schema definition.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592991">592991</a>: Fixed wrong default destination directory.
+                  generated *.qhc.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=571964">571964</a>: Fixed two issues in the compound.xsd schema definition.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592991">592991</a>: Fixed wrong default destination directory.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593040">593040</a>: Fixed problem with distributing member group documentation
-                  for anonymous member groups.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593273">593273</a>: GENERATE_TODOLIST=NO and friends not longer worked.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593928">593928</a>: Added support for UCS-2 encoded input files.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594391">594391</a>: Fixed problem parsing fully-qualified java annotations.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594592">594592</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596815">596815</a>: Fixed problem handling quotes.
+                  for anonymous member groups.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593273">593273</a>: GENERATE_TODOLIST=NO and friends not longer worked.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593928">593928</a>: Added support for UCS-2 encoded input files.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594391">594391</a>: Fixed problem parsing fully-qualified java annotations.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594592">594592</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596815">596815</a>: Fixed problem handling quotes.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595191">595191</a>: Not all configuration options appeared in the index of
-                  the documentation and some were not sorted correctly.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595253">595253</a>: formulas had the .png extension while they were gifs.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595833">595833</a>: Fixed recursive lockup while resolving template relations.
+                  the documentation and some were not sorted correctly.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595253">595253</a>: formulas had the .png extension while they were gifs.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595833">595833</a>: Fixed recursive lockup while resolving template relations.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595935">595935</a>: Doxygen's preprocessor got confused when /**/ appeared as
-                  part of a macro definition.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596085">596085</a>: Removed obsolete option USE_WINDOWS_ENCODING from the docs.
+                  part of a macro definition.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596085">596085</a>: Removed obsolete option USE_WINDOWS_ENCODING from the docs.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596233">596233</a>: RTF output was missing a new paragraph for brief 
-                  member descriptions.
+                  member descriptions.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596807">596807</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596819">596819</a>: Code reformatting done for the LaTeX output could 
-                  break multibyte UTF-8 characters causing invalid output.
+                  break multibyte UTF-8 characters causing invalid output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596809">596809</a>: Using multibyte characters in a page label caused invalid
-                  output.
+                  output.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596816">596816</a>: Documented the interaction between LATEX_CMD_NAME and 
-                  USE_PDFLATEX.
+                  USE_PDFLATEX.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597015">597015</a>: Todo items for two inner classes with the same name where
                   collapsed together in the todo list when HIDE_SCOPE_NAMES 
-                  was enabled.
+                  was enabled.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597016">597016</a>: Scope was not hidden for members in the todo list even
-                  though HIDE_SCOPE_NAMES was set to YES.
+                  though HIDE_SCOPE_NAMES was set to YES.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=598497">598497</a>: Struct variable with explicit struct keyword got labelled 
-                  with [read] attribute.
+                  with [read] attribute.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596902">596902</a>: PHP was not parsed properly when it appeared in a
-                  &lt;script language="php"&gt; section.
+                  &lt;script language="php"&gt; section.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597415">597415</a>: Fixed problem matching base class member against the
-                  member in the derived class.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597518">597518</a>: Makefile for Docsets now honors DESTDIR.
+                  member in the derived class.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597518">597518</a>: Makefile for Docsets now honors DESTDIR.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=598298">598298</a>: Made browsing for HHC_LOCATION via the wizard 
-                  yield an absolute path.
+                  yield an absolute path.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=599128">599128</a>: Changed default for CHM_INDEX_ENCODING to CP1250 to avoid
-                  issues in a Solaris environment.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595931">595931</a>: Removed unnecessary paragraphs from HTML table cells.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597541">597541</a>: referring to page labels of the form a-1 did not work.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=599224">599224</a>: Code generators could produce extra &lt;/span&gt; tags.
+                  issues in a Solaris environment.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595931">595931</a>: Removed unnecessary paragraphs from HTML table cells.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597541">597541</a>: referring to page labels of the form a-1 did not work.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=599224">599224</a>: Code generators could produce extra &lt;/span&gt; tags.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=599974">599974</a>: Included the PHP search engine again (with new config 
-                  option SERVER_BASED_SEARCH to enable it)
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600544">600544</a>: Doxygen produced invalid Latex output for RCS tags.
+                  option SERVER_BASED_SEARCH to enable it)</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600544">600544</a>: Doxygen produced invalid Latex output for RCS tags.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600563">600563</a>: Fixed issue with include dependency tracking that could 
-                  cause macro expansion not to work properly.
+                  cause macro expansion not to work properly.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600940">600940</a>: Fixed issue with VHDL call graph (thank to Martin Kreis
-                  for the fix).
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601138">601138</a>: Fixed problem parsing C++ function-try-blocks.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601222">601222</a>: #include inside a class could cause line numbers to be off.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601223">601223</a>: Fixed parsing problem skipping over /**/ comment.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601694">601694</a>: Fixed problem handling Javadoc style {@code ... } blocks.
+                  for the fix).</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601138">601138</a>: Fixed problem parsing C++ function-try-blocks.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601222">601222</a>: #include inside a class could cause line numbers to be off.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601223">601223</a>: Fixed parsing problem skipping over /**/ comment.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601694">601694</a>: Fixed problem handling Javadoc style {@code ... } blocks.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601771">601771</a>: Special commands did not work in the title of 
-                  the @mainpage.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=602818">602818</a>: Fixed problem parsing files that start with UTF-8 BOM.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=603001">603001</a>: Fixed problem parsing friend function with explicit scope.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=603238">603238</a>: Fixed perlmod generation issue.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=604948">604948</a>: Project number was not centered anymore in the HTML output.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=604503">604503</a>: Using %word in a page title incorrectly did show the %.
+                  the @mainpage.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=602818">602818</a>: Fixed problem parsing files that start with UTF-8 BOM.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=603001">603001</a>: Fixed problem parsing friend function with explicit scope.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=603238">603238</a>: Fixed perlmod generation issue.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=604948">604948</a>: Project number was not centered anymore in the HTML output.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=604503">604503</a>: Using %word in a page title incorrectly did show the %.</li>
 </ul>
 
 <a name="1.6.1"></a>
@@ -2694,16 +2885,16 @@ make sure you add the following:
 <ul>
 <li>   Fixed file handle leak when parsing include files. Also fixed
        the logic that determines whether or not an include file need to be
-       parsed.
-<li>   Search result pages were not using UTF-8 character encoding.
-<li>   Search results pointing to external references were not linked correctly.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=133418">133418</a>: Multiline second argument of \ref caused unexpected " warning.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592454">592454</a>: Feeding invalid XML could crash doxygen's DBus XML parser.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592485">592485</a>: Include patch to fix problem with building rpms.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592511">592511</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592625">592625</a>: Doxywizard problem with GENERATE_TREEVIEW.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592650">592650</a>: SHOW_USED_FILES now works again.
+       parsed.</li>
+<li>   Search result pages were not using UTF-8 character encoding.</li>
+<li>   Search results pointing to external references were not linked correctly.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=133418">133418</a>: Multiline second argument of \ref caused unexpected " warning.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592454">592454</a>: Feeding invalid XML could crash doxygen's DBus XML parser.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592485">592485</a>: Include patch to fix problem with building rpms.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592511">592511</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592625">592625</a>: Doxywizard problem with GENERATE_TREEVIEW.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592650">592650</a>: SHOW_USED_FILES now works again.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592808">592808</a>: xrefitems (like @todo) did not appear in the list when
-       found in comments marked with @enum or @name.
+       found in comments marked with @enum or @name.</li>
 </ul>
 <h1>Doxygen Release 1.6.0</h1>
 <h2>(release date 20-08-2009)</h2>
@@ -2713,83 +2904,81 @@ make sure you add the following:
        Javascript/DHTML based one.
        As a result the search feature no longer requires a HTTP server
        with PHP enabled to be usable. Searching is limited to symbols
-       though, but it is now possible to filter on symbol type.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=519886">519886</a>: Make the HTML output XHTML 1.0 compliant.
+       though, but it is now possible to filter on symbol type.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=519886">519886</a>: Make the HTML output XHTML 1.0 compliant.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=579950">579950</a>: Objective-C categories are now merged with their base 
-       class, unless there is no base class.
+       class, unless there is no base class.</li>
 <li>   Member groups with the same header within the same scope are now
-       merged. This also works for Objective-C categories.
+       merged. This also works for Objective-C categories.</li>
 <li>   Changed the LaTeX style sheet such that more of the markup is 
-       configurable. Please update your style sheet if you use a custom one.
+       configurable. Please update your style sheet if you use a custom one.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=584844">584844</a>: Treat \details inside a brief description as a new paragraph
-       command.
+       command.</li>
 <li>   Split GENERATE_TREEVIEW into two separate options:
-       GENERATE_TREEVIEW and USE_INLINE_TREES.
+       GENERATE_TREEVIEW and USE_INLINE_TREES.</li>
 <li>   Removed the dependencies on libpng and libz, doxygen now generates
-       gifs again for internal class diagrams (like it did 7 years ago ;-)
+       gifs again for internal class diagrams (like it did 7 years ago ;-)</li>
 </ul>
 <h3>New features</h3>
 <ul>
 <li>   Added option SORT_MEMBERS_CTORS_1ST, which when enabled places the
-       constructors and destructors first in an otherwise sorted list.
+       constructors and destructors first in an otherwise sorted list.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=581518">581518</a>: Applied patch by Tobias Hunger that adds support for
-       documenting DBus XML interface descriptions. 
+       documenting DBus XML interface descriptions. </li>
 <li>   Included QtHelp patch by Karsten Heimrich which adds missing 
-       reference and keyword for methods.
-<li>   Included updates for the Korean and Polish translation.
+       reference and keyword for methods.</li>
+<li>   Included updates for the Korean and Polish translation.</li>
 </ul>
 <h3>Bug fixes</h3>
 <ul>
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=131989">131989</a>: Fixed preprocessor handling for C# code.  
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=133418">133418</a>: -- was not rendered correctly for LaTeX output
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=157485">157485</a>: Missing link in todo page.
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=131989">131989</a>: Fixed preprocessor handling for C# code.  </li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=133418">133418</a>: -- was not rendered correctly for LaTeX output</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=157485">157485</a>: Missing link in todo page.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=318061">318061</a>: Two template functions that only differed in the number
-       of template arguments were seen as the same function.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=443939">443939</a>: HIDE_UNDOC_CLASSES did not work properly.
+       of template arguments were seen as the same function.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=443939">443939</a>: HIDE_UNDOC_CLASSES did not work properly.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=509348">509348</a>: Fixed problem with syncing the information of 
        declaration and definition in the presence of an extra forward 
-       declaration in the source code.
+       declaration in the source code.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=522193">522193</a>: For C# enum values were merged together if the same enum 
-       name was used in different scopes.
+       name was used in different scopes.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=523167">523167</a>: Included patch to handle PROGRAM statement in Fortran as
-       subroutines/functions.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=554636">554636</a>: Remove spacing around brackets for Obj-C protocols.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=557026">557026</a>: Included patch for fixing wrongly labeled items in docsets.
+       subroutines/functions.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=554636">554636</a>: Remove spacing around brackets for Obj-C protocols.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=557026">557026</a>: Included patch for fixing wrongly labeled items in docsets.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=560512">560512</a>: Improved parser to better disambiguate
-       nested templates ending with &gt;&gt; from the bitshift right operator.
+       nested templates ending with &gt;&gt; from the bitshift right operator.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=570238">570238</a>: Fixed matching problem for method in nested class, where
-       the outer class is a template.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=581746">581746</a>: Segfault/realloc error when a very long path was used.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582469">582469</a>: documented #define with guard caused wrong documentation.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582276">582276</a>: Doxywizard could crash on exit in some cases.
+       the outer class is a template.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=581746">581746</a>: Segfault/realloc error when a very long path was used.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582469">582469</a>: documented #define with guard caused wrong documentation.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582276">582276</a>: Doxywizard could crash on exit in some cases.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582676">582676</a>: Regression: a struct ivar in ObjC class screws up method 
-                  identification.
+                  identification.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=583213">583213</a>: Included patch that avoids trailing spaces in the
-       generated Doxyfile template.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=584192">584192</a>: Included VHDL patch by Martin Klein
+       generated Doxyfile template.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=584192">584192</a>: Included VHDL patch by Martin Klein</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=585543">585543</a>: Fixed case where matching declaration and definition did
-       not work correctly.
+       not work correctly.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=585260">585260</a>: The "more..." link for files was broken, since the anchor
-       was not generated.
+       was not generated.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=586925">586925</a>: Fixed parsing problem when an unpaired apostrophe 
-       appeared in a Python comment.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=588291">588291</a>: Included fix for doxywizard makefile. 
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=588587">588587</a>: Added missing virtual destructor to CompAccept base class.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=588968">588968</a>: Fixed segmentation fault for specific case in PHP code.
-<li>   Fixed some issues building for Windows.
-<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=589514">589514</a>: Fixed problem handling strings like a"\b" within a comment.
+       appeared in a Python comment.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=588291">588291</a>: Included fix for doxywizard makefile. </li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=588587">588587</a>: Added missing virtual destructor to CompAccept base class.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=588968">588968</a>: Fixed segmentation fault for specific case in PHP code.</li>
+<li>   Fixed some issues building for Windows.</li>
+<li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=589514">589514</a>: Fixed problem handling strings like a"\b" within a comment.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=589616">589616</a>: Fixed problem matching explicitly scoped parameter in a 
-       template class.
+       template class.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=590712">590712</a>: A namespaced with name "internal" (C++/CLI keyword)
-       could confuse doxygen's C++ parser.
+       could confuse doxygen's C++ parser.</li>
 <li>   id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=591749">591749</a>: @optional/@required attributes for Objective-C were missing
-       from the XML output.
+       from the XML output.</li>
 </ul>
 <h1><a href="http://www.doxygen.org/changelog_1.5.html">Doxygen Release 1.5 and earlier</a></h1>
-<p>
-<hr>
-<p>
+<hr/>
 Go <a href="index.html">back</a> to the main page.
-
+<p>
 \endhtmlonly
 */
index f2150d1..313e518 100644 (file)
@@ -221,13 +221,13 @@ The following subsections provide a list of all commands that are recognized by
 doxygen. Unrecognized commands are treated as normal text.
 
 
-\htmlonly <center> \endhtmlonly
+\htmlonly</p><center><p>\endhtmlonly
 <h2>
 \htmlonly --- \endhtmlonly
 Structural indicators
 \htmlonly --- \endhtmlonly
 </h2>
-\htmlonly </center> \endhtmlonly
+\htmlonly</p></center><p>\endhtmlonly
 
 \section cmdaddtogroup \\addtogroup <name> [(title)]
   \addindex \\addtogroup
@@ -358,13 +358,17 @@ Structural indicators
   the \ref cmdheaderfile "\\headerfile" command.
 
   \par Example:
-  \verbinclude class.h
+  \include class.h
   \htmlonly
   Click <a href="examples/class/html/index.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{class_example}{Class example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
-<hr>
+</p><hr>
 \section cmddef \\def <name>
 
   \addindex \\def
@@ -372,13 +376,17 @@ Structural indicators
   \c \#define macro.
 
   \par Example:
-  \verbinclude define.h
+  \include define.h
   \htmlonly
   Click <a href="examples/define/html/define_8h.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{define_8h}{Define example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
-<hr>
+</p><hr>
 \section cmddefgroup \\defgroup <name> (group title)
 
   \addindex \\defgroup
@@ -420,13 +428,17 @@ Structural indicators
   of an anonymous enum can.
 
   \par Example:
-  \verbinclude enum.h
+  \include enum.h
   \htmlonly
   Click <a href="examples/enum/html/class_test.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{class_enum___test}{Enum example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
-<hr>
+</p><hr>
 \section cmdexample \\example <file-name>
 
   \addindex \\example
@@ -449,17 +461,21 @@ Structural indicators
   the \ref cmdinclude "\\include" command can be used.
 
   \par Example:
-  \verbinclude example.cpp
+  \include example.cpp
   Where the example file \c example_test.cpp looks as follows:
-  \verbinclude example_test.cpp
+  \include example_test.cpp
   \htmlonly
   Click <a href="examples/example/html/examples.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{example_test_8cpp-example}{Example example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
   \sa section \ref cmdinclude "\\include".
 
-<hr>
+</p><hr>
 \section cmdendinternal \\endinternal
 
   \addindex \\endinternal
@@ -481,7 +497,12 @@ Structural indicators
   \htmlonly
   Click <a href="examples/manual/html/index.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
+  </p>
   \endhtmlonly
+  \latexonly
+  See \hyperlink{extends_example}{Extends example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
   \sa section \ref cmdimplements "\\implements" and section
       \ref cmdmemberof "\\memberof"
@@ -501,16 +522,20 @@ Structural indicators
   only be included in the output if the file they are in is documented as well.
 
   \par Example:
-  \verbinclude file.h
+  \include file.h
   \htmlonly
   Click <a href="examples/file/html/file_8h.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{file_example}{File example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
   \note In the above example \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF"
   has been set to \c YES in the configuration file.
 
-<hr>
+</p><hr>
 \section cmdfn \\fn (function declaration)
 
   \addindex \\fn
@@ -535,17 +560,20 @@ Structural indicators
   information and thus to errors.
 
   \par Example:
-  \verbinclude func.h
+  \include func.h
   \htmlonly
   Click <a href="examples/func/html/class_test.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
-
+  \latexonly
+  See \hyperlink{class_fn___test}{Fn example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
   \sa sections \ref cmdvar "\\var", \ref cmdproperty "\\property", and
                \ref cmdtypedef "\\typedef".
 
-<hr>
+</p><hr>
 \section cmdheaderfile \\headerfile <header-file> [<header-name>]
 
   \addindex \\headerfile
@@ -621,7 +649,12 @@ Structural indicators
   \htmlonly
   Click <a href="examples/manual/html/index.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
+  </p>
   \endhtmlonly
+  \latexonly
+  See \hyperlink{extends_example}{Implements example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
   \sa section \ref cmdextends "\\extends" and section
       \ref cmdmemberof "\\memberof"
@@ -727,7 +760,7 @@ Structural indicators
       \ref cmdpublic "\\public", \ref cmdprotected "\\protected" and
       \ref cmdprivate "\\private".
 
-<hr>
+</p><hr>
 \section cmdname \\name [(header)]
 
   \addindex \\name
@@ -785,13 +818,17 @@ Structural indicators
   \par Note 2:
     The \c \\overload command does not work inside a one-line comment.
   \par Example:
-  \verbinclude examples/overload.cpp
+  \include overload.cpp
   \htmlonly
   Click <a href="examples/overload/html/class_test.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{class_overload___test}{Overload example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
-<hr>
+</p><hr>
 \section cmdpackage \\package <name>
 
   \addindex \\package
@@ -809,11 +846,15 @@ Structural indicators
   starts a new section in the chapter 'Page documentation'.
 
   \par Example:
-  \verbinclude page.doc
+  \include page.doc
   \htmlonly
   Click <a href="examples/page/html/pages.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{page_example}{Page example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
   \par Note:
      The \<name\> argument consists of a combination of letters and number
@@ -828,7 +869,7 @@ Structural indicators
               \ref cmdsubsection "\\subsection", and section
               \ref cmdref "\\ref".
 
-<hr>
+</p><hr>
 \section cmdprivate \\private
 
   \addindex \\private
@@ -965,13 +1006,17 @@ Structural indicators
   only works for functions.
 
   \par Example:
-  \verbinclude relates.cpp
+  \include relates.cpp
   \htmlonly
   Click <a href="examples/relates/html/class_string.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{class_string}{Relates example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
-<hr>
+</p><hr>
 \section cmdrelated \\related <name>
 
   \addindex \\related
@@ -1082,13 +1127,13 @@ Structural indicators
 
 <hr>
 
-\htmlonly <center> \endhtmlonly
+\htmlonly</p><center><p>\endhtmlonly
 <h2>
 \htmlonly --- \endhtmlonly
 Section indicators
 \htmlonly --- \endhtmlonly
 </h2>
-\htmlonly </center>\endhtmlonly
+\htmlonly</p></center><p>\endhtmlonly
 
 <hr>
 \section cmdattention \\attention { attention text }
@@ -1116,13 +1161,17 @@ Section indicators
   sectioning command is encountered.
 
   \par Example:
-  \verbinclude author.cpp
+  \include author.cpp
   \htmlonly
   Click <a href="examples/author/html/class_some_nice_class.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{class_some_nice_class}{Author example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
-<hr>
+</p><hr>
 \section cmdauthors \\authors { list of authors }
 
   \addindex \\authors
@@ -1459,13 +1508,17 @@ ALIASES  = "english=\if english" \
   sectioning command is encountered.
 
   \par Example:
-  \verbinclude par.cpp
+  \include par.cpp
   \htmlonly
   Click <a href="examples/par/html/class_test.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{class_par___test}{Par example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
-<hr>
+</p><hr>
 \section cmdparam \\param [(dir)] <parameter-name> { parameter description }
 
   \addindex \\param
@@ -1807,13 +1860,13 @@ void setPosition(double x,double y,double z,double t)
 
 <hr>
 
-\htmlonly <center> \endhtmlonly
+\htmlonly</p><center><p>\endhtmlonly
 <h2>
 \htmlonly --- \endhtmlonly
 Commands to create links
 \htmlonly --- \endhtmlonly
 </h2>
-\htmlonly </center>\endhtmlonly
+\htmlonly</p></center><p>\endhtmlonly
 
 <hr>
 \section cmdaddindex \\addindex (text)
@@ -2032,13 +2085,13 @@ Make sure you have first read \ref intro "the introduction".
 
 <hr>
 
-\htmlonly <center> \endhtmlonly
+\htmlonly</p><center><p>\endhtmlonly
 <h2>
 \htmlonly --- \endhtmlonly
 Commands for displaying examples
 \htmlonly --- \endhtmlonly
 </h2>
-\htmlonly </center>\endhtmlonly
+\htmlonly</p></center><p>\endhtmlonly
 
 <hr>
 \section cmddontinclude \\dontinclude <file-name>
@@ -2063,13 +2116,17 @@ Commands for displaying examples
   \c \\dontinclude command sets the pointer to the first line of the example.
 
   \par Example:
-  \verbinclude include.cpp
+  \include include.cpp
   Where the example file \c example_test.cpp looks as follows:
-  \verbinclude example_test.cpp
+  \include example_test.cpp
   \htmlonly
   Click <a href="examples/include/html/example.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
+  \latexonly
+  See \hyperlink{include_example}{Include example}
+  for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+  \endlatexonly
 
   Alternatively, the \ref cmdsnippet "\\snippet" command can be used to
   include only a fragment of a source file. For this to work the
@@ -2079,7 +2136,7 @@ Commands for displaying examples
                \ref cmdskipline "\\skipline", \ref cmduntil "\\until", and
                \ref cmdinclude "\\include".
 
-<hr>
+</p><hr>
 \section cmdinclude \\include <file-name>
 
   \addindex \\include
@@ -2283,13 +2340,13 @@ Commands for displaying examples
 
 <hr>
 
-\htmlonly <center> \endhtmlonly
+\htmlonly</p><center><p>\endhtmlonly
 <h2>
 \htmlonly --- \endhtmlonly
 Commands for visual enhancements
 \htmlonly --- \endhtmlonly
 </h2>
-\htmlonly </center>\endhtmlonly
+\htmlonly</p></center><p>\endhtmlonly
 
 \section cmda \\a <word>
 
@@ -2506,7 +2563,7 @@ only copy the detailed documentation, not the brief description.
 
   The second argument is also optional and can be used to specify the
   width or height of the image.
-  For a descriptionm of the possibilities see the paragraph
+  For a description of the possibilities see the paragraph
   \ref image_sizeindicator "Size indication" with the
   \ref cmdimage "\\image" command.
 
@@ -2551,7 +2608,7 @@ class C {};
 
   The second argument is also optional and can be used to specify the
   width or height of the image. 
-  For a descriptionm of the possibilities see the paragraph
+  For a description of the possibilities see the paragraph
   \ref image_sizeindicator "Size indication" with the
   \ref cmdimage "\\image" command.
 
@@ -2626,7 +2683,7 @@ class Receiver
 
   The third argument is also optional and can be used to specify the
   width or height of the image.
-  For a descriptionm of the possibilities see the paragraph
+  For a description of the possibilities see the paragraph
   \ref image_sizeindicator "Size indication" with the
   \ref cmdimage "\\image" command.
 
@@ -2681,7 +2738,7 @@ class Receiver
 
   The third argument is also optional and can be used to specify the
   width or height of the image.
-  For a descriptionm of the possibilities see the paragraph
+  For a description of the possibilities see the paragraph
   \ref image_sizeindicator "Size indication" with the
   \ref cmdimage "\\image" command.
 
@@ -2708,7 +2765,7 @@ class Receiver
 
   The third argument is also optional and can be used to specify the
   width or height of the image.
-  For a descriptionm of the possibilities see the paragraph
+  For a description of the possibilities see the paragraph
   \ref image_sizeindicator "Size indication" with the
   \ref cmdimage "\\image" command.
 
@@ -2734,7 +2791,7 @@ class Receiver
 
   The third argument is also optional and can be used to specify the
   width or height of the image.
-  For a descriptionm of the possibilities see the paragraph
+  For a description of the possibilities see the paragraph
   \ref image_sizeindicator "Size indication" with the
   \ref cmdimage "\\image" command.
 
@@ -3265,13 +3322,13 @@ class Receiver
   writing three consecutuve dashes to the output instead of one m-dash character (---).
 
 <hr>
-\htmlonly <center> \endhtmlonly
+\htmlonly</p><center><p>\endhtmlonly
 <h2>
 \htmlonly --- \endhtmlonly
 Commands included for Qt compatibility
 \htmlonly --- \endhtmlonly
 </h2>
-\htmlonly </center>\endhtmlonly
+\htmlonly</p></center><p>\endhtmlonly
 
 The following commands are supported to remain compatible to the Qt class
 browser generator. Do \e not use these commands in your own documentation.
@@ -3290,8 +3347,10 @@ browser generator. Do \e not use these commands in your own documentation.
 
 
 \htmlonly
+</p>
 Go to the <a href="htmlcmds.html">next</a> section or return to the
  <a href="index.html">index</a>.
+<p>
 \endhtmlonly
 
 */
index c87337b..49be5d6 100644 (file)
@@ -127,24 +127,32 @@ Here are a couple of header files that together show the various diagrams
 that doxygen can generate: 
 
 <code>diagrams_a.h</code>
-\verbinclude diagrams_a.h
+\include diagrams_a.h
 <code>diagrams_b.h</code>
-\verbinclude diagrams_b.h
+\include diagrams_b.h
 <code>diagrams_c.h</code>
-\verbinclude diagrams_c.h
+\include diagrams_c.h
 <code>diagrams_d.h</code>
-\verbinclude diagrams_d.h
+\include diagrams_d.h
 <code>diagrams_e.h</code>
-\verbinclude diagrams_e.h
+\include diagrams_e.h
 
 \htmlonly
+</p>
 Click <a href="examples/diagrams/html/index.html">here</a>
 for the corresponding HTML documentation that is generated by doxygen<br/>
 (<code>EXTRACT_ALL</code> = <code>YES</code> is used here).
 \endhtmlonly
+\latexonly
+\IfFileExists{../html/examples/diagrams/latex/refman_doc.tex}
+{
+See \hyperlink{diagrams_example}{Diagrams example}
+for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+} {}
+\endlatexonly
 
 \htmlonly
-<br><br>
+<br/><br/>
 Go to the <a href="preprocessing.html">next</a> section or return to the
 <a href="index.html">index</a>.
 \endhtmlonly
index f073de5..735def6 100644 (file)
@@ -259,9 +259,14 @@ located in front of the block instead of after the block.
 Here is an example of the use of these comment blocks:
 \include afterdoc.h
  \htmlonly
+ </p>
  Click <a href="examples/afterdoc/html/class_test.html">here</a>
  for the corresponding HTML documentation that is generated by doxygen.
  \endhtmlonly
+ \latexonly
+ See \hyperlink{afterdoc_example}{After Block example}
+ for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+ \endlatexonly
 
 \warning These blocks can only be used to document \e members and \e parameters.
          They cannot be used to document files, classes, unions, structs,
@@ -275,9 +280,14 @@ Here is an example of the use of these comment blocks:
 Here is an example of a documented piece of C++ code using the Qt style:
 \include qtstyle.cpp
  \htmlonly
+ </p>
  Click <a href="examples/qtstyle/html/class_test.html">here</a>
  for the corresponding HTML documentation that is generated by doxygen.
  \endhtmlonly
+ \latexonly
+ See \hyperlink{qtstyle_example}{QT Style example}
+ for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+ \endlatexonly
 
 The brief descriptions are included in the member overview of a 
 class, namespace or file and are printed using a small italic font 
@@ -305,9 +315,14 @@ Here is the same piece of code as shown above, this time documented using the
 JavaDoc style and \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" set to YES:
 \include jdstyle.cpp
  \htmlonly
+ </p>
  Click <a href="examples/jdstyle/html/class_test.html">here</a>
  for the corresponding HTML documentation that is generated by doxygen.
  \endhtmlonly
+ \latexonly
+ See \hyperlink{jdstyle_example}{Javadoc Style example}
+ for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+ \endlatexonly
 
 Similarly, if one wishes the first sentence of a Qt style documentation
 block to automatically be treated as a brief description, one may set
@@ -381,9 +396,14 @@ Here is an example of a C header named \c structcmd.h that is documented
 using structural commands:
 \include structcmd.h
  \htmlonly
+ </p>
  Click <a href="examples/structcmd/html/structcmd_8h.html">here</a>
  for the corresponding HTML documentation that is generated by doxygen.
  \endhtmlonly
+ \latexonly
+ See \hyperlink{structcmd_example}{Structural Commands example}
+ for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+ \endlatexonly
 
  Because each comment block in the example above contains a structural command, all
  the comment blocks could be moved to another location or input file 
@@ -421,9 +441,14 @@ and assume they have to be represented in a preformatted way.
 
 \include docstring.py
  \htmlonly
+ </p>
  Click <a href="examples/docstring/html/index.html">here</a>
  for the corresponding HTML documentation that is generated by doxygen.
  \endhtmlonly
+ \latexonly
+ See \hyperlink{python_example}{Python Docstring example}
+ for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+ \endlatexonly
 
 Note that in this case none of doxygen's \ref cmd_intro "special commands" 
 are supported.
@@ -437,9 +462,14 @@ Here is the same example again but now using doxygen style comments:
 
 \include pyexample.py
  \htmlonly
+ </p>
  Click <a href="examples/pyexample/html/index.html">here</a>
  for the corresponding HTML documentation that is generated by doxygen.
  \endhtmlonly
+ \latexonly
+ See \hyperlink{py_example}{Python example}
+ for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+ \endlatexonly
 
 Since python looks more like Java than like C or C++, you should set 
 \ref cfg_optimize_output_java "OPTIMIZE_OUTPUT_JAVA" to \c YES in the
@@ -462,9 +492,14 @@ Here is an example VHDL file with doxygen comments:
 
 \include  mux.vhdl
  \htmlonly
+ </p>
  Click <a href="examples/mux/html/index.html">here</a>
  for the corresponding HTML documentation that is generated by doxygen.
  \endhtmlonly
+ \latexonly
+ See \hyperlink{vhdl_example}{VHDL example}
+ for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+ \endlatexonly
 
 To get proper looking output you need to set
 \ref cfg_optimize_output_vhdl "OPTIMIZE_OUTPUT_VHDL" to \c YES in the
@@ -571,9 +606,14 @@ Following is an example using doxygen style comments:
 
 \include tclexample.tcl
  \htmlonly
+ </p>
  Click <a href="examples/tclexample/html/index.html">here</a>
  for the corresponding HTML documentation that is generated by doxygen.
  \endhtmlonly
+ \latexonly
+ See \hyperlink{tcl_example}{TCL example}
+ for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+ \endlatexonly
 
 
 \section docstructure Anatomy of a comment block
@@ -601,15 +641,15 @@ Markdown is designed to be very easy to read and write.
 It's formatting is inspired by plain text mail.
 Markdown works great for simple, generic formatting, like an introduction
 page for your project. Doxygen also supports reading of markdown files 
-directly. See \ref markdown "here" for more details regards Markdown support.
+directly. For more details see chapter \ref markdown.
 
 For programming language specific formatting doxygen has two
 forms of additional markup on top of Markdown formatting.
 
 1. <a href="http://en.wikipedia.org/wiki/Javadoc">Javadoc</a> like markup.
-   See \ref cmd_intro "here" for a complete overview of all commands supported by doxygen.
+   See \ref commands for a complete overview of all commands supported by doxygen.
 2. <a href="http://en.wikipedia.org/wiki/C_Sharp_(programming_language)#XML_documentation_system">XML</a> markup
-   as specified in the C# standard. See \ref xmlcmds "here" for the XML commands supported by doxygen.
+   as specified in the C# standard. See \ref xmlcmds for the XML commands supported by doxygen.
 
 If this is still not enough doxygen also supports a \ref htmlcmds "subset" of 
 the <a href="http://en.wikipedia.org/wiki/HTML">HTML</a> markup language.
index 6861c22..1deb7b6 100644 (file)
@@ -1,4 +1,4 @@
-.TH DOXYGEN "1" "DATE" "doxygen VERSION" "User Commands"
+.TH DOXYGEN "1" "@DATE@" "doxygen @VERSION@" "User Commands"
 .SH NAME
 doxygen \- documentation system for various programming languages
 .SH DESCRIPTION
@@ -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-2015
+Doxygen version @VERSION@, Copyright Dimitri van Heesch 1997-2015
 .SH SEE ALSO
 doxywizard(1).
diff --git a/doc/doxygen.sty b/doc/doxygen.sty
deleted file mode 100644 (file)
index 8013dad..0000000
+++ /dev/null
@@ -1,486 +0,0 @@
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{doxygen}
-
-% Packages used by this style file
-\RequirePackage{alltt}
-\RequirePackage{array}
-\RequirePackage{calc}
-\RequirePackage{color}
-\RequirePackage{fancyhdr}
-\RequirePackage{longtable}
-\RequirePackage{verbatim}
-\RequirePackage{ifthen}
-\RequirePackage{xtab}
-\RequirePackage{multirow}
-\RequirePackage[table]{xcolor}
-
-% Use helvetica font instead of times roman
-\RequirePackage{helvet}
-\RequirePackage{sectsty}
-\RequirePackage{tocloft}
-\providecommand{\rmdefault}{phv}
-\providecommand{\bfdefault}{bc}
-
-
-% Setup fancy headings
-\pagestyle{fancyplain}
-\newcommand{\clearemptydoublepage}{%
-  \newpage{\pagestyle{empty}\cleardoublepage}%
-}
-\renewcommand{\chaptermark}[1]{%
-  \markboth{#1}{}%
-}
-\renewcommand{\sectionmark}[1]{%
-  \markright{\thesection\ #1}%
-}
-\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}}
-\fancyhead[CE]{\fancyplain{}{}}
-\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}}
-\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}}
-\fancyhead[CO]{\fancyplain{}{}}
-\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}}
-\fancyfoot[LE]{\fancyplain{}{}}
-\fancyfoot[CE]{\fancyplain{}{}}
-\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen }}
-\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen }}
-\fancyfoot[CO]{\fancyplain{}{}}
-\fancyfoot[RO]{\fancyplain{}{}}
-%---------- Internal commands used in this style file ----------------
-
-\newcommand\tabfill[1]{%
-  \dimen@\linewidth%
-  \advance\dimen@\@totalleftmargin%
-  \advance\dimen@-\dimen\@curtab%
-  \parbox[t]\dimen@{\raggedright #1\ifhmode\strut\fi}%
-}
-
-\newcommand{\ensurespace}[1]{%
-  \begingroup
-    \setlength{\dimen@}{#1}%
-    \vskip\z@\@plus\dimen@
-    \penalty -100\vskip\z@\@plus -\dimen@
-    \vskip\dimen@
-    \penalty 9999%
-    \vskip -\dimen@
-    \vskip\z@skip % hide the previous |\vskip| from |\addvspace|
-  \endgroup
-}
-
-% Generic environment used by all paragraph-based environments defined
-% below. Note that the command \title{...} needs to be defined inside
-% those environments!
-\newenvironment{DoxyDesc}[1]{%
-  \ensurespace{4\baselineskip}%
-  \begin{list}{}%
-  {%
-    \settowidth{\labelwidth}{40pt}%
-    \setlength{\leftmargin}{\labelwidth}%
-    \setlength{\parsep}{0pt}%
-    \setlength{\itemsep}{-4pt}%
-    \renewcommand{\makelabel}{\entrylabel}%
-  }%
-  \item[#1]%
-}{%
-  \end{list}%
-}
-
-%---------- Commands used by doxygen LaTeX output generator ----------
-
-% Used by <pre> ... </pre>
-\newenvironment{DoxyPre}{%
-  \small%
-  \begin{alltt}%
-}{%
-  \end{alltt}%
-  \normalsize%
-}
-
-% Used by @code ... @endcode
-\newenvironment{DoxyCode}{%
-
-
-\begin{scriptsize}\begin{alltt}%
-}{%
-\end{alltt}\end{scriptsize}%
-}
-
-% Used by @example, @include, @includelineno and @dontinclude
-\newenvironment{DoxyCodeInclude}{%
-  \DoxyCode%
-}{%
-  \endDoxyCode%
-}
-
-% Used by @verbatim ... @endverbatim
-\newenvironment{DoxyVerb}{%
-  \footnotesize%
-  \verbatim%
-}{%
-  \endverbatim%
-  \normalsize%
-}
-
-% Used by @verbinclude
-\newenvironment{DoxyVerbInclude}{%
-  \DoxyVerb%
-}{%
-  \endDoxyVerb%
-}
-
-% Used by numbered lists (using '-#' or <ol> ... </ol>)
-\newenvironment{DoxyEnumerate}{%
-  \enumerate%
-}{%
-  \endenumerate%
-}
-
-% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)
-\newenvironment{DoxyItemize}{%
-  \itemize%
-}{%
-  \enditemize%
-}
-
-% Used by description lists (using <dl> ... </dl>)
-\newenvironment{DoxyDescription}{%
-  \description%
-}{%
-  \enddescription%
-}
-
-% Used by @image, @dotfile, and @dot ... @enddot
-% (only if caption is specified)
-\newenvironment{DoxyImage}{%
-  \begin{figure}[H]%
-  \begin{center}%
-}{%
-  \end{center}%
-  \end{figure}%
-}
-
-% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
-% (only if no caption is specified)
-\newenvironment{DoxyImageNoCaption}{%
-}{%
-}
-
-% Used by @attention
-\newenvironment{DoxyAttention}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @author and @authors
-\newenvironment{DoxyAuthor}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @date
-\newenvironment{DoxyDate}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @invariant
-\newenvironment{DoxyInvariant}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @note
-\newenvironment{DoxyNote}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @post
-\newenvironment{DoxyPostcond}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @pre
-\newenvironment{DoxyPrecond}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @copyright
-\newenvironment{DoxyCopyright}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @remark
-\newenvironment{DoxyRemark}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @return
-\newenvironment{DoxyReturn}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @since
-\newenvironment{DoxySince}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @see
-\newenvironment{DoxySeeAlso}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @version
-\newenvironment{DoxyVersion}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @warning
-\newenvironment{DoxyWarning}[1]{%
-  \begin{DoxyDesc}{#1}%
-}{%
-  \end{DoxyDesc}%
-}
-
-% Used by @internal
-\newenvironment{DoxyInternal}[1]{%
-  \paragraph*{#1}%
-}{%
-}
-
-% Used by @par and @paragraph
-\newenvironment{DoxyParagraph}[1]{%
-  \begin{list}{}%
-  {%
-    \settowidth{\labelwidth}{40pt}%
-    \setlength{\leftmargin}{\labelwidth}%
-    \setlength{\parsep}{0pt}%
-    \setlength{\itemsep}{-4pt}%
-    \renewcommand{\makelabel}{\entrylabel}%
-  }%
-  \item[#1]%
-}{%
-  \end{list}%
-}
-
-% Used by parameter lists
-\newenvironment{DoxyParams}[2][]{%
-  \begin{DoxyDesc}{#2}%
-    \item[] \hspace{\fill} \vspace{-40pt}%
-    \settowidth{\labelwidth}{40pt}%
-    \setlength{\LTleft}{0pt}%
-    \setlength{\tabcolsep}{0.01\textwidth}%
-    \ifthenelse{\equal{#1}{}}%
-    {\begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
-                        p{0.815\textwidth}|}}%
-    {\ifthenelse{\equal{#1}{1}}%
-      {\begin{longtable}{|>{\centering}p{0.10\textwidth}|%
-                         >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
-                         p{0.685\textwidth}|}}%
-      {\begin{longtable}{|>{\centering}p{0.10\textwidth}|%
-                         >{\centering\hspace{0pt}}p{0.15\textwidth}|%
-                         >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
-                         p{0.515\textwidth}|}}%
-    }\hline%
-}{%
-    \end{longtable}%
-  \end{DoxyDesc}%
-}
-
-% Used for fields of simple structs
-\newenvironment{DoxyFields}[1]{%
-  \begin{DoxyDesc}{#1}%
-    \item[] \hspace{\fill} \vspace{-40pt}%
-    \settowidth{\labelwidth}{40pt}%
-    \setlength{\LTleft}{0pt}%
-    \setlength{\tabcolsep}{0.01\textwidth}%
-    \begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
-                         p{0.15\textwidth}|%
-                         p{0.635\textwidth}|}%
-    \hline%
-}{%
-    \end{longtable}%
-  \end{DoxyDesc}%
-}
-
-% is used for parameters within a detailed function description
-\newenvironment{DoxyParamCaption}{%
-  \renewcommand{\item}[2][]{##1 {\em ##2}}%
-  }{%
-}
-
-% Used by return value lists
-\newenvironment{DoxyRetVals}[1]{%
-  \begin{DoxyDesc}{#1}%
-    \begin{description}%
-      \item[] \hspace{\fill} \vspace{-25pt}%
-      \setlength{\tabcolsep}{0.01\textwidth}%
-      \begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
-                          p{0.77\textwidth}|}%
-      \hline%
-}{%
-      \end{longtable}%
-    \end{description}%
-  \end{DoxyDesc}%
-}
-
-% Used by exception lists
-\newenvironment{DoxyExceptions}[1]{%
-  \begin{DoxyDesc}{#1}%
-    \begin{description}%
-      \item[] \hspace{\fill} \vspace{-25pt}%
-      \definecolor{tableShade}{HTML}{F8F8F8}%
-      \rowcolors{1}{white}{tableShade}%
-      \arrayrulecolor{gray}%
-      \setlength{\tabcolsep}{0.01\textwidth}%
-      \begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
-                          p{0.77\textwidth}|}%
-      \hline%
-}{%
-      \end{longtable}%
-    \end{description}%
-  \end{DoxyDesc}%
-}
-
-% Used by template parameter lists
-\newenvironment{DoxyTemplParams}[1]{%
-  \begin{DoxyDesc}{#1}%
-    \begin{description}%
-      \item[] \hspace{\fill} \vspace{-25pt}%
-      \definecolor{tableShade}{HTML}{F8F8F8}%
-      \rowcolors{1}{white}{tableShade}%
-      \arrayrulecolor{gray}%
-      \setlength{\tabcolsep}{0.01\textwidth}%
-      \begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
-                          p{0.77\textwidth}|}%
-      \hline%
-}{%
-      \end{longtable}%
-    \end{description}%
-  \end{DoxyDesc}%
-}
-
-\newcommand{\doxyref}[3]{\textbf{#1} (\textnormal{#2}\,\pageref{#3})}
-\newcommand{\lcurly}{\{}
-\newcommand{\rcurly}{\}}
-\newenvironment{DoxyCompactList}
-{\begin{list}{}{
-  \setlength{\leftmargin}{0.5cm}
-  \setlength{\itemsep}{0pt}
-  \setlength{\parsep}{0pt}
-  \setlength{\topsep}{0pt}
-  \renewcommand{\makelabel}{\hfill}}}
-{\end{list}}
-\newenvironment{DoxyCompactItemize}
-{
-  \begin{itemize}
-  \setlength{\itemsep}{-3pt}
-  \setlength{\parsep}{0pt}
-  \setlength{\topsep}{0pt}
-  \setlength{\partopsep}{0pt}
-}
-{\end{itemize}}
-\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}
-\newlength{\tmplength}
-\newenvironment{TabularC}[1]
-{
-\setlength{\tmplength}
-     {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}
-      \par\begin{xtabular*}{\linewidth}
-             {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}
-}
-{\end{xtabular*}\par}
-\newcommand{\entrylabel}[1]{
-   {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{%
-   \usefont{OT1}{phv}{bc}{n}\color{darkgray}#1}\vspace{1.5\baselineskip}}}}
-\newenvironment{Desc}
-{\begin{list}{}
-  {
-    \settowidth{\labelwidth}{40pt}
-    \setlength{\leftmargin}{\labelwidth}
-    \setlength{\parsep}{0pt}
-    \setlength{\itemsep}{-4pt}
-    \renewcommand{\makelabel}{\entrylabel}
-  }
-}
-{\end{list}}
-\newsavebox{\xrefbox}
-\newlength{\xreflength}
-\newcommand{\xreflabel}[1]{%
-  \sbox{\xrefbox}{#1}%
-  \setlength{\xreflength}{\wd\xrefbox}%
-  \ifthenelse{\xreflength>\labelwidth}{%
-    \begin{minipage}{\textwidth}%
-      \setlength{\parindent}{0pt}%
-      \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}%
-    \end{minipage}%
-  }{%
-   \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}%
-  }}%
-\newenvironment{DoxyRefList}{%
-  \begin{list}{}{%
-    \setlength{\labelwidth}{10pt}%
-    \setlength{\leftmargin}{\labelwidth}%
-    \addtolength{\leftmargin}{\labelsep}%
-    \renewcommand{\makelabel}{\xreflabel}%
-    }%
-  }%
-{\end{list}}
-\newenvironment{DoxyRefDesc}[1]
-{\begin{list}{}{%
-  \renewcommand\makelabel[1]{\textbf{##1}}
-  \settowidth\labelwidth{\makelabel{#1}}
-  \setlength\leftmargin{\labelwidth+\labelsep}}}
-{\end{list}}
-\newenvironment{Indent}
-  {\begin{list}{}{\setlength{\leftmargin}{0.5cm}}
-      \item[]\ignorespaces}
-  {\unskip\end{list}}
-\setlength{\parindent}{0cm}
-\setlength{\parskip}{0.2cm}
-\addtocounter{secnumdepth}{2}
-\usepackage[T1]{fontenc}
-\makeatletter
-\renewcommand{\paragraph}{\@startsection{paragraph}{4}{0ex}%
-   {-1.0ex}%
-   {1.0ex}%
-   {\usefont{OT1}{phv}{bc}{n}\color{darkgray}}}
-\renewcommand{\subparagraph}{\@startsection{subparagraph}{5}{0ex}%
-   {-1.0ex}%
-   {1.0ex}%
-   {\usefont{OT1}{phv}{bc}{n}\color{darkgray}}}
-\makeatother
-\allsectionsfont{\usefont{OT1}{phv}{bc}{n}\selectfont\color{darkgray}}
-\stepcounter{secnumdepth}
-\stepcounter{tocdepth}
-\definecolor{comment}{rgb}{0.5,0.0,0.0}
-\definecolor{keyword}{rgb}{0.0,0.5,0.0}
-\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}
-\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}
-\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}
-\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}
-\definecolor{charliteral}{rgb}{0.0,0.5,0.5}
-\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}
-\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}
-\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}
-\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}
index c97c5f0..9f96adf 100644 (file)
@@ -12,6 +12,7 @@
 % Documents produced by Doxygen are derivative works derived from the
 % input used in their production; they are not affected by this license.
 
+\batchmode
 \documentclass{book}
 \usepackage[a4paper,left=2.5cm,right=2.5cm,top=2.5cm,bottom=2.5cm]{geometry}
 \usepackage{makeidx}
@@ -28,6 +29,8 @@
 \usepackage{textcomp}
 \usepackage[nointegrals]{wasysym}
 \usepackage{alltt}
+\usepackage{import}
+\usepackage[titletoc]{appendix}
 \usepackage{ifpdf}
 \ifpdf
 \usepackage[pdftex,
@@ -53,6 +56,7 @@
 \usepackage[titles]{tocloft}
 \usepackage{amssymb}
 \usepackage{doxygen}
+\usepackage{manual}
 \newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}}
 \lstset{language=C++,inputencoding=utf8,basicstyle=\footnotesize,breaklines=true,breakatwhitespace=true,tabsize=8,numbers=left }
 \makeindex
 \newcommand{\thisyear}{\the\year}
 \hfuzz=15pt
 \setlength{\emergencystretch}{15pt}
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{0.2cm}
 \hbadness=750
 \tolerance=750
 \begin{document}
 \begin{titlepage}
 \includegraphics[width=\textwidth]{doxygen_logo}
 \begin{center}
-Manual for version $VERSION\\[2ex]
+Manual for version @VERSION@\\[2ex]
 Written by Dimitri van Heesch\\[2ex]
 \copyright 1997-\thisyear
 \end{center}
@@ -90,6 +96,7 @@ Written by Dimitri van Heesch\\[2ex]
 \chapter{Lists}\label{lists}\hypertarget{lists}{}\input{lists}
 \chapter{Grouping}\label{grouping}\hypertarget{grouping}{}\input{grouping}
 \chapter{Including Formulas}\label{formulas}\hypertarget{formulas}{}\input{formulas}
+\chapter{Including Tables}\label{tables}\hypertarget{tables}{}\input{tables}
 \chapter{Graphs and diagrams}\label{diagrams}\hypertarget{diagrams}{}\input{diagrams}
 \chapter{Preprocessing}\label{preprocessing}\hypertarget{preprocessing}{}\input{preprocessing}
 \chapter{Automatic link generation}\label{autolink}\hypertarget{autolink}{}\input{autolink}
@@ -112,5 +119,69 @@ Written by Dimitri van Heesch\\[2ex]
 \chapter{Doxygen's internals}\label{arch}\hypertarget{arch}{}\input{arch}
 \chapter{Perl Module Output format}\label{perlmod}\hypertarget{perlmod}{}\input{perlmod}
 \chapter{Internationalization}\label{langhowto}\hypertarget{langhowto}{}\input{langhowto}
+\renewcommand{\thepart}{}
+\part{Appendices}
+\appendix
+%mean that subinputfrom requires a / at the end of the path
+\chapter{Autolink Example}\label{autolink_example}\hypertarget{autolink_example}{}
+\subinputfrom{../html/examples/autolink/latex/}{refman_doc}
+\chapter{Resolving Typedef Example}\label{restypedef_example}\hypertarget{restypedef_example}{}
+\subinputfrom{../html/examples/restypedef/latex/}{refman_doc}
+
+\IfFileExists{../html/examples/diagrams/latex/refman_doc.tex}
+{
+  \chapter{Diagrams Example}\label{diagrams_example}\hypertarget{diagrams_example}{}
+  \subinputfrom{../html/examples/diagrams/latex/}{refman_doc}
+}{}
+
+\chapter{Modules Example}\label{modules_example}\hypertarget{modules_example}{}
+\subinputfrom{../html/examples/group/latex/}{refman_doc}
+\chapter{Member Groups Example}\label{memgrp_example}\hypertarget{memgrp_example}{}
+\subinputfrom{../html/examples/memgrp/latex/}{refman_doc}
+\chapter{After Block Example}\label{afterdoc_example}\hypertarget{afterdoc_example}{}
+\subinputfrom{../html/examples/afterdoc/latex/}{refman_doc}
+\chapter{QT Style Example}\label{qtstyle_example}\hypertarget{qtstyle_example}{}
+\subinputfrom{../html/examples/qtstyle/latex/}{refman_doc}
+\chapter{Javadoc Style Example}\label{jdstyle_example}\hypertarget{jdstyle_example}{}
+\subinputfrom{../html/examples/jdstyle/latex/}{refman_doc}
+\chapter{Structural Commands Example}\label{structcmd_example}\hypertarget{structcmd_example}{}
+\subinputfrom{../html/examples/structcmd/latex/}{refman_doc}
+\chapter{Python Docstring Example}\label{python_example}\hypertarget{python_example}{}
+\subinputfrom{../html/examples/docstring/latex/}{refman_doc}
+\chapter{Python Example}\label{py_example}\hypertarget{py_example}{}
+\subinputfrom{../html/examples/pyexample/latex/}{refman_doc}
+\chapter{VHDL Example}\label{vhdl_example}\hypertarget{vhdl_example}{}
+\subinputfrom{../html/examples/mux/latex/}{refman_doc}
+\chapter{Tcl Example}\label{tcl_example}\hypertarget{tcl_example}{}
+\subinputfrom{../html/examples/tclexample/latex/}{refman_doc}
+
+\chapter{Class Example}\label{class_example}\hypertarget{class_example}{}
+\subinputfrom{../html/examples/class/latex/}{refman_doc}
+\chapter{Define Example}\label{define_example}\hypertarget{define_example}{}
+\subinputfrom{../html/examples/define/latex/}{refman_doc}
+\chapter{Enum Example}\label{enum_example}\hypertarget{enum_example}{}
+\subinputfrom{../html/examples/enum/latex/}{refman_doc}
+\chapter{Example Example}\label{example_example}\hypertarget{example_example}{}
+\subinputfrom{../html/examples/example/latex/}{refman_doc}
+\chapter{Extends/Implements Example}\label{extends_example}\hypertarget{extends_example}{}
+\subinputfrom{../html/examples/manual/latex/}{refman_doc}
+\chapter{File Example}\label{file_example}\hypertarget{file_example}{}
+\subinputfrom{../html/examples/file/latex/}{refman_doc}
+\chapter{Fn Example}\label{fn_example}\hypertarget{fn_example}{}
+\subinputfrom{../html/examples/func/latex/}{refman_doc}
+\chapter{Overload Example}\label{overload_example}\hypertarget{overload_example}{}
+\subinputfrom{../html/examples/overload/latex/}{refman_doc}
+\chapter{Page Example}\label{page_example}\hypertarget{page_example}{}
+\subinputfrom{../html/examples/page/latex/}{refman_doc}
+\chapter{Relates Example}\label{relates_example}\hypertarget{relates_example}{}
+\subinputfrom{../html/examples/relates/latex/}{refman_doc}
+\chapter{Author Example}\label{author_example}\hypertarget{author_example}{}
+\subinputfrom{../html/examples/author/latex/}{refman_doc}
+\chapter{Par Example}\label{par_example}\hypertarget{par_example}{}
+\subinputfrom{../html/examples/par/latex/}{refman_doc}
+\chapter{Include Example}\label{include_example}\hypertarget{include_example}{}
+\subinputfrom{../html/examples/include/latex/}{refman_doc}
+
+
 \printindex
 \end{document}
index 7b7a298..ae4b282 100644 (file)
@@ -1,4 +1,4 @@
-.TH DOXYINDEXER "1" "DATE" "doxyindexer VERSION" "User Commands"
+.TH DOXYINDEXER "1" "@DATE@" "doxyindexer @VERSION@" "User Commands"
 .SH NAME
 doxyindexer \- creates a search index from raw search data
 .SH SYNOPSIS
index da9ae05..a00124f 100644 (file)
@@ -1,4 +1,4 @@
-.TH DOXYSEARCH "1" "DATE" "doxysearch.cgi VERSION" "User Commands"
+.TH DOXYSEARCH "1" "@DATE@" "doxysearch.cgi @VERSION@" "User Commands"
 .SH NAME
 doxysearch.cgi \- search engine used for searching in doxygen documentation.
 .SH SYNOPSIS
index e3f23c0..9f57701 100644 (file)
@@ -1,4 +1,4 @@
-.TH DOXYWIZARD "1" "DATE" "doxywizard VERSION" "User Commands"
+.TH DOXYWIZARD "1" "@DATE@" "doxywizard @VERSION@" "User Commands"
 .SH NAME
 doxywizard \- a tool to configure and run doxygen on your source files
 .SH SYNOPSIS
index 937ff86..650751e 100644 (file)
@@ -105,7 +105,7 @@ file <code>formula.repository</code> that is written to the html directory to
 get rid of an incorrect formula.
 
 \htmlonly
-Go to the <a href="diagrams.html">next</a> section or return to the
+Go to the <a href="tables.html">next</a> section or return to the
  <a href="index.html">index</a>.
 \endhtmlonly
 
index 2e11e7e..64102e1 100644 (file)
@@ -135,12 +135,17 @@ files to define the hierarchy and \ref cmdweakgroup "\\weakgroup"
 in .c files without having to duplicate the hierarchy exactly.
 
 \par Example:
-\verbinclude group.cpp
+\include group.cpp
 
 \htmlonly
-Click <a href="$(DOXYGEN_DOCDIR)/examples/group/html/modules.html">here</a> 
+</p>
+Click <a href="examples/group/html/modules.html">here</a> 
 for the corresponding HTML documentation that is generated by Doxygen.
 \endhtmlonly
+\latexonly
+See \hyperlink{modules_example}{Modules example}
+for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+\endlatexonly
 
 \section memgroup Member Groups
 
@@ -188,12 +193,17 @@ you should put a \ref cmdnosubgrouping "\\nosubgrouping" command inside the
 documentation of the class. 
 
 \par Example:
-\verbinclude memgrp.cpp
+\include memgrp.cpp
 
 \htmlonly
-Click <a href="$(DOXYGEN_DOCDIR)/examples/memgrp/html/class_test.html">here</a> 
+</p>
+Click <a href="examples/memgrp/html/class_test.html">here</a> 
 for the corresponding HTML documentation that is generated by Doxygen.
 \endhtmlonly
+\latexonly
+See \hyperlink{memgrp_example}{Member Groups example}
+for the corresponding \mbox{\LaTeX} documentation that is generated by doxygen.
+\endlatexonly
 
 Here Group1 is displayed as a subsection of the "Public Members". And
 Group2 is a separate section because it contains members with
@@ -216,8 +226,10 @@ two groups GA and GB, where GB is part of GA, page A is put in group GA,
 and page B is put in group GB.
 
 \htmlonly
+</p>
 Go to the <a href="formulas.html">next</a> section or return to the
  <a href="index.html">index</a>.
+<p>
 \endhtmlonly
 
 */
index 30afcd5..2c11a17 100644 (file)
@@ -81,7 +81,7 @@ TranslatorIndonesian
 Hendy Irawan: ceefour at gauldong dot net
 
 TranslatorItalian
-Alessandro Falappa: alessandro at falappa dot net
+Alessandro Falappa: alex dot falappa at gmail dot com
 Ahmed Aldo Faisal: aaf23 at cam dot ac dot uk
 
 TranslatorJapanese
diff --git a/doc/manual.sty b/doc/manual.sty
new file mode 100644 (file)
index 0000000..80fbda6
--- /dev/null
@@ -0,0 +1,33 @@
+% Use helvetica font instead of times roman
+\RequirePackage{helvet}
+\RequirePackage{sectsty}
+\RequirePackage{tocloft}
+\providecommand{\rmdefault}{phv}
+\providecommand{\bfdefault}{bc}
+\usepackage[T1]{fontenc}
+
+% Setup fancy headings
+\RequirePackage{fancyhdr}
+\pagestyle{fancyplain}
+\newcommand{\clearemptydoublepage}{%
+  \newpage{\pagestyle{empty}\cleardoublepage}%
+}
+\renewcommand{\chaptermark}[1]{%
+  \markboth{#1}{}%
+}
+\renewcommand{\sectionmark}[1]{%
+  \markright{\thesection\ #1}%
+}
+\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}}
+\fancyhead[CE]{\fancyplain{}{}}
+\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}}
+\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}}
+\fancyhead[CO]{\fancyplain{}{}}
+\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}}
+\fancyfoot[LE]{\fancyplain{}{}}
+\fancyfoot[CE]{\fancyplain{}{}}
+\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen @VERSION@ }}
+\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen @VERSION@ }}
+\fancyfoot[CO]{\fancyplain{}{}}
+\fancyfoot[RO]{\fancyplain{}{}}
+
index 87af3d8..cec2191 100644 (file)
@@ -337,6 +337,8 @@ which will look as follows:
 | 10    | 10     | 10    |
 | 1000  | 1000   | 1000  |
 
+For more complex tables in doxygen please have a look at: \ref tables
+
 \subsection md_fenced Fenced Code Blocks
 
 Another feature defined by "Markdown Extra" is support for
@@ -437,7 +439,7 @@ details).
 By default the name and title of the page are derived from the file name.
 If the file starts with a level 1 header however, it is used as the title
 of the page. If you specify a label for the 
-header (as shown \ref md_header_id "here") doxygen will use that as the
+header (as shown in \ref md_header_id) doxygen will use that as the
 page name. 
 
 If the label is called `index` or `mainpage` doxygen will put the
diff --git a/doc/tables.doc b/doc/tables.doc
new file mode 100644 (file)
index 0000000..5dc166d
--- /dev/null
@@ -0,0 +1,95 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2015 by Dimitri van 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 tables Including tables
+
+Doxygen supports two ways to put tables in the documentation.
+
+The easiest is to use the Markdown format as shown in @ref markdown_extra section @ref md_tables.
+
+Although this format is easy to use and read, it is also rather limited.
+It supports only a simple grid of cells, while each cell is a
+single line of plain text.
+
+For more complex tables the HTML syntax can be used. Doxygen
+will process such tables and translate them to the various output formats
+(at least for the formats that do support tables such as HTML and \LaTeX).
+
+Here is an example of a complex table:
+
+\verbatim
+<table>
+<caption id="multi_row">Complex table</caption>
+<tr><th>Column 1                      <th>Column 2        <th>Column 3
+<tr><td rowspan="2">cell row=1+2,col=1<td>cell row=1,col=2<td>cell row=1,col=3
+<tr><td rowspan="2">cell row=2+3,col=2                    <td>cell row=2,col=3
+<tr><td>cell row=3,col=1                                  <td rowspan="2">cell row=3+4,col=3
+<tr><td colspan="2">cell row=4,col=1+2
+<tr><td>cell row=5,col=1              <td colspan="2">cell row=5,col=2+3
+<tr><td colspan="2" rowspan="2">cell row=6+7,col=1+2      <td>cell row=6,col=3
+<tr>                                                      <td>cell row=7,col=3
+<tr><td>cell row=8,col=1              <td>cell row=8,col=2\n
+  <table>
+    <tr><td>Inner cell row=1,col=1<td>Inner cell row=1,col=2
+    <tr><td>Inner cell row=2,col=1<td>Inner cell row=2,col=2
+  </table>
+  <td>cell row=8,col=3
+  <ul>
+    <li>Item 1
+    <li>Item 2
+  </ul>
+</table>
+\endverbatim
+
+It has a caption, table heading, various row and column spans,
+a nested table as one of the cells, and a item list in another cell.
+
+Note that the end tags (like `</td>`) are left out in the example above.
+This is allowed, and in the HTML output doxygen will add the end tags again.
+
+The output will look as follows:
+
+<table>
+<caption id="multi_row">Complex table</caption>
+<tr><th>Column 1                      <th>Column 2        <th>Column 3
+<tr><td rowspan="2">cell row=1+2,col=1<td>cell row=1,col=2<td>cell row=1,col=3
+<tr><td rowspan="2">cell row=2+3,col=2                    <td>cell row=2,col=3
+<tr><td>cell row=3,col=1                                  <td rowspan="2">cell row=3+4,col=3
+<tr><td colspan="2">cell row=4,col=1+2
+<tr><td>cell row=5,col=1              <td colspan="2">cell row=5,col=2+3
+<tr><td colspan="2" rowspan="2">cell row=6+7,col=1+2      <td>cell row=6,col=3
+<tr>                                                      <td>cell row=7,col=3
+<tr><td>cell row=8,col=1              <td>cell row=8,col=2\n
+  <table>
+    <tr><td>Inner cell row=1,col=1<td>Inner cell row=1,col=2
+    <tr><td>Inner cell row=2,col=1<td>Inner cell row=2,col=2
+  </table>
+  <td>cell row=8,col=3
+  <ul>
+    <li>Item 1
+    <li>Item 2
+  </ul>
+</table>
+
+One can refer to the caption of the table using \ref cmdref "\\ref" using the caption's
+id as the label.
+
+\htmlonly
+Go to the <a href="diagrams.html">next</a> section or return to the
+ <a href="index.html">index</a>.
+\endhtmlonly
+
+*/
index 69e7de8..1d470b4 100644 (file)
@@ -1814,6 +1814,7 @@ class TrManager:
         # Define templates for HTML table parts of the documentation.\r
         htmlTableTpl = '''\\r
             \\htmlonly\r
+                       </p>\r
             <table align="center" cellspacing="0" cellpadding="0" border="0">\r
             <tr bgcolor="#000000">\r
             <td>\r
@@ -1832,6 +1833,7 @@ class TrManager:
             </td>\r
             </tr>\r
             </table>\r
+                       <p>\r
             \\endhtmlonly\r
             '''\r
         htmlTableTpl = textwrap.dedent(htmlTableTpl)\r
index d689eda..24bcbfa 100644 (file)
@@ -2,22 +2,24 @@ if (build_doc)
 
 file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/examples)
 file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/html/examples)
-file(GLOB EXAMPLE_FILES "*")
+file(GLOB EXAMPLE_FILES RELATIVE ${CMAKE_SOURCE_DIR}/examples "*")
 
 if (DOT)
   set(DIAGRAM_EXAMPLE ${PROJECT_BINARY_DIR}/html/examples/diagrams/html/index.html)
 endif()
 
-# copy all example files
-add_custom_target(copy_examples)
-foreach(example_file ${EXAMPLE_FILES})
-  add_custom_command(TARGET copy_examples PRE_BUILD
-                     COMMAND ${CMAKE_COMMAND} -E
-                         copy ${example_file} ${PROJECT_BINARY_DIR}/examples)
+foreach (f  ${EXAMPLE_FILES})
+    add_custom_command(
+        COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/examples/${f}" "${PROJECT_BINARY_DIR}/examples/"
+        DEPENDS "${CMAKE_SOURCE_DIR}/examples/${f}"
+        OUTPUT "${PROJECT_BINARY_DIR}/examples/${f}"
+    )
+    set_source_files_properties("${PROJECT_BINARY_DIR}/examples/${f}" PROPERTIES GENERATED 1)
+    list(APPEND OUT_EXAMPLE_FILES "${PROJECT_BINARY_DIR}/examples/${f}")
 endforeach()
 
 add_custom_target(examples
-       DEPENDS doxygen copy_examples
+  DEPENDS ${OUT_EXAMPLE_FILES}
                 ${PROJECT_BINARY_DIR}/html/examples/class/html/index.html
                 ${PROJECT_BINARY_DIR}/html/examples/define/html/index.html
                 ${PROJECT_BINARY_DIR}/html/examples/enum/html/index.html
@@ -51,171 +53,197 @@ add_custom_target(examples
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen class.cfg
-       DEPENDS doxygen class.h class.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/class/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/class/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/class/latex/refman_doc.tex
+       DEPENDS doxygen class.h class.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/class/html/index.html ${PROJECT_BINARY_DIR}/html/examples/class/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen define.cfg
-       DEPENDS doxygen define.h define.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/define/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/define/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/define/latex/refman_doc.tex
+       DEPENDS doxygen define.h define.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/define/html/index.html ${PROJECT_BINARY_DIR}/html/examples/define/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen enum.cfg
-       DEPENDS doxygen enum.h enum.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/enum/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/enum/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/enum/latex/refman_doc.tex
+       DEPENDS doxygen enum.h enum.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/enum/html/index.html ${PROJECT_BINARY_DIR}/html/examples/enum/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen file.cfg
-       DEPENDS doxygen file.h file.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/file/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/file/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/file/latex/refman_doc.tex
+       DEPENDS doxygen file.h file.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/file/html/index.html ${PROJECT_BINARY_DIR}/html/examples/file/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen func.cfg
-       DEPENDS doxygen func.h func.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/func/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/func/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/func/latex/refman_doc.tex
+       DEPENDS doxygen func.h func.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/func/html/index.html ${PROJECT_BINARY_DIR}/html/examples/func/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen page.cfg
-       DEPENDS doxygen page.doc page.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/page/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/page/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/page/latex/refman_doc.tex
+       DEPENDS doxygen page.doc page.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/page/html/index.html ${PROJECT_BINARY_DIR}/html/examples/page/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen relates.cfg
-       DEPENDS doxygen relates.cpp relates.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/relates/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/relates/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/relates/latex/refman_doc.tex
+       DEPENDS doxygen relates.cpp relates.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/relates/html/index.html ${PROJECT_BINARY_DIR}/html/examples/relates/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen author.cfg
-       DEPENDS doxygen author.cpp author.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/author/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/author/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/author/latex/refman_doc.tex
+       DEPENDS doxygen author.cpp author.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/author/html/index.html ${PROJECT_BINARY_DIR}/html/examples/author/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen par.cfg
-       DEPENDS doxygen par.cpp par.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/par/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/par/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/par/latex/refman_doc.tex
+       DEPENDS doxygen par.cpp par.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/par/html/index.html ${PROJECT_BINARY_DIR}/html/examples/par/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen overload.cfg
-       DEPENDS doxygen overload.cpp overload.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/overload/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/overload/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/overload/latex/refman_doc.tex
+       DEPENDS doxygen overload.cpp overload.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/overload/html/index.html ${PROJECT_BINARY_DIR}/html/examples/overload/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen example.cfg
-       DEPENDS doxygen example.cpp example_test.cpp example.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/example/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/example/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/example/latex/refman_doc.tex
+       DEPENDS doxygen example.cpp example_test.cpp example.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/example/html/index.html ${PROJECT_BINARY_DIR}/html/examples/example/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen include.cfg
-       DEPENDS doxygen include.cpp example_test.cpp include.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/include/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/include/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/include/latex/refman_doc.tex
+       DEPENDS doxygen include.cpp include_test.cpp include.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/include/html/index.html ${PROJECT_BINARY_DIR}/html/examples/include/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen qtstyle.cfg
-       DEPENDS doxygen qtstyle.cpp qtstyle.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/qtstyle/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/qtstyle/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/qtstyle/latex/refman_doc.tex
+       DEPENDS doxygen qtstyle.cpp qtstyle.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/qtstyle/html/index.html ${PROJECT_BINARY_DIR}/html/examples/qtstyle/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen jdstyle.cfg
-       DEPENDS doxygen jdstyle.cpp jdstyle.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/jdstyle/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/jdstyle/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/jdstyle/latex/refman_doc.tex
+       DEPENDS doxygen jdstyle.cpp jdstyle.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/jdstyle/html/index.html ${PROJECT_BINARY_DIR}/html/examples/jdstyle/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen structcmd.cfg
-       DEPENDS doxygen structcmd.h structcmd.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/structcmd/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/structcmd/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/structcmd/latex/refman_doc.tex
+       DEPENDS doxygen structcmd.h structcmd.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/structcmd/html/index.html ${PROJECT_BINARY_DIR}/html/examples/structcmd/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen autolink.cfg
-       DEPENDS doxygen autolink.cpp autolink.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/autolink/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/autolink/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/autolink/latex/refman_doc.tex
+       DEPENDS doxygen autolink.cpp autolink.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/autolink/html/index.html ${PROJECT_BINARY_DIR}/html/examples/autolink/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen tag.cfg
-       DEPENDS doxygen tag.cpp tag.cfg ${PROJECT_BINARY_DIR}/html/examples/example/html/index.html
+       DEPENDS doxygen tag.cpp tag.cfg ${PROJECT_BINARY_DIR}/html/examples/example/html/index.html ${TOP}/examples/strip_example.py
        OUTPUT ${PROJECT_BINARY_DIR}/html/examples/tag/html/index.html
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen restypedef.cfg
-       DEPENDS doxygen restypedef.cpp restypedef.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/restypedef/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/restypedef/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/restypedef/latex/refman_doc.tex
+       DEPENDS doxygen restypedef.cpp restypedef.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/restypedef/html/index.html ${PROJECT_BINARY_DIR}/html/examples/restypedef/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen afterdoc.cfg
-       DEPENDS doxygen afterdoc.h afterdoc.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/afterdoc/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/afterdoc/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/afterdoc/latex/refman_doc.tex
+       DEPENDS doxygen afterdoc.h afterdoc.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/afterdoc/html/index.html ${PROJECT_BINARY_DIR}/html/examples/afterdoc/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen templ.cfg
-       DEPENDS doxygen templ.cpp templ.cfg
+       DEPENDS doxygen templ.cpp templ.cfg ${TOP}/examples/strip_example.py
        OUTPUT ${PROJECT_BINARY_DIR}/html/examples/template/html/index.html
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen group.cfg
-       DEPENDS doxygen group.cpp group.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/group/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/group/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/group/latex/refman_doc.tex
+       DEPENDS doxygen group.cpp group.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/group/html/index.html ${PROJECT_BINARY_DIR}/html/examples/group/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen memgrp.cfg
-       DEPENDS doxygen memgrp.cpp memgrp.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/memgrp/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/memgrp/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/memgrp/latex/refman_doc.tex
+       DEPENDS doxygen memgrp.cpp memgrp.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/memgrp/html/index.html ${PROJECT_BINARY_DIR}/html/examples/memgrp/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen pyexample.cfg
-       DEPENDS doxygen pyexample.py pyexample.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/pyexample/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/pyexample/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/pyexample/latex/refman_doc.tex
+       DEPENDS doxygen pyexample.py pyexample.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/pyexample/html/index.html ${PROJECT_BINARY_DIR}/html/examples/pyexample/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen tclexample.cfg
-       DEPENDS doxygen tclexample.tcl tclexample.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/tclexample/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/tclexample/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/tclexample/latex/refman_doc.tex
+       DEPENDS doxygen tclexample.tcl tclexample.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/tclexample/html/index.html ${PROJECT_BINARY_DIR}/html/examples/tclexample/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen mux.cfg
-       DEPENDS doxygen mux.vhdl mux.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/mux/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/mux/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/mux/latex/refman_doc.tex
+       DEPENDS doxygen mux.vhdl mux.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/mux/html/index.html ${PROJECT_BINARY_DIR}/html/examples/mux/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen manual.cfg
-       DEPENDS doxygen manual.c manual.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/manual/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/manual/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/manual/latex/refman_doc.tex
+       DEPENDS doxygen manual.c manual.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/manual/html/index.html ${PROJECT_BINARY_DIR}/html/examples/manual/latex/refman_doc.tex
 )
 
 add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen docstring.cfg
-       DEPENDS doxygen docstring.py docstring.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/docstring/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/docstring/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/docstring/latex/refman_doc.tex
+       DEPENDS doxygen docstring.py docstring.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/docstring/html/index.html ${PROJECT_BINARY_DIR}/html/examples/docstring/latex/refman_doc.tex
 )
 
 if (DOT)
   add_custom_command(
        COMMAND ${EXECUTABLE_OUTPUT_PATH}/doxygen diagrams.cfg
-       DEPENDS doxygen diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg
-       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/diagrams/html/index.html
+        COMMAND ${PYTHON_EXECUTABLE}  ${TOP}/examples/strip_example.py  < ${PROJECT_BINARY_DIR}/html/examples/diagrams/latex/refman.tex > ${PROJECT_BINARY_DIR}/html/examples/diagrams/latex/refman_doc.tex
+       DEPENDS doxygen diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg ${TOP}/examples/strip_example.py
+       OUTPUT ${PROJECT_BINARY_DIR}/html/examples/diagrams/html/index.html ${PROJECT_BINARY_DIR}/html/examples/diagrams/latex/refman_doc.tex
   )
 endif(DOT)
 
index 37bb12d..0542929 100644 (file)
@@ -1,10 +1,13 @@
 PROJECT_NAME      = "AfterDocs"
 OUTPUT_DIRECTORY  = ../html/examples/afterdoc
-GENERATE_LATEX    = NO
+GENERATE_LATEX    = YES
 GENERATE_MAN      = NO
 GENERATE_RTF      = NO
 CASE_SENSE_NAMES  = NO
 INPUT             = afterdoc.h
+STRIP_CODE_COMMENTS = NO
 QUIET             = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE      = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 907dabe..b3200a8 100644 (file)
@@ -1,6 +1,6 @@
 /*! A test class */
 
-class Test
+class Afterdoc_Test
 {
   public:
     /** An enum type. 
index c7b942c..2fafbfe 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME     = "Author Command"
 OUTPUT_DIRECTORY = ../html/examples/author
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
@@ -8,3 +8,5 @@ INPUT            = author.cpp
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 287b37d..68e5192 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME     = "Automatic link generation"
 OUTPUT_DIRECTORY = ../html/examples/autolink
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
@@ -8,3 +8,5 @@ INPUT            = autolink.cpp
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index e028f22..71a3c85 100644 (file)
@@ -1,33 +1,33 @@
 /*! \file autolink.cpp
   Testing automatic link generation.
   
-  A link to a member of the Test class: Test::member, 
+  A link to a member of the Autolink_Test class: Autolink_Test::member, 
   
   More specific links to the each of the overloaded members:
-  Test::member(int) and Test#member(int,int)
+  Autolink_Test::member(int) and Autolink_Test#member(int,int)
 
-  A link to a protected member variable of Test: Test#var, 
+  A link to a protected member variable of Autolink_Test: Autolink_Test#var, 
 
   A link to the global enumeration type #GlobEnum.
  
   A link to the define #ABS(x).
   
-  A link to the destructor of the Test class: Test::~Test, 
+  A link to the destructor of the Autolink_Test class: Autolink_Test::~Autolink_Test, 
   
   A link to the typedef ::B.
  
-  A link to the enumeration type Test::EType
+  A link to the enumeration type Autolink_Test::EType
   
-  A link to some enumeration values Test::Val1 and ::GVal2
+  A link to some enumeration values Autolink_Test::Val1 and ::GVal2
 */
 
 /*!
-  Since this documentation block belongs to the class Test no link to 
-  Test is generated.
+  Since this documentation block belongs to the class Autolink_Test no link to 
+  Autolink_Test is generated.
 
-  Two ways to link to a constructor are: #Test and Test().
+  Two ways to link to a constructor are: #Autolink_Test and Autolink_Test().
 
-  Links to the destructor are: #~Test and ~Test().
+  Links to the destructor are: #~Autolink_Test and ~Autolink_Test().
   
   A link to a member in this class: member().
 
   
   A link to the enumeration type #EType.
 
-  A link to some enumeration values: \link Test::Val1 Val1 \endlink and ::GVal1.
+  A link to some enumeration values: \link Autolink_Test::Val1 Val1 \endlink and ::GVal1.
 
   And last but not least a link to a file: autolink.cpp.
   
   \sa Inside a see also section any word is checked, so EType, 
-      Val1, GVal1, ~Test and member will be replaced by links in HTML.
+      Val1, GVal1, ~Autolink_Test and member will be replaced by links in HTML.
 */
 
-class Test
+class Autolink_Test
 {
   public:
-    Test();               //!< constructor 
-   ~Test();               //!< destructor 
+    Autolink_Test();               //!< constructor 
+   ~Autolink_Test();               //!< destructor 
     void member(int);     /**< A member function. Details. */
     void member(int,int); /**< An overloaded member function. Details */
 
@@ -73,10 +73,10 @@ class Test
 };
 
 /*! details. */
-Test::Test() { }
+Autolink_Test::Autolink_Test() { }
 
 /*! details. */
-Test::~Test() { }
+Autolink_Test::~Autolink_Test() { }
 
 /*! A global variable. */
 int globVar;
@@ -92,8 +92,8 @@ enum GlobEnum {
  */ 
 #define ABS(x) (((x)>0)?(x):-(x))
 
-typedef Test B;
+typedef Autolink_Test B;
 
-/*! \fn typedef Test B
+/*! \fn typedef Autolink_Test B
  *  A type definition. 
  */
index 579cc75..5d75373 100644 (file)
@@ -1,10 +1,13 @@
 PROJECT_NAME     = "Class Command"
 OUTPUT_DIRECTORY = ../html/examples/class
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
 INPUT            = class.h
+STRIP_CODE_COMMENTS = NO
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 7b70772..d964ea2 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME      = "DBusXMLDocs"
 OUTPUT_DIRECTORY  = ../html/examples/dbusxml
-GENERATE_LATEX    = NO
+GENERATE_LATEX    = YES
 GENERATE_MAN      = NO
 GENERATE_RTF      = NO
 CASE_SENSE_NAMES  = NO
@@ -10,3 +10,5 @@ JAVADOC_AUTOBRIEF = YES
 EXTRACT_ALL       = YES
 SEARCHENGINE      = NO
 EXTENSION_MAPPING = xml=dbusxml
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 8a12da8..61c0f52 100644 (file)
@@ -1,11 +1,14 @@
 PROJECT_NAME     = "Define Command"
 OUTPUT_DIRECTORY = ../html/examples/define
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
 INPUT            = define.h
+STRIP_CODE_COMMENTS = NO
 ENABLE_PREPROCESSING = YES
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 5301786..c2e637d 100644 (file)
@@ -2,13 +2,16 @@ PROJECT_NAME       = "Diagrams"
 OUTPUT_DIRECTORY   = ../html/examples/diagrams
 HAVE_DOT           = YES
 EXTRACT_ALL        = YES
-GENERATE_LATEX     = NO
+GENERATE_LATEX     = YES
 GENERATE_MAN       = NO
 GENERATE_RTF       = NO
 CASE_SENSE_NAMES = NO
 ENABLE_PREPROCESSING       = YES
 INPUT              = .
+STRIP_CODE_COMMENTS = NO
 FILE_PATTERNS      = diagrams_*.h
 QUIET              = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index bd65500..60b089e 100644 (file)
@@ -1,7 +1,7 @@
 PROJECT_NAME     = "Python"
 OUTPUT_DIRECTORY = ../html/examples/docstring
 EXTRACT_ALL      = YES
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 OPTIMIZE_OUTPUT_JAVA = YES
@@ -9,3 +9,5 @@ INPUT            = docstring.py
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 7732be8..e5540bd 100644 (file)
@@ -1,10 +1,13 @@
 PROJECT_NAME     = "Enum Command"
 OUTPUT_DIRECTORY = ../html/examples/enum
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
 INPUT            = enum.h
+STRIP_CODE_COMMENTS = NO
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 4c54fab..ab7ffa6 100644 (file)
@@ -1,4 +1,4 @@
-class Test
+class Enum_Test
 {
   public:
     enum TEnum { Val1, Val2 };
@@ -11,14 +11,14 @@ class Test
     };
 };
 
-/*! \class Test
+/*! \class Enum_Test
  * The class description.
  */
 
-/*! \enum Test::TEnum
+/*! \enum Enum_Test::TEnum
  * A description of the enum type.
  */
 
-/*! \var Test::TEnum Test::Val1
+/*! \var Enum_Test::TEnum Enum_Test::Val1
  * The description of the first enum value.
  */
index f57e4ba..c55c6b9 100644 (file)
@@ -1,7 +1,7 @@
 PROJECT_NAME      = "Example Command"
 OUTPUT_DIRECTORY  = ../html/examples/example
 #GENERATE_TAGFILE  = example.tag
-GENERATE_LATEX    = NO
+GENERATE_LATEX    = YES
 GENERATE_MAN      = NO
 GENERATE_RTF      = NO
 CASE_SENSE_NAMES  = NO
@@ -10,3 +10,5 @@ EXAMPLE_PATH      = example_test.cpp
 QUIET             = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE      = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 230d6ec..657c266 100644 (file)
@@ -1,8 +1,8 @@
-/** A Test class.
+/** A Example_Test class.
  *  More details about this class.
  */
 
-class Test
+class Example_Test
 {
   public:
     /** An example member function.
@@ -11,9 +11,9 @@ class Test
     void example();
 };
 
-void Test::example() {}
+void Example_Test::example() {}
 
 /** \example example_test.cpp
- * This is an example of how to use the Test class.
+ * This is an example of how to use the Example_Test class.
  * More details about this example.
  */
index a7e1643..cefee43 100644 (file)
@@ -1,5 +1,5 @@
 void main()
 {
-  Test t;
+  Example_Test t;
   t.example();
 }
index e622c1e..ef67ae6 100644 (file)
@@ -1,10 +1,13 @@
 PROJECT_NAME     = "File Command"
 OUTPUT_DIRECTORY = ../html/examples/file
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
 INPUT            = file.h
+STRIP_CODE_COMMENTS = NO
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 4929f66..2f455d9 100644 (file)
@@ -1,10 +1,13 @@
 PROJECT_NAME     = "Fn Command"
 OUTPUT_DIRECTORY = ../html/examples/func
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
 INPUT            = func.h
+STRIP_CODE_COMMENTS = NO
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index b335448..cc0ac38 100644 (file)
@@ -1,18 +1,18 @@
-class Test
+class Fn_Test
 {
   public:
     const char *member(char,int) throw(std::out_of_range);
 };
 
-const char *Test::member(char c,int n) throw(std::out_of_range) {}
+const char *Fn_Test::member(char c,int n) throw(std::out_of_range) {}
 
-/*! \class Test
- * \brief Test class.
+/*! \class Fn_Test
+ * \brief Fn_Test class.
  *
- * Details about Test.
+ * Details about Fn_Test.
  */
 
-/*! \fn const char *Test::member(char c,int n) 
+/*! \fn const char *Fn_Test::member(char c,int n) 
  *  \brief A member function.
  *  \param c a character.
  *  \param n an integer.
index 7882713..83911b8 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME     = "Grouping"
 OUTPUT_DIRECTORY = ../html/examples/group
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
@@ -8,3 +8,5 @@ INPUT            = group.cpp
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 4ecdf8f..abaecc6 100644 (file)
@@ -1,11 +1,13 @@
 PROJECT_NAME     = "Include Command"
 OUTPUT_DIRECTORY = ../html/examples/include
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
 INPUT            = include.cpp
-EXAMPLE_PATH     = example_test.cpp
+EXAMPLE_PATH     = include_test.cpp
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 674ad13..ba8c054 100644 (file)
@@ -1,7 +1,7 @@
 
 /*! A test class. */
 
-class Test
+class Include_Test
 {
   public:
     /// a member function
@@ -9,12 +9,12 @@ class Test
 };
 
 /*! \page example
- *  \dontinclude example_test.cpp
+ *  \dontinclude include_test.cpp
  *  Our main function starts like this:
  *  \skip main
  *  \until {
- *  First we create an object \c t of the Test class.
- *  \skipline Test
+ *  First we create an object \c t of the Include_Test class.
+ *  \skipline Include_Test
  *  Then we call the example member function 
  *  \line example
  *  After that our little test routine ends.
diff --git a/examples/include_test.cpp b/examples/include_test.cpp
new file mode 100644 (file)
index 0000000..df8634a
--- /dev/null
@@ -0,0 +1,5 @@
+void main()
+{
+  Include_Test t;
+  t.example();
+}
index 15eccee..0ddc0d9 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME      = "JavaDoc Style"
 OUTPUT_DIRECTORY  = ../html/examples/jdstyle
-GENERATE_LATEX    = NO
+GENERATE_LATEX    = YES
 GENERATE_MAN      = NO
 GENERATE_RTF      = NO
 CASE_SENSE_NAMES  = NO
@@ -8,3 +8,5 @@ INPUT             = jdstyle.cpp
 QUIET             = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE      = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index bd8b9a7..04885e4 100644 (file)
@@ -2,7 +2,7 @@
  *  A test class. A more elaborate class description.
  */
 
-class Test
+class Javadoc_Test
 {
   public:
 
@@ -23,20 +23,20 @@ class Test
        * A constructor.
        * A more elaborate description of the constructor.
        */
-      Test();
+      Javadoc_Test();
 
       /**
        * A destructor.
        * A more elaborate description of the destructor.
        */
-     ~Test();
+     ~Javadoc_Test();
     
       /**
        * a normal member taking two arguments and returning an integer value.
        * @param a an integer argument.
        * @param s a constant character pointer.
-       * @see Test()
-       * @see ~Test()
+       * @see Javadoc_Test()
+       * @see ~Javadoc_Test()
        * @see testMeToo()
        * @see publicVar()
        * @return The test results
index 75d1fc5..07040d9 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME           = "Manual inheritance and membership"
 OUTPUT_DIRECTORY       = ../html/examples/manual
-GENERATE_LATEX         = NO
+GENERATE_LATEX         = YES
 GENERATE_MAN           = NO
 GENERATE_RTF           = NO
 CASE_SENSE_NAMES       = NO
@@ -14,3 +14,5 @@ INLINE_SOURCES         = YES
 REFERENCED_BY_RELATION = YES
 REFERENCES_RELATION    = YES
 SEARCHENGINE           = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index dea742c..d609778 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME         = "Member Grouping"
 OUTPUT_DIRECTORY     = ../html/examples/memgrp
-GENERATE_LATEX       = NO
+GENERATE_LATEX       = YES
 GENERATE_MAN         = NO
 GENERATE_RTF         = NO
 CASE_SENSE_NAMES     = NO
@@ -9,3 +9,5 @@ QUIET                = YES
 DISTRIBUTE_GROUP_DOC = YES
 JAVADOC_AUTOBRIEF    = YES
 SEARCHENGINE         = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 77f03a4..9a24774 100644 (file)
@@ -1,5 +1,5 @@
 /** A class. Details */
-class Test
+class Memgrp_Test
 {
   public:
     //@{
@@ -15,17 +15,17 @@ class Test
     void func2InGroup2();
 };
 
-void Test::func1InGroup1() {}
-void Test::func2InGroup1() {}
+void Memgrp_Test::func1InGroup1() {}
+void Memgrp_Test::func2InGroup1() {}
 
 /** @name Group2
  *  Description of group 2. 
  */
 ///@{
 /** Function 2 in group 2. Details. */
-void Test::func2InGroup2() {}
+void Memgrp_Test::func2InGroup2() {}
 /** Function 1 in group 2. Details. */
-void Test::func1InGroup2() {}
+void Memgrp_Test::func1InGroup2() {}
 ///@}
 
 /*! \file 
index 11aa7ca..861f2f6 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME         = Mux
 OUTPUT_DIRECTORY     = ../html/examples/mux
-GENERATE_LATEX       = NO
+GENERATE_LATEX       = YES
 GENERATE_MAN         = NO
 GENERATE_RTF         = NO
 CASE_SENSE_NAMES     = NO
@@ -14,3 +14,5 @@ INHERIT_DOCS         = NO
 SEARCHENGINE         = NO
 ENABLE_PREPROCESSING = NO
 EXTRACT_PACKAGE      = YES
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 9677065..71ebcc5 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME     = "Overloaded Command"
 OUTPUT_DIRECTORY = ../html/examples/overload
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
@@ -9,3 +9,5 @@ INPUT            = overload.cpp
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 02bcced..7aeb1cb 100644 (file)
@@ -1,25 +1,25 @@
-class Test 
+class Overload_Test 
 {
   public:
     void drawRect(int,int,int,int);
     void drawRect(const Rect &r);
 };
 
-void Test::drawRect(int x,int y,int w,int h) {}
-void Test::drawRect(const Rect &r) {}
+void Overload_Test::drawRect(int x,int y,int w,int h) {}
+void Overload_Test::drawRect(const Rect &r) {}
 
-/*! \class Test
+/*! \class Overload_Test
  *  \brief A short description.
  *   
  *  More text.
  */
 
-/*! \fn void Test::drawRect(int x,int y,int w,int h)
+/*! \fn void Overload_Test::drawRect(int x,int y,int w,int h)
  * This command draws a rectangle with a left upper corner at ( \a x , \a y ),
  * width \a w and height \a h. 
  */
 
 /*!
- * \overload void Test::drawRect(const Rect &r)
+ * \overload void Overload_Test::drawRect(const Rect &r)
  */
 
index 980cb17..972368a 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME     = "Page Command"
 OUTPUT_DIRECTORY = ../html/examples/page
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
@@ -8,3 +8,5 @@ INPUT            = page.doc
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 5be0e03..fe4be84 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME     = "Par Command"
 OUTPUT_DIRECTORY = ../html/examples/par
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
@@ -8,3 +8,5 @@ INPUT            = par.cpp
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 6fd2c4e..cae55d7 100644 (file)
@@ -1,4 +1,4 @@
-/*! \class Test
+/*! \class Par_Test
  * Normal text.
  *
  * \par User defined paragraph:
@@ -17,4 +17,4 @@
  * More normal text. 
  */
   
-class Test {};
+class Par_Test {};
index 9b44984..4569425 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME     = "Python"
 OUTPUT_DIRECTORY = ../html/examples/pyexample
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 OPTIMIZE_OUTPUT_JAVA = YES
@@ -8,3 +8,5 @@ INPUT            = pyexample.py
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index beae9e4..1516c7e 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME     = "Qt Style"
 OUTPUT_DIRECTORY = ../html/examples/qtstyle
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
@@ -8,3 +8,5 @@ INPUT            = qtstyle.cpp
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index e24d541..8b55c8d 100644 (file)
@@ -3,7 +3,7 @@
   A more elaborate class description.
 */
 
-class Test
+class QTstyle_Test
 {
   public:
 
@@ -25,20 +25,20 @@ class Test
     /*!
       A more elaborate description of the constructor.
     */
-    Test();
+    QTstyle_Test();
 
     //! A destructor.
     /*!
       A more elaborate description of the destructor.
     */
-   ~Test();
+   ~QTstyle_Test();
     
     //! A normal member taking two arguments and returning an integer value.
     /*!
       \param a an integer argument.
       \param s a constant character pointer.
       \return The test results
-      \sa Test(), ~Test(), testMeToo() and publicVar()
+      \sa QTstyle_Test(), ~QTstyle_Test(), testMeToo() and publicVar()
     */
     int testMe(int a,const char *s);
        
index 9155a7e..89f46da 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME     = "Relates Command"
 OUTPUT_DIRECTORY = ../html/examples/relates
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
@@ -8,3 +8,5 @@ INPUT            = relates.cpp
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 6282a64..63d2ea5 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME     = "Resolving Typedefs"
 OUTPUT_DIRECTORY = ../html/examples/restypedef
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
@@ -8,3 +8,5 @@ INPUT            = restypedef.cpp
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
diff --git a/examples/strip_example.py b/examples/strip_example.py
new file mode 100644 (file)
index 0000000..d88b893
--- /dev/null
@@ -0,0 +1,9 @@
+import sys
+do_print = False
+for line in sys.stdin:
+    if line.startswith("%--- Begin generated contents ---"):
+       do_print = True
+    elif line.startswith("%--- End generated contents ---"):
+       do_print = False
+    elif do_print:
+       sys.stdout.write(line)
index d60cfcf..f926ddf 100644 (file)
@@ -1,10 +1,13 @@
 PROJECT_NAME     = "Structural commands"
 OUTPUT_DIRECTORY = ../html/examples/structcmd
-GENERATE_LATEX   = NO
+GENERATE_LATEX   = YES
 GENERATE_MAN     = NO
 GENERATE_RTF     = NO
 CASE_SENSE_NAMES = NO
 INPUT            = structcmd.h
+STRIP_CODE_COMMENTS = NO
 QUIET            = YES
 JAVADOC_AUTOBRIEF = YES
 SEARCHENGINE     = NO
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index e51f4fc..e151d14 100644 (file)
@@ -1,6 +1,6 @@
 PROJECT_NAME       = "Tcl"
 OUTPUT_DIRECTORY   = ../html/examples/tclexample
-GENERATE_LATEX     = NO
+GENERATE_LATEX     = YES
 GENERATE_MAN       = NO
 GENERATE_RTF       = NO
 CASE_SENSE_NAMES   = NO
@@ -10,3 +10,5 @@ JAVADOC_AUTOBRIEF  = YES
 SEARCHENGINE       = NO
 INLINE_SOURCES     = YES
 HIDE_UNDOC_MEMBERS = YES
+COMPACT_LATEX = YES
+LATEX_HIDE_INDICES     = YES
index 4d98d01..ae7e111 100644 (file)
@@ -1,3 +1,3 @@
-add_library(md5
+add_library(md5 STATIC
 md5.c
 )
diff --git a/packages/rpm/doxygen.spec.in b/packages/rpm/doxygen.spec.in
deleted file mode 100644 (file)
index f78322a..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-%define name doxygen
-
-# optionally pass --with-doxywizard to rpmbuild
-
-%define contentdir /var/www
-%define suexec_caller doxygen
-%define buildroot /var/tmp/%{name}-%{version}-%{revision}root
-
-Summary: A documentation system for C/C++.
-Name: doxygen
-Version: %{version}
-Release: %{revision}
-URL: http://www.stack.nl/~dimitri/doxygen/index.html
-Vendor: Dimitri van Heesch
-License: GNU General Public License
-Group: Development/Tools
-Source: %{name}-%{version}.src.tar.gz
-BuildRoot: %{buildroot}
-BuildRequires: libstdc++-devel >= 2.96, /usr/bin/perl, /usr/bin/latex, /usr/bin/dvips, /usr/bin/gs
-Requires: /sbin/chkconfig, /bin/mktemp, /bin/rm, /bin/mv, libstdc++ >= 2.96
-Provides: doxygen = %{mmn}
-
-%description
-Doxygen can generate an online class browser (in HTML) and/or a
-reference manual (in LaTeX) from a set of documented source files. The
-documentation is extracted directly from the sources. Doxygen can
-also be configured to extract the code structure from undocumented
-source files.
-
-%if %{?_with_doxywizard:1}%{!?_with_doxywizard:0}
-%package doxywizard
-Group: Development/Libraries
-Summary: GUI Interface for doxygen.
-Requires: doxygen = %{mmn}
-Requires: qt >= 3.3
-Provides: doxywizard = %{mmn}
-# Obsoletes:
-
-%description doxywizard
-Doxygen can generate an online class browser (in HTML) and/or a
-reference manual (in LaTeX) from a set of documented source files. The
-documentation is extracted directly from the sources. Doxygen can
-also be configured to extract the code structure from undocumented
-source files.
-
-This is the GUI interface for doxygen.  It requires qt and X11 to
-install.
-%endif
-
-%if %{?_with_doxysearch:1}%{!?_with_doxysearch:0}
-%package doxysearch
-Group: Development/Libraries
-Summary: external indexer and search engine for doxygen.
-Requires: doxygen = %{mmn}
-Requires: libxapian-devel >= 1.2
-Provides: doxysearch.cgi = %{mmn}
-Provides: doxyindexer = %{mmn}
-# Obsoletes:
-
-%description doxysearch
-External indexing and search tools for searching through doxygen
-generated HTML documentation.
-%endif
-
-%prep
-%setup -q -n %{name}-%{version}
-./configure %{?_with_doxywizard} %{?_with_doxysearch} --prefix $RPM_BUILD_ROOT/usr
-
-%build
-make %{?_smp_mflags}
-make %{?_smp_mflags} pdf
-
-%install
-rm -rf $RPM_BUILD_ROOT
-make install
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-
-%files
-%defattr(-,root,root)
-
-%doc README.md LICENSE LANGUAGE.HOWTO examples ./latex/*.pdf
-%doc /usr/man/man1/doxygen.1.gz
-
-%{_bindir}/doxygen
-
-%if %{?_with_doxywizard:1}%{!?_with_doxywizard:0}
-%files doxywizard
-%defattr(-,root,root)
-%{_bindir}/doxywizard
-%doc /usr/man/man1/doxywizard.1.gz
-%endif
-
-%if %{?_with_doxysearch:1}%{!?_with_doxysearch:0}
-%files doxysearch
-%defattr(-,root,root)
-%{_bindir}/doxyindexer
-%{_bindir}/doxysearch.cgi
-%doc /usr/man/man1/doxyindexer.1.gz
-%doc /usr/man/man1/doxysearch.1.gz
-%endif
-
-%changelog
-* Tue Dec 25 2012 Dimitri van Heesch <dimitri@stack.nl> 1.8.3
-- added doxyindexer and doxysearch
-
-* Fri Apr 18 2008 Kenneth Porter <shiva+doxygenspec@sewingwitch.com> 1.5.5-1
-- consolidate with and without doxywizard spec files with rpm macro
-- add gs BuildPrereq
-
-* Sun Nov 18 2007 Kevin McBride <kevin@planetsaphire.com> 1.5.4
-- consolidated manual package in lieu of --excludedocs flag for rpm --install
-
-* Mon Oct 10 2005 Kevin McBride <kevin@planetsaphire.com> 1.4.5
-- fixed versioning bugs.
-
-* Tue Oct 4 2005 Kevin McBride <kevin@planetsaphire.com> 1.4.5
-- added obsoletes and proides sections.
-
-* Sun Sep 20 2005 Kevin McBride <kevin@planetsaphire.com> 1.4.4
-- modified rpm spec file for Fedora Core acceptance criteria.
-
-* Sun Aug 7 2005 Kevin McBride <kevin@planetsaphire.com> 1.4.4
-- created initial rpm spec file for doxygen-1.4.4
-
index 96c0f27..17f8eb4 100644 (file)
@@ -52,6 +52,6 @@ qwaitcondition_win32.cpp
 )
 endif()
 
-add_library(qtools
+add_library(qtools STATIC
 ${qtools_src}
 )
index 41f2ad9..2943270 100644 (file)
@@ -279,7 +279,7 @@ PERL_PATH              = /usr/bin/perl
 CLASS_DIAGRAMS         = YES
 MSCGEN_PATH            =
 HIDE_UNDOC_RELATIONS   = YES
-HAVE_DOT               = NO
+HAVE_DOT               = YES
 DOT_NUM_THREADS        = 0
 DOT_FONTNAME           =
 DOT_FONTSIZE           = 10
@@ -306,4 +306,4 @@ MAX_DOT_GRAPH_DEPTH    = 0
 DOT_TRANSPARENT        = YES
 DOT_MULTI_TARGETS      = NO
 GENERATE_LEGEND        = YES
-DOT_CLEANUP            = NO
+DOT_CLEANUP            = YES
index 45ccef9..35b9bb8 100644 (file)
@@ -460,6 +460,12 @@ ulong QCString::toULong(bool *ok) const
   return s.toULong(ok);
 }
 
+uint64 QCString::toUInt64(bool *ok) const
+{
+  QString s(data());
+  return s.toUInt64(ok);
+}
+
 QCString &QCString::setNum(short n)
 {
   return setNum((long)n);
index d8ce074..abf30b3 100644 (file)
@@ -149,7 +149,7 @@ public:
     /** creates a string with room for size characters
      *  @param[in] size the number of character to allocate (including the 0-terminator)
      */
-    QCString( int size ) : m_rep(size)
+    explicit QCString( int size ) : m_rep(size)
     {
     }
 
@@ -288,6 +288,7 @@ public:
     uint toUInt( bool *ok=0 ) const;
     long toLong( bool *ok=0 ) const;
     ulong toULong( bool *ok=0 )        const;
+    uint64 toUInt64( bool *ok=0 ) const;
     QCString &setNum(short n);
     QCString &setNum(ushort n);
     QCString &setNum(int n);
index 80ad628..a4ab013 100644 (file)
@@ -264,7 +264,7 @@ bool QFile::open( int m )
        } else {
            length = (int)st.st_size;
            ioIndex  = (flags() & IO_Append) == 0 ? 0 : length;
-           if ( (flags() & !IO_Truncate) && length == 0 && isReadable() ) {
+           if ( !(flags()&IO_Truncate) && length == 0 && isReadable() ) {
                // try if you can read from it (if you can, it's a sequential
                // device; e.g. a file in the /proc filesystem)
                int c = getch();
index 2530986..4fe1a26 100644 (file)
@@ -154,6 +154,32 @@ int QGDict::hashKeyAscii( const char *key )
     return index;
 }
 
+#if 0
+int QGDict::hashKeyAscii( const char *key )
+{
+#if defined(CHECK_NULL)
+    if ( key == 0 )
+    {
+       qWarning( "QGDict::hashAsciiKey: Invalid null key" );
+        return 0;
+    }
+#endif
+    unsigned int hash = 5381;
+    int c;
+    // use djb2 by Dan Bernstein
+    if (cases)
+    {
+      while ((c=*key++)) hash = ((hash<<5)+hash)+c;
+    }
+    else
+    {
+      while ((c=*key++)) hash = ((hash<<5)+hash)+tolower(c);
+    }
+    int index = hash;
+    return index<0 ? -index : index;
+}
+#endif
+
 #ifndef QT_NO_DATASTREAM
 
 /*!
index f51c0d4..d831cb1 100644 (file)
@@ -11957,7 +11957,8 @@ QString QString::visual(int index, int len)
 QChar* QString::asciiToUnicode( const QByteArray& ba, uint* len )
 {
     if ( ba.isNull() ) {
-       *len = 0;
+       if ( len )
+          *len = 0;
        return 0;
     }
     int l = 0;
@@ -11976,7 +11977,8 @@ QChar* QString::asciiToUnicode( const QByteArray& ba, uint* len )
 static QChar* internalAsciiToUnicode( const QByteArray& ba, uint* len )
 {
     if ( ba.isNull() ) {
-       *len = 0;
+        if ( len )
+           *len = 0;
        return 0;
     }
     int l = 0;
@@ -13935,6 +13937,60 @@ bye:
 }
 
 /*!
+  Returns the string converted to an <code>unsigned long</code>
+  value.
+
+  If \a ok is non-null, \a *ok is set to TRUE if there are no
+  conceivable errors, and FALSE if the string is not a number at all,
+  or if it has trailing garbage.
+*/
+
+uint64 QString::toUInt64( bool *ok, int base ) const
+{
+    const QChar *p = unicode();
+    uint64 val=0;
+    int l = length();
+    const uint64 max_mult = 1844674407370955161ULL;  // ULLONG_MAX/10, rounded down
+    bool is_ok = FALSE;
+    if ( !p )
+       goto bye;
+    while ( l && p->isSpace() )                        // skip leading space
+       l--,p++;
+    if ( *p == '+' )
+       l--,p++;
+
+    // NOTE: toULong() code is similar
+    if ( !l || !ok_in_base(*p,base) )
+       goto bye;
+    while ( l && ok_in_base(*p,base) ) {
+       l--;
+       uint dv;
+       if ( p->isDigit() ) {
+           dv = p->digitValue();
+       } else {
+           if ( *p >= 'a' && *p <= 'z' )
+               dv = *p - 'a' + 10;
+           else
+               dv = *p - 'A' + 10;
+       }
+       if ( val > max_mult || (val == max_mult && dv > (ULLONG_MAX%base)) )
+           goto bye;
+       val = base*val + dv;
+       p++;
+    }
+
+    while ( l && p->isSpace() )                        // skip trailing space
+       l--,p++;
+    if ( !l )
+       is_ok = TRUE;
+bye:
+    if ( ok )
+       *ok = is_ok;
+    return is_ok ? val : 0;
+}
+
+
+/*!
   Returns the string converted to a <code>short</code> value.
 
   If \a ok is non-null, \a *ok is set to TRUE if there are no
index a64fabf..df3873d 100644 (file)
@@ -463,6 +463,7 @@ public:
     uint       toUInt( bool *ok=0, int base=10 )       const;
     long       toLong( bool *ok=0, int base=10 )       const;
     ulong      toULong( bool *ok=0, int base=10 )      const;
+    uint64     toUInt64( bool *ok=0, int base=10 )     const;
     float      toFloat( bool *ok=0 )   const;
     double     toDouble( bool *ok=0 )  const;
 
index 155bf77..6763cf5 100644 (file)
@@ -85,28 +85,28 @@ add_custom_command(
 set_source_files_properties(${GENERATED_SRC}/layout_default.xml.h PROPERTIES GENERATED 1)
 
 # Targets for flex/bison   generated files
-FLEX_TARGET(scanner        scanner.l        ${GENERATED_SRC}/scanner.cpp        COMPILE_FLAGS "-PscannerYY")
-FLEX_TARGET(code           code.l           ${GENERATED_SRC}/code.cpp           COMPILE_FLAGS "-PcodeYY")
-FLEX_TARGET(pyscanner      pyscanner.l      ${GENERATED_SRC}/pyscanner.cpp      COMPILE_FLAGS "-PpyscannerYY")
-FLEX_TARGET(pycode         pycode.l         ${GENERATED_SRC}/pycode.cpp         COMPILE_FLAGS "-PpycodeYY")
-FLEX_TARGET(fortranscanner fortranscanner.l ${GENERATED_SRC}/fortranscanner.cpp COMPILE_FLAGS "-PfortranscannerYY -i")
-FLEX_TARGET(fortrancode    fortrancode.l    ${GENERATED_SRC}/fortrancode.cpp    COMPILE_FLAGS "-PfortrancodeYY -i")
-FLEX_TARGET(vhdlcode       vhdlcode.l       ${GENERATED_SRC}/vhdlcode.cpp       COMPILE_FLAGS "-PvhdlcodeYY -i")
-FLEX_TARGET(tclscanner     tclscanner.l     ${GENERATED_SRC}/tclscanner.cpp     COMPILE_FLAGS "-PtclscannerYY -i")
-FLEX_TARGET(pre            pre.l            ${GENERATED_SRC}/pre.cpp            COMPILE_FLAGS "-PpreYY")
-FLEX_TARGET(declinfo       declinfo.l       ${GENERATED_SRC}/declinfo.cpp       COMPILE_FLAGS "-PdeclinfoYY")
-FLEX_TARGET(defargs        defargs.l        ${GENERATED_SRC}/defargs.cpp        COMPILE_FLAGS "-PdefargsYY")
-FLEX_TARGET(doctokenizer   doctokenizer.l   ${GENERATED_SRC}/doctokenizer.cpp   COMPILE_FLAGS "-PdoctokenizerYY")
-FLEX_TARGET(commentcnv     commentcnv.l     ${GENERATED_SRC}/commentcnv.cpp     COMPILE_FLAGS "-PcommentcnvYY")
-FLEX_TARGET(commentscan    commentscan.l    ${GENERATED_SRC}/commentscan.cpp    COMPILE_FLAGS "-PcommentscanYY")
-FLEX_TARGET(constexp       constexp.l       ${GENERATED_SRC}/constexp.cpp       COMPILE_FLAGS "-PconstexpYY")
-FLEX_TARGET(xmlcode        xmlcode.l        ${GENERATED_SRC}/xmlcode.cpp        COMPILE_FLAGS "-PxmlcodeYY")
-FLEX_TARGET(config         config.l         ${GENERATED_SRC}/config.cpp         COMPILE_FLAGS "-PconfigYY")
-
-BISON_TARGET(vhdlparser    vhdlparser.y     ${GENERATED_SRC}/vhdlparser.cpp     COMPILE_FLAGS "-l -p vhdlscannerYY")
-BISON_TARGET(constexp      constexp.y       ${GENERATED_SRC}/ce_parse.cpp       COMPILE_FLAGS "-l -p constexpYY")
-
-add_library(doxycfg
+FLEX_TARGET(scanner        scanner.l        ${GENERATED_SRC}/scanner.cpp        COMPILE_FLAGS "$(LEX_FLAGS) -PscannerYY")
+FLEX_TARGET(code           code.l           ${GENERATED_SRC}/code.cpp           COMPILE_FLAGS "$(LEX_FLAGS) -PcodeYY")
+FLEX_TARGET(pyscanner      pyscanner.l      ${GENERATED_SRC}/pyscanner.cpp      COMPILE_FLAGS "$(LEX_FLAGS) -PpyscannerYY")
+FLEX_TARGET(pycode         pycode.l         ${GENERATED_SRC}/pycode.cpp         COMPILE_FLAGS "$(LEX_FLAGS) -PpycodeYY")
+FLEX_TARGET(fortranscanner fortranscanner.l ${GENERATED_SRC}/fortranscanner.cpp COMPILE_FLAGS "$(LEX_FLAGS) -PfortranscannerYY -i")
+FLEX_TARGET(fortrancode    fortrancode.l    ${GENERATED_SRC}/fortrancode.cpp    COMPILE_FLAGS "$(LEX_FLAGS) -PfortrancodeYY -i")
+FLEX_TARGET(vhdlcode       vhdlcode.l       ${GENERATED_SRC}/vhdlcode.cpp       COMPILE_FLAGS "$(LEX_FLAGS) -PvhdlcodeYY -i")
+FLEX_TARGET(tclscanner     tclscanner.l     ${GENERATED_SRC}/tclscanner.cpp     COMPILE_FLAGS "$(LEX_FLAGS) -PtclscannerYY -i")
+FLEX_TARGET(pre            pre.l            ${GENERATED_SRC}/pre.cpp            COMPILE_FLAGS "$(LEX_FLAGS) -PpreYY")
+FLEX_TARGET(declinfo       declinfo.l       ${GENERATED_SRC}/declinfo.cpp       COMPILE_FLAGS "$(LEX_FLAGS) -PdeclinfoYY")
+FLEX_TARGET(defargs        defargs.l        ${GENERATED_SRC}/defargs.cpp        COMPILE_FLAGS "$(LEX_FLAGS) -PdefargsYY")
+FLEX_TARGET(doctokenizer   doctokenizer.l   ${GENERATED_SRC}/doctokenizer.cpp   COMPILE_FLAGS "$(LEX_FLAGS) -PdoctokenizerYY")
+FLEX_TARGET(commentcnv     commentcnv.l     ${GENERATED_SRC}/commentcnv.cpp     COMPILE_FLAGS "$(LEX_FLAGS) -PcommentcnvYY")
+FLEX_TARGET(commentscan    commentscan.l    ${GENERATED_SRC}/commentscan.cpp    COMPILE_FLAGS "$(LEX_FLAGS) -PcommentscanYY")
+FLEX_TARGET(constexp       constexp.l       ${GENERATED_SRC}/constexp.cpp       COMPILE_FLAGS "$(LEX_FLAGS) -PconstexpYY")
+FLEX_TARGET(xmlcode        xmlcode.l        ${GENERATED_SRC}/xmlcode.cpp        COMPILE_FLAGS "$(LEX_FLAGS) -PxmlcodeYY")
+FLEX_TARGET(config         config.l         ${GENERATED_SRC}/config.cpp         COMPILE_FLAGS "$(LEX_FLAGS) -PconfigYY")
+
+BISON_TARGET(vhdlparser    vhdlparser.y     ${GENERATED_SRC}/vhdlparser.cpp     COMPILE_FLAGS "$(YACC_FLAGS) -l -p vhdlscannerYY")
+BISON_TARGET(constexp      constexp.y       ${GENERATED_SRC}/ce_parse.cpp       COMPILE_FLAGS "$(YACC_FLAGS) -l -p constexpYY")
+
+add_library(doxycfg STATIC
     ${GENERATED_SRC}/lang_cfg.h
     ${GENERATED_SRC}/config.cpp
     ${GENERATED_SRC}/configoptions.cpp
@@ -114,7 +114,7 @@ add_library(doxycfg
     portable_c.c
 )
 
-add_library(_doxygen
+add_library(_doxygen STATIC
     # custom generated files
     ${GENERATED_SRC}/lang_cfg.h
     ${GENERATED_SRC}/settings.h
index 2ea6300..3125f35 100644 (file)
@@ -226,13 +226,13 @@ void CiteDict::generatePage() const
     else if (insideBib) doc+=line+"\n";
     int i;
     // determine text to use at the location of the @cite command
-    if (insideBib && (i=line.find("<a name=\"CITEREF_"))!=-1)
+    if (insideBib && (i=line.find("name=\"CITEREF_"))!=-1)
     {
       int j=line.find("\">[");
       int k=line.find("]</a>");
       if (j!=-1 && k!=-1)
       {
-        QCString label = line.mid(i+17,j-i-17);
+        QCString label = line.mid(i+14,j-i-14);
         QCString number = line.mid(j+2,k-j-1);
         CiteInfo *ci = m_entries.find(label);
         //printf("label='%s' number='%s' => %p\n",label.data(),number.data(),ci);
index 95428d6..88f9a70 100644 (file)
@@ -925,10 +925,7 @@ static void writeTemplateSpec(OutputList &ol,Definition *d,
         if (a) ol.docify(", ");
       }
       ol.docify(">");
-      ol.pushGeneratorState();
-      ol.disableAllBut(OutputGenerator::Html);
       ol.lineBreak();
-      ol.popGeneratorState();
     }
     ol.docify(type.lower()+" "+name);
     ol.endSubsubsection();
@@ -1960,7 +1957,6 @@ void ClassDef::writeDocumentationContents(OutputList &ol,const QCString & /*page
 
   QCString pageType = " ";
   pageType += compoundTypeString();
-  toupper(pageType.at(1));
 
   Doxygen::indexList->addIndexItem(this,0);
 
@@ -2607,7 +2603,7 @@ void ClassDef::setTypeConstraints(ArgumentList *al)
 void ClassDef::setTemplateArguments(ArgumentList *al)
 {
   if (al==0) return;
-  if (!m_impl->tempArgs) delete m_impl->tempArgs; // delete old list if needed
+  if (m_impl->tempArgs) delete m_impl->tempArgs; // delete old list if needed
   //printf("setting template args '%s' for '%s'\n",tempArgListToString(al,getLanguage()).data(),name().data());
   m_impl->tempArgs=new ArgumentList;
   ArgumentListIterator ali(*al);
index 5c38b5a..6784b3e 100644 (file)
@@ -115,6 +115,9 @@ CommandMap cmdMap[] =
   { "#",             CMD_HASH },
   { "%",             CMD_PERCENT },
   { "|",             CMD_PIPE },
+  { ".",             CMD_PUNT },
+  { "+",             CMD_PLUS },
+  { "-",             CMD_MINUS },
   { "::",            CMD_DCOLON },
   { "\"",            CMD_QUOTE },
   { "_internalref",  CMD_INTERNALREF },
index 5a59f39..92c906a 100644 (file)
@@ -130,7 +130,10 @@ enum CommandType
   CMD_MDASH        = 100,
   CMD_STARTUML     = 101,
   CMD_ENDUML       = 102,
-  CMD_SETSCOPE     = 103
+  CMD_SETSCOPE     = 103,
+  CMD_PUNT         = 104,
+  CMD_PLUS         = 105,
+  CMD_MINUS        = 106
 };
 
 enum HtmlTagType
index c906144..ddf37d0 100644 (file)
@@ -1781,7 +1781,7 @@ TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
 SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID})
 SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+
 KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol"|"@optional"|"@required"|"@throw"|"@synthesize"|"@property")
-KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|"alignas"|"alignof"|{KEYWORD_OBJC})
+KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"set"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|"alignas"|"alignof"|{KEYWORD_OBJC})
 FLOWKW  ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"finally"|"for"|"foreach"|"for each"|"goto"|"if"|"return"|"switch"|"throw"|"throws"|"try"|"while"|"@try"|"@catch"|"@finally")
 TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"object"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"size_t"|"boolean"|"id"|"SEL"|"string"|"nullptr")
 CASTKW ("const_cast"|"dynamic_cast"|"reinterpret_cast"|"static_cast")
@@ -2026,6 +2026,11 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
 <SkipCPP>"//"                          { 
                                          g_code->codify(yytext);
                                        }
+<Body,FuncCall>"}"                     { 
+                                          g_theVarContext.popScope();
+                                         g_yyColNr++;
+                                         g_code->codify(yytext);
+                                       }
 <Body,FuncCall>"{"                     { 
                                           g_theVarContext.pushScope();
 
@@ -3695,7 +3700,7 @@ void codeFreeScanner()
 extern "C" { // some bogus code to keep the compiler happy
   void codeYYdummy() { yy_flex_realloc(0,0); } 
 }
-#elif YY_FLEX_SUBMINOR_VERSION<33
-#error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!"
+#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33
+#error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)."
 #endif
 
index 8823b68..f65c073 100644 (file)
@@ -704,6 +704,14 @@ void replaceComment(int offset);
                                     g_readLineCtx=YY_START;
                                     BEGIN(ReadLine);
                                   }
+<SComment>\n[ \t]*"//"[\/!]("<")?[ \t]*[\\@]"}".*\n {   
+                                     /* See Bug 752712: end the multiline comment when finding a @} or \} command */
+                                     copyToOutput(" */",3); 
+                                    copyToOutput(yytext,(int)yyleng); 
+                                    g_inSpecialComment=FALSE;
+                                    g_inRoseComment=FALSE;
+                                    BEGIN(Scan); 
+                                   }
 <SComment>\n[ \t]*"///"[^\/\n]/.*\n  { 
                                      replaceComment(1); 
                                     g_readLineCtx=YY_START;
@@ -773,6 +781,7 @@ void replaceComment(int offset);
                                       //printf("** Adding start of comment!\n");
                                       if (g_lang!=SrcLangExt_Python &&
                                           g_lang!=SrcLangExt_VHDL &&
+                                          g_lang!=SrcLangExt_Markdown &&
                                           g_lang!=SrcLangExt_Fortran)
                                       {
                                         ADDCHAR('/');
@@ -792,6 +801,7 @@ void replaceComment(int offset);
                                     {
                                       if (g_lang!=SrcLangExt_Python &&
                                           g_lang!=SrcLangExt_VHDL &&
+                                          g_lang!=SrcLangExt_Markdown &&
                                           g_lang!=SrcLangExt_Fortran)
                                       {
                                         ADDCHAR('*');
index 3546277..ffed075 100644 (file)
@@ -374,7 +374,7 @@ class GuardedSection
 void openGroup(Entry *e,const char *file,int line);
 void closeGroup(Entry *e,const char *file,int line,bool foundInline=FALSE);
 void initGroupInfo(Entry *e);
-static void groupAddDocs(Entry *e,const char *fileName);
+static void groupAddDocs(Entry *e);
 
 /* -----------------------------------------------------------------
  *
@@ -834,6 +834,29 @@ static inline void setOutput(OutputContext ctx)
   }
 }
 
+
+static void addAnchor(const char *anchor)
+{
+  SectionInfo *si = Doxygen::sectionDict->find(anchor);
+  if (si)
+  {
+    if (si->lineNr != -1)
+    {
+      warn(yyFileName,yyLineNr,"multiple use of section label '%s' while adding anchor, (first occurrence: %s, line %d)",anchor,si->fileName.data(),si->lineNr);
+    }
+    else
+    {
+      warn(yyFileName,yyLineNr,"multiple use of section label '%s' while adding anchor, (first occurrence: %s)",anchor,si->fileName.data());
+    }
+  }
+  else
+  {
+    si = new SectionInfo(yyFileName,yyLineNr,anchor,0,SectionInfo::Anchor,0);
+    Doxygen::sectionDict->append(anchor,si);
+    current->anchors->append(si);
+  }
+}
+
 // add a string to the output
 static inline void addOutput(const char *s)
 {
@@ -905,6 +928,7 @@ IMG       [iI][mM][gG]
 HR        [hH][rR]
 PARA      [pP][aA][rR][aA]
 CODE      [cC][oO][dD][eE]
+CAPTION   [cC][aA][pP][tT][iI][oO][nN]
 DETAILEDHTML {PRE}|{UL}|{TABLE}|{OL}|{DL}|{P}|[Hh][1-6]|{IMG}|{HR}|{PARA}
 DETAILEDHTMLOPT {CODE}
 BN        [ \t\n\r]
@@ -920,7 +944,7 @@ FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+@&#]
 FILE      ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]*"\"")
 ID        "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
 LABELID   [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
-CITESCHAR [a-z_A-Z\x80-\xFF]
+CITESCHAR [a-z_A-Z0-9\x80-\xFF]
 CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/]*
 CITEID    {CITESCHAR}{CITEECHAR}*("."{CITESCHAR}{CITEECHAR}*)*
 SCOPEID   {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
@@ -1008,23 +1032,6 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 <Comment>("\\"[a-z_A-Z]+)+"\\"         { // directory (or chain of commands!)
                                          addOutput(yytext);
                                        }
-<Comment>{XREFCMD}/[^a-z_A-Z]*         { // xref command 
-                                         if (inContext!=OutputXRef) 
-                                         {
-                                           briefEndsAtDot=FALSE;
-                                           setOutput(OutputDoc);
-                                         }
-                                         // continue with the same input
-                                          REJECT;
-                                       }
-   /*
-<Comment>{DETAILEDCMD}/[^a-z_A-Z]*     { // command that can end a brief description
-                                         briefEndsAtDot=FALSE;
-                                         setOutput(OutputDoc);
-                                         // continue with the same input
-                                          REJECT;
-                                       }
-   */
 <Comment>"<"{DETAILEDHTML}{ATTR}">"    { // HTML command that ends a brief description
                                          setOutput(OutputDoc);
                                          // continue with the same input
@@ -1053,6 +1060,24 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 <Comment>"</remarks>"                  { // end of a brief or detailed description
                                           addOutput(yytext);
                                        }
+<Comment>"<"{CAPTION}{ATTR}">"          {
+                                          QCString tag=yytext;
+                                          int s=tag.find("id=");
+                                          if (s!=-1) // command has id attribute
+                                          {
+                                            char c=tag[s+3];
+                                            if (c=='\'' || c=='"') // valid start
+                                            {
+                                              int e=tag.find(c,s+4);
+                                              if (e!=-1) // found matching end
+                                              {
+                                                QCString id=tag.mid(s+4,e-s-4); // extract id
+                                                addAnchor(id);
+                                              }
+                                            }
+                                          }
+                                          addOutput(yytext);
+                                        }
 <Comment>"<"{PRE}{ATTR}">"              {
                                           insidePre=TRUE;
                                           addOutput(yytext);
@@ -1085,8 +1110,8 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                             int i=0;
                                             while (yytext[i]==' ' || yytext[i]=='\t') i++;
                                            g_spaceBeforeCmd = QCString(yytext).left(i);
-                                           if (cmdPtr->endsBrief && inContext!=OutputXRef) 
-                                           { 
+                                           if (cmdPtr->endsBrief && !(inContext==OutputXRef && cmdName=="parblock"))
+                                           {
                                              briefEndsAtDot=FALSE;
                                              // this command forces the end of brief description
                                              setOutput(OutputDoc);
@@ -1103,7 +1128,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                              // but we need to know the position in the input buffer where this 
                                              // rule matched.
                                              // for flex 2.5.33+ we should use YY_CURRENT_BUFFER_LVALUE
-#if YY_FLEX_MINOR_VERSION>=5 && YY_FLEX_SUBMINOR_VERSION>=33
+#if YY_FLEX_MAJOR_VERSION>=2 && (YY_FLEX_MINOR_VERSION>5 || (YY_FLEX_MINOR_VERSION==5 && YY_FLEX_SUBMINOR_VERSION>=33))
                                              inputPosition=prevPosition + (int)(yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf);
 #else
                                              inputPosition=prevPosition + (int)(yy_bp - yy_current_buffer->yy_ch_buf);
@@ -1165,7 +1190,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
                                           g_memberGroupHeader.resize(0);
                                          parseMore=TRUE;
                                           needNewEntry = TRUE;
-#if YY_FLEX_MINOR_VERSION>=5 && YY_FLEX_SUBMINOR_VERSION>=33
+#if YY_FLEX_MAJOR_VERSION>=2 && (YY_FLEX_MINOR_VERSION>5 || (YY_FLEX_MINOR_VERSION==5 && YY_FLEX_SUBMINOR_VERSION>=33))
                                          inputPosition=prevPosition + (int)(yy_bp - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf) + strlen(yytext);
 #else
                                          inputPosition=prevPosition + (int)(yy_bp - yy_current_buffer->yy_ch_buf) + strlen(yytext);
@@ -1745,24 +1770,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
   /* ----- handle arguments of the anchor command ------- */
 
 <AnchorLabel>{LABELID}                 { // found argument
-                                          SectionInfo *si = Doxygen::sectionDict->find(yytext);
-                                          if (si)
-                                          {
-                                            if (si->lineNr != -1)
-                                            {
-                                              warn(yyFileName,yyLineNr,"multiple use of section label '%s' while adding anchor, (first occurrence: %s, line %d)",yytext,si->fileName.data(),si->lineNr);
-                                            }
-                                            else
-                                            {
-                                              warn(yyFileName,yyLineNr,"multiple use of section label '%s' while adding anchor, (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);
-                                          }
+                                          addAnchor(yytext);
                                          addOutput(yytext);
                                          BEGIN( Comment );
                                        }
@@ -2971,7 +2979,7 @@ bool parseCommentBlock(/* in */     ParserInterface *parser,
   checkFormula();
   prot = protection;
   
-  groupAddDocs(curEntry,fileName);
+  groupAddDocs(curEntry);
 
   newEntryNeeded = needNewEntry;
 
@@ -3100,10 +3108,10 @@ void openGroup(Entry *e,const char *,int)
   }
 }
 
-void closeGroup(Entry *e,const char *fileName,int,bool foundInline)
+void closeGroup(Entry *e,const char *fileName,int line,bool foundInline)
 {
-  //printf("==> closeGroup(name=%s,sec=%x) g_autoGroupStack=%d\n",
-  //    e->name.data(),e->section,g_autoGroupStack.count());
+  //printf("==> closeGroup(name=%s,sec=%x,file=%s,line=%d) g_autoGroupStack=%d\n",
+  //    e->name.data(),e->section,fileName,line,g_autoGroupStack.count());
   if (g_memberGroupId!=DOX_NOGROUP) // end of member group
   {
     MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(g_memberGroupId);
@@ -3111,6 +3119,7 @@ void closeGroup(Entry *e,const char *fileName,int,bool foundInline)
     {
       info->doc = g_memberGroupDocs;
       info->docFile = fileName;
+      info->docLine = line;
     }
     g_memberGroupId=DOX_NOGROUP;
     g_memberGroupRelates.resize(0);
@@ -3144,7 +3153,7 @@ void initGroupInfo(Entry *e)
   }
 }
 
-static void groupAddDocs(Entry *e,const char *fileName)
+static void groupAddDocs(Entry *e)
 {
   if (e->section==Entry::MEMBERGRP_SEC)
   {
@@ -3159,7 +3168,8 @@ static void groupAddDocs(Entry *e,const char *fileName)
     if (info) 
     {
       info->doc = g_memberGroupDocs;
-      info->docFile = fileName;
+      info->docFile = e->docFile;
+      info->docLine = e->docLine;
       info->setRefItems(e->sli);
     }
     e->doc.resize(0);
index 1bbe320..26e0283 100644 (file)
@@ -242,7 +242,7 @@ QStrList &Config::getList(const char *fileName,int num,const char *name) const
   }
   else if (opt->kind()!=ConfigOption::O_List)
   {
-    config_err("%d<%d>: Internal error: Requested option %s not of list type!\n",fileName,num,name);
+    config_err("%s<%d>: Internal error: Requested option %s not of list type!\n",fileName,num,name);
     exit(1);
   }
   return *((ConfigList *)opt)->valueRef();
@@ -1077,7 +1077,7 @@ void Config::checkFileName(const char *optionName)
       (val=="no"  || val=="false" || val=="0" || val=="none")) 
   {
     config_err("file name expected for option %s, got %s instead. Ignoring...\n",optionName,s.data());
-    s=""; // note tihe use of &s above: this will change the option value!
+    s=""; // note the use of &s above: this will change the option value!
   }
 }
 
@@ -1119,14 +1119,15 @@ void Config::check()
   
   QCString &paperType = Config_getEnum("PAPER_TYPE");
   paperType=paperType.lower().stripWhiteSpace(); 
-  if (paperType.isEmpty())
+  if (paperType.isEmpty() || paperType=="a4wide")
   {
     paperType = "a4";
   }
-  if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" && 
+  if (paperType!="a4" && paperType!="letter" && 
       paperType!="legal" && paperType!="executive")
   {
     config_err("Unknown page type specified\n");
+    paperType="a4";
   }
   
   QCString &outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
@@ -1198,6 +1199,12 @@ void Config::check()
         exit(1);
       }
     }
+    QCString &path = Config_getString("MATHJAX_RELPATH");
+    if (!path.isEmpty() && path.at(path.length()-1)!='/')
+    {
+      path+="/";
+    }
+
   }
 
   // Test to see if LaTeX header is valid
@@ -1426,71 +1433,7 @@ void Config::check()
     }
   }
 
-  // add default pattern if needed
-  QStrList &filePatternList = Config_getList("FILE_PATTERNS");
-  if (filePatternList.isEmpty())
-  {
-    filePatternList.append("*.c");
-    filePatternList.append("*.cc"); 
-    filePatternList.append("*.cxx");
-    filePatternList.append("*.cpp");
-    filePatternList.append("*.c++");
-    //filePatternList.append("*.d");
-    filePatternList.append("*.java");
-    filePatternList.append("*.ii");
-    filePatternList.append("*.ixx");
-    filePatternList.append("*.ipp");
-    filePatternList.append("*.i++");
-    filePatternList.append("*.inl");
-    filePatternList.append("*.h");
-    filePatternList.append("*.hh");
-    filePatternList.append("*.hxx");
-    filePatternList.append("*.hpp");
-    filePatternList.append("*.h++");
-    filePatternList.append("*.idl");
-    filePatternList.append("*.odl");
-    filePatternList.append("*.cs");
-    filePatternList.append("*.php");
-    filePatternList.append("*.php3");
-    filePatternList.append("*.inc");
-    filePatternList.append("*.m");
-    filePatternList.append("*.mm");
-    filePatternList.append("*.dox");
-    filePatternList.append("*.py");
-    filePatternList.append("*.f90");
-    filePatternList.append("*.f");
-    filePatternList.append("*.for");
-    filePatternList.append("*.vhd");
-    filePatternList.append("*.vhdl");
-    filePatternList.append("*.tcl");
-    filePatternList.append("*.md");
-    filePatternList.append("*.markdown");
-    if (portable_fileSystemIsCaseSensitive())
-    {
-      // unix => case sensitive match => also include useful uppercase versions
-      filePatternList.append("*.C");
-      filePatternList.append("*.CC"); 
-      filePatternList.append("*.C++");
-      filePatternList.append("*.II");
-      filePatternList.append("*.I++");
-      filePatternList.append("*.H");
-      filePatternList.append("*.HH");
-      filePatternList.append("*.H++");
-      filePatternList.append("*.CS");
-      filePatternList.append("*.PHP");
-      filePatternList.append("*.PHP3");
-      filePatternList.append("*.M");
-      filePatternList.append("*.MM");
-      filePatternList.append("*.PY");
-      filePatternList.append("*.F90");
-      filePatternList.append("*.F");
-      filePatternList.append("*.VHD");
-      filePatternList.append("*.VHDL");
-      filePatternList.append("*.TCL");
-      filePatternList.append("*.MD");
-      filePatternList.append("*.MARKDOWN");
-    }
-  }
+  initFilePattern();
 
   // add default pattern if needed
   QStrList &examplePatternList = Config_getList("EXAMPLE_PATTERNS");
@@ -1756,6 +1699,7 @@ static QCString configFileToString(const char *name)
   if (!fileOpened)  
   {
     config_err("cannot open file `%s' for reading\n",name);
+    exit(1);
   }
   return "";
 }
index acbee8e..0aa8fda 100644 (file)
@@ -1221,6 +1221,14 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
 ]]>
       </docs>
     </option>
+    <option type='bool' id='WARN_AS_ERROR' defval='0'>
+      <docs>
+<![CDATA[
+ If the \c WARN_AS_ERROR tag is set to \c YES then doxygen will immediately stop
+ when a warning is encountered.
+]]>
+      </docs>
+    </option>
     <option type='string' id='WARN_FORMAT' format='string' defval='$file:$line: $text'>
       <docs>
 <![CDATA[
@@ -1317,6 +1325,7 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
       <value name='*.mm'/>
       <value name='*.dox'/>
       <value name='*.py'/>
+      <value name='*.pyw'/>
       <value name='*.f90'/>
       <value name='*.f'/>
       <value name='*.for'/>
@@ -1436,6 +1445,10 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
  <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.
+ <br>Note that for custom extensions or not directly supported extensions you also
+ need to set \ref cfg_extension_mapping "EXTENSION_MAPPING" for the extension
+ otherwise the files are not properly processed by doxygen.<br>
+
 ]]>
       </docs>
     </option>
@@ -1449,6 +1462,9 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
  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.
+ <br>Note that for custom extensions or not directly supported extensions you also
+ need to set \ref cfg_extension_mapping "EXTENSION_MAPPING" for the extension
+ otherwise the files are not properly processed by doxygen.<br>
 ]]>
       </docs>
     </option>
@@ -1596,7 +1612,7 @@ to disable this feature.
   necessary type information.
 
   @note The availability of this option depends on whether or not doxygen
-  was compiled with the `--with-libclang` option.
+  was generated with the `-Duse-libclang=ON` option for CMake.
 ]]>
       </docs>
     </option>
@@ -2647,6 +2663,16 @@ or
 ]]>
       </docs>
     </option>
+    <option type='bool' id='LATEX_TIMESTAMP' defval='0' depends='GENERATE_LATEX'>
+      <docs>
+<![CDATA[
+ If the \c LATEX_TIMESTAMP tag is set to \c YES then the footer of
+ each generated 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.
+]]>
+      </docs>
+    </option>
   </group>
   <group name='RTF' docs='Configuration options related to the RTF output'>
     <option type='bool' id='GENERATE_RTF' defval='0'>
index f76c49b..2412010 100644 (file)
@@ -35,6 +35,8 @@
 #include "docparser.h"
 #include "htmlgen.h"
 #include "htmldocvisitor.h"
+#include "latexgen.h"
+#include "latexdocvisitor.h"
 #include "dot.h"
 #include "diagram.h"
 #include "example.h"
 #include "portable.h"
 #include "arguments.h"
 #include "groupdef.h"
+#include "searchindex.h"
 
 // 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);
 
+enum ContextOutputFormat
+{
+  ContextOutputFormat_Unspecified=0,
+  ContextOutputFormat_Html,
+  ContextOutputFormat_Latex,
+  ContextOutputFormat_Rtf,
+  ContextOutputFormat_ManPage,
+  ContextOutputFormat_DocBook,
+  ContextOutputFormat_Xml,
+  ContextOutputFormat_TagFile
+};
+
 struct ContextGlobals
 {
-  enum OutputFormat
-  {
-    Html,
-    LateX,
-    Rtf,
-    ManPage,
-    DocBook,
-    Xml,
-    TagFile
-  };
-  int          dynSectionId;
-  QCString     outputDir;
-  OutputFormat outputFormat;
+  int                 dynSectionId;
+  QCString            outputDir;
+  ContextOutputFormat outputFormat;
 } g_globals;
 
 /** @brief Scoped smart pointer */
@@ -216,38 +221,35 @@ class GenericNodeListContext : public TemplateListIntf
 //------------------------------------------------------------------------
 
 /** @brief Helper class to map a property name to a handler member function */
-class PropertyMapper 
+template<typename T>
+class PropertyMapper
 {
   private:
     struct PropertyFuncIntf
     {
       virtual ~PropertyFuncIntf() {}
-      virtual TemplateVariant operator()() const = 0;
+      virtual TemplateVariant operator()(const T *obj) const = 0;
     };
-    template<typename T>
     struct PropertyFunc : public PropertyFuncIntf
     {
       typedef TemplateVariant (T::*Handler)() const;
-      PropertyFunc(const T *o,Handler h) : obj(o), handler(h) {}
-      TemplateVariant operator()() const
+      PropertyFunc(Handler h) : handler(h) {}
+      TemplateVariant operator()(const T *obj) const
       {
         return (obj->*handler)();
       }
-      const T *obj;
       Handler handler;
     };
 
   public:
-    PropertyMapper() { m_map.setAutoDelete(TRUE); }
+    PropertyMapper() : m_map(63) { m_map.setAutoDelete(TRUE); }
 
     /** Add a property to the map
      *  @param[in] name   The name of the property to add.
      *  @param[in] obj    The object handling access to the property.
      *  @param[in] handle The method to call when the property is accessed.
      */
-    template<typename T>
-    void addProperty(const char *name,const T* obj,
-                     typename PropertyFunc<T>::Handler handle)
+    void addProperty(const char *name,typename PropertyFunc::Handler handle)
     {
       if (m_map.find(name))
       {
@@ -255,7 +257,7 @@ class PropertyMapper
       }
       else
       {
-        m_map.insert(name,new PropertyFunc<T>(obj,handle));
+        m_map.insert(name,new PropertyFunc(handle));
       }
     }
 
@@ -264,14 +266,14 @@ class PropertyMapper
      *  @returns A variant representing the properties value or an
      *  invalid variant if it was not found.
      */
-    TemplateVariant get(const char *name) const
+    TemplateVariant get(const T *obj,const char *name) const
     {
       //printf("PropertyMapper::get(%s)\n",name);
       TemplateVariant result;
       PropertyFuncIntf *func = m_map.find(name);
       if (func)
       {
-        result = (*func)();
+        result = (*func)(obj);
       }
       return result;
     }
@@ -358,7 +360,7 @@ TemplateVariant ConfigContext::get(const char *name) const
 
 //%% struct Doxygen: global information
 //%% {
-class DoxygenContext::Private : public PropertyMapper
+class DoxygenContext::Private
 {
   public:
     TemplateVariant version() const
@@ -367,18 +369,44 @@ class DoxygenContext::Private : public PropertyMapper
     }
     TemplateVariant date() const
     {
-      return TemplateVariant(dateToString(TRUE));
+      return dateToString(TRUE);
+    }
+    TemplateVariant maxJaxCodeFile() const
+    {
+      return m_cache.maxJaxCodeFile;
     }
     Private()
     {
-      //%% string version
-      addProperty("version",this,&Private::version); //makeProperty(this,&Private::version));
-      //%% string date
-      addProperty("date",   this,&Private::date);
+      static bool init=FALSE;
+      if (!init)
+      {
+        //%% string version
+        s_inst.addProperty("version",         &Private::version);
+        //%% string date
+        s_inst.addProperty("date",            &Private::date);
+        //%% string maxJaxCodeFile
+        s_inst.addProperty("mathJaxCodeFile", &Private::maxJaxCodeFile);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
+  private:
+    struct Cachable
+    {
+      Cachable() { maxJaxCodeFile=fileToString(Config_getString("MATHJAX_CODEFILE")); }
+      QCString maxJaxCodeFile;
+    };
+    mutable Cachable m_cache;
+    static PropertyMapper<DoxygenContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<DoxygenContext::Private> DoxygenContext::Private::s_inst;
+//                                (PropertyMapper<DoxygenContext::Private>::instance());
+
 DoxygenContext::DoxygenContext() : RefCountedContext("DoxygenContext")
 {
   p = new Private;
@@ -398,7 +426,7 @@ TemplateVariant DoxygenContext::get(const char *n) const
 
 //%% struct Translator: translation methods
 //%% {
-class TranslateContext::Private : public PropertyMapper
+class TranslateContext::Private
 {
   public:
 
@@ -438,6 +466,18 @@ class TranslateContext::Private : public PropertyMapper
       }
       return TemplateVariant();
     }
+    TemplateVariant handleDirDependencyGraphFor(const QValueList<TemplateVariant> &args) const
+    {
+      if (args.count()==1)
+      {
+        return theTranslator->trDirDepGraph(args[0].toString());
+      }
+      else
+      {
+        err("tr.dirDependencyGraphFor should take one argument, got %d!\n",args.count());
+      }
+      return TemplateVariant();
+    }
     TemplateVariant handleInheritsList(const QValueList<TemplateVariant> &args) const
     {
       if (args.count()==1)
@@ -553,6 +593,10 @@ class TranslateContext::Private : public PropertyMapper
     {
       return TemplateVariant::Delegate::fromMethod<Private,&Private::handleCollaborationDiagramFor>(this);
     }
+    TemplateVariant dirDependencyGraphFor() const
+    {
+      return TemplateVariant::Delegate::fromMethod<Private,&Private::handleDirDependencyGraphFor>(this);
+    }
     TemplateVariant search() const
     {
       return theTranslator->trSearch();
@@ -579,6 +623,10 @@ class TranslateContext::Private : public PropertyMapper
     {
       return theTranslator->trCompoundIndex();
     }
+    TemplateVariant namespaceIndex() const
+    {
+      return theTranslator->trNamespaceIndex();
+    }
     TemplateVariant classHierarchy() const
     {
       return theTranslator->trClassHierarchy();
@@ -591,6 +639,10 @@ class TranslateContext::Private : public PropertyMapper
     {
       return theTranslator->trModules();
     }
+    TemplateVariant moduleIndex() const
+    {
+      return theTranslator->trModuleIndex();
+    }
     TemplateVariant namespaces() const
     {
       if (m_javaOpt || m_vhdlOpt)
@@ -610,6 +662,10 @@ class TranslateContext::Private : public PropertyMapper
     {
       return theTranslator->trFile(TRUE,FALSE);
     }
+    TemplateVariant fileIndex() const
+    {
+      return theTranslator->trFileIndex();
+    }
     TemplateVariant pages() const
     {
       return theTranslator->trRelatedPages();
@@ -648,6 +704,14 @@ class TranslateContext::Private : public PropertyMapper
         return theTranslator->trNamespaceMembers();
       }
     }
+    TemplateVariant moduleDocumentation() const
+    {
+      return theTranslator->trModuleDocumentation();
+    }
+    TemplateVariant fileDocumentation() const
+    {
+      return theTranslator->trFileDocumentation();
+    }
     TemplateVariant fileList() const
     {
       return theTranslator->trFileList();
@@ -815,6 +879,10 @@ class TranslateContext::Private : public PropertyMapper
     {
       return theTranslator->trClassDocumentation();
     }
+    TemplateVariant namespaceDocumentation() const
+    {
+      return theTranslator->trNamespaceDocumentation();
+    }
     TemplateVariant compoundMembers() const
     {
       return theTranslator->trCompoundMembers();
@@ -882,166 +950,265 @@ class TranslateContext::Private : public PropertyMapper
     {
       return theTranslator->trDefines();
     }
+    TemplateVariant loading() const
+    {
+      return theTranslator->trLoading();
+    }
+    TemplateVariant searching() const
+    {
+      return theTranslator->trSearching();
+    }
+    TemplateVariant noMatches() const
+    {
+      return theTranslator->trNoMatches();
+    }
+    TemplateVariant enumName() const
+    {
+      return theTranslator->trEnumName();
+    }
+    TemplateVariant enumValue() const
+    {
+      return theTranslator->trEnumValue();
+    }
+    TemplateVariant referenceManual() const
+    {
+      return theTranslator->trReferenceManual();
+    }
+    TemplateVariant index() const
+    {
+      return theTranslator->trRTFGeneralIndex();
+    }
+    TemplateVariant panelSyncOn() const
+    {
+      return theTranslator->trPanelSynchronisationTooltip(FALSE);
+    }
+    TemplateVariant panelSyncOff() const
+    {
+      return theTranslator->trPanelSynchronisationTooltip(TRUE);
+    }
+    TemplateVariant providedByCategory() const
+    {
+      return theTranslator->trProvidedByCategory();
+    }
+    TemplateVariant extendsClass() const
+    {
+      return theTranslator->trExtendsClass();
+    }
+    TemplateVariant examplesDescription() const
+    {
+      return theTranslator->trExamplesDescription();
+    }
     Private()
     {
-      //%% string generatedBy
-      addProperty("generatedby",       this,&Private::generatedBy);
-      //%% string generatedAt
-      addProperty("generatedAt",       this,&Private::generatedAt);
-      //%% string search
-      addProperty("search",            this,&Private::search);
-      //%% string mainPage
-      addProperty("mainPage",          this,&Private::mainPage);
-      //%% string classes
-      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
-      addProperty("classHierarchy",    this,&Private::classHierarchy);
-      //%% string classMembers
-      addProperty("classMembers",      this,&Private::classMembers);
-      //%% string classMembersDescription
-      addProperty("classMembersDescription",this,&Private::classMembersDescription);
-      //%% string modules
-      addProperty("modules",           this,&Private::modules);
-      //%% string namespaces
-      addProperty("namespaces",        this,&Private::namespaces);
-      //%% string files
-      addProperty("files",             this,&Private::files);
-      //%% string pages
-      addProperty("pages",             this,&Private::pages);
-      //%% string examples
-      addProperty("examples",          this,&Private::examples);
-      //%% string namespaceList
-      addProperty("namespaceList",     this,&Private::namespaceList);
-      //%% string namespaceMembers
-      addProperty("namespaceMembers",  this,&Private::namespaceMembers);
-      //%% srting fileList
-      addProperty("fileList",          this,&Private::fileList);
-      //%% string fileMembers
-      addProperty("fileMembers",       this,&Private::fileMembers);
-      //%% string fileMembersDescription
-      addProperty("fileMembersDescription", this,&Private::fileMembersDescription);
-      //%% string relatedPagesDescripiton
-      addProperty("relatedPagesDesc",  this,&Private::relatedPagesDesc);
-      //%% string more
-      addProperty("more",              this,&Private::more);
-      //%% string detailedDescription
-      addProperty("detailedDesc",      this,&Private::detailedDesc);
-      //%% string inheritanceDiagramFor
-      addProperty("inheritanceDiagramFor", this,&Private::inheritanceDiagramFor);
-      //%% string collaborationDiagramFor
-      addProperty("collaborationDiagramFor", this,&Private::collaborationDiagramFor);
-      //%% markerstring inheritsList
-      addProperty("inheritsList",      this,&Private::inheritsList);
-      //%% markerstring inheritedByList
-      addProperty("inheritedByList",   this,&Private::inheritedByList);
-      //%% markerstring definedAtLineInSourceFile
-      addProperty("definedAtLineInSourceFile", this,&Private::definedAtLineInSourceFile);
-      //%% string typeConstraints
-      addProperty("typeConstraints",   this,&Private::typeConstraints);
-      //%% string exampleList
-      addProperty("exampleList",       this,&Private::exampleList);
-      //%% string listOfAllMembers
-      addProperty("listOfAllMembers",  this,&Private::listOfAllMembers);
-      //%% string memberList
-      addProperty("memberList",        this,&Private::memberList);
-      //%% string theListOfAllMembers
-      addProperty("theListOfAllMembers",this,&Private::theListOfAllMembers);
-      //%% string incInheritedMembers
-      addProperty("incInheritedMembers",this,&Private::incInheritedMembers);
-      //%% string defineValue
-      addProperty("defineValue",        this,&Private::defineValue);
-      //%% string initialValue
-      addProperty("initialValue",       this,&Private::initialValue);
-      //%% markerstring implements
-      addProperty("implements",         this,&Private::implements);
-      //%% markerstring reimplements
-      addProperty("reimplements",       this,&Private::reimplements);
-      //%% markerstring implementedBy
-      addProperty("implementedBy",      this,&Private::implementedBy);
-      //%% markerstring reimplementedBy
-      addProperty("reimplementedBy",    this,&Private::reimplementedBy);
-      //%% markerstring sourceRefs
-      addProperty("sourceRefs",         this,&Private::sourceRefs);
-      //%% markerstring sourceRefBys
-      addProperty("sourceRefBys",       this,&Private::sourceRefBys);
-      //%% string callGraph
-      addProperty("callGraph",          this,&Private::callGraph);
-      //%% string callerGraph
-      addProperty("callerGraph",        this,&Private::callerGraph);
-      //%% markerstring inheritedFrom
-      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 namespaceListDescription
-      addProperty("namespaceListDescription",this,&Private::namespaceListDescription);
-      //%% string directories
-      addProperty("directories",        this,&Private::directories);
-      //%% string moduleDescript
-      addProperty("modulesDescription", this,&Private::modulesDescription);
-      //%% string all
-      addProperty("all",                this,&Private::all);
-      //%% string functions
-      addProperty("functions",          this,&Private::functions);
-      //%% string variables
-      addProperty("variables",          this,&Private::variables);
-      //%% string typedefs
-      addProperty("typedefs",           this,&Private::typedefs);
-      //%% string enums
-      addProperty("enums",              this,&Private::enums);
-      //%% string enumValues
-      addProperty("enumValues",         this,&Private::enumerationValues);
-      //%% string properties
-      addProperty("properties",         this,&Private::properties);
-      //%% string events
-      addProperty("events",             this,&Private::events);
-      //%% string related
-      addProperty("related",            this,&Private::related);
-      //%% string macros
-      addProperty("macros",             this,&Private::macros);
-      //%% string namespaceMembersDescription
-      addProperty("namespaceMembersDescription",this,&Private::namespaceMembersDescription);
-      //%% string classHierarchyDescription
-      addProperty("classHierarchyDescription",this,&Private::classHierarchyDescription);
-      //%% string gotoGraphicalHierarchy
-      addProperty("gotoGraphicalHierarchy",this,&Private::gotoGraphicalHierarchy);
-      //%% string gotoTextualHierarchy
-      addProperty("gotoTextualHierarchy",this,&Private::gotoTextualHierarchy);
+      static bool init=FALSE;
+      if (!init)
+      {
+        //%% string generatedBy
+        s_inst.addProperty("generatedBy",       &Private::generatedBy);
+        //%% string generatedAt
+        s_inst.addProperty("generatedAt",       &Private::generatedAt);
+        //%% string search
+        s_inst.addProperty("search",            &Private::search);
+        //%% string mainPage
+        s_inst.addProperty("mainPage",          &Private::mainPage);
+        //%% string classes
+        s_inst.addProperty("classes",           &Private::classes);
+        //%% string classList
+        s_inst.addProperty("classList",         &Private::classList);
+        //%% string classListDescription
+        s_inst.addProperty("classListDescription", &Private::classListDescription);
+        //%% string classIndex
+        s_inst.addProperty("classIndex",        &Private::classIndex);
+        //%% string namespaceIndex
+        s_inst.addProperty("namespaceIndex",    &Private::namespaceIndex);
+        //%% string classHierarchy
+        s_inst.addProperty("classHierarchy",    &Private::classHierarchy);
+        //%% string classMembers
+        s_inst.addProperty("classMembers",      &Private::classMembers);
+        //%% string classMembersDescription
+        s_inst.addProperty("classMembersDescription",&Private::classMembersDescription);
+        //%% string modules
+        s_inst.addProperty("modules",           &Private::modules);
+        //%% string moduleIndex
+        s_inst.addProperty("moduleIndex",       &Private::moduleIndex);
+        //%% string namespaces
+        s_inst.addProperty("namespaces",        &Private::namespaces);
+        //%% string fileIndex
+        s_inst.addProperty("fileIndex",         &Private::fileIndex);
+        //%% string files
+        s_inst.addProperty("files",             &Private::files);
+        //%% string pages
+        s_inst.addProperty("pages",             &Private::pages);
+        //%% string examples
+        s_inst.addProperty("examples",          &Private::examples);
+        //%% string namespaceList
+        s_inst.addProperty("namespaceList",     &Private::namespaceList);
+        //%% string namespaceMembers
+        s_inst.addProperty("namespaceMembers",  &Private::namespaceMembers);
+        //%% srting fileList
+        s_inst.addProperty("fileList",          &Private::fileList);
+        //%% string fileMembers
+        s_inst.addProperty("fileMembers",       &Private::fileMembers);
+        //%% string fileMembersDescription
+        s_inst.addProperty("fileMembersDescription", &Private::fileMembersDescription);
+        //%% string relatedPagesDescripiton
+        s_inst.addProperty("relatedPagesDesc",  &Private::relatedPagesDesc);
+        //%% string more
+        s_inst.addProperty("more",              &Private::more);
+        //%% string detailedDescription
+        s_inst.addProperty("detailedDesc",      &Private::detailedDesc);
+        //%% string inheritanceDiagramFor
+        s_inst.addProperty("inheritanceDiagramFor", &Private::inheritanceDiagramFor);
+        //%% string collaborationDiagramFor
+        s_inst.addProperty("collaborationDiagramFor", &Private::collaborationDiagramFor);
+        //%% markerstring inheritsList
+        s_inst.addProperty("inheritsList",      &Private::inheritsList);
+        //%% markerstring inheritedByList
+        s_inst.addProperty("inheritedByList",   &Private::inheritedByList);
+        //%% markerstring definedAtLineInSourceFile
+        s_inst.addProperty("definedAtLineInSourceFile", &Private::definedAtLineInSourceFile);
+        //%% string typeConstraints
+        s_inst.addProperty("typeConstraints",   &Private::typeConstraints);
+        //%% string exampleList
+        s_inst.addProperty("exampleList",       &Private::exampleList);
+        //%% string listOfAllMembers
+        s_inst.addProperty("listOfAllMembers",  &Private::listOfAllMembers);
+        //%% string memberList
+        s_inst.addProperty("memberList",        &Private::memberList);
+        //%% string theListOfAllMembers
+        s_inst.addProperty("theListOfAllMembers",&Private::theListOfAllMembers);
+        //%% string incInheritedMembers
+        s_inst.addProperty("incInheritedMembers",&Private::incInheritedMembers);
+        //%% string defineValue
+        s_inst.addProperty("defineValue",        &Private::defineValue);
+        //%% string initialValue
+        s_inst.addProperty("initialValue",       &Private::initialValue);
+        //%% markerstring implements
+        s_inst.addProperty("implements",         &Private::implements);
+        //%% markerstring reimplements
+        s_inst.addProperty("reimplements",       &Private::reimplements);
+        //%% markerstring implementedBy
+        s_inst.addProperty("implementedBy",      &Private::implementedBy);
+        //%% markerstring reimplementedBy
+        s_inst.addProperty("reimplementedBy",    &Private::reimplementedBy);
+        //%% markerstring sourceRefs
+        s_inst.addProperty("sourceRefs",         &Private::sourceRefs);
+        //%% markerstring sourceRefBys
+        s_inst.addProperty("sourceRefBys",       &Private::sourceRefBys);
+        //%% string callGraph
+        s_inst.addProperty("callGraph",          &Private::callGraph);
+        //%% string callerGraph
+        s_inst.addProperty("callerGraph",        &Private::callerGraph);
+        //%% markerstring inheritedFrom
+        s_inst.addProperty("inheritedFrom",      &Private::inheritedFrom);
+        //%% string addtionalInheritedMembers
+        s_inst.addProperty("additionalInheritedMembers",&Private::additionalInheritedMembers);
+        //%% string includeDependencyGraph:container_name
+        s_inst.addProperty("includeDependencyGraph",&Private::includeDependencyGraph);
+        //%% string includedByDependencyGraph
+        s_inst.addProperty("includedByDependencyGraph",&Private::includedByDependencyGraph);
+        //%% string gotoSourceCode
+        s_inst.addProperty("gotoSourceCode",     &Private::gotoSourceCode);
+        //%% string gotoDocumentation
+        s_inst.addProperty("gotoDocumentation",  &Private::gotoDocumentation);
+        //%% string constantgroups
+        s_inst.addProperty("constantgroups",     &Private::constantgroups);
+        //%% string classDocumentation
+        s_inst.addProperty("classDocumentation", &Private::classDocumentation);
+        //%% string namespaceDocumentation
+        s_inst.addProperty("namespaceDocumentation", &Private::namespaceDocumentation);
+        //%% string moduleDocumentation
+        s_inst.addProperty("moduleDocumentation",&Private::moduleDocumentation);
+        //%% string fileDocumentation
+        s_inst.addProperty("fileDocumentation",  &Private::fileDocumentation);
+        //%% string compoundMembers
+        s_inst.addProperty("compoundMembers",    &Private::compoundMembers);
+        //%% string detailLevel
+        s_inst.addProperty("detailLevel",        &Private::detailLevel);
+        //%% string fileListDescription
+        s_inst.addProperty("fileListDescription",&Private::fileListDescription);
+        //%% string namespaceListDescription
+        s_inst.addProperty("namespaceListDescription",&Private::namespaceListDescription);
+        //%% string directories
+        s_inst.addProperty("directories",        &Private::directories);
+        //%% string moduleDescription
+        s_inst.addProperty("modulesDescription", &Private::modulesDescription);
+        //%% string all
+        s_inst.addProperty("all",                &Private::all);
+        //%% string functions
+        s_inst.addProperty("functions",          &Private::functions);
+        //%% string variables
+        s_inst.addProperty("variables",          &Private::variables);
+        //%% string typedefs
+        s_inst.addProperty("typedefs",           &Private::typedefs);
+        //%% string enums
+        s_inst.addProperty("enums",              &Private::enums);
+        //%% string enumValues
+        s_inst.addProperty("enumValues",         &Private::enumerationValues);
+        //%% string properties
+        s_inst.addProperty("properties",         &Private::properties);
+        //%% string events
+        s_inst.addProperty("events",             &Private::events);
+        //%% string related
+        s_inst.addProperty("related",            &Private::related);
+        //%% string macros
+        s_inst.addProperty("macros",             &Private::macros);
+        //%% string namespaceMembersDescription
+        s_inst.addProperty("namespaceMembersDescription",&Private::namespaceMembersDescription);
+        //%% string classHierarchyDescription
+        s_inst.addProperty("classHierarchyDescription",&Private::classHierarchyDescription);
+        //%% string gotoGraphicalHierarchy
+        s_inst.addProperty("gotoGraphicalHierarchy",&Private::gotoGraphicalHierarchy);
+        //%% string gotoTextualHierarchy
+        s_inst.addProperty("gotoTextualHierarchy",&Private::gotoTextualHierarchy);
+        //%% string loading
+        s_inst.addProperty("loading",            &Private::loading);
+        //%% string searching
+        s_inst.addProperty("searching",          &Private::searching);
+        //%% string noMatches
+        s_inst.addProperty("noMatches",          &Private::noMatches);
+        //%% string enumValue
+        s_inst.addProperty("enumValue",          &Private::enumValue);
+        //%% string enumName
+        s_inst.addProperty("enumName",           &Private::enumName);
+        //%% string referenceManual
+        s_inst.addProperty("referenceManual",    &Private::referenceManual);
+        //%% string index
+        s_inst.addProperty("index",              &Private::index);
+        //%% string panelSyncOn
+        s_inst.addProperty("panelSyncOn",        &Private::panelSyncOn);
+        //%% string panelSyncOff
+        s_inst.addProperty("panelSyncOff",       &Private::panelSyncOff);
+        //%% string dirDependencyGraph
+        s_inst.addProperty("dirDependencyGraphFor", &Private::dirDependencyGraphFor);
+        //%% string providedByCategory
+        s_inst.addProperty("providedByCategory", &Private::providedByCategory);
+        //%% string extendsClass
+        s_inst.addProperty("extendsClass",       &Private::extendsClass);
+        //%% string examplesDescription
+        s_inst.addProperty("examplesDescription",&Private::examplesDescription);
+
+        init=TRUE;
+      }
 
       m_javaOpt    = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
       m_fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
       m_vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
     }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
   private:
     bool m_javaOpt;
     bool m_fortranOpt;
     bool m_vhdlOpt;
+    static PropertyMapper<TranslateContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<TranslateContext::Private> TranslateContext::Private::s_inst;
+
 TranslateContext::TranslateContext() : RefCountedContext("TranslateContext")
 {
   p = new Private;
@@ -1065,10 +1232,27 @@ static TemplateVariant parseDoc(Definition *def,const QCString &file,int line,
   QGString docs;
   {
     FTextStream ts(&docs);
-    // TODO: support other generators
-    HtmlCodeGenerator codeGen(ts,relPath);
-    HtmlDocVisitor visitor(ts,codeGen,def);
-    root->accept(&visitor);
+    switch (g_globals.outputFormat)
+    {
+      case ContextOutputFormat_Html:
+        {
+          HtmlCodeGenerator codeGen(ts,relPath);
+          HtmlDocVisitor visitor(ts,codeGen,def);
+          root->accept(&visitor);
+        }
+        break;
+      case ContextOutputFormat_Latex:
+        {
+          LatexCodeGenerator codeGen(ts,relPath,file);
+          LatexDocVisitor visitor(ts,codeGen,def->getDefFileExtension(),FALSE);
+          root->accept(&visitor);
+        }
+        break;
+      // TODO: support other generators
+      default:
+        err("context.cpp: output format not yet supported");
+        break;
+    }
   }
   bool isEmpty = root->isEmpty();
   if (isEmpty)
@@ -1086,9 +1270,27 @@ static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const Q
   pIntf->resetCodeParserState();
   QGString s;
   FTextStream t(&s);
-  HtmlCodeGenerator codeGen(t,relPath);
-  pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
-                   startLine,endLine,TRUE,md,showLineNumbers,md);
+  switch (g_globals.outputFormat)
+  {
+    case ContextOutputFormat_Html:
+      {
+        HtmlCodeGenerator codeGen(t,relPath);
+        pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
+            startLine,endLine,TRUE,md,showLineNumbers,md);
+      }
+      break;
+    case ContextOutputFormat_Latex:
+      {
+        LatexCodeGenerator codeGen(t,relPath,md->docFile());
+        pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
+            startLine,endLine,TRUE,md,showLineNumbers,md);
+      }
+      break;
+    // TODO: support other generators
+    default:
+      err("context.cpp: output format not yet supported");
+      break;
+  }
   return TemplateVariant(s.data(),TRUE);
 }
 
@@ -1099,21 +1301,51 @@ static TemplateVariant parseCode(FileDef *fd,const QCString &relPath)
   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
-        );
+  switch (g_globals.outputFormat)
+  {
+    case ContextOutputFormat_Html:
+      {
+        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
+              );
+      }
+      break;
+    case ContextOutputFormat_Latex:
+      {
+        LatexCodeGenerator codeGen(t,relPath,fd->docFile());
+        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
+              );
+      }
+      break;
+    // TODO: support other generators
+    default:
+      err("context.cpp: output format not yet supported");
+      break;
+  }
   return TemplateVariant(s.data(),TRUE);
 }
 
@@ -1122,71 +1354,51 @@ static TemplateVariant parseCode(FileDef *fd,const QCString &relPath)
 //%% struct Symbol: shared info for all symbols
 //%% {
 template<typename T>
-class DefinitionContext : public PropertyMapper
+class DefinitionContext
 {
   public:
     DefinitionContext(Definition *d) : m_def(d)
     {
       assert(d!=0);
+    }
+    void addBaseProperties(PropertyMapper<T> &inst)
+    {
       //%% string name: the name of the symbol
-      addProperty("name",this,&DefinitionContext::name);
+      inst.addProperty("name",&DefinitionContext::name);
       //%% string bareName: the bare name of the symbol with scope info
-      addProperty("bareName",this,&DefinitionContext::bareName);
+      inst.addProperty("bareName",&DefinitionContext::bareName);
       //%% string relPath: the relative path to the root of the output (CREATE_SUBDIRS)
-      addProperty("relPath",this,&DefinitionContext::relPath);
+      inst.addProperty("relPath",&DefinitionContext::relPath);
       //%% string fileName: the file name of the output file associated with the symbol (without extension)
-      addProperty("fileName",this,&DefinitionContext::fileName);
+      inst.addProperty("fileName",&DefinitionContext::fileName);
       //%% string anchor: anchor within the page
-      addProperty("anchor",this,&DefinitionContext::anchor);
+      inst.addProperty("anchor",&DefinitionContext::anchor);
       //%% string details: the detailed documentation for this symbol
-      addProperty("details",this,&DefinitionContext::details);
+      inst.addProperty("details",&DefinitionContext::details);
       //%% string brief: the brief description for this symbol
-      addProperty("brief",this,&DefinitionContext::brief);
+      inst.addProperty("brief",&DefinitionContext::brief);
       //%% string inbodyDocs: the documentation found in the body
-      addProperty("inbodyDocs",this,&DefinitionContext::inbodyDocs);
+      inst.addProperty("inbodyDocs",&DefinitionContext::inbodyDocs);
       //%% string sourceFileName: the file name of the source file (without extension)
-      addProperty("sourceFileName",this,&DefinitionContext::sourceFileName);
+      inst.addProperty("sourceFileName",&DefinitionContext::sourceFileName);
       //%% bool isLinkable: can the symbol be linked to?
-      addProperty("isLinkable",this,&DefinitionContext::isLinkable);
+      inst.addProperty("isLinkable",&DefinitionContext::isLinkable);
       //%% bool isLinkableInProject: can the symbol be linked within this project?
-      addProperty("isLinkableInProject",this,&DefinitionContext::isLinkableInProject);
+      inst.addProperty("isLinkableInProject",&DefinitionContext::isLinkableInProject);
       //%% int dynSectionId: identifier that can be used for collapsable sections
-      addProperty("dynSectionId",this,&DefinitionContext::dynSectionId);
+      inst.addProperty("dynSectionId",&DefinitionContext::dynSectionId);
       //%% string language: the programming language in which the symbol is written
-      addProperty("language",this,&DefinitionContext::language);
+      inst.addProperty("language",&DefinitionContext::language);
       //%% string sourceDef: A link to the source definition
-      addProperty("sourceDef",this,&DefinitionContext::sourceDef);
+      inst.addProperty("sourceDef",&DefinitionContext::sourceDef);
       //%% 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_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_cache.fileLink->set("text",m_def->name());
-        }
-        else if (m_def->getBodyDef())
-        {
-          m_cache.fileLink->set("text",m_def->getBodyDef()->name());
-        }
-        else
-        {
-          m_cache.fileLink->set("text",name());
-        }
-        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());
-      }
+      inst.addProperty("navigationPath",&DefinitionContext::navigationPath);
+      //%% string kind: Kind of compound object: class, namespace, module, package, page, dir
+      inst.addProperty("compoundKind",&DefinitionContext::compoundKind);
+      //%% bool isReference: is this definition imported via a tag file
+      inst.addProperty("isReference",&DefinitionContext::isReference);
+      //%% string externalReference: the link to the element in the remote documentation
+      inst.addProperty("externalReference",&DefinitionContext::externalReference);
     }
     TemplateVariant fileName() const
     {
@@ -1227,44 +1439,50 @@ class DefinitionContext : public PropertyMapper
     }
     TemplateVariant details() const
     {
-      if (!m_cache.details)
+      Cachable &cache = getCache();
+      if (!cache.details || g_globals.outputFormat!=cache.detailsOutputFormat)
       {
-        m_cache.details.reset(new TemplateVariant(parseDoc(m_def,m_def->docFile(),m_def->docLine(),
+        cache.details.reset(new TemplateVariant(parseDoc(m_def,m_def->docFile(),m_def->docLine(),
                                             relPathAsString(),m_def->documentation(),FALSE)));
+        cache.detailsOutputFormat = g_globals.outputFormat;
       }
-      return *m_cache.details;
+      return *cache.details;
     }
     TemplateVariant brief() const
     {
-      if (!m_cache.brief)
+      Cachable &cache = getCache();
+      if (!cache.brief || g_globals.outputFormat!=cache.briefOutputFormat)
       {
         if (m_def->hasBriefDescription())
         {
-          m_cache.brief.reset(new TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(),
+          cache.brief.reset(new TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(),
                              relPathAsString(),m_def->briefDescription(),TRUE)));
+          cache.briefOutputFormat = g_globals.outputFormat;
         }
         else
         {
-          m_cache.brief.reset(new TemplateVariant(""));
+          cache.brief.reset(new TemplateVariant(""));
         }
       }
-      return *m_cache.brief;
+      return *cache.brief;
     }
     TemplateVariant inbodyDocs() const
     {
-      if (!m_cache.inbodyDocs)
+      Cachable &cache = getCache();
+      if (!cache.inbodyDocs || g_globals.outputFormat!=cache.inbodyDocsOutputFormat)
       {
         if (!m_def->inbodyDocumentation().isEmpty())
         {
-          m_cache.inbodyDocs.reset(new TemplateVariant(parseDoc(m_def,m_def->inbodyFile(),m_def->inbodyLine(),
+          cache.inbodyDocs.reset(new TemplateVariant(parseDoc(m_def,m_def->inbodyFile(),m_def->inbodyLine(),
                                            relPathAsString(),m_def->inbodyDocumentation(),FALSE)));
+          cache.inbodyDocsOutputFormat = g_globals.outputFormat;
         }
         else
         {
-          m_cache.inbodyDocs.reset(new TemplateVariant(""));
+          cache.inbodyDocs.reset(new TemplateVariant(""));
         }
       }
-      return *m_cache.inbodyDocs;
+      return *cache.inbodyDocs;
     }
     TemplateVariant dynSectionId() const
     {
@@ -1294,11 +1512,30 @@ class DefinitionContext : public PropertyMapper
       }
       return result;
     }
+    TemplateVariant compoundKind() const
+    {
+      QCString result = "unspecified";
+      switch (m_def->definitionType())
+      {
+        case DefinitionIntf::TypeClass:     result="class";     break;
+        case DefinitionIntf::TypeFile:      result="file";      break;
+        case DefinitionIntf::TypeNamespace: result="namespace"; break;
+        case DefinitionIntf::TypeGroup:     result="module";    break;
+        case DefinitionIntf::TypePackage:   result="package";   break;
+        case DefinitionIntf::TypePage:      result="page";      break;
+        case DefinitionIntf::TypeDir:       result="dir";       break;
+        case DefinitionIntf::TypeMember: // fall through
+        case DefinitionIntf::TypeSymbolList:
+                break;
+      }
+      return result;
+    }
     TemplateVariant sourceDef() const
     {
-      if (m_cache.sourceDef->count()==2)
+      Cachable &cache = getCache();
+      if (cache.sourceDef->count()==2)
       {
-        return m_cache.sourceDef.get();
+        return cache.sourceDef.get();
       }
       else
       {
@@ -1321,7 +1558,8 @@ class DefinitionContext : public PropertyMapper
     }
     TemplateVariant navigationPath() const
     {
-      if (!m_cache.navPath)
+      Cachable &cache = getCache();
+      if (!cache.navPath)
       {
         TemplateList *list = TemplateList::alloc();
         if (m_def->getOuterScope() && m_def->getOuterScope()!=Doxygen::globalScope)
@@ -1332,25 +1570,80 @@ class DefinitionContext : public PropertyMapper
         {
           fillPath(((const FileDef *)m_def)->getDirDef(),list);
         }
-        m_cache.navPath.reset(list);
+        cache.navPath.reset(list);
       }
-      return m_cache.navPath.get();
+      return cache.navPath.get();
+    }
+    TemplateVariant isReference() const
+    {
+      return m_def->isReference();
+    }
+    TemplateVariant externalReference() const
+    {
+      return m_def->externalReference(relPathAsString());
     }
 
-  private:
-    Definition      *m_def;
-    struct Cachable
+  protected:
+    struct Cachable : public Definition::Cookie
     {
-      Cachable() { }
+      Cachable(Definition *def) : detailsOutputFormat(ContextOutputFormat_Unspecified),
+                                  briefOutputFormat(ContextOutputFormat_Unspecified),
+                                  inbodyDocsOutputFormat(ContextOutputFormat_Unspecified)
+      {
+        sourceDef.reset(TemplateList::alloc());
+        lineLink.reset(TemplateStruct::alloc());
+        fileLink.reset(TemplateStruct::alloc());
+
+        if (def && !def->getSourceFileBase().isEmpty())
+        {
+          lineLink->set("text",def->getStartBodyLine());
+          lineLink->set("isLinkable",TRUE);
+          lineLink->set("fileName",def->getSourceFileBase());
+          lineLink->set("anchor",def->getSourceAnchor());
+          lineLink->set("isReference",FALSE);
+          lineLink->set("externalReference","");
+          if (def->definitionType()==Definition::TypeFile)
+          {
+            fileLink->set("text",def->name());
+          }
+          else if (def->getBodyDef())
+          {
+            fileLink->set("text",def->getBodyDef()->name());
+          }
+          else
+          {
+            fileLink->set("text",def->displayName(TRUE));
+          }
+          fileLink->set("isLinkable",TRUE);
+          fileLink->set("fileName",def->getSourceFileBase());
+          fileLink->set("anchor",QCString());
+          fileLink->set("isReference",FALSE);
+          fileLink->set("externalReference","");
+          sourceDef->append(lineLink.get());
+          sourceDef->append(fileLink.get());
+        }
+      }
       ScopedPtr<TemplateVariant> details;
+      ContextOutputFormat        detailsOutputFormat;
       ScopedPtr<TemplateVariant> brief;
+      ContextOutputFormat        briefOutputFormat;
       ScopedPtr<TemplateVariant> inbodyDocs;
+      ContextOutputFormat        inbodyDocsOutputFormat;
       SharedPtr<TemplateList>    navPath;
       SharedPtr<TemplateList>    sourceDef;
       SharedPtr<TemplateStruct>  fileLink;
       SharedPtr<TemplateStruct>  lineLink;
     };
-    mutable Cachable m_cache;
+
+
+  private:
+    Cachable &getCache() const
+    {
+      Cachable *c = static_cast<Cachable*>(m_def->cookie());
+      assert(c!=0);
+      return *c;
+    }
+    Definition      *m_def;
 };
 //%% }
 
@@ -1358,21 +1651,27 @@ class DefinitionContext : public PropertyMapper
 
 //%% struct IncludeInfo: include file information
 //%% {
-class IncludeInfoContext::Private : public PropertyMapper
+class IncludeInfoContext::Private
 {
   public:
     Private(const IncludeInfo *info,SrcLangExt lang) :
       m_info(info),
       m_lang(lang)
     {
-      if (m_info)
+      static bool init=FALSE;
+      if (!init)
       {
-        addProperty("file",this,&Private::file);
-        addProperty("name",this,&Private::name);
-        addProperty("isImport",this,&Private::isImport);
-        addProperty("isLocal",this,&Private::isLocal);
+        s_inst.addProperty("file",&Private::file);
+        s_inst.addProperty("name",&Private::name);
+        s_inst.addProperty("isImport",&Private::isImport);
+        s_inst.addProperty("isLocal",&Private::isLocal);
+        init=TRUE;
       }
     }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
     TemplateVariant isLocal() const
     {
       bool isIDLorJava = m_lang==SrcLangExt_IDL || m_lang==SrcLangExt_Java;
@@ -1380,7 +1679,7 @@ class IncludeInfoContext::Private : public PropertyMapper
     }
     TemplateVariant isImport() const
     {
-      return m_info->imported;
+      return m_info->imported || m_lang==SrcLangExt_ObjC;
     }
     TemplateVariant file() const
     {
@@ -1405,8 +1704,11 @@ class IncludeInfoContext::Private : public PropertyMapper
     const IncludeInfo *m_info;
     mutable SharedPtr<FileContext> m_fileContext;
     SrcLangExt m_lang;
+    static PropertyMapper<IncludeInfoContext::Private> s_inst;
 };
 
+PropertyMapper<IncludeInfoContext::Private> IncludeInfoContext::Private::s_inst;
+
 IncludeInfoContext::IncludeInfoContext(const IncludeInfo *info,SrcLangExt lang) : RefCountedContext("IncludeContext")
 {
   p = new Private(info,lang);
@@ -1479,71 +1781,85 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
     Private(ClassDef *cd) : DefinitionContext<ClassContext::Private>(cd),
        m_classDef(cd)
     {
-      addProperty("title",                     this,&Private::title);
-      addProperty("highlight",                 this,&Private::highlight);
-      addProperty("subhighlight",              this,&Private::subHighlight);
-      addProperty("hasDetails",                this,&Private::hasDetails);
-      addProperty("generatedFromFiles",        this,&Private::generatedFromFiles);
-      addProperty("usedFiles",                 this,&Private::usedFiles);
-      addProperty("hasInheritanceDiagram",     this,&Private::hasInheritanceDiagram);
-      addProperty("inheritanceDiagram",        this,&Private::inheritanceDiagram);
-      addProperty("hasCollaborationDiagram",   this,&Private::hasCollaborationDiagram);
-      addProperty("collaborationDiagram",      this,&Private::collaborationDiagram);
-      addProperty("includeInfo",               this,&Private::includeInfo);
-      addProperty("inherits",                  this,&Private::inherits);
-      addProperty("inheritedBy",               this,&Private::inheritedBy);
-      addProperty("unoIDLServices",            this,&Private::unoIDLServices);
-      addProperty("unoIDLInterfaces",          this,&Private::unoIDLInterfaces);
-      addProperty("signals",                   this,&Private::signals);
-      addProperty("publicTypes",               this,&Private::publicTypes);
-      addProperty("publicMethods",             this,&Private::publicMethods);
-      addProperty("publicStaticMethods",       this,&Private::publicStaticMethods);
-      addProperty("publicAttributes",          this,&Private::publicAttributes);
-      addProperty("publicStaticAttributes",    this,&Private::publicStaticAttributes);
-      addProperty("publicSlots",               this,&Private::publicSlots);
-      addProperty("protectedTypes",            this,&Private::protectedTypes);
-      addProperty("protectedMethods",          this,&Private::protectedMethods);
-      addProperty("protectedStaticMethods",    this,&Private::protectedStaticMethods);
-      addProperty("protectedAttributes",       this,&Private::protectedAttributes);
-      addProperty("protectedStaticAttributes", this,&Private::protectedStaticAttributes);
-      addProperty("protectedSlots",            this,&Private::protectedSlots);
-      addProperty("privateTypes",              this,&Private::privateTypes);
-      addProperty("privateMethods",            this,&Private::privateMethods);
-      addProperty("privateStaticMethods",      this,&Private::privateStaticMethods);
-      addProperty("privateAttributes",         this,&Private::privateAttributes);
-      addProperty("privateStaticAttributes",   this,&Private::privateStaticAttributes);
-      addProperty("privateSlots",              this,&Private::privateSlots);
-      addProperty("packageTypes",              this,&Private::packageTypes);
-      addProperty("packageMethods",            this,&Private::packageMethods);
-      addProperty("packageStaticMethods",      this,&Private::packageStaticMethods);
-      addProperty("packageAttributes",         this,&Private::packageAttributes);
-      addProperty("packageStaticAttributes",   this,&Private::packageStaticAttributes);
-      addProperty("properties",                this,&Private::properties);
-      addProperty("events",                    this,&Private::events);
-      addProperty("friends",                   this,&Private::friends);
-      addProperty("related",                   this,&Private::related);
-      addProperty("detailedTypedefs",          this,&Private::detailedTypedefs);
-      addProperty("detailedEnums",             this,&Private::detailedEnums);
-      addProperty("detailedServices",          this,&Private::detailedServices);
-      addProperty("detailedInterfaces",        this,&Private::detailedInterfaces);
-      addProperty("detailedConstructors",      this,&Private::detailedConstructors);
-      addProperty("detailedMethods",           this,&Private::detailedMethods);
-      addProperty("detailedRelated",           this,&Private::detailedRelated);
-      addProperty("detailedVariables",         this,&Private::detailedVariables);
-      addProperty("detailedProperties",        this,&Private::detailedProperties);
-      addProperty("detailedEvents",            this,&Private::detailedEvents);
-      addProperty("classes",                   this,&Private::classes);
-      addProperty("compoundType",              this,&Private::compoundType);
-      addProperty("templateDecls",             this,&Private::templateDecls);
-      addProperty("typeConstraints",           this,&Private::typeConstraints);
-      addProperty("examples",                  this,&Private::examples);
-      addProperty("members",                   this,&Private::members);
-      addProperty("allMembersList",            this,&Private::allMembersList);
-      addProperty("allMembersFileName",        this,&Private::allMembersFileName);
-      addProperty("memberGroups",              this,&Private::memberGroups);
-      addProperty("additionalInheritedMembers",this,&Private::additionalInheritedMembers);
+      static bool init=FALSE;
+      if (!init)
+      {
+        addBaseProperties(s_inst);
+        s_inst.addProperty("title",                     &Private::title);
+        s_inst.addProperty("highlight",                 &Private::highlight);
+        s_inst.addProperty("subhighlight",              &Private::subHighlight);
+        s_inst.addProperty("hasDetails",                &Private::hasDetails);
+        s_inst.addProperty("generatedFromFiles",        &Private::generatedFromFiles);
+        s_inst.addProperty("usedFiles",                 &Private::usedFiles);
+        s_inst.addProperty("hasInheritanceDiagram",     &Private::hasInheritanceDiagram);
+        s_inst.addProperty("inheritanceDiagram",        &Private::inheritanceDiagram);
+        s_inst.addProperty("hasCollaborationDiagram",   &Private::hasCollaborationDiagram);
+        s_inst.addProperty("collaborationDiagram",      &Private::collaborationDiagram);
+        s_inst.addProperty("includeInfo",               &Private::includeInfo);
+        s_inst.addProperty("inherits",                  &Private::inherits);
+        s_inst.addProperty("inheritedBy",               &Private::inheritedBy);
+        s_inst.addProperty("unoIDLServices",            &Private::unoIDLServices);
+        s_inst.addProperty("unoIDLInterfaces",          &Private::unoIDLInterfaces);
+        s_inst.addProperty("signals",                   &Private::signals);
+        s_inst.addProperty("publicTypes",               &Private::publicTypes);
+        s_inst.addProperty("publicMethods",             &Private::publicMethods);
+        s_inst.addProperty("publicStaticMethods",       &Private::publicStaticMethods);
+        s_inst.addProperty("publicAttributes",          &Private::publicAttributes);
+        s_inst.addProperty("publicStaticAttributes",    &Private::publicStaticAttributes);
+        s_inst.addProperty("publicSlots",               &Private::publicSlots);
+        s_inst.addProperty("protectedTypes",            &Private::protectedTypes);
+        s_inst.addProperty("protectedMethods",          &Private::protectedMethods);
+        s_inst.addProperty("protectedStaticMethods",    &Private::protectedStaticMethods);
+        s_inst.addProperty("protectedAttributes",       &Private::protectedAttributes);
+        s_inst.addProperty("protectedStaticAttributes", &Private::protectedStaticAttributes);
+        s_inst.addProperty("protectedSlots",            &Private::protectedSlots);
+        s_inst.addProperty("privateTypes",              &Private::privateTypes);
+        s_inst.addProperty("privateMethods",            &Private::privateMethods);
+        s_inst.addProperty("privateStaticMethods",      &Private::privateStaticMethods);
+        s_inst.addProperty("privateAttributes",         &Private::privateAttributes);
+        s_inst.addProperty("privateStaticAttributes",   &Private::privateStaticAttributes);
+        s_inst.addProperty("privateSlots",              &Private::privateSlots);
+        s_inst.addProperty("packageTypes",              &Private::packageTypes);
+        s_inst.addProperty("packageMethods",            &Private::packageMethods);
+        s_inst.addProperty("packageStaticMethods",      &Private::packageStaticMethods);
+        s_inst.addProperty("packageAttributes",         &Private::packageAttributes);
+        s_inst.addProperty("packageStaticAttributes",   &Private::packageStaticAttributes);
+        s_inst.addProperty("properties",                &Private::properties);
+        s_inst.addProperty("events",                    &Private::events);
+        s_inst.addProperty("friends",                   &Private::friends);
+        s_inst.addProperty("related",                   &Private::related);
+        s_inst.addProperty("detailedTypedefs",          &Private::detailedTypedefs);
+        s_inst.addProperty("detailedEnums",             &Private::detailedEnums);
+        s_inst.addProperty("detailedServices",          &Private::detailedServices);
+        s_inst.addProperty("detailedInterfaces",        &Private::detailedInterfaces);
+        s_inst.addProperty("detailedConstructors",      &Private::detailedConstructors);
+        s_inst.addProperty("detailedMethods",           &Private::detailedMethods);
+        s_inst.addProperty("detailedRelated",           &Private::detailedRelated);
+        s_inst.addProperty("detailedVariables",         &Private::detailedVariables);
+        s_inst.addProperty("detailedProperties",        &Private::detailedProperties);
+        s_inst.addProperty("detailedEvents",            &Private::detailedEvents);
+        s_inst.addProperty("classes",                   &Private::classes);
+        s_inst.addProperty("innerClasses",              &Private::innerClasses);
+        s_inst.addProperty("compoundType",              &Private::compoundType);
+        s_inst.addProperty("templateDecls",             &Private::templateDecls);
+        s_inst.addProperty("typeConstraints",           &Private::typeConstraints);
+        s_inst.addProperty("examples",                  &Private::examples);
+        s_inst.addProperty("members",                   &Private::members);
+        s_inst.addProperty("allMembersList",            &Private::allMembersList);
+        s_inst.addProperty("allMembersFileName",        &Private::allMembersFileName);
+        s_inst.addProperty("memberGroups",              &Private::memberGroups);
+        s_inst.addProperty("additionalInheritedMembers",&Private::additionalInheritedMembers);
+        s_inst.addProperty("isSimple",                  &Private::isSimple);
+        s_inst.addProperty("categoryOf",                &Private::categoryOf);
+        init=TRUE;
+      }
+      if (!cd->cookie()) { cd->setCookie(new ClassContext::Private::Cachable(cd)); }
     }
     virtual ~Private() {}
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
     TemplateVariant title() const
     {
       return TemplateVariant(m_classDef->title());
@@ -1566,27 +1882,30 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
     }
     TemplateVariant usedFiles() const
     {
-      if (!m_cache.usedFiles)
+      Cachable &cache = getCache();
+      if (!cache.usedFiles)
       {
-        m_cache.usedFiles.reset(UsedFilesContext::alloc(m_classDef));
+        cache.usedFiles.reset(UsedFilesContext::alloc(m_classDef));
       }
-      return m_cache.usedFiles.get();
+      return cache.usedFiles.get();
     }
     DotClassGraph *getClassGraph() const
     {
-      if (!m_cache.classGraph)
+      Cachable &cache = getCache();
+      if (!cache.classGraph)
       {
-        m_cache.classGraph.reset(new DotClassGraph(m_classDef,DotNode::Inheritance));
+        cache.classGraph.reset(new DotClassGraph(m_classDef,DotNode::Inheritance));
       }
-      return m_cache.classGraph.get();
+      return cache.classGraph.get();
     }
     int numInheritanceNodes() const
     {
-      if (m_cache.inheritanceNodes==-1)
+      Cachable &cache = getCache();
+      if (cache.inheritanceNodes==-1)
       {
-        m_cache.inheritanceNodes=m_classDef->countInheritanceNodes();
+        cache.inheritanceNodes=m_classDef->countInheritanceNodes();
       }
-      return m_cache.inheritanceNodes>0;
+      return cache.inheritanceNodes>0;
     }
     TemplateVariant hasInheritanceDiagram() const
     {
@@ -1615,37 +1934,75 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
       {
         DotClassGraph *cg = getClassGraph();
         FTextStream t(&result);
-        cg->writeGraph(t,GOF_BITMAP,EOF_Html,
-                       g_globals.outputDir,
-                       g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension,
-                       relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
-                      );
+        switch (g_globals.outputFormat)
+        {
+          case ContextOutputFormat_Html:
+            {
+              cg->writeGraph(t,GOF_BITMAP,EOF_Html,
+                             g_globals.outputDir,
+                             g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+                             relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
+                            );
+            }
+            break;
+          case ContextOutputFormat_Latex:
+            {
+              cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
+                             g_globals.outputDir,
+                             g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+".tex",
+                             relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
+                            );
+            }
+            break;
+            // TODO: support other generators
+          default:
+            err("context.cpp: output format not yet supported");
+            break;
+        }
+        g_globals.dynSectionId++;
       }
       else if (classDiagrams)
       {
         ClassDiagram d(m_classDef);
         FTextStream t(&result);
-        QCString name = convertToHtml(m_classDef->displayName());
-        t << "<div class=\"center\">" << endl;
-        t << "<img src=\"";
-        t << relPathAsString() << m_classDef->getOutputFileBase();
-        t << ".png\" usemap=\"#" << name << "_map\" alt=\"\"/>" << endl;
-        t << "<map id=\"" << name << "_map\" name=\"" << name << "_map\">" << endl;
-        d.writeImage(t,g_globals.outputDir,
-                     relPathAsString(),
-                     m_classDef->getOutputFileBase());
-        t << "</div>";
-      }
-      g_globals.dynSectionId++;
+        switch (g_globals.outputFormat)
+        {
+          case ContextOutputFormat_Html:
+            {
+              QCString name = convertToHtml(m_classDef->displayName());
+              t << "<div class=\"center\">" << endl;
+              t << "<img src=\"";
+              t << relPathAsString() << m_classDef->getOutputFileBase();
+              t << ".png\" usemap=\"#" << convertToId(name) << "_map\" alt=\"\"/>" << endl;
+              t << "<map id=\"" << convertToId(name) << "_map\" name=\"" << name << "_map\">" << endl;
+              d.writeImage(t,g_globals.outputDir,
+                           relPathAsString(),
+                           m_classDef->getOutputFileBase());
+              t << "</div>";
+            }
+            break;
+          case ContextOutputFormat_Latex:
+            {
+              d.writeFigure(t,g_globals.outputDir,m_classDef->getOutputFileBase());
+            }
+            break;
+            // TODO: support other generators
+          default:
+            err("context.cpp: output format not yet supported");
+            break;
+        }
+        g_globals.dynSectionId++;
+      }
       return TemplateVariant(result.data(),TRUE);
     }
     DotClassGraph *getCollaborationGraph() const
     {
-      if (!m_cache.collaborationGraph)
+      Cachable &cache = getCache();
+      if (!cache.collaborationGraph)
       {
-        m_cache.collaborationGraph.reset(new DotClassGraph(m_classDef,DotNode::Collaboration));
+        cache.collaborationGraph.reset(new DotClassGraph(m_classDef,DotNode::Collaboration));
       }
-      return m_cache.collaborationGraph.get();
+      return cache.collaborationGraph.get();
     }
     TemplateVariant hasCollaborationDiagram() const
     {
@@ -1660,25 +2017,46 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
       {
         DotClassGraph *cg = getCollaborationGraph();
         FTextStream t(&result);
-        cg->writeGraph(t,GOF_BITMAP,EOF_Html,
-            g_globals.outputDir,
-            g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension,
-            relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
-            );
+        switch (g_globals.outputFormat)
+        {
+          case ContextOutputFormat_Html:
+            {
+              cg->writeGraph(t,GOF_BITMAP,EOF_Html,
+                             g_globals.outputDir,
+                             g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+                             relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
+                            );
+            }
+            break;
+          case ContextOutputFormat_Latex:
+            {
+              cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
+                             g_globals.outputDir,
+                             g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+".tex",
+                             relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
+                            );
+            }
+            break;
+            // TODO: support other generators
+          default:
+            err("context.cpp: output format not yet supported");
+            break;
+        }
+        g_globals.dynSectionId++;
       }
-      g_globals.dynSectionId++;
       return TemplateVariant(result.data(),TRUE);
     }
 
     TemplateVariant includeInfo() const
     {
-      if (!m_cache.includeInfo && m_classDef->includeInfo())
+      Cachable &cache = getCache();
+      if (!cache.includeInfo && m_classDef->includeInfo())
       {
-        m_cache.includeInfo.reset(IncludeInfoContext::alloc(m_classDef->includeInfo(),m_classDef->getLanguage()));
+        cache.includeInfo.reset(IncludeInfoContext::alloc(m_classDef->includeInfo(),m_classDef->getLanguage()));
       }
-      if (m_cache.includeInfo)
+      if (cache.includeInfo)
       {
-        return m_cache.includeInfo.get();
+        return cache.includeInfo.get();
       }
       else
       {
@@ -1687,19 +2065,21 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
     }
     TemplateVariant inherits() const
     {
-      if (!m_cache.inheritsList)
+      Cachable &cache = getCache();
+      if (!cache.inheritsList)
       {
-        m_cache.inheritsList.reset(InheritanceListContext::alloc(m_classDef->baseClasses(),TRUE));
+        cache.inheritsList.reset(InheritanceListContext::alloc(m_classDef->baseClasses(),TRUE));
       }
-      return m_cache.inheritsList.get();
+      return cache.inheritsList.get();
     }
     TemplateVariant inheritedBy() const
     {
-      if (!m_cache.inheritedByList)
+      Cachable &cache = getCache();
+      if (!cache.inheritedByList)
       {
-        m_cache.inheritedByList.reset(InheritanceListContext::alloc(m_classDef->subClasses(),FALSE));
+        cache.inheritedByList.reset(InheritanceListContext::alloc(m_classDef->subClasses(),FALSE));
       }
-      return m_cache.inheritedByList.get();
+      return cache.inheritedByList.get();
     }
     TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
                                   MemberListType type,const char *title,bool detailed=FALSE) const
@@ -1709,7 +2089,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
         MemberList *ml = m_classDef->getMemberList(type);
         if (ml)
         {
-          list.reset(MemberListInfoContext::alloc(m_classDef,relPathAsString(),ml,title,detailed));
+          list.reset(MemberListInfoContext::alloc(m_classDef,relPathAsString(),ml,title,""));
         }
       }
       if (list)
@@ -1723,171 +2103,172 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
     }
     TemplateVariant unoIDLServices() const
     {
-      return getMemberList(m_cache.unoIDLServices,MemberListType_services,theTranslator->trServices());
+      return getMemberList(getCache().unoIDLServices,MemberListType_services,theTranslator->trServices());
     }
     TemplateVariant unoIDLInterfaces() const
     {
-      return getMemberList(m_cache.unoIDLInterfaces,MemberListType_interfaces,theTranslator->trInterfaces());
+      return getMemberList(getCache().unoIDLInterfaces,MemberListType_interfaces,theTranslator->trInterfaces());
     }
     TemplateVariant signals() const
     {
-      return getMemberList(m_cache.signals,MemberListType_signals,theTranslator->trSignals());
+      return getMemberList(getCache().signals,MemberListType_signals,theTranslator->trSignals());
     }
     TemplateVariant publicTypes() const
     {
-      return getMemberList(m_cache.publicTypes,MemberListType_pubTypes,theTranslator->trPublicTypes());
+      return getMemberList(getCache().publicTypes,MemberListType_pubTypes,theTranslator->trPublicTypes());
     }
     TemplateVariant publicMethods() const
     {
-      return getMemberList(m_cache.publicMethods,MemberListType_pubMethods,
+      return getMemberList(getCache().publicMethods,MemberListType_pubMethods,
           m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trInstanceMethods()
                                                      : theTranslator->trPublicMembers());
     }
     TemplateVariant publicStaticMethods() const
     {
-      return getMemberList(m_cache.publicStaticMethods,MemberListType_pubStaticMethods,
+      return getMemberList(getCache().publicStaticMethods,MemberListType_pubStaticMethods,
           m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trClassMethods()
                                                      : theTranslator->trStaticPublicMembers());
     }
     TemplateVariant publicAttributes() const
     {
-      return getMemberList(m_cache.publicAttributes,MemberListType_pubAttribs,theTranslator->trPublicAttribs());
+      return getMemberList(getCache().publicAttributes,MemberListType_pubAttribs,theTranslator->trPublicAttribs());
     }
     TemplateVariant publicStaticAttributes() const
     {
-      return getMemberList(m_cache.publicStaticAttributes,MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs());
+      return getMemberList(getCache().publicStaticAttributes,MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs());
     }
     TemplateVariant publicSlots() const
     {
-      return getMemberList(m_cache.publicSlots,MemberListType_pubSlots,theTranslator->trPublicSlots());
+      return getMemberList(getCache().publicSlots,MemberListType_pubSlots,theTranslator->trPublicSlots());
     }
     TemplateVariant protectedTypes() const
     {
-      return getMemberList(m_cache.protectedTypes,MemberListType_proTypes,theTranslator->trProtectedTypes());
+      return getMemberList(getCache().protectedTypes,MemberListType_proTypes,theTranslator->trProtectedTypes());
     }
     TemplateVariant protectedMethods() const
     {
-      return getMemberList(m_cache.protectedMethods,MemberListType_proMethods,theTranslator->trProtectedMembers());
+      return getMemberList(getCache().protectedMethods,MemberListType_proMethods,theTranslator->trProtectedMembers());
     }
     TemplateVariant protectedStaticMethods() const
     {
-      return getMemberList(m_cache.protectedStaticMethods,MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers());
+      return getMemberList(getCache().protectedStaticMethods,MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers());
     }
     TemplateVariant protectedAttributes() const
     {
-      return getMemberList(m_cache.protectedAttributes,MemberListType_proAttribs,theTranslator->trProtectedAttribs());
+      return getMemberList(getCache().protectedAttributes,MemberListType_proAttribs,theTranslator->trProtectedAttribs());
     }
     TemplateVariant protectedStaticAttributes() const
     {
-      return getMemberList(m_cache.protectedStaticAttributes,MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs());
+      return getMemberList(getCache().protectedStaticAttributes,MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs());
     }
     TemplateVariant protectedSlots() const
     {
-      return getMemberList(m_cache.protectedSlots,MemberListType_proSlots,theTranslator->trProtectedSlots());
+      return getMemberList(getCache().protectedSlots,MemberListType_proSlots,theTranslator->trProtectedSlots());
     }
     TemplateVariant privateTypes() const
     {
-      return getMemberList(m_cache.privateTypes,MemberListType_priTypes,theTranslator->trPrivateTypes());
+      return getMemberList(getCache().privateTypes,MemberListType_priTypes,theTranslator->trPrivateTypes());
     }
     TemplateVariant privateSlots() const
     {
-      return getMemberList(m_cache.privateSlots,MemberListType_priSlots,theTranslator->trPrivateSlots());
+      return getMemberList(getCache().privateSlots,MemberListType_priSlots,theTranslator->trPrivateSlots());
     }
     TemplateVariant privateMethods() const
     {
-      return getMemberList(m_cache.privateMethods,MemberListType_priMethods,theTranslator->trPrivateMembers());
+      return getMemberList(getCache().privateMethods,MemberListType_priMethods,theTranslator->trPrivateMembers());
     }
     TemplateVariant privateStaticMethods() const
     {
-      return getMemberList(m_cache.privateStaticMethods,MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers());
+      return getMemberList(getCache().privateStaticMethods,MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers());
     }
     TemplateVariant privateAttributes() const
     {
-      return getMemberList(m_cache.privateAttributes,MemberListType_priAttribs,theTranslator->trPrivateAttribs());
+      return getMemberList(getCache().privateAttributes,MemberListType_priAttribs,theTranslator->trPrivateAttribs());
     }
     TemplateVariant privateStaticAttributes() const
     {
-      return getMemberList(m_cache.privateStaticAttributes,MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs());
+      return getMemberList(getCache().privateStaticAttributes,MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs());
     }
     TemplateVariant packageTypes() const
     {
-      return getMemberList(m_cache.packageTypes,MemberListType_pacTypes,theTranslator->trPackageTypes());
+      return getMemberList(getCache().packageTypes,MemberListType_pacTypes,theTranslator->trPackageTypes());
     }
     TemplateVariant packageMethods() const
     {
-      return getMemberList(m_cache.packageMethods,MemberListType_pacMethods,theTranslator->trPackageMembers());
+      return getMemberList(getCache().packageMethods,MemberListType_pacMethods,theTranslator->trPackageMembers());
     }
     TemplateVariant packageStaticMethods() const
     {
-      return getMemberList(m_cache.packageStaticMethods,MemberListType_pacStaticMethods,theTranslator->trStaticPackageMembers());
+      return getMemberList(getCache().packageStaticMethods,MemberListType_pacStaticMethods,theTranslator->trStaticPackageMembers());
     }
     TemplateVariant packageAttributes() const
     {
-      return getMemberList(m_cache.packageAttributes,MemberListType_pacAttribs,theTranslator->trPackageAttribs());
+      return getMemberList(getCache().packageAttributes,MemberListType_pacAttribs,theTranslator->trPackageAttribs());
     }
     TemplateVariant packageStaticAttributes() const
     {
-      return getMemberList(m_cache.packageStaticAttributes,MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs());
+      return getMemberList(getCache().packageStaticAttributes,MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs());
     }
     TemplateVariant properties() const
     {
-      return getMemberList(m_cache.properties,MemberListType_properties,theTranslator->trProperties());
+      return getMemberList(getCache().properties,MemberListType_properties,theTranslator->trProperties());
     }
     TemplateVariant events() const
     {
-      return getMemberList(m_cache.events,MemberListType_events,theTranslator->trEvents());
+      return getMemberList(getCache().events,MemberListType_events,theTranslator->trEvents());
     }
     TemplateVariant friends() const
     {
-      return getMemberList(m_cache.friends,MemberListType_friends,theTranslator->trFriends());
+      return getMemberList(getCache().friends,MemberListType_friends,theTranslator->trFriends());
     }
     TemplateVariant related() const
     {
-      return getMemberList(m_cache.related,MemberListType_related,theTranslator->trRelatedFunctions());
+      return getMemberList(getCache().related,MemberListType_related,theTranslator->trRelatedFunctions());
     }
     TemplateVariant detailedTypedefs() const
     {
-      return getMemberList(m_cache.detailedTypedefs,MemberListType_typedefMembers,theTranslator->trMemberTypedefDocumentation(),TRUE);
+      return getMemberList(getCache().detailedTypedefs,MemberListType_typedefMembers,theTranslator->trMemberTypedefDocumentation(),TRUE);
     }
     TemplateVariant detailedEnums() const
     {
-      return getMemberList(m_cache.detailedEnums,MemberListType_enumMembers,theTranslator->trMemberEnumerationDocumentation(),TRUE);
+      return getMemberList(getCache().detailedEnums,MemberListType_enumMembers,theTranslator->trMemberEnumerationDocumentation(),TRUE);
     }
     TemplateVariant detailedServices() const
     {
-      return getMemberList(m_cache.detailedServices,MemberListType_serviceMembers,theTranslator->trServices(),TRUE);
+      return getMemberList(getCache().detailedServices,MemberListType_serviceMembers,theTranslator->trServices(),TRUE);
     }
     TemplateVariant detailedInterfaces() const
     {
-      return getMemberList(m_cache.detailedInterfaces,MemberListType_interfaceMembers,theTranslator->trInterfaces(),TRUE);
+      return getMemberList(getCache().detailedInterfaces,MemberListType_interfaceMembers,theTranslator->trInterfaces(),TRUE);
     }
     TemplateVariant detailedConstructors() const
     {
-      return getMemberList(m_cache.detailedConstructors,MemberListType_constructors,theTranslator->trConstructorDocumentation(),TRUE);
+      return getMemberList(getCache().detailedConstructors,MemberListType_constructors,theTranslator->trConstructorDocumentation(),TRUE);
     }
     TemplateVariant detailedMethods() const
     {
-      return getMemberList(m_cache.detailedMethods,MemberListType_functionMembers,theTranslator->trMemberFunctionDocumentation(),TRUE);
+      return getMemberList(getCache().detailedMethods,MemberListType_functionMembers,theTranslator->trMemberFunctionDocumentation(),TRUE);
     }
     TemplateVariant detailedRelated() const
     {
-      return getMemberList(m_cache.detailedRelated,MemberListType_relatedMembers,theTranslator->trRelatedFunctionDocumentation(),TRUE);
+      return getMemberList(getCache().detailedRelated,MemberListType_relatedMembers,theTranslator->trRelatedFunctionDocumentation(),TRUE);
     }
     TemplateVariant detailedVariables() const
     {
-      return getMemberList(m_cache.detailedVariables,MemberListType_variableMembers,theTranslator->trMemberDataDocumentation(),TRUE);
+      return getMemberList(getCache().detailedVariables,MemberListType_variableMembers,theTranslator->trMemberDataDocumentation(),TRUE);
     }
     TemplateVariant detailedProperties() const
     {
-      return getMemberList(m_cache.detailedProperties,MemberListType_propertyMembers,theTranslator->trPropertyDocumentation(),TRUE);
+      return getMemberList(getCache().detailedProperties,MemberListType_propertyMembers,theTranslator->trPropertyDocumentation(),TRUE);
     }
     TemplateVariant detailedEvents() const
     {
-      return getMemberList(m_cache.detailedEvents,MemberListType_eventMembers,theTranslator->trEventDocumentation(),TRUE);
+      return getMemberList(getCache().detailedEvents,MemberListType_eventMembers,theTranslator->trEventDocumentation(),TRUE);
     }
     TemplateVariant classes() const
     {
-      if (!m_cache.classes)
+      Cachable &cache = getCache();
+      if (!cache.classes)
       {
         TemplateList *classList = TemplateList::alloc();
         if (m_classDef->getClassSDict())
@@ -1902,9 +2283,35 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
             }
           }
         }
-        m_cache.classes.reset(classList);
+        cache.classes.reset(classList);
       }
-      return m_cache.classes.get();
+      return cache.classes.get();
+    }
+    TemplateVariant innerClasses() const
+    {
+      Cachable &cache = getCache();
+      if (!cache.innerClasses)
+      {
+        TemplateList *classList = TemplateList::alloc();
+        if (m_classDef->getClassSDict())
+        {
+          ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
+          ClassDef *cd;
+          for (sdi.toFirst();(cd=sdi.current());++sdi)
+          {
+            if (cd->name().find('@')==-1 &&
+                cd->isLinkableInProject() &&
+                cd->isEmbeddedInOuterScope() &&
+                cd->partOfGroups()==0
+               )
+            {
+              classList->append(ClassContext::alloc(cd));
+            }
+          }
+        }
+        cache.innerClasses.reset(classList);
+      }
+      return cache.innerClasses.get();
     }
     TemplateVariant compoundType() const
     {
@@ -1942,61 +2349,68 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
           s->set("isLinkable",TRUE);
           s->set("anchor",ex->anchor);
           s->set("fileName",ex->file);
+          s->set("isReference",FALSE);
+          s->set("externalReference","");
           list->append(s);
         }
       }
     }
     TemplateVariant templateDecls() const
     {
-      if (!m_cache.templateDecls)
+      Cachable &cache = getCache();
+      if (!cache.templateDecls)
       {
         TemplateList *tl = TemplateList::alloc();
         addTemplateDecls(m_classDef,tl);
-        m_cache.templateDecls.reset(tl);
+        cache.templateDecls.reset(tl);
       }
-      return m_cache.templateDecls.get();
+      return cache.templateDecls.get();
     }
     TemplateVariant typeConstraints() const
     {
-      if (!m_cache.typeConstraints && m_classDef->typeConstraints())
-      {
-        m_cache.typeConstraints.reset(ArgumentListContext::alloc(m_classDef->typeConstraints(),m_classDef,relPathAsString()));
-      }
-      else
+      if (m_classDef->typeConstraints())
       {
-        m_cache.typeConstraints.reset(ArgumentListContext::alloc());
+        Cachable &cache = getCache();
+        if (!cache.typeConstraints && m_classDef->typeConstraints())
+        {
+          cache.typeConstraints.reset(ArgumentListContext::alloc(m_classDef->typeConstraints(),m_classDef,relPathAsString()));
+        }
+        return cache.typeConstraints.get();
       }
-      return m_cache.typeConstraints.get();
+      return FALSE;
     }
     TemplateVariant examples() const
     {
-      if (!m_cache.examples)
+      Cachable &cache = getCache();
+      if (!cache.examples)
       {
         TemplateList *exampleList = TemplateList::alloc();
         addExamples(exampleList);
-        m_cache.examples.reset(exampleList);
+        cache.examples.reset(exampleList);
       }
-      return m_cache.examples.get();
+      return cache.examples.get();
     }
     void addMembers(ClassDef *cd,MemberListType lt) const
     {
       MemberList *ml = cd->getMemberList(lt);
       if (ml)
       {
+        Cachable &cache = getCache();
         MemberListIterator li(*ml);
         const MemberDef *md;
         for (li.toFirst();(md=li.current());++li)
         {
           if (md->isBriefSectionVisible())
           {
-            m_cache.allMembers.append(md);
+            cache.allMembers.append(md);
           }
         }
       }
     }
     TemplateVariant members() const
     {
-      if (!m_cache.members)
+      Cachable &cache = getCache();
+      if (!cache.members)
       {
         addMembers(m_classDef,MemberListType_pubTypes);
         addMembers(m_classDef,MemberListType_services);
@@ -2027,25 +2441,26 @@ 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(MemberListContext::alloc(&m_cache.allMembers));
+        cache.members.reset(MemberListContext::alloc(&cache.allMembers));
       }
-      return m_cache.members.get();
+      return cache.members.get();
     }
     TemplateVariant allMembersList() const
     {
-      if (!m_cache.allMembersList)
+      Cachable &cache = getCache();
+      if (!cache.allMembersList)
       {
         if (m_classDef->memberNameInfoSDict())
         {
           AllMembersListContext *ml = AllMembersListContext::alloc(m_classDef->memberNameInfoSDict());
-          m_cache.allMembersList.reset(ml);
+          cache.allMembersList.reset(ml);
         }
         else
         {
-          m_cache.allMembersList.reset(AllMembersListContext::alloc());
+          cache.allMembersList.reset(AllMembersListContext::alloc());
         }
       }
-      return m_cache.allMembersList.get();
+      return cache.allMembersList.get();
     }
     TemplateVariant allMembersFileName() const
     {
@@ -2053,22 +2468,24 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
     }
     TemplateVariant memberGroups() const
     {
-      if (!m_cache.memberGroups)
+      Cachable &cache = getCache();
+      if (!cache.memberGroups)
       {
         if (m_classDef->getMemberGroupSDict())
         {
-          m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_classDef,relPathAsString(),m_classDef->getMemberGroupSDict(),m_classDef->subGrouping()));
+          cache.memberGroups.reset(MemberGroupListContext::alloc(m_classDef,relPathAsString(),m_classDef->getMemberGroupSDict(),m_classDef->subGrouping()));
         }
         else
         {
-          m_cache.memberGroups.reset(MemberGroupListContext::alloc());
+          cache.memberGroups.reset(MemberGroupListContext::alloc());
         }
       }
-      return m_cache.memberGroups.get();
+      return cache.memberGroups.get();
     }
     TemplateVariant additionalInheritedMembers() const
     {
-      if (!m_cache.additionalInheritedMembers)
+      Cachable &cache = getCache();
+      if (!cache.additionalInheritedMembers)
       {
         InheritedMemberInfoListContext *ctx = InheritedMemberInfoListContext::alloc();
         ctx->addMemberList(m_classDef,MemberListType_pubTypes,theTranslator->trPublicTypes());
@@ -2104,22 +2521,44 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
         ctx->addMemberList(m_classDef,MemberListType_priAttribs,theTranslator->trPrivateAttribs());
         ctx->addMemberList(m_classDef,MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs());
         ctx->addMemberList(m_classDef,MemberListType_related,theTranslator->trRelatedFunctions());
-        m_cache.additionalInheritedMembers.reset(ctx);
+        cache.additionalInheritedMembers.reset(ctx);
+      }
+      return cache.additionalInheritedMembers.get();
+    }
+    TemplateVariant isSimple() const
+    {
+      return m_classDef->isSimple();
+    }
+    TemplateVariant categoryOf() const
+    {
+      Cachable &cache = getCache();
+      if (!cache.categoryOf && m_classDef->categoryOf())
+      {
+        cache.categoryOf.reset(ClassContext::alloc(m_classDef->categoryOf()));
+      }
+      if (cache.categoryOf)
+      {
+        return cache.categoryOf.get();
+      }
+      else
+      {
+        return TemplateVariant(FALSE);
       }
-      return m_cache.additionalInheritedMembers.get();
     }
 
   private:
     ClassDef *m_classDef;
-    struct Cachable
+    struct Cachable : public DefinitionContext<ClassContext::Private>::Cachable
     {
-      Cachable() : inheritanceNodes(-1) { }
+      Cachable(ClassDef *cd) : DefinitionContext<ClassContext::Private>::Cachable(cd),
+                               inheritanceNodes(-1) { }
       SharedPtr<IncludeInfoContext>     includeInfo;
       SharedPtr<InheritanceListContext> inheritsList;
       SharedPtr<InheritanceListContext> inheritedByList;
       ScopedPtr<DotClassGraph>          classGraph;
       ScopedPtr<DotClassGraph>          collaborationGraph;
       SharedPtr<TemplateList>           classes;
+      SharedPtr<TemplateList>           innerClasses;
       SharedPtr<MemberListInfoContext>  publicTypes;
       SharedPtr<MemberListInfoContext>  publicMethods;
       SharedPtr<MemberListInfoContext>  publicStaticMethods;
@@ -2169,13 +2608,22 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private>
       SharedPtr<MemberListContext>      members;
       SharedPtr<UsedFilesContext>       usedFiles;
       SharedPtr<TemplateList>           exampleList;
+      SharedPtr<ClassContext>           categoryOf;
       int                               inheritanceNodes;
       MemberList                        allMembers;
     };
-    mutable Cachable m_cache;
+    Cachable &getCache() const
+    {
+      Cachable *c = static_cast<Cachable*>(m_classDef->cookie());
+      assert(c!=0);
+      return *c;
+    }
+    static PropertyMapper<ClassContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<ClassContext::Private> ClassContext::Private::s_inst;
+
 ClassContext::ClassContext(ClassDef *cd) : RefCountedContext("ClassContext")
 {
   //printf("ClassContext::ClassContext(%s)\n",cd?cd->name().data():"<none>");
@@ -2199,28 +2647,40 @@ TemplateVariant ClassContext::get(const char *n) const
 class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Private>
 {
   public:
-    Private(NamespaceDef *nd) : DefinitionContext<NamespaceContext::Private>(nd) , m_namespaceDef(nd)
-    {
-      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);
-      addProperty("classes",           this,&Private::classes);
-      addProperty("namespaces",        this,&Private::namespaces);
-      addProperty("constantgroups",    this,&Private::constantgroups);
-      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("detailedTypedefs",  this,&Private::detailedTypedefs);
-      addProperty("detailedEnums",     this,&Private::detailedEnums);
-      addProperty("detailedFunctions", this,&Private::detailedFunctions);
-      addProperty("detailedVariables", this,&Private::detailedVariables);
-      addProperty("inlineClasses",     this,&Private::inlineClasses);
+    Private(NamespaceDef *nd) : DefinitionContext<NamespaceContext::Private>(nd),
+                                m_namespaceDef(nd)
+    {
+      static bool init=FALSE;
+      if (!init)
+      {
+        addBaseProperties(s_inst);
+        s_inst.addProperty("title",             &Private::title);
+        s_inst.addProperty("highlight",         &Private::highlight);
+        s_inst.addProperty("subhighlight",      &Private::subHighlight);
+        s_inst.addProperty("compoundType",      &Private::compoundType);
+        s_inst.addProperty("hasDetails",        &Private::hasDetails);
+        s_inst.addProperty("classes",           &Private::classes);
+        s_inst.addProperty("namespaces",        &Private::namespaces);
+        s_inst.addProperty("constantgroups",    &Private::constantgroups);
+        s_inst.addProperty("typedefs",          &Private::typedefs);
+        s_inst.addProperty("enums",             &Private::enums);
+        s_inst.addProperty("functions",         &Private::functions);
+        s_inst.addProperty("variables",         &Private::variables);
+        s_inst.addProperty("memberGroups",      &Private::memberGroups);
+        s_inst.addProperty("detailedTypedefs",  &Private::detailedTypedefs);
+        s_inst.addProperty("detailedEnums",     &Private::detailedEnums);
+        s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
+        s_inst.addProperty("detailedVariables", &Private::detailedVariables);
+        s_inst.addProperty("inlineClasses",     &Private::inlineClasses);
+        init=TRUE;
+      }
+      if (!nd->cookie()) { nd->setCookie(new NamespaceContext::Private::Cachable(nd)); }
     }
     virtual ~Private() {}
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
     TemplateVariant title() const
     {
       return TemplateVariant(m_namespaceDef->title());
@@ -2243,7 +2703,8 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
     }
     TemplateVariant classes() const
     {
-      if (!m_cache.classes)
+      Cachable &cache = getCache();
+      if (!cache.classes)
       {
         TemplateList *classList = TemplateList::alloc();
         if (m_namespaceDef->getClassSDict())
@@ -2258,13 +2719,14 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
             }
           }
         }
-        m_cache.classes.reset(classList);
+        cache.classes.reset(classList);
       }
-      return m_cache.classes.get();
+      return cache.classes.get();
     }
     TemplateVariant namespaces() const
     {
-      if (!m_cache.namespaces)
+      Cachable &cache = getCache();
+      if (!cache.namespaces)
       {
         TemplateList *namespaceList = TemplateList::alloc();
         if (m_namespaceDef->getNamespaceSDict())
@@ -2279,13 +2741,14 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
             }
           }
         }
-        m_cache.namespaces.reset(namespaceList);
+        cache.namespaces.reset(namespaceList);
       }
-      return m_cache.namespaces.get();
+      return cache.namespaces.get();
     }
     TemplateVariant constantgroups() const
     {
-      if (!m_cache.constantgroups)
+      Cachable &cache = getCache();
+      if (!cache.constantgroups)
       {
         TemplateList *namespaceList = TemplateList::alloc();
         if (m_namespaceDef->getNamespaceSDict())
@@ -2300,9 +2763,9 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
             }
           }
         }
-        m_cache.constantgroups.reset(namespaceList);
+        cache.constantgroups.reset(namespaceList);
       }
-      return m_cache.constantgroups.get();
+      return cache.constantgroups.get();
     }
     TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
                                   MemberListType type,const char *title,bool detailed=FALSE) const
@@ -2312,7 +2775,7 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
         MemberList *ml = m_namespaceDef->getMemberList(type);
         if (ml)
         {
-          list.reset(MemberListInfoContext::alloc(m_namespaceDef,relPathAsString(),ml,title,detailed));
+          list.reset(MemberListInfoContext::alloc(m_namespaceDef,relPathAsString(),ml,title,""));
         }
       }
       if (list)
@@ -2326,11 +2789,11 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
     }
     TemplateVariant typedefs() const
     {
-      return getMemberList(m_cache.typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
+      return getMemberList(getCache().typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
     }
     TemplateVariant enums() const
     {
-      return getMemberList(m_cache.enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
+      return getMemberList(getCache().enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
     }
     TemplateVariant functions() const
     {
@@ -2338,49 +2801,51 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
       SrcLangExt lang = m_namespaceDef->getLanguage();
       if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
       else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc();
-      return getMemberList(m_cache.functions,MemberListType_decFuncMembers,title);
+      return getMemberList(getCache().functions,MemberListType_decFuncMembers,title);
     }
     TemplateVariant variables() const
     {
-      return getMemberList(m_cache.variables,MemberListType_decVarMembers,theTranslator->trVariables());
+      return getMemberList(getCache().variables,MemberListType_decVarMembers,theTranslator->trVariables());
     }
     TemplateVariant memberGroups() const
     {
-      if (!m_cache.memberGroups)
+      Cachable &cache = getCache();
+      if (!cache.memberGroups)
       {
         if (m_namespaceDef->getMemberGroupSDict())
         {
-          m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_namespaceDef,relPathAsString(),m_namespaceDef->getMemberGroupSDict(),m_namespaceDef->subGrouping()));
+          cache.memberGroups.reset(MemberGroupListContext::alloc(m_namespaceDef,relPathAsString(),m_namespaceDef->getMemberGroupSDict(),m_namespaceDef->subGrouping()));
         }
         else
         {
-          m_cache.memberGroups.reset(MemberGroupListContext::alloc());
+          cache.memberGroups.reset(MemberGroupListContext::alloc());
         }
       }
-      return m_cache.memberGroups.get();
+      return cache.memberGroups.get();
     }
     TemplateVariant detailedTypedefs() const
     {
-      return getMemberList(m_cache.detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
+      return getMemberList(getCache().detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
     }
     TemplateVariant detailedEnums() const
     {
-      return getMemberList(m_cache.detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
+      return getMemberList(getCache().detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
     }
     TemplateVariant detailedFunctions() const
     {
       QCString title = theTranslator->trFunctionDocumentation();
       SrcLangExt lang = m_namespaceDef->getLanguage();
       if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation();
-      return getMemberList(m_cache.detailedFunctions,MemberListType_docFuncMembers,title);
+      return getMemberList(getCache().detailedFunctions,MemberListType_docFuncMembers,title);
     }
     TemplateVariant detailedVariables() const
     {
-      return getMemberList(m_cache.detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
+      return getMemberList(getCache().detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
     }
     TemplateVariant inlineClasses() const
     {
-      if (!m_cache.inlineClasses)
+      Cachable &cache = getCache();
+      if (!cache.inlineClasses)
       {
         TemplateList *classList = TemplateList::alloc();
         if (m_namespaceDef->getClassSDict())
@@ -2398,14 +2863,15 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
             }
           }
         }
-        m_cache.inlineClasses.reset(classList);
+        cache.inlineClasses.reset(classList);
       }
-      return m_cache.inlineClasses.get();
+      return cache.inlineClasses.get();
     }
   private:
     NamespaceDef *m_namespaceDef;
-    struct Cachable
+    struct Cachable : public DefinitionContext<NamespaceContext::Private>::Cachable
     {
+      Cachable(NamespaceDef *nd) : DefinitionContext<NamespaceContext::Private>::Cachable(nd) {}
       SharedPtr<TemplateList>               classes;
       SharedPtr<TemplateList>               namespaces;
       SharedPtr<TemplateList>               constantgroups;
@@ -2420,10 +2886,18 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri
       SharedPtr<MemberListInfoContext>      detailedVariables;
       SharedPtr<TemplateList>               inlineClasses;
     };
-    mutable Cachable m_cache;
+    Cachable &getCache() const
+    {
+      Cachable *c = static_cast<Cachable*>(m_namespaceDef->cookie());
+      assert(c!=0);
+      return *c;
+    }
+    static PropertyMapper<NamespaceContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<NamespaceContext::Private> NamespaceContext::Private::s_inst;
+
 NamespaceContext::NamespaceContext(NamespaceDef *nd) : RefCountedContext("NamespaceContext")
 {
   p = new Private(nd);
@@ -2449,37 +2923,48 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
     Private(FileDef *fd) : DefinitionContext<FileContext::Private>(fd) , m_fileDef(fd)
     {
       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);
+      static bool init=FALSE;
+      if (!init)
+      {
+        addBaseProperties(s_inst);
+        s_inst.addProperty("title",                     &Private::title);
+        s_inst.addProperty("highlight",                 &Private::highlight);
+        s_inst.addProperty("subhighlight",              &Private::subHighlight);
+        s_inst.addProperty("versionInfo",               &Private::versionInfo);
+        s_inst.addProperty("includeList",               &Private::includeList);
+        s_inst.addProperty("hasIncludeGraph",           &Private::hasIncludeGraph);
+        s_inst.addProperty("hasIncludedByGraph",        &Private::hasIncludedByGraph);
+        s_inst.addProperty("includeGraph",              &Private::includeGraph);
+        s_inst.addProperty("includedByGraph",           &Private::includedByGraph);
+        s_inst.addProperty("hasDetails",                &Private::hasDetails);
+        s_inst.addProperty("hasSourceFile",             &Private::hasSourceFile);
+        s_inst.addProperty("sources",                   &Private::sources);
+        s_inst.addProperty("version",                   &Private::version);
+        s_inst.addProperty("classes",                   &Private::classes);
+        s_inst.addProperty("namespaces",                &Private::namespaces);
+        s_inst.addProperty("constantgroups",            &Private::constantgroups);
+        s_inst.addProperty("macros",                    &Private::macros);
+        s_inst.addProperty("typedefs",                  &Private::typedefs);
+        s_inst.addProperty("enums",                     &Private::enums);
+        s_inst.addProperty("functions",                 &Private::functions);
+        s_inst.addProperty("variables",                 &Private::variables);
+        s_inst.addProperty("memberGroups",              &Private::memberGroups);
+        s_inst.addProperty("detailedMacros",            &Private::detailedMacros);
+        s_inst.addProperty("detailedTypedefs",          &Private::detailedTypedefs);
+        s_inst.addProperty("detailedEnums",             &Private::detailedEnums);
+        s_inst.addProperty("detailedFunctions",         &Private::detailedFunctions);
+        s_inst.addProperty("detailedVariables",         &Private::detailedVariables);
+        s_inst.addProperty("inlineClasses",             &Private::inlineClasses);
+        s_inst.addProperty("compoundType",              &Private::compoundType);
+        init=TRUE;
+      }
+      if (!fd->cookie()) { fd->setCookie(new FileContext::Private::Cachable(fd)); }
     }
     virtual ~Private() {}
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
     TemplateVariant title() const
     {
       return m_fileDef->title();
@@ -2498,14 +2983,15 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
     }
     TemplateVariant includeList() const
     {
-      if (!m_cache.includeInfoList && m_fileDef->includeFileList())
+      Cachable &cache = getCache();
+      if (!cache.includeInfoList && m_fileDef->includeFileList())
       {
-        m_cache.includeInfoList.reset(IncludeInfoListContext::alloc(
+        cache.includeInfoList.reset(IncludeInfoListContext::alloc(
               *m_fileDef->includeFileList(),m_fileDef->getLanguage()));
       }
-      if (m_cache.includeInfoList)
+      if (cache.includeInfoList)
       {
-        return m_cache.includeInfoList.get();
+        return cache.includeInfoList.get();
       }
       else
       {
@@ -2514,11 +3000,12 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
     }
     DotInclDepGraph *getIncludeGraph() const
     {
-      if (!m_cache.includeGraph)
+      Cachable &cache = getCache();
+      if (!cache.includeGraph)
       {
-        m_cache.includeGraph.reset(new DotInclDepGraph(m_fileDef,FALSE));
+        cache.includeGraph.reset(new DotInclDepGraph(m_fileDef,FALSE));
       }
-      return m_cache.includeGraph.get();
+      return cache.includeGraph.get();
     }
     TemplateVariant hasIncludeGraph() const
     {
@@ -2534,22 +3021,43 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
       {
         DotInclDepGraph *cg = getIncludeGraph();
         FTextStream t(&result);
-        cg->writeGraph(t,GOF_BITMAP,EOF_Html,
-            g_globals.outputDir,
-            g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
-            relPathAsString(),TRUE,g_globals.dynSectionId
-            );
+        switch (g_globals.outputFormat)
+        {
+          case ContextOutputFormat_Html:
+            {
+              cg->writeGraph(t,GOF_BITMAP,EOF_Html,
+                  g_globals.outputDir,
+                  g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+                  relPathAsString(),TRUE,g_globals.dynSectionId
+                  );
+            }
+            break;
+          case ContextOutputFormat_Latex:
+            {
+              cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
+                  g_globals.outputDir,
+                  g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+".tex",
+                  relPathAsString(),TRUE,g_globals.dynSectionId
+                  );
+            }
+            break;
+            // TODO: support other generators
+          default:
+            err("context.cpp: output format not yet supported");
+            break;
+        }
+        g_globals.dynSectionId++;
       }
-      g_globals.dynSectionId++;
       return TemplateVariant(result.data(),TRUE);
     }
     DotInclDepGraph *getIncludedByGraph() const
     {
-      if (!m_cache.includedByGraph)
+      Cachable &cache = getCache();
+      if (!cache.includedByGraph)
       {
-        m_cache.includedByGraph.reset(new DotInclDepGraph(m_fileDef,TRUE));
+        cache.includedByGraph.reset(new DotInclDepGraph(m_fileDef,TRUE));
       }
-      return m_cache.includedByGraph.get();
+      return cache.includedByGraph.get();
     }
     TemplateVariant hasIncludedByGraph() const
     {
@@ -2565,37 +3073,58 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
       {
         DotInclDepGraph *cg = getIncludedByGraph();
         FTextStream t(&result);
-        cg->writeGraph(t,GOF_BITMAP,EOF_Html,
-            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 hasDetails() const
-    {
-      return m_fileDef->hasDetailedDescription();
-    }
-    TemplateVariant hasSourceFile() const
-    {
+        switch (g_globals.outputFormat)
+        {
+          case ContextOutputFormat_Html:
+            {
+              cg->writeGraph(t,GOF_BITMAP,EOF_Html,
+                  g_globals.outputDir,
+                  g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+                  relPathAsString(),TRUE,g_globals.dynSectionId
+                  );
+            }
+            break;
+          case ContextOutputFormat_Latex:
+            {
+              cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
+                  g_globals.outputDir,
+                  g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+".tex",
+                  relPathAsString(),TRUE,g_globals.dynSectionId
+                  );
+            }
+            break;
+            // TODO: support other generators
+          default:
+            err("context.cpp: output format not yet supported");
+            break;
+        }
+        g_globals.dynSectionId++;
+      }
+      return TemplateVariant(result.data(),TRUE);
+    }
+    TemplateVariant hasDetails() const
+    {
+      return m_fileDef->hasDetailedDescription();
+    }
+    TemplateVariant hasSourceFile() const
+    {
       return m_fileDef->generateSourceFile();
     }
     TemplateVariant sources() const
     {
-      if (!m_cache.sources)
+      Cachable &cache = getCache();
+      if (!cache.sources)
       {
         if (m_fileDef->generateSourceFile())
         {
-          m_cache.sources.reset(new TemplateVariant(parseCode(m_fileDef,relPathAsString())));
+          cache.sources.reset(new TemplateVariant(parseCode(m_fileDef,relPathAsString())));
         }
         else
         {
-          m_cache.sources.reset(new TemplateVariant(""));
+          cache.sources.reset(new TemplateVariant(""));
         }
       }
-      return *m_cache.sources;
+      return *cache.sources;
     }
     TemplateVariant version() const
     {
@@ -2603,7 +3132,8 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
     }
     TemplateVariant classes() const
     {
-      if (!m_cache.classes)
+      Cachable &cache = getCache();
+      if (!cache.classes)
       {
         TemplateList *classList = TemplateList::alloc();
         if (m_fileDef->getClassSDict())
@@ -2618,13 +3148,14 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
             }
           }
         }
-        m_cache.classes.reset(classList);
+        cache.classes.reset(classList);
       }
-      return m_cache.classes.get();
+      return cache.classes.get();
     }
     TemplateVariant namespaces() const
     {
-      if (!m_cache.namespaces)
+      Cachable &cache = getCache();
+      if (!cache.namespaces)
       {
         TemplateList *namespaceList = TemplateList::alloc();
         if (m_fileDef->getNamespaceSDict())
@@ -2639,13 +3170,14 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
             }
           }
         }
-        m_cache.namespaces.reset(namespaceList);
+        cache.namespaces.reset(namespaceList);
       }
-      return m_cache.namespaces.get();
+      return cache.namespaces.get();
     }
     TemplateVariant constantgroups() const
     {
-      if (!m_cache.constantgroups)
+      Cachable &cache = getCache();
+      if (!cache.constantgroups)
       {
         TemplateList *namespaceList = TemplateList::alloc();
         if (m_fileDef->getNamespaceSDict())
@@ -2660,9 +3192,9 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
             }
           }
         }
-        m_cache.constantgroups.reset(namespaceList);
+        cache.constantgroups.reset(namespaceList);
       }
-      return m_cache.constantgroups.get();
+      return cache.constantgroups.get();
     }
     TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
                                   MemberListType type,const char *title,bool detailed=FALSE) const
@@ -2672,7 +3204,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
         MemberList *ml = m_fileDef->getMemberList(type);
         if (ml)
         {
-          list.reset(MemberListInfoContext::alloc(m_fileDef,relPathAsString(),ml,title,detailed));
+          list.reset(MemberListInfoContext::alloc(m_fileDef,relPathAsString(),ml,title,""));
         }
       }
       if (list)
@@ -2686,15 +3218,15 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
     }
     TemplateVariant macros() const
     {
-      return getMemberList(m_cache.macros,MemberListType_decDefineMembers,theTranslator->trDefines());
+      return getMemberList(getCache().macros,MemberListType_decDefineMembers,theTranslator->trDefines());
     }
     TemplateVariant typedefs() const
     {
-      return getMemberList(m_cache.typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
+      return getMemberList(getCache().typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
     }
     TemplateVariant enums() const
     {
-      return getMemberList(m_cache.enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
+      return getMemberList(getCache().enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
     }
     TemplateVariant functions() const
     {
@@ -2702,53 +3234,55 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
       SrcLangExt lang = m_fileDef->getLanguage();
       if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
       else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc();
-      return getMemberList(m_cache.functions,MemberListType_decFuncMembers,title);
+      return getMemberList(getCache().functions,MemberListType_decFuncMembers,title);
     }
     TemplateVariant variables() const
     {
-      return getMemberList(m_cache.variables,MemberListType_decVarMembers,theTranslator->trVariables());
+      return getMemberList(getCache().variables,MemberListType_decVarMembers,theTranslator->trVariables());
     }
     TemplateVariant memberGroups() const
     {
-      if (!m_cache.memberGroups)
+      Cachable &cache = getCache();
+      if (!cache.memberGroups)
       {
         if (m_fileDef->getMemberGroupSDict())
         {
-          m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_fileDef,relPathAsString(),m_fileDef->getMemberGroupSDict(),m_fileDef->subGrouping()));
+          cache.memberGroups.reset(MemberGroupListContext::alloc(m_fileDef,relPathAsString(),m_fileDef->getMemberGroupSDict(),m_fileDef->subGrouping()));
         }
         else
         {
-          m_cache.memberGroups.reset(MemberGroupListContext::alloc());
+          cache.memberGroups.reset(MemberGroupListContext::alloc());
         }
       }
-      return m_cache.memberGroups.get();
+      return cache.memberGroups.get();
     }
     TemplateVariant detailedMacros() const
     {
-      return getMemberList(m_cache.detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation());
+      return getMemberList(getCache().detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation());
     }
     TemplateVariant detailedTypedefs() const
     {
-      return getMemberList(m_cache.detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
+      return getMemberList(getCache().detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
     }
     TemplateVariant detailedEnums() const
     {
-      return getMemberList(m_cache.detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
+      return getMemberList(getCache().detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
     }
     TemplateVariant detailedFunctions() const
     {
       QCString title = theTranslator->trFunctionDocumentation();
       SrcLangExt lang = m_fileDef->getLanguage();
       if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation();
-      return getMemberList(m_cache.detailedFunctions,MemberListType_docFuncMembers,title);
+      return getMemberList(getCache().detailedFunctions,MemberListType_docFuncMembers,title);
     }
     TemplateVariant detailedVariables() const
     {
-      return getMemberList(m_cache.detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
+      return getMemberList(getCache().detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
     }
     TemplateVariant inlineClasses() const
     {
-      if (!m_cache.inlineClasses)
+      Cachable &cache = getCache();
+      if (!cache.inlineClasses)
       {
         TemplateList *classList = TemplateList::alloc();
         if (m_fileDef->getClassSDict())
@@ -2766,9 +3300,9 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
             }
           }
         }
-        m_cache.inlineClasses.reset(classList);
+        cache.inlineClasses.reset(classList);
       }
-      return m_cache.inlineClasses.get();
+      return cache.inlineClasses.get();
     }
     TemplateVariant compoundType() const
     {
@@ -2777,8 +3311,9 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
 
   private:
     FileDef *m_fileDef;
-    struct Cachable
+    struct Cachable : public DefinitionContext<FileContext::Private>::Cachable
     {
+      Cachable(FileDef *fd) : DefinitionContext<FileContext::Private>::Cachable(fd) {}
       SharedPtr<IncludeInfoListContext>     includeInfoList;
       ScopedPtr<DotInclDepGraph>            includeGraph;
       ScopedPtr<DotInclDepGraph>            includedByGraph;
@@ -2799,10 +3334,18 @@ class FileContext::Private : public DefinitionContext<FileContext::Private>
       SharedPtr<MemberListInfoContext>      detailedVariables;
       SharedPtr<TemplateList>               inlineClasses;
     };
-    mutable Cachable m_cache;
+    Cachable &getCache() const
+    {
+      Cachable *c = static_cast<Cachable*>(m_fileDef->cookie());
+      assert(c!=0);
+      return *c;
+    }
+    static PropertyMapper<FileContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<FileContext::Private> FileContext::Private::s_inst;
+
 FileContext::FileContext(FileDef *fd) : RefCountedContext("FileContext")
 {
   p = new Private(fd);
@@ -2827,16 +3370,29 @@ 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);
+      static bool init=FALSE;
+      if (!init)
+      {
+        addBaseProperties(s_inst);
+        s_inst.addProperty("title",         &Private::title);
+        s_inst.addProperty("highlight",     &Private::highlight);
+        s_inst.addProperty("subhighlight",  &Private::subHighlight);
+        s_inst.addProperty("dirName",       &Private::dirName);
+        s_inst.addProperty("dirs",          &Private::dirs);
+        s_inst.addProperty("files",         &Private::files);
+        s_inst.addProperty("hasDetails",    &Private::hasDetails);
+        s_inst.addProperty("hasDirGraph",   &Private::hasDirGraph);
+        s_inst.addProperty("dirGraph",      &Private::dirGraph);
+        s_inst.addProperty("compoundType",  &Private::compoundType);
+        init=TRUE;
+      }
+      if (!dd->cookie()) { dd->setCookie(new DirContext::Private::Cachable(dd)); }
     }
     virtual ~Private() {}
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
     TemplateVariant title() const
     {
       return TemplateVariant(m_dirDef->shortTitle());
@@ -2855,26 +3411,27 @@ class DirContext::Private : public DefinitionContext<DirContext::Private>
     }
     TemplateVariant dirs() const
     {
-      if (!m_cache.dirs)
+      Cachable &cache = getCache();
+      if (!cache.dirs)
       {
-        m_cache.dirs.reset(TemplateList::alloc());
+        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);
+          cache.dirs->append(dc);
         }
       }
-      return m_cache.dirs.get();
+      return cache.dirs.get();
     }
     TemplateVariant files() const
     {
-      // FileList *list = m_dirDef->getFiles();
-      if (!m_cache.files)
+      Cachable &cache = getCache();
+      if (!cache.files)
       {
-        m_cache.files.reset(TemplateList::alloc());
+        cache.files.reset(TemplateList::alloc());
         FileList *files = m_dirDef->getFiles();
         if (files)
         {
@@ -2883,11 +3440,11 @@ class DirContext::Private : public DefinitionContext<DirContext::Private>
           for (it.toFirst();(fd=it.current());++it)
           {
             FileContext *fc = FileContext::alloc(fd);
-            m_cache.files->append(fc);
+            cache.files->append(fc);
           }
         }
       }
-      return m_cache.files.get();
+      return cache.files.get();
     }
     TemplateVariant hasDetails() const
     {
@@ -2901,19 +3458,93 @@ class DirContext::Private : public DefinitionContext<DirContext::Private>
     {
       return "";
     }
+    DotDirDeps *getDirDepsGraph() const
+    {
+      Cachable &cache = getCache();
+      if (!cache.dirDepsGraph)
+      {
+        cache.dirDepsGraph.reset(new DotDirDeps(m_dirDef));
+      }
+      return cache.dirDepsGraph.get();
+    }
+    TemplateVariant hasDirGraph() const
+    {
+      bool result=FALSE;
+      static bool haveDot  = Config_getBool("HAVE_DOT");
+      static bool dirGraph = Config_getBool("DIRECTORY_GRAPH");
+      if (haveDot && dirGraph)
+      {
+        DotDirDeps *graph = getDirDepsGraph();
+        result = !graph->isTrivial();
+      }
+      return result;
+    }
+    TemplateVariant dirGraph() const
+    {
+      QGString result;
+      static bool haveDot  = Config_getBool("HAVE_DOT");
+      static bool dirGraph = Config_getBool("DIRECTORY_GRAPH");
+      if (haveDot && dirGraph)
+      {
+        DotDirDeps *graph = getDirDepsGraph();
+        FTextStream t(&result);
+        switch (g_globals.outputFormat)
+        {
+          case ContextOutputFormat_Html:
+            {
+              graph->writeGraph(t,GOF_BITMAP,
+                                EOF_Html,
+                                g_globals.outputDir,
+                                g_globals.outputDir+portable_pathSeparator()+m_dirDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+                                relPathAsString(),
+                                TRUE,
+                                g_globals.dynSectionId,
+                                FALSE);
+            }
+            break;
+          case ContextOutputFormat_Latex:
+            {
+              graph->writeGraph(t,GOF_EPS,
+                                EOF_LaTeX,
+                                g_globals.outputDir,
+                                g_globals.outputDir+portable_pathSeparator()+m_dirDef->getOutputFileBase()+".tex",
+                                relPathAsString(),
+                                TRUE,
+                                g_globals.dynSectionId,
+                                FALSE);
+            }
+            break;
+            // TODO: support other generators
+          default:
+            err("context.cpp: output format not yet supported");
+            break;
+        }
+        g_globals.dynSectionId++;
+      }
+      return TemplateVariant(result.data(),TRUE);
+    }
 
   private:
     DirDef *m_dirDef;
-    struct Cachable
+    struct Cachable : public DefinitionContext<DirContext::Private>::Cachable
     {
-      Cachable() {}
+      Cachable(DirDef *dd) : DefinitionContext<DirContext::Private>::Cachable(dd) {}
       SharedPtr<TemplateList>  dirs;
       SharedPtr<TemplateList>  files;
+      ScopedPtr<DotDirDeps>    dirDepsGraph;
     };
-    mutable Cachable m_cache;
+    Cachable &getCache() const
+    {
+      Cachable *c = static_cast<Cachable*>(m_dirDef->cookie());
+      assert(c!=0);
+      return *c;
+    }
+    static PropertyMapper<DirContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<DirContext::Private> DirContext::Private::s_inst;
+
 DirContext::DirContext(DirDef *fd) : RefCountedContext("DirContext")
 {
   p = new Private(fd);
@@ -2936,14 +3567,27 @@ TemplateVariant DirContext::get(const char *n) const
 class PageContext::Private : public DefinitionContext<PageContext::Private>
 {
   public:
-    Private(PageDef *pd,bool isMainPage)
-      : DefinitionContext<PageContext::Private>(pd) , m_pageDef(pd), m_isMainPage(isMainPage)
+    Private(PageDef *pd,bool isMainPage,bool isExample)
+      : DefinitionContext<PageContext::Private>(pd) , m_pageDef(pd), m_isMainPage(isMainPage),
+        m_isExample(isExample)
     {
-      addProperty("title",this,&Private::title);
-      addProperty("highlight",this,&Private::highlight);
-      addProperty("subhighlight",this,&Private::subHighlight);
+      static bool init=FALSE;
+      if (!init)
+      {
+        addBaseProperties(s_inst);
+        s_inst.addProperty("title",       &Private::title);
+        s_inst.addProperty("highlight",   &Private::highlight);
+        s_inst.addProperty("subhighlight",&Private::subHighlight);
+        s_inst.addProperty("example",     &Private::example);
+        init=TRUE;
+      }
+      if (!pd->cookie()) { pd->setCookie(new PageContext::Private::Cachable(pd)); }
     }
     virtual ~Private() {}
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
     TemplateVariant title() const
     {
       if (m_isMainPage)
@@ -2957,6 +3601,10 @@ class PageContext::Private : public DefinitionContext<PageContext::Private>
           return theTranslator->trMainPage();
         }
       }
+      else if (m_isExample)
+      {
+        return m_pageDef->name();
+      }
       else
       {
         return m_pageDef->title();
@@ -2988,15 +3636,51 @@ class PageContext::Private : public DefinitionContext<PageContext::Private>
     {
       return "";
     }
+    TemplateVariant example() const
+    {
+      if (m_isExample)
+      {
+        Cachable &cache = getCache();
+        if (!cache.example || g_globals.outputFormat!=cache.exampleOutputFormat)
+        {
+          cache.example.reset(new TemplateVariant(
+                parseDoc(m_pageDef,m_pageDef->docFile(),m_pageDef->docLine(),
+                  relPathAsString(),"\\include "+m_pageDef->name(),FALSE)));
+          cache.exampleOutputFormat = g_globals.outputFormat;
+        }
+        return *cache.example;
+      }
+      else
+      {
+        return TemplateVariant("");
+      }
+    }
   private:
     PageDef *m_pageDef;
+    struct Cachable : public DefinitionContext<PageContext::Private>::Cachable
+    {
+      Cachable(PageDef *pd) : DefinitionContext<PageContext::Private>::Cachable(pd),
+                              exampleOutputFormat(ContextOutputFormat_Unspecified) { }
+      ScopedPtr<TemplateVariant> example;
+      ContextOutputFormat        exampleOutputFormat;
+    };
+    Cachable &getCache() const
+    {
+      Cachable *c = static_cast<Cachable*>(m_pageDef->cookie());
+      assert(c!=0);
+      return *c;
+    }
     bool m_isMainPage;
+    bool m_isExample;
+    static PropertyMapper<PageContext::Private> s_inst;
 };
 //%% }
 
-PageContext::PageContext(PageDef *pd,bool isMainPage) : RefCountedContext("PageContext")
+PropertyMapper<PageContext::Private> PageContext::Private::s_inst;
+
+PageContext::PageContext(PageDef *pd,bool isMainPage,bool isExample) : RefCountedContext("PageContext")
 {
-  p = new Private(pd,isMainPage);
+  p = new Private(pd,isMainPage,isExample);
 }
 
 PageContext::~PageContext()
@@ -3019,7 +3703,6 @@ class TextGeneratorHtml : public TextGeneratorIntf
     void writeString(const char *s,bool keepSpaces) const
     {
       if (s==0) return;
-      //printf("TextGeneratorOlImpl::writeString('%s',%d)\n",s,keepSpaces);
       if (keepSpaces)
       {
         const char *p=s;
@@ -3079,6 +3762,54 @@ class TextGeneratorHtml : public TextGeneratorIntf
     QCString m_relPath;
 };
 
+//------------------------------------------------------------------------
+
+class TextGeneratorLatex : public TextGeneratorIntf
+{
+  public:
+    TextGeneratorLatex(FTextStream &ts) : m_ts(ts) {}
+    void writeString(const char *s,bool keepSpaces) const
+    {
+      if (s==0) return;
+      m_ts << convertToLaTeX(s,FALSE,keepSpaces);
+    }
+    void writeBreak(int indent) const
+    {
+      m_ts << "\\\\*\n";
+      for (int i=0;i<indent;i++)
+      {
+        m_ts << "~";
+      }
+    }
+    void writeLink(const char *ref,const char *f,
+                   const char *anchor,const char *text
+                  ) const
+    {
+      static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+      if (!ref && pdfHyperlinks)
+      {
+        m_ts << "\\hyperlink{";
+        if (f) m_ts << stripPath(f);
+        if (f && anchor) m_ts << "_";
+        if (anchor) m_ts << anchor;
+        m_ts << "}{";
+        filterLatexString(m_ts,text);
+        m_ts << "}";
+      }
+      else
+      {
+        m_ts << "{\\bf ";
+        filterLatexString(m_ts,text);
+        m_ts << "}";
+      }
+    }
+
+  private:
+    FTextStream &m_ts;
+};
+
+//------------------------------------------------------------------------
+
 class TextGeneratorFactory
 {
   public:
@@ -3092,9 +3823,10 @@ class TextGeneratorFactory
     {
       switch (g_globals.outputFormat)
       {
-        case ContextGlobals::Html:
+        case ContextOutputFormat_Html:
           return new TextGeneratorHtml(ts,relPath);
-          break;
+        case ContextOutputFormat_Latex:
+          return new TextGeneratorLatex(ts);
         default:
           break;
       }
@@ -3113,6 +3845,7 @@ TemplateVariant createLinkedText(Definition *def,const QCString &relPath,const Q
   if (tg)
   {
     linkifyText(*tg,def->getOuterScope(),def->getBodyDef(),def,text);
+    delete tg;
     return TemplateVariant(s.data(),TRUE);
   }
   else
@@ -3128,147 +3861,184 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
   public:
     Private(MemberDef *md) : DefinitionContext<MemberContext::Private>(md) , m_memberDef(md)
     {
-      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("isPrivateGettable",   this,&Private::isPrivateGettable);
-      addProperty("isProtectedGettable", this,&Private::isProtectedGettable);
-      addProperty("isSettable",          this,&Private::isSettable);
-      addProperty("isPrivateSettable",   this,&Private::isPrivateSettable);
-      addProperty("isProtectedSettable", this,&Private::isProtectedSettable);
-      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("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("hasDetails",          this,&Private::hasDetails);
-      addProperty("exception",           this,&Private::exception);
-      addProperty("bitfields",           this,&Private::bitfields);
-      addProperty("initializer",         this,&Private::initializer);
-      addProperty("initializerAsCode",   this,&Private::initializerAsCode);
-      addProperty("hasOneLineInitializer",   this,&Private::hasOneLineInitializer);
-      addProperty("hasMultiLineInitializer", this,&Private::hasMultiLineInitializer);
-      addProperty("templateArgs",        this,&Private::templateArgs);
-      addProperty("templateAlias",       this,&Private::templateAlias);
-      addProperty("propertyAttrs",       this,&Private::propertyAttrs);
-      addProperty("eventAttrs",          this,&Private::eventAttrs);
-      addProperty("class",               this,&Private::getClass);
-      addProperty("file",                this,&Private::getFile);
-      addProperty("namespace",           this,&Private::getNamespace);
-      addProperty("definition",          this,&Private::definition);
-      addProperty("parameters",          this,&Private::parameters);
-      addProperty("hasParameterList",    this,&Private::hasParameterList);
-      addProperty("hasConstQualifier",   this,&Private::hasConstQualifier);
-      addProperty("hasVolatileQualifier",this,&Private::hasVolatileQualifier);
-      addProperty("trailingReturnType",  this,&Private::trailingReturnType);
-      addProperty("extraTypeChars",      this,&Private::extraTypeChars);
-      addProperty("templateDecls",       this,&Private::templateDecls);
-      addProperty("labels",              this,&Private::labels);
-      addProperty("enumBaseType",        this,&Private::enumBaseType);
-      addProperty("enumValues",          this,&Private::enumValues);
-      addProperty("paramDocs",           this,&Private::paramDocs);
-      addProperty("reimplements",        this,&Private::reimplements);
-      addProperty("implements",          this,&Private::implements);
-      addProperty("reimplementedBy",     this,&Private::reimplementedBy);
-      addProperty("implementedBy",       this,&Private::implementedBy);
-      addProperty("examples",            this,&Private::examples);
-      addProperty("typeConstraints",     this,&Private::typeConstraints);
-      addProperty("functionQualifier",   this,&Private::functionQualifier);
-      addProperty("sourceRefs",          this,&Private::sourceRefs);
-      addProperty("sourceRefBys",        this,&Private::sourceRefBys);
-      addProperty("hasSources",          this,&Private::hasSources);
-      addProperty("sourceCode",          this,&Private::sourceCode);
-      addProperty("hasCallGraph",        this,&Private::hasCallGraph);
-      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());
+      static bool init=FALSE;
+      if (!init)
+      {
+        addBaseProperties(s_inst);
+        s_inst.addProperty("isSignal",            &Private::isSignal);
+        s_inst.addProperty("isSlot",              &Private::isSlot);
+        s_inst.addProperty("isVariable",          &Private::isVariable);
+        s_inst.addProperty("isEnumeration",       &Private::isEnumeration);
+        s_inst.addProperty("isEnumValue",         &Private::isEnumValue);
+        s_inst.addProperty("isTypedef",           &Private::isTypedef);
+        s_inst.addProperty("isFunction",          &Private::isFunction);
+        s_inst.addProperty("isFunctionPtr",       &Private::isFunctionPtr);
+        s_inst.addProperty("isDefine",            &Private::isDefine);
+        s_inst.addProperty("isFriend",            &Private::isFriend);
+        s_inst.addProperty("isProperty",          &Private::isProperty);
+        s_inst.addProperty("isEvent",             &Private::isEvent);
+        s_inst.addProperty("isRelated",           &Private::isRelated);
+        s_inst.addProperty("isForeign",           &Private::isForeign);
+        s_inst.addProperty("isStatic",            &Private::isStatic);
+        s_inst.addProperty("isInline",            &Private::isInline);
+        s_inst.addProperty("isExplicit",          &Private::isExplicit);
+        s_inst.addProperty("isMutable",           &Private::isMutable);
+        s_inst.addProperty("isGettable",          &Private::isGettable);
+        s_inst.addProperty("isPrivateGettable",   &Private::isPrivateGettable);
+        s_inst.addProperty("isProtectedGettable", &Private::isProtectedGettable);
+        s_inst.addProperty("isSettable",          &Private::isSettable);
+        s_inst.addProperty("isPrivateSettable",   &Private::isPrivateSettable);
+        s_inst.addProperty("isProtectedSettable", &Private::isProtectedSettable);
+        s_inst.addProperty("isReadable",          &Private::isReadable);
+        s_inst.addProperty("isWritable",          &Private::isWritable);
+        s_inst.addProperty("isAddable",           &Private::isAddable);
+        s_inst.addProperty("isRemovable",         &Private::isRemovable);
+        s_inst.addProperty("isRaisable",          &Private::isRaisable);
+        s_inst.addProperty("isFinal",             &Private::isFinal);
+        s_inst.addProperty("isAbstract",          &Private::isAbstract);
+        s_inst.addProperty("isOverride",          &Private::isOverride);
+        s_inst.addProperty("isInitonly",          &Private::isInitonly);
+        s_inst.addProperty("isOptional",          &Private::isOptional);
+        s_inst.addProperty("isRequired",          &Private::isRequired);
+        s_inst.addProperty("isNonAtomic",         &Private::isNonAtomic);
+        s_inst.addProperty("isCopy",              &Private::isCopy);
+        s_inst.addProperty("isAssign",            &Private::isAssign);
+        s_inst.addProperty("isRetain",            &Private::isRetain);
+        s_inst.addProperty("isWeak",              &Private::isWeak);
+        s_inst.addProperty("isStrong",            &Private::isStrong);
+        s_inst.addProperty("isUnretained",        &Private::isUnretained);
+        s_inst.addProperty("isNew",               &Private::isNew);
+        s_inst.addProperty("isSealed",            &Private::isSealed);
+        s_inst.addProperty("isImplementation",    &Private::isImplementation);
+        s_inst.addProperty("isExternal",          &Private::isExternal);
+        s_inst.addProperty("isAlias",             &Private::isAlias);
+        s_inst.addProperty("isDefault",           &Private::isDefault);
+        s_inst.addProperty("isDelete",            &Private::isDelete);
+        s_inst.addProperty("isNoExcept",          &Private::isNoExcept);
+        s_inst.addProperty("isAttribute",         &Private::isAttribute);
+        s_inst.addProperty("isUNOProperty",       &Private::isUNOProperty);
+        s_inst.addProperty("isReadonly",          &Private::isReadonly);
+        s_inst.addProperty("isBound",             &Private::isBound);
+        s_inst.addProperty("isConstrained",       &Private::isConstrained);
+        s_inst.addProperty("isTransient",         &Private::isTransient);
+        s_inst.addProperty("isMaybeVoid",         &Private::isMaybeVoid);
+        s_inst.addProperty("isMaybeDefault",      &Private::isMaybeDefault);
+        s_inst.addProperty("isMaybeAmbiguous",    &Private::isMaybeAmbiguous);
+        s_inst.addProperty("isPublished",         &Private::isPublished);
+        s_inst.addProperty("isTemplateSpecialization",&Private::isTemplateSpecialization);
+        s_inst.addProperty("isObjCMethod",        &Private::isObjCMethod);
+        s_inst.addProperty("isObjCProperty",      &Private::isObjCProperty);
+        s_inst.addProperty("isAnonymous",         &Private::isAnonymous);
+        s_inst.addProperty("hasParameters",       &Private::hasParameters);
+        s_inst.addProperty("declType",            &Private::declType);
+        s_inst.addProperty("declArgs",            &Private::declArgs);
+        s_inst.addProperty("anonymousType",       &Private::anonymousType);
+        s_inst.addProperty("anonymousMember",     &Private::anonymousMember);
+        s_inst.addProperty("hasDetails",          &Private::hasDetails);
+        s_inst.addProperty("exception",           &Private::exception);
+        s_inst.addProperty("bitfields",           &Private::bitfields);
+        s_inst.addProperty("initializer",         &Private::initializer);
+        s_inst.addProperty("initializerAsCode",   &Private::initializerAsCode);
+        s_inst.addProperty("hasOneLineInitializer",   &Private::hasOneLineInitializer);
+        s_inst.addProperty("hasMultiLineInitializer", &Private::hasMultiLineInitializer);
+        s_inst.addProperty("templateArgs",        &Private::templateArgs);
+        s_inst.addProperty("templateAlias",       &Private::templateAlias);
+        s_inst.addProperty("propertyAttrs",       &Private::propertyAttrs);
+        s_inst.addProperty("eventAttrs",          &Private::eventAttrs);
+        s_inst.addProperty("category",            &Private::category);
+        s_inst.addProperty("categoryRelation",    &Private::categoryRelation);
+        s_inst.addProperty("class",               &Private::getClass);
+        s_inst.addProperty("file",                &Private::getFile);
+        s_inst.addProperty("namespace",           &Private::getNamespace);
+        s_inst.addProperty("definition",          &Private::definition);
+        s_inst.addProperty("parameters",          &Private::parameters);
+        s_inst.addProperty("hasConstQualifier",   &Private::hasConstQualifier);
+        s_inst.addProperty("hasVolatileQualifier",&Private::hasVolatileQualifier);
+        s_inst.addProperty("trailingReturnType",  &Private::trailingReturnType);
+        s_inst.addProperty("extraTypeChars",      &Private::extraTypeChars);
+        s_inst.addProperty("templateDecls",       &Private::templateDecls);
+        s_inst.addProperty("labels",              &Private::labels);
+        s_inst.addProperty("enumBaseType",        &Private::enumBaseType);
+        s_inst.addProperty("enumValues",          &Private::enumValues);
+        s_inst.addProperty("paramDocs",           &Private::paramDocs);
+        s_inst.addProperty("reimplements",        &Private::reimplements);
+        s_inst.addProperty("implements",          &Private::implements);
+        s_inst.addProperty("reimplementedBy",     &Private::reimplementedBy);
+        s_inst.addProperty("implementedBy",       &Private::implementedBy);
+        s_inst.addProperty("examples",            &Private::examples);
+        s_inst.addProperty("typeConstraints",     &Private::typeConstraints);
+        s_inst.addProperty("functionQualifier",   &Private::functionQualifier);
+        s_inst.addProperty("sourceRefs",          &Private::sourceRefs);
+        s_inst.addProperty("sourceRefBys",        &Private::sourceRefBys);
+        s_inst.addProperty("hasSources",          &Private::hasSources);
+        s_inst.addProperty("sourceCode",          &Private::sourceCode);
+        s_inst.addProperty("hasCallGraph",        &Private::hasCallGraph);
+        s_inst.addProperty("callGraph",           &Private::callGraph);
+        s_inst.addProperty("hasCallerGraph",      &Private::hasCallerGraph);
+        s_inst.addProperty("callerGraph",         &Private::callerGraph);
+        s_inst.addProperty("fieldType",           &Private::fieldType);
+        s_inst.addProperty("type",                &Private::type);
+        s_inst.addProperty("detailsVisibleFor",   &Private::detailsVisibleFor);
+        s_inst.addProperty("nameWithContextFor",  &Private::nameWithContextFor);
+        init=TRUE;
+      }
+      if (!md->cookie()) { md->setCookie(new MemberContext::Private::Cachable(md)); }
+
+      Cachable &cache = getCache();
+      cache.propertyAttrs.reset(TemplateList::alloc());
       if (md && md->isProperty())
       {
-        if (md->isGettable())           m_cache.propertyAttrs->append("get");
-        if (md->isPrivateGettable())    m_cache.propertyAttrs->append("private get");
-        if (md->isProtectedGettable())  m_cache.propertyAttrs->append("protected get");
-        if (md->isSettable())           m_cache.propertyAttrs->append("set");
-        if (md->isPrivateSettable())    m_cache.propertyAttrs->append("private set");
-        if (md->isProtectedSettable())  m_cache.propertyAttrs->append("protected set");
+        if (md->isGettable())           cache.propertyAttrs->append("get");
+        if (md->isPrivateGettable())    cache.propertyAttrs->append("private get");
+        if (md->isProtectedGettable())  cache.propertyAttrs->append("protected get");
+        if (md->isSettable())           cache.propertyAttrs->append("set");
+        if (md->isPrivateSettable())    cache.propertyAttrs->append("private set");
+        if (md->isProtectedSettable())  cache.propertyAttrs->append("protected set");
       }
-      m_cache.eventAttrs.reset(TemplateList::alloc());
+      cache.eventAttrs.reset(TemplateList::alloc());
       if (md && md->isEvent())
       {
-        if (md->isAddable())   m_cache.eventAttrs->append("add");
-        if (md->isRemovable()) m_cache.eventAttrs->append("remove");
-        if (md->isRaisable())  m_cache.eventAttrs->append("raise");
+        if (md->isAddable())   cache.eventAttrs->append("add");
+        if (md->isRemovable()) cache.eventAttrs->append("remove");
+        if (md->isRaisable())  cache.eventAttrs->append("raise");
       }
     }
     virtual ~Private() {}
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
     TemplateVariant fieldType() const
     {
       return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->fieldType());
     }
     TemplateVariant declType() const
     {
-      return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->getDeclType());
+      Cachable &cache = getCache();
+      if (!cache.declTypeParsed)
+      {
+        cache.declType=createLinkedText(m_memberDef,relPathAsString(),m_memberDef->getDeclType());
+        cache.declTypeParsed = TRUE;
+        return cache.declType;
+      }
+      else
+      {
+        return cache.declType;
+      }
     }
     TemplateVariant declArgs() const
     {
-      return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->argsString());
+      Cachable &cache = getCache();
+      if (!cache.declArgsParsed)
+      {
+        cache.declArgs=createLinkedText(m_memberDef,relPathAsString(),m_memberDef->argsString());
+        cache.declArgsParsed = TRUE;
+        return cache.declArgs;
+      }
+      else
+      {
+        return cache.declArgs;
+      }
     }
     TemplateVariant exception() const
     {
@@ -3532,7 +4302,8 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     TemplateVariant initializerAsCode() const
     {
-      if (!m_cache.initializerParsed)
+      Cachable &cache = getCache();
+      if (!cache.initializerParsed)
       {
         QCString scopeName;
         if (m_memberDef->getClassDef())
@@ -3543,11 +4314,11 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
         {
           scopeName = m_memberDef->getNamespaceDef()->name();
         }
-        m_cache.initializer = parseCode(m_memberDef,scopeName,relPathAsString(),
+        cache.initializer = parseCode(m_memberDef,scopeName,relPathAsString(),
                                         m_memberDef->initializer());
-        m_cache.initializerParsed = TRUE;
+        cache.initializerParsed = TRUE;
       }
-      return m_cache.initializer;
+      return cache.initializer;
     }
     TemplateVariant isDefine() const
     {
@@ -3560,17 +4331,18 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     TemplateVariant anonymousType() const
     {
-      if (!m_cache.anonymousType)
+      Cachable &cache = getCache();
+      if (!cache.anonymousType)
       {
         ClassDef *cd = m_memberDef->getClassDefOfAnonymousType();
         if (cd)
         {
-          m_cache.anonymousType.reset(ClassContext::alloc(cd));
+          cache.anonymousType.reset(ClassContext::alloc(cd));
         }
       }
-      if (m_cache.anonymousType)
+      if (cache.anonymousType)
       {
-        return m_cache.anonymousType.get();
+        return cache.anonymousType.get();
       }
       else
       {
@@ -3579,17 +4351,18 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     TemplateVariant anonymousMember() const
     {
-      if (!m_cache.anonymousMember)
+      Cachable &cache = getCache();
+      if (!cache.anonymousMember)
       {
         MemberDef *md = m_memberDef->fromAnonymousMember();
         if (md)
         {
-          m_cache.anonymousMember.reset(MemberContext::alloc(md));
+          cache.anonymousMember.reset(MemberContext::alloc(md));
         }
       }
-      if (m_cache.anonymousMember)
+      if (cache.anonymousMember)
       {
-        return m_cache.anonymousMember.get();
+        return cache.anonymousMember.get();
       }
       else
       {
@@ -3614,29 +4387,31 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     TemplateVariant enumValues() const
     {
-      if (!m_cache.enumValues)
+      Cachable &cache = getCache();
+      if (!cache.enumValues)
       {
         MemberList *ml = m_memberDef->enumFieldList();
         if (ml)
         {
-          m_cache.enumValues.reset(MemberListContext::alloc(ml));
+          cache.enumValues.reset(MemberListContext::alloc(ml));
         }
         else
         {
-          m_cache.enumValues.reset(MemberListContext::alloc());
+          cache.enumValues.reset(MemberListContext::alloc());
         }
       }
-      return m_cache.enumValues.get();
+      return cache.enumValues.get();
     }
     TemplateVariant templateArgs() const
     {
-      if (!m_cache.templateArgs && m_memberDef->templateArguments())
+      Cachable &cache = getCache();
+      if (!cache.templateArgs && m_memberDef->templateArguments())
       {
-        m_cache.templateArgs.reset(ArgumentListContext::alloc(m_memberDef->templateArguments(),m_memberDef,relPathAsString()));
+        cache.templateArgs.reset(ArgumentListContext::alloc(m_memberDef->templateArguments(),m_memberDef,relPathAsString()));
       }
-      if (m_cache.templateArgs)
+      if (cache.templateArgs)
       {
-        return m_cache.templateArgs.get();
+        return cache.templateArgs.get();
       }
       else
       {
@@ -3654,21 +4429,54 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     TemplateVariant propertyAttrs() const
     {
-      return m_cache.propertyAttrs.get();
+      return getCache().propertyAttrs.get();
     }
     TemplateVariant eventAttrs() const
     {
-      return m_cache.eventAttrs.get();
+      return getCache().eventAttrs.get();
     }
     TemplateVariant getClass() const
     {
-      if (!m_cache.classDef && m_memberDef->getClassDef())
+      Cachable &cache = getCache();
+      if (!cache.classDef && m_memberDef->getClassDef())
+      {
+        cache.classDef.reset(ClassContext::alloc(m_memberDef->getClassDef()));
+      }
+      if (cache.classDef)
+      {
+        return cache.classDef.get();
+      }
+      else
+      {
+        return TemplateVariant(FALSE);
+      }
+    }
+    TemplateVariant category() const
+    {
+      Cachable &cache = getCache();
+      if (!cache.category && m_memberDef->category())
+      {
+        cache.category.reset(ClassContext::alloc(m_memberDef->category()));
+      }
+      if (cache.category)
+      {
+        return cache.category.get();
+      }
+      else
+      {
+        return TemplateVariant(FALSE);
+      }
+    }
+    TemplateVariant categoryRelation() const
+    {
+      Cachable &cache = getCache();
+      if (!cache.categoryRelation && m_memberDef->categoryRelation())
       {
-        m_cache.classDef.reset(ClassContext::alloc(m_memberDef->getClassDef()));
+        cache.categoryRelation.reset(MemberContext::alloc(m_memberDef->categoryRelation()));
       }
-      if (m_cache.classDef)
+      if (cache.categoryRelation)
       {
-        return m_cache.classDef.get();
+        return cache.categoryRelation.get();
       }
       else
       {
@@ -3677,13 +4485,14 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     TemplateVariant getFile() const
     {
-      if (!m_cache.fileDef && m_memberDef->getFileDef())
+      Cachable &cache = getCache();
+      if (!cache.fileDef && m_memberDef->getFileDef())
       {
-        m_cache.fileDef.reset(FileContext::alloc(m_memberDef->getFileDef()));
+        cache.fileDef.reset(FileContext::alloc(m_memberDef->getFileDef()));
       }
-      if (m_cache.fileDef)
+      if (cache.fileDef)
       {
-        return m_cache.fileDef.get();
+        return cache.fileDef.get();
       }
       else
       {
@@ -3692,13 +4501,14 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     TemplateVariant getNamespace() const
     {
-      if (!m_cache.namespaceDef && m_memberDef->getNamespaceDef())
+      Cachable &cache = getCache();
+      if (!cache.namespaceDef && m_memberDef->getNamespaceDef())
       {
-        m_cache.namespaceDef.reset(NamespaceContext::alloc(m_memberDef->getNamespaceDef()));
+        cache.namespaceDef.reset(NamespaceContext::alloc(m_memberDef->getNamespaceDef()));
       }
-      if (m_cache.namespaceDef)
+      if (cache.namespaceDef)
       {
-        return m_cache.namespaceDef.get();
+        return cache.namespaceDef.get();
       }
       else
       {
@@ -3717,21 +4527,22 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     TemplateVariant parameters() const
     {
-      if (!m_cache.arguments)
+      Cachable &cache = getCache();
+      if (!cache.arguments)
       {
         ArgumentList *defArgList = getDefArgList();
         if (defArgList && !m_memberDef->isProperty())
         {
-          m_cache.arguments.reset(ArgumentListContext::alloc(defArgList,m_memberDef,relPathAsString()));
+          cache.arguments.reset(ArgumentListContext::alloc(defArgList,m_memberDef,relPathAsString()));
         }
         else
         {
-          m_cache.arguments.reset(ArgumentListContext::alloc());
+          cache.arguments.reset(ArgumentListContext::alloc());
         }
       }
-      return m_cache.arguments.get();
+      return cache.arguments.get();
     }
-    TemplateVariant hasParameterList() const
+    TemplateVariant hasParameters() const
     {
       return getDefArgList()!=0;
     }
@@ -3806,17 +4617,19 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     TemplateVariant templateDecls() const
     {
-      if (!m_cache.templateDecls)
+      Cachable &cache = getCache();
+      if (!cache.templateDecls)
       {
         TemplateList *tl = TemplateList::alloc();
         addTemplateDecls(tl);
-        m_cache.templateDecls.reset(tl);
+        cache.templateDecls.reset(tl);
       }
-      return m_cache.templateDecls.get();
+      return cache.templateDecls.get();
     }
     TemplateVariant labels() const
     {
-      if (!m_cache.labels)
+      Cachable &cache = getCache();
+      if (!cache.labels)
       {
         QStrList sl;
         m_memberDef->getLabels(sl,m_memberDef->getOuterScope());
@@ -3829,13 +4642,14 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
             tl->append(*it);
           }
         }
-        m_cache.labels.reset(tl);
+        cache.labels.reset(tl);
       }
-      return m_cache.labels.get();
+      return cache.labels.get();
     }
     TemplateVariant paramDocs() const
     {
-      if (!m_cache.paramDocs)
+      Cachable &cache = getCache();
+      if (!cache.paramDocs)
       {
         if (m_memberDef->argumentList() && m_memberDef->argumentList()->hasDocumentation())
         {
@@ -3851,59 +4665,62 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
               paramDocs+="@param"+direction+" "+a->name+" "+a->docs;
             }
           }
-          m_cache.paramDocs.reset(new TemplateVariant(parseDoc(m_memberDef,
+          cache.paramDocs.reset(new TemplateVariant(parseDoc(m_memberDef,
                                            m_memberDef->docFile(),m_memberDef->docLine(),
                                            relPathAsString(),paramDocs,FALSE)));
         }
         else
         {
-          m_cache.paramDocs.reset(new TemplateVariant(""));
+          cache.paramDocs.reset(new TemplateVariant(""));
         }
       }
-      return *m_cache.paramDocs;
+      return *cache.paramDocs;
     }
     TemplateVariant implements() const
     {
-      if (!m_cache.implements)
+      Cachable &cache = getCache();
+      if (!cache.implements)
       {
         MemberDef *md = m_memberDef->reimplements();
-        m_cache.implements.reset(TemplateList::alloc());
+        cache.implements.reset(TemplateList::alloc());
         if (md)
         {
           ClassDef *cd = md->getClassDef();
           if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
           {
             MemberContext *mc = MemberContext::alloc(md);
-            m_cache.implements->append(mc);
+            cache.implements->append(mc);
           }
         }
       }
-      return m_cache.implements.get();
+      return cache.implements.get();
     }
     TemplateVariant reimplements() const
     {
-      if (!m_cache.reimplements)
+      Cachable &cache = getCache();
+      if (!cache.reimplements)
       {
         MemberDef *md = m_memberDef->reimplements();
-        m_cache.reimplements.reset(TemplateList::alloc());
+        cache.reimplements.reset(TemplateList::alloc());
         if (md)
         {
           ClassDef *cd = md->getClassDef();
           if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
           {
             MemberContext *mc = MemberContext::alloc(md);
-            m_cache.reimplements->append(mc);
+            cache.reimplements->append(mc);
           }
         }
       }
-      return m_cache.reimplements.get();
+      return cache.reimplements.get();
     }
     TemplateVariant implementedBy() const
     {
-      if (!m_cache.implementedBy)
+      Cachable &cache = getCache();
+      if (!cache.implementedBy)
       {
         MemberList *ml = m_memberDef->reimplementedBy();
-        m_cache.implementedBy.reset(TemplateList::alloc());
+        cache.implementedBy.reset(TemplateList::alloc());
         if (ml)
         {
           MemberListIterator mli(*ml);
@@ -3914,18 +4731,19 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
             if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
             {
               MemberContext *mc = new MemberContext(md);
-              m_cache.implementedBy->append(mc);
+              cache.implementedBy->append(mc);
             }
           }
         }
       }
-      return m_cache.implementedBy.get();
+      return cache.implementedBy.get();
     }
     TemplateVariant reimplementedBy() const
     {
-      if (!m_cache.reimplementedBy)
+      Cachable &cache = getCache();
+      if (!cache.reimplementedBy)
       {
-        m_cache.reimplementedBy.reset(TemplateList::alloc());
+        cache.reimplementedBy.reset(TemplateList::alloc());
         MemberList *ml = m_memberDef->reimplementedBy();
         if (ml)
         {
@@ -3937,12 +4755,12 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
             if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
             {
               MemberContext *mc = new MemberContext(md);
-              m_cache.reimplementedBy->append(mc);
+              cache.reimplementedBy->append(mc);
             }
           }
         }
       }
-      return m_cache.reimplementedBy.get();
+      return cache.reimplementedBy.get();
     }
     void addExamples(TemplateList *list) const
     {
@@ -3957,31 +4775,35 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
           s->set("isLinkable",TRUE);
           s->set("anchor",ex->anchor);
           s->set("fileName",ex->file);
+          s->set("isReference",FALSE);
+          s->set("externalReference","");
           list->append(s);
         }
       }
     }
     TemplateVariant examples() const
     {
-      if (!m_cache.examples)
+      Cachable &cache = getCache();
+      if (!cache.examples)
       {
         TemplateList *exampleList = TemplateList::alloc();
         addExamples(exampleList);
-        m_cache.examples.reset(exampleList);
+        cache.examples.reset(exampleList);
       }
-      return m_cache.examples.get();
+      return cache.examples.get();
     }
     TemplateVariant typeConstraints() const
     {
-      if (!m_cache.typeConstraints && m_memberDef->typeConstraints())
+      Cachable &cache = getCache();
+      if (!cache.typeConstraints && m_memberDef->typeConstraints())
       {
-        m_cache.typeConstraints.reset(ArgumentListContext::alloc(m_memberDef->typeConstraints(),m_memberDef,relPathAsString()));
+        cache.typeConstraints.reset(ArgumentListContext::alloc(m_memberDef->typeConstraints(),m_memberDef,relPathAsString()));
       }
       else
       {
-        m_cache.typeConstraints.reset(ArgumentListContext::alloc());
+        cache.typeConstraints.reset(ArgumentListContext::alloc());
       }
-      return m_cache.typeConstraints.get();
+      return cache.typeConstraints.get();
     }
     TemplateVariant functionQualifier() const
     {
@@ -4000,19 +4822,21 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     TemplateVariant sourceRefs() const
     {
-      if (!m_cache.sourceRefs)
+      Cachable &cache = getCache();
+      if (!cache.sourceRefs)
       {
-        m_cache.sourceRefs.reset(MemberListContext::alloc(m_memberDef->getReferencesMembers(),TRUE));
+        cache.sourceRefs.reset(MemberListContext::alloc(m_memberDef->getReferencesMembers(),TRUE));
       }
-      return m_cache.sourceRefs.get();
+      return cache.sourceRefs.get();
     }
     TemplateVariant sourceRefBys() const
     {
-      if (!m_cache.sourceRefBys)
+      Cachable &cache = getCache();
+      if (!cache.sourceRefBys)
       {
-        m_cache.sourceRefBys.reset(MemberListContext::alloc(m_memberDef->getReferencedByMembers(),TRUE));
+        cache.sourceRefBys.reset(MemberListContext::alloc(m_memberDef->getReferencedByMembers(),TRUE));
       }
-      return m_cache.sourceRefBys.get();
+      return cache.sourceRefBys.get();
     }
     TemplateVariant hasSources() const
     {
@@ -4020,7 +4844,8 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     TemplateVariant sourceCode() const
     {
-      if (!m_cache.sourceCodeParsed)
+      Cachable &cache = getCache();
+      if (!cache.sourceCodeParsed)
       {
         QCString codeFragment;
         FileDef *fd   = m_memberDef->getBodyDef();
@@ -4039,19 +4864,20 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
           {
             scopeName = m_memberDef->getNamespaceDef()->name();
           }
-          m_cache.sourceCode = parseCode(m_memberDef,scopeName,relPathAsString(),codeFragment,startLine,endLine,TRUE);
-          m_cache.sourceCodeParsed = TRUE;
+          cache.sourceCode = parseCode(m_memberDef,scopeName,relPathAsString(),codeFragment,startLine,endLine,TRUE);
+          cache.sourceCodeParsed = TRUE;
         }
       }
-      return m_cache.sourceCode;
+      return cache.sourceCode;
     }
     DotCallGraph *getCallGraph() const
     {
-      if (!m_cache.callGraph)
+      Cachable &cache = getCache();
+      if (!cache.callGraph)
       {
-        m_cache.callGraph.reset(new DotCallGraph(m_memberDef,FALSE));
+        cache.callGraph.reset(new DotCallGraph(m_memberDef,FALSE));
       }
-      return m_cache.callGraph.get();
+      return cache.callGraph.get();
     }
     TemplateVariant hasCallGraph() const
     {
@@ -4071,11 +4897,31 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
         DotCallGraph *cg = getCallGraph();
         QGString result;
         FTextStream t(&result);
-        cg->writeGraph(t,GOF_BITMAP,EOF_Html,
-            g_globals.outputDir,
-            g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
-            relPathAsString(),TRUE,g_globals.dynSectionId
-            );
+        switch (g_globals.outputFormat)
+        {
+          case ContextOutputFormat_Html:
+            {
+              cg->writeGraph(t,GOF_BITMAP,EOF_Html,
+                  g_globals.outputDir,
+                  g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+                  relPathAsString(),TRUE,g_globals.dynSectionId
+                  );
+            }
+            break;
+          case ContextOutputFormat_Latex:
+            {
+              cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
+                  g_globals.outputDir,
+                  g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+".tex",
+                  relPathAsString(),TRUE,g_globals.dynSectionId
+                  );
+            }
+            break;
+            // TODO: support other generators
+          default:
+            err("context.cpp: output format not yet supported");
+            break;
+        }
         g_globals.dynSectionId++;
         return TemplateVariant(result.data(),TRUE);
       }
@@ -4086,11 +4932,12 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
     }
     DotCallGraph *getCallerGraph() const
     {
-      if (!m_cache.callerGraph)
+      Cachable &cache = getCache();
+      if (!cache.callerGraph)
       {
-        m_cache.callerGraph.reset(new DotCallGraph(m_memberDef,TRUE));
+        cache.callerGraph.reset(new DotCallGraph(m_memberDef,TRUE));
       }
-      return m_cache.callerGraph.get();
+      return cache.callerGraph.get();
     }
     TemplateVariant hasCallerGraph() const
     {
@@ -4110,11 +4957,31 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
         DotCallGraph *cg = getCallerGraph();
         QGString result;
         FTextStream t(&result);
-        cg->writeGraph(t,GOF_BITMAP,EOF_Html,
-            g_globals.outputDir,
-            g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
-            relPathAsString(),TRUE,g_globals.dynSectionId
-            );
+        switch (g_globals.outputFormat)
+        {
+          case ContextOutputFormat_Html:
+            {
+              cg->writeGraph(t,GOF_BITMAP,EOF_Html,
+                  g_globals.outputDir,
+                  g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+                  relPathAsString(),TRUE,g_globals.dynSectionId
+                  );
+            }
+            break;
+          case ContextOutputFormat_Latex:
+            {
+              cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
+                  g_globals.outputDir,
+                  g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+".tex",
+                  relPathAsString(),TRUE,g_globals.dynSectionId
+                  );
+            }
+            break;
+            // TODO: support other generators
+          default:
+            err("context.cpp: output format not yet supported");
+            break;
+        }
         g_globals.dynSectionId++;
         return TemplateVariant(result.data(),TRUE);
       }
@@ -4123,18 +4990,72 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
         return TemplateVariant("");
       }
     }
-  private:
-    MemberDef *m_memberDef;
-    struct Cachable
+    TemplateVariant type() const
+    {
+      return m_memberDef->typeString();
+    }
+    TemplateVariant handleDetailsVisibleFor(const QValueList<TemplateVariant> &args) const
+    {
+      if (args.count()==1)
+      {
+        return m_memberDef->isDetailedSectionVisible(args[0].toString()=="module",args[0].toString()=="file");
+      }
+      else
+      {
+        err(".detailsVisibleFor should take one string argument, got %d\n",args.count());
+      }
+      return TemplateVariant();
+    }
+    TemplateVariant detailsVisibleFor() const
     {
-      Cachable() : initializerParsed(FALSE), sourceCodeParsed(FALSE)
+      return TemplateVariant::Delegate::fromMethod<Private,&Private::handleDetailsVisibleFor>(this);
+    }
+    TemplateVariant handleNameWithContextFor(const QValueList<TemplateVariant> &args) const
+    {
+      if (args.count()==1)
+      {
+        SrcLangExt lang = m_memberDef->getLanguage();
+        QCString n = m_memberDef->name();
+        QCString ctx = args[0].toString();
+        QCString sep = getLanguageSpecificSeparator(lang,TRUE);
+        if (m_memberDef->getEnumScope() && m_memberDef->livesInsideEnum())
+        {
+          n.prepend(m_memberDef->getEnumScope()->displayName()+sep);
+        }
+        if (ctx=="module" && m_memberDef->getClassDef() && !m_memberDef->isRelated())
+        {
+          n.prepend(m_memberDef->getClassDef()->displayName()+sep);
+        }
+        else if ((ctx=="module" || ctx=="file") && m_memberDef->getNamespaceDef())
+        {
+          n.prepend(m_memberDef->getNamespaceDef()->displayName()+sep);
+        }
+        return n;
+      }
+      else
       {
+        err(".nameWithContextFor should take one string argument, got %d\n",args.count());
       }
+      return TemplateVariant();
+    }
+    TemplateVariant nameWithContextFor() const
+    {
+      return TemplateVariant::Delegate::fromMethod<Private,&Private::handleNameWithContextFor>(this);
+    }
+  private:
+    MemberDef *m_memberDef;
+    struct Cachable : public DefinitionContext<MemberContext::Private>::Cachable
+    {
+      Cachable(MemberDef *md) : DefinitionContext<MemberContext::Private>::Cachable(md),
+                                initializerParsed(FALSE), sourceCodeParsed(FALSE),
+                                declArgsParsed(FALSE), declTypeParsed(FALSE) { }
       SharedPtr<ArgumentListContext> templateArgs;
       SharedPtr<ArgumentListContext> arguments;
       SharedPtr<MemberListContext>   enumValues;
       SharedPtr<FileContext>         fileDef;
       SharedPtr<NamespaceContext>    namespaceDef;
+      SharedPtr<ClassContext>        category;
+      SharedPtr<MemberContext>       categoryRelation;
       SharedPtr<ClassContext>        classDef;
       SharedPtr<ClassContext>        anonymousType;
       SharedPtr<TemplateList>        templateDecls;
@@ -4153,16 +5074,28 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private>
       bool                           initializerParsed;
       TemplateVariant                sourceCode;
       bool                           sourceCodeParsed;
+      TemplateVariant                declArgs;
+      bool                           declArgsParsed;
+      TemplateVariant                declType;
+      bool                           declTypeParsed;
       SharedPtr<TemplateList>        examples;
       SharedPtr<TemplateList>        exampleList;
       SharedPtr<ArgumentListContext> typeConstraints;
       SharedPtr<TemplateList>        propertyAttrs;
       SharedPtr<TemplateList>        eventAttrs;
     };
-    mutable Cachable m_cache;
+    Cachable &getCache() const
+    {
+      Cachable *c = static_cast<Cachable*>(m_memberDef->cookie());
+      assert(c!=0);
+      return *c;
+    }
+    static PropertyMapper<MemberContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<MemberContext::Private> MemberContext::Private::s_inst;
+
 MemberContext::MemberContext(MemberDef *md) : RefCountedContext("MemberContext")
 {
   p = new Private(md);
@@ -4188,50 +5121,61 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
   public:
     Private(GroupDef *gd) : DefinitionContext<ModuleContext::Private>(gd) , m_groupDef(gd)
     {
-      addProperty("title",                     this,&Private::title);
-      addProperty("highlight",                 this,&Private::highlight);
-      addProperty("subhighlight",              this,&Private::subHighlight);
-      addProperty("hasGroupGraph",             this,&Private::hasGroupGraph);
-      addProperty("groupGraph",                this,&Private::groupGraph);
-      addProperty("hasDetails",                this,&Private::hasDetails);
-      addProperty("modules",                   this,&Private::modules);
-      addProperty("dirs",                      this,&Private::dirs);
-      addProperty("files",                     this,&Private::files);
-      addProperty("namespaces",                this,&Private::namespaces);
-      addProperty("classes",                   this,&Private::classes);
-      addProperty("constantgroups",            this,&Private::constantgroups);
-      addProperty("examples",                  this,&Private::examples);
-      addProperty("macros",                    this,&Private::macros);
-      addProperty("typedefs",                  this,&Private::typedefs);
-      addProperty("enums",                     this,&Private::enums);
-      addProperty("enumvalues",                this,&Private::enumValues);
-      addProperty("functions",                 this,&Private::functions);
-      addProperty("variables",                 this,&Private::variables);
-      addProperty("signals",                   this,&Private::signals);
-      addProperty("publicSlots",               this,&Private::publicSlots);
-      addProperty("protectedSlots",            this,&Private::protectedSlots);
-      addProperty("privateSlots",              this,&Private::privateSlots);
-      addProperty("events",                    this,&Private::events);
-      addProperty("properties",                this,&Private::properties);
-      addProperty("friends",                   this,&Private::friends);
-      addProperty("memberGroups",              this,&Private::memberGroups);
-      addProperty("detailedMacros",            this,&Private::detailedMacros);
-      addProperty("detailedTypedefs",          this,&Private::detailedTypedefs);
-      addProperty("detailedEnums",             this,&Private::detailedEnums);
-      addProperty("detailedEnumValues",        this,&Private::detailedEnumValues);
-      addProperty("detailedFunctions",         this,&Private::detailedFunctions);
-      addProperty("detailedVariables",         this,&Private::detailedVariables);
-      addProperty("detailedSignals",           this,&Private::detailedSignals);
-      addProperty("detailedPublicSlots",       this,&Private::detailedPublicSlots);
-      addProperty("detailedProtectedSlots",    this,&Private::detailedProtectedSlots);
-      addProperty("detailedPrivateSlots",      this,&Private::detailedPrivateSlots);
-      addProperty("detailedEvents",            this,&Private::detailedEvents);
-      addProperty("detailedProperties",        this,&Private::detailedProperties);
-      addProperty("detailedFriends",           this,&Private::detailedFriends);
-      addProperty("inlineClasses",             this,&Private::inlineClasses);
-      addProperty("compoundType",              this,&Private::compoundType);
+      static bool init=FALSE;
+      if (!init)
+      {
+        addBaseProperties(s_inst);
+        s_inst.addProperty("title",                     &Private::title);
+        s_inst.addProperty("highlight",                 &Private::highlight);
+        s_inst.addProperty("subhighlight",              &Private::subHighlight);
+        s_inst.addProperty("hasGroupGraph",             &Private::hasGroupGraph);
+        s_inst.addProperty("groupGraph",                &Private::groupGraph);
+        s_inst.addProperty("hasDetails",                &Private::hasDetails);
+        s_inst.addProperty("modules",                   &Private::modules);
+        s_inst.addProperty("dirs",                      &Private::dirs);
+        s_inst.addProperty("files",                     &Private::files);
+        s_inst.addProperty("namespaces",                &Private::namespaces);
+        s_inst.addProperty("classes",                   &Private::classes);
+        s_inst.addProperty("constantgroups",            &Private::constantgroups);
+        s_inst.addProperty("examples",                  &Private::examples);
+        s_inst.addProperty("macros",                    &Private::macros);
+        s_inst.addProperty("typedefs",                  &Private::typedefs);
+        s_inst.addProperty("enums",                     &Private::enums);
+        s_inst.addProperty("enumvalues",                &Private::enumValues);
+        s_inst.addProperty("functions",                 &Private::functions);
+        s_inst.addProperty("variables",                 &Private::variables);
+        s_inst.addProperty("signals",                   &Private::signals);
+        s_inst.addProperty("publicSlots",               &Private::publicSlots);
+        s_inst.addProperty("protectedSlots",            &Private::protectedSlots);
+        s_inst.addProperty("privateSlots",              &Private::privateSlots);
+        s_inst.addProperty("events",                    &Private::events);
+        s_inst.addProperty("properties",                &Private::properties);
+        s_inst.addProperty("friends",                   &Private::friends);
+        s_inst.addProperty("memberGroups",              &Private::memberGroups);
+        s_inst.addProperty("detailedMacros",            &Private::detailedMacros);
+        s_inst.addProperty("detailedTypedefs",          &Private::detailedTypedefs);
+        s_inst.addProperty("detailedEnums",             &Private::detailedEnums);
+        s_inst.addProperty("detailedEnumValues",        &Private::detailedEnumValues);
+        s_inst.addProperty("detailedFunctions",         &Private::detailedFunctions);
+        s_inst.addProperty("detailedVariables",         &Private::detailedVariables);
+        s_inst.addProperty("detailedSignals",           &Private::detailedSignals);
+        s_inst.addProperty("detailedPublicSlots",       &Private::detailedPublicSlots);
+        s_inst.addProperty("detailedProtectedSlots",    &Private::detailedProtectedSlots);
+        s_inst.addProperty("detailedPrivateSlots",      &Private::detailedPrivateSlots);
+        s_inst.addProperty("detailedEvents",            &Private::detailedEvents);
+        s_inst.addProperty("detailedProperties",        &Private::detailedProperties);
+        s_inst.addProperty("detailedFriends",           &Private::detailedFriends);
+        s_inst.addProperty("inlineClasses",             &Private::inlineClasses);
+        s_inst.addProperty("compoundType",              &Private::compoundType);
+        init=TRUE;
+      }
+      if (!gd->cookie()) { gd->setCookie(new ModuleContext::Private::Cachable(gd)); }
     }
     virtual ~Private() {}
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
     TemplateVariant title() const
     {
       return TemplateVariant(m_groupDef->groupTitle());
@@ -4246,11 +5190,12 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
     }
     DotGroupCollaboration *getGroupGraph() const
     {
-      if (!m_cache.groupGraph)
+      Cachable &cache = getCache();
+      if (!cache.groupGraph)
       {
-        m_cache.groupGraph.reset(new DotGroupCollaboration(m_groupDef));
+        cache.groupGraph.reset(new DotGroupCollaboration(m_groupDef));
       }
-      return m_cache.groupGraph.get();
+      return cache.groupGraph.get();
     }
     TemplateVariant hasGroupGraph() const
     {
@@ -4273,15 +5218,37 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
       {
         DotGroupCollaboration *graph = getGroupGraph();
         FTextStream t(&result);
-        graph->writeGraph(t,GOF_BITMAP,
-                          EOF_Html,
-                          g_globals.outputDir,
-                          g_globals.outputDir+portable_pathSeparator()+m_groupDef->getOutputFileBase()+Doxygen::htmlFileExtension,
-                          relPathAsString(),
-                          TRUE,
-                          g_globals.dynSectionId);
+        switch (g_globals.outputFormat)
+        {
+          case ContextOutputFormat_Html:
+            {
+              graph->writeGraph(t,GOF_BITMAP,
+                                EOF_Html,
+                                g_globals.outputDir,
+                                g_globals.outputDir+portable_pathSeparator()+m_groupDef->getOutputFileBase()+Doxygen::htmlFileExtension,
+                                relPathAsString(),
+                                TRUE,
+                                g_globals.dynSectionId);
+            }
+            break;
+          case ContextOutputFormat_Latex:
+            {
+              graph->writeGraph(t,GOF_EPS,
+                                EOF_LaTeX,
+                                g_globals.outputDir,
+                                g_globals.outputDir+portable_pathSeparator()+m_groupDef->getOutputFileBase()+".tex",
+                                relPathAsString(),
+                                TRUE,
+                                g_globals.dynSectionId);
+            }
+            break;
+            // TODO: support other generators
+          default:
+            err("context.cpp: output format not yet supported");
+            break;
+        }
+        g_globals.dynSectionId++;
       }
-      g_globals.dynSectionId++;
       return TemplateVariant(result.data(),TRUE);
     }
     TemplateVariant hasDetails() const
@@ -4290,7 +5257,8 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
     }
     TemplateVariant modules() const
     {
-      if (!m_cache.modules)
+      Cachable &cache = getCache();
+      if (!cache.modules)
       {
         TemplateList *moduleList = TemplateList::alloc();
         if (m_groupDef->getSubGroups())
@@ -4305,13 +5273,14 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
             }
           }
         }
-        m_cache.modules.reset(moduleList);
+        cache.modules.reset(moduleList);
       }
-      return m_cache.modules.get();
+      return cache.modules.get();
     }
     TemplateVariant examples() const
     {
-      if (!m_cache.examples)
+      Cachable &cache = getCache();
+      if (!cache.examples)
       {
         TemplateList *exampleList = TemplateList::alloc();
         if (m_groupDef->getExamples())
@@ -4320,16 +5289,17 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
           PageDef *ex;
           for (eli.toFirst();(ex=eli.current());++eli)
           {
-            exampleList->append(PageContext::alloc(ex));
+            exampleList->append(PageContext::alloc(ex,FALSE,TRUE));
           }
         }
-        m_cache.examples.reset(exampleList);
+        cache.examples.reset(exampleList);
       }
-      return m_cache.examples.get();
+      return cache.examples.get();
     }
     TemplateVariant pages() const
     {
-      if (!m_cache.pages)
+      Cachable &cache = getCache();
+      if (!cache.pages)
       {
         TemplateList *pageList = TemplateList::alloc();
         if (m_groupDef->getExamples())
@@ -4338,16 +5308,17 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
           PageDef *ex;
           for (eli.toFirst();(ex=eli.current());++eli)
           {
-            pageList->append(PageContext::alloc(ex));
+            pageList->append(PageContext::alloc(ex,FALSE,TRUE));
           }
         }
-        m_cache.pages.reset(pageList);
+        cache.pages.reset(pageList);
       }
-      return m_cache.pages.get();
+      return cache.pages.get();
     }
     TemplateVariant dirs() const
     {
-      if (!m_cache.dirs)
+      Cachable &cache = getCache();
+      if (!cache.dirs)
       {
         TemplateList *dirList = TemplateList::alloc();
         if (m_groupDef->getDirs())
@@ -4359,13 +5330,14 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
             dirList->append(DirContext::alloc(dd));
           }
         }
-        m_cache.dirs.reset(dirList);
+        cache.dirs.reset(dirList);
       }
-      return m_cache.dirs.get();
+      return cache.dirs.get();
     }
     TemplateVariant files() const
     {
-      if (!m_cache.files)
+      Cachable &cache = getCache();
+      if (!cache.files)
       {
         TemplateList *fileList = TemplateList::alloc();
         if (m_groupDef->getFiles())
@@ -4377,13 +5349,14 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
             fileList->append(FileContext::alloc(fd));
           }
         }
-        m_cache.files.reset(fileList);
+        cache.files.reset(fileList);
       }
-      return m_cache.files.get();
+      return cache.files.get();
     }
     TemplateVariant classes() const
     {
-      if (!m_cache.classes)
+      Cachable &cache = getCache();
+      if (!cache.classes)
       {
         TemplateList *classList = TemplateList::alloc();
         if (m_groupDef->getClasses())
@@ -4398,13 +5371,14 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
             }
           }
         }
-        m_cache.classes.reset(classList);
+        cache.classes.reset(classList);
       }
-      return m_cache.classes.get();
+      return cache.classes.get();
     }
     TemplateVariant namespaces() const
     {
-      if (!m_cache.namespaces)
+      Cachable &cache = getCache();
+      if (!cache.namespaces)
       {
         TemplateList *namespaceList = TemplateList::alloc();
         if (m_groupDef->getNamespaces())
@@ -4419,13 +5393,14 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
             }
           }
         }
-        m_cache.namespaces.reset(namespaceList);
+        cache.namespaces.reset(namespaceList);
       }
-      return m_cache.namespaces.get();
+      return cache.namespaces.get();
     }
     TemplateVariant constantgroups() const
     {
-      if (!m_cache.constantgroups)
+      Cachable &cache = getCache();
+      if (!cache.constantgroups)
       {
         TemplateList *namespaceList = TemplateList::alloc();
         if (m_groupDef->getNamespaces())
@@ -4440,9 +5415,9 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
             }
           }
         }
-        m_cache.constantgroups.reset(namespaceList);
+        cache.constantgroups.reset(namespaceList);
       }
-      return m_cache.constantgroups.get();
+      return cache.constantgroups.get();
     }
 
     TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
@@ -4453,7 +5428,7 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
         MemberList *ml = m_groupDef->getMemberList(type);
         if (ml)
         {
-          list.reset(MemberListInfoContext::alloc(m_groupDef,relPathAsString(),ml,title,detailed));
+          list.reset(MemberListInfoContext::alloc(m_groupDef,relPathAsString(),ml,title,""));
         }
       }
       if (list)
@@ -4467,19 +5442,19 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
     }
     TemplateVariant macros() const
     {
-      return getMemberList(m_cache.macros,MemberListType_decDefineMembers,theTranslator->trDefines());
+      return getMemberList(getCache().macros,MemberListType_decDefineMembers,theTranslator->trDefines());
     }
     TemplateVariant typedefs() const
     {
-      return getMemberList(m_cache.typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
+      return getMemberList(getCache().typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
     }
     TemplateVariant enums() const
     {
-      return getMemberList(m_cache.enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
+      return getMemberList(getCache().enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
     }
     TemplateVariant enumValues() const
     {
-      return getMemberList(m_cache.enums,MemberListType_decEnumValMembers,theTranslator->trEnumerationValues());
+      return getMemberList(getCache().enums,MemberListType_decEnumValMembers,theTranslator->trEnumerationValues());
     }
     TemplateVariant functions() const
     {
@@ -4487,113 +5462,115 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
       SrcLangExt lang = m_groupDef->getLanguage();
       if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
       else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc();
-      return getMemberList(m_cache.functions,MemberListType_decFuncMembers,title);
+      return getMemberList(getCache().functions,MemberListType_decFuncMembers,title);
     }
     TemplateVariant variables() const
     {
-      return getMemberList(m_cache.variables,MemberListType_decVarMembers,theTranslator->trVariables());
+      return getMemberList(getCache().variables,MemberListType_decVarMembers,theTranslator->trVariables());
     }
     TemplateVariant signals() const
     {
-      return getMemberList(m_cache.signals,MemberListType_signals,theTranslator->trSignals());
+      return getMemberList(getCache().signals,MemberListType_signals,theTranslator->trSignals());
     }
     TemplateVariant publicSlots() const
     {
-      return getMemberList(m_cache.publicSlots,MemberListType_pubSlots,theTranslator->trPublicSlots());
+      return getMemberList(getCache().publicSlots,MemberListType_pubSlots,theTranslator->trPublicSlots());
     }
     TemplateVariant protectedSlots() const
     {
-      return getMemberList(m_cache.protectedSlots,MemberListType_proSlots,theTranslator->trProtectedSlots());
+      return getMemberList(getCache().protectedSlots,MemberListType_proSlots,theTranslator->trProtectedSlots());
     }
     TemplateVariant privateSlots() const
     {
-      return getMemberList(m_cache.privateSlots,MemberListType_priSlots,theTranslator->trPrivateSlots());
+      return getMemberList(getCache().privateSlots,MemberListType_priSlots,theTranslator->trPrivateSlots());
     }
     TemplateVariant events() const
     {
-      return getMemberList(m_cache.events,MemberListType_events,theTranslator->trEvents());
+      return getMemberList(getCache().events,MemberListType_events,theTranslator->trEvents());
     }
     TemplateVariant properties() const
     {
-      return getMemberList(m_cache.properties,MemberListType_properties,theTranslator->trProperties());
+      return getMemberList(getCache().properties,MemberListType_properties,theTranslator->trProperties());
     }
     TemplateVariant friends() const
     {
-      return getMemberList(m_cache.friends,MemberListType_friends,theTranslator->trFriends());
+      return getMemberList(getCache().friends,MemberListType_friends,theTranslator->trFriends());
     }
     TemplateVariant memberGroups() const
     {
-      if (!m_cache.memberGroups)
+      Cachable &cache = getCache();
+      if (!cache.memberGroups)
       {
         if (m_groupDef->getMemberGroupSDict())
         {
-          m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_groupDef,relPathAsString(),m_groupDef->getMemberGroupSDict(),m_groupDef->subGrouping()));
+          cache.memberGroups.reset(MemberGroupListContext::alloc(m_groupDef,relPathAsString(),m_groupDef->getMemberGroupSDict(),m_groupDef->subGrouping()));
         }
         else
         {
-          m_cache.memberGroups.reset(MemberGroupListContext::alloc());
+          cache.memberGroups.reset(MemberGroupListContext::alloc());
         }
       }
-      return m_cache.memberGroups.get();
+      return cache.memberGroups.get();
     }
     TemplateVariant detailedMacros() const
     {
-      return getMemberList(m_cache.detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation());
+      return getMemberList(getCache().detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation());
     }
     TemplateVariant detailedTypedefs() const
     {
-      return getMemberList(m_cache.detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
+      return getMemberList(getCache().detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
     }
     TemplateVariant detailedEnums() const
     {
-      return getMemberList(m_cache.detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
+      return getMemberList(getCache().detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
     }
     TemplateVariant detailedEnumValues() const
     {
-      return getMemberList(m_cache.detailedEnumValues,MemberListType_docEnumValMembers,theTranslator->trEnumerationValueDocumentation());
+      return getMemberList(getCache().detailedEnumValues,MemberListType_docEnumValMembers,theTranslator->trEnumerationValueDocumentation());
     }
     TemplateVariant detailedFunctions() const
     {
       QCString title = theTranslator->trFunctionDocumentation();
       SrcLangExt lang = m_groupDef->getLanguage();
       if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation();
-      return getMemberList(m_cache.detailedFunctions,MemberListType_docFuncMembers,title);
+      return getMemberList(getCache().detailedFunctions,MemberListType_docFuncMembers,title);
     }
     TemplateVariant detailedVariables() const
     {
-      return getMemberList(m_cache.detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
+      return getMemberList(getCache().detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
     }
     TemplateVariant detailedSignals() const
     {
-      return getMemberList(m_cache.detailedSignals,MemberListType_docSignalMembers,theTranslator->trSignals());
+      return getMemberList(getCache().detailedSignals,MemberListType_docSignalMembers,theTranslator->trSignals());
     }
     TemplateVariant detailedPublicSlots() const
     {
-      return getMemberList(m_cache.detailedPublicSlots,MemberListType_docPubSlotMembers,theTranslator->trPublicSlots());
+      return getMemberList(getCache().detailedPublicSlots,MemberListType_docPubSlotMembers,theTranslator->trPublicSlots());
     }
     TemplateVariant detailedProtectedSlots() const
     {
-      return getMemberList(m_cache.detailedProtectedSlots,MemberListType_docProSlotMembers,theTranslator->trProtectedSlots());
+      return getMemberList(getCache().detailedProtectedSlots,MemberListType_docProSlotMembers,theTranslator->trProtectedSlots());
     }
     TemplateVariant detailedPrivateSlots() const
     {
-      return getMemberList(m_cache.detailedPrivateSlots,MemberListType_docPriSlotMembers,theTranslator->trPrivateSlots());
+      return getMemberList(getCache().detailedPrivateSlots,MemberListType_docPriSlotMembers,theTranslator->trPrivateSlots());
     }
     TemplateVariant detailedEvents() const
     {
-      return getMemberList(m_cache.detailedEvents,MemberListType_docEventMembers,theTranslator->trEventDocumentation(),TRUE);
+      return getMemberList(getCache().detailedEvents,MemberListType_docEventMembers,theTranslator->trEventDocumentation(),TRUE);
     }
     TemplateVariant detailedProperties() const
     {
-      return getMemberList(m_cache.detailedProperties,MemberListType_docPropMembers,theTranslator->trPropertyDocumentation(),TRUE);
+      return getMemberList(getCache().detailedProperties,MemberListType_docPropMembers,theTranslator->trPropertyDocumentation(),TRUE);
     }
     TemplateVariant detailedFriends() const
     {
-      return getMemberList(m_cache.detailedFriends,MemberListType_docFriendMembers,theTranslator->trFriends(),TRUE);
+      return getMemberList(getCache().detailedFriends,MemberListType_docFriendMembers,theTranslator->trFriends(),TRUE);
     }
     TemplateVariant inlineClasses() const
     {
-      if (!m_cache.inlineClasses)
+      Cachable &cache = getCache();
+      if (!cache.inlineClasses)
       {
         TemplateList *classList = TemplateList::alloc();
         if (m_groupDef->getClasses())
@@ -4611,9 +5588,9 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
             }
           }
         }
-        m_cache.inlineClasses.reset(classList);
+        cache.inlineClasses.reset(classList);
       }
-      return m_cache.inlineClasses.get();
+      return cache.inlineClasses.get();
     }
     TemplateVariant compoundType() const
     {
@@ -4621,8 +5598,9 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
     }
   private:
     GroupDef *m_groupDef;
-    struct Cachable
+    struct Cachable : public DefinitionContext<ModuleContext::Private>::Cachable
     {
+      Cachable(GroupDef *gd) : DefinitionContext<ModuleContext::Private>::Cachable(gd) {}
       SharedPtr<TemplateList>               modules;
       SharedPtr<TemplateList>               dirs;
       SharedPtr<TemplateList>               files;
@@ -4661,10 +5639,18 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
       SharedPtr<TemplateList>               inlineClasses;
       ScopedPtr<DotGroupCollaboration>      groupGraph;
     };
-    mutable Cachable m_cache;
+    Cachable &getCache() const
+    {
+      Cachable *c = static_cast<Cachable*>(m_groupDef->cookie());
+      assert(c!=0);
+      return *c;
+    }
+    static PropertyMapper<ModuleContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<ModuleContext::Private> ModuleContext::Private::s_inst;
+
 ModuleContext::ModuleContext(GroupDef *gd) : RefCountedContext("ModuleContext")
 {
   p = new Private(gd);
@@ -4699,7 +5685,8 @@ class ClassListContext::Private : public GenericNodeListContext
         {
           continue;
         }
-        if (cd->isLinkableInProject() && cd->templateMaster()==0)
+        if (cd->isLinkableInProject() && cd->templateMaster()==0 &&
+            !cd->isHidden() && !cd->isEmbeddedInOuterScope())
         {
           append(ClassContext::alloc(cd));
         }
@@ -4738,17 +5725,26 @@ TemplateListIntf::ConstIterator *ClassListContext::createIterator() const
 //------------------------------------------------------------------------
 
 //%% list ClassIndex[Class] : list of classes
-class ClassIndexContext::Private : public PropertyMapper
+class ClassIndexContext::Private
 {
   public:
     Private()
     {
-      addProperty("list",        this,&Private::list);
-      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);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("list",        &Private::list);
+        s_inst.addProperty("fileName",    &Private::fileName);
+        s_inst.addProperty("relPath",     &Private::relPath);
+        s_inst.addProperty("highlight",   &Private::highlight);
+        s_inst.addProperty("subhighlight",&Private::subhighlight);
+        s_inst.addProperty("title",       &Private::title);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant list() const
     {
@@ -4817,8 +5813,11 @@ class ClassIndexContext::Private : public PropertyMapper
       SharedPtr<TemplateList> classes;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<ClassIndexContext::Private> s_inst;
 };
 
+PropertyMapper<ClassIndexContext::Private> ClassIndexContext::Private::s_inst;
+
 ClassIndexContext::ClassIndexContext() : RefCountedContext("ClassIndexContext")
 {
   p = new Private;
@@ -4912,7 +5911,7 @@ static int computePreferredDepth(const TemplateListIntf *list,int maxDepth)
 
 //%% struct ClassHierarchy: inheritance tree
 //%% {
-class ClassHierarchyContext::Private : public PropertyMapper
+class ClassHierarchyContext::Private
 {
   public:
     Private()
@@ -4923,15 +5922,24 @@ class ClassHierarchyContext::Private : public PropertyMapper
       m_classTree->addClassHierarchy(*Doxygen::classSDict,TRUE);
       m_classTree->addClassHierarchy(*Doxygen::hiddenClasses,TRUE);
       //%% ClassInheritance 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);
-      addProperty("diagrams",        this,&Private::diagrams);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("tree",            &Private::tree);
+        s_inst.addProperty("fileName",        &Private::fileName);
+        s_inst.addProperty("relPath",         &Private::relPath);
+        s_inst.addProperty("highlight",       &Private::highlight);
+        s_inst.addProperty("subhighlight",    &Private::subhighlight);
+        s_inst.addProperty("title",           &Private::title);
+        s_inst.addProperty("preferredDepth",  &Private::preferredDepth);
+        s_inst.addProperty("maxDepth",        &Private::maxDepth);
+        s_inst.addProperty("diagrams",        &Private::diagrams);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant tree() const
     {
@@ -5025,9 +6033,12 @@ class ClassHierarchyContext::Private : public PropertyMapper
       ScopedPtr<DotGfxHierarchyTable> hierarchy;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<ClassHierarchyContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<ClassHierarchyContext::Private> ClassHierarchyContext::Private::s_inst;
+
 ClassHierarchyContext::ClassHierarchyContext() : RefCountedContext("ClassHierarchyContext")
 {
   p = new Private;
@@ -5047,7 +6058,7 @@ TemplateVariant ClassHierarchyContext::get(const char *name) const
 
 //%% struct NestingNode: node is a nesting relation tree
 //%% {
-class NestingNodeContext::Private : public PropertyMapper
+class NestingNodeContext::Private
 {
   public:
     Private(const NestingNodeContext *parent,const NestingNodeContext *thisNode,
@@ -5055,34 +6066,41 @@ class NestingNodeContext::Private : public PropertyMapper
       : 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
-      addProperty("children",this,&Private::children);
-      //%% [optional] Class class: class info (if this node represents a class)
-      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);
-      //%% [optional] Page page: page info (if this node represents a page)
-      addProperty("page",this,&Private::getPage);
-      //%% [optional] Module module: module info (if this node represents a module)
-      addProperty("module",this,&Private::getModule);
-      //%% 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);
+      static bool init=FALSE;
+      if (!init)
+      {
+        //%% bool is_leaf_node: true if this node does not have any children
+        s_inst.addProperty("is_leaf_node",&Private::isLeafNode);
+        //%% Nesting children: list of nested classes/namespaces
+        s_inst.addProperty("children",&Private::children);
+        //%% [optional] Class class: class info (if this node represents a class)
+        s_inst.addProperty("class",&Private::getClass);
+        //%% [optional] Namespace namespace: namespace info (if this node represents a namespace)
+        s_inst.addProperty("namespace",&Private::getNamespace);
+        //%% [optional] File file: file info (if this node represents a file)
+        s_inst.addProperty("file",&Private::getFile);
+        //%% [optional] Dir dir: directory info (if this node represents a directory)
+        s_inst.addProperty("dir",&Private::getDir);
+        //%% [optional] Page page: page info (if this node represents a page)
+        s_inst.addProperty("page",&Private::getPage);
+        //%% [optional] Module module: module info (if this node represents a module)
+        s_inst.addProperty("module",&Private::getModule);
+        //%% int id
+        s_inst.addProperty("id",&Private::id);
+        //%% string level
+        s_inst.addProperty("level",&Private::level);
+        //%% string name
+        s_inst.addProperty("name",&Private::name);
+        //%% string brief
+        s_inst.addProperty("brief",&Private::brief);
+        //%% bool isLinkable
+        s_inst.addProperty("isLinkable",&Private::isLinkable);
+        s_inst.addProperty("anchor",&Private::anchor);
+        s_inst.addProperty("fileName",&Private::fileName);
+        s_inst.addProperty("isReference",&Private::isReference);
+        s_inst.addProperty("externalReference",&Private::externalReference);
+        init=TRUE;
+      }
 
       addNamespaces(addCls);
       addClasses(inherit,hideSuper);
@@ -5090,6 +6108,10 @@ class NestingNodeContext::Private : public PropertyMapper
       addPages();
       addModules();
     }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
     TemplateVariant isLeafNode() const
     {
       return m_children->count()==0;
@@ -5162,7 +6184,7 @@ class NestingNodeContext::Private : public PropertyMapper
     {
       if (!m_cache.pageContext && m_def->definitionType()==Definition::TypePage)
       {
-        m_cache.pageContext.reset(PageContext::alloc((PageDef*)m_def));
+        m_cache.pageContext.reset(PageContext::alloc((PageDef*)m_def,FALSE,FALSE));
       }
       if (m_cache.pageContext)
       {
@@ -5236,6 +6258,14 @@ class NestingNodeContext::Private : public PropertyMapper
     {
       return m_def->getOutputFileBase();
     }
+    TemplateVariant isReference() const
+    {
+      return m_def->isReference();
+    }
+    TemplateVariant externalReference() const
+    {
+      return m_def->externalReference(relPathAsString());
+    }
 
     //------------------------------------------------------------------
 
@@ -5324,9 +6354,12 @@ class NestingNodeContext::Private : public PropertyMapper
       ScopedPtr<TemplateVariant>  brief;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<NestingNodeContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<NestingNodeContext::Private> NestingNodeContext::Private::s_inst;
+
 NestingNodeContext::NestingNodeContext(const NestingNodeContext *parent,
                                        Definition *d,int index,int level,bool addClass,bool inherit,bool hideSuper)
    : RefCountedContext("NestingNodeContext")
@@ -5656,7 +6689,7 @@ void NestingContext::addDerivedClasses(const BaseClassList *bcl,bool hideSuper)
 
 //%% struct ClassTree: Class nesting relations
 //%% {
-class ClassTreeContext::Private : public PropertyMapper
+class ClassTreeContext::Private
 {
   public:
     Private()
@@ -5671,16 +6704,25 @@ class ClassTreeContext::Private : public PropertyMapper
         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);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("tree",          &Private::tree);
+        s_inst.addProperty("fileName",      &Private::fileName);
+        s_inst.addProperty("relPath",       &Private::relPath);
+        s_inst.addProperty("highlight",     &Private::highlight);
+        s_inst.addProperty("subhighlight",  &Private::subhighlight);
+        s_inst.addProperty("title",         &Private::title);
+        s_inst.addProperty("preferredDepth",&Private::preferredDepth);
+        s_inst.addProperty("maxDepth",      &Private::maxDepth);
+        init=TRUE;
+      }
     }
-    TemplateVariant tree() const
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
+    TemplateVariant tree() const
     {
       return m_classTree.get();
     }
@@ -5747,9 +6789,12 @@ class ClassTreeContext::Private : public PropertyMapper
       bool  preferredDepthComputed;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<ClassTreeContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<ClassTreeContext::Private> ClassTreeContext::Private::s_inst;
+
 ClassTreeContext::ClassTreeContext() : RefCountedContext("ClassTreeContext")
 {
   p = new Private;
@@ -5816,7 +6861,7 @@ TemplateListIntf::ConstIterator *NamespaceListContext::createIterator() const
 
 //%% struct NamespaceTree: tree of nested namespace
 //%% {
-class NamespaceTreeContext::Private : public PropertyMapper
+class NamespaceTreeContext::Private
 {
   public:
     Private()
@@ -5827,14 +6872,23 @@ class NamespaceTreeContext::Private : public PropertyMapper
         m_namespaceTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,FALSE);
       }
       //%% 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);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("tree",          &Private::tree);
+        s_inst.addProperty("fileName",      &Private::fileName);
+        s_inst.addProperty("relPath",       &Private::relPath);
+        s_inst.addProperty("highlight",     &Private::highlight);
+        s_inst.addProperty("subhighlight",  &Private::subhighlight);
+        s_inst.addProperty("title",         &Private::title);
+        s_inst.addProperty("preferredDepth",&Private::preferredDepth);
+        s_inst.addProperty("maxDepth",      &Private::maxDepth);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant tree() const
     {
@@ -5903,9 +6957,12 @@ class NamespaceTreeContext::Private : public PropertyMapper
       bool  preferredDepthComputed;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<NamespaceTreeContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<NamespaceTreeContext::Private> NamespaceTreeContext::Private::s_inst;
+
 NamespaceTreeContext::NamespaceTreeContext() : RefCountedContext("NamespaceTreeContext")
 {
   p = new Private;
@@ -6077,7 +7134,7 @@ void UsedFilesContext::addFile(FileDef *fd)
 
 //%% struct FileTree: tree of directories and files
 //%% {
-class FileTreeContext::Private : public PropertyMapper
+class FileTreeContext::Private
 {
   public:
     Private()
@@ -6093,14 +7150,23 @@ class FileTreeContext::Private : public PropertyMapper
         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);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("tree",          &Private::tree);
+        s_inst.addProperty("fileName",      &Private::fileName);
+        s_inst.addProperty("relPath",       &Private::relPath);
+        s_inst.addProperty("highlight",     &Private::highlight);
+        s_inst.addProperty("subhighlight",  &Private::subhighlight);
+        s_inst.addProperty("title",         &Private::title);
+        s_inst.addProperty("preferredDepth",&Private::preferredDepth);
+        s_inst.addProperty("maxDepth",      &Private::maxDepth);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant tree() const
     {
@@ -6156,9 +7222,12 @@ class FileTreeContext::Private : public PropertyMapper
       bool  preferredDepthComputed;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<FileTreeContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<FileTreeContext::Private> FileTreeContext::Private::s_inst;
+
 FileTreeContext::FileTreeContext() : RefCountedContext("FileTreeContext")
 {
   p = new Private;
@@ -6178,27 +7247,36 @@ TemplateVariant FileTreeContext::get(const char *name) const
 
 //%% struct PageTree: tree of related pages
 //%% {
-class PageTreeContext::Private : public PropertyMapper
+class PageTreeContext::Private
 {
   public:
-    Private()
+    Private(const PageSDict *pages)
     {
       m_pageTree.reset(NestingContext::alloc(0,0));
       // Add pages
-      if (Doxygen::pageSDict)
+      if (pages)
       {
-        m_pageTree->addPages(*Doxygen::pageSDict,TRUE);
+        m_pageTree->addPages(*pages,TRUE);
       }
 
       //%% PageNodeList 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);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("tree",          &Private::tree);
+        s_inst.addProperty("fileName",      &Private::fileName);
+        s_inst.addProperty("relPath",       &Private::relPath);
+        s_inst.addProperty("highlight",     &Private::highlight);
+        s_inst.addProperty("subhighlight",  &Private::subhighlight);
+        s_inst.addProperty("title",         &Private::title);
+        s_inst.addProperty("preferredDepth",&Private::preferredDepth);
+        s_inst.addProperty("maxDepth",      &Private::maxDepth);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant tree() const
     {
@@ -6253,12 +7331,15 @@ class PageTreeContext::Private : public PropertyMapper
       bool  preferredDepthComputed;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<PageTreeContext::Private> s_inst;
 };
 //%% }
 
-PageTreeContext::PageTreeContext() : RefCountedContext("PageTreeContext")
+PropertyMapper<PageTreeContext::Private> PageTreeContext::Private::s_inst;
+
+PageTreeContext::PageTreeContext(const PageSDict *pages) : RefCountedContext("PageTreeContext")
 {
-  p = new Private;
+  p = new Private(pages);
 }
 
 PageTreeContext::~PageTreeContext()
@@ -6285,7 +7366,7 @@ class PageListContext::Private : public GenericNodeListContext
       {
         if (!pd->getGroupDef() && !pd->isReference())
         {
-          append(PageContext::alloc(pd));
+          append(PageContext::alloc(pd,FALSE,FALSE));
         }
       }
     }
@@ -6320,6 +7401,55 @@ TemplateListIntf::ConstIterator *PageListContext::createIterator() const
 
 //------------------------------------------------------------------------
 
+//%% list ExampleList[Page]: list of pages
+class ExampleListContext::Private : public GenericNodeListContext
+{
+  public:
+    Private()
+    {
+      if (Doxygen::exampleSDict)
+      {
+        PageSDict::Iterator pdi(*Doxygen::exampleSDict);
+        PageDef *pd=0;
+        for (pdi.toFirst();(pd=pdi.current());++pdi)
+        {
+          if (!pd->getGroupDef() && !pd->isReference())
+          {
+            append(PageContext::alloc(pd,FALSE,TRUE));
+          }
+        }
+      }
+    }
+};
+
+ExampleListContext::ExampleListContext() : RefCountedContext("ExampleListContext")
+{
+  p = new Private;
+}
+
+ExampleListContext::~ExampleListContext()
+{
+  delete p;
+}
+
+// TemplateListIntf
+int ExampleListContext::count() const
+{
+  return p->count();
+}
+
+TemplateVariant ExampleListContext::at(int index) const
+{
+  return p->at(index);
+}
+
+TemplateListIntf::ConstIterator *ExampleListContext::createIterator() const
+{
+  return p->createIterator();
+}
+
+//------------------------------------------------------------------------
+
 //%% list ModuleList[ModuleNode]: list of directories and/or files
 class ModuleListContext::Private : public GenericNodeListContext
 {
@@ -6369,7 +7499,7 @@ TemplateListIntf::ConstIterator *ModuleListContext::createIterator() const
 
 //%% struct ModuleTree: tree of modules
 //%% {
-class ModuleTreeContext::Private : public PropertyMapper
+class ModuleTreeContext::Private
 {
   public:
     Private()
@@ -6382,14 +7512,23 @@ class ModuleTreeContext::Private : public PropertyMapper
       }
 
       //%% ModuleList 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);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("tree",          &Private::tree);
+        s_inst.addProperty("fileName",      &Private::fileName);
+        s_inst.addProperty("relPath",       &Private::relPath);
+        s_inst.addProperty("highlight",     &Private::highlight);
+        s_inst.addProperty("subhighlight",  &Private::subhighlight);
+        s_inst.addProperty("title",         &Private::title);
+        s_inst.addProperty("preferredDepth",&Private::preferredDepth);
+        s_inst.addProperty("maxDepth",      &Private::maxDepth);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant tree() const
     {
@@ -6444,9 +7583,12 @@ class ModuleTreeContext::Private : public PropertyMapper
       bool  preferredDepthComputed;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<ModuleTreeContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<ModuleTreeContext::Private> ModuleTreeContext::Private::s_inst;
+
 ModuleTreeContext::ModuleTreeContext() : RefCountedContext("ModuleTreeContext")
 {
   p = new Private;
@@ -6466,15 +7608,26 @@ TemplateVariant ModuleTreeContext::get(const char *name) const
 
 //%% struct NavPathElem: list of examples page
 //%% {
-class NavPathElemContext::Private : public PropertyMapper
+class NavPathElemContext::Private
 {
   public:
     Private(Definition *def) : m_def(def)
     {
-      addProperty("isLinkable",this,&Private::isLinkable);
-      addProperty("fileName",this,&Private::fileName);
-      addProperty("anchor",this,&Private::anchor);
-      addProperty("text",this,&Private::text);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("isLinkable",       &Private::isLinkable);
+        s_inst.addProperty("fileName",         &Private::fileName);
+        s_inst.addProperty("anchor",           &Private::anchor);
+        s_inst.addProperty("text",             &Private::text);
+        s_inst.addProperty("isReference",      &Private::isReference);
+        s_inst.addProperty("externalReference",&Private::externalReference);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant isLinkable() const
     {
@@ -6509,11 +7662,27 @@ class NavPathElemContext::Private : public PropertyMapper
       }
       return text;
     }
+    TemplateVariant isReference() const
+    {
+      return m_def->isReference();
+    }
+    QCString relPathAsString() const
+    {
+      static bool createSubdirs = Config_getBool("CREATE_SUBDIRS");
+      return createSubdirs ? QCString("../../") : QCString("");
+    }
+    TemplateVariant externalReference() const
+    {
+      return m_def->externalReference(relPathAsString());
+    }
   private:
     Definition *m_def;
+    static PropertyMapper<NavPathElemContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<NavPathElemContext::Private> NavPathElemContext::Private::s_inst;
+
 NavPathElemContext::NavPathElemContext(Definition *def) : RefCountedContext("NavPathElemContext")
 {
   p = new Private(def);
@@ -6534,12 +7703,39 @@ TemplateVariant NavPathElemContext::get(const char *name) const
 
 //%% struct ExampleList: list of examples page
 //%% {
-class ExampleListContext::Private : public PropertyMapper
+class ExampleTreeContext::Private
 {
   public:
-    TemplateVariant items() const
+    Private()
+    {
+      m_exampleTree.reset(NestingContext::alloc(0,0));
+      // Add pages
+      if (Doxygen::exampleSDict)
+      {
+        m_exampleTree->addPages(*Doxygen::exampleSDict,TRUE);
+      }
+
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("tree",          &Private::tree);
+        s_inst.addProperty("fileName",      &Private::fileName);
+        s_inst.addProperty("relPath",       &Private::relPath);
+        s_inst.addProperty("highlight",     &Private::highlight);
+        s_inst.addProperty("subhighlight",  &Private::subhighlight);
+        s_inst.addProperty("title",         &Private::title);
+        s_inst.addProperty("preferredDepth",&Private::preferredDepth);
+        s_inst.addProperty("maxDepth",      &Private::maxDepth);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
+    TemplateVariant tree() const
     {
-      return m_pageList.get();
+      return m_exampleTree.get();
     }
     TemplateVariant fileName() const
     {
@@ -6561,33 +7757,52 @@ class ExampleListContext::Private : public PropertyMapper
     {
       return theTranslator->trExamples();
     }
-    Private()
+    TemplateVariant maxDepth() const
     {
-      m_pageList.reset(PageListContext::alloc(Doxygen::exampleSDict));
-
-      addProperty("items",this,&Private::items);
-      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);
+      if (!m_cache.maxDepthComputed)
+      {
+        m_cache.maxDepth = computeMaxDepth(m_exampleTree.get());
+        m_cache.maxDepthComputed=TRUE;
+      }
+      return m_cache.maxDepth;
+    }
+    TemplateVariant preferredDepth() const
+    {
+      if (!m_cache.preferredDepthComputed)
+      {
+        m_cache.preferredDepth = computePreferredDepth(m_exampleTree.get(),maxDepth().toInt());
+        m_cache.preferredDepthComputed=TRUE;
+      }
+      return m_cache.preferredDepth;
     }
   private:
-    SharedPtr<PageListContext> m_pageList;
+    SharedPtr<NestingContext> m_exampleTree;
+    struct Cachable
+    {
+      Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
+      int   maxDepth;
+      bool  maxDepthComputed;
+      int   preferredDepth;
+      bool  preferredDepthComputed;
+    };
+    mutable Cachable m_cache;
+    static PropertyMapper<ExampleTreeContext::Private> s_inst;
 };
 //%% }
 
-ExampleListContext::ExampleListContext() : RefCountedContext("ExampleListContext")
+PropertyMapper<ExampleTreeContext::Private> ExampleTreeContext::Private::s_inst;
+
+ExampleTreeContext::ExampleTreeContext() : RefCountedContext("ExampleTreeContext")
 {
   p = new Private;
 }
 
-ExampleListContext::~ExampleListContext()
+ExampleTreeContext::~ExampleTreeContext()
 {
   delete p;
 }
 
-TemplateVariant ExampleListContext::get(const char *name) const
+TemplateVariant ExampleTreeContext::get(const char *name) const
 {
   return p->get(name);
 }
@@ -6596,26 +7811,35 @@ TemplateVariant ExampleListContext::get(const char *name) const
 
 //%% struct GlobalsIndex: list of examples page
 //%% {
-class GlobalsIndexContext::Private : public PropertyMapper
+class GlobalsIndexContext::Private
 {
   public:
     Private()
     {
-      addProperty("all",         this,&Private::all);
-      addProperty("functions",   this,&Private::functions);
-      addProperty("variables",   this,&Private::variables);
-      addProperty("typedefs",    this,&Private::typedefs);
-      addProperty("enums",       this,&Private::enums);
-      addProperty("enumValues",  this,&Private::enumValues);
-      addProperty("macros",      this,&Private::macros);
-      addProperty("properties",  this,&Private::properties);
-      addProperty("events",      this,&Private::events);
-      addProperty("related",     this,&Private::related);
-      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);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("all",         &Private::all);
+        s_inst.addProperty("functions",   &Private::functions);
+        s_inst.addProperty("variables",   &Private::variables);
+        s_inst.addProperty("typedefs",    &Private::typedefs);
+        s_inst.addProperty("enums",       &Private::enums);
+        s_inst.addProperty("enumValues",  &Private::enumValues);
+        s_inst.addProperty("macros",      &Private::macros);
+        s_inst.addProperty("properties",  &Private::properties);
+        s_inst.addProperty("events",      &Private::events);
+        s_inst.addProperty("related",     &Private::related);
+        s_inst.addProperty("fileName",    &Private::fileName);
+        s_inst.addProperty("relPath",     &Private::relPath);
+        s_inst.addProperty("highlight",   &Private::highlight);
+        s_inst.addProperty("subhighlight",&Private::subhighlight);
+        s_inst.addProperty("title",       &Private::title);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     typedef bool (MemberDef::*MemberFunc)() const;
     TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const
@@ -6719,9 +7943,12 @@ class GlobalsIndexContext::Private : public PropertyMapper
       SharedPtr<TemplateList> macros;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<GlobalsIndexContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<GlobalsIndexContext::Private> GlobalsIndexContext::Private::s_inst;
+
 GlobalsIndexContext::GlobalsIndexContext() : RefCountedContext("GlobalsIndexContext")
 {
   p = new Private;
@@ -6741,26 +7968,35 @@ TemplateVariant GlobalsIndexContext::get(const char *name) const
 
 //%% struct ClassMembersIndex: list of examples page
 //%% {
-class ClassMembersIndexContext::Private : public PropertyMapper
+class ClassMembersIndexContext::Private
 {
   public:
     Private()
     {
-      addProperty("all",         this,&Private::all);
-      addProperty("functions",   this,&Private::functions);
-      addProperty("variables",   this,&Private::variables);
-      addProperty("typedefs",    this,&Private::typedefs);
-      addProperty("enums",       this,&Private::enums);
-      addProperty("enumValues",  this,&Private::enumValues);
-      addProperty("macros",      this,&Private::macros);
-      addProperty("properties",  this,&Private::properties);
-      addProperty("events",      this,&Private::events);
-      addProperty("related",     this,&Private::related);
-      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);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("all",         &Private::all);
+        s_inst.addProperty("functions",   &Private::functions);
+        s_inst.addProperty("variables",   &Private::variables);
+        s_inst.addProperty("typedefs",    &Private::typedefs);
+        s_inst.addProperty("enums",       &Private::enums);
+        s_inst.addProperty("enumValues",  &Private::enumValues);
+        s_inst.addProperty("macros",      &Private::macros);
+        s_inst.addProperty("properties",  &Private::properties);
+        s_inst.addProperty("events",      &Private::events);
+        s_inst.addProperty("related",     &Private::related);
+        s_inst.addProperty("fileName",    &Private::fileName);
+        s_inst.addProperty("relPath",     &Private::relPath);
+        s_inst.addProperty("highlight",   &Private::highlight);
+        s_inst.addProperty("subhighlight",&Private::subhighlight);
+        s_inst.addProperty("title",       &Private::title);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     typedef bool (MemberDef::*MemberFunc)() const;
     TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const
@@ -6866,9 +8102,12 @@ class ClassMembersIndexContext::Private : public PropertyMapper
       SharedPtr<TemplateList> related;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<ClassMembersIndexContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<ClassMembersIndexContext::Private> ClassMembersIndexContext::Private::s_inst;
+
 ClassMembersIndexContext::ClassMembersIndexContext() : RefCountedContext("ClassMembersIndexContext")
 {
   p = new Private;
@@ -6888,26 +8127,35 @@ TemplateVariant ClassMembersIndexContext::get(const char *name) const
 
 //%% struct NamespaceMembersIndex: list of examples page
 //%% {
-class NamespaceMembersIndexContext::Private : public PropertyMapper
+class NamespaceMembersIndexContext::Private
 {
   public:
     Private()
     {
-      addProperty("all",         this,&Private::all);
-      addProperty("functions",   this,&Private::functions);
-      addProperty("variables",   this,&Private::variables);
-      addProperty("typedefs",    this,&Private::typedefs);
-      addProperty("enums",       this,&Private::enums);
-      addProperty("enumValues",  this,&Private::enumValues);
-      addProperty("macros",      this,&Private::macros);
-      addProperty("properties",  this,&Private::properties);
-      addProperty("events",      this,&Private::events);
-      addProperty("related",     this,&Private::related);
-      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);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("all",         &Private::all);
+        s_inst.addProperty("functions",   &Private::functions);
+        s_inst.addProperty("variables",   &Private::variables);
+        s_inst.addProperty("typedefs",    &Private::typedefs);
+        s_inst.addProperty("enums",       &Private::enums);
+        s_inst.addProperty("enumValues",  &Private::enumValues);
+        s_inst.addProperty("macros",      &Private::macros);
+        s_inst.addProperty("properties",  &Private::properties);
+        s_inst.addProperty("events",      &Private::events);
+        s_inst.addProperty("related",     &Private::related);
+        s_inst.addProperty("fileName",    &Private::fileName);
+        s_inst.addProperty("relPath",     &Private::relPath);
+        s_inst.addProperty("highlight",   &Private::highlight);
+        s_inst.addProperty("subhighlight",&Private::subhighlight);
+        s_inst.addProperty("title",       &Private::title);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     typedef bool (MemberDef::*MemberFunc)() const;
     TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const
@@ -7010,9 +8258,12 @@ class NamespaceMembersIndexContext::Private : public PropertyMapper
       SharedPtr<TemplateList> enumValues;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<NamespaceMembersIndexContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<NamespaceMembersIndexContext::Private> NamespaceMembersIndexContext::Private::s_inst;
+
 NamespaceMembersIndexContext::NamespaceMembersIndexContext() : RefCountedContext("NamespaceMembersIndexContext")
 {
   p = new Private;
@@ -7032,12 +8283,21 @@ TemplateVariant NamespaceMembersIndexContext::get(const char *name) const
 
 //%% struct InheritanceGraph: a connected graph reprenting part of the overall interitance tree
 //%% {
-class InheritanceGraphContext::Private : public PropertyMapper
+class InheritanceGraphContext::Private
 {
   public:
     Private(DotGfxHierarchyTable *hierarchy,DotNode *n,int id) : m_hierarchy(hierarchy), m_node(n), m_id(id)
     {
-      addProperty("graph",this,&Private::graph);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("graph",&Private::graph);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant graph() const
     {
@@ -7060,8 +8320,11 @@ class InheritanceGraphContext::Private : public PropertyMapper
     DotGfxHierarchyTable *m_hierarchy;
     DotNode *m_node;
     int m_id;
+    static PropertyMapper<InheritanceGraphContext::Private> s_inst;
 };
 
+PropertyMapper<InheritanceGraphContext::Private> InheritanceGraphContext::Private::s_inst;
+
 InheritanceGraphContext::InheritanceGraphContext(DotGfxHierarchyTable *hierarchy,DotNode *n,int id)
    : RefCountedContext("InheritanceGraphContext")
 {
@@ -7083,13 +8346,22 @@ TemplateVariant InheritanceGraphContext::get(const char *name) const
 
 //%% struct InheritanceNode: a class in the inheritance list
 //%% {
-class InheritanceNodeContext::Private : public PropertyMapper
+class InheritanceNodeContext::Private
 {
   public:
     Private(ClassDef *cd,const QCString &name) : m_classDef(cd), m_name(name)
     {
-      addProperty("class",this,&Private::getClass);
-      addProperty("name",this,&Private::name);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("class",&Private::getClass);
+        s_inst.addProperty("name", &Private::name);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant getClass() const
     {
@@ -7107,9 +8379,12 @@ class InheritanceNodeContext::Private : public PropertyMapper
     ClassDef *m_classDef;
     mutable SharedPtr<ClassContext> m_classContext;
     QCString m_name;
+    static PropertyMapper<InheritanceNodeContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<InheritanceNodeContext::Private> InheritanceNodeContext::Private::s_inst;
+
 InheritanceNodeContext::InheritanceNodeContext(ClassDef *cd,const QCString &name) : RefCountedContext("InheritanceNodeContext")
 {
   p = new Private(cd,name);
@@ -7264,19 +8539,28 @@ TemplateListIntf::ConstIterator *MemberListContext::createIterator() const
 
 //%% struct MemberInfo: member information
 //%% {
-class MemberInfoContext::Private : public PropertyMapper
+class MemberInfoContext::Private
 {
   public:
     Private(const MemberInfo *mi) : m_memberInfo(mi)
     {
-      //%% string protection
-      addProperty("protection",this,&Private::protection);
-      //%% string virtualness
-      addProperty("virtualness",this,&Private::virtualness);
-      //%% string ambiguityScope
-      addProperty("ambiguityScope",this,&Private::ambiguityScope);
-      //%% Member member
-      addProperty("member",this,&Private::member);
+      static bool init=FALSE;
+      if (!init)
+      {
+        //%% string protection
+        s_inst.addProperty("protection",    &Private::protection);
+        //%% string virtualness
+        s_inst.addProperty("virtualness",   &Private::virtualness);
+        //%% string ambiguityScope
+        s_inst.addProperty("ambiguityScope",&Private::ambiguityScope);
+        //%% Member member
+        s_inst.addProperty("member",        &Private::member);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant protection() const
     {
@@ -7321,9 +8605,12 @@ class MemberInfoContext::Private : public PropertyMapper
   private:
     const MemberInfo *m_memberInfo;
     mutable SharedPtr<MemberContext> m_member;
+    static PropertyMapper<MemberInfoContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<MemberInfoContext::Private> MemberInfoContext::Private::s_inst;
+
 MemberInfoContext::MemberInfoContext(const MemberInfo *mi) : RefCountedContext("MemberInfoContext")
 {
   p = new Private(mi);
@@ -7413,7 +8700,7 @@ TemplateListIntf::ConstIterator *AllMembersListContext::createIterator() const
 
 //%% struct MemberGroupInfo: member group information
 //%% {
-class MemberGroupInfoContext::Private : public PropertyMapper
+class MemberGroupInfoContext::Private
 {
   public:
     Private(Definition *def,const QCString &relPath,const MemberGroup *mg) :
@@ -7421,13 +8708,22 @@ class MemberGroupInfoContext::Private : public PropertyMapper
       m_relPath(relPath),
       m_memberGroup(mg)
     {
-      addProperty("members",      this,&Private::members);
-      addProperty("title",        this,&Private::groupTitle);
-      addProperty("subtitle",     this,&Private::groupSubtitle);
-      addProperty("anchor",       this,&Private::groupAnchor);
-      addProperty("memberGroups", this,&Private::memberGroups);
-      addProperty("docs",         this,&Private::docs);
-      addProperty("inherited",    this,&Private::inherited);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("members",      &Private::members);
+        s_inst.addProperty("title",        &Private::groupTitle);
+        s_inst.addProperty("subtitle",     &Private::groupSubtitle);
+        s_inst.addProperty("anchor",       &Private::groupAnchor);
+        s_inst.addProperty("memberGroups", &Private::memberGroups);
+        s_inst.addProperty("docs",         &Private::docs);
+        s_inst.addProperty("inherited",    &Private::inherited);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant members() const
     {
@@ -7491,9 +8787,12 @@ class MemberGroupInfoContext::Private : public PropertyMapper
       ScopedPtr<TemplateVariant>        docs;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<MemberGroupInfoContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<MemberGroupInfoContext::Private> MemberGroupInfoContext::Private::s_inst;
+
 MemberGroupInfoContext::MemberGroupInfoContext(Definition *def,
        const QCString &relPath,const MemberGroup *mg) : RefCountedContext("MemberGroupInfoContext")
 {
@@ -7584,7 +8883,7 @@ TemplateListIntf::ConstIterator *MemberGroupListContext::createIterator() const
 
 //%% struct MemberListInfo: member list information
 //%% {
-class MemberListInfoContext::Private : public PropertyMapper
+class MemberListInfoContext::Private
 {
   public:
     Private(Definition *def,const QCString &relPath,const MemberList *ml,const QCString &title,const QCString &subtitle) :
@@ -7594,12 +8893,21 @@ class MemberListInfoContext::Private : public PropertyMapper
       m_title(title),
       m_subtitle(subtitle)
     {
-      addProperty("members",      this,&Private::members);
-      addProperty("title",        this,&Private::title);
-      addProperty("subtitle",     this,&Private::subtitle);
-      addProperty("anchor",       this,&Private::anchor);
-      addProperty("memberGroups", this,&Private::memberGroups);
-      addProperty("inherited",    this,&Private::inherited);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("members",      &Private::members);
+        s_inst.addProperty("title",        &Private::title);
+        s_inst.addProperty("subtitle",     &Private::subtitle);
+        s_inst.addProperty("anchor",       &Private::anchor);
+        s_inst.addProperty("memberGroups", &Private::memberGroups);
+        s_inst.addProperty("inherited",    &Private::inherited);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant members() const
     {
@@ -7660,9 +8968,12 @@ class MemberListInfoContext::Private : public PropertyMapper
       SharedPtr<InheritedMemberInfoListContext> inherited;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<MemberListInfoContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<MemberListInfoContext::Private> MemberListInfoContext::Private::s_inst;
+
 MemberListInfoContext::MemberListInfoContext(
            Definition *def,const QCString &relPath,const MemberList *ml,
            const QCString &title,const QCString &subtitle) : RefCountedContext("MemberListInfoContext")
@@ -7684,17 +8995,26 @@ TemplateVariant MemberListInfoContext::get(const char *name) const
 
 //%% struct InheritedMemberInfo: inherited member information
 //%% {
-class InheritedMemberInfoContext::Private : public PropertyMapper
+class InheritedMemberInfoContext::Private
 {
   public:
     Private(ClassDef *cd,MemberList *ml,const QCString &title)
       : m_class(cd), m_memberList(ml), m_title(title)
     {
-      addProperty("class",         this,&Private::getClass);
-      addProperty("title",         this,&Private::title);
-      addProperty("members",       this,&Private::members);
-      addProperty("id",            this,&Private::id);
-      addProperty("inheritedFrom", this,&Private::inheritedFrom);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("class",         &Private::getClass);
+        s_inst.addProperty("title",         &Private::title);
+        s_inst.addProperty("members",       &Private::members);
+        s_inst.addProperty("id",            &Private::id);
+        s_inst.addProperty("inheritedFrom", &Private::inheritedFrom);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     virtual ~Private()
     {
@@ -7743,9 +9063,12 @@ class InheritedMemberInfoContext::Private : public PropertyMapper
     mutable SharedPtr<ClassContext> m_classCtx;
     mutable SharedPtr<MemberListContext> m_memberListCtx;
     mutable SharedPtr<TemplateList> m_inheritedFrom;
+    static PropertyMapper<InheritedMemberInfoContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<InheritedMemberInfoContext::Private> InheritedMemberInfoContext::Private::s_inst;
+
 InheritedMemberInfoContext::InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,
                                                        const QCString &title) : RefCountedContext("InheritedMemberInfoContext")
 {
@@ -7922,19 +9245,28 @@ TemplateListIntf::ConstIterator *InheritedMemberInfoListContext::createIterator(
 
 //%% struct Argument: parameter information
 //%% {
-class ArgumentContext::Private : public PropertyMapper
+class ArgumentContext::Private
 {
   public:
     Private(const Argument *arg,Definition *def,const QCString &relPath) :
       m_argument(arg), m_def(def), m_relPath(relPath)
     {
-      addProperty("type",     this,&Private::type);
-      addProperty("name",     this,&Private::name);
-      addProperty("defVal",   this,&Private::defVal);
-      addProperty("docs",     this,&Private::docs);
-      addProperty("attrib",   this,&Private::attrib);
-      addProperty("array",    this,&Private::array);
-      addProperty("namePart", this,&Private::namePart);
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("type",     &Private::type);
+        s_inst.addProperty("name",     &Private::name);
+        s_inst.addProperty("defVal",   &Private::defVal);
+        s_inst.addProperty("docs",     &Private::docs);
+        s_inst.addProperty("attrib",   &Private::attrib);
+        s_inst.addProperty("array",    &Private::array);
+        s_inst.addProperty("namePart", &Private::namePart);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
     }
     TemplateVariant type() const
     {
@@ -7993,9 +9325,12 @@ class ArgumentContext::Private : public PropertyMapper
       ScopedPtr<TemplateVariant> docs;
     };
     mutable Cachable m_cache;
+    static PropertyMapper<ArgumentContext::Private> s_inst;
 };
 //%% }
 
+PropertyMapper<ArgumentContext::Private> ArgumentContext::Private::s_inst;
+
 ArgumentContext::ArgumentContext(const Argument *al,Definition *def,const QCString &relPath) : RefCountedContext("ArgumentContext")
 {
   p = new Private(al,def,relPath);
@@ -8066,81 +9401,639 @@ TemplateListIntf::ConstIterator *ArgumentListContext::createIterator() const
 
 //------------------------------------------------------------------------
 
-class HtmlEscaper : public TemplateEscapeIntf
-{
-  public:
-    QCString escape(const QCString &s)
-    {
-      return convertToHtml(s,TRUE);
-    }
-};
+// SymbolIndex
+//  - name: string
+//  - letter: string
+//  - symbolGroups: SymbolGroupList
+// SymbolGroupList: list of SymbolGroups
+// SymbolGroup
+//  - id
+//  - name
+//  - symbols: SymbolList
+// SymbolList: list of Symbols
+// Symbol
+//  - obj
+//  - scope
+//  - relPath
 
 //------------------------------------------------------------------------
 
-class HtmlSpaceless : public TemplateSpacelessIntf
+//%% struct SymbolGroup: search group of similar symbols
+//%% {
+class SymbolContext::Private
 {
   public:
-    HtmlSpaceless() { reset(); }
-    void reset()
+    Private(const Definition *d,const Definition *prev,
+            const Definition *next) : m_def(d), m_prevDef(prev), m_nextDef(next)
     {
-      m_insideTag = FALSE;
-      m_insideString = '\0';
-      m_removeSpaces = TRUE;
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("fileName",&Private::fileName);
+        s_inst.addProperty("anchor",  &Private::anchor);
+        s_inst.addProperty("scope",   &Private::scope);
+        s_inst.addProperty("relPath", &Private::relPath);
+        init=TRUE;
+      }
     }
-    QCString remove(const QCString &s)
+    TemplateVariant get(const char *n) const
     {
-      QGString result;
-      const char *p = s.data();
-      char c;
-      while ((c=*p++))
+      return s_inst.get(this,n);
+    }
+    TemplateVariant fileName() const
+    {
+      return m_def->getOutputFileBase();
+    }
+    TemplateVariant anchor() const
+    {
+      return m_def->anchor();
+    }
+    TemplateVariant scope() const
+    {
+      const Definition *scope     = m_def->getOuterScope();
+      const Definition *next      = m_nextDef;
+      const Definition *prev      = m_prevDef;
+      const Definition *nextScope = next ? next->getOuterScope() : 0;
+      const Definition *prevScope = prev ? prev->getOuterScope() : 0;
+      bool isMemberDef            = m_def->definitionType()==Definition::TypeMember;
+      const MemberDef  *md        = isMemberDef ? (const MemberDef*)m_def : 0;
+      bool isFunctionLike   = md && (md->isFunction() || md->isSlot() || md->isSignal());
+      bool overloadedFunction = isFunctionLike &&
+                                ((prevScope!=0 && scope==prevScope) || (scope && scope==nextScope));
+      QCString prefix;
+      if (md) prefix=md->localName();
+      if (overloadedFunction) // overloaded member function
       {
-        switch(c)
+        prefix+=md->argsString();
+        // show argument list to disambiguate overloaded functions
+      }
+      else if (md && isFunctionLike) // unique member function
+      {
+        prefix+="()"; // only to show it is a function
+      }
+      bool found=FALSE;
+      QCString name;
+      if (m_def->definitionType()==Definition::TypeClass)
+      {
+        name = m_def->displayName();
+        found = TRUE;
+      }
+      else if (m_def->definitionType()==Definition::TypeNamespace)
+      {
+        name = m_def->displayName();
+        found = TRUE;
+      }
+      else if (scope==0 || scope==Doxygen::globalScope) // in global scope
+      {
+        if (md)
         {
-          case '<': // start of a tag
-            if (!m_insideString) m_insideTag=TRUE,m_removeSpaces=FALSE;
-            result+=c;
-            break;
-          case '>': // end of a tag
-            if (!m_insideString) m_insideTag=FALSE,m_removeSpaces=TRUE;
-            result+=c;
-            break;
-          case '\\': // escaped character in a string
-            result+=c;
-            if (m_insideString && *p) result+=*p++;
-            break;
-          case '"': case '\'':
-            if (m_insideTag)
-            {
-              if (m_insideString==c) // end of string
-              {
-                m_insideString='\0';
-              }
-              else if (m_insideString=='\0') // start of string
-              {
-                m_insideString=c;
-              }
-            }
-            result+=c;
-            break;
-          case ' ': case '\t': case '\n': // whitespace
-            if (!m_insideTag) // outside tags strip consecutive whitespace
-            {
-              m_removeSpaces=TRUE;
-            }
-            else
-            {
-              result+=' ';
-            }
-            break;
-          default:
-            //if (m_removeSpaces) result+=' ';
-            result+=c;
-            m_removeSpaces=FALSE;
-            break;
+          FileDef *fd = md->getBodyDef();
+          if (fd==0) fd = md->getFileDef();
+          if (fd)
+          {
+            if (!prefix.isEmpty()) prefix+=": ";
+            name = prefix + convertToXML(fd->localName());
+            found = TRUE;
+          }
         }
       }
-      result+='\0';
-      //printf("HtmlSpaceless::remove({%s})={%s} m_insideTag=%d m_insideString=%c (%d) removeSpaces=%d\n",s.data(),result.data(),
+      else if (md && (md->getClassDef() || md->getNamespaceDef()))
+        // member in class or namespace scope
+      {
+        SrcLangExt lang = md->getLanguage();
+        name = m_def->getOuterScope()->qualifiedName()
+          + getLanguageSpecificSeparator(lang) + prefix;
+        found = TRUE;
+      }
+      else if (scope) // some thing else? -> show scope
+      {
+        name = prefix + convertToXML(scope->name());
+        found = TRUE;
+      }
+      if (!found) // fallback
+      {
+        name = prefix + "("+theTranslator->trGlobalNamespace()+")";
+      }
+      return name;
+    }
+    TemplateVariant relPath() const
+    {
+      return externalRef("../",m_def->getReference(),TRUE);
+    }
+  private:
+    const Definition *m_def;
+    const Definition *m_prevDef;
+    const Definition *m_nextDef;
+    static PropertyMapper<SymbolContext::Private> s_inst;
+};
+//%% }
+
+PropertyMapper<SymbolContext::Private> SymbolContext::Private::s_inst;
+
+SymbolContext::SymbolContext(const Definition *def,const Definition *prevDef,const Definition *nextDef)
+    : RefCountedContext("SymbolContext")
+{
+  p = new Private(def,prevDef,nextDef);
+}
+
+SymbolContext::~SymbolContext()
+{
+  delete p;
+}
+
+TemplateVariant SymbolContext::get(const char *name) const
+{
+  return p->get(name);
+}
+
+//------------------------------------------------------------------------
+
+//%% list SymbolList[Symbol] : list of search symbols with the same name
+class SymbolListContext::Private : public GenericNodeListContext
+{
+  public:
+    Private(const SearchDefinitionList *sdl)
+    {
+      QListIterator<Definition> li(*sdl);
+      Definition *def;
+      Definition *prev = 0;
+      for (li.toFirst();(def=li.current());)
+      {
+        ++li;
+        const Definition *next = li.current();
+        append(SymbolContext::alloc(def,prev,next));
+        prev = def;
+      }
+    }
+};
+
+SymbolListContext::SymbolListContext(const SearchDefinitionList *sdl)
+    : RefCountedContext("SymbolListContext")
+{
+  p = new Private(sdl);
+}
+
+SymbolListContext::~SymbolListContext()
+{
+  delete p;
+}
+
+// TemplateListIntf
+int SymbolListContext::count() const
+{
+  return p->count();
+}
+
+TemplateVariant SymbolListContext::at(int index) const
+{
+  return p->at(index);
+}
+
+TemplateListIntf::ConstIterator *SymbolListContext::createIterator() const
+{
+  return p->createIterator();
+}
+
+//------------------------------------------------------------------------
+
+//%% struct SymbolGroup: search group of similar symbols
+//%% {
+class SymbolGroupContext::Private
+{
+  public:
+    Private(const SearchDefinitionList *sdl) : m_sdl(sdl)
+    {
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("id",     &Private::id);
+        s_inst.addProperty("name",   &Private::name);
+        s_inst.addProperty("symbols",&Private::symbolList);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
+    TemplateVariant id() const
+    {
+      return m_sdl->id();
+    }
+    TemplateVariant name() const
+    {
+      return m_sdl->name();
+    }
+    TemplateVariant symbolList() const
+    {
+      if (!m_cache.symbolList)
+      {
+        m_cache.symbolList.reset(SymbolListContext::alloc(m_sdl));
+      }
+      return m_cache.symbolList.get();
+    }
+  private:
+    const SearchDefinitionList *m_sdl;
+    struct Cachable
+    {
+      SharedPtr<SymbolListContext> symbolList;
+    };
+    mutable Cachable m_cache;
+    static PropertyMapper<SymbolGroupContext::Private> s_inst;
+};
+//%% }
+
+PropertyMapper<SymbolGroupContext::Private> SymbolGroupContext::Private::s_inst;
+
+SymbolGroupContext::SymbolGroupContext(const SearchDefinitionList *sdl)
+    : RefCountedContext("SymbolGroupContext")
+{
+  p = new Private(sdl);
+}
+
+SymbolGroupContext::~SymbolGroupContext()
+{
+  delete p;
+}
+
+TemplateVariant SymbolGroupContext::get(const char *name) const
+{
+  return p->get(name);
+}
+
+//------------------------------------------------------------------------
+
+//%% list SymbolGroupList[SymbolGroup] : list of search groups one per by name
+class SymbolGroupListContext::Private : public GenericNodeListContext
+{
+  public:
+    Private(const SearchIndexList *sil)
+    {
+      SDict<SearchDefinitionList>::Iterator li(*sil);
+      SearchDefinitionList *dl;
+      for (li.toFirst();(dl=li.current());++li)
+      {
+        append(SymbolGroupContext::alloc(dl));
+      }
+    }
+};
+
+SymbolGroupListContext::SymbolGroupListContext(const SearchIndexList *sil) 
+    : RefCountedContext("SymbolGroupListContext")
+{
+  p = new Private(sil);
+}
+
+SymbolGroupListContext::~SymbolGroupListContext()
+{
+  delete p;
+}
+
+// TemplateListIntf
+int SymbolGroupListContext::count() const
+{
+  return p->count();
+}
+
+TemplateVariant SymbolGroupListContext::at(int index) const
+{
+  return p->at(index);
+}
+
+TemplateListIntf::ConstIterator *SymbolGroupListContext::createIterator() const
+{
+  return p->createIterator();
+}
+
+//------------------------------------------------------------------------
+
+//%% struct SymbolIndex: search index
+//%% {
+class SymbolIndexContext::Private
+{
+  public:
+    Private(const SearchIndexList *sl,const QCString &name) : m_searchList(sl), m_name(name)
+    {
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("name",        &Private::name);
+        s_inst.addProperty("letter",      &Private::letter);
+        s_inst.addProperty("symbolGroups",&Private::symbolGroups);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
+    TemplateVariant name() const
+    {
+      return m_name;
+    }
+    TemplateVariant letter() const
+    {
+      return QString(QChar(m_searchList->letter())).utf8();
+    }
+    TemplateVariant symbolGroups() const
+    {
+      if (!m_cache.symbolGroups)
+      {
+        m_cache.symbolGroups.reset(SymbolGroupListContext::alloc(m_searchList));
+      }
+      return m_cache.symbolGroups.get();
+    }
+  private:
+    const SearchIndexList *m_searchList;
+    QCString m_name;
+    struct Cachable
+    {
+      SharedPtr<SymbolGroupListContext> symbolGroups;
+    };
+    mutable Cachable m_cache;
+    static PropertyMapper<SymbolIndexContext::Private> s_inst;
+};
+//%% }
+
+PropertyMapper<SymbolIndexContext::Private> SymbolIndexContext::Private::s_inst;
+
+SymbolIndexContext::SymbolIndexContext(const SearchIndexList *sl,const QCString &name)
+    : RefCountedContext("SymbolIndexContext")
+{
+  p = new Private(sl,name);
+}
+
+SymbolIndexContext::~SymbolIndexContext()
+{
+  delete p;
+}
+
+TemplateVariant SymbolIndexContext::get(const char *name) const
+{
+  return p->get(name);
+}
+
+//------------------------------------------------------------------------
+
+//%% list SymbolIndices[SymbolIndex] : list of search indices one per by type
+class SymbolIndicesContext::Private : public GenericNodeListContext
+{
+  public:
+    Private(const SearchIndexInfo *info)
+    {
+      // use info->symbolList to populate the list
+      SIntDict<SearchIndexList>::Iterator it(info->symbolList);
+      const SearchIndexList *sl;
+      for (it.toFirst();(sl=it.current());++it) // for each letter
+      {
+        append(SymbolIndexContext::alloc(sl,info->name));
+      }
+    }
+};
+
+SymbolIndicesContext::SymbolIndicesContext(const SearchIndexInfo *info) : RefCountedContext("SymbolIndicesContext")
+{
+  p = new Private(info);
+}
+
+SymbolIndicesContext::~SymbolIndicesContext()
+{
+  delete p;
+}
+
+// TemplateListIntf
+int SymbolIndicesContext::count() const
+{
+  return p->count();
+}
+
+TemplateVariant SymbolIndicesContext::at(int index) const
+{
+  return p->at(index);
+}
+
+TemplateListIntf::ConstIterator *SymbolIndicesContext::createIterator() const
+{
+  return p->createIterator();
+}
+
+//------------------------------------------------------------------------
+
+//%% struct SearchIndex: search index
+//%% {
+class SearchIndexContext::Private
+{
+  public:
+    Private(const SearchIndexInfo *info) : m_info(info)
+    {
+      static bool init=FALSE;
+      if (!init)
+      {
+        s_inst.addProperty("name",         &Private::name);
+        s_inst.addProperty("text",         &Private::text);
+        s_inst.addProperty("symbolIndices",&Private::symbolIndices);
+        init=TRUE;
+      }
+    }
+    TemplateVariant get(const char *n) const
+    {
+      return s_inst.get(this,n);
+    }
+    TemplateVariant name() const
+    {
+      return m_info->name;
+    }
+    TemplateVariant text() const
+    {
+      return m_info->text;
+    }
+    TemplateVariant symbolIndices() const
+    {
+      if (!m_cache.symbolIndices)
+      {
+        m_cache.symbolIndices.reset(SymbolIndicesContext::alloc(m_info));
+      }
+      return m_cache.symbolIndices.get();
+    }
+  private:
+    const SearchIndexInfo *m_info;
+    struct Cachable
+    {
+      SharedPtr<SymbolIndicesContext> symbolIndices;
+    };
+    mutable Cachable m_cache;
+    static PropertyMapper<SearchIndexContext::Private> s_inst;
+};
+//%% }
+
+PropertyMapper<SearchIndexContext::Private> SearchIndexContext::Private::s_inst;
+
+SearchIndexContext::SearchIndexContext(const SearchIndexInfo *info)
+    : RefCountedContext("SearchIndexContext")
+{
+  p = new Private(info);
+}
+
+SearchIndexContext::~SearchIndexContext()
+{
+  delete p;
+}
+
+TemplateVariant SearchIndexContext::get(const char *name) const
+{
+  return p->get(name);
+}
+
+//------------------------------------------------------------------------
+
+//%% list SearchIndices[SearchIndex] : list of search indices one per by type
+class SearchIndicesContext::Private : public GenericNodeListContext
+{
+  public:
+    Private()
+    {
+      const SearchIndexInfo *indices = getSearchIndices();
+      for (int i=0;i<NUM_SEARCH_INDICES;i++)
+      {
+        append(SearchIndexContext::alloc(&indices[i]));
+      }
+    }
+};
+
+SearchIndicesContext::SearchIndicesContext() : RefCountedContext("SearchIndicesContext")
+{
+  p = new Private;
+}
+
+SearchIndicesContext::~SearchIndicesContext()
+{
+  delete p;
+}
+
+// TemplateListIntf
+int SearchIndicesContext::count() const
+{
+  return p->count();
+}
+
+TemplateVariant SearchIndicesContext::at(int index) const
+{
+  return p->at(index);
+}
+
+TemplateListIntf::ConstIterator *SearchIndicesContext::createIterator() const
+{
+  return p->createIterator();
+}
+
+
+//------------------------------------------------------------------------
+
+class HtmlEscaper : public TemplateEscapeIntf
+{
+  public:
+    QCString escape(const QCString &s)
+    {
+      return convertToHtml(s,TRUE);
+    }
+    void enableTabbing(bool) {}
+};
+
+//------------------------------------------------------------------------
+
+class LatexSpaceless : public TemplateSpacelessIntf
+{
+  public:
+    LatexSpaceless() { reset(); }
+    void reset() { }
+    QCString remove(const QCString &s)
+    {
+      QGString result;
+      const char *p = s.data();
+      char c;
+      while ((c=*p++))
+      {
+        switch(c)
+        {
+          case '\t': case ' ': case '\n':
+            break;
+          default:
+            result+=c;
+            break;
+        }
+      }
+      result+='\0';
+      return result.data();
+    }
+  private:
+};
+
+//------------------------------------------------------------------------
+
+class HtmlSpaceless : public TemplateSpacelessIntf
+{
+  public:
+    HtmlSpaceless() { reset(); }
+    void reset()
+    {
+      m_insideTag = FALSE;
+      m_insideString = '\0';
+      m_removeSpaces = TRUE;
+    }
+    QCString remove(const QCString &s)
+    {
+      QGString result;
+      const char *p = s.data();
+      char c;
+      while ((c=*p++))
+      {
+        switch(c)
+        {
+          case '<': // start of a tag
+            if (!m_insideString) m_insideTag=TRUE,m_removeSpaces=FALSE;
+            result+=c;
+            break;
+          case '>': // end of a tag
+            if (!m_insideString) m_insideTag=FALSE,m_removeSpaces=TRUE;
+            result+=c;
+            break;
+          case '\\': // escaped character in a string
+            result+=c;
+            if (m_insideString && *p) result+=*p++;
+            break;
+          case '"': case '\'':
+            if (m_insideTag)
+            {
+              if (m_insideString==c) // end of string
+              {
+                m_insideString='\0';
+              }
+              else if (m_insideString=='\0') // start of string
+              {
+                m_insideString=c;
+              }
+            }
+            result+=c;
+            break;
+          case ' ': case '\t': case '\n': // whitespace
+            if (!m_insideTag) // outside tags strip consecutive whitespace
+            {
+              m_removeSpaces=TRUE;
+            }
+            else
+            {
+              result+=' ';
+            }
+            break;
+          default:
+            //if (m_removeSpaces) result+=' ';
+            result+=c;
+            m_removeSpaces=FALSE;
+            break;
+        }
+      }
+      result+='\0';
+      //printf("HtmlSpaceless::remove({%s})={%s} m_insideTag=%d m_insideString=%c (%d) removeSpaces=%d\n",s.data(),result.data(),
       //    m_insideTag,m_insideString,m_insideString,m_removeSpaces);
       return result.data();
     }
@@ -8152,12 +10045,29 @@ class HtmlSpaceless : public TemplateSpacelessIntf
 
 //------------------------------------------------------------------------
 
+class LatexEscaper : public TemplateEscapeIntf
+{
+  public:
+    LatexEscaper() : m_tabbing(FALSE) {}
+    QCString escape(const QCString &s)
+    {
+      return convertToLaTeX(s,m_tabbing);
+    }
+    void enableTabbing(bool b) { m_tabbing=b; }
+  private:
+    bool m_tabbing;
+};
+
+
+//------------------------------------------------------------------------
+
 #if DEBUG_REF
 int RefCountedContext::s_totalCount;
 #endif
 
 void generateOutputViaTemplate()
 {
+  msg("Generating output via template engine...\n");
   {
     TemplateEngine e;
     TemplateContext *ctx = e.createContext();
@@ -8175,14 +10085,16 @@ void generateOutputViaTemplate()
       SharedPtr<DirListContext>               dirList              (DirListContext::alloc());
       SharedPtr<FileListContext>              fileList             (FileListContext::alloc());
       SharedPtr<FileTreeContext>              fileTree             (FileTreeContext::alloc());
-      SharedPtr<PageTreeContext>              pageTree             (PageTreeContext::alloc());
+      SharedPtr<PageTreeContext>              pageTree             (PageTreeContext::alloc(Doxygen::pageSDict));
       SharedPtr<PageListContext>              pageList             (PageListContext::alloc(Doxygen::pageSDict));
+      SharedPtr<ExampleTreeContext>           exampleTree          (ExampleTreeContext::alloc());
       SharedPtr<ExampleListContext>           exampleList          (ExampleListContext::alloc());
       SharedPtr<ModuleTreeContext>            moduleTree           (ModuleTreeContext::alloc());
       SharedPtr<ModuleListContext>            moduleList           (ModuleListContext::alloc());
       SharedPtr<GlobalsIndexContext>          globalsIndex         (GlobalsIndexContext::alloc());
       SharedPtr<ClassMembersIndexContext>     classMembersIndex    (ClassMembersIndexContext::alloc());
       SharedPtr<NamespaceMembersIndexContext> namespaceMembersIndex(NamespaceMembersIndexContext::alloc());
+      SharedPtr<SearchIndicesContext>         searchIndices        (SearchIndicesContext::alloc());
 
       //%% Doxygen doxygen:
       ctx->set("doxygen",doxygen.get());
@@ -8210,6 +10122,8 @@ void generateOutputViaTemplate()
       ctx->set("pageList",pageList.get());
       //%% PageTree pageTree
       ctx->set("pageTree",pageTree.get());
+      //%% ExampleTree exampleTree
+      ctx->set("exampleTree",exampleTree.get());
       //%% ExampleList exampleList
       ctx->set("exampleList",exampleList.get());
       //%% ModuleTree moduleTree
@@ -8221,15 +10135,15 @@ void generateOutputViaTemplate()
       //%% Page mainPage
       if (Doxygen::mainPage)
       {
-        SharedPtr<PageContext> mainPage(PageContext::alloc(Doxygen::mainPage,TRUE));
+        SharedPtr<PageContext> mainPage(PageContext::alloc(Doxygen::mainPage,TRUE,FALSE));
         ctx->set("mainPage",mainPage.get());
       }
       else
       {
         // TODO: for LaTeX output index should be main... => solve in template
         Doxygen::mainPage = new PageDef("[generated]",1,"index","",theTranslator->trMainPage());
-        Doxygen::mainPage->setFileName("index",TRUE);
-        SharedPtr<PageContext> mainPage(PageContext::alloc(Doxygen::mainPage,TRUE));
+        Doxygen::mainPage->setFileName("index");
+        SharedPtr<PageContext> mainPage(PageContext::alloc(Doxygen::mainPage,TRUE,FALSE));
         ctx->set("mainPage",mainPage.get());
       }
       //%% GlobalsIndex globalsIndex:
@@ -8238,27 +10152,77 @@ void generateOutputViaTemplate()
       ctx->set("classMembersIndex",classMembersIndex.get());
       //%% NamespaceMembersIndex namespaceMembersIndex:
       ctx->set("namespaceMembersIndex",namespaceMembersIndex.get());
+      //%% SearchIndicaes searchindicaes
+      ctx->set("searchIndices",searchIndices.get());
+      //%% string space
+      ctx->set("space"," ");
+
+      //if (Config_getBool("GENERATE_HTML"))
+      { // render HTML output
+        Template *tpl = e.loadByName("htmllayout.tpl",1);
+        if (tpl)
+        {
+          g_globals.outputFormat = ContextOutputFormat_Html;
+          g_globals.dynSectionId = 0;
+          g_globals.outputDir    = Config_getString("HTML_OUTPUT");
+          QDir dir(g_globals.outputDir);
+          createSubDirs(dir);
+          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: clean index before each run...
 
-      // render HTML output
-      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");
-        QDir dir(g_globals.outputDir);
-        createSubDirs(dir);
-        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
+      //if (Config_getBool("GENERATE_LATEX"))
+      if (0)
+      { // render LaTeX output
+        Template *tpl = e.loadByName("latexlayout.tpl",1);
+        if (tpl)
+        {
+          g_globals.outputFormat = ContextOutputFormat_Latex;
+          g_globals.dynSectionId = 0;
+          g_globals.outputDir    = Config_getString("LATEX_OUTPUT");
+          QDir dir(g_globals.outputDir);
+          createSubDirs(dir);
+          LatexEscaper latexEsc;
+          ctx->setEscapeIntf(".tex",&latexEsc);
+          LatexSpaceless spl;
+          ctx->setSpacelessIntf(&spl);
+          ctx->setOutputDirectory(g_globals.outputDir);
+          FTextStream ts;
+          tpl->render(ts,ctx);
+          e.unload(tpl);
+        }
+      }
+
+      // clear all cached data in Definition objects.
+      QDictIterator<DefinitionIntf> di(*Doxygen::symbolMap);
+      DefinitionIntf *intf;
+      for (;(intf=di.current());++di)
+      {
+        if (intf->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
+        {
+          DefinitionListIterator dli(*(DefinitionList*)intf);
+          Definition *d;
+          // for each symbol
+          for (dli.toFirst();(d=dli.current());++dli)
+          {
+            d->setCookie(0);
+          }
+        }
+        else // single symbol
+        {
+          Definition *d = (Definition *)intf;
+          d->setCookie(0);
+        }
+      }
 
       e.destroyContext(ctx);
     }
index cb20313..7c98222 100644 (file)
@@ -52,7 +52,10 @@ class MemberGroup;
 class MemberGroupSDict;
 class MemberGroupList;
 class DotNode;
-class DotGfxHierarchyTable; 
+class DotGfxHierarchyTable;
+struct SearchIndexInfo;
+class SearchIndexList;
+class SearchDefinitionList;
 
 //----------------------------------------------------
 
@@ -68,7 +71,7 @@ class RefCountedContext
       m_className=className;
       m_insideRelease = FALSE;
     }
-    ~RefCountedContext()
+    virtual ~RefCountedContext()
     {
       if (!m_insideRelease) abort();
     }
@@ -326,7 +329,7 @@ class DirContext : public RefCountedContext, public TemplateStructIntf
 class PageContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    static PageContext *alloc(PageDef *pd,bool isMainPage=FALSE) { return new PageContext(pd,isMainPage); }
+    static PageContext *alloc(PageDef *pd,bool isMainPage,bool isExample) { return new PageContext(pd,isMainPage,isExample); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
@@ -334,7 +337,7 @@ class PageContext : public RefCountedContext, public TemplateStructIntf
     virtual int release() { return RefCountedContext::release(); }
 
   private:
-    PageContext(PageDef *,bool isMainPage);
+    PageContext(PageDef *,bool isMainPage,bool isExample);
    ~PageContext();
     class Private;
     Private *p;
@@ -707,7 +710,7 @@ class PageListContext : public RefCountedContext, public TemplateListIntf
 class PageTreeContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
-    static PageTreeContext *alloc() { return new PageTreeContext; }
+    static PageTreeContext *alloc(const PageSDict *pages) { return new PageTreeContext(pages); }
 
     // TemplateStructIntf methods
     virtual TemplateVariant get(const char *name) const;
@@ -715,7 +718,7 @@ class PageTreeContext : public RefCountedContext, public TemplateStructIntf
     virtual int release() { return RefCountedContext::release(); }
 
   private:
-    PageTreeContext();
+    PageTreeContext(const PageSDict *pages);
    ~PageTreeContext();
     class Private;
     Private *p;
@@ -785,13 +788,15 @@ class ModuleTreeContext : public RefCountedContext, public TemplateStructIntf
 
 //----------------------------------------------------
 
-class ExampleListContext : public RefCountedContext, public TemplateStructIntf
+class ExampleListContext : public RefCountedContext, public TemplateListIntf
 {
   public:
-    static ExampleListContext *alloc() { return new ExampleListContext(); }
+    static ExampleListContext *alloc() { return new ExampleListContext; }
 
-    // TemplateStructIntf methods
-    virtual TemplateVariant get(const char *name) const;
+    // TemplateListIntf methods
+    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(); }
 
@@ -804,6 +809,26 @@ class ExampleListContext : public RefCountedContext, public TemplateStructIntf
 
 //----------------------------------------------------
 
+
+class ExampleTreeContext : public RefCountedContext, public TemplateStructIntf
+{
+  public:
+    static ExampleTreeContext *alloc() { return new ExampleTreeContext; }
+
+    // TemplateStructIntf methods
+    virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
+
+  private:
+    ExampleTreeContext();
+   ~ExampleTreeContext();
+    class Private;
+    Private *p;
+};
+
+//----------------------------------------------------
+
 class GlobalsIndexContext : public RefCountedContext, public TemplateStructIntf
 {
   public:
@@ -1154,6 +1179,173 @@ class ArgumentListContext : public RefCountedContext, public TemplateListIntf
 
 //----------------------------------------------------
 
+class SymbolContext : public RefCountedContext, public TemplateStructIntf
+{
+  public:
+    static SymbolContext *alloc(const Definition *def,const Definition *prev,const Definition *next)
+    { return new SymbolContext(def,prev,next); }
+
+    // TemplateStructIntf methods
+    virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
+
+  private:
+    SymbolContext(const Definition *def,const Definition *prev,const Definition *next);
+   ~SymbolContext();
+    class Private;
+    Private *p;
+};
+
+//----------------------------------------------------
+
+class SymbolListContext : public RefCountedContext, public TemplateListIntf
+{
+  public:
+    static SymbolListContext *alloc(const SearchDefinitionList *sdl)
+    { return new SymbolListContext(sdl); }
+
+    // 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:
+    SymbolListContext(const SearchDefinitionList *sdl);
+   ~SymbolListContext();
+    class Private;
+    Private *p;
+};
+
+//----------------------------------------------------
+
+class SymbolGroupContext : public RefCountedContext, public TemplateStructIntf
+{
+  public:
+    static SymbolGroupContext *alloc(const SearchDefinitionList *sdl)
+    { return new SymbolGroupContext(sdl); }
+
+    // TemplateStructIntf methods
+    virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
+
+  private:
+    SymbolGroupContext(const SearchDefinitionList *sdl);
+   ~SymbolGroupContext();
+    class Private;
+    Private *p;
+};
+
+//----------------------------------------------------
+
+class SymbolGroupListContext : public RefCountedContext, public TemplateListIntf
+{
+  public:
+    static SymbolGroupListContext *alloc(const SearchIndexList *sil)
+    { return new SymbolGroupListContext(sil); }
+
+    // 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:
+    SymbolGroupListContext(const SearchIndexList *sil);
+   ~SymbolGroupListContext();
+    class Private;
+    Private *p;
+};
+
+//----------------------------------------------------
+
+class SymbolIndexContext : public RefCountedContext, public TemplateStructIntf
+{
+  public:
+    static SymbolIndexContext *alloc(const SearchIndexList *sl,const QCString &name)
+    { return new SymbolIndexContext(sl,name); }
+
+    // TemplateStructIntf methods
+    virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
+
+  private:
+    SymbolIndexContext(const SearchIndexList *sl,const QCString &name);
+   ~SymbolIndexContext();
+    class Private;
+    Private *p;
+};
+
+//----------------------------------------------------
+
+class SymbolIndicesContext : public RefCountedContext, public TemplateListIntf
+{
+  public:
+    static SymbolIndicesContext *alloc(const SearchIndexInfo *info)
+    { return new SymbolIndicesContext(info); }
+
+    // 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:
+    SymbolIndicesContext(const SearchIndexInfo *info);
+   ~SymbolIndicesContext();
+    class Private;
+    Private *p;
+};
+
+//----------------------------------------------------
+
+class SearchIndexContext : public RefCountedContext, public TemplateStructIntf
+{
+  public:
+    static SearchIndexContext *alloc(const SearchIndexInfo *info)
+    { return new SearchIndexContext(info); }
+
+    // TemplateStructIntf methods
+    virtual TemplateVariant get(const char *name) const;
+    virtual int addRef()  { return RefCountedContext::addRef(); }
+    virtual int release() { return RefCountedContext::release(); }
+
+  private:
+    SearchIndexContext(const SearchIndexInfo *info);
+   ~SearchIndexContext();
+    class Private;
+    Private *p;
+};
+
+//----------------------------------------------------
+
+class SearchIndicesContext : public RefCountedContext, public TemplateListIntf
+{
+  public:
+    static SearchIndicesContext *alloc() { return new SearchIndicesContext; }
+
+    // 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:
+    SearchIndicesContext();
+   ~SearchIndicesContext();
+    class Private;
+    Private *p;
+};
+
+//----------------------------------------------------
+
 void generateOutputViaTemplate();
 
 #endif
index 9032d8e..603f238 100644 (file)
@@ -346,7 +346,7 @@ RAWEND    ")"[^ \t\(\)\\]{0,16}\"
                                                int bi=g_curArgTypeName.find('(');
                                                int fi=bi-1;
                                                //printf("func arg fi=%d\n",fi);
-                                               while (fi>=0 && isId(g_curArgTypeName.at(fi))) fi--;
+                                               while (fi>=0 && (isId(g_curArgTypeName.at(fi)) || g_curArgTypeName.at(fi)==':')) fi--;
                                                if (fi>=0)
                                                {
                                                  a->type  = g_curArgTypeName.left(fi+1);
index 457c6ea..d04dd59 100644 (file)
@@ -282,7 +282,7 @@ void Definition::removeFromMap(Definition *d)
 
 Definition::Definition(const char *df,int dl,int dc,
                        const char *name,const char *b,
-                       const char *d,bool isSymbol)
+                       const char *d,bool isSymbol) : m_cookie(0)
 {
   m_name = name;
   m_defLine = dl;
@@ -299,7 +299,7 @@ Definition::Definition(const char *df,int dl,int dc,
   }
 }
 
-Definition::Definition(const Definition &d) : DefinitionIntf()
+Definition::Definition(const Definition &d) : DefinitionIntf(), m_cookie(0)
 {
   m_name = d.m_name;
   m_defLine = d.m_defLine;
@@ -380,7 +380,7 @@ Definition::Definition(const Definition &d) : DefinitionIntf()
 
 Definition::~Definition()
 {
-  if (m_isSymbol) 
+  if (m_isSymbol)
   {
     removeFromMap(this);
   }
@@ -389,6 +389,8 @@ Definition::~Definition()
     delete m_impl;
     m_impl=0;
   }
+  delete m_cookie;
+  m_cookie=0;
 }
 
 void Definition::setName(const char *name)
@@ -1217,7 +1219,7 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
           {
             ol.disable(OutputGenerator::Latex);
           }
-          if (!rtfSourceCode)
+          if (rtfSourceCode)
           {
             ol.disable(OutputGenerator::RTF);
           }
@@ -1943,4 +1945,27 @@ bool Definition::hasBriefDescription() const
   return !briefDescription().isEmpty() && briefMemberDesc;
 }
 
+QCString Definition::externalReference(const QCString &relPath) const
+{
+  QCString ref = getReference();
+  if (!ref.isEmpty())
+  {
+    QCString *dest = Doxygen::tagDestinationDict[ref];
+    if (dest)
+    {
+      QCString result = *dest;
+      int l = result.length();
+      if (!relPath.isEmpty() && l>0 && result.at(0)=='.')
+      { // relative path -> prepend relPath.
+        result.prepend(relPath);
+        l+=relPath.length();
+      }
+      if (l>0 && result.at(l-1)!='/') result+='/';
+      return result;
+    }
+  }
+  return relPath;
+}
+
+
 
index 5905a55..6277c6c 100644 (file)
@@ -92,7 +92,11 @@ class DefinitionIntf
 class Definition : public DefinitionIntf
 {
   public:
-    
+    struct Cookie
+    {
+      virtual ~Cookie() {}
+    };
+
     /*! Create a new definition */
     Definition(
         const char *defFileName,int defLine,int defColumn,
@@ -231,6 +235,9 @@ class Definition : public DefinitionIntf
     /*! Returns TRUE if this definition is imported via a tag file. */
     virtual bool isReference() const;
 
+    /*! Convenience method to return a resolved external link */
+    QCString externalReference(const QCString &relPath) const;
+
     /*! Returns the first line of the body of this item (applicable to classes and 
      *  functions).
      */
@@ -341,6 +348,9 @@ class Definition : public DefinitionIntf
     void addSectionsToIndex();
     void writeToc(OutputList &ol);
 
+    void setCookie(Cookie *cookie) { delete m_cookie; m_cookie = cookie; }
+    Cookie *cookie() const { return m_cookie; }
+
   protected:
 
     Definition(const Definition &d);
@@ -364,6 +374,7 @@ class Definition : public DefinitionIntf
     QCString m_symbolName;
     int m_defLine;
     int m_defColumn;
+    Cookie *m_cookie;
 };
 
 /** A list of Definition objects. */
index 994c1a4..8a6ccf6 100644 (file)
@@ -274,7 +274,7 @@ static void writeMapArea(FTextStream &t,ClassDef *cd,QCString relPath,
     QCString tooltip = cd->briefDescriptionAsTooltip();
     if (!tooltip.isEmpty())
     {
-      t << "title=\"" << tooltip << "\" ";
+      t << "title=\"" << convertToHtml(tooltip) << "\" ";
     }
     t << "alt=\"" << convertToXML(cd->displayName()); 
     t << "\" shape=\"rect\" coords=\"" << x << "," << y << ",";
index 067daa0..ddd0c37 100644 (file)
@@ -228,6 +228,7 @@ void DirDef::writeSubDirList(OutputList &ol)
     DirDef *dd;
     for (;(dd=it.current());++it)
     {
+      if (!dd->hasDocumentation()) continue;
       ol.startMemberDeclaration();
       ol.startMemberItem(dd->getOutputFileBase(),0);
       ol.parseText(theTranslator->trDir(FALSE,TRUE)+" ");
@@ -266,6 +267,7 @@ void DirDef::writeFileList(OutputList &ol)
     FileDef *fd;
     for (;(fd=it.current());++it)
     {
+      if (!fd->hasDocumentation()) continue;
       ol.startMemberDeclaration();
       ol.startMemberItem(fd->getOutputFileBase(),0);
       ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
@@ -385,7 +387,7 @@ void DirDef::writeDocumentation(OutputList &ol)
   ol.pushGeneratorState();
   
   QCString title=theTranslator->trDirReference(m_dispName);
-  startFile(ol,getOutputFileBase(),name(),title,HLI_None,!generateTreeView);
+  startFile(ol,getOutputFileBase(),name(),title,HLI_Files,!generateTreeView);
 
   if (!generateTreeView)
   {
@@ -610,7 +612,7 @@ bool DirDef::isParentOf(DirDef *dir) const
 
 bool DirDef::depGraphIsTrivial() const
 {
-  return FALSE;
+  return m_usedDirs->count()==0;
 }
 
 //----------------------------------------------------------------------
@@ -696,11 +698,6 @@ DirDef *DirDef::mergeDirectoryInTree(const QCString &path)
   return dir;
 }
 
-void DirDef::writeDepGraph(FTextStream &t)
-{
-    writeDotDirDepGraph(t,this);
-}
-
 //----------------------------------------------------------------------
 
 static void writePartialDirPath(OutputList &ol,const DirDef *root,const DirDef *target)
@@ -841,6 +838,7 @@ static void computeCommonDirPrefix()
           else // dir is shorter than path -> take path of dir as new start
           {
             path=dir->name();
+            l=path.length();
             int i=path.findRev('/',l-2);
             if (i==-1) // no unique prefix -> stop
             {
index 1a87f5b..611ba3e 100644 (file)
@@ -71,7 +71,6 @@ class DirDef : public Definition
 
     // generate output
     void writeDocumentation(OutputList &ol);
-    void writeDepGraph(FTextStream &t);
     void writeTagFile(FTextStream &t);
 
     static DirDef *mergeDirectoryInTree(const QCString &path);
index f4261ac..099213d 100644 (file)
@@ -471,9 +471,9 @@ static void checkUndocumentedParams()
         if (lang==SrcLangExt_Fortran) argName = argName.lower();
         argName=argName.stripWhiteSpace();
         if (argName.right(3)=="...") argName=argName.left(argName.length()-3);
-        if (g_memberDef->getLanguage()==SrcLangExt_Python && argName=="self")
+        if (g_memberDef->getLanguage()==SrcLangExt_Python && (argName=="self" || argName=="cls"))
         { 
-          // allow undocumented self parameter for Python
+          // allow undocumented self / cls parameter for Python
         }
         else if (!argName.isEmpty() && g_paramsFound.find(argName)==0 && a->docs.isEmpty()) 
         {
@@ -494,9 +494,9 @@ static void checkUndocumentedParams()
           QCString argName = g_memberDef->isDefine() ? a->type : a->name;
           if (lang==SrcLangExt_Fortran) argName = argName.lower();
           argName=argName.stripWhiteSpace();
-          if (g_memberDef->getLanguage()==SrcLangExt_Python && argName=="self")
+          if (g_memberDef->getLanguage()==SrcLangExt_Python && (argName=="self" || argName=="cls"))
           { 
-            // allow undocumented self parameter for Python
+            // allow undocumented self / cls parameter for Python
           }
           else if (!argName.isEmpty() && g_paramsFound.find(argName)==0) 
           {
@@ -511,18 +511,9 @@ static void checkUndocumentedParams()
             errMsg+="  parameter '"+argName+"'";
           }
         }
-        if (g_memberDef->inheritsDocsFrom())
-        {
-           warn_doc_error(g_memberDef->getDefFileName(),
-                          g_memberDef->getDefLine(),
-                          substitute(errMsg,"%","%%"));
-        }
-        else
-        {
-           warn_doc_error(g_memberDef->getDefFileName(),
-                          g_memberDef->getDefLine(),
-                          substitute(errMsg,"%","%%"));
-        }
+        warn_doc_error(g_memberDef->getDefFileName(),
+                       g_memberDef->getDefLine(),
+                       substitute(errMsg,"%","%%"));
       }
     }
   }
@@ -563,7 +554,7 @@ static void detectNoDocumentedParams()
         for (ali.toFirst();(a=ali.current()) && allDoc;++ali)
         {
           if (!a->name.isEmpty() && a->type!="void" &&
-              !(isPython && a->name=="self")
+              !(isPython && (a->name=="self" || a->name=="cls"))
              )
           {
             allDoc = !a->docs.isEmpty();
@@ -579,7 +570,7 @@ static void detectNoDocumentedParams()
           for (ali.toFirst();(a=ali.current()) && allDoc;++ali)
           {
             if (!a->name.isEmpty() && a->type!="void" &&
-                !(isPython && a->name=="self")
+                !(isPython && (a->name=="self" || a->name=="cls"))
                )
             {
               allDoc = !a->docs.isEmpty();
@@ -594,7 +585,8 @@ static void detectNoDocumentedParams()
         g_memberDef->setHasDocumentedParams(TRUE);
       }
     }
-    //printf("Member %s hasReturnCommand=%d\n",g_memberDef->name().data(),g_hasReturnCommand);
+    //printf("Member %s hadDocumentedReturnType()=%d hasReturnCommand=%d\n",
+    //    g_memberDef->name().data(),g_memberDef->hasDocumentedReturnType(),g_hasReturnCommand);
     if (!g_memberDef->hasDocumentedReturnType() && // docs not yet found
         g_hasReturnCommand)
     {
@@ -611,7 +603,18 @@ static void detectNoDocumentedParams()
     {
       g_memberDef->setHasDocumentedReturnType(TRUE);
     }
-       
+    else if ( // see if return type is documented in a function w/o return type
+        g_memberDef->hasDocumentedReturnType() &&
+        (returnType.isEmpty()              || // empty return type
+         returnType.find("void")!=-1       || // void return type
+         returnType.find("subroutine")!=-1 || // fortran subroutine
+         g_memberDef->isConstructor()      || // a constructor
+         g_memberDef->isDestructor()          // or destructor
+        )
+       )
+    {
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"documented empty return type");
+    }
   }
 }
 
@@ -1382,6 +1385,15 @@ reparsetoken:
         case CMD_QUOTE:
           children.append(new DocSymbol(parent,DocSymbol::Sym_Quot));
           break;
+        case CMD_PUNT:
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Dot));
+          break;
+        case CMD_PLUS:
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Plus));
+          break;
+        case CMD_MINUS:
+          children.append(new DocSymbol(parent,DocSymbol::Sym_Minus));
+          break;
         case CMD_EMPHASIS:
           {
             children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Italic,TRUE));
@@ -2168,7 +2180,7 @@ bool DocXRefItem::parse()
       }
       else
       {
-        m_file   = convertNameToFile(refList->listName(),FALSE,TRUE);
+        m_file   = refList->fileName();
         m_anchor = item->listAnchor;
       }
       m_title  = refList->sectionTitle();
@@ -2418,7 +2430,7 @@ void DocInternalRef::parse()
 //---------------------------------------------------------------------------
 
 DocRef::DocRef(DocNode *parent,const QCString &target,const QCString &context) : 
-   m_refToSection(FALSE), m_refToAnchor(FALSE), m_isSubPage(FALSE)
+   m_refType(Unknown), m_isSubPage(FALSE)
 {
   m_parent = parent; 
   Definition  *compound = 0;
@@ -2444,8 +2456,18 @@ DocRef::DocRef(DocNode *parent,const QCString &target,const QCString &context) :
 
     m_ref          = sec->ref;
     m_file         = stripKnownExtensions(sec->fileName);
-    m_refToAnchor  = sec->type==SectionInfo::Anchor;
-    m_refToSection = sec->type!=SectionInfo::Anchor;
+    if (sec->type==SectionInfo::Anchor)
+    {
+      m_refType = Anchor;
+    }
+    else if (sec->type==SectionInfo::Table)
+    {
+      m_refType = Table;
+    }
+    else
+    {
+      m_refType = Section;
+    }
     m_isSubPage    = pd && pd->hasParentPage();
     if (sec->type!=SectionInfo::Page || m_isSubPage) m_anchor = sec->label;
     //printf("m_text=%s,m_ref=%s,m_file=%s,m_refToAnchor=%d type=%d\n",
@@ -3216,6 +3238,9 @@ int DocIndexEntry::parse()
         case CMD_NDASH:   m_entry+="--";  break;
         case CMD_MDASH:   m_entry+="---";  break;
         case CMD_QUOTE:   m_entry+='"';  break;
+        case CMD_PUNT:    m_entry+='.';  break;
+        case CMD_PLUS:    m_entry+='+';  break;
+        case CMD_MINUS:   m_entry+='-';  break;
         default:
           warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command %s found as argument of \\addindex",
                     qPrint(g_token->name));
@@ -3239,6 +3264,41 @@ endindexentry:
 
 //---------------------------------------------------------------------------
 
+DocHtmlCaption::DocHtmlCaption(DocNode *parent,const HtmlAttribList &attribs)
+{
+  m_hasCaptionId = FALSE;
+  HtmlAttribListIterator li(attribs);
+  HtmlAttrib *opt;
+  for (li.toFirst();(opt=li.current());++li)
+  {
+    if (opt->name=="id") // interpret id attribute as an anchor
+    {
+      SectionInfo *sec = Doxygen::sectionDict->find(opt->value);
+      if (sec)
+      {
+        //printf("Found anchor %s\n",id.data());
+        m_file   = sec->fileName;
+        m_anchor = sec->label;
+        m_hasCaptionId = TRUE;
+        if (g_sectionDict && g_sectionDict->find(opt->value)==0)
+        {
+          //printf("Inserting in dictionary!\n");
+          g_sectionDict->append(opt->value,sec);
+        }
+      }
+      else
+      {
+        warn_doc_error(g_fileName,doctokenizerYYlineno,"Invalid caption id `%s'",qPrint(opt->value));
+      }
+    }
+    else // copy attribute
+    {
+      m_attribs.append(new HtmlAttrib(*opt));
+    }
+  }
+  m_parent = parent;
+}
+
 int DocHtmlCaption::parse()
 {
   int retval=0;
@@ -3744,12 +3804,14 @@ void DocHtmlTable::accept(DocVisitor *v)
 { 
   v->visitPre(this); 
   // for HTML output we put the caption first
-  if (m_caption && v->id()==DocVisitor_Html) m_caption->accept(v);
+  //if (m_caption && v->id()==DocVisitor_Html) m_caption->accept(v);
+  // doxygen 1.8.11: always put the caption first
+  if (m_caption) m_caption->accept(v);
   QListIterator<DocNode> cli(m_children);
   DocNode *n;
   for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
   // for other output formats we put the caption last
-  if (m_caption && v->id()!=DocVisitor_Html) m_caption->accept(v);
+  //if (m_caption && v->id()!=DocVisitor_Html) m_caption->accept(v);
   v->visitPost(this); 
 }
 
@@ -5287,6 +5349,15 @@ int DocPara::handleCommand(const QCString &cmdName)
     case CMD_QUOTE:
       m_children.append(new DocSymbol(this,DocSymbol::Sym_Quot));
       break;
+    case CMD_PUNT:
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Dot));
+      break;
+    case CMD_PLUS:
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Plus));
+      break;
+    case CMD_MINUS:
+      m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+      break;
     case CMD_SA:
       g_inSeeBlock=TRUE;
       retval = handleSimpleSection(DocSimpleSect::See);
@@ -5895,7 +5966,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
           {
             if (Config_getBool("WARN_NO_PARAMDOC"))
             {
-              warn_doc_error(g_fileName,doctokenizerYYlineno,"empty 'name' attribute for <param> tag.");
+              warn_doc_error(g_fileName,doctokenizerYYlineno,"empty 'name' attribute for <param%s> tag.",tagId==XML_PARAM?"":"type");
             }
           }
           else
@@ -5907,7 +5978,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
         }
         else
         {
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'name' attribute from <param> tag.");
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'name' attribute from <param%s> tag.",tagId==XML_PARAM?"":"type");
         }
       }
       break;
@@ -5940,7 +6011,7 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta
         }
         else
         {
-          warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'name' attribute from <exception> tag.");
+          warn_doc_error(g_fileName,doctokenizerYYlineno,"Missing 'cref' attribute from <exception> tag.");
         }
       }
       break;
@@ -6798,6 +6869,15 @@ void DocText::parse()
           case CMD_QUOTE:
             m_children.append(new DocSymbol(this,DocSymbol::Sym_Quot));
             break;
+          case CMD_PUNT:
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Dot));
+            break;
+          case CMD_PLUS:
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Plus));
+            break;
+          case CMD_MINUS:
+            m_children.append(new DocSymbol(this,DocSymbol::Sym_Minus));
+            break;
           default:
             warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected command `%s' found",
                       qPrint(g_token->name));
index 1abb687..e2751d8 100644 (file)
@@ -309,10 +309,18 @@ class DocCite : public DocNode
 class DocStyleChange : public DocNode
 {
   public:
-    enum Style { Bold, Italic, Code, Center, Small, 
-                 Subscript, Superscript, Preformatted,
-                 Span, Div
+    enum Style { Bold          = (1<<0),
+                 Italic        = (1<<1),
+                 Code          = (1<<2),
+                 Center        = (1<<3),
+                 Small         = (1<<4),
+                 Subscript     = (1<<5),
+                 Superscript   = (1<<6),
+                 Preformatted  = (1<<7),
+                 Span          = (1<<8),
+                 Div           = (1<<9)
                };
+
     DocStyleChange(DocNode *parent,uint position,Style s,bool enable,
                    const HtmlAttribList *attribs=0) : 
       m_position(position), m_style(s), m_enable(enable)
@@ -395,7 +403,7 @@ class DocSymbol : public DocNode
                    /* 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
+                   Sym_Quot, Sym_Minus, Sym_Plus, Sym_Dot
                  };
     enum PerlType { Perl_unknown = 0, Perl_string, Perl_char, Perl_symbol, Perl_umlaut,
                     Perl_acute, Perl_grave, Perl_circ, Perl_slash, Perl_tilde,
@@ -822,15 +830,16 @@ class DocRef : public CompAccept<DocRef>, public DocNode
     QCString anchor() const       { return m_anchor; }
     QCString targetTitle() const  { return m_text; }
     bool hasLinkText() const     { return !m_children.isEmpty(); }
-    bool refToAnchor() const     { return m_refToAnchor; }
-    bool refToSection() const    { return m_refToSection; }
+    bool refToAnchor() const     { return m_refType==Anchor; }
+    bool refToSection() const    { return m_refType==Section; }
+    bool refToTable() const      { return m_refType==Table; }
     bool isSubPage() const       { return m_isSubPage; }
     void accept(DocVisitor *v)   { CompAccept<DocRef>::accept(this,v); }
 
   private:
-    bool      m_refToSection;
-    bool      m_refToAnchor;
-    bool      m_isSubPage;
+    enum RefType { Unknown, Anchor, Section, Table };
+    RefType    m_refType;
+    bool       m_isSubPage;
     QCString   m_file;
     QCString   m_relPath;
     QCString   m_ref;
@@ -1279,15 +1288,20 @@ class DocHtmlCell : public CompAccept<DocHtmlCell>, public DocNode
 class DocHtmlCaption : public CompAccept<DocHtmlCaption>, public DocNode
 {
   public:
-    DocHtmlCaption(DocNode *parent,const HtmlAttribList &attribs) : 
-      m_attribs(attribs) { m_parent = parent; }
+    DocHtmlCaption(DocNode *parent,const HtmlAttribList &attribs);
     Kind kind() const          { return Kind_HtmlCaption; }
     void accept(DocVisitor *v) { CompAccept<DocHtmlCaption>::accept(this,v); }
     const HtmlAttribList &attribs() const { return m_attribs; }
     int parse();
+    bool hasCaptionId() const { return m_hasCaptionId; }
+    QCString file() const     { return m_file;         }
+    QCString anchor() const   { return m_anchor;       }
 
   private:
     HtmlAttribList m_attribs;
+    bool           m_hasCaptionId;
+    QCString       m_file;
+    QCString       m_anchor;
 };
 
 /** Node representing a HTML table row */
@@ -1303,8 +1317,18 @@ class DocHtmlRow : public CompAccept<DocHtmlRow>, public DocNode
     const HtmlAttribList &attribs() const { return m_attribs; }
     int parse();
     int parseXml(bool header);
-    bool isHeading() const     { return m_children.count()>0 && 
-                                 ((DocHtmlCell*)m_children.getFirst())->isHeading(); 
+    bool isHeading() const     { // a row is a table heading if all cells are marked as such
+                                 bool heading=TRUE;
+                                 QListIterator<DocNode> it(m_children);
+                                 DocNode *n;
+                                 for (;(n=it.current());++it)
+                                 {
+                                   if (n->kind()==Kind_HtmlCell)
+                                   {
+                                     heading = heading && ((DocHtmlCell*)n)->isHeading();
+                                   }
+                                 }
+                                 return m_children.count()>0 && heading;
                                }
     void setVisibleCells(int n) { m_visibleCells = n; }
     int visibleCells() const    { return m_visibleCells; }
@@ -1332,6 +1356,12 @@ class DocHtmlTable : public CompAccept<DocHtmlTable>, public DocNode
     int parseXml();
     uint numColumns() const { return m_numCols; }
     void accept(DocVisitor *v);
+    DocHtmlCaption *caption() const { return m_caption; }
+    DocHtmlRow *firstRow() const {
+                             DocNode *n = m_children.getFirst();
+                             if (n && n->kind()==Kind_HtmlRow) return (DocHtmlRow*)n;
+                             return 0;
+                           }
 
   private:
     void computeTableGrid();
index cde317d..9772d4e 100644 (file)
@@ -468,10 +468,6 @@ void DocSets::addIndexItem(Definition *context,MemberDef *md,
       if (ii)
       {
         decl=ii->includeName;
-        if (decl.isEmpty())
-        {
-          decl=ii->local;
-        }
       }
     }
     else if (nd)
index 31d583c..3169fc0 100644 (file)
@@ -169,8 +169,7 @@ static void processSection()
   if ((si=Doxygen::sectionDict->find(g_secLabel)))
   {
     si->fileName = file;
-    //si = new SectionInfo(file,g_secLabel,g_secTitle,g_secType);
-    //Doxygen::sectionDict.insert(g_secLabel,si);
+    si->type     = g_secType;
   }
 }
 
@@ -334,7 +333,7 @@ BLANK     [ \t\r]
 ID        "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
 LABELID   [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
 PHPTYPE   [\\:a-z_A-Z0-9\x80-\xFF\-]+
-CITESCHAR [a-z_A-Z\x80-\xFF]
+CITESCHAR [a-z_A-Z0-9\x80-\xFF]
 CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/]*
 CITEID    {CITESCHAR}{CITEECHAR}*("."{CITESCHAR}{CITEECHAR}*)*
 MAILADR   ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+
@@ -354,7 +353,7 @@ FILEMASK  ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK}
 LINKMASK  [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)? 
 VERBATIM  "verbatim"{BLANK}*
 SPCMD1    {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM}|"--"|"---")
-SPCMD2    {CMD}[\\@<>&$#%~".|]
+SPCMD2    {CMD}[\\@<>&$#%~".+|-]
 SPCMD3    {CMD}form#[0-9]+
 SPCMD4    {CMD}"::"
 INOUT    "inout"|"in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in")
@@ -389,6 +388,7 @@ WORD1     {ESCWORD}|{CHARWORDQ}+|"{"|"}"|"'\"'"|("\""[^"\n]*\n?[^"\n]*"\"")
 WORD2     "."|","|"("|")"|"["|"]"|":"|";"|"\?"|"="|"'"
 WORD1NQ   {ESCWORD}|{CHARWORDQ}+|"{"|"}"
 WORD2NQ   "."|","|"("|")"|"["|"]"|":"|";"|"\?"|"="|"'"
+CAPTION   [cC][aA][pP][tT][iI][oO][nN]
 HTMLTAG   "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*(("/")?)">" 
 HTMLKEYL  "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"sup"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p"
 HTMLKEYU  "STRONG"|"CENTER"|"TABLE"|"CAPTION"|"SMALL"|"CODE"|"DFN"|"VAR"|"IMG"|"PRE"|"SUB"|"SUP"|"TR"|"TD"|"TH"|"OL"|"UL"|"LI"|"TT"|"KBD"|"EM"|"HR"|"DL"|"DT"|"DD"|"BR"|"I"|"A"|"B"|"P"
@@ -1160,8 +1160,26 @@ REFWORD   {LABELID}|{REFWORD2}|{REFWORD3}|{REFWORD4}
 
      /* State for the pass used to find the anchors and sections */ 
 
-<St_Sections>[^\n@\\]+
-<St_Sections>"@@"|"\\\\"
+<St_Sections>[^\n@\\<]+
+<St_Sections>"@@"|"\\\\"|"@<"|"\\<"
+<St_Sections>"<"{CAPTION}({WS}+{ATTRIB})*">" {
+                                      QCString tag=yytext;
+                                      int s=tag.find("id=");
+                                      if (s!=-1) // command has id attribute
+                                      {
+                                        char c=tag[s+3];
+                                        if (c=='\'' || c=='"') // valid start
+                                        {
+                                          int e=tag.find(c,s+4);
+                                          if (e!=-1) // found matching end
+                                          {
+                                            g_secType = SectionInfo::Table;
+                                            g_secLabel=tag.mid(s+4,e-s-4); // extract id
+                                            processSection();
+                                          }
+                                        }
+                                      }
+                                    }
 <St_Sections>{CMD}"anchor"{BLANK}+  { 
                                       g_secType = SectionInfo::Anchor; 
                                      BEGIN(St_SecLabel1); 
index 705aa27..0a4f136 100644 (file)
@@ -659,10 +659,9 @@ static bool writeSVGFigureLink(FTextStream &out,const QCString &relPath,
 
 // since dot silently reproduces the input file when it does not
 // support the PNG format, we need to check the result.
-static void checkDotResult(const QCString &imgName)
+static void checkDotResult(const char *imgExt, const char *imgName)
 {
-  QCString imgExt = getDotImageExtension();
-  if (imgExt=="png")
+  if (qstrcmp(imgExt,"png")==0)
   {
     FILE *f = portable_fopen(imgName,"rb");
     if (f)
@@ -675,19 +674,19 @@ static void checkDotResult(const QCString &imgName)
           err("Image `%s' produced by dot is not a valid PNG!\n"
               "You should either select a different format "
               "(DOT_IMAGE_FORMAT in the config file) or install a more "
-              "recent version of graphviz (1.7+)\n",imgName.data()
+              "recent version of graphviz (1.7+)\n",imgName
              );
         }
       }
       else
       {
-        err("Could not read image `%s' generated by dot!\n",imgName.data());
+        err("Could not read image `%s' generated by dot!\n",imgName);
       }
       fclose(f);
     }
     else
     {
-      err("Could not open image `%s' generated by dot!\n",imgName.data());
+      err("Could not open image `%s' generated by dot!\n",imgName);
     }
   }
 }
@@ -793,54 +792,46 @@ int DotNodeList::compareValues(const DotNode *n1,const DotNode *n2) const
 
 DotRunner::DotRunner(const QCString &file,const QCString &path,
                      bool checkResult,const QCString &imageName) 
-  : m_file(file), m_path(path), 
-    m_checkResult(checkResult), m_imageName(imageName)
-{
-  static bool dotCleanUp = Config_getBool("DOT_CLEANUP"); 
-  m_cleanUp = dotCleanUp;
+  : m_dotExe(Config_getString("DOT_PATH")+"dot"),
+    m_file(file), m_path(path), 
+    m_checkResult(checkResult), m_imageName(imageName),
+    m_imgExt(getDotImageExtension())
+{
+  static bool dotCleanUp      = Config_getBool("DOT_CLEANUP"); 
+  static bool dotMultiTargets = Config_getBool("DOT_MULTI_TARGETS");
+  m_cleanUp      = dotCleanUp;
+  m_multiTargets = dotMultiTargets;
   m_jobs.setAutoDelete(TRUE);
 }
 
 void DotRunner::addJob(const char *format,const char *output)
 {
   QCString args = QCString("-T")+format+" -o \""+output+"\"";
-  m_jobs.append(new QCString(args));
+  m_jobs.append(new DotConstString(args));
 }
 
 void DotRunner::addPostProcessing(const char *cmd,const char *args)
 {
-  m_postCmd = cmd;
-  m_postArgs = args;
+  m_postCmd.set(cmd);
+  m_postArgs.set(args);
 }
 
 bool DotRunner::run()
 {
   int exitCode=0;
-  // we need to use data here to make a copy of the string, as Config_getString can be called by
-  // multiple threads simulaneously and the reference counting is not thread safe.
-  QCString dotExe   = Config_getString("DOT_PATH").data();
-  dotExe+="dot";
 
-  bool multiTargets = Config_getBool("DOT_MULTI_TARGETS");
   QCString dotArgs;
-  QListIterator<QCString> li(m_jobs);
-  QCString *s;
-  QCString file      = m_file;
-  QCString path      = m_path;
-  QCString imageName = m_imageName;
-  QCString postCmd   = m_postCmd;
-  QCString postArgs  = m_postArgs;
-  bool checkResult   = m_checkResult;
-  bool cleanUp       = m_cleanUp;
-  if (multiTargets)
-  {
-    dotArgs="\""+file+"\"";
+  QListIterator<DotConstString> li(m_jobs);
+  DotConstString *s;
+  if (m_multiTargets)
+  {
+    dotArgs=QCString("\"")+m_file.data()+"\"";
     for (li.toFirst();(s=li.current());++li)
     {
       dotArgs+=' ';
-      dotArgs+=*s;
+      dotArgs+=s->data();
     }
-    if ((exitCode=portable_system(dotExe,dotArgs,FALSE))!=0)
+    if ((exitCode=portable_system(m_dotExe.data(),dotArgs,FALSE))!=0)
     {
       goto error;
     }
@@ -849,30 +840,33 @@ bool DotRunner::run()
   {
     for (li.toFirst();(s=li.current());++li)
     {
-      dotArgs="\""+file+"\" "+*s;
-      if ((exitCode=portable_system(dotExe,dotArgs,FALSE))!=0)
+      dotArgs=QCString("\"")+m_file.data()+"\" "+s->data();
+      if ((exitCode=portable_system(m_dotExe.data(),dotArgs,FALSE))!=0)
       {
         goto error;
       }
     }
   }
-  if (!postCmd.isEmpty() && portable_system(postCmd,postArgs)!=0)
+  if (!m_postCmd.isEmpty() && portable_system(m_postCmd.data(),m_postArgs.data())!=0)
   {
     err("Problems running '%s' as a post-processing step for dot output\n",m_postCmd.data());
     return FALSE;
   }
-  if (checkResult) checkDotResult(imageName);
-  if (cleanUp) 
+  if (m_checkResult)
+  {
+    checkDotResult(m_imgExt.data(),m_imageName.data());
+  }
+  if (m_cleanUp) 
   {
     //printf("removing dot file %s\n",m_file.data());
     //QDir(path).remove(file);
-    m_cleanupItem.file = file;
-    m_cleanupItem.path = path;
+    m_cleanupItem.file.set(m_file.data());
+    m_cleanupItem.path.set(m_path.data());
   }
   return TRUE;
 error:
   err("Problems running dot: exit code=%d, command='%s', arguments='%s'\n",
-      exitCode,dotExe.data(),dotArgs.data());
+      exitCode,m_dotExe.data(),dotArgs.data());
   return FALSE;
 }
 
@@ -1202,7 +1196,7 @@ void DotWorkerThread::run()
   while ((runner=m_queue->dequeue()))
   {
     runner->run();
-    DotRunner::CleanupItem cleanup = runner->cleanup();
+    const DotRunner::CleanupItem &cleanup = runner->cleanup();
     if (!cleanup.file.isEmpty())
     {
       m_cleanupItems.append(new DotRunner::CleanupItem(cleanup));
@@ -1216,7 +1210,7 @@ void DotWorkerThread::cleanup()
   DotRunner::CleanupItem *ci;
   for (;(ci=it.current());++it)
   {
-    QDir(ci->path).remove(ci->file);
+    QDir(ci->path.data()).remove(ci->file.data());
   }
 }
 
@@ -2600,7 +2594,12 @@ void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot,
 
   int edgeStyle = (label || prot==EdgeInfo::Orange || prot==EdgeInfo::Orange2) ? EdgeInfo::Dashed : EdgeInfo::Solid;
   QCString className;
-  if (usedName) // name is a typedef
+  if (cd->isAnonymous())
+  {
+    className="anonymous:";
+    className+=label;
+  }
+  else if (usedName) // name is a typedef
   {
     className=usedName;
   }
@@ -2828,9 +2827,9 @@ void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,bool base,int distance)
   if (m_graphType == DotNode::Collaboration)
   {
     // ---- Add usage relations
-    
-    UsesClassDict *dict = 
-      base ? cd->usedImplementationClasses() : 
+
+    UsesClassDict *dict =
+      base ? cd->usedImplementationClasses() :
              cd->usedByImplementationClasses()
       ;
     if (dict)
@@ -3965,6 +3964,7 @@ bool DotCallGraph::isTooBig() const
 }
 
 //-------------------------------------------------------------
+static void writeDotDirDepGraph(FTextStream &t,DirDef *dd,bool linkRelations);
 
 DotDirDeps::DotDirDeps(DirDef *dir) : m_dir(dir)
 {
@@ -3981,7 +3981,8 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
                             const char *fileName,
                             const char *relPath,
                             bool generateImageMap,
-                            int graphId) const
+                            int graphId,
+                            bool linkRelations) const
 {
   QDir d(path);
   // store the original directory
@@ -4006,7 +4007,8 @@ QCString DotDirDeps::writeGraph(FTextStream &out,
   // compute md5 checksum of the graph were are about to generate
   QGString theGraph;
   FTextStream md5stream(&theGraph);
-  m_dir->writeDepGraph(md5stream);
+  //m_dir->writeDepGraph(md5stream);
+  writeDotDirDepGraph(md5stream,m_dir,linkRelations);
   uchar md5_sig[16];
   QCString sigStr(33);
   MD5Buffer((const unsigned char *)theGraph.data(),theGraph.length(),md5_sig);
@@ -4234,7 +4236,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
      return;
   }
 
-  if (format==GOF_BITMAP) checkDotResult(absImgName);
+  if (format==GOF_BITMAP) checkDotResult(getDotImageExtension(),absImgName);
 
   Doxygen::indexList->addImageFile(imgName);
 
@@ -4764,7 +4766,7 @@ void DotGroupCollaboration::writeGraphHeader(FTextStream &t,
   t << "  rankdir=LR;\n";
 }
 
-void writeDotDirDepGraph(FTextStream &t,DirDef *dd)
+void writeDotDirDepGraph(FTextStream &t,DirDef *dd,bool linkRelations)
 {
     t << "digraph \"" << dd->displayName() << "\" {\n";
     if (Config_getBool("DOT_TRANSPARENT"))
@@ -4896,11 +4898,14 @@ void writeDotDirDepGraph(FTextStream &t,DirDef *dd)
                 new DirRelation(relationName,dir,udir));
           }
           int nrefs = udir->filePairs().count();
-          t << "  " << dir->getOutputFileBase() << "->" 
+          t << "  " << dir->getOutputFileBase() << "->"
                     << usedDir->getOutputFileBase();
           t << " [headlabel=\"" << nrefs << "\", labeldistance=1.5";
-          t << " headhref=\"" << relationName << Doxygen::htmlFileExtension 
-            << "\"];\n";
+          if (linkRelations)
+          {
+            t << " headhref=\"" << relationName << Doxygen::htmlFileExtension << "\"";
+          }
+          t << "];\n";
         }
       }
     }
index 3de7d79..e12d547 100644 (file)
--- a/src/dot.h
+++ b/src/dot.h
@@ -262,7 +262,8 @@ class DotDirDeps
                         const char *fileName,
                         const char *relPath,
                         bool writeImageMap=TRUE,
-                        int graphId=-1) const;
+                        int graphId=-1,
+                        bool linkRelations=TRUE) const;
   private:
     DirDef *m_dir;
 };
@@ -325,6 +326,31 @@ class DotGroupCollaboration
     QList<Edge>     m_edges;
 };
 
+/** Minimal constant string class that is thread safe, once initialized. */
+class DotConstString
+{
+  public:
+    DotConstString()                                   { m_str=0; }
+   ~DotConstString()                                   { delete[] m_str; }
+    DotConstString(const QCString &s) : m_str(0)       { set(s); }
+    DotConstString(const DotConstString &s) : m_str(0) { set(s.data()); }
+    const char *data() const                           { return m_str; }
+    bool isEmpty() const                               { return m_str==0 || m_str[0]=='\0'; }
+    void set(const QCString &s)
+    {
+      delete[] m_str;
+      m_str=0;
+      if (!s.isEmpty())
+      {
+        m_str=new char[s.length()+1];
+        qstrcpy(m_str,s.data());
+      }
+    }
+  private:
+    DotConstString &operator=(const DotConstString &);
+    char *m_str;
+};
+
 /** Helper class to run dot from doxygen.
  */
 class DotRunner
@@ -332,8 +358,8 @@ class DotRunner
   public:
     struct CleanupItem
     {
-      QCString path;
-      QCString file;
+      DotConstString path;
+      DotConstString file;
     };
 
     /** Creates a runner for a dot \a file. */
@@ -351,16 +377,19 @@ class DotRunner
 
     /** Runs dot for all jobs added. */
     bool run();
-    CleanupItem cleanup() const { return m_cleanupItem; }
+    const CleanupItem &cleanup() const { return m_cleanupItem; }
 
   private:
-    QList<QCString> m_jobs;
-    QCString m_postArgs;
-    QCString m_postCmd;
-    QCString m_file;
-    QCString m_path;
+    DotConstString m_dotExe;
+    bool m_multiTargets;
+    QList<DotConstString> m_jobs;
+    DotConstString m_postArgs;
+    DotConstString m_postCmd;
+    DotConstString m_file;
+    DotConstString m_path;
     bool m_checkResult;
-    QCString m_imageName;
+    DotConstString m_imageName;
+    DotConstString m_imgExt;
     bool m_cleanUp;
     CleanupItem m_cleanupItem;
 };
@@ -459,6 +488,4 @@ void writeDotImageMapFromFile(FTextStream &t,
                               const QCString& relPath,const QCString& baseName,
                               const QCString& context,int graphId=-1);
 
-void writeDotDirDepGraph(FTextStream &t,DirDef *dd);
-
 #endif
index 647b5c8..a3a3d2a 100644 (file)
@@ -3,8 +3,8 @@
  * Copyright (C) 1997-2015 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby 
- * granted. No representations are made about the suitability of this software 
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
  * for any purpose. It is provided "as is" without express or implied warranty.
  * See the GNU General Public License for more details.
  *
@@ -106,7 +106,7 @@ extern void initResources();
   do { if (var->children()) { \
     EntryNavListIterator eli(*var->children()); \
     for (;eli.current();++eli) func(eli.current()); \
-  } } while(0) 
+  } } while(0)
 
 
 #if !defined(_WIN32) || defined(__CYGWIN__)
@@ -119,9 +119,9 @@ ClassSDict      *Doxygen::classSDict = 0;
 ClassSDict      *Doxygen::hiddenClasses = 0;
 NamespaceSDict  *Doxygen::namespaceSDict = 0;
 MemberNameSDict *Doxygen::memberNameSDict = 0;
-MemberNameSDict *Doxygen::functionNameSDict = 0;   
+MemberNameSDict *Doxygen::functionNameSDict = 0;
 FileNameList    *Doxygen::inputNameList = 0;       // all input files
-FileNameDict    *Doxygen::inputNameDict = 0;          
+FileNameDict    *Doxygen::inputNameDict = 0;
 GroupSDict      *Doxygen::groupSDict = 0;
 FormulaList     *Doxygen::formulaList = 0;       // all formulas
 FormulaDict     *Doxygen::formulaDict = 0;       // all formulas
@@ -173,14 +173,14 @@ GenericsSDict   *Doxygen::genericsDict;
 
 // locally accessible globals
 static QDict<EntryNav>  g_classEntries(1009);
-static StringList       g_inputFiles;         
+static StringList       g_inputFiles;
 static QDict<void>      g_compoundKeywordDict(7);  // keywords recognised as compounds
 static OutputList      *g_outputList = 0;          // list of output generating objects
 static QDict<FileDef>   g_usingDeclarations(1009); // used classes
 static FileStorage     *g_storage = 0;
 static bool             g_successfulRun = FALSE;
 static bool             g_dumpSymbolMap = FALSE;
-static bool             g_useOutputTemplate = FALSE; 
+static bool             g_useOutputTemplate = FALSE;
 
 void clearAll()
 {
@@ -209,7 +209,7 @@ void clearAll()
   delete Doxygen::mainPage; Doxygen::mainPage=0;
 }
 
-class Statistics 
+class Statistics
 {
   public:
     Statistics() { stats.setAutoDelete(TRUE); }
@@ -242,7 +242,7 @@ class Statistics
       if (restore) Debug::setFlag("time");
     }
   private:
-    struct stat 
+    struct stat
     {
       const char *name;
       double elapsed;
@@ -423,7 +423,7 @@ static void addSTLMember(EntryNav *rootNav,const char *type,const char *name)
   memEntry->protection = Public;
   memEntry->section    = Entry::VARIABLE_SEC;
   memEntry->brief      = "STL member";
-  memEntry->hidden     = FALSE; 
+  memEntry->hidden     = FALSE;
   memEntry->artificial = TRUE;
   //memEntry->parent     = root;
   //root->addSubEntry(memEntry);
@@ -463,7 +463,7 @@ static void addSTLClasses(EntryNav *rootNav)
   EntryNav *namespaceEntryNav = new EntryNav(rootNav,namespaceEntry);
   namespaceEntryNav->setEntry(namespaceEntry);
   rootNav->addChild(namespaceEntryNav);
-  
+
   STLInfo *info = g_stlinfo;
   while (info->className)
   {
@@ -524,7 +524,7 @@ static void addSTLClasses(EntryNav *rootNav)
       memEntry->protection = Public;
       memEntry->section    = Entry::FUNCTION_SEC;
       memEntry->brief      = "STL member";
-      memEntry->hidden     = FALSE; 
+      memEntry->hidden     = FALSE;
       memEntry->artificial = FALSE;
       EntryNav *memEntryNav = new EntryNav(classEntryNav,memEntry);
       memEntryNav->setEntry(memEntry);
@@ -567,7 +567,7 @@ static void addPageToContext(PageDef *pd,EntryNav *rootNav)
     scope = stripAnonymousNamespaceScope(scope);
     scope+="::"+pd->name();
     Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope,0,rootNav->tagInfo());
-    if (d) 
+    if (d)
     {
       pd->setPageScope(d);
     }
@@ -611,7 +611,7 @@ static void addRelatedPage(EntryNav *rootNav)
 
 static void buildGroupListFiltered(EntryNav *rootNav,bool additional, bool includeExternal)
 {
-  if (rootNav->section()==Entry::GROUPDOC_SEC && !rootNav->name().isEmpty() && 
+  if (rootNav->section()==Entry::GROUPDOC_SEC && !rootNav->name().isEmpty() &&
         ((!includeExternal && rootNav->tagInfo()==0) ||
          ( includeExternal && rootNav->tagInfo()!=0))
      )
@@ -697,7 +697,7 @@ static void buildGroupList(EntryNav *rootNav)
 
 static void findGroupScope(EntryNav *rootNav)
 {
-  if (rootNav->section()==Entry::GROUPDOC_SEC && !rootNav->name().isEmpty() && 
+  if (rootNav->section()==Entry::GROUPDOC_SEC && !rootNav->name().isEmpty() &&
       rootNav->parent() && !rootNav->parent()->name().isEmpty())
   {
     GroupDef *gd;
@@ -711,7 +711,7 @@ static void findGroupScope(EntryNav *rootNav)
       scope = stripAnonymousNamespaceScope(scope);
       scope+="::"+gd->name();
       Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope,0,rootNav->tagInfo());
-      if (d) 
+      if (d)
       {
         gd->setGroupScope(d);
       }
@@ -793,11 +793,11 @@ static void buildFileList(EntryNav *rootNav)
 #endif
       {
         //printf("Adding documentation!\n");
-        // using FALSE in setDocumentation is small hack to make sure a file 
-        // is documented even if a \file command is used without further 
+        // using FALSE in setDocumentation is small hack to make sure a file
+        // is documented even if a \file command is used without further
         // documentation
         fd->setDocumentation(root->doc,root->docFile,root->docLine,FALSE);
-        fd->setBriefDescription(root->brief,root->briefFile,root->briefLine); 
+        fd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
         fd->addSectionsToDefinition(root->anchors);
         fd->setRefItems(root->sli);
         QListIterator<Grouping> gli(*root->groups);
@@ -842,13 +842,13 @@ static void buildFileList(EntryNav *rootNav)
 
 static void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
 {
-  if ( 
-      (!root->doc.stripWhiteSpace().isEmpty() || 
-       !root->brief.stripWhiteSpace().isEmpty() || 
+  if (
+      (!root->doc.stripWhiteSpace().isEmpty() ||
+       !root->brief.stripWhiteSpace().isEmpty() ||
        Config_getBool("EXTRACT_ALL")
       ) && root->protection!=Private
      )
-  { 
+  {
     //printf(">>>>>> includeFile=%s\n",root->includeFile.data());
 
     bool local=Config_getBool("FORCE_LOCAL_INCLUDES");
@@ -868,7 +868,7 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
     FileDef *fd=0;
     // see if we need to include a verbatim copy of the header file
     //printf("root->includeFile=%s\n",root->includeFile.data());
-    if (!includeFile.isEmpty() && 
+    if (!includeFile.isEmpty() &&
         (fd=findFileDef(Doxygen::inputNameDict,includeFile,ambig))==0
        )
     { // explicit request
@@ -900,7 +900,7 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
     // if a file is found, we mark it as a source file.
     if (fd)
     {
-      QCString iName = !root->includeName.isEmpty() ? 
+      QCString iName = !root->includeName.isEmpty() ?
                        root->includeName : includeFile;
       if (!iName.isEmpty()) // user specified include file
       {
@@ -915,7 +915,7 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
           iName=fd->name();
         }
       }
-      else if (!Config_getList("STRIP_FROM_INC_PATH").isEmpty()) 
+      else if (!Config_getList("STRIP_FROM_INC_PATH").isEmpty())
       {
         iName=stripFromIncludePath(fd->absFilePath());
       }
@@ -960,7 +960,7 @@ static bool addNamespace(Entry *root,ClassDef *cd)
         }
       }
       e=e->parent;
-    } 
+    }
   }
   return FALSE;
 }
@@ -994,7 +994,7 @@ static Definition *findScope(Entry *root,int level=0)
 }
 #endif
 
-/*! returns the Definition object belonging to the first \a level levels of 
+/*! returns the Definition object belonging to the first \a level levels of
  *  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.
  */
@@ -1016,7 +1016,7 @@ static Definition *buildScopeFromQualifiedName(const QCString name,
     fullScope+=nsName;
     NamespaceDef *nd=Doxygen::namespaceSDict->find(fullScope);
     Definition *innerScope = nd;
-    ClassDef *cd=0; 
+    ClassDef *cd=0;
     if (nd==0) cd = getClass(fullScope);
     if (nd==0 && cd) // scope is a class
     {
@@ -1066,7 +1066,7 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr
   QCString scope=stripTemplateSpecifiersFromScope(n,FALSE);
   int l1=0,i1;
   i1=getScopeFragment(scope,0,&l1);
-  if (i1==-1) 
+  if (i1==-1)
   {
     //printf(">no fragments!\n");
     return resultScope;
@@ -1079,12 +1079,12 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr
     //printf("  nestedNameSpecifier=%s\n",nestedNameSpecifier.data());
     resultScope = resultScope->findInnerCompound(nestedNameSpecifier);
     //printf("  resultScope=%p\n",resultScope);
-    if (resultScope==0) 
+    if (resultScope==0)
     {
       NamespaceSDict *usedNamespaces;
       if (orgScope==Doxygen::globalScope && fileScope &&
-          (usedNamespaces = fileScope->getUsedNamespaces())) 
-        // also search for used namespaces 
+          (usedNamespaces = fileScope->getUsedNamespaces()))
+        // also search for used namespaces
       {
         NamespaceSDict::Iterator ni(*usedNamespaces);
         NamespaceDef *nd;
@@ -1093,7 +1093,7 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr
           // restart search within the used namespace
           resultScope = findScopeFromQualifiedName(nd,n,fileScope,tagInfo);
         }
-        if (resultScope) 
+        if (resultScope)
         {
           // for a nested class A::I in used namespace N, we get
           // N::A::I while looking for A, so we should compare
@@ -1107,10 +1107,10 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr
         }
       }
 
-      // also search for used classes. Complication: we haven't been able 
+      // also search for used classes. Complication: we haven't been able
       // to put them in the right scope yet, because we are still resolving
       // the scope relations!
-      // Therefore loop through all used classes and see if there is a right 
+      // Therefore loop through all used classes and see if there is a right
       // scope match between the used class and nestedNameSpecifier.
       QDictIterator<FileDef> ui(g_usingDeclarations);
       FileDef *usedFd;
@@ -1126,14 +1126,14 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr
           resultScope = buildScopeFromQualifiedName(fqn,fqn.contains("::"),
                                                     startScope->getLanguage(),0);
           //printf("Creating scope from fqn=%s result %p\n",fqn.data(),resultScope);
-          if (resultScope) 
+          if (resultScope)
           {
             //printf("> Match! resultScope=%s\n",resultScope->name().data());
             return resultScope;
           }
         }
       }
-      
+
       //printf("> name %s not found in scope %s\n",nestedNameSpecifier.data(),orgScope->name().data());
       return 0;
     }
@@ -1151,7 +1151,7 @@ ArgumentList *getTemplateArgumentsFromName(
                   const QList<ArgumentList> *tArgLists)
 {
   if (tArgLists==0) return 0;
-  
+
   QListIterator<ArgumentList> ali(*tArgLists);
   // for each scope fragment, check if it is a template and advance through
   // the list if so.
@@ -1178,18 +1178,18 @@ ArgumentList *getTemplateArgumentsFromName(
 static
 ClassDef::CompoundType convertToCompoundType(int section,uint64 specifier)
 {
-  ClassDef::CompoundType sec=ClassDef::Class; 
-  if (specifier&Entry::Struct) 
+  ClassDef::CompoundType sec=ClassDef::Class;
+  if (specifier&Entry::Struct)
     sec=ClassDef::Struct;
-  else if (specifier&Entry::Union) 
+  else if (specifier&Entry::Union)
     sec=ClassDef::Union;
-  else if (specifier&Entry::Category) 
+  else if (specifier&Entry::Category)
     sec=ClassDef::Category;
-  else if (specifier&Entry::Interface) 
+  else if (specifier&Entry::Interface)
     sec=ClassDef::Interface;
-  else if (specifier&Entry::Protocol) 
+  else if (specifier&Entry::Protocol)
     sec=ClassDef::Protocol;
-  else if (specifier&Entry::Exception) 
+  else if (specifier&Entry::Exception)
     sec=ClassDef::Exception;
   else if (specifier&Entry::Service)
     sec=ClassDef::Service;
@@ -1198,29 +1198,29 @@ ClassDef::CompoundType convertToCompoundType(int section,uint64 specifier)
 
   switch(section)
   {
-    //case Entry::UNION_SEC: 
-    case Entry::UNIONDOC_SEC: 
-      sec=ClassDef::Union; 
+    //case Entry::UNION_SEC:
+    case Entry::UNIONDOC_SEC:
+      sec=ClassDef::Union;
       break;
       //case Entry::STRUCT_SEC:
-    case Entry::STRUCTDOC_SEC: 
-      sec=ClassDef::Struct; 
+    case Entry::STRUCTDOC_SEC:
+      sec=ClassDef::Struct;
       break;
       //case Entry::INTERFACE_SEC:
     case Entry::INTERFACEDOC_SEC:
-      sec=ClassDef::Interface; 
+      sec=ClassDef::Interface;
       break;
       //case Entry::PROTOCOL_SEC:
     case Entry::PROTOCOLDOC_SEC:
-      sec=ClassDef::Protocol; 
+      sec=ClassDef::Protocol;
       break;
       //case Entry::CATEGORY_SEC:
     case Entry::CATEGORYDOC_SEC:
-      sec=ClassDef::Category; 
+      sec=ClassDef::Category;
       break;
       //case Entry::EXCEPTION_SEC:
     case Entry::EXCEPTIONDOC_SEC:
-      sec=ClassDef::Exception; 
+      sec=ClassDef::Exception;
       break;
     case Entry::SERVICEDOC_SEC:
       sec=ClassDef::Service;
@@ -1318,7 +1318,7 @@ static void addClassToContext(EntryNav *rootNav)
       tagName     = tagInfo->tagName;
       refFileName = tagInfo->fileName;
       if (fullName.find("::")!=-1)
-        // symbols imported via tag files may come without the parent scope, 
+        // symbols imported via tag files may come without the parent scope,
         // so we artificially create it here
       {
         buildScopeFromQualifiedName(fullName,fullName.contains("::"),root->lang,tagInfo);
@@ -1343,26 +1343,26 @@ static void addClassToContext(EntryNav *rootNav)
         qPrint(fullName),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);    
+    cd->setLanguage(root->lang);
     cd->setId(root->id);
-    cd->setHidden(root->hidden);        
-    cd->setArtificial(root->artificial);        
+    cd->setHidden(root->hidden);
+    cd->setArtificial(root->artificial);
     cd->setClassSpecifier(root->spec);
-    cd->setTypeConstraints(root->typeConstr);   
-    //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data());    
+    cd->setTypeConstraints(root->typeConstr);
+    //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data());
 
-    //printf("class %s template args=%s\n",fullName.data(),     
-    //    tArgList ? tempArgListToString(tArgList,root->lang).data() : "<none>");          
-    cd->setTemplateArguments(tArgList);         
-    cd->setProtection(root->protection);        
-    cd->setIsStatic(root->stat);        
+    //printf("class %s template args=%s\n",fullName.data(),
+    //    tArgList ? tempArgListToString(tArgList,root->lang).data() : "<none>");
+    cd->setTemplateArguments(tArgList);
+    cd->setProtection(root->protection);
+    cd->setIsStatic(root->stat);
 
-    // file definition containing the class cd          
-    cd->setBodySegment(root->bodyLine,root->endBodyLine);       
-    cd->setBodyDef(fd);         
+    // file definition containing the class cd
+    cd->setBodySegment(root->bodyLine,root->endBodyLine);
+    cd->setBodyDef(fd);
 
-    // see if the class is found inside a namespace     
-    //bool found=addNamespace(root,cd);         
+    // see if the class is found inside a namespace
+    //bool found=addNamespace(root,cd);
 
     cd->insertUsedFile(fd);
 
@@ -1383,7 +1383,7 @@ static void addClassToContext(EntryNav *rootNav)
   {
     addIncludeFile(cd,fd,root);
   }
-  if (fd && (root->section & Entry::COMPOUND_MASK)) 
+  if (fd && (root->section & Entry::COMPOUND_MASK))
   {
     //printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n",
     //    cd->name().data(),
@@ -1398,14 +1398,14 @@ static void addClassToContext(EntryNav *rootNav)
 
   rootNav->releaseEntry();
 }
-            
+
 //----------------------------------------------------------------------
 // build a list of all classes mentioned in the documentation
 // and all classes that have a documentation block before their definition.
 static void buildClassList(EntryNav *rootNav)
 {
   if (
-        ((rootNav->section() & Entry::COMPOUND_MASK) || 
+        ((rootNav->section() & Entry::COMPOUND_MASK) ||
          rootNav->section()==Entry::OBJCIMPL_SEC) && !rootNav->name().isEmpty()
      )
   {
@@ -1443,7 +1443,7 @@ static void resolveClassNestingRelations()
       {
         QCString name = stripAnonymousNamespaceScope(cd->name());
         //printf("processing=%s, iteration=%d\n",cd->name().data(),iteration);
-        // also add class to the correct structural context 
+        // also add class to the correct structural context
         Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,
                                                  name,cd->getFileDef(),0);
         if (d)
@@ -1473,7 +1473,7 @@ static void resolveClassNestingRelations()
       /// create the scope artificially
       // anyway, so we can at least relate scopes properly.
       Definition *d = buildScopeFromQualifiedName(name,name.contains("::"),cd->getLanguage(),0);
-      if (d!=cd && !cd->getDefFileName().isEmpty()) 
+      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!
                  // also avoid warning for stuff imported via a tagfile.
@@ -1598,8 +1598,8 @@ static ClassDef *createTagLessInstance(ClassDef *rootCd,ClassDef *templ,const QC
 }
 
 /** Look through the members of class \a cd and its public members.
- *  If there is a member m of a tag less struct/union, 
- *  then we create a duplicate of the struct/union with the name of the 
+ *  If there is a member m of a tag less struct/union,
+ *  then we create a duplicate of the struct/union with the name of the
  *  member to identify it.
  *  So if cd has name S, then the tag less struct/union will get name S.m
  *  Since tag less structs can be nested we need to call this function
@@ -1646,7 +1646,7 @@ static void processTagLessClasses(ClassDef *rootCd,
               // replace tag-less type for generated/original member
               // by newly created class name.
               // note the difference between changing cd and tagParentCd.
-              // for the initial call this is the same pointer, but for 
+              // for the initial call this is the same pointer, but for
               // recursive calls cd is the original tag-less struct (of which
               // there is only one instance) and tagParentCd is the newly
               // generated tagged struct of which there can be multiple instances!
@@ -1714,7 +1714,7 @@ static void buildNamespaceList(EntryNav *rootNav)
        (rootNav->section()==Entry::NAMESPACE_SEC ||
         rootNav->section()==Entry::NAMESPACEDOC_SEC ||
         rootNav->section()==Entry::PACKAGEDOC_SEC
-       ) && 
+       ) &&
        !rootNav->name().isEmpty()
      )
   {
@@ -1799,7 +1799,7 @@ static void buildNamespaceList(EntryNav *rootNav)
         // add class to the list
         Doxygen::namespaceSDict->inSort(fullName,nd);
 
-        // also add namespace to the correct structural context 
+        // also add namespace to the correct structural context
         Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName,0,tagInfo);
         //printf("adding namespace %s to context %s\n",nd->name().data(),d?d->name().data():"<none>");
         if (d==0) // we didn't find anything, create the scope artificially
@@ -1881,12 +1881,12 @@ static void findUsingDirectives(EntryNav *rootNav)
 
       // find the scope in which the `using' namespace is defined by prepending
       // the possible scopes in which the using statement was found, starting
-      // with the most inner scope and going to the most outer scope (i.e. 
-      // file scope). 
+      // with the most inner scope and going to the most outer scope (i.e.
+      // file scope).
       int scopeOffset = nsName.length();
       do
       {
-        QCString scope=scopeOffset>0 ? 
+        QCString scope=scopeOffset>0 ?
                       nsName.left(scopeOffset)+"::" : QCString();
         usingNd = getResolvedNamespace(scope+name);
         //printf("Trying with scope=`%s' usingNd=%p\n",(scope+name).data(),usingNd);
@@ -1967,7 +1967,7 @@ static void findUsingDirectives(EntryNav *rootNav)
         }
 
         // insert the namespace in the file definition
-        if (fd) 
+        if (fd)
         {
           fd->insertNamespace(nd);
           fd->addUsingDirective(nd);
@@ -2014,7 +2014,7 @@ static void buildListOfUsingDecls(EntryNav *rootNav)
   RECURSE_ENTRYTREE(buildListOfUsingDecls,rootNav);
 }
 
-  
+
 static void findUsingDeclarations(EntryNav *rootNav)
 {
   if (rootNav->section()==Entry::USINGDECL_SEC &&
@@ -2048,7 +2048,7 @@ static void findUsingDeclarations(EntryNav *rootNav)
       // Assume the using statement was used to import a class.
       // Find the scope in which the `using' namespace is defined by prepending
       // the possible scopes in which the using statement was found, starting
-      // with the most inner scope and going to the most outer scope (i.e. 
+      // with the most inner scope and going to the most outer scope (i.e.
       // file scope).
 
       QCString name = substitute(root->name,".","::"); //Java/C# scope->internal
@@ -2074,7 +2074,10 @@ static void findUsingDeclarations(EntryNav *rootNav)
       else
       {
         Debug::print(Debug::Classes,0,"  Found used class %s in scope=%s\n",
-            qPrint(usingCd->name()),nd?qPrint(nd->name()):qPrint(fd->name()));
+            qPrint(usingCd->name()),
+                        nd?qPrint(nd->name()):
+                        fd?qPrint(fd->name()):
+                        "<unknown>");
       }
 
       if (nd)
@@ -2127,7 +2130,7 @@ static void findUsingDeclImports(EntryNav *rootNav)
             MemberNameInfo *mni = mndict->find(memName);
             if (mni)
             {
-              MemberNameInfoIterator mnii(*mni); 
+              MemberNameInfoIterator mnii(*mni);
               MemberInfo *mi;
               for ( ; (mi=mnii.current()) ; ++mnii )
               {
@@ -2202,7 +2205,7 @@ static void findUsingDeclImports(EntryNav *rootNav)
 static void findIncludedUsingDirectives()
 {
   // first mark all files as not visited
-  FileNameListIterator fnli(*Doxygen::inputNameList); 
+  FileNameListIterator fnli(*Doxygen::inputNameList);
   FileName *fn;
   for (fnli.toFirst();(fn=fnli.current());++fnli)
   {
@@ -2221,7 +2224,7 @@ static void findIncludedUsingDirectives()
     FileDef *fd;
     for (fni.toFirst();(fd=fni.current());++fni)
     {
-      if (!fd->visited) 
+      if (!fd->visited)
       {
         //printf("----- adding using directives for file %s\n",fd->name().data());
         fd->addIncludedUsingDirectives();
@@ -2256,7 +2259,7 @@ static MemberDef *addVariableToClass(
       "  class variable:\n"
       "    `%s' `%s'::`%s' `%s' prot=`%d ann=%d init=`%s'\n",
       qPrint(root->type),
-      qPrint(qualScope), 
+      qPrint(qualScope),
       qPrint(name),
       qPrint(root->args),
       root->protection,
@@ -2269,7 +2272,7 @@ static MemberDef *addVariableToClass(
   {
     if (related || mtype==MemberType_Friend || Config_getBool("HIDE_SCOPE_NAMES"))
     {
-      if (root->spec&Entry::Alias) // turn 'typedef B A' into 'using A = B'  
+      if (root->spec&Entry::Alias) // turn 'typedef B A' into 'using A = B'
       {
         def="using "+name+" = "+root->type.mid(7);
       }
@@ -2280,7 +2283,7 @@ static MemberDef *addVariableToClass(
     }
     else
     {
-      if (root->spec&Entry::Alias) // turn 'typedef B C::A' into 'using C::A = B'  
+      if (root->spec&Entry::Alias) // turn 'typedef B C::A' into 'using C::A = B'
       {
         def="using "+qualScope+scopeSeparator+name+" = "+root->type.mid(7);
       }
@@ -2315,13 +2318,13 @@ static MemberDef *addVariableToClass(
     {
       //printf("md->getClassDef()=%p cd=%p type=[%s] md->typeString()=[%s]\n",
       //    md->getClassDef(),cd,root->type.data(),md->typeString());
-      if (md->getClassDef()==cd && 
-          removeRedundantWhiteSpace(root->type)==md->typeString()) 
+      if (md->getClassDef()==cd &&
+          removeRedundantWhiteSpace(root->type)==md->typeString())
         // member already in the scope
       {
 
-        if (root->lang==SrcLangExt_ObjC && 
-            root->mtype==Property && 
+        if (root->lang==SrcLangExt_ObjC &&
+            root->mtype==Property &&
             md->memberType()==MemberType_Variable)
         { // Objective-C 2.0 property
           // turn variable into a property
@@ -2332,7 +2335,7 @@ static MemberDef *addVariableToClass(
         //printf("    Member already found!\n");
         return md;
       }
-    } 
+    }
   }
 
   QCString fileName = root->fileName;
@@ -2374,7 +2377,7 @@ static MemberDef *addVariableToClass(
   md->setLanguage(root->lang);
   md->setId(root->id);
   addMemberToGroups(root,md);
-  //if (root->mGrpId!=-1) 
+  //if (root->mGrpId!=-1)
   //{
   //  printf("memberdef %s in memberGroup %d\n",name.data(),root->mGrpId);
   //  md->setMemberGroup(memberGroupDict[root->mGrpId]);
@@ -2476,7 +2479,7 @@ static MemberDef *addVariableToFile(
   QCString def;
 
   // determine the definition of the global variable
-  if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@' && 
+  if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@' &&
       !Config_getBool("HIDE_SCOPE_NAMES")
      )
     // variable is inside a namespace, so put the scope before the name
@@ -2486,7 +2489,7 @@ static MemberDef *addVariableToFile(
 
     if (!root->type.isEmpty())
     {
-      if (root->spec&Entry::Alias) // turn 'typedef B NS::A' into 'using NS::A = B'  
+      if (root->spec&Entry::Alias) // turn 'typedef B NS::A' into 'using NS::A = B'
       {
         def="using "+nd->name()+sep+name+" = "+root->type;
       }
@@ -2510,7 +2513,7 @@ static MemberDef *addVariableToFile(
       }
       else
       {
-        if (root->spec&Entry::Alias) // turn 'typedef B A' into 'using A = B'  
+        if (root->spec&Entry::Alias) // turn 'typedef B A' into 'using A = B'
         {
           def="using "+root->name+" = "+root->type.mid(7);
         }
@@ -2542,7 +2545,7 @@ static MemberDef *addVariableToFile(
     for (mni.toFirst();(md=mni.current());++mni)
     {
       if (
-          ((nd==0 && md->getNamespaceDef()==0 && md->getFileDef() && 
+          ((nd==0 && md->getNamespaceDef()==0 && md->getFileDef() &&
             root->fileName==md->getFileDef()->absFilePath()
            ) // both variable names in the same file
            || (nd!=0 && md->getNamespaceDef()==nd) // both in same namespace
@@ -2553,16 +2556,16 @@ static MemberDef *addVariableToFile(
         // variable already in the scope
       {
         bool isPHPArray = md->getLanguage()==SrcLangExt_PHP &&
-                          md->argsString()!=root->args && 
+                          md->argsString()!=root->args &&
                           root->args.find('[')!=-1;
-        bool staticsInDifferentFiles = 
-                          root->stat && md->isStatic() && 
+        bool staticsInDifferentFiles =
+                          root->stat && md->isStatic() &&
                           root->fileName!=md->getDefFileName();
 
         if (md->getFileDef() &&
             !isPHPArray && // not a php array
             !staticsInDifferentFiles
-           ) 
+           )
           // not a php array variable
         {
 
@@ -2573,7 +2576,7 @@ static MemberDef *addVariableToFile(
           return md;
         }
       }
-    } 
+    }
   }
 
   QCString fileName = root->fileName;
@@ -2588,7 +2591,7 @@ static MemberDef *addVariableToFile(
   MemberDef *md=new MemberDef(
       fileName,root->startLine,root->startColumn,
       root->type,name,root->args,0,
-      Public, Normal,root->stat,Member,
+      root->protection, Normal,root->stat,Member,
       mtype,root->tArgLists ? root->tArgLists->getLast() : 0,0);
   md->setTagInfo(rootNav->tagInfo());
   md->setMemberSpecifiers(root->spec);
@@ -2619,18 +2622,18 @@ static MemberDef *addVariableToFile(
   if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
   {
     md->setNamespace(nd);
-    nd->insertMember(md); 
+    nd->insertMember(md);
   }
 
   // add member to the file (we do this even if we have already inserted
-  // it into the namespace. 
+  // it into the namespace.
   if (fd)
   {
-    md->setFileDef(fd); 
+    md->setFileDef(fd);
     fd->insertMember(md);
   }
 
-  // add member definition to the list of globals 
+  // add member definition to the list of globals
   if (mn)
   {
     mn->append(md);
@@ -2645,7 +2648,7 @@ static MemberDef *addVariableToFile(
   return md;
 }
 
-/*! See if the return type string \a type is that of a function pointer 
+/*! See if the return type string \a type is that of a function pointer
  *  \returns -1 if this is not a function pointer variable or
  *           the index at which the closing brace of (...*name) was found.
  */
@@ -2706,12 +2709,12 @@ static bool isVarWithConstructor(EntryNav *rootNav)
     result=FALSE;
     goto done;
   }
-  if (root->type.isEmpty()) 
+  if (root->type.isEmpty())
   {
     result=FALSE;
     goto done;
   }
-  if (!rootNav->parent()->name().isEmpty()) 
+  if (!rootNav->parent()->name().isEmpty())
   {
     ctx=Doxygen::namespaceSDict->find(rootNav->parent()->name());
   }
@@ -2726,13 +2729,13 @@ static bool isVarWithConstructor(EntryNav *rootNav)
   {
     typeIsClass=getResolvedClass(ctx,fd,type.left(ti))!=0;
   }
-  if (typeIsClass) // now we still have to check if the arguments are 
+  if (typeIsClass) // now we still have to check if the arguments are
                    // types or values. Since we do not have complete type info
                    // we need to rely on heuristics :-(
   {
     //printf("typeIsClass\n");
     ArgumentList *al = root->argList;
-    if (al==0 || al->isEmpty()) 
+    if (al==0 || al->isEmpty())
     {
       result=FALSE; // empty arg list -> function prototype.
       goto done;
@@ -2741,7 +2744,7 @@ static bool isVarWithConstructor(EntryNav *rootNav)
     Argument *a;
     for (ali.toFirst();(a=ali.current());++ali)
     {
-      if (!a->name.isEmpty() || !a->defval.isEmpty()) 
+      if (!a->name.isEmpty() || !a->defval.isEmpty())
       {
         if (a->name.find(initChars)==0)
         {
@@ -2753,7 +2756,7 @@ static bool isVarWithConstructor(EntryNav *rootNav)
         }
         goto done;
       }
-      if (a->type.isEmpty() || getResolvedClass(ctx,fd,a->type)!=0) 
+      if (a->type.isEmpty() || getResolvedClass(ctx,fd,a->type)!=0)
       {
         result=FALSE; // arg type is a known type
         goto done;
@@ -2765,13 +2768,13 @@ static bool isVarWithConstructor(EntryNav *rootNav)
          goto done;
       }
       if (a->type.at(a->type.length()-1)=='*' ||
-          a->type.at(a->type.length()-1)=='&')  
+          a->type.at(a->type.length()-1)=='&')
                      // type ends with * or & => pointer or reference
       {
         result=FALSE;
         goto done;
       }
-      if (a->type.find(initChars)==0) 
+      if (a->type.find(initChars)==0)
       {
         result=TRUE; // argument type starts with typical initializer char
         goto done;
@@ -2783,9 +2786,9 @@ static bool isVarWithConstructor(EntryNav *rootNav)
       {
         resType=resType.left(len);
         //printf("resType=%s\n",resType.data());
-        if (resType=="int"    || resType=="long" || resType=="float" || 
-            resType=="double" || resType=="char" || resType=="signed" || 
-            resType=="const"  || resType=="unsigned" || resType=="void") 
+        if (resType=="int"    || resType=="long" || resType=="float" ||
+            resType=="double" || resType=="char" || resType=="signed" ||
+            resType=="const"  || resType=="unsigned" || resType=="void")
         {
           result=FALSE; // type keyword -> function prototype
           goto done;
@@ -2822,7 +2825,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
     if (root->type.isEmpty() && root->name.find("operator")==-1 &&
         (root->name.find('*')!=-1 || root->name.find('&')!=-1))
     {
-      // recover from parse error caused by redundant braces 
+      // recover from parse error caused by redundant braces
       // like in "int *(var[10]);", which is parsed as
       // type="" name="int *" args="(var[10])"
 
@@ -2864,10 +2867,10 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
         root->args.prepend(") ");
       }
     }
-    
+
     QCString scope,name=removeRedundantWhiteSpace(root->name);
 
-    // find the scope of this variable 
+    // find the scope of this variable
     EntryNav *p = rootNav->parent();
     while ((p->section() & Entry::SCOPE_MASK))
     {
@@ -2879,7 +2882,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
       }
       p=p->parent();
     }
-    
+
     MemberType mtype;
     QCString type=root->type.stripWhiteSpace();
     ClassDef *cd=0;
@@ -2890,9 +2893,9 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
     classScope=stripTemplateSpecifiersFromScope(classScope,FALSE);
     QCString annScopePrefix=scope.left(scope.length()-classScope.length());
 
-    if (root->name.findRev("::")!=-1) 
+    if (root->name.findRev("::")!=-1)
     {
-      if (root->type=="friend class" || root->type=="friend struct" || 
+      if (root->type=="friend class" || root->type=="friend struct" ||
           root->type=="friend union")
       {
          cd=getClass(scope);
@@ -2910,7 +2913,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
          }
       }
       goto nextMember;
-               /* skip this member, because it is a 
+               /* skip this member, because it is a
                 * static variable definition (always?), which will be
                 * found in a class scope as well, but then we know the
                 * correct protection level, so only then it will be
@@ -2918,9 +2921,9 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
                 */
     }
 
-    if (type=="@") 
+    if (type=="@")
       mtype=MemberType_EnumValue;
-    else if (type.left(8)=="typedef ") 
+    else if (type.left(8)=="typedef ")
       mtype=MemberType_Typedef;
     else if (type.left(7)=="friend ")
       mtype=MemberType_Friend;
@@ -2937,17 +2940,17 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
       isMemberOf=(root->relatesType == MemberOf);
       if (getClass(root->relates)==0 && !scope.isEmpty())
         scope=mergeScopes(scope,root->relates);
-      else 
+      else
         scope=root->relates;
     }
-    
+
     cd=getClass(scope);
     if (cd==0 && classScope!=scope) cd=getClass(classScope);
     if (cd)
     {
       MemberDef *md=0;
 
-      // if cd is an anonymous (=tag less) scope we insert the member 
+      // if cd is an anonymous (=tag less) scope we insert the member
       // into a non-anonymous parent scope as well. This is needed to
       // be able to refer to it using \var or \fn
 
@@ -2955,7 +2958,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
       int si=scope.find('@');
       //int anonyScopes = 0;
       //bool added=FALSE;
-      
+
       static bool inlineSimpleStructs = Config_getBool("INLINE_SIMPLE_STRUCTS");
       if (si!=-1 && !inlineSimpleStructs) // anonymous scope or type
       {
@@ -2985,7 +2988,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
           {
             if (mtype==MemberType_Variable)
             {
-              md=addVariableToFile(rootNav,mtype,pScope,name,TRUE,0); 
+              md=addVariableToFile(rootNav,mtype,pScope,name,TRUE,0);
             }
             //added=TRUE;
           }
@@ -3001,7 +3004,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
                          name,   // name of the member
                          FALSE,  // from anonymous scope
                          md,     // from anonymous member
-                         root->protection, 
+                         root->protection,
                          isMemberOf ? Foreign : isRelated ? Related : Member);
     }
     else if (!name.isEmpty()) // global variable
@@ -3023,7 +3026,7 @@ static void buildTypedefList(EntryNav *rootNav)
   if (!rootNav->name().isEmpty() &&
       rootNav->section()==Entry::VARIABLE_SEC &&
       rootNav->type().find("typedef ")!=-1 // its a typedef
-     ) 
+     )
   {
     addVariable(rootNav);
   }
@@ -3033,7 +3036,7 @@ static void buildTypedefList(EntryNav *rootNav)
     EntryNav *e;
     for (;(e=eli.current());++eli)
     {
-      if (e->section()!=Entry::ENUM_SEC) 
+      if (e->section()!=Entry::ENUM_SEC)
       {
         buildTypedefList(e);
       }
@@ -3054,13 +3057,13 @@ static void buildVarList(EntryNav *rootNav)
       (
        (rootNav->section()==Entry::VARIABLE_SEC    // it's a variable
        ) ||
-       (rootNav->section()==Entry::FUNCTION_SEC && // or maybe a function pointer variable 
+       (rootNav->section()==Entry::FUNCTION_SEC && // or maybe a function pointer variable
         (isFuncPtr=findFunctionPtr(rootNav->type(),rootNav->lang()))!=-1
        ) ||
        (rootNav->section()==Entry::FUNCTION_SEC && // class variable initialized by constructor
         isVarWithConstructor(rootNav)
        )
-      ) 
+      )
      ) // documented variable
   {
     addVariable(rootNav,isFuncPtr);
@@ -3071,7 +3074,7 @@ static void buildVarList(EntryNav *rootNav)
     EntryNav *e;
     for (;(e=eli.current());++eli)
     {
-      if (e->section()!=Entry::ENUM_SEC) 
+      if (e->section()!=Entry::ENUM_SEC)
       {
         buildVarList(e);
       }
@@ -3268,7 +3271,7 @@ static void addMethodToClass(EntryNav *rootNav,ClassDef *cd,
   if ((fd==0 || fd->getLanguage()==SrcLangExt_Cpp) &&
      name.left(9)!="operator " && (i=name.find('<'))!=-1 && name.find('>')!=-1)
   {
-    name=name.left(i); 
+    name=name.left(i);
   }
 
   QCString fileName = root->fileName;
@@ -3277,7 +3280,7 @@ static void addMethodToClass(EntryNav *rootNav,ClassDef *cd,
     fileName = rootNav->tagInfo()->tagName;
   }
 
-  //printf("root->name=`%s; root->args=`%s' root->argList=`%s'\n", 
+  //printf("root->name=`%s; root->args=`%s' root->argList=`%s'\n",
   //    root->name.data(),root->args.data(),argListToString(root->argList).data()
   //   );
 
@@ -3456,7 +3459,7 @@ static void buildFunctionList(EntryNav *rootNav)
       if (cd && scope+"::"==rname.left(scope.length()+2)) // found A::f inside A
       {
         // strip scope from name
-        rname=rname.right(rname.length()-rootNav->parent()->name().length()-2); 
+        rname=rname.right(rname.length()-rootNav->parent()->name().length()-2);
       }
 
       NamespaceDef *nd = 0;
@@ -3467,7 +3470,7 @@ static void buildFunctionList(EntryNav *rootNav)
         int te=rname.find('>');
         if (memIndex>0 && (ts==-1 || te==-1))
         {
-          // note: the following code was replaced by inMember=TRUE to deal with a 
+          // note: the following code was replaced by inMember=TRUE to deal with a
           // function rname='X::foo' of class X inside a namespace also called X...
           // bug id 548175
           //nd = Doxygen::namespaceSDict->find(rname.left(memIndex));
@@ -3491,11 +3494,11 @@ static void buildFunctionList(EntryNav *rootNav)
       int te=root->type.findRev('>');
       int ti;
       if (!rootNav->parent()->name().isEmpty() &&
-          (rootNav->parent()->section() & Entry::COMPOUND_MASK) && 
+          (rootNav->parent()->section() & Entry::COMPOUND_MASK) &&
           cd &&
-          // do some fuzzy things to exclude function pointers 
-          (root->type.isEmpty() || 
-           ((ti=root->type.find(re,0))==-1 ||      // type does not contain ..(..* 
+          // do some fuzzy things to exclude function pointers
+          (root->type.isEmpty() ||
+           ((ti=root->type.find(re,0))==-1 ||      // type does not contain ..(..*
             (ts!=-1 && ts<te && ts<ti && ti<te) || // outside of < ... >
            root->args.find(")[")!=-1) ||           // and args not )[.. -> function pointer
            root->type.find(")(")!=-1 || root->type.find("operator")!=-1 || // type contains ..)(.. and not "operator"
@@ -3507,14 +3510,14 @@ static void buildFunctionList(EntryNav *rootNav)
             qPrint(rname),qPrint(cd->name()));
         addMethodToClass(rootNav,cd,rname,isFriend);
       }
-      else if (!((rootNav->parent()->section() & Entry::COMPOUND_MASK) 
+      else if (!((rootNav->parent()->section() & Entry::COMPOUND_MASK)
                  || rootNav->parent()->section()==Entry::OBJCIMPL_SEC
                 ) &&
                !isMember &&
                (root->relates.isEmpty() || root->relatesType == Duplicate) &&
-               root->type.left(7)!="extern " && root->type.left(8)!="typedef " 
+               root->type.left(7)!="extern " && root->type.left(8)!="typedef "
               )
-      // no member => unrelated function 
+      // no member => unrelated function
       {
         /* check the uniqueness of the function name in the file.
          * A file could contain a function prototype and a function definition
@@ -3566,14 +3569,14 @@ static void buildFunctionList(EntryNav *rootNav)
               }
             }
 
-            bool staticsInDifferentFiles = 
+            bool staticsInDifferentFiles =
                     root->stat && md->isStatic() && root->fileName!=md->getDefFileName();
 
             if (
                 matchArguments2(md->getOuterScope(),mfd,mdAl,
                                 rnd ? rnd : Doxygen::globalScope,rfd,root->argList,
                                 FALSE) &&
-                sameNumTemplateArgs && 
+                sameNumTemplateArgs &&
                 matchingReturnTypes &&
                 !staticsInDifferentFiles
                )
@@ -3759,7 +3762,7 @@ static void buildFunctionList(EntryNav *rootNav)
           md->setDefinition(def);
           md->enableCallGraph(root->callGraph);
           md->enableCallerGraph(root->callerGraph);
-          //if (root->mGrpId!=-1) 
+          //if (root->mGrpId!=-1)
           //{
           //  md->setMemberGroup(memberGroupDict[root->mGrpId]);
           //}
@@ -3769,13 +3772,13 @@ static void buildFunctionList(EntryNav *rootNav)
           {
             // add member to namespace
             md->setNamespace(nd);
-            nd->insertMember(md); 
+            nd->insertMember(md);
           }
           if (fd)
           {
             // add member to the file (we do this even if we have already
             // inserted it into the namespace)
-            md->setFileDef(fd); 
+            md->setFileDef(fd);
             fd->insertMember(md);
           }
 
@@ -3786,7 +3789,7 @@ static void buildFunctionList(EntryNav *rootNav)
           {
             mn->append(md);
           }
-          else 
+          else
           {
             mn = new MemberName(name);
             mn->append(md);
@@ -3796,7 +3799,7 @@ static void buildFunctionList(EntryNav *rootNav)
           if (root->relatesType == Simple) // if this is a relatesalso command,
                                            // allow find Member to pick it up
           {
-            rootNav->changeSection(Entry::EMPTY_SEC); // Otherwise we have finished 
+            rootNav->changeSection(Entry::EMPTY_SEC); // Otherwise we have finished
                                                       // with this entry.
 
           }
@@ -3854,7 +3857,7 @@ static void findFriends()
         MemberDef *mmd;
         for (;(mmd=mni.current());++mni) // for each member with that name
         {
-          //printf("Checking for matching arguments 
+          //printf("Checking for matching arguments
           //        mmd->isRelated()=%d mmd->isFriend()=%d mmd->isFunction()=%d\n",
           //    mmd->isRelated(),mmd->isFriend(),mmd->isFunction());
           ArgumentList *mmdAl = mmd->argumentList();
@@ -3864,8 +3867,8 @@ static void findFriends()
                               fmd->getOuterScope(), fmd->getFileDef(), fmdAl,
                               TRUE
                              )
-                             
-             ) // if the member is related and the arguments match then the 
+
+             ) // if the member is related and the arguments match then the
                // function is actually a friend.
           {
             mergeArguments(mmdAl,fmdAl);
@@ -3937,7 +3940,7 @@ static void transferFunctionDocumentation()
     for (;(mdec=mni1.current());++mni1)
     {
       if (mdec->isPrototype() ||
-          (mdec->isVariable() && mdec->isExternal()) 
+          (mdec->isVariable() && mdec->isExternal())
          )
       {
         MemberNameIterator mni2(*mn);
@@ -3963,12 +3966,12 @@ static void transferFunctionReferences()
     /* find a matching function declaration and definition for this function */
     for (;(md=mni.current());++mni)
     {
-      if (md->isPrototype()) 
+      if (md->isPrototype())
         mdec=md;
-      else if (md->isVariable() && md->isExternal()) 
+      else if (md->isVariable() && md->isExternal())
         mdec=md;
-      
-      if (md->isFunction() && !md->isStatic() && !md->isPrototype()) 
+
+      if (md->isFunction() && !md->isStatic() && !md->isPrototype())
         mdef=md;
       else if (md->isVariable() && !md->isExternal() && !md->isStatic())
         mdef=md;
@@ -4046,7 +4049,7 @@ static void transferFunctionReferences()
 
 static void transferRelatedFunctionDocumentation()
 {
-  // find match between function declaration and definition for 
+  // find match between function declaration and definition for
   // related functions
   MemberNameSDict::Iterator mnli(*Doxygen::functionNameSDict);
   MemberName *mn;
@@ -4083,9 +4086,9 @@ static void transferRelatedFunctionDocumentation()
               md->makeForeign();
             else
               md->makeRelated();
-          } 
+          }
         }
-      } 
+      }
     }
   }
 }
@@ -4093,8 +4096,8 @@ static void transferRelatedFunctionDocumentation()
 //----------------------------------------------------------------------
 
 /*! make a dictionary of all template arguments of class cd
- * that are part of the base class name. 
- * Example: A template class A with template arguments <R,S,T> 
+ * that are part of the base class name.
+ * Example: A template class A with template arguments <R,S,T>
  * that inherits from B<T,T,S> will have T and S in the dictionary.
  */
 static QDict<int> *getTemplateArgumentsInName(ArgumentList *templateArguments,const QCString &name)
@@ -4286,11 +4289,11 @@ static void findUsedClassesForClass(EntryNav *rootNav,
               //printf("Looking for used class %s: result=%s master=%s\n",
               //    usedName.data(),usedCd?usedCd->name().data():"<none>",masterCd?masterCd->name().data():"<none>");
 
-              if (usedCd) 
+              if (usedCd)
               {
                 found=TRUE;
                 Debug::print(Debug::Classes,0,"    Adding used class `%s' (2)\n", qPrint(usedCd->name()));
-                instanceCd->addUsedClass(usedCd,md->name(),md->protection()); // class exists 
+                instanceCd->addUsedClass(usedCd,md->name(),md->protection()); // class exists
                 usedCd->addUsedByClass(instanceCd,md->name(),md->protection());
               }
             }
@@ -4322,7 +4325,7 @@ static void findUsedClassesForClass(EntryNav *rootNav,
             {
               if (isArtificial) usedCd->setArtificial(TRUE);
               Debug::print(Debug::Classes,0,"    Adding used class `%s' (3)\n", qPrint(usedCd->name()));
-              instanceCd->addUsedClass(usedCd,md->name(),md->protection()); 
+              instanceCd->addUsedClass(usedCd,md->name(),md->protection());
               usedCd->addUsedByClass(instanceCd,md->name(),md->protection());
             }
           }
@@ -4378,7 +4381,7 @@ static void findBaseClassesForClass(
       {
         // 1.8.2: decided to show inheritance relations even if not documented,
         //        we do make them artificial, so they do not appear in the index
-        //if (!Config_getBool("HIDE_UNDOC_RELATIONS")) 
+        //if (!Config_getBool("HIDE_UNDOC_RELATIONS"))
         bool b = Config_getBool("HIDE_UNDOC_RELATIONS") ? TRUE : isArtificial;
         //{
           // no documented base class -> try to find an undocumented one
@@ -4394,7 +4397,7 @@ static void findBaseClassesForClass(
     {
       delete templateNames;
       templateNames=0;
-    }  
+    }
   }
 }
 
@@ -4420,7 +4423,7 @@ static bool findTemplateInstanceRelation(Entry *root,
   //  }
   //}
   //printf("\n");
-  
+
   bool existingClass = (templSpec ==
                         tempArgListToString(templateClass->templateArguments(),root->lang)
                        );
@@ -4438,8 +4441,8 @@ static bool findTemplateInstanceRelation(Entry *root,
     Doxygen::classSDict->append(instanceClass->name(),instanceClass);
     instanceClass->setTemplateBaseClassNames(templateNames);
 
-    // search for new template instances caused by base classes of 
-    // instanceClass 
+    // search for new template instances caused by base classes of
+    // instanceClass
     EntryNav *templateRootNav = g_classEntries.find(templateClass->name());
     if (templateRootNav)
     {
@@ -4501,7 +4504,7 @@ static bool isRecursiveBaseClass(const QCString &scope,const QCString &name)
  *  character position \a startPos. If the end was found the position
  *  of the closing \> is returned, otherwise -1 is returned.
  *
- *  Handles exotic cases such as 
+ *  Handles exotic cases such as
  *  \code
  *    Class<(id<0)>
  *    Class<bits<<2>
@@ -4525,11 +4528,11 @@ static int findEndOfTemplate(const QCString &s,int startPos)
     char c=s.at(e);
     switch(c)
     {
-      case '<': 
+      case '<':
         if (!insideString && !insideChar)
         {
-          if (e<len-1 && s.at(e+1)=='<') 
-            e++; 
+          if (e<len-1 && s.at(e+1)=='<')
+            e++;
           else if (roundCount==0)
             brCount++;
         }
@@ -4537,24 +4540,24 @@ static int findEndOfTemplate(const QCString &s,int startPos)
       case '>':
         if (!insideString && !insideChar)
         {
-          if (e<len-1 && s.at(e+1)=='>') 
-            e++; 
+          if (e<len-1 && s.at(e+1)=='>')
+            e++;
           else if (roundCount==0)
             brCount--;
         }
         break;
       case '(':
-        if (!insideString && !insideChar) 
+        if (!insideString && !insideChar)
           roundCount++;
         break;
       case ')':
-        if (!insideString && !insideChar) 
+        if (!insideString && !insideChar)
           roundCount--;
         break;
       case '"':
         if (!insideChar)
         {
-          if (insideString && pc!='\\') 
+          if (insideString && pc!='\\')
             insideString=FALSE;
           else
             insideString=TRUE;
@@ -4612,7 +4615,7 @@ static bool findClassRelation(
 
   EntryNav *parentNode=rootNav->parent();
   bool lastParent=FALSE;
-  do // for each parent scope, starting with the largest scope 
+  do // for each parent scope, starting with the largest scope
      // (in case of nested classes)
   {
     QCString scopeName= parentNode ? parentNode->name().data() : "";
@@ -4634,7 +4637,7 @@ static bool findClassRelation(
       MemberDef *baseClassTypeDef=0;
       QCString templSpec;
       ClassDef *baseClass=getResolvedClass(explicitGlobalScope ? Doxygen::globalScope : context,
-                                           cd->getFileDef(), 
+                                           cd->getFileDef(),
                                            baseClassName,
                                            &baseClassTypeDef,
                                            &templSpec,
@@ -4680,7 +4683,7 @@ static bool findClassRelation(
           baseClass = Doxygen::genericsDict->find(baseClassName.left(i));
           //printf("looking for '%s' result=%p\n",baseClassName.data(),baseClass);
         }
-        if (baseClass==0 && i!=-1) 
+        if (baseClass==0 && i!=-1)
           // base class has template specifiers
         {
           // TODO: here we should try to find the correct template specialization
@@ -4780,11 +4783,11 @@ static bool findClassRelation(
           // if templSpec is not empty then we should "instantiate"
           // the template baseClass. A new ClassDef should be created
           // to represent the instance. To be able to add the (instantiated)
-          // members and documentation of a template class 
-          // (inserted in that template class at a later stage), 
-          // the template should know about its instances. 
-          // the instantiation process, should be done in a recursive way, 
-          // since instantiating a template may introduce new inheritance 
+          // members and documentation of a template class
+          // (inserted in that template class at a later stage),
+          // the template should know about its instances.
+          // the instantiation process, should be done in a recursive way,
+          // since instantiating a template may introduce new inheritance
           // relations.
           if (!templSpec.isEmpty() && mode==TemplateInstances)
           {
@@ -4802,7 +4805,7 @@ static bool findClassRelation(
           {
             //printf("       => insert base class\n");
             QCString usedName;
-            if (baseClassTypeDef || cd->isCSharp()) 
+            if (baseClassTypeDef || cd->isCSharp())
             {
               usedName=biName;
               //printf("***** usedName=%s templSpec=%s\n",usedName.data(),templSpec.data());
@@ -4903,7 +4906,7 @@ static bool findClassRelation(
               );
         }
         // for mode==TemplateInstance this case is quite common and
-        // indicates a relation between a template class and a template 
+        // indicates a relation between a template class and a template
         // instance with the same name.
       }
       if (scopeOffset==0)
@@ -4942,13 +4945,13 @@ static bool isClassSection(EntryNav *rootNav)
     {
       return TRUE;
     }
-    else if (rootNav->section() & Entry::COMPOUNDDOC_MASK) 
+    else if (rootNav->section() & Entry::COMPOUNDDOC_MASK)
          // is it a documentation block with inheritance info.
     {
       rootNav->loadEntry(g_storage);
       Entry *root = rootNav->entry();
       bool extends = root->extends->count()>0;
-      rootNav->releaseEntry(); 
+      rootNav->releaseEntry();
       if (extends) return TRUE;
     }
   }
@@ -4983,7 +4986,7 @@ static QCString extractClassName(EntryNav *rootNav)
   return bName;
 }
 
-/*! Using the dictionary build by findClassEntries(), this 
+/*! Using the dictionary build by findClassEntries(), this
  *  function will look for additional template specialization that
  *  exists as inheritance relations only. These instances will be
  *  added to the template they are derived from.
@@ -5053,7 +5056,7 @@ static void computeClassRelations()
         bName.right(2)!="::")
     {
       if (!root->name.isEmpty() && root->name.find('@')==-1 && // normal name
-          (guessSection(root->fileName)==Entry::HEADER_SEC || 
+          (guessSection(root->fileName)==Entry::HEADER_SEC ||
            Config_getBool("EXTRACT_LOCAL_CLASSES")) && // not defined in source file
            protectionLevelVisible(root->protection) && // hidden by protection
            !Config_getBool("HIDE_UNDOC_CLASSES") // undocumented class are visible
@@ -5081,7 +5084,7 @@ static void computeTemplateClassRelations()
     QCString bName=stripAnonymousNamespaceScope(root->name);
     bName=stripTemplateSpecifiersFromScope(bName);
     ClassDef *cd=getClass(bName);
-    // strip any anonymous scopes first 
+    // strip any anonymous scopes first
     QDict<ClassDef> *templInstances = 0;
     if (cd && (templInstances=cd->getTemplateInstances()))
     {
@@ -5115,7 +5118,7 @@ static void computeTemplateClassRelations()
             {
               int templIndex = *qdi.current();
               Argument *actArg = 0;
-              if (templIndex<(int)templArgs->count()) 
+              if (templIndex<(int)templArgs->count())
               {
                 actArg=templArgs->at(templIndex);
               }
@@ -5129,7 +5132,7 @@ static void computeTemplateClassRelations()
               }
             }
             delete templateNames;
-            
+
             tbi.name = substituteTemplateArgumentsInString(bi->name,tl,templArgs);
             // find a documented base class in the correct scope
             if (!findClassRelation(rootNav,cd,tcd,&tbi,actualTemplateNames,DocumentedOnly,FALSE))
@@ -5292,8 +5295,8 @@ static void generateXRefPages()
 
 //----------------------------------------------------------------------
 // Copy the documentation in entry `root' to member definition `md' and
-// set the function declaration of the member to `funcDecl'. If the boolean 
-// over_load is set the standard overload text is added. 
+// set the function declaration of the member to `funcDecl'. If the boolean
+// over_load is set the standard overload text is added.
 
 static void addMemberDocs(EntryNav *rootNav,
                    MemberDef *md, const char *funcDecl,
@@ -5314,9 +5317,9 @@ static void addMemberDocs(EntryNav *rootNav,
   ClassDef     *cd=md->getClassDef();
   NamespaceDef *nd=md->getNamespaceDef();
   QCString fullName;
-  if (cd) 
+  if (cd)
     fullName = cd->name();
-  else if (nd) 
+  else if (nd)
     fullName = nd->name();
 
   if (!fullName.isEmpty()) fullName+="::";
@@ -5334,12 +5337,12 @@ static void addMemberDocs(EntryNav *rootNav,
   }
   else
   {
-    if ( 
+    if (
           matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl,
                            rscope,rfd,root->argList,
                            TRUE
                          )
-       ) 
+       )
     {
       //printf("merging arguments (2)\n");
       mergeArguments(mdAl,root->argList,!root->doc.isEmpty());
@@ -5353,11 +5356,11 @@ static void addMemberDocs(EntryNav *rootNav,
       doc+="<p>";
       doc+=root->doc;
     }
-    md->setDocumentation(doc,root->docFile,root->docLine); 
+    md->setDocumentation(doc,root->docFile,root->docLine);
     md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
     md->setDocsForDefinition(!root->proto);
   }
-  else  
+  else
   {
     //printf("overwrite!\n");
     md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -5390,7 +5393,7 @@ static void addMemberDocs(EntryNav *rootNav,
 
   if (rfd)
   {
-    if ((md->getStartBodyLine()==-1 && root->bodyLine!=-1) 
+    if ((md->getStartBodyLine()==-1 && root->bodyLine!=-1)
        )
     {
       //printf("Setting new body segment [%d,%d]\n",root->bodyLine,root->endBodyLine);
@@ -5432,7 +5435,7 @@ static void addMemberDocs(EntryNav *rootNav,
 }
 
 //----------------------------------------------------------------------
-// find a class definition given the scope name and (optionally) a 
+// find a class definition given the scope name and (optionally) a
 // template list specifier
 
 static ClassDef *findClassDefinition(FileDef *fd,NamespaceDef *nd,
@@ -5448,12 +5451,12 @@ static ClassDef *findClassDefinition(FileDef *fd,NamespaceDef *nd,
 // with name `name' and argument list `args' (for overloading) and
 // function declaration `decl' to the corresponding member definition.
 
-static bool findGlobalMember(EntryNav *rootNav, 
+static bool findGlobalMember(EntryNav *rootNav,
                            const QCString &namespaceName,
                            const char *type,
-                           const char *name, 
+                           const char *name,
                            const char *tempArg,
-                           const char *, 
+                           const char *,
                            const char *decl)
 {
   Entry *root = rootNav->entry();
@@ -5488,14 +5491,14 @@ static bool findGlobalMember(EntryNav *rootNav,
       //SDict<Definition> *cl = fd ? fd->getUsedClasses()    : 0;
       //printf("NamespaceList %p\n",nl);
 
-      // search in the list of namespaces that are imported via a 
+      // search in the list of namespaces that are imported via a
       // using declaration
       bool viaUsingDirective = nl && nd && nl->find(nd->qualifiedName())!=0;
 
       if ((namespaceName.isEmpty() && nd==0) ||  // not in a namespace
-          (nd && nd->name()==namespaceName) ||   // or in the same namespace 
+          (nd && nd->name()==namespaceName) ||   // or in the same namespace
           viaUsingDirective                      // member in `using' namespace
-         )     
+         )
       {
         Debug::print(Debug::FindMembers,0,"4. Try to add member `%s' to scope `%s'\n",
             qPrint(md->name()),qPrint(namespaceName));
@@ -5530,12 +5533,12 @@ static bool findGlobalMember(EntryNav *rootNav,
         //    argListToString(md->argumentList()).data(),
         //    argListToString(root->argList).data());
 
-        // for static members we also check if the comment block was found in 
+        // for static members we also check if the comment block was found in
         // the same file. This is needed because static members with the same
         // name can be in different files. Thus it would be wrong to just
         // put the comment block at the first syntactically matching member.
-        if (matching && md->isStatic() && 
-            md->getDefFileName()!=root->fileName && 
+        if (matching && md->isStatic() &&
+            md->getDefFileName()!=root->fileName &&
             mn->count()>1)
         {
           matching = FALSE;
@@ -5561,7 +5564,7 @@ static bool findGlobalMember(EntryNav *rootNav,
           found=TRUE;
         }
       }
-    } 
+    }
     if (!found && root->relatesType != Duplicate && root->section==Entry::FUNCTION_SEC) // no match
     {
       QCString fullFuncDecl=decl;
@@ -5584,10 +5587,10 @@ static bool findGlobalMember(EntryNav *rootNav,
   }
   else // got docs for an undefined member!
   {
-    if (root->type!="friend class" && 
+    if (root->type!="friend class" &&
         root->type!="friend struct" &&
         root->type!="friend union" &&
-        (!Config_getBool("TYPEDEF_HIDES_STRUCT") || 
+        (!Config_getBool("TYPEDEF_HIDES_STRUCT") ||
          root->type.find("typedef ")==-1)
        )
     {
@@ -5635,7 +5638,7 @@ static QCString substituteTemplatesInString(
   QCString dst;
   QRegExp re( "[A-Za-z_][A-Za-z_0-9]*");
   //printf("type=%s\n",sa->type.data());
-  int i,p=0,l; 
+  int i,p=0,l;
   while ((i=re.match(src,p,&l))!=-1) // for each word in srcType
   {
     bool found=FALSE;
@@ -5698,7 +5701,7 @@ static QCString substituteTemplatesInString(
       //  argListToString(dstlali.current()).data(),
       //  funcTempArgList ? argListToString(funcTempArgList).data() : "<none>");
     }
-    dst+=name; 
+    dst+=name;
     p=i+l;
   }
   dst+=src.right(src.length()-p);
@@ -5757,7 +5760,7 @@ static void substituteTemplatesInArgList(
 
 
 
-/*! This function tries to find a member (in a documented class/file/namespace) 
+/*! This function tries to find a member (in a documented class/file/namespace)
  * that corresponds to the function/variable declaration given in \a funcDecl.
  *
  * The boolean \a overloaded is used to specify whether or not a standard
@@ -5831,10 +5834,10 @@ static void findMember(EntryNav *rootNav,
   {
     funcDecl=(funcDecl.left(sep)+funcDecl.right(funcDecl.length()-sep-1)).stripWhiteSpace();
   }
-  
+
   // make sure the first character is a space to simplify searching.
   if (!funcDecl.isEmpty() && funcDecl[0]!=' ') funcDecl.prepend(" ");
-  
+
   // remove some superfluous spaces
   funcDecl= substitute(
               substitute(
@@ -5843,7 +5846,7 @@ static void findMember(EntryNav *rootNav,
               ),
               " ::","::"
             ).stripWhiteSpace();
-  
+
   //printf("funcDecl=`%s'\n",funcDecl.data());
   if (isFriend && funcDecl.left(6)=="class ")
   {
@@ -5872,7 +5875,7 @@ static void findMember(EntryNav *rootNav,
   // related field.
   //printf("scopeName=`%s' className=`%s' namespaceName=`%s'\n",
   //    scopeName.data(),className.data(),namespaceName.data());
-  if (!root->relates.isEmpty()) 
+  if (!root->relates.isEmpty())
   {                             // related member, prefix user specified scope
     isRelated=TRUE;
     isMemberOf=(root->relatesType == MemberOf);
@@ -5880,21 +5883,21 @@ static void findMember(EntryNav *rootNav,
     {
       scopeName= mergeScopes(scopeName,root->relates);
     }
-    else 
+    else
     {
       scopeName = root->relates;
     }
   }
 
-  if (root->relates.isEmpty() && rootNav->parent() && 
+  if (root->relates.isEmpty() && rootNav->parent() &&
       ((rootNav->parent()->section()&Entry::SCOPE_MASK) ||
        (rootNav->parent()->section()==Entry::OBJCIMPL_SEC)
       ) &&
-      !rootNav->parent()->name().isEmpty()) // see if we can combine scopeName 
+      !rootNav->parent()->name().isEmpty()) // see if we can combine scopeName
                                      // with the scope in which it was found
   {
     QCString joinedName = rootNav->parent()->name()+"::"+scopeName;
-    if (!scopeName.isEmpty() && 
+    if (!scopeName.isEmpty() &&
         (getClass(joinedName) || Doxygen::namespaceSDict->find(joinedName)))
     {
       scopeName = joinedName;
@@ -5928,27 +5931,27 @@ static void findMember(EntryNav *rootNav,
      }
   }
   scopeName=stripTemplateSpecifiersFromScope(
-      removeRedundantWhiteSpace(scopeName),FALSE,&funcSpec); 
+      removeRedundantWhiteSpace(scopeName),FALSE,&funcSpec);
 
   // funcSpec contains the last template specifiers of the given scope.
-  // If this method does not have any template arguments or they are 
-  // empty while funcSpec is not empty we assume this is a 
+  // If this method does not have any template arguments or they are
+  // empty while funcSpec is not empty we assume this is a
   // specialization of a method. If not, we clear the funcSpec and treat
   // this as a normal method of a template class.
-  if (!(root->tArgLists && 
+  if (!(root->tArgLists &&
         root->tArgLists->count()>0 &&
         root->tArgLists->getFirst()->count()==0
        )
-     ) 
+     )
   {
     funcSpec.resize(0);
   }
-  
+
   // split scope into a namespace and a class part
   extractNamespaceName(scopeName,className,namespaceName,TRUE);
   //printf("scopeName=`%s' className=`%s' namespaceName=`%s'\n",
   //       scopeName.data(),className.data(),namespaceName.data());
-  
+
   //namespaceName=removeAnonymousScopes(namespaceName);
   if (namespaceName.find('@')!=-1) return; // skip stuff in anonymous namespace...
 
@@ -6046,10 +6049,10 @@ static void findMember(EntryNav *rootNav,
       }
     }
   }
-  
+
   if (funcType=="template class" && !funcTempList.isEmpty())
     return;   // ignore explicit template instantiations
-  
+
   Debug::print(Debug::FindMembers,0,
            "findMember() Parse results:\n"
            "  namespaceName=`%s'\n"
@@ -6060,7 +6063,7 @@ static void findMember(EntryNav *rootNav,
            "  funcArgs=`%s'\n"
            "  funcTempList=`%s'\n"
            "  funcDecl=`%s'\n"
-           "  related=`%s'\n" 
+           "  related=`%s'\n"
            "  exceptions=`%s'\n"
            "  isRelated=%d\n"
            "  isMemberOf=%d\n"
@@ -6074,7 +6077,7 @@ static void findMember(EntryNav *rootNav,
 
   MemberName *mn=0;
   if (!funcName.isEmpty()) // function name is valid
-  { 
+  {
     Debug::print(Debug::FindMembers,0,
                  "1. funcName=`%s'\n",funcName.data());
     if (funcName.left(9)=="operator ") // strip class scope from cast operator
@@ -6120,7 +6123,7 @@ static void findMember(EntryNav *rootNav,
             //       stripTemplateSpecifiersFromScope(scopeName,FALSE).data());
 
             ClassDef *tcd=findClassDefinition(fd,nd,scopeName);
-            if (tcd==0 && stripAnonymousNamespaceScope(cd->name())==scopeName)
+            if (tcd==0 && cd && stripAnonymousNamespaceScope(cd->name())==scopeName)
             {
               // don't be fooled by anonymous scopes
               tcd=cd;
@@ -6150,8 +6153,8 @@ static void findMember(EntryNav *rootNav,
               bool substDone=FALSE;
               ArgumentList *argList=0;
 
-              /* substitute the occurrences of class template names in the 
-               * argument list before matching 
+              /* substitute the occurrences of class template names in the
+               * argument list before matching
                */
               ArgumentList *mdAl = md->argumentList();
               if (declTemplArgs.count()>0 && defTemplArgs &&
@@ -6183,9 +6186,9 @@ static void findMember(EntryNav *rootNav,
 
               bool matching=
                 md->isVariable() || md->isTypedef() || // needed for function pointers
-                (mdAl==0 && root->argList->count()==0) || 
+                (mdAl==0 && root->argList->count()==0) ||
                 matchArguments2(
-                    md->getClassDef(),md->getFileDef(),argList, 
+                    md->getClassDef(),md->getFileDef(),argList,
                     cd,fd,root->argList,
                     TRUE);
 
@@ -6201,6 +6204,8 @@ static void findMember(EntryNav *rootNav,
                 memType.stripPrefix("static "); // see bug700696
                 funcType=substitute(stripTemplateSpecifiersFromScope(funcType,TRUE),
                                     className+"::",""); // see bug700693 & bug732594
+                memType=substitute(stripTemplateSpecifiersFromScope(memType,TRUE),
+                                    className+"::",""); // see bug758900
                 Debug::print(Debug::FindMembers,0,
                    "5b. Comparing return types '%s'<->'%s' #args %d<->%d\n",
                     qPrint(md->typeString()),qPrint(funcType),
@@ -6241,15 +6246,15 @@ static void findMember(EntryNav *rootNav,
                   md->setDefinitionTemplateParameterLists(root->tArgLists);
                   md->setArgumentList(argList); // new owner of the list => no delete
                 }
-                else // no match 
+                else // no match
                 {
-                  if (!funcTempList.isEmpty() && 
+                  if (!funcTempList.isEmpty() &&
                       isSpecialization(declTemplArgs,*defTemplArgs))
                   {
                     // check if we are dealing with a partial template
                     // specialization. In this case we add it to the class
                     // even though the member arguments do not match.
-                    
+
                     // TODO: copy other aspects?
                     root->protection=md->protection(); // copy protection level
                     addMethodToClass(rootNav,cd,md->name(),isFriend);
@@ -6258,20 +6263,20 @@ static void findMember(EntryNav *rootNav,
                   delete argList;
                 }
               }
-              if (matching) 
+              if (matching)
               {
                 addMemberDocs(rootNav,md,funcDecl,0,overloaded,0/* TODO */);
                 count++;
                 memFound=TRUE;
               }
-            } 
+            }
             else if (cd && cd!=tcd) // we did find a class with the same name as cd
                                     // but in a different namespace
             {
               noMatchCount++;
             }
-          } 
-          if (count==0 && rootNav->parent() && 
+          }
+          if (count==0 && rootNav->parent() &&
               rootNav->parent()->section()==Entry::OBJCIMPL_SEC)
           {
             goto localObjCMethod;
@@ -6289,12 +6294,12 @@ static void findMember(EntryNav *rootNav,
                 ClassDef *ccd=md->getClassDef();
                 MemberDef *cmd=md;
                 //printf("ccd->name()==%s className=%s\n",ccd->name().data(),className.data());
-                if (ccd!=0 && rightScopeMatch(ccd->name(),className)) 
+                if (ccd!=0 && rightScopeMatch(ccd->name(),className))
                 {
                   ArgumentList *templAl = md->templateArguments();
                   if (root->tArgLists && templAl!=0 &&
                       root->tArgLists->getLast()->count()<=templAl->count())
-                  { 
+                  {
                     addMethodToClass(rootNav,ccd,md->name(),isFriend);
                     return;
                   }
@@ -6324,13 +6329,13 @@ static void findMember(EntryNav *rootNav,
               if (candidates==1 && ucd && umd)
               {
                 // we didn't find an actual match on argument lists, but there is only 1 member with this
-                // name in the same scope, so that has to be the one. 
+                // name in the same scope, so that has to be the one.
                 addMemberDocs(rootNav,umd,funcDecl,0,overloaded,0);
                 return;
               }
               else if (candidates>1 && ecd && emd)
               {
-                // we didn't find a unique match using type resolution, 
+                // we didn't find a unique match using type resolution,
                 // but one of the matches has the exact same signature so
                 // we take that one.
                 addMemberDocs(rootNav,emd,funcDecl,0,overloaded,0);
@@ -6376,17 +6381,17 @@ static void findMember(EntryNav *rootNav,
                     warnMsg+='\n';
                   }
                   warnMsg+="  ";
-                  if (md->typeString()) 
+                  if (md->typeString())
                   {
                     warnMsg+=md->typeString();
                     warnMsg+=' ';
                   }
                   QCString qScope = cd->qualifiedNameWithTemplateParameters();
-                  if (!qScope.isEmpty()) 
+                  if (!qScope.isEmpty())
                     warnMsg+=qScope+"::"+md->name();
-                  if (md->argsString()) 
+                  if (md->argsString())
                     warnMsg+=md->argsString();
-                  if (noMatchCount>1) 
+                  if (noMatchCount>1)
                   {
                     warnMsg+="' at line "+QCString().setNum(md->getDefLine()) +
                              " of file "+md->getDefFileName();
@@ -6406,7 +6411,7 @@ static void findMember(EntryNav *rootNav,
           MemberDef *md=0;
           for (mni.toFirst();(md=mni.current());++mni)
           {
-            if (md->getClassDef()==cd) 
+            if (md->getClassDef()==cd)
             {
               // TODO: we should probably also check for matching arguments
               declMd = md;
@@ -6454,10 +6459,10 @@ static void findMember(EntryNav *rootNav,
           //        scopeName.data(),funcName.data(),funcArgs.data());
         }
       }
-      else if (overloaded) // check if the function belongs to only one class 
+      else if (overloaded) // check if the function belongs to only one class
       {
         // for unique overloaded member we allow the class to be
-        // omitted, this is to be Qt compatible. Using this should 
+        // omitted, this is to be Qt compatible. Using this should
         // however be avoided, because it is error prone
         MemberNameIterator mni(*mn);
         MemberDef *md=mni.toFirst();
@@ -6470,8 +6475,8 @@ static void findMember(EntryNav *rootNav,
         for (;(md=mni.current());++mni)
         {
           ClassDef *cd=md->getClassDef();
-          if (className!=cd->name()) unique=FALSE; 
-        } 
+          if (className!=cd->name()) unique=FALSE;
+        }
         if (unique)
         {
           MemberType mtype;
@@ -6479,9 +6484,9 @@ static void findMember(EntryNav *rootNav,
           else if (root->mtype==Slot)    mtype=MemberType_Slot;
           else if (root->mtype==DCOP)    mtype=MemberType_DCOP;
           else                           mtype=MemberType_Function;
-          
+
           // new overloaded member function
-          ArgumentList *tArgList = 
+          ArgumentList *tArgList =
             getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
           //printf("new related member %s args=`%s'\n",md->name().data(),funcArgs.data());
           MemberDef *md=new MemberDef(
@@ -6526,7 +6531,7 @@ static void findMember(EntryNav *rootNav,
           warn(root->fileName,root->startLine,
                "Cannot determine class for function\n%s",
                fullFuncDecl.data()
-              );   
+              );
         }
       }
     }
@@ -6540,7 +6545,7 @@ static void findMember(EntryNav *rootNav,
       if ((cd=getClass(scopeName)))
       {
         bool newMember=TRUE; // assume we have a new member
-        bool newMemberName=FALSE; 
+        bool newMemberName=FALSE;
         MemberDef *mdDefine=0;
         bool isDefine=FALSE;
         {
@@ -6592,9 +6597,9 @@ static void findMember(EntryNav *rootNav,
           MemberType mtype;
           if (isDefine)
             mtype=MemberType_Define;
-          else if (root->mtype==Signal)  
+          else if (root->mtype==Signal)
             mtype=MemberType_Signal;
-          else if (root->mtype==Slot) 
+          else if (root->mtype==Slot)
             mtype=MemberType_Slot;
           else if (root->mtype==DCOP)
             mtype=MemberType_DCOP;
@@ -6607,7 +6612,7 @@ static void findMember(EntryNav *rootNav,
             funcType="#define";
             funcArgs=mdDefine->argsString();
             funcDecl=funcType + " " + funcName;
-          } 
+          }
 
           //printf("New related name `%s' `%d'\n",funcName.data(),
           //    root->argList ? (int)root->argList->count() : -1);
@@ -6633,7 +6638,7 @@ static void findMember(EntryNav *rootNav,
             md->setInitializer(mdDefine->initializer());
           }
 
-          // 
+          //
           // we still have the problem that
           // MemberDef::writeDocumentation() in memberdef.cpp
           // writes the template argument list for the class,
@@ -6654,7 +6659,7 @@ static void findMember(EntryNav *rootNav,
           //       funcName.data(),funcDecl.data(),root->bodyLine);
 
           // try to find the matching line number of the body from the
-          // global function list 
+          // global function list
           bool found=FALSE;
           if (root->bodyLine==-1)
           {
@@ -6692,7 +6697,7 @@ static void findMember(EntryNav *rootNav,
             md->setBodyDef(fd);
           }
 
-          //if (root->mGrpId!=-1) 
+          //if (root->mGrpId!=-1)
           //{
           //  md->setMemberGroup(memberGroupDict[root->mGrpId]);
           //}
@@ -6737,7 +6742,7 @@ static void findMember(EntryNav *rootNav,
             warn(root->fileName,root->startLine,
                "Cannot determine file/namespace for relatedalso function\n%s",
                fullFuncDecl.data()
-              );   
+              );
           }
         }
       }
@@ -6745,7 +6750,7 @@ static void findMember(EntryNav *rootNav,
       {
         warn_undoc(root->fileName,root->startLine,
                    "class `%s' for related function `%s' is not "
-                   "documented.", 
+                   "documented.",
                    className.data(),funcName.data()
                   );
       }
@@ -6791,7 +6796,7 @@ localObjCMethod:
         {
           mn->append(md);
         }
-        else 
+        else
         {
           mn = new MemberName(root->name);
           mn->append(md);
@@ -6811,7 +6816,7 @@ localObjCMethod:
         warn(root->fileName,root->startLine,
              "class for member `%s' cannot "
              "be found.", funcName.data()
-            ); 
+            );
       }
       else if (!className.isEmpty() && !globMem)
       {
@@ -6828,7 +6833,7 @@ localObjCMethod:
          "member with no name found.");
   }
   return;
-} 
+}
 
 //----------------------------------------------------------------------
 // find the members corresponding to the different documentation blocks
@@ -6854,7 +6859,7 @@ static void filterMemberDocumentation(EntryNav *rootNav)
   }
 
   if ( // detect func variable/typedef to func ptr
-      (i=findFunctionPtr(root->type,root->lang,&l))!=-1 
+      (i=findFunctionPtr(root->type,root->lang,&l))!=-1
      )
   {
     //printf("Fixing function pointer!\n");
@@ -6864,7 +6869,7 @@ static void filterMemberDocumentation(EntryNav *rootNav)
     //printf("Results type=%s,name=%s,args=%s\n",root->type.data(),root->name.data(),root->args.data());
     isFunc=FALSE;
   }
-  else if ((root->type.left(8)=="typedef " && root->args.find('(')!=-1)) 
+  else if ((root->type.left(8)=="typedef " && root->args.find('(')!=-1))
     // detect function types marked as functions
   {
     isFunc=FALSE;
@@ -6885,27 +6890,27 @@ static void filterMemberDocumentation(EntryNav *rootNav)
       findMember(rootNav,root->type+" "+root->name+root->args+root->exception,FALSE,isFunc);
     }
   }
-  else if (root->section==Entry::OVERLOADDOC_SEC) 
+  else if (root->section==Entry::OVERLOADDOC_SEC)
   {
     //printf("Overloaded member %s found\n",root->name.data());
     findMember(rootNav,root->name,TRUE,isFunc);
   }
-  else if 
+  else if
     ((root->section==Entry::FUNCTION_SEC      // function
-      ||   
+      ||
       (root->section==Entry::VARIABLE_SEC &&  // variable
        !root->type.isEmpty() &&                // with a type
-       g_compoundKeywordDict.find(root->type)==0 // that is not a keyword 
+       g_compoundKeywordDict.find(root->type)==0 // that is not a keyword
        // (to skip forward declaration of class etc.)
       )
-     ) 
+     )
     )
     {
       //printf("Documentation for member `%s' found args=`%s' excp=`%s'\n",
       //    root->name.data(),root->args.data(),root->exception.data());
       //if (root->relates.length()) printf("  Relates %s\n",root->relates.data());
       //printf("Inside=%s\n Relates=%s\n",root->inside.data(),root->relates.data());
-      if (root->type=="friend class" || root->type=="friend struct" || 
+      if (root->type=="friend class" || root->type=="friend struct" ||
           root->type=="friend union")
       {
         findMember(rootNav,
@@ -6951,7 +6956,7 @@ static void filterMemberDocumentation(EntryNav *rootNav)
   }
   else
   {
-    // skip section 
+    // skip section
     //printf("skip section\n");
   }
 }
@@ -7061,13 +7066,13 @@ static void findEnums(EntryNav *rootNav)
       name=root->name;
     }
 
-    if (!root->relates.isEmpty()) 
+    if (!root->relates.isEmpty())
     {   // related member, prefix user specified scope
       isRelated=TRUE;
       isMemberOf=(root->relatesType == MemberOf);
       if (getClass(root->relates)==0 && !scope.isEmpty())
         scope=mergeScopes(scope,root->relates);
-      else 
+      else
         scope=root->relates.copy();
       if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
     }
@@ -7130,11 +7135,11 @@ static void findEnums(EntryNav *rootNav)
       {
         if (isRelated || Config_getBool("HIDE_SCOPE_NAMES"))
         {
-          md->setDefinition(name+baseType);  
+          md->setDefinition(name+baseType);
         }
         else
         {
-          md->setDefinition(nd->name()+"::"+name+baseType);  
+          md->setDefinition(nd->name()+"::"+name+baseType);
         }
         //printf("definition=%s\n",md->definition());
         defSet=TRUE;
@@ -7152,7 +7157,7 @@ static void findEnums(EntryNav *rootNav)
         {
           fd=rootNav->parent()->fileDef();
         }
-        if (fd) 
+        if (fd)
         {
           md->setFileDef(fd);
           fd->insertMember(md);
@@ -7162,11 +7167,11 @@ static void findEnums(EntryNav *rootNav)
       {
         if (isRelated || Config_getBool("HIDE_SCOPE_NAMES"))
         {
-          md->setDefinition(name+baseType);  
+          md->setDefinition(name+baseType);
         }
         else
         {
-          md->setDefinition(cd->name()+"::"+name+baseType);  
+          md->setDefinition(cd->name()+"::"+name+baseType);
         }
         cd->insertMember(md);
         cd->insertUsedFile(fd);
@@ -7241,12 +7246,12 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
       name=root->name;
     }
 
-    if (!root->relates.isEmpty()) 
+    if (!root->relates.isEmpty())
     {   // related member, prefix user specified scope
       isRelated=TRUE;
       if (getClass(root->relates)==0 && !scope.isEmpty())
         scope=mergeScopes(scope,root->relates);
-      else 
+      else
         scope=root->relates.copy();
       if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
     }
@@ -7321,7 +7326,7 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
                   MemberDef *fmd=new MemberDef(
                       fileName,root->startLine,root->startColumn,
                       root->type,root->name,root->args,0,
-                      Public, Normal,root->stat,Member,
+                      root->protection, Normal,root->stat,Member,
                       MemberType_EnumValue,0,0);
                   if      (md->getClassDef())     fmd->setMemberClass(md->getClassDef());
                   else if (md->getNamespaceDef()) fmd->setNamespace(md->getNamespaceDef());
@@ -7346,7 +7351,7 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
                   {
                     mn->append(fmd);
                   }
-                  else 
+                  else
                   {
                     mn = new MemberName(root->name);
                     mn->append(fmd);
@@ -7360,12 +7365,12 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
                 //printf("e->name=%s isRelated=%d\n",e->name().data(),isRelated);
                 MemberName *fmn=0;
                 MemberNameSDict *emnsd = isRelated ? Doxygen::functionNameSDict : mnsd;
-                if (!e->name().isEmpty() && (fmn=(*emnsd)[e->name()])) 
+                if (!e->name().isEmpty() && (fmn=(*emnsd)[e->name()]))
                   // get list of members with the same name as the field
                 {
                   MemberNameIterator fmni(*fmn);
                   MemberDef *fmd;
-                  for (fmni.toFirst(); (fmd=fmni.current()) ; ++fmni) 
+                  for (fmni.toFirst(); (fmd=fmni.current()) ; ++fmni)
                   {
                     if (fmd->isEnumValue() && fmd->getOuterScope()==md->getOuterScope()) // in same scope
                     {
@@ -7410,7 +7415,7 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
                           fmd->setEnumScope(md);    // cross ref with enum name
                         }
                       }
-                    } 
+                    }
                   }
                 }
               }
@@ -7485,14 +7490,14 @@ static void findEnumDocumentation(EntryNav *rootNav)
             {
               // documentation outside a compound overrides the documentation inside it
 #if 0
-              if (!md->documentation() || rootNav->parent()->name().isEmpty()) 
+              if (!md->documentation() || rootNav->parent()->name().isEmpty())
 #endif
               {
                 md->setDocumentation(root->doc,root->docFile,root->docLine);
                 md->setDocsForDefinition(!root->proto);
               }
 
-              // brief descriptions inside a compound override the documentation 
+              // brief descriptions inside a compound override the documentation
               // outside it
 #if 0
               if (!md->briefDescription() || !rootNav->parent()->name().isEmpty())
@@ -7529,7 +7534,7 @@ static void findEnumDocumentation(EntryNav *rootNav)
           //printf("MemberName %s not found!\n",name.data());
         }
       }
-      else // enum outside class 
+      else // enum outside class
       {
         //printf("Enum outside class: %s grpId=%d\n",name.data(),root->mGrpId);
         MemberName *mn=Doxygen::functionNameSDict->find(name);
@@ -7558,7 +7563,7 @@ static void findEnumDocumentation(EntryNav *rootNav)
             }
           }
         }
-      } 
+      }
       if (!found)
       {
         warn(root->fileName,root->startLine,
@@ -7573,7 +7578,7 @@ static void findEnumDocumentation(EntryNav *rootNav)
   RECURSE_ENTRYTREE(findEnumDocumentation,rootNav);
 }
 
-// search for each enum (member or function) in mnl if it has documented 
+// search for each enum (member or function) in mnl if it has documented
 // enum values.
 static void findDEV(const MemberNameSDict &mnsd)
 {
@@ -7608,12 +7613,12 @@ static void findDEV(const MemberNameSDict &mnsd)
   }
 }
 
-// search for each enum (member or function) if it has documented enum 
+// search for each enum (member or function) if it has documented enum
 // values.
 static void findDocumentedEnumValues()
 {
   findDEV(*Doxygen::memberNameSDict);
-  findDEV(*Doxygen::functionNameSDict); 
+  findDEV(*Doxygen::functionNameSDict);
 }
 
 //----------------------------------------------------------------------
@@ -7682,12 +7687,12 @@ static void computeMemberRelations()
           //       bmcd->name().data(),bmd->name().data(),bmd
           //      );
           if (md!=bmd && bmcd && mcd && bmcd!=mcd &&
-              (bmd->virtualness()!=Normal || 
-               bmcd->compoundType()==ClassDef::Interface || 
+              (bmd->virtualness()!=Normal ||
+               bmcd->compoundType()==ClassDef::Interface ||
                bmcd->compoundType()==ClassDef::Protocol
               ) &&
-              md->isFunction() && 
-              mcd->isLinkable() && 
+              md->isFunction() &&
+              mcd->isLinkable() &&
               bmcd->isLinkable() &&
               mcd->isBaseClass(bmcd,TRUE))
           {
@@ -7698,11 +7703,11 @@ static void computeMemberRelations()
             //        argListToString(bmdAl.pointer()).data(),
             //        argListToString(mdAl.pointer()).data()
             //      );
-            if ( 
+            if (
                 matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),bmdAl,
                   md->getOuterScope(), md->getFileDef(), mdAl,
                   TRUE
-                  ) 
+                  )
                )
             {
               MemberDef *rmd;
@@ -7821,7 +7826,7 @@ static void generateFileSources()
 
       // create a dictionary with files to process
       QDict<void> g_filesToProcess(10007);
-      FileNameListIterator fnli(*Doxygen::inputNameList); 
+      FileNameListIterator fnli(*Doxygen::inputNameList);
       FileName *fn;
       for (fnli.toFirst();(fn=fnli.current());++fnli)
       {
@@ -7844,7 +7849,7 @@ static void generateFileSources()
             QStrList filesInSameTu;
             fd->getAllIncludeFilesRecursively(filesInSameTu);
             fd->startParsing();
-            if (fd->generateSourceFile()) // sources need to be shown in the output
+            if (fd->generateSourceFile() && !g_useOutputTemplate) // sources need to be shown in the output
             {
               msg("Generating code for file %s...\n",fd->docName().data());
               fd->writeSource(*g_outputList,FALSE,filesInSameTu);
@@ -7867,7 +7872,7 @@ static void generateFileSources()
                 FileDef *ifd=findFileDef(Doxygen::inputNameDict,incFile,ambig);
                 if (ifd && !ifd->isReference())
                 {
-                  if (ifd->generateSourceFile()) // sources need to be shown in the output
+                  if (ifd->generateSourceFile() && !g_useOutputTemplate) // sources need to be shown in the output
                   {
                     msg(" Generating code for file %s...\n",ifd->docName().data());
                     ifd->writeSource(*g_outputList,TRUE,moreFiles);
@@ -7900,7 +7905,7 @@ static void generateFileSources()
           {
             QStrList filesInSameTu;
             fd->startParsing();
-            if (fd->generateSourceFile()) // sources need to be shown in the output
+            if (fd->generateSourceFile() && !g_useOutputTemplate) // sources need to be shown in the output
             {
               msg("Generating code for file %s...\n",fd->docName().data());
               fd->writeSource(*g_outputList,FALSE,filesInSameTu);
@@ -7920,7 +7925,7 @@ static void generateFileSources()
     else
 #endif
     {
-      FileNameListIterator fnli(*Doxygen::inputNameList); 
+      FileNameListIterator fnli(*Doxygen::inputNameList);
       FileName *fn;
       for (;(fn=fnli.current());++fnli)
       {
@@ -7930,7 +7935,7 @@ static void generateFileSources()
         {
           QStrList filesInSameTu;
           fd->startParsing();
-          if (fd->generateSourceFile()) // sources need to be shown in the output
+          if (fd->generateSourceFile() && !g_useOutputTemplate) // sources need to be shown in the output
           {
             msg("Generating code for file %s...\n",fd->docName().data());
             fd->writeSource(*g_outputList,FALSE,filesInSameTu);
@@ -7954,7 +7959,7 @@ static void generateFileSources()
 static void generateFileDocs()
 {
   if (documentedHtmlFiles==0) return;
-  
+
   if (Doxygen::inputNameList->count()>0)
   {
     FileNameListIterator fnli(*Doxygen::inputNameList);
@@ -8002,7 +8007,7 @@ static void addSourceReferences()
       fd->addSourceRef(nd->getStartBodyLine(),nd,0);
     }
   }
-  
+
   // add source references for member names
   MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
   MemberName *mn=0;
@@ -8017,14 +8022,14 @@ static void addSourceReferences()
       //    md->getBodyDef()?md->getBodyDef()->name().data():"<none>",
       //    md->getStartBodyLine(),md->isLinkableInProject());
       FileDef *fd=md->getBodyDef();
-      if (fd && 
+      if (fd &&
           md->getStartBodyLine()!=-1 &&
           md->isLinkableInProject() &&
           (fd->generateSourceFile() || Doxygen::parseSourcesNeeded)
          )
       {
         //printf("Found member `%s' in file `%s' at line `%d' def=%s\n",
-        //    md->name().data(),fd->name().data(),md->getStartBodyLine(),md->getOuterScope()->name().data()); 
+        //    md->name().data(),fd->name().data(),md->getStartBodyLine(),md->getOuterScope()->name().data());
         fd->addSourceRef(md->getStartBodyLine(),md->getOuterScope(),md);
       }
     }
@@ -8042,16 +8047,16 @@ static void addSourceReferences()
       //    md->getStartBodyLine(),md->getEndBodyLine(),fd,
       //    md->isLinkableInProject(),
       //    Doxygen::parseSourcesNeeded);
-      if (fd && 
-          md->getStartBodyLine()!=-1 && 
-          md->isLinkableInProject() && 
+      if (fd &&
+          md->getStartBodyLine()!=-1 &&
+          md->isLinkableInProject() &&
           (fd->generateSourceFile() || Doxygen::parseSourcesNeeded)
          )
       {
         //printf("Found member `%s' in file `%s' at line `%d' def=%s\n",
-        //    md->name().data(),fd->name().data(),md->getStartBodyLine(),md->getOuterScope()->name().data()); 
+        //    md->name().data(),fd->name().data(),md->getStartBodyLine(),md->getOuterScope()->name().data());
         fd->addSourceRef(md->getStartBodyLine(),md->getOuterScope(),md);
-      }  
+      }
     }
   }
 }
@@ -8077,7 +8082,7 @@ static void sortMemberLists()
   }
 
   // sort file member lists
-  FileNameListIterator fnli(*Doxygen::inputNameList); 
+  FileNameListIterator fnli(*Doxygen::inputNameList);
   FileName *fn;
   for (;(fn=fnli.current());++fnli)
   {
@@ -8100,14 +8105,14 @@ static void sortMemberLists()
 
 //----------------------------------------------------------------------------
 // generate the documentation of all classes
-  
+
 static void generateClassList(ClassSDict &classSDict)
 {
   ClassSDict::Iterator cli(classSDict);
   for ( ; cli.current() ; ++cli )
   {
     ClassDef *cd=cli.current();
-   
+
     //printf("cd=%s getOuterScope=%p global=%p\n",cd->name().data(),cd->getOuterScope(),Doxygen::globalScope);
     if (cd &&
         (cd->getOuterScope()==0 || // <-- should not happen, but can if we read an old tag file
@@ -8153,7 +8158,7 @@ static void inheritDocumentation()
       if (md->documentation().isEmpty() && md->briefDescription().isEmpty())
       { // no documentation yet
         MemberDef *bmd = md->reimplements();
-        while (bmd && bmd->documentation().isEmpty() && 
+        while (bmd && bmd->documentation().isEmpty() &&
                       bmd->briefDescription().isEmpty()
               )
         { // search up the inheritance tree for a documentation member
@@ -8214,7 +8219,7 @@ static void combineUsingRelations()
 }
 
 //----------------------------------------------------------------------------
-  
+
 static void addMembersToMemberGroup()
 {
   // for each class
@@ -8393,9 +8398,9 @@ static void flushUnresolvedRelations()
   // Remove all unresolved references to classes from the cache.
   // This is needed before resolving the inheritance relations, since
   // it would otherwise not find the inheritance relation
-  // for C in the example below, as B::I was already found to be unresolvable 
+  // for C in the example below, as B::I was already found to be unresolvable
   // (which is correct if you igore the inheritance relation between A and B).
-  // 
+  //
   // class A { class I {} };
   // class B : public A {};
   // class C : public B::I {};
@@ -8444,7 +8449,7 @@ static void findDefineDocumentation(EntryNav *rootNav)
   {
     rootNav->loadEntry(g_storage);
     Entry *root = rootNav->entry();
-    
+
     //printf("found define `%s' `%s' brief=`%s' doc=`%s'\n",
     //       root->name.data(),root->args.data(),root->brief.data(),root->doc.data());
 
@@ -8463,7 +8468,7 @@ static void findDefineDocumentation(EntryNav *rootNav)
       {
         mn->append(md);
       }
-      else 
+      else
       {
         mn = new MemberName(root->name);
         mn->append(md);
@@ -8517,7 +8522,7 @@ static void findDefineDocumentation(EntryNav *rootNav)
           if (md->memberType()==MemberType_Define)
           {
             FileDef *fd=md->getFileDef();
-            if (fd && fd->absFilePath()==root->fileName) 
+            if (fd && fd->absFilePath()==root->fileName)
               // doc and define in the same file assume they belong together.
             {
 #if 0
@@ -8593,7 +8598,7 @@ static void findDirDocumentation(EntryNav *rootNav)
     //    root->docFile.data(),normalizedName.data());
     if (root->docFile==normalizedName) // current dir?
     {
-      int lastSlashPos=normalizedName.findRev('/'); 
+      int lastSlashPos=normalizedName.findRev('/');
       if (lastSlashPos!=-1) // strip file name
       {
         normalizedName=normalizedName.left(lastSlashPos);
@@ -8701,7 +8706,7 @@ static void findMainPage(EntryNav *rootNav)
                               indexName, root->brief+root->doc+root->inbodyDocs,title);
       //setFileNameForSections(root->anchors,"index",Doxygen::mainPage);
       Doxygen::mainPage->setBriefDescription(root->brief,root->briefFile,root->briefLine);
-      Doxygen::mainPage->setFileName(indexName,TRUE);
+      Doxygen::mainPage->setFileName(indexName);
       Doxygen::mainPage->setShowToc(root->stat);
       addPageToContext(Doxygen::mainPage,rootNav);
 
@@ -8761,7 +8766,7 @@ static void findMainPageTagFiles(EntryNav *rootNav)
 
 static void computePageRelations(EntryNav *rootNav)
 {
-  if ((rootNav->section()==Entry::PAGEDOC_SEC || 
+  if ((rootNav->section()==Entry::PAGEDOC_SEC ||
        rootNav->section()==Entry::MAINPAGEDOC_SEC
       )
       && !rootNav->name().isEmpty()
@@ -8771,8 +8776,8 @@ static void computePageRelations(EntryNav *rootNav)
     Entry *root = rootNav->entry();
 
     PageDef *pd = root->section==Entry::PAGEDOC_SEC ?
-                    Doxygen::pageSDict->find(root->name) : 
-                    Doxygen::mainPage; 
+                    Doxygen::pageSDict->find(root->name) :
+                    Doxygen::mainPage;
     if (pd)
     {
       QListIterator<BaseInfo> bii(*root->extends);
@@ -8828,10 +8833,10 @@ static void resolveUserReferences()
     //        si->fileName.data());
     PageDef *pd=0;
 
-    // hack: the items of a todo/test/bug/deprecated list are all fragments from 
-    // different files, so the resulting section's all have the wrong file 
-    // name (not from the todo/test/bug/deprecated list, but from the file in 
-    // which they are defined). We correct this here by looking at the 
+    // hack: the items of a todo/test/bug/deprecated list are all fragments from
+    // different files, so the resulting section's all have the wrong file
+    // name (not from the todo/test/bug/deprecated list, but from the file in
+    // which they are defined). We correct this here by looking at the
     // generated section labels!
     QDictIterator<RefList> rli(*Doxygen::xrefLists);
     RefList *rl;
@@ -8851,7 +8856,7 @@ static void resolveUserReferences()
     {
       // if this section is in a page and the page is in a group, then we
       // have to adjust the link file name to point to the group.
-      if (!si->fileName.isEmpty() && 
+      if (!si->fileName.isEmpty() &&
           (pd=Doxygen::pageSDict->find(si->fileName)) &&
           pd->getGroupDef())
       {
@@ -8912,7 +8917,7 @@ static void generatePageDocs()
 
 static void buildExampleList(EntryNav *rootNav)
 {
-  if (rootNav->section()==Entry::EXAMPLE_SEC && !rootNav->name().isEmpty()) 
+  if (rootNav->section()==Entry::EXAMPLE_SEC && !rootNav->name().isEmpty())
   {
     rootNav->loadEntry(g_storage);
     Entry *root = rootNav->entry();
@@ -8930,13 +8935,13 @@ static void buildExampleList(EntryNav *rootNav)
       PageDef *pd=new PageDef(root->fileName,root->startLine,
           root->name,root->brief+root->doc+root->inbodyDocs,root->args);
       pd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
-      pd->setFileName(convertNameToFile(pd->name()+"-example",FALSE,TRUE),FALSE);
+      pd->setFileName(convertNameToFile(pd->name()+"-example",FALSE,TRUE));
       pd->addSectionsToDefinition(root->anchors);
       pd->setLanguage(root->lang);
       //pi->addSections(root->anchors);
 
       Doxygen::exampleSDict->inSort(root->name,pd);
-      //we don't add example to groups 
+      //we don't add example to groups
       //addExampleToGroups(root,pd);
     }
 
@@ -8956,7 +8961,7 @@ void printNavTree(EntryNav *rootNav,int indent)
       indentStr.isEmpty()?"":indentStr.data(),
       rootNav->name().isEmpty()?"<empty>":rootNav->name().data(),
       rootNav->section());
-  if (rootNav->children()) 
+  if (rootNav->children())
   {
     EntryNavListIterator eli(*rootNav->children());
     for (;eli.current();++eli) printNavTree(eli.current(),indent+2);
@@ -8965,7 +8970,7 @@ void printNavTree(EntryNav *rootNav,int indent)
 
 
 //----------------------------------------------------------------------------
-// generate the example documentation 
+// generate the example documentation
 
 static void generateExampleDocs()
 {
@@ -9017,7 +9022,7 @@ static void generateGroupDocs()
 //static void generatePackageDocs()
 //{
 //  writePackageIndex(*g_outputList);
-//  
+//
 //  if (Doxygen::packageDict.count()>0)
 //  {
 //    PackageSDict::Iterator pdi(Doxygen::packageDict);
@@ -9035,7 +9040,7 @@ static void generateGroupDocs()
 static void generateNamespaceDocs()
 {
   //writeNamespaceIndex(*g_outputList);
-  
+
   NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
   NamespaceDef *nd;
   // for each namespace...
@@ -9053,9 +9058,9 @@ static void generateNamespaceDocs()
     ClassDef *cd;
     for ( ; (cd=cli.current()) ; ++cli )
     {
-      if ( ( cd->isLinkableInProject() && 
+      if ( ( cd->isLinkableInProject() &&
              cd->templateMaster()==0
-           ) // skip external references, anonymous compounds and 
+           ) // skip external references, anonymous compounds and
              // template instances and nested classes
            && !cd->isHidden() && !cd->isEmbeddedInOuterScope()
          )
@@ -9079,9 +9084,9 @@ static QCString fixSlashes(QCString &s)
   {
     switch(s.at(i))
     {
-      case '/': 
-      case '\\': 
-        result+="\\\\"; 
+      case '/':
+      case '\\':
+        result+="\\\\";
         break;
       default:
         result+=s.at(i);
@@ -9094,31 +9099,6 @@ static QCString fixSlashes(QCString &s)
 
 //----------------------------------------------------------------------------
 
-static bool openOutputFile(const char *outFile,QFile &f)
-{
-  bool fileOpened=FALSE;
-  bool writeToStdout=(outFile[0]=='-' && outFile[1]=='\0');
-  if (writeToStdout) // write to stdout
-  {
-    fileOpened = f.open(IO_WriteOnly,stdout);
-  }
-  else // write to file
-  {
-    QFileInfo fi(outFile);
-    if (fi.exists()) // create a backup
-    {
-      QDir dir=fi.dir();
-      QFileInfo backup(fi.fileName()+".bak");
-      if (backup.exists()) // remove existing backup
-        dir.remove(backup.fileName());
-      dir.rename(fi.fileName(),fi.fileName()+".bak");
-    } 
-    f.setName(outFile);
-    fileOpened = f.open(IO_WriteOnly|IO_Translate);
-  }
-  return fileOpened;
-}
-
 /*! Generate a template version of the configuration file.
  *  If the \a shortList parameter is TRUE a configuration file without
  *  comments will be generated.
@@ -9189,7 +9169,7 @@ static void readTagFile(Entry *root,const char *tl)
   {
     fileName = tagLine;
   }
-    
+
   QFileInfo fi(fileName);
   if (!fi.exists() || !fi.isFile())
   {
@@ -9302,11 +9282,11 @@ static void copyExtraFiles(const QCString& filesOption,const QCString &outputOpt
   for (i=0; i<files.count(); ++i)
   {
     QCString fileName(files.at(i));
-    
+
     if (!fileName.isEmpty())
     {
       QFileInfo fi(fileName);
-      if (!fi.exists()) 
+      if (!fi.exists())
       {
         err("Extra file '%s' specified in " + filesOption + " does not exist!\n", fileName.data());
       }
@@ -9364,7 +9344,7 @@ static void parseFile(ParserInterface *parser,
   QFileInfo fi(fileName);
   BufStr preBuf(fi.size()+4096);
 
-  if (Config_getBool("ENABLE_PREPROCESSING") && 
+  if (Config_getBool("ENABLE_PREPROCESSING") &&
       parser->needsPreprocessing(extension))
   {
     BufStr inBuf(fi.size()+4096);
@@ -9435,7 +9415,7 @@ static void parseFiles(Entry *root,EntryNav *rootNav)
         parseFile(parser,root,rootNav,fd,s->data(),FALSE,filesInSameTu);
         //printf("  got %d extra files in tu\n",filesInSameTu.count());
 
-        // Now process any include files in the same translation unit 
+        // Now process any include files in the same translation unit
         // first. When libclang is used this is much more efficient.
         char *incFile = filesInSameTu.first();
         while (incFile && g_filesToProcess.find(incFile))
@@ -9507,9 +9487,9 @@ static QCString resolveSymlink(QCString path)
   {
 #ifdef WIN32
     // UNC path, skip server and share name
-    if (sepPos==0 && (result.left(2)=="//" || result.left(2)=="\\\\")) 
+    if (sepPos==0 && (result.left(2)=="//" || result.left(2)=="\\\\"))
       sepPos = result.find('/',2);
-    if (sepPos!=-1) 
+    if (sepPos!=-1)
       sepPos = result.find('/',sepPos+1);
 #else
     sepPos = result.find('/',sepPos+1);
@@ -9563,7 +9543,7 @@ static QCString resolveSymlink(QCString path)
 static QDict<void> g_pathsVisited(1009);
 
 //----------------------------------------------------------------------------
-// Read all files matching at least one pattern in `patList' in the 
+// Read all files matching at least one pattern in `patList' in the
 // directory represented by `fi'.
 // The directory is read iff the recusiveFlag is set.
 // The contents of all files is append to the input string
@@ -9599,7 +9579,7 @@ int readDir(QFileInfo *fi,
   int totalSize=0;
   msg("Searching for files in directory %s\n", fi->absFilePath().data());
   //printf("killDict=%p count=%d\n",killDict,killDict->count());
-  
+
   const QFileInfoList *list = dir.entryInfoList();
   if (list)
   {
@@ -9608,7 +9588,7 @@ int readDir(QFileInfo *fi,
 
     while ((cfi=it.current()))
     {
-      if (exclDict==0 || exclDict->find(cfi->absFilePath().utf8())==0) 
+      if (exclDict==0 || exclDict->find(cfi->absFilePath().utf8())==0)
       { // file should not be excluded
         //printf("killDict->find(%s)\n",cfi->absFilePath().data());
         if (!cfi->exists() || !cfi->isReadable())
@@ -9618,9 +9598,9 @@ int readDir(QFileInfo *fi,
             warn_uncond("source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data());
           }
         }
-        else if (cfi->isFile() && 
+        else if (cfi->isFile() &&
             (!Config_getBool("EXCLUDE_SYMLINKS") || !cfi->isSymLink()) &&
-            (patList==0 || patternMatch(*cfi,patList)) && 
+            (patList==0 || patternMatch(*cfi,patList)) &&
             !patternMatch(*cfi,exclPatList) &&
             (killDict==0 || killDict->find(cfi->absFilePath().utf8())==0)
             )
@@ -9655,7 +9635,7 @@ int readDir(QFileInfo *fi,
         }
         else if (recursive &&
             (!Config_getBool("EXCLUDE_SYMLINKS") || !cfi->isSymLink()) &&
-            cfi->isDir() && 
+            cfi->isDir() &&
             !patternMatch(*cfi,exclPatList) &&
             cfi->fileName().at(0)!='.') // skip "." ".." and ".dir"
         {
@@ -9723,7 +9703,7 @@ int readFileOrDirectory(const char *s,
           //printf("killDict->find(%s)\n",fi.absFilePath().data());
           if (killDict==0 || killDict->find(filePath)==0)
           {
-            totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input); 
+            totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input);
             //fiList->inSort(new FileInfo(fi));
             QCString name=fi.fileName().utf8();
             //printf("New file %s\n",name.data());
@@ -9788,7 +9768,7 @@ void readFormulaRepository()
       else
       {
         QCString formName = line.left(se);
-        QCString formText = line.right(line.length()-se-1); 
+        QCString formText = line.right(line.length()-se-1);
         Formula *f=new Formula(formText);
         Doxygen::formulaList->setAutoDelete(TRUE);
         Doxygen::formulaList->append(f);
@@ -9826,15 +9806,15 @@ static void escapeAliases()
     {
       newValue+=value.mid(p,in-p);
       // expand \n's except if \n is part of a built-in command.
-      if (value.mid(in,5)!="\\note" && 
-          value.mid(in,5)!="\\name" && 
-          value.mid(in,10)!="\\namespace" && 
+      if (value.mid(in,5)!="\\note" &&
+          value.mid(in,5)!="\\name" &&
+          value.mid(in,10)!="\\namespace" &&
           value.mid(in,14)!="\\nosubgrouping"
-         ) 
+         )
       {
         newValue+="\\_linebr ";
       }
-      else 
+      else
       {
         newValue+="\\n";
       }
@@ -9849,7 +9829,7 @@ static void escapeAliases()
 //----------------------------------------------------------------------------
 
 void readAliases()
-{ 
+{
   // add aliases to a dictionary
   Doxygen::aliasDict.setAutoDelete(TRUE);
   QStrList &aliasList = Config_getList("ALIASES");
@@ -9864,7 +9844,7 @@ void readAliases()
       {
         QCString name=alias.left(i).stripWhiteSpace();
         QCString value=alias.right(alias.length()-i-1);
-        //printf("Alias: found name=`%s' value=`%s'\n",name.data(),value.data()); 
+        //printf("Alias: found name=`%s' value=`%s'\n",name.data(),value.data());
         if (!name.isEmpty())
         {
           QCString *dn=Doxygen::aliasDict[name];
@@ -9896,7 +9876,7 @@ static void dumpSymbol(FTextStream &t,Definition *d)
     anchor=":"+md->anchor();
   }
   QCString scope;
-  if (d->getOuterScope() && d->getOuterScope()!=Doxygen::globalScope) 
+  if (d->getOuterScope() && d->getOuterScope()!=Doxygen::globalScope)
   {
     scope = d->getOuterScope()->getOutputFileBase()+Doxygen::htmlFileExtension;
   }
@@ -9910,7 +9890,7 @@ static void dumpSymbol(FTextStream &t,Definition *d)
 }
 
 static void dumpSymbolMap()
-{ 
+{
   QFile f("symbols.sql");
   if (f.open(IO_WriteOnly))
   {
@@ -10033,16 +10013,16 @@ void initDoxygen()
 #endif
   Doxygen::inputNameList = new FileNameList;
   Doxygen::inputNameList->setAutoDelete(TRUE);
-  Doxygen::memberNameSDict = new MemberNameSDict(10000);   
+  Doxygen::memberNameSDict = new MemberNameSDict(10000);
   Doxygen::memberNameSDict->setAutoDelete(TRUE);
-  Doxygen::functionNameSDict = new MemberNameSDict(10000);   
+  Doxygen::functionNameSDict = new MemberNameSDict(10000);
   Doxygen::functionNameSDict->setAutoDelete(TRUE);
-  Doxygen::groupSDict = new GroupSDict(17);          
+  Doxygen::groupSDict = new GroupSDict(17);
   Doxygen::groupSDict->setAutoDelete(TRUE);
   Doxygen::globalScope = new NamespaceDef("<globalScope>",1,1,"<globalScope>");
-  Doxygen::namespaceSDict = new NamespaceSDict(20);      
+  Doxygen::namespaceSDict = new NamespaceSDict(20);
   Doxygen::namespaceSDict->setAutoDelete(TRUE);
-  Doxygen::classSDict = new ClassSDict(1009);         
+  Doxygen::classSDict = new ClassSDict(1009);
   Doxygen::classSDict->setAutoDelete(TRUE);
   Doxygen::hiddenClasses = new ClassSDict(257);
   Doxygen::hiddenClasses->setAutoDelete(TRUE);
@@ -10076,7 +10056,7 @@ void initDoxygen()
   /**************************************************************************
    *            Initialize some global constants
    **************************************************************************/
-  
+
   g_compoundKeywordDict.insert("template class",(void *)8);
   g_compoundKeywordDict.insert("template struct",(void *)8);
   g_compoundKeywordDict.insert("class",(void *)8);
@@ -10103,7 +10083,7 @@ void cleanUpDoxygen()
   delete Doxygen::mscFileNameDict;
   delete Doxygen::diaFileNameDict;
   delete Doxygen::mainPage;
-  delete Doxygen::pageSDict;  
+  delete Doxygen::pageSDict;
   delete Doxygen::exampleSDict;
   delete Doxygen::globalScope;
   delete Doxygen::xrefLists;
@@ -10131,7 +10111,7 @@ void cleanUpDoxygen()
       {
         ++dli;
       }
-    } 
+    }
   }
 
   delete Doxygen::inputNameList;
@@ -10143,7 +10123,7 @@ void cleanUpDoxygen()
   delete Doxygen::namespaceSDict;
   delete Doxygen::directories;
 
-  //delete Doxygen::symbolMap; <- we cannot do this unless all static lists 
+  //delete Doxygen::symbolMap; <- we cannot do this unless all static lists
   //                              (such as Doxygen::namespaceSDict)
   //                              with objects based on Definition are made
   //                              dynamic first
@@ -10154,7 +10134,7 @@ static int computeIdealCacheParam(uint v)
   //printf("computeIdealCacheParam(v=%u)\n",v);
 
   int r=0;
-  while (v!=0) v>>=1,r++; 
+  while (v!=0) v>>=1,r++;
   // r = log2(v)
 
   // convert to a valid cache size value
@@ -10177,8 +10157,8 @@ void readConfiguration(int argc, char **argv)
   bool updateConfig=FALSE;
   bool genLayout=FALSE;
   int retVal;
-  while (optind<argc && argv[optind][0]=='-' && 
-               (isalpha(argv[optind][1]) || argv[optind][1]=='?' || 
+  while (optind<argc && argv[optind][0]=='-' &&
+               (isalpha(argv[optind][1]) || argv[optind][1]=='?' ||
                 argv[optind][1]=='-')
         )
   {
@@ -10189,7 +10169,7 @@ void readConfiguration(int argc, char **argv)
         configName=getArg(argc,argv,optind);
         if (optind+1<argc && qstrcmp(argv[optind+1],"-")==0)
         { configName="-"; optind++; }
-        if (!configName) 
+        if (!configName)
         { configName="Doxyfile"; }
         break;
       case 'l':
@@ -10248,7 +10228,7 @@ void readConfiguration(int argc, char **argv)
         err("option \"-e\" has invalid format specifier.\n");
         cleanUpDoxygen();
         exit(1);
-        break; 
+        break;
       case 'w':
         formatName=getArg(argc,argv,optind);
         if (!formatName)
@@ -10256,7 +10236,7 @@ void readConfiguration(int argc, char **argv)
           err("option \"-w\" is missing format specifier rtf, html or latex\n");
           cleanUpDoxygen();
           exit(1);
-        } 
+        }
         if (qstricmp(formatName,"rtf")==0)
         {
           if (optind+1>=argc)
@@ -10323,7 +10303,7 @@ void readConfiguration(int argc, char **argv)
           if (openOutputFile(argv[optind+3],f))
           {
             HtmlGenerator::writeStyleSheetFile(f);
-          } 
+          }
           cleanUpDoxygen();
           exit(0);
         }
@@ -10390,7 +10370,7 @@ void readConfiguration(int argc, char **argv)
         g_dumpSymbolMap = TRUE;
         break;
       case 'v':
-        msg("%s\n",versionString); 
+        msg("%s\n",versionString);
         cleanUpDoxygen();
         exit(0);
         break;
@@ -10402,7 +10382,7 @@ void readConfiguration(int argc, char **argv)
         }
         else if (qstrcmp(&argv[optind][2],"version")==0)
         {
-          msg("%s\n",versionString); 
+          msg("%s\n",versionString);
           cleanUpDoxygen();
           exit(0);
         }
@@ -10435,7 +10415,7 @@ void readConfiguration(int argc, char **argv)
     }
     optind++;
   }
-  
+
   /**************************************************************************
    *            Parse or generate the config file                           *
    **************************************************************************/
@@ -10457,8 +10437,8 @@ void readConfiguration(int argc, char **argv)
 
   QFileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
   if (optind>=argc)
-  { 
-    if (configFileInfo1.exists()) 
+  {
+    if (configFileInfo1.exists())
     {
       configName="Doxyfile";
     }
@@ -10512,11 +10492,11 @@ void readConfiguration(int argc, char **argv)
 /** check and resolve config options */
 void checkConfiguration()
 {
-  
+
   Config::instance()->substituteEnvironmentVars();
   Config::instance()->convertStrToVal();
   Config::instance()->check();
-  
+
   initWarningFormat();
 }
 
@@ -10538,19 +10518,19 @@ void adjustConfiguration()
     s=includePath.next();
   }
 
-  /* Set the global html file extension. */ 
+  /* Set the global html file extension. */
   Doxygen::htmlFileExtension = Config_getString("HTML_FILE_EXTENSION");
 
 
   Doxygen::xrefLists->setAutoDelete(TRUE);
 
-  Doxygen::parseSourcesNeeded = Config_getBool("CALL_GRAPH") || 
+  Doxygen::parseSourcesNeeded = Config_getBool("CALL_GRAPH") ||
                                 Config_getBool("CALLER_GRAPH") ||
                                 Config_getBool("REFERENCES_RELATION") ||
                                 Config_getBool("REFERENCED_BY_RELATION");
 
   Doxygen::markdownSupport = Config_getBool("MARKDOWN_SUPPORT");
-  
+
   /**************************************************************************
    *            Add custom extension mappings
    **************************************************************************/
@@ -10568,7 +10548,7 @@ void adjustConfiguration()
       if (!updateLanguageMapping(ext,language))
       {
         err("Failed to map file extension '%s' to unsupported language '%s'.\n"
-            "Check the EXTENSION_MAPPING setting in the config file.\n", 
+            "Check the EXTENSION_MAPPING setting in the config file.\n",
             ext.data(),language.data());
       }
       else
@@ -10774,14 +10754,14 @@ void searchInputFiles()
   while (s)
   {
     QStrList &pl = Config_getList("INCLUDE_FILE_PATTERNS");
-    if (pl.count()==0) 
+    if (pl.count()==0)
     {
       pl = Config_getList("FILE_PATTERNS");
     }
     readFileOrDirectory(s,0,Doxygen::includeNameDict,0,&pl,
                         &exclPatterns,0,0,
                         alwaysRecursive);
-    s=includePathList.next(); 
+    s=includePathList.next();
   }
   g_s.end();
 
@@ -10794,7 +10774,7 @@ void searchInputFiles()
                         &Config_getList("EXAMPLE_PATTERNS"),
                         0,0,0,
                         (alwaysRecursive || Config_getBool("EXAMPLE_RECURSIVE")));
-    s=examplePathList.next(); 
+    s=examplePathList.next();
   }
   g_s.end();
 
@@ -10806,7 +10786,7 @@ void searchInputFiles()
     readFileOrDirectory(s,0,Doxygen::imageNameDict,0,0,
                         0,0,0,
                         alwaysRecursive);
-    s=imagePathList.next(); 
+    s=imagePathList.next();
   }
   g_s.end();
 
@@ -10818,7 +10798,7 @@ void searchInputFiles()
     readFileOrDirectory(s,0,Doxygen::dotFileNameDict,0,0,
                         0,0,0,
                         alwaysRecursive);
-    s=dotFileList.next(); 
+    s=dotFileList.next();
   }
   g_s.end();
 
@@ -10830,7 +10810,7 @@ void searchInputFiles()
     readFileOrDirectory(s,0,Doxygen::mscFileNameDict,0,0,
                         0,0,0,
                         alwaysRecursive);
-    s=mscFileList.next(); 
+    s=mscFileList.next();
   }
   g_s.end();
 
@@ -10896,7 +10876,7 @@ void searchInputFiles()
   g_s.end();
 }
 
-  
+
 void parseInput()
 {
   atexit(exitDoxygen);
@@ -10906,7 +10886,7 @@ void parseInput()
    *            Make sure the output directory exists
    **************************************************************************/
   QCString &outputDirectory = Config_getString("OUTPUT_DIRECTORY");
-  if (outputDirectory.isEmpty()) 
+  if (outputDirectory.isEmpty())
   {
     outputDirectory=QDir::currentDirPath().utf8();
   }
@@ -10956,7 +10936,7 @@ void parseInput()
   Doxygen::objDBFileName.prepend(outputDirectory+"/");
   Doxygen::entryDBFileName.sprintf("doxygen_entrydb_%d.tmp",pid);
   Doxygen::entryDBFileName.prepend(outputDirectory+"/");
-  
+
   if (Doxygen::symbolStorage->open(Doxygen::objDBFileName)==-1)
   {
     err("Failed to open temporary file %s\n",Doxygen::objDBFileName.data());
@@ -10983,7 +10963,7 @@ void parseInput()
   bool &generateXml = Config_getBool("GENERATE_XML");
   if (generateXml)
     xmlOutput = createOutputDirectory(outputDirectory,"XML_OUTPUT","/xml");
-    
+
   QCString latexOutput;
   bool &generateLatex = Config_getBool("GENERATE_LATEX");
   if (generateLatex)
@@ -11043,7 +11023,7 @@ void parseInput()
   if (layoutFile.open(IO_ReadOnly))
   {
     msg("Parsing layout file %s...\n",layoutFileName.data());
-    QTextStream t(&layoutFile); 
+    QTextStream t(&layoutFile);
     t.setEncoding(QTextStream::Latin1);
     LayoutDocManager::instance().parse(t,layoutFileName);
   }
@@ -11055,7 +11035,7 @@ void parseInput()
   /**************************************************************************
    *             Read and preprocess input                                  *
    **************************************************************************/
+
   // prevent search in the output directories
   QStrList &exclPatterns = Config_getList("EXCLUDE_PATTERNS");
   if (generateHtml)    exclPatterns.append(htmlOutput);
@@ -11068,12 +11048,12 @@ void parseInput()
   searchInputFiles();
 
   // Notice: the order of the function calls below is very important!
-  
+
   if (Config_getBool("GENERATE_HTML"))
   {
     readFormulaRepository();
   }
-  
+
   /**************************************************************************
    *             Handle Tag Files                                           *
    **************************************************************************/
@@ -11090,7 +11070,7 @@ void parseInput()
   EntryNav *rootNav = new EntryNav(0,root);
   rootNav->setEntry(root);
   msg("Reading and parsing tag files\n");
-  
+
   QStrList &tagFileList = Config_getList("TAGFILES");
   char *s=tagFileList.first();
   while (s)
@@ -11099,9 +11079,9 @@ void parseInput()
     root->createNavigationIndex(rootNav,g_storage,0);
     s=tagFileList.next();
   }
-  
+
   /**************************************************************************
-   *             Parse source files                                         * 
+   *             Parse source files                                         *
    **************************************************************************/
 
   if (Config_getBool("BUILTIN_STL_SUPPORT"))
@@ -11128,7 +11108,7 @@ void parseInput()
   }
 
   /**************************************************************************
-   *             Gather information                                         * 
+   *             Gather information                                         *
    **************************************************************************/
 
   g_s.begin("Building group list...\n");
@@ -11166,7 +11146,7 @@ void parseInput()
   resolveClassNestingRelations();
   g_s.end();
   // 1.8.2-20121111: no longer add nested classes to the group as well
-  //distributeClassGroupRelations(); 
+  //distributeClassGroupRelations();
 
   // calling buildClassList may result in cached relations that
   // become invalid after resolveClassNestingRelations(), that's why
@@ -11421,7 +11401,7 @@ void generateOutput()
 
 
   g_outputList = new OutputList(TRUE);
-  if (generateHtml)  
+  if (generateHtml)
   {
     g_outputList->add(new HtmlGenerator);
     HtmlGenerator::init();
@@ -11439,21 +11419,11 @@ void generateOutput()
     if (generateDocSet)      Doxygen::indexList->addIndex(new DocSets);
     Doxygen::indexList->initialize();
     HtmlGenerator::writeTabData();
-
-    // copy static stuff
-    copyStyleSheet();
-    copyLogo();
-    copyExtraFiles("HTML_EXTRA_FILES","HTML_OUTPUT");
-    FTVHelp::generateTreeViewImages();
   }
-  if (generateLatex) 
+  if (generateLatex)
   {
     g_outputList->add(new LatexGenerator);
     LatexGenerator::init();
-
-    copyLatexStyleSheet();
-    // copy static stuff
-    copyExtraFiles("LATEX_EXTRA_FILES","LATEX_OUTPUT");
   }
   if (generateMan)
   {
@@ -11474,7 +11444,7 @@ void generateOutput()
     if (!Htags::loadFilemap(htmldir))
        err("htags(1) ended normally but failed to load the filemap. \n");
   }
-  
+
   /**************************************************************************
    *                        Generate documentation                          *
    **************************************************************************/
@@ -11491,12 +11461,17 @@ void generateOutput()
   static bool searchEngine      = Config_getBool("SEARCHENGINE");
   static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH");
 
+  g_s.begin("Generating search indices...\n");
+  if (searchEngine && !serverBasedSearch && (generateHtml || g_useOutputTemplate))
+  {
+    createJavascriptSearchIndex();
+  }
+
   // generate search indices (need to do this before writing other HTML
   // pages as these contain a drop down menu with options depending on
   // what categories we find in this function.
   if (generateHtml && searchEngine)
   {
-    g_s.begin("Generating search indices...\n");
     QCString searchDirName = Config_getString("HTML_OUTPUT")+"/search";
     QDir searchDir(searchDirName);
     if (!searchDir.exists() && !searchDir.mkdir(searchDirName))
@@ -11510,8 +11485,8 @@ void generateOutput()
     {
       writeJavascriptSearchIndex();
     }
-    g_s.end();
   }
+  g_s.end();
 
   g_s.begin("Generating example documentation...\n");
   generateExampleDocs();
@@ -11573,7 +11548,7 @@ void generateOutput()
       gd->sortSubGroups();
     }
   }
-  
+
   if (g_outputList->count()>0)
   {
     writeIndexHierarchy(*g_outputList);
@@ -11591,9 +11566,9 @@ void generateOutput()
   {
     if (generateHtml)
       removeDoxFont(Config_getString("HTML_OUTPUT"));
-    if (generateRtf)  
+    if (generateRtf)
       removeDoxFont(Config_getString("RTF_OUTPUT"));
-    if (generateLatex)  
+    if (generateLatex)
       removeDoxFont(Config_getString("LATEX_OUTPUT"));
   }
 
@@ -11675,8 +11650,22 @@ void generateOutput()
     g_s.end();
   }
 
+  // copy static stuff
+  if (generateHtml)
+  {
+    FTVHelp::generateTreeViewImages();
+    copyStyleSheet();
+    copyLogo();
+    copyExtraFiles("HTML_EXTRA_FILES","HTML_OUTPUT");
+  }
+  if (generateLatex)
+  {
+    copyLatexStyleSheet();
+    copyExtraFiles("LATEX_EXTRA_FILES","LATEX_OUTPUT");
+  }
+
   if (generateHtml &&
-      Config_getBool("GENERATE_HTMLHELP") && 
+      Config_getBool("GENERATE_HTMLHELP") &&
       !Config_getString("HHC_LOCATION").isEmpty())
   {
     g_s.begin("Running html help compiler...\n");
@@ -11692,7 +11681,7 @@ void generateOutput()
     g_s.end();
   }
   if ( generateHtml &&
-       Config_getBool("GENERATE_QHP") && 
+       Config_getBool("GENERATE_QHP") &&
       !Config_getString("QHG_LOCATION").isEmpty())
   {
     g_s.begin("Running qhelpgenerator...\n");
index 0d38d5b..2195a35 100644 (file)
@@ -1,13 +1,13 @@
 /******************************************************************************
  *
- * 
+ *
  *
  *
  * Copyright (C) 1997-2015 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby 
- * granted. No representations are made about the suitability of this software 
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
  * for any purpose. It is provided "as is" without express or implied warranty.
  * See the GNU General Public License for more details.
  *
@@ -71,7 +71,7 @@ typedef QListIterator<QCString>    StringListIterator;
 
 class StringDict : public QDict<QCString>
 {
-  public: 
+  public:
     StringDict(uint size=17) : QDict<QCString>(size) {}
     virtual ~StringDict() {}
 };
@@ -79,7 +79,7 @@ class StringDict : public QDict<QCString>
 struct LookupInfo
 {
   LookupInfo() : classDef(0), typeDef(0) {}
-  LookupInfo(ClassDef *cd,MemberDef *td,QCString ts,QCString rt) 
+  LookupInfo(ClassDef *cd,MemberDef *td,QCString ts,QCString rt)
     : classDef(cd), typeDef(td), templSpec(ts),resolvedType(rt) {}
   ClassDef  *classDef;
   MemberDef *typeDef;
@@ -121,8 +121,8 @@ class Doxygen
     static FormulaList              *formulaList;
     static FormulaDict              *formulaDict;
     static FormulaDict              *formulaNameDict;
-    static StringDict                tagDestinationDict; 
-    static StringDict                aliasDict; 
+    static StringDict                tagDestinationDict;
+    static StringDict                aliasDict;
     static QIntDict<MemberGroupInfo> memGrpInfoDict;
     static QDict<void>               expandAsDefinedDict;
     static NamespaceDef             *globalScope;
index d6e49a2..2a09c41 100644 (file)
@@ -1737,7 +1737,8 @@ bool FileDef::isDocumentationFile() const
 void FileDef::acquireFileVersion()
 {
   QCString vercmd = Config_getString("FILE_VERSION_FILTER");
-  if (!vercmd.isEmpty() && !m_filePath.isEmpty() && m_filePath!="generated") 
+  if (!vercmd.isEmpty() && !m_filePath.isEmpty() &&
+      m_filePath!="generated" && m_filePath!="graph_legend")
   {
     msg("Version of %s : ",m_filePath.data());
     QCString cmd = vercmd+" \""+m_filePath+"\"";
index 17a5e60..712128c 100644 (file)
@@ -44,7 +44,7 @@ class FTextStream;
 /** Class representing the data associated with a \#include statement. */
 struct IncludeInfo
 {
-  IncludeInfo() { fileDef=0; local=FALSE; indirect=FALSE; }
+  IncludeInfo() : fileDef(0), local(FALSE), imported(FALSE), indirect(FALSE) {}
   ~IncludeInfo() {}
   FileDef *fileDef;
   QCString includeName;
index ad37782..182ddaa 100644 (file)
@@ -132,6 +132,7 @@ void FormulaList::generateBitmaps(const char *path)
       {
         err("Problems running dvips. Check your installation!\n");
         portable_sysTimerStop();
+        QDir::setCurrent(oldDir);
         return;
       }
       portable_sysTimerStop();
@@ -192,6 +193,7 @@ void FormulaList::generateBitmaps(const char *path)
       {
         err("Problem running ghostscript %s %s. Check your installation!\n",portable_ghostScriptCommand(),gsArgs);
         portable_sysTimerStop();
+        QDir::setCurrent(oldDir);
         return;
       }
       portable_sysTimerStop();
index af1a82e..82e78c1 100644 (file)
@@ -795,7 +795,7 @@ PREFIX    (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
                                          codifyLines(yytext);
                                          endFontClass();
                                        }
-<Start>"implicit"{BS}"none"             { 
+<Start>"implicit"{BS}("none"|{TYPE_SPEC})  { 
                                          startFontClass("keywordtype"); 
                                          codifyLines(yytext);
                                          endFontClass();
@@ -1302,11 +1302,11 @@ void parseFortranCode(CodeOutputInterface &od,const char *className,const QCStri
   return;
 }
 
-#if !defined(YY_FLEX_SUBMINOR_VERSION) 
+#if !defined(YY_FLEX_SUBMINOR_VERSION)
 extern "C" { // some bogus code to keep the compiler happy
-  void fortrancodeYYdummy() { yy_flex_realloc(0,0); } 
+  void fortrancodeYYdummy() { yy_flex_realloc(0,0); }
 }
-#elif YY_FLEX_SUBMINOR_VERSION<33
+#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33
 #error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!"
 #else
 extern "C" { // some bogus code to keep the compiler happy
index cbe13fd..bd1fe83 100644 (file)
@@ -100,13 +100,14 @@ struct SymbolModifiers {
   bool pass;
   bool contiguous;
   bool volat; /* volatile is a reserverd name */
+  bool value; /* volatile is a reserverd name */
   QCString passVar;
 
   SymbolModifiers() : type(), returnName(), protection(NONE_P), direction(NONE_D),
     optional(FALSE), protect(FALSE), dimension(), allocatable(FALSE),
     external(FALSE), intrinsic(FALSE), parameter(FALSE),
     pointer(FALSE), target(FALSE), save(FALSE), deferred(FALSE), nonoverridable(FALSE),
-    nopass(FALSE), pass(FALSE), contiguous(FALSE), volat(FALSE), passVar() {}
+    nopass(FALSE), pass(FALSE), contiguous(FALSE), volat(FALSE), value(FALSE), passVar() {}
 
   SymbolModifiers& operator|=(const SymbolModifiers &mdfs);
   SymbolModifiers& operator|=(QCString mdfrString);
@@ -259,7 +260,7 @@ CHAR      (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS}))
 TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS}COMPLEX|DOUBLE{BS}PRECISION|{CHAR}|TYPE{ARGS}|CLASS{ARGS}|PROCEDURE{ARGS}?)
 
 INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")"
-ATTR_SPEC (EXTERNAL|ALLOCATABLE|DIMENSION{ARGS}|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS}?|DEFERRED|NON_OVERRIDABLE|CONTIGUOUS|VOLATILE)
+ATTR_SPEC (EXTERNAL|ALLOCATABLE|DIMENSION{ARGS}|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|NOPASS|PASS{ARGS}?|DEFERRED|NON_OVERRIDABLE|CONTIGUOUS|VOLATILE|VALUE)
 ACCESS_SPEC (PRIVATE|PUBLIC)
 LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?")"
 /* Assume that attribute statements are almost the same as attributes. */
@@ -1652,6 +1653,7 @@ SymbolModifiers& SymbolModifiers::operator|=(const SymbolModifiers &mdfs)
   passVar = mdfs.passVar;
   contiguous |= mdfs.contiguous;
   volat |= mdfs.volat;
+  value |= mdfs.value;
   return *this;
 }
 
@@ -1738,6 +1740,10 @@ SymbolModifiers& SymbolModifiers::operator|=(QCString mdfString)
   {
     newMdf.volat = TRUE;
   }
+  else if (mdfString=="value")
+  {
+    newMdf.value = TRUE;
+  }
   else if (mdfString.contains("pass"))
   {
     newMdf.pass = TRUE;
@@ -1902,6 +1908,11 @@ static QCString applyModifiers(QCString typeName, SymbolModifiers& mdfs)
     if (!typeName.isEmpty()) typeName += ", ";
     typeName += "volatile";
   }
+  if (mdfs.value)
+  {
+    if (!typeName.isEmpty()) typeName += ", ";
+    typeName += "value";
+  }
 
   return typeName;
 }
index e2774a9..a70e243 100644 (file)
@@ -171,6 +171,7 @@ void FTVHelp::decContentsDepth()
 
 /*! Add a list item to the contents file.
  *  \param isDir TRUE if the item is a directory, FALSE if it is a text
+ *  \param name The name of the item.
  *  \param ref  the URL of to the item.
  *  \param file the file containing the definition of the item
  *  \param anchor the anchor within the file.
index 2d7674d..7a74c65 100644 (file)
@@ -824,6 +824,7 @@ void GroupDef::writeFiles(OutputList &ol,const QCString &title)
     FileDef *fd;
     for (;(fd=it.current());++it)
     {
+      if (!fd->hasDocumentation()) continue;
       ol.startMemberDeclaration();
       ol.startMemberItem(fd->getOutputFileBase(),0);
       ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
@@ -877,6 +878,7 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title)
     {
       if (gd->isVisible())
       {
+        if (!gd->hasDocumentation()) continue;
         ol.startMemberDeclaration();
         ol.startMemberItem(gd->getOutputFileBase(),0);
         //ol.docify(theTranslator->trGroup(FALSE,TRUE));
@@ -910,6 +912,7 @@ void GroupDef::writeDirs(OutputList &ol,const QCString &title)
     DirDef *dd;
     for (;(dd=it.current());++it)
     {
+      if (!dd->hasDocumentation()) continue;
       ol.startMemberDeclaration();
       ol.startMemberItem(dd->getOutputFileBase(),0);
       ol.parseText(theTranslator->trDir(FALSE,TRUE));
@@ -1071,7 +1074,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
 {
   //static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
   ol.pushGeneratorState();
-  startFile(ol,getOutputFileBase(),name(),title,HLI_None);
+  startFile(ol,getOutputFileBase(),name(),title,HLI_Modules);
 
   ol.startHeaderSection();
   writeSummaryLinks(ol);
index c910eb6..460d54d 100644 (file)
@@ -59,7 +59,7 @@ bool Htags::execute(const QCString &htmldir)
   }
   else
   {
-    err("If you use USE_HTAGS then INPUT should specific a single directory. \n");
+    err("If you use USE_HTAGS then INPUT should specify a single directory.\n");
     return FALSE;
   }
 
index 99d6fdd..0533f87 100644 (file)
@@ -42,7 +42,7 @@ static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
 static QCString convertIndexWordToAnchor(const QString &word)
 {
   static char hex[] = "0123456789abcdef";
-  QCString result;
+  QCString result="a";
   const char *str = word.data();
   unsigned char c;
   if (str)
@@ -54,8 +54,7 @@ static QCString convertIndexWordToAnchor(const QString &word)
           (c >= '0' && c <= '9') || // DIGIT
           c == '-' ||
           c == '.' ||
-          c == '_' ||
-          c == '~'
+          c == '_'
          )
       {
         result += c;
@@ -63,7 +62,7 @@ static QCString convertIndexWordToAnchor(const QString &word)
       else
       {
         char enc[4];
-        enc[0] = '%';
+        enc[0] = ':';
         enc[1] = hex[(c & 0xf0) >> 4];
         enc[2] = hex[c & 0xf];
         enc[3] = 0;
@@ -1037,7 +1036,7 @@ void HtmlDocVisitor::visitPre(DocPara *p)
 void HtmlDocVisitor::visitPost(DocPara *p)
 {
   bool needsTag = FALSE;
-  if (p && p->parent()) 
+  if (p->parent()) 
   {
     switch (p->parent()->kind()) 
     {
@@ -1067,7 +1066,7 @@ void HtmlDocVisitor::visitPost(DocPara *p)
   // the paragraph (<ul>,<dl>,<table>) then that will already have ended the 
   // paragraph and we don't need to do it here
   int nodeIndex = p->children().count()-1;
-  if (p && nodeIndex>=0)
+  if (nodeIndex>=0)
   {
     while (nodeIndex>=0 && p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace)
     {
@@ -1301,6 +1300,11 @@ void HtmlDocVisitor::visitPre(DocHtmlTable *t)
 
   forceEndParagraph(t);
 
+  if (t->hasCaption())
+  {
+    m_t << "<a class=\"anchor\" id=\"" << t->caption()->anchor() << "\"></a>\n";
+  }
+
   QString attrs = htmlAttribsToString(t->attribs());
   if (attrs.isEmpty())
   {
@@ -1356,13 +1360,8 @@ void HtmlDocVisitor::visitPre(DocHtmlCaption *c)
   bool hasAlign      = FALSE;
   HtmlAttribListIterator li(c->attribs());
   HtmlAttrib *att;
-  for (li.toFirst();(att=li.current());++li)
-  {
-    if (att->name=="align") hasAlign=TRUE;
-  }
-  m_t << "<caption" << htmlAttribsToString(c->attribs());
-  if (!hasAlign) m_t << " align=\"bottom\"";
-  m_t << ">";
+  QCString id;
+  m_t << "<caption" << htmlAttribsToString(c->attribs()) << ">";
 }
 
 void HtmlDocVisitor::visitPost(DocHtmlCaption *) 
@@ -1808,7 +1807,6 @@ void HtmlDocVisitor::visitPre(DocHtmlBlockQuote *b)
 {
   if (m_hide) return;
   forceEndParagraph(b);
-
   QString attrs = htmlAttribsToString(b->attribs());
   if (attrs.isEmpty())
   {
@@ -1902,24 +1900,8 @@ void HtmlDocVisitor::filterQuotedCdataAttr(const char* str)
     {
       case '&':  m_t << "&amp;"; break;
       case '"':  m_t << "&quot;"; break;
-       // For SGML compliance, and given the SGML declaration for HTML syntax,
-       // it's enough to replace these two, provided that the declaration
-       // for the HTML version we generate (and as supported by the browser)
-       // specifies that all the other symbols used in rawVal are
-       // within the right character class (i.e., they're not
-       // some multinational weird characters not in the BASESET).
-       // We assume that 1) the browser will support whatever is remaining
-       // in the formula and 2) the TeX formulae are generally governed
-       // by even stricter character restrictions so it should be enough.
-       //
-       // On some incompliant browsers, additional translation of
-       // '>' and '<' into "&gt;" and "&lt;", respectively, might be needed;
-       // but I'm unaware of particular modern (last 4 years) versions
-       // with such problems, so let's not do it for performance.
-       // Also, some brousers will (wrongly) not process the entity references
-       // inside the attribute value and show the &...; form instead,  
-       // so we won't create entites unless necessary to minimize clutter there.
-       // --vassilii 
+      case '<':  m_t << "&lt;"; break;
+      case '>':  m_t << "&gt;"; break;
       default:   m_t << c;
     }
   }
@@ -1944,7 +1926,7 @@ void HtmlDocVisitor::startLink(const QCString &ref,const QCString &file,
   if (!file.isEmpty()) m_t << file << Doxygen::htmlFileExtension;
   if (!anchor.isEmpty()) m_t << "#" << anchor;
   m_t << "\"";
-  if (!tooltip.isEmpty()) m_t << " title=\"" << substitute(tooltip,"\"","&quot;") << "\"";
+  if (!tooltip.isEmpty()) m_t << " title=\"" << convertToHtml(tooltip) << "\"";
   m_t << ">";
 }
 
@@ -2061,6 +2043,42 @@ void HtmlDocVisitor::writePlantUMLFile(const QCString &fileName,
   }
 }
 
+/** Returns TRUE if the child nodes in paragraph \a para until \a nodeIndex
+    contain a style change node that is still active and that style change is one that
+    must be located outside of a paragraph, i.e. it is a center, div, or pre tag.
+    See also bug746162.
+ */
+static bool insideStyleChangeThatIsOutsideParagraph(DocPara *para,int nodeIndex)
+{
+  //printf("insideStyleChangeThatIsOutputParagraph(index=%d)\n",nodeIndex);
+  int styleMask=0;
+  bool styleOutsideParagraph=FALSE;
+  while (nodeIndex>=0 && !styleOutsideParagraph)
+  {
+    DocNode *n = para->children().at(nodeIndex);
+    if (n->kind()==DocNode::Kind_StyleChange)
+    {
+      DocStyleChange *sc = (DocStyleChange*)n;
+      if (!sc->enable()) // remember styles that has been closed already
+      {
+        styleMask|=(int)sc->style();
+      }
+      bool paraStyle = sc->style()==DocStyleChange::Center ||
+                       sc->style()==DocStyleChange::Div    ||
+                       sc->style()==DocStyleChange::Preformatted;
+      //printf("Found style change %s enabled=%d\n",sc->styleString(),sc->enable());
+      if (sc->enable() && (styleMask&(int)sc->style())==0 && // style change that is still active
+          paraStyle
+         )
+      {
+        styleOutsideParagraph=TRUE;
+      }
+    }
+    nodeIndex--;
+  }
+  return styleOutsideParagraph;
+}
+
 /** Used for items found inside a paragraph, which due to XHTML restrictions
  *  have to be outside of the paragraph. This method will forcefully end
  *  the current paragraph and forceStartParagraph() will restart it.
@@ -2074,7 +2092,7 @@ void HtmlDocVisitor::forceEndParagraph(DocNode *n)
     int nodeIndex = para->children().findRef(n);
     nodeIndex--;
     if (nodeIndex<0) return; // first node
-    while (nodeIndex>=0 && 
+    while (nodeIndex>=0 &&
            para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace
           )
     {
@@ -2086,12 +2104,14 @@ void HtmlDocVisitor::forceEndParagraph(DocNode *n)
       //printf("n=%p kind=%d outside=%d\n",n,n->kind(),mustBeOutsideParagraph(n));
       if (mustBeOutsideParagraph(n)) return;
     }
-
+    nodeIndex--;
+    bool styleOutsideParagraph=insideStyleChangeThatIsOutsideParagraph(para,nodeIndex);
     bool isFirst;
     bool isLast;
     getParagraphContext(para,isFirst,isLast);
-    //printf("forceEnd first=%d last=%d\n",isFirst,isLast);
+    //printf("forceEnd first=%d last=%d styleOutsideParagraph=%d\n",isFirst,isLast,styleOutsideParagraph);
     if (isFirst && isLast) return;
+    if (styleOutsideParagraph) return;
 
     m_t << "</p>";
   }
@@ -2109,9 +2129,11 @@ void HtmlDocVisitor::forceStartParagraph(DocNode *n)
     DocPara *para = (DocPara*)n->parent();
     int nodeIndex = para->children().findRef(n);
     int numNodes  = para->children().count();
+    bool styleOutsideParagraph=insideStyleChangeThatIsOutsideParagraph(para,nodeIndex);
+    if (styleOutsideParagraph) return;
     nodeIndex++;
     if (nodeIndex==numNodes) return; // last node
-    while (nodeIndex<numNodes && 
+    while (nodeIndex<numNodes &&
            para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace
           )
     {
index c4c601f..ff3c574 100644 (file)
@@ -312,7 +312,9 @@ static struct htmlEntityInfo
   { SYM(Percent),  "%",            "%",          "%",                    "%",             "\\%",                    "%",      "%",           { "%",          DocSymbol::Perl_char    }},
   { SYM(Pipe),     "|",            "|",          "|",                    "|",             "$|$",                    "|",      "|",           { "|",          DocSymbol::Perl_char    }},
   { SYM(Quot),     "\"",           "\"",         "\"",                   "&quot;",        "\"",                     "\"",     "\"",          { "\"",         DocSymbol::Perl_char    }},
-  { SYM(Minus),    "-",            "-",          "-",                    "-",             "-\\/",                   "-",      "-",           { "-",          DocSymbol::Perl_char    }}
+  { SYM(Minus),    "-",            "-",          "-",                    "-",             "-\\/",                   "-",      "-",           { "-",          DocSymbol::Perl_char    }},
+  { SYM(Plus),     "+",            "+",          "+",                    "+",             "+",                      "+",      "+",           { "+",          DocSymbol::Perl_char    }},
+  { SYM(Dot),      ".",            ".",          ".",                    ".",             ".",                      ".",      ".",           { ".",          DocSymbol::Perl_char    }}
 };
 
 static const int g_numHtmlEntities = (int)(sizeof(g_htmlEntities)/ sizeof(*g_htmlEntities));
index a2dd473..9e02dee 100644 (file)
@@ -333,10 +333,6 @@ static QCString substituteHtmlKeywords(const QCString &s,
   if (mathJax)
   {
     QCString path = Config_getString("MATHJAX_RELPATH");  
-    if (!path.isEmpty() && path.at(path.length()-1)!='/')  
-    {   
-      path+="/";   
-    }   
     if (path.isEmpty() || path.left(2)=="..") // relative path  
     {  
       path.prepend(relPath);   
@@ -364,7 +360,7 @@ static QCString substituteHtmlKeywords(const QCString &s,
       mathJaxJs += "\n";
     }
     mathJaxJs += "</script>";
-    mathJaxJs += "<script src=\"" + path + "MathJax.js\"></script>\n";
+    mathJaxJs += "<script type=\"text/javascript\" src=\"" + path + "MathJax.js\"></script>\n";
   }
 
   // first substitute generic keywords
@@ -553,7 +549,7 @@ void HtmlCodeGenerator::_writeCodeLink(const char *className,
   if (f) m_t << f << Doxygen::htmlFileExtension;
   if (anchor) m_t << "#" << anchor;
   m_t << "\"";
-  if (tooltip) m_t << " title=\"" << tooltip << "\"";
+  if (tooltip) m_t << " title=\"" << convertToHtml(tooltip) << "\"";
   m_t << ">";
   docify(name);
   m_t << "</a>";
@@ -593,7 +589,7 @@ void HtmlCodeGenerator::writeTooltip(const char *id, const DocLinkInfo &docInfo,
   if (desc)
   {
     m_t << "<div class=\"ttdoc\">";
-    m_t << desc; // desc is already HTML escaped
+    docify(desc); // desc is already HTML escaped; but there are still < and > signs
     m_t << "</div>";
   }
   if (!defInfo.file.isEmpty())
@@ -653,7 +649,7 @@ void HtmlCodeGenerator::startCodeLine(bool hasLineNumbers)
 
 void HtmlCodeGenerator::endCodeLine() 
 { 
-  if (m_streamSet) m_t << "</div>\n";
+  if (m_streamSet) m_t << "</div>";
 }
 
 void HtmlCodeGenerator::startFontClass(const char *s) 
@@ -736,25 +732,17 @@ void HtmlGenerator::init()
     QFile f(dname+"/dynsections.js");
     if (f.open(IO_WriteOnly))
     {
-      const Resource *res = mgr.get("dynsections.js");
-      if (res)
-      {
-        FTextStream t(&f);
-        t << (const char *)res->data;
-        if (Config_getBool("SOURCE_BROWSER") && Config_getBool("SOURCE_TOOLTIPS"))
-        {
-          t << endl <<
-            "$(document).ready(function() {\n"
-            "  $('.code,.codeRef').each(function() {\n"
-            "    $(this).data('powertip',$('#'+$(this).attr('href').replace(/.*\\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html());\n"
-            "    $(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true });\n"
-            "  });\n"
-            "});\n";
-        }
-      }
-      else
+      FTextStream t(&f);
+      t << mgr.getAsString("dynsections.js");
+      if (Config_getBool("SOURCE_BROWSER") && Config_getBool("SOURCE_TOOLTIPS"))
       {
-        err("Resource dynsections.js not compiled in");
+        t << endl <<
+          "$(document).ready(function() {\n"
+          "  $('.code,.codeRef').each(function() {\n"
+          "    $(this).data('powertip',$('#'+$(this).attr('href').replace(/.*\\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html());\n"
+          "    $(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true });\n"
+          "  });\n"
+          "});\n";
       }
     }
   }
@@ -819,20 +807,16 @@ void HtmlGenerator::writeSearchData(const char *dir)
   QFile f(searchDirName+"/search.css");
   if (f.open(IO_WriteOnly))
   {
-    const Resource *res = mgr.get("search.css");
-    if (res)
+    FTextStream t(&f);
+    QCString searchCss = replaceColorMarkers(mgr.getAsString("search.css"));
+    searchCss = substitute(searchCss,"$doxygenversion",versionString);
+    if (Config_getBool("DISABLE_INDEX"))
     {
-      FTextStream t(&f);
-      QCString searchCss = replaceColorMarkers((const char *)res->data);
-      searchCss = substitute(searchCss,"$doxygenversion",versionString);
-      if (Config_getBool("DISABLE_INDEX"))
-      {
-        // move up the search box if there are no tabs
-        searchCss = substitute(searchCss,"margin-top: 8px;","margin-top: 0px;");
-      }
-      t << searchCss;
-      Doxygen::indexList->addStyleSheetFile("search/search.css");
+      // move up the search box if there are no tabs
+      searchCss = substitute(searchCss,"margin-top: 8px;","margin-top: 0px;");
     }
+    t << searchCss;
+    Doxygen::indexList->addStyleSheetFile("search/search.css");
   }
 }
 
@@ -1356,11 +1340,9 @@ void HtmlGenerator::endClassDiagram(const ClassDiagram &d,
   startSectionContent(t,m_sectionCount);
   t << " <div class=\"center\">" << endl;
   t << "  <img src=\"";
-  t << relPath << fileName << ".png\" usemap=\"#";
-  docify(name);
+  t << relPath << fileName << ".png\" usemap=\"#" << convertToId(name);
   t << "_map\" alt=\"\"/>" << endl;
-  t << "  <map id=\"";
-  docify(name);
+  t << "  <map id=\"" << convertToId(name);
   t << "_map\" name=\"";
   docify(name);
   t << "_map\">" << endl;
@@ -1952,11 +1934,6 @@ static void endQuickIndexItem(FTextStream &t,const char *l)
   t << "</li>\n";
 }
 
-static QCString fixSpaces(const QCString &s)
-{
-  return substitute(s," ","&#160;");
-}
-
 static bool quickLinkVisible(LayoutNavEntry::Kind kind)
 {
   static bool showFiles = Config_getBool("SHOW_FILES");
@@ -2443,6 +2420,7 @@ void HtmlGenerator::endConstraintDocs()
 void HtmlGenerator::endConstraintList()
 {
   t << "</table>" << endl;
+  t << "</dd>" << endl;
   t << "</dl>" << endl;
   t << "</div>" << endl;
 }
diff --git a/src/increasebuffer.py b/src/increasebuffer.py
deleted file mode 100755 (executable)
index e2b2d0c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-# Since the internal token buffer of a generated flex file is hardcoded
-# to 16K, this script is used to increase the buffer size of a flex
-# generated scanner to 256K.
-import sys
-sys.stdout.write(sys.stdin.read().
-    replace('YY_BUF_SIZE 16384','YY_BUF_SIZE 262144').
-    replace('YY_READ_BUF_SIZE 8192','YY_READ_BUF_SIZE 262144'))
index e7ba8e7..15303c7 100644 (file)
@@ -1640,7 +1640,7 @@ static void writeAnnotatedClassList(OutputList &ol)
 static QCString letterToLabel(uint startLetter)
 {
   char s[11]; // max 0x12345678 + '\0'
-  if (startLetter>0x20 && startLetter<=0x7f) // printable ASCII character
+  if (isId(startLetter)) // printable ASCII character
   {
     s[0]=(char)startLetter;
     s[1]=0;
@@ -1901,7 +1901,7 @@ static void writeAlphabeticalClassList(OutputList &ol)
     }
   }
 
-  ol.writeString("<table style=\"margin: 10px; white-space: nowrap;\" align=\"center\" width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n");
+  ol.writeString("<table class=\"classindex\">\n");
   // generate table
   for (i=0;i<=maxRows;i++) // foreach table row
   {
@@ -2476,8 +2476,8 @@ static void writeQuickMemberIndex(OutputList &ol,
       anchor=fullName+extension+"#index_";
     else 
       anchor=fullName+"_"+letterToLabel(i)+extension+"#index_";
-    startQuickIndexItem(ol,anchor+ci,i==page,TRUE,first);
-    ol.writeString(is);
+    startQuickIndexItem(ol,anchor+is,i==page,TRUE,first);
+    ol.writeString(ci);
     endQuickIndexItem(ol);
     first=FALSE;
   }
@@ -3787,7 +3787,7 @@ static void writeIndex(OutputList &ol)
   {
     title = theTranslator->trMainPage();
   }
-  else 
+  else if (Doxygen::mainPage)
   {
     title = filterTitle(Doxygen::mainPage->title());
   }
@@ -4086,7 +4086,7 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry
       for (i=oldSize;i<newSize;i++) indexWritten.at(i)=FALSE;
     }
     //printf("starting %s kind=%d\n",lne->title().data(),lne->kind());
-    bool addToIndex=lne==0 || lne->visible();
+    bool addToIndex=lne->visible();
     bool needsClosing=FALSE;
     if (!indexWritten.at(index))
     {
index 150d23f..ace3614 100644 (file)
@@ -284,5 +284,6 @@ void initNamespaceMemberIndices();
 void addClassMemberNameToIndex(MemberDef *md);
 void addFileMemberNameToIndex(MemberDef *md);
 void addNamespaceMemberNameToIndex(MemberDef *md);
+QCString fixSpaces(const QCString &s);
 
 #endif
index 37c2130..5e7278c 100644 (file)
@@ -171,11 +171,10 @@ QCString LatexDocVisitor::escapeMakeIndexChars(const char *s)
 LatexDocVisitor::LatexDocVisitor(FTextStream &t,CodeOutputInterface &ci,
                                  const char *langExt,bool insideTabbing) 
   : DocVisitor(DocVisitor_Latex), m_t(t), m_ci(ci), m_insidePre(FALSE), 
-    m_insideItem(FALSE), m_hide(FALSE), m_insideTabbing(insideTabbing),
-    m_insideTable(FALSE), m_langExt(langExt), m_currentColumn(0), 
-    m_inRowspan(FALSE), m_inColspan(FALSE)
+    m_insideItem(FALSE), m_hide(FALSE), m_hideCaption(FALSE), m_insideTabbing(insideTabbing),
+    m_langExt(langExt)
 {
-  m_rowSpans.setAutoDelete(TRUE);
+  m_tableStateStack.setAutoDelete(TRUE);
 }
 
   //--------------------------------------
@@ -890,7 +889,7 @@ void LatexDocVisitor::visitPost(DocHtmlDescData *)
 {
 }
 
-static const char *getTableName(const DocNode *n)
+static bool tableIsNested(const DocNode *n)
 {
   bool isNested=FALSE;
   while (n && !isNested)
@@ -898,68 +897,115 @@ static const char *getTableName(const DocNode *n)
     isNested = n->kind()==DocNode::Kind_HtmlTable || n->kind()==DocNode::Kind_ParamSect;
     n  = n->parent();
   }
-  return isNested ? "TabularNC" : "TabularC";
+  return isNested;
 }
 
-void LatexDocVisitor::visitPre(DocHtmlTable *t)
+static void writeStartTableCommand(FTextStream &t,const DocNode *n,int cols)
 {
-  m_rowSpans.clear();
-  m_insideTable=TRUE;
-  if (m_hide) return;
-  if (t->hasCaption())
+  if (tableIsNested(n))
   {
-    m_t << "\\begin{table}[h]";
+    t << "\\begin{tabularx}{\\linewidth}{|*{" << cols << "}{>{\\raggedright\\arraybackslash}X|}}";
   }
-  m_t << "\\begin{" << getTableName(t->parent()) << "}{" << t->numColumns() << "}\n";
-  m_numCols = t->numColumns();
-  m_t << "\\hline\n";
+  else
+  {
+    t << "\\tabulinesep=1mm\n\\begin{longtabu} spread 0pt [c]{*" << cols << "{|X[-1]}|}\n";
+  }
+  //return isNested ? "TabularNC" : "TabularC";
 }
 
-void LatexDocVisitor::visitPost(DocHtmlTable *t)
+static void writeEndTableCommand(FTextStream &t,const DocNode *n)
 {
-  m_insideTable=FALSE;
-  if (m_hide) return;
-  if (t->hasCaption())
+  if (tableIsNested(n))
   {
-    m_t << "\\end{table}\n";
+    t << "\\end{tabularx}\n";
   }
   else
   {
-    m_t << "\\end{" << getTableName(t->parent()) << "}\n";
+    t << "\\end{longtabu}\n";
   }
+  //return isNested ? "TabularNC" : "TabularC";
 }
 
-void LatexDocVisitor::visitPre(DocHtmlCaption *c)
+void LatexDocVisitor::visitPre(DocHtmlTable *t)
 {
   if (m_hide) return;
-  m_t << "\\end{" << getTableName(c->parent()->parent()) << "}\n\\centering\n\\caption{";
+  pushTableState();
+  if (t->hasCaption())
+  {
+    DocHtmlCaption *c = t->caption();
+    static bool pdfHyperLinks = Config_getBool("PDF_HYPERLINKS");
+    if (!c->file().isEmpty() && pdfHyperLinks)
+    {
+      m_t << "\\hypertarget{" << stripPath(c->file()) << "_" << c->anchor()
+        << "}{}";
+    }
+    m_t << endl;
+  }
+
+  writeStartTableCommand(m_t,t->parent(),t->numColumns());
+
+  if (t->hasCaption())
+  {
+    DocHtmlCaption *c = t->caption();
+    m_t << "\\caption{";
+    visitCaption(this, c->children());
+    m_t << "}";
+    m_t << "\\label{" << stripPath(c->file()) << "_" << c->anchor() << "}";
+    m_t << "\\\\\n";
+  }
+
+  setNumCols(t->numColumns());
+  m_t << "\\hline\n";
+
+  // check if first row is a heading and then render the row already here
+  // and end it with \endfirsthead (triggered via m_firstRow==TRUE)
+  // then repeat the row as normal and end it with \endhead (m_firstRow==FALSE)
+  DocHtmlRow *firstRow = t->firstRow();
+  if (firstRow && firstRow->isHeading())
+  {
+    setFirstRow(TRUE);
+    firstRow->accept(this);
+    setFirstRow(FALSE);
+  }
 }
 
-void LatexDocVisitor::visitPost(DocHtmlCaption *) 
+void LatexDocVisitor::visitPost(DocHtmlTable *t)
 {
   if (m_hide) return;
-  m_t << "}\n";
+  writeEndTableCommand(m_t,t->parent());
+  popTableState();
+}
+
+void LatexDocVisitor::visitPre(DocHtmlCaption *c)
+{
+  m_hideCaption = m_hide;
+  m_hide        = TRUE;
+}
+
+void LatexDocVisitor::visitPost(DocHtmlCaption *c)
+{
+  m_hide        = m_hideCaption;
 }
 
 void LatexDocVisitor::visitPre(DocHtmlRow *r)
 {
-  m_currentColumn = 0;
-  if (r->isHeading()) m_t << "\\rowcolor{lightgray}";
+  setCurrentColumn(0);
+  if (r->isHeading()) m_t << "\\rowcolor{\\tableheadbgcolor}";
 }
 
 void LatexDocVisitor::visitPost(DocHtmlRow *row) 
 {
   if (m_hide) return;
 
-  int c=m_currentColumn;
-  while (c<=m_numCols) // end of row while inside a row span?
+  int c=currentColumn();
+  while (c<=numCols()) // end of row while inside a row span?
   {
     uint i;
-    for (i=0;i<m_rowSpans.count();i++)
+    for (i=0;i<rowSpans().count();i++)
     {
-      ActiveRowSpan *span = m_rowSpans.at(i);
-      //printf("  founc row span: column=%d rs=%d cs=%d rowIdx=%d cell->rowIdx=%d\n",
-      //    span->column, span->rowSpan,span->colSpan,row->rowIndex(),span->cell->rowIndex());
+      ActiveRowSpan *span = rowSpans().at(i);
+      //printf("  found row span: column=%d rs=%d cs=%d rowIdx=%d cell->rowIdx=%d i=%d c=%d\n",
+      //    span->column, span->rowSpan,span->colSpan,row->rowIndex(),span->cell->rowIndex(),i,c);
       if (span->rowSpan>0 && span->column==c &&  // we are at a cell in a row span
           row->rowIndex()>span->cell->rowIndex() // but not the row that started the span
          )
@@ -969,9 +1015,9 @@ void LatexDocVisitor::visitPost(DocHtmlRow *row)
         {
           m_t << "\\multicolumn{" << span->colSpan << "}{";
           m_t << "p{(\\linewidth-\\tabcolsep*" 
-            << m_numCols << "-\\arrayrulewidth*"
+            << numCols() << "-\\arrayrulewidth*"
             << row->visibleCells() << ")*" 
-            << span->colSpan <<"/"<< m_numCols << "}|}{}";
+            << span->colSpan <<"/"<< numCols() << "}|}{}";
         }
         else // solitary row span
         {
@@ -986,9 +1032,9 @@ void LatexDocVisitor::visitPost(DocHtmlRow *row)
   
   int col = 1;
   uint i;
-  for (i=0;i<m_rowSpans.count();i++)
+  for (i=0;i<rowSpans().count();i++)
   {
-    ActiveRowSpan *span = m_rowSpans.at(i);
+    ActiveRowSpan *span = rowSpans().at(i);
     if (span->rowSpan>0) span->rowSpan--;
     if (span->rowSpan<=0)
     {
@@ -1005,12 +1051,27 @@ void LatexDocVisitor::visitPost(DocHtmlRow *row)
     }
   }
 
-  if (col <= m_numCols)
+  if (col <= numCols())
   {
-    m_t << "\\cline{" << col << "-" << m_numCols << "}";
+    m_t << "\\cline{" << col << "-" << numCols() << "}";
   }
 
   m_t << "\n";
+
+  if (row->isHeading() && row->rowIndex()==1)
+  {
+    if (firstRow())
+    {
+      m_t << "\\endfirsthead" << endl;
+      m_t << "\\hline" << endl;
+      m_t << "\\endfoot" << endl;
+      m_t << "\\hline" << endl;
+    }
+    else
+    {
+      m_t << "\\endhead" << endl;
+    }
+  }
 }
 
 void LatexDocVisitor::visitPre(DocHtmlCell *c)
@@ -1022,68 +1083,60 @@ void LatexDocVisitor::visitPre(DocHtmlCell *c)
   {
     row = (DocHtmlRow*)c->parent();
   }
-  
-  m_currentColumn++;
+
+  setCurrentColumn(currentColumn()+1);
 
   //Skip columns that span from above.
   uint i;
-  for (i=0;i<m_rowSpans.count();i++)
+  for (i=0;i<rowSpans().count();i++)
   {
-    ActiveRowSpan *span = m_rowSpans.at(i);
-    if (span->rowSpan>0 && span->column==m_currentColumn)
+    ActiveRowSpan *span = rowSpans().at(i);
+    if (span->rowSpan>0 && span->column==currentColumn())
     {
       if (row && span->colSpan>1)
       {
         m_t << "\\multicolumn{" << span->colSpan << "}{";
-        if (m_currentColumn /*c->columnIndex()*/==1) // add extra | for first column
+        if (currentColumn() /*c->columnIndex()*/==1) // add extra | for first column
         {
           m_t << "|";
         }
         m_t << "p{(\\linewidth-\\tabcolsep*" 
-            << m_numCols << "-\\arrayrulewidth*"
+            << numCols() << "-\\arrayrulewidth*"
             << row->visibleCells() << ")*" 
-            << span->colSpan <<"/"<< m_numCols << "}|}{}";
-        m_currentColumn+=span->colSpan;
+            << span->colSpan <<"/"<< numCols() << "}|}{}";
+        setCurrentColumn(currentColumn()+span->colSpan);
       }
       else
       {
-        m_currentColumn++;
+        setCurrentColumn(currentColumn()+1);
       }
       m_t << "&";
     }
   }
 
-#if 0
-  QMap<int, int>::Iterator it = m_rowspanIndices.find(m_currentColumn);
-  if (it!=m_rowspanIndices.end() && it.data()>0)
-  {
-    m_t << "&";
-    m_currentColumn++;
-    it++;
-  }
-#endif
-
   int cs = c->colSpan();
   if (cs>1 && row)
   {
-    m_inColspan = TRUE;
+    setInColSpan(TRUE);
     m_t << "\\multicolumn{" << cs << "}{";
     if (c->columnIndex()==1) // add extra | for first column
     {
       m_t << "|";
     }
     m_t << "p{(\\linewidth-\\tabcolsep*" 
-        << m_numCols << "-\\arrayrulewidth*"
+        << numCols() << "-\\arrayrulewidth*"
         << row->visibleCells() << ")*" 
-        << cs <<"/"<< m_numCols << "}|}{";
-    if (c->isHeading()) m_t << "\\cellcolor{lightgray}";
+        << cs <<"/"<< numCols() << "}|}{";
+    if (c->isHeading()) m_t << "\\cellcolor{\\tableheadbgcolor}";
   }
   int rs = c->rowSpan();
   if (rs>0)
   {
-    m_inRowspan = TRUE;
-    //m_rowspanIndices[m_currentColumn] = rs;
-    m_rowSpans.append(new ActiveRowSpan(c,rs,cs,m_currentColumn));
+    setInRowSpan(TRUE);
+    //printf("adding row span: cell={r=%d c=%d rs=%d cs=%d} curCol=%d\n",
+    //                       c->rowIndex(),c->columnIndex(),c->rowSpan(),c->colSpan(),
+    //                       currentColumn());
+    addRowSpan(new ActiveRowSpan(c,rs,cs,currentColumn()));
     m_t << "\\multirow{" << rs << "}{\\linewidth}{";
   }
   int a = c->alignment();
@@ -1101,7 +1154,7 @@ void LatexDocVisitor::visitPre(DocHtmlCell *c)
   }
   if (cs>1)
   {
-    m_currentColumn+=cs-1;
+    setCurrentColumn(currentColumn()+cs-1);
   }
 }
 
@@ -1112,14 +1165,14 @@ void LatexDocVisitor::visitPost(DocHtmlCell *c)
   {
     m_t << "}";
   }
-  if (m_inRowspan)
+  if (inRowSpan())
   {
-    m_inRowspan = FALSE;
+    setInRowSpan(FALSE);
     m_t << "}";
   }
-  if (m_inColspan)
+  if (inColSpan())
   {
-    m_inColspan = FALSE;
+    setInColSpan(FALSE);
     m_t << "}";
   }
   if (!c->isLast()) m_t << "&";
@@ -1258,7 +1311,7 @@ void LatexDocVisitor::visitPre(DocRef *ref)
   }
   else
   {
-    if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor());
+    if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor(),ref->refToTable());
   }
   if (!ref->hasLinkText()) filter(ref->targetTitle());
 }
@@ -1574,22 +1627,34 @@ void LatexDocVisitor::filter(const char *str)
   filterLatexString(m_t,str,m_insideTabbing,m_insidePre,m_insideItem);
 }
 
-void LatexDocVisitor::startLink(const QCString &ref,const QCString &file,const QCString &anchor)
+void LatexDocVisitor::startLink(const QCString &ref,const QCString &file,const QCString &anchor,bool refToTable)
 {
-  if (ref.isEmpty() && Config_getBool("PDF_HYPERLINKS")) // internal PDF link 
+  static bool pdfHyperLinks = Config_getBool("PDF_HYPERLINKS");
+  if (ref.isEmpty() && pdfHyperLinks) // internal PDF link
   {
-    m_t << "\\hyperlink{";
+    if (refToTable)
+    {
+      m_t << "\\doxytablelink{";
+    }
+    else
+    {
+      m_t << "\\hyperlink{";
+    }
     if (!file.isEmpty()) m_t << stripPath(file);
     if (!file.isEmpty() && !anchor.isEmpty()) m_t << "_";
     if (!anchor.isEmpty()) m_t << anchor;
     m_t << "}{";
   }
+  else if (ref.isEmpty() && refToTable)
+  {
+    m_t << "\\doxytableref{";
+  }
   else if (ref.isEmpty()) // internal non-PDF link
   {
     m_t << "\\doxyref{";
   }
   else // external link
-  { 
+  {
     m_t << "{\\bf ";
   }
 }
@@ -1597,9 +1662,10 @@ void LatexDocVisitor::startLink(const QCString &ref,const QCString &file,const Q
 void LatexDocVisitor::endLink(const QCString &ref,const QCString &file,const QCString &anchor)
 {
   m_t << "}";
-  if (ref.isEmpty() && !Config_getBool("PDF_HYPERLINKS"))
+  static bool pdfHyperLinks = Config_getBool("PDF_HYPERLINKS");
+  if (ref.isEmpty() && !pdfHyperLinks)
   {
-    m_t << "{"; 
+    m_t << "{";
     filter(theTranslator->trPageAbbreviation());
     m_t << "}{" << file;
     if (!file.isEmpty() && !anchor.isEmpty()) m_t << "_";
index d3aeaea..02df1ef 100644 (file)
@@ -159,7 +159,7 @@ class LatexDocVisitor : public DocVisitor
     
     void filter(const char *str);
     void startLink(const QCString &ref,const QCString &file,
-                   const QCString &anchor);
+                   const QCString &anchor,bool refToTable=FALSE);
     void endLink(const QCString &ref,const QCString &file,
                  const QCString &anchor);
     QCString escapeMakeIndexChars(const char *s);
@@ -190,15 +190,87 @@ class LatexDocVisitor : public DocVisitor
     bool m_insidePre;
     bool m_insideItem;
     bool m_hide;
+    bool m_hideCaption;
     bool m_insideTabbing;
-    bool m_insideTable;
-    int  m_numCols;
     QStack<bool> m_enabled;
     QCString m_langExt;
-    RowSpanList m_rowSpans;
-    int m_currentColumn;
-    bool m_inRowspan;
-    bool m_inColspan;
+
+    struct TableState
+    {
+      TableState() : numCols(0), currentColumn(0), inRowSpan(FALSE), 
+                     inColSpan(FALSE), firstRow(FALSE)
+      { rowSpans.setAutoDelete(TRUE); }
+      RowSpanList rowSpans;
+      int  numCols;
+      int currentColumn;
+      bool inRowSpan;
+      bool inColSpan;
+      bool firstRow;
+    };
+    QStack<TableState> m_tableStateStack; // needed for nested tables
+    RowSpanList m_emptyRowSpanList;
+
+    void pushTableState()
+    {
+      m_tableStateStack.push(new TableState);
+    }
+    void popTableState()
+    {
+      delete m_tableStateStack.pop();
+    }
+    int currentColumn() const
+    {
+      return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->currentColumn : 0;
+    }
+    void setCurrentColumn(int col)
+    {
+      if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->currentColumn = col;
+    }
+    int numCols() const
+    {
+      return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->numCols : 0;
+    }
+    void setNumCols(int num)
+    {
+      if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->numCols = num;
+    }
+    bool inRowSpan() const
+    {
+      return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->inRowSpan : FALSE;
+    }
+    void setInRowSpan(bool b)
+    {
+      if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->inRowSpan = b;
+    }
+    bool inColSpan() const
+    {
+      return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->inColSpan : FALSE;
+    }
+    void setInColSpan(bool b)
+    {
+      if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->inColSpan = b;
+    }
+    bool firstRow() const
+    {
+      return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->firstRow : FALSE;
+    }
+    void setFirstRow(bool b)
+    {
+      if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->firstRow = b;
+    }
+    const RowSpanList &rowSpans()
+    {
+      return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->rowSpans : m_emptyRowSpanList;
+    }
+    void addRowSpan(ActiveRowSpan *span)
+    {
+      if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->rowSpans.append(span);
+    }
+    bool insideTable() const
+    {
+      return !m_tableStateStack.isEmpty();
+    }
+
 };
 
 #endif
index 042dd7c..66a1f8e 100644 (file)
 #include "filename.h"
 #include "resourcemgr.h"
 
+//-------------------------------
+
+LatexCodeGenerator::LatexCodeGenerator(FTextStream &t,const QCString &relPath,const QCString &sourceFileName)
+  : m_relPath(relPath), m_sourceFileName(sourceFileName), m_col(0)
+{
+  m_prettyCode=Config_getBool("LATEX_SOURCE_CODE");
+  setTextStream(t);
+}
+
+LatexCodeGenerator::LatexCodeGenerator() : m_col(0), m_streamSet(FALSE)
+{
+  m_prettyCode=Config_getBool("LATEX_SOURCE_CODE");
+}
+
+void LatexCodeGenerator::setTextStream(FTextStream &t)
+{
+  m_streamSet = t.device()!=0;
+  m_t.setDevice(t.device());
+}
+
+void LatexCodeGenerator::setRelativePath(const QCString &path)
+{
+  m_relPath = path;
+}
+
+void LatexCodeGenerator::setSourceFileName(const QCString &name)
+{
+  m_sourceFileName = name;
+}
+
+void LatexCodeGenerator::codify(const char *str)
+{
+  if (str)
+  {
+    const char *p=str;
+    char c;
+    //char cs[5];
+    int spacesToNextTabStop;
+    static int tabSize = Config_getInt("TAB_SIZE");
+    const int maxLineLen = 108;
+    QCString result(4*maxLineLen+1); // worst case for 1 line of 4-byte chars
+    int i;
+    while ((c=*p))
+    {
+      switch(c)
+      {
+        case 0x0c: p++;  // remove ^L
+                   break;
+        case '\t': spacesToNextTabStop =
+                         tabSize - (m_col%tabSize);
+                   m_t << Doxygen::spaces.left(spacesToNextTabStop);
+                   m_col+=spacesToNextTabStop;
+                   p++;
+                   break;
+        case '\n': m_t << '\n'; m_col=0; p++;
+                   break;
+        default:
+                   i=0;
+
+#undef  COPYCHAR
+// helper macro to copy a single utf8 character, dealing with multibyte chars.
+#define COPYCHAR() do {                                           \
+                     result[i++]=c; p++;                          \
+                     if (c<0) /* multibyte utf-8 character */     \
+                     {                                            \
+                       /* 1xxx.xxxx: >=2 byte character */        \
+                       result[i++]=*p++;                          \
+                       if (((uchar)c&0xE0)==0xE0)                 \
+                       {                                          \
+                         /* 111x.xxxx: >=3 byte character */      \
+                         result[i++]=*p++;                        \
+                       }                                          \
+                       if (((uchar)c&0xF0)==0xF0)                 \
+                       {                                          \
+                         /* 1111.xxxx: 4 byte character */        \
+                         result[i++]=*p++;                        \
+                       }                                          \
+                     }                                            \
+                     m_col++;                                       \
+                   } while(0)
+
+                   // gather characters until we find whitespace or are at
+                   // the end of a line
+                   COPYCHAR();
+                   if (m_col>=maxLineLen) // force line break
+                   {
+                     m_t << "\n      ";
+                     m_col=0;
+                   }
+                   else // copy more characters
+                   {
+                     while (m_col<maxLineLen && (c=*p) &&
+                            c!=0x0c && c!='\t' && c!='\n' && c!=' '
+                           )
+                     {
+                       COPYCHAR();
+                     }
+                     if (m_col>=maxLineLen) // force line break
+                     {
+                       m_t << "\n      ";
+                       m_col=0;
+                     }
+                   }
+                   result[i]=0; // add terminator
+                   //if (m_prettyCode)
+                   //{
+                     filterLatexString(m_t,result,FALSE,TRUE);
+                   //}
+                   //else
+                   //{
+                   //  t << result;
+                   //}
+                   break;
+      }
+    }
+  }
+}
+
+
+void LatexCodeGenerator::writeCodeLink(const char *ref,const char *f,
+                                   const char *anchor,const char *name,
+                                   const char *)
+{
+  static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+  static bool usePDFLatex   = Config_getBool("USE_PDFLATEX");
+  int l = qstrlen(name);
+  if (m_col+l>80)
+  {
+    m_t << "\n      ";
+    m_col=0;
+  }
+  if (!ref && usePDFLatex && pdfHyperlinks)
+  {
+    m_t << "\\hyperlink{";
+    if (f) m_t << stripPath(f);
+    if (f && anchor) m_t << "_"; 
+    if (anchor) m_t << anchor; 
+    m_t << "}{";
+    codify(name);
+    m_t << "}";
+  }
+  else
+  {
+    m_t << name;
+  }
+  m_col+=l;
+}
+
+void LatexCodeGenerator::writeLineNumber(const char *ref,const char *fileName,const char *anchor,int l)
+{
+  static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
+  static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+  if (m_prettyCode)
+  {
+    QCString lineNumber;
+    lineNumber.sprintf("%05d",l);
+
+    if (fileName && !m_sourceFileName.isEmpty())
+    {
+      QCString lineAnchor;
+      lineAnchor.sprintf("_l%05d",l);
+      lineAnchor.prepend(m_sourceFileName);
+      //if (!m_prettyCode) return;
+      if (usePDFLatex && pdfHyperlinks)
+      {
+        m_t << "\\hypertarget{" << stripPath(lineAnchor) << "}{}";
+      }
+      writeCodeLink(ref,fileName,anchor,lineNumber,0);
+    }
+    else
+    {
+      codify(lineNumber);
+    }
+    m_t << " ";
+  }
+  else
+  {
+    m_t << l << " ";
+  }
+}
+
+
+void LatexCodeGenerator::startCodeLine(bool)
+{
+  m_col=0;
+}
+
+void LatexCodeGenerator::endCodeLine()
+{
+  codify("\n");
+}
+
+void LatexCodeGenerator::startFontClass(const char *name)
+{
+  m_t << "\\textcolor{" << name << "}{";
+}
+
+void LatexCodeGenerator::endFontClass()
+{
+  m_t << "}";
+}
+
+
+//-------------------------------
 
 LatexGenerator::LatexGenerator() : OutputGenerator()
 {
   dir=Config_getString("LATEX_OUTPUT");
-  col=0;
   //printf("LatexGenerator::LatexGenerator() insideTabbing=FALSE\n");
   insideTabbing=FALSE;
   firstDescItem=TRUE;
@@ -332,13 +535,8 @@ static void writeDefaultHeaderPart1(FTextStream &t)
        "\n";
 
   // Define page & text layout
-  QCString paperName;
-  QCString &paperType=Config_getEnum("PAPER_TYPE");
+  QCString paperName=Config_getEnum("PAPER_TYPE");
   // "a4wide" package is obsolete (see bug 563698)
-  if (paperType=="a4wide")
-    paperName="a4";
-  else
-    paperName=paperType;
   t << "% Page & text layout\n"
        "\\usepackage{geometry}\n"
        "\\geometry{%\n"
@@ -355,7 +553,7 @@ static void writeDefaultHeaderPart1(FTextStream &t)
        "\\hbadness=750\n"
        "\\setlength{\\emergencystretch}{15pt}\n"
        "\\setlength{\\parindent}{0cm}\n"
-       "\\setlength{\\parskip}{0.2cm}\n";
+       "\\setlength{\\parskip}{3ex plus 2ex minus 2ex}\n";
   // Redefine paragraph/subparagraph environments, using sectsty fonts
   t << "\\makeatletter\n"
        "\\renewcommand{\\paragraph}{%\n"
@@ -373,11 +571,18 @@ static void writeDefaultHeaderPart1(FTextStream &t)
 
   // Headers & footers
   QGString genString;
+  QCString generatedBy;
+  static bool timeStamp = Config_getBool("LATEX_TIMESTAMP");
   FTextStream tg(&genString);
-  filterLatexString(tg,
-                    theTranslator->trGeneratedAt(dateToString(TRUE),
-                       Config_getString("PROJECT_NAME")),
-                    FALSE,FALSE,FALSE);
+  if (timeStamp)
+  {
+    generatedBy = theTranslator->trGeneratedAt(dateToString(TRUE), Config_getString("PROJECT_NAME"));
+  }
+  else
+  {
+    generatedBy = theTranslator->trGeneratedBy();
+  }
+  filterLatexString(tg, generatedBy, FALSE,FALSE,FALSE);
   t << "% Headers & footers\n"
        "\\usepackage{fancyhdr}\n"
        "\\pagestyle{fancyplain}\n"
@@ -455,9 +660,12 @@ static void writeDefaultHeaderPart1(FTextStream &t)
        "\\newcommand{\\clearemptydoublepage}{%\n"
        "  \\newpage{\\pagestyle{empty}\\cleardoublepage}%\n"
        "}\n"
-       "\n"
        "\n";
 
+  // caption style definition
+  t << "\\usepackage{caption}\n"
+    << "\\captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top}\n\n";
+
   // End of preamble, now comes the document contents
   t << "%===== C O N T E N T S =====\n"
        "\n"
@@ -474,7 +682,7 @@ 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"
-      << "             bookmarks=true,\n"
+    //  << "             bookmarks=true,\n" // commented out to prevent warning
       << "             bookmarksnumbered=true,\n"
       << "             pdfencoding=unicode\n"
       << "            }\n";
@@ -499,10 +707,11 @@ static void writeDefaultHeaderPart3(FTextStream &t)
 {
   // part 3
   // Finalize project number
-  t << " Doxygen " << versionString << "}\\\\\n"
-       "\\vspace*{0.5cm}\n"
-       "{\\small " << dateToString(TRUE) << "}\\\\\n"
-       "\\end{center}\n"
+  t << " Doxygen " << versionString << "}\\\\\n";
+  if (Config_getBool("LATEX_TIMESTAMP"))
+    t << "\\vspace*{0.5cm}\n"
+         "{\\small " << dateToString(TRUE) << "}\\\\\n";
+  t << "\\end{center}\n"
        "\\end{titlepage}\n";
   bool compactLatex = Config_getBool("COMPACT_LATEX");
   if (!compactLatex)
@@ -590,15 +799,17 @@ void LatexGenerator::startFile(const char *name,const char *,const char *)
 #endif
   QCString fileName=name;
   relPath = relativePathToRoot(fileName);
-  sourceFileName = stripPath(fileName);
   if (fileName.right(4)!=".tex" && fileName.right(4)!=".sty") fileName+=".tex";
   startPlainFile(fileName);
+  m_codeGen.setTextStream(t);
+  m_codeGen.setRelativePath(relPath);
+  m_codeGen.setSourceFileName(stripPath(fileName));
 }
 
 void LatexGenerator::endFile()
 {
   endPlainFile();
-  sourceFileName.resize(0);
+  m_codeGen.setSourceFileName("");
 }
 
 //void LatexGenerator::writeIndex()
@@ -611,14 +822,6 @@ 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");
@@ -1201,7 +1404,8 @@ void LatexGenerator::endTextLink()
 void LatexGenerator::writeObjectLink(const char *ref, const char *f,
                                      const char *anchor, const char *text)
 {
-  if (!disableLinks && !ref && Config_getBool("PDF_HYPERLINKS"))
+  static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
+  if (!disableLinks && !ref && pdfHyperlinks)
   {
     t << "\\hyperlink{";
     if (f) t << stripPath(f);
@@ -1232,34 +1436,6 @@ void LatexGenerator::endPageRef(const char *clname, const char *anchor)
   t << "}";
 }
 
-void LatexGenerator::writeCodeLink(const char *ref,const char *f,
-                                   const char *anchor,const char *name,
-                                   const char *)
-{
-  static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
-  static bool usePDFLatex   = Config_getBool("USE_PDFLATEX");
-  int l = qstrlen(name);
-  if (col+l>80)
-  {
-    t << "\n      ";
-    col=0;
-  }
-  if (/*m_prettyCode &&*/ !disableLinks && !ref && usePDFLatex && pdfHyperlinks)
-  {
-    t << "\\hyperlink{";
-    if (f) t << stripPath(f);
-    if (f && anchor) t << "_"; 
-    if (anchor) t << anchor; 
-    t << "}{";
-    codify(name);
-    t << "}";
-  }
-  else
-  {
-    t << name;
-  }
-  col+=l;
-}
 
 void LatexGenerator::startTitleHead(const char *fileName)
 {
@@ -1285,9 +1461,9 @@ void LatexGenerator::endTitleHead(const char *fileName,const char *name)
   if (name)
   {
     t << "\\label{" << stripPath(fileName) << "}\\index{";
-    escapeLabelName(name);
+    t << latexEscapeLabelName(name,insideTabbing);
     t << "@{";
-    escapeMakeIndexChars(name);
+    t << latexEscapeIndexChars(name,insideTabbing);
     t << "}}" << endl;
   }
 }
@@ -1366,53 +1542,56 @@ void LatexGenerator::startMemberDoc(const char *clname,
     t << "\\index{";
     if (clname)
     {
-      escapeLabelName(clname);
+      t << latexEscapeLabelName(clname,insideTabbing);
       t << "@{";
-      escapeMakeIndexChars(clname);
+      t << latexEscapeIndexChars(clname,insideTabbing);
       t << "}!";
     }
-    escapeLabelName(memname);
+    t << latexEscapeLabelName(memname,insideTabbing);
     t << "@{";
-    escapeMakeIndexChars(memname);
+    t << latexEscapeIndexChars(memname,insideTabbing);
     t << "}}" << endl;
 
     t << "\\index{";
-    escapeLabelName(memname);
+    t << latexEscapeLabelName(memname,insideTabbing);
     t << "@{";
-    escapeMakeIndexChars(memname);
+    t << latexEscapeIndexChars(memname,insideTabbing);
     t << "}";
     if (clname)
     {
       t << "!";
-      escapeLabelName(clname);
+      t << latexEscapeLabelName(clname,insideTabbing);
       t << "@{";
-      escapeMakeIndexChars(clname);
+      t << latexEscapeIndexChars(clname,insideTabbing);
       t << "}"; 
     }
     t << "}" << endl;
   }
   static const char *levelLab[] = { "subsubsection","paragraph","subparagraph", "subparagraph" };
   static bool compactLatex = Config_getBool("COMPACT_LATEX");
+  static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
   int level=0;
   if (showInline) level+=2;
   if (compactLatex) level++;
   t << "\\" << levelLab[level]; 
 
-  //if (Config_getBool("PDF_HYPERLINKS") && memname) 
-  //{
-  //  t << "["; 
-  //  escapeMakeIndexChars(this,t,memname);
-  //  t << "]";
-  //}
   t << "[{";
-  escapeMakeIndexChars(title);
+  if (pdfHyperlinks)
+  {
+    t << "\\texorpdfstring{";
+  }
+  t << latexEscapeIndexChars(title,insideTabbing);
+  if (pdfHyperlinks)
+  {
+    t << "}{" << latexEscapePDFString(title) << "}";
+  }
   t << "}]";
   t << "{\\setlength{\\rightskip}{0pt plus 5cm}";
   disableLinks=TRUE;
 }
 
-void LatexGenerator::endMemberDoc(bool) 
-{ 
+void LatexGenerator::endMemberDoc(bool)
+{
   disableLinks=FALSE;
   t << "}";
   //if (Config_getBool("COMPACT_LATEX")) t << "\\hfill";
@@ -1422,6 +1601,10 @@ void LatexGenerator::startDoxyAnchor(const char *fName,const char *,
                                      const char *anchor, const char *,
                                      const char *)
 {
+}
+
+void LatexGenerator::endDoxyAnchor(const char *fName,const char *anchor)
+{
   static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
   static bool usePDFLatex   = Config_getBool("USE_PDFLATEX");
   if (usePDFLatex && pdfHyperlinks)
@@ -1431,10 +1614,6 @@ void LatexGenerator::startDoxyAnchor(const char *fName,const char *,
     if (anchor) t << "_" << anchor;
     t << "}{}";
   }
-}
-
-void LatexGenerator::endDoxyAnchor(const char *fName,const char *anchor)
-{
   t << "\\label{";
   if (fName) t << stripPath(fName);
   if (anchor) t << "_" << anchor;
@@ -1471,16 +1650,16 @@ void LatexGenerator::addIndexItem(const char *s1,const char *s2)
   if (s1)
   {
     t << "\\index{";
-    escapeLabelName(s1);
+    t << latexEscapeLabelName(s1,insideTabbing);
     t << "@{";
-    escapeMakeIndexChars(s1);
+    t << latexEscapeIndexChars(s1,insideTabbing);
     t << "}";
     if (s2)
     {
       t << "!";
-      escapeLabelName(s2);
+      t << latexEscapeLabelName(s2,insideTabbing);
       t << "@{";
-      escapeMakeIndexChars(s2);
+      t << latexEscapeIndexChars(s2,insideTabbing);
       t << "}";
     }
     t << "}";
@@ -1536,94 +1715,6 @@ void LatexGenerator::docify(const char *str)
   filterLatexString(t,str,insideTabbing,FALSE,FALSE);
 }
 
-void LatexGenerator::codify(const char *str)
-{
-  if (str)
-  { 
-    const char *p=str;
-    char c;
-    //char cs[5];
-    int spacesToNextTabStop;
-    static int tabSize = Config_getInt("TAB_SIZE");
-    const int maxLineLen = 108;
-    QCString result(4*maxLineLen+1); // worst case for 1 line of 4-byte chars
-    int i;
-    while ((c=*p))
-    {
-      switch(c)
-      {
-        case 0x0c: p++;  // remove ^L
-                   break;
-        case '\t': spacesToNextTabStop =
-                         tabSize - (col%tabSize);
-                   t << Doxygen::spaces.left(spacesToNextTabStop); 
-                   col+=spacesToNextTabStop;
-                   p++;
-                   break; 
-        case '\n': t << '\n'; col=0; p++;
-                   break;
-        default:   
-                   i=0;
-
-#undef  COPYCHAR
-// helper macro to copy a single utf8 character, dealing with multibyte chars.
-#define COPYCHAR() do {                                           \
-                     result[i++]=c; p++;                          \
-                     if (c<0) /* multibyte utf-8 character */     \
-                     {                                            \
-                       /* 1xxx.xxxx: >=2 byte character */        \
-                       result[i++]=*p++;                          \
-                       if (((uchar)c&0xE0)==0xE0)                 \
-                       {                                          \
-                         /* 111x.xxxx: >=3 byte character */      \
-                         result[i++]=*p++;                        \
-                       }                                          \
-                       if (((uchar)c&0xF0)==0xF0)                 \
-                       {                                          \
-                         /* 1111.xxxx: 4 byte character */        \
-                         result[i++]=*p++;                        \
-                       }                                          \
-                     }                                            \
-                     col++;                                       \
-                   } while(0)
-
-                   // gather characters until we find whitespace or are at
-                   // the end of a line
-                   COPYCHAR();
-                   if (col>=maxLineLen) // force line break
-                   {
-                     t << "\n      ";
-                     col=0;
-                   }
-                   else // copy more characters
-                   {
-                     while (col<maxLineLen && (c=*p) && 
-                            c!=0x0c && c!='\t' && c!='\n' && c!=' '
-                           )
-                     {
-                       COPYCHAR();
-                     }
-                     if (col>=maxLineLen) // force line break
-                     {
-                       t << "\n      ";
-                       col=0;
-                     }
-                   }
-                   result[i]=0; // add terminator
-                   //if (m_prettyCode)
-                   //{
-                     filterLatexString(t,result,insideTabbing,TRUE);
-                   //}
-                   //else
-                   //{
-                   //  t << result;
-                   //}
-                   break;
-      }
-    }
-  }
-}
-
 void LatexGenerator::writeChar(char c)
 {
   char cs[2];
@@ -2006,76 +2097,6 @@ void LatexGenerator::endConstraintList()
   t << "\\end{Desc}" << endl;
 }
 
-void LatexGenerator::escapeLabelName(const char *s)
-{
-  if (s==0) return;
-  const char *p=s;
-  char c;
-  QCString result(qstrlen(s)+1); // worst case allocation
-  int i;
-  while ((c=*p++))
-  {
-    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!='|' && c!='!' && c!='%' && c!='{' && c!='}' && c!='~')
-        {
-          result[i++]=c;
-          p++;
-        }
-        result[i]=0;
-        docify(result); 
-        break;
-    }
-  }
-}
-
-void LatexGenerator::escapeMakeIndexChars(const char *s)
-{
-  if (s==0) return;
-  const char *p=s;
-  char c;
-  QCString result(qstrlen(s)+1); // worst case allocation
-  int i;
-  while ((c=*p++))
-  {
-    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!=']' && c!='!' && c!='{' && c!='}' && c!='|')
-        {
-          result[i++]=c;
-          p++;
-        }
-        result[i]=0;
-        docify(result); 
-        break;
-    }
-  }
-}
-
 void LatexGenerator::startCodeFragment()
 {
   t << "\n\\begin{DoxyCode}\n";
@@ -2086,61 +2107,6 @@ void LatexGenerator::endCodeFragment()
   t << "\\end{DoxyCode}\n";
 }
 
-void LatexGenerator::writeLineNumber(const char *ref,const char *fileName,const char *anchor,int l)
-{
-  static bool usePDFLatex = Config_getBool("USE_PDFLATEX");
-  static bool pdfHyperlinks = Config_getBool("PDF_HYPERLINKS");
-  if (m_prettyCode)
-  {
-    QCString lineNumber;
-    lineNumber.sprintf("%05d",l);
-
-    if (fileName && !sourceFileName.isEmpty())
-    {
-      QCString lineAnchor;
-      lineAnchor.sprintf("_l%05d",l);
-      lineAnchor.prepend(sourceFileName);
-      //if (!m_prettyCode) return;
-      if (usePDFLatex && pdfHyperlinks)
-      {
-        t << "\\hypertarget{" << stripPath(lineAnchor) << "}{}";
-      }
-      writeCodeLink(ref,fileName,anchor,lineNumber,0);
-    }
-    else
-    { 
-      codify(lineNumber);
-    }
-    t << " ";
-  }
-  else
-  {
-    t << l << " ";
-  }
-}
-
-void LatexGenerator::startCodeLine(bool)
-{
-  col=0;
-}
-
-void LatexGenerator::endCodeLine()
-{
-  codify("\n");
-}
-
-void LatexGenerator::startFontClass(const char *name)
-{
-  //if (!m_prettyCode) return;
-  t << "\\textcolor{" << name << "}{";
-}
-
-void LatexGenerator::endFontClass()
-{
-  //if (!m_prettyCode) return;
-  t << "}";
-}
-
 void LatexGenerator::startInlineHeader()
 {
   if (Config_getBool("COMPACT_LATEX")) 
@@ -2224,3 +2190,4 @@ void LatexGenerator::endLabels()
 {
 }
 
+
index ee67803..84382a7 100644 (file)
@@ -24,6 +24,48 @@ class QFile;
 
 static const char *latexStyleExtension = ".sty";
 
+class LatexCodeGenerator : public CodeOutputInterface
+{
+  public:
+    LatexCodeGenerator(FTextStream &t,const QCString &relPath,const QCString &sourceFile);
+    LatexCodeGenerator();
+    void setTextStream(FTextStream &t);
+    void setRelativePath(const QCString &path);
+    void setSourceFileName(const QCString &sourceFileName);
+    void codify(const char *text);
+    void writeCodeLink(const char *ref,const char *file,
+                       const char *anchor,const char *name,
+                       const char *tooltip);
+    void writeTooltip(const char *,
+                      const DocLinkInfo &,
+                      const char *,
+                      const char *,
+                      const SourceLinkInfo &,
+                      const SourceLinkInfo &
+                     ) {}
+    void writeLineNumber(const char *,const char *,const char *,int);
+    void startCodeLine(bool);
+    void endCodeLine();
+    void startFontClass(const char *);
+    void endFontClass();
+    void writeCodeAnchor(const char *) {}
+    void setCurrentDoc(Definition *,const char *,bool) {}
+    void addWord(const char *,bool) {}
+
+  private:
+    void _writeCodeLink(const char *className,
+                        const char *ref,const char *file,
+                        const char *anchor,const char *name,
+                        const char *tooltip);
+    void docify(const char *str);
+    bool m_streamSet;
+    FTextStream m_t;
+    QCString m_relPath;
+    QCString m_sourceFileName;
+    int m_col;
+    bool m_prettyCode;
+};
+
 /** Generator for LaTeX output. */
 class LatexGenerator : public OutputGenerator
 {
@@ -47,6 +89,32 @@ class LatexGenerator : public OutputGenerator
     bool isEnabled(OutputType o) { return (o==Latex && active); } 
     OutputGenerator *get(OutputType o) { return (o==Latex) ? this : 0; }
 
+    // --- CodeOutputInterface
+    void codify(const char *text)
+    { m_codeGen.codify(text); }
+    void writeCodeLink(const char *ref, const char *file,
+                       const char *anchor,const char *name,
+                       const char *tooltip)
+    { m_codeGen.writeCodeLink(ref,file,anchor,name,tooltip); }
+    void writeLineNumber(const char *ref,const char *file,const char *anchor,int lineNumber)
+    { m_codeGen.writeLineNumber(ref,file,anchor,lineNumber); }
+    void writeTooltip(const char *id, const DocLinkInfo &docInfo, const char *decl,
+                      const char *desc, const SourceLinkInfo &defInfo, const SourceLinkInfo &declInfo
+                     )
+    { m_codeGen.writeTooltip(id,docInfo,decl,desc,defInfo,declInfo); }
+    void startCodeLine(bool hasLineNumbers)
+    { m_codeGen.startCodeLine(hasLineNumbers); }
+    void endCodeLine()
+    { m_codeGen.endCodeLine(); }
+    void startFontClass(const char *s)
+    { m_codeGen.startFontClass(s); }
+    void endFontClass()
+    { m_codeGen.endFontClass(); }
+    void writeCodeAnchor(const char *anchor)
+    { m_codeGen.writeCodeAnchor(anchor); }
+    // ---------------------------
+
+
     void writeDoc(DocNode *,Definition *ctx,MemberDef *);
 
     void startFile(const char *name,const char *manName,const char *title);
@@ -83,15 +151,9 @@ class LatexGenerator : public OutputGenerator
     void startIndexItem(const char *ref,const char *file);
     void endIndexItem(const char *ref,const char *file);
     void docify(const char *text);
-    void codify(const char *text);
     void writeObjectLink(const char *ref,const char *file,
                          const char *anchor,const char *name);
-    void writeCodeLink(const char *ref, const char *file,
-                       const char *anchor,const char *name,
-                       const char *tooltip);
-    void writeTooltip(const char *, const DocLinkInfo &, const char *,
-                      const char *, const SourceLinkInfo &, const SourceLinkInfo &
-                     ) {}
+
     void startTextLink(const char *,const char *);
     void endTextLink();
     void startHtmlLink(const char *url);
@@ -137,9 +199,6 @@ class LatexGenerator : public OutputGenerator
     void writeAnchor(const char *fileName,const char *name);
     void startCodeFragment();
     void endCodeFragment();
-    void writeLineNumber(const char *,const char *,const char *,int l);
-    void startCodeLine(bool hasLineNumbers);
-    void endCodeLine();
     void startEmphasis() { t << "{\\em ";  }
     void endEmphasis()   { t << "}"; }
     void startBold()     { t << "{\\bfseries "; }
@@ -267,10 +326,6 @@ class LatexGenerator : public OutputGenerator
     void writeLabel(const char *l,bool isLast);
     void endLabels();
 
-    void startFontClass(const char *); // {}
-    void endFontClass(); // {}
-
-    void writeCodeAnchor(const char *) {}
     void setCurrentDoc(Definition *,const char *,bool) {}
     void addWord(const char *,bool) {}
 
@@ -278,17 +333,14 @@ class LatexGenerator : public OutputGenerator
   private:
     LatexGenerator(const LatexGenerator &);
     LatexGenerator &operator=(const LatexGenerator &);
-    void escapeLabelName(const char *s);
-    void escapeMakeIndexChars(const char *s);
-    int col;
     bool insideTabbing;
     bool firstDescItem;
     bool disableLinks;
     QCString relPath;
-    QCString sourceFileName;
     int m_indent;
     bool templateMemberItem;
     bool m_prettyCode;
+    LatexCodeGenerator m_codeGen;
 };
 
 #endif
index 75cb6b3..2835e77 100644 (file)
@@ -888,7 +888,7 @@ class LayoutParser : public QXmlDefaultHandler
         // no MainPage node... add one as the first item of the root node...
         new LayoutNavEntry(m_rootNav,LayoutNavEntry::MainPage, TRUE, 
             /*Config_getBool("GENERATE_TREEVIEW") ? "main" :*/ "index",
-            theTranslator->trMainPage(),TRUE);
+            theTranslator->trMainPage(),"",TRUE);
       }
     }
 
@@ -1269,6 +1269,7 @@ class LayoutParser : public QXmlDefaultHandler
 
   private:
     LayoutParser() : m_sHandler(163), m_eHandler(17), m_invalidEntry(FALSE) { }
+   ~LayoutParser() { delete m_rootNav; }
 
     QDict<StartElementHandler> m_sHandler;
     QDict<EndElementHandler>   m_eHandler;
@@ -1396,7 +1397,8 @@ void LayoutDocManager::parse(QTextStream &t,const char *fileName)
 void writeDefaultLayoutFile(const char *fileName)
 {
   QFile f(fileName);
-  if (!f.open(IO_WriteOnly))
+  bool ok = openOutputFile(fileName,f);
+  if (!ok)
   {
     err("Failed to open file %s for writing!\n",fileName);
     return;
index 084f1c8..dbbced5 100644 (file)
@@ -2347,7 +2347,7 @@ unsigned LodePNG_InfoRaw_copy(LodePNG_InfoRaw* dest, const LodePNG_InfoRaw* sour
   LodePNG_InfoRaw_cleanup(dest);
   *dest = *source;
   LodePNG_InfoColor_init(&dest->color);
-  error = LodePNG_InfoColor_copy(&dest->color, &source->color); if(error) return error;
+  error = LodePNG_InfoColor_copy(&dest->color, &source->color);
   return error;
 }
 
index cfd38ce..2061087 100644 (file)
@@ -1,13 +1,13 @@
 /******************************************************************************
  *
- * 
+ *
  *
  *
  * Copyright (C) 1997-2015 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby 
- * granted. No representations are made about the suitability of this software 
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
  * for any purpose. It is provided "as is" without express or implied warranty.
  * See the GNU General Public License for more details.
  *
@@ -25,7 +25,7 @@
  */
 
 /*! Default main. The idea of separating this from the rest of doxygen,
- *  is to make it possible to write your own main, with a different 
+ *  is to make it possible to write your own main, with a different
  *  generateOutput() function for instance.
  */
 int main(int argc,char **argv)
index 02d1416..6ff8344 100644 (file)
@@ -589,8 +589,8 @@ static int processHtmlTag(GrowBuf &out,const char *data,int offset,int size)
 static int processEmphasis(GrowBuf &out,const char *data,int offset,int size)
 {
   if ((offset>0 && !isOpenEmphChar(-1)) || // invalid char before * or _
-      (size>1 && data[0]!=data[1] && !isIdChar(1)) || // invalid char after * or _
-      (size>2 && data[0]==data[1] && !isIdChar(2)))   // invalid char after ** or __
+      (size>1 && data[0]!=data[1] && !(isIdChar(1) || data[1]=='[')) || // invalid char after * or _
+      (size>2 && data[0]==data[1] && !(isIdChar(2) || data[2]=='[')))   // invalid char after ** or __
   {
     return 0;
   }
@@ -695,14 +695,26 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
     if (i<size && data[i]=='<') i++;
     linkStart=i;
     nl=0;
-    while (i<size && data[i]!='\'' && data[i]!='"' && data[i]!=')') 
+    int braceCount=1;
+    while (i<size && data[i]!='\'' && data[i]!='"' && braceCount>0)
     {
-      if (data[i]=='\n')
+      if (data[i]=='\n') // unexpected EOL
       {
         nl++;
         if (nl>1) return 0;
       }
-      i++;
+      else if (data[i]=='(')
+      {
+        braceCount++;
+      }
+      else if (data[i]==')')
+      {
+        braceCount--;
+      }
+      if (braceCount>0)
+      {
+        i++;
+      }
     }
     if (i>=size || data[i]=='\n') return 0;
     convertStringFragment(link,data+linkStart,i-linkStart);
@@ -720,7 +732,7 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
       nl=0;
       while (i<size && data[i]!=')')
       {
-        if (data[i]=='\n') 
+        if (data[i]=='\n')
         {
           if (nl>1) return 0;
           nl++;
@@ -889,7 +901,8 @@ static int processLink(GrowBuf &out,const char *data,int,int size)
         out.addStr("\"");
       }
       out.addStr(">");
-      out.addStr(content.simplifyWhiteSpace());
+      content = content.simplifyWhiteSpace();
+      processInline(out,content,content.length());
       out.addStr("</a>");
     }
     else // avoid link to e.g. F[x](y)
@@ -1005,8 +1018,8 @@ static int processSpecialCommand(GrowBuf &out, const char *data, int offset, int
   if (size>1 && data[0]=='\\')
   {
     char c=data[1];
-    if (c=='[' || c==']' || c=='*' || c=='+' || c=='-' ||
-        c=='!' || c=='(' || c==')' || c=='.' || c=='`' || c=='_') 
+    if (c=='[' || c==']' || c=='*' || /* c=='+' || c=='-' || c=='.' || */
+        c=='!' || c=='(' || c==')' || c=='`' || c=='_')
     {
       if (c=='-' && size>3 && data[2]=='-' && data[3]=='-') // \---
       {
@@ -1018,7 +1031,11 @@ static int processSpecialCommand(GrowBuf &out, const char *data, int offset, int
         out.addStr(&data[1],2);
         return 3;
       }
-      out.addStr(&data[1],1);
+      else if (c=='-') // \-
+      {
+        out.addChar(c);
+      }
+      out.addChar(data[1]);
       return 2;
     }
   }
@@ -2351,21 +2368,22 @@ void MarkdownFileParser::parseInput(const char *fileName,
   QCString fn      = QFileInfo(fileName).fileName().utf8();
   static QCString mdfileAsMainPage = Config_getString("USE_MDFILE_AS_MAINPAGE");
   if (id.isEmpty()) id = markdownFileNameToId(fileName);
-  if (title.isEmpty()) title = titleFn;
   if (!mdfileAsMainPage.isEmpty() &&
       (fn==mdfileAsMainPage || // name reference
        QFileInfo(fileName).absFilePath()==
        QFileInfo(mdfileAsMainPage).absFilePath()) // file reference with path
      )
   {
-    docs.prepend("@mainpage\n");
+    docs.prepend("@mainpage "+title+"\n");
   }
   else if (id=="mainpage" || id=="index")
   {
+    if (title.isEmpty()) title = titleFn;
     docs.prepend("@mainpage "+title+"\n");
   }
   else
   {
+    if (title.isEmpty()) title = titleFn;
     docs.prepend("@page "+id+" "+title+"\n");
   }
   int lineNr=1;
index 7f93b51..af4a690 100644 (file)
@@ -967,7 +967,7 @@ QCString MemberDef::getOutputFileBase() const
       return baseName;
     }
   }
-  else if (m_impl->nspace)
+  else if (m_impl->nspace && m_impl->nspace->isLinkableInProject())
   {
     baseName=m_impl->nspace->getOutputFileBase();
   }
@@ -1092,7 +1092,8 @@ void MemberDef::_computeLinkableInProject()
     m_isLinkableCached = 1; // in class but class not linkable
     return;
   }
-  if (!m_impl->group && m_impl->nspace && !m_impl->related && !m_impl->nspace->isLinkableInProject())
+  if (!m_impl->group && m_impl->nspace && !m_impl->related && !m_impl->nspace->isLinkableInProject()
+      && (m_impl->fileDef==0 || !m_impl->fileDef->isLinkableInProject()))
   {
     //printf("in a namespace but namespace not linkable!\n");
     m_isLinkableCached = 1; // in namespace but namespace not linkable
@@ -1417,6 +1418,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
   // are explicitly grouped.
   if (!inGroup && m_impl->mtype==MemberType_EnumValue) return;
 
+
   Definition *d=0;
   ASSERT (cd!=0 || nd!=0 || fd!=0 || gd!=0); // member should belong to something
   if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
@@ -1443,19 +1445,21 @@ void MemberDef::writeDeclaration(OutputList &ol,
 
   // If there is no detailed description we need to write the anchor here.
   bool detailsVisible = isDetailedSectionLinkable();
-  if (!detailsVisible)
+  bool writeAnchor = (inGroup || m_impl->group==0) &&     // only write anchors for member that have no details and are
+                     !detailsVisible && !m_impl->annMemb; // rendered inside the group page or are not grouped at all
+  if (writeAnchor)
   {
     QCString doxyArgs=argsString();
-    if (!m_impl->annMemb)
+    QCString doxyName=name();
+    if (!cname.isEmpty())
     {
-      QCString doxyName=name();
-      if (!cname.isEmpty())
-      {
-        doxyName.prepend(cdname+getLanguageSpecificSeparator(getLanguage()));
-      }
-      ol.startDoxyAnchor(cfname,cname,anchor(),doxyName,doxyArgs);
+      doxyName.prepend(cdname+getLanguageSpecificSeparator(getLanguage()));
     }
+    ol.startDoxyAnchor(cfname,cname,anchor(),doxyName,doxyArgs);
+  }
 
+  if (!detailsVisible)
+  {
     ol.pushGeneratorState();
     ol.disable(OutputGenerator::Man);
     ol.disable(OutputGenerator::Latex);
@@ -1512,12 +1516,17 @@ void MemberDef::writeDeclaration(OutputList &ol,
         ol.writeNonBreakableSpace(3);
       }
       QCString varName=ltype.right(ltype.length()-ir).stripWhiteSpace();
-      //printf(">>>>>> indDepth=%d ltype=`%s' varName=`%s'\n",indDepth,ltype.data(),varName.data());
+      //printf(">>>>>> ltype=`%s' varName=`%s'\n",ltype.data(),varName.data());
       ol.docify("}");
       if (varName.isEmpty() && (name().isEmpty() || name().at(0)=='@'))
       {
         ol.docify(";");
       }
+      else if (!varName.isEmpty() && (varName.at(0)=='*' || varName.at(0)=='&'))
+      {
+        ol.docify(" ");
+        ol.docify(varName);
+      }
       endAnonScopeNeeded=TRUE;
     }
     else
@@ -1774,7 +1783,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
       ol.endTypewriter();
   }
 
-  if (!detailsVisible && !m_impl->annMemb)
+  if (writeAnchor)
   {
     ol.endDoxyAnchor(cfname,anchor());
   }
@@ -1914,7 +1923,7 @@ bool MemberDef::isDetailedSectionVisible(bool inGroup,bool inFile) const
   static bool inlineSimpleStructs = Config_getBool("INLINE_SIMPLE_STRUCTS");
   static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
   bool groupFilter = getGroupDef()==0 || inGroup || separateMemPages;
-  bool fileFilter  = getNamespaceDef()==0 || !inFile;
+  bool fileFilter  = getNamespaceDef()==0 || !getNamespaceDef()->isLinkable() || !inFile;
   bool simpleFilter = (hasBriefDescription() || !hideUndocMembers) && inlineSimpleStructs &&
                       getClassDef()!=0 && getClassDef()->isSimple();
 
@@ -2261,7 +2270,7 @@ void MemberDef::_writeCategoryRelation(OutputList &ol)
         text = theTranslator->trExtendsClass();
         name = m_impl->classDef->categoryOf()->displayName();
       }
-      i=text.find("@1");
+      i=text.find("@0");
       if (i!=-1)
       {
         MemberDef *md = m_impl->categoryRelation;
@@ -2495,7 +2504,7 @@ void MemberDef::_writeGroupInclude(OutputList &ol,bool inGroup)
 
     if (isIDLorJava) ol.docify("\""); else ol.docify("<");
 
-    if (fd && fd->isLinkable())
+    if (fd->isLinkable())
     {
       ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),fd->anchor(),nm);
     }
@@ -3223,10 +3232,9 @@ void MemberDef::warnIfUndocumented()
     t="file", d=fd;
   static bool extractAll = Config_getBool("EXTRACT_ALL");
 
-  //printf("warnIfUndoc: d->isLinkable()=%d isLinkable()=%d "
-  //       "isDocumentedFriendClass()=%d name()=%s prot=%d isReference=%d\n",
-  //       d->isLinkable(),isLinkable(),isDocumentedFriendClass(),
-  //       name().data(),m_impl->prot,isReference());
+  //printf("%s:warnIfUndoc: hasUserDocs=%d isFriendClass=%d protection=%d isRef=%d isDel=%d\n",
+  //    name().data(),
+  //    hasUserDocumentation(),isFriendClass(),protectionLevelVisible(m_impl->prot),isReference(),isDeleted());
   if ((!hasUserDocumentation() && !extractAll) &&
       !isFriendClass() &&
       name().find('@')==-1 && d && d->name().find('@')==-1 &&
@@ -3234,7 +3242,7 @@ void MemberDef::warnIfUndocumented()
       !isReference() && !isDeleted()
      )
   {
-    warn_undoc(d->getDefFileName(),d->getDefLine(),"Member %s%s (%s) of %s %s is not documented.",
+    warn_undoc(getDefFileName(),getDefLine(),"Member %s%s (%s) of %s %s is not documented.",
          qPrint(name()),qPrint(argsString()),qPrint(memberTypeName()),t,qPrint(d->name()));
   }
 }
@@ -4481,6 +4489,11 @@ MemberDef *MemberDef::getEnumScope() const
   return m_impl->enumScope;
 }
 
+bool MemberDef::livesInsideEnum() const
+{
+  return m_impl->livesInsideEnum;
+}
+
 MemberList *MemberDef::enumFieldList() const
 {
   return m_impl->enumFields;
index f60fb54..19a37ea 100644 (file)
@@ -176,6 +176,7 @@ class MemberDef : public Definition
     bool protectionVisible() const;
     bool showInCallGraph() const;
     bool isStrongEnumValue() const;
+    bool livesInsideEnum() const;
 
     // derived getters
     bool isFriendToHide() const;
index 4bf7721..cbda94d 100644 (file)
@@ -42,7 +42,7 @@ MemberGroup::MemberGroup()
 }
 
 MemberGroup::MemberGroup(Definition *parent,
-      int id,const char *hdr,const char *d,const char *docFile
+      int id,const char *hdr,const char *d,const char *docFile,int docLine)
 {
   //printf("New member group id=%d header=%s desc=%s\n",id,hdr,d);
   memberList      = new MemberList(MemberListType_memberGroup);
@@ -56,6 +56,7 @@ MemberGroup::MemberGroup(Definition *parent,
   m_numDocMembers = -1;
   m_parent        = parent;
   m_docFile       = docFile;
+  m_docLine       = docLine;
   m_xrefListItems = 0;
   //printf("Member group docs=`%s'\n",doc.data());
 }
@@ -76,7 +77,7 @@ void MemberGroup::insertMember(MemberDef *md)
   //       md,md->name().data());
 
   MemberDef *firstMd = memberList->getFirst();
-  if (inSameSection && memberList->count()>0 && 
+  if (inSameSection && firstMd &&
       firstMd->getSectionList(m_parent)!=md->getSectionList(m_parent))
   {
     inSameSection=FALSE;
index fa5520e..c42efc9 100644 (file)
@@ -42,7 +42,7 @@ class MemberGroup
   public:
     MemberGroup();
     MemberGroup(Definition *parent,int id,const char *header,
-                const char *docs,const char *docFile);
+                const char *docs,const char *docFile,int docLine);
    ~MemberGroup();
     QCString header() const { return grpHeader; }
     int groupId() const { return grpId; }
@@ -89,6 +89,9 @@ class MemberGroup
     Definition *parent() const { return m_parent; }
     QCString anchor() const;
 
+    QCString docFile() const { return m_docFile; }
+    int docLine() const { return m_docLine; }
+
     void marshal(StorageIntf *s);
     void unmarshal(StorageIntf *s);
 
@@ -105,6 +108,7 @@ class MemberGroup
     int  m_numDocMembers;
     Definition *m_parent;
     QCString m_docFile;
+    int m_docLine;
     QList<ListItemInfo> *m_xrefListItems;
 };
 
@@ -137,12 +141,13 @@ class MemberGroupSDict : public SIntDict<MemberGroup>
 /** Data collected for a member group */
 struct MemberGroupInfo
 {
-  MemberGroupInfo() : m_sli(0) {}
+  MemberGroupInfo() : m_sli(0), docLine(-1) {}
  ~MemberGroupInfo() { delete m_sli; m_sli=0; }
   void setRefItems(const QList<ListItemInfo> *sli);
   QCString header;
   QCString doc;
   QCString docFile;
+  int docLine;
   QCString compoundName;
   QList<ListItemInfo> *m_sli;
 };
index 64fe44a..f58ade4 100644 (file)
@@ -324,6 +324,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
                       )
 {
   //printf("----- writePlainDeclaration() ----\n");
+  static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
   countDecMembers();
   if (numDecMembers()==0) 
   {
@@ -387,7 +388,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
             }
             // if this is an anonymous enum and there are variables of this
             // enum type (i.e. enumVars>0), then we do not show the enum here.
-            if (enumVars==0) // show enum here
+            if (enumVars==0 && !hideUndocMembers) // show enum here
             {
               //printf("Enum!!\n");
               if (first)
@@ -435,8 +436,8 @@ void MemberList::writePlainDeclarations(OutputList &ol,
                 }
                 delete rootNode;
               }
-              ol.endMemberDeclaration(md->anchor(),inheritId);
               ol.endMemberItem();
+              ol.endMemberDeclaration(md->anchor(),inheritId);
             }
             md->warnIfUndocumented();
             break;
@@ -627,7 +628,7 @@ void MemberList::writeDeclarations(OutputList &ol,
           {
             //printf("Member group has docs!\n");
             ol.startMemberGroupDocs();
-            ol.generateDoc("[generated]",-1,ctx,0,mg->documentation()+"\n",FALSE,FALSE);
+            ol.generateDoc(mg->docFile(),mg->docLine(),ctx,0,mg->documentation()+"\n",FALSE,FALSE);
             ol.endMemberGroupDocs();
           }
           ol.startMemberGroup();
@@ -681,7 +682,7 @@ void MemberList::writeDocumentation(OutputList &ol,
   }
   if (memberGroupList)
   {
-    //printf("MemberList::writeDocumentation()  --  member groups\n");
+    printf("MemberList::writeDocumentation()  --  member groups %d\n",memberGroupList->count());
     MemberGroupListIterator mgli(*memberGroupList);
     MemberGroup *mg;
     for (;(mg=mgli.current());++mgli)
index 8f89c11..c61de68 100644 (file)
@@ -69,10 +69,10 @@ void initWarningFormat()
 //  {
 //    warnFormatOrder = 6;
 //  }
-//  outputFormat = 
+//  outputFormat =
 //      substitute(
 //        substitute(
-//          substitute( 
+//          substitute(
 //            Config_getString("WARN_FORMAT"),
 //           "$file","%s"
 //          ),
@@ -96,6 +96,11 @@ void initWarningFormat()
   {
     warnFile = stderr;
   }
+
+  if (Config_getBool("WARN_AS_ERROR"))
+  {
+    warning_str = error_str;
+  }
 }
 
 
@@ -130,23 +135,33 @@ static void format_warn(const char *file,int line,const char *text)
     }
   }
   // substitute markers by actual values
-  QCString msgText = 
+  bool warnAsError = Config_getBool("WARN_AS_ERROR");
+  QCString msgText =
       substitute(
         substitute(
           substitute(
-            substitute( 
+            substitute(
               outputFormat,
               "$file",fileSubst
             ),
-            "$text",textSubst
+            "$line",lineSubst
           ),
-          "$line",lineSubst
+          "$version",versionSubst
         ),
-        "$version",versionSubst
-      )+'\n';
+        "$text",textSubst
+      );
+  if (warnAsError)
+  {
+    msgText += " (warning treated as error, aborting now)";
+  }
+  msgText += '\n';
 
   // print resulting message
   fwrite(msgText.data(),1,msgText.length(),warnFile);
+  if (warnAsError)
+  {
+    exit(1);
+  }
 }
 
 static void do_warn(const char *tag, const char *file, int line, const char *prefix, const char *fmt, va_list args)
@@ -170,7 +185,7 @@ void warn(const char *file,int line,const char *fmt, ...)
   va_list args;
   va_start(args, fmt);
   do_warn("WARNINGS", file, line, warning_str, fmt, args);
-  va_end(args); 
+  va_end(args);
 }
 
 void va_warn(const char *file,int line,const char *fmt,va_list args)
@@ -191,7 +206,7 @@ void warn_undoc(const char *file,int line,const char *fmt, ...)
   do_warn("WARN_IF_UNDOCUMENTED", file, line, warning_str, fmt, args);
   va_end(args);
 }
-  
+
 void warn_doc_error(const char *file,int line,const char *fmt, ...)
 {
   va_list args;
@@ -205,7 +220,7 @@ void warn_uncond(const char *fmt, ...)
   va_list args;
   va_start(args, fmt);
   vfprintf(warnFile, (QCString(warning_str) + fmt).data(), args);
-  va_end(args); 
+  va_end(args);
 }
 
 void err(const char *fmt, ...)
@@ -213,7 +228,7 @@ void err(const char *fmt, ...)
   va_list args;
   va_start(args, fmt);
   vfprintf(warnFile, (QCString(error_str) + fmt).data(), args);
-  va_end(args); 
+  va_end(args);
 }
 
 extern void err_full(const char *file,int line,const char *fmt, ...)
@@ -221,7 +236,7 @@ extern void err_full(const char *file,int line,const char *fmt, ...)
   va_list args;
   va_start(args, fmt);
   do_warn(NULL, file, line, error_str, fmt, args);
-  va_end(args); 
+  va_end(args);
 }
 
 void printlex(int dbg, bool enter, const char *lexName, const char *fileName)
index a2341c7..948c86a 100644 (file)
@@ -984,7 +984,7 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,
   ol.startMemberList();
   for (ni.toFirst();(nd=ni.current());++ni)
   {
-    if (nd->isLinkable())
+    if (nd->isLinkable() && nd->hasDocumentation())
     {
       SrcLangExt lang = nd->getLanguage();
       if (lang==SrcLangExt_IDL && (isConstantGroup != nd->isConstantGroup()))
index 31f682e..53d2d7f 100644 (file)
@@ -44,11 +44,6 @@ void OutputGenerator::startPlainFile(const char *name)
   //printf("startPlainFile(%s)\n",name);
   fileName=dir+"/"+name;
   file = new QFile(fileName);
-  if (!file)
-  {
-    err("Could not create file object for %s\n",fileName.data());
-    exit(1);
-  }
   if (!file->open(IO_WriteOnly))
   {
     err("Could not open file %s for writing\n",fileName.data());
index 18a8205..20ace23 100644 (file)
@@ -34,6 +34,8 @@ PageDef::PageDef(const char *f,int l,const char *n,
   m_subPageDict = new PageSDict(7);
   m_pageScope = 0;
   m_nestingLevel = 0;
+  static bool shortNames = Config_getBool("SHORT_NAMES");
+  m_fileName = shortNames ? convertNameToFile(n) : QCString(n);
   m_showToc = FALSE;
 }
 
@@ -61,20 +63,11 @@ QCString PageDef::getOutputFileBase() const
     return m_fileName; 
 }
 
-void PageDef::setFileName(const char *name,bool dontEscape) 
-{ 
-  static bool shortNames = Config_getBool("SHORT_NAMES");
-  if (shortNames && !dontEscape)
-  {
-    m_fileName = convertNameToFile(name);
-  }
-  else
-  {
-    m_fileName = name; 
-  }
+void PageDef::setFileName(const char *name)
+{
+  m_fileName = name;
 }
 
-
 void PageDef::addInnerCompound(Definition *def)
 {
   if (def->definitionType()==Definition::TypePage)
index c3e54a3..41b84cb 100644 (file)
@@ -33,7 +33,7 @@ class PageDef : public Definition
    ~PageDef();
 
     // setters
-    void setFileName(const char *name,bool dontEscape);
+    void setFileName(const char *name);
     void setShowToc(bool b);
 
     // getters
index e3a85e4..7d28688 100644 (file)
@@ -96,12 +96,12 @@ void generatePlantUMLOutput(const char *baseName,const char *outDir,PlantUMLOutp
   pumlArgs+=" \"";
   pumlArgs+=baseName;
   pumlArgs+=".pu\" ";
-  pumlArgs+="-charset " + Config_getString("INPUT_ENCODING") + " ";
+  pumlArgs+="-charset UTF-8 ";
   int exitCode;
   //printf("*** running: %s %s outDir:%s %s\n",pumlExe.data(),pumlArgs.data(),outDir,outFile);
   msg("Running PlantUML on generated file %s.pu\n",baseName);
   portable_sysTimerStart();
-  if ((exitCode=portable_system(pumlExe,pumlArgs,FALSE))!=0)
+  if ((exitCode=portable_system(pumlExe,pumlArgs,TRUE))!=0)
   {
     err("Problems running PlantUML. Verify that the command 'java -jar \"%splantuml.jar\" -h' works from the command line. Exit code: %d\n",
         plantumlJarPath.data(),exitCode);
index 944c996..3a79741 100644 (file)
@@ -1,9 +1,13 @@
 #if (defined(__APPLE__) || defined(macintosh)) && !defined(DMG_BUILD)
+#include <AvailabilityMacros.h>
+// this hack doesn't seem to be needed on El Captain (10.11)
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_11
 // define this before including iconv.h to avoid a mapping of
 // iconv_open and friends to libicon_open (done by mac ports),
 // while the symbols without 'lib' are linked from /usr/lib/libiconv
 #define LIBICONV_PLUG
 #endif
+#endif
 #include <iconv.h>
 
 // These functions are implemented in a C file, because there are different
index 86f9ebb..18f3b1d 100644 (file)
--- a/src/pre.l
+++ b/src/pre.l
@@ -1659,6 +1659,7 @@ static void endCondSection()
   {
     CondCtx *ctx = g_condStack.pop();
     g_skip=ctx->skip;
+    delete ctx;
   }
   //printf("endCondSection: skip=%d stack=%d\n",g_skip,g_condStack.count());
 }
@@ -1667,7 +1668,7 @@ static void forceEndCondSection()
 {
   while (!g_condStack.isEmpty())
   {
-    g_condStack.pop();
+    delete g_condStack.pop();
   }
   g_skip=FALSE;
 }
@@ -3010,8 +3011,8 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output)
   g_includeStack.clear();
   g_expandedDict->setAutoDelete(FALSE);
   g_expandedDict->clear();
-  g_condStack.clear();
   g_condStack.setAutoDelete(TRUE);
+  g_condStack.clear();
   //g_fileDefineDict->clear();
 
   setFileName(fileName);
@@ -3161,6 +3162,7 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output)
     if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label %s ",ctx->sectionId.data()); 
     warn(fileName,ctx->lineNr,"Conditional section%sdoes not have "
        "a corresponding \\endcond command within this file.",sectionInfo.data());
+    delete ctx;
   }
   // make sure we don't extend a \cond with missing \endcond over multiple files (see bug 624829)
   forceEndCondSection();
index 95e7e47..b86670a 100644 (file)
@@ -536,10 +536,11 @@ class PrintDocVisitor : public DocVisitor
       indent_pre();
       printf("<ref ref=\"%s\" file=\"%s\" "
              "anchor=\"%s\" targetTitle=\"%s\""
-             " hasLinkText=\"%s\" refToAnchor=\"%s\" refToSection=\"%s\">\n",
+             " hasLinkText=\"%s\" refToAnchor=\"%s\" refToSection=\"%s\" refToTable=\"%s\">\n",
              ref->ref().data(),ref->file().data(),ref->anchor().data(),
              ref->targetTitle().data(),ref->hasLinkText()?"yes":"no",
-             ref->refToAnchor()?"yes":"no", ref->refToSection()?"yes":"no");
+             ref->refToAnchor()?"yes":"no", ref->refToSection()?"yes":"no",
+             ref->refToTable()?"yes":"no");
     }
     void visitPost(DocRef *) 
     {
index 3c41a69..b8ca5ed 100644 (file)
@@ -90,6 +90,9 @@ static int           g_stringContext;
 
 static QValueStack<uint> g_indents;  //!< Tracks indentation levels for scoping in python
 
+static QCString      g_docBlock;     //!< contents of all lines of a documentation block
+static bool          g_endComment;
+
 static void endFontClass();
 static void adjustScopesAndSuites(unsigned indentLength);
 
@@ -361,11 +364,13 @@ static void startCodeLine()
     Definition *d   = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
     //printf("startCodeLine %d d=%p\n",g_yyLineNr,d);
     //g_code->startLineNumber();
+
     if (!g_includeCodeFragment && d && d->isLinkableInProject())
     {
       g_currentDefinition = d;
       g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
       //g_insideBody = FALSE;
+      g_endComment = FALSE;
       g_searchingForBody = TRUE;
       g_realScope = d->name().copy();
       g_classScope = d->name().copy();
@@ -467,6 +472,26 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol,
   }
 }
 
+static void startFontClass(const char *s)
+{
+  // if font class is already set don't stop and start it.
+  // strcmp does not like null pointers as input.
+  if (!g_currentFontClass || !s || strcmp(g_currentFontClass,s))
+  {
+    endFontClass();
+    g_code->startFontClass(s);
+    g_currentFontClass=s;
+  }
+}
+
+static void endFontClass()
+{
+  if (g_currentFontClass)
+  {
+    g_code->endFontClass();
+    g_currentFontClass=0;
+  }
+}
 
 static void codifyLines(char *text)
 {
@@ -474,6 +499,7 @@ static void codifyLines(char *text)
   char *p=text,*sp=p;
   char c;
   bool done=FALSE;
+  const char *  tmp_currentFontClass = g_currentFontClass;
   while (!done)
   {
     sp=p;
@@ -483,7 +509,15 @@ static void codifyLines(char *text)
       g_yyLineNr++;
       *(p-1)='\0';
       g_code->codify(sp);
-      nextCodeLine();
+      endCodeLine();
+      if (g_yyLineNr<g_inputLines)
+      {
+        startCodeLine();
+      }
+      if (tmp_currentFontClass)
+      {
+        startFontClass(tmp_currentFontClass);
+      }
     }
     else
     {
@@ -493,6 +527,13 @@ static void codifyLines(char *text)
   }
 }
 
+static void codifyLines(const QCString &str)
+{
+  char *tmp= (char *)malloc(str.length()+1);
+  qstrcpy(tmp, str);
+  codifyLines(tmp);
+  free(tmp);
+}
 
 static bool getLinkInScope(const QCString &c,  // scope
                            const QCString &m,  // member
@@ -796,22 +837,6 @@ static void findMemberLink(CodeOutputInterface &ol,char *symName)
   codify(symName);
 }
 
-static void startFontClass(const char *s)
-{
-  endFontClass();
-  g_code->startFontClass(s);
-  g_currentFontClass=s;
-}
-
-static void endFontClass()
-{
-  if (g_currentFontClass)
-  {
-    g_code->endFontClass();
-    g_currentFontClass=0;
-  }
-}
-
 #undef YY_INPUT
 #define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
 
@@ -842,7 +867,7 @@ PARAMNONEMPTY     [^ \t\n():]
 IDENTIFIER        ({LETTER}|"_")({LETTER}|{DIGIT}|"_")*  
 BORDER            ([^A-Za-z0-9])
 
-POUNDCOMMENT      "#".*
+POUNDCOMMENT      "##"
 
 TRISINGLEQUOTE    "'''"
 TRIDOUBLEQUOTE    "\"\"\""
@@ -938,7 +963,7 @@ TARGET           ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
 
 
 %option noyywrap
-%option nounput
+%option stack
 
 %x Body
 
@@ -960,6 +985,7 @@ TARGET           ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
 %x DoubleQuoteString
 %x TripleString
 
+%x DocBlock
 %%
 
 <Body,Suite>{
@@ -989,6 +1015,14 @@ TARGET           ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
                                        codify("self.");
                                        findMemberLink(*g_code,&yytext[5]);
                                    }
+      "cls."{IDENTIFIER}/"("       {
+                                       codify("cls.");
+                                       findMemberLink(*g_code,&yytext[4]);
+                                   }
+      "cls."{IDENTIFIER}           {
+                                       codify("cls.");
+                                       findMemberLink(*g_code,&yytext[4]);
+                                   }
 }
 
 <ClassDec>{IDENTIFIER}              {
@@ -1168,11 +1202,16 @@ TARGET           ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
 
 
     {POUNDCOMMENT}                     {
-                                          // This eats EVERYTHING
-                                         // except the newline
-                                          startFontClass("comment");
-                                         codifyLines(yytext);
-                                         endFontClass();
+                                        if (YY_START==SingleQuoteString || 
+                                            YY_START==DoubleQuoteString || 
+                                            YY_START==TripleString
+                                           )
+                                        {
+                                          REJECT;
+                                        }
+                                         yy_push_state(YY_START);
+                                        BEGIN(DocBlock);
+                                        g_docBlock=yytext;
                                        }
 
     {NEWLINE}                          {
@@ -1341,6 +1380,28 @@ TARGET           ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
                                 codify(yytext);
                                 BEGIN(DoubleQuoteString);
                                }
+<DocBlock>.*                  { // contents of current comment line
+                                 g_docBlock+=yytext;
+                              }
+<DocBlock>"\n"{B}("#")         { // comment block (next line is also comment line)
+                                g_docBlock+=yytext; 
+                              }
+<DocBlock>{NEWLINE}            { // comment block ends at the end of this line
+                                 // remove special comment (default config)
+                                if (Config_getBool("STRIP_CODE_COMMENTS"))
+                                {
+                                   g_yyLineNr+=((QCString)g_docBlock).contains('\n');
+                                   g_endComment=TRUE;
+                                 }
+                                 else // do not remove comment
+                                 {
+                                   startFontClass("comment");
+                                   codifyLines(g_docBlock);
+                                   endFontClass();
+                                 }
+                                 unput(*yytext);
+                                 yy_pop_state();
+                              }
 <*>{POUNDCOMMENT}              {
                                 if (YY_START==SingleQuoteString || 
                                     YY_START==DoubleQuoteString || 
@@ -1349,14 +1410,31 @@ TARGET           ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
                                 {
                                   REJECT;
                                 }
-                                 // This eats EVERYTHING
-                                // except the newline
+                                 yy_push_state(YY_START);
+                                BEGIN(DocBlock);
+                                g_docBlock=yytext;
+                               }
+<*>"#".*                       { // normal comment
+                                if (YY_START==SingleQuoteString || 
+                                    YY_START==DoubleQuoteString || 
+                                    YY_START==TripleString
+                                   )
+                                {
+                                  REJECT;
+                                }
                                  startFontClass("comment");
-                                codifyLines(yytext);
-                                endFontClass();
+                                 codifyLines(yytext);
+                                 endFontClass();
                                }
 <*>{NEWLINE}                   {
-                                codifyLines(yytext);
+                                 if (g_endComment)
+                                 {
+                                   g_endComment=FALSE;
+                                 }
+                                 else
+                                 {
+                                   codifyLines(yytext);
+                                 }
                                 //printf("[pycode] %d NEWLINE [line %d] no match\n",
                                 //       YY_START, g_yyLineNr);
 
@@ -1377,6 +1455,17 @@ TARGET           ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
                                 BEGIN(Body);                                   
                                }
 
+<*><<EOF>>                     {
+                                 if (YY_START == DocBlock) {
+                                   if (!Config_getBool("STRIP_CODE_COMMENTS"))
+                                   {
+                                     startFontClass("comment");
+                                     codifyLines(g_docBlock);
+                                     endFontClass();
+                                   }
+                                 }
+                                 yyterminate();
+                               }
 %%
 
 /*@ ----------------------------------------------------------------------------
@@ -1503,7 +1592,7 @@ void parsePythonCode(CodeOutputInterface &od,const char * /*className*/,
 extern "C" { // some bogus code to keep the compiler happy
   void pycodeYYdummy() { yy_flex_realloc(0,0); } 
 }
-#elif YY_FLEX_SUBMINOR_VERSION<33
+#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33
 #error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)."
 #endif
 
index 8332a36..9ec69be 100644 (file)
@@ -113,6 +113,9 @@ static int              g_braceCount;
 static bool             g_lexInit = FALSE;
 static bool             g_packageCommentAllowed;
 
+static bool             g_start_init = FALSE;
+static int              g_search_count = 0;
+
 //-----------------------------------------------------------------------------
 
 
@@ -398,7 +401,6 @@ static void searchFoundDef()
   current->startLine = yyLineNr;
   current->bodyLine  = yyLineNr;
   current->section = Entry::FUNCTION_SEC;
-  current->protection = protection = Public;
   current->lang = SrcLangExt_Python;
   current->virt = Normal;
   current->stat = gstat;
@@ -458,6 +460,7 @@ OCTNUMBER         "0"[0-7]+[lL]?
 NUMBER            {DIGIT}+[lLjJ]?
 INTNUMBER         {HEXNUMBER}|{OCTNUMBER}|{NUMBER}
 FLOATNUMBER       {DIGIT}+"."{DIGIT}+([eE][+\-]?{DIGIT}+)?[jJ]?
+BOOL              ("True"|"False")
 LETTER            [A-Za-z\x80-\xFF]
 NONEMPTY          [A-Za-z0-9_\x80-\xFF]
 EXPCHAR           [#(){}\[\],:.%/\\=`*~|&<>!;+-]
@@ -483,6 +486,7 @@ STRINGPREFIX      ("r"|"u"|"ur"|"R"|"U"|"UR"|"Ur"|"uR")
 KEYWORD           ("lambda"|"import"|"class"|"assert"|"as"|"from"|"global"|"def"|"True"|"False")
 FLOWKW            ("or"|"and"|"is"|"not"|"print"|"for"|"in"|"if"|"try"|"except"|"yield"|"raise"|"break"|"continue"|"pass"|"if"|"return"|"while"|"elif"|"else"|"finally")
 POUNDCOMMENT      "#"[^#\n][^\n]* 
+SCRIPTCOMMENT      "#!".* 
 
 STARTDOCSYMS      "##"
 
@@ -580,6 +584,7 @@ STARTDOCSYMS      "##"
                        BEGIN(VariableDec);
                              }
      ^{B}{IDENTIFIER}/{B}"="[^=] { // variable
+                        if (g_search_count) REJECT;
                        g_indent=computeIndent(yytext);
                        current->section   = Entry::VARIABLE_SEC;
                        current->name      = QCString(yytext).stripWhiteSpace();
@@ -589,6 +594,20 @@ STARTDOCSYMS      "##"
                        g_packageCommentAllowed = FALSE;
                        BEGIN(VariableDec);
                      }
+     {B}{IDENTIFIER}/({B},{B}{IDENTIFIER})*{B}")"*{B}"="[^=] { // list of variables, we cannot place the default value
+                                                               // so we will skip it later on in a general rule
+                                                               // Also note ")" this is to catch also (a,b). the "("
+                                                               // is caught in the rule: [(], the ")" will be handled in [)]
+                        if (g_search_count > 1) REJECT;
+                       g_indent=computeIndent(yytext);
+                       current->section   = Entry::VARIABLE_SEC;
+                       current->name      = QCString(yytext).stripWhiteSpace();
+                       current->fileName  = yyFileName;
+                       current->startLine = yyLineNr;
+                       current->bodyLine  = yyLineNr;
+                       g_packageCommentAllowed = FALSE;
+                       newVariable();
+                     }
      "'"             { // start of a single quoted string
                                g_stringContext=YY_START;
                        g_copyString=0;
@@ -604,6 +623,9 @@ STARTDOCSYMS      "##"
     "@staticmethod"  {
                                gstat=TRUE;
                      }
+    {SCRIPTCOMMENT}   { // Unix type script comment
+                        if (yyLineNr != 1) REJECT;
+                     }
     {POUNDCOMMENT}    { // normal comment 
                        g_packageCommentAllowed = FALSE;
                      }
@@ -634,6 +656,12 @@ STARTDOCSYMS      "##"
                        initSpecialBlock();
                        BEGIN(SpecialComment);
                       }
+    [(]               { // we have to do something with (
+                        g_search_count += 1;
+                      }
+    [)]               { // we have to do something with )
+                        g_search_count -= 1;
+                      }
     [^\n]             { // any other character...
                         // This is the major default
                         // that should catch everything
@@ -734,7 +762,7 @@ STARTDOCSYMS      "##"
 
 <SearchMemVars>{
     "self."{IDENTIFIER}/{B}"=" {
-                        DBG_CTX((stderr,"Found member variable %s in %s at %d\n",&yytext[5],current_root->name.data(),yyLineNr));
+                        DBG_CTX((stderr,"Found instance method variable %s in %s at %d\n",&yytext[5],current_root->name.data(),yyLineNr));
                        current->name=&yytext[5];
                        current->section=Entry::VARIABLE_SEC;
                        current->fileName  = yyFileName;
@@ -745,9 +773,19 @@ STARTDOCSYMS      "##"
                        {
                          current->protection=Private;
                        }
-                       else
+                       newEntry();
+                      }
+    "cls."{IDENTIFIER}/{B}"=" {
+                        DBG_CTX((stderr,"Found class method variable %s in %s at %d\n",&yytext[4],current_root->name.data(),yyLineNr));
+                       current->name=&yytext[4];
+                       current->section=Entry::VARIABLE_SEC;
+                       current->fileName  = yyFileName;
+                       current->startLine = yyLineNr;
+                       current->bodyLine  = yyLineNr;
+                       current->type.resize(0);
+                       if (current->name.at(0)=='_') // mark as private
                        {
-                         current->protection=Public;
+                         current->protection=Private;
                        }
                        newEntry();
                       }
@@ -963,11 +1001,13 @@ STARTDOCSYMS      "##"
                            {
                              current->argList->getLast()->defval=g_defVal.stripWhiteSpace();
                            }
-                                   BEGIN(FunctionParams);
+                           if (*yytext == ')')
+                             current->args = argListToString(current->argList);
+                           BEGIN(FunctionParams);
                          }
                          else // continue
                          {
-                           g_braceCount--;
+                           if (*yytext == ')')g_braceCount--;
                            g_defVal+=*yytext;
                          }
                                }
@@ -1158,6 +1198,7 @@ STARTDOCSYMS      "##"
 <VariableDec>{
    "="                { // the assignment operator
                         //printf("====== VariableDec at line %d\n",yyLineNr);
+                        g_start_init = TRUE;
                        current->initializer = yytext;
                        current->initializer += " ";
                       }
@@ -1173,6 +1214,11 @@ STARTDOCSYMS      "##"
                        current->initializer += yytext;
                        BEGIN(VariableEnd);
                      }
+   {BOOL}             { // boolean value
+                       current->type = "bool";
+                       current->initializer += yytext;
+                       BEGIN(VariableEnd);
+                     }
    {STRINGPREFIX}?"'" { // string
                        current->type = "string";
                        current->initializer += yytext;
@@ -1204,8 +1250,8 @@ STARTDOCSYMS      "##"
                                g_stringContext=VariableEnd;
                        BEGIN(TripleString);
                       }
-   "("               { // tuple
-                        if (current->mtype!=Property)
+   "("               { // tuple, only when direct after =
+                        if (current->mtype!=Property && g_start_init)
                        {
                          current->type = "tuple";
                        }
@@ -1216,7 +1262,7 @@ STARTDOCSYMS      "##"
                        BEGIN( VariableAtom );
                       }
    "["                { // list
-                       current->type = "list";
+                        if (g_start_init) current->type = "list";
                        current->initializer+=*yytext;
                         g_atomStart='[';
                        g_atomEnd=']';
@@ -1224,7 +1270,7 @@ STARTDOCSYMS      "##"
                        BEGIN( VariableAtom );
                       }
    "{"               { // dictionary
-                       current->type = "dictionary";
+                        if (g_start_init) current->type = "dictionary";
                        current->initializer+=*yytext;
                         g_atomStart='{';
                        g_atomEnd='}';
@@ -1235,9 +1281,11 @@ STARTDOCSYMS      "##"
                         BEGIN( VariableEnd ); 
                       }
    {IDENTIFIER}              {
+                        g_start_init = FALSE;
                        current->initializer+=yytext;
                      }
    .                 {
+                        g_start_init = FALSE;
                        current->initializer+=*yytext;
                       }
    \n                {
@@ -1262,7 +1310,8 @@ STARTDOCSYMS      "##"
                        }
                        if (g_atomCount==0)
                        {
-                         BEGIN(VariableEnd);
+                          g_start_init = FALSE;
+                         BEGIN(VariableDec);
                        }
                       }
     {TRIDOUBLEQUOTE}  { // start of a comment block
@@ -1278,6 +1327,12 @@ STARTDOCSYMS      "##"
                        initTriSingleQuoteBlock();
                        BEGIN(TripleComment);
                       }
+   "'"               {
+                               g_stringContext=YY_START;
+                       current->initializer+="'";
+                       g_copyString=&current->initializer;
+                        BEGIN( SingleQuoteString );
+                      }
    "\""                      {
                                g_stringContext=YY_START;
                        current->initializer+="\"";
@@ -1376,13 +1431,16 @@ STARTDOCSYMS      "##"
                            docBlock += yytext;
                          }
                        }
-    [^"'\n \t]+          {
+    [^"'\n \t\\]+       {
                          docBlock += yytext;
                         }
     \n                 {
                          incLineNr();
                          docBlock += yytext;
                        }
+    \\.                        { // espaced char
+                         docBlock += yytext;
+                       }
     .                  {
                          docBlock += yytext;
                        }
index 8b41caa..5a80b19 100644 (file)
@@ -37,6 +37,7 @@ RefList::RefList(const char *listName,
   m_dictIterator = 0;
   m_id = 0;
   m_listName = listName;
+  m_fileName = convertNameToFile(listName,FALSE,TRUE);
   m_pageTitle = pageTitle;
   m_secTitle = secTitle;
 }
@@ -99,6 +100,11 @@ QCString RefList::listName() const
   return m_listName;
 }
 
+QCString RefList::fileName() const
+{
+  return m_fileName;
+}
+
 QCString RefList::pageTitle() const
 {
   return m_pageTitle;
@@ -147,9 +153,12 @@ void RefList::generatePage()
     doc += "\n";
     if (item->scope)
     {
-      doc += "\\_setscope ";
-      doc += item->scope->name();
-      doc += " ";
+      if (item->scope->name() != "<globalScope>")
+      {
+        doc += "\\_setscope ";
+        doc += item->scope->name();
+        doc += " ";
+      }
     }
     doc += item->prefix;
     doc += " \\_internalref ";
@@ -174,6 +183,6 @@ void RefList::generatePage()
   }
   doc += "</dl>\n";
   //printf("generatePage('%s')\n",doc.data());
-  addRelatedPage(m_listName,m_pageTitle,doc,0,m_listName,1,0,0,0);
+  addRelatedPage(m_listName,m_pageTitle,doc,0,m_fileName,1,0,0,0);
 }
 
index 0d40e80..d064c58 100644 (file)
@@ -72,6 +72,7 @@ class RefList
     RefItem *getFirstRefItem();
     RefItem *getNextRefItem();
     QCString listName() const;
+    QCString fileName() const;
     QCString pageTitle() const;
     QCString sectionTitle() const;
 
@@ -85,6 +86,7 @@ class RefList
   private:
     int m_id;
     QCString m_listName;
+    QCString m_fileName;
     QCString m_pageTitle;
     QCString m_secTitle;
     SortedRefItems *m_itemList;
index 220202c..57b3e37 100644 (file)
@@ -47,13 +47,13 @@ class ResourceMgr
     /** Copies a registered resource to a given target directory under a given target name */
     bool copyResourceAs(const char *name,const char *targetDir,const char *targetName) const;
 
-    /** Returns a pointer to the resource object with the given name. */
-    const Resource *get(const char *name) const;
-
     /** Gets the resource data as a C string */
     QCString getAsString(const char *name) const;
 
   private:
+    /** Returns a pointer to the resource object with the given name. */
+    const Resource *get(const char *name) const;
+
     ResourceMgr();
    ~ResourceMgr();
     class Private;
index 7baaa3c..749f57b 100644 (file)
@@ -541,6 +541,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
   bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
   bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");  
   static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
+  static QCString projectName = Config_getString("PROJECT_NAME");
 
   switch (is)
   {
@@ -549,7 +550,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
         // User has overridden document title in extensions file
         t << "}" << rtf_title;
       else
-        t << "}" << Config_getString("PROJECT_NAME");
+        t << "}" << projectName;
       break;
     case isTitlePageAuthor:
       {
@@ -578,7 +579,17 @@ void RTFGenerator::endIndexSection(IndexSections is)
         }
 
         t << rtf_Style_Reset << rtf_Style["Title"]->reference << endl; // set to title style
-        t << "{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt TITLE}}\\par" << endl;
+        if (rtf_title)
+          // User has overridden document title in extensions file
+          t << "{\\field\\fldedit {\\*\\fldinst " << rtf_title << " \\\\*MERGEFORMAT}{\\fldrslt " << rtf_title << "}}\\par" << endl;
+        else
+        {
+          DocText *root = validatingParseText(projectName);
+          t << "{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt ";
+          writeDoc(root,0,0);
+          t << "}}\\par" << endl;
+          
+        }
 
         t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to title style
         t << "\\par\n";
@@ -593,10 +604,14 @@ void RTFGenerator::endIndexSection(IndexSections is)
         t << "\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\n";
 
         t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to subtitle style
-        t << "{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt AUTHOR}}\\par" << endl;
-        t << "Version " << Config_getString("PROJECT_NUMBER") << "\\par";
+        if (rtf_author)
+          t << "{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt "<< rtf_author << " }}\\par" << endl;
+        else
+          t << "{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt AUTHOR}}\\par" << endl;
+
+        t << theTranslator->trVersion() << " " << Config_getString("PROJECT_NUMBER") << "\\par";
         t << "{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}"
-          "{\\fldrslt CREATEDATE}}\\par"<<endl;
+          "{\\fldrslt "<< dateToString(FALSE) << " }}\\par"<<endl;
         t << "\\page\\page";
         DBG_RTF(t << "{\\comment End title page}" << endl)
 
@@ -2363,7 +2378,7 @@ static bool preProcessFile(QDir &d,QCString &infName, FTextStream &t, bool bIncl
   // files because the first line before the body
   // ALWAYS contains "{\comment begin body}"
   int len;
-  do
+  for(;;)
   {
     lineBuf.resize(maxLineLength);
     if ((len=f.readLine(lineBuf.rawData(),maxLineLength))==-1)
@@ -2372,8 +2387,9 @@ static bool preProcessFile(QDir &d,QCString &infName, FTextStream &t, bool bIncl
       return FALSE;
     }
     lineBuf.resize(len+1);
+    if (lineBuf.find("\\comment begin body")!=-1) break;
     if (bIncludeHeader) encodeForOutput(t,lineBuf.data());
-  } while (lineBuf.find("\\comment begin body")==-1);
+  }
 
 
   lineBuf.resize(maxLineLength);
@@ -2590,6 +2606,7 @@ bool RTFGenerator::preProcessFileInplace(const char *path,const char *name)
   if (!outf.open(IO_WriteOnly))
   {
     err("Failed to open %s for writing!\n",combinedName.data());
+    QDir::setCurrent(oldDir);
     return FALSE;
   }
   FTextStream outt(&outf);
@@ -2680,6 +2697,7 @@ void RTFGenerator::startSimpleSect(SectionTypes,const char *file,const char *anc
 void RTFGenerator::endSimpleSect()
 {
   DBG_RTF(t << "{\\comment (endSimpleSect)}"    << endl)
+  m_omitParagraph = FALSE;
   newParagraph();
   decrementIndentLevel();
   m_omitParagraph = TRUE;
index 328dc3f..fc6dc84 100644 (file)
@@ -75,6 +75,7 @@ static int              lastCSConstraint;
 static int              lastHereDocContext;
 static int              lastDefineContext;
 static int              lastAlignAsContext;
+static int              lastC11AttributeContext;
 static Protection      protection;
 static Protection      baseProt;
 static int             sharpCount   = 0 ;
@@ -668,6 +669,7 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
 %x      SkipPHPString
 %x     SkipInits
 %x     SkipC11Inits
+%x      SkipC11Attribute
 %x     SkipCPP
 %x     SkipCPPBlock
 %x     SkipComment
@@ -2431,6 +2433,7 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                             }
                                            else
                                             {
+                                             externC=FALSE; // see bug759247
                                              BEGIN(FindMembers);
                                             }
                                          }
@@ -3417,6 +3420,7 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                          {
                                            current->args += yytext ;
                                            squareCount=1;
+                                           externC=FALSE; // see bug759247
                                            BEGIN( Array ) ;
                                          }
                                        }
@@ -4089,6 +4093,7 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                          current_root->addSubEntry( current ) ;
                                          current=new Entry;
                                          initEntry();
+                                         language = current->lang = SrcLangExt_Cpp; // see bug746361
                                          insideObjC=FALSE;
                                          BEGIN( FindMembers ); 
                                        }
@@ -5022,6 +5027,9 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                             BEGIN(SkipInits);
                                           }
                                         }
+<SkipC11Attribute>"]]"                 {
+                                          BEGIN(lastC11AttributeContext);
+                                        }
 <SkipInits>"{"                         { // C++11 style initializer
                                          unput('{');
                                          BEGIN( Function );
@@ -5125,7 +5133,7 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                          //addToBody(yytext);
                                          BEGIN( SkipCurlyCpp );
                                        }
-<SkipCurly,SkipC11Inits,SkipInits>\n   {
+<SkipCurly,SkipC11Inits,SkipInits,SkipC11Attribute>\n  {
                                           lineCount();
                                          //addToBody(yytext);
                                        }
@@ -5154,22 +5162,22 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                          //addToBody(yytext);
                                           lineCount();
                                        }
-<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp>"/*"    {
+<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,SkipC11Attribute>"/*"   {
                                          //addToBody(yytext);
                                          lastCContext = YY_START;
                                          BEGIN(SkipComment);
                                        }
-<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp>"//"  {
+<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,SkipC11Attribute>"//"  {
                                          //addToBody(yytext);
                                          lastCContext = YY_START;
                                          BEGIN(SkipCxxComment);
                                        }
-<SkipInits,SkipC11Inits>"("             {
+<SkipInits,SkipC11Inits,SkipC11Attribute>"("             {
                                           roundCount=0;
                                           lastSkipRoundContext=YY_START;
                                           BEGIN(SkipRound);
                                         }
-<SkipInits,SkipC11Inits>\"             {
+<SkipInits,SkipC11Inits,SkipC11Attribute>\"            {
                                          lastStringContext=YY_START;
                                          BEGIN( SkipString ); 
                                        }
@@ -5204,7 +5212,7 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                            BEGIN(SkipPHPString);
                                          }
                                        }
-<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp>.       { }
+<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,SkipC11Attribute>.      { }
 <SkipString,SkipPHPString>\\.          { }
 <SkipString>\"                         { 
                                          BEGIN( lastStringContext ); 
@@ -5325,8 +5333,8 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                          }
                                        }
 <ClassTemplSpec>"<"                    {
-                                         current->name += yytext;
-                                         sharpCount++;
+                                         current->name += yytext;
+                                         if (roundCount==0) sharpCount++;
                                        }
 <ClassTemplSpec>.                      {
                                          current->name += yytext;
@@ -5375,6 +5383,11 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                          unput(';');
                                          current->reset();
                                          initEntry();
+                                          if (insideObjC) // see bug746361
+                                          {
+                                           language = current->lang = SrcLangExt_Cpp;
+                                            insideObjC = FALSE;
+                                          }
                                          if (isTypedef) // typedef of a class, put typedef keyword back
                                          {
                                            current->type.prepend("typedef");
@@ -5999,7 +6012,7 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                        }
 <Comment>.                             { current->program += *yytext ; }
 
-<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,SkipC11Inits,Bases,OldStyleArgs>("//"{B}*)?"/*!" { 
+<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,SkipC11Inits,SkipC11Attribute,Bases,OldStyleArgs>("//"{B}*)?"/*!" { 
                                          //printf("Start doc block at %d\n",yyLineNr);
                                          removeSlashes=(yytext[1]=='/');
                                          tmpDocType=-1;
@@ -6272,14 +6285,14 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                          BEGIN(DocCopyBlock);
                                        }
 <DocBlock>^({B}*"*"+)?{B}{0,3}"~~~"[~]*                {
-                                          docBlock+=yytext;
+                                          docBlock+=substitute(yytext,"*"," ");
                                           docBlockName="~~~";
                                           g_fencedSize=yyleng;
                                           g_nestedComment=FALSE;
                                           BEGIN(DocCopyBlock);
                                         }
 <DocBlock>^({B}*"*"+)?{B}{0,3}"```"[`]*                {
-                                          docBlock+=yytext;
+                                          docBlock+=substitute(yytext,"*"," ");
                                           docBlockName="```";
                                           g_fencedSize=yyleng;
                                           g_nestedComment=FALSE;
@@ -6397,14 +6410,14 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                          }
                                        }
 <DocCopyBlock>^({B}*"*"+)?{B}{0,3}"~~~"[~]* {
-                                          docBlock+=yytext;
+                                          docBlock+=substitute(yytext,"*"," ");
                                           if (g_fencedSize==yyleng)
                                           {
                                             BEGIN(DocBlock);
                                           }
                                         }
 <DocCopyBlock>^({B}*"*"+)?{B}{0,3}"```"[`]*                 {
-                                          docBlock+=yytext;
+                                          docBlock+=substitute(yytext,"*"," ");
                                           if (g_fencedSize==yyleng)
                                           {
                                             BEGIN(DocBlock);
@@ -6528,6 +6541,12 @@ OPERATOR  "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
                                          BEGIN( lastCContext ) ;
                                        }
 <SkipComment>[^\*\n]+
+
+"[["                                    { // C++11 attribute
+                                          lastC11AttributeContext = YY_START;
+                                          BEGIN( SkipC11Attribute );
+                                        }
+
 <*>\n                                  { lineCount(); }
 <*>\"                                  {
                                          if (insideIDL && insideCppQuote)
@@ -6749,7 +6768,7 @@ static void parseCompounds(Entry *rt)
 
       // deep copy group list from parent (see bug 727732)
       static bool autoGroupNested = Config_getBool("GROUP_NESTED_COMPOUNDS");
-      if (rt->groups && ce->section!=Entry::ENUM_SEC && !(ce->spec&Entry::Enum))
+      if (autoGroupNested && rt->groups && ce->section!=Entry::ENUM_SEC && !(ce->spec&Entry::Enum))
       {
         QListIterator<Grouping> gli(*rt->groups);
         Grouping *g;
index ee545bf..9bfe7b0 100644 (file)
@@ -583,70 +583,9 @@ void SearchIndexExternal::write(const char *fileName)
 #include "doxygen.h"
 #include "message.h"
 
-//static const char search_script[]=
-//#include "search.js.h"
-//;
-
-#define SEARCH_INDEX_ALL         0
-#define SEARCH_INDEX_CLASSES     1
-#define SEARCH_INDEX_NAMESPACES  2
-#define SEARCH_INDEX_FILES       3
-#define SEARCH_INDEX_FUNCTIONS   4
-#define SEARCH_INDEX_VARIABLES   5
-#define SEARCH_INDEX_TYPEDEFS    6
-#define SEARCH_INDEX_ENUMS       7
-#define SEARCH_INDEX_ENUMVALUES  8
-#define SEARCH_INDEX_PROPERTIES  9
-#define SEARCH_INDEX_EVENTS     10
-#define SEARCH_INDEX_RELATED    11
-#define SEARCH_INDEX_DEFINES    12
-#define SEARCH_INDEX_GROUPS     13
-#define SEARCH_INDEX_PAGES      14
-#define NUM_SEARCH_INDICES      15
-
-class SearchDefinitionList : public QList<Definition>
-{
-  public:
-    SearchDefinitionList(uint letter) : m_letter(letter) {}
-    uint letter() const { return m_letter; }
-  private:
-    uint m_letter;
-};
+static SearchIndexInfo g_searchIndexInfo[NUM_SEARCH_INDICES];
 
-class SearchIndexList : public SDict< SearchDefinitionList >
-{
-  public:
-    typedef Definition ElementType;
-    SearchIndexList(uint letter) : SDict<SearchDefinitionList>(17,FALSE), m_letter(letter)
-    {
-      setAutoDelete(TRUE);
-    }
-   ~SearchIndexList() {}
-    void append(Definition *d)
-    {
-      SearchDefinitionList *l = find(d->name());
-      if (l==0)
-      {
-        l=new SearchDefinitionList(m_letter);
-        SDict<SearchDefinitionList>::append(d->name(),l);
-      }
-      l->append(d);
-    }
-    uint letter() const { return m_letter; }
-  private:
-    int compareValues(const SearchDefinitionList *md1, const SearchDefinitionList *md2) const
-    {
-      QCString n1 = md1->getFirst()->localName();
-      QCString n2 = md2->getFirst()->localName();
-      return qstricmp(n1.data(),n2.data());
-    }
-    uint m_letter;
-};
-
-static void addMemberToSearchIndex(
-         LetterToIndexMap<SearchIndexList> symbols[NUM_SEARCH_INDICES],
-         int symbolCount[NUM_SEARCH_INDICES],
-         MemberDef *md)
+static void addMemberToSearchIndex(MemberDef *md)
 {
   static bool hideFriendCompounds = Config_getBool("HIDE_FRIEND_COMPOUNDS");
   bool isLinkable = md->isLinkable();
@@ -654,7 +593,7 @@ static void addMemberToSearchIndex(
   NamespaceDef *nd=0;
   FileDef *fd=0;
   GroupDef *gd=0;
-  if (isLinkable && 
+  if (isLinkable &&
       (
        ((cd=md->getClassDef()) && cd->isLinkable() && cd->templateMaster()==0) ||
        ((gd=md->getGroupDef()) && gd->isLinkable())
@@ -662,58 +601,49 @@ static void addMemberToSearchIndex(
      )
   {
     QCString n = md->name();
-    if (!n.isEmpty()) 
+    if (!n.isEmpty())
     {
       uint letter = getUtf8CodeToLower(n,0);
       bool isFriendToHide = hideFriendCompounds &&
-        (QCString(md->typeString())=="friend class" || 
+        (QCString(md->typeString())=="friend class" ||
          QCString(md->typeString())=="friend struct" ||
          QCString(md->typeString())=="friend union");
       if (!(md->isFriend() && isFriendToHide))
       {
-        symbols[SEARCH_INDEX_ALL].append(letter,md);
-        symbolCount[SEARCH_INDEX_ALL]++;
+        g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,md);
       }
       if (md->isFunction() || md->isSlot() || md->isSignal())
       {
-        symbols[SEARCH_INDEX_FUNCTIONS].append(letter,md);
-        symbolCount[SEARCH_INDEX_FUNCTIONS]++;
-      } 
+        g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].symbolList.append(letter,md);
+      }
       else if (md->isVariable())
       {
-        symbols[SEARCH_INDEX_VARIABLES].append(letter,md);
-        symbolCount[SEARCH_INDEX_VARIABLES]++;
+        g_searchIndexInfo[SEARCH_INDEX_VARIABLES].symbolList.append(letter,md);
       }
       else if (md->isTypedef())
       {
-        symbols[SEARCH_INDEX_TYPEDEFS].append(letter,md);
-        symbolCount[SEARCH_INDEX_TYPEDEFS]++;
+        g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].symbolList.append(letter,md);
       }
       else if (md->isEnumerate())
       {
-        symbols[SEARCH_INDEX_ENUMS].append(letter,md);
-        symbolCount[SEARCH_INDEX_ENUMS]++;
+        g_searchIndexInfo[SEARCH_INDEX_ENUMS].symbolList.append(letter,md);
       }
       else if (md->isEnumValue())
       {
-        symbols[SEARCH_INDEX_ENUMVALUES].append(letter,md);
-        symbolCount[SEARCH_INDEX_ENUMVALUES]++;
+        g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].symbolList.append(letter,md);
       }
       else if (md->isProperty())
       {
-        symbols[SEARCH_INDEX_PROPERTIES].append(letter,md);
-        symbolCount[SEARCH_INDEX_PROPERTIES]++;
+        g_searchIndexInfo[SEARCH_INDEX_PROPERTIES].symbolList.append(letter,md);
       }
       else if (md->isEvent())
       {
-        symbols[SEARCH_INDEX_EVENTS].append(letter,md);
-        symbolCount[SEARCH_INDEX_EVENTS]++;
+        g_searchIndexInfo[SEARCH_INDEX_EVENTS].symbolList.append(letter,md);
       }
       else if (md->isRelated() || md->isForeign() ||
                (md->isFriend() && !isFriendToHide))
       {
-        symbols[SEARCH_INDEX_RELATED].append(letter,md);
-        symbolCount[SEARCH_INDEX_RELATED]++;
+        g_searchIndexInfo[SEARCH_INDEX_RELATED].symbolList.append(letter,md);
       }
     }
   }
@@ -727,38 +657,31 @@ static void addMemberToSearchIndex(
     if (!n.isEmpty()) 
     {
       uint letter = getUtf8CodeToLower(n,0);
-      symbols[SEARCH_INDEX_ALL].append(letter,md);
-      symbolCount[SEARCH_INDEX_ALL]++;
+      g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,md);
 
       if (md->isFunction()) 
       {
-        symbols[SEARCH_INDEX_FUNCTIONS].append(letter,md);
-        symbolCount[SEARCH_INDEX_FUNCTIONS]++;
+        g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].symbolList.append(letter,md);
       }
       else if (md->isVariable()) 
       {
-        symbols[SEARCH_INDEX_VARIABLES].append(letter,md);
-        symbolCount[SEARCH_INDEX_VARIABLES]++;
+        g_searchIndexInfo[SEARCH_INDEX_VARIABLES].symbolList.append(letter,md);
       }
       else if (md->isTypedef())
       {
-        symbols[SEARCH_INDEX_TYPEDEFS].append(letter,md);
-        symbolCount[SEARCH_INDEX_TYPEDEFS]++;
+        g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].symbolList.append(letter,md);
       }
       else if (md->isEnumerate())
       {
-        symbols[SEARCH_INDEX_ENUMS].append(letter,md);
-        symbolCount[SEARCH_INDEX_ENUMS]++;
+        g_searchIndexInfo[SEARCH_INDEX_ENUMS].symbolList.append(letter,md);
       }
       else if (md->isEnumValue())
       {
-        symbols[SEARCH_INDEX_ENUMVALUES].append(letter,md);
-        symbolCount[SEARCH_INDEX_ENUMVALUES]++;
+        g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].symbolList.append(letter,md);
       }
       else if (md->isDefine())
       {
-        symbols[SEARCH_INDEX_DEFINES].append(letter,md);
-        symbolCount[SEARCH_INDEX_DEFINES]++;
+        g_searchIndexInfo[SEARCH_INDEX_DEFINES].symbolList.append(letter,md);
       }
     }
   }
@@ -792,55 +715,43 @@ static QCString searchId(const QCString &s)
   return result;
 }
 
-static int g_searchIndexCount[NUM_SEARCH_INDICES];
-static LetterToIndexMap<SearchIndexList> g_searchIndexSymbols[NUM_SEARCH_INDICES];
-static const char *g_searchIndexName[NUM_SEARCH_INDICES] = 
-{ 
-    "all",
-    "classes",
-    "namespaces",
-    "files",
-    "functions",
-    "variables",
-    "typedefs", 
-    "enums", 
-    "enumvalues",
-    "properties", 
-    "events", 
-    "related",
-    "defines",
-    "groups",
-    "pages"
-};
-
-
-class SearchIndexCategoryMapping
+void createJavascriptSearchIndex()
 {
-  public:
-    SearchIndexCategoryMapping()
-    {
-      categoryLabel[SEARCH_INDEX_ALL]        = theTranslator->trAll();
-      categoryLabel[SEARCH_INDEX_CLASSES]    = theTranslator->trClasses();
-      categoryLabel[SEARCH_INDEX_NAMESPACES] = theTranslator->trNamespace(TRUE,FALSE);
-      categoryLabel[SEARCH_INDEX_FILES]      = theTranslator->trFile(TRUE,FALSE);
-      categoryLabel[SEARCH_INDEX_FUNCTIONS]  = theTranslator->trFunctions();
-      categoryLabel[SEARCH_INDEX_VARIABLES]  = theTranslator->trVariables();
-      categoryLabel[SEARCH_INDEX_TYPEDEFS]   = theTranslator->trTypedefs();
-      categoryLabel[SEARCH_INDEX_ENUMS]      = theTranslator->trEnumerations();
-      categoryLabel[SEARCH_INDEX_ENUMVALUES] = theTranslator->trEnumerationValues();
-      categoryLabel[SEARCH_INDEX_PROPERTIES] = theTranslator->trProperties();
-      categoryLabel[SEARCH_INDEX_EVENTS]     = theTranslator->trEvents();
-      categoryLabel[SEARCH_INDEX_RELATED]    = theTranslator->trFriends();
-      categoryLabel[SEARCH_INDEX_DEFINES]    = theTranslator->trDefines();
-      categoryLabel[SEARCH_INDEX_GROUPS]     = theTranslator->trGroup(TRUE,FALSE);
-      categoryLabel[SEARCH_INDEX_PAGES]      = theTranslator->trPage(TRUE,FALSE);
-    }
-    QCString categoryLabel[NUM_SEARCH_INDICES];
-};
-
-void writeJavascriptSearchIndex()
-{
-  if (!Config_getBool("GENERATE_HTML")) return;
+  // set index names
+  g_searchIndexInfo[SEARCH_INDEX_ALL].name        = "all";
+  g_searchIndexInfo[SEARCH_INDEX_CLASSES].name    = "classes";
+  g_searchIndexInfo[SEARCH_INDEX_NAMESPACES].name = "namespaces";
+  g_searchIndexInfo[SEARCH_INDEX_FILES].name      = "files";
+  g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].name  = "functions";
+  g_searchIndexInfo[SEARCH_INDEX_VARIABLES].name  = "variables";
+  g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].name   = "typedefs";
+  g_searchIndexInfo[SEARCH_INDEX_ENUMS].name      = "enums";
+  g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].name = "enumvalues";
+  g_searchIndexInfo[SEARCH_INDEX_PROPERTIES].name = "properties";
+  g_searchIndexInfo[SEARCH_INDEX_EVENTS].name     = "events";
+  g_searchIndexInfo[SEARCH_INDEX_RELATED].name    = "related";
+  g_searchIndexInfo[SEARCH_INDEX_DEFINES].name    = "defines";
+  g_searchIndexInfo[SEARCH_INDEX_GROUPS].name     = "groups";
+  g_searchIndexInfo[SEARCH_INDEX_PAGES].name      = "pages";
+
+  // set index texts
+  g_searchIndexInfo[SEARCH_INDEX_ALL].text        = theTranslator->trAll();
+  g_searchIndexInfo[SEARCH_INDEX_CLASSES].text    = theTranslator->trClasses();
+  g_searchIndexInfo[SEARCH_INDEX_NAMESPACES].text = theTranslator->trNamespace(TRUE,FALSE);
+  g_searchIndexInfo[SEARCH_INDEX_FILES].text      = theTranslator->trFile(TRUE,FALSE);
+  g_searchIndexInfo[SEARCH_INDEX_FUNCTIONS].text  = theTranslator->trFunctions();
+  g_searchIndexInfo[SEARCH_INDEX_VARIABLES].text  = theTranslator->trVariables();
+  g_searchIndexInfo[SEARCH_INDEX_TYPEDEFS].text   = theTranslator->trTypedefs();
+  g_searchIndexInfo[SEARCH_INDEX_ENUMS].text      = theTranslator->trEnumerations();
+  g_searchIndexInfo[SEARCH_INDEX_ENUMVALUES].text = theTranslator->trEnumerationValues();
+  g_searchIndexInfo[SEARCH_INDEX_PROPERTIES].text = theTranslator->trProperties();
+  g_searchIndexInfo[SEARCH_INDEX_EVENTS].text     = theTranslator->trEvents();
+  g_searchIndexInfo[SEARCH_INDEX_RELATED].text    = theTranslator->trFriends();
+  g_searchIndexInfo[SEARCH_INDEX_DEFINES].text    = theTranslator->trDefines();
+  g_searchIndexInfo[SEARCH_INDEX_GROUPS].text     = theTranslator->trGroup(TRUE,FALSE);
+  g_searchIndexInfo[SEARCH_INDEX_PAGES].text      = theTranslator->trPage(TRUE,FALSE);
+
+  // add symbols to letter -> symbol list map
 
   // index classes
   ClassSDict::Iterator cli(*Doxygen::classSDict);
@@ -850,10 +761,8 @@ void writeJavascriptSearchIndex()
     uint letter = getUtf8CodeToLower(cd->localName(),0);
     if (cd->isLinkable() && isId(letter))
     {
-      g_searchIndexSymbols[SEARCH_INDEX_ALL].append(letter,cd);
-      g_searchIndexSymbols[SEARCH_INDEX_CLASSES].append(letter,cd);
-      g_searchIndexCount[SEARCH_INDEX_ALL]++;
-      g_searchIndexCount[SEARCH_INDEX_CLASSES]++;
+      g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,cd);
+      g_searchIndexInfo[SEARCH_INDEX_CLASSES].symbolList.append(letter,cd);
     }
   }
 
@@ -865,10 +774,8 @@ void writeJavascriptSearchIndex()
     uint letter = getUtf8CodeToLower(nd->name(),0);
     if (nd->isLinkable() && isId(letter))
     {
-      g_searchIndexSymbols[SEARCH_INDEX_ALL].append(letter,nd);
-      g_searchIndexSymbols[SEARCH_INDEX_NAMESPACES].append(letter,nd);
-      g_searchIndexCount[SEARCH_INDEX_ALL]++;
-      g_searchIndexCount[SEARCH_INDEX_NAMESPACES]++;
+      g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,nd);
+      g_searchIndexInfo[SEARCH_INDEX_NAMESPACES].symbolList.append(letter,nd);
     }
   }
 
@@ -884,10 +791,8 @@ void writeJavascriptSearchIndex()
       uint letter = getUtf8CodeToLower(fd->name(),0);
       if (fd->isLinkable() && isId(letter))
       {
-        g_searchIndexSymbols[SEARCH_INDEX_ALL].append(letter,fd);
-        g_searchIndexSymbols[SEARCH_INDEX_FILES].append(letter,fd);
-        g_searchIndexCount[SEARCH_INDEX_ALL]++;
-        g_searchIndexCount[SEARCH_INDEX_FILES]++;
+        g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,fd);
+        g_searchIndexInfo[SEARCH_INDEX_FILES].symbolList.append(letter,fd);
       }
     }
   }
@@ -904,7 +809,7 @@ void writeJavascriptSearchIndex()
       // for each member definition
       for (mni.toFirst();(md=mni.current());++mni)
       {
-        addMemberToSearchIndex(g_searchIndexSymbols,g_searchIndexCount,md);
+        addMemberToSearchIndex(md);
       }
     }
   }
@@ -921,7 +826,7 @@ void writeJavascriptSearchIndex()
       // for each member definition
       for (mni.toFirst();(md=mni.current());++mni)
       {
-        addMemberToSearchIndex(g_searchIndexSymbols,g_searchIndexCount,md);
+        addMemberToSearchIndex(md);
       }
     }
   }
@@ -940,10 +845,8 @@ void writeJavascriptSearchIndex()
         uint letter = charCode<128 ? tolower(charCode) : charCode;
         if (isId(letter))
         {
-          g_searchIndexSymbols[SEARCH_INDEX_ALL].append(letter,gd);
-          g_searchIndexSymbols[SEARCH_INDEX_GROUPS].append(letter,gd);
-          g_searchIndexCount[SEARCH_INDEX_ALL]++;
-          g_searchIndexCount[SEARCH_INDEX_GROUPS]++;
+          g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,gd);
+          g_searchIndexInfo[SEARCH_INDEX_GROUPS].symbolList.append(letter,gd);
         }
       }
     }
@@ -963,10 +866,8 @@ void writeJavascriptSearchIndex()
         uint letter = charCode<128 ? tolower(charCode) : charCode;
         if (isId(letter))
         {
-          g_searchIndexSymbols[SEARCH_INDEX_ALL].append(letter,pd);
-          g_searchIndexSymbols[SEARCH_INDEX_PAGES].append(letter,pd);
-          g_searchIndexCount[SEARCH_INDEX_ALL]++;
-          g_searchIndexCount[SEARCH_INDEX_PAGES]++;
+          g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,pd);
+          g_searchIndexInfo[SEARCH_INDEX_PAGES].symbolList.append(letter,pd);
         }
       }
     }
@@ -980,38 +881,40 @@ void writeJavascriptSearchIndex()
       uint letter = charCode<128 ? tolower(charCode) : charCode;
       if (isId(letter))
       {
-        g_searchIndexSymbols[SEARCH_INDEX_ALL].append(letter,Doxygen::mainPage);
-        g_searchIndexSymbols[SEARCH_INDEX_PAGES].append(letter,Doxygen::mainPage);
-        g_searchIndexCount[SEARCH_INDEX_ALL]++;
-        g_searchIndexCount[SEARCH_INDEX_PAGES]++;
+        g_searchIndexInfo[SEARCH_INDEX_ALL].symbolList.append(letter,Doxygen::mainPage);
+        g_searchIndexInfo[SEARCH_INDEX_PAGES].symbolList.append(letter,Doxygen::mainPage);
       }
     }
   }
-  
+
   // sort all lists
   int i;
   for (i=0;i<NUM_SEARCH_INDICES;i++)
   {
-    SIntDict<SearchIndexList>::Iterator it(g_searchIndexSymbols[i]);
+    SIntDict<SearchIndexList>::Iterator it(g_searchIndexInfo[i].symbolList);
     SearchIndexList *sl;
     for (it.toFirst();(sl=it.current());++it)
     {
       sl->sort();
     }
   }
+}
 
+void writeJavascriptSearchIndex()
+{
+  int i;
   // write index files
   QCString searchDirName = Config_getString("HTML_OUTPUT")+"/search";
 
   for (i=0;i<NUM_SEARCH_INDICES;i++) // for each index
   {
-    SIntDict<SearchIndexList>::Iterator it(g_searchIndexSymbols[i]);
+    SIntDict<SearchIndexList>::Iterator it(g_searchIndexInfo[i].symbolList);
     SearchIndexList *sl;
     int p=0;
     for (it.toFirst();(sl=it.current());++it,++p) // for each letter
     {
       QCString baseName;
-      baseName.sprintf("%s_%x",g_searchIndexName[i],p);
+      baseName.sprintf("%s_%x",g_searchIndexInfo[i].name.data(),p);
 
       QCString fileName = searchDirName + "/"+baseName+".html";
       QCString dataFileName = searchDirName + "/"+baseName+".js";
@@ -1083,17 +986,7 @@ void writeJavascriptSearchIndex()
           }
           firstEntry=FALSE;
 
-          QCString dispName = d->localName();
-          if (d->definitionType()==Definition::TypeGroup)
-          {
-            dispName = ((GroupDef*)d)->groupTitle();
-          }
-          else if (d->definitionType()==Definition::TypePage)
-          {
-            dispName = ((PageDef*)d)->title();
-          }
-          ti << "  ['" << searchId(dispName) << "',['" 
-            << convertToXML(dispName) << "',[";
+          ti << "  ['" << dl->id() << "',['" << convertToXML(dl->name()) << "',[";
 
           if (dl->count()==1) // item with a unique name
           {
@@ -1274,12 +1167,12 @@ void writeJavascriptSearchIndex()
       int j=0;
       for (i=0;i<NUM_SEARCH_INDICES;i++)
       {
-        if (g_searchIndexCount[i]>0)
+        if (g_searchIndexInfo[i].symbolList.count()>0)
         {
           if (!first) t << "," << endl;
           t << "  " << j << ": \"";
 
-          SIntDict<SearchIndexList>::Iterator it(g_searchIndexSymbols[i]);
+          SIntDict<SearchIndexList>::Iterator it(g_searchIndexInfo[i].symbolList);
           SearchIndexList *sl;
           for (it.toFirst();(sl=it.current());++it) // for each letter
           {
@@ -1298,10 +1191,10 @@ void writeJavascriptSearchIndex()
       j=0;
       for (i=0;i<NUM_SEARCH_INDICES;i++)
       {
-        if (g_searchIndexCount[i]>0)
+        if (g_searchIndexInfo[i].symbolList.count()>0)
         {
           if (!first) t << "," << endl;
-          t << "  " << j << ": \"" << g_searchIndexName[i] << "\"";
+          t << "  " << j << ": \"" << g_searchIndexInfo[i].name << "\"";
           first=FALSE;
           j++;
         }
@@ -1311,14 +1204,13 @@ void writeJavascriptSearchIndex()
       t << "var indexSectionLabels =" << endl;
       t << "{" << endl;
       first=TRUE;
-      static SearchIndexCategoryMapping map;
       j=0;
       for (i=0;i<NUM_SEARCH_INDICES;i++)
       {
-        if (g_searchIndexCount[i]>0)
+        if (g_searchIndexInfo[i].symbolList.count()>0)
         {
           if (!first) t << "," << endl;
-          t << "  " << j << ": \"" << convertToXML(map.categoryLabel[i]) << "\"";
+          t << "  " << j << ": \"" << convertToXML(g_searchIndexInfo[i].text) << "\"";
           first=FALSE;
           j++;
         }
@@ -1352,6 +1244,55 @@ void writeJavascriptSearchIndex()
   Doxygen::indexList->addStyleSheetFile("search/search.js");
 }
 
+const SearchIndexInfo *getSearchIndices()
+{
+  return g_searchIndexInfo;
+}
+
+//---------------------------------------------------------------------------------------------
+
+SearchIndexList::SearchIndexList(uint letter)
+  : SDict< SearchDefinitionList >(17,FALSE), m_letter(letter)
+{
+  setAutoDelete(TRUE);
+}
+
+SearchIndexList::~SearchIndexList()
+{
+}
+
+void SearchIndexList::append(Definition *d)
+{
+  SearchDefinitionList *l = find(d->name());
+  if (l==0)
+  {
+    QCString dispName = d->localName();
+    if (d->definitionType()==Definition::TypeGroup)
+    {
+      dispName = ((GroupDef*)d)->groupTitle();
+    }
+    else if (d->definitionType()==Definition::TypePage)
+    {
+      dispName = ((PageDef*)d)->title();
+    }
+    l=new SearchDefinitionList(searchId(dispName),dispName);
+    SDict< SearchDefinitionList >::append(d->name(),l);
+  }
+  l->append(d);
+}
+
+uint SearchIndexList::letter() const
+{
+  return m_letter;
+}
+
+int SearchIndexList::compareValues(const SearchDefinitionList *md1, const SearchDefinitionList *md2) const
+{
+  QCString n1 = md1->getFirst()->localName();
+  QCString n2 = md2->getFirst()->localName();
+  return qstricmp(n1.data(),n2.data());
+}
+
 //---------------------------------------------------------------------------------------------
 
 void initSearchIndexer()
index b9f45c6..e491f47 100644 (file)
@@ -23,6 +23,9 @@
 #include <qdict.h>
 #include <qintdict.h>
 #include <qvector.h>
+#include "sortdict.h"
+#include "definition.h"
+#include "util.h"
 
 class FTextStream;
 class Definition;
@@ -109,6 +112,56 @@ class SearchIndexExternal : public SearchIndexIntf
 
 //------- client side search index ----------------------
 
+#define SEARCH_INDEX_ALL         0
+#define SEARCH_INDEX_CLASSES     1
+#define SEARCH_INDEX_NAMESPACES  2
+#define SEARCH_INDEX_FILES       3
+#define SEARCH_INDEX_FUNCTIONS   4
+#define SEARCH_INDEX_VARIABLES   5
+#define SEARCH_INDEX_TYPEDEFS    6
+#define SEARCH_INDEX_ENUMS       7
+#define SEARCH_INDEX_ENUMVALUES  8
+#define SEARCH_INDEX_PROPERTIES  9
+#define SEARCH_INDEX_EVENTS     10
+#define SEARCH_INDEX_RELATED    11
+#define SEARCH_INDEX_DEFINES    12
+#define SEARCH_INDEX_GROUPS     13
+#define SEARCH_INDEX_PAGES      14
+#define NUM_SEARCH_INDICES      15
+
+class SearchDefinitionList : public QList<Definition>
+{
+  public:
+    SearchDefinitionList(const QCString &id,const QCString &name) : m_id(id), m_name(name) {}
+    QCString id() const   { return m_id;   }
+    QCString name() const { return m_name; }
+  private:
+    QCString m_id;
+    QCString m_name;
+};
+
+class SearchIndexList : public SDict< SearchDefinitionList >
+{
+  public:
+    typedef Definition ElementType;
+    SearchIndexList(uint letter);
+   ~SearchIndexList();
+    void append(Definition *d);
+    uint letter() const;
+  private:
+    int compareValues(const SearchDefinitionList *md1, const SearchDefinitionList *md2) const;
+    uint m_letter;
+};
+
+struct SearchIndexInfo
+{
+  LetterToIndexMap<SearchIndexList> symbolList;
+  QCString name;
+  QCString text;
+};
+
+void createJavascriptSearchIndex();
 void writeJavascriptSearchIndex();
+const SearchIndexInfo *getSearchIndices();
 
 #endif
index 51668a2..b6268a9 100644 (file)
@@ -31,7 +31,8 @@ struct SectionInfo
                      Subsection    = 2, 
                      Subsubsection = 3, 
                      Paragraph     = 4, 
-                     Anchor        = 5 
+                     Anchor        = 5,
+                     Table         = 6
                    };
   SectionInfo(const char *f,const int lin,const char *l,const char *t,
               SectionType st,int lev,const char *r=0) :
diff --git a/src/settings.py b/src/settings.py
deleted file mode 100755 (executable)
index a9dfa13..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-# 
-
-import sys
-import os
-
-f_sqlite3 = sys.argv[1]
-f_libclang = sys.argv[2]
-
-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")
-if (f_sqlite3 != "NO"):
-  f1.write("#define USE_SQLITE3  1\n")
-else:
-  f1.write("#define USE_SQLITE3  0\n")
-
-if (f_libclang != "NO"):
-  f1.write("#define USE_LIBCLANG 1\n")
-else:
-  f1.write("#define USE_LIBCLANG 0\n")
-
-f1.write("\n")
-f1.write("#define IS_SUPPORTED(x) \\\n")
-f1.write("  ((USE_SQLITE3  && strcmp(\"USE_SQLITE3\",(x))==0)  || \\\n")
-f1.write("   (USE_LIBCLANG && strcmp(\"USE_LIBCLANG\",(x))==0) || \\\n")
-f1.write("  0)\n")
-f1.write("\n")
-f1.write("#endif\n")
index 4250f08..527148c 100644 (file)
@@ -98,6 +98,36 @@ static QValueList<QCString> split(const QCString &str,const QCString &sep,
 
 //----------------------------------------------------------------------------
 
+/** Strips spaces surrounding `=` from string \a in, so
+ *  `foo = 10 bar=5 baz= 'hello'` will become `foo=10 bar=5 baz='hello'`
+ */
+static QCString removeSpacesAroundEquals(const char *s)
+{
+  QCString result(s);
+  const char *p=result.data();
+  char *q = result.rawData();
+  char c;
+  while ((c=*p++))
+  {
+    if (c==' ') // found a space, see if there is a = as well
+    {
+      const char *t = p;
+      bool found=FALSE;
+      while (*t==' ' || *t=='=') { if (*t++=='=') found=TRUE; }
+      if (found)
+      {
+        c='=';
+        p=t; // move p to end of '\s*=\s*' sequence
+      }
+    }
+    *q++=c;
+  }
+  if (q<p) result.resize(q-result.data()+1);
+  return result;
+}
+
+//----------------------------------------------------------------------------
+
 #if ENABLE_TRACING
 static QCString replace(const char *s,char csrc,char cdst)
 {
@@ -112,92 +142,38 @@ static QCString replace(const char *s,char csrc,char cdst)
 
 //- TemplateVariant implementation -------------------------------------------
 
-/** @brief Private data of a template variant object */
-class TemplateVariant::Private
-{
-  public:
-    Private(Type t) : type(t), intVal(0), boolVal(TRUE), strukt(0), list(0), raw(FALSE) {}
-    Type                type;
-    int                 intVal;
-    QCString            strVal;
-    bool                boolVal;
-    TemplateStructIntf *strukt;
-    TemplateListIntf   *list;
-    Delegate            delegate;
-    bool                raw;
-};
-
-TemplateVariant::TemplateVariant()
-{
-  p = new Private(None);
-}
-
-TemplateVariant::TemplateVariant(bool b)
-{
-  p = new Private(Bool);
-  p->boolVal = b;
-}
-
-TemplateVariant::TemplateVariant(int v)
-{
-  p = new Private(Integer);
-  p->intVal = v;
-}
-
-TemplateVariant::TemplateVariant(const char *s,bool raw)
-{
-  p = new Private(String);
-  p->strVal = s;
-  p->raw = raw;
-}
-
-TemplateVariant::TemplateVariant(const QCString &s,bool raw)
-{
-  p = new Private(String);
-  p->strVal = s;
-  p->raw = raw;
-}
 
 TemplateVariant::TemplateVariant(TemplateStructIntf *s)
+  : m_type(Struct), m_strukt(s), m_raw(FALSE)
 {
-  p = new Private(Struct);
-  p->strukt = s;
-  p->strukt->addRef();
+  m_strukt->addRef();
 }
 
 TemplateVariant::TemplateVariant(TemplateListIntf *l)
+  : m_type(List), m_list(l), m_raw(FALSE)
 {
-  p = new Private(List);
-  p->list = l;
-  p->list->addRef();
-}
-
-TemplateVariant::TemplateVariant(const TemplateVariant::Delegate &delegate)
-{
-  p = new Private(Function);
-  p->delegate = delegate;
+  m_list->addRef();
 }
 
 TemplateVariant::~TemplateVariant()
 {
-  if (p->type==Struct) p->strukt->release();
-  else if (p->type==List) p->list->release();
-  delete p;
+  if      (m_type==Struct) m_strukt->release();
+  else if (m_type==List)   m_list->release();
 }
 
 TemplateVariant::TemplateVariant(const TemplateVariant &v)
+  : m_type(v.m_type), m_strukt(0), m_raw(FALSE)
 {
-  p = new Private(v.p->type);
-  p->raw     = v.p->raw;
-  switch (p->type)
+  m_raw = v.m_raw;
+  switch (m_type)
   {
     case None: break;
-    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;  p->strukt->addRef(); break;
-    case List:     p->list    = v.p->list;    p->list->addRef();   break;
-    case Function: p->delegate= v.p->delegate;break;
+    case Bool:     m_boolVal = v.m_boolVal; break;
+    case Integer:  m_intVal  = v.m_intVal;  break;
+    case String:   m_strVal  = v.m_strVal;  break;
+    case Struct:   m_strukt  = v.m_strukt;  m_strukt->addRef(); break;
+    case List:     m_list    = v.m_list;    m_list->addRef();   break;
+    case Function: m_delegate= v.m_delegate;break;
   }
 }
 
@@ -205,21 +181,21 @@ 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;
+  TemplateStructIntf *tmpStruct = m_type==Struct ? m_strukt : 0;
+  TemplateListIntf   *tmpList   = m_type==List   ? m_list   : 0;
+  Type tmpType = m_type;
 
-  p->type    = v.p->type;
-  p->raw     = v.p->raw;
-  switch (p->type)
+  m_type    = v.m_type;
+  m_raw     = v.m_raw;
+  switch (m_type)
   {
     case None: break;
-    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;  p->strukt->addRef(); break;
-    case List:     p->list    = v.p->list;    p->list->addRef();   break;
-    case Function: p->delegate= v.p->delegate;break;
+    case Bool:     m_boolVal = v.m_boolVal; break;
+    case Integer:  m_intVal  = v.m_intVal;  break;
+    case String:   m_strVal  = v.m_strVal;  break;
+    case Struct:   m_strukt  = v.m_strukt;  m_strukt->addRef(); break;
+    case List:     m_list    = v.m_list;    m_list->addRef();   break;
+    case Function: m_delegate= v.m_delegate;break;
   }
 
   // release overwritten reference counted values
@@ -228,161 +204,34 @@ TemplateVariant &TemplateVariant::operator=(const TemplateVariant &v)
   return *this;
 }
 
-QCString TemplateVariant::toString() const
-{
-  QCString result;
-  switch (p->type)
-  {
-    case None:
-      break;
-    case Bool:
-      result=p->boolVal ? "true" : "false";
-      break;
-    case Integer:
-      result=QCString().setNum(p->intVal);
-      break;
-    case String:
-      result=p->strVal;
-      break;
-    case Struct:
-      result="[struct]";
-      break;
-    case List:
-      result="[list]";
-      break;
-    case Function:
-      result="[function]";
-      break;
-  }
-  return result;
-}
-
 bool TemplateVariant::toBool() const
 {
-  bool result=FALSE;
-  switch (p->type)
+  switch (m_type)
   {
-    case None:
-      break;
-    case Bool:
-      result = p->boolVal;
-      break;
-    case Integer:
-      result = p->intVal!=0;
-      break;
-    case String:
-      result = !p->strVal.isEmpty(); // && p->strVal!="false" && p->strVal!="0";
-      break;
-    case Struct:
-      result = TRUE;
-      break;
-    case List:
-      result = p->list->count()!=0;
-      break;
-    case Function:
-      result = FALSE;
-      break;
+    case None:     return FALSE;
+    case Bool:     return m_boolVal;
+    case Integer:  return m_intVal!=0;
+    case String:   return !m_strVal.isEmpty();
+    case Struct:   return TRUE;
+    case List:     return m_list->count()!=0;
+    case Function: return FALSE;
   }
-  return result;
+  return FALSE;
 }
 
 int TemplateVariant::toInt() const
 {
-  int result=0;
-  switch (p->type)
-  {
-    case None:
-      break;
-    case Bool:
-      result = p->boolVal ? 1 : 0;
-      break;
-    case Integer:
-      result = p->intVal;
-      break;
-    case String:
-      result = p->strVal.toInt();
-      break;
-    case Struct:
-      break;
-    case List:
-      result = p->list->count();
-      break;
-    case Function:
-      result = 0;
-      break;
-  }
-  return result;
-}
-
-TemplateStructIntf *TemplateVariant::toStruct() const
-{
-  return p->type==Struct ? p->strukt : 0;
-}
-
-TemplateListIntf *TemplateVariant::toList() const
-{
-  return p->type==List ? p->list : 0;
-}
-
-TemplateVariant TemplateVariant::call(const QValueList<TemplateVariant> &args)
-{
-  if (p->type==Function) return p->delegate(args);
-  return TemplateVariant();
-}
-
-bool TemplateVariant::operator==(TemplateVariant &other)
-{
-  if (p->type==None)
-  {
-    return FALSE;
-  }
-  if (p->type==TemplateVariant::List && other.p->type==TemplateVariant::List)
-  {
-    return p->list==other.p->list; // TODO: improve me
-  }
-  else if (p->type==TemplateVariant::Struct && other.p->type==TemplateVariant::Struct)
-  {
-    return p->strukt==other.p->strukt; // TODO: improve me
-  }
-  else
-  {
-    return toString()==other.toString();
-  }
-}
-
-TemplateVariant::Type TemplateVariant::type() const
-{
-  return p->type;
-}
-
-QCString TemplateVariant::typeAsString() const
-{
-  switch (p->type)
+  switch (m_type)
   {
-    case None:     return "none";
-    case Bool:     return "bool";
-    case Integer:  return "integer";
-    case String:   return "string";
-    case Struct:   return "struct";
-    case List:     return "list";
-    case Function: return "function";
+    case None:     return 0;
+    case Bool:     return m_boolVal ? 1 : 0;
+    case Integer:  return m_intVal;
+    case String:   return m_strVal.toInt();
+    case Struct:   return 0;
+    case List:     return m_list->count();
+    case Function: return 0;
   }
-  return "invalid";
-}
-
-bool TemplateVariant::isValid() const
-{
-  return p->type!=None;
-}
-
-void TemplateVariant::setRaw(bool b)
-{
-  p->raw = b;
-}
-
-bool TemplateVariant::raw() const
-{
-  return p->raw;
+  return 0;
 }
 
 //- Template struct implementation --------------------------------------------
@@ -699,6 +548,10 @@ class TemplateContextImpl : public TemplateContext
                                                    m_spacelessEnabled=b;
                                                  }
     bool spacelessEnabled() const                { return m_spacelessEnabled && m_spacelessIntf; }
+    void enableTabbing(bool b)                   { m_tabbingEnabled=b;
+                                                   if (m_activeEscapeIntf) m_activeEscapeIntf->enableTabbing(b);
+                                                 }
+    bool tabbingEnabled() const                  { return m_tabbingEnabled; }
     void warn(const char *fileName,int line,const char *fmt,...) const;
 
     // index related functions
@@ -717,6 +570,7 @@ class TemplateContextImpl : public TemplateContext
     TemplateEscapeIntf *m_activeEscapeIntf;
     TemplateSpacelessIntf *m_spacelessIntf;
     bool m_spacelessEnabled;
+    bool m_tabbingEnabled;
     TemplateAutoRef<TemplateStruct> m_indices;
     QDict< QStack<TemplateVariant> > m_indexStacks;
 };
@@ -783,6 +637,87 @@ class FilterGet
     }
 };
 
+//-----------------------------------------------------------------------------
+
+/** @brief The implementation of the "raw" filter */
+class FilterRaw
+{
+  public:
+    static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &)
+    {
+      if (v.isValid() && (v.type()==TemplateVariant::String || v.type()==TemplateVariant::Integer))
+      {
+        return TemplateVariant(v.toString(),TRUE);
+      }
+      else
+      {
+        return v;
+      }
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+/** @brief The implementation of the "list" filter */
+class FilterList
+{
+  public:
+    static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &)
+    {
+      if (v.isValid())
+      {
+        if (v.type()==TemplateVariant::List) // input is already a list
+        {
+          return v;
+        }
+        // create a list with v as the only element
+        TemplateList *list = TemplateList::alloc();
+        list->append(v);
+        return list;
+      }
+      else
+      {
+        return v;
+      }
+    }
+};
+
+//-----------------------------------------------------------------------------
+/** @brief The implementation of the "texlabel" filter */
+class FilterTexLabel
+{
+  public:
+    static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &)
+    {
+      if (v.isValid() && (v.type()==TemplateVariant::String))
+      {
+        return TemplateVariant(latexEscapeLabelName(v.toString(),FALSE),TRUE);
+      }
+      else
+      {
+        return v;
+      }
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+/** @brief The implementation of the "texindex" filter */
+class FilterTexIndex
+{
+  public:
+    static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &)
+    {
+      if (v.isValid() && (v.type()==TemplateVariant::String))
+      {
+        return TemplateVariant(latexEscapeIndexChars(v.toString(),FALSE),TRUE);
+      }
+      else
+      {
+        return v;
+      }
+    }
+};
 
 //-----------------------------------------------------------------------------
 
@@ -793,7 +728,7 @@ class FilterAppend
     static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &arg)
     {
       if ((v.type()==TemplateVariant::String || v.type()==TemplateVariant::Integer) &&
-          arg.type()==TemplateVariant::String)
+          (arg.type()==TemplateVariant::String || arg.type()==TemplateVariant::Integer))
       {
         return TemplateVariant(v.toString() + arg.toString());
       }
@@ -1088,6 +1023,25 @@ class FilterGroupBy
 
 //--------------------------------------------------------------------
 
+/** @brief The implementation of the "relative" filter */
+class FilterRelative
+{
+  public:
+    static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &)
+    {
+      if (v.isValid() && v.type()==TemplateVariant::String && v.toString().left(2)=="..")
+      {
+        return TRUE;
+      }
+      else
+      {
+        return FALSE;
+      }
+    }
+};
+
+//--------------------------------------------------------------------
+
 /** @brief The implementation of the "paginate" filter */
 class FilterPaginate
 {
@@ -1158,16 +1112,19 @@ class FilterAlphaIndex
     static QCString keyToLabel(uint startLetter)
     {
       char s[11]; // 0x12345678 + '\0'
-      if (startLetter>0x20 && startLetter<=0x7f) // printable ASCII character
+      if ((startLetter>='0' && startLetter<='9') ||
+          (startLetter>='a' && startLetter<='z') ||
+          (startLetter>='A' && startLetter<='Z'))
       {
-        s[0]=tolower((char)startLetter);
-        s[1]=0;
+        int i=0;
+        if (startLetter>='0' && startLetter<='9') s[i++] = 'x';
+        s[i++]=tolower((char)startLetter);
+        s[i++]=0;
       }
       else
       {
         const char hex[]="0123456789abcdef";
         int i=0;
-        s[i++]='0';
         s[i++]='x';
         if (startLetter>(1<<24)) // 4 byte character
         {
@@ -1381,6 +1338,8 @@ class TemplateFilterFactory
 // register a handlers for each filter we support
 static TemplateFilterFactory::AutoRegister<FilterAdd>         fAdd("add");
 static TemplateFilterFactory::AutoRegister<FilterGet>         fGet("get");
+static TemplateFilterFactory::AutoRegister<FilterRaw>         fRaw("raw");
+static TemplateFilterFactory::AutoRegister<FilterList>        fList("list");
 static TemplateFilterFactory::AutoRegister<FilterAppend>      fAppend("append");
 static TemplateFilterFactory::AutoRegister<FilterLength>      fLength("length");
 static TemplateFilterFactory::AutoRegister<FilterNoWrap>      fNoWrap("nowrap");
@@ -1388,7 +1347,10 @@ static TemplateFilterFactory::AutoRegister<FilterFlatten>     fFlatten("flatten"
 static TemplateFilterFactory::AutoRegister<FilterDefault>     fDefault("default");
 static TemplateFilterFactory::AutoRegister<FilterPrepend>     fPrepend("prepend");
 static TemplateFilterFactory::AutoRegister<FilterGroupBy>     fGroupBy("groupBy");
+static TemplateFilterFactory::AutoRegister<FilterRelative>    fRelative("relative");
 static TemplateFilterFactory::AutoRegister<FilterListSort>    fListSort("listsort");
+static TemplateFilterFactory::AutoRegister<FilterTexLabel>    fTexLabel("texLabel");
+static TemplateFilterFactory::AutoRegister<FilterTexIndex>    fTexIndex("texIndex");
 static TemplateFilterFactory::AutoRegister<FilterPaginate>    fPaginate("paginate");
 static TemplateFilterFactory::AutoRegister<FilterStripPath>   fStripPath("stripPath");
 static TemplateFilterFactory::AutoRegister<FilterAlphaIndex>  fAlphaIndex("alphaIndex");
@@ -1447,6 +1409,10 @@ class ExprAstFunctionVariable : public ExprAst
     { TRACE(("ExprAstFunctionVariable()\n"));
       m_args.setAutoDelete(TRUE);
     }
+   ~ExprAstFunctionVariable()
+    {
+      delete m_var;
+    }
     virtual TemplateVariant resolve(TemplateContext *c)
     {
       QValueList<TemplateVariant> args;
@@ -1978,17 +1944,6 @@ class ExpressionParser
       TRACE(("{parseLiteral(%s)\n",m_curToken.id.data()));
       ExprAst *expr = new ExprAstLiteral(m_curToken.id);
       getNextToken();
-      if (expr)
-      {
-        while (m_curToken.type==ExprToken::Operator &&
-               m_curToken.op==Operator::Filter)
-        {
-          getNextToken();
-          ExprAstFilter *filter = parseFilter();
-          if (!filter) break;
-          expr = new ExprAstFilterAppl(expr,filter);
-        }
-      }
       TRACE(("}parseLiteral()\n"));
       return expr;
     }
@@ -2307,7 +2262,9 @@ class TemplateNodeList : public QList<TemplateNode>
 class TemplateImpl : public TemplateNode, public Template
 {
   public:
-    TemplateImpl(TemplateEngine *e,const QCString &name,const char *data,int size);
+    TemplateImpl(TemplateEngine *e,const QCString &name,const QCString &data,
+                 const QCString &extension);
+   ~TemplateImpl();
     void render(FTextStream &ts, TemplateContext *c);
 
     TemplateEngine *engine() const { return m_engine; }
@@ -2322,10 +2279,26 @@ class TemplateImpl : public TemplateNode, public Template
 
 //----------------------------------------------------------
 
+/** @brief Weak reference wrapper for TemplateStructIntf that provides access to the
+ *  wrapped struct without holding a reference.
+ */
+class TemplateStructWeakRef : public TemplateStructIntf
+{
+  public:
+    TemplateStructWeakRef(TemplateStructIntf *ref) : m_ref(ref), m_refCount(0) {}
+    virtual TemplateVariant get(const char *name) const { return m_ref->get(name); }
+    virtual int addRef() { return ++m_refCount; }
+    virtual int release() { int count=--m_refCount; if (count<=0) { delete this; } return count; }
+  private:
+    TemplateStructIntf *m_ref;
+    int m_refCount;
+};
+
+//----------------------------------------------------------
 
 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_spacelessIntf(0), m_spacelessEnabled(FALSE), m_tabbingEnabled(FALSE), m_indices(TemplateStruct::alloc())
 {
   m_indexStacks.setAutoDelete(TRUE);
   m_contextStack.setAutoDelete(TRUE);
@@ -2358,9 +2331,8 @@ TemplateVariant TemplateContextImpl::get(const QCString &name) const
   }
   else // obj.prop
   {
-    TemplateVariant v;
     QCString objName = name.left(i);
-    v = getPrimary(objName);
+    TemplateVariant v = getPrimary(objName);
     QCString propName = name.mid(i+1);
     while (!propName.isEmpty())
     {
@@ -2467,7 +2439,7 @@ void TemplateContextImpl::warn(const char *fileName,int line,const char *fmt,...
 
 void TemplateContextImpl::openSubIndex(const QCString &indexName)
 {
-  //printf("TemplateContextImpl::openSubIndex(%s)\n",indexName.data());
+  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
   {
@@ -2488,7 +2460,7 @@ void TemplateContextImpl::openSubIndex(const QCString &indexName)
 
 void TemplateContextImpl::closeSubIndex(const QCString &indexName)
 {
-  //printf("TemplateContextImpl::closeSubIndex(%s)\n",indexName.data());
+  printf("TemplateContextImpl::closeSubIndex(%s)\n",indexName.data());
   QStack<TemplateVariant> *stack = m_indexStacks.find(indexName);
   if (!stack || stack->count()<3)
   {
@@ -2511,6 +2483,7 @@ void TemplateContextImpl::closeSubIndex(const QCString &indexName)
       }
     }
   }
+  //fprintf(stderr,"TemplateContextImpl::closeSubIndex(%s) end g_count=%d\n\n",indexName.data(),g_count);
 }
 
 static void getPathListFunc(TemplateStructIntf *entry,TemplateList *list)
@@ -2569,7 +2542,9 @@ void TemplateContextImpl::addIndexEntry(const QCString &indexName,const QValueLi
     if (stack->count()>1)
     {
       TemplateVariant *tmp = stack->pop();
-      parent = *stack->top();
+      // To prevent a cyclic dependency between parent and child which causes a memory
+      // leak, we wrap the parent into a weak reference version.
+      parent = new TemplateStructWeakRef(stack->top()->toStruct());
       stack->push(tmp);
       ASSERT(parent.type()==TemplateVariant::Struct);
     }
@@ -2661,7 +2636,6 @@ class TemplateNodeVariable : public TemplateNode
         {
           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());
@@ -3482,6 +3456,24 @@ class TemplateNodeInclude : public TemplateNodeCreator<TemplateNodeInclude>
 
 //----------------------------------------------------------
 
+static void stripLeadingWhiteSpace(QGString &s)
+{
+  const char *src = s.data();
+  if (src)
+  {
+    char *dst = s.data();
+    char c;
+    bool skipSpaces=TRUE;
+    while ((c=*src++))
+    {
+      if (c=='\n') { *dst++=c; skipSpaces=TRUE; }
+      else if (c==' ' && skipSpaces) {}
+      else { *dst++=c; skipSpaces=FALSE; }
+    }
+    *dst='\0';
+  }
+}
+
 /** @brief Class representing an 'create' tag in a template */
 class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate>
 {
@@ -3545,17 +3537,18 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate>
           TemplateImpl *t = getTemplate();
           if (t)
           {
+            QCString extension=outputFile;
+            int i=extension.findRev('.');
+            if (i!=-1)
+            {
+              extension=extension.right(extension.length()-i-1);
+            }
+            t->engine()->setOutputExtension(extension);
             Template *ct = t->engine()->loadByName(templateFile,m_line);
             TemplateImpl *createTemplate = ct ? dynamic_cast<TemplateImpl*>(ct) : 0;
             if (createTemplate)
             {
               mkpath(ci,outputFile);
-              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()+"/");
@@ -3567,7 +3560,11 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate>
                 TemplateEscapeIntf *escIntf = ci->escapeIntf();
                 ci->selectEscapeIntf(extension);
                 FTextStream ts(&f);
-                createTemplate->render(ts,c);
+                QGString out;
+                FTextStream os(&out);
+                createTemplate->render(os,c);
+                stripLeadingWhiteSpace(out);
+                ts << out;
                 t->engine()->unload(t);
                 ci->setActiveEscapeIntf(escIntf);
               }
@@ -3580,6 +3577,7 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate>
             {
               ci->warn(m_templateName,m_line,"failed to load template '%s' for include",templateFile.data());
             }
+            t->engine()->setOutputExtension("");
           }
         }
       }
@@ -3678,6 +3676,7 @@ class TemplateNodeTree : public TemplateNodeCreator<TemplateNodeTree>
         }
       }
       c->pop();
+      delete it;
       return result.data();
     }
     void render(FTextStream &ts, TemplateContext *c)
@@ -3868,7 +3867,8 @@ class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
       TRACE(("{TemplateNodeWith(%s)\n",data.data()));
       m_args.setAutoDelete(TRUE);
       ExpressionParser expParser(parser,line);
-      QValueList<QCString> args = split(data," ");
+      QCString filteredData = removeSpacesAroundEquals(data);
+      QValueList<QCString> args = split(filteredData," ");
       QValueListIterator<QCString> it = args.begin();
       while (it!=args.end())
       {
@@ -3920,7 +3920,7 @@ class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith>
 
 //----------------------------------------------------------
 
-/** @brief Class representing an 'set' tag in a template */
+/** @brief Class representing an 'cycle' tag in a template */
 class TemplateNodeCycle : public TemplateNodeCreator<TemplateNodeCycle>
 {
   public:
@@ -4083,6 +4083,11 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers>
       parser->removeNextToken(); // skip over endmarkers
       TRACE(("}TemplateNodeMarkers(%s)\n",data.data()));
     }
+   ~TemplateNodeMarkers()
+    {
+      delete m_listExpr;
+      delete m_patternExpr;
+    }
     void render(FTextStream &ts, TemplateContext *c)
     {
       TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
@@ -4134,6 +4139,7 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers>
             }
             ts << str.right(str.length()-index); // write text after last marker
             c->pop();
+            delete it;
           }
           else
           {
@@ -4155,6 +4161,36 @@ class TemplateNodeMarkers : public TemplateNodeCreator<TemplateNodeMarkers>
 
 //----------------------------------------------------------
 
+/** @brief Class representing an 'tabbing' tag in a template */
+class TemplateNodeTabbing : public TemplateNodeCreator<TemplateNodeTabbing>
+{
+  public:
+    TemplateNodeTabbing(TemplateParser *parser,TemplateNode *parent,int line,const QCString &)
+      : TemplateNodeCreator<TemplateNodeTabbing>(parser,parent,line)
+    {
+      TRACE(("{TemplateNodeTabbing()\n"));
+      QStrList stopAt;
+      stopAt.append("endtabbing");
+      parser->parse(this,line,stopAt,m_nodes);
+      parser->removeNextToken(); // skip over endtabbing
+      TRACE(("}TemplateNodeTabbing()\n"));
+    }
+    void render(FTextStream &ts, TemplateContext *c)
+    {
+      TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
+      if (ci==0) return; // should not happen
+      ci->setLocation(m_templateName,m_line);
+      bool wasTabbing = ci->tabbingEnabled();
+      ci->enableTabbing(TRUE);
+      m_nodes.render(ts,c);
+      ci->enableTabbing(wasTabbing);
+    }
+  private:
+    TemplateNodeList m_nodes;
+};
+
+//----------------------------------------------------------
+
 /** @brief Class representing an 'markers' tag in a template */
 class TemplateNodeResource : public TemplateNodeCreator<TemplateNodeResource>
 {
@@ -4290,6 +4326,7 @@ static TemplateNodeFactory::AutoRegister<TemplateNodeCreate>        autoRefCreat
 static TemplateNodeFactory::AutoRegister<TemplateNodeRepeat>        autoRefRepeat("repeat");
 static TemplateNodeFactory::AutoRegister<TemplateNodeInclude>       autoRefInclude("include");
 static TemplateNodeFactory::AutoRegister<TemplateNodeMarkers>       autoRefMarkers("markers");
+static TemplateNodeFactory::AutoRegister<TemplateNodeTabbing>       autoRefTabbing("tabbing");
 static TemplateNodeFactory::AutoRegister<TemplateNodeResource>      autoRefResource("resource");
 static TemplateNodeFactory::AutoRegister<TemplateNodeSpaceless>     autoRefSpaceless("spaceless");
 static TemplateNodeFactory::AutoRegister<TemplateNodeIndexEntry>    autoRefIndexEntry("indexentry");
@@ -4378,8 +4415,10 @@ void TemplateBlockContext::push(TemplateNodeBlock *block)
 class TemplateLexer
 {
   public:
-    TemplateLexer(const TemplateEngine *engine,const QCString &fileName,const char *data,int size);
+    TemplateLexer(const TemplateEngine *engine,const QCString &fileName,const QCString &data);
     void tokenize(QList<TemplateToken> &tokens);
+    void setOpenCloseCharacters(char openChar,char closeChar)
+    { m_openChar=openChar; m_closeChar=closeChar; }
   private:
     void addToken(QList<TemplateToken> &tokens,
                   const char *data,int line,int startPos,int endPos,
@@ -4388,14 +4427,15 @@ class TemplateLexer
     const TemplateEngine *m_engine;
     QCString m_fileName;
     QCString m_data;
+    char m_openChar;
+    char m_closeChar;
 };
 
-TemplateLexer::TemplateLexer(const TemplateEngine *engine,const QCString &fileName,const char *data,int size) :
-  m_engine(engine), m_fileName(fileName)
+TemplateLexer::TemplateLexer(const TemplateEngine *engine,const QCString &fileName,const QCString &data) :
+  m_engine(engine), m_fileName(fileName), m_data(data)
 {
-  m_data.resize(size+1);
-  memcpy(m_data.rawData(),data,size);
-  m_data[size]=0;
+  m_openChar='{';
+  m_closeChar='}';
 }
 
 void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
@@ -4414,6 +4454,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
   };
 
   const char *p=m_data.data();
+  if (p==0) return;
   int  state=StateText;
   int  pos=0;
   int  lastTokenPos=0;
@@ -4427,7 +4468,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
     switch (state)
     {
       case StateText:
-        if (c=='{') // {{ or {% or {# or something else
+        if (c==m_openChar) // {{ or {% or {# or something else
         {
           state=StateBeginTemplate;
         }
@@ -4448,7 +4489,14 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
             markStartPos=pos-1;
             break;
           case '{': // {{
-            state=StateMaybeVar;
+            if (m_openChar=='{')
+            {
+              state=StateMaybeVar;
+            }
+            else
+            {
+              state=StateVariable;
+            }
             markStartPos=pos-1;
             break;
           default:
@@ -4460,7 +4508,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
       case StateTag:
         if (c=='\n')
         {
-          warn(m_fileName,line,"unexpected new line inside {%%...%%} block");
+          warn(m_fileName,line,"unexpected new line inside %c%%...%%%c block",m_openChar,m_closeChar);
           m_engine->printIncludeContext(m_fileName,line);
         }
         else if (c=='%') // %} or something else
@@ -4469,7 +4517,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
         }
         break;
       case StateEndTag:
-        if (c=='}') // %}
+        if (c==m_closeChar) // %}
         {
           // found tag!
           state=StateText;
@@ -4484,7 +4532,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
         {
           if (c=='\n')
           {
-            warn(m_fileName,line,"unexpected new line inside {%%...%%} block");
+            warn(m_fileName,line,"unexpected new line inside %c%%...%%%c block",m_openChar,m_closeChar);
             m_engine->printIncludeContext(m_fileName,line);
           }
           state=StateTag;
@@ -4493,7 +4541,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
       case StateComment:
         if (c=='\n')
         {
-          warn(m_fileName,line,"unexpected new line inside {#...#} block");
+          warn(m_fileName,line,"unexpected new line inside %c#...#%c block",m_openChar,m_closeChar);
           m_engine->printIncludeContext(m_fileName,line);
         }
         else if (c=='#') // #} or something else
@@ -4502,7 +4550,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
         }
         break;
       case StateEndComment:
-        if (c=='}') // #}
+        if (c==m_closeChar) // #}
         {
           // found comment tag!
           state=StateText;
@@ -4515,7 +4563,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
         {
           if (c=='\n')
           {
-            warn(m_fileName,line,"unexpected new line inside {#...#} block");
+            warn(m_fileName,line,"unexpected new line inside %c#...#%c block",m_openChar,m_closeChar);
             m_engine->printIncludeContext(m_fileName,line);
           }
           state=StateComment;
@@ -4538,9 +4586,10 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
         }
         break;
       case StateVariable:
+        emptyOutputLine=FALSE; // assume a variable expands to content
         if (c=='\n')
         {
-          warn(m_fileName,line,"unexpected new line inside {{...}} block");
+          warn(m_fileName,line,"unexpected new line inside %c{...}%c block",m_openChar,m_closeChar);
           m_engine->printIncludeContext(m_fileName,line);
         }
         else if (c=='}') // }} or something else
@@ -4549,7 +4598,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
         }
         break;
       case StateEndVariable:
-        if (c=='}') // }}
+        if (c==m_closeChar) // }}
         {
           // found variable tag!
           state=StateText;
@@ -4564,7 +4613,7 @@ void TemplateLexer::tokenize(QList<TemplateToken> &tokens)
         {
           if (c=='\n')
           {
-            warn(m_fileName,line,"unexpected new line inside {{...}} block");
+            warn(m_fileName,line,"unexpected new line inside %c{...}%c block",m_openChar,m_closeChar);
             m_engine->printIncludeContext(m_fileName,line);
           }
           state=StateVariable;
@@ -4666,7 +4715,7 @@ void TemplateParser::parse(
                    command=="endrecursetree" || command=="endspaceless" ||
                    command=="endmarkers"     || command=="endmsg"       ||
                    command=="endrepeat"      || command=="elif"         ||
-                   command=="endrange")
+                   command=="endrange"       || command=="endtabbing")
           {
             warn(m_templateName,tok->line,"Found tag '%s' without matching start tag",command.data());
           }
@@ -4734,12 +4783,17 @@ void TemplateParser::warn(const char *fileName,int line,const char *fmt,...) con
 //----------------------------------------------------------
 
 
-TemplateImpl::TemplateImpl(TemplateEngine *engine,const QCString &name,const char *data,int size)
+TemplateImpl::TemplateImpl(TemplateEngine *engine,const QCString &name,const QCString &data,
+    const QCString &extension)
   : TemplateNode(0)
 {
   m_name = name;
   m_engine = engine;
-  TemplateLexer lexer(engine,name,data,size);
+  TemplateLexer lexer(engine,name,data);
+  if (extension=="tex")
+  {
+    lexer.setOpenCloseCharacters('<','>');
+  }
   QList<TemplateToken> tokens;
   tokens.setAutoDelete(TRUE);
   lexer.tokenize(tokens);
@@ -4747,6 +4801,11 @@ TemplateImpl::TemplateImpl(TemplateEngine *engine,const QCString &name,const cha
   parser.parse(this,1,QStrList(),m_nodes);
 }
 
+TemplateImpl::~TemplateImpl()
+{
+  //printf("deleting template %s\n",m_name.data());
+}
+
 void TemplateImpl::render(FTextStream &ts, TemplateContext *c)
 {
   TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c);
@@ -4809,30 +4868,12 @@ class TemplateEngine::Private
       Template *templ = m_templateCache.find(fileName);
       if (templ==0)
       {
-        const Resource *res = ResourceMgr::instance().get(fileName);
-        if (res)
+        const QCString data = ResourceMgr::instance().getAsString(fileName);
+        if (!data.isEmpty())
         {
-          templ = new TemplateImpl(m_engine,fileName,(const char *)res->data,res->size);
+          templ = new TemplateImpl(m_engine,fileName,data,m_extension);
           m_templateCache.insert(fileName,templ);
         }
-#if 0
-        QFile f(fileName);
-        if (f.open(IO_ReadOnly))
-        {
-          uint size=f.size();
-          char *data = new char[size+1];
-          if (data)
-          {
-            data[size]=0;
-            if (f.readBlock(data,f.size()))
-            {
-              templ = new TemplateImpl(m_engine,fileName,data);
-              m_templateCache.insert(fileName,templ);
-            }
-            delete[] data;
-          }
-        }
-#endif
         else
         {
           err("Cound not open template file %s\n",fileName.data());
@@ -4889,11 +4930,22 @@ class TemplateEngine::Private
       }
     }
 
+    void setOutputExtension(const char *extension)
+    {
+      m_extension = extension;
+    }
+
+    QCString outputExtension() const
+    {
+      return m_extension;
+    }
+
   private:
     QDict<Template> m_templateCache;
     //mutable int m_indent;
     TemplateEngine *m_engine;
     QList<IncludeEntry> m_includeStack;
+    QCString m_extension;
 };
 
 TemplateEngine::TemplateEngine()
@@ -4941,3 +4993,15 @@ void TemplateEngine::printIncludeContext(const char *fileName,int line) const
   p->printIncludeContext(fileName,line);
 }
 
+void TemplateEngine::setOutputExtension(const char *extension)
+{
+  p->setOutputExtension(extension);
+}
+
+QCString TemplateEngine::outputExtension() const
+{
+  return p->outputExtension();
+}
+
+
+
index c6c918c..7d6e2ff 100644 (file)
@@ -139,28 +139,41 @@ class TemplateVariant
     enum Type { None, Bool, Integer, String, Struct, List, Function };
 
     /** Returns the type of the value stored in the variant */
-    Type type() const;
+    Type type() const { return m_type; }
 
     /** Return a string representation of the type of the value stored in the variant */
-    QCString typeAsString() const;
+    QCString typeAsString() const
+    {
+      switch (m_type)
+      {
+        case None:     return "none";
+        case Bool:     return "bool";
+        case Integer:  return "integer";
+        case String:   return "string";
+        case Struct:   return "struct";
+        case List:     return "list";
+        case Function: return "function";
+      }
+      return "invalid";
+    }
 
     /** Returns TRUE if the variant holds a valid value, or FALSE otherwise */
-    bool isValid() const;
+    bool isValid() const { return m_type!=None; }
 
     /** Constructs an invalid variant. */
-    TemplateVariant();
+    TemplateVariant() : m_type(None), m_strukt(0), m_raw(FALSE) {}
 
     /** Constructs a new variant with a boolean value \a b. */
-    explicit TemplateVariant(bool b);
+    explicit TemplateVariant(bool b) : m_type(Bool), m_boolVal(b), m_raw(FALSE) {}
 
     /** Constructs a new variant with a integer value \a v. */
-    TemplateVariant(int v);
+    TemplateVariant(int v) : m_type(Integer), m_intVal(v), m_raw(FALSE) {}
 
     /** Constructs a new variant with a string value \a s. */
-    TemplateVariant(const char *s,bool raw=FALSE);
+    TemplateVariant(const char *s,bool raw=FALSE) : m_type(String), m_strVal(s), m_strukt(0), m_raw(raw) {}
 
     /** Constructs a new variant with a string value \a s. */
-    TemplateVariant(const QCString &s,bool raw=FALSE);
+    TemplateVariant(const QCString &s,bool raw=FALSE) : m_type(String), m_strVal(s), m_strukt(0), m_raw(raw) {}
 
     /** Constructs a new variant with a struct value \a s.
      *  @note. The variant will hold a reference to the object.
@@ -179,7 +192,7 @@ class TemplateVariant
      *  TemplateVariant::Delegate::fromFunction() to create
      *  Delegate objects.
      */
-    TemplateVariant(const Delegate &delegate);
+    TemplateVariant(const Delegate &delegate) : m_type(Function), m_strukt(0), m_delegate(delegate), m_raw(FALSE) {}
 
     /** Destroys the Variant object */
     ~TemplateVariant();
@@ -195,46 +208,96 @@ class TemplateVariant
     /** Compares this QVariant with v and returns true if they are equal;
      *  otherwise returns false.
      */
-    bool operator==(TemplateVariant &other);
+    bool operator==(TemplateVariant &other)
+    {
+      if (m_type==None)
+      {
+        return FALSE;
+      }
+      if (m_type==TemplateVariant::List && other.m_type==TemplateVariant::List)
+      {
+        return m_list==other.m_list; // TODO: improve me
+      }
+      else if (m_type==TemplateVariant::Struct && other.m_type==TemplateVariant::Struct)
+      {
+        return m_strukt==other.m_strukt; // TODO: improve me
+      }
+      else
+      {
+        return toString()==other.toString();
+      }
+    }
 
     /** Returns the variant as a string. */
-    QCString            toString() const;
+    QCString toString() const
+    {
+      switch (m_type)
+      {
+        case None:     return QCString();
+        case Bool:     return m_boolVal ? "true" : "false";
+        case Integer:  return QCString().setNum(m_intVal);
+        case String:   return m_strVal;
+        case Struct:   return "[struct]";
+        case List:     return "[list]";
+        case Function: return "[function]";
+      }
+      return QCString();
+    }
 
     /** Returns the variant as a boolean. */
-    bool                toBool() const;
+    bool toBool() const;
 
     /** Returns the variant as an integer. */
-    int                 toInt() const;
+    int toInt() const;
 
     /** Returns the pointer to list referenced by this variant
      *  or 0 if this variant does not have list type.
      */
-    TemplateListIntf   *toList() const;
+    TemplateListIntf   *toList() const
+    {
+      return m_type==List ? m_list : 0;
+    }
 
     /** Returns the pointer to struct referenced by this variant
      *  or 0 if this variant does not have struct type.
      */
-    TemplateStructIntf *toStruct() const;
+    TemplateStructIntf *toStruct() const
+    {
+      return m_type==Struct ? m_strukt : 0;
+    }
 
     /** 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);
+    TemplateVariant call(const QValueList<TemplateVariant> &args)
+    {
+      if (m_type==Function) return m_delegate(args);
+      return TemplateVariant();
+    }
 
     /** 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.
      */
-    void setRaw(bool b);
+    void setRaw(bool b) { m_raw = b; }
 
     /** Returns whether or not the value of the Value is raw.
      *  @see setRaw()
      */
-    bool raw() const;
+    bool raw() const { return m_raw; }
 
   private:
-    class Private;
-    Private *p;
+    Type                  m_type;
+    QCString              m_strVal;
+    union
+    {
+      int                 m_intVal;
+      bool                m_boolVal;
+      TemplateStructIntf *m_strukt;
+      TemplateListIntf   *m_list;
+    };
+    Delegate              m_delegate;
+    bool                  m_raw;
 };
 
 //------------------------------------------------------------------------
@@ -396,6 +459,8 @@ class TemplateEscapeIntf
   public:
     /** Returns the \a input after escaping certain characters */
     virtual QCString escape(const QCString &input) = 0;
+    /** Setting tabbing mode on or off (for LaTeX) */
+    virtual void enableTabbing(bool b) = 0;
 };
 
 //------------------------------------------------------------------------
@@ -453,7 +518,7 @@ class TemplateContext
      */
     virtual const TemplateVariant *getRef(const QCString &name) const = 0;
 
-    /** When files are create (i.e. by {% create ... %}) they written
+    /** When files are created (i.e. by {% create ... %}) they written
      *  to the directory \a dir.
      */
     virtual void setOutputDirectory(const QCString &dir) = 0;
@@ -510,11 +575,10 @@ class TemplateEngine
      */
     void destroyContext(TemplateContext *ctx);
 
-    /** Creates a new template whole contents are in a file.
-     *  @param[in] fileName The name of the file containing the
-     *             template data
+    /** Creates a new template whose contents are in a file.
+     *  @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.
+     *  @return the new template, the engine will keep ownership of the object.
      */
     Template *loadByName(const QCString &fileName,int fromLine);
 
@@ -523,13 +587,24 @@ class TemplateEngine
      */
     void unload(Template *t);
 
+    /** Prints the current template file include stack */
     void printIncludeContext(const char *fileName,int line) const;
 
   private:
     friend class TemplateNodeBlock;
+    friend class TemplateNodeCreate;
+
     void enterBlock(const QCString &fileName,const QCString &blockName,int line);
     void leaveBlock();
 
+    /** Sets the extension of the output file. This is used to control the
+     *  format of 'special' tags in the template
+     */
+    void setOutputExtension(const char *extension);
+
+    /** Returns the output extension, set via setOutputExtension() */
+    QCString outputExtension() const;
+
     class Private;
     Private *p;
 };
index 6a7966f..f9fe664 100644 (file)
@@ -1903,7 +1903,7 @@ class TranslatorBrazilian : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Provido pela categoria @1.";
+      return "Provido pela categoria @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1912,7 +1912,7 @@ class TranslatorBrazilian : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "estende a classe @1.";
+      return "estende a classe @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index 26160d4..eae4014 100644 (file)
@@ -110,7 +110,7 @@ class TranslatorChinese : public Translator
 
     /*! this is the first part of a sentence that is followed by a class name */
     virtual QCString trThisIsTheListOfAllMembers()
-    { return "成员的完整列表,这些成员属于"CN_SPC; }
+    { return "成员的完整列表,这些成员属于" CN_SPC; }
 
     /*! this is the remainder of the sentence after the class name */
     virtual QCString trIncludingInheritedMembers()
@@ -121,8 +121,8 @@ class TranslatorChinese : public Translator
      */
     virtual QCString trGeneratedAutomatically(const char *s)
     { QCString result;
-      result = "由"CN_SPC"Doyxgen"CN_SPC"通过分析"CN_SPC;
-      if (s) result += ((QCString)s+CN_SPC"的"CN_SPC);
+      result = "由" CN_SPC "Doyxgen" CN_SPC "通过分析" CN_SPC;
+      if (s) result += ((QCString)s+CN_SPC "的" CN_SPC);
       result+= "源代码自动生成.";
       return result;
     }
@@ -137,7 +137,7 @@ class TranslatorChinese : public Translator
 
     /*! put after an undocumented member in the list of all members */
     virtual QCString trDefinedIn()
-    { return "定义于"CN_SPC; }
+    { return "定义于" CN_SPC; }
 
     // quick reference sections
 
@@ -199,7 +199,7 @@ class TranslatorChinese : public Translator
     { return "搜索"; }
 
     virtual QCString trClassHierarchyDescription()
-    { return "此继承关系列表按字典顺序粗略的排序:"CN_SPC; }
+    { return "此继承关系列表按字典顺序粗略的排序:" CN_SPC; }
 
     virtual QCString trFileListDescription(bool extractAll)
     {
@@ -376,15 +376,15 @@ class TranslatorChinese : public Translator
     }
 
     virtual QCString trGeneratedAt(const char *date,const char *projName)
-    { QCString result=(QCString)"生成于"CN_SPC+date;
-      if (projName) result+=(QCString)CN_SPC", 为"CN_SPC+projName;
-      result+=(QCString)"使用"CN_SPC;
+    { QCString result=(QCString)"生成于" CN_SPC+date;
+      if (projName) result+=(QCString)CN_SPC ", 为" CN_SPC+projName;
+      result+=(QCString)"使用" CN_SPC;
       return result;
     }
 
     virtual QCString trClassDiagram(const char *clName)
     {
-      return (QCString)"类"CN_SPC+clName+CN_SPC"继承关系图:";
+      return (QCString)"类" CN_SPC+clName+CN_SPC "继承关系图:";
     }
 
      virtual QCString trForInternalUseOnly()
@@ -449,7 +449,7 @@ class TranslatorChinese : public Translator
       // used as the title of the HTML page of a class/struct/union
     {
        QCString result=(QCString)clName;
-      if (isTemplate) result+=CN_SPC"模板";
+      if (isTemplate) result+=CN_SPC "模板";
       switch(compType)
       {
         case ClassDef::Class:  result+="类"; break;
@@ -461,7 +461,7 @@ class TranslatorChinese : public Translator
         case ClassDef::Exception:  result+="异常"; break;
         default: break;
       }
-      result+=CN_SPC"参考";
+      result+=CN_SPC "参考";
       return result;
     }
 
@@ -469,14 +469,14 @@ class TranslatorChinese : public Translator
     virtual QCString trFileReference(const char *fileName)
     {
       QCString result=fileName;
-      result+=CN_SPC"文件参考";
+      result+=CN_SPC "文件参考";
       return result;
     }
 
     /*! used as the title of the HTML page of a namespace */
     virtual QCString trNamespaceReference(const char *namespaceName)
     { QCString result=namespaceName;
-      result+=CN_SPC"命名空间参考";
+      result+=CN_SPC "命名空间参考";
       return result;
     }
 
@@ -528,9 +528,9 @@ class TranslatorChinese : public Translator
         if (i!=numEntries-1)  // not the last entry, so we need a separator
         {
           if (i<numEntries-2) // not the fore last entry
-            result+=","CN_SPC;
+            result+="," CN_SPC;
           else                // the fore last entry
-            result+=CN_SPC", 以及"CN_SPC;
+            result+=CN_SPC ", 以及" CN_SPC;
         }
       }
       return result;
@@ -540,14 +540,14 @@ class TranslatorChinese : public Translator
      *  if class diagrams are disabled.
      */
     virtual QCString trInheritsList(int numEntries)
-    { return "继承自"CN_SPC+trWriteList(numEntries)+CN_SPC".";  }
+    { return "继承自" CN_SPC+trWriteList(numEntries)+CN_SPC ".";  }
 
     /*! used in class documentation to produce a list of super classes,
      *  if class diagrams are disabled.
      */
     virtual QCString trInheritedByList(int numEntries)
     {
-      return "被"CN_SPC+trWriteList(numEntries)+CN_SPC"继承.";
+      return "被" CN_SPC+trWriteList(numEntries)+CN_SPC "继承.";
     }
 
     /*! used in member documentation blocks to produce a list of
@@ -555,7 +555,7 @@ class TranslatorChinese : public Translator
      */
     virtual QCString trReimplementedFromList(int numEntries)
     {
-      return "重载"CN_SPC+trWriteList(numEntries)+CN_SPC".";
+      return "重载" CN_SPC+trWriteList(numEntries)+CN_SPC ".";
     }
 
     /*! used in member documentation blocks to produce a list of
@@ -563,7 +563,7 @@ class TranslatorChinese : public Translator
      */
     virtual QCString trReimplementedInList(int numEntries)
     {
-      return "被"CN_SPC+trWriteList(numEntries)+CN_SPC"重载.";
+      return "被" CN_SPC+trWriteList(numEntries)+CN_SPC "重载.";
     }
 
     /*! This is put above each page as a link to all members of namespaces. */
@@ -659,12 +659,12 @@ class TranslatorChinese : public Translator
 
     virtual QCString trDefinedAtLineInSourceFile()
     {
-      return "在文件"CN_SPC"@1"CN_SPC"第"CN_SPC"@0"CN_SPC"行定义.";
+      return "在文件" CN_SPC "@1" CN_SPC "第" CN_SPC "@0" CN_SPC "行定义.";
     }
 
     virtual QCString trDefinedInSourceFile()
     {
-      return "在文件"CN_SPC"@0"CN_SPC"中定义.";
+      return "在文件" CN_SPC "@0" CN_SPC "中定义.";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -683,13 +683,13 @@ class TranslatorChinese : public Translator
     /*! this text is put before a collaboration diagram */
     virtual QCString trCollaborationDiagram(const char *clName)
     {
-      return (QCString)clName+CN_SPC"的协作图:";
+      return (QCString)clName+CN_SPC "的协作图:";
     }
 
     /*! this text is put before an include dependency graph */
     virtual QCString trInclDepGraph(const char *fName)
     {
-      return (QCString)fName+CN_SPC"的引用(Include)关系图:";
+      return (QCString)fName+CN_SPC "的引用(Include)关系图:";
     }
 
     /*! header that is put before the list of constructor/destructors. */
@@ -879,7 +879,7 @@ class TranslatorChinese : public Translator
     /*! page explaining how the dot graph's should be interpreted */
     virtual QCString trLegendDocs()
     {
-      return "本页将向您解释如何理解由"CN_SPC"doxygen"CN_SPC"生成的图.<p>\n"
+      return "本页将向您解释如何理解由" CN_SPC "doxygen" CN_SPC "生成的图.<p>\n"
         "考虑如下例子:\n"
         "\\code\n"
         "/*! 由于截断而使 Invisible 不可见 */\n"
@@ -991,7 +991,7 @@ class TranslatorChinese : public Translator
     /*! Used as the title of a Java package */
     virtual QCString trPackage(const char *name)
     {
-      return (QCString)"包"CN_SPC+name;
+      return (QCString)"包" CN_SPC+name;
     }
 
     /*! Title of the package index page */
@@ -1028,7 +1028,7 @@ class TranslatorChinese : public Translator
 
     virtual QCString trBugList ()
     {
-      return "Bug"CN_SPC"列表";
+      return "Bug" CN_SPC "列表";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1217,7 +1217,7 @@ class TranslatorChinese : public Translator
     virtual QCString trImplementedFromList(int numEntries)
     {
       /* return "Implements "+trWriteList(numEntries)+"."; */
-      return "实现了"CN_SPC+trWriteList(numEntries)+".";
+      return "实现了" CN_SPC+trWriteList(numEntries)+".";
     }
 
     /*! used in member documentation blocks to produce a list of
@@ -1226,7 +1226,7 @@ class TranslatorChinese : public Translator
     virtual QCString trImplementedInList(int numEntries)
     {
       /* return "Implemented in "+trWriteList(numEntries)+"."; */
-      return "在"CN_SPC+trWriteList(numEntries)+CN_SPC"内被实现.";
+      return "在" CN_SPC+trWriteList(numEntries)+CN_SPC "内被实现.";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1386,7 +1386,7 @@ class TranslatorChinese : public Translator
     virtual QCString trSourceFile(QCString& filename)
     {
       /* return filename + " Source File"; */
-      return filename + CN_SPC"源文件";
+      return filename + CN_SPC "源文件";
     }
 //////////////////////////////////////////////////////////////////////////
 // new since 1.3.9
@@ -1419,7 +1419,7 @@ class TranslatorChinese : public Translator
      */
     virtual QCString trDirDescription()
     {
-      return "此继承关系列表按字典顺序粗略的排序:"CN_SPC;
+      return "此继承关系列表按字典顺序粗略的排序:" CN_SPC;
     }
 
     /*! This returns the title of a directory page. The name of the
@@ -1428,7 +1428,7 @@ class TranslatorChinese : public Translator
     virtual QCString trDirReference(const char *dirName)
     {
       QCString result=dirName;
-      result+=CN_SPC"目录参考";
+      result+=CN_SPC "目录参考";
       return result;
     }
 
@@ -1565,16 +1565,16 @@ class TranslatorChinese : public Translator
       QCString result=(QCString)clName;
       switch(compType)
       {
-        case ClassDef::Class:      result+=CN_SPC"模块"; break;
-        case ClassDef::Struct:     result+=CN_SPC"类型"; break;
-        case ClassDef::Union:      result+=CN_SPC"联合体"; break;
-        case ClassDef::Interface:  result+=CN_SPC"接口"; break;
-        case ClassDef::Protocol:   result+=CN_SPC"协议"; break;
-        case ClassDef::Category:   result+=CN_SPC"目录"; break;
-        case ClassDef::Exception:  result+=CN_SPC"异常"; break;
+        case ClassDef::Class:      result+=CN_SPC "模块"; break;
+        case ClassDef::Struct:     result+=CN_SPC "类型"; break;
+        case ClassDef::Union:      result+=CN_SPC "联合体"; break;
+        case ClassDef::Interface:  result+=CN_SPC "接口"; break;
+        case ClassDef::Protocol:   result+=CN_SPC "协议"; break;
+        case ClassDef::Category:   result+=CN_SPC "目录"; break;
+        case ClassDef::Exception:  result+=CN_SPC "异常"; break;
         default: break;
       }
-      if (isTemplate) result+="模板"CN_SPC;
+      if (isTemplate) result+="模板" CN_SPC;
       result+="参考手册";
       return result;
     }
@@ -1583,7 +1583,7 @@ class TranslatorChinese : public Translator
     virtual QCString trModuleReference(const char *namespaceName)
     {
       QCString result=namespaceName;
-      result += CN_SPC"模块参考手册";
+      result += CN_SPC "模块参考手册";
       return result;
     }
 
@@ -1640,16 +1640,16 @@ class TranslatorChinese : public Translator
       QCString result="该";
       switch(compType)
       {
-        case ClassDef::Class:      result+=CN_SPC"模块"; break;
-        case ClassDef::Struct:     result+=CN_SPC"结构体"; break;
-        case ClassDef::Union:      result+=CN_SPC"联合体"; break;
-        case ClassDef::Interface:  result+=CN_SPC"接口"; break;
-        case ClassDef::Protocol:   result+=CN_SPC"协议"; break;
-        case ClassDef::Category:   result+=CN_SPC"目录"; break;
-        case ClassDef::Exception:  result+=CN_SPC"异常"; break;
+        case ClassDef::Class:      result+=CN_SPC "模块"; break;
+        case ClassDef::Struct:     result+=CN_SPC "结构体"; break;
+        case ClassDef::Union:      result+=CN_SPC "联合体"; break;
+        case ClassDef::Interface:  result+=CN_SPC "接口"; break;
+        case ClassDef::Protocol:   result+=CN_SPC "协议"; break;
+        case ClassDef::Category:   result+=CN_SPC "目录"; break;
+        case ClassDef::Exception:  result+=CN_SPC "异常"; break;
         default: break;
       }
-      result+=CN_SPC"的文档由以下文件生成:";
+      result+=CN_SPC "的文档由以下文件生成:";
       return result;
     }
 
@@ -1684,7 +1684,7 @@ class TranslatorChinese : public Translator
   {
     // return QCString(name)+" Relation";
     // unsure
-    return QCString(name)+CN_SPC"关系";
+    return QCString(name)+CN_SPC "关系";
   }
 
     virtual QCString trLoading()
@@ -1718,7 +1718,7 @@ class TranslatorChinese : public Translator
 
   virtual QCString trIncludesFileIn(const char *name)
   {
-    return (QCString)"在"CN_SPC+name+CN_SPC"中引用";
+    return (QCString)"在" CN_SPC+name+CN_SPC "中引用";
   }
 
   virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
@@ -1730,7 +1730,7 @@ class TranslatorChinese : public Translator
 
     QCString sdate;
 
-    sdate.sprintf("%d年"CN_SPC"%s月"CN_SPC"%d日"CN_SPC"星期%s",year, months[month-1], day, days[dayOfWeek-1]);
+    sdate.sprintf("%d年" CN_SPC "%s月" CN_SPC "%d日" CN_SPC "星期%s",year, months[month-1], day, days[dayOfWeek-1]);
 
     if (includeTime)
     {
@@ -1756,7 +1756,7 @@ class TranslatorChinese : public Translator
     /*! Header for the graph showing the directory dependencies */
     virtual QCString trDirDepGraph(const char *name)
     {
-      return QCString(name)+CN_SPC"的目录依赖关系图";
+      return QCString(name)+CN_SPC "的目录依赖关系图";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1773,7 +1773,7 @@ class TranslatorChinese : public Translator
 
     /*! Used in dot graph when UML_LOOK is enabled and there are many fields */
     virtual QCString trAndMore(const QCString &number)
-    { return "和"CN_SPC+number+CN_SPC"更多..."; }
+    { return "和" CN_SPC+number+CN_SPC "更多..."; }
 
     /*! Used file list for a Java enum */
     virtual QCString trEnumGeneratedFromFiles(bool /*single*/)
@@ -1781,11 +1781,11 @@ class TranslatorChinese : public Translator
 
     /*! Header of a Java enum page (Java enums are represented as classes). */
     virtual QCString trEnumReference(const char *name)
-    { return QCString(name)+CN_SPC"枚举类型参考"; }
+    { return QCString(name)+CN_SPC "枚举类型参考"; }
 
     /*! Used for a section containing inherited members */
     virtual QCString trInheritedFrom(const char *members,const char *what)
-    { return QCString(members)+CN_SPC"继承自"CN_SPC+what; }
+    { return QCString(members)+CN_SPC "继承自" CN_SPC+what; }
 
     /*! Header of the sections with inherited members specific for the
      *  base class(es)
@@ -1806,7 +1806,7 @@ class TranslatorChinese : public Translator
     virtual QCString trPanelSynchronisationTooltip(bool enable)
     {
       QCString opt = enable ? "开启" : "关闭";
-      return "点击"CN_SPC+opt+CN_SPC"面板同步";
+      return "点击" CN_SPC+opt+CN_SPC "面板同步";
     }
 
     /*! Used in a method of an Objective-C class that is declared in a
@@ -1815,7 +1815,7 @@ class TranslatorChinese : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "由 category @1 提供.";
+      return "由 category @0 提供.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1824,7 +1824,7 @@ class TranslatorChinese : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "扩展类 @1.";
+      return "扩展类 @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
@@ -1878,21 +1878,21 @@ class TranslatorChinese : public Translator
     virtual QCString trConstantGroupReference(const char *namespaceName)
     {
       QCString result=namespaceName;
-      result+= CN_SPC"常量组参考";
+      result+= CN_SPC "常量组参考";
       return result;
     }
     /** UNO IDL service page title */
     virtual QCString trServiceReference(const char *sName)
     {
       QCString result=(QCString)sName;
-      result+= CN_SPC"服务参考";
+      result+= CN_SPC "服务参考";
       return result;
     }
     /** UNO IDL singleton page title */
     virtual QCString trSingletonReference(const char *sName)
     {
       QCString result=(QCString)sName;
-      result+= CN_SPC"单例参考";
+      result+= CN_SPC "单例参考";
       return result;
     }
     /** UNO IDL service page */
index 2ddc029..e4a5692 100644 (file)
@@ -1936,7 +1936,7 @@ class TranslatorCzech : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Deklarováno v kategorii @1.";
+      return "Deklarováno v kategorii @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1945,7 +1945,7 @@ class TranslatorCzech : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "Rozšiřuje třídu @1.";
+      return "Rozšiřuje třídu @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index f2ca676..7d3d63a 100644 (file)
@@ -1995,7 +1995,7 @@ class TranslatorGerman : public TranslatorAdapter_1_8_4
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Bestandteil der Kategorie @1.";
+      return "Bestandteil der Kategorie @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -2004,7 +2004,7 @@ class TranslatorGerman : public TranslatorAdapter_1_8_4
      */
     virtual QCString trExtendsClass()
     {
-      return "Erweitert Klasse @1.";
+      return "Erweitert Klasse @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index ba89726..a72c05a 100644 (file)
@@ -1893,7 +1893,7 @@ class TranslatorEnglish : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Provided by category @1.";
+      return "Provided by category @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1902,7 +1902,7 @@ class TranslatorEnglish : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "Extends class @1.";
+      return "Extends class @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index 65f7e82..5415e81 100644 (file)
@@ -1898,7 +1898,7 @@ class TranslatorEsperanto : public TranslatorAdapter_1_8_4
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Provizita de kategorio @1.";
+      return "Provizita de kategorio @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1907,7 +1907,7 @@ class TranslatorEsperanto : public TranslatorAdapter_1_8_4
      */
     virtual QCString trExtendsClass()
     {
-      return "Etendi klason @1.";
+      return "Etendi klason @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index 97d1d26..1b75465 100644 (file)
@@ -1957,7 +1957,7 @@ class TranslatorSpanish : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Proporcionado por categoría @1.";
+      return "Proporcionado por categoría @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1966,7 +1966,7 @@ class TranslatorSpanish : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "Extiende la clase @1.";
+      return "Extiende la clase @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index e1fb5e6..65e77df 100644 (file)
@@ -1954,7 +1954,7 @@ class TranslatorFrench : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Déclarée dans la catégorie @1.";
+      return "Déclarée dans la catégorie @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1963,7 +1963,7 @@ class TranslatorFrench : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "Dérive la classe @1.";
+      return "Dérive la classe @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index e264deb..713b4bb 100644 (file)
@@ -2,7 +2,7 @@
  *
  *
  *
- * Copyright (C) 1997-2015 by Dimitri van Heesch.
+ * Copyright (C) 1997-2014 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
  *               Harry Kalogirou <no email>
  *
  * 01 Jan 2009 : Greek maintenance by
- *               Paul Gessos <gessos.paul@yahoo.gr>
+ *               Paul Gessos <gessos.paul@gmail.com>
+ *
+ * Last update : 06 Jan 2015
  */
 
+/*     English to Greek keyword dictionary
+       (Many words have more clear meaning in English than Greek)
+       template -> πρότυπο
+       instance -> υπόσταση
+       module -> υπομονάδα
+       interface -> διεπαφή (ενναλλακτικά μπορεί να χρησιμοποιηθεί: διασύνδεση)
+       singleton -> μονοσύνολο
+       service -> υπηρεσία
+       exception -> εξαίρεση
+       namespace -> χώρος ονομάτων
+       enumeration -> απαρίθμηση
+*/ 
 #ifndef TRANSLATOR_GR_H
 #define TRANSLATOR_GR_H
 
-class TranslatorGreek : public TranslatorAdapter_1_8_4
+class TranslatorGreek : public Translator
 {
   public:
 
@@ -63,7 +79,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
 
     /*! header that is put before the list of typedefs. */
     virtual QCString trMemberTypedefDocumentation()
-    { return "Τεκμηρίωση Μελών Typedef"; }
+    { return "Τεκμηρίωση Μελών Ορισμών Τύπων"; }
 
     /*! header that is put before the list of enumerations. */
     virtual QCString trMemberEnumerationDocumentation()
@@ -118,7 +134,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
 
     /*! put after an enum name in the list of all members */
     virtual QCString trEnumName()
-    { return "όνομα απαρύθμισης"; }
+    { return "όνομα απαρίθμησης"; }
 
     /*! put after an enum value in the list of all members */
     virtual QCString trEnumValue()
@@ -134,7 +150,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
      *  compounds or files (see the \\group command).
      */
     virtual QCString trModules()
-    { return "Î\9aομμάÏ\84ια"; }
+    { return "Î¥Ï\80ομονάδεÏ\82"; }
 
     /*! This is put above each page as a link to the class hierarchy */
     virtual QCString trClassHierarchy()
@@ -214,12 +230,12 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Ακολουθούνε οι δομές δεδομένων με σύντομες περιγραφές:";
+        return "Ακολουθούν οι δομές δεδομένων με σύντομες περιγραφές:";
       }
       else
       {
-        return "Ακολουθούνε οι κλάσεις, δομές, "
-               "ενώσεις και οι διασυνδέσεις με σύντομες περιγραφές:";
+        return "Ακολουθούν οι κλάσεις, οι δομές, "
+               "οι ÎµÎ½Ï\8eÏ\83ειÏ\82 ÎºÎ±Î¹ Î¿Î¹ Î´Î¹Î±Ï\83Ï\85νδέÏ\83ειÏ\82 Î¼Îµ Ï\83Ï\8dνÏ\84ομεÏ\82 Ï\80εÏ\81ιγÏ\81αÏ\86έÏ\82:";
       }
     }
 
@@ -297,7 +313,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
 
     /*! This is an introduction to the page with the list of class/file groups */
     virtual QCString trModulesDescription()
-    { return "Ακολουθεί η λίστα όλων των μονάδων:"; }
+    { return "Ακολουθεί η λίστα όλων των υπομονάδων:"; }
 
     // index titles (the project name is prepended for these)
 
@@ -310,7 +326,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
      * index of all groups.
      */
     virtual QCString trModuleIndex()
-    { return "Ευρετήριο μονάδων"; }
+    { return "Ευρετήριο υπομονάδων"; }
 
     /*! This is used in LaTeX as the title of the chapter with the
      * class hierarchy.
@@ -337,13 +353,13 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
      * list of all files.
      */
     virtual QCString trFileIndex()
-    { return "Î\95Ï\85Ï\81εÏ\84ήÏ\84ιο Αρχείων"; }
+    { return "Î\95Ï\85Ï\81εÏ\84ήÏ\81ιο Αρχείων"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all groups.
      */
     virtual QCString trModuleDocumentation()
-    { return "ΤεκμηÏ\81ίÏ\89Ï\83η Î\9cονάδων"; }
+    { return "ΤεκμηÏ\81ίÏ\89Ï\83η Î¥Ï\80ομονάδων"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all classes, structs and unions.
@@ -380,7 +396,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
 
     /*! This is used in LaTeX as the title of the document */
     virtual QCString trReferenceManual()
-    { return "Î\95γÏ\87ειÏ\81ίδιο Î\91ναÏ\86οÏ\81άς"; }
+    { return "Î\95γÏ\87ειÏ\81ίδιο Î¤ÎµÎºÎ¼Î·Ï\81ίÏ\89Ï\83ης"; }
 
     /*! This is used in the documentation of a file as a header before the
      *  list of defines
@@ -494,7 +510,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
 
     /*! this text is generated when the \\date command is used. */
     virtual QCString trDate()
-    { return "Ημ/νια"; }
+    { return "Ημερομηνία"; }
 
     /*! this text is generated when the \\return command is used. */
     virtual QCString trReturns()
@@ -558,14 +574,14 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
                                     ClassDef::CompoundType compType,
                                     bool isTemplate)
     {
-      QCString result=(QCString)"Î\91ναÏ\86οÏ\81ά";
+      QCString result=(QCString)"ΤεκμηÏ\81ίÏ\89Ï\83η";
       if (isTemplate) result+=" Προτύπου";
       switch(compType)
       {
         case ClassDef::Class:      result+=" Κλάσης "; break;
         case ClassDef::Struct:     result+=" Δομής "; break;
         case ClassDef::Union:      result+=" Ένωσης "; break;
-        case ClassDef::Interface:  result+=" Î\94ιαÏ\83Ï\8dνδεÏ\83ης "; break;
+        case ClassDef::Interface:  result+=" Î\94ιεÏ\80αÏ\86ής "; break;
         case ClassDef::Protocol:   result+=" Πρωτοκόλλου "; break;
         case ClassDef::Category:   result+=" Κατηγορίας "; break;
         case ClassDef::Exception:  result+=" Εξαίρεσης "; break;
@@ -578,7 +594,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
     /*! used as the title of the HTML page of a file */
     virtual QCString trFileReference(const char *fileName)
     {
-      QCString result="Î\91ναÏ\86οÏ\81ά Αρχείου ";
+      QCString result="ΤεκμηÏ\81ίÏ\89Ï\83η Αρχείου ";
       result+=fileName;
       return result;
     }
@@ -586,7 +602,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
     /*! used as the title of the HTML page of a namespace */
     virtual QCString trNamespaceReference(const char *namespaceName)
     {
-      QCString result="Î\91ναÏ\86οÏ\81ά Χώρου Ονομάτων ";
+      QCString result="ΤεκμηÏ\81ίÏ\89Ï\83η Χώρου Ονομάτων ";
       result+=namespaceName;
       return result;
     }
@@ -594,21 +610,21 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
     virtual QCString trPublicMembers()
     { return "Δημόσιες Μέθοδοι"; }
     virtual QCString trPublicSlots()
-    { return "Î\94ημÏ\8cÏ\83ια Slots"; }
+    { return "Î\94ημÏ\8cÏ\83ιεÏ\82 Î¥Ï\80οδοÏ\87έÏ\82"; }
     virtual QCString trSignals()
     { return "Σήματα"; }
     virtual QCString trStaticPublicMembers()
-    { return "ΣÏ\84αÏ\84ικέÏ\82 Î\94ημÏ\8cÏ\83ιεÏ\82 Î\9cέδοδοι"; }
+    { return "ΣÏ\84αÏ\84ικέÏ\82 Î\94ημÏ\8cÏ\83ιεÏ\82 Î\9cέθοδοι"; }
     virtual QCString trProtectedMembers()
-    { return "ΠÏ\81οÏ\83Ï\84αÏ\84εÏ\85μένεÏ\82 Î\9cέδοδοι"; }
+    { return "ΠÏ\81οÏ\83Ï\84αÏ\84εÏ\85μένεÏ\82 Î\9cέθοδοι"; }
     virtual QCString trProtectedSlots()
-    { return "ΠÏ\81οÏ\83Ï\84αÏ\84εÏ\85μένα Slots"; }
+    { return "ΠÏ\81οÏ\83Ï\84αÏ\84εÏ\85μένεÏ\82 Î¥Ï\80οδοÏ\87έÏ\82"; }
     virtual QCString trStaticProtectedMembers()
-    { return "ΣÏ\84αÏ\84ικέÏ\82 Î Ï\81οÏ\83Ï\84αÏ\84εÏ\85μένεÏ\82 Î\9cέδοδοι"; }
+    { return "ΣÏ\84αÏ\84ικέÏ\82 Î Ï\81οÏ\83Ï\84αÏ\84εÏ\85μένεÏ\82 Î\9cέθοδοι"; }
     virtual QCString trPrivateMembers()
     { return "Ιδιωτικές Μέθοδοι"; }
     virtual QCString trPrivateSlots()
-    { return "Ιδιοτικά Slots"; }
+    { return "Ιδιωτικές Υποδοχές"; }
     virtual QCString trStaticPrivateMembers()
     { return "Στατικές Ιδιωτικές Μέθοδοι"; }
 
@@ -642,7 +658,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
      */
     virtual QCString trInheritsList(int numEntries)
     {
-      return "Κληρονομεί "+trWriteList(numEntries)+".";
+      return QCString("Κληρονομεί ")+(numEntries==1?"την ":"τις ")+trWriteList(numEntries)+".";
     }
 
     /*! used in class documentation to produce a list of super classes,
@@ -650,7 +666,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
      */
     virtual QCString trInheritedByList(int numEntries)
     {
-      return "Κληρονομείται από "+trWriteList(numEntries)+".";
+      return QCString("Κληρονομείται από ")+(numEntries==1?"την ":"τις ")+trWriteList(numEntries)+".";
     }
 
     /*! used in member documentation blocks to produce a list of
@@ -658,7 +674,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
      */
     virtual QCString trReimplementedFromList(int numEntries)
     {
-      return "Επαναϋλοποιείται από "+trWriteList(numEntries)+".";
+      return QCString("Επαναϋλοποιείται από ")+(numEntries==1?"την ":"τις ")+trWriteList(numEntries)+".";
     }
 
     /*! used in member documentation blocks to produce a list of
@@ -666,7 +682,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
      */
     virtual QCString trReimplementedInList(int numEntries)
     {
-      return "Επαναϋλοποιείται στην "+trWriteList(numEntries)+".";
+      return QCString("Επαναϋλοποιείται ")+(numEntries==1?"στην ":"στις ")+trWriteList(numEntries)+".";
     }
 
     /*! This is put above each page as a link to all members of namespaces. */
@@ -724,14 +740,14 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
         case ClassDef::Class:      result+="αυτή την κλάση"; break;
         case ClassDef::Struct:     result+="αυτή τη δομή"; break;
         case ClassDef::Union:      result+="αυτή την ένωση"; break;
-        case ClassDef::Interface:  result+="αÏ\85Ï\84ή Ï\84η Î´Î¹Î±Ï\83Ï\8dνδεÏ\83η"; break;
+        case ClassDef::Interface:  result+="αÏ\85Ï\84ή Ï\84η Î´Î¹ÎµÏ\80αÏ\86ή"; break;
         case ClassDef::Protocol:   result+="αυτό το πρωτόκολλο"; break;
         case ClassDef::Category:   result+="αυτή την κατηγορία"; break;
         case ClassDef::Exception:  result+="αυτή την εξαίρεση"; break;
         default: break;
       }
-      result+=" δημιουργήθηκε απο τ";
-      if (single) result+="ο ακόλουθο αρχείο:"; else result+="α ακόλουθα αρχεία:";
+      result+=" δημιουργήθηκε από ";
+      if (single) result+="το ακόλουθο αρχείο:"; else result+="τα ακόλουθα αρχεία:";
       return result;
     }
 
@@ -783,7 +799,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
     /*! this text is put before a collaboration diagram */
     virtual QCString trCollaborationDiagram(const char *clName)
     {
-      return (QCString)"Î\94ίαγραμμα Συνεργασίας για την κλάση "+clName+":";
+      return (QCString)"Î\94ιάγραμμα Συνεργασίας για την κλάση "+clName+":";
     }
     /*! this text is put before an include dependency graph */
     virtual QCString trInclDepGraph(const char *fName)
@@ -1011,8 +1027,8 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
         "<li>Ένα μωβ διακεκομένο βέλος χρησιμοποιείται αν μία κλάση περιέχεται ή χρησιμοποιείται "
         "από μία άλλη κλάση. Το βέλος ονομάζεται από το όνομα της μεταβλητής(ων) "
         "μέσω της οποίας η κλάση ή δομή είναι προσβάσιμη.</li>\n"
-        "<li>Ένα κίτρινο διακεκομμένο βέλος χρησιμοποιείται για μια σχέση μεταξύ ενός template αντικειμένου και "
-        "της template κλάσης από την οποία δημιουργήθηκε. Το βέλος ονομάζεται με τις παραμέτρους του template "
+        "<li>Ένα κίτρινο διακεκομμένο βέλος χρησιμοποιείται για μια σχέση μεταξύ ενός προτύπου αντικειμένου και "
+        "της πρότυπης κλάσης από την οποία δημιουργήθηκε. Το βέλος ονομάζεται με τις παραμέτρους του προτύπου "
         "του αντικειμένου.</li>\n"
         "</ul>\n";
     }
@@ -1185,8 +1201,9 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
      */
     virtual QCString trNamespace(bool first_capital, bool singular)
     {
-      QCString result((first_capital ? "Namespace" : "namespace"));
-      if (!singular)  result+="s";
+      QCString result((first_capital ? "Χ" : "χ"));
+      if (!singular)  result+="ώροι"; else result+="ώρος";
+         result+=" ονομάτων";
       return result;
     }
 
@@ -1503,7 +1520,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
      *  of documentation blocks for enumeration values
      */
     virtual QCString trEnumerationValueDocumentation()
-    { return "Enumerator Documentation"; }
+    { return "Τεκμηρίωση Απαρίθμησης"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 1.5.4 (mainly for Fortran)
@@ -1600,7 +1617,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
         case ClassDef::Class:      result+=" Υπομονάδα"; break;
         case ClassDef::Struct:     result+=" Τύπος"; break;
         case ClassDef::Union:      result+=" Ένωση"; break;
-        case ClassDef::Interface:  result+=" Interface"; break;
+        case ClassDef::Interface:  result+=" Διεπαφή"; break;
         case ClassDef::Protocol:   result+=" Πρωτόκολλο"; break;
         case ClassDef::Category:   result+=" Κατηγορία"; break;
         case ClassDef::Exception:  result+=" Εξαίρεση"; break;
@@ -1668,7 +1685,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
         case ClassDef::Class:      result+="αυτή την υπομονάδα"; break;
         case ClassDef::Struct:     result+="αυτό τον τύπο δεδομένων"; break;
         case ClassDef::Union:      result+="αυτή την ένωση"; break;
-        case ClassDef::Interface:  result+="αυτό το interface"; break;
+        case ClassDef::Interface:  result+="αυτή τη διεπαφή"; break;
         case ClassDef::Protocol:   result+="αυτό το πρωτόκολλο"; break;
         case ClassDef::Category:   result+="αυτή την κατηγορία"; break;
         case ClassDef::Exception:  result+="αυτή την εξαίρεση"; break;
@@ -1864,7 +1881,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Παρέχεται από την κατηγορία @1.";
+      return "Παρέχεται από την κατηγορία @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1873,7 +1890,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
      */
     virtual QCString trExtendsClass()
     {
-      return "Κληρονομει την κλάση @1.";
+      return "Κληρονομει την κλάση @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
@@ -1889,7 +1906,7 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
      */
     virtual QCString trInstanceMethods()
     {
-      return "Î\9cέθοδοι Î\91νÏ\84ικειμένοÏ\85";
+      return "Î\9cέθοδοι Î¥Ï\80Ï\8cÏ\83Ï\84αÏ\83ηÏ\82";
     }
 
     /*! Used as the header of the member functions of an Objective-C class.
@@ -1907,15 +1924,61 @@ class TranslatorGreek : public TranslatorAdapter_1_8_4
       return "Επισκόπηση σχεδίασης";
     }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
 
-/* Future strategy of changes
-       Many words have more clear meaning in English and not in Greek:
-       template -> πρότυπο
-       instance -> αντικείμενο? (μπορεί να μιλάμε για template instantiation ή class instantiation)
-       interface -> διασύνδεση
-*/
+    /** old style UNO IDL services: implemented interfaces */
+    virtual QCString trInterfaces()
+    { return "Εξαγόμενες Διεπαφές"; }
 
-//////////////////////////////////////////////////////////////////////////
+    /** old style UNO IDL services: inherited services */
+    virtual QCString trServices()
+    { return "Συμπεριλαμβανόμενες Υπηρεσίες"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroups()
+    { return "Ομάδες Σταθερών"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroupReference(const char *namespaceName)
+    {
+      QCString result=namespaceName;
+      result+=" Τεκμηρίωση Ομάδας Σταθερών";
+      return result;
+    }
+    /** UNO IDL service page title */
+    virtual QCString trServiceReference(const char *sName)
+    {
+      QCString result=(QCString)sName;
+      result+=" Τεκμηρίωση Υπηρεσίας";
+      return result;
+    }
+    /** UNO IDL singleton page title */
+    virtual QCString trSingletonReference(const char *sName)
+    {
+      QCString result=(QCString)sName;
+      result+=" Τεκμηρίωση Μονοσύνολου";
+      return result;
+    }
+    /** UNO IDL service page */
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"Η τεκμηρίωση για την υπηρεσία αυτή "
+                                "δημιουργήθηκε από ";
+      if (single) result+="το ακόλουθο αρχείο:"; else result+="τα ακόλουθα αρχεία:";
+      return result;
+    }
+    /** UNO IDL singleton page */
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"Η τεκμηρίωση για αυτό το μονοσύνολο "
+                                "δημιουργήθηκε από ";
+      if (single) result+="το ακόλουθο αρχείο:"; else result+="τα ακόλουθα αρχεία:";
+      return result;
+    }
 
 };
 
index c52aa50..e2c51c7 100644 (file)
  *
  * Revision history
  *
+ *  2015/07: updated translation of new items used since version 1.8.2 and 1.8.4
+ *           corrected a typo
+ *           updated translator mail address
  *  2012/04: updated translation of new items used since version 1.7.5 and 1.8.0
  *  2010/08: updated translation of new items used since version 1.6.0 and 1.6.3
  *           completely reviewed the translation in the trLegendDocs() function
  *           corrected some typos all around
  *           reviewed some translations all around
  *  2007/11: updated translation of new items used since version 1.5.4
- *  2007/10: Included corrections provided by Arialdo Martini <arialdomartini@bebox.it>, updated some strings marked with 'translate me' comment
+ *  2007/10: Included corrections provided by Arialdo Martini <arialdomartini@bebox.it>
+ *           updated some strings marked with 'translate me' comment
  *  2006/10: made class to derive directly from Translator class (reported in Petr Prikryl October 9 translator report)
  *  2006/06: updated translation of new items used since version 1.4.6
  *  2006/05: translated new items used since version 1.4.6
  * tecnica (ad es. "lista dei file" e non "lista dei files")
  *
  * Se avete suggerimenti sulla traduzione di alcuni termini o volete segnalare
- * eventuali sviste potete scrivermi all'indirizzo: alessandro@falappa.net
+ * eventuali sviste potete scrivermi all'indirizzo: alex.falappa@gmail.com
  */
 
 #ifndef TRANSLATOR_IT_H
 #define TRANSLATOR_IT_H
 
-class TranslatorItalian : public TranslatorAdapter_1_8_2
+class TranslatorItalian : public Translator
 {
   public:
 
@@ -1832,7 +1836,7 @@ class TranslatorItalian : public TranslatorAdapter_1_8_2
 
     /*! Used file list for a Java enum */
     virtual QCString trEnumGeneratedFromFiles(bool single)
-    { QCString result = "La documentazione per questo tipo enumerato è stata generata";
+    { QCString result = "La documentazione per questo tipo enumerato è stata generata a partire";
       if (!single) result += " dai seguenti";
       else result += " dal seguente";
       result+=" file:";
@@ -1853,6 +1857,127 @@ class TranslatorItalian : public TranslatorAdapter_1_8_2
     virtual QCString trAdditionalInheritedMembers()
     { return "Altri membri ereditati"; }
 
+//////////////////////////////////////////////////////////////////////////
+// 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 ? "abilitare" : "disabilitare";
+      return "cliccare per "+opt+" la sincronizzazione del pannello";
+    }
+
+    /*! 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 "Fornito dalla categoria @0.";
+    }
+
+    /*! 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 "Estende la classe @0.";
+    }
+
+    /*! 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 "Metodi della classe";
+    }
+
+    /*! 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 "Metodi di instanza";
+    }
+
+    /*! Used as the header of the member functions of an Objective-C class.
+     */
+    virtual QCString trMethodDocumentation()
+    {
+      return "Documentazione dei metodi";
+    }
+
+    /*! Used as the title of the design overview picture created for the
+     *  VHDL output.
+     */
+    virtual QCString trDesignOverview()
+    {
+      return "Panoramica del progetto";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.8.4
+//////////////////////////////////////////////////////////////////////////
+
+    /** old style UNO IDL services: implemented interfaces */
+    virtual QCString trInterfaces()
+    { return "Interfacce esportate"; }
+
+    /** old style UNO IDL services: inherited services */
+    virtual QCString trServices()
+    { return "Servizi inclusi"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroups()
+    { return "Gruppi di costanti"; }
+
+    /** UNO IDL constant groups */
+    virtual QCString trConstantGroupReference(const char *namespaceName)
+    {
+      QCString result="Riferimenti per il gruppo di costanti ";
+      result+=namespaceName;
+      return result;
+    }
+    /** UNO IDL service page title */
+    virtual QCString trServiceReference(const char *sName)
+    {
+      QCString result=(QCString)"Riferimenti per il servizio ";
+      result+=sName;
+      return result;
+    }
+    /** UNO IDL singleton page title */
+    virtual QCString trSingletonReference(const char *sName)
+    {
+      QCString result=(QCString)"Riferimenti per il singleton ";
+      result+=sName;
+      return result;
+    }
+    /** UNO IDL service page */
+    virtual QCString trServiceGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"La documentazione per questo servizio "
+                                "è stata generata a partire ";
+      if (single) result+="dal seguente file:"; else result+="dai seguenti file:";
+      return result;
+    }
+    /** UNO IDL singleton page */
+    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    {
+      // single is true implies a single file
+      QCString result=(QCString)"La documentazione per questo singleton "
+                                "è stata generata a partire ";
+      if (single) result+="dal seguente file:"; else result+="dai seguenti file:";
+      return result;
+    }
+
+//////////////////////////////////////////////////////////////////////////
+
 };
 
 #endif
index 66f1ac6..4dc9cba 100644 (file)
@@ -1878,7 +1878,7 @@ class TranslatorJapanese : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "@1 カテゴリーから提供されています。";
+      return "@0 カテゴリーから提供されています。";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1887,7 +1887,7 @@ class TranslatorJapanese : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "@1 を拡張しています。";
+      return "@0 を拡張しています。";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index 7d669a5..2ef50e8 100644 (file)
@@ -1903,7 +1903,7 @@ class TranslatorKorean : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "카테고리 @1에 의해 제공됨.";
+      return "카테고리 @0에 의해 제공됨.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1912,7 +1912,7 @@ class TranslatorKorean : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "클래스 @1 확장.";
+      return "클래스 @0 확장.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index 20b2a38..35aab0f 100644 (file)
@@ -1901,7 +1901,7 @@ class TranslatorLatvian : public TranslatorAdapter_1_8_4
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Nodrošina kategorija @1.";
+      return "Nodrošina kategorija @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1910,7 +1910,7 @@ class TranslatorLatvian : public TranslatorAdapter_1_8_4
      */
     virtual QCString trExtendsClass()
     {
-      return "Paplašina klasi @1.";
+      return "Paplašina klasi @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index ab811a5..241cf97 100644 (file)
@@ -1488,7 +1488,7 @@ class TranslatorDutch : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Wordt aangeboden door category @1.";
+      return "Wordt aangeboden door category @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1497,7 +1497,7 @@ class TranslatorDutch : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "Uitbereiding van klasse @1.";
+      return "Uitbereiding van klasse @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index 5edfdf6..5df58d7 100644 (file)
@@ -1903,7 +1903,7 @@ class TranslatorPortuguese : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Provido pela categoria @1.";
+      return "Provido pela categoria @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1912,7 +1912,7 @@ class TranslatorPortuguese : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "estende a classe @1.";
+      return "estende a classe @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index 394e570..eba7d47 100644 (file)
@@ -1908,7 +1908,7 @@ class TranslatorRomanian : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Furnizat de categoria @1.";
+      return "Furnizat de categoria @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1917,7 +1917,7 @@ class TranslatorRomanian : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "Extinde clasa @1.";
+      return "Extinde clasa @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index c06027c..2162a34 100644 (file)
@@ -1869,7 +1869,7 @@ class TranslatorRussian : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "По группам @1.";
+      return "По группам @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1878,7 +1878,7 @@ class TranslatorRussian : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "Расширяет класс @1.";
+      return "Расширяет класс @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index 875e92c..d6d94a6 100644 (file)
@@ -1866,7 +1866,7 @@ class TranslatorSlovak : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Deklarované v kategórii @1.";
+      return "Deklarované v kategórii @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1875,7 +1875,7 @@ class TranslatorSlovak : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "Rozširuje triedu @1.";
+      return "Rozširuje triedu @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index 68b8a1b..d491632 100644 (file)
@@ -1764,7 +1764,7 @@ class TranslatorSwedish : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Tillhandahålls av kategori @1.";
+      return "Tillhandahålls av kategori @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1773,7 +1773,7 @@ class TranslatorSwedish : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "Utökar klass @1.";
+      return "Utökar klass @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
index e61ab5c..79bf6f5 100644 (file)
@@ -749,8 +749,7 @@ class TranslatorChinesetraditional : public Translator
     /*! This is put at the bottom of a class documentation page and is
      *  followed by a list of files that were used to generate the page.
      */
-    virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
-        bool single)
+    virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,bool)
     { // here s is one of " Class", " Struct" or " Union"
       // single is true implies a single file
       QCString result=(QCString)"此";
@@ -766,7 +765,7 @@ class TranslatorChinesetraditional : public Translator
         default: break;
       }
       result+=" 文件是由下列檔案中產生";
-      if (single) result+=":"; else result+=":";
+      result+=":";
       return result;
     }
 
@@ -1867,7 +1866,7 @@ class TranslatorChinesetraditional : public Translator
      */
     virtual QCString trProvidedByCategory()
     {
-      return "由 @1 分類所提供.";
+      return "由 @0 分類所提供.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1876,7 +1875,7 @@ class TranslatorChinesetraditional : public Translator
      */
     virtual QCString trExtendsClass()
     {
-      return "延伸 @1 類別 .";
+      return "延伸 @0 類別 .";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
@@ -1948,21 +1947,21 @@ class TranslatorChinesetraditional : public Translator
       return result;
     }
     /** UNO IDL service page */
-    virtual QCString trServiceGeneratedFromFiles(bool single)
+    virtual QCString trServiceGeneratedFromFiles(bool)
     {
       // single is true implies a single file
       QCString result=(QCString)"本服務的文件由以下的檔案"
                                 "所產生";
-      if (single) result+=":"; else result+=":";
+      result+=":";
       return result;
     }
     /** UNO IDL singleton page */
-    virtual QCString trSingletonGeneratedFromFiles(bool single)
+    virtual QCString trSingletonGeneratedFromFiles(bool)
     {
       // single is true implies a single file
       QCString result=(QCString)"本singleton的文件由下面的檔案"
                                 "所產生";
-      if (single) result+=":"; else result+=":";
+      result+=":";
       return result;
     }
 
index 871acd1..964285b 100644 (file)
@@ -1866,7 +1866,7 @@ class TranslatorUkrainian : public TranslatorAdapter_1_8_4
      */
     virtual QCString trProvidedByCategory()
     {
-      return "Забезпечено категорією @1.";
+      return "Забезпечено категорією @0.";
     }
 
     /*! Used in a method of an Objective-C category that extends a class.
@@ -1875,7 +1875,7 @@ class TranslatorUkrainian : public TranslatorAdapter_1_8_4
      */
     virtual QCString trExtendsClass()
     {
-      return "Розширює клас @1.";
+      return "Розширює клас @0.";
     }
 
     /*! Used as the header of a list of class methods in Objective-C.
old mode 100644 (file)
new mode 100755 (executable)
index 3ee7ae5..6f3bc40
@@ -18,6 +18,7 @@
 #include <ctype.h>
 #include <errno.h>
 #include <math.h>
+#include <limits.h>
 
 #include "md5.h"
 
@@ -2472,6 +2473,35 @@ QCString fileToString(const char *name,bool filter,bool isSourceCode)
 QCString dateToString(bool includeTime)
 {
   QDateTime current = QDateTime::currentDateTime();
+  QCString sourceDateEpoch = portable_getenv("SOURCE_DATE_EPOCH");
+  if (!sourceDateEpoch.isEmpty())
+  {
+    bool ok;
+    uint64 epoch = sourceDateEpoch.toUInt64(&ok);
+    if (!ok)
+    {
+      static bool warnedOnce=FALSE;
+      if (!warnedOnce)
+      {
+        warn_uncond("Environment variable SOURCE_DATE_EPOCH does not contain a valid number; value is '%s'\n",
+            sourceDateEpoch.data());
+        warnedOnce=TRUE;
+      }
+    }
+    else if (epoch>UINT_MAX)
+    {
+      static bool warnedOnce=FALSE;
+      if (!warnedOnce)
+      {
+        warn_uncond("Environment variable SOURCE_DATA_EPOCH must have a value smaller than or equal to %llu; actual value %llu\n",UINT_MAX,epoch);
+        warnedOnce=TRUE;
+      }
+    }
+    else // all ok, replace current time with epoch value
+    {
+      current.setTime_t((ulong)epoch); // TODO: add support for 64bit epoch value
+    }
+  }
   return theTranslator->trDateTime(current.date().year(),
                                    current.date().month(),
                                    current.date().day(),
@@ -3975,6 +4005,11 @@ bool getDefs(const QCString &scName,
 
       MemberDef *tmd=0;
       ClassDef *fcd=getResolvedClass(Doxygen::globalScope,0,className,&tmd);
+      if (fcd==0 && className.find('<')!=-1) // try without template specifiers as well
+      {
+         QCString nameWithoutTemplates = stripTemplateSpecifiersFromScope(className,FALSE);
+         fcd=getResolvedClass(Doxygen::globalScope,0,nameWithoutTemplates,&tmd);
+      }
       //printf("Trying class scope %s: fcd=%p tmd=%p\n",className.data(),fcd,tmd);
       // todo: fill in correct fileScope!
       if (fcd &&  // is it a documented class
@@ -4261,7 +4296,7 @@ bool getDefs(const QCString &scName,
         bool found=FALSE;
         MemberListIterator mmli(*mn);
         MemberDef *mmd;
-        for (mmli.toFirst();((mmd=mmli.current()) && !found);++mmli)
+        for (mmli.toFirst();(mmd=mmli.current());++mmli)
         {
           MemberDef *tmd = mmd->getEnumScope();
           //printf("try member %s tmd=%s\n",mmd->name().data(),tmd?tmd->name().data():"<none>");
@@ -4726,7 +4761,7 @@ bool resolveLink(/* in */ const char *scName,
 
   QCString linkRef=lr;
   QCString linkRefWithoutTemplates = stripTemplateSpecifiersFromScope(linkRef,FALSE);
-  //printf("ResolveLink linkRef=%s inSee=%d\n",lr,inSeeBlock);
+  //printf("ResolveLink linkRef=%s\n",lr);
   FileDef  *fd;
   GroupDef *gd;
   PageDef  *pd;
@@ -5646,6 +5681,37 @@ QCString stripScope(const char *name)
   return name;
 }
 
+/*! Converts a string to a HTML id string */
+QCString convertToId(const char *s)
+{
+  static const char hex[] = "0123456789ABCDEF";
+  static GrowBuf growBuf;
+  growBuf.clear();
+  if (s==0) return "";
+  const char *p=s;
+  char c;
+  bool first=TRUE;
+  while ((c=*p++))
+  {
+    char encChar[4];
+    if ((c>='0' && c<='9') || (c>='a' && c<='z') || (c>='A' && c<='Z') || c=='-' || c==':' || c=='.')
+    { // any permissive character except _
+      if (first && c>='0' && c<='9') growBuf.addChar('a'); // don't start with a digit
+      growBuf.addChar(c);
+    }
+    else
+    {
+      encChar[0]='_';
+      encChar[1]=hex[((unsigned char)c)>>4];
+      encChar[2]=hex[((unsigned char)c)&0xF];
+      encChar[3]=0;
+      growBuf.addStr(encChar);
+    }
+    first=FALSE;
+  }
+  growBuf.addChar(0);
+  return growBuf.get();
+}
 
 /*! Converts a string to an XML-encoded string */
 QCString convertToXML(const char *s)
@@ -5743,6 +5809,15 @@ QCString convertToJSString(const char *s)
   return convertCharEntitiesToUTF8(growBuf.get());
 }
 
+QCString convertToLaTeX(const QCString &s,bool insideTabbing,bool keepSpaces)
+{
+  QGString result;
+  FTextStream t(&result);
+  filterLatexString(t,s,insideTabbing,FALSE,FALSE,keepSpaces);
+  return result.data();
+}
+
+
 
 QCString convertCharEntitiesToUTF8(const QCString &s)
 {
@@ -5831,7 +5906,8 @@ void addMembersToMemberGroup(MemberList *ml,
                     groupId,
                     info->header,
                     info->doc,
-                    info->docFile
+                    info->docFile,
+                    info->docLine
                     );
                 (*ppMemberGroupSDict)->append(groupId,mg);
               }
@@ -5863,7 +5939,8 @@ void addMembersToMemberGroup(MemberList *ml,
               groupId,
               info->header,
               info->doc,
-              info->docFile
+              info->docFile,
+              info->docLine
               );
           (*ppMemberGroupSDict)->append(groupId,mg);
         }
@@ -6324,11 +6401,7 @@ PageDef *addRelatedPage(const char *name,const QCString &ptitle,
     if (tagInfo)
     {
       pd->setReference(tagInfo->tagName);
-      pd->setFileName(tagInfo->fileName,TRUE);
-    }
-    else
-    {
-      pd->setFileName(convertNameToFile(pd->name(),FALSE,TRUE),FALSE);
+      pd->setFileName(tagInfo->fileName);
     }
 
     //printf("Appending page `%s'\n",baseName.data());
@@ -6458,10 +6531,9 @@ void addGroupListToTitle(OutputList &ol,Definition *d)
 }
 
 void filterLatexString(FTextStream &t,const char *str,
-    bool insideTabbing,bool insidePre,bool insideItem)
+    bool insideTabbing,bool insidePre,bool insideItem,bool keepSpaces)
 {
   if (str==0) return;
-  //printf("filterLatexString(%s)\n",str);
   //if (strlen(str)<2) stackTrace();
   const unsigned char *p=(const unsigned char *)str;
   const unsigned char *q;
@@ -6480,8 +6552,11 @@ void filterLatexString(FTextStream &t,const char *str,
         case '{':  t << "\\{"; break;
         case '}':  t << "\\}"; break;
         case '_':  t << "\\_"; break;
-        default: 
+        case ' ':  if (keepSpaces) t << "~"; else t << ' ';
+                   break;
+        default:
                    t << (char)c;
+                   break;
       }
     }
     else
@@ -6551,11 +6626,13 @@ void filterLatexString(FTextStream &t,const char *str,
                    break;
         case '\'': t << "\\textquotesingle{}";
                    break;
+        case ' ':  if (keepSpaces) { if (insideTabbing) t << "\\>"; else t << '~'; } else t << ' ';
+                   break;
 
         default:   
                    //if (!insideTabbing && forceBreaks && c!=' ' && *p!=' ')
                    if (!insideTabbing && 
-                       ((c>='A' && c<='Z' && pc!=' ' && pc!='\0') || (c==':' && pc!=':') || (pc=='.' && isId(c)))
+                       ((c>='A' && c<='Z' && pc!=' ' && pc!='\0' && *p) || (c==':' && pc!=':') || (pc=='.' && isId(c)))
                       )
                    {
                      t << "\\+";
@@ -6567,6 +6644,102 @@ void filterLatexString(FTextStream &t,const char *str,
   }
 }
 
+QCString latexEscapeLabelName(const char *s,bool insideTabbing)
+{
+  QGString result;
+  QCString tmp(qstrlen(s)+1);
+  FTextStream t(&result);
+  const char *p=s;
+  char c;
+  int i;
+  while ((c=*p++))
+  {
+    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
+        tmp[i++]=c;
+        while ((c=*p) && c!='|' && c!='!' && c!='%' && c!='{' && c!='}' && c!='~')
+        {
+          tmp[i++]=c;
+          p++;
+        }
+        tmp[i]=0;
+        filterLatexString(t,tmp.data(),insideTabbing);
+        break;
+    }
+  }
+  return result.data();
+}
+
+QCString latexEscapeIndexChars(const char *s,bool insideTabbing)
+{
+  QGString result;
+  QCString tmp(qstrlen(s)+1);
+  FTextStream t(&result);
+  const char *p=s;
+  char c;
+  int i;
+  while ((c=*p++))
+  {
+    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
+        tmp[i++]=c;
+        while ((c=*p) && c!='"' && c!='@' && c!='[' && c!=']' && c!='!' && c!='{' && c!='}' && c!='|')
+        {
+          tmp[i++]=c;
+          p++;
+        }
+        tmp[i]=0;
+        filterLatexString(t,tmp.data(),insideTabbing);
+        break;
+    }
+  }
+  return result.data();
+}
+
+QCString latexEscapePDFString(const char *s)
+{
+  QGString result;
+  FTextStream t(&result);
+  const char *p=s;
+  char c;
+  int i;
+  while ((c=*p++))
+  {
+    switch (c)
+    {
+      case '\\': t << "\\textbackslash{}"; break;
+      case '{':  t << "\\{"; break;
+      case '}':  t << "\\}"; break;
+      default:
+        t << c;
+        break;
+    }
+  }
+  return result.data();
+}
+
 
 QCString rtfFormatBmkStr(const char *name)
 {
@@ -6825,6 +6998,7 @@ bool updateLanguageMapping(const QCString &extension,const QCString &language)
 
 void initDefaultExtensionMapping()
 {
+  // NOTE: when adding an extension, also add the extension in config.xml
   g_extLookup.setAutoDelete(TRUE);
   //                  extension      parser id
   updateLanguageMapping(".dox",      "c");
@@ -6864,8 +7038,9 @@ void initDefaultExtensionMapping()
   updateLanguageMapping(".phtml",    "php");
   updateLanguageMapping(".m",        "objective-c");
   updateLanguageMapping(".M",        "objective-c");
-  updateLanguageMapping(".mm",       "objective-c");
+  updateLanguageMapping(".mm",       "c");  // see bug746361
   updateLanguageMapping(".py",       "python");
+  updateLanguageMapping(".pyw",      "python");
   updateLanguageMapping(".f",        "fortran");
   updateLanguageMapping(".for",      "fortran");
   updateLanguageMapping(".f90",      "fortran");
@@ -8324,7 +8499,7 @@ void convertProtectionLevel(
         if (extractPrivate)
         {
           *outListType1=MemberListType_pubSlots;
-          *outListType1=MemberListType_proSlots;
+          *outListType2=MemberListType_proSlots;
         }
         else
         {
@@ -8390,3 +8565,48 @@ QCString getDotImageExtension(void)
   imgExt = imgExt.replace( QRegExp(":.*"), "" );
   return imgExt;
 }
+
+void initFilePattern(void)
+{
+  // add default pattern if needed
+  QStrList &filePatternList = Config_getList("FILE_PATTERNS");
+  if (filePatternList.isEmpty())
+  {
+    QDictIterator<int> it( g_extLookup );
+    QCString pattern;
+    bool caseSens =  portable_fileSystemIsCaseSensitive();
+    for (;it.current();++it)
+    {
+      pattern = "*";
+      pattern += it.currentKey();
+      filePatternList.append(pattern.data());
+      if (caseSens) filePatternList.append(pattern.upper().data());
+    }
+  }
+}
+
+bool openOutputFile(const char *outFile,QFile &f)
+{
+  bool fileOpened=FALSE;
+  bool writeToStdout=(outFile[0]=='-' && outFile[1]=='\0');
+  if (writeToStdout) // write to stdout
+  {
+    fileOpened = f.open(IO_WriteOnly,stdout);
+  }
+  else // write to file
+  {
+    QFileInfo fi(outFile);
+    if (fi.exists()) // create a backup
+    {
+      QDir dir=fi.dir();
+      QFileInfo backup(fi.fileName()+".bak");
+      if (backup.exists()) // remove existing backup
+        dir.remove(backup.fileName());
+      dir.rename(fi.fileName(),fi.fileName()+".bak");
+    } 
+    f.setName(outFile);
+    fileOpened = f.open(IO_WriteOnly|IO_Translate);
+  }
+  return fileOpened;
+}
+
old mode 100644 (file)
new mode 100755 (executable)
index 43d8752..3f976e3
@@ -57,6 +57,7 @@ class BufStr;
 class QFileInfo;
 class QStrList;
 class FTextStream;
+class QFile;
 
 //--------------------------------------------------------------------
 
@@ -274,8 +275,12 @@ QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &te
 
 QCString stripScope(const char *name);
 
+QCString convertToId(const char *s);
+
 QCString convertToHtml(const char *s,bool keepEntities=TRUE);
 
+QCString convertToLaTeX(const QCString &s,bool insideTabbing=FALSE,bool keepSpaces=FALSE);
+
 QCString convertToXML(const char *s);
 
 QCString convertToJSString(const char *s);
@@ -334,7 +339,12 @@ void addGroupListToTitle(OutputList &ol,Definition *d);
 void filterLatexString(FTextStream &t,const char *str,
                        bool insideTabbing=FALSE,
                        bool insidePre=FALSE,
-                       bool insideItem=FALSE);
+                       bool insideItem=FALSE,
+                       bool keepSpaces=FALSE);
+
+QCString latexEscapeLabelName(const char *s,bool insideTabbing);
+QCString latexEscapeIndexChars(const char *s,bool insideTabbing);
+QCString latexEscapePDFString(const char *s);
 
 QCString rtfFormatBmkStr(const char *name);
 
@@ -464,6 +474,8 @@ void convertProtectionLevel(
                   );
 
 bool mainPageHasTitle();
+void initFilePattern(void);
+bool openOutputFile(const char *outFile,QFile &f);
 
 #endif
 
diff --git a/src/version.py b/src/version.py
deleted file mode 100755 (executable)
index a99ede3..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-# 
-
-# script to read the version information from `../configure`
-# relevant lines are starting with:
-#   `doxygen_version_major`
-#   `doxygen_version_minor`
-#   `doxygen_version_revision`
-#   `doxygen_version_mmn`
-# the collected information is written to: `../VERSION` and `../src/version.cpp`
-#
-import sys
-import os
-#
-# set 'default' values
-#
-major = 0
-minor = 0
-revision = 0
-mnt = 'NO'
-configure = '../configure'
-if len(sys.argv) > 2:
-    configure = sys.argv[2]
-#
-# open input file
-#  read file and get relevant information
-# close
-#
-f = open(configure, 'r')
-for line in f:
-    # check if line can match (saves 3 comparisons)
-    if (line.startswith('doxygen_version')):
-        if (line.startswith('doxygen_version_major')):
-            major = line.replace('doxygen_version_major=','')
-        elif (line.startswith('doxygen_version_minor')):
-            minor = line.replace('doxygen_version_minor=','')
-        elif (line.startswith('doxygen_version_revision')):
-            revision = line.replace('doxygen_version_revision=','')
-        elif (line.startswith('doxygen_version_mmn')):
-            mnt = line.replace('doxygen_version_mmn=','')
-f.close()
-
-# strip superfluous '\n`
-major = major.replace('\n','')
-minor = minor.replace('\n','')
-revision = revision.replace('\n','')
-mnt = mnt.replace('\n','')
-#
-# open output files
-# write relevant infomation
-# close files
-#
-f1 = open('../VERSION','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 + '";')
-else:
-    f1.write(major + '.' + minor + '.' + revision + '-' + mnt)
-    f2.write('char versionString[]="' + major + '.' + minor + '.' + revision + '-' + mnt + '";')
-f1.close()
-f2.close()
index 369ae48..e4ae0e7 100644 (file)
@@ -1613,7 +1613,7 @@ void codeFreeVhdlScanner()
 extern "C" { // some bogus code to keep the compiler happy
   void vhdlcodeYYdummy() { yy_flex_realloc(0,0); } 
 }
-#elif YY_FLEX_SUBMINOR_VERSION<33
+#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33
 #error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!"
 #endif
 
index 029d0bd..2d473b2 100644 (file)
 #include <qcstring.h>
 #include <qfileinfo.h>
 #include <qstringlist.h>
-
-//#ifdef DEBUGFLOW
 #include <qmap.h>
-//#endif
 
 /* --------------------------------------------------------------- */
 
@@ -47,7 +44,6 @@
 #include "searchindex.h"
 #include "outputlist.h"
 #include "parserintf.h"
-
 #include "layout.h"
 #include "arguments.h"
 #include "portable.h"
 #include "filename.h"
 #include "membergroup.h"
 #include "memberdef.h"
-
+#include "plantuml.h"
 #include "vhdljjparser.h"
 #include "VhdlParser.h"
-
 #include "vhdlcode.h"
+#include "plantuml.h"
+//#define DEBUGFLOW
 #define theTranslator_vhdlType VhdlDocGen::trVhdlType
 
 static QDict<QCString> g_vhdlKeyDict0(17,FALSE);
@@ -95,7 +92,7 @@ void VhdlDocGen::setFlowMember( const MemberDef* mem)
   flowMember=mem;
 }
 
-const MemberDef* VhdlDocGen::getFlowMember()
+ const MemberDef* VhdlDocGen::getFlowMember()
 {
   return flowMember;
 }
@@ -967,7 +964,6 @@ QCString VhdlDocGen::getClassTitle(const ClassDef *cd)
 {
   QCString pageTitle;
   if (cd==0) return "";
-  pageTitle+=cd->displayName();
   pageTitle=VhdlDocGen::getClassName(cd);
   int ii=cd->protection();
   pageTitle+=" ";
@@ -2163,7 +2159,6 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
       {
         if (VhdlDocGen::isConfig(mdef) || VhdlDocGen::isCompInst(mdef))
         {
-          nn=mdef->getOutputFileBase();
           nn=ltype;
         }
         else
@@ -2268,10 +2263,11 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
   ol.endMemberItem();
   if (!mdef->briefDescription().isEmpty() &&   Config_getBool("BRIEF_MEMBER_DESC") /* && !annMemb */)
   {
-    ol.startMemberDescription(mdef->anchor());
+        QCString s=mdef->briefDescription();
+        ol.startMemberDescription(mdef->anchor());
     ol.generateDoc(mdef->briefFile(),mdef->briefLine(),
         mdef->getOuterScope()?mdef->getOuterScope():d,
-        mdef,mdef->briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
+        mdef,s.data(),TRUE,FALSE,0,TRUE,FALSE);
     if (detailsVisible)
     {
       ol.pushGeneratorState();
@@ -2612,7 +2608,7 @@ void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname)
                        codeFragment,     // input
                        SrcLangExt_VHDL,  // lang
                        FALSE,            // isExample
-                       0,                // exampleName
+                       0,               // exampleName
                        mdef->getFileDef(),            // fileDef
                        mdef->getStartBodyLine(),      // startLine
                        mdef->getEndBodyLine(),        // endLine
@@ -3561,7 +3557,7 @@ void FlowChart::printNode(const FlowChart* flo)
     }
     else
     {
-      printf("\n NO: %s%s[%d,%d]",q.data(),t.data(),flo->stamp,flo->id);
+      printf("\n NO: %s[%d,%d]",t.data(),flo->stamp,flo->id);
     }
   }
 }
@@ -3747,8 +3743,13 @@ void FlowChart::buildCommentNodes(FTextStream & t)
     FlowChart *fll=flowList.at(j);
     if (fll->type & (COMMENT_NO | BEGIN_NO))
     {
+      int diff=FLOWLEN-(j+1);
       flowList.remove(j);
-      delete fll;
+
+          if ((fll->type & COMMENT_NO) && diff > 1)
+                 flowList.at(j+1)->label=fll->label;
+
+          delete fll;
       fll=0;
       size--;
       if (j>0) j--;
@@ -3843,7 +3844,6 @@ void FlowChart::addFlowChart(int type,const char* text,const char* exp, const ch
   {
     flowList.append(fl);
   }
-
 }
 
 void FlowChart::moveToPrevLevel()
@@ -3852,6 +3852,88 @@ void FlowChart::moveToPrevLevel()
   ifcounter--;
 }
 
+QCString FlowChart::printPlantUmlNode(const FlowChart *flo,bool ca,bool endL)
+{
+  QCString t;
+  QCString exp=flo->exp.stripWhiteSpace();
+  QCString text=flo->text.stripWhiteSpace();
+  switch (flo->type)
+  {
+    case START_NO:   t=":"+text+"|"; break;
+    case IF_NO :     t="\nif ("+exp+") then (yes)"; break;
+    case ELSIF_NO:   t="\nelseif ("+exp+") then (yes)"; break;
+    case ELSE_NO:    t="\nelse"; break;
+    case CASE_NO:    t="\n:"+exp+";"; break;
+    case WHEN_NO:    t="\n";
+                     if (!ca) t+="else";
+                     t+="if ("+exp+") then (yes)";
+                     break;
+    case EXIT_NO:    break;
+    case END_NO:     if (text.contains(" function")==0) t="\n:"+text+";";
+                     break;
+    case TEXT_NO:    t="\n:"+text+"]"; break;
+    case ENDIF_NO:   t="\nendif"; break;
+    case FOR_NO:     t="\nwhile ("+exp+") is (yes)"; break;
+    case WHILE_NO:   t="\nwhile ("+exp+") is (yes)"; break;
+    case END_LOOP:   t="\nendwhile"; break;
+    case END_CASE:   t="\nendif\n:end case;"; break;
+    case VARIABLE_NO:t="\n:"+text+";"; break;
+    case RETURN_NO:  t="\n:"+text+";";
+                     if (!endL) t+="\nstop";
+                     break;
+    case LOOP_NO:    t="\nwhile (infinite loop)"; break;
+    case NEXT_NO:    break;
+    case EMPTY_NO:   break;
+    case COMMENT_NO: t="\n note left \n "+flo->label+"\nend note \n"; break;
+    case BEGIN_NO:   t="\n:begin;"; break;
+    default:         assert(false); break;
+  }
+  return t;
+}
+
+void  FlowChart::printUmlTree()
+{
+  int caseCounter = 0;
+  int whenCounter = 0;
+
+  QCString qcs;
+  uint size=flowList.count();
+  bool endList;
+  for (uint j=0;j<size;j++)
+  {
+    endList=j==FLOWLEN;
+    FlowChart *flo=flowList.at(j);
+    if (flo->type==CASE_NO)
+    {
+      caseCounter++;
+      whenCounter=0;
+    }
+
+    if (flo->type==END_CASE)
+    {
+      caseCounter--;
+    }
+
+    bool ca = (caseCounter>0 && whenCounter==0);
+
+    qcs+=printPlantUmlNode(flo,ca,endList);
+
+    if (flo->type==WHEN_NO)
+    {
+      whenCounter++;
+    }
+
+  }
+  qcs+="\n";
+
+  QCString & outDir = Config_getString("OUTPUT_DIRECTORY");
+  QCString & htmlOutDir = Config_getString("HTML_OUTPUT");
+
+  QCString n=convertNameToFileName();
+  QCString tmp=htmlOutDir;
+  n=writePlantUMLSource(tmp,n,qcs);
+  generatePlantUMLOutput(n.data(),tmp.data(),PUML_SVG);
+}
 
 QCString FlowChart::convertNameToFileName()
 {
@@ -3859,16 +3941,19 @@ QCString FlowChart::convertNameToFileName()
   QCString temp,qcs;
   const  MemberDef* md=VhdlDocGen::getFlowMember();
 
-  temp.sprintf("%p",md);
+  // temp.sprintf("%p",md);
   qcs=md->name();
 
+  #if 0
   if (qcs.find(exp,0)>=0)
   {
     qcs.prepend("Z");
     qcs=qcs.replace(exp,"_");
   }
+  #endif
 
-  return qcs+temp;
+  //QCString tt= qcs;VhdlDocGen::getRecordNumber();
+  return qcs;
 }
 
 const char* FlowChart::getNodeType(int c)
@@ -3891,7 +3976,7 @@ const char* FlowChart::getNodeType(int c)
     case END_CASE:     return "end_case  ";
     case VARIABLE_NO:  return "variable_decl  ";
     case RETURN_NO:    return "return  ";
-    case LOOP_NO:      return "infinte loop  ";
+    case LOOP_NO:      return "infinite loop  ";
     case NEXT_NO:      return "next  ";
     case COMMENT_NO:   return "comment  ";
     case EMPTY_NO:     return "empty  ";
@@ -3951,14 +4036,23 @@ void FlowChart::writeFlowChart()
   }
 
   colTextNodes();
+  //  buildCommentNodes(t);
 
 #ifdef DEBUGFLOW
-  printFlowTree();
+   printFlowTree();
 #endif
+  const MemberDef *p=VhdlDocGen::getFlowMember();
+
+  if (p->isStatic())
+  {
+    printUmlTree();
+    delFlowList();
+    f.close();
+    return;
+  }
 
   startDot(t);
   buildCommentNodes(t);
-
   uint size=flowList.count();
 
   for (uint j=0;j <size ;j++)
@@ -4460,4 +4554,9 @@ parseVhdlCode(codeOutIntf,
 
 );
 
-}
+
+
+
+
+
+}// class
index 2d1ecf1..36d97a7 100644 (file)
@@ -326,6 +326,9 @@ class FlowChart
     static void buildCommentNodes(FTextStream &t);
     static void alignCommentNode(FTextStream &t,QCString com);
 
+    static void  printUmlTree();
+    static QCString printPlantUmlNode(const FlowChart *flo,bool,bool);
+
     static QList<FlowChart> flowList;
 
     FlowChart(int typ,const char*  t,const char* ex,const char* label=0);
index ea43341..c29bc69 100644 (file)
@@ -164,6 +164,9 @@ void VHDLLanguageScanner::parseInput(const char *fileName,const char *fileBuf,En
   g_thisParser=this;
   bool inLine=false;
   inputString=fileBuf;
+
+ // fprintf(stderr,"\n ============= %s\n ==========\n",fileBuf);
+
   if (strlen(fileName)==0)
   {
     inLine=true;
@@ -291,6 +294,8 @@ bool checkInlineCode(QCString & doc)
 
 void VhdlParser::handleFlowComment(const char* doc)
 {
+       lineCount(doc);
+
   if (VhdlDocGen::getFlowMember())
   {
     QCString qcs(doc);
@@ -305,7 +310,9 @@ void VhdlParser::handleCommentBlock(const char* doc1,bool brief)
 {
   int position=0;
   static bool isIn;
-  QCString doc(doc1);
+  QCString doc;
+  doc.append(doc1);
+ // fprintf(stderr,"\n %s",doc.data());
   if (doc.isEmpty()) return;
 
   if (checkMultiComment(doc,yyLineNr))
@@ -359,6 +366,14 @@ void VhdlParser::handleCommentBlock(const char* doc1,bool brief)
     current->docLine = yyLineNr;
   }
   //  printf("parseCommentBlock file<%s>\n [%s]\n at line [%d] \n ",yyFileName.data(),doc.data(),iDocLine);
+
+  int j=doc.find("[plant]");
+  if (j>=0)
+  {
+    doc=doc.remove(j,7);
+    current->stat=true;
+  }
+
   while (parseCommentBlock(
         g_thisParser,
         current,
@@ -407,7 +422,10 @@ void VhdlParser::addCompInst(const char *n, const char* instName, const char* co
   current->type=instName;                       // foo:instname e.g proto or work. proto(ttt)
   current->exception=genLabels.lower();         // |arch|label1:label2...
   current->name=n;                              // foo
-  current->args=lastCompound->name;             // architecture name
+  if (lastCompound)
+  {
+    current->args=lastCompound->name;             // architecture name
+  }
   current->includeName=comp;                    // component/enity/configuration
   int u=genLabels.find("|",1);
   if (u>0)
index 15b5d7e..fd36ebb 100644 (file)
@@ -407,7 +407,7 @@ void resetXmlCodeParserState()
 extern "C" { // some bogus code to keep the compiler happy
   void xmlcodeYYdummy() { yy_flex_realloc(0,0); } 
 }
-#elif YY_FLEX_SUBMINOR_VERSION<33
+#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33
 #error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)."
 #endif
 
index 27f7274..c5550f0 100644 (file)
@@ -223,33 +223,15 @@ void XmlDocVisitor::visit(DocVerbatim *s)
       m_t << "</verbatim>"; 
       break;
     case DocVerbatim::HtmlOnly: 
-      m_t << "<htmlonly>";
-      filter(s->text());
-      m_t << "</htmlonly>";
-      break;
     case DocVerbatim::RtfOnly: 
-      m_t << "<rtfonly>";
-      filter(s->text());
-      m_t << "</rtfonly>";
-      break;
     case DocVerbatim::ManOnly: 
-      m_t << "<manonly>";
-      filter(s->text());
-      m_t << "</manonly>";
-      break;
     case DocVerbatim::LatexOnly: 
-      m_t << "<latexonly>";
-      filter(s->text());
-      m_t << "</latexonly>";
+    case DocVerbatim::DocbookOnly:
+      /* nothing */ 
       break;
     case DocVerbatim::XmlOnly: 
       m_t << s->text();
       break;
-    case DocVerbatim::DocbookOnly:
-      m_t << "<docbookonly>";
-      filter(s->text());
-      m_t << "</docbookonly>";
-      break;
     case DocVerbatim::Dot:
       visitPreStart(m_t, "dot", s->hasCaption(), this, s->children(), QCString(""), FALSE, DocImage::Html, s->width(), s->height());
       filter(s->text());
index e41b0d7..490b0f9 100644 (file)
@@ -206,6 +206,11 @@ div.line {
        transition-duration: 0.5s;
 }
 
+div.line:after {
+    content:"\000A";
+    white-space: pre;
+}
+
 div.line.glow {
        background-color: cyan;
        box-shadow: 0 0 10px cyan;
@@ -242,7 +247,7 @@ div.ah, span.ah {
        -webkit-box-shadow: 2px 2px 3px #999;
        -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
        background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
-       background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+       background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
 }
 
 div.classindex ul {
@@ -832,6 +837,10 @@ address {
        color: ##33;
 }
 
+table.doxtable caption {
+       caption-side: top;
+}
+
 table.doxtable {
        border-collapse:collapse;
         margin-top: 4px;
@@ -997,6 +1006,18 @@ div.summary a
        white-space: nowrap;
 }
 
+table.classindex
+{
+        margin: 10px;
+        white-space: nowrap;
+        margin-left: 3%;
+        margin-right: 3%;
+        width: 94%;
+        border: 0;
+        border-spacing: 0; 
+        padding: 0;
+}
+
 div.ingroups
 {
        font-size: 8pt;
@@ -1196,7 +1217,7 @@ div.toc {
         border-radius: 7px 7px 7px 7px;
         float: right;
         height: auto;
-        margin: 0 20px 10px 10px;
+        margin: 0 8px 10px 10px;
         width: 200px;
 }
 
index 98f88d6..b44110d 100644 (file)
@@ -9,12 +9,63 @@
 <p>{{ tr.theListOfAllMembers }} <a class="el" href="{{ compound.fileName }}{{ config.HTML_FILE_EXTENSION }}">{{ compound.name }}</a>{{ tr.incInheritedMembers }}</p>
 <table class="directory">
 {% for mi in compound.allMembersList %}
-  <tr {% cycle 'class="even"' '' %}>
-  {# TODO: objective-C #}
-  <td>{% with obj=mi.member text=mi.ambiguityScope|append:mi.member.name %}
-      {% include 'htmlobjlink.tpl' %}
+  <tr class="{% cycle 'even' 'odd' %}">
+  {% spaceless %}
+  {% with member=mi.member %}
+  {% if member.language=='objc' %}
+    <td class="entry">
+    {% if member.isObjCMethod %}
+      {% if member.isStatic %}+&#160;{% else %}-&#160;{% endif %}
+    {% endif %}
+    </td>
+  {% endif %}
+  {% if member.isObjCMethod %}
+    <td class="entry">
+      {% with obj=member text=member.name %}
+        {% include 'htmlobjlink.tpl' %}
+      {% endwith %}
+    </td>
+  {%else %}
+    {# name #}
+    <td class="entry">
+      {% with obj=member text=mi.ambiguityScope|append:member.name %}
+        {% include 'htmlobjlink.tpl' %}
       {% endwith %}
+      {% if member.isEnumeration %}
+      &#160;{{ tr.enumName }}
+      {% elif member.isEnumValue %}
+      &#160;{{ tr.enumValue }}
+      {% elif member.isTypedef %}
+      &#160;typedef
+      {% elif member.isFriend and member.type=='friend class' %}
+      &#160;class
+      {% elif member.isFunction or member.isSignal or member.isSlot or (member.isFriend and member.hasParameters) %}
+      {{ member.declArgs }}
+      {% endif %}
+    </td>
+  {% endif %}
+  {# class link #}
+  <td class="entry">
+  {% if member.category %}
+    {% with obj=member.category text=member.category.name %}
+      {% include 'htmlobjlink.tpl' %}
+    {% endwith %}
+  {% else %}
+    {% with obj=member.class text=member.class.name %}
+      {% include 'htmlobjlink.tpl' %}
+    {% endwith %}
+  {% endif %}
   </td>
+  {# labels #}
+  {% if member.labels %}
+     <td class="entry">
+     {% for label in member.labels %}
+     <span class="mlabel">{{ label }}</span>
+     {% endfor %}
+     </td>
+  {% endif %}
+  {% endwith %}
+  {% endspaceless %}
   </tr>
 {% endfor %}
 </table>
index dd72ac9..c5faa14 100644 (file)
@@ -4,7 +4,7 @@
 <div class="textblock">
 {{ tr.classListDescription }}
 </div>
-{% indexentry nav name=tr.classes file=page.fileName anchor='' %}
+{% indexentry nav name=tr.classes file=page.fileName anchor='' isReference=False %}
 {% opensubindex nav %}
 {% with tree=classTree %}
   {% include 'htmldirtree.tpl' %}
index d394b45..aacaf92 100644 (file)
@@ -21,6 +21,9 @@
 {% endif %}
 {% if config.SEARCHENGINE %}
 <link href="{{ page.relPath }}search/search.css" rel="stylesheet" type="text/css"/>
+  {% if not config.SERVER_BASED_SEARCH %}
+<script type="text/javascript" src="{{ page.relPath }}search/searchdata.js"></script>
+  {% endif %}
 <script type="text/javascript" src="{{ page.relPath }}search/search.js"></script>
   {% if config.SERVER_BASED_SEARCH %}
 <script type="text/javascript">
 {% if config.USE_MATHJAX %}
 <script type="text/x-mathjax-config">
   MathJax.Hub.Config({
-    extensions: ["tex2jax.js"],  {# TODO: support MATHJAX_EXTENSIONS #}
-    jax: ["input/TeX","output/{{ config.MATHJAX_FORMAT }}"],
+    extensions: ["tex2jax.js"{% for ext in config.MATHJAX_EXTENSIONS %}, "{{ ext }}"{% endfor %}],
+    jax: ["input/TeX","output/{{ config.MATHJAX_FORMAT|default:'HTML-CSS' }}"],
 });
-{# TODO: support MATHJAX_CODEFILE #}
+{{ doxygen.mathJaxCodeFile }}
 </script>
-<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
-{% endif %}
+<script type="text/javascript" src="{{ config.MATHJAX_RELPATH }}{% if config.MATHJAX_RELPATH|relative %}{{ page.relPath }}{% endif %}MathJax.js"></script>
+{% endif %}{# MathJax #}
 <link href="{{ page.relPath }}{{ config.HTML_STYLESHEET|default:'doxygen.css' }}" rel="stylesheet" type="text/css" />
 {% if config.HTML_EXTRA_STYLESHEET %}
 <link href="{{ page.relPath }}{{ config.HTML_EXTRA_STYLESHEET }}" rel="stylesheet" type="text/css" />
 <!-- end header part -->
 <!-- Generated by Doxygen {{ doxygen.version }} -->
 {% block search %}
-{% if config.SEARCHENGINE %}{# TODO: can't we move this to the header? #}
+{% if config.SEARCHENGINE %}
 <script type="text/javascript">
 var searchBox = new SearchBox("searchBox", "{{ page.relPath }}search",false,'{{ tr.search }}');
 </script>
@@ -160,14 +163,13 @@ $(document).ready(function(){initNavTree('{{ page.fileName }}{% if page_postfix
 <div id="MSearchSelectWindow" onmouseover="return searchBox.OnSearchSelectShow()"
      onmouseout="return searchBox.OnSearchSelectHide()"
      onkeydown="return searchBox.OnSearchSelectKey(event)">
-{# TODO: get search categories dynamically, since we don't know them here #}
 </div>
-{% endif %}
 <!-- iframe showing the search results (closed by default) -->
 <div id="MSearchResultsWindow">
 <iframe src="javascript:void(0)" frameborder="0" name="MSearchResults" id="MSearchResults">
 </iframe>
 </div>
+{% endif %}
 {% endblock %}
 
 <div class="header">
@@ -190,11 +192,20 @@ $(document).ready(function(){initNavTree('{{ page.fileName }}{% if page_postfix
 <div id="nav-path" class="navpath">{# id is needed for treeview function! #}
   <ul>
     {# navpath #}
+    {% if page|get:'navigationPath' %}
+      {% for obj in page.navigationPath %}
+        <li class="navelem">
+          {% with text=obj.text %}
+            {% include 'htmlobjlink.tpl' %}
+          {% endwith %}
+        </li>
+      {% endfor %}
+    {% endif %}
     <li class="footer">
 {% if config.HTML_TIMESTAMP %}
 {{ tr.generatedAt:doxygen.date,config.PROJECT_NAME }}
 {% else %}
-{{ tr.generatedby }}
+{{ tr.generatedBy }}
 {% endif %}
     <a href="http://www.doxygen.org/index.html">
     <img class="footer" src="{{ page.relPath }}doxygen.png" alt="doxygen"/></a> {{ doxygen.version }} </li>
@@ -205,7 +216,7 @@ $(document).ready(function(){initNavTree('{{ page.fileName }}{% if page_postfix
 {% if config.HTML_TIMESTAMP %}
 {{ tr.generatedAt:doxygen.date,config.PROJECT_NAME }}
 {% else %}
-{{ tr.generatedby }}
+{{ tr.generatedBy }}
 {% endif %}
 &#160;<a href="http://www.doxygen.org/index.html"><img class="footer" src="{{ page.relPath }}doxygen.png" alt="doxygen"/></a> 
   {{ doxygen.version }}
index bb734b6..9a2b494 100644 (file)
@@ -2,9 +2,11 @@
 {% msg %}Generating HTML output for class {{ compound.name }}{% endmsg %}
 
 {% block navpath %}
-{% with navpath=compound.navigationPath %}
-  {% include 'htmlnavpath.tpl' %}
-{% endwith %}
+{% if not config.GENERATE_TREEVIEW %}
+  {% with navpath=compound.navigationPath %}
+    {% include 'htmlnavpath.tpl' %}
+  {% endwith %}
+{% endif %}
 {% endblock %}
 
 {% block title %}
     </div>
   {% endif %}
 {# memberdecls #}
-  {# TODO: isSimple #}
     {# nestedClasses #}
       {% with list=compound.classes label='nested-classes' title=tr.classes local=1 %}
         {% include 'htmldeclcomp.tpl' %}
 {% endif %}
 {# member definitions #}
   {# inline classes #}
-  {% if compound.classes %}
-    {# TODO write inlined simple classes: tr.classDocumentation / tr.typeDocumentation #}
-  {% endif %}
+    {% with classList=compound.innerClasses %}
+      {% include 'htmlinlineclasses.tpl' %}
+    {% endwith %}
   {# typedefs #}
     {% with memberListInfo=compound.detailedTypedefs %}
       {% include 'htmlmemdef.tpl' %}
index 803b1a9..c00ce32 100644 (file)
@@ -2,7 +2,7 @@
 {% block content %}
 <div class="contents">
 <div class="textblock">
-{% indexentry nav name=tr.classIndex file=page.fileName anchor='' %}
+{% indexentry nav name=tr.classIndex file=page.fileName anchor='' isReference=False %}
 </div>
 {% with index=classIndex.list|alphaIndex:'name' %}
   {# quick index at top #}
@@ -22,7 +22,7 @@
       <li>
         <span class="ai">
         {% if forloop.first %}
-        <a name="#letter_{{ section.label }}"></a>
+        <a name="letter_{{ section.label }}"></a>
         <span class="ah">&#160;&#160;{{ section.letter }}&#160;&#160;</span><br/>
         {% endif %}
         {% with obj=cls text=cls.name %}
index 4bd99d2..3ae90b8 100644 (file)
@@ -21,7 +21,6 @@
         <tr class="memdesc:{{ nc.anchor }}"><td class="mdescLeft">&#160;</td><td class="mdescRight">
         {{ nc.brief }}
         {% if nc.hasDetails %}
-          {# TODO: link to group if member is grouped #}
           <a href="{{ page.relPath }}{{ nc.fileName }}{{ config.HTML_FILE_EXTENSION}}{% if nc.anchor %}#{{ nc.anchor }}{% endif %}">{{ tr.more }}</a>
         {% endif %}
         <br/></td></tr>
index 7417f7b..aeb2fa5 100644 (file)
@@ -2,18 +2,10 @@
 {% msg %}Generating HTML output for directory {{ compound.name }}{% endmsg %}
 
 {% block navpath %}
-  {% if compound.navigationPath %}
-    <div id="nav-path" class="navpath">
-      <ul>
-      {% for obj in compound.navigationPath %}
-        <li class="navelem">
-          {% with text=obj.text %}
-            {% include 'htmlobjlink.tpl' %}
-          {% endwith %}
-        </li>
-      {% endfor %}
-      </ul>
-    </div>
+  {% if not config.GENERATE_TREEVIEW %}
+    {% with navpath=compound.navigationPath %}
+      {% include 'htmlnavpath.tpl' %}
+    {% endwith %}
   {% endif %}
 {% endblock %}
 
     {% endif %}
   {% endif %}
 {# dir graph #}
-{# TODO #}
+  {% if compound.hasDirGraph %}
+    {% with obj=compound %}
+      {% include 'htmldynheader.tpl' %}
+    {% endwith %}
+      {{ tr.dirDependencyGraphFor:compound.dirName }}
+    </div>
+    {% with obj=compound %}
+      {% include 'htmldyncontents.tpl' %}
+    {% endwith %}
+      {{ compound.dirGraph }}
+    </div>
+  {% endif %}
 {# member declarations #}
   {# directories #}
     {% with list=compound.dirs label='subdirs' title=tr.directories local=False %}
index 2fa266a..a6b9b21 100644 (file)
@@ -11,7 +11,7 @@
 {# the table with entries #}
 <table class="directory">
 {% recursetree tree.tree %}
-  {% indexentry nav name=node.name file=node.fileName anchor=node.anchor %}
+  {% indexentry nav name=node.name file=node.fileName anchor=node.anchor isReference=node.isReference externalReference=node.externalReference %}
   {% spaceless %}
   <tr id="row_{{ node.id }}" class="{% cycle 'even' 'odd' %}"{%if node.level>tree.preferredDepth %} style="display:none;"{% endif %}>
     <td class="entry">
   {% elif node.dir %}
     <span id="img_{{ node.id }}" class="iconf{%if node.level+1<tree.preferredDepth %}open{% else %}closed{% endif %}" onclick="toggleFolder('{{ node.id }}')">&#160;</span>
   {% elif node.file %}
+    {% if node.file.hasSourceFile %}
+      <a href="{{ node.file.sourceFileName }}{{ config.HTML_FILE_EXTENSION }}">
+    {% endif %}
     <span class="icondoc"></span>
+    {% if node.file.hasSourceFile %}
+      </a>
+    {% endif %}
   {% endif %}
   {% with obj=node text=node.name %}
     {% include 'htmlobjlink.tpl' %}
diff --git a/templates/html/htmlexample.tpl b/templates/html/htmlexample.tpl
new file mode 100644 (file)
index 0000000..f8c1f96
--- /dev/null
@@ -0,0 +1,17 @@
+{% extend 'htmlbase.tpl' %}
+{% msg %}Generating HTML output for example {{ compound.name }}{% endmsg %}
+
+{% block navpath %}
+  {% if not config.GENERATE_TREEVIEW %}
+    {% with navpath=compound.navigationPath %}
+      {% include 'htmlnavpath.tpl' %}
+    {% endwith %}
+  {% endif %}
+{% endblock %}
+
+{% block content %}
+<div class="contents">
+{{ compound.details }}
+{{ compound.example }}
+</div>
+{% endblock %}
diff --git a/templates/html/htmlexamples.tpl b/templates/html/htmlexamples.tpl
new file mode 100644 (file)
index 0000000..58392df
--- /dev/null
@@ -0,0 +1,15 @@
+{% extend 'htmlbase.tpl' %}
+{% block content %}
+<div class="contents">
+<div class="textblock">
+{{ tr.examplesDescription }}
+</div>
+{% indexentry nav name=tr.examples file=page.fileName anchor='' isReference=False %}
+{% opensubindex nav %}
+{% with tree=exampleTree %}
+  {% include 'htmldirtree.tpl' %}
+{% endwith %}
+{% closesubindex nav %}
+</div><!-- contents -->
+{% endblock %}
+
index 67af096..80e2826 100644 (file)
@@ -2,9 +2,11 @@
 {% msg %}Generating HTML output for file {{ compound.name }}{% endmsg %}
 
 {% block navpath %}
-{% with navpath=compound.navigationPath %}
-  {% include 'htmlnavpath.tpl' %}
-{% endwith %}
+  {% if not config.GENERATE_TREEVIEW %}
+    {% with navpath=compound.navigationPath %}
+      {% include 'htmlnavpath.tpl' %}
+    {% endwith %}
+  {% endif %}
 {% endblock %}
 
 {% block title %}
 {% endif %}
 {# member definitions #}
   {# inline classes #}
-    {% if compound.inlineClasses %}
-      <h2 class="groupheader">{{ tr.classDocumentation }}</h2>
-      {% for class in compound.inlineClasses %}
-        {# write anchor #}
-        <a class="anchor" id="{{ class.anchor }}"></a>
-        <div class="memitem">
-        <div class="memproto">
-        <table class="memname">
-          <tr><td class="memname">{{ class.compoundType }} {{ class.name }}</td></tr>
-        </table>
-        </div>
-        <div class="memdoc">
-        <div class="textblock">
-        {# TODO: the stuff inside textblock can be the same as in htmlclass.tpl!! #}
-          {# template specifier #}
-          {% if class.language=='cpp' and class.templateDecls %}
-            <h3>{% spaceless %}
-              {% for targList in class.templateDecls %}
-                template&lt;
-                {% for targ in targList %}
-                  {{ targ.type }}{% if targ.name %} {{ targ.name }}{% endif %}{% if targ.defVal %}&#160;= {{ targ.defVal }}{% endif %}{% if not forloop.last %}, {% endif %}
-                {% endfor %}
-                &gt;<br/>
-              {% endfor %}
-            {% endspaceless %}
-            {{ class.classType }}&#160;{{ class.name }}
-            </h3>
-          {% endif %}
-          {# brief description #}
-          {% if class.brief and config.REPEAT_BRIEF %}
-            <p>{{ class.brief }}</p>
-          {% endif %}
-          {# detailed docs #}
-          {{ class.details }}
-          {# source def #}
-          {% if class.sourceDef %}
-            {% markers obj in class.sourceDef with tr.definedAtLineInSourceFile %}
-              {% with text=obj.text %}
-                {% include 'htmlobjlink.tpl' %}
-              {% endwith %}
-            {% endmarkers %}
-          {% endif %}
-        </div><!-- textblock -->
-        {# table with fields #}
-        <table class="fieldtable">
-          <tr><th colspan="3">{{ tr.compoundMembers }}</td></tr>
-          {% for member in class.members %}
-            <tr><td class="fieldtype">
-                   <a class="anchor" id="{{ member.anchor }}"></a>{{ member.fieldType }}
-                </td>
-                <td class="fieldname">
-                   {{ member.name }}
-                   {% if member.isVariable and member.declArgs %}{{ member.declArgs }}{% endif %}
-                   {{ member.bitfields }}
-                </td>
-                <td class="fielddoc">
-                  {% if member.brief and not member.details %}{# only brief #}
-                    {{ member.brief }}
-                  {% else %} {# only details or both #}
-                    {% if member.brief %}<p>{{ member.brief }}</p>{% endif %}
-                    {{ member.details }}
-                  {% endif %}
-                </td>
-            </tr>
-          {% endfor %}
-        </table>
-        </div><!-- memdoc -->
-        </div><!-- memitem -->
-      {% endfor %}
-    {% endif %}
+    {% with classList=compound.inlineClasses %}
+      {% include 'htmlinlineclasses.tpl' %}
+    {% endwith %}
   {# defines #}
     {% with memberListInfo=compound.detailedMacros %}
       {% include 'htmlmemdef.tpl' %}
index 1871d4d..55799ca 100644 (file)
@@ -4,7 +4,7 @@
 <div class="textblock">
 {{ tr.fileListDescription }}
 </div>
-{% indexentry nav name=tr.fileList file=page.fileName anchor='' %}
+{% indexentry nav name=tr.fileList file=page.fileName anchor='' isReference=False %}
 {% opensubindex nav %}
 {% with tree=fileTree %}
   {% include 'htmldirtree.tpl' %}
index 5d03755..ff10172 100644 (file)
@@ -7,7 +7,7 @@
 <p><a href="inherits{{ config.HTML_FILE_EXTENSION }}">{{ tr.gotoGraphicalHierarchy }}</a></p>
 {% endif %}
 </div>
-{% indexentry nav name=tr.classHierarchy file=page.fileName anchor='' %}
+{% indexentry nav name=tr.classHierarchy file=page.fileName anchor='' isReference=False %}
 {% opensubindex nav %}
 {% with tree=classHierarchy %}
   {% include 'htmldirtree.tpl' %}
index 65bf1b6..2886a69 100644 (file)
@@ -9,7 +9,7 @@
     {% for sect in index %}
       {% with letter=sect.letter %}
          {% set page_postfix=section|append:'_'|append:sect.label %}
-         {% indexentry nav name=letter file=page.fileName|append:page_postfix anchor='' %}
+         {% indexentry nav name=letter file=page.fileName|append:page_postfix anchor='' isReference=False %}
          {# create index pages for all globals starting with a specific letter #}
          {% create page.fileName|append:page_postfix|append:config.HTML_FILE_EXTENSION from template %}
       {% endwith %}
diff --git a/templates/html/htmlinlineclasses.tpl b/templates/html/htmlinlineclasses.tpl
new file mode 100644 (file)
index 0000000..876c491
--- /dev/null
@@ -0,0 +1,70 @@
+{# input: classList #}
+{% if classList %}
+  <h2 class="groupheader">{{ tr.classDocumentation }}</h2>
+  {% for class in classList %}
+    {# write anchor #}
+    <a class="anchor" id="{{ class.anchor }}"></a>
+    <div class="memitem">
+    <div class="memproto">
+    <table class="memname">
+      <tr><td class="memname">{{ class.compoundType }} {{ class.name }}</td></tr>
+    </table>
+    </div>
+    <div class="memdoc">
+    <div class="textblock">
+      {# template specifier #}
+      {% if class.language=='cpp' and class.templateDecls %}
+        <h3>{% spaceless %}
+          {% for targList in class.templateDecls %}
+            template&lt;
+            {% for targ in targList %}
+              {{ targ.type }}{% if targ.name %} {{ targ.name }}{% endif %}{% if targ.defVal %}&#160;= {{ targ.defVal }}{% endif %}{% if not forloop.last %}, {% endif %}
+            {% endfor %}
+            &gt;<br/>
+          {% endfor %}
+        {% endspaceless %}
+        {{ class.classType }}&#160;{{ class.name }}
+        </h3>
+      {% endif %}
+      {# brief description #}
+      {% if class.brief and config.REPEAT_BRIEF %}
+        <p>{{ class.brief }}</p>
+      {% endif %}
+      {# detailed docs #}
+      {{ class.details }}
+      {# source def #}
+      {% if class.sourceDef %}
+        {% markers obj in class.sourceDef with tr.definedAtLineInSourceFile %}
+          {% with text=obj.text %}
+            {% include 'htmlobjlink.tpl' %}
+          {% endwith %}
+        {% endmarkers %}
+      {% endif %}
+    </div><!-- textblock -->
+    {# table with fields #}
+    <table class="fieldtable">
+      <tr><th colspan="3">{{ tr.compoundMembers }}</th></tr>
+      {% for member in class.members %}
+        <tr><td class="fieldtype">
+               <a class="anchor" id="{{ member.anchor }}"></a>{{ member.fieldType }}
+            </td>
+            <td class="fieldname">
+               {{ member.name }}
+               {% if member.isVariable and member.declArgs %}{{ member.declArgs }}{% endif %}
+               {{ member.bitfields }}
+            </td>
+            <td class="fielddoc">
+              {% if member.brief and not member.details %}{# only brief #}
+                {{ member.brief }}
+              {% else %} {# only details or both #}
+                {% if member.brief %}<p>{{ member.brief }}</p>{% endif %}
+                {{ member.details }}
+              {% endif %}
+            </td>
+        </tr>
+      {% endfor %}
+    </table>
+    </div><!-- memdoc -->
+    </div><!-- memitem -->
+  {% endfor %}
+{% endif %}
index a7ad88e..9970161 100644 (file)
@@ -1,7 +1,7 @@
 var NAVTREE =
 [
 {% recursetree index.nav %}
-  [ "{{ node.name }}", {% if node.file %}"{{ node.file }}{{ config.HTML_FILE_EXTENSION }}{% if node.anchor %}#{{ node.anchor }}{% endif %}"{% else %}null{% endif %},{% if not node.is_leaf_node %} [
+  [ "{{ node.name }}", {% if node.file %}"{% if node.isReference %}{{ node.externalReference }}{% endif %}{{ node.file }}{{ config.HTML_FILE_EXTENSION }}{% if node.anchor %}#{{ node.anchor }}{% endif %}"{% else %}null{% endif %},{% if not node.is_leaf_node %} [
      {{ children }}
   ]{% else %} null{% endif %} ]{% if not node.last %},{% endif %}
 {% endrecursetree %}
@@ -18,3 +18,6 @@ var NAVTREEINDEX =
   {% endfor %}
 {% endwith %}
 ];
+
+var SYNCONMSG  = '{{ tr.panelSyncOn }}';
+var SYNCOFFMSG = '{{ tr.panelSyncOff }}';
diff --git a/templates/html/htmljssearchdata.tpl b/templates/html/htmljssearchdata.tpl
new file mode 100644 (file)
index 0000000..c48ea1d
--- /dev/null
@@ -0,0 +1,31 @@
+{# input: si: SymbolIndex #}
+var indexSectionsWithContent =
+{
+{% set count=0 %}
+{% for idx in searchIndices %}
+  {% if idx.symbolIndices %}
+    {{ count }}:"{% for si in idx.symbolIndices %}{{ si.letter }}{% endfor %}"{%if not forloop.last %},{% endif %}
+    {% set count=count+1 %}
+  {% endif %}
+{% endfor %}
+};
+var indexSectionNames =
+{
+{% set count=0 %}
+{% for idx in searchIndices %}
+  {% if idx.symbolIndices %}
+    {{ count }}:"{{ idx.name }}"{% if not forloop.last %},{% endif %}
+    {% set count=count+1 %}
+  {% endif %}
+{% endfor %}
+};
+var IndexSectionLabels =
+{
+{% set count=0 %}
+{% for idx in searchIndices %}
+  {% if idx.symbolIndices %}
+    {{ count }}:"{{ idx.text }}"{% if not forloop.last %},{% endif %}
+    {% set count=count+1 %}
+  {% endif %}
+{% endfor %}
+};
diff --git a/templates/html/htmljssearchindex.tpl b/templates/html/htmljssearchindex.tpl
new file mode 100644 (file)
index 0000000..a16fa4f
--- /dev/null
@@ -0,0 +1,15 @@
+{# input: si symbolIndex #}
+var searchData =
+[
+{% for group in si.symbolGroups %}['{{ group.id }}',['{{ group.name }}',
+{% for sym in group.symbols %}
+{% spaceless %}
+['{{ sym.relPath }}{{ sym.fileName }}{{ config.HTML_FILE_EXTENSION }}{% if sym.anchor %}#{{ sym.anchor }}{% endif %}',
+{% if not config.EXT_LINKS_IN_WINDOW %}1{% else %}0{% endif %},
+'{{ sym.scope|nowrap }}']
+{% endspaceless %}
+{% if not forloop.last %},{% endif %}
+{% endfor %}
+]]{% if not forloop.last %},{% endif %}
+{% endfor %}
+];
index 9b82238..52883a3 100644 (file)
 {% resource 'nav_g.png' %}
 {% resource 'nav_h.lum' %}
 {% resource 'navtree.css' %}
+{% resource 'navtree.js' %}
+{% resource 'resize.js' %}
+{% resource 'doc.luma' %}
+{% resource 'folderopen.luma' %}
+{% resource 'folderclosed.luma' %}
+{% resource 'arrowdown.luma' %}
+{% resource 'arrowright.luma' %}
+{% resource 'splitbar.lum' %}
 
 {# general search resources #}
 {% resource 'search_l.png' as 'search/search_l.png' %}
 {# -------------------------------------------------- #}
 
 {# global constants #}
-{% set maxItemsForFlatList=2 %}
-{% set maxItemsForMultiPageList=4 %}
+{% set maxItemsForFlatList=30 %}
+{% set maxItemsForMultiPageList=200 %}
 
 {# global variable #}
 {% set page_postfix='' %}
 
 {# open the global navigation index #}
-{% indexentry nav name=tr.mainPage file='index' anchor='' %}
+{% indexentry nav name=tr.mainPage file='index' anchor='' isReference=False %}
 {% opensubindex nav %}
 
 {# ----------- HTML DOCUMENTATION PAGES ------------ #}
 {% for compound in fileList %}
   {% with page=compound %}
     {# TODO: to deal with clang optimisation, we need to write the sources in a different order! #}
-    {# TODO: now writing sources has the side-effect of creating cross-references. Need to split that up! #}
     {% if compound.hasSourceFile %}
       {% create compound.sourceFileName|append:config.HTML_FILE_EXTENSION from 'htmlsource.tpl' %}
     {% endif %}
   {% endwith %}
 {% endfor %}
 
-{# TODO: write example documentation #}
+{# write example documentation #}
+{% for compound in exampleList %}
+  {% with page=compound %}
+    {% create compound.fileName|append:config.HTML_FILE_EXTENSION from 'htmlexample.tpl' %}
+  {% endwith %}
+{% endfor %}
 
 {# ----------- INDEXES ------------ #}
 
   {% endwith %}
 {% endif %}
 
+{# ---- examples --- #}
+{% if exampleTree.tree %}
+  {% with page=exampleTree %}
+    {% create exampleTree.fileName|append:config.HTML_FILE_EXTENSION from 'htmlexamples.tpl' %}
+  {% endwith %}
+{% endif %}
+
 {# --- modules --- #}
 {% if moduleTree.tree %}
   {% with page=moduleTree %}
 {% endif %}
 
 {# --- namespaces --- #}
-{% indexentry nav name=tr.namespaces file='' anchor='' %}
-{% opensubindex nav %}
+{% if namespaceList %}
+  {% indexentry nav name=tr.namespaces file='' anchor='' isReference=False %}
+  {% opensubindex nav %}
 
   {% if namespaceTree.tree %}
     {% with page=namespaceTree %}
   {# write symbol indices for namespace members #}
   {% if namespaceMembersIndex.all %}
     {% with page=namespaceMembersIndex scope='namespace' template='htmlnsmembers.tpl' %}
-      {% indexentry nav name=tr.namespaceMembers file=page.fileName anchor='' %}
+      {% indexentry nav name=tr.namespaceMembers file=page.fileName anchor='' isReference=False %}
       {% include 'htmlmembersindex.tpl' %}
     {% endwith %}
   {% endif %}
 
-{% closesubindex nav %}
+  {% closesubindex nav %}
+{% endif %}
 
 {# --- classes --- #}
-{% indexentry nav name=tr.classes file='' anchor='' %}
-{% opensubindex nav %}
+{% if classList %}
+  {% indexentry nav name=tr.classes file='' anchor='' isReference=False %}
+  {% opensubindex nav %}
 
   {# write the annotated class list #}
   {% if classTree.tree %}
     {% endwith %}
   {% endif %}
 
-  {# TODO: write the class inheritance hierarchy #}
+  {# write the class inheritance hierarchy #}
   {% if classHierarchy.tree %}
     {% with page=classHierarchy %}
       {% create classHierarchy.fileName|append:config.HTML_FILE_EXTENSION from 'htmlhierarchy.tpl' %}
-    {% endwith %}
-    {% with page=classHierarchy %}
       {% if config.HAVE_DOT and config.GRAPHICAL_HIERARCHY %}
-        {% create 'inherits'|append:config.HTML_FILE_EXTENSION from 'htmlgraphhierarchy.tpl' %}
+        {% with fileName='inherits' %}
+          {% create fileName|append:config.HTML_FILE_EXTENSION from 'htmlgraphhierarchy.tpl' %}
+        {% endwith %}
       {% endif %}
     {% endwith %}
   {% endif %}
   {# write symbol indices for class members #}
   {% if classMembersIndex.all %}
     {% with page=classMembersIndex scope='class' template='htmlclmembers.tpl' %}
-      {% indexentry nav name=tr.classMembers file=page.fileName anchor='' %}
+      {% indexentry nav name=tr.classMembers file=page.fileName anchor='' isReference=False %}
       {% include 'htmlmembersindex.tpl' %}
     {% endwith %}
   {% endif %}
 
-{% closesubindex nav %}
+  {% closesubindex nav %}
+{% endif %}
 
 {# --- files --- #}
-{% indexentry nav name=tr.files file='' anchor='' %}
-{% opensubindex nav %}
+{% if fileList %}
+  {% indexentry nav name=tr.files file='' anchor='' isReference=False %}
+  {% opensubindex nav %}
 
   {# write the directory/file hierarchy #}
   {% if fileTree.tree %}
   {# write symbol indices for global namespace #}
   {% if globalsIndex.all %}
     {% with page=globalsIndex scope='file' template='htmlflmembers.tpl' %}
-      {% indexentry nav name=tr.fileMembers file=page.fileName anchor='' %}
+      {% indexentry nav name=tr.fileMembers file=page.fileName anchor='' isReference=False %}
       {% include 'htmlmembersindex.tpl' %}
     {% endwith %}
   {% endif %}
 
-{% closesubindex nav %}
+  {% closesubindex nav %}
+{% endif %}
 
 {# write directory documentation pages #}
 {% for compound in dirList %}
 {# close the global navigation index #}
 {% closesubindex nav %}
 
+{# write search data #}
+{% if config.SEARCHENGINE and not config.SERVER_BASED_SEARCH %}
+  {% create 'search/searchdata.js' from 'htmljssearchdata.tpl' %}
+  {% for idx in searchIndices %}
+    {% for si in idx.symbolIndices %}
+      {% with baseName=si.name|append:'_'|append:forloop.counter0 %}
+        {% create baseName|prepend:'search/'|append:config.HTML_FILE_EXTENSION from 'htmlsearchresult.tpl' %}
+        {% create baseName|prepend:'search/'|append:'.js' from 'htmljssearchindex.tpl' %}
+      {% endwith %}
+    {% endfor %}
+  {% endfor %}
+{% endif %}
+
 {# write the navigation tree data #}
 {% if config.GENERATE_TREEVIEW %}
   {% create 'navtreedata.js' from 'htmljsnavtree.tpl' %}
index ef891df..700bce2 100644 (file)
@@ -2,13 +2,13 @@
 {% opensubindex nav %}
 {# all members #}
 {% with list=page.all section='' %}
-  {% indexentry nav name=tr.all file=page.fileName|append:page_postfix anchor='' %}
+  {% indexentry nav name=tr.all file=page.fileName|append:page_postfix anchor='' isReference=False %}
   {% include 'htmlindexpages.tpl' %}
 {% endwith %}
 {# functions #}
 {% if page.functions %}
   {% set page_postfix='_func' %}
-  {% indexentry nav name=tr.functions file=page.fileName|append:page_postfix anchor='' %}
+  {% indexentry nav name=tr.functions file=page.fileName|append:page_postfix anchor='' isReference=False %}
   {% with list=page.functions section=page_postfix %}
     {% include 'htmlindexpages.tpl' %}
   {% endwith %}
@@ -16,7 +16,7 @@
 {# variables #}
 {% if page.variables %}
   {% set page_postfix='_vars' %}
-  {% indexentry nav name=tr.variables file=page.fileName|append:page_postfix anchor='' %}
+  {% indexentry nav name=tr.variables file=page.fileName|append:page_postfix anchor='' isReference=False %}
   {% with list=page.variables section=page_postfix %}
     {% include 'htmlindexpages.tpl' %}
   {% endwith %}
@@ -24,7 +24,7 @@
 {# typedefs #}
 {% if page.typedefs %}
   {% set page_postfix='_type' %}
-  {% indexentry nav name=tr.typedefs file=page.fileName|append:page_postfix anchor='' %}
+  {% indexentry nav name=tr.typedefs file=page.fileName|append:page_postfix anchor='' isReference=False %}
   {% with list=page.typedefs section=page_postfix %}
     {% include 'htmlindexpages.tpl' %}
   {% endwith %}
@@ -32,7 +32,7 @@
 {# enums #}
 {% if page.enums %}
   {% set page_postfix='_enum' %}
-  {% indexentry nav name=tr.enums file=page.fileName|append:page_postfix anchor='' %}
+  {% indexentry nav name=tr.enums file=page.fileName|append:page_postfix anchor='' isReference=False %}
   {% with list=page.enums section=page_postfix %}
     {% include 'htmlindexpages.tpl' %}
   {% endwith %}
@@ -40,7 +40,7 @@
 {# enumValues #}
 {% if page.enumValues %}
   {% set page_postfix='_eval' %}
-  {% indexentry nav name=tr.enumValues file=page.fileName|append:page_postfix anchor='' %}
+  {% indexentry nav name=tr.enumValues file=page.fileName|append:page_postfix anchor='' isReference=False %}
   {% with list=page.enumValues section=page_postfix %}
     {% include 'htmlindexpages.tpl' %}
   {% endwith %}
@@ -48,7 +48,7 @@
 {# macros #}
 {% if page.macros %}
   {% set page_postfix='_defs' %}
-  {% indexentry nav name=tr.macros file=page.fileName|append:page_postfix anchor='' %}
+  {% indexentry nav name=tr.macros file=page.fileName|append:page_postfix anchor='' isReference=False %}
   {% with list=page.macros section=page_postfix %}
     {% include 'htmlindexpages.tpl' %}
   {% endwith %}
@@ -56,7 +56,7 @@
 {# properties #}
 {% if page.properties %}
   {% set page_postfix='_prop' %}
-  {% indexentry nav name=tr.properties file=page.fileName|append:page_postfix anchor='' %}
+  {% indexentry nav name=tr.properties file=page.fileName|append:page_postfix anchor='' isReference=False %}
   {% with list=page.properties section=page_postfix %}
     {% include 'htmlindexpages.tpl' %}
   {% endwith %}
@@ -64,7 +64,7 @@
 {# events #}
 {% if page.events %}
   {% set page_postfix='_evnt' %}
-  {% indexentry nav name=tr.events file=page.fileName|append:page_postfix anchor='' %}
+  {% indexentry nav name=tr.events file=page.fileName|append:page_postfix anchor='' isReference=False %}
   {% with list=page.events section=page_postfix %}
     {% include 'htmlindexpages.tpl' %}
   {% endwith %}
@@ -72,7 +72,7 @@
 {# related #}
 {% if page.related %}
   {% set page_postfix='_rela' %}
-  {% indexentry nav name=tr.related file=page.fileName|append:page_postfix anchor='' %}
+  {% indexentry nav name=tr.related file=page.fileName|append:page_postfix anchor='' isReference=False %}
   {% with list=page.related section=page_postfix %}
     {% include 'htmlindexpages.tpl' %}
   {% endwith %}
index 6af75ce..c7894d8 100644 (file)
@@ -17,7 +17,7 @@
     enum&#160;</td><td class="memTemplItemRight" valign="bottom">
     {# write name #}
     {% if not member.isAnonymous %}
-      {% with obj=member text=member.name %}
+      {% with obj=member text=member.nameWithContextFor:compound.compoundKind %}
         {% include 'htmlobjlink.tpl' %}
       {% endwith %}
     {% endif %}
@@ -74,7 +74,7 @@
         {% with ctx=member.anonymousType anonymousNestingLevel=anonymousNestingLevel|add:1 %}
           {{ ctx.compoundType }}
           {% if ctx.bareName %}
-            &#160;<b>{{ ctx.bareName }}</b> {# TODO: associated documentation is lost! #}
+            &#160;<b>{{ ctx.bareName }}</b>
           {% endif %}
           {</td></tr>
           {# recursively write members that can appear inside the anonymous class/struct #}
         <td class="memItemLeft" valign="top">{% repeat anonymousNestingLevel %}&#160;&#160;&#160;{% endrepeat %}
         }
       {% else %}
-        {% if member.isObjCMethod %}
-          {% if member.isStatic %}+&#160;{% else %}-&#160;{% endif %}
-        {% else %}
-          {{ member.declType }}
-        {% endif %}
+        {{ member.declType }}
       {% endif %}
       {% spaceless %}
         &#160;
            &#160;&#160;
         {% else %}
           </td><td class="{% if member.templateArgs %}memTemplItemRight{% else %}memItemRight{% endif %}" valign="bottom">
+          {% if member.isObjCMethod %}
+            {% if member.isStatic %}+&#160;{% else %}-&#160;{% endif %}
+          {% endif %}
         {% endif %}
       {% endspaceless %}
     {# write name #}
       {% if not member.isAnonymous %}
         {% if member.anonymousMember %}
-          {% with obj=member.anonymousMember text=member.anonymousMember.name %}
+         {% with obj=member.anonymousMember text=member.anonymousMember.nameWithContextFor:compound.compoundKind %}
             {% include 'htmlobjlink.tpl' %}
           {% endwith %}
         {% else %}
-          {% with obj=member text=member.name %}
+          {% with obj=member text=member.nameWithContextFor:compound.compoundKind %}
             {% include 'htmlobjlink.tpl' %}
           {% endwith %}
         {% endif %}
       <tr class="memdesc:{{ member.anchor }}{% if inheritId %} inherit {{ inheritId }}{% endif %}"><td class="mdescLeft">&#160;</td><td class="mdescRight">
       {{ member.brief }}
       {% if member.hasDetails %}
-        {# TODO: link to group if member is grouped #}
-        <a href="#{{ member.anchor }}">{{ tr.more }}</a>
+        <a href="{{ member.fileName }}{{ config.HTML_FILE_EXTENSION }}#{{ member.anchor }}">{{ tr.more }}</a>
       {% endif %}
       <br/></td></tr>
     {% endif %}
index c469f1f..2b03a22 100644 (file)
@@ -1,15 +1,14 @@
 {# inputs: memberListInfo #}
 {% if memberListInfo %}
-  {% if memberListInfo.members|length>0 %}
+  {% if memberListInfo.members %}
     <h2 class="groupheader">{{ memberListInfo.title }}</h2>
     {% for member in memberListInfo.members %}
-      {% if member.hasDetails %}  {# TODO: not the same as isDetailedSectionVisible! #}
-        {# TODO: handle enum + anonymous members #}
-        <a class="anchor" id="{{ member.anchor }}"></a> {# TODO: for namespace members written in a file we need to prepend file_ #}
+      {% if member.detailsVisibleFor:compound.compoundKind %}
+        <a class="anchor" id="{{ member.anchor }}"></a>
         <div class="memitem">
         <div class="memproto">
         {# write template declarations #}
-        {% if member.language=='cpp' and member.templateDecls|length>0 %}
+        {% if member.language=='cpp' and member.templateDecls %}
           {% for targList in member.templateDecls %}
             {% spaceless %}
               <div class="memtemplate">
@@ -23,7 +22,7 @@
           {% endfor %}
         {% endif %}
         {# start of labels if present #}
-        {% if member.labels|length>0 %}
+        {% if member.labels %}
           <table class="mlabels"><tr><td class="mlabels-left">
         {% endif %}
         <table class="memname">
             {{ member.definition }}
             {# write argument list #}
             {# TODO: TCL #}
-            {% if member.hasParameterList %}
+            {% if member.hasParameters %}
               {% if member.isObjCMethod %}
+                {% if member.parameters %}
                 </td><td></td>
+                {% endif %}
                 {% for arg in member.parameters %}
                   {% if not forloop.first %}
                     <tr><td class="paramkey">{{ arg.namePart }}</td><td></td>
@@ -43,7 +44,7 @@
                     <em>{% if not arg.name %}{{ arg.type }}{% else %}{{ arg.name }}{% endif %}</em>
                   {% endif %}
                  {% if not forloop.last %}
-                    ,</td></tr>
+                    </td></tr>
                   {% endif %}
                 {% endfor %}
               {% else %}
           </td></tr>
         </table>
         {# end of labels if present #}
-        {% if member.labels|length>0 %}
+        {% if member.labels %}
           </td><td class="mlabels-right">{% spaceless %}
           {% for label in member.labels %}
             <span class="mlabel">{{ label }}</span>
         {% endif %}
         </div>
         <div class="memdoc">
-        {# TODO: write group include #}
+        {# write group include #}
+          {% if compound.compoundKind=="module" and config.SHOW_GROUPED_MEMB_INC and member.file %}
+            <p><tt>{% spaceless %}
+            {% if compound.language=='java' or compound.language=='idl' %}
+            import&#160; "
+            {% else %}
+            #include&#160;&lt;
+            {% endif %}
+            {% with obj=member.file text=member.file.bareName %}
+              {% include 'htmlobjlink.tpl' %}
+            {% endwith %}
+            {% if compound.language=='java' or compound.language=='idl' %}"
+            {% else %}&gt;
+            {% endif %}
+            {% endspaceless %}</tt></p>
+          {% endif %}
         {# multi-line initializer #}
           {% if member.hasMultiLineInitializer %}
             <b>{% if member.isDefine %}{{ tr.defineValue }}{% else %}{{ tr.initialValue }}{% endif %}</b>
             </p>
           {% endif %}
         {# category relation #}
-
-          {# TODO #}
-
+          {% if member.class and member.categoryRelation %}
+            {% if member.category %}
+              <p>
+              {% markers mem in member.categoryRelation|list with tr.providedByCategory %}
+                {% with obj=mem text=member.category.name %}
+                  {% include 'htmlobjlink.tpl' %}
+                {% endwith %}
+              {% endmarkers %}
+              </p>
+            {% elif member.class.categoryOf %}
+              <p>
+              {% markers mem in member.categoryRelation|list with tr.extendsClass %}
+                {% with obj=mem text=member.class.categoryOf.name %}
+                  {% include 'htmlobjlink.tpl' %}
+                {% endwith %}
+              {% endmarkers %}
+              </p>
+            {% endif %}
+          {% endif %}
         {# examples #}
           {% if member.examples %}
             <dl><dt><b>{{ tr.examples }}</b><dd>
         </div>
       {% endif %}
     {% endfor %} {# for each member #}
-    {# TODO: write member group docs #}
   {% endif %}
 {% endif %}
 
index ff97b2c..ce80514 100644 (file)
@@ -2,9 +2,11 @@
 {% msg %}Generating HTML output for module {{ compound.name }}{% endmsg %}
 
 {% block navpath %}
-{% with navpath=compound.navigationPath %}
-  {% include 'htmlnavpath.tpl' %}
-{% endwith %}
+  {% if not config.GENERATE_TREEVIEW %}
+    {% with navpath=compound.navigationPath %}
+      {% include 'htmlnavpath.tpl' %}
+    {% endwith %}
+  {% endif %}
 {% endblock %}
 
 {% block title %}
 {% endif %}
 {# member definitions #}
   {# inline classes #}
-    {% if compound.inlineClasses %}
-      <h2 class="groupheader">{{ tr.classDocumentation }}</h2>
-      {% for class in compound.inlineClasses %}
-        {# write anchor #}
-        <a class="anchor" id="{{ class.anchor }}"></a>
-        <div class="memitem">
-        <div class="memproto">
-        <table class="memname">
-          <tr><td class="memname">{{ class.compoundType }} {{ class.name }}</td></tr>
-        </table>
-        </div>
-        <div class="memdoc">
-        <div class="textblock">
-        {# TODO: the stuff inside textblock can be the same as in htmlclass.tpl!! #}
-          {# template specifier #}
-          {% if class.language=='cpp' and class.templateDecls %}
-            <h3>{% spaceless %}
-              {% for targList in class.templateDecls %}
-                template&lt;
-                {% for targ in targList %}
-                  {{ targ.type }}{% if targ.name %} {{ targ.name }}{% endif %}{% if targ.defVal %}&#160;= {{ targ.defVal }}{% endif %}{% if not forloop.last %}, {% endif %}
-                {% endfor %}
-                &gt;<br/>
-              {% endfor %}
-            {% endspaceless %}
-            {{ class.classType }}&#160;{{ class.name }}
-            </h3>
-          {% endif %}
-          {# brief description #}
-          {% if class.brief and config.REPEAT_BRIEF %}
-            <p>{{ class.brief }}</p>
-          {% endif %}
-          {# detailed docs #}
-          {{ class.details }}
-          {# source def #}
-          {% if class.sourceDef %}
-            {% markers obj in class.sourceDef with tr.definedAtLineInSourceFile %}
-              {% with text=obj.text %}
-                {% include 'htmlobjlink.tpl' %}
-              {% endwith %}
-            {% endmarkers %}
-          {% endif %}
-        </div><!-- textblock -->
-        {# table with fields #}
-        <table class="fieldtable">
-          <tr><th colspan="3">{{ tr.compoundMembers }}</td></tr>
-          {% for member in class.members %}
-            <tr><td class="fieldtype">
-                   <a class="anchor" id="{{ member.anchor }}"></a>{{ member.fieldType }}
-                </td>
-                <td class="fieldname">
-                   {{ member.name }}
-                   {% if member.isVariable and member.declArgs %}{{ member.declArgs }}{% endif %}
-                   {{ member.bitfields }}
-                </td>
-                <td class="fielddoc">
-                  {% if member.brief and not member.details %}{# only brief #}
-                    {{ member.brief }}
-                  {% else %} {# only details or both #}
-                    {% if member.brief %}<p>{{ member.brief }}</p>{% endif %}
-                    {{ member.details }}
-                  {% endif %}
-                </td>
-            </tr>
-          {% endfor %}
-        </table>
-        </div><!-- memdoc -->
-        </div><!-- memitem -->
-      {% endfor %}
-    {% endif %}
+    {% with classList=compound.inlineClasses %}
+      {% include 'htmlinlineclasses.tpl' %}
+    {% endwith %}
   {# defines #}
     {% with memberListInfo=compound.detailedMacros %}
       {% include 'htmlmemdef.tpl' %}
index f19c225..5431032 100644 (file)
@@ -4,7 +4,7 @@
 <div class="textblock">
 {{ tr.modulesDescription }}
 </div>
-{% indexentry nav name=tr.modules file=page.fileName anchor='' %}
+{% indexentry nav name=tr.modules file=page.fileName anchor='' isReference=False %}
 {% opensubindex nav %}
 {% with tree=moduleTree %}
   {% include 'htmldirtree.tpl' %}
index e21ba9d..d359efa 100644 (file)
@@ -2,9 +2,11 @@
 {% msg %}Generating HTML output for namespace {{ compound.name }}{% endmsg %}
 
 {% block navpath %}
-{% with navpath=compound.navigationPath %}
-  {% include 'htmlnavpath.tpl' %}
-{% endwith %}
+{% if not config.GENERATE_TREEVIEW %}
+  {% with navpath=compound.navigationPath %}
+    {% include 'htmlnavpath.tpl' %}
+  {% endwith %}
+{% endif %}
 {% endblock %}
 
 {% block title %}
 {% endif %}
 {# member definitions #}
   {# inline classes #}
-    {% if compound.inlineClasses %}
-      <h2 class="groupheader">{{ tr.classDocumentation }}</h2>
-      {% for class in compound.inlineClasses %}
-        {# write anchor #}
-        <a class="anchor" id="{{ class.anchor }}"></a>
-        <div class="memitem">
-        <div class="memproto">
-        <table class="memname">
-          <tr><td class="memname">{{ class.compoundType }} {{ class.name }}</td></tr>
-        </table>
-        </div>
-        <div class="memdoc">
-        <div class="textblock">
-        {# TODO: the stuff inside textblock can be the same as in htmlclass.tpl!! #}
-          {# template specifier #}
-          {% if class.language=='cpp' and class.templateDecls %}
-            <h3>{% spaceless %}
-              {% for targList in class.templateDecls %}
-                template&lt;
-                {% for targ in targList %}
-                  {{ targ.type }}{% if targ.name %} {{ targ.name }}{% endif %}{% if targ.defVal %}&#160;= {{ targ.defVal }}{% endif %}{% if not forloop.last %}, {% endif %}
-                {% endfor %}
-                &gt;<br/>
-              {% endfor %}
-            {% endspaceless %}
-            {{ class.classType }}&#160;{{ class.name }}
-            </h3>
-          {% endif %}
-          {# brief description #}
-          {% if class.brief and config.REPEAT_BRIEF %}
-            <p>{{ class.brief }}</p>
-          {% endif %}
-          {# detailed docs #}
-          {{ class.details }}
-          {# source def #}
-          {% if class.sourceDef %}
-            {% markers obj in class.sourceDef with tr.definedAtLineInSourceFile %}
-              {% with text=obj.text %}
-                {% include 'htmlobjlink.tpl' %}
-              {% endwith %}
-            {% endmarkers %}
-          {% endif %}
-        </div><!-- textblock -->
-        {# table with fields #}
-        <table class="fieldtable">
-          <tr><th colspan="3">{{ tr.compoundMembers }}</td></tr>
-          {% for member in class.members %}
-            <tr><td class="fieldtype">
-                   <a class="anchor" id="{{ member.anchor }}"></a>{{ member.fieldType }}
-                </td>
-                <td class="fieldname">
-                   {{ member.name }}
-                   {% if member.isVariable and member.declArgs %}{{ member.declArgs }}{% endif %}
-                   {{ member.bitfields }}
-                </td>
-                <td class="fielddoc">
-                  {% if member.brief and not member.details %}{# only brief #}
-                    {{ member.brief }}
-                  {% else %} {# only details or both #}
-                    {% if member.brief %}<p>{{ member.brief }}</p>{% endif %}
-                    {{ member.details }}
-                  {% endif %}
-                </td>
-            </tr>
-          {% endfor %}
-        </table>
-        </div><!-- memdoc -->
-        </div><!-- memitem -->
-      {% endfor %}
-    {% endif %}
+    {% with classList=compound.inlineClasses %}
+      {% include 'htmlinlineclasses.tpl' %}
+    {% endwith %}
   {# typedefs #}
     {% with memberListInfo=compound.detailedTypedefs %}
       {% include 'htmlmemdef.tpl' %}
index 4767d13..b7e7b9d 100644 (file)
@@ -4,7 +4,7 @@
 <div class="textblock">
 {{ tr.namespaceListDescription }}
 </div>
-{% indexentry nav name=tr.namespaceList file=page.fileName anchor='' %}
+{% indexentry nav name=tr.namespaceList file=page.fileName anchor='' isReference=False %}
 {% opensubindex nav %}
 {% with tree=namespaceTree %}
   {% include 'htmldirtree.tpl' %}
index 8da89a2..9713232 100644 (file)
@@ -17,6 +17,6 @@ var NAVTREEINDEX =
 {# write all sub indices #}
 {% for entries in navTree.subindices %}
   {% with idx=forloop.counter0 %}
-    {% create idx|prepend:'navtreeindex'|append:'.js' from htmlnavindex.tpl' %}
+    {% create idx|prepend:'navtreeindex'|append:'.js' from 'htmlnavindex.tpl' %}
   {% endwith %}
 {% endfor %}
index 51a281f..5d3c3f4 100644 (file)
@@ -1,6 +1,10 @@
-{# inputs: obj (with .isLinkable .anchor .fileName), text, config, page.relPath #}
+{# inputs: obj (with .isLinkable .isReference .anchor .fileName .externalReference), text, config, page.relPath #}
 {% if obj.isLinkable %}
+{% if obj.isReference %}
+<a class="elRef" href="{{ obj.externalReference }}{{ obj.fileName }}{{ config.HTML_FILE_EXTENSION }}{% if obj.anchor %}#{{ obj.anchor }}{% endif %}">{{ text }}</a>
+{% else %}
 <a class="el" href="{{ page.relPath }}{{ obj.fileName }}{{ config.HTML_FILE_EXTENSION }}{% if obj.anchor %}#{{ obj.anchor }}{% endif %}">{{ text }}</a>
+{% endif %}
 {% else %}
 <b>{{ text }}</b>
 {% endif %}
index 3882989..7547ed5 100644 (file)
@@ -2,9 +2,11 @@
 {% msg %}Generating HTML output for page {{ compound.name }}{% endmsg %}
 
 {% block navpath %}
-{% with navpath=compound.navigationPath %}
-  {% include 'htmlnavpath.tpl' %}
-{% endwith %}
+  {% if not config.GENERATE_TREEVIEW %}
+    {% with navpath=compound.navigationPath %}
+      {% include 'htmlnavpath.tpl' %}
+    {% endwith %}
+  {% endif %}
 {% endblock %}
 
 {% block content %}
index cc00bf5..5e3778d 100644 (file)
@@ -4,7 +4,7 @@
 <div class="textblock">
 {{ tr.relatedPagesDesc }}
 </div>
-{% indexentry nav name=tr.pages file=page.fileName anchor='' %}
+{% indexentry nav name=tr.pages file=page.fileName anchor='' isReference=False %}
 {% opensubindex nav %}
 {% with tree=pageTree %}
   {% include 'htmldirtree.tpl' %}
diff --git a/templates/html/htmlsearchresult.tpl b/templates/html/htmlsearchresult.tpl
new file mode 100644 (file)
index 0000000..2cf45fc
--- /dev/null
@@ -0,0 +1,27 @@
+{# input: baseName #}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen {{ doxygen.version }}"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="{{ baseName }}.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">{{ tr.loading }}</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">{{ tr.searching }}</div>
+<div class="SRStatus" id="NoMatches">{{ tr.noMatches }}</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
index cb4e65d..dda2b8c 100644 (file)
@@ -2,18 +2,10 @@
 {% msg %}Generating HTML source code for file {{ compound.name }}{% endmsg %}
 
 {% block navpath %}
-  {% if compound.navigationPath %}
-    <div id="nav-path" class="navpath">
-      <ul>
-      {% for obj in compound.navigationPath %}
-        <li class="navelem">
-          {% with text=obj.text %}
-            {% include 'htmlobjlink.tpl' %}
-          {% endwith %}
-        </li>
-      {% endfor %}
-      </ul>
-    </div>
+  {% if not config.GENERATE_TREEVIEW %}
+    {% with navpath=compound.navigationPath %}
+      {% include 'htmlnavpath.tpl %}
+    {% endwith %}
   {% endif %}
 {% endblock %}
 
index 9ce8c44..e7539d9 100644 (file)
@@ -24,7 +24,7 @@
    <li{% if page.highlight=='files' %} class="current"{% endif %}><a href="{{ page.relPath }}files{{ config.HTML_FILE_EXTENSION }}"><span>{{ tr.files|nowrap }}</span></a></li>
     {% endif %}
   {# examples tab #}
-    {% if exampleList.items %}
+    {% if exampleTree.tree %}
    <li{% if page.highlight=='examples' %} class="current"{% endif %}><a href="{{ page.relPath }}examples{{ config.HTML_FILE_EXTENSION }}"><span>{{ tr.examples|nowrap }}</span></a></li>
     {% endif %}
   {# search box #}
@@ -69,6 +69,7 @@
   </ul>
 </div>
 {# second navigation row #}
+{% if page.highlight=='namespace' or page.highlight=='classes' or page.highlight=='files' %}
 <div id="navrow2" class="tabs2">
   <ul class="tablist">
   {# namespace subtabs #}
@@ -94,3 +95,4 @@
   {% endif %}
   </ul>
 </div>
+{% endif %}
index 12c9581..b5a8cd0 100644 (file)
@@ -1,5 +1,5 @@
 {# obj should be a class or member #}
-{% if obj.typeConstraints|length>0 %}
+{% if obj.typeConstraints %}
   <div class="typecontraint">
   <dl><dt><b>{{ tr.typeConstraints }}</b></dt>
   <dd><table border="0" cellspacing="2" cellpadding="0">
index 304fcb6..2b86c36 100644 (file)
@@ -56,7 +56,7 @@ function resizeHeight()
   var windowHeight = $(window).height() - headerHeight - footerHeight;
   content.css({height:windowHeight + "px"});
   navtree.css({height:windowHeight + "px"});
-  sidenav.css({height:windowHeight + "px",top: headerHeight+"px"});
+  sidenav.css({height:windowHeight + "px"});
 }
 
 function initResizable()
index acd68e4..3f21871 100644 (file)
@@ -9,7 +9,10 @@
 \RequirePackage{ifthen}
 \RequirePackage{verbatim}
 \RequirePackage[table]{xcolor}
-\RequirePackage{xtab}
+\RequirePackage{longtable}
+\RequirePackage{tabu}
+\RequirePackage{tabularx}
+\RequirePackage{multirow}
 
 %---------- Internal commands used in this style file ----------------
 
 
 % Used by parameter lists
 \newenvironment{DoxyParams}[2][]{%
+    \tabulinesep=1mm%
     \par%
-    \tabletail{\hline}%
-    \tablelasttail{\hline}%
-    \tablefirsthead{}%
-    \tablehead{}%
     \ifthenelse{\equal{#1}{}}%
-    {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}%
-     \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
-                        p{0.805\textwidth}|}}%
+      {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description
     {\ifthenelse{\equal{#1}{1}}%
-      {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}%
-       \begin{xtabular}{|>{\centering}p{0.10\textwidth}|%
-                         >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
-                         p{0.678\textwidth}|}}%
-      {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}%
-       \begin{xtabular}{|>{\centering}p{0.10\textwidth}|%
-                         >{\centering\hspace{0pt}}p{0.15\textwidth}|%
-                         >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
-                         p{0.501\textwidth}|}}%
-    }\hline%
-}{%
-    \end{xtabular}%
-    \tablefirsthead{}%
+      {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc
+      {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc
+    }
+    \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
+    \hline%
+    \endfirsthead%
+    \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
+    \hline%
+    \endhead%
+}{%
+    \end{longtabu}%
     \vspace{6pt}%
 }
 
 % Used for fields of simple structs
 \newenvironment{DoxyFields}[1]{%
+    \tabulinesep=1mm%
     \par%
-    \tabletail{\hline}%
-    \tablelasttail{\hline}%
-    \tablehead{}%
-    \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
-    \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|%
-                         p{0.15\textwidth}|%
-                         p{0.63\textwidth}|}%
+    \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}%
+    \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
     \hline%
+    \endfirsthead%
+    \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+    \hline%
+    \endhead%
 }{%
-    \end{xtabular}%
-    \tablefirsthead{}%
+    \end{longtabu}%
     \vspace{6pt}%
 }
 
 
 % Used by return value lists
 \newenvironment{DoxyRetVals}[1]{%
+    \tabulinesep=1mm%
     \par%
-    \tabletail{\hline}%
-    \tablelasttail{\hline}%
-    \tablehead{}%
-    \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
-    \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
-                          p{0.705\textwidth}|}%
+    \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+    \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+    \hline%
+    \endfirsthead%
+    \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
     \hline%
+    \endhead%
 }{%
-    \end{xtabular}%
-    \tablefirsthead{}%
+    \end{longtabu}%
     \vspace{6pt}%
 }
 
 % Used by exception lists
 \newenvironment{DoxyExceptions}[1]{%
+    \tabulinesep=1mm%
     \par%
-    \tabletail{\hline}%
-    \tablelasttail{\hline}%
-    \tablehead{}%
-    \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
-    \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
-                          p{0.705\textwidth}|}%
+    \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+    \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
     \hline%
+    \endfirsthead%
+    \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+    \hline%
+    \endhead%
 }{%
-    \end{xtabular}%
-    \tablefirsthead{}%
+    \end{longtabu}%
     \vspace{6pt}%
 }
 
 % Used by template parameter lists
 \newenvironment{DoxyTemplParams}[1]{%
+    \tabulinesep=1mm%
     \par%
-    \tabletail{\hline}%
-    \tablelasttail{\hline}%
-    \tablehead{}%
-    \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}%
-    \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|%
-                          p{0.705\textwidth}|}%
+    \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+    \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+    \hline%
+    \endfirsthead%
+    \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
     \hline%
+    \endhead%
 }{%
-    \end{xtabular}%
-    \tablefirsthead{}%
+    \end{longtabu}%
     \vspace{6pt}%
 }
 
 % Used by parameter lists and simple sections
 \newenvironment{Desc}
 {\begin{list}{}{%
-    \settowidth{\labelwidth}{40pt}%
-    \setlength{\leftmargin}{\labelwidth}%
+    \settowidth{\labelwidth}{20pt}%
     \setlength{\parsep}{0pt}%
-    \setlength{\itemsep}{-4pt}%
+    \setlength{\itemsep}{0pt}%
+    \setlength{\leftmargin}{\labelwidth+\labelsep}%
     \renewcommand{\makelabel}{\entrylabel}%
   }
 }{%
 
 % Used by tables
 \newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}%
-\newlength{\tmplength}%
 \newenvironment{TabularC}[1]%
-{%
-\setlength{\tmplength}%
-     {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}%
-      \par\begin{xtabular*}{\linewidth}%
-             {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}%
-}%
-{\end{xtabular*}\par}%
-
-% Used by nested tables
+{\tabulinesep=1mm
+\begin{longtabu} spread 0pt [c]{*#1{|X[-1]}|}}%
+{\end{longtabu}\par}%
+
 \newenvironment{TabularNC}[1]%
-{%
-\setlength{\tmplength}%
-     {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}%
-      \par\begin{tabular*}{\linewidth}%
-             {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}%
-}%
-{\end{tabular*}\par}%
+{\begin{tabu} spread 0pt [l]{*#1{|X[-1]}|}}%
+{\end{tabu}\par}%
 
 % Used for member group headers
 \newenvironment{Indent}{%
   \textbf{#1} (\textnormal{#2}\,\pageref{#3})%
 }
 
+% Used to link to a table when hyperlinks are turned on
+\newcommand{\doxytablelink}[2]{%
+  \ref{#1}%
+}
+
+% Used to link to a table when hyperlinks are turned off
+\newcommand{\doxytableref}[3]{%
+  \ref{#3}%
+}
+
 % Used by @addindex
 \newcommand{\lcurly}{\{}
 \newcommand{\rcurly}{\}}
 
-% Used for syntax highlighting
+% Colors used for syntax highlighting
 \definecolor{comment}{rgb}{0.5,0.0,0.0}
 \definecolor{keyword}{rgb}{0.0,0.5,0.0}
 \definecolor{keywordtype}{rgb}{0.38,0.25,0.125}
 \definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}
 \definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}
 \definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}
+
+% Color used for table heading
+\newcommand{\tableheadbgcolor}{lightgray}%
diff --git a/templates/latex/latexannotated.tpl b/templates/latex/latexannotated.tpl
new file mode 100644 (file)
index 0000000..0b6ecb5
--- /dev/null
@@ -0,0 +1,9 @@
+\section{<{ tr.classList }>}
+<{ tr.classListDescription }>
+\begin{DoxyCompactList}
+<% for cls in classList %>
+\item\contentsline{section}
+{<% with obj=cls text=cls.name %><% include 'latexobjlink.tpl' %><% endwith %><% if cls.brief %>\\*<{ cls.brief }><% endif %>}
+{\pageref{<{ cls.fileName|raw }>}}{}
+<% endfor %>
+\end{DoxyCompactList}
diff --git a/templates/latex/latexclass.tpl b/templates/latex/latexclass.tpl
new file mode 100644 (file)
index 0000000..9fdcb24
--- /dev/null
@@ -0,0 +1,114 @@
+<# input: compound #>
+<% msg %>Generating LaTeX output for class <{ compound.name }><% endmsg %>
+\hypertarget{<{ compound.fileName|raw }>}{}\section{<{ compound.title }>}
+\label{<{ compound.fileName|raw }>}\index{<{ compound.name|texLabel }>@{<{ compound.name|texIndex }>}}
+<# brief description #>
+<% if compound.brief %>
+  <{ compound.brief }>
+
+<% endif %>
+<# compound includes #>
+<% if compound.includeInfo %>
+    <% with ii=compound.includeInfo %>
+      <% include 'latexinclude.tpl' %>
+    <% endwith %>
+
+
+<% endif %>
+<# inheritance graph #>
+  <% if compound.hasInheritanceDiagram %>
+    <{ tr.inheritanceDiagramFor:compound.name }>
+    <{ compound.inheritanceDiagram }>
+  <% else %>
+    <# textual inheritance list #>
+    <% if compound.inherits|length>0 %>
+      <% markers c in compound.inherits with tr.inheritsList:compound.inherits|length %>
+        <% with obj=c.class text=c.name %>
+          <% include 'latexobjlink.tpl' %>
+        <% endwith %>
+      <% endmarkers %>
+
+
+    <% endif %>
+    <% if compound.inheritedBy|length>0 %>
+      <% markers c in compound.inheritedBy with tr.inheritedByList:compound.inheritedBy|length %>
+        <% with obj=c.class text=c.name %>
+          <% include 'latexobjlink.tpl' %>
+        <% endwith %>
+      <% endmarkers %>
+
+
+    <% endif %>
+  <% endif %>
+<# collaboration graph #>
+  <% if compound.hasCollaborationDiagram %>
+      <{ tr.collaborationDiagramFor:compound.name }>
+      <{ compound.collaborationDiagram }>
+
+
+  <% endif %>
+<# member declarations #>
+<% if compound.hasDetails %>
+  <% if compound.anchor %>
+    \label{<{ compound.anchor|raw }>}
+    <% if config.PDF_HYPERLINKS and config.USE_PDFLATEX %>
+    \hypertarget{<% if compound.fileName %><{ compound.fileName|raw }>_<% endif %><{ compound.anchor|raw }>}{}
+    <% endif %>
+  <% endif %>
+  <% if config.COMPACT_LATEX %>\subsubsection<% else %>\subsection<% endif %>{<{ tr.detailedDesc }>}
+  <# template specifier #>
+  <% if compound.language=='cpp' and compound.templateDecls %>
+    <% spaceless %>
+    \subsubsection*{
+      <% for targList in compound.templateDecls %>
+        template$<$
+        <% for targ in targList %>
+          <{ targ.type }><% if targ.name %><{ space }><{ targ.name }><% endif %><% if targ.defVal %><{ space }>= <{ targ.defVal }><% endif %><% if not forloop.last %>, <% endif %>
+        <% endfor %>
+        $>$\\*
+      <% endfor %>
+    <{ compound.compoundType }><{ space }><{ compound.name }>
+    }
+    <% endspaceless %>
+
+
+  <% endif %>
+  <% if compound.brief and config.REPEAT_BRIEF %>
+  <{ compound.brief }>
+
+
+  <% endif %>
+  <{ compound.details }>
+
+
+  <# type constraints #>
+  <% with obj=compound %>
+    <% include 'latextypeconstraints.tpl' %>
+  <% endwith %>
+
+
+<% endif %>
+<% msg %>
+  <# examples #>
+    <% if compound.examples %>
+      <dl><dt><b><{ tr.examples }></b><dd>
+      <% markers obj in compound.examples with tr.exampleList:compound.examples|length %>
+        <% with page=compound text=obj.text %>
+          <% include 'htmlobjlink.tpl' %>
+        <% endwith %>
+      <% endmarkers %>
+      </dd></dl>
+    <% endif %>
+  <# source definition #>
+    <% if compound.sourceDef %>
+      <% markers obj in compound.sourceDef with tr.definedAtLineInSourceFile %>
+        <% with page=compound text=obj.text %>
+          <% include 'htmlobjlink.tpl' %>
+        <% endwith %>
+      <% endmarkers %>
+    <% endif %>
+<% endmsg %>
+<# detailed description #>
+<# member definitions #>
+<# used files #>
+<# separate member pages #>
diff --git a/templates/latex/latexfiles.tpl b/templates/latex/latexfiles.tpl
new file mode 100644 (file)
index 0000000..a9a897d
--- /dev/null
@@ -0,0 +1 @@
+<# TODO #>
diff --git a/templates/latex/latexinclude.tpl b/templates/latex/latexinclude.tpl
new file mode 100644 (file)
index 0000000..c333056
--- /dev/null
@@ -0,0 +1,32 @@
+<# input: ii with attributes (file,name,isImport,isLocal), compound with attribute language #>
+<% spaceless %>
+<% if ii.file or ii.name %>
+{\ttfamily<{ space }>
+    <% if compound.language=='java' or compound.language=='idl' %>
+      import
+    <% else %>
+      <% if ii.isImport %>
+      \#import
+      <% else %>
+      \#include
+      <% endif %>
+    <% endif %>
+    <{ space }>
+    <% if ii.isLocal %>
+      \char`\"{}
+    <% else %>
+      $<$
+    <% endif %>
+    <% if ii.name %>
+      <{ ii.name }>
+    <% else %>
+      <{ ii.file.name }>
+    <% endif %>
+    <% if ii.isLocal %>
+      \char`\"{}
+    <% else %>
+      $>$
+    <% endif %>
+}
+<% endif %>
+<% endspaceless %>
diff --git a/templates/latex/latexlayout.tpl b/templates/latex/latexlayout.tpl
new file mode 100644 (file)
index 0000000..290a4d5
--- /dev/null
@@ -0,0 +1,35 @@
+{% msg %}----- Start generating LaTeX output for {{ config.PROJECT_NAME }} from template ----{% endmsg %}
+
+{% create 'refman.tex' from 'latexrefman.tpl' %}
+{% create 'Makefile' from 'latexmakefile.tpl' %}
+
+{# module index #}
+{% if moduleTree.tree %}
+  {% create 'modules.tex' from 'latexmodules.tpl' %}
+{% endif %}
+
+{# namespace index #}
+{% if namespaceTree.tree %}
+  {% create 'namespaces.tex' from 'latexnamespaces.tpl' %}
+{% endif %}
+
+{# class index #}
+{% if classTree.tree %}
+  {% create 'annotated.tex' from 'latexannotated.tpl' %}
+{% endif %}
+
+{# file index #}
+{% if fileTree.tree %}
+  {% create 'files.tex' from 'latexfiles.tpl' %}
+{% endif %}
+
+{# TODO: pages #}
+{# TODO: examples #}
+{# TODO: directories #}
+
+{# write class documentation pages #}
+{% for compound in classList %}
+  {% create compound.fileName|append:'.tex' from 'latexclass.tpl' %}
+{% endfor %}
+
+{% msg %}----- End generating LaTeX output for {{ config.PROJECT_NAME }} from template ----{% endmsg %}
diff --git a/templates/latex/latexmakefile.tpl b/templates/latex/latexmakefile.tpl
new file mode 100644 (file)
index 0000000..ba1eb76
--- /dev/null
@@ -0,0 +1,64 @@
+{% if config.USE_PDFLATEX %}
+all: refman.pdf
+
+pdf: refman.pdf
+
+refman.pdf: clean refman.tex
+       pdflatex refman
+       {{ config.MAKEINDEX_CMD_NAME }} refman.idx
+{# TODO: generateBib #}
+       pdflatex refman
+       latex_count=8 ; \
+       while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\
+           do \
+             echo "Rerunning latex...." ;\
+             pdflatex refman ;\
+             latex_count=`expr $$latex_count - 1` ;\
+           done
+       {{ config.MAKEINDEX_CMD_NAME }} refman.idx
+       pdflatex refman
+{% else %}
+all: refman.dvi
+
+ps: refman.ps
+
+pdf: refman.pdf
+
+ps_2on1: refman_2on1.ps
+
+pdf_2on1: refman_2on1.pdf
+
+refman.ps: refman.dvi
+       dvips -o refman.ps refman.dvi
+
+refman.pdf: refman.ps
+       ps2pdf refman.ps refman.pdf
+
+refman.dvi: clean refman.tex doxygen.sty
+       echo "Running latex..."
+       {{ config.LATEX_CMD_NAME }} refman.tex
+       echo "Running makeindex..."
+       {{ config.MAKEINDEX_CMD_NAME }} refman.idx
+{# TODO: generateBib #}
+       echo "Rerunning latex...."
+       {{ config.LATEX_CMD_NAME }} refman.tex
+       latex_count=8 ; \
+       while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\
+           do \
+             echo "Rerunning latex...." ;\
+             {{ config.LATEX_CMD_NAME }} refman.tex ;\
+             latex_count=`expr $$latex_count - 1` ;\
+           done
+       {{ config.MAKEINDEX_CMD_NAME }} refman.idx
+       {{ config.LATEX_CMD_NAME }} refman.tex
+
+refman_2on1.ps: refman.ps
+       psnup -2 refman.ps >refman_2on1.ps
+
+refman_2on1.pdf: refman_2on1.ps
+       ps2pdf refman_2on1.ps refman_2on1.pdf
+{% endif %}
+
+clean:
+       rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf
+
diff --git a/templates/latex/latexmodules.tpl b/templates/latex/latexmodules.tpl
new file mode 100644 (file)
index 0000000..a9a897d
--- /dev/null
@@ -0,0 +1 @@
+<# TODO #>
diff --git a/templates/latex/latexnamespaces.tpl b/templates/latex/latexnamespaces.tpl
new file mode 100644 (file)
index 0000000..a9a897d
--- /dev/null
@@ -0,0 +1 @@
+<# TODO #>
diff --git a/templates/latex/latexobjlink.tpl b/templates/latex/latexobjlink.tpl
new file mode 100644 (file)
index 0000000..89ecc2e
--- /dev/null
@@ -0,0 +1,6 @@
+<# inputs: obj, text #>
+<% if config.PDF_HYPERLINKS %>
+\hyperlink{<{ obj.fileName|raw }><% if obj.anchor %>_<{ obj.anchor }><% endif %>}{<{ text }>}
+<% else %>
+{\bf <{ text }>}
+<% endif %>
diff --git a/templates/latex/latexrefman.tpl b/templates/latex/latexrefman.tpl
new file mode 100644 (file)
index 0000000..b208177
--- /dev/null
@@ -0,0 +1,227 @@
+\documentclass[twoside]{<% if config.COMPACT_LATEX %>article<% else %>book<% endif %>}
+
+% Packages required by doxygen
+\usepackage{fixltx2e}
+\usepackage{calc}
+\usepackage{doxygen}
+\usepackage[export]{adjustbox} % also loads graphicx
+<% for package in config.LATEX_EXTRA_STYLESHEET %>
+\usepackage{<{package|stripExtension:'.sty'}>}
+<% endfor %>
+\usepackage{graphicx}
+\usepackage[utf8]{inputenc}
+\usepackage{makeidx}
+\usepackage{multicol}
+\usepackage{multirow}
+\PassOptionsToPackage{warn}{textcomp}
+\usepackage{textcomp}
+\usepackage[nointegrals]{wasysym}
+\usepackage[table]{xcolor}
+
+<# TODO: languageSupportCommand #>
+
+% Font selection
+\usepackage[T1]{fontenc}
+\usepackage[scaled=.90]{helvet}
+\usepackage{courier}
+\usepackage{amssymb}
+\usepackage{sectsty}
+\renewcommand{\familydefault}{\sfdefault}
+\allsectionsfont{
+  \fontseries{bc}\selectfont
+  \color{darkgray}
+}
+\renewcommand{\DoxyLabelFont}{
+  \fontseries{bc}\selectfont
+  \color{darkgray}
+}
+\newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}}
+
+% Page & text layout
+\usepackage{geometry}
+\geometry{
+  <{ config.PAPER_TYPE }>paper,
+  top=2.5cm,
+  bottom=2.5cm,
+  left=2.5cm,
+  right=2.5cm
+}
+\tolerance=750
+\hfuzz=15pt
+\hbadness=750
+\setlength{\emergencystretch}{15pt}
+\setlength{\parindent}{0cm}
+\setlength{\parskip}{3ex plus 2ex minus 2ex}
+\makeatletter
+\renewcommand{\paragraph}{
+  \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{
+    \normalfont\normalsize\bfseries\SS@parafont
+  }
+}
+\renewcommand{\subparagraph}{
+  \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{
+    \normalfont\normalsize\bfseries\SS@subparafont
+  }
+}
+\makeatother
+
+% Headers & footers
+\usepackage{fancyhdr}
+\pagestyle{fancyplain}
+\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}}
+\fancyhead[CE]{\fancyplain{}{}}
+\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}}
+\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}}
+\fancyhead[CO]{\fancyplain{}{}}
+\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}}
+\fancyfoot[LE]{\fancyplain{}{}}
+\fancyfoot[CE]{\fancyplain{}{}}
+\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize <{ tr.generatedAt:doxygen.date,config.PROJECT_NAME }>}}
+\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize <{ tr.generatedAt:doxygen.date,config.PROJECT_NAME }>}}
+\fancyfoot[CO]{\fancyplain{}{}}
+\fancyfoot[RO]{\fancyplain{}{}}
+\renewcommand{\footrulewidth}{0.4pt}
+<% if not config.COMPACT_LATEX %>
+\renewcommand{\chaptermark}[1]{
+  \markboth{ #1}{}%
+}
+<% endif %>
+\renewcommand{\sectionmark}[1]{
+  \markright{\thesection\ #1}
+}
+
+% Indices & bibliography
+\usepackage{natbib}
+\usepackage[titles]{tocloft}
+\setcounter{tocdepth}{3}
+\setcounter{secnumdepth}{5}
+\makeindex
+
+<% if config.EXTRA_PACKAGES %>
+% Packages requested by user
+<% for package in config.EXTRA_PACKAGES %>
+\usepackage{<{ package }>}
+<% endfor %>
+<% endif %>
+
+<% if config.PDF_HYPERLINKS %>
+% Hyperlinks (required, but should be loaded last)
+\usepackage{ifpdf}
+\ifpdf
+  \usepackage[pdftex,pagebackref=true]{hyperref}
+\else
+  \usepackage[ps2pdf,pagebackref=true]{hyperref}
+\fi
+\hypersetup{
+  colorlinks=true,
+  linkcolor=blue,
+  citecolor=blue,
+  unicode
+}
+<% endif %>
+
+% Custom commands
+\newcommand{\clearemptydoublepage}{
+  \newpage{\pagestyle{empty}\cleardoublepage}
+}
+
+%===== C O N T E N T S =====
+
+\begin{document}
+<# TODO: select language for greek #>
+
+% Titlepage & ToC
+<% if config.USE_PDFLATEX and config.PDF_HYPERLINKS %>
+\hypersetup{pageanchor=false,
+             bookmarks=true,
+             bookmarksnumbered=true,
+             pdfencoding=unicode
+            }
+<% endif %>
+\pagenumbering{roman}
+\begin{titlepage}
+<% tabbing %>
+\vspace*{7cm}
+\begin{center}%
+{\Large
+<% if config.PROJECT_NAME %>
+  <{ config.PROJECT_NAME }>
+<% else %>
+  <{ tr.referenceManual }>
+<% endif %>
+<% if config.PROJECT_NUMBER %>
+\\[1ex]\large <{ config.PROJECT_NUMBER }>
+<% endif %>
+}\\
+\vspace*{1cm}{\large <{ tr.generatedBy }> Doxygen <{ doxygen.version }>}\\
+\vspace*{0.5cm}{\small <{ doxygen.date }>}\\
+\end{center}
+<% endtabbing %>
+\end{titlepage}
+<% if not config.COMPACT_LATEX %>\clearemptydoublepage<% endif %>
+
+\tableofcontents
+<% if not config.COMPACT_LATEX %>\clearemptydoublepage<% endif %>
+\pagenumbering{arabic}
+<% if config.USE_PDFLATEX and config.PDF_HYPERLINKS %>
+\hypersetup{pageanchor=true}
+<% endif %>
+
+%--- Begin generated contents ---
+<# TODO: loop over pages #>
+<% if moduleTree.tree %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.moduleIndex }>}
+\input{modules}
+<% endif %>
+<% if namespaceTree.tree %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.namespaceIndex }>}
+\input{namespaces}
+<% endif %>
+<% if classTree.tree %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.classIndex }>}
+\input{annotated}
+<% endif %>
+<% if fileTree.tree %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.fileIndex }>}
+\input{files}
+<% endif %>
+<% if moduleList %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.moduleDocumentation }>}
+<% for compound in moduleList %>
+\input{<{ compound.fileName|raw }>}
+<% endfor %>
+<% endif %>
+<% if namespaceList %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.namespaceDocumentation }>}
+<% for compound in namespaceList %>
+\input{<{ compound.fileName|raw }>}
+<% endfor %>
+<% endif %>
+<% if classList %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.classDocumentation }>}
+<% for compound in classList %>
+\input{<{ compound.fileName|raw }>}
+<% endfor %>
+<% endif %>
+<% if fileList %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.fileDocumentation }>}
+<% for compound in fileList %>
+\input{<{ compound.fileName|raw }>}
+<% endfor %>
+<% endif %>
+%--- End generated contents ---
+
+<# TODO: write bibliography #>
+% Index
+<% if not config.COMPACT_LATEX %>
+\backmatter
+<% endif %>
+\newpage
+\phantomsection
+\clearemptydoublepage
+\addcontentsline{toc}{<% if config.COMPACT_LATEX %>section<% else %>chapter<% endif %>}{<{ tr.index }>}
+\printindex
+
+\end{document}
+
+
diff --git a/templates/latex/latextypeconstraints.tpl b/templates/latex/latextypeconstraints.tpl
new file mode 100644 (file)
index 0000000..2853ab2
--- /dev/null
@@ -0,0 +1,12 @@
+<# obj should be a class or member #>
+<% msg %>type constraints = <{ obj.typeConstraints|length }><% endmsg %>
+<% if obj.typeConstraints %>
+\begin{Desc}
+\item[<{ tr.typeConstraints }>]
+\begin{description}
+<% for arg in obj.typeConstraints %>
+  \item[{\em <{ arg.name }>} : {\em <{ arg.type }>}] <{ arg.docs }>
+<% endfor %>
+\end{description}
+\end{Desc}
+<% endif %>
index 87ceb53..f7cd444 100644 (file)
@@ -4,21 +4,9 @@
     <compoundname>index</compoundname>
     <title>My Project</title>
     <detaileddescription>
-      <para>Text. <htmlonly> 
-HTML
-</htmlonly> <htmlonly>
-HTML with block
-</htmlonly> <rtfonly> 
-RTF
-</rtfonly> <manonly> 
-Man
-</manonly> <latexonly> 
-LaTeX
-</latexonly>  
+      <para>Text. 
 XML
- <docbookonly> 
-DocBook
-</docbookonly> More text. </para>
+More text. </para>
     </detaileddescription>
   </compounddef>
 </doxygen>
index 4f13f56..82c58cc 100644 (file)
@@ -4,7 +4,7 @@
     <compoundname>index</compoundname>
     <title>My Project</title>
     <detaileddescription>
-      <para>Dollar $ At @ Backslash \ Amphasand &amp; Less &lt; Greater &gt; Hash # Percent % Quote " Dot . Double colon :: Pipe | </para>
+      <para>Dollar $ At @ Backslash \ Amphasand &amp; Less &lt; Greater &gt; Hash # Percent % Quote " Dot . Double colon :: Pipe | Plus + Minus - </para>
     </detaileddescription>
   </compounddef>
 </doxygen>
index 1497ad1..290b298 100644 (file)
@@ -14,5 +14,7 @@ Quote \"
 Dot \.
 Double colon \::
 Pipe \|
+Plus \+
+Minus \-
 
 */
index 149d457..83647c6 100644 (file)
@@ -41,10 +41,7 @@ class Tester:
                                        if (key=='config'):
                                                value = value.replace('$INPUTDIR',self.args.inputdir)
                                        #print('key=%s value=%s' % (key,value))
-                                       if key in config:
-                                               config[key].append(value)
-                                       else:
-                                               config[key] = [value]
+                                       config.setdefault(key, []).append(value)
                return config
 
        def prepare_test(self):
index e1e4ab1..1f60ae0 100644 (file)
@@ -1,5 +1,5 @@
 include_directories(${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/qtools)
-add_library(vhdlparser
+add_library(vhdlparser STATIC
 CharStream.cc
 ParseException.cc
 Token.cc
index 409439f..2543ad1 100644 (file)
@@ -30,13 +30,29 @@ namespace parser {
 class CharStream {
 public:
           void setTabSize(int i) { tabSize = i; }
-          int  getTabSize(int)   { return tabSize; }
-  virtual int  getColumn()       { return trackLineColumn ? bufcolumn[bufpos] : -1; }
-  virtual int  getLine()         { return trackLineColumn ? bufline[bufpos] : -1; }
-  virtual int  getEndColumn()    { return trackLineColumn ? bufcolumn[bufpos] : -1; }
-  virtual int  getEndLine()      { return trackLineColumn ? bufline[bufpos] : -1; }
-  virtual int  getBeginColumn()  { return trackLineColumn ? bufcolumn[tokenBegin] : -1; }
-  virtual int  getBeginLine()    { return trackLineColumn ? bufline[tokenBegin] : -1; }
+          int  getTabSize(int i) { return tabSize; }
+ private:
+  int getBufcolumn(int pos) {
+    if (trackLineColumn && pos>=0) {
+      return bufcolumn[pos];
+    } else {
+      return -1;
+    }
+  }
+  int getBufline(int pos) {
+    if (trackLineColumn && pos>=0) {
+      return bufline[pos];
+    } else {
+      return -1;
+    }
+  }
+ public:
+  virtual int getColumn() { return getBufcolumn(bufpos); }
+  virtual int getLine() { return getBufline(bufpos); }
+  virtual int getEndColumn() { return getBufcolumn(bufpos); }
+  virtual int getEndLine() { return getBufline(bufpos); }
+  virtual int getBeginColumn() { return getBufcolumn(tokenBegin); }
+  virtual int getBeginLine() { return getBufline(tokenBegin); }
 
   virtual bool getTrackLineColumn()         { return trackLineColumn; }
   virtual void setTrackLineColumn(bool val) { trackLineColumn = val; }
@@ -179,7 +195,7 @@ public:
   }
 
   CharStream(ReaderStream *input_stream, int startline,
-             int startcolumn, int) :
+             int startcolumn, int buffersize) :
     bufline(NULL), bufcolumn(NULL), buffer(NULL), bufpos(0), bufsize(0), 
     tokenBegin(0), column(0), line(0), prevCharIsCR(false), prevCharIsLF(false),
     available(0), maxNextCharInd(0), inBuf(0), tabSize(1), trackLineColumn(true),
@@ -248,4 +264,4 @@ public:
 }
 }
 #endif
-/* JavaCC - OriginalChecksum=89f4cb30f0d3487ee809cca18a2924f2 (do not edit this line) */
+/* JavaCC - OriginalChecksum=3f0e693d1617236429891c8c95713d73 (do not edit this line) */
index 2170489..9f7dc07 100644 (file)
@@ -24,7 +24,7 @@ JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str);
       // expectedKind - token kind that the parser was trying to consume.
       // expectedToken - the image of the token - tokenImages[expectedKind].
       // actual - the actual token that the parser got instead.
-      virtual void handleUnexpectedToken(int, JAVACC_STRING_TYPE expectedToken, Token *actual, VhdlParser *) {
+      virtual void handleUnexpectedToken(int expectedKind, JAVACC_STRING_TYPE expectedToken, Token *actual, VhdlParser *parser) {
         error_count++;
         fprintf(stderr, "Expecting %s at: %d:%d but got %s\n", addUnicodeEscapes(expectedToken).c_str(), actual->beginLine, actual->beginColumn, addUnicodeEscapes(actual->image).c_str());
       }
@@ -32,14 +32,14 @@ JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str);
       // last - the last token successfully parsed.
       // unexpected - the token at which the error occurs.
       // production - the production in which this error occurrs.
-      virtual void handleParseError(Token *, Token *unexpected, JAVACC_SIMPLE_STRING production, VhdlParser *) {
+      virtual void handleParseError(Token *last, Token *unexpected, JAVACC_SIMPLE_STRING production, VhdlParser *parser) {
         error_count++;
         fprintf(stderr, "Encountered: %s at: %d:%d while parsing: %s\n", addUnicodeEscapes(unexpected->image).c_str(), unexpected->beginLine, unexpected->beginColumn, production.c_str());
       }
       virtual int getErrorCount() {
         return error_count;
       }
-      virtual void handleOtherError(JAVACC_STRING_TYPE message, VhdlParser *) {
+      virtual void handleOtherError(JAVACC_STRING_TYPE message, VhdlParser *parser) {
         fprintf(stderr, "Error: %s\n", (char*)message.c_str());
       }
       virtual ~ErrorHandler() {}
@@ -62,11 +62,11 @@ JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str);
        //    errorAfter  : prefix that was seen before this error occurred
        //    curchar     : the offending character
        //
-       virtual void lexicalError(bool EOFSeen, int, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar, VhdlParserTokenManager*) {
+       virtual void lexicalError(bool EOFSeen, int lexState, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar, VhdlParserTokenManager* token_manager) {
         // by default, we just print an error message and return.
         fprintf(stderr, "Lexical error at: %d:%d. Encountered: %c after: %s.\n", errorLine, errorColumn, curChar, (EOFSeen? "EOF" : (const char*)errorAfter.c_str()));
       }
-       virtual void lexicalError(JAVACC_STRING_TYPE errorMessage, VhdlParserTokenManager*) {
+       virtual void lexicalError(JAVACC_STRING_TYPE errorMessage, VhdlParserTokenManager* token_manager) {
         fprintf(stderr, "%s\n", (char*)errorMessage.c_str());
       }
       virtual ~TokenManagerErrorHandler() {}
similarity index 57%
rename from vhdlparser/Makefile.in
rename to vhdlparser/Makefile
index ef2c774..4725470 100644 (file)
@@ -1,39 +1,22 @@
 #
-# 
+# Copyright (C) 1997-2015 by Dimitri van Heesch.
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
-# 
 # Permission to use, copy, modify, and distribute this software and its
-# documentation under the terms of the GNU General Public License is hereby 
-# granted. No representations are made about the suitability of this software 
+# documentation under the terms of the GNU General Public License is hereby
+# granted. No representations are made about the suitability of this software
 # for any purpose. It is provided "as is" without express or implied warranty.
 # See the GNU General Public License for more details.
-# 
+#
 # Documents produced by Doxygen are derivative works derived from the
 # input used in their production; they are not affected by this license.
-# 
-
-all: Makefile.vhdlparser Makefile
-       $(MAKE) -f Makefile.vhdlparser    $@
-
-Makefile.vhdlparser: vhdlparser.pro 
-       $(ENV) $(PERL) "$(TMAKE)" vhdlparser.pro >Makefile.vhdlparser
-
-tmake: 
-       $(ENV) $(PERL) "$(TMAKE)" vhdlparser.pro >Makefile.vhdlparser
-
-clean: Makefile.vhdlparser 
-       $(MAKE) -f Makefile.vhdlparser    clean 
+#
 
 regenerate:
-       $(RM) CharStream.cc CharStream.h ErrorHandler.h ParseException.cc ParseException.h \
+       rm -f CharStream.cc CharStream.h ErrorHandler.h ParseException.cc ParseException.h \
              Token.cc Token.h TokenManager.h TokenMgrError.cc TokenMgrError.h VhdlParser.cc VhdlParser.h \
              VhdlParserConstants.h VhdlParserTokenManager.cc VhdlParserTokenManager.h \
               JavaCC.h
        javacc vhdlparser.jj
-       $(CP) JavaCC.h.in JavaCC.h
-
-distclean: clean
-       $(RM) Makefile vhdlparser.pro
+       cp JavaCC.h.in JavaCC.h
 
 FORCE:
index 68fbe2f..0c2caa6 100644 (file)
@@ -2,9 +2,12 @@
 /* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
 #ifndef TOKENMANAGER_H
 #define TOKENMANAGER_H
+#include <iostream>
 #include "JavaCC.h"
 #include "Token.h"
 
+using namespace std;
+
 namespace vhdl {
 namespace parser {
 /**
@@ -16,12 +19,12 @@ namespace parser {
 class TokenManager {
 public:
   /** This gets the next token from the input stream.
-   *  A token of kind 0 (\<EOF\>) should be returned on EOF.
+   *  A token of kind 0 (<EOF>) should be returned on EOF.
    */
   virtual       ~TokenManager() { }
   virtual Token *getNextToken() = 0;
   virtual void   lexicalError() {
-       fprintf(stderr,"Lexical error encountered.");
+       cerr << "Lexical error encountered." << endl;
   }
 
 };
index 6231196..74908f0 100644 (file)
@@ -64,7 +64,7 @@ namespace parser {
 // i < 16 - guaranteed
 char hexChar(int i) {
   if (i < 10) {
-    return i - '0';
+    return i + '0';
   }
   return 'a' + (i - 10);
 }
@@ -115,4 +115,4 @@ JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str) {
 
 }
 }
-/* JavaCC - OriginalChecksum=2fe11435e6701b2fca885354b08bfdf6 (do not edit this line) */
+/* JavaCC - OriginalChecksum=72f292bc267bd0602e63291bf864f942 (do not edit this line) */
index 949f227..acdea91 100644 (file)
@@ -62,7 +62,7 @@ return tok->image.c_str();
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::access_type_definition() {Token *tok=0;QCString str,str1;if (!hasError) {
@@ -76,7 +76,7 @@ QCString VhdlParser::access_type_definition() {Token *tok=0;QCString str,str1;if
     
 str=tok->image.c_str(); return str+str1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::actual_designator() {QCString str;Token *t=0;
@@ -118,7 +118,7 @@ return str;
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::actual_parameter_part() {QCString s;if (!hasError) {
@@ -128,7 +128,7 @@ QCString VhdlParser::actual_parameter_part() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::actual_part() {QCString s,s1;
@@ -187,7 +187,7 @@ s+="(";s+=s1+")";return s;
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::adding_operator() {
@@ -231,7 +231,7 @@ return "&";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::aggregate() {QCString s,s1,s2;if (!hasError) {
@@ -276,7 +276,7 @@ s+=","+s1;
     
 return "("+s+")";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::alias_declaration() {QCString s,s1,s2;if (!hasError) {
@@ -358,7 +358,7 @@ addVhdlType(s2.data(),getLine(ALIAS_T),Entry::VARIABLE_SEC,VhdlDocGen::ALIAS,0,s
 
  return s2+" "+s+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::alias_designator() {Token *tok=0;QCString s;
@@ -403,7 +403,7 @@ return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 void VhdlParser::allocator() {
@@ -435,7 +435,7 @@ void VhdlParser::allocator() {
         errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
       }
     }
-  }
+}
 
 
 void VhdlParser::architecture_body() {QCString s,s1;if (!hasError) {
@@ -528,7 +528,7 @@ error_skipto(BEGIN_T);
     }
     
 lastEntity=0;lastCompound=0; genLabels.resize(0);
-  }
+}
 
 
 void VhdlParser::architecture_declarative_part() {if (!hasError) {
@@ -568,7 +568,7 @@ void VhdlParser::architecture_declarative_part() {if (!hasError) {
     end_label_2: ;
     }
     
-  }
+}
 
 
 void VhdlParser::architecture_statement_part() {if (!hasError) {
@@ -601,7 +601,7 @@ void VhdlParser::architecture_statement_part() {if (!hasError) {
     end_label_3: ;
     }
     
-  }
+}
 
 
 QCString VhdlParser::array_type_definition() {QCString s;
@@ -634,7 +634,7 @@ return s;
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::assertion() {QCString s,s1,s2;Token *t=0;Token *t1=0;if (!hasError) {
@@ -689,7 +689,7 @@ s.prepend("assert ");
    if(t1) s2.prepend(" report ");
     return s+s1+s2;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::assertion_statement() {QCString s,s1,s2;Token *t=0;if (!hasError) {
@@ -724,7 +724,7 @@ QCString VhdlParser::assertion_statement() {QCString s,s1,s2;Token *t=0;if (!has
 if(t) s+=":";
     return s+s1+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::association_element() {QCString s,s1;if (!hasError) {
@@ -749,7 +749,7 @@ QCString VhdlParser::association_element() {QCString s,s1;if (!hasError) {
     
 return s+" => "+s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::association_list() {QCString s,s1;if (!hasError) {
@@ -786,7 +786,7 @@ s+=","+s1;
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::attribute_declaration() {QCString s,s1;if (!hasError) {
@@ -813,7 +813,7 @@ QCString VhdlParser::attribute_declaration() {QCString s,s1;if (!hasError) {
 addVhdlType(s.data(),getLine(ATTRIBUTE_T),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,s1.data(),Public);
     return " attribute "+s+":"+s1+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::attribute_designator() {QCString s;Token *tok=0;
@@ -847,7 +847,7 @@ return tok->image.c_str();
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::attribute_name() {QCString s,s1;if (!hasError) {
@@ -896,7 +896,7 @@ s+"("+s1+")";
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::attribute_specification() {QCString s,s1,s2;if (!hasError) {
@@ -932,7 +932,7 @@ QCString t= s1+" is "+s2;
    addVhdlType(s.data(),getLine(ATTRIBUTE_T),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,t.data(),Public);
    return " attribute "+s+" of "+s1+ " is "+s2+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::base() {Token *tok=0;if (!hasError) {
@@ -942,7 +942,7 @@ QCString VhdlParser::base() {Token *tok=0;if (!hasError) {
     
 return tok->image.c_str();
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::base_specifier() {Token *tok=0;if (!hasError) {
@@ -952,7 +952,7 @@ QCString VhdlParser::base_specifier() {Token *tok=0;if (!hasError) {
     
 return tok->image.c_str();
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::base_unit_declaration() {QCString s;if (!hasError) {
@@ -962,7 +962,7 @@ QCString VhdlParser::base_unit_declaration() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::based_integer() {Token *tok=0;if (!hasError) {
@@ -972,7 +972,7 @@ QCString VhdlParser::based_integer() {Token *tok=0;if (!hasError) {
     
 return tok->image.c_str();
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::based_literal() {Token *tok=0;if (!hasError) {
@@ -982,7 +982,7 @@ QCString VhdlParser::based_literal() {Token *tok=0;if (!hasError) {
     
 return tok->image.c_str();
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::basic_identifier() {Token *tok=0;if (!hasError) {
@@ -992,7 +992,7 @@ QCString VhdlParser::basic_identifier() {Token *tok=0;if (!hasError) {
     
 return tok->image.c_str();
 assert(false);
-  }
+}
 
 
 void VhdlParser::binding_indication() {if (!hasError) {
@@ -1045,7 +1045,7 @@ void VhdlParser::binding_indication() {if (!hasError) {
     }
     }
     
-  }
+}
 
 
 QCString VhdlParser::bit_string_literal() {Token *tok=0;if (!hasError) {
@@ -1055,7 +1055,7 @@ QCString VhdlParser::bit_string_literal() {Token *tok=0;if (!hasError) {
     
 return tok->image.c_str();
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::bit_value() {Token *tok=0;if (!hasError) {
@@ -1065,7 +1065,7 @@ QCString VhdlParser::bit_value() {Token *tok=0;if (!hasError) {
     
 return tok->image.c_str();
 assert(false);
-  }
+}
 
 
 void VhdlParser::block_configuration() {if (!hasError) {
@@ -1127,7 +1127,7 @@ void VhdlParser::block_configuration() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::block_declarative_item() {
@@ -1261,7 +1261,7 @@ void VhdlParser::block_declarative_item() {
         }
       }
     }
-  }
+}
 
 
 void VhdlParser::block_declarative_part() {if (!hasError) {
@@ -1301,7 +1301,7 @@ void VhdlParser::block_declarative_part() {if (!hasError) {
     end_label_7: ;
     }
     
-  }
+}
 
 
 void VhdlParser::block_header() {if (!hasError) {
@@ -1369,7 +1369,7 @@ void VhdlParser::block_header() {if (!hasError) {
     }
     }
     
-  }
+}
 
 
 void VhdlParser::block_specification() {if (!hasError) {
@@ -1400,7 +1400,7 @@ void VhdlParser::block_specification() {if (!hasError) {
     }
     }
     
-  }
+}
 
 
 void VhdlParser::block_statement() {QCString s;if (!hasError) {
@@ -1503,7 +1503,7 @@ pushLabel(genLabels,s);
     }
     
 genLabels=popLabel(genLabels);
-  }
+}
 
 
 void VhdlParser::block_statement_part() {if (!hasError) {
@@ -1536,7 +1536,7 @@ void VhdlParser::block_statement_part() {if (!hasError) {
     end_label_8: ;
     }
     
-  }
+}
 
 
 void VhdlParser::case_statement() {QCString s;if (!hasError) {
@@ -1630,7 +1630,7 @@ QCString ca="case "+s;
     
 FlowChart::moveToPrevLevel();
          FlowChart::addFlowChart(FlowChart::END_CASE,"end case",0);
-  }
+}
 
 
 void VhdlParser::case_statement_alternative() {QCString s;if (!hasError) {
@@ -1657,7 +1657,7 @@ QCString t="when ";
     }
     
 FlowChart::moveToPrevLevel();
-  }
+}
 
 
 QCString VhdlParser::character_literal() {Token *tok=0;if (!hasError) {
@@ -1667,7 +1667,7 @@ QCString VhdlParser::character_literal() {Token *tok=0;if (!hasError) {
     
 return tok->image.c_str();
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::choice() {QCString s;
@@ -1718,7 +1718,7 @@ return " others ";
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::choices() {QCString s,s1;if (!hasError) {
@@ -1755,7 +1755,7 @@ s+="|";s+=s1;
     
 return s;
 assert(false);
-  }
+}
 
 
 void VhdlParser::component_configuration() {if (!hasError) {
@@ -1816,7 +1816,7 @@ void VhdlParser::component_configuration() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::component_declaration() {QCString s;if (!hasError) {
@@ -1910,7 +1910,7 @@ addVhdlType(s.data(),getLine(COMPONENT_T),Entry::VARIABLE_SEC,VhdlDocGen::COMPON
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::component_instantiation_statement() {QCString s,s1;if (!hasError) {
@@ -1960,7 +1960,7 @@ addCompInst(s.lower().data(),s1.lower().data(),0,getLine());
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::component_specification() {if (!hasError) {
@@ -1976,7 +1976,7 @@ void VhdlParser::component_specification() {if (!hasError) {
     name();
     }
     
-  }
+}
 
 
 QCString VhdlParser::composite_type_definition() {QCString s,s1;
@@ -2009,7 +2009,7 @@ return s+"#";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 void VhdlParser::concurrent_assertion_statement() {if (!hasError) {
@@ -2051,7 +2051,7 @@ void VhdlParser::concurrent_assertion_statement() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::concurrent_procedure_call_statement() {if (!hasError) {
@@ -2093,7 +2093,7 @@ void VhdlParser::concurrent_procedure_call_statement() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::concurrent_signal_assignment_statement() {if (!hasError) {
@@ -2150,7 +2150,7 @@ void VhdlParser::concurrent_signal_assignment_statement() {if (!hasError) {
     }
     }
     
-  }
+}
 
 
 void VhdlParser::concurrent_statement() {
@@ -2217,7 +2217,7 @@ void VhdlParser::concurrent_statement() {
         }
       }
     }
-  }
+}
 
 
 QCString VhdlParser::condition() {QCString s;if (!hasError) {
@@ -2227,7 +2227,7 @@ QCString VhdlParser::condition() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::condition_clause() {QCString s;if (!hasError) {
@@ -2241,7 +2241,7 @@ QCString VhdlParser::condition_clause() {QCString s;if (!hasError) {
     
 return " until "+s;
 assert(false);
-  }
+}
 
 
 void VhdlParser::conditional_signal_assignment() {if (!hasError) {
@@ -2265,7 +2265,7 @@ void VhdlParser::conditional_signal_assignment() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::conditional_waveforms() {if (!hasError) {
@@ -2319,7 +2319,7 @@ void VhdlParser::conditional_waveforms() {if (!hasError) {
     }
     }
     
-  }
+}
 
 
 void VhdlParser::configuration_declaration() {QCString s,s1;if (!hasError) {
@@ -2398,7 +2398,7 @@ confName=s+"::"+s1;
     }
     
 genLabels.resize(0); confName="";
-  }
+}
 
 
 void VhdlParser::configuration_declarative_item() {
@@ -2429,7 +2429,7 @@ void VhdlParser::configuration_declarative_item() {
       jj_consume_token(-1);
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
-  }
+}
 
 
 void VhdlParser::configuration_declarative_part() {if (!hasError) {
@@ -2454,7 +2454,7 @@ void VhdlParser::configuration_declarative_part() {if (!hasError) {
     end_label_12: ;
     }
     
-  }
+}
 
 
 void VhdlParser::configuration_item() {
@@ -2478,7 +2478,7 @@ void VhdlParser::configuration_item() {
         errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
       }
     }
-  }
+}
 
 
 void VhdlParser::configuration_specification() {if (!hasError) {
@@ -2498,7 +2498,7 @@ void VhdlParser::configuration_specification() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 QCString VhdlParser::constant_declaration() {QCString s,s1,s2;Token *t=0;if (!hasError) {
@@ -2548,7 +2548,7 @@ if(t)
      it.prepend("constant ");
      return it;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::constraint_array_definition() {QCString s,s1;if (!hasError) {
@@ -2570,7 +2570,7 @@ QCString VhdlParser::constraint_array_definition() {QCString s,s1;if (!hasError)
     
 return s+" "+s1;
 assert(false);
-  }
+}
 
 
 void VhdlParser::context_clause() {if (!hasError) {
@@ -2594,7 +2594,7 @@ void VhdlParser::context_clause() {if (!hasError) {
     end_label_13: ;
     }
     
-  }
+}
 
 
 QCString VhdlParser::constraint() {QCString s;
@@ -2621,7 +2621,7 @@ return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 void VhdlParser::context_item() {
@@ -2645,7 +2645,7 @@ void VhdlParser::context_item() {
       jj_consume_token(-1);
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
-  }
+}
 
 
 QCString VhdlParser::decimal_literal() {Token *tok=0;if (!hasError) {
@@ -2655,7 +2655,7 @@ QCString VhdlParser::decimal_literal() {Token *tok=0;if (!hasError) {
     
 return tok->image.c_str();
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::delay_mechanism() {QCString s;
@@ -2712,7 +2712,7 @@ return s+" inertial ";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 void VhdlParser::design_file() {
@@ -2767,7 +2767,7 @@ void VhdlParser::design_file() {
       jj_consume_token(-1);
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
-  }
+}
 
 
 void VhdlParser::design_unit() {if (!hasError) {
@@ -2779,7 +2779,7 @@ void VhdlParser::design_unit() {if (!hasError) {
     library_unit();
     }
     
-  }
+}
 
 
 QCString VhdlParser::designator() {QCString s;
@@ -2813,7 +2813,7 @@ return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::direction() {Token *tok=0;
@@ -2846,7 +2846,7 @@ return tok->image.c_str();
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 void VhdlParser::disconnection_specification() {if (!hasError) {
@@ -2870,7 +2870,7 @@ void VhdlParser::disconnection_specification() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::guarded_signal_specificatio() {if (!hasError) {
@@ -2886,7 +2886,7 @@ void VhdlParser::guarded_signal_specificatio() {if (!hasError) {
     name();
     }
     
-  }
+}
 
 
 QCString VhdlParser::discrete_range() {QCString s;
@@ -2913,7 +2913,7 @@ return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::element_association() {QCString s,s1;if (!hasError) {
@@ -2940,7 +2940,7 @@ if(!s.isEmpty())
  return s+"=>"+s1;
 return s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::element_declaration() {QCString s,s1;if (!hasError) {
@@ -2964,7 +2964,7 @@ addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::RECORD,0,s1.data(
   //addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,s1.data(),Public);
   return s+":"+s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::entity_aspect() {Token *tok=0;QCString s,s1;
@@ -3043,7 +3043,7 @@ return tok->image.c_str();
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::entity_class() {
@@ -3241,7 +3241,7 @@ return "file";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::entity_class_entry() {QCString s;if (!hasError) {
@@ -3270,7 +3270,7 @@ s+="<>";
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::entity_class_entry_list() {QCString s,s1,s2;if (!hasError) {
@@ -3314,7 +3314,7 @@ s2+=",";s2+=s;
     
 return s1+s2;
 assert(false);
-  }
+}
 
 
 void VhdlParser::entity_declaration() {QCString s;if (!hasError) {
@@ -3405,7 +3405,7 @@ lastEntity=current;
     }
     
 lastEntity=0;lastCompound=0; genLabels.resize(0);
-  }
+}
 
 
 void VhdlParser::entity_declarative_item() {
@@ -3550,7 +3550,7 @@ void VhdlParser::entity_declarative_item() {
         }
       }
     }
-  }
+}
 
 
 void VhdlParser::entity_declarative_part() {if (!hasError) {
@@ -3590,7 +3590,7 @@ void VhdlParser::entity_declarative_part() {if (!hasError) {
     end_label_16: ;
     }
     
-  }
+}
 
 
 QCString VhdlParser::entity_designator() {QCString s,s1;if (!hasError) {
@@ -3615,7 +3615,7 @@ QCString VhdlParser::entity_designator() {QCString s,s1;if (!hasError) {
     
 return s+s1;
 assert(false);
-  }
+}
 
 
 void VhdlParser::entity_header() {if (!hasError) {
@@ -3657,7 +3657,7 @@ currP=VhdlDocGen::PORT;
     }
     }
     
-  }
+}
 
 
 QCString VhdlParser::entity_name_list() {QCString s,s1;
@@ -3728,7 +3728,7 @@ return "all";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::entity_specification() {QCString s,s1;if (!hasError) {
@@ -3746,7 +3746,7 @@ QCString VhdlParser::entity_specification() {QCString s,s1;if (!hasError) {
     
 return s+":"+s1;
 assert(false);
-  }
+}
 
 
 void VhdlParser::entity_statement() {
@@ -3779,7 +3779,7 @@ void VhdlParser::entity_statement() {
         errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
       }
     }
-  }
+}
 
 
 void VhdlParser::entity_statement_part() {if (!hasError) {
@@ -3808,7 +3808,7 @@ void VhdlParser::entity_statement_part() {if (!hasError) {
     end_label_18: ;
     }
     
-  }
+}
 
 
 QCString VhdlParser::entity_tag() {QCString s;
@@ -3844,7 +3844,7 @@ return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::enumeration_literal() {QCString s;
@@ -3878,7 +3878,7 @@ return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::enumeration_type_definition() {QCString s,s1;if (!hasError) {
@@ -3923,7 +3923,7 @@ s+=",";s+=s1;
     
 return "("+s+")";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::exit_statement() {QCString s,s1,s2;Token *t=0;Token *t1=0;if (!hasError) {
@@ -3997,7 +3997,7 @@ lab.resize(0);
 
   return s+s1+s2+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::expression() {QCString s,s1,s2;if (!hasError) {
@@ -4039,7 +4039,7 @@ s+=s1;s+=s2;
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::logop() {
@@ -4116,7 +4116,7 @@ return "or" ;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::extended_identifier() {Token *t;if (!hasError) {
@@ -4126,7 +4126,7 @@ QCString VhdlParser::extended_identifier() {Token *t;if (!hasError) {
     
 return t->image.c_str();
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::factor() {QCString s,s1;
@@ -4212,7 +4212,7 @@ s1="not ";return s1+s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::file_declaration() {QCString s,s1,s2,s3;if (!hasError) {
@@ -4256,7 +4256,7 @@ QCString t1=s2+" "+s3;
    addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,t1.data(),Public);
    return " file "+s+":"+s2+" "+s3+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::file_logical_name() {QCString s;if (!hasError) {
@@ -4266,7 +4266,7 @@ QCString VhdlParser::file_logical_name() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::file_open_information() {QCString s,s1,s2;if (!hasError) {
@@ -4299,7 +4299,7 @@ QCString VhdlParser::file_open_information() {QCString s,s1,s2;if (!hasError) {
     
 s2="open "+s+" is "+s1;  return s2;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::file_type_definition() {QCString s,s1;if (!hasError) {
@@ -4317,7 +4317,7 @@ QCString VhdlParser::file_type_definition() {QCString s,s1;if (!hasError) {
     
 s1=" file of "+s; return s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::floating_type_definition() {QCString s;if (!hasError) {
@@ -4327,7 +4327,7 @@ QCString VhdlParser::floating_type_definition() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::formal_designator() {QCString s;Token *tok=0;
@@ -4363,7 +4363,7 @@ return tok->image.c_str();
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::formal_parameter_list() {QCString s;if (!hasError) {
@@ -4373,7 +4373,7 @@ QCString VhdlParser::formal_parameter_list() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::formal_part() {QCString s,s1;if (!hasError) {
@@ -4410,7 +4410,7 @@ s+"("+s1+")";
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::full_type_declaration() {Entry *tmpEntry;QCString s,s1,s2;if (!hasError) {
@@ -4466,7 +4466,7 @@ if (s2.contains("#")) {
       tmpEntry=0;
       return "type "+s+" is "+s2+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::function_call() {QCString s,s1;if (!hasError) {
@@ -4488,7 +4488,7 @@ QCString VhdlParser::function_call() {QCString s,s1;if (!hasError) {
     
 return s+"("+s1+")";
 assert(false);
-  }
+}
 
 
 void VhdlParser::generate_statement() {QCString s;if (!hasError) {
@@ -4552,7 +4552,7 @@ error_skipto(GENERATE_T);
     }
     
 genLabels=popLabel(genLabels);
-  }
+}
 
 
 void VhdlParser::generate_scheme() {
@@ -4584,7 +4584,7 @@ void VhdlParser::generate_scheme() {
       jj_consume_token(-1);
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
-  }
+}
 
 
 void VhdlParser::generic_clause() {QCString s;if (!hasError) {
@@ -4613,7 +4613,7 @@ parse_sec=GEN_SEC;
     }
     
 parse_sec=0;
-  }
+}
 
 
 QCString VhdlParser::generic_list() {QCString s;if (!hasError) {
@@ -4623,7 +4623,7 @@ QCString VhdlParser::generic_list() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 void VhdlParser::generic_map_aspect() {if (!hasError) {
@@ -4647,7 +4647,7 @@ void VhdlParser::generic_map_aspect() {if (!hasError) {
     jj_consume_token(RPAREN_T);
     }
     
-  }
+}
 
 
 QCString VhdlParser::group_constituent() {QCString s;
@@ -4683,7 +4683,7 @@ return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::group_constituent_list() {QCString s,s1,s2;if (!hasError) {
@@ -4723,7 +4723,7 @@ s2+=",";s2+=s1;
     
 return s+s2;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::group_declaration() {QCString s,s1,s2;if (!hasError) {
@@ -4761,7 +4761,7 @@ QCString VhdlParser::group_declaration() {QCString s,s1,s2;if (!hasError) {
     
 return "group "+s+":"+s1+"("+s2+");";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::group_template_declaration() {QCString s,s1;if (!hasError) {
@@ -4795,7 +4795,7 @@ QCString VhdlParser::group_template_declaration() {QCString s,s1;if (!hasError)
     
 return "group "+s+ "is ("+s1+");";
 assert(false);
-  }
+}
 
 
 void VhdlParser::guarded_signal_specification() {if (!hasError) {
@@ -4811,7 +4811,7 @@ void VhdlParser::guarded_signal_specification() {if (!hasError) {
     type_mark();
     }
     
-  }
+}
 
 
 QCString VhdlParser::identifier() {Token *tok=0;
@@ -4844,7 +4844,7 @@ return tok->image.c_str();
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::identifier_list() {QCString str,str1;if (!hasError) {
@@ -4881,7 +4881,7 @@ str+=",";str+=str1;
     
 return str;
 assert(false);
-  }
+}
 
 
 void VhdlParser::if_statement() {QCString s,s1;if (!hasError) {
@@ -5015,7 +5015,7 @@ FlowChart::addFlowChart(FlowChart::ELSE_NO,0,0);
     
 FlowChart::moveToPrevLevel();
           FlowChart::addFlowChart(FlowChart::ENDIF_NO,0,0);
-  }
+}
 
 
 QCString VhdlParser::incomplete_type_declaration() {QCString s;if (!hasError) {
@@ -5033,7 +5033,7 @@ QCString VhdlParser::incomplete_type_declaration() {QCString s;if (!hasError) {
     
 return "type "+s+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::index_constraint() {QCString s="("; QCString s1,s2;if (!hasError) {
@@ -5082,7 +5082,7 @@ s+=",";s+=s1;
     
 return s+")";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::index_specification() {QCString s;
@@ -5130,7 +5130,7 @@ return s;
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::index_subtype_definition() {QCString s;if (!hasError) {
@@ -5148,10 +5148,10 @@ QCString VhdlParser::index_subtype_definition() {QCString s;if (!hasError) {
     
 return s+" range <> ";
 assert(false);
-  }
+}
 
 
-QCString VhdlParser::instantiation_unit() {QCString s,s1,s2;Token *tok=0;
+QCString VhdlParser::instantiation_unit() {QCString s,s1,s2;
     switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     case COMPONENT_T:
     case BASIC_IDENTIFIER:
@@ -5160,7 +5160,7 @@ QCString VhdlParser::instantiation_unit() {QCString s,s1,s2;Token *tok=0;
       switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
       case COMPONENT_T:{if (!hasError) {
         
-        tok = jj_consume_token(COMPONENT_T);
+        jj_consume_token(COMPONENT_T);
         }
         
         break;
@@ -5176,14 +5176,29 @@ QCString VhdlParser::instantiation_unit() {QCString s,s1,s2;Token *tok=0;
       }
       if (!hasError) {
       
-s1="component"; return s;
+s1="component "; return s;
       }
       
       break;
       }
     case ENTITY_T:{if (!hasError) {
       
-      tok = jj_consume_token(ENTITY_T);
+      jj_consume_token(ENTITY_T);
+      }
+      if (!hasError) {
+      
+      if (jj_2_38(2)) {if (!hasError) {
+        
+        jj_consume_token(BASIC_IDENTIFIER);
+        }
+        if (!hasError) {
+        
+        jj_consume_token(DOT_T);
+        }
+        
+      } else {
+        ;
+      }
       }
       if (!hasError) {
       
@@ -5191,7 +5206,7 @@ s1="component"; return s;
       }
       if (!hasError) {
       
-s=tok->image.c_str()+s2;
+s="entity "+s2;
       }
       if (!hasError) {
       
@@ -5248,7 +5263,7 @@ s1="configuration ";return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::instantiation_list() {QCString s;Token *tok=0;
@@ -5293,7 +5308,7 @@ return tok->image.c_str();
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::integer() {Token *t;if (!hasError) {
@@ -5303,7 +5318,7 @@ QCString VhdlParser::integer() {Token *t;if (!hasError) {
     
 return t->image.c_str();
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::integer_type_definition() {QCString s;if (!hasError) {
@@ -5313,11 +5328,11 @@ QCString VhdlParser::integer_type_definition() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::interface_declaration() {QCString s,s1;
-    if (jj_2_38(5)) {if (!hasError) {
+    if (jj_2_39(5)) {if (!hasError) {
       
       s = interface_subprogram_declaration();
       }
@@ -5341,7 +5356,7 @@ return s;
         }
       default:
         jj_la1[121] = jj_gen;
-        if (jj_2_39(5)) {if (!hasError) {
+        if (jj_2_40(5)) {if (!hasError) {
           
           s = interface_variable_declaration();
           }
@@ -5350,7 +5365,7 @@ return s;
 return s;
           }
           
-        } else if (jj_2_40(5)) {if (!hasError) {
+        } else if (jj_2_41(5)) {if (!hasError) {
           
           interface_file_declaration();
           }
@@ -5359,7 +5374,7 @@ return s;
 return s;
           }
           
-        } else if (jj_2_41(2147483647)) {if (!hasError) {
+        } else if (jj_2_42(2147483647)) {if (!hasError) {
           
           subprogram_declaration();
           }
@@ -5401,7 +5416,7 @@ if (parse_sec==GEN_SEC)
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::interface_element() {QCString s;if (!hasError) {
@@ -5411,7 +5426,7 @@ QCString VhdlParser::interface_element() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::interface_file_declaration() {QCString s,s1;if (!hasError) {
@@ -5434,7 +5449,7 @@ QCString VhdlParser::interface_file_declaration() {QCString s,s1;if (!hasError)
 addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,s1.data(),Public);
    return " file "+s+":"+s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::interface_list() {QCString s,s1,s2;if (!hasError) {
@@ -5471,7 +5486,7 @@ s2+=";";s2+=s1;
     
 return s+s2;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::interface_variable_declaration() {Token *tok=0;Token *tok1=0;Token *tok2=0;QCString s,s1,s2,s3,s4,s5;if (!hasError) {
@@ -5619,7 +5634,7 @@ if(tok)
                     } // if component
               return it;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::iteration_scheme() {QCString s;
@@ -5666,7 +5681,7 @@ QCString q=lab+" for "+s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::label() {QCString s;if (!hasError) {
@@ -5676,7 +5691,7 @@ QCString VhdlParser::label() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::library_clause() {QCString s;if (!hasError) {
@@ -5702,11 +5717,11 @@ if ( parse_sec==0 && Config_getBool("SHOW_INCLUDE_FILES") )
                    QCString s1="library "+s;
                    return s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::library_unit() {QCString s;
-    if (jj_2_42(2)) {if (!hasError) {
+    if (jj_2_43(2)) {if (!hasError) {
       
       primary_unit();
       }
@@ -5743,11 +5758,11 @@ return s;
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::literal() {QCString s;
-    if (jj_2_43(2147483647)) {if (!hasError) {
+    if (jj_2_44(2147483647)) {if (!hasError) {
       
       s = bit_string_literal();
       }
@@ -5756,7 +5771,7 @@ QCString VhdlParser::literal() {QCString s;
 return s;
       }
       
-    } else if (jj_2_44(2147483647)) {if (!hasError) {
+    } else if (jj_2_45(2147483647)) {if (!hasError) {
       
       s = numeric_literal();
       }
@@ -5765,7 +5780,7 @@ return s;
 return s;
       }
       
-    } else if (jj_2_45(2147483647)) {if (!hasError) {
+    } else if (jj_2_46(2147483647)) {if (!hasError) {
       
       s = enumeration_literal();
       }
@@ -5805,7 +5820,7 @@ return "null";
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::logical_operator() {QCString s;if (!hasError) {
@@ -5815,7 +5830,7 @@ QCString VhdlParser::logical_operator() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::loop_statement() {QCString s,s1,s2,s3;if (!hasError) {
@@ -5906,7 +5921,7 @@ QCString q = s+" loop "+s2+" end loop" +s3;
          FlowChart::addFlowChart(FlowChart::END_LOOP,endLoop.data(),0);
         return q;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::miscellaneous_operator() {Token *t=0;
@@ -5950,7 +5965,7 @@ return "not";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::mode() {Token *tok=0;
@@ -6016,7 +6031,7 @@ return "linkage";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::multiplying_operation() {Token *tok=0;
@@ -6071,7 +6086,7 @@ return tok->image.c_str();
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::name() {QCString s,s1;if (!hasError) {
@@ -6107,7 +6122,7 @@ QCString VhdlParser::name() {QCString s,s1;if (!hasError) {
     }
     if (!hasError) {
     
-    if (jj_2_46(2147483647)) {if (!hasError) {
+    if (jj_2_47(2147483647)) {if (!hasError) {
       
       s1 = name_ext1();
       }
@@ -6123,7 +6138,7 @@ s+=s1;
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::name_ext1() {QCString s,s1,s2;if (!hasError) {
@@ -6133,7 +6148,7 @@ QCString VhdlParser::name_ext1() {QCString s,s1,s2;if (!hasError) {
     if (!hasError) {
     
     while (!hasError) {
-      if (jj_2_47(2147483647)) {
+      if (jj_2_48(2147483647)) {
         ;
       } else {
         goto end_label_26;
@@ -6152,12 +6167,12 @@ s+=s1;
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::name_ext() {QCString s,s1,s2;if (!hasError) {
     
-    if (jj_2_48(2147483647)) {if (!hasError) {
+    if (jj_2_49(2147483647)) {if (!hasError) {
       
       jj_consume_token(DOT_T);
       }
@@ -6170,7 +6185,7 @@ QCString VhdlParser::name_ext() {QCString s,s1,s2;if (!hasError) {
 s+=".";s+=s1;
       }
       
-    } else if (jj_2_49(2147483647)) {if (!hasError) {
+    } else if (jj_2_50(2147483647)) {if (!hasError) {
       
       s1 = test_att_name();
       }
@@ -6179,7 +6194,7 @@ s+=".";s+=s1;
 s+=s1;
       }
       
-    } else if (jj_2_50(2147483647)) {if (!hasError) {
+    } else if (jj_2_51(2147483647)) {if (!hasError) {
       
       jj_consume_token(LPAREN_T);
       }
@@ -6196,7 +6211,7 @@ s+=s1;
 s+="(";s+=s1;s+=")";
       }
       
-    } else if (jj_2_51(2147483647)) {if (!hasError) {
+    } else if (jj_2_52(2147483647)) {if (!hasError) {
       
       jj_consume_token(LPAREN_T);
       }
@@ -6252,12 +6267,12 @@ s+=")";
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::test_att_name() {QCString s,s1;if (!hasError) {
     
-    if (jj_2_52(2147483647)) {if (!hasError) {
+    if (jj_2_53(2147483647)) {if (!hasError) {
       
       s1 = signature();
       }
@@ -6312,7 +6327,7 @@ s+="(";s+=s1;s+=")";
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::indexed_name() {QCString s,s1,s2;if (!hasError) {
@@ -6365,7 +6380,7 @@ s+=",";s+=s1;
     
 return s+")";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::next_statement() {QCString s,s1,s2;Token *t=0;Token *t1=0;if (!hasError) {
@@ -6438,7 +6453,7 @@ if(t) s+=":";
   if(t1) s2.prepend("when ");
   return s+s1+s2+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::null_statement() {QCString s;if (!hasError) {
@@ -6476,11 +6491,11 @@ s+=":";
     
 return s+="null";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::numeric_literal() {QCString s;
-    if (jj_2_53(2147483647)) {if (!hasError) {
+    if (jj_2_54(2147483647)) {if (!hasError) {
       
       s = physical_literal();
       }
@@ -6511,7 +6526,7 @@ return s;
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::object_class() {
@@ -6592,7 +6607,7 @@ return "type";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::operator_symbol() {Token *tok=0;if (!hasError) {
@@ -6602,7 +6617,7 @@ QCString VhdlParser::operator_symbol() {Token *tok=0;if (!hasError) {
     
 return tok->image.c_str();
 assert(false);
-  }
+}
 
 
 void VhdlParser::options() {if (!hasError) {
@@ -6638,7 +6653,7 @@ void VhdlParser::options() {if (!hasError) {
     }
     }
     
-  }
+}
 
 
 void VhdlParser::package_body() {QCString s;if (!hasError) {
@@ -6714,7 +6729,7 @@ lastCompound=current;
     }
     
 lastCompound=0; genLabels.resize(0);
-  }
+}
 
 
 void VhdlParser::package_body_declarative_item() {
@@ -6781,7 +6796,7 @@ void VhdlParser::package_body_declarative_item() {
       }
     default:
       jj_la1[152] = jj_gen;
-      if (jj_2_54(3)) {if (!hasError) {
+      if (jj_2_55(3)) {if (!hasError) {
         
         group_template_declaration();
         }
@@ -6802,7 +6817,7 @@ void VhdlParser::package_body_declarative_item() {
         }
       }
     }
-  }
+}
 
 
 void VhdlParser::package_body_declarative_part() {if (!hasError) {
@@ -6837,7 +6852,7 @@ void VhdlParser::package_body_declarative_part() {if (!hasError) {
     end_label_29: ;
     }
     
-  }
+}
 
 
 void VhdlParser::package_declaration() {QCString s;if (!hasError) {
@@ -6912,7 +6927,7 @@ lastCompound=current;
     }
     
 lastEntity=0;lastCompound=0; genLabels.resize(0);
-  }
+}
 
 
 void VhdlParser::geninter() {if (!hasError) {
@@ -6954,7 +6969,7 @@ void VhdlParser::geninter() {if (!hasError) {
     }
     }
     
-  }
+}
 
 
 void VhdlParser::package_declarative_item() {
@@ -7028,7 +7043,7 @@ void VhdlParser::package_declarative_item() {
       }
     default:
       jj_la1[159] = jj_gen;
-      if (jj_2_55(2147483647)) {if (!hasError) {
+      if (jj_2_56(2147483647)) {if (!hasError) {
         
         attribute_declaration();
         }
@@ -7058,7 +7073,7 @@ void VhdlParser::package_declarative_item() {
           }
         default:
           jj_la1[160] = jj_gen;
-          if (jj_2_56(3)) {if (!hasError) {
+          if (jj_2_57(3)) {if (!hasError) {
             
             group_template_declaration();
             }
@@ -7074,7 +7089,7 @@ void VhdlParser::package_declarative_item() {
               }
             default:
               jj_la1[161] = jj_gen;
-              if (jj_2_57(5)) {if (!hasError) {
+              if (jj_2_58(5)) {if (!hasError) {
                 
                 package_instantiation_declaration();
                 }
@@ -7099,7 +7114,7 @@ void VhdlParser::package_declarative_item() {
         }
       }
     }
-  }
+}
 
 
 void VhdlParser::package_declarative_part() {if (!hasError) {
@@ -7139,7 +7154,7 @@ void VhdlParser::package_declarative_part() {if (!hasError) {
     end_label_30: ;
     }
     
-  }
+}
 
 
 QCString VhdlParser::parameter_specification() {QCString s,s1;if (!hasError) {
@@ -7157,12 +7172,12 @@ QCString VhdlParser::parameter_specification() {QCString s,s1;if (!hasError) {
     
 return s+" in "+s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::physical_literal() {QCString s,s1;if (!hasError) {
     
-    if (jj_2_58(2147483647)) {if (!hasError) {
+    if (jj_2_59(2147483647)) {if (!hasError) {
       
       s = abstract_literal();
       }
@@ -7178,7 +7193,7 @@ QCString VhdlParser::physical_literal() {QCString s,s1;if (!hasError) {
     
 s+=" ";s+=s1;s.prepend(" "); return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::physical_type_definition() {QCString s,s1,s2;if (!hasError) {
@@ -7246,7 +7261,7 @@ addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::UNITS,0,0,Public)
     
 return s+"%";
 assert(false);
-  }
+}
 
 
 void VhdlParser::port_clause() {if (!hasError) {
@@ -7271,7 +7286,7 @@ void VhdlParser::port_clause() {if (!hasError) {
     }
     
 currP=0;
-  }
+}
 
 
 QCString VhdlParser::port_list() {QCString s;if (!hasError) {
@@ -7281,7 +7296,7 @@ QCString VhdlParser::port_list() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 void VhdlParser::port_map_aspect() {if (!hasError) {
@@ -7305,11 +7320,11 @@ void VhdlParser::port_map_aspect() {if (!hasError) {
     jj_consume_token(RPAREN_T);
     }
     
-  }
+}
 
 
 QCString VhdlParser::primary() {QCString s,s1;
-    if (jj_2_59(2147483647)) {if (!hasError) {
+    if (jj_2_60(2147483647)) {if (!hasError) {
       
       s = function_call();
       }
@@ -7318,7 +7333,7 @@ QCString VhdlParser::primary() {QCString s,s1;
 return s;
       }
       
-    } else if (jj_2_60(2147483647)) {if (!hasError) {
+    } else if (jj_2_61(2147483647)) {if (!hasError) {
       
       jj_consume_token(LPAREN_T);
       }
@@ -7335,7 +7350,7 @@ return s;
 s="("+s1+")"; return s;
       }
       
-    } else if (jj_2_61(2147483647)) {if (!hasError) {
+    } else if (jj_2_62(2147483647)) {if (!hasError) {
       
       s = qualified_expression();
       }
@@ -7344,7 +7359,7 @@ s="("+s1+")"; return s;
 return s;
       }
       
-    } else if (jj_2_62(2147483647)) {if (!hasError) {
+    } else if (jj_2_63(2147483647)) {if (!hasError) {
       
       s = type_conversion();
       }
@@ -7353,7 +7368,7 @@ return s;
 return s;
       }
       
-    } else if (jj_2_63(2147483647)) {if (!hasError) {
+    } else if (jj_2_64(2147483647)) {if (!hasError) {
       
       s = literal();
       }
@@ -7362,7 +7377,7 @@ return s;
 s.prepend(" ");return s;
       }
       
-    } else if (jj_2_64(2147483647)) {if (!hasError) {
+    } else if (jj_2_65(2147483647)) {if (!hasError) {
       
       s = name();
       }
@@ -7402,7 +7417,7 @@ return s;
       }
     }
 assert(false);
-  }
+}
 
 
 void VhdlParser::primary_unit() {
@@ -7423,12 +7438,12 @@ void VhdlParser::primary_unit() {
       }
     default:
       jj_la1[167] = jj_gen;
-      if (jj_2_65(2147483647)) {if (!hasError) {
+      if (jj_2_66(2147483647)) {if (!hasError) {
         
         package_instantiation_declaration();
         }
         
-      } else if (jj_2_66(4)) {if (!hasError) {
+      } else if (jj_2_67(4)) {if (!hasError) {
         
         interface_package_declaration();
         }
@@ -7449,7 +7464,7 @@ void VhdlParser::primary_unit() {
         }
       }
     }
-  }
+}
 
 
 QCString VhdlParser::procedure_call() {QCString s,s1;if (!hasError) {
@@ -7486,12 +7501,12 @@ s1.prepend("("); s1.append(")");
     
 return s+s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::procedure_call_statement() {QCString s,s1;if (!hasError) {
     
-    if (jj_2_67(2)) {if (!hasError) {
+    if (jj_2_68(2)) {if (!hasError) {
       
       s = identifier();
       }
@@ -7519,7 +7534,7 @@ s+=":";
     
 return s+s1+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::process_declarative_item() {QCString s;
@@ -7607,7 +7622,7 @@ return s;
       }
     default:
       jj_la1[170] = jj_gen;
-      if (jj_2_68(3)) {if (!hasError) {
+      if (jj_2_69(3)) {if (!hasError) {
         
         s = attribute_declaration();
         }
@@ -7642,7 +7657,7 @@ return s;
           }
         default:
           jj_la1[171] = jj_gen;
-          if (jj_2_69(3)) {if (!hasError) {
+          if (jj_2_70(3)) {if (!hasError) {
             
             s = group_template_declaration();
             }
@@ -7674,7 +7689,7 @@ return s;
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::process_declarative_part() {QCString s,s1;if (!hasError) {
@@ -7716,7 +7731,7 @@ s+=s1;
     
 return s;
 assert(false);
-  }
+}
 
 
 void VhdlParser::process_statement() {QCString s,s1,s2;Token *tok=0;if (!hasError) {
@@ -7901,7 +7916,7 @@ if(s.isEmpty())
   createFlow();
    currName="";
    newEntry();
-  }
+}
 
 
 void VhdlParser::process_statement_part() {if (!hasError) {
@@ -7941,7 +7956,7 @@ void VhdlParser::process_statement_part() {if (!hasError) {
     end_label_33: ;
     }
     
-  }
+}
 
 
 QCString VhdlParser::qualified_expression() {QCString s,s1;if (!hasError) {
@@ -7958,7 +7973,7 @@ s=s1+"'";
     }
     if (!hasError) {
     
-    if (jj_2_70(2147483647)) {if (!hasError) {
+    if (jj_2_71(2147483647)) {if (!hasError) {
       
       s1 = aggregate();
       }
@@ -7998,11 +8013,11 @@ s+="(";s+=s1;s+=")";
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::range() {QCString s,s1,s2;
-    if (jj_2_71(2147483647)) {if (!hasError) {
+    if (jj_2_72(2147483647)) {if (!hasError) {
       
       s = simple_expression();
       }
@@ -8019,7 +8034,7 @@ QCString VhdlParser::range() {QCString s,s1,s2;
 return s+" "+s1+" "+s2;
       }
       
-    } else if (jj_2_72(2147483647)) {if (!hasError) {
+    } else if (jj_2_73(2147483647)) {if (!hasError) {
       
       s = attribute_name();
       }
@@ -8033,7 +8048,7 @@ return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::range_constraint() {QCString s,s1;if (!hasError) {
@@ -8047,7 +8062,7 @@ QCString VhdlParser::range_constraint() {QCString s,s1;if (!hasError) {
     
 return " range "+s;
 assert(false);
-  }
+}
 
 
 void VhdlParser::record_type_definition() {if (!hasError) {
@@ -8101,7 +8116,7 @@ void VhdlParser::record_type_definition() {if (!hasError) {
     }
     }
     
-  }
+}
 
 
 QCString VhdlParser::relation() {QCString s,s1,s2;if (!hasError) {
@@ -8135,7 +8150,7 @@ QCString VhdlParser::relation() {QCString s,s1,s2;if (!hasError) {
     
 return s+s1+s2;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::relation_operator() {
@@ -8212,7 +8227,7 @@ return "/=";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::report_statement() {Token *t=0;Token *t1=0;QCString s,s1,s2;if (!hasError) {
@@ -8272,7 +8287,7 @@ if(t) s.append(":");
         if(t1) s2.prepend(" severity ");
         return s+s1+s2+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::return_statement() {QCString s,s1;if (!hasError) {
@@ -8340,7 +8355,7 @@ s+=":";
     
 return s+" return "+s1+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::scalar_type_definition() {QCString s,s1;
@@ -8362,7 +8377,7 @@ return s;
       }
       if (!hasError) {
       
-      if (jj_2_73(2147483647)) {if (!hasError) {
+      if (jj_2_74(2147483647)) {if (!hasError) {
         
         s1 = physical_type_definition();
         }
@@ -8384,7 +8399,7 @@ return s+" "+s1+"%";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 void VhdlParser::secondary_unit() {
@@ -8408,7 +8423,7 @@ void VhdlParser::secondary_unit() {
       jj_consume_token(-1);
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
-  }
+}
 
 
 QCString VhdlParser::secondary_unit_declaration() {QCString s,s1;if (!hasError) {
@@ -8433,7 +8448,7 @@ QCString VhdlParser::secondary_unit_declaration() {QCString s,s1;if (!hasError)
 
   return s+"="+s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::selected_name() {QCString s,s1;if (!hasError) {
@@ -8451,7 +8466,7 @@ QCString VhdlParser::selected_name() {QCString s,s1;if (!hasError) {
     
 return s+"."+s1;
 assert(false);
-  }
+}
 
 
 void VhdlParser::selected_signal_assignment() {if (!hasError) {
@@ -8487,7 +8502,7 @@ void VhdlParser::selected_signal_assignment() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::selected_waveforms() {if (!hasError) {
@@ -8534,7 +8549,7 @@ void VhdlParser::selected_waveforms() {if (!hasError) {
     end_label_35: ;
     }
     
-  }
+}
 
 
 QCString VhdlParser::sensitivity_clause() {QCString s;if (!hasError) {
@@ -8549,7 +8564,7 @@ QCString VhdlParser::sensitivity_clause() {QCString s;if (!hasError) {
 s.prepend(" on ");
   return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::sensitivity_list() {QCString s,s1;if (!hasError) {
@@ -8586,13 +8601,13 @@ s+=",";s+=s1;
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::sequence_of_statement() {QCString s,s1;if (!hasError) {
     
     while (!hasError) {
-      if (jj_2_74(3)) {
+      if (jj_2_75(3)) {
         ;
       } else {
         goto end_label_37;
@@ -8611,11 +8626,11 @@ s+=s1;
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::sequential_statement() {QCString s;
-    if (jj_2_75(2147483647)) {if (!hasError) {
+    if (jj_2_76(2147483647)) {if (!hasError) {
       
       s = signal_assignment_statement();
       }
@@ -8624,7 +8639,7 @@ QCString VhdlParser::sequential_statement() {QCString s;
 FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
       }
       
-    } else if (jj_2_76(3)) {if (!hasError) {
+    } else if (jj_2_77(3)) {if (!hasError) {
       
       s = assertion_statement();
       }
@@ -8633,7 +8648,7 @@ FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
 FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
       }
       
-    } else if (jj_2_77(3)) {if (!hasError) {
+    } else if (jj_2_78(3)) {if (!hasError) {
       
       s = report_statement();
       }
@@ -8642,7 +8657,7 @@ FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
 FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
       }
       
-    } else if (jj_2_78(3)) {if (!hasError) {
+    } else if (jj_2_79(3)) {if (!hasError) {
       
       s = wait_statement();
       }
@@ -8651,7 +8666,7 @@ FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
 FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
       }
       
-    } else if (jj_2_79(2147483647)) {if (!hasError) {
+    } else if (jj_2_80(2147483647)) {if (!hasError) {
       
       s = variable_assignment_statement();
       }
@@ -8660,7 +8675,7 @@ FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
 FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
       }
       
-    } else if (jj_2_80(3)) {if (!hasError) {
+    } else if (jj_2_81(3)) {if (!hasError) {
       
       s = procedure_call_statement();
       }
@@ -8669,7 +8684,7 @@ FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
 FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
       }
       
-    } else if (jj_2_81(3)) {if (!hasError) {
+    } else if (jj_2_82(3)) {if (!hasError) {
       
       if_statement();
       }
@@ -8678,7 +8693,7 @@ FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
 return s;
       }
       
-    } else if (jj_2_82(3)) {if (!hasError) {
+    } else if (jj_2_83(3)) {if (!hasError) {
       
       case_statement();
       }
@@ -8687,7 +8702,7 @@ return s;
 return s;
       }
       
-    } else if (jj_2_83(3)) {if (!hasError) {
+    } else if (jj_2_84(3)) {if (!hasError) {
       
       loop_statement();
       }
@@ -8696,7 +8711,7 @@ return s;
 return s;
       }
       
-    } else if (jj_2_84(3)) {if (!hasError) {
+    } else if (jj_2_85(3)) {if (!hasError) {
       
       s = next_statement();
       }
@@ -8705,7 +8720,7 @@ return s;
 return s;
       }
       
-    } else if (jj_2_85(3)) {if (!hasError) {
+    } else if (jj_2_86(3)) {if (!hasError) {
       
       s = exit_statement();
       }
@@ -8714,7 +8729,7 @@ return s;
 return s;
       }
       
-    } else if (jj_2_86(3)) {if (!hasError) {
+    } else if (jj_2_87(3)) {if (!hasError) {
       
       s = return_statement();
       }
@@ -8745,7 +8760,7 @@ FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::shift_expression() {QCString s,s1,s2;if (!hasError) {
@@ -8779,7 +8794,7 @@ QCString VhdlParser::shift_expression() {QCString s,s1,s2;if (!hasError) {
     
 return s+s1+s2;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::shift_operator() {
@@ -8856,7 +8871,7 @@ return "ror";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::sign() {
@@ -8889,11 +8904,11 @@ return "-";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::signal_assignment_statement() {QCString s,s1,s2,s3;
-    if (jj_2_88(2147483647)) {if (!hasError) {
+    if (jj_2_89(2147483647)) {if (!hasError) {
       
       conditional_signal_assignment_wave();
       }
@@ -8902,7 +8917,7 @@ QCString VhdlParser::signal_assignment_statement() {QCString s,s1,s2,s3;
 return "";
       }
       
-    } else if (jj_2_89(2147483647)) {if (!hasError) {
+    } else if (jj_2_90(2147483647)) {if (!hasError) {
       
       selected_signal_assignment_wave();
       }
@@ -8919,7 +8934,7 @@ return "";
       case BASIC_IDENTIFIER:
       case EXTENDED_CHARACTER:{if (!hasError) {
         
-        if (jj_2_87(2)) {if (!hasError) {
+        if (jj_2_88(2)) {if (!hasError) {
           
           s = identifier();
           }
@@ -8983,7 +8998,7 @@ return s+s1+"<="+s2+s3+";";
       }
     }
 assert(false);
-  }
+}
 
 
 void VhdlParser::semi() {if (!hasError) {
@@ -8991,7 +9006,7 @@ void VhdlParser::semi() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::signal_declaration() {Token* tok=0;QCString s,s1,s2,s3,s4;if (!hasError) {
@@ -9054,7 +9069,7 @@ if(tok)
       s3.prepend(":=");
      s4=s1+s2+s3;
      addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::SIGNAL,0,s4.data(),Public);
-  }
+}
 
 
 QCString VhdlParser::signal_kind() {
@@ -9087,7 +9102,7 @@ return "bus";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::signal_list() {QCString s,s1;
@@ -9157,7 +9172,7 @@ return "all";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::signature() {QCString s,s1,s2;if (!hasError) {
@@ -9239,7 +9254,7 @@ s+="return ";s+=s1;
     
 s1="["+s+"]";return s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::simple_expression() {QCString s,s1,s2;if (!hasError) {
@@ -9269,7 +9284,7 @@ s+=s1;
     if (!hasError) {
     
     while (!hasError) {
-      if (jj_2_90(2147483647)) {
+      if (jj_2_91(2147483647)) {
         ;
       } else {
         goto end_label_40;
@@ -9292,7 +9307,7 @@ s+=s1;s+=s2;
     
 return s;
 assert(false);
-  }
+}
 
 
 void VhdlParser::simple_name() {if (!hasError) {
@@ -9300,7 +9315,7 @@ void VhdlParser::simple_name() {if (!hasError) {
     name();
     }
     
-  }
+}
 
 
 QCString VhdlParser::slice_name() {QCString s,s1;if (!hasError) {
@@ -9322,7 +9337,7 @@ QCString VhdlParser::slice_name() {QCString s,s1;if (!hasError) {
     
 return s+"("+s1+")";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::string_literal() {Token *tok=0;if (!hasError) {
@@ -9332,7 +9347,7 @@ QCString VhdlParser::string_literal() {Token *tok=0;if (!hasError) {
     
 return tok->image.c_str();
 assert(false);
-  }
+}
 
 
 void VhdlParser::subprogram_body() {QCString s;if (!hasError) {
@@ -9405,11 +9420,11 @@ if (s.data())
 tempEntry->endBodyLine=getLine(END_T);
       createFlow();
       currP=0;
-  }
+}
 
 
 void VhdlParser::subprogram_declaration() {
-    if (jj_2_91(2147483647)) {if (!hasError) {
+    if (jj_2_92(2147483647)) {if (!hasError) {
       
       subprogram_instantiation_declaration();
       }
@@ -9440,7 +9455,7 @@ currP=0;
         errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
       }
     }
-  }
+}
 
 
 void VhdlParser::subprogram_1() {
@@ -9464,7 +9479,7 @@ void VhdlParser::subprogram_1() {
       jj_consume_token(-1);
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
-  }
+}
 
 
 QCString VhdlParser::subprogram_declarative_item() {QCString s;
@@ -9563,7 +9578,7 @@ return s;
       }
     default:
       jj_la1[214] = jj_gen;
-      if (jj_2_92(2147483647)) {if (!hasError) {
+      if (jj_2_93(2147483647)) {if (!hasError) {
         
         s = attribute_declaration();
         }
@@ -9598,7 +9613,7 @@ return s;
           }
         default:
           jj_la1[215] = jj_gen;
-          if (jj_2_93(3)) {if (!hasError) {
+          if (jj_2_94(3)) {if (!hasError) {
             
             s = group_template_declaration();
             }
@@ -9630,7 +9645,7 @@ return s;
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::subprogram_declarative_part() {QCString s,s1;if (!hasError) {
@@ -9673,7 +9688,7 @@ s+=s1;
     
 return s;
 assert(false);
-  }
+}
 
 
 void VhdlParser::subprogram_kind() {
@@ -9697,7 +9712,7 @@ void VhdlParser::subprogram_kind() {
       jj_consume_token(-1);
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
-  }
+}
 
 
 void VhdlParser::subprogram_specification() {QCString s;Token *tok=0;Token *t;
@@ -9751,7 +9766,7 @@ param_sec=0;
       }
       if (!hasError) {
       
-      if (jj_2_94(2)) {if (!hasError) {
+      if (jj_2_95(2)) {if (!hasError) {
         
         gen_interface_list();
         }
@@ -9762,7 +9777,7 @@ param_sec=0;
       }
       if (!hasError) {
       
-      if (jj_2_95(2)) {if (!hasError) {
+      if (jj_2_96(2)) {if (!hasError) {
         
         gen_assoc_list();
         }
@@ -9891,7 +9906,7 @@ tempEntry=current;
       jj_consume_token(-1);
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
-  }
+}
 
 
 void VhdlParser::subprogram_statement_part() {if (!hasError) {
@@ -9931,7 +9946,7 @@ void VhdlParser::subprogram_statement_part() {if (!hasError) {
     end_label_42: ;
     }
     
-  }
+}
 
 
 QCString VhdlParser::subtype_declaration() {QCString s,s1;if (!hasError) {
@@ -9958,7 +9973,7 @@ QCString VhdlParser::subtype_declaration() {QCString s,s1;if (!hasError) {
 addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::SUBTYPE,0,s1.data(),Public);
   return " subtype "+s+" is "+s1+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::subtype_indication() {QCString s,s1,s2;if (!hasError) {
@@ -9967,7 +9982,7 @@ QCString VhdlParser::subtype_indication() {QCString s,s1,s2;if (!hasError) {
     }
     if (!hasError) {
     
-    if (jj_2_96(2147483647)) {if (!hasError) {
+    if (jj_2_97(2147483647)) {if (!hasError) {
       
       s1 = name();
       }
@@ -9978,7 +9993,7 @@ QCString VhdlParser::subtype_indication() {QCString s,s1,s2;if (!hasError) {
     }
     if (!hasError) {
     
-    if (jj_2_97(2147483647)) {if (!hasError) {
+    if (jj_2_98(2147483647)) {if (!hasError) {
       
       s2 = constraint();
       }
@@ -9990,11 +10005,11 @@ QCString VhdlParser::subtype_indication() {QCString s,s1,s2;if (!hasError) {
     
 return s+" "+s1+" "+s2;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::suffix() {QCString s;
-    if (jj_2_98(2147483647)) {if (!hasError) {
+    if (jj_2_99(2147483647)) {if (!hasError) {
       
       s = name();
       }
@@ -10045,7 +10060,7 @@ return " all ";
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::target() {QCString s;
@@ -10081,7 +10096,7 @@ return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::term() {QCString s,s1,s2;if (!hasError) {
@@ -10091,7 +10106,7 @@ QCString VhdlParser::term() {QCString s,s1,s2;if (!hasError) {
     if (!hasError) {
     
     while (!hasError) {
-      if (jj_2_99(2)) {
+      if (jj_2_100(2)) {
         ;
       } else {
         goto end_label_43;
@@ -10114,7 +10129,7 @@ s+=s1;s+=s2;
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::timeout_clause() {QCString s;if (!hasError) {
@@ -10128,7 +10143,7 @@ QCString VhdlParser::timeout_clause() {QCString s;if (!hasError) {
     
 return " for "+s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::type_conversion() {QCString s,s1;if (!hasError) {
@@ -10150,11 +10165,11 @@ QCString VhdlParser::type_conversion() {QCString s,s1;if (!hasError) {
     
 return s+"("+s1+")";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::type_declaration() {QCString s;
-    if (jj_2_100(3)) {if (!hasError) {
+    if (jj_2_101(3)) {if (!hasError) {
       
       s = full_type_declaration();
       }
@@ -10183,7 +10198,7 @@ return s;
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::type_definition() {QCString s;
@@ -10237,7 +10252,7 @@ return s;
       }
     default:
       jj_la1[228] = jj_gen;
-      if (jj_2_101(2)) {if (!hasError) {
+      if (jj_2_102(2)) {if (!hasError) {
         
         protected_type_body();
         }
@@ -10267,7 +10282,7 @@ return "";
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::type_mark() {QCString s;if (!hasError) {
@@ -10277,7 +10292,7 @@ QCString VhdlParser::type_mark() {QCString s;if (!hasError) {
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::unconstraint_array_definition() {QCString s,s1,s2,s3;if (!hasError) {
@@ -10334,7 +10349,7 @@ s3+=",";s3+=s1;
     
 return "array("+s+s3+") of "+s2;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::use_clause() {QCString s,s1;if (!hasError) {
@@ -10390,7 +10405,7 @@ QStringList ql1=QStringList::split(",",s,FALSE);
                    s1="use "+s;
                    return s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::variable_assignment_statement() {QCString s,s1,s2;
@@ -10401,7 +10416,7 @@ QCString VhdlParser::variable_assignment_statement() {QCString s,s1,s2;
     case BASIC_IDENTIFIER:
     case EXTENDED_CHARACTER:{if (!hasError) {
       
-      if (jj_2_102(2)) {if (!hasError) {
+      if (jj_2_103(2)) {if (!hasError) {
         
         s = identifier();
         }
@@ -10458,7 +10473,7 @@ return "";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::variable_declaration() {Token *tok=0;Token *t1=0;QCString s,s1,s2;if (!hasError) {
@@ -10537,7 +10552,7 @@ int spec;
     addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,spec,0,it.data(),Public);
     return val;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::wait_statement() {QCString s,s1,s2,s3;Token *t=0;if (!hasError) {
@@ -10617,7 +10632,7 @@ QCString VhdlParser::wait_statement() {QCString s,s1,s2,s3;Token *t=0;if (!hasEr
 if(t) s.append(":");
   return s+" wait "+s1+s2+s3+";";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::waveform() {QCString s,s1;
@@ -10692,7 +10707,7 @@ return " unaffected ";
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::waveform_element() {QCString s,s1;if (!hasError) {
@@ -10725,7 +10740,7 @@ s1.prepend(" after ");
     
 return s+s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::protected_type_body() {if (!hasError) {
@@ -10771,7 +10786,7 @@ QCString VhdlParser::protected_type_body() {if (!hasError) {
     
 return "";
 assert(false);
-  }
+}
 
 
 void VhdlParser::protected_type_body_declarative_item() {
@@ -10838,7 +10853,7 @@ void VhdlParser::protected_type_body_declarative_item() {
       }
     default:
       jj_la1[243] = jj_gen;
-      if (jj_2_103(2147483647)) {if (!hasError) {
+      if (jj_2_104(2147483647)) {if (!hasError) {
         
         attribute_declaration();
         }
@@ -10861,7 +10876,7 @@ void VhdlParser::protected_type_body_declarative_item() {
           }
         default:
           jj_la1[244] = jj_gen;
-          if (jj_2_104(3)) {if (!hasError) {
+          if (jj_2_105(3)) {if (!hasError) {
             
             group_template_declaration();
             }
@@ -10884,7 +10899,7 @@ void VhdlParser::protected_type_body_declarative_item() {
         }
       }
     }
-  }
+}
 
 
 void VhdlParser::protected_type_body_declarative_part() {if (!hasError) {
@@ -10921,7 +10936,7 @@ void VhdlParser::protected_type_body_declarative_part() {if (!hasError) {
     end_label_47: ;
     }
     
-  }
+}
 
 
 QCString VhdlParser::protected_type_declaration() {if (!hasError) {
@@ -10966,7 +10981,7 @@ error_skipto(END_T);
     
 return "";
 assert(false);
-  }
+}
 
 
 void VhdlParser::protected_type_declarative_item() {
@@ -11000,7 +11015,7 @@ void VhdlParser::protected_type_declarative_item() {
       jj_consume_token(-1);
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
-  }
+}
 
 
 void VhdlParser::protected_type_declarative_part() {if (!hasError) {
@@ -11032,7 +11047,7 @@ void VhdlParser::protected_type_declarative_part() {if (!hasError) {
     end_label_48: ;
     }
     
-  }
+}
 
 
 QCString VhdlParser::context_ref() {QCString s;if (!hasError) {
@@ -11050,7 +11065,7 @@ QCString VhdlParser::context_ref() {QCString s;if (!hasError) {
     
 return "context "+s ;
 assert(false);
-  }
+}
 
 
 void VhdlParser::context_declaration() {QCString s,s1;if (!hasError) {
@@ -11132,7 +11147,7 @@ parse_sec=CONTEXT_SEC;
     
 parse_sec=0;
                           addVhdlType(s.data(),getLine(LIBRARY_T),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,"context",s1.data(),Public);
-  }
+}
 
 
 QCString VhdlParser::libustcont_stats() {QCString s;
@@ -11176,7 +11191,7 @@ return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 void VhdlParser::package_instantiation_declaration() {QCString s,s1,s2;if (!hasError) {
@@ -11225,7 +11240,7 @@ void VhdlParser::package_instantiation_declaration() {QCString s,s1,s2;if (!hasE
     
 QCString q=" is new "+s1+s2;
       addVhdlType(s.data(),getLine(PACKAGE_T),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"package",q.data(),Public);
-  }
+}
 
 
 QCString VhdlParser::interface_package_declaration() {QCString s,s1;if (!hasError) {
@@ -11267,7 +11282,7 @@ QCString VhdlParser::interface_package_declaration() {QCString s,s1;if (!hasErro
 current->name=s;
                             return "package "+s+" is new "+s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::subprogram_instantiation_declaration() {QCString s,s1,s2;if (!hasError) {
@@ -11318,7 +11333,7 @@ QCString q= " is new "+s1+s2;
       addVhdlType(s.data(),getLine(FUNCTION_T),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"function ",q.data(),Public);
     return q;
 assert(false);
-  }
+}
 
 
 void VhdlParser::gen_assoc_list() {if (!hasError) {
@@ -11342,7 +11357,7 @@ void VhdlParser::gen_assoc_list() {if (!hasError) {
     jj_consume_token(RPAREN_T);
     }
     
-  }
+}
 
 
 void VhdlParser::gen_interface_list() {if (!hasError) {
@@ -11372,7 +11387,7 @@ void VhdlParser::gen_interface_list() {if (!hasError) {
     jj_consume_token(RPAREN_T);
     }
     
-  }
+}
 
 
 void VhdlParser::case_scheme() {if (!hasError) {
@@ -11393,7 +11408,7 @@ void VhdlParser::case_scheme() {if (!hasError) {
     }
     if (!hasError) {
     
-    if (jj_2_105(3)) {if (!hasError) {
+    if (jj_2_106(3)) {if (!hasError) {
       
       ttend();
       }
@@ -11419,7 +11434,7 @@ void VhdlParser::case_scheme() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::when_stats() {if (!hasError) {
@@ -11430,7 +11445,7 @@ void VhdlParser::when_stats() {if (!hasError) {
       }
       if (!hasError) {
       
-      if (jj_2_106(2)) {if (!hasError) {
+      if (jj_2_107(2)) {if (!hasError) {
         
         label();
         }
@@ -11469,7 +11484,7 @@ void VhdlParser::when_stats() {if (!hasError) {
     end_label_50: ;
     }
     
-  }
+}
 
 
 void VhdlParser::ttend() {if (!hasError) {
@@ -11497,7 +11512,7 @@ void VhdlParser::ttend() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::generate_statement_body() {if (!hasError) {
@@ -11509,7 +11524,7 @@ void VhdlParser::generate_statement_body() {if (!hasError) {
     generate_statement_body();
     }
     
-  }
+}
 
 
 void VhdlParser::generate_statement_body1() {if (!hasError) {
@@ -11536,7 +11551,7 @@ void VhdlParser::generate_statement_body1() {if (!hasError) {
     case VARIABLE_T:{if (!hasError) {
       
       while (!hasError) {
-        if (jj_2_107(2147483647)) {
+        if (jj_2_108(2147483647)) {
           ;
         } else {
           goto end_label_51;
@@ -11590,7 +11605,7 @@ void VhdlParser::generate_statement_body1() {if (!hasError) {
     end_label_52: ;
     }
     
-  }
+}
 
 
 QCString VhdlParser::external_name() {QCString s,s1,s2;if (!hasError) {
@@ -11622,7 +11637,7 @@ QCString t="<<"+s;
                          QCString t1=s1+":"+s2+">>";
                          return   s+s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::sig_stat() {Token *t;
@@ -11666,7 +11681,7 @@ return t->image.data();
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::external_pathname() {QCString s;
@@ -11710,11 +11725,11 @@ return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::absolute_pathname() {QCString s,s1;
-    if (jj_2_108(2147483647)) {if (!hasError) {
+    if (jj_2_109(2147483647)) {if (!hasError) {
       
       jj_consume_token(DOT_T);
       }
@@ -11755,7 +11770,7 @@ return "."+s;
       }
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::relative_pathname() {QCString s,s1,s2;if (!hasError) {
@@ -11764,7 +11779,7 @@ QCString VhdlParser::relative_pathname() {QCString s,s1,s2;if (!hasError) {
     }
     if (!hasError) {
     
-    if (jj_2_109(2147483647)) {if (!hasError) {
+    if (jj_2_110(2147483647)) {if (!hasError) {
       
       s1 = pathname_element_list();
       }
@@ -11780,7 +11795,7 @@ QCString VhdlParser::relative_pathname() {QCString s,s1,s2;if (!hasError) {
     
 return s+s1+s2;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::neg_list() {QCString s;if (!hasError) {
@@ -11813,7 +11828,7 @@ s+="^.";
     
 return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::pathname_element() {QCString s,s1;if (!hasError) {
@@ -11849,7 +11864,7 @@ if(!s1.isEmpty())
 
     return s;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::pathname_element_list() {QCString s,s1,s2;if (!hasError) {
@@ -11870,7 +11885,7 @@ s+=".";
     if (!hasError) {
     
     while (!hasError) {
-      if (jj_2_110(2147483647)) {
+      if (jj_2_111(2147483647)) {
         ;
       } else {
         goto end_label_54;
@@ -11893,7 +11908,7 @@ s2+=s1;s2+=".";
     
 return s+s2;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::package_path_name() {QCString s;if (!hasError) {
@@ -11907,11 +11922,11 @@ QCString VhdlParser::package_path_name() {QCString s;if (!hasError) {
     
 return "@"+s;
 assert(false);
-  }
+}
 
 
 void VhdlParser::conditional_signal_assignment_wave() {
-    if (jj_2_111(2147483647)) {if (!hasError) {
+    if (jj_2_112(2147483647)) {if (!hasError) {
       
       conditional_force_assignment();
       }
@@ -11935,7 +11950,7 @@ void VhdlParser::conditional_signal_assignment_wave() {
         errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
       }
     }
-  }
+}
 
 
 void VhdlParser::conditional_waveform_assignment() {if (!hasError) {
@@ -11995,7 +12010,7 @@ void VhdlParser::conditional_waveform_assignment() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::else_wave_list() {if (!hasError) {
@@ -12026,7 +12041,7 @@ void VhdlParser::else_wave_list() {if (!hasError) {
     }
     }
     
-  }
+}
 
 
 void VhdlParser::conditional_force_assignment() {if (!hasError) {
@@ -12104,11 +12119,11 @@ void VhdlParser::conditional_force_assignment() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::selected_signal_assignment_wave() {
-    if (jj_2_112(2147483647)) {if (!hasError) {
+    if (jj_2_113(2147483647)) {if (!hasError) {
       
       selected_force_assignment();
       }
@@ -12128,7 +12143,7 @@ void VhdlParser::selected_signal_assignment_wave() {
         errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
       }
     }
-  }
+}
 
 
 void VhdlParser::selected_variable_assignment() {if (!hasError) {
@@ -12171,11 +12186,11 @@ void VhdlParser::selected_variable_assignment() {if (!hasError) {
     sel_var_list();
     }
     
-  }
+}
 
 
 void VhdlParser::select_name() {
-    if (jj_2_113(2147483647)) {if (!hasError) {
+    if (jj_2_114(2147483647)) {if (!hasError) {
       
       aggregate();
       }
@@ -12198,7 +12213,7 @@ void VhdlParser::select_name() {
         errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
       }
     }
-  }
+}
 
 
 void VhdlParser::selected_waveform_assignment() {if (!hasError) {
@@ -12258,7 +12273,7 @@ void VhdlParser::selected_waveform_assignment() {if (!hasError) {
     sel_wave_list();
     }
     
-  }
+}
 
 
 void VhdlParser::selected_force_assignment() {if (!hasError) {
@@ -12321,7 +12336,7 @@ void VhdlParser::selected_force_assignment() {if (!hasError) {
     sel_var_list();
     }
     
-  }
+}
 
 
 void VhdlParser::sel_var_list() {if (!hasError) {
@@ -12365,7 +12380,7 @@ void VhdlParser::sel_var_list() {if (!hasError) {
     if (!hasError) {
     
     while (!hasError) {
-      if (jj_2_114(2147483647)) {
+      if (jj_2_115(2147483647)) {
         ;
       } else {
         goto end_label_55;
@@ -12409,7 +12424,7 @@ void VhdlParser::sel_var_list() {if (!hasError) {
     end_label_55: ;
     }
     
-  }
+}
 
 
 void VhdlParser::sel_wave_list() {if (!hasError) {
@@ -12452,7 +12467,7 @@ void VhdlParser::sel_wave_list() {if (!hasError) {
     jj_consume_token(SEMI_T);
     }
     
-  }
+}
 
 
 void VhdlParser::inout_stat() {
@@ -12476,7 +12491,7 @@ void VhdlParser::inout_stat() {
       jj_consume_token(-1);
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
-  }
+}
 
 
 void VhdlParser::else_stat() {if (!hasError) {
@@ -12522,7 +12537,7 @@ void VhdlParser::else_stat() {if (!hasError) {
     end_label_57: ;
     }
     
-  }
+}
 
 
 QCString VhdlParser::interface_subprogram_declaration() {QCString s;
@@ -12557,7 +12572,7 @@ return s;
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::iproc() {QCString s,s1;if (!hasError) {
@@ -12576,7 +12591,7 @@ QCString VhdlParser::iproc() {QCString s,s1;if (!hasError) {
 current->name=s;
   return "procedure "+s+s1;
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::ifunc() {QCString s,s1,s2,s3;Token *t=0;Token *t1=0;Token *t2=0;if (!hasError) {
@@ -12690,7 +12705,7 @@ QCString q;
                     }
          currP=0;return "";
 assert(false);
-  }
+}
 
 
 QCString VhdlParser::param() {QCString s,s1;Token *tok=0;if (!hasError) {
@@ -12743,7 +12758,7 @@ if(tok)
                     }
                       return s+"("+s1+")";
 assert(false);
-  }
+}
 
 
 void VhdlParser::parseInline() {
@@ -12773,7 +12788,7 @@ void VhdlParser::parseInline() {
       jj_consume_token(-1);
       errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true;
     }
-  }
+}
 
 
  VhdlParser::VhdlParser(TokenManager *tm){
@@ -12836,7 +12851,7 @@ Token * VhdlParser::jj_consume_token(int kind)  {
       jj_gen++;
       if (++jj_gc > 100) {
         jj_gc = 0;
-        for (int i = 0; i < 114; i++) {
+        for (int i = 0; i < 115; i++) {
           JJCalls *c = &jj_2_rtns[i];
           while (c != NULL) {
             if (c->gen < jj_gen) c->first = NULL;
@@ -12849,7 +12864,8 @@ Token * VhdlParser::jj_consume_token(int kind)  {
     token = oldToken;
     jj_kind = kind;
     JAVACC_STRING_TYPE image = kind >= 0 ? tokenImage[kind] : tokenImage[0];
-    errorHandler->handleUnexpectedToken(kind, image.substr(1, image.size() - 2), getToken(1), this), hasError = true;
+    errorHandler->handleUnexpectedToken(kind, image.substr(1, image.size() - 2), getToken(1), this);
+    hasError = true;
     return token;
   }
 
@@ -12924,7 +12940,7 @@ int VhdlParser::jj_ntk_f(){
 
   void VhdlParser::jj_rescan_token(){
     jj_rescan = true;
-    for (int i = 0; i < 114; i++) {
+    for (int i = 0; i < 115; i++) {
       JJCalls *p = &jj_2_rtns[i];
       do {
         if (p->gen > jj_gen) {
@@ -13044,6 +13060,7 @@ int VhdlParser::jj_ntk_f(){
             case 111: jj_3_112(); break;
             case 112: jj_3_113(); break;
             case 113: jj_3_114(); break;
+            case 114: jj_3_115(); break;
           }
         }
         p = p->next;
index 1c4c73d..08a9a63 100644 (file)
@@ -582,7 +582,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_1() || jj_done;
+    return (!jj_3_1() || jj_done);
  { jj_save(0, xla); }
   }
 
@@ -590,7 +590,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_2() || jj_done;
+    return (!jj_3_2() || jj_done);
  { jj_save(1, xla); }
   }
 
@@ -598,7 +598,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_3() || jj_done;
+    return (!jj_3_3() || jj_done);
  { jj_save(2, xla); }
   }
 
@@ -606,7 +606,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_4() || jj_done;
+    return (!jj_3_4() || jj_done);
  { jj_save(3, xla); }
   }
 
@@ -614,7 +614,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_5() || jj_done;
+    return (!jj_3_5() || jj_done);
  { jj_save(4, xla); }
   }
 
@@ -622,7 +622,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_6() || jj_done;
+    return (!jj_3_6() || jj_done);
  { jj_save(5, xla); }
   }
 
@@ -630,7 +630,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_7() || jj_done;
+    return (!jj_3_7() || jj_done);
  { jj_save(6, xla); }
   }
 
@@ -638,7 +638,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_8() || jj_done;
+    return (!jj_3_8() || jj_done);
  { jj_save(7, xla); }
   }
 
@@ -646,7 +646,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_9() || jj_done;
+    return (!jj_3_9() || jj_done);
  { jj_save(8, xla); }
   }
 
@@ -654,7 +654,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_10() || jj_done;
+    return (!jj_3_10() || jj_done);
  { jj_save(9, xla); }
   }
 
@@ -662,7 +662,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_11() || jj_done;
+    return (!jj_3_11() || jj_done);
  { jj_save(10, xla); }
   }
 
@@ -670,7 +670,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_12() || jj_done;
+    return (!jj_3_12() || jj_done);
  { jj_save(11, xla); }
   }
 
@@ -678,7 +678,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_13() || jj_done;
+    return (!jj_3_13() || jj_done);
  { jj_save(12, xla); }
   }
 
@@ -686,7 +686,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_14() || jj_done;
+    return (!jj_3_14() || jj_done);
  { jj_save(13, xla); }
   }
 
@@ -694,7 +694,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_15() || jj_done;
+    return (!jj_3_15() || jj_done);
  { jj_save(14, xla); }
   }
 
@@ -702,7 +702,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_16() || jj_done;
+    return (!jj_3_16() || jj_done);
  { jj_save(15, xla); }
   }
 
@@ -710,7 +710,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_17() || jj_done;
+    return (!jj_3_17() || jj_done);
  { jj_save(16, xla); }
   }
 
@@ -718,7 +718,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_18() || jj_done;
+    return (!jj_3_18() || jj_done);
  { jj_save(17, xla); }
   }
 
@@ -726,7 +726,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_19() || jj_done;
+    return (!jj_3_19() || jj_done);
  { jj_save(18, xla); }
   }
 
@@ -734,7 +734,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_20() || jj_done;
+    return (!jj_3_20() || jj_done);
  { jj_save(19, xla); }
   }
 
@@ -742,7 +742,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_21() || jj_done;
+    return (!jj_3_21() || jj_done);
  { jj_save(20, xla); }
   }
 
@@ -750,7 +750,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_22() || jj_done;
+    return (!jj_3_22() || jj_done);
  { jj_save(21, xla); }
   }
 
@@ -758,7 +758,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_23() || jj_done;
+    return (!jj_3_23() || jj_done);
  { jj_save(22, xla); }
   }
 
@@ -766,7 +766,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_24() || jj_done;
+    return (!jj_3_24() || jj_done);
  { jj_save(23, xla); }
   }
 
@@ -774,7 +774,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_25() || jj_done;
+    return (!jj_3_25() || jj_done);
  { jj_save(24, xla); }
   }
 
@@ -782,7 +782,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_26() || jj_done;
+    return (!jj_3_26() || jj_done);
  { jj_save(25, xla); }
   }
 
@@ -790,7 +790,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_27() || jj_done;
+    return (!jj_3_27() || jj_done);
  { jj_save(26, xla); }
   }
 
@@ -798,7 +798,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_28() || jj_done;
+    return (!jj_3_28() || jj_done);
  { jj_save(27, xla); }
   }
 
@@ -806,7 +806,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_29() || jj_done;
+    return (!jj_3_29() || jj_done);
  { jj_save(28, xla); }
   }
 
@@ -814,7 +814,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_30() || jj_done;
+    return (!jj_3_30() || jj_done);
  { jj_save(29, xla); }
   }
 
@@ -822,7 +822,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_31() || jj_done;
+    return (!jj_3_31() || jj_done);
  { jj_save(30, xla); }
   }
 
@@ -830,7 +830,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_32() || jj_done;
+    return (!jj_3_32() || jj_done);
  { jj_save(31, xla); }
   }
 
@@ -838,7 +838,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_33() || jj_done;
+    return (!jj_3_33() || jj_done);
  { jj_save(32, xla); }
   }
 
@@ -846,7 +846,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_34() || jj_done;
+    return (!jj_3_34() || jj_done);
  { jj_save(33, xla); }
   }
 
@@ -854,7 +854,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_35() || jj_done;
+    return (!jj_3_35() || jj_done);
  { jj_save(34, xla); }
   }
 
@@ -862,7 +862,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_36() || jj_done;
+    return (!jj_3_36() || jj_done);
  { jj_save(35, xla); }
   }
 
@@ -870,7 +870,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_37() || jj_done;
+    return (!jj_3_37() || jj_done);
  { jj_save(36, xla); }
   }
 
@@ -878,7 +878,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_38() || jj_done;
+    return (!jj_3_38() || jj_done);
  { jj_save(37, xla); }
   }
 
@@ -886,7 +886,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_39() || jj_done;
+    return (!jj_3_39() || jj_done);
  { jj_save(38, xla); }
   }
 
@@ -894,7 +894,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_40() || jj_done;
+    return (!jj_3_40() || jj_done);
  { jj_save(39, xla); }
   }
 
@@ -902,7 +902,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_41() || jj_done;
+    return (!jj_3_41() || jj_done);
  { jj_save(40, xla); }
   }
 
@@ -910,7 +910,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_42() || jj_done;
+    return (!jj_3_42() || jj_done);
  { jj_save(41, xla); }
   }
 
@@ -918,7 +918,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_43() || jj_done;
+    return (!jj_3_43() || jj_done);
  { jj_save(42, xla); }
   }
 
@@ -926,7 +926,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_44() || jj_done;
+    return (!jj_3_44() || jj_done);
  { jj_save(43, xla); }
   }
 
@@ -934,7 +934,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_45() || jj_done;
+    return (!jj_3_45() || jj_done);
  { jj_save(44, xla); }
   }
 
@@ -942,7 +942,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_46() || jj_done;
+    return (!jj_3_46() || jj_done);
  { jj_save(45, xla); }
   }
 
@@ -950,7 +950,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_47() || jj_done;
+    return (!jj_3_47() || jj_done);
  { jj_save(46, xla); }
   }
 
@@ -958,7 +958,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_48() || jj_done;
+    return (!jj_3_48() || jj_done);
  { jj_save(47, xla); }
   }
 
@@ -966,7 +966,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_49() || jj_done;
+    return (!jj_3_49() || jj_done);
  { jj_save(48, xla); }
   }
 
@@ -974,7 +974,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_50() || jj_done;
+    return (!jj_3_50() || jj_done);
  { jj_save(49, xla); }
   }
 
@@ -982,7 +982,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_51() || jj_done;
+    return (!jj_3_51() || jj_done);
  { jj_save(50, xla); }
   }
 
@@ -990,7 +990,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_52() || jj_done;
+    return (!jj_3_52() || jj_done);
  { jj_save(51, xla); }
   }
 
@@ -998,7 +998,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_53() || jj_done;
+    return (!jj_3_53() || jj_done);
  { jj_save(52, xla); }
   }
 
@@ -1006,7 +1006,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_54() || jj_done;
+    return (!jj_3_54() || jj_done);
  { jj_save(53, xla); }
   }
 
@@ -1014,7 +1014,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_55() || jj_done;
+    return (!jj_3_55() || jj_done);
  { jj_save(54, xla); }
   }
 
@@ -1022,7 +1022,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_56() || jj_done;
+    return (!jj_3_56() || jj_done);
  { jj_save(55, xla); }
   }
 
@@ -1030,7 +1030,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_57() || jj_done;
+    return (!jj_3_57() || jj_done);
  { jj_save(56, xla); }
   }
 
@@ -1038,7 +1038,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_58() || jj_done;
+    return (!jj_3_58() || jj_done);
  { jj_save(57, xla); }
   }
 
@@ -1046,7 +1046,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_59() || jj_done;
+    return (!jj_3_59() || jj_done);
  { jj_save(58, xla); }
   }
 
@@ -1054,7 +1054,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_60() || jj_done;
+    return (!jj_3_60() || jj_done);
  { jj_save(59, xla); }
   }
 
@@ -1062,7 +1062,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_61() || jj_done;
+    return (!jj_3_61() || jj_done);
  { jj_save(60, xla); }
   }
 
@@ -1070,7 +1070,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_62() || jj_done;
+    return (!jj_3_62() || jj_done);
  { jj_save(61, xla); }
   }
 
@@ -1078,7 +1078,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_63() || jj_done;
+    return (!jj_3_63() || jj_done);
  { jj_save(62, xla); }
   }
 
@@ -1086,7 +1086,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_64() || jj_done;
+    return (!jj_3_64() || jj_done);
  { jj_save(63, xla); }
   }
 
@@ -1094,7 +1094,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_65() || jj_done;
+    return (!jj_3_65() || jj_done);
  { jj_save(64, xla); }
   }
 
@@ -1102,7 +1102,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_66() || jj_done;
+    return (!jj_3_66() || jj_done);
  { jj_save(65, xla); }
   }
 
@@ -1110,7 +1110,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_67() || jj_done;
+    return (!jj_3_67() || jj_done);
  { jj_save(66, xla); }
   }
 
@@ -1118,7 +1118,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_68() || jj_done;
+    return (!jj_3_68() || jj_done);
  { jj_save(67, xla); }
   }
 
@@ -1126,7 +1126,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_69() || jj_done;
+    return (!jj_3_69() || jj_done);
  { jj_save(68, xla); }
   }
 
@@ -1134,7 +1134,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_70() || jj_done;
+    return (!jj_3_70() || jj_done);
  { jj_save(69, xla); }
   }
 
@@ -1142,7 +1142,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_71() || jj_done;
+    return (!jj_3_71() || jj_done);
  { jj_save(70, xla); }
   }
 
@@ -1150,7 +1150,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_72() || jj_done;
+    return (!jj_3_72() || jj_done);
  { jj_save(71, xla); }
   }
 
@@ -1158,7 +1158,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_73() || jj_done;
+    return (!jj_3_73() || jj_done);
  { jj_save(72, xla); }
   }
 
@@ -1166,7 +1166,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_74() || jj_done;
+    return (!jj_3_74() || jj_done);
  { jj_save(73, xla); }
   }
 
@@ -1174,7 +1174,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_75() || jj_done;
+    return (!jj_3_75() || jj_done);
  { jj_save(74, xla); }
   }
 
@@ -1182,7 +1182,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_76() || jj_done;
+    return (!jj_3_76() || jj_done);
  { jj_save(75, xla); }
   }
 
@@ -1190,7 +1190,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_77() || jj_done;
+    return (!jj_3_77() || jj_done);
  { jj_save(76, xla); }
   }
 
@@ -1198,7 +1198,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_78() || jj_done;
+    return (!jj_3_78() || jj_done);
  { jj_save(77, xla); }
   }
 
@@ -1206,7 +1206,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_79() || jj_done;
+    return (!jj_3_79() || jj_done);
  { jj_save(78, xla); }
   }
 
@@ -1214,7 +1214,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_80() || jj_done;
+    return (!jj_3_80() || jj_done);
  { jj_save(79, xla); }
   }
 
@@ -1222,7 +1222,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_81() || jj_done;
+    return (!jj_3_81() || jj_done);
  { jj_save(80, xla); }
   }
 
@@ -1230,7 +1230,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_82() || jj_done;
+    return (!jj_3_82() || jj_done);
  { jj_save(81, xla); }
   }
 
@@ -1238,7 +1238,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_83() || jj_done;
+    return (!jj_3_83() || jj_done);
  { jj_save(82, xla); }
   }
 
@@ -1246,7 +1246,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_84() || jj_done;
+    return (!jj_3_84() || jj_done);
  { jj_save(83, xla); }
   }
 
@@ -1254,7 +1254,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_85() || jj_done;
+    return (!jj_3_85() || jj_done);
  { jj_save(84, xla); }
   }
 
@@ -1262,7 +1262,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_86() || jj_done;
+    return (!jj_3_86() || jj_done);
  { jj_save(85, xla); }
   }
 
@@ -1270,7 +1270,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_87() || jj_done;
+    return (!jj_3_87() || jj_done);
  { jj_save(86, xla); }
   }
 
@@ -1278,7 +1278,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_88() || jj_done;
+    return (!jj_3_88() || jj_done);
  { jj_save(87, xla); }
   }
 
@@ -1286,7 +1286,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_89() || jj_done;
+    return (!jj_3_89() || jj_done);
  { jj_save(88, xla); }
   }
 
@@ -1294,7 +1294,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_90() || jj_done;
+    return (!jj_3_90() || jj_done);
  { jj_save(89, xla); }
   }
 
@@ -1302,7 +1302,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_91() || jj_done;
+    return (!jj_3_91() || jj_done);
  { jj_save(90, xla); }
   }
 
@@ -1310,7 +1310,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_92() || jj_done;
+    return (!jj_3_92() || jj_done);
  { jj_save(91, xla); }
   }
 
@@ -1318,7 +1318,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_93() || jj_done;
+    return (!jj_3_93() || jj_done);
  { jj_save(92, xla); }
   }
 
@@ -1326,7 +1326,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_94() || jj_done;
+    return (!jj_3_94() || jj_done);
  { jj_save(93, xla); }
   }
 
@@ -1334,7 +1334,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_95() || jj_done;
+    return (!jj_3_95() || jj_done);
  { jj_save(94, xla); }
   }
 
@@ -1342,7 +1342,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_96() || jj_done;
+    return (!jj_3_96() || jj_done);
  { jj_save(95, xla); }
   }
 
@@ -1350,7 +1350,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_97() || jj_done;
+    return (!jj_3_97() || jj_done);
  { jj_save(96, xla); }
   }
 
@@ -1358,7 +1358,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_98() || jj_done;
+    return (!jj_3_98() || jj_done);
  { jj_save(97, xla); }
   }
 
@@ -1366,7 +1366,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_99() || jj_done;
+    return (!jj_3_99() || jj_done);
  { jj_save(98, xla); }
   }
 
@@ -1374,7 +1374,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_100() || jj_done;
+    return (!jj_3_100() || jj_done);
  { jj_save(99, xla); }
   }
 
@@ -1382,7 +1382,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_101() || jj_done;
+    return (!jj_3_101() || jj_done);
  { jj_save(100, xla); }
   }
 
@@ -1390,7 +1390,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_102() || jj_done;
+    return (!jj_3_102() || jj_done);
  { jj_save(101, xla); }
   }
 
@@ -1398,7 +1398,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_103() || jj_done;
+    return (!jj_3_103() || jj_done);
  { jj_save(102, xla); }
   }
 
@@ -1406,7 +1406,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_104() || jj_done;
+    return (!jj_3_104() || jj_done);
  { jj_save(103, xla); }
   }
 
@@ -1414,7 +1414,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_105() || jj_done;
+    return (!jj_3_105() || jj_done);
  { jj_save(104, xla); }
   }
 
@@ -1422,7 +1422,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_106() || jj_done;
+    return (!jj_3_106() || jj_done);
  { jj_save(105, xla); }
   }
 
@@ -1430,7 +1430,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_107() || jj_done;
+    return (!jj_3_107() || jj_done);
  { jj_save(106, xla); }
   }
 
@@ -1438,7 +1438,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_108() || jj_done;
+    return (!jj_3_108() || jj_done);
  { jj_save(107, xla); }
   }
 
@@ -1446,7 +1446,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_109() || jj_done;
+    return (!jj_3_109() || jj_done);
  { jj_save(108, xla); }
   }
 
@@ -1454,7 +1454,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_110() || jj_done;
+    return (!jj_3_110() || jj_done);
  { jj_save(109, xla); }
   }
 
@@ -1462,7 +1462,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_111() || jj_done;
+    return (!jj_3_111() || jj_done);
  { jj_save(110, xla); }
   }
 
@@ -1470,7 +1470,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_112() || jj_done;
+    return (!jj_3_112() || jj_done);
  { jj_save(111, xla); }
   }
 
@@ -1478,7 +1478,7 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_113() || jj_done;
+    return (!jj_3_113() || jj_done);
  { jj_save(112, xla); }
   }
 
@@ -1486,10 +1486,18 @@ void parseInline();
  {
     jj_la = xla; jj_lastpos = jj_scanpos = token;
     jj_done = false;
-    return !jj_3_114() || jj_done;
+    return (!jj_3_114() || jj_done);
  { jj_save(113, xla); }
   }
 
+ inline bool jj_2_115(int xla)
+ {
+    jj_la = xla; jj_lastpos = jj_scanpos = token;
+    jj_done = false;
+    return (!jj_3_115() || jj_done);
+ { jj_save(114, xla); }
+  }
+
  inline bool jj_3R_230()
  {
     if (jj_done) return true;
@@ -1532,7 +1540,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_42()
+ inline bool jj_3_43()
  {
     if (jj_done) return true;
     if (jj_3R_93()) return true;
@@ -1597,6 +1605,15 @@ void parseInline();
     return false;
   }
 
+ inline bool jj_3R_411()
+ {
+    if (jj_done) return true;
+    if (jj_scan_token(LPAREN_T)) return true;
+    if (jj_3R_69()) return true;
+    if (jj_scan_token(RPAREN_T)) return true;
+    return false;
+  }
+
  inline bool jj_3R_195()
  {
     if (jj_done) return true;
@@ -1645,15 +1662,6 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3R_411()
- {
-    if (jj_done) return true;
-    if (jj_scan_token(LPAREN_T)) return true;
-    if (jj_3R_69()) return true;
-    if (jj_scan_token(RPAREN_T)) return true;
-    return false;
-  }
-
  inline bool jj_3R_91()
  {
     if (jj_done) return true;
@@ -1671,7 +1679,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_41()
+ inline bool jj_3_42()
  {
     if (jj_done) return true;
     if (jj_3R_92()) return true;
@@ -1693,14 +1701,14 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_40()
+ inline bool jj_3_41()
  {
     if (jj_done) return true;
     if (jj_3R_91()) return true;
     return false;
   }
 
- inline bool jj_3_39()
+ inline bool jj_3_40()
  {
     if (jj_done) return true;
     if (jj_3R_90()) return true;
@@ -1714,7 +1722,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_38()
+ inline bool jj_3_39()
  {
     if (jj_done) return true;
     if (jj_3R_89()) return true;
@@ -1726,14 +1734,14 @@ void parseInline();
     if (jj_done) return true;
     Token * xsp;
     xsp = jj_scanpos;
-    if (jj_3_38()) {
+    if (jj_3_39()) {
     jj_scanpos = xsp;
     if (jj_3R_555()) {
     jj_scanpos = xsp;
-    if (jj_3_39()) {
-    jj_scanpos = xsp;
     if (jj_3_40()) {
     jj_scanpos = xsp;
+    if (jj_3_41()) {
+    jj_scanpos = xsp;
     if (jj_3R_556()) {
     jj_scanpos = xsp;
     if (jj_3R_557()) return true;
@@ -1753,6 +1761,14 @@ void parseInline();
     return false;
   }
 
+ inline bool jj_3_38()
+ {
+    if (jj_done) return true;
+    if (jj_scan_token(BASIC_IDENTIFIER)) return true;
+    if (jj_scan_token(DOT_T)) return true;
+    return false;
+  }
+
  inline bool jj_3R_624()
  {
     if (jj_done) return true;
@@ -1815,9 +1831,11 @@ void parseInline();
  {
     if (jj_done) return true;
     if (jj_scan_token(ENTITY_T)) return true;
-    if (jj_3R_59()) return true;
     Token * xsp;
     xsp = jj_scanpos;
+    if (jj_3_38()) jj_scanpos = xsp;
+    if (jj_3R_59()) return true;
+    xsp = jj_scanpos;
     if (jj_3R_411()) jj_scanpos = xsp;
     return false;
   }
@@ -2041,7 +2059,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_114()
+ inline bool jj_3_115()
  {
     if (jj_done) return true;
     if (jj_3R_58()) return true;
@@ -2402,7 +2420,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_110()
+ inline bool jj_3_111()
  {
     if (jj_done) return true;
     if (jj_3R_142()) return true;
@@ -2438,7 +2456,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_113()
+ inline bool jj_3_114()
  {
     if (jj_done) return true;
     if (jj_3R_108()) return true;
@@ -2511,7 +2529,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_112()
+ inline bool jj_3_113()
  {
     if (jj_done) return true;
     if (jj_3R_144()) return true;
@@ -2614,7 +2632,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_111()
+ inline bool jj_3_112()
  {
     if (jj_done) return true;
     if (jj_3R_143()) return true;
@@ -2744,7 +2762,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_109()
+ inline bool jj_3_110()
  {
     if (jj_done) return true;
     if (jj_3R_141()) return true;
@@ -2831,7 +2849,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_108()
+ inline bool jj_3_109()
  {
     if (jj_done) return true;
     if (jj_scan_token(DOT_T)) return true;
@@ -3000,7 +3018,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_105()
+ inline bool jj_3_106()
  {
     if (jj_done) return true;
     if (jj_3R_138()) return true;
@@ -3102,7 +3120,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_107()
+ inline bool jj_3_108()
  {
     if (jj_done) return true;
     if (jj_3R_140()) return true;
@@ -3225,7 +3243,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_106()
+ inline bool jj_3_107()
  {
     if (jj_done) return true;
     if (jj_3R_139()) return true;
@@ -3297,7 +3315,7 @@ void parseInline();
     if (jj_scan_token(WHEN_T)) return true;
     Token * xsp;
     xsp = jj_scanpos;
-    if (jj_3_106()) jj_scanpos = xsp;
+    if (jj_3_107()) jj_scanpos = xsp;
     if (jj_3R_85()) return true;
     if (jj_scan_token(ARROW_T)) return true;
     if (jj_3R_661()) return true;
@@ -3692,7 +3710,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_103()
+ inline bool jj_3_104()
  {
     if (jj_done) return true;
     if (jj_3R_64()) return true;
@@ -3766,7 +3784,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_104()
+ inline bool jj_3_105()
  {
     if (jj_done) return true;
     if (jj_3R_65()) return true;
@@ -4004,7 +4022,7 @@ void parseInline();
     jj_scanpos = xsp;
     if (jj_3R_715()) {
     jj_scanpos = xsp;
-    if (jj_3_104()) {
+    if (jj_3_105()) {
     jj_scanpos = xsp;
     if (jj_3R_716()) return true;
     }
@@ -4407,7 +4425,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_102()
+ inline bool jj_3_103()
  {
     if (jj_done) return true;
     if (jj_3R_69()) return true;
@@ -4439,7 +4457,7 @@ void parseInline();
     if (jj_done) return true;
     Token * xsp;
     xsp = jj_scanpos;
-    if (jj_3_102()) jj_scanpos = xsp;
+    if (jj_3_103()) jj_scanpos = xsp;
     if (jj_3R_114()) return true;
     if (jj_scan_token(VARASSIGN_T)) return true;
     if (jj_3R_58()) return true;
@@ -4542,7 +4560,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_101()
+ inline bool jj_3_102()
  {
     if (jj_done) return true;
     if (jj_3R_137()) return true;
@@ -4607,7 +4625,7 @@ void parseInline();
     jj_scanpos = xsp;
     if (jj_3R_635()) {
     jj_scanpos = xsp;
-    if (jj_3_101()) {
+    if (jj_3_102()) {
     jj_scanpos = xsp;
     if (jj_3R_636()) return true;
     }
@@ -4625,7 +4643,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_97()
+ inline bool jj_3_98()
  {
     if (jj_done) return true;
     if (jj_3R_133()) return true;
@@ -4658,7 +4676,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_100()
+ inline bool jj_3_101()
  {
     if (jj_done) return true;
     if (jj_3R_136()) return true;
@@ -4670,7 +4688,7 @@ void parseInline();
     if (jj_done) return true;
     Token * xsp;
     xsp = jj_scanpos;
-    if (jj_3_100()) {
+    if (jj_3_101()) {
     jj_scanpos = xsp;
     if (jj_3R_457()) return true;
     }
@@ -4687,7 +4705,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_99()
+ inline bool jj_3_100()
  {
     if (jj_done) return true;
     if (jj_3R_134()) return true;
@@ -4717,7 +4735,7 @@ void parseInline();
     Token * xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3_99()) { jj_scanpos = xsp; break; }
+      if (jj_3_100()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
@@ -4741,7 +4759,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_98()
+ inline bool jj_3_99()
  {
     if (jj_done) return true;
     if (jj_3R_59()) return true;
@@ -4772,7 +4790,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_96()
+ inline bool jj_3_97()
  {
     if (jj_done) return true;
     if (jj_3R_59()) return true;
@@ -4956,7 +4974,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_95()
+ inline bool jj_3_96()
  {
     if (jj_done) return true;
     if (jj_3R_132()) return true;
@@ -4970,7 +4988,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_94()
+ inline bool jj_3_95()
  {
     if (jj_done) return true;
     if (jj_3R_131()) return true;
@@ -5139,9 +5157,9 @@ void parseInline();
     xsp = jj_scanpos;
     if (jj_3R_521()) jj_scanpos = xsp;
     xsp = jj_scanpos;
-    if (jj_3_94()) jj_scanpos = xsp;
-    xsp = jj_scanpos;
     if (jj_3_95()) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3_96()) jj_scanpos = xsp;
     if (jj_3R_423()) return true;
     return false;
   }
@@ -5237,7 +5255,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_92()
+ inline bool jj_3_93()
  {
     if (jj_done) return true;
     if (jj_3R_64()) return true;
@@ -5297,7 +5315,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_93()
+ inline bool jj_3_94()
  {
     if (jj_done) return true;
     if (jj_3R_65()) return true;
@@ -5482,7 +5500,7 @@ void parseInline();
     jj_scanpos = xsp;
     if (jj_3R_673()) {
     jj_scanpos = xsp;
-    if (jj_3_93()) {
+    if (jj_3_94()) {
     jj_scanpos = xsp;
     if (jj_3R_674()) return true;
     }
@@ -5531,7 +5549,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_91()
+ inline bool jj_3_92()
  {
     if (jj_done) return true;
     if (jj_3R_130()) return true;
@@ -5591,7 +5609,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_90()
+ inline bool jj_3_91()
  {
     if (jj_done) return true;
     if (jj_3R_128()) return true;
@@ -6061,7 +6079,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_89()
+ inline bool jj_3_90()
  {
     if (jj_done) return true;
     if (jj_3R_127()) return true;
@@ -6076,7 +6094,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_88()
+ inline bool jj_3_89()
  {
     if (jj_done) return true;
     if (jj_3R_126()) return true;
@@ -6099,7 +6117,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_87()
+ inline bool jj_3_88()
  {
     if (jj_done) return true;
     if (jj_3R_69()) return true;
@@ -6112,7 +6130,7 @@ void parseInline();
     if (jj_done) return true;
     Token * xsp;
     xsp = jj_scanpos;
-    if (jj_3_87()) jj_scanpos = xsp;
+    if (jj_3_88()) jj_scanpos = xsp;
     if (jj_3R_114()) return true;
     if (jj_scan_token(LESSTHAN_T)) return true;
     xsp = jj_scanpos;
@@ -6406,7 +6424,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_86()
+ inline bool jj_3_87()
  {
     if (jj_done) return true;
     if (jj_3R_125()) return true;
@@ -6441,7 +6459,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_85()
+ inline bool jj_3_86()
  {
     if (jj_done) return true;
     if (jj_3R_124()) return true;
@@ -6469,7 +6487,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_84()
+ inline bool jj_3_85()
  {
     if (jj_done) return true;
     if (jj_3R_123()) return true;
@@ -6512,7 +6530,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_79()
+ inline bool jj_3_80()
  {
     if (jj_done) return true;
     Token * xsp;
@@ -6523,7 +6541,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_83()
+ inline bool jj_3_84()
  {
     if (jj_done) return true;
     if (jj_3R_122()) return true;
@@ -6591,14 +6609,14 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_82()
+ inline bool jj_3_83()
  {
     if (jj_done) return true;
     if (jj_3R_121()) return true;
     return false;
   }
 
- inline bool jj_3_81()
+ inline bool jj_3_82()
  {
     if (jj_done) return true;
     if (jj_3R_120()) return true;
@@ -6625,7 +6643,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_80()
+ inline bool jj_3_81()
  {
     if (jj_done) return true;
     if (jj_3R_119()) return true;
@@ -6647,7 +6665,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_75()
+ inline bool jj_3_76()
  {
     if (jj_done) return true;
     Token * xsp;
@@ -6658,14 +6676,14 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_78()
+ inline bool jj_3_79()
  {
     if (jj_done) return true;
     if (jj_3R_117()) return true;
     return false;
   }
 
- inline bool jj_3_77()
+ inline bool jj_3_78()
  {
     if (jj_done) return true;
     if (jj_3R_116()) return true;
@@ -6688,7 +6706,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_76()
+ inline bool jj_3_77()
  {
     if (jj_done) return true;
     if (jj_3R_115()) return true;
@@ -6719,15 +6737,13 @@ void parseInline();
     xsp = jj_scanpos;
     if (jj_3R_242()) {
     jj_scanpos = xsp;
-    if (jj_3_76()) {
-    jj_scanpos = xsp;
     if (jj_3_77()) {
     jj_scanpos = xsp;
     if (jj_3_78()) {
     jj_scanpos = xsp;
-    if (jj_3R_243()) {
+    if (jj_3_79()) {
     jj_scanpos = xsp;
-    if (jj_3_80()) {
+    if (jj_3R_243()) {
     jj_scanpos = xsp;
     if (jj_3_81()) {
     jj_scanpos = xsp;
@@ -6741,6 +6757,8 @@ void parseInline();
     jj_scanpos = xsp;
     if (jj_3_86()) {
     jj_scanpos = xsp;
+    if (jj_3_87()) {
+    jj_scanpos = xsp;
     if (jj_3R_244()) return true;
     }
     }
@@ -6800,7 +6818,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_74()
+ inline bool jj_3_75()
  {
     if (jj_done) return true;
     if (jj_3R_112()) return true;
@@ -6813,7 +6831,7 @@ void parseInline();
     Token * xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3_74()) { jj_scanpos = xsp; break; }
+      if (jj_3_75()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
@@ -6845,7 +6863,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_73()
+ inline bool jj_3_74()
  {
     if (jj_done) return true;
     if (jj_3R_111()) return true;
@@ -7290,7 +7308,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_71()
+ inline bool jj_3_72()
  {
     if (jj_done) return true;
     if (jj_3R_68()) return true;
@@ -7299,7 +7317,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_72()
+ inline bool jj_3_73()
  {
     if (jj_done) return true;
     if (jj_3R_110()) return true;
@@ -7314,7 +7332,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_70()
+ inline bool jj_3_71()
  {
     if (jj_done) return true;
     if (jj_3R_108()) return true;
@@ -7690,7 +7708,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_69()
+ inline bool jj_3_70()
  {
     if (jj_done) return true;
     if (jj_3R_65()) return true;
@@ -7725,7 +7743,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_68()
+ inline bool jj_3_69()
  {
     if (jj_done) return true;
     if (jj_3R_64()) return true;
@@ -7807,13 +7825,13 @@ void parseInline();
     jj_scanpos = xsp;
     if (jj_3R_515()) {
     jj_scanpos = xsp;
-    if (jj_3_68()) {
+    if (jj_3_69()) {
     jj_scanpos = xsp;
     if (jj_3R_516()) {
     jj_scanpos = xsp;
     if (jj_3R_517()) {
     jj_scanpos = xsp;
-    if (jj_3_69()) {
+    if (jj_3_70()) {
     jj_scanpos = xsp;
     if (jj_3R_518()) return true;
     }
@@ -7876,7 +7894,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_67()
+ inline bool jj_3_68()
  {
     if (jj_done) return true;
     if (jj_3R_69()) return true;
@@ -7889,7 +7907,7 @@ void parseInline();
     if (jj_done) return true;
     Token * xsp;
     xsp = jj_scanpos;
-    if (jj_3_67()) jj_scanpos = xsp;
+    if (jj_3_68()) jj_scanpos = xsp;
     if (jj_3R_176()) return true;
     if (jj_scan_token(SEMI_T)) return true;
     return false;
@@ -7941,7 +7959,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_65()
+ inline bool jj_3_66()
  {
     if (jj_done) return true;
     if (jj_3R_86()) return true;
@@ -7955,7 +7973,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_66()
+ inline bool jj_3_67()
  {
     if (jj_done) return true;
     if (jj_3R_107()) return true;
@@ -7994,7 +8012,7 @@ void parseInline();
     jj_scanpos = xsp;
     if (jj_3R_203()) {
     jj_scanpos = xsp;
-    if (jj_3_66()) {
+    if (jj_3_67()) {
     jj_scanpos = xsp;
     if (jj_3R_204()) return true;
     }
@@ -8004,14 +8022,14 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_64()
+ inline bool jj_3_65()
  {
     if (jj_done) return true;
     if (jj_3R_59()) return true;
     return false;
   }
 
- inline bool jj_3_63()
+ inline bool jj_3_64()
  {
     if (jj_done) return true;
     if (jj_3R_106()) return true;
@@ -8025,7 +8043,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_62()
+ inline bool jj_3_63()
  {
     if (jj_done) return true;
     if (jj_3R_105()) return true;
@@ -8039,7 +8057,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_61()
+ inline bool jj_3_62()
  {
     if (jj_done) return true;
     if (jj_3R_61()) return true;
@@ -8053,7 +8071,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_60()
+ inline bool jj_3_61()
  {
     if (jj_done) return true;
     if (jj_scan_token(LPAREN_T)) return true;
@@ -8069,7 +8087,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_59()
+ inline bool jj_3_60()
  {
     if (jj_done) return true;
     if (jj_3R_104()) return true;
@@ -8197,7 +8215,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_58()
+ inline bool jj_3_59()
  {
     if (jj_done) return true;
     if (jj_3R_103()) return true;
@@ -8230,21 +8248,21 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_57()
+ inline bool jj_3_58()
  {
     if (jj_done) return true;
     if (jj_3R_86()) return true;
     return false;
   }
 
- inline bool jj_3_55()
+ inline bool jj_3_56()
  {
     if (jj_done) return true;
     if (jj_3R_64()) return true;
     return false;
   }
 
- inline bool jj_3_56()
+ inline bool jj_3_57()
  {
     if (jj_done) return true;
     if (jj_3R_65()) return true;
@@ -8259,7 +8277,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_54()
+ inline bool jj_3_55()
  {
     if (jj_done) return true;
     if (jj_3R_65()) return true;
@@ -8320,7 +8338,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_53()
+ inline bool jj_3_54()
  {
     if (jj_done) return true;
     if (jj_3R_102()) return true;
@@ -8441,7 +8459,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_52()
+ inline bool jj_3_53()
  {
     if (jj_done) return true;
     if (jj_scan_token(LBRACKET_T)) return true;
@@ -8487,7 +8505,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_51()
+ inline bool jj_3_52()
  {
     if (jj_done) return true;
     if (jj_scan_token(LPAREN_T)) return true;
@@ -8514,14 +8532,14 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_47()
+ inline bool jj_3_48()
  {
     if (jj_done) return true;
     if (jj_3R_98()) return true;
     return false;
   }
 
- inline bool jj_3_50()
+ inline bool jj_3_51()
  {
     if (jj_done) return true;
     if (jj_scan_token(LPAREN_T)) return true;
@@ -8530,7 +8548,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_49()
+ inline bool jj_3_50()
  {
     if (jj_done) return true;
     if (jj_3R_100()) return true;
@@ -8551,7 +8569,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_48()
+ inline bool jj_3_49()
  {
     if (jj_done) return true;
     if (jj_scan_token(DOT_T)) return true;
@@ -8615,7 +8633,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_46()
+ inline bool jj_3_47()
  {
     if (jj_done) return true;
     if (jj_3R_97()) return true;
@@ -8814,14 +8832,14 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_45()
+ inline bool jj_3_46()
  {
     if (jj_done) return true;
     if (jj_3R_96()) return true;
     return false;
   }
 
- inline bool jj_3_44()
+ inline bool jj_3_45()
  {
     if (jj_done) return true;
     if (jj_3R_95()) return true;
@@ -8835,7 +8853,7 @@ void parseInline();
     return false;
   }
 
- inline bool jj_3_43()
+ inline bool jj_3_44()
  {
     if (jj_done) return true;
     if (jj_3R_94()) return true;
@@ -8859,7 +8877,7 @@ public:
   Token        *jj_nt;
 private: 
   int           jj_ntk;
-  JJCalls       jj_2_rtns[115];
+  JJCalls       jj_2_rtns[116];
   bool          jj_rescan;
   int           jj_gc;
   Token        *jj_scanpos, *jj_lastpos;
index 7b56cef..2886d29 100644 (file)
@@ -1367,10 +1367,10 @@ QCString index_subtype_definition() :  {QCString s;}
  s=type_mark() <RANGE_T> <BOX_T> { return s+" range <> ";}
 }
 
-QCString instantiation_unit() :  {QCString s,s1,s2;Token *tok=0;}
+QCString instantiation_unit() :  {QCString s,s1,s2;}
 {
-[ tok=<COMPONENT_T> ] s=identifier() {s1="component"; return s; }
-| tok=<ENTITY_T> s2=name() {s=tok->image.c_str()+s2;} [ <LPAREN_T> s1=identifier() <RPAREN_T> {s+="(";s+=s1;s+=")" ;}] { return s;}
+[ <COMPONENT_T> ] s=identifier() {s1="component "; return s; }
+| <ENTITY_T>  [LOOKAHEAD(2)<BASIC_IDENTIFIER> <DOT_T>] s2=name() {s="entity "+s2;} [ <LPAREN_T> s1=identifier() <RPAREN_T> {s+="(";s+=s1;s+=")" ;}] { return s;}
 | <CONFIGURATION_T> s=name() {s1="configuration ";return s;}
 }
 
diff --git a/vhdlparser/vhdlparser.pro.in b/vhdlparser/vhdlparser.pro.in
deleted file mode 100644 (file)
index 0232fd5..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-TEMPLATE       = lib
-CONFIG         = warn_on staticlib $extraopts
-HEADERS                = CharStream.h \
-                 ErrorHandler.h \
-                  JavaCC.h \
-                  ParseException.h \
-                 TokenManager.h \
-                 Token.h \
-                 vhdlstring.h \
-                 VhdlParser.h \
-                 VhdlParserConstants.h \
-                 VhdlParserTokenManager.h \
-                 TokenMgrError.h \
-                 VhdlParserIF.h \
-                  VhdlParserErrorHandler.hpp
-
-SOURCES                = CharStream.cc \
-                 ParseException.cc \
-                 Token.cc \
-                 TokenMgrError.cc \
-                 VhdlParser.cc \
-                 VhdlParserTokenManager.cc \
-                  VhdlParserIF.cpp
-
-INCLUDEPATH = . ../src ../qtools generated_src/doxygen
-#TMAKE_CXXFLAGS += -DQT_NO_CODECS -DQ T_LITE_UNICODE
-
-#must enable -fexceptions because we have try catch blocks in VhdlParser.cc
-TMAKE_CXXFLAGS +=-w -fexceptions -DQT_LITE_UNICODE
-win32:TMAKE_CXXFLAGS += -fexceptions -DQT_NODLL
-win32-g++:TMAKE_CXXFLAGS += -fexceptions -D__CYGWIN__ -DALL_STATIC
-OBJECTS_DIR = ../objects/vhdlparser
-DESTDIR = ../lib