From f781e6dbbaa51edbdbe9b5906be9962968d0ee68 Mon Sep 17 00:00:00 2001
From: Dimitri van Heesch <dimitri@stack.nl>
Date: Mon, 6 Jan 2003 20:54:16 +0000
Subject: Release-1.3-rc2-20030106

---
 Doxyfile                              |   4 +-
 INSTALL                               |   4 +-
 README                                |   4 +-
 VERSION                               |   2 +-
 addon/doxmlparser/include/doxmlintf.h |  20 +-
 addon/doxmlparser/src/doxmlintf.h     |  20 +-
 doc/commands.doc                      |  11 +
 doc/config.doc                        |  14 +-
 doc/doxytag_usage.doc                 |   2 +-
 doc/external.doc                      |   9 +
 doc/faq.doc                           |  36 ++
 doc/infoflow.eps                      | 665 ++++++++++++++++++++++++++++++++++
 doc/infoflow.fig                      | 250 +++++++++++++
 doc/infoflow.gif                      | Bin 0 -> 13193 bytes
 doc/language.doc                      |   2 +-
 doc/starting.doc                      |   6 +
 packages/rpm/doxygen.spec             |   2 +-
 src/classdef.cpp                      |  14 +-
 src/classdef.h                        |   6 -
 src/config.h                          |   5 +
 src/docparser.cpp                     |  53 +--
 src/doctokenizer.l                    |  10 +-
 src/dot.cpp                           |  53 +--
 src/doxygen.cpp                       |  73 +++-
 src/doxygen.h                         |  64 ++--
 src/entry.h                           |   2 +-
 src/filedef.cpp                       |   2 +
 src/filename.cpp                      |   1 +
 src/index.cpp                         |   2 +-
 src/instdox.cpp                       |   2 +-
 src/membername.cpp                    |   1 +
 src/page.h                            |   2 +-
 src/pngenc.cpp                        |   1 +
 src/pre.h                             |   1 +
 src/pre.l                             |   2 +-
 src/scanner.l                         |   7 +
 src/sortdict.h                        |   4 +-
 src/tagreader.cpp                     |  13 +-
 src/treeview.h                        | 165 ++++++---
 src/treeview.js                       | 165 ++++++---
 src/util.cpp                          |   3 +
 41 files changed, 1476 insertions(+), 226 deletions(-)
 create mode 100644 doc/infoflow.eps
 create mode 100644 doc/infoflow.fig
 create mode 100644 doc/infoflow.gif

diff --git a/Doxyfile b/Doxyfile
index 2ccb03d..5026e9f 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -65,13 +65,13 @@ EXCLUDE                = src/code.cpp \
                          src/pre.cpp \
                          src/scanner.cpp \
                          src/tag.cpp \
-                         src/doc.cpp \
+			 src/doctokenizer.cpp \
                          src/logos.cpp \
                          src/doxysearch.cpp \
                          src/suffixtree.cpp \
                          src/suffixtree.h \
                          src/searchindex.cpp \
-                         src/searchindex.h
+                         src/searchindex.h \
 EXCLUDE_PATTERNS       = 
 EXAMPLE_PATH           = 
 EXAMPLE_PATTERNS       = 
diff --git a/INSTALL b/INSTALL
index 5cc30f1..db62ec0 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
-DOXYGEN Version 1.3-rc2-20021224
+DOXYGEN Version 1.3-rc2-20030106
 
 Please read the installation section of the manual 
 (http://www.doxygen.org/install.html) for instructions.
 
 --------
-Dimitri van Heesch (24 December 2002)
+Dimitri van Heesch (06 January 2003)
diff --git a/README b/README
index a41922f..a88f864 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.3_rc2_20021224
+DOXYGEN Version 1.3_rc2_20030106
 
 Please read INSTALL for compilation instructions.
 
@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
 
 Enjoy,
 
-Dimitri van Heesch (dimitri@stack.nl) (24 December 2002)
+Dimitri van Heesch (dimitri@stack.nl) (06 January 2003)
diff --git a/VERSION b/VERSION
index f634979..ee4f2b1 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.3-rc2-20021224
+1.3-rc2-20030106
diff --git a/addon/doxmlparser/include/doxmlintf.h b/addon/doxmlparser/include/doxmlintf.h
index a136d61..0e66f80 100644
--- a/addon/doxmlparser/include/doxmlintf.h
+++ b/addon/doxmlparser/include/doxmlintf.h
@@ -865,15 +865,17 @@ class IClass : public ICompound
     virtual IRelatedCompoundIterator *baseCompounds() const = 0;
     virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
     virtual ICompoundIterator *nestedCompounds() const = 0;
-	virtual IParamIterator *templateParameters() const = 0;
-	virtual const IString *locationFile() const = 0;
-	virtual int locationLine() const = 0;
-	virtual int locationBodyStartLine() const = 0;
-	virtual int locationBodyEndLine() const = 0;
+    virtual IParamIterator *templateParameters() const = 0;
+    virtual const IString *locationFile() const = 0;
+    virtual int locationLine() const = 0;
+    virtual int locationBodyStartLine() const = 0;
+    virtual int locationBodyEndLine() const = 0;
 
     // TODO:
     // class:
     //  listOfAllMembers()
+    //  protection()
+    //  isAbstract()
 };
 
 /*! \brief The interface to a struct in the object model. 
@@ -884,10 +886,10 @@ class IStruct : public ICompound
     virtual ICompoundIterator *nestedCompounds() const = 0;
     virtual IRelatedCompoundIterator *baseCompounds() const = 0;
     virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
-	virtual const IString *locationFile() const = 0;
-	virtual int locationLine() const = 0;
-	virtual int locationBodyStartLine() const = 0;
-	virtual int locationBodyEndLine() const = 0;
+    virtual const IString *locationFile() const = 0;
+    virtual int locationLine() const = 0;
+    virtual int locationBodyStartLine() const = 0;
+    virtual int locationBodyEndLine() const = 0;
 };
 
 /*! \brief The interface to a union in the object model. 
diff --git a/addon/doxmlparser/src/doxmlintf.h b/addon/doxmlparser/src/doxmlintf.h
index a136d61..0e66f80 100644
--- a/addon/doxmlparser/src/doxmlintf.h
+++ b/addon/doxmlparser/src/doxmlintf.h
@@ -865,15 +865,17 @@ class IClass : public ICompound
     virtual IRelatedCompoundIterator *baseCompounds() const = 0;
     virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
     virtual ICompoundIterator *nestedCompounds() const = 0;
-	virtual IParamIterator *templateParameters() const = 0;
-	virtual const IString *locationFile() const = 0;
-	virtual int locationLine() const = 0;
-	virtual int locationBodyStartLine() const = 0;
-	virtual int locationBodyEndLine() const = 0;
+    virtual IParamIterator *templateParameters() const = 0;
+    virtual const IString *locationFile() const = 0;
+    virtual int locationLine() const = 0;
+    virtual int locationBodyStartLine() const = 0;
+    virtual int locationBodyEndLine() const = 0;
 
     // TODO:
     // class:
     //  listOfAllMembers()
+    //  protection()
+    //  isAbstract()
 };
 
 /*! \brief The interface to a struct in the object model. 
@@ -884,10 +886,10 @@ class IStruct : public ICompound
     virtual ICompoundIterator *nestedCompounds() const = 0;
     virtual IRelatedCompoundIterator *baseCompounds() const = 0;
     virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
-	virtual const IString *locationFile() const = 0;
-	virtual int locationLine() const = 0;
-	virtual int locationBodyStartLine() const = 0;
-	virtual int locationBodyEndLine() const = 0;
+    virtual const IString *locationFile() const = 0;
+    virtual int locationLine() const = 0;
+    virtual int locationBodyStartLine() const = 0;
+    virtual int locationBodyEndLine() const = 0;
 };
 
 /*! \brief The interface to a union in the object model. 
diff --git a/doc/commands.doc b/doc/commands.doc
index 7e96292..2477479 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -1796,4 +1796,15 @@ browser generator. Do \e not use these commands in your own documentation.
 <li>\\postheader
 </ul>
 
+For PHP files there are a number of additional commands, that can be
+used inside classes to make members public, private, or protected even
+though the language itself doesn't support this notion.
+
+To mark a single item use one of \\private, \\protected, \\public.
+For starting a section with a certain protection level use one of:
+\\privatesection, \\protectedsection, \\publicsection.
+The latter commands are similar to 
+"private:", "protected:", and "public:" in C++.
+
 */
+
diff --git a/doc/config.doc b/doc/config.doc
index 6419e6e..653360a 100644
--- a/doc/config.doc
+++ b/doc/config.doc
@@ -363,13 +363,6 @@ function's detailed documentation block.
  to \c NO (the default) then the documentation will be excluded.
  Set it to \c YES to include the internal documentation.
 
-\anchor cfg_strip_code_comments
-<dt>\c STRIP_CODE_COMMENTS <dd>
- \addindex STRIP_CODE_COMMENTS
- Setting the \c STRIP_CODE_COMMENTS tag to \c YES (the default) will instruct
- doxygen to hide any special comment blocks from generated source code
- fragments. Normal C and C++ comments will always remain visible.
-
 \anchor cfg_case_sense_names
 <dt>\c CASE_SENSE_NAMES <dd>
  \addindex CASE_SENSE_NAMES
@@ -730,6 +723,13 @@ function's detailed documentation block.
  Setting the \c INLINE_SOURCES tag to \c YES will include the body
  of functions, classes and enums directly into the documentation.
 
+\anchor cfg_strip_code_comments
+<dt>\c STRIP_CODE_COMMENTS <dd>
+ \addindex STRIP_CODE_COMMENTS
+ Setting the \c STRIP_CODE_COMMENTS tag to \c YES (the default) will instruct
+ doxygen to hide any special comment blocks from generated source code
+ fragments. Normal C and C++ comments will always remain visible.
+
 \anchor cfg_referenced_by_relation
 <dt>\c REFERENCED_BY_RELATION <dd>
  \addindex REFERENCED_BY_RELATION
diff --git a/doc/doxytag_usage.doc b/doc/doxytag_usage.doc
index 187c285..76ae8b7 100644
--- a/doc/doxytag_usage.doc
+++ b/doc/doxytag_usage.doc
@@ -103,7 +103,7 @@ doxytag -t example.tag example/html
 \par Example 2:
   To generate a tag file of the Qt documentation you can do the following:
 \verbatim
-doxytag -t qt.tag $QTDIR/html
+doxytag -t qt.tag $QTDIR/doc/html
 \endverbatim
 
 A typical example to use doxytag to generate a search index is:
diff --git a/doc/external.doc b/doc/external.doc
index e7d3bf0..994bd7f 100644
--- a/doc/external.doc
+++ b/doc/external.doc
@@ -35,6 +35,15 @@ reasons to not include all sources for these with every run of doxygen:
     linked in externally. This saves a lot of memory.
 <dt>Availability:<dd> For some projects that are documented with doxygen,
     the sources may just not be available.
+<dt>Copyright issues:<dd>If the external
+    package and its documentation are copyright someone else, it may be
+    better - or even necessary - to reference it rather than include a
+    copy of it with your project's documentation.  When the author forbids
+    redistribution, this is necessary.  If the author requires compliance
+    with some license condition as a precondition of redistribution, and
+    you do now want to be bound by those conditions, referring to their
+    copy of their documentation is preferable to including a copy.
+
 </dl>
 
 If any of the above apply, you can use doxygen's tag file mechanism.
diff --git a/doc/faq.doc b/doc/faq.doc
index 576daaf..836da50 100644
--- a/doc/faq.doc
+++ b/doc/faq.doc
@@ -222,6 +222,42 @@ should send me a code fragment that triggers the message. The workaround
 the problem put some line-breaks into your file, split it up into smaller 
 parts, or exclude it from the input using EXCLUDE.
 
+<li><b>Why are dependencies via STL classes not shown in the dot graphs?</b>
+
+Doxygen is unware of the STL classes, so it does not know that class A relates
+to class B in the following example
+
+\code
+#include <vector>
+
+using namespace std;
+
+class B {};
+
+class A 
+{
+  public:
+    vector<B> m_bvec;
+};
+\endcode
+
+To overcome this problem you could provide the definition of the vector 
+class to doxygen (by including the file that defines it at the INPUT tag 
+in the config file). Since STL header files are often messy, a 
+(possibly) better approach is to include a dummy definition of a vector 
+class to the input. Here is an example of a dummy STL file for the vector 
+class:
+
+\code
+namespace std {
+  /*! STL vector class */
+  template<class T> class vector { public: T element; };
+}
+\endcode
+
+I'm still looking for someone who can provide me with definitions
+for all (relevant) STL classes.
+
 <li><b>How did doxygen get its name?</b>
 
 Doxygen got its name from playing with the words 
diff --git a/doc/infoflow.eps b/doc/infoflow.eps
new file mode 100644
index 0000000..68735e9
--- /dev/null
+++ b/doc/infoflow.eps
@@ -0,0 +1,665 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: infoflow.eps
+%%Creator: fig2dev Version 3.2 Patchlevel 3c
+%%CreationDate: Tue Dec 31 19:32:56 2002
+%%For: dimitri@pandora.home.nl (Dimitri van Heesch)
+%%BoundingBox: 0 0 673 585
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.878 0.878 0.878 srgb} bind def
+/col33 {0.000 0.000 0.000 srgb} bind def
+
+end
+save
+newpath 0 585 moveto 0 0 lineto 673 0 lineto 673 585 lineto closepath clip newpath
+-39.0 602.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/reencdict 12 dict def /ReEncode { reencdict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq
+{ exch dup length array copy newfont 3 1 roll put }
+{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
+newfont /FontName newfontname put newcodesandnames aload pop
+128 1 255 { newfont /Encoding get exch /.notdef put } for
+newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/isovec [
+8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
+8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
+8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
+8#220 /dotlessi 8#230 /oe 8#231 /OE
+8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
+8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
+8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
+8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
+8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
+8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
+8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
+8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
+8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
+8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
+8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
+8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
+8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
+8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
+8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
+8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
+8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
+8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
+8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
+8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
+8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
+8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
+/Times-Roman /Times-Roman-iso isovec ReEncode
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+%%Page: 1 1
+10 setmiterlimit
+ 0.06000 0.06000 sc
+%
+% Fig objects follow
+%
+% Polyline
+7.500 slw
+n 3600 1950 m 3900 1650 l 4800 1650 l 4800 3150 l 3600 3150 l 3600 1950 l
+ 3900 1950 l
+ 3900 1650 l gs col0 s gr 
+/Times-Roman-iso ff 180.00 scf sf
+3900 2250 m
+gs 1 -1 sc (Config file) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+3900 2550 m
+gs 1 -1 sc (Doxyfile) col0 sh gr
+% Polyline
+n 900 7500 m 1200 7200 l 2100 7200 l 2100 8700 l 900 8700 l 900 7500 l
+ 1200 7500 l
+ 1200 7200 l gs col0 s gr 
+/Times-Roman-iso ff 180.00 scf sf
+1200 7950 m
+gs 1 -1 sc (search) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+1200 8175 m
+gs 1 -1 sc (index) col0 sh gr
+% Polyline
+n 900 3675 m 1200 3375 l 2100 3375 l 2100 4875 l 900 4875 l 900 3675 l
+ 1200 3675 l
+ 1200 3375 l gs col0 s gr 
+% Polyline
+n 975 3600 m 975 3300 l 2175 3300 l 2175 4800 l
+ 2100 4800 l gs col0 s gr 
+% Polyline
+n 1050 3300 m 1050 3225 l 2250 3225 l 2250 4725 l
+ 2175 4725 l gs col0 s gr 
+% Polyline
+n 1125 3225 m 1125 3150 l 2325 3150 l 2325 4650 l
+ 2250 4650 l gs col0 s gr 
+% Polyline
+n 900 5700 m 1200 5400 l 2100 5400 l 2100 6900 l 900 6900 l 900 5700 l
+ 1200 5700 l
+ 1200 5400 l gs col0 s gr 
+% Polyline
+n 975 5625 m 975 5325 l 2175 5325 l 2175 6825 l
+ 2100 6825 l gs col0 s gr 
+% Polyline
+n 1050 5325 m 1050 5250 l 2250 5250 l 2250 6750 l
+ 2175 6750 l gs col0 s gr 
+% Polyline
+n 1125 5250 m 1125 5175 l 2325 5175 l 2325 6675 l
+ 2250 6675 l gs col0 s gr 
+/Times-Roman-iso ff 180.00 scf sf
+1275 6075 m
+gs 1 -1 sc (- headers) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+1275 6675 m
+gs 1 -1 sc (- images) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+1275 6375 m
+gs 1 -1 sc (- footers) col0 sh gr
+% Polyline
+n 6675 8775 m 6975 8475 l 7875 8475 l 7875 9975 l 6675 9975 l 6675 8775 l
+ 6975 8775 l
+ 6975 8475 l gs col0 s gr 
+% Polyline
+n 6750 8700 m 6750 8400 l 7950 8400 l 7950 9900 l
+ 7875 9900 l gs col0 s gr 
+% Polyline
+n 6825 8400 m 6825 8325 l 8025 8325 l 8025 9825 l
+ 7950 9825 l gs col0 s gr 
+% Polyline
+n 6900 8325 m 6900 8250 l 8100 8250 l 8100 9750 l
+ 8025 9750 l gs col0 s gr 
+% Polyline
+n 6600 4950 m 6900 4650 l 7800 4650 l 7800 6150 l 6600 6150 l 6600 4950 l
+ 6900 4950 l
+ 6900 4650 l gs col0 s gr 
+% Polyline
+n 6675 4875 m 6675 4575 l 7875 4575 l 7875 6075 l
+ 7800 6075 l gs col0 s gr 
+% Polyline
+n 6750 4575 m 6750 4500 l 7950 4500 l 7950 6000 l
+ 7875 6000 l gs col0 s gr 
+% Polyline
+n 6825 4500 m 6825 4425 l 8025 4425 l 8025 5925 l
+ 7950 5925 l gs col0 s gr 
+% Polyline
+n 6600 2925 m 6900 2625 l 7800 2625 l 7800 4125 l 6600 4125 l 6600 2925 l
+ 6900 2925 l
+ 6900 2625 l gs col0 s gr 
+% Polyline
+n 6675 2850 m 6675 2550 l 7875 2550 l 7875 4050 l
+ 7800 4050 l gs col0 s gr 
+% Polyline
+n 6750 2550 m 6750 2475 l 7950 2475 l 7950 3975 l
+ 7875 3975 l gs col0 s gr 
+% Polyline
+n 6825 2475 m 6825 2400 l 8025 2400 l 8025 3900 l
+ 7950 3900 l gs col0 s gr 
+% Polyline
+n 6600 900 m 6900 600 l 7800 600 l 7800 2100 l 6600 2100 l 6600 900 l
+ 6900 900 l
+ 6900 600 l gs col0 s gr 
+% Polyline
+n 6675 825 m 6675 525 l 7875 525 l 7875 2025 l
+ 7800 2025 l gs col0 s gr 
+% Polyline
+n 6750 525 m 6750 450 l 7950 450 l 7950 1950 l
+ 7875 1950 l gs col0 s gr 
+% Polyline
+n 6825 450 m 6825 375 l 8025 375 l 8025 1875 l
+ 7950 1875 l gs col0 s gr 
+% Polyline
+gs  clippath
+4020 3765 m 4080 3765 l 4080 3614 l 4050 3734 l 4020 3614 l cp
+eoclip
+n 4050 3150 m
+ 4050 3750 l gs col0 s gr gr
+
+% arrowhead
+n 4020 3614 m 4050 3734 l 4080 3614 l 4020 3614 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3315 4155 m 3315 4095 l 3164 4095 l 3284 4125 l 3164 4155 l cp
+eoclip
+n 2100 4125 m
+ 3300 4125 l gs col0 s gr gr
+
+% arrowhead
+n 3164 4155 m 3284 4125 l 3164 4095 l 3164 4155 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3315 4380 m 3315 4320 l 3164 4320 l 3284 4350 l 3164 4380 l cp
+eoclip
+n 2100 6225 m 2700 6225 l 2700 4350 l
+ 3300 4350 l gs col0 s gr gr
+
+% arrowhead
+n 3164 4380 m 3284 4350 l 3164 4320 l 3164 4380 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4380 3135 m 4320 3135 l 4320 3286 l 4350 3166 l 4380 3286 l cp
+eoclip
+n 4350 3150 m
+ 4350 3750 l gs col0 s gr gr
+
+% arrowhead
+n 4380 3286 m 4350 3166 l 4320 3286 l 4380 3286 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 3675 5925 m 3975 5625 l 4875 5625 l 4875 7125 l 3675 7125 l 3675 5925 l
+ 3975 5925 l
+ 3975 5625 l gs col0 s gr 
+% Polyline
+n 3300 300 m 5100 300 l 5100 1050 l 3300 1050 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+gs  clippath
+4155 4635 m 4095 4635 l 4095 4786 l 4125 4666 l 4155 4786 l cp
+eoclip
+n 4125 5625 m
+ 4125 4650 l gs col0 s gr gr
+
+% arrowhead
+n 4155 4786 m 4125 4666 l 4095 4786 l 4155 4786 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4320 5640 m 4380 5640 l 4380 5489 l 4350 5609 l 4320 5489 l cp
+eoclip
+n 4350 5625 m
+ 4350 4650 l gs col0 s gr gr
+
+% arrowhead
+n 4320 5489 m 4350 5609 l 4380 5489 l 4320 5489 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4170 1665 m 4230 1665 l 4230 1514 l 4200 1634 l 4170 1514 l cp
+4230 1035 m 4170 1035 l 4170 1186 l 4200 1066 l 4230 1186 l cp
+eoclip
+n 4200 1050 m
+ 4200 1650 l gs col0 s gr gr
+
+% arrowhead
+n 4230 1186 m 4200 1066 l 4170 1186 l 4230 1186 l  cp gs 0.00 setgray ef gr  col0 s
+% arrowhead
+n 4170 1514 m 4200 1634 l 4230 1514 l 4170 1514 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6615 1455 m 6615 1395 l 6464 1395 l 6584 1425 l 6464 1455 l cp
+eoclip
+n 5100 3900 m 6000 3900 l 6000 1425 l
+ 6600 1425 l gs col0 s gr gr
+
+% arrowhead
+n 6464 1455 m 6584 1425 l 6464 1395 l 6464 1455 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6615 3480 m 6615 3420 l 6464 3420 l 6584 3450 l 6464 3480 l cp
+eoclip
+n 5100 4050 m 6300 4050 l 6300 3450 l
+ 6600 3450 l gs col0 s gr gr
+
+% arrowhead
+n 6464 3480 m 6584 3450 l 6464 3420 l 6464 3480 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6615 5580 m 6615 5520 l 6464 5520 l 6584 5550 l 6464 5580 l cp
+eoclip
+n 5100 4200 m 6300 4200 l 6300 5550 l
+ 6600 5550 l gs col0 s gr gr
+
+% arrowhead
+n 6464 5580 m 6584 5550 l 6464 5520 l 6464 5580 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6690 7380 m 6690 7320 l 6539 7320 l 6659 7350 l 6539 7380 l cp
+eoclip
+n 5100 4350 m 6000 4350 l 6000 7350 l
+ 6675 7350 l gs col0 s gr gr
+
+% arrowhead
+n 6539 7380 m 6659 7350 l 6539 7320 l 6539 7380 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6690 9180 m 6690 9120 l 6539 9120 l 6659 9150 l 6539 9180 l cp
+eoclip
+n 5100 4500 m 5700 4500 l 5700 9150 l
+ 6675 9150 l gs col0 s gr gr
+
+% arrowhead
+n 6539 9180 m 6659 9150 l 6539 9120 l 6539 9180 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 6675 6675 m 6975 6375 l 7875 6375 l 7875 7875 l 6675 7875 l 6675 6675 l
+ 6975 6675 l
+ 6975 6375 l gs col0 s gr 
+% Polyline
+n 3300 3750 m 5100 3750 l 5100 4650 l 3300 4650 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 8775 450 m 10800 450 l 10800 1575 l 8775 1575 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 9075 900 m 10650 900 l 10650 1425 l 9075 1425 l
+ cp gs col0 s gr 
+% Polyline
+gs  clippath
+8790 1380 m 8790 1320 l 8639 1320 l 8759 1350 l 8639 1380 l cp
+eoclip
+n 7800 1350 m
+ 8775 1350 l gs col0 s gr gr
+
+% arrowhead
+n 8639 1380 m 8759 1350 l 8639 1320 l 8639 1380 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+11490 1380 m 11490 1320 l 11339 1320 l 11459 1350 l 11339 1380 l cp
+eoclip
+n 10800 1350 m
+ 11475 1350 l gs col0 s gr gr
+
+% arrowhead
+n 11339 1380 m 11459 1350 l 11339 1320 l 11339 1380 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+9015 3180 m 9015 3120 l 8864 3120 l 8984 3150 l 8864 3180 l cp
+eoclip
+n 7800 3150 m
+ 9000 3150 l gs col0 s gr gr
+
+% arrowhead
+n 8864 3180 m 8984 3150 l 8864 3120 l 8864 3180 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+9015 3555 m 9015 3495 l 8864 3495 l 8984 3525 l 8864 3555 l cp
+eoclip
+n 7800 3525 m
+ 9000 3525 l gs col0 s gr gr
+
+% arrowhead
+n 8864 3555 m 8984 3525 l 8864 3495 l 8864 3555 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 9000 2925 m 10800 2925 l 10800 3675 l 9000 3675 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+gs  clippath
+11490 3180 m 11490 3120 l 11339 3120 l 11459 3150 l 11339 3180 l cp
+eoclip
+n 10800 3150 m
+ 11475 3150 l gs col0 s gr gr
+
+% arrowhead
+n 11339 3180 m 11459 3150 l 11339 3120 l 11339 3180 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+11490 3555 m 11490 3495 l 11339 3495 l 11459 3525 l 11339 3555 l cp
+eoclip
+n 10800 3525 m
+ 11475 3525 l gs col0 s gr gr
+
+% arrowhead
+n 11339 3555 m 11459 3525 l 11339 3495 l 11339 3555 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 9000 6900 m 10800 6900 l 10800 7650 l 9000 7650 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+gs  clippath
+9015 7305 m 9015 7245 l 8864 7245 l 8984 7275 l 8864 7305 l cp
+eoclip
+n 7875 7275 m
+ 9000 7275 l gs col0 s gr gr
+
+% arrowhead
+n 8864 7305 m 8984 7275 l 8864 7245 l 8864 7305 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+11415 7305 m 11415 7245 l 11264 7245 l 11384 7275 l 11264 7305 l cp
+eoclip
+n 10800 7275 m
+ 11400 7275 l gs col0 s gr gr
+
+% arrowhead
+n 11264 7305 m 11384 7275 l 11264 7245 l 11264 7305 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+9015 9180 m 9015 9120 l 8864 9120 l 8984 9150 l 8864 9180 l cp
+eoclip
+n 7875 9150 m
+ 9000 9150 l gs col0 s gr gr
+
+% arrowhead
+n 8864 9180 m 8984 9150 l 8864 9120 l 8864 9180 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 9000 8775 m 10875 8775 l 10875 9525 l 9000 9525 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+gs  clippath
+11415 9180 m 11415 9120 l 11264 9120 l 11384 9150 l 11264 9180 l cp
+eoclip
+n 10875 9150 m
+ 11400 9150 l gs col0 s gr gr
+
+% arrowhead
+n 11264 9180 m 11384 9150 l 11264 9120 l 11264 9180 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4455 7110 m 4395 7110 l 4395 7261 l 4425 7141 l 4455 7261 l cp
+eoclip
+n 4425 8850 m
+ 4425 7125 l gs col0 s gr gr
+
+% arrowhead
+n 4455 7261 m 4425 7141 l 4395 7261 l 4455 7261 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 3300 8850 m 5100 8850 l 5100 9525 l 3300 9525 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+gs  clippath
+5085 9270 m 5085 9330 l 5236 9330 l 5116 9300 l 5236 9270 l cp
+eoclip
+n 6675 9300 m
+ 5100 9300 l gs col0 s gr gr
+
+% arrowhead
+n 5236 9270 m 5116 9300 l 5236 9330 l 5236 9270 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 675 9300 m 2475 9300 l 2475 9975 l 675 9975 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+gs  clippath
+2085 7995 m 2085 8055 l 2236 8055 l 2116 8025 l 2236 7995 l cp
+eoclip
+n 3900 8850 m 3900 8025 l
+ 2100 8025 l gs col0 s gr gr
+
+% arrowhead
+n 2236 7995 m 2116 8025 l 2236 8055 l 2236 7995 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+1470 9315 m 1530 9315 l 1530 9164 l 1500 9284 l 1470 9164 l cp
+eoclip
+n 1500 8700 m
+ 1500 9300 l gs col0 s gr gr
+
+% arrowhead
+n 1470 9164 m 1500 9284 l 1530 9164 l 1470 9164 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6690 9780 m 6690 9720 l 6539 9720 l 6659 9750 l 6539 9780 l cp
+2460 9720 m 2460 9780 l 2611 9780 l 2491 9750 l 2611 9720 l cp
+eoclip
+n 2475 9750 m
+ 6675 9750 l gs col0 s gr gr
+
+% arrowhead
+n 2611 9720 m 2491 9750 l 2611 9780 l 2611 9720 l  cp gs 0.00 setgray ef gr  col0 s
+% arrowhead
+n 6539 9780 m 6659 9750 l 6539 9720 l 6539 9780 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+ [60] 0 sd
+n 8700 6450 m 11850 6450 l 11850 9975 l 8700 9975 l
+ cp gs col0 s gr  [] 0 sd
+/Times-Roman-iso ff 180.00 scf sf
+4500 3525 m
+gs 1 -1 sc (generate/update) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+3600 3525 m
+gs 1 -1 sc (read) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+2850 3975 m
+gs 1 -1 sc (read) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+2850 4650 m
+gs 1 -1 sc (read) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+3975 6450 m
+gs 1 -1 sc (Tag file\(s\)) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+3750 750 m
+gs 1 -1 sc (Doxywizard) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+4425 5175 m
+gs 1 -1 sc (generate) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+3675 5175 m
+gs 1 -1 sc (read) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+4350 1425 m
+gs 1 -1 sc (generate/edit) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+6900 1350 m
+gs 1 -1 sc (XML files) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+6900 3300 m
+gs 1 -1 sc (Latex files) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+6900 3750 m
+gs 1 -1 sc (Makefile) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+7200 3525 m
+gs 1 -1 sc (+) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+3900 4275 m
+gs 1 -1 sc (Doxygen) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+9225 750 m
+gs 1 -1 sc (Your application) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+9300 1275 m
+gs 1 -1 sc (doxmlparser lib) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+8175 3750 m
+gs 1 -1 sc (make pdf) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+8175 3000 m
+gs 1 -1 sc (make ps) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+9675 3375 m
+gs 1 -1 sc (latex) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+11025 825 m
+gs 1 -1 sc (custom) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+11025 1050 m
+gs 1 -1 sc (output) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+11025 3000 m
+gs 1 -1 sc (postscript) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+11025 3825 m
+gs 1 -1 sc (PDF) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+6900 7350 m
+gs 1 -1 sc (refman.rtf) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+9525 7350 m
+gs 1 -1 sc (MS-Word) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+11100 7200 m
+gs 1 -1 sc (doc) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+8175 7200 m
+gs 1 -1 sc (import) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+6975 9075 m
+gs 1 -1 sc (HTML) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+6975 9300 m
+gs 1 -1 sc (pages) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+9075 9225 m
+gs 1 -1 sc (HTML Help Workshop) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+11100 9000 m
+gs 1 -1 sc (chm) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+6825 5625 m
+gs 1 -1 sc (Man pages) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5475 9525 m
+gs 1 -1 sc (parse) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+4575 8100 m
+gs 1 -1 sc (generate) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+3825 9300 m
+gs 1 -1 sc (Doxytag) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+1050 9750 m
+gs 1 -1 sc (Doxysearch) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+1575 9075 m
+gs 1 -1 sc (uses) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+2700 9975 m
+gs 1 -1 sc (used from) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+5700 9975 m
+gs 1 -1 sc (generates) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+8325 9075 m
+gs 1 -1 sc (read) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+8775 6675 m
+gs 1 -1 sc (Windows only) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+2700 8250 m
+gs 1 -1 sc (generate) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+8250 1200 m
+gs 1 -1 sc (read) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+1200 4200 m
+gs 1 -1 sc (Sources) col0 sh gr
+/Times-Roman-iso ff 180.00 scf sf
+1275 5775 m
+gs 1 -1 sc (Custom) col0 sh gr
+$F2psEnd
+rs
diff --git a/doc/infoflow.fig b/doc/infoflow.fig
new file mode 100644
index 0000000..01ede9a
--- /dev/null
+++ b/doc/infoflow.fig
@@ -0,0 +1,250 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter  
+100.00
+Single
+-2
+1200 2
+0 32 #e0e0e0
+0 33 #000000
+6 3600 1650 4800 3150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+	 3600 1950 3900 1650 4800 1650 4800 3150 3600 3150 3600 1950
+	 3900 1950 3900 1650
+4 0 0 50 0 0 12 0.0000 4 180 780 3900 2250 Config file\001
+4 0 0 50 0 0 12 0.0000 4 180 645 3900 2550 Doxyfile\001
+-6
+6 900 7200 2100 8700
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+	 900 7500 1200 7200 2100 7200 2100 8700 900 8700 900 7500
+	 1200 7500 1200 7200
+4 0 0 50 0 0 12 0.0000 4 135 510 1200 7950 search\001
+4 0 0 50 0 0 12 0.0000 4 135 405 1200 8175 index\001
+-6
+6 900 3150 2325 4875
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+	 900 3675 1200 3375 2100 3375 2100 4875 900 4875 900 3675
+	 1200 3675 1200 3375
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 975 3600 975 3300 2175 3300 2175 4800 2100 4800
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 1050 3300 1050 3225 2250 3225 2250 4725 2175 4725
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 1125 3225 1125 3150 2325 3150 2325 4650 2250 4650
+-6
+6 900 5175 2325 6900
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+	 900 5700 1200 5400 2100 5400 2100 6900 900 6900 900 5700
+	 1200 5700 1200 5400
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 975 5625 975 5325 2175 5325 2175 6825 2100 6825
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 1050 5325 1050 5250 2250 5250 2250 6750 2175 6750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 1125 5250 1125 5175 2325 5175 2325 6675 2250 6675
+-6
+6 1275 5925 2025 6750
+4 0 0 50 0 0 12 0.0000 4 135 750 1275 6075 - headers\001
+4 0 0 50 0 0 12 0.0000 4 180 690 1275 6675 - images\001
+4 0 0 50 0 0 12 0.0000 4 135 690 1275 6375 - footers\001
+-6
+6 6675 8250 8100 9975
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+	 6675 8775 6975 8475 7875 8475 7875 9975 6675 9975 6675 8775
+	 6975 8775 6975 8475
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 6750 8700 6750 8400 7950 8400 7950 9900 7875 9900
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 6825 8400 6825 8325 8025 8325 8025 9825 7950 9825
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 6900 8325 6900 8250 8100 8250 8100 9750 8025 9750
+-6
+6 6600 4425 8025 6150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+	 6600 4950 6900 4650 7800 4650 7800 6150 6600 6150 6600 4950
+	 6900 4950 6900 4650
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 6675 4875 6675 4575 7875 4575 7875 6075 7800 6075
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 6750 4575 6750 4500 7950 4500 7950 6000 7875 6000
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 6825 4500 6825 4425 8025 4425 8025 5925 7950 5925
+-6
+6 6600 2400 8025 4125
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+	 6600 2925 6900 2625 7800 2625 7800 4125 6600 4125 6600 2925
+	 6900 2925 6900 2625
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 6675 2850 6675 2550 7875 2550 7875 4050 7800 4050
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 6750 2550 6750 2475 7950 2475 7950 3975 7875 3975
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 6825 2475 6825 2400 8025 2400 8025 3900 7950 3900
+-6
+6 6600 375 8025 2100
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+	 6600 900 6900 600 7800 600 7800 2100 6600 2100 6600 900
+	 6900 900 6900 600
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 6675 825 6675 525 7875 525 7875 2025 7800 2025
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 6750 525 6750 450 7950 450 7950 1950 7875 1950
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 6825 450 6825 375 8025 375 8025 1875 7950 1875
+-6
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 4050 3150 4050 3750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 2100 4125 3300 4125
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+	1 1 1.00 60.00 120.00
+	 2100 6225 2700 6225 2700 4350 3300 4350
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 1 2
+	1 1 1.00 60.00 120.00
+	 4350 3150 4350 3750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+	 3675 5925 3975 5625 4875 5625 4875 7125 3675 7125 3675 5925
+	 3975 5925 3975 5625
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+	 3300 300 5100 300 5100 1050 3300 1050 3300 300
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 4125 5625 4125 4650
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 1 2
+	1 1 1.00 60.00 120.00
+	 4350 5625 4350 4650
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2
+	1 1 1.00 60.00 120.00
+	1 1 1.00 60.00 120.00
+	 4200 1050 4200 1650
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+	1 1 1.00 60.00 120.00
+	 5100 3900 6000 3900 6000 1425 6600 1425
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+	1 1 1.00 60.00 120.00
+	 5100 4050 6300 4050 6300 3450 6600 3450
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+	1 1 1.00 60.00 120.00
+	 5100 4200 6300 4200 6300 5550 6600 5550
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+	1 1 1.00 60.00 120.00
+	 5100 4350 6000 4350 6000 7350 6675 7350
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
+	1 1 1.00 60.00 120.00
+	 5100 4500 5700 4500 5700 9150 6675 9150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+	 6675 6675 6975 6375 7875 6375 7875 7875 6675 7875 6675 6675
+	 6975 6675 6975 6375
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+	 3300 3750 5100 3750 5100 4650 3300 4650 3300 3750
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+	 8775 450 10800 450 10800 1575 8775 1575 8775 450
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+	 9075 900 10650 900 10650 1425 9075 1425 9075 900
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7800 1350 8775 1350
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 10800 1350 11475 1350
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7800 3150 9000 3150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7800 3525 9000 3525
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+	 9000 2925 10800 2925 10800 3675 9000 3675 9000 2925
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 10800 3150 11475 3150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 10800 3525 11475 3525
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+	 9000 6900 10800 6900 10800 7650 9000 7650 9000 6900
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7875 7275 9000 7275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 10800 7275 11400 7275
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 7875 9150 9000 9150
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+	 9000 8775 10875 8775 10875 9525 9000 9525 9000 8775
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 10875 9150 11400 9150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 4425 8850 4425 7125
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+	 3300 8850 5100 8850 5100 9525 3300 9525 3300 8850
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 6675 9300 5100 9300
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+	 675 9300 2475 9300 2475 9975 675 9975 675 9300
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+	1 1 1.00 60.00 120.00
+	 3900 8850 3900 8025 2100 8025
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 1500 8700 1500 9300
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 1 2
+	1 1 1.00 60.00 120.00
+	1 1 1.00 60.00 120.00
+	 2475 9750 6675 9750
+2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+	 8700 6450 11850 6450 11850 9975 8700 9975 8700 6450
+4 0 0 50 0 0 12 0.0000 4 180 1215 4500 3525 generate/update\001
+4 0 0 50 0 0 12 0.0000 4 135 330 3600 3525 read\001
+4 0 0 50 0 0 12 0.0000 4 135 330 2850 3975 read\001
+4 0 0 50 0 0 12 0.0000 4 135 330 2850 4650 read\001
+4 0 0 50 0 0 12 0.0000 4 180 810 3975 6450 Tag file(s)\001
+4 0 0 50 0 0 12 0.0000 4 180 915 3750 750 Doxywizard\001
+4 0 0 50 0 0 12 0.0000 4 150 660 4425 5175 generate\001
+4 0 0 50 0 0 12 0.0000 4 135 330 3675 5175 read\001
+4 0 0 50 0 0 12 0.0000 4 180 990 4350 1425 generate/edit\001
+4 0 0 50 0 0 12 0.0000 4 135 780 6900 1350 XML files\001
+4 0 0 50 0 0 12 0.0000 4 135 810 6900 3300 Latex files\001
+4 0 0 50 0 0 12 0.0000 4 135 675 6900 3750 Makefile\001
+4 0 0 50 0 0 12 0.0000 4 75 105 7200 3525 +\001
+4 0 0 50 0 0 12 0.0000 4 180 675 3900 4275 Doxygen\001
+4 0 0 50 0 0 12 0.0000 4 180 1245 9225 750 Your application\001
+4 0 0 50 0 0 12 0.0000 4 180 1155 9300 1275 doxmlparser lib\001
+4 0 0 50 0 0 12 0.0000 4 180 690 8175 3750 make pdf\001
+4 0 0 50 0 0 12 0.0000 4 180 630 8175 3000 make ps\001
+4 0 0 50 0 0 12 0.0000 4 135 375 9675 3375 latex\001
+4 0 0 50 0 0 12 0.0000 4 105 555 11025 825 custom\001
+4 0 0 50 0 0 12 0.0000 4 150 480 11025 1050 output\001
+4 0 0 50 0 0 12 0.0000 4 180 765 11025 3000 postscript\001
+4 0 0 50 0 0 12 0.0000 4 135 345 11025 3825 PDF\001
+4 0 0 50 0 0 12 0.0000 4 135 750 6900 7350 refman.rtf\001
+4 0 0 50 0 0 12 0.0000 4 135 795 9525 7350 MS-Word\001
+4 0 0 50 0 0 12 0.0000 4 135 270 11100 7200 doc\001
+4 0 0 50 0 0 12 0.0000 4 180 480 8175 7200 import\001
+4 0 0 50 0 0 12 0.0000 4 135 510 6975 9075 HTML\001
+4 0 0 50 0 0 12 0.0000 4 135 450 6975 9300 pages\001
+4 0 0 50 0 0 12 0.0000 4 180 1740 9075 9225 HTML Help Workshop\001
+4 0 0 50 0 0 12 0.0000 4 135 315 11100 9000 chm\001
+4 0 0 50 0 0 12 0.0000 4 180 840 6825 5625 Man pages\001
+4 0 0 50 0 0 12 0.0000 4 135 420 5475 9525 parse\001
+4 0 0 50 0 0 12 0.0000 4 150 660 4575 8100 generate\001
+4 0 0 50 0 0 12 0.0000 4 180 645 3825 9300 Doxytag\001
+4 0 0 50 0 0 12 0.0000 4 180 915 1050 9750 Doxysearch\001
+4 0 0 50 0 0 12 0.0000 4 90 360 1575 9075 uses\001
+4 0 0 50 0 0 12 0.0000 4 135 750 2700 9975 used from\001
+4 0 0 50 0 0 12 0.0000 4 150 750 5700 9975 generates\001
+4 0 0 50 0 0 12 0.0000 4 135 330 8325 9075 read\001
+4 0 0 50 0 0 12 0.0000 4 180 1080 8775 6675 Windows only\001
+4 0 0 50 0 0 12 0.0000 4 150 660 2700 8250 generate\001
+4 0 0 50 0 0 12 0.0000 4 135 330 8250 1200 read\001
+4 0 0 50 0 0 12 0.0000 4 135 615 1200 4200 Sources\001
+4 0 0 50 0 0 12 0.0000 4 135 585 1275 5775 Custom\001
diff --git a/doc/infoflow.gif b/doc/infoflow.gif
new file mode 100644
index 0000000..ae6bebb
Binary files /dev/null and b/doc/infoflow.gif differ
diff --git a/doc/language.doc b/doc/language.doc
index bfacc39..27f4ec3 100644
--- a/doc/language.doc
+++ b/doc/language.doc
@@ -25,7 +25,7 @@ Doxygen has built-in support for multiple languages. This means
 that the text fragments that doxygen generates can be produced in
 languages other than English (the default) at configuration time.
 
-Currently (version 1.2.14-20020317), 28 languages 
+Currently (version 1.3-rc2-20021224), 28 languages 
 are supported (sorted alphabetically): 
 Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian, 
 Czech, Danish, Dutch, English, Finnish, 
diff --git a/doc/starting.doc b/doc/starting.doc
index 39bb117..c3b7065 100644
--- a/doc/starting.doc
+++ b/doc/starting.doc
@@ -32,6 +32,12 @@ engine. See section \ref doxysearch_usage for more detailed usage information.
 Optionally, the executable \c doxywizard is a GUI front-end for editing 
 the configuration files that are used by doxygen.
 
+The following figure shows the relation between the tools and the flow
+of information between them:
+
+\image html infoflow.gif "Doxygen information flow" 
+\image latex infoflow.eps "Doxygen information flow" width=14cm
+
 \section step1 Step 1: Creating a configuration file
 
 Doxygen uses a configuration file to determine all of its settings.
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
index 669384c..91e46b8 100644
--- a/packages/rpm/doxygen.spec
+++ b/packages/rpm/doxygen.spec
@@ -1,6 +1,6 @@
 Summary: A documentation system for C/C++.
 Name: doxygen
-Version: 1.3_rc2_20021224
+Version: 1.3_rc2_20030106
 Release: 1
 Epoch: 1
 Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 426202d..24c68ab 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -124,6 +124,7 @@ ClassDef::~ClassDef()
   delete m_innerClasses;
   delete m_templateInstances;
   delete m_templBaseClassNames;
+  delete m_tempArgs;
 }
 
 QCString ClassDef::displayName() const
@@ -1525,7 +1526,6 @@ void ClassDef::setTemplateArguments(ArgumentList *al)
   if (al==0) return;
   if (!m_tempArgs) delete m_tempArgs; // delete old list if needed
   m_tempArgs=new ArgumentList; 
-  m_tempArgs->setAutoDelete(TRUE);
   ArgumentListIterator ali(*al);
   Argument *a;
   for (;(a=ali.current());++ali)
@@ -1981,7 +1981,11 @@ void ClassDef::mergeMembers()
 
 void ClassDef::addUsedClass(ClassDef *cd,const char *accessName)
 {
-  if (m_usesImplClassDict==0) m_usesImplClassDict = new UsesClassDict(17); 
+  if (m_usesImplClassDict==0) 
+  {
+    m_usesImplClassDict = new UsesClassDict(17); 
+    m_usesImplClassDict->setAutoDelete(TRUE);
+  }
   UsesClassDef *ucd=m_usesImplClassDict->find(cd->name());
   if (ucd==0 /*|| ucd->templSpecifiers!=templSpec*/)
   {
@@ -2065,7 +2069,11 @@ void ClassDef::determineImplUsageRelation()
             if (cd) // class exists 
             {
               found=TRUE;
-              if (m_usesImplClassDict==0) m_usesImplClassDict = new UsesClassDict(257); 
+              if (m_usesImplClassDict==0) 
+              {
+                m_usesImplClassDict = new UsesClassDict(257); 
+                m_usesImplClassDict->setAutoDelete(TRUE);
+              }
               UsesClassDef *ucd=m_usesImplClassDict->find(cd->name());
               if (ucd==0 || ucd->templSpecifiers!=templSpec)
               {
diff --git a/src/classdef.h b/src/classdef.h
index 95997f7..86a3b3a 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -126,12 +126,6 @@ class ClassDef : public Definition
      */
     ArgumentList *templateArguments() const { return m_tempArgs; }
 
-    /*! Returns the template arguments that this nested class "inherits" 
-     *  from its outer class (doxygen assumes there is only one!). 
-     *  Will return 0 if not applicable.
-     */
-    //ArgumentList *outerTemplateArguments() const;
-    
     /*! Returns the namespace this compound is in, or 0 if it has a global
      *  scope.
      */
diff --git a/src/config.h b/src/config.h
index 4b00d22..4780c95 100644
--- a/src/config.h
+++ b/src/config.h
@@ -338,6 +338,11 @@ class Config
       if (m_instance==0) m_instance = new Config;
       return m_instance;
     }
+    /*! Delete the instance */
+    static void deleteInstance()
+    {
+      delete m_instance;
+    }
     
     /*! Returns an iterator that can by used to iterate over the 
      *  configuration options.
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 42919fd..bc5d872 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -128,8 +128,8 @@ static void docParserPopContext()
 //---------------------------------------------------------------------------
 
 /*! search for an image in the imageNameDict and if found
- * copies the image to the output directory (which is the
- * html directory if type==0 or the latex directory if type==1)
+ * copies the image to the output directory (which depends on the \a type
+ * parameter).
  */
 static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
 {
@@ -225,14 +225,20 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
   return result;
 }
 
+/*! Collects the parameters found with @param or @retval commands
+ *  in a global list g_paramsFound. If \a isParam is set to TRUE
+ *  and the parameter is not an actual parameter of the current
+ *  member g_memberDef, than a warning is raised (unless warnings
+ *  are disabled altogether).
+ */
 static void checkArgumentName(const QString &name,bool isParam)
 {                
+  if (!Config_getBool("WARN_IF_DOC_ERROR")) return;
   if (g_memberDef==0) return; // not a member
   ArgumentList *al=g_memberDef->isDocsForDefinition() ? 
 		   g_memberDef->argumentList() :
                    g_memberDef->declArgumentList();
   if (al==0) return; // no argument list
-  if (!Config_getBool("WARN_IF_DOC_ERROR")) return;
 
   static QRegExp re("[a-zA-Z0-9_]+\\.*");
   int p=0,i=0,l;
@@ -270,6 +276,11 @@ static void checkArgumentName(const QString &name,bool isParam)
   }
 }
 
+/*! Checks if the parameters that have been specified using @param are
+ *  indeed all paramters.
+ *  Must be called after checkArgumentName() has been called for each
+ *  argument.
+ */
 static void checkUndocumentedParams()
 {
   if (g_memberDef && g_hasParamCommand && Config_getBool("WARN_IF_DOC_ERROR"))
@@ -317,6 +328,7 @@ static void checkUndocumentedParams()
 
 //---------------------------------------------------------------------------
 
+/*! Strips know html and tex extensions from \a text. */
 static QString stripKnownExtensions(const char *text)
 {
   QString result=text;
@@ -414,6 +426,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
                                  QString *pDoc,
                                  Definition **pDef)
 {
+  //printf("findDocsForMemberOrCompound(%s)\n",commandName);
   *pDoc="";
   *pDef=0;
   QString cmdArg=commandName;
@@ -422,10 +435,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
 
   int funcStart=cmdArg.find('(');
   if (funcStart==-1) funcStart=l;
-  //int lastScopeStart=cmdArg.findRev("::",funcStart);
-  //int lastScopeEnd = lastScopeStart==-1 ? 0 : lastScopeStart+2;
-  //QString scope=cmdArg.left(QMAX(lastScopeStart,0));
-  //QString name=cmdArg.mid(lastScopeEnd,funcStart-lastScopeEnd);
+
   QString name=cmdArg.left(funcStart);
   QString args=cmdArg.right(l-funcStart);
 
@@ -441,6 +451,7 @@ static bool findDocsForMemberOrCompound(const char *commandName,
       name.latin1(),
       args.isEmpty()?0:args.latin1(),
       md,cd,fd,nd,gd,FALSE,0,TRUE);
+  //printf("found=%d context=%s name=%s\n",found,g_context.data(),name.data());
   if (found && md)
   {
     *pDoc=md->documentation();
@@ -1289,7 +1300,14 @@ void DocCopy::parse()
     if (g_copyStack.findRef(def)==-1) // definition not parsed earlier
     {
       docParserPushContext();
-      g_context=def->name();
+      if (def->definitionType()==Definition::TypeMember && def->getOuterScope())
+      {
+        g_context=def->getOuterScope()->name();
+      }
+      else
+      {
+        g_context=def->name();
+      }
       g_styleStack.clear();
       g_nodeStack.clear();
       g_copyStack.append(def);
@@ -3728,13 +3746,6 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
         retval=RetVal_ListItem;
       }
       break;
-    //case HTML_PRE:
-    //  {
-    //    DocHtmlPre *pre = new DocHtmlPre(this,tagHtmlAttribs);
-    //    m_children.append(pre);
-    //    retval=pre->parse();
-    //  }
-    //  break;
     case HTML_BOLD:
       handleStyleEnter(this,m_children,DocStyleChange::Bold,&g_token->attribs);
       break;
@@ -3836,7 +3847,7 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
             g_insideHtmlLink=FALSE;
             break;
           }
-          else // unsupport option for tag a
+          else // unsupported option for tag a
           {
           }
         }
@@ -4054,6 +4065,7 @@ int DocPara::parse()
 {
   DBG(("DocPara::parse() start\n"));
   g_nodeStack.push(this);
+  // handle style commands "inherited" from the previous paragraph
   handleInitialStyleCommands(this,m_children);
   int tok;
   int retval=0;
@@ -4083,7 +4095,7 @@ reparsetoken:
         {
           // prevent leading whitespace and collapse multiple whitespace areas
           DocNode::Kind k; 
-          if (insidePRE(this) || // all whitespace is relavant
+          if (insidePRE(this) || // all whitespace is relevant
               (                
                // remove leading whitespace 
                !m_children.isEmpty()  && 
@@ -4197,12 +4209,7 @@ reparsetoken:
           }
 	  if (cmd&SIMPLESECT_BIT)
 	  {
-	    if (n  // already in a simple section
-	        //|| // no section or root as parent
-		//  (parent()->kind()!=DocNode::Kind_Root &&
-	  	//   parent()->kind()!=DocNode::Kind_Section
-	        //  )
-	       )
+	    if (n)  // already in a simple section
 	    {
 	      // simple section cannot start in this paragraph, need
 	      // to unwind the stack and remember the command.
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index de8937c..61a98b5 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -142,7 +142,7 @@ static int computeIndent(const char *str,int length)
  */
 static void parseHtmlAttribs(const char *att)
 {
-  //printf("parseHtmlAttribs(%s)\n",opt.data());
+  //printf("parseHtmlAttribs(%s)\n",att);
   QCString attribs=att;
   int len = attribs.length();
   char c;
@@ -173,7 +173,7 @@ static void parseHtmlAttribs(const char *att)
 	// search for matching quote 
         while (i<len && c!='\'') { c=attribs.at(++i); } 
 	endAttrib=i;
-        c=attribs.at(++i);
+        if (i<len) c=attribs.at(++i);
       }
       else if (attribs.at(i)=='"') // option "..."
       {
@@ -182,7 +182,7 @@ static void parseHtmlAttribs(const char *att)
 	// search for matching quote 
         while (i<len && c!='"') { c=attribs.at(++i); } 
 	endAttrib=i;
-        c=attribs.at(++i);
+        if (i<len) c=attribs.at(++i);
       }
       else // value without any quotes
       {
@@ -190,7 +190,7 @@ static void parseHtmlAttribs(const char *att)
 	// search for separator
         while (i<len && c!=' ') { c=attribs.at(++i); } 
 	endAttrib=i;
-        c=attribs.at(++i);
+	if (i<len) c=attribs.at(++i);
       }
       opt.value  = attribs.mid(startAttrib,endAttrib-startAttrib); 
     }
@@ -198,7 +198,7 @@ static void parseHtmlAttribs(const char *att)
     {
     }
     //printf("=====> Adding option name=<%s> value=<%s>\n",
-    //    opt->name.data(),opt->value.data());
+    //    opt.name.data(),opt.value.data());
     g_token->attribs.append(&opt);
   }
 }
diff --git a/src/dot.cpp b/src/dot.cpp
index 70fa726..6fedd24 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -881,27 +881,25 @@ void DotGfxHierarchyTable::addClassList(ClassSDict *cl)
   for (cli.toLast();(cd=cli.current());--cli)
   {
     //printf("Trying %s subClasses=%d\n",cd->name().data(),cd->subClasses()->count());
-    if (!hasVisibleRoot(cd->baseClasses()))
+    if (!hasVisibleRoot(cd->baseClasses()) &&
+        cd->isVisibleInHierarchy()
+       ) // root node in the forest
     {
-      if (cd->isVisibleInHierarchy()) // root node in the forest
+      QCString tmp_url="";
+      if (cd->isLinkable()) 
+        tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
+      //printf("Inserting root class %s\n",cd->name().data());
+      DotNode *n = new DotNode(m_curNodeNumber++,
+          cd->displayName(),
+          tmp_url.data());
+
+      //m_usedNodes->clear();
+      m_usedNodes->insert(cd->name(),n);
+      m_rootNodes->insert(0,n);   
+      if (!cd->visited && cd->subClasses()->count()>0)
       {
-        QCString tmp_url="";
-        if (cd->isLinkable()) 
-          tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
-        //printf("Inserting root class %s\n",cd->name().data());
-        DotNode *n = new DotNode(m_curNodeNumber++,
-                cd->displayName(),
-                tmp_url.data()
-               );
-        
-        //m_usedNodes->clear();
-        m_usedNodes->insert(cd->name(),n);
-        m_rootNodes->insert(0,n);   
-        if (!cd->visited && cd->subClasses()->count()>0)
-        {
-          addHierarchy(n,cd,cd->visited);
-          cd->visited=TRUE;
-        }
+        addHierarchy(n,cd,cd->visited);
+        cd->visited=TRUE;
       }
     }
   }
@@ -911,8 +909,8 @@ DotGfxHierarchyTable::DotGfxHierarchyTable()
 {
   m_curNodeNumber=0;
   m_rootNodes = new QList<DotNode>;
-  //m_rootNodes->setAutoDelete(TRUE);    // rootNodes owns the nodes
-  m_usedNodes = new QDict<DotNode>(1009); // virtualNodes only aliases nodes
+  m_usedNodes = new QDict<DotNode>(1009); 
+  m_usedNodes->setAutoDelete(TRUE);
   m_rootSubgraphs = new DotNodeList;
   
   // build a graph with each class as a node and the inheritance relations
@@ -964,7 +962,9 @@ DotGfxHierarchyTable::DotGfxHierarchyTable()
 DotGfxHierarchyTable::~DotGfxHierarchyTable()
 {
   //printf("DotGfxHierarchyTable::~DotGfxHierarchyTable\n");
-  SDict<DotNode> skipNodes(17);
+
+#if 0 // TODO: delete this
+  SDict<DotNode> skipNodes(1009);
   skipNodes.setAutoDelete(TRUE);
   DotNode *n = m_rootNodes->first();
   while (n)
@@ -980,6 +980,15 @@ DotGfxHierarchyTable::~DotGfxHierarchyTable()
     deleteNodes(n,&skipNodes); 
     n=m_rootNodes->next();
   }
+#endif
+
+  //QDictIterator<DotNode> di(*m_usedNodes);
+  //DotNode *n;
+  //for (;(n=di.current());++di)
+  //{
+  //  printf("Node %p: %s\n",n,n->label().data());
+  //}
+  
   delete m_rootNodes;
   delete m_usedNodes;
   delete m_rootSubgraphs;
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 5b184d8..1eab93d 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -26,6 +26,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/stat.h>
+#include <qtextcodec.h>
 
 #include "version.h"
 #include "doxygen.h"
@@ -61,6 +62,7 @@
 //#include "packagedef.h"
 #include "bufstr.h"
 #include "commentcnv.h"
+#include "cmdmapper.h"
 
 #if defined(_MSC_VER) || defined(__BORLANDC__)
 #define popen _popen
@@ -104,8 +106,6 @@ StringDict     Doxygen::tagDestinationDict(257); // all tag locations
 QDict<void>    Doxygen::expandAsDefinedDict(257); // all macros that should be expanded
 
 QIntDict<MemberGroupInfo> Doxygen::memGrpInfoDict(1009); // dictionary of the member groups heading
-//QIntDict<QCString> Doxygen::memberHeaderDict(1009); // dictionary of the member groups heading
-//QIntDict<QCString> Doxygen::memberDocDict(1009);    // dictionary of the member groups heading
 
 PageInfo      *Doxygen::mainPage = 0;           
 QTextStream    Doxygen::tagFile;
@@ -3095,6 +3095,7 @@ static bool findTemplateInstanceRelation(Entry *root,
 
       findUsedClassesForClass(templateRoot,templateClass,instanceClass,
           isArtificial,templArgs,templateNames);
+      delete templArgs;
     }
     else
     {
@@ -4468,7 +4469,6 @@ static void findMember(Entry *root,
                * of the function definition before matching.
                */
               argList = new ArgumentList;
-              argList->setAutoDelete(TRUE);
               substituteTemplatesInArgList(declTemplArgs,*defTemplArgs,
                                            md->argumentList(),argList);
 
@@ -7048,6 +7048,37 @@ void initDoxygen()
   initPreprocessor();
 
   Doxygen::sectionDict.setAutoDelete(TRUE);
+  Doxygen::inputNameList.setAutoDelete(TRUE);
+  Doxygen::memberNameSDict.setAutoDelete(TRUE);
+  Doxygen::functionNameSDict.setAutoDelete(TRUE);
+  Doxygen::hiddenClasses.setAutoDelete(TRUE);
+  Doxygen::classSDict.setAutoDelete(TRUE);
+  Doxygen::pageSDict->setAutoDelete(TRUE);
+  Doxygen::exampleSDict->setAutoDelete(TRUE);
+  excludeNameDict.setAutoDelete(TRUE);
+  Doxygen::memGrpInfoDict.setAutoDelete(TRUE);
+  Doxygen::tagDestinationDict.setAutoDelete(TRUE);
+}
+
+void cleanUpDoxygen()
+{
+  delete Doxygen::inputNameDict;
+  delete Doxygen::includeNameDict;
+  delete Doxygen::exampleNameDict;
+  delete Doxygen::imageNameDict;
+  delete Doxygen::dotFileNameDict;
+  delete Doxygen::mainPage;
+  delete Doxygen::pageSDict;  
+  delete Doxygen::exampleSDict;
+  delete Doxygen::globalScope;
+  delete Doxygen::specialLists;
+  cleanUpPreprocessor();
+  Config::deleteInstance();
+  QTextCodec::deleteAllCodecs();
+  delete theTranslator;
+  delete outputList;
+  CmdMapper::freeInstance();
+  HtmlTagMapper::freeInstance();
 }
 
 void readConfiguration(int argc, char **argv)
@@ -7093,6 +7124,7 @@ void readConfiguration(int argc, char **argv)
         if (!formatName)
         {
           err("Error:option -e is missing format specifier rtf.\n");
+          cleanUpDoxygen();
           exit(1);
         }
         if (stricmp(formatName,"rtf")==0)
@@ -7100,6 +7132,7 @@ void readConfiguration(int argc, char **argv)
           if (optind+1>=argc)
           {
             err("Error: option \"-e rtf\" is missing an extensions file name\n");
+            cleanUpDoxygen();
             exit(1);
           }
           QFile f;
@@ -7107,9 +7140,11 @@ void readConfiguration(int argc, char **argv)
           {
             RTFGenerator::writeExtensionsFile(f);
           }
+          cleanUpDoxygen();
           exit(1);
         }
         err("Error: option \"-e\" has invalid format specifier.\n");
+        cleanUpDoxygen();
         exit(1);
         break; 
       case 'w':
@@ -7117,6 +7152,7 @@ void readConfiguration(int argc, char **argv)
         if (!formatName)
         {
           err("Error: option -w is missing format specifier rtf, html or latex\n");
+          cleanUpDoxygen();
           exit(1);
         } 
         if (stricmp(formatName,"rtf")==0)
@@ -7124,6 +7160,7 @@ void readConfiguration(int argc, char **argv)
           if (optind+1>=argc)
           {
             err("Error: option \"-w rtf\" is missing a style sheet file name\n");
+            cleanUpDoxygen();
             exit(1);
           }
           QFile f;
@@ -7131,6 +7168,7 @@ void readConfiguration(int argc, char **argv)
           {
             RTFGenerator::writeStyleSheetFile(f);
           }
+          cleanUpDoxygen();
           exit(1);
         }
         else if (stricmp(formatName,"html")==0)
@@ -7140,6 +7178,7 @@ void readConfiguration(int argc, char **argv)
             if (!Config::instance()->parse(argv[optind+4]))
             {
               err("Error opening or reading configuration file %s!\n",argv[optind+4]);
+              cleanUpDoxygen();
               exit(1);
             }
             Config::instance()->substituteEnvironmentVars();
@@ -7153,6 +7192,7 @@ void readConfiguration(int argc, char **argv)
           if (optind+3>=argc)
           {
             err("Error: option \"-w html\" does not have enough arguments\n");
+            cleanUpDoxygen();
             exit(1);
           }
 
@@ -7176,7 +7216,8 @@ void readConfiguration(int argc, char **argv)
           if (openOutputFile(argv[optind+3],f))
           {
             HtmlGenerator::writeStyleSheetFile(f);
-          }
+          } 
+          cleanUpDoxygen();
           exit(0);
         }
         else if (stricmp(formatName,"latex")==0)
@@ -7199,6 +7240,7 @@ void readConfiguration(int argc, char **argv)
           if (optind+2>=argc)
           {
             err("Error: option \"-w latex\" does not have enough arguments\n");
+            cleanUpDoxygen();
             exit(1);
           }
 
@@ -7218,11 +7260,13 @@ void readConfiguration(int argc, char **argv)
           {
             LatexGenerator::writeStyleSheetFile(f);
           }
+          cleanUpDoxygen();
           exit(0);
         }
         else 
         {
           err("Error: Illegal format specifier %s: should be one of rtf, html, or latex\n",formatName);
+          cleanUpDoxygen();
           exit(1);
         }
         break;
@@ -7234,6 +7278,7 @@ void readConfiguration(int argc, char **argv)
         else if (strcmp(&argv[optind][2],"version")==0)
         {
           msg("%s\n",versionString); 
+          cleanUpDoxygen();
           exit(0);
         }
         break;
@@ -7257,6 +7302,7 @@ void readConfiguration(int argc, char **argv)
   if (genConfig)
   {
     generateConfigFile(configName,shortList);
+    cleanUpDoxygen();
     exit(0);
   }
 
@@ -7295,12 +7341,14 @@ void readConfiguration(int argc, char **argv)
   if (!Config::instance()->parse(configName))
   {
     err("Error: could not open or read configuration file %s!\n",configName);
+    cleanUpDoxygen();
     exit(1);
   }
 
   if (updateConfig)
   {
     generateConfigFile(configName,shortList,TRUE);
+    cleanUpDoxygen();
     exit(0);
   }
   
@@ -7370,8 +7418,6 @@ void readConfiguration(int argc, char **argv)
 void parseInput()
 {
 
-  Doxygen::classSDict.setAutoDelete(TRUE);
-  
   Doxygen::inputNameDict     = new FileNameDict(10007);
   Doxygen::includeNameDict   = new FileNameDict(10007);
   Doxygen::exampleNameDict   = new FileNameDict(1009);
@@ -7602,6 +7648,8 @@ void parseInput()
   if (input.isEmpty())
   {
     err("No input read, no output generated!\n");
+    delete root;
+    cleanUpDoxygen();
     exit(1);
   }
   else
@@ -7628,6 +7676,8 @@ void parseInput()
       {
         err("Error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
 	    "exist and cannot be created\n",outputDirectory.data());
+        delete root;
+        cleanUpDoxygen();
         exit(1);
       }
       else if (!Config_getBool("QUIET"))
@@ -7654,6 +7704,8 @@ void parseInput()
   if (generateHtml && !htmlDir.exists() && !htmlDir.mkdir(htmlOutput))
   {
     err("Could not create output directory %s\n",htmlOutput.data());
+    delete root;
+    cleanUpDoxygen();
     exit(1);
   }
   
@@ -7671,6 +7723,8 @@ void parseInput()
   if (generateLatex && !latexDir.exists() && !latexDir.mkdir(latexOutput))
   {
     err("Could not create output directory %s\n",latexOutput.data());
+    delete root;
+    cleanUpDoxygen();
     exit(1);
   }
   
@@ -7688,6 +7742,8 @@ void parseInput()
   if (generateRtf && !rtfDir.exists() && !rtfDir.mkdir(rtfOutput))
   {
     err("Could not create output directory %s\n",rtfOutput.data());
+    delete root;
+    cleanUpDoxygen();
     exit(1);
   }
 
@@ -7705,6 +7761,8 @@ void parseInput()
   if (generateMan && !manDir.exists() && !manDir.mkdir(manOutput))
   {
     err("Could not create output directory %s\n",manOutput.data());
+    delete root;
+    cleanUpDoxygen();
     exit(1);
   }
 
@@ -7855,6 +7913,7 @@ void generateOutput()
    *            Initialize output generators                                *
    **************************************************************************/
 
+  
   outputList = new OutputList(TRUE);
   if (Config_getBool("GENERATE_HTML"))  
   {
@@ -7894,6 +7953,7 @@ void generateOutput()
       err("Error: cannot open tag file %s for writing\n",
           generateTagFile.data()
          );
+      cleanUpDoxygen();
       exit(1);
     }
     Doxygen::tagFile.setDevice(tag);
@@ -8069,5 +8129,6 @@ void generateOutput()
     }
     QDir::setCurrent(oldDir);
   }
+  cleanUpDoxygen();
 }
 
diff --git a/src/doxygen.h b/src/doxygen.h
index d102345..d33ed94 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -60,40 +60,38 @@ extern QCString spaces;
 class Doxygen
 {
   public:
-    static ClassSDict classSDict;
-    static ClassSDict hiddenClasses;
-    static PageSDict *exampleSDict;
-    static PageSDict *pageSDict;
-    static PageInfo  *mainPage;
-    static FileNameDict *includeNameDict;
-    static FileNameDict *exampleNameDict;
-    static FileNameDict *inputNameDict;
-    static FileNameList inputNameList;
-    static FileNameDict *imageNameDict;
-    static FileNameDict *dotFileNameDict;
-    static QStrList tagfileList;
-    static MemberNameSDict memberNameSDict;
-    static MemberNameSDict functionNameSDict;
-    static FileList fileList;
-    static FileDict fileDict;
-    static ClassDef unrelatedClass; 
-    static QTextStream tagFile;
-    static SectionDict sectionDict;
-    static StringDict namespaceAliasDict;
-    static GroupSDict groupSDict;
-    static NamespaceSDict namespaceSDict;
-    static FormulaList formulaList;
-    static FormulaDict formulaDict;
-    static FormulaDict formulaNameDict;
-    static StringDict tagDestinationDict; 
-    static StringDict aliasDict; 
+    static ClassSDict                classSDict;
+    static ClassSDict                hiddenClasses;
+    static PageSDict                *exampleSDict;
+    static PageSDict                *pageSDict;
+    static PageInfo                 *mainPage;
+    static FileNameDict             *includeNameDict;
+    static FileNameDict             *exampleNameDict;
+    static FileNameDict             *inputNameDict;
+    static FileNameList              inputNameList;
+    static FileNameDict             *imageNameDict;
+    static FileNameDict             *dotFileNameDict;
+    static QStrList                  tagfileList;
+    static MemberNameSDict           memberNameSDict;
+    static MemberNameSDict           functionNameSDict;
+    static FileList                  fileList;
+    static FileDict                  fileDict;
+    static ClassDef                  unrelatedClass; 
+    static QTextStream               tagFile;
+    static SectionDict               sectionDict;
+    static StringDict                namespaceAliasDict;
+    static GroupSDict                groupSDict;
+    static NamespaceSDict            namespaceSDict;
+    static FormulaList               formulaList;
+    static FormulaDict               formulaDict;
+    static FormulaDict               formulaNameDict;
+    static StringDict                tagDestinationDict; 
+    static StringDict                aliasDict; 
     static QIntDict<MemberGroupInfo> memGrpInfoDict;
-    //static QIntDict<QCString> memberHeaderDict; // dictionary of the member groups heading
-    //static QIntDict<QCString> memberDocDict;    // dictionary of the member groups heading
-    static QDict<void> expandAsDefinedDict;
-    static NamespaceDef *globalScope;
-    static QDict<RefList> *specialLists; // array of special lists: todo, test, bug, deprecated ...
-    static QCString htmlFileExtension;
+    static QDict<void>               expandAsDefinedDict;
+    static NamespaceDef             *globalScope;
+    static QDict<RefList>           *specialLists; // array of special lists: todo, test, bug, deprecated ...
+    static QCString                  htmlFileExtension;
 };
 
 void initDoxygen();
diff --git a/src/entry.h b/src/entry.h
index 5c0cdb4..ba4afbf 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -103,7 +103,7 @@ class ArgumentList : public QList<Argument>
     ArgumentList() : QList<Argument>(), 
                      constSpecifier(FALSE),
                      volatileSpecifier(FALSE),
-                     pureSpecifier(FALSE) {}
+                     pureSpecifier(FALSE) { setAutoDelete(TRUE); }
     /*! Destroys the argument list */
    ~ArgumentList() {}
     bool hasDocumentation() const;
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 01289e9..e48b398 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -73,6 +73,8 @@ FileDef::~FileDef()
   delete classSDict;
   delete includeDict;
   delete includeList;
+  delete includedByDict;
+  delete includedByList;
   delete namespaceSDict;
   delete srcDefDict;
   delete srcMemberDict;
diff --git a/src/filename.cpp b/src/filename.cpp
index 9b7e5b2..cbcceed 100644
--- a/src/filename.cpp
+++ b/src/filename.cpp
@@ -20,6 +20,7 @@
 
 FileName::FileName(const char *fn,const char *n) : FileList()
 {
+  setAutoDelete(TRUE);
   fName=fn;
   name=n;
 }
diff --git a/src/index.cpp b/src/index.cpp
index 2073bb7..df48b79 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -1399,7 +1399,7 @@ void writeAlphabeticalClassList(OutputList &ol)
       {
         QCString namesp;
         if (cd->getNamespaceDef()) namesp=cd->getNamespaceDef()->displayName();
-        QCString cname=cd->displayName();
+        QCString cname=cd->className();
 
         ol.writeObjectLink(cd->getReference(),
                            cd->getOutputFileBase(),0,cname);
diff --git a/src/instdox.cpp b/src/instdox.cpp
index cd803cd..3ae5760 100644
--- a/src/instdox.cpp
+++ b/src/instdox.cpp
@@ -127,7 +127,7 @@ void writeInstallScript()
     t << "}\n";
     t << "\n";
     t << "if ( ! @files ) {\n";
-    t << "  print STDERR \"Warning: No input files given and non found!\\n\";\n";
+    t << "  print STDERR \"Warning: No input files given and none found!\\n\";\n";
     t << "}\n";
     t << "\n";
     t << "foreach $f (@files)\n";
diff --git a/src/membername.cpp b/src/membername.cpp
index 156e52c..59da4d9 100644
--- a/src/membername.cpp
+++ b/src/membername.cpp
@@ -23,6 +23,7 @@
 MemberName::MemberName(const char *n) : QList<MemberDef>()
 {
   name=n;
+  setAutoDelete(TRUE);
 }
 
 MemberName::~MemberName()
diff --git a/src/page.h b/src/page.h
index 202a300..c7c7579 100644
--- a/src/page.h
+++ b/src/page.h
@@ -115,7 +115,7 @@ class PageSDict : public SDict<PageInfo>
 {
   public:
     PageSDict(int size) : SDict<PageInfo>(size) {}
-   ~PageSDict() {}
+    virtual ~PageSDict() {}
     int compareItems(GCI i1,GCI i2)
     {
       return stricmp(((PageInfo *)i1)->name,((PageInfo *)i2)->name);
diff --git a/src/pngenc.cpp b/src/pngenc.cpp
index ce36b95..18d7085 100644
--- a/src/pngenc.cpp
+++ b/src/pngenc.cpp
@@ -106,6 +106,7 @@ void PngEncoder::write(const char *name)
          PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE,
          PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE
                  );
+     free(png_palette);
      ti[0] = transIndex;
      png_set_tRNS(png_ptr,info_ptr,ti,1,NULL);
      rows    = (unsigned char **) calloc(sizeof(unsigned char*),height);
diff --git a/src/pre.h b/src/pre.h
index b3705a1..6213bfa 100644
--- a/src/pre.h
+++ b/src/pre.h
@@ -25,6 +25,7 @@
 class BufStr;
 
 void initPreprocessor();
+void cleanUpPreprocessor();
 void addSearchDir(const char *dir);
 void preprocessFile(const char *fileName,BufStr &output);
 
diff --git a/src/pre.l b/src/pre.l
index d85023f..5b55691 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -1919,7 +1919,7 @@ void initPreprocessor()
   g_fileDefineDict = new DefineDict(1009);
 }
 
-void cleanupPreprocessor()
+void cleanUpPreprocessor()
 {
   //delete fileDefineCache;
   delete g_fileDefineDict; g_fileDefineDict=0;
diff --git a/src/scanner.l b/src/scanner.l
index c6b4eaf..aba1dca 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -2733,6 +2733,13 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
   					  lastCContext = YY_START;
 					  BEGIN(SkipCxxComment);
   					}
+<SkipInits>;	                        {
+  					  warn(yyFileName,yyLineNr,
+					      "Warning: Found ';' while parsing initializer list! "
+					      "(doxygen could be confused by a macro call without semicolon)"
+					     );
+					  BEGIN( FindMembers );
+  					}
 <SkipInits,SkipCurly,SkipCurlyCpp>.	{
   				          //addToBody(yytext);
   					}
diff --git a/src/sortdict.h b/src/sortdict.h
index be4652c..903fea3 100644
--- a/src/sortdict.h
+++ b/src/sortdict.h
@@ -74,7 +74,7 @@ class SList : public QList<T>
 {
   public:
     SList(SDict<T> *owner) : m_owner(owner) {}
-    ~SList() {}
+    virtual ~SList() {}
     int compareItems(GCI item1,GCI item2)
     {
       return m_owner->compareItems(item1,item2);
@@ -280,7 +280,7 @@ class SIntList : public QList<T>
 {
   public:
     SIntList(SIntDict<T> *owner) : m_owner(owner) {}
-    ~SIntList() {}
+    virtual ~SIntList() {}
     int compareItems(GCI item1,GCI item2)
     {
       return m_owner->compareItems(item1,item2);
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
index 1637044..8302eb5 100644
--- a/src/tagreader.cpp
+++ b/src/tagreader.cpp
@@ -186,6 +186,8 @@ class TagFileParser : public QXmlDefaultHandler
                                          m_endElementHandlers(17),
                                          m_tagName(tagName)
     {
+      m_startElementHandlers.setAutoDelete(TRUE);
+      m_endElementHandlers.setAutoDelete(TRUE);
     }
 
     void startCompound( const QXmlAttributes& attrib )
@@ -305,7 +307,8 @@ class TagFileParser : public QXmlDefaultHandler
 
     void endMember()
     {
-      m_state = *m_stateStack.pop();
+      m_state = *m_stateStack.top();
+      m_stateStack.remove();
       switch(m_state)
       {
         case InClass:     m_curClass->members.append(m_curMember); break;
@@ -884,6 +887,7 @@ void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members)
     me->args       = tmi->arglist;
     if (!me->args.isEmpty())
     {
+      delete me->argList;
       me->argList = new ArgumentList;
       stringToArgumentList(me->args,me->argList);
     }
@@ -1006,11 +1010,16 @@ void TagFileParser::buildLists(Entry *root)
     // transfer base class list
     if (tci->bases)
     {
+      delete ce->extends;
       ce->extends = tci->bases; tci->bases = 0;
     }
     if (tci->templateArguments)
     {
-      if (ce->tArgLists==0) ce->tArgLists = new QList<ArgumentList>;
+      if (ce->tArgLists==0) 
+      {
+        ce->tArgLists = new QList<ArgumentList>;
+        ce->tArgLists->setAutoDelete(TRUE);
+      }
       ArgumentList *al = new ArgumentList;
       ce->tArgLists->append(al);
       
diff --git a/src/treeview.h b/src/treeview.h
index 9cbcccd..aa65bfe 100644
--- a/src/treeview.h
+++ b/src/treeview.h
@@ -103,13 +103,20 @@
 " \n"
 "function hideFolder() \n"
 "{ \n"
-"  if (browserVersion == 1 || browserVersion == 3) { \n"
+"  if (browserVersion == 1 || browserVersion == 3) \n"
+"  { \n"
 "    if (this.navObj.style.display == \"none\") \n"
-"      return \n"
+"    {\n"
+"      return\n"
+"    }\n"
 "    this.navObj.style.display = \"none\" \n"
-"  } else { \n"
+"  } \n"
+"  else \n"
+"  { \n"
 "    if (this.navObj.visibility == \"hidden\") \n"
+"    {\n"
 "      return \n"
+"    }\n"
 "    this.navObj.visibility = \"hidden\" \n"
 "  } \n"
 "   \n"
@@ -118,11 +125,11 @@
 " \n"
 "function initializeFolder(level, lastNode, leftSide) \n"
 "{ \n"
-"var j=0 \n"
-"var i=0 \n"
-"var numberOfFolders \n"
-"var numberOfDocs \n"
-"var nc \n"
+"  var j=0 \n"
+"  var i=0 \n"
+"  var numberOfFolders \n"
+"  var numberOfDocs \n"
+"  var nc \n"
 "      \n"
 "  nc = this.nChildren \n"
 "   \n"
@@ -166,9 +173,12 @@
 " \n"
 "function drawFolder(leftSide) \n"
 "{ \n"
-"  if (browserVersion == 2) { \n"
-"    if (!doc.yPos) \n"
+"  if (browserVersion == 2) \n"
+"  { \n"
+"    if (!doc.yPos)\n"
+"    {\n"
 "      doc.yPos=8 \n"
+"    }\n"
 "    doc.write(\"<layer id='folder\" + this.id + \"' top=\" + doc.yPos + \" visibility=hidden>\") \n"
 "  } \n"
 "  if (browserVersion == 3) \n"
@@ -178,7 +188,9 @@
 "   \n"
 "  doc.write(\"\\n<table \") \n"
 "  if (browserVersion == 1) \n"
+"  {\n"
 "    doc.write(\" id='folder\" + this.id + \"' style='position:block;' \") \n"
+"  }\n"
 "  doc.write(\" border=0 cellspacing=0 cellpadding=0>\") \n"
 "  doc.write(\"\\n<tr><td>\") \n"
 "  doc.write(leftSide) \n"
@@ -192,7 +204,9 @@
 "    doc.write(this.desc + \"</a>\") \n"
 "  } \n"
 "  else \n"
+"  {\n"
 "    doc.write(this.desc) \n"
+"  }\n"
 "  if (this.tagName!=\"\")\n"
 "  {\n"
 "    doc.write(\" [external]\")\n"
@@ -200,23 +214,30 @@
 "  doc.write(\"</td>\")  \n"
 "  doc.write(\"\\n</table>\\n\") \n"
 "   \n"
-"  if (browserVersion == 2) { \n"
+"  if (browserVersion == 2) \n"
+"  { \n"
 "    doc.write(\"</layer>\") \n"
 "  } \n"
-"  if (browserVersion == 3) { \n"
+"  if (browserVersion == 3) \n"
+"  { \n"
 "    doc.write(\"</div>\") \n"
 "  } \n"
 " \n"
-"  if (browserVersion == 1) { \n"
+"  if (browserVersion == 1) \n"
+"  { \n"
 "    this.navObj = doc.all[\"folder\"+this.id] \n"
 "    this.iconImg = doc.all[\"folderIcon\"+this.id] \n"
 "    this.nodeImg = doc.all[\"nodeIcon\"+this.id] \n"
-"  } else if (browserVersion == 2) { \n"
+"  } \n"
+"  else if (browserVersion == 2) \n"
+"  { \n"
 "    this.navObj = doc.layers[\"folder\"+this.id] \n"
 "    this.iconImg = this.navObj.document.images[\"folderIcon\"+this.id] \n"
 "    this.nodeImg = this.navObj.document.images[\"nodeIcon\"+this.id] \n"
 "    doc.yPos=doc.yPos+this.navObj.clip.height \n"
-"  } else if (browserVersion == 3) {\n"
+"  } \n"
+"  else if (browserVersion == 3) \n"
+"  {\n"
 "    this.navObj = doc.getElementById(\"folder\"+this.id)\n"
 "    this.iconImg = doc.images.namedItem(\"folderIcon\"+this.id)\n"
 "    this.nodeImg = doc.images.namedItem(\"nodeIcon\"+this.id)\n"
@@ -303,6 +324,7 @@
 "  this.createIndex() \n"
 " \n"
 "  if (level>0) \n"
+"  {\n"
 "    if (lastNode) //the last 'brother' in the children array \n"
 "    { \n"
 "      this.renderOb(leftSide + \"<img src='ftv2lastnode.png' width=16 height=22>\") \n"
@@ -313,20 +335,29 @@
 "      this.renderOb(leftSide + \"<img src='ftv2node.png' width=16 height=22>\") \n"
 "      leftSide = leftSide + \"<img src='ftv2vertline.png' width=16 height=22>\" \n"
 "    } \n"
+"  }\n"
 "  else \n"
+"  {\n"
 "    this.renderOb(\"\")   \n"
+"  }\n"
 "} \n"
 " \n"
 "function drawItem(leftSide) \n"
 "{ \n"
-"  if (browserVersion == 2) \n"
-"    doc.write(\"<layer id='item\" + this.id + \"' top=\" + doc.yPos + \" visibility=hidden>\") \n"
-"  if (browserVersion == 3) \n"
-"    doc.write(\"<div id='item\" + this.id + \"' style='display:block;'>\") \n"
+"  if (browserVersion == 2)\n"
+"  {\n"
+"    doc.write(\"<layer id='item\" + this.id + \"' top=\" + doc.yPos + \" visibility=hidden>\")\n"
+"  }\n"
+"  else if (browserVersion == 3)\n"
+"  {\n"
+"    doc.write(\"<div id='item\" + this.id + \"' style='display:block;'>\")\n"
+"  }\n"
 "     \n"
 "  doc.write(\"\\n<table \") \n"
-"  if (browserVersion == 1) \n"
-"    doc.write(\" id='item\" + this.id + \"' style='position:block;' \") \n"
+"  if (browserVersion == 1)\n"
+"  {\n"
+"    doc.write(\" id='item\" + this.id + \"' style='position:block;' \")\n"
+"  }\n"
 "  doc.write(\" border=0 cellspacing=0 cellpadding=0>\\n\") \n"
 "  doc.write(\"<tr><td>\") \n"
 "  doc.write(leftSide) \n"
@@ -342,9 +373,13 @@
 "  } \n"
 "  doc.write(\"</td>\\n<td valign=middle nowrap>\") \n"
 "  if (USETEXTLINKS && this.link!=\"\") \n"
+"  {\n"
 "    doc.write(\"<a href=\" + this.link + \">\" + this.desc + \"</a>\") \n"
+"  }\n"
 "  else \n"
+"  {\n"
 "    doc.write(this.desc) \n"
+"  }\n"
 "  if (this.tagName!=\"\")\n"
 "  {\n"
 "    doc.write(\" [external]\");\n"
@@ -352,18 +387,27 @@
 "  doc.write(\"\\n</table>\\n\") \n"
 "   \n"
 "  if (browserVersion == 2) \n"
+"  {\n"
 "    doc.write(\"</layer>\") \n"
-"  if (browserVersion == 3) \n"
+"  }\n"
+"  else if (browserVersion == 3) \n"
+"  {\n"
 "    doc.write(\"</div>\")\n"
+"  }\n"
 " \n"
-"  if (browserVersion == 1) { \n"
+"  if (browserVersion == 1) \n"
+"  { \n"
 "    this.navObj = doc.all[\"item\"+this.id] \n"
 "    this.iconImg = doc.all[\"itemIcon\"+this.id] \n"
-"  } else if (browserVersion == 2) { \n"
+"  } \n"
+"  else if (browserVersion == 2) \n"
+"  { \n"
 "    this.navObj = doc.layers[\"item\"+this.id] \n"
 "    this.iconImg = this.navObj.document.images[\"itemIcon\"+this.id] \n"
 "    doc.yPos=doc.yPos+this.navObj.clip.height \n"
-"  } else if (browserVersion == 3) {\n"
+"  } \n"
+"  else if (browserVersion == 3) \n"
+"  {\n"
 "    this.navObj = doc.getElementById(\"item\"+this.id)\n"
 "    this.iconImg = doc.images.namedItem(\"itemIcon\"+this.id)\n"
 "  }\n"
@@ -376,9 +420,13 @@
 "function display() \n"
 "{ \n"
 "  if (browserVersion == 1 || browserVersion == 3) \n"
+"  {\n"
 "    this.navObj.style.display = \"block\" \n"
+"  }\n"
 "  else \n"
-"    this.navObj.visibility = \"show\" \n"
+"  {\n"
+"    this.navObj.visibility = \"show\"\n"
+"  }\n"
 "} \n"
 " \n"
 "function createEntryIndex() \n"
@@ -429,18 +477,49 @@
 "  clickedFolder.setState(!state) //open<->close  \n"
 "} \n"
 " \n"
+"function preLoadIcons() \n"
+"{\n"
+"  var auxImg\n"
+"  auxImg = new Image();\n"
+"  auxImg.src = \"ftv2blank.png\";\n"
+"  auxImg.src = \"ftv2doc.png\";\n"
+"  auxImg.src = \"ftv2folderclosed.png\";\n"
+"  auxImg.src = \"ftv2folderopen.png\";\n"
+"  auxImg.src = \"ftv2lastnode.png\";\n"
+"  auxImg.src = \"ftv2link.png\";\n"
+"  auxImg.src = \"ftv2mlastnode.png\";\n"
+"  auxImg.src = \"ftv2mnode.png\";\n"
+"  auxImg.src = \"ftv2node.png\";\n"
+"  auxImg.src = \"ftv2plastnode.png\";\n"
+"  auxImg.src = \"ftv2pnode.png\";\n"
+"  auxImg.src = \"ftv2vertline.png\";\n"
+"}\n"
+"\n"
 "function initializeDocument() \n"
 "{ \n"
-"  doc = document;\n"
-"  if (doc.all) \n"
-"    browserVersion = 1 //IE4   \n"
-"  else \n"
-"    if (doc.layers) \n"
-"      browserVersion = 2 //NS4 \n"
-"    else if(navigator.userAgent.toLowerCase().indexOf('gecko') != -1)\n"
-"        browserVersion = 3 //mozilla\n"
-"      else \n"
-"        browserVersion = 0 //other \n"
+"  preLoadIcons()\n"
+"\n"
+"  var ua = window.navigator.userAgent.toLowerCase();\n"
+"  if ((ua.indexOf('msie')!=-1) && (navigator.version>=4))\n"
+"  {\n"
+"    browserVersion = 1  // IE >= 4.x\n"
+"  }\n"
+"  else if (ua.indexOf('opera')!=-1)\n"
+"  {\n"
+"    browserVersion = 3; // Opera\n"
+"  }\n"
+"  else if (ua.indexOf('gecko')!=-1)\n"
+"  {\n"
+"    browserVersion = 3; // NS6 or Mozilla\n"
+"  }\n"
+"  else if (ua.indexOf('mozilla')!=-1)\n"
+"  {\n"
+"    browserVersion = 2; // NS4\n"
+"  }\n"
+"  else\n"
+"  {\n"
+"    browserVersion = 0; // unknown or old browser\n"
+"  }\n"
 "\n"
 "  foldersTree.initialize(0, 1, \"\") \n"
 "  foldersTree.display()\n"
@@ -460,6 +539,7 @@
 "// Auxiliary Functions for Folder-Treee backward compatibility \n"
 "// ********************************************************* \n"
 " \n"
+" \n"
 "function gFld(description, tagName, hreference) \n"
 "{ \n"
 "  folder = new Folder(description, tagName, hreference) \n"
@@ -492,9 +572,10 @@
 "// Global variables \n"
 "// **************** \n"
 " \n"
-"USETEXTLINKS = 1\n"
-"indexOfEntries = new Array \n"
-"nEntries = 0 \n"
-"doc = document \n"
-"browserVersion = 0 \n"
-"selectedFolder=0\n"
+"var USETEXTLINKS = 1\n"
+"var indexOfEntries = new Array \n"
+"var nEntries = 0 \n"
+"var doc = document \n"
+"var browserVersion = 0 \n"
+"var selectedFolder=0\n"
+"\n"
diff --git a/src/treeview.js b/src/treeview.js
index 6b5ef51..a9ff9b5 100644
--- a/src/treeview.js
+++ b/src/treeview.js
@@ -103,13 +103,20 @@ function propagateChangesInState(folder)
  
 function hideFolder() 
 { 
-  if (browserVersion == 1 || browserVersion == 3) { 
+  if (browserVersion == 1 || browserVersion == 3) 
+  { 
     if (this.navObj.style.display == "none") 
-      return 
+    {
+      return
+    }
     this.navObj.style.display = "none" 
-  } else { 
+  } 
+  else 
+  { 
     if (this.navObj.visibility == "hidden") 
+    {
       return 
+    }
     this.navObj.visibility = "hidden" 
   } 
    
@@ -118,11 +125,11 @@ function hideFolder()
  
 function initializeFolder(level, lastNode, leftSide) 
 { 
-var j=0 
-var i=0 
-var numberOfFolders 
-var numberOfDocs 
-var nc 
+  var j=0 
+  var i=0 
+  var numberOfFolders 
+  var numberOfDocs 
+  var nc 
       
   nc = this.nChildren 
    
@@ -166,9 +173,12 @@ var nc
  
 function drawFolder(leftSide) 
 { 
-  if (browserVersion == 2) { 
-    if (!doc.yPos) 
+  if (browserVersion == 2) 
+  { 
+    if (!doc.yPos)
+    {
       doc.yPos=8 
+    }
     doc.write("<layer id='folder" + this.id + "' top=" + doc.yPos + " visibility=hidden>") 
   } 
   if (browserVersion == 3) 
@@ -178,7 +188,9 @@ function drawFolder(leftSide)
    
   doc.write("\n<table ") 
   if (browserVersion == 1) 
+  {
     doc.write(" id='folder" + this.id + "' style='position:block;' ") 
+  }
   doc.write(" border=0 cellspacing=0 cellpadding=0>") 
   doc.write("\n<tr><td>") 
   doc.write(leftSide) 
@@ -192,7 +204,9 @@ function drawFolder(leftSide)
     doc.write(this.desc + "</a>") 
   } 
   else 
+  {
     doc.write(this.desc) 
+  }
   if (this.tagName!="")
   {
     doc.write(" [external]")
@@ -200,23 +214,30 @@ function drawFolder(leftSide)
   doc.write("</td>")  
   doc.write("\n</table>\n") 
    
-  if (browserVersion == 2) { 
+  if (browserVersion == 2) 
+  { 
     doc.write("</layer>") 
   } 
-  if (browserVersion == 3) { 
+  if (browserVersion == 3) 
+  { 
     doc.write("</div>") 
   } 
  
-  if (browserVersion == 1) { 
+  if (browserVersion == 1) 
+  { 
     this.navObj = doc.all["folder"+this.id] 
     this.iconImg = doc.all["folderIcon"+this.id] 
     this.nodeImg = doc.all["nodeIcon"+this.id] 
-  } else if (browserVersion == 2) { 
+  } 
+  else if (browserVersion == 2) 
+  { 
     this.navObj = doc.layers["folder"+this.id] 
     this.iconImg = this.navObj.document.images["folderIcon"+this.id] 
     this.nodeImg = this.navObj.document.images["nodeIcon"+this.id] 
     doc.yPos=doc.yPos+this.navObj.clip.height 
-  } else if (browserVersion == 3) {
+  } 
+  else if (browserVersion == 3) 
+  {
     this.navObj = doc.getElementById("folder"+this.id)
     this.iconImg = doc.images.namedItem("folderIcon"+this.id)
     this.nodeImg = doc.images.namedItem("nodeIcon"+this.id)
@@ -303,6 +324,7 @@ function initializeItem(level, lastNode, leftSide)
   this.createIndex() 
  
   if (level>0) 
+  {
     if (lastNode) //the last 'brother' in the children array 
     { 
       this.renderOb(leftSide + "<img src='ftv2lastnode.png' width=16 height=22>") 
@@ -313,20 +335,29 @@ function initializeItem(level, lastNode, leftSide)
       this.renderOb(leftSide + "<img src='ftv2node.png' width=16 height=22>") 
       leftSide = leftSide + "<img src='ftv2vertline.png' width=16 height=22>" 
     } 
+  }
   else 
+  {
     this.renderOb("")   
+  }
 } 
  
 function drawItem(leftSide) 
 { 
-  if (browserVersion == 2) 
-    doc.write("<layer id='item" + this.id + "' top=" + doc.yPos + " visibility=hidden>") 
-  if (browserVersion == 3) 
-    doc.write("<div id='item" + this.id + "' style='display:block;'>") 
+  if (browserVersion == 2)
+  {
+    doc.write("<layer id='item" + this.id + "' top=" + doc.yPos + " visibility=hidden>")
+  }
+  else if (browserVersion == 3)
+  {
+    doc.write("<div id='item" + this.id + "' style='display:block;'>")
+  }
      
   doc.write("\n<table ") 
-  if (browserVersion == 1) 
-    doc.write(" id='item" + this.id + "' style='position:block;' ") 
+  if (browserVersion == 1)
+  {
+    doc.write(" id='item" + this.id + "' style='position:block;' ")
+  }
   doc.write(" border=0 cellspacing=0 cellpadding=0>\n") 
   doc.write("<tr><td>") 
   doc.write(leftSide) 
@@ -342,9 +373,13 @@ function drawItem(leftSide)
   } 
   doc.write("</td>\n<td valign=middle nowrap>") 
   if (USETEXTLINKS && this.link!="") 
+  {
     doc.write("<a href=" + this.link + ">" + this.desc + "</a>") 
+  }
   else 
+  {
     doc.write(this.desc) 
+  }
   if (this.tagName!="")
   {
     doc.write(" [external]");
@@ -352,18 +387,27 @@ function drawItem(leftSide)
   doc.write("\n</table>\n") 
    
   if (browserVersion == 2) 
+  {
     doc.write("</layer>") 
-  if (browserVersion == 3) 
+  }
+  else if (browserVersion == 3) 
+  {
     doc.write("</div>")
+  }
  
-  if (browserVersion == 1) { 
+  if (browserVersion == 1) 
+  { 
     this.navObj = doc.all["item"+this.id] 
     this.iconImg = doc.all["itemIcon"+this.id] 
-  } else if (browserVersion == 2) { 
+  } 
+  else if (browserVersion == 2) 
+  { 
     this.navObj = doc.layers["item"+this.id] 
     this.iconImg = this.navObj.document.images["itemIcon"+this.id] 
     doc.yPos=doc.yPos+this.navObj.clip.height 
-  } else if (browserVersion == 3) {
+  } 
+  else if (browserVersion == 3) 
+  {
     this.navObj = doc.getElementById("item"+this.id)
     this.iconImg = doc.images.namedItem("itemIcon"+this.id)
   }
@@ -376,9 +420,13 @@ function drawItem(leftSide)
 function display() 
 { 
   if (browserVersion == 1 || browserVersion == 3) 
+  {
     this.navObj.style.display = "block" 
+  }
   else 
-    this.navObj.visibility = "show" 
+  {
+    this.navObj.visibility = "show"
+  }
 } 
  
 function createEntryIndex() 
@@ -429,18 +477,49 @@ function clickOnNode(folderId)
   clickedFolder.setState(!state) //open<->close  
 } 
  
+function preLoadIcons() 
+{
+  var auxImg
+  auxImg = new Image();
+  auxImg.src = "ftv2blank.png";
+  auxImg.src = "ftv2doc.png";
+  auxImg.src = "ftv2folderclosed.png";
+  auxImg.src = "ftv2folderopen.png";
+  auxImg.src = "ftv2lastnode.png";
+  auxImg.src = "ftv2link.png";
+  auxImg.src = "ftv2mlastnode.png";
+  auxImg.src = "ftv2mnode.png";
+  auxImg.src = "ftv2node.png";
+  auxImg.src = "ftv2plastnode.png";
+  auxImg.src = "ftv2pnode.png";
+  auxImg.src = "ftv2vertline.png";
+}
+
 function initializeDocument() 
 { 
-  doc = document;
-  if (doc.all) 
-    browserVersion = 1 //IE4   
-  else 
-    if (doc.layers) 
-      browserVersion = 2 //NS4 
-    else if(navigator.userAgent.toLowerCase().indexOf('gecko') != -1)
-        browserVersion = 3 //mozilla
-      else 
-        browserVersion = 0 //other 
+  preLoadIcons()
+
+  var ua = window.navigator.userAgent.toLowerCase();
+  if ((ua.indexOf('msie')!=-1) && (navigator.version>=4))
+  {
+    browserVersion = 1  // IE >= 4.x
+  }
+  else if (ua.indexOf('opera')!=-1)
+  {
+    browserVersion = 3; // Opera
+  }
+  else if (ua.indexOf('gecko')!=-1)
+  {
+    browserVersion = 3; // NS6 or Mozilla
+  }
+  else if (ua.indexOf('mozilla')!=-1)
+  {
+    browserVersion = 2; // NS4
+  }
+  else
+  {
+    browserVersion = 0; // unknown or old browser
+  }
 
   foldersTree.initialize(0, 1, "") 
   foldersTree.display()
@@ -460,6 +539,7 @@ function initializeDocument()
 // Auxiliary Functions for Folder-Treee backward compatibility 
 // ********************************************************* 
  
+ 
 function gFld(description, tagName, hreference) 
 { 
   folder = new Folder(description, tagName, hreference) 
@@ -492,9 +572,10 @@ function insDoc(parentFolder, document)
 // Global variables 
 // **************** 
  
-USETEXTLINKS = 1
-indexOfEntries = new Array 
-nEntries = 0 
-doc = document 
-browserVersion = 0 
-selectedFolder=0
+var USETEXTLINKS = 1
+var indexOfEntries = new Array 
+var nEntries = 0 
+var doc = document 
+var browserVersion = 0 
+var selectedFolder=0
+
diff --git a/src/util.cpp b/src/util.cpp
index 15e6e2e..b0b2244 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -766,6 +766,9 @@ void linkifyText(const TextGeneratorIntf &out,const char *scName,const char *nam
     //      );
     // check if `word' is a documented class name
     if (!word.isEmpty() && 
+        !(isdigit(word.at(0)) || word.at(0)=='-') && 
+                                // do not try to link digits 
+                                // (saves a lot of time for large arrays)
         !rightScopeMatch(word,searchName) && 
         !rightScopeMatch(scopeName,word)
        )
-- 
cgit v0.12

