From 583cc3299ac171f473e4221b0b535ea616e4db03 Mon Sep 17 00:00:00 2001
From: Dimitri van Heesch <dimitri@stack.nl>
Date: Sun, 7 Jan 2001 17:28:47 +0000
Subject: Release-1.2.4-20010107

---
 INSTALL                               |   4 +-
 LICENSE                               |   4 +-
 README                                |   4 +-
 VERSION                               |   2 +-
 addon/configgen/Makefile.in           |   2 +-
 addon/configgen/config_templ.h        |   2 +-
 addon/configgen/config_templ.l        |   2 +-
 addon/configgen/configgen.pro.in      |   2 +-
 addon/configgen/qtbc.h                |   2 +-
 addon/doxywizard/Makefile.in          |   2 +-
 addon/doxywizard/doxywizard.pro.in    |   2 +-
 addon/doxywizard/doxywizard_templ.cpp |   2 +-
 addon/doxywizard/doxywizard_templ.h   |   2 +-
 addon/doxywizard/inputbool.cpp        |   2 +-
 addon/doxywizard/inputbool.h          |   2 +-
 addon/doxywizard/inputint.cpp         |   2 +-
 addon/doxywizard/inputint.h           |   2 +-
 addon/doxywizard/inputstring.cpp      |   2 +-
 addon/doxywizard/inputstring.h        |   2 +-
 addon/doxywizard/inputstrlist.cpp     |   2 +-
 addon/doxywizard/inputstrlist.h       |   2 +-
 addon/doxywizard/pagewidget.cpp       |   2 +-
 addon/doxywizard/pagewidget.h         |   2 +-
 addon/doxywizard/pixmaps.cpp          |   2 +-
 addon/doxywizard/pixmaps.h            |   2 +-
 addon/xmlread/qtbc.h                  |   2 +-
 configure                             |   2 +-
 doc/Makefile.in                       |   2 +-
 doc/Makefile.latex                    |   2 +-
 doc/Makefile.win_make.in              |   2 +-
 doc/Makefile.win_nmake.in             |   2 +-
 doc/autolink.doc                      |   2 +-
 doc/commands.doc                      |   2 +-
 doc/config.doc                        |   9 +-
 doc/diagrams.doc                      |   2 +-
 doc/docblocks.doc                     |   2 +-
 doc/doxygen.sty                       |   6 +-
 doc/doxygen_manual.tex                |   4 +-
 doc/doxygen_usage.doc                 |   2 +-
 doc/doxysearch_usage.doc              |   2 +-
 doc/doxytag_usage.doc                 |   2 +-
 doc/doxywizard_usage.doc              |   2 +-
 doc/external.doc                      |   2 +-
 doc/faq.doc                           |   2 +-
 doc/features.doc                      |   2 +-
 doc/formulas.doc                      |   2 +-
 doc/grouping.doc                      |   2 +-
 doc/history.doc                       |   2 +-
 doc/htmlcmds.doc                      |   2 +-
 doc/index.doc                         |   4 +-
 doc/install.doc                       |   6 +-
 doc/installdox_usage.doc              |   2 +-
 doc/language.doc                      |   2 +-
 doc/output.doc                        |   2 +-
 doc/preprocessing.doc                 |   2 +-
 doc/starting.doc                      |   2 +-
 doc/todo.doc                          |   2 +-
 doc/trouble.doc                       |   2 +-
 packages/rpm/doxygen.spec             |   2 +-
 qtools/qdir.cpp                       |  29 +--
 qtools/qdir_win32.cpp                 |   2 +-
 qtools/qfeatures.h                    |  30 ++-
 qtools/qfile_win32.cpp                |   2 +-
 qtools/qfileinfo_win32.cpp            |   2 +-
 qtools/qglobal.cpp                    |  13 +-
 qtools/qglobal.h                      |  19 +-
 qtools/qstring.cpp                    |  10 +-
 qtools/qtextcodec.cpp                 |  93 ++++----
 qtools/qxml.cpp                       | 405 +++++++++++++++++++---------------
 qtools/qxml.h                         |  21 +-
 src/Makefile.in                       |   2 +-
 src/bufstr.h                          |  61 +++++
 src/classdef.cpp                      |  65 +++---
 src/classdef.h                        |   6 +-
 src/classlist.cpp                     |  29 +--
 src/classlist.h                       |   5 +-
 src/code.h                            |   2 +-
 src/code.l                            |   5 +-
 src/config.h                          |   2 +-
 src/config.l                          |   2 +-
 src/constexp.h                        |   2 +-
 src/constexp.l                        |   2 +-
 src/cppvalue.cpp                      |   2 +-
 src/cppvalue.h                        |   2 +-
 src/debug.cpp                         |   2 +-
 src/debug.h                           |   2 +-
 src/declinfo.h                        |   2 +-
 src/declinfo.l                        |  11 +-
 src/defargs.h                         |   2 +-
 src/defargs.l                         |   2 +-
 src/define.cpp                        |   2 +-
 src/define.h                          |   2 +-
 src/definition.cpp                    |   2 +-
 src/definition.h                      |   7 +-
 src/diagram.cpp                       |   2 +-
 src/diagram.h                         |   2 +-
 src/doc.h                             |   2 +-
 src/doc.l                             |  27 ++-
 src/dot.cpp                           |   2 +-
 src/dot.h                             |   2 +-
 src/doxygen.cpp                       | 108 +++++++--
 src/doxygen.h                         |  32 +--
 src/doxygen.pro.in                    |   6 +-
 src/doxygen.t                         |   2 +-
 src/doxysearch.cpp                    |   2 +-
 src/doxytag.l                         |   4 +-
 src/entry.cpp                         |   2 +-
 src/entry.h                           |  90 ++++----
 src/example.h                         |   2 +-
 src/filedef.cpp                       |   3 +-
 src/filedef.h                         |   8 +-
 src/filename.cpp                      |   2 +-
 src/filename.h                        |   2 +-
 src/formula.cpp                       |   2 +-
 src/formula.h                         |   2 +-
 src/gifenc.cpp                        |   2 +-
 src/gifenc.h                          |   2 +-
 src/groupdef.cpp                      |   2 +-
 src/groupdef.h                        |   2 +-
 src/htmlgen.cpp                       |  10 +-
 src/htmlgen.h                         |   2 +-
 src/htmlhelp.cpp                      |   2 +-
 src/htmlhelp.h                        |   2 +-
 src/image.cpp                         |   2 +-
 src/image.h                           |   2 +-
 src/index.cpp                         | 199 +++++++++++++++--
 src/index.h                           |   6 +-
 src/instdox.cpp                       |   2 +-
 src/instdox.h                         |   2 +-
 src/language.cpp                      |   2 +-
 src/language.h                        |   2 +-
 src/latexgen.cpp                      |  53 ++++-
 src/latexgen.h                        |   4 +-
 src/logos.cpp                         |   2 +-
 src/logos.h                           |   2 +-
 src/mangen.cpp                        |   2 +-
 src/mangen.h                          |   4 +-
 src/memberdef.cpp                     |  17 +-
 src/memberdef.h                       |   2 +-
 src/membergroup.cpp                   |   2 +-
 src/membergroup.h                     |   2 +-
 src/memberlist.cpp                    |   2 +-
 src/memberlist.h                      |   2 +-
 src/membername.cpp                    |   2 +-
 src/membername.h                      |   2 +-
 src/message.cpp                       |   2 +-
 src/message.h                         |   2 +-
 src/namespacedef.cpp                  |   2 +-
 src/namespacedef.h                    |   2 +-
 src/outputgen.cpp                     |   2 +-
 src/outputgen.h                       |   2 +-
 src/outputlist.cpp                    |   2 +-
 src/outputlist.h                      |   2 +-
 src/packagedef.cpp                    | 122 ++++++++++
 src/packagedef.h                      |  62 ++++++
 src/page.h                            |   2 +-
 src/pre.h                             |   2 +-
 src/pre.l                             |  66 +++---
 src/qtbc.h                            |   2 +-
 src/reflist.cpp                       |   2 +-
 src/reflist.h                         |   2 +-
 src/rtfgen.cpp                        |  42 +++-
 src/rtfgen.h                          |   2 +-
 src/scanner.h                         |   2 +-
 src/scanner.l                         | 110 +++++++--
 src/searchindex.cpp                   |   2 +-
 src/searchindex.h                     |   2 +-
 src/section.h                         |   2 +-
 src/sortdict.h                        |   2 +-
 src/suffixtree.cpp                    |   2 +-
 src/suffixtree.h                      |   2 +-
 src/tagreader.cpp                     |  11 +-
 src/tagreader.h                       |   2 +-
 src/translator.h                      |  42 +++-
 src/translator_cn.h                   |   2 +-
 src/translator_cz.h                   |   2 +-
 src/translator_de.h                   |   2 +-
 src/translator_es.h                   |   2 +-
 src/translator_fi.h                   |   2 +-
 src/translator_fr.h                   |   2 +-
 src/translator_hr.h                   |   2 +-
 src/translator_hu.h                   |   2 +-
 src/translator_it.h                   |   2 +-
 src/translator_jp.h                   |   2 +-
 src/translator_kr.h                   |   2 +-
 src/translator_nl.h                   |   2 +-
 src/translator_no.h                   |   2 +-
 src/translator_pl.h                   |   2 +-
 src/translator_pt.h                   |   2 +-
 src/translator_ro.h                   |   3 +-
 src/translator_se.h                   |   2 +-
 src/translator_si.h                   |   2 +-
 src/util.cpp                          |  32 ++-
 src/util.h                            |   2 +-
 src/version.h                         |   2 +-
 src/xml.cpp                           |   2 +-
 src/xml.h                             |   2 +-
 wintools/make.pl                      |   8 +-
 198 files changed, 1520 insertions(+), 697 deletions(-)
 create mode 100644 src/bufstr.h
 create mode 100644 src/packagedef.cpp
 create mode 100644 src/packagedef.h

diff --git a/INSTALL b/INSTALL
index 4973d7b..deffb53 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,6 +1,6 @@
-DOXYGEN Version 1.2.4
+DOXYGEN Version 1.2.4-20010107
 
 Please read the installation section of the manual for instructions.
 
 --------
-Dimitri van Heesch (24 December 2000)
+Dimitri van Heesch (07 January 2001)
diff --git a/LICENSE b/LICENSE
index 60549be..219ec28 100644
--- a/LICENSE
+++ b/LICENSE
@@ -291,7 +291,7 @@ convey the exclusion of warranty; and each file should have at least
 the "copyright" line and a pointer to where the full notice is found.
 
     <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) 19yy  <name of author>
+    Copyright (C) yyyy  <name of author>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -313,7 +313,7 @@ Also add information on how to contact you by electronic and paper mail.
 If the program is interactive, make it output a short notice like this
 when it starts in an interactive mode:
 
-    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision version 69, Copyright (C) yyyy name of author
     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
     This is free software, and you are welcome to redistribute it
     under certain conditions; type `show c' for details.
diff --git a/README b/README
index 644cf1d..941d958 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.2.4
+DOXYGEN Version 1.2.4-20010107
 
 Please read INSTALL for compilation instructions.
 
@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
 
 Enjoy,
 
-Dimitri van Heesch (24 December 2000)
+Dimitri van Heesch (07 January 2001)
diff --git a/VERSION b/VERSION
index e8ea05d..d8b8c4e 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.2.4
+1.2.4-20010107
diff --git a/addon/configgen/Makefile.in b/addon/configgen/Makefile.in
index 40aff7d..f5ad09a 100644
--- a/addon/configgen/Makefile.in
+++ b/addon/configgen/Makefile.in
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
+# Copyright (C) 1997-2001 by Dimitri van Heesch.
 # 
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/configgen/config_templ.h b/addon/configgen/config_templ.h
index 50b479b..cb26f9a 100644
--- a/addon/configgen/config_templ.h
+++ b/addon/configgen/config_templ.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/configgen/config_templ.l b/addon/configgen/config_templ.l
index f680911..770ad3d 100644
--- a/addon/configgen/config_templ.l
+++ b/addon/configgen/config_templ.l
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/configgen/configgen.pro.in b/addon/configgen/configgen.pro.in
index 26b9c51..12ddf92 100644
--- a/addon/configgen/configgen.pro.in
+++ b/addon/configgen/configgen.pro.in
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
+# Copyright (C) 1997-2001 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/configgen/qtbc.h b/addon/configgen/qtbc.h
index 570bf93..3bbdc7a 100644
--- a/addon/configgen/qtbc.h
+++ b/addon/configgen/qtbc.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/Makefile.in b/addon/doxywizard/Makefile.in
index fee009b..249190a 100644
--- a/addon/doxywizard/Makefile.in
+++ b/addon/doxywizard/Makefile.in
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
+# Copyright (C) 1997-2001 by Dimitri van Heesch.
 # 
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/doxywizard.pro.in b/addon/doxywizard/doxywizard.pro.in
index 3802d6f..b7a690f 100644
--- a/addon/doxywizard/doxywizard.pro.in
+++ b/addon/doxywizard/doxywizard.pro.in
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
+# Copyright (C) 1997-2001 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby
diff --git a/addon/doxywizard/doxywizard_templ.cpp b/addon/doxywizard/doxywizard_templ.cpp
index 4ba932a..cafec21 100644
--- a/addon/doxywizard/doxywizard_templ.cpp
+++ b/addon/doxywizard/doxywizard_templ.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/doxywizard_templ.h b/addon/doxywizard/doxywizard_templ.h
index 9df50bf..92e35e1 100644
--- a/addon/doxywizard/doxywizard_templ.h
+++ b/addon/doxywizard/doxywizard_templ.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/inputbool.cpp b/addon/doxywizard/inputbool.cpp
index b0db14b..c63696a 100644
--- a/addon/doxywizard/inputbool.cpp
+++ b/addon/doxywizard/inputbool.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/inputbool.h b/addon/doxywizard/inputbool.h
index 9102be7..2bd8d7a 100644
--- a/addon/doxywizard/inputbool.h
+++ b/addon/doxywizard/inputbool.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/inputint.cpp b/addon/doxywizard/inputint.cpp
index 54d7d02..702988c 100644
--- a/addon/doxywizard/inputint.cpp
+++ b/addon/doxywizard/inputint.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/inputint.h b/addon/doxywizard/inputint.h
index ad6d2de..434cb39 100644
--- a/addon/doxywizard/inputint.h
+++ b/addon/doxywizard/inputint.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/inputstring.cpp b/addon/doxywizard/inputstring.cpp
index 2895a18..a20ba68 100644
--- a/addon/doxywizard/inputstring.cpp
+++ b/addon/doxywizard/inputstring.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/inputstring.h b/addon/doxywizard/inputstring.h
index 5928b80..e1b42cf 100644
--- a/addon/doxywizard/inputstring.h
+++ b/addon/doxywizard/inputstring.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/inputstrlist.cpp b/addon/doxywizard/inputstrlist.cpp
index 60bc4bf..9ab9a5b 100644
--- a/addon/doxywizard/inputstrlist.cpp
+++ b/addon/doxywizard/inputstrlist.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/inputstrlist.h b/addon/doxywizard/inputstrlist.h
index 496aeed..3bf6371 100644
--- a/addon/doxywizard/inputstrlist.h
+++ b/addon/doxywizard/inputstrlist.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/pagewidget.cpp b/addon/doxywizard/pagewidget.cpp
index 8323029..7e6920b 100644
--- a/addon/doxywizard/pagewidget.cpp
+++ b/addon/doxywizard/pagewidget.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/pagewidget.h b/addon/doxywizard/pagewidget.h
index 1f188ad..6d238df 100644
--- a/addon/doxywizard/pagewidget.h
+++ b/addon/doxywizard/pagewidget.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/pixmaps.cpp b/addon/doxywizard/pixmaps.cpp
index 6ae7f60..5f2497b 100644
--- a/addon/doxywizard/pixmaps.cpp
+++ b/addon/doxywizard/pixmaps.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/doxywizard/pixmaps.h b/addon/doxywizard/pixmaps.h
index b95b75f..7ec854e 100644
--- a/addon/doxywizard/pixmaps.h
+++ b/addon/doxywizard/pixmaps.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/addon/xmlread/qtbc.h b/addon/xmlread/qtbc.h
index 0091717..51f62dd 100644
--- a/addon/xmlread/qtbc.h
+++ b/addon/xmlread/qtbc.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/configure b/configure
index c8a79f0..4770f3d 100755
--- a/configure
+++ b/configure
@@ -2,7 +2,7 @@
 #
 # $Id$
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
+# Copyright (C) 1997-2001 by Dimitri van Heesch.
 # 
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/Makefile.in b/doc/Makefile.in
index eca81ee..b3186ac 100644
--- a/doc/Makefile.in
+++ b/doc/Makefile.in
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
+# Copyright (C) 1997-2001 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/Makefile.latex b/doc/Makefile.latex
index 63b77b4..43489ce 100644
--- a/doc/Makefile.latex
+++ b/doc/Makefile.latex
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
+# Copyright (C) 1997-2001 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/Makefile.win_make.in b/doc/Makefile.win_make.in
index 8d8c0c6..b1a2009 100644
--- a/doc/Makefile.win_make.in
+++ b/doc/Makefile.win_make.in
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
+# Copyright (C) 1997-2001 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/Makefile.win_nmake.in b/doc/Makefile.win_nmake.in
index 0e7624d..07ea0d0 100644
--- a/doc/Makefile.win_nmake.in
+++ b/doc/Makefile.win_nmake.in
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
+# Copyright (C) 1997-2001 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/autolink.doc b/doc/autolink.doc
index 2c18ee1..5b69020 100644
--- a/doc/autolink.doc
+++ b/doc/autolink.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/commands.doc b/doc/commands.doc
index 78ba52f..5a6bb82 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/config.doc b/doc/config.doc
index 684710f..653d9a9 100644
--- a/doc/config.doc
+++ b/doc/config.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -1002,9 +1002,10 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
  have to be run to correct the links.
 
  \par Note:
-  Each tag file most have a unique name and if a tag file is not located
-  in the directory in which doxygen is run, you must also specify the
-  path to the tagfile here.
+  Each tag file must have a unique name 
+  (where the name does \e not include the path)
+  If a tag file is not located in the directory in which doxygen 
+  is run, you must also specify the path to the tagfile here.
 
 \anchor cfg_generate_tagfile
 <dt>\c GENERATE_TAGFILE <dd>
diff --git a/doc/diagrams.doc b/doc/diagrams.doc
index 7fd3251..2153f16 100644
--- a/doc/diagrams.doc
+++ b/doc/diagrams.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/docblocks.doc b/doc/docblocks.doc
index 8241c43..95d13b5 100644
--- a/doc/docblocks.doc
+++ b/doc/docblocks.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/doxygen.sty b/doc/doxygen.sty
index 2aa736d..86ee4ca 100644
--- a/doc/doxygen.sty
+++ b/doc/doxygen.sty
@@ -1,7 +1,7 @@
 %
 % 
 %
-% Copyright (C) 1997-2000 by Dimitri van Heesch.
+% Copyright (C) 1997-2001 by Dimitri van Heesch.
 %
 % Permission to use, copy, modify, and distribute this software and its
 % documentation under the terms of the GNU General Public License is hereby 
@@ -24,8 +24,8 @@
         {\fancyplain{}{\bfseries\rightmark}}
 \rhead[\fancyplain{}{\bfseries\leftmark}]
         {\fancyplain{}{\bfseries\thepage}}
-\rfoot[\fancyplain{}{\bfseries\scriptsize User Manual for Doxygen $VERSION, written by Dimitri van Heesch \copyright 1997-2000}]{}
-\lfoot[]{\fancyplain{}{\bfseries\scriptsize User Manual for Doxygen $VERSION, written by Dimitri van Heesch \copyright 1997-2000}}
+\rfoot[\fancyplain{}{\bfseries\scriptsize User Manual for Doxygen $VERSION, written by Dimitri van Heesch \copyright 1997-2001}]{}
+\lfoot[]{\fancyplain{}{\bfseries\scriptsize User Manual for Doxygen $VERSION, written by Dimitri van Heesch \copyright 1997-2001}}
 \cfoot{}
 \newenvironment{CompactList}
 {\begin{list}{}{
diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex
index c86184a..be93b99 100644
--- a/doc/doxygen_manual.tex
+++ b/doc/doxygen_manual.tex
@@ -1,7 +1,7 @@
 %
 % 
 %
-% Copyright (C) 1997-2000 by Dimitri van Heesch.
+% Copyright (C) 1997-2001 by Dimitri van Heesch.
 %
 % Permission to use, copy, modify, and distribute this software and its
 % documentation under the terms of the GNU General Public License is hereby 
@@ -35,7 +35,7 @@
 \begin{center}
 Manual for version $VERSION\\[2ex]
 Written by Dimitri van Heesch\\[2ex]
-\copyright 1997-2000
+\copyright 1997-2001
 \end{center}
 \end{titlepage}
 \clearemptydoublepage
diff --git a/doc/doxygen_usage.doc b/doc/doxygen_usage.doc
index d8f4d2f..5796896 100644
--- a/doc/doxygen_usage.doc
+++ b/doc/doxygen_usage.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/doxysearch_usage.doc b/doc/doxysearch_usage.doc
index 477d2d8..fe5f8f8 100644
--- a/doc/doxysearch_usage.doc
+++ b/doc/doxysearch_usage.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/doxytag_usage.doc b/doc/doxytag_usage.doc
index 079e1b7..506dc5f 100644
--- a/doc/doxytag_usage.doc
+++ b/doc/doxytag_usage.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/doxywizard_usage.doc b/doc/doxywizard_usage.doc
index 59c7227..5c17add 100644
--- a/doc/doxywizard_usage.doc
+++ b/doc/doxywizard_usage.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/external.doc b/doc/external.doc
index 640768a..d8f4285 100644
--- a/doc/external.doc
+++ b/doc/external.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/faq.doc b/doc/faq.doc
index 6464c0b..5f38837 100644
--- a/doc/faq.doc
+++ b/doc/faq.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/features.doc b/doc/features.doc
index 1fe463f..3c035a0 100644
--- a/doc/features.doc
+++ b/doc/features.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/formulas.doc b/doc/formulas.doc
index 347731b..bd1aa22 100644
--- a/doc/formulas.doc
+++ b/doc/formulas.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/grouping.doc b/doc/grouping.doc
index a09cda0..71a8e37 100644
--- a/doc/grouping.doc
+++ b/doc/grouping.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/history.doc b/doc/history.doc
index ddded0a..eb5f2f1 100644
--- a/doc/history.doc
+++ b/doc/history.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/htmlcmds.doc b/doc/htmlcmds.doc
index b835c37..3a5177b 100644
--- a/doc/htmlcmds.doc
+++ b/doc/htmlcmds.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/index.doc b/doc/index.doc
index 86e10bb..e116ab9 100644
--- a/doc/index.doc
+++ b/doc/index.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -29,7 +29,7 @@ Version: $(VERSION)
 \addindex license
 \addindex GPL
 
-Copyright &copy; 1997-2000 by 
+Copyright &copy; 1997-2001 by 
 <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>.<p>
 
 Permission to use, copy, modify, and distribute this software and its
diff --git a/doc/install.doc b/doc/install.doc
index 8a2ac19..fe05177 100644
--- a/doc/install.doc
+++ b/doc/install.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -455,6 +455,10 @@ Compilation is now done by performing the following steps:
     <code>doxysearch.exe</code> using Microsoft's Visual C++ compiler
     (The compiler should not produce any serious warnings or errors).
 
+    You can use also the <code>bcc</code> argument to build
+    executables using the Borland C++ compiler, or
+    <code>mingw</code> argument to compile using GNU gcc.
+
 <li>To build the examples, go to the <code>examples</code> subdirectory
     and type:
 
diff --git a/doc/installdox_usage.doc b/doc/installdox_usage.doc
index a344b53..1662a10 100644
--- a/doc/installdox_usage.doc
+++ b/doc/installdox_usage.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/language.doc b/doc/language.doc
index 8a6fcf6..68871e2 100644
--- a/doc/language.doc
+++ b/doc/language.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/output.doc b/doc/output.doc
index 48d282f..1c6508f 100644
--- a/doc/output.doc
+++ b/doc/output.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/preprocessing.doc b/doc/preprocessing.doc
index 2300525..9eb5f6c 100644
--- a/doc/preprocessing.doc
+++ b/doc/preprocessing.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/starting.doc b/doc/starting.doc
index 70dfc50..852ff70 100644
--- a/doc/starting.doc
+++ b/doc/starting.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/todo.doc b/doc/todo.doc
index 7003ca0..5ab9df0 100644
--- a/doc/todo.doc
+++ b/doc/todo.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/doc/trouble.doc b/doc/trouble.doc
index 6e7be24..9aaf44b 100644
--- a/doc/trouble.doc
+++ b/doc/trouble.doc
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
index 77ffff3..1d211ad 100644
--- a/packages/rpm/doxygen.spec
+++ b/packages/rpm/doxygen.spec
@@ -1,5 +1,5 @@
 Name: doxygen
-Version: 1.2.4
+Version: 1.2.4-20010107
 Summary: documentation system for C, C++ and IDL
 Release: 1
 Source0: doxygen-%{version}.src.tar.gz
diff --git a/qtools/qdir.cpp b/qtools/qdir.cpp
index 185933a..ed7ed99 100644
--- a/qtools/qdir.cpp
+++ b/qtools/qdir.cpp
@@ -1012,14 +1012,10 @@ QStringList qt_makeFilterList( const QString &filter )
     if ( filter.isEmpty() )
 	return QStringList();
 
-    int i = filter.find( ' ', 0 );
-    QChar sep( ' ' );
-    if ( i == -1 ) {
-	if ( filter.find( ';', 0 ) != -1 ) {
-	    sep = QChar( ';' );
-	    i = filter.find( sep, 0 );
-	}
-    }
+    QChar sep( ';' );
+    int i = filter.find( sep, 0 );
+    if ( i == -1 && filter.find( ' ', 0 ) != -1 )
+	sep = QChar( ' ' );
 
     QStringList lst = QStringList::split( sep, filter );
     QStringList lst2;
@@ -1027,22 +1023,7 @@ QStringList qt_makeFilterList( const QString &filter )
 
     for ( ; it != lst.end(); ++it ) {
 	QString s = *it;
-	if ( s[ (int)s.length() - 1 ] == ';' )
-	    s.remove( s.length() - 1, 1 );
-	if ( s[0] == '\"' ) {
-	    s.remove( 0, 1 );
-	    while( ++it != lst.end() ) {
-		QString s2 = *it;
-		s += " "+s2;
-		if ( s2[(int)s2.length() -1] == '\"' ) {
-		    s.remove( s.length() -1, 1 );
-		    break;
-		}
-	    }
-	}
-	lst2 << s;
-	if ( it == lst.end() )
-	    break;
+	lst2 << s.stripWhiteSpace();
     }
     return lst2;
 }
diff --git a/qtools/qdir_win32.cpp b/qtools/qdir_win32.cpp
index 70c3563..b1eee66 100644
--- a/qtools/qdir_win32.cpp
+++ b/qtools/qdir_win32.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/qtools/qfeatures.h b/qtools/qfeatures.h
index e2e356c..84fa715 100644
--- a/qtools/qfeatures.h
+++ b/qtools/qfeatures.h
@@ -52,8 +52,6 @@
 //
 #if defined(QCONFIG_LOCAL)
 #include <qconfig-local.h>
-#elif defined(QCONFIG_QPE)
-#include <qconfig-qpe.h>
 #elif defined(QCONFIG_MINIMAL)
 #include <qconfig-minimal.h>
 #elif defined(QCONFIG_SMALL)
@@ -367,15 +365,23 @@
     Transformed frame buffer
 */
 //#define QT_NO_QWS_TRANSFORMED
+#if defined(QT_NO_NETWORK)
 /*!
     Remote frame buffer (VNC)
 */
-#define QT_NO_QWS_VNC
+# ifndef QT_NO_QWS_VNC
+#  define QT_NO_QWS_VNC
+# endif
+#endif
 /*!
     1-bit monochrome
 */
 //#define QT_NO_QWS_DEPTH_1
 /*!
+    4-bit greyscale
+*/
+//#define QT_NO_QWS_DEPTH_4
+/*!
     4-bit VGA
 */
 //#define QT_NO_QWS_VGA_16
@@ -397,16 +403,32 @@
 */
 //#define QT_NO_QWS_DEPTH_16
 /*!
+    24-bit color
+*/
+//#define QT_NO_QWS_DEPTH_24
+/*!
     32-bit color
 */
 //#define QT_NO_QWS_DEPTH_32
 
 /*!
-    Window manager
+    Window Manager
 */
 //#define QT_NO_QWS_MANAGER
 
 /*!
+    Window Manager Styles
+*/
+#define QT_NO_QWS_KDE2_WM_STYLE
+#if defined( QT_NO_QWS_MANAGER ) || defined( QT_NO_IMAGEIO_XPM )
+# define QT_NO_QWS_AQUA_WM_STYLE
+# define QT_NO_QWS_BEOS_WM_STYLE
+# define QT_NO_QWS_KDE_WM_STYLE
+# define QT_NO_QWS_QPE_WM_STYLE
+# define QT_NO_QWS_WINDOWS_WM_STYLE
+#endif
+
+/*!
     Saving of fonts
 */
 //#define QT_NO_QWS_SAVEFONTS
diff --git a/qtools/qfile_win32.cpp b/qtools/qfile_win32.cpp
index 5272365..fd28d43 100644
--- a/qtools/qfile_win32.cpp
+++ b/qtools/qfile_win32.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/qtools/qfileinfo_win32.cpp b/qtools/qfileinfo_win32.cpp
index 47b8491..bfcc6ac 100644
--- a/qtools/qfileinfo_win32.cpp
+++ b/qtools/qfileinfo_win32.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/qtools/qglobal.cpp b/qtools/qglobal.cpp
index 2789e30..50f5202 100644
--- a/qtools/qglobal.cpp
+++ b/qtools/qglobal.cpp
@@ -589,8 +589,12 @@ void qObsolete(	 const char *obj, const char *oldfunc, const char *newfunc )
 	return;
     if ( !firstObsoleteWarning(obj, oldfunc) )
 	return;
-    qDebug( "%s::%s: This function is obsolete, use %s instead",
-	   obj, oldfunc, newfunc );
+    if ( obj )
+	qDebug( "%s::%s: This function is obsolete, use %s instead.",
+	       obj, oldfunc, newfunc );
+    else
+	qDebug( "%s: This function is obsolete, use %s instead.",
+	       oldfunc, newfunc );
 }
 
 void qObsolete(	 const char *obj, const char *oldfunc )
@@ -599,7 +603,10 @@ void qObsolete(	 const char *obj, const char *oldfunc )
 	return;
     if ( !firstObsoleteWarning(obj, oldfunc) )
 	return;
-    qDebug( "%s::%s: This function is obsolete.", obj, oldfunc );
+    if ( obj )
+	qDebug( "%s::%s: This function is obsolete.", obj, oldfunc );
+    else
+	qDebug( "%s: This function is obsolete.", oldfunc );
 }
 
 void qObsolete(	 const char *message )
diff --git a/qtools/qglobal.h b/qtools/qglobal.h
index c58e466..9c2b53e 100644
--- a/qtools/qglobal.h
+++ b/qtools/qglobal.h
@@ -39,8 +39,8 @@
 #define QGLOBAL_H
 
 
-#define QT_VERSION	222
-#define QT_VERSION_STR	"2.2.2"
+#define QT_VERSION	223
+#define QT_VERSION_STR	"2.2.3"
 
 
 //
@@ -198,10 +198,6 @@
 #if __GNUC__ == 2 && __GNUC_MINOR__ >= 95
 #define Q_DELETING_VOID_UNDEFINED
 #endif
-#if __GNUC__ == 2 && __GNUC_MINOR__ >= 96
-#define Q_DELETING_VOID_UNDEFINED
-#define Q_FP_CCAST_BROKEN
-#endif
 #if (defined(__arm__) || defined(__ARMEL__)) && !defined(QT_MOC_CPP)
 #define Q_PACKED __attribute__ ((packed))
 #endif
@@ -224,6 +220,11 @@
 #ifdef __EDG__ // UnixWare7
 #define Q_HAS_BOOL_TYPE
 #endif
+#elif defined(__DECCXX)
+#define _CC_DEC_
+#if __DECCXX_VER >= 60060005
+#define Q_HAS_BOOL_TYPE
+#endif
 #elif defined(__EDG) || defined(__EDG__)
 // one observed on SGI DCC, the other documented
 #define _CC_EDG_
@@ -236,14 +237,8 @@
 #define _CC_SUN_
 #if __SUNPRO_CC >= 0x500
 #define Q_HAS_BOOL_TYPE
-#define Q_FP_CCAST_BROKEN
 #define Q_C_CALLBACKS
 #endif
-#elif defined(__DECCXX)
-#define _CC_DEC_
-#if __DECCXX_VER >= 60060005
-#define Q_HAS_BOOL_TYPE
-#endif
 #elif defined(__CDS__)
 #define _CC_CDS_
 #define Q_HAS_BOOL_TYPE
diff --git a/qtools/qstring.cpp b/qtools/qstring.cpp
index 85962b2..e13ffc8 100644
--- a/qtools/qstring.cpp
+++ b/qtools/qstring.cpp
@@ -13928,8 +13928,14 @@ uint QString::toUInt( bool *ok, int base ) const
 double QString::toDouble( bool *ok ) const
 {
     char *end;
-    const char *a = latin1();
-    double val = strtod( a ? a : "", &end );
+
+    QCString a = latin1();
+    // Just latin1() is not sufficient, since U0131 would look like '1'.
+    for (uint i=0; i<d->len; i++)
+	if ( d->unicode[i].row() )
+	    a[(int)i]='z';
+
+    double val = strtod( a.data() ? a.data() : "", &end );
     if ( ok )
 	*ok = ( a && *a && ( end == 0 || *end == '\0' ) );
     return val;
diff --git a/qtools/qtextcodec.cpp b/qtools/qtextcodec.cpp
index 9f94cb6..cdecfce 100644
--- a/qtools/qtextcodec.cpp
+++ b/qtools/qtextcodec.cpp
@@ -802,7 +802,10 @@ QCString QTextCodec::fromUnicode(const QString& uc) const
 */
 QString QTextCodec::toUnicode(const QByteArray& a, int len) const
 {
-    return toUnicode(a.data(),len);
+    int l = a.size();
+    if( l > 0 && a.data()[l - 1] == '\0' ) l--;
+    l = QMIN( l, len );
+    return toUnicode( a.data(), l );
 }
 
 /*!
@@ -810,7 +813,9 @@ QString QTextCodec::toUnicode(const QByteArray& a, int len) const
 */
 QString QTextCodec::toUnicode(const QByteArray& a) const
 {
-    return toUnicode(a.data(),a.size());
+    int l = a.size();
+    if( l > 0 && a.data()[l - 1] == '\0' ) l--;
+    return toUnicode( a.data(), l );
 }
 
 /*!
@@ -976,13 +981,16 @@ public:
         const int maxlen=100;
         char line[maxlen];
         char esc='\\';
+        char comm='%';
         bool incmap = FALSE;
         while (iod->readLine(line,maxlen) > 0) {
             if (0==qstrnicmp(line,"<code_set_name>",15))
                 n = line+15;
-            else if (0==qstrnicmp(line,"<escape_char>",13))
+            else if (0==qstrnicmp(line,"<escape_char> ",14))
                 esc = line[14];
-            else if (0==qstrnicmp(line,"% alias ",8)) {
+            else if (0==qstrnicmp(line,"<comment_char> ",15))
+                comm = line[15];
+            else if (line[0]==comm && 0==qstrnicmp(line+1," alias ",7)) {
                 aliases.append(line+8);
             } else if (0==qstrnicmp(line,"CHARMAP",7)) {
                 if (!from_unicode_page) {
@@ -1004,45 +1012,54 @@ public:
                 char mb[maxmb+1];
                 int nmb=0;
 
-                while (*cursor && *cursor!=' ')
-                    cursor++;
-                while (*cursor && *cursor!=esc)
-                    cursor++;
-                byte = getByte(cursor);
-
-                if ( *cursor == esc ) {
-                    if ( !to_unicode_multibyte ) {
-                        to_unicode_multibyte = new QMultiByteUnicodeTable[256];
-                        for (int i=0; i<256; i++) {
-                            to_unicode_multibyte[i].unicode = to_unicode[i];
-                            to_unicode_multibyte[i].multibyte = 0;
-                        }
-                        delete [] to_unicode;
-                        to_unicode = 0;
-                    }
-                    QMultiByteUnicodeTable* mbut = to_unicode_multibyte+byte;
-                    mb[nmb++] = byte;
-                    while ( nmb < maxmb && *cursor == esc ) {
-                        // Always at least once
+                while (*cursor) {
+                    if (cursor[0]=='<' && cursor[1]=='U' &&
+                        cursor[2]>='0' && cursor[2]<='9' &&
+                        cursor[3]>='0' && cursor[3]<='9') {
+
+                        unicode = strtol(cursor+2,&cursor,16);
+
+                    } else if (*cursor==esc) {
 
-                        mbut->unicode = CHAINED;
                         byte = getByte(cursor);
-                        mb[nmb++] = byte;
-                        if (!mbut->multibyte) {
-                            mbut->multibyte =
-                                new QMultiByteUnicodeTable[256];
+
+                        if ( *cursor == esc ) {
+                            if ( !to_unicode_multibyte ) {
+                                to_unicode_multibyte =
+                                    new QMultiByteUnicodeTable[256];
+                                for (int i=0; i<256; i++) {
+                                    to_unicode_multibyte[i].unicode =
+                                        to_unicode[i];
+                                    to_unicode_multibyte[i].multibyte = 0;
+                                }
+                                delete [] to_unicode;
+                                to_unicode = 0;
+                            }
+                            QMultiByteUnicodeTable* mbut =
+                                to_unicode_multibyte+byte;
+                            mb[nmb++] = byte;
+                            while ( nmb < maxmb && *cursor == esc ) {
+                                // Always at least once
+
+                                mbut->unicode = CHAINED;
+                                byte = getByte(cursor);
+                                mb[nmb++] = byte;
+                                if (!mbut->multibyte) {
+                                    mbut->multibyte =
+                                        new QMultiByteUnicodeTable[256];
+                                }
+                                mbut = mbut->multibyte+byte;
+                                mb_unicode = & mbut->unicode;
+                            }
+
+                            if ( nmb > max_bytes_per_char )
+                                max_bytes_per_char = nmb;
                         }
-                        mbut = mbut->multibyte+byte;
-                        mb_unicode = & mbut->unicode;
+                    } else {
+                        cursor++;
                     }
-
-                    if ( nmb > max_bytes_per_char )
-                        max_bytes_per_char = nmb;
                 }
-                while (*cursor && (*cursor!='<' || cursor[1]!='U'))
-                    cursor++;
-                if ( *cursor )
-                    unicode = strtol(cursor+2,&cursor,16);
+
                 if (unicode >= 0 && unicode <= 0xffff)
                 {
                     QChar ch((ushort)unicode);
diff --git a/qtools/qxml.cpp b/qtools/qxml.cpp
index d171828..11a9b01 100644
--- a/qtools/qxml.cpp
+++ b/qtools/qxml.cpp
@@ -35,6 +35,7 @@
 **
 **********************************************************************/
 
+#define QT_XML_CPP
 #include "qxml.h"
 #include "qtextcodec.h"
 #include "qbuffer.h"
@@ -80,7 +81,7 @@
 #define XMLERR_EDECLORSDDECLEXPECTED      "EDecl or SDDecl expected while reading the XML declaration"
 #define XMLERR_SDDECLEXPECTED             "SDDecl expected while reading the XML declaration"
 #define XMLERR_WRONGVALUEFORSDECL         "wrong value for standalone declaration"
-#define XMLERR_UNPARSEDENTITYREFERENCE    "unparsed entity reference"
+#define XMLERR_UNPARSEDENTITYREFERENCE    "unparsed entity reference in wrong context"
 #define XMLERR_INTERNALGENERALENTITYINDTD "internal general entity reference not allowed in DTD"
 #define XMLERR_EXTERNALGENERALENTITYINDTD "external parsed general entity reference not allowed in DTD"
 #define XMLERR_EXTERNALGENERALENTITYINAV  "external parsed general entity reference not allowed in attribute value"
@@ -2733,13 +2734,14 @@ bool QXmlSimpleReader::parseContent()
 		next();
 		break;
 	    case Ref:
-		// reference may be CharData; so clear string to be safe
 		if ( !charDataRead) {
-		    charDataRead = TRUE;
+		    // reference may be CharData; so clear string to be safe
 		    stringClear();
+		    parseOk = parseReference( charDataRead, InContent );
+		} else {
+		    bool tmp;
+		    parseOk = parseReference( tmp, InContent );
 		}
-		// parse reference
-		parseOk = parseReference( charDataRead, InContent );
 		break;
 	    case Lt:
 		// call the handler for CharData
@@ -2977,6 +2979,12 @@ bool QXmlSimpleReader::parseMisc()
 		    d->error = XMLERR_ERRORPARSINGPI;
 		    goto parseError;
 		}
+		if ( contentHnd ) {
+		    if ( !contentHnd->processingInstruction(name(),string()) ) {
+			d->error = contentHnd->errorString();
+			goto parseError;
+		    }
+		}
 		return TRUE;
 	    case Comment2:
 		if ( !parseOk ) {
@@ -3241,8 +3249,8 @@ parseError:
 bool QXmlSimpleReader::parseDoctype()
 {
     // some init-stuff
-    d->systemId = "";
-    d->publicId = "";
+    d->systemId = QString::null;
+    d->publicId = QString::null;
 
     const signed char Init             =  0;
     const signed char Doctype          =  1; // read the doctype
@@ -3420,8 +3428,8 @@ parseError:
 bool QXmlSimpleReader::parseExternalID( bool allowPublicID )
 {
     // some init-stuff
-    d->systemId = "";
-    d->publicId = "";
+    d->systemId = QString::null;
+    d->publicId = QString::null;
 
     const signed char Init             =  0;
     const signed char Sys              =  1; // parse 'SYSTEM'
@@ -3687,6 +3695,12 @@ bool QXmlSimpleReader::parseMarkupdecl()
 		    d->error = XMLERR_ERRORPARSINGPI;
 		    goto parseError;
 		}
+		if ( contentHnd ) {
+		    if ( !contentHnd->processingInstruction(name(),string()) ) {
+			d->error = contentHnd->errorString();
+			goto parseError;
+		    }
+		}
 		return TRUE;
 	    case Dash:
 		if ( !parseOk ) {
@@ -3812,13 +3826,13 @@ bool QXmlSimpleReader::parsePEReference( EntityRecognitionContext context )
 			}
 		    }
 		} else {
-		    if        ( context == InEntityValue ) {
+		    if ( context == InEntityValue ) {
 			// Included in literal
 			xmlRef = d->parameterEntities.find( ref() )
 			    .data().replace( QRegExp("\""), "&quot;" ).replace( QRegExp("'"), "&apos;" )
 			    + xmlRef;
 		    } else if ( context == InDTD ) {
-			// Included as PE ### correct???
+			// Included as PE
 			xmlRef = QString(" ") +
 			    d->parameterEntities.find( ref() ).data() +
 			    QString(" ") + xmlRef;
@@ -4896,6 +4910,7 @@ bool QXmlSimpleReader::parseEntityDecl()
     const signed char PEVal            = 15; // parse entity value
     const signed char PEEID            = 16; // parse ExternalID
     const signed char WsE              = 17; // white space read
+    const signed char EDDone           = 19; // done, but also report an external, unparsed entity decl
     const signed char Done             = 18;
 
     const signed char InpWs            = 0; // white space
@@ -4914,8 +4929,8 @@ bool QXmlSimpleReader::parseEntityDecl()
 	{ Ws2,   -1,     -1,      -1,    -1,     -1      }, // Name
 	{ -1,    -1,     EValue,  -1,    -1,     ExtID   }, // Ws2
 	{ WsE,   -1,     -1,      Done,  -1,     -1      }, // EValue
-	{ Ws3,   -1,     -1,      Done,  -1,     -1      }, // ExtID
-	{ -1,    -1,     -1,      Done,  Ndata,  -1      }, // Ws3
+	{ Ws3,   -1,     -1,      EDDone,-1,     -1      }, // ExtID
+	{ -1,    -1,     -1,      EDDone,Ndata,  -1      }, // Ws3
 	{ Ws4,   -1,     -1,      -1,    -1,     -1      }, // Ndata
 	{ -1,    -1,     -1,      -1,    NNam,   NNam    }, // Ws4
 	{ WsE,   -1,     -1,      Done,  -1,     -1      }, // NNam
@@ -5008,6 +5023,9 @@ bool QXmlSimpleReader::parseEntityDecl()
 	    case WsE:
 		eat_ws();
 		break;
+	    case EDDone:
+		next();
+		break;
 	    case Done:
 		next();
 		break;
@@ -5031,8 +5049,7 @@ bool QXmlSimpleReader::parseEntityDecl()
 		    d->error = XMLERR_ERRORPARSINGENTITYVALUE;
 		    goto parseError;
 		}
-		if (  d->entities.find( name() ) == d->entities.end() &&
-			d->externEntities.find( name() ) == d->externEntities.end() ) {
+		if (  !entityExist( name() ) ) {
 		    d->entities.insert( name(), string() );
 		    if ( declHnd ) {
 			if ( !declHnd->internalEntityDecl( name(), string() ) ) {
@@ -5047,16 +5064,6 @@ bool QXmlSimpleReader::parseEntityDecl()
 		    d->error = XMLERR_ERRORPARSINGEXTERNALID;
 		    goto parseError;
 		}
-		if (  d->entities.find( name() ) == d->entities.end() &&
-			d->externEntities.find( name() ) == d->externEntities.end() ) {
-		    d->externEntities.insert( name(), QXmlSimpleReaderPrivate::ExternEntity( d->publicId, d->systemId, "" ) );
-		    if ( declHnd ) {
-			if ( !declHnd->externalEntityDecl( name(), d->publicId, d->systemId ) ) {
-			    d->error = declHnd->errorString();
-			    goto parseError;
-			}
-		    }
-		}
 		break;
 	    case Ndata:
 		if ( !parseOk ) {
@@ -5069,11 +5076,10 @@ bool QXmlSimpleReader::parseEntityDecl()
 		    d->error = XMLERR_ERRORPARSINGNAME;
 		    goto parseError;
 		}
-		if (  d->entities.find( name() ) == d->entities.end() &&
-			d->externEntities.find( name() ) == d->externEntities.end() ) {
+		if (  !entityExist( name() ) ) {
 		    d->externEntities.insert( name(), QXmlSimpleReaderPrivate::ExternEntity( d->publicId, d->systemId, ref() ) );
-		    if ( declHnd ) {
-			if ( !declHnd->externalEntityDecl( name(), d->publicId, d->systemId ) ) {
+		    if ( dtdHnd ) {
+			if ( !dtdHnd->unparsedEntityDecl( name(), d->publicId, d->systemId, ref() ) ) {
 			    d->error = declHnd->errorString();
 			    goto parseError;
 			}
@@ -5091,8 +5097,7 @@ bool QXmlSimpleReader::parseEntityDecl()
 		    d->error = XMLERR_ERRORPARSINGENTITYVALUE;
 		    goto parseError;
 		}
-		if (  d->parameterEntities.find( name() ) == d->parameterEntities.end() &&
-			d->externParameterEntities.find( name() ) == d->externParameterEntities.end() ) {
+		if (  !entityExist( name() ) ) {
 		    d->parameterEntities.insert( name(), string() );
 		    if ( declHnd ) {
 			if ( !declHnd->internalEntityDecl( QString("%")+name(), string() ) ) {
@@ -5107,8 +5112,7 @@ bool QXmlSimpleReader::parseEntityDecl()
 		    d->error = XMLERR_ERRORPARSINGEXTERNALID;
 		    goto parseError;
 		}
-		if (  d->parameterEntities.find( name() ) == d->parameterEntities.end() &&
-			d->externParameterEntities.find( name() ) == d->externParameterEntities.end() ) {
+		if (  !entityExist( name() ) ) {
 		    d->externParameterEntities.insert( name(), QXmlSimpleReaderPrivate::ExternParameterEntity( d->publicId, d->systemId ) );
 		    if ( declHnd ) {
 			if ( !declHnd->externalEntityDecl( QString("%")+name(), d->publicId, d->systemId ) ) {
@@ -5118,6 +5122,17 @@ bool QXmlSimpleReader::parseEntityDecl()
 		    }
 		}
 		break;
+	    case EDDone:
+		if (  !entityExist( name() ) ) {
+		    d->externEntities.insert( name(), QXmlSimpleReaderPrivate::ExternEntity( d->publicId, d->systemId, QString::null ) );
+		    if ( declHnd ) {
+			if ( !declHnd->externalEntityDecl( name(), d->publicId, d->systemId ) ) {
+			    d->error = declHnd->errorString();
+			    goto parseError;
+			}
+		    }
+		}
+		return TRUE;
 	    case Done:
 		return TRUE;
 	    case -1:
@@ -5741,154 +5756,8 @@ bool QXmlSimpleReader::parseReference( bool &charDataRead, EntityRecognitionCont
 		next();
 		break;
 	    case DoneN:
-		if        ( ref() == "amp" ) {
-		    if ( context == InEntityValue ) {
-			// Bypassed
-			stringAddC( '&' ); stringAddC( 'a' ); stringAddC( 'm' ); stringAddC( 'p' ); stringAddC( ';' );
-		    } else {
-			// Included or Included in literal
-			stringAddC( '&' );
-		    }
-		    charDataRead = TRUE;
-		} else if ( ref() == "lt" ) {
-		    if ( context == InEntityValue ) {
-			// Bypassed
-			stringAddC( '&' ); stringAddC( 'l' ); stringAddC( 't' ); stringAddC( ';' );
-		    } else {
-			// Included or Included in literal
-			stringAddC( '<' );
-		    }
-		    charDataRead = TRUE;
-		} else if ( ref() == "gt" ) {
-		    if ( context == InEntityValue ) {
-			// Bypassed
-			stringAddC( '&' ); stringAddC( 'g' ); stringAddC( 't' ); stringAddC( ';' );
-		    } else {
-			// Included or Included in literal
-			stringAddC( '>' );
-		    }
-		    charDataRead = TRUE;
-		} else if ( ref() == "apos" ) {
-		    if ( context == InEntityValue ) {
-			// Bypassed
-			stringAddC( '&' ); stringAddC( 'a' ); stringAddC( 'p' ); stringAddC( 'o' ); stringAddC( 's' ); stringAddC( ';' );
-		    } else {
-			// Included or Included in literal
-			stringAddC( '\'' );
-		    }
-		    charDataRead = TRUE;
-		} else if ( ref() == "quot" ) {
-		    if ( context == InEntityValue ) {
-			// Bypassed
-			stringAddC( '&' ); stringAddC( 'q' ); stringAddC( 'u' ); stringAddC( 'o' ); stringAddC( 't' ); stringAddC( ';' );
-		    } else {
-			// Included or Included in literal
-			stringAddC( '"' );
-		    }
-		    charDataRead = TRUE;
-		} else {
-		    QMap<QString,QString>::Iterator it;
-		    it = d->entities.find( ref() );
-		    if ( it != d->entities.end() ) {
-			// "Internal General"
-			switch ( context ) {
-			    case InContent:
-				// Included
-				xmlRef = it.data() + xmlRef;
-				charDataRead = FALSE;
-				break;
-			    case InAttributeValue:
-				// Included in literal
-				xmlRef = it.data().replace( QRegExp("\""), "&quot;" ).replace( QRegExp("'"), "&apos;" )
-					+ xmlRef;
-				charDataRead = FALSE;
-				break;
-			    case InEntityValue:
-				{
-				    // Bypassed
-				    stringAddC( '&' );
-				    for ( int i=0; i<(int)ref().length(); i++ ) {
-					stringAddC( ref()[i] );
-				    }
-				    stringAddC( ';');
-				    charDataRead = TRUE;
-				}
-				break;
-			    case InDTD:
-				// Forbidden
-				d->error = XMLERR_INTERNALGENERALENTITYINDTD;
-				charDataRead = FALSE;
-				break;
-			}
-		    } else {
-			QMap<QString,QXmlSimpleReaderPrivate::ExternEntity>::Iterator itExtern;
-			itExtern = d->externEntities.find( ref() );
-			if ( itExtern != d->externEntities.end() ) {
-			    // "External Parsed General"
-			    switch ( context ) {
-				case InContent:
-				    // Included if validating
-				    if ( contentHnd ) {
-					if ( !contentHnd->skippedEntity( ref() ) ) {
-					    d->error = contentHnd->errorString();
-					    goto parseError;
-					}
-				    }
-				    charDataRead = FALSE;
-				    break;
-				case InAttributeValue:
-				    // Forbidden
-				    d->error = XMLERR_EXTERNALGENERALENTITYINAV;
-				    charDataRead = FALSE;
-				    break;
-				case InEntityValue:
-				    {
-					// Bypassed
-					stringAddC( '&' );
-					for ( int i=0; i<(int)ref().length(); i++ ) {
-					    stringAddC( ref()[i] );
-					}
-					stringAddC( ';');
-					charDataRead = TRUE;
-				    }
-				    break;
-				case InDTD:
-				    // Forbidden
-				    d->error = XMLERR_EXTERNALGENERALENTITYINDTD;
-				    charDataRead = FALSE;
-				    break;
-			    }
-			} else {
-			    // "Unparsed" ### or is the definition of unparsed entities different?
-			    if ( context == InEntityValue ) {
-				// Bypassed
-				// (this does not conform with the table 4.4 of the XML specification;
-				// on the other hand: in this case it is not really an unparsed entity)
-				stringAddC( '&' );
-				for ( int i=0; i<(int)ref().length(); i++ ) {
-				    stringAddC( ref()[i] );
-				}
-				stringAddC( ';');
-				charDataRead = TRUE;
-			    } else {
-#if 0
-				// Forbidden
-				d->error = XMLERR_UNPARSEDENTITYREFERENCE;
-				goto parseError;
-				charDataRead = FALSE;
-#else
-				// ### skip it???
-				if ( contentHnd ) {
-				    if ( !contentHnd->skippedEntity( ref() ) ) {
-					d->error = contentHnd->errorString();
-					goto parseError;
-				    }
-				}
-#endif
-			    }
-			}
-		    }
-		}
+		if ( !processReference( charDataRead, context ) )
+		    goto parseError;
 		next();
 		break;
 	}
@@ -5916,6 +5785,162 @@ parseError:
 }
 
 /*!
+  Helper function for parseReference()
+*/
+bool QXmlSimpleReader::processReference( bool &charDataRead, EntityRecognitionContext context )
+{
+    QString reference = ref();
+    if ( reference == "amp" ) {
+	if ( context == InEntityValue ) {
+	    // Bypassed
+	    stringAddC( '&' ); stringAddC( 'a' ); stringAddC( 'm' ); stringAddC( 'p' ); stringAddC( ';' );
+	} else {
+	    // Included or Included in literal
+	    stringAddC( '&' );
+	}
+	charDataRead = TRUE;
+    } else if ( reference == "lt" ) {
+	if ( context == InEntityValue ) {
+	    // Bypassed
+	    stringAddC( '&' ); stringAddC( 'l' ); stringAddC( 't' ); stringAddC( ';' );
+	} else {
+	    // Included or Included in literal
+	    stringAddC( '<' );
+	}
+	charDataRead = TRUE;
+    } else if ( reference == "gt" ) {
+	if ( context == InEntityValue ) {
+	    // Bypassed
+	    stringAddC( '&' ); stringAddC( 'g' ); stringAddC( 't' ); stringAddC( ';' );
+	} else {
+	    // Included or Included in literal
+	    stringAddC( '>' );
+	}
+	charDataRead = TRUE;
+    } else if ( reference == "apos" ) {
+	if ( context == InEntityValue ) {
+	    // Bypassed
+	    stringAddC( '&' ); stringAddC( 'a' ); stringAddC( 'p' ); stringAddC( 'o' ); stringAddC( 's' ); stringAddC( ';' );
+	} else {
+	    // Included or Included in literal
+	    stringAddC( '\'' );
+	}
+	charDataRead = TRUE;
+    } else if ( reference == "quot" ) {
+	if ( context == InEntityValue ) {
+	    // Bypassed
+	    stringAddC( '&' ); stringAddC( 'q' ); stringAddC( 'u' ); stringAddC( 'o' ); stringAddC( 't' ); stringAddC( ';' );
+	} else {
+	    // Included or Included in literal
+	    stringAddC( '"' );
+	}
+	charDataRead = TRUE;
+    } else {
+	QMap<QString,QString>::Iterator it;
+	it = d->entities.find( reference );
+	if ( it != d->entities.end() ) {
+	    // "Internal General"
+	    switch ( context ) {
+		case InContent:
+		    // Included
+		    xmlRef = it.data() + xmlRef;
+		    charDataRead = FALSE;
+		    break;
+		case InAttributeValue:
+		    // Included in literal
+		    xmlRef = it.data().replace( QRegExp("\""), "&quot;" ).replace( QRegExp("'"), "&apos;" )
+			+ xmlRef;
+		    charDataRead = FALSE;
+		    break;
+		case InEntityValue:
+		    {
+			// Bypassed
+			stringAddC( '&' );
+			for ( int i=0; i<(int)reference.length(); i++ ) {
+			    stringAddC( reference[i] );
+			}
+			stringAddC( ';');
+			charDataRead = TRUE;
+		    }
+		    break;
+		case InDTD:
+		    // Forbidden
+		    d->error = XMLERR_INTERNALGENERALENTITYINDTD;
+		    charDataRead = FALSE;
+		    break;
+	    }
+	} else {
+	    QMap<QString,QXmlSimpleReaderPrivate::ExternEntity>::Iterator itExtern;
+	    itExtern = d->externEntities.find( reference );
+	    if ( itExtern == d->externEntities.end() ) {
+		// entity not declared
+		// ### check this case for conformance
+		if ( context == InEntityValue ) {
+		    // Bypassed
+		    stringAddC( '&' );
+		    for ( int i=0; i<(int)reference.length(); i++ ) {
+			stringAddC( reference[i] );
+		    }
+		    stringAddC( ';');
+		    charDataRead = TRUE;
+		} else {
+		    if ( contentHnd ) {
+			if ( !contentHnd->skippedEntity( reference ) ) {
+			    d->error = contentHnd->errorString();
+			    return FALSE; // error
+			}
+		    }
+		}
+	    } else if ( (*itExtern).notation.isNull() ) {
+		// "External Parsed General"
+		switch ( context ) {
+		    case InContent:
+			// Included if validating
+			if ( contentHnd ) {
+			    if ( !contentHnd->skippedEntity( reference ) ) {
+				d->error = contentHnd->errorString();
+				return FALSE; // error
+			    }
+			}
+			charDataRead = FALSE;
+			break;
+		    case InAttributeValue:
+			// Forbidden
+			d->error = XMLERR_EXTERNALGENERALENTITYINAV;
+			charDataRead = FALSE;
+			break;
+		    case InEntityValue:
+			{
+			    // Bypassed
+			    stringAddC( '&' );
+			    for ( int i=0; i<(int)reference.length(); i++ ) {
+				stringAddC( reference[i] );
+			    }
+			    stringAddC( ';');
+			    charDataRead = TRUE;
+			}
+			break;
+		    case InDTD:
+			// Forbidden
+			d->error = XMLERR_EXTERNALGENERALENTITYINDTD;
+			charDataRead = FALSE;
+			break;
+		}
+	    } else {
+		// "Unparsed"
+		// ### notify for "Occurs as Attribute Value" missing (but this is no refence, anyway)
+		// Forbidden
+		d->error = XMLERR_UNPARSEDENTITYREFERENCE;
+		charDataRead = FALSE;
+		return FALSE; // error
+	    }
+	}
+    }
+    return TRUE; // no error
+}
+
+
+/*!
   Parse over a simple string.
 
   After the string was successfully parsed, the head is on the first
@@ -5970,8 +5995,8 @@ parseError:
 }
 
 
-/*
-  Init the data values.
+/*!
+  Inits the data values.
 */
 void QXmlSimpleReader::init( const QXmlInputSource& i )
 {
@@ -5998,6 +6023,20 @@ void QXmlSimpleReader::init( const QXmlInputSource& i )
     d->error = XMLERR_OK;
 }
 
+/*!
+  Returns TRUE if a entity with the name \a e exists,
+  otherwise returns FALSE.
+*/
+bool QXmlSimpleReader::entityExist( const QString& e ) const
+{
+    if (  d->parameterEntities.find(e) == d->parameterEntities.end() &&
+	    d->externParameterEntities.find(e) == d->externParameterEntities.end() ) {
+	return FALSE;
+    } else {
+	return TRUE;
+    }
+}
+
 void QXmlSimpleReader::reportParseError()
 {
     if ( errorHnd )
diff --git a/qtools/qxml.h b/qtools/qxml.h
index c23430c..ce40e5f 100644
--- a/qtools/qxml.h
+++ b/qtools/qxml.h
@@ -322,7 +322,7 @@ private:
     // used by parseReference() and parsePEReference()
     enum EntityRecognitionContext { InContent, InAttributeValue, InEntityValue, InDTD };
 
-    // private methods
+    // private functions
     void eat_ws();
     void next_eat_ws();
 
@@ -331,6 +331,8 @@ private:
 
     void init( const QXmlInputSource& i );
 
+    bool entityExist( const QString& ) const;
+
     bool parseProlog();
     bool parseElement();
     bool parseElementEmptyTag( bool &t, QString &uri, QString &lname );
@@ -347,6 +349,7 @@ private:
     bool parseNmtoken();
     bool parseAttribute();
     bool parseReference( bool &charDataRead, EntityRecognitionContext context );
+    bool processReference( bool &charDataRead, EntityRecognitionContext context );
 
     bool parseExternalID( bool allowPublicID = FALSE );
     bool parsePEReference( EntityRecognitionContext context );
@@ -504,7 +507,15 @@ private:
     QXmlDefaultHandlerPrivate *d;
 };
 
+#ifdef _WS_QWS_
+#ifdef QT_XML_CPP
+#define inline
+#else
+#define QT_NO_XML_INLINE
+#endif
+#endif
 
+#ifndef QT_NO_XML_INLINE
 //
 // inlines
 //
@@ -640,6 +651,14 @@ inline void QXmlSimpleReader::refAddC(const QChar& ch)
     }
     refArray[refPos++] = ch;
 }
+#endif
+
+#ifdef _WS_QWS_
+#ifdef QT_XML_CPP
+#undef inline
+#endif
+#endif
+
 #endif //QT_NO_XML
 
 #endif
diff --git a/src/Makefile.in b/src/Makefile.in
index 31ab7f1..aadd7ad 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -2,7 +2,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
+# Copyright (C) 1997-2001 by Dimitri van Heesch.
 # 
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/bufstr.h b/src/bufstr.h
new file mode 100644
index 0000000..576dac7
--- /dev/null
+++ b/src/bufstr.h
@@ -0,0 +1,61 @@
+/******************************************************************************
+ *
+ * 
+ *
+ *
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+#ifndef _BUFSTR_H
+#define _BUFSTR_H
+
+#include "qtbc.h"
+
+/*! String that can deal more efficiently with large large numbers
+ *  of resizing. 
+ */
+class BufStr : public QCString
+{
+  public:
+    BufStr(int size) : QCString(size), offset(0), spareRoom(10240) {}
+    void addChar(char c)
+    {
+      if (offset>=size()) 
+      {
+        resize(size()+spareRoom);
+      }
+      data()[offset++]=c;
+    }
+    void addArray(const char *a,int len)
+    {
+      if (offset+len>=size()) 
+      {
+        resize(size()+len+spareRoom);
+      }
+      memcpy(data()+offset,a,len);
+      offset+=len;
+    }
+    uint curPos() { return offset; }
+    void skip(uint s)
+    {
+      if (offset+s>=size()) 
+      {
+        resize(size()+s+spareRoom);
+      }
+      offset+=s;
+    }
+  private:
+    uint offset;
+    const int spareRoom; // 10Kb extra room to avoid frequent resizing
+};
+
+#endif
diff --git a/src/classdef.cpp b/src/classdef.cpp
index e339c41..93a7921 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -51,15 +51,8 @@ ClassDef::ClassDef(
 {
   //name=n;
 
-  QCString compoundName;
-  switch(ct)
-  {
-    case Class: compoundName="class"; break; 
-    case Struct: compoundName="struct"; break; 
-    case Union: compoundName="union"; break; 
-    case Interface: compoundName="interface"; break; 
-    case Exception: compoundName="exception"; break; 
-  }
+  compType=ct;
+  QCString compoundName=compoundTypeString();
   if (fName)
     fileName=stripExtension(fName);
   else
@@ -86,7 +79,6 @@ ClassDef::ClassDef(
   allMemberNameInfoDict = new MemberNameInfoDict(1009);
   visited=FALSE;
   setReference(lref);
-  compType=ct;
   incInfo=0;
   tempArgs=0;
   prot=Public;
@@ -654,13 +646,10 @@ void ClassDef::writeDocumentation(OutputList &ol)
   QCString pageTitle=name().copy();
   QCString pageType;
   ArgumentList *outerTempArgList = outerTemplateArguments();
-  switch(compType)
-  {
-    case Class:  pageType+=" Class"; break;
-    case Struct: pageType+=" Struct";    break;
-    case Union:  pageType+=" Union";     break;
-    default:     pageType+=" Interface"; break;
-  } 
+  QCString cType=compoundTypeString();
+  toupper(cType.at(0));
+  pageType+=" ";
+  pageType+=cType;
   pageTitle+=pageType+" Reference";
   if (outerTempArgList) pageTitle.prepend(" Template");
   startFile(ol,fileName,pageTitle);
@@ -732,15 +721,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
 
   if (!Config::genTagFile.isEmpty()) 
   {
-    tagFile << "  <compound kind=\"";
-    switch(compType)
-    {
-      case Class:     tagFile << "class";     break; 
-      case Struct:    tagFile << "struct";    break; 
-      case Union:     tagFile << "union";     break; 
-      case Interface: tagFile << "interface"; break; 
-      case Exception: tagFile << "exception"; break; 
-    }
+    tagFile << "  <compound kind=\"" << compoundTypeString();
     tagFile << "\">" << endl;
     tagFile << "    <name>" << convertToXML(name()) << "</name>" << endl;
     tagFile << "    <filename>" << convertToXML(fileName) << ".html</filename>" << endl;
@@ -1891,15 +1872,8 @@ void ClassDef::generateXML(QTextStream &t)
 {
   if (name().find('@')!=-1) return; // skip anonymous compounds
   t << "    <compounddef id=\"" 
-    << getOutputFileBase() << "\" type=\"";
-  switch(compType)
-  {
-    case Class:  t << "class";     break;
-    case Struct: t << "struct";    break;
-    case Union:  t << "union";     break;
-    default:     t << "interface"; break;
-  } 
-  t << "\">" << endl;
+    << getOutputFileBase() << "\" type=\"" 
+    << compoundTypeString() << "\">" << endl;
   t << "      <compoundname>"; 
   writeXMLString(t,name()); 
   t << "</compoundname>" << endl;
@@ -1996,3 +1970,22 @@ void ClassDef::generateXML(QTextStream &t)
   }
   t << "    </compounddef>" << endl;
 }
+
+PackageDef *ClassDef::packageDef() const
+{
+  return fileDef ? fileDef->packageDef() : 0;
+}
+
+QCString ClassDef::compoundTypeString() const
+{
+  switch (compType)
+  {
+    case Class:     return "class";
+    case Struct:    return "struct";
+    case Union:     return "union";
+    case Interface: return "interface";
+    case Exception: return "exception";
+  }
+  return "unknown";
+}
+
diff --git a/src/classdef.h b/src/classdef.h
index f9c26dd..329e47b 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -43,6 +43,7 @@ class UsesClassDict;
 class MemberGroupList;
 class MemberGroupDict;
 class QTextStream;
+class PackageDef;
 struct IncludeInfo;
 
 class ClassDef : public Definition
@@ -62,6 +63,7 @@ class ClassDef : public Definition
     QCString getOutputFileBase() const { return fileName; }
     QCString displayName() const;
     CompoundType compoundType() const { return compType; } 
+    QCString compoundTypeString() const;
     void insertBaseClass(ClassDef *,Protection p,Specifier s,const char *t=0);
     BaseClassList *baseClasses() { return inherits; }
     void insertSuperClass(ClassDef *,Protection p,Specifier s,const char *t=0);
@@ -126,6 +128,8 @@ class ClassDef : public Definition
 
     void generateXML(QTextStream &t);
     void generateXMLSection(QTextStream &t,MemberList *ml,const char *type);
+
+    PackageDef *packageDef() const;
    
   protected:
     void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
diff --git a/src/classlist.cpp b/src/classlist.cpp
index f62ff36..6061d47 100644
--- a/src/classlist.cpp
+++ b/src/classlist.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -48,7 +48,7 @@ ClassListIterator::ClassListIterator(const ClassList &cllist) :
 {
 }
 
-void ClassList::writeDeclaration(OutputList &ol)
+void ClassList::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter,const char *header)
 {
   if (count()>0)
   {
@@ -56,7 +56,9 @@ void ClassList::writeDeclaration(OutputList &ol)
     bool found=FALSE;
     while (cd)
     {
-      if (cd->name().find('@')==-1)
+      if (cd->name().find('@')==-1 && 
+          (filter==0 || *filter==cd->compoundType())
+         )
       {
         bool isLink = cd->isLinkable();
         if (isLink || !Config::hideClassFlag)
@@ -64,24 +66,25 @@ void ClassList::writeDeclaration(OutputList &ol)
           if (!found)
           {
             ol.startMemberHeader();
-            parseText(ol,theTranslator->trCompounds());
+            if (header)
+            {
+              parseText(ol,header);
+            }
+            else
+            {
+              parseText(ol,theTranslator->trCompounds());
+            }
             ol.endMemberHeader();
             ol.startMemberList();
             found=TRUE;
           }
           if (!Config::genTagFile.isEmpty()) 
           {
-            tagFile << "    <class>" << convertToXML(cd->name()) << "</class>" << endl;
+            tagFile << "    <class kind=\"" << cd->compoundTypeString() 
+                    << "\">" << convertToXML(cd->name()) << "</class>" << endl;
           }
           ol.startMemberItem(FALSE);
-          switch (cd->compoundType())
-          {
-            case ClassDef::Class:      ol.writeString("class");  break;
-            case ClassDef::Struct:     ol.writeString("struct"); break;
-            case ClassDef::Union:      ol.writeString("union");  break;
-            case ClassDef::Interface:  ol.writeString("interface");  break;
-            case ClassDef::Exception:  ol.writeString("exception");  break;
-          }
+          ol.writeString(cd->compoundTypeString());
           ol.writeString(" ");
           ol.insertMemberAlign();
           if (isLink) 
diff --git a/src/classlist.h b/src/classlist.h
index 7162459..02521d0 100644
--- a/src/classlist.h
+++ b/src/classlist.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -30,7 +30,8 @@ class ClassList : public QList<ClassDef>
    ~ClassList();
    
    int compareItems(GCI item1,GCI item2);
-   void writeDeclaration(OutputList &ol);
+   void writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter=0,
+                         const char *header=0);
 };
 
 class ClassListIterator : public QListIterator<ClassDef>
diff --git a/src/code.h b/src/code.h
index 2f98ab8..8773d01 100644
--- a/src/code.h
+++ b/src/code.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/code.l b/src/code.l
index ec3599c..22415cc 100644
--- a/src/code.l
+++ b/src/code.l
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -1009,7 +1009,7 @@ TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
 					  addType();
   					  g_name+=yytext; 
   					}
-<Body>{SCOPENAME}{B}*"<"[^\n\"\>]*">"/{B}* { // A<T> *pt;
+<Body>{SCOPENAME}{B}*"<"[^\n\/\{\"\>]*">"/{B}* { // A<T> *pt;
 					  generateClassLink(*g_code,yytext);
 					  addType();
   					  g_name+=yytext; 
@@ -1129,6 +1129,7 @@ TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
 					    g_name.resize(0);
 					  }
 					  if (*yytext!=',') g_type.resize(0);
+					  if (*yytext==';') g_name.resize(0);
 					  g_args.resize(0);
   					}
 <Body>"]"				{
diff --git a/src/config.h b/src/config.h
index 9e5c906..0ceec45 100644
--- a/src/config.h
+++ b/src/config.h
@@ -8,7 +8,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/config.l b/src/config.l
index 2aa605c..df0d591 100644
--- a/src/config.l
+++ b/src/config.l
@@ -8,7 +8,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/constexp.h b/src/constexp.h
index f31e19d..2b09ed9 100644
--- a/src/constexp.h
+++ b/src/constexp.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/constexp.l b/src/constexp.l
index f73e293..b6604ff 100644
--- a/src/constexp.l
+++ b/src/constexp.l
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/cppvalue.cpp b/src/cppvalue.cpp
index 25b94b4..62d73dd 100644
--- a/src/cppvalue.cpp
+++ b/src/cppvalue.cpp
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/cppvalue.h b/src/cppvalue.h
index 32e0566..159e217 100644
--- a/src/cppvalue.h
+++ b/src/cppvalue.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/debug.cpp b/src/debug.cpp
index 5398991..6ec6d7c 100644
--- a/src/debug.cpp
+++ b/src/debug.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/debug.h b/src/debug.h
index ce280df..9fbced0 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/declinfo.h b/src/declinfo.h
index 6cf6096..b337aae 100644
--- a/src/declinfo.h
+++ b/src/declinfo.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/declinfo.l b/src/declinfo.l
index 7a1b020..bfa599e 100644
--- a/src/declinfo.l
+++ b/src/declinfo.l
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -114,7 +114,7 @@ ID	([a-z_A-Z][a-z_A-Z0-9]*)|(@[0-9]+)
   				  name += yytext;
   				  BEGIN(Operator);
   				}
-<Start>(~{B}*)?{ID}		{
+<Start>(~{B}*)?{ID}({B}*"["{B}*"]")* { // the []'s are for Java
   				  addTypeName();
 				  name += yytext;
   				}
@@ -228,6 +228,13 @@ void parseFuncDecl(const QCString &decl,QCString &cl,QCString &ctl,QCString &t,
   //printf("type=`%s' class=`%s' name=`%s' args=`%s'\n",
   //        type.data(),scope.data(),name.data(),args.data());
 
+  int nb = name.findRev('[');
+  if (nb!=-1) // correct for [] in name ambigity (due to Java return type allowing [])
+  {
+    args.prepend(name.right(name.length()-nb));
+    name=name.left(nb);
+  }
+
   cl=scope.copy();
   //printf("scope=`%s'\n",scope.data());
   int il=0,ir=0;
diff --git a/src/defargs.h b/src/defargs.h
index 1678797..7bfae61 100644
--- a/src/defargs.h
+++ b/src/defargs.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/defargs.l b/src/defargs.l
index 05a26b6..58af23d 100644
--- a/src/defargs.l
+++ b/src/defargs.l
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/define.cpp b/src/define.cpp
index ea8d8e3..424e0be 100644
--- a/src/define.cpp
+++ b/src/define.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/define.h b/src/define.h
index 060270e..2715450 100644
--- a/src/define.h
+++ b/src/define.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/definition.cpp b/src/definition.cpp
index 13707d8..4805638 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/definition.h b/src/definition.h
index 378faf3..e92292e 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -33,7 +33,10 @@ class Definition
 {
   public:
     /*! Types of derived classes */
-    enum DefType { TypeClass, TypeMember, TypeFile, TypeGroup, TypeNamespace };
+    enum DefType 
+    { 
+      TypeClass, TypeMember, TypeFile, TypeGroup, TypeNamespace, TypePackage 
+    };
     /*! Use this for dynamic inspection of the derived class */
     virtual DefType definitionType() = 0;
     
diff --git a/src/diagram.cpp b/src/diagram.cpp
index eed5cd2..b74abc8 100644
--- a/src/diagram.cpp
+++ b/src/diagram.cpp
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/diagram.h b/src/diagram.h
index 4338772..7b8182e 100644
--- a/src/diagram.h
+++ b/src/diagram.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/doc.h b/src/doc.h
index ee54f8a..6c5ad54 100644
--- a/src/doc.h
+++ b/src/doc.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/doc.l b/src/doc.l
index 3a0f64f..41c2ba6 100644
--- a/src/doc.l
+++ b/src/doc.l
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -804,6 +804,7 @@ TR	  [tT][rR]
 TT	  [tT][tT]
 UL	  [uU][lL]
 VAR	  [vV][aA][rR]
+BLOCKQUOTE [bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE]
 DOCPARAM  ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
 
 %option noyywrap
@@ -821,6 +822,7 @@ DOCPARAM  ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
 %x      DocCodeBlock
 %x      DocInternal
 %x      DocLink
+%x      DocJavaLink
 %x      DocLinkText
 %x      DocSkipWord
 %x      DocInclude
@@ -959,12 +961,25 @@ DOCPARAM  ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
 					  scanString(theTranslator->trReimplementedForInternalReasons()+"\n");
   					}
 <DocScan>{CMD}"link"/{BN}	        { BEGIN( DocLink ); }
+<DocScan>"{"{CMD}"link"{BN}+	        { BEGIN( DocJavaLink ); }
 <DocSkipWord>[a-z_A-Z0-9.:()]+		{ BEGIN( DocScan ); }
-<DocLink>[a-z_A-Z0-9:#.,~&*/<>()\-\+]+  {  // TODO: support operators as well!
+<DocLink>[a-z_A-Z0-9:#.,~&*/\[\]<>()\-\+]+  {  // TODO: support operators as well!
   					  linkRef  = stripKnownExtensions(yytext);
 					  linkText = "";
   					  BEGIN( DocLinkText ); 
 					}
+<DocJavaLink>([a-z_A-Z0-9]+".")+	{ /* Skip scope prefix (TODO: fix) */ }
+<DocJavaLink>([a-z_A-Z0-9]+"#")?[a-z_A-Z0-9]+("("[a-z_A-Z0-9.,~&*()\[\]]*")")? {  // TODO: support operators as well!
+  					  linkRef  = yytext;
+					}
+<DocJavaLink>"}"			{
+  					  //printf("Trying to link `%s'\n",linkRef.data());
+					  if (!generateLink(*outDoc,className,linkRef,inSeeBlock,0))
+					  {
+					    warn(yyFileName,yyLineNr,"Warning: link to unknown entity `%s' in the documentation of this entity!",linkRef.data());
+					  }
+  					  BEGIN( DocScan ); 
+  					}
 <DocLinkText>.				{ linkText += *yytext; }
 <DocLinkText>"\n"			{ linkText += " "; }
 <DocLink,DocLinkText>{CMD}"endlink" 	{ // <- needed for things like \endlink. 
@@ -972,7 +987,7 @@ DOCPARAM  ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
 					  //        className.data(),linkRef.data(),linkText.data());
 					  if (!generateLink(*outDoc,className,linkRef,inSeeBlock,linkText.stripWhiteSpace()))
 					  {
-					    warn(yyFileName,yyLineNr,"Warning: link to unknown section %s in the documentation of this entity!",linkRef.data());
+					    warn(yyFileName,yyLineNr,"Warning: link to unknown entity `%s' in the documentation of this entity!",linkRef.data());
 					  }
   					  BEGIN( DocScan ); 
 					}
@@ -1718,13 +1733,13 @@ DOCPARAM  ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
   					  generateRef(*outDoc,className,yytext,inSeeBlock);
 					  BEGIN(DocScan);
   					}
-<DocScan,DocRefName>({SCOPEMASK}"::")?"operator()("[a-z_A-Z0-9,\<\> \t\*\&]*")"	{ 
+<DocScan,DocRefName>({SCOPEMASK}"::")?"operator()"("("[a-z_A-Z0-9,\<\> \t\*\&]*")")?	{ 
 				          QCString oName=yytext;
 					  generateRef(*outDoc,className,
 					              removeRedundantWhiteSpace(oName),inSeeBlock);
 					  BEGIN(DocScan);
 					}
-<DocScan,DocRefName>({SCOPEMASK}"::")?"operator"[^(\r\n.,]+"("[a-z_A-Z0-9,\<\> \t\*\&]*")"	{ 
+<DocScan,DocRefName>({SCOPEMASK}"::")?"operator"[^(\r\n.,]+("("[a-z_A-Z0-9,\<\> \t\*\&]*")")?	{ 
     					  QCString oName=yytext;
 					  generateRef(*outDoc,className,
 					              removeRedundantWhiteSpace(oName),inSeeBlock);
@@ -1827,6 +1842,8 @@ DOCPARAM  ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
 <DocScan>"</"{HEAD}{ATTR}">"			
 <DocScan>"<"{BODY}{ATTR}">"
 <DocScan>"</"{BODY}{ATTR}">"
+<DocScan>"<"{BLOCKQUOTE}{ATTR}">"
+<DocScan>"</"{BLOCKQUOTE}{ATTR}">"
 <DocScan>"<"{CODE}{ATTR}">"		{ outDoc->startTypewriter(); }
 <DocScan>"</"{CODE}{ATTR}">"		{ outDoc->endTypewriter(); }
 <DocScan>"<"{DFN}{ATTR}">"		{ outDoc->startTypewriter(); }
diff --git a/src/dot.cpp b/src/dot.cpp
index e4a3932..6e9f823 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/dot.h b/src/dot.h
index 90a0df1..c626b67 100644
--- a/src/dot.h
+++ b/src/dot.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 8a12922..1b31b6f 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -57,6 +57,8 @@
 #include "xml.h"
 #include "reflist.h"
 #include "page.h"
+#include "packagedef.h"
+#include "bufstr.h"
 
 #if defined(_MSC_VER) || defined(__BORLANDC__)
 #define popen _popen
@@ -102,6 +104,8 @@ OutputList     *outputList = 0;         // list of output generating objects
 PageInfo       *mainPage = 0;
 QIntDict<QCString> memberHeaderDict(1009); // dictionary of the member groups heading
 QIntDict<QCString> memberDocDict(1009);    // dictionary of the member groups heading
+
+PackageSDict   packageDict(257);         // java packages
   
 
 void clearAll()
@@ -192,6 +196,7 @@ int documentedNamespaces;
 int documentedNamespaceMembers;
 int documentedIncludeFiles;
 int documentedPages;
+int documentedPackages;
 
 QTextStream tagFile;
 
@@ -2101,7 +2106,8 @@ static void transferFunctionDocumentation()
       // check if not in different but documented files
       if (Config::extractAllFlag || 
           fdef==fdec || 
-          !fdef->hasDocumentation() || !mdec->hasDocumentation())
+          (fdef!=0 && (!fdef->hasDocumentation() || !mdec->hasDocumentation()))
+         )
       {
         //printf("Found member %s: def in %s and dec in %s\n",
         //    mn->memberName(),mdef->getFileDef()->name().data(),
@@ -3021,10 +3027,11 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
 {
   Debug::print(Debug::FindMembers,0,
                "findMember(root=%p,funcDecl=`%s',related=`%s',overload=%d,"
-               "isFunc=%d mGrpId=%d tArgList=%p=\"%s\" scopeSpec=%s "
-               "memberSpec=%s memSpec=%d\n",
+               "isFunc=%d mGrpId=%d tArgList=%p=\"%s\" mtArgList=%p=\"%s\" "
+               "scopeSpec=%s memberSpec=%s memSpec=%d\n",
                root,funcDecl.data(),related.data(),overloaded,isFunc,root->mGrpId,
                root->tArgList,tempArgListToString(root->tArgList).data(),
+               root->mtArgList,tempArgListToString(root->mtArgList).data(),
                root->scopeSpec.data(),root->memberSpec.data(),root->memSpec
               );
   //if (Config::includeSourceFlag && !root->body.isEmpty())
@@ -3248,7 +3255,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
     // no template specifiers found during parsing (because \fn was used), 
     // but there are template names in the scope, so we build the template 
     // specifiers from that.
-    printf("Building template list from `%s'\n",classTempList.data());
+    //printf("Building template list from `%s'\n",classTempList.data());
     root->tArgList = new ArgumentList;
     QRegExp re(idMask);
     int i,p=0,l;
@@ -3619,6 +3626,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
           if (!newMember && rmd) // member already exists as rmd -> add docs
           {
             //printf("addMemberDocs for related member %s\n",root->name.data());
+            rmd->setMemberDefTemplateArguments(root->mtArgList);
             addMemberDocs(root,rmd,funcDecl,0,overloaded);
           }
         }
@@ -3694,13 +3702,12 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
           md->setMemberClass(cd);
           md->setMemberSpecifiers(root->memSpec);
           md->setDefinition(funcDecl);
-          //md->setDefFile(root->fileName);
-          //md->setDefLine(root->startLine);
           md->setPrototype(root->proto);
           md->setDocumentation(root->doc);
           md->setBriefDescription(root->brief);
           md->addSectionsToDefinition(root->anchors);
           md->setMemberGroupId(root->mGrpId);
+          md->setMemberDefTemplateArguments(root->mtArgList);
           mn->append(md);
           cd->insertMember(md);
           cd->insertUsedFile(root->fileName);
@@ -4764,6 +4771,52 @@ static void findMainPage(Entry *root)
 
 //----------------------------------------------------------------------------
 
+/*! Search for all Java package statements 
+ */
+static void buildPackageList(Entry *root)
+{
+  if (root->section == Entry::PACKAGE_SEC)
+  {
+    PackageDef *pd=0;
+    if (!root->name.isEmpty() && (pd=packageDict.find(root->name))==0)
+    {
+      pd = new PackageDef(root->fileName,root->startLine,root->name);
+      packageDict.inSort(root->name,pd);
+    } 
+    if (pd)
+    {
+      bool ambig;
+      FileDef *fd=findFileDef(inputNameDict,root->fileName,ambig);
+      if (fd)
+      {
+        fd->setPackageDef(pd);
+      }
+    }
+  }
+  EntryListIterator eli(*root->sublist);
+  Entry *e;
+  for (;(e=eli.current());++eli)
+  {
+    buildPackageList(e);
+  }
+}
+
+//----------------------------------------------------------------------------
+
+/*! Add Java classes to their respective packages */
+static void addClassesToPackages()
+{
+  ClassDef *cd;
+  ClassListIterator cli(classList);
+  for (;(cd=cli.current());++cli)
+  {
+    PackageDef *pd = cd->packageDef();
+    if (pd) pd->addClass(cd);
+  }
+}
+
+//----------------------------------------------------------------------------
+
 static void resolveUserReferences()
 {
   QDictIterator<SectionInfo> sdi(sectionDict);
@@ -4931,17 +4984,6 @@ static void generateGroupDocs()
   GroupDef *gd;
   for (;(gd=gli.current());++gli)
   {
-    //printf("group %s #members=%d\n",gd->name().data(),gd->countMembers());
-    //if (gd->countMembers()>0) 
-    //{
-    // gd->writeDocumentation(*outputList);
-    //}
-    //else
-    //{
-    //  warn(gd->getDefFileName(),gd->getDefLine(),
-    //       "Warning: group %s does not have any (documented) members.",
-    //        gd->name().data());
-    //}
     if (!gd->isReference())
     {
       gd->writeDocumentation(*outputList);
@@ -4950,6 +4992,23 @@ static void generateGroupDocs()
 }
 
 //----------------------------------------------------------------------------
+
+static void generatePackageDocs()
+{
+  writePackageIndex(*outputList);
+  
+  if (packageDict.count()>0)
+  {
+    PackageSDict::Iterator pdi(packageDict);
+    PackageDef *pd;
+    for (pdi.toFirst();(pd=pdi.current());++pdi)
+    {
+      pd->writeDocumentation(*outputList);
+    }
+  }
+}
+
+//----------------------------------------------------------------------------
 // generate module pages
 
 static void generateNamespaceDocs()
@@ -5581,7 +5640,7 @@ static void readFormulaRepository()
 
 static void usage(const char *name)
 {
-  msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2000\n\n",versionString);
+  msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2001\n\n",versionString);
   msg("You can use doxygen in four ways:\n\n");
   msg("1) Use doxygen to generate a template configuration file:\n");
   msg("    %s [-s] -g [configName]\n\n",name);
@@ -6126,6 +6185,9 @@ int main(int argc,char **argv)
   msg("Building page list...\n");
   buildPageList(root);
 
+  msg("Buidling package list...\n");
+  buildPackageList(root);
+
   msg("Search for main page...\n");
   findMainPage(root);
 
@@ -6145,6 +6207,9 @@ int main(int argc,char **argv)
   msg("Computing member relations...\n");
   computeMemberRelations();
 
+  msg("Adding classes to their packages...\n");
+  addClassesToPackages();
+
   if (Config::haveDotFlag && Config::collGraphFlag)
   {
     msg("Computing class implementation usage relations...\n");
@@ -6208,7 +6273,7 @@ int main(int argc,char **argv)
   documentedNamespaces       = countNamespaces();
   documentedNamespaceMembers = countNamespaceMembers();
   documentedPages            = countRelatedPages();
-  //documentedIncludeFiles     = countIncludeFiles();
+  documentedPackages         = countPackages();
  
   // compute the shortest possible names of all files
   // without loosing the uniqueness of the file names.
@@ -6248,6 +6313,9 @@ int main(int argc,char **argv)
   msg("Generating group index...\n");
   writeGroupIndex(*outputList);
   
+  msg("Generating package index...\n");
+  generatePackageDocs();
+
   msg("Generating example index...\n");
   writeExampleIndex(*outputList);
   
diff --git a/src/doxygen.h b/src/doxygen.h
index edfe602..00b339c 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -32,32 +32,7 @@
 #include "formula.h"
 #include "section.h"
 #include "membergroup.h"
-
-class BufStr : public QCString
-{
-  public:
-    BufStr(int size) : QCString(size), offset(0), spareRoom(10240) {}
-    void addChar(char c)
-    {
-      if (offset>=size()) resize(size()+spareRoom);
-      data()[offset++]=c;
-    }
-    void addArray(const char *a,int len)
-    {
-      if (offset+len>=size()) resize(size()+len+spareRoom);
-      memcpy(data()+offset,a,len);
-      offset+=len;
-    }
-    uint curPos() { return offset; }
-    void skip(uint s)
-    {
-      if (offset+s>=size()) resize(size()+s+spareRoom);
-      offset+=s;
-    }
-  private:
-    uint offset;
-    const int spareRoom; // 10Kb extra room to avoid frequent resizing
-};
+#include "packagedef.h"
 
 class PageSList;
 class PageSDict;
@@ -83,7 +58,6 @@ extern MemberNameList memberNameList;
 extern MemberNameList functionNameList;
 extern MemberNameDict memberNameDict;
 extern MemberNameDict functionNameDict;
-//extern StringDict substituteDict;
 extern FileList fileList;
 extern FileDict fileDict;
 extern ClassDef unrelatedClass; 
@@ -104,6 +78,7 @@ extern StringDict aliasDict;
 extern QIntDict<QCString> memberHeaderDict; // dictionary of the member groups heading
 extern QIntDict<QCString> memberDocDict;    // dictionary of the member groups heading
 extern QDict<void> expandAsDefinedDict;
+extern PackageSDict packageDict;
 
 extern int annotatedClasses;
 extern int hierarchyClasses;
@@ -117,6 +92,7 @@ extern int documentedNamespaces;
 extern int documentedNamespaceMembers;
 extern int documentedIncludeFiles;
 extern int documentedPages;
+extern int documentedPackages;
 extern QCString spaces;
 
 extern const char * getOverloadDocs();
diff --git a/src/doxygen.pro.in b/src/doxygen.pro.in
index 92c60f8..b08a714 100644
--- a/src/doxygen.pro.in
+++ b/src/doxygen.pro.in
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
+# Copyright (C) 1997-2001 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
@@ -28,7 +28,7 @@ HEADERS      =	doxygen.h scanner.h doc.h classdef.h classlist.h memberdef.h \
                 translator_ru.h translator_pl.h dot.h rtfgen.h xml.h xml_dtd.h \
                 reflist.h page.h sortdict.h translator_hu.h translator_kr.h \
                 translator_ro.h translator_si.h translator_cn.h ftvhelp.h \
-                treeview.h tagreader.h
+                treeview.h tagreader.h packagedef.h
 SOURCES      =	doxygen.cpp scanner.cpp doc.cpp classdef.cpp classlist.cpp \
                 memberdef.cpp membername.cpp index.cpp memberlist.cpp \
 		entry.cpp logos.cpp instdox.cpp message.cpp code.cpp \
@@ -39,7 +39,7 @@ SOURCES      =	doxygen.cpp scanner.cpp doc.cpp classdef.cpp classlist.cpp \
 		diagram.cpp gifenc.cpp image.cpp namespacedef.cpp \
 		version.cpp language.cpp definition.cpp formula.cpp debug.cpp \
 		membergroup.cpp htmlhelp.cpp dot.cpp rtfgen.cpp xml.cpp \
-                reflist.cpp ftvhelp.cpp tagreader.cpp
+                reflist.cpp ftvhelp.cpp tagreader.cpp packagedef.cpp
 unix:LIBS                  += -L../qtools -lqtools
 win32:INCLUDEPATH          += .
 win32-mingw:LIBS           += -L../qtools -lqtools
diff --git a/src/doxygen.t b/src/doxygen.t
index d1f6a64..0608894 100644
--- a/src/doxygen.t
+++ b/src/doxygen.t
@@ -1,7 +1,7 @@
 #
 # 
 #
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
+# Copyright (C) 1997-2001 by Dimitri van Heesch.
 #
 # Permission to use, copy, modify, and distribute this software and its
 # documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/doxysearch.cpp b/src/doxysearch.cpp
index d14cf37..ddbdedd 100644
--- a/src/doxysearch.cpp
+++ b/src/doxysearch.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/doxytag.l b/src/doxytag.l
index 2d9e7b4..e2f3a55 100644
--- a/src/doxytag.l
+++ b/src/doxytag.l
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -500,7 +500,7 @@ void parseFileOrDir(const char *fileName)
 
 void usage(const char *name)
 {
-  fprintf(stderr,"Doxytag version %s\nCopyright Dimitri van Heesch 1997-2000\n\n",
+  fprintf(stderr,"Doxytag version %s\nCopyright Dimitri van Heesch 1997-2001\n\n",
       versionString);
   fprintf(stderr,"  Generates a tag file and/or a search index for a set of HTML files\n\n");
   fprintf(stderr,"Usage: %s [-t tag_file] [-s index_file] [ html_file [html_file...] ]\n",name);
diff --git a/src/entry.cpp b/src/entry.cpp
index 829bc3b..297831f 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/entry.h b/src/entry.h
index 2968b1e..05d85c1 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -107,6 +107,7 @@ class Entry
 {
   public:
 
+    /*! Kind of entries that are supported */
     enum Sections { 
       CLASS_SEC        = 0x00000001, 
       STRUCT_SEC       = 0x00000002,
@@ -150,7 +151,8 @@ class Entry
       USINGDIR_SEC     = 0x01100000,
       MAINPAGEDOC_SEC  = 0x01200000,
       MEMBERGRP_SEC    = 0x01300000,
-      USINGDECL_SEC    = 0x01400000
+      USINGDECL_SEC    = 0x01400000,
+      PACKAGE_SEC      = 0x01500000
     };
     enum MemberSpecifier
     {
@@ -167,48 +169,48 @@ class Entry
     void	addSubEntry (Entry* e) ;
     void        reset();
 
-    int        section;       // entry type (see Sections);
-    Protection protection;    // class protection
-    MethodTypes mtype;        // signal, slot, (dcop) method, or property?
-    bool stat;                // static ?
-    bool explicitExternal;    // explicitly defined as external?
-    bool proto;               // prototype ?
-    int  memSpec;             // member specifiers
-    int  initLines;           // define/variable initializer lines to show 
-    bool subGrouping;         // automatically group class members?
-    Specifier    virt;        // virtualness of the entry 
-    Entry       *parent;      // parent node in the tree
-    QCString	 type;        // member type 
-    QCString	 name;        // member name
-    QCString     args;        // member argument string
-    QCString     bitfields;   // member's bit fields
-    ArgumentList *argList;    // member arguments as a list
-    ArgumentList *tArgList;   // template argument list
-    ArgumentList *mtArgList;  // member template argument list
-    QCString     scopeSpec;   // template specialization of the scope
-    QCString     memberSpec;  // template specialization of the member
-    QCString	 program;     // the program text
-    QCString     initializer; // initial value (for variables)
-    QCString     includeFile; // include file (2 arg of \class, must be unique)
-    QCString     includeName; // include name (3 arg of \class)
-    QCString     doc;         // documentation block (partly parsed)
-    QCString     relates;     // related class (doc block)
-    QCString     brief;       // brief description (doc block)
-    QCString     inside;      // name of the class in which documents are found
-    QCString     exception;   // throw specification
-    int          bodyLine;    // line number of the definition in the source
-    int          endBodyLine; // line number where the definition ends
-    int          mGrpId;      // member group id
-    QList<Entry>    *sublist; // entries that are children of this one
-    QList<BaseInfo> *extends; // list of base classes
-    QList<QCString> *groups;  // list of groups this entry belongs to
-    QList<QCString> *anchors; // list of anchors defined in this entry
-    QCString	fileName;     // file this entry was extracted from
-    int		startLine;    // start line of entry in the source
-    int         todoId;       // id of the todo item of this entry
-    int         testId;       // id of the test item of this entry
-    TagInfo    *tagInfo;      // tag file info
-    static int  num;          // counts the total number of entries
+    int        section;       //!< entry type (see Sections);
+    Protection protection;    //!< class protection
+    MethodTypes mtype;        //!< signal, slot, (dcop) method, or property?
+    bool stat;                //!< static ?
+    bool explicitExternal;    //!< explicitly defined as external?
+    bool proto;               //!< prototype ?
+    int  memSpec;             //!< member specifiers
+    int  initLines;           //!< define/variable initializer lines to show 
+    bool subGrouping;         //!< automatically group class members?
+    Specifier    virt;        //!< virtualness of the entry 
+    Entry       *parent;      //!< parent node in the tree
+    QCString	 type;        //!< member type 
+    QCString	 name;        //!< member name
+    QCString     args;        //!< member argument string
+    QCString     bitfields;   //!< member's bit fields
+    ArgumentList *argList;    //!< member arguments as a list
+    ArgumentList *tArgList;   //!< template argument list
+    ArgumentList *mtArgList;  //!< member template argument list
+    QCString     scopeSpec;   //!< template specialization of the scope
+    QCString     memberSpec;  //!< template specialization of the member
+    QCString	 program;     //!< the program text
+    QCString     initializer; //!< initial value (for variables)
+    QCString     includeFile; //!< include file (2 arg of \class, must be unique)
+    QCString     includeName; //!< include name (3 arg of \class)
+    QCString     doc;         //!< documentation block (partly parsed)
+    QCString     relates;     //!< related class (doc block)
+    QCString     brief;       //!< brief description (doc block)
+    QCString     inside;      //!< name of the class in which documents are found
+    QCString     exception;   //!< throw specification
+    int          bodyLine;    //!< line number of the definition in the source
+    int          endBodyLine; //!< line number where the definition ends
+    int          mGrpId;      //!< member group id
+    QList<Entry>    *sublist; //!< entries that are children of this one
+    QList<BaseInfo> *extends; //!< list of base classes
+    QList<QCString> *groups;  //!< list of groups this entry belongs to
+    QList<QCString> *anchors; //!< list of anchors defined in this entry
+    QCString	fileName;     //!< file this entry was extracted from
+    int		startLine;    //!< start line of entry in the source
+    int         todoId;       //!< id of the todo item of this entry
+    int         testId;       //!< id of the test item of this entry
+    TagInfo    *tagInfo;      //!< tag file info
+    static int  num;          //!< counts the total number of entries
   private:
     Entry &operator=(const Entry &); 
 } ;
diff --git a/src/example.h b/src/example.h
index d531978..425b488 100644
--- a/src/example.h
+++ b/src/example.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/filedef.cpp b/src/filedef.cpp
index b27f8ac..6402df3 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -57,6 +57,7 @@ FileDef::FileDef(const char *p,const char *nm,const char *lref)
   srcMemberDict = 0;
   usingDirList = 0;
   usingDeclList = 0;
+  package = 0;
   isSource = FALSE; 
   docname = nm;
   if (Config::fullPathNameFlag)
diff --git a/src/filedef.h b/src/filedef.h
index 510b49a..6d0f71c 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -37,6 +37,7 @@ class NamespaceList;
 class NamespaceDict;
 class MemberGroupList;
 class MemberGroupDict;
+class PackageDef;
 
 struct IncludeInfo
 {
@@ -116,6 +117,9 @@ class FileDef : public Definition
     void insertNamespace(NamespaceDef *nd);
     void computeAnchors();
 
+    void setPackageDef(PackageDef *pd) { package=pd; }
+    PackageDef *packageDef() const { return package; }
+    
     void addUsingDirective(NamespaceDef *nd);
     NamespaceList *getUsedNamespaces() const { return usingDirList; }
     void addUsingDeclaration(ClassDef *cd);
@@ -169,6 +173,8 @@ class FileDef : public Definition
     /* user defined member groups */
     MemberGroupList *memberGroupList;
     MemberGroupDict *memberGroupDict;
+
+    PackageDef *package;
 };
 
 #if 0 // obsolete 
diff --git a/src/filename.cpp b/src/filename.cpp
index e5f224a..7214ee8 100644
--- a/src/filename.cpp
+++ b/src/filename.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/filename.h b/src/filename.h
index 48c73ec..59928d7 100644
--- a/src/filename.h
+++ b/src/filename.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/formula.cpp b/src/formula.cpp
index abe529a..065f036 100644
--- a/src/formula.cpp
+++ b/src/formula.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/formula.h b/src/formula.h
index a17f279..2c2fd51 100644
--- a/src/formula.h
+++ b/src/formula.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/gifenc.cpp b/src/gifenc.cpp
index 458d050..cdc1481 100644
--- a/src/gifenc.cpp
+++ b/src/gifenc.cpp
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/gifenc.h b/src/gifenc.h
index 0aff24e..2ec1d7b 100644
--- a/src/gifenc.h
+++ b/src/gifenc.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 501ceb0..faccc93 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/groupdef.h b/src/groupdef.h
index b8aaa40..649f70d 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 86c90e9..fdd71e4 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -144,7 +144,7 @@ void HtmlGenerator::writeFooterFile(QFile &file)
     << "align=\"middle\" border=0 width=110 height=53>\n"
     << "</a> $doxygenversion written by"
     << " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n"
-    << " &copy;&nbsp;1997-2000</small></address>\n"
+    << " &copy;&nbsp;1997-2001</small></address>\n"
     << "</body>\n"
     << "</html>\n";
 }
@@ -235,7 +235,7 @@ void HtmlGenerator::writeFooter(int part,bool external)
     default:
       if (footer.isEmpty())
         t << " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n &copy;&nbsp;"
-             "1997-2000</small></address>\n</body>\n</html>\n";
+             "1997-2001</small></address>\n</body>\n</html>\n";
       break;
       
   }
@@ -430,7 +430,9 @@ void HtmlGenerator::endTextLink()
 
 void HtmlGenerator::writeHtmlLink(const char *url,const char *text)
 {
-  t << "<a href=\"";
+  t << "<a ";
+  if (Config::ftvHelpFlag) t << "target=\"top\" ";
+  t << "href=\"";
   if (url) t << url;
   t << "\">"; 
   docify(text);
diff --git a/src/htmlgen.h b/src/htmlgen.h
index 0a0ebf1..4d7fa4f 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp
index 1802a48..5ec135d 100644
--- a/src/htmlhelp.cpp
+++ b/src/htmlhelp.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/htmlhelp.h b/src/htmlhelp.h
index cb899c6..affadb2 100644
--- a/src/htmlhelp.h
+++ b/src/htmlhelp.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/image.cpp b/src/image.cpp
index 17d89b4..ccfa65f 100644
--- a/src/image.cpp
+++ b/src/image.cpp
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/image.h b/src/image.h
index 3d4b1a4..178996b 100644
--- a/src/image.h
+++ b/src/image.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/index.cpp b/src/index.cpp
index 08a77cd..15cc2d4 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -36,6 +36,7 @@
 #include "ftvhelp.h"
 #include "dot.h"
 #include "page.h"
+#include "packagedef.h"
 
 //----------------------------------------------------------------------------
 
@@ -43,6 +44,8 @@ static bool g_memberIndexLetterUsed[256];
 static bool g_fileIndexLetterUsed[256];
 static bool g_namespaceIndexLetterUsed[256];
 
+const int maxItemsBeforeQuickIndex = 50;
+
 //----------------------------------------------------------------------------
 
 // strips w from s iff s starts with w
@@ -829,14 +832,7 @@ void writeAnnotatedClassList(OutputList &ol)
   {
     if (cd->isLinkableInProject())
     {
-      QCString type;
-      switch (cd->compoundType())
-      {
-        case ClassDef::Class:      type="class";     break;
-        case ClassDef::Struct:     type="struct";    break;
-        case ClassDef::Union:      type="union";     break;
-        default:                   type="interface"; break;
-      }
+      QCString type=cd->compoundTypeString();
       ol.writeStartAnnoItem(type,cd->getOutputFileBase(),0,cd->displayName());
       if (!cd->briefDescription().isEmpty())
       {
@@ -859,7 +855,42 @@ void writeAnnotatedClassList(OutputList &ol)
         FTVHelp::getInstance()->addContentsItem(FALSE,cd->getReference(),cd->getOutputFileBase(),0,cd->name());
       }
     }
-    cd=classList.next(); 
+  }
+  ol.endIndexList();
+}
+
+//----------------------------------------------------------------------------
+
+void writePackageList(OutputList &ol)
+{
+  bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+  bool hasFtvHelp =  Config::generateHtml && Config::ftvHelpFlag  /*&& !Config::htmlHelpGroupsOnly*/;
+  ol.startIndexList(); 
+  PackageSDict::Iterator pdi(packageDict);
+  PackageDef *pd;
+  for (;(pd=pdi.current());++pdi)
+  {
+    ol.writeStartAnnoItem("package",pd->getOutputFileBase(),0,pd->name());
+    if (!pd->briefDescription().isEmpty())
+    {
+      ol.docify(" (");
+      OutputList briefOutput(&ol);
+      parseDoc(briefOutput,
+          pd->getDefFileName(),pd->getDefLine(),
+          pd->name(),0,
+          abbreviate(pd->briefDescription(),pd->name()));
+      ol+=briefOutput;
+      ol.docify(")");
+    }
+    ol.writeEndAnnoItem(pd->getOutputFileBase());
+    if (hasHtmlHelp)
+    {
+      HtmlHelp::getInstance()->addContentsItem(FALSE,pd->name(),pd->getOutputFileBase());
+    }
+    if (hasFtvHelp)
+    {
+      FTVHelp::getInstance()->addContentsItem(FALSE,pd->getReference(),pd->getOutputFileBase(),0,pd->name());
+    }
   }
   ol.endIndexList();
 }
@@ -1042,7 +1073,6 @@ void writeAnnotatedIndex(OutputList &ol)
 
   if (annotatedClasses==0) return;
   
-  //if (classList.count()==0) return;
   ol.pushGeneratorState();
   ol.disable(OutputGenerator::Man);
   startFile(ol,"annotated","Annotated Index");
@@ -1069,7 +1099,6 @@ void writeAnnotatedIndex(OutputList &ol)
     ftvHelp->incContentsDepth();
   }
   parseText(ol,theTranslator->trCompoundListDescription());
-  //ol.newParagraph();
   ol.endTextBlock();
   writeAnnotatedClassList(ol);
   if (hasHtmlHelp)
@@ -1082,7 +1111,56 @@ void writeAnnotatedIndex(OutputList &ol)
   }
   
   endFile(ol);
-  //ol.enable(OutputGenerator::Man);
+  ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+
+void writePackageIndex(OutputList &ol)
+{
+  bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+  bool hasFtvHelp  = Config::generateHtml && Config::ftvHelpFlag  /*&& !Config::htmlHelpGroupsOnly*/;
+
+  if (documentedPackages==0) return;
+  
+  ol.pushGeneratorState();
+  ol.disable(OutputGenerator::Man);
+  startFile(ol,"packages","Package Index");
+  startTitle(ol,0);
+  QCString title = theTranslator->trPackageList();
+  QCString htmlHelpTitle = title;
+  QCString ftvHelpTitle =  title;
+  if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
+  parseText(ol,title);
+  endTitle(ol,0,0);
+  ol.startTextBlock();
+  HtmlHelp *htmlHelp = 0;
+  FTVHelp  *ftvHelp = 0;
+  if (hasHtmlHelp)
+  {
+    htmlHelp = HtmlHelp::getInstance();
+    htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"packages"); 
+    htmlHelp->incContentsDepth();
+  }
+  if (hasFtvHelp)
+  {
+    ftvHelp = FTVHelp::getInstance();
+    ftvHelp->addContentsItem(TRUE,0,"packages",0,ftvHelpTitle); 
+    ftvHelp->incContentsDepth();
+  }
+  parseText(ol,theTranslator->trPackageListDescription());
+  ol.endTextBlock();
+  writePackageList(ol);
+  if (hasHtmlHelp)
+  {
+    htmlHelp->decContentsDepth();
+  }
+  if (hasFtvHelp)
+  {
+    ftvHelp->decContentsDepth();
+  }
+  
+  endFile(ol);
   ol.popGeneratorState();
 }
 
@@ -1240,14 +1318,30 @@ void writeMemberIndex(OutputList &ol)
   ol.pushGeneratorState();
   ol.disableAllBut(OutputGenerator::Html);
   startFile(ol,"functions","Compound Member Index");
+  QCString title = theTranslator->trCompoundMembers();
+  QCString htmlHelpTitle = title;
+  QCString ftvHelpTitle =  title;
+  if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
   startTitle(ol,0);
-  parseText(ol,Config::projectName+" "+theTranslator->trCompoundMembers());
+  parseText(ol,title);
   endTitle(ol,0,0);
-  bool quickIndex = documentedMembers>50;
+  bool quickIndex = documentedMembers>maxItemsBeforeQuickIndex;
   if (quickIndex)
   {
     writeQuickMemberIndex(ol,g_memberIndexLetterUsed);
   }
+  bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
+  bool hasFtvHelp =  Config::generateHtml && Config::ftvHelpFlag;
+  if (hasHtmlHelp)
+  {
+    HtmlHelp *htmlHelp = HtmlHelp::getInstance();
+    htmlHelp->addContentsItem(FALSE,htmlHelpTitle,"functions"); 
+  }
+  if (hasFtvHelp)
+  {
+    FTVHelp *ftvHelp = FTVHelp::getInstance();
+    ftvHelp->addContentsItem(FALSE,0,"functions",0,ftvHelpTitle); 
+  }
   parseText(ol,theTranslator->trCompoundMembersDescription(Config::extractAllFlag));
   writeMemberList(ol,quickIndex);
   endFile(ol);
@@ -1342,7 +1436,6 @@ void writeNamespaceMemberList(OutputList &ol,bool useSections)
 {
   char lastChar=0;
   bool first=TRUE;
-  //ol.startItemList();
   MemberName *mn=functionNameList.first();
   while (mn)
   {
@@ -1375,6 +1468,11 @@ void writeNamespaceMemberList(OutputList &ol,bool useSections)
           first=FALSE;
         }
       }
+      else if (first)
+      {
+        ol.startItemList();
+        first=FALSE;
+      }
       ol.writeListItem();
       ol.docify(md->name());
       if (md->isFunction()) ol.docify("()");
@@ -1404,7 +1502,7 @@ void writeNamespaceMemberList(OutputList &ol,bool useSections)
     }
     mn=functionNameList.next();
   }
-  ol.endItemList();
+  if (!first) ol.endItemList();
 }
 
 //----------------------------------------------------------------------------
@@ -1476,14 +1574,30 @@ void writeFileMemberIndex(OutputList &ol)
   ol.pushGeneratorState();
   ol.disableAllBut(OutputGenerator::Html);
   startFile(ol,"globals","File Member Index");
+  QCString title = theTranslator->trFileMembers();
+  QCString htmlHelpTitle = title;
+  QCString ftvHelpTitle =  title;
+  if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
   startTitle(ol,0);
-  parseText(ol,Config::projectName+" "+theTranslator->trFileMembers());
+  parseText(ol,title);
   endTitle(ol,0,0);
-  bool quickIndex = documentedMembers>50;
+  bool quickIndex = documentedMembers>maxItemsBeforeQuickIndex;
   if (quickIndex)
   {
     writeQuickMemberIndex(ol,g_fileIndexLetterUsed);
   }
+  bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
+  bool hasFtvHelp =  Config::generateHtml && Config::ftvHelpFlag;
+  if (hasHtmlHelp)
+  {
+    HtmlHelp *htmlHelp = HtmlHelp::getInstance();
+    htmlHelp->addContentsItem(FALSE,htmlHelpTitle,"globals"); 
+  }
+  if (hasFtvHelp)
+  {
+    FTVHelp *ftvHelp = FTVHelp::getInstance();
+    ftvHelp->addContentsItem(FALSE,0,"globals",0,ftvHelpTitle); 
+  }
   parseText(ol,theTranslator->trFileMembersDescription(Config::extractAllFlag));
   writeFileMemberList(ol,quickIndex);
   endFile(ol);
@@ -1498,14 +1612,30 @@ void writeNamespaceMemberIndex(OutputList &ol)
   ol.pushGeneratorState();
   ol.disableAllBut(OutputGenerator::Html);
   startFile(ol,"namespacemembers","Namespace Member Index");
+  QCString title = theTranslator->trNamespaceMembers();
+  QCString htmlHelpTitle = title;
+  QCString ftvHelpTitle =  title;
+  if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
   startTitle(ol,0);
-  parseText(ol,Config::projectName+" "+theTranslator->trNamespaceMembers());
+  parseText(ol,title);
   endTitle(ol,0,0);
-  bool quickIndex = documentedMembers>50;
+  bool quickIndex = documentedMembers>maxItemsBeforeQuickIndex;
   if (quickIndex)
   {
     writeQuickMemberIndex(ol,g_namespaceIndexLetterUsed);
   }
+  bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
+  bool hasFtvHelp =  Config::generateHtml && Config::ftvHelpFlag;
+  if (hasHtmlHelp)
+  {
+    HtmlHelp *htmlHelp = HtmlHelp::getInstance();
+    htmlHelp->addContentsItem(FALSE,htmlHelpTitle,"namespacemembers"); 
+  }
+  if (hasFtvHelp)
+  {
+    FTVHelp *ftvHelp = FTVHelp::getInstance();
+    ftvHelp->addContentsItem(FALSE,0,"namespacemembers",0,ftvHelpTitle); 
+  }
   parseText(ol,theTranslator->trNamespaceMemberDescription(Config::extractAllFlag));
   writeNamespaceMemberList(ol,quickIndex);
   endFile(ol);
@@ -1598,6 +1728,20 @@ int countRelatedPages()
 
 //----------------------------------------------------------------------------
 
+int countPackages()
+{
+  int count=0;
+  PackageSDict::Iterator pdi(packageDict);
+  PackageDef *pd=0;
+  for (pdi.toFirst();(pd=pdi.current());++pdi)
+  {
+    count++;
+  }
+  return count;
+}
+
+//----------------------------------------------------------------------------
+
 void writePageIndex(OutputList &ol)
 {
   if (documentedPages==0) return;
@@ -2121,6 +2265,13 @@ void writeIndex(OutputList &ol)
   }
   ol.enable(OutputGenerator::Latex);
 
+  
+  if (documentedPackages>0)
+  {
+    ol.startIndexSection(isPackageIndex);
+    parseText(ol,projPrefix+theTranslator->trPackageList());
+    ol.endIndexSection(isPackageIndex);
+  }
   if (documentedGroups>0)
   {
     ol.startIndexSection(isModuleIndex);
@@ -2158,6 +2309,12 @@ void writeIndex(OutputList &ol)
     ol.endIndexSection(isPageIndex);
   }
   ol.lastIndexPage();
+  if (documentedPackages>0)
+  {
+    ol.startIndexSection(isPackageDocumentation);
+    parseText(ol,projPrefix+theTranslator->trPackageDocumentation());
+    ol.endIndexSection(isPackageDocumentation);
+  }
   if (documentedGroups>0)
   {
     ol.startIndexSection(isModuleDocumentation);
diff --git a/src/index.h b/src/index.h
index d928a5b..0cb4b9d 100644
--- a/src/index.h
+++ b/src/index.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -26,12 +26,14 @@ enum IndexSections
   isTitlePageStart,
   isTitlePageAuthor,
   isMainPage,
+  isPackageIndex,
   isModuleIndex,
   isNamespaceIndex,
   isClassHierarchyIndex,
   isCompoundIndex,
   isFileIndex,
   isPageIndex,
+  isPackageDocumentation,
   isModuleDocumentation,
   isNamespaceDocumentation,
   isClassDocumentation,
@@ -63,6 +65,7 @@ void writeNamespaceIndex(OutputList &ol);
 void writeNamespaceMemberIndex(OutputList &ol);
 void writeGraphicalClassHierarchy(OutputList &ol);
 void writeGraphInfo(OutputList &ol);
+void writePackageIndex(OutputList &ol);
 
 int countClassHierarchy();
 int countClassMembers();
@@ -74,5 +77,6 @@ int countAnnotatedClasses();
 int countNamespaceMembers();
 int countIncludeFiles();
 int countRelatedPages();
+int countPackages();
 
 #endif
diff --git a/src/instdox.cpp b/src/instdox.cpp
index 97df7c6..b7d3ec4 100644
--- a/src/instdox.cpp
+++ b/src/instdox.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/instdox.h b/src/instdox.h
index f71c8fd..179b1db 100644
--- a/src/instdox.h
+++ b/src/instdox.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/language.cpp b/src/language.cpp
index 0711aa3..c6f5d78 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/language.h b/src/language.h
index d38f494..11840cb 100644
--- a/src/language.h
+++ b/src/language.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 416b5e3..1d15252 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -407,11 +407,11 @@ void LatexGenerator::writeStyleSheetFile(QFile &f)
   writeDefaultStyleSheetPart1(t);
   t << "Generated at " << dateToString(TRUE);
   if (Config::projectName.isEmpty()) t << " for " << Config::projectName << " ";
-  t << "by doxygen written by Dimitri van Heesch \\copyright~1997-2000";
+  t << "by doxygen written by Dimitri van Heesch \\copyright~1997-2001";
   writeDefaultStyleSheetPart2(t);
   t << "Generated at " << dateToString(TRUE);
   if (Config::projectName.isEmpty()) t << " for " << Config::projectName << " ";
-  t << "by doxygen written by Dimitri van Heesch \\copyright~1997-2000";
+  t << "by doxygen written by Dimitri van Heesch \\copyright~1997-2001";
   writeDefaultStyleSheetPart3(t);
 }
 
@@ -464,6 +464,10 @@ void LatexGenerator::startIndexSection(IndexSections is)
       if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
       t << "{"; //Introduction}\n"
       break;
+    case isPackageIndex:
+      if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
+      t << "{"; //Package Index}\n"
+      break;
     case isModuleIndex:
       if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
       t << "{"; //Module Index}\n"
@@ -488,6 +492,21 @@ void LatexGenerator::startIndexSection(IndexSections is)
       if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
       t << "{"; //Annotated Page Index}\n"
       break;
+    case isPackageDocumentation:
+      {
+        PackageSDict::Iterator pdi(packageDict);
+        PackageDef *pd=pdi.toFirst();
+        bool found=FALSE;
+        while (pd && !found)
+        {
+          if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
+          t << "{"; 
+          found=TRUE;
+          ++pdi;
+          pd=pdi.current();
+        }
+      }
+      break;
     case isModuleDocumentation:
       {
         GroupDef *gd=groupList.first();
@@ -595,6 +614,9 @@ void LatexGenerator::endIndexSection(IndexSections is)
       if (Config::pdfHyperFlag) t << "\\hypertarget{index}{}";
       t << "\\input{index}\n";
       break;
+    case isPackageIndex:
+      t << "}\n\\input{packages}\n";
+      break;
     case isModuleIndex:
       t << "}\n\\input{modules}\n";
       break;
@@ -613,6 +635,27 @@ void LatexGenerator::endIndexSection(IndexSections is)
     case isPageIndex:
       t << "}\n\\input{pages}\n";
       break;
+    case isPackageDocumentation:
+      {
+        PackageSDict::Iterator pdi(packageDict);
+        PackageDef *pd=pdi.toFirst();
+        bool found=FALSE;
+        while (pd && !found)
+        {
+          t << "}\n\\input{" << pd->getOutputFileBase() << "}\n";
+          found=TRUE;
+          ++pdi;
+          pd=pdi.current();
+        }
+        while (pd)
+        {
+          if (Config::compactLatexFlag) t << "\\input"; else t << "\\include";
+          t << "{" << pd->getOutputFileBase() << "}\n";
+          ++pdi;
+          pd=pdi.current();
+        }
+      }
+      break;
     case isModuleDocumentation:
       {
         GroupDef *gd=groupList.first();
@@ -774,14 +817,14 @@ void LatexGenerator::writeStyleInfo(int part)
       break;
     case 2:
       {
-        t << " Dimitri van Heesch \\copyright~1997-2000";
+        t << " Dimitri van Heesch \\copyright~1997-2001";
         t << "}]{}\n";
         writeDefaultStyleSheetPart2(t);
       }
       break;
     case 4:
       {
-        t << " Dimitri van Heesch \\copyright~1997-2000";
+        t << " Dimitri van Heesch \\copyright~1997-2001";
         writeDefaultStyleSheetPart3(t);
         endPlainFile();
       }
diff --git a/src/latexgen.h b/src/latexgen.h
index 4095eb5..f298953 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -113,7 +113,7 @@ class LatexGenerator : public OutputGenerator
     void startPreFragment()  { t << "\\small\\begin{alltt}"; }
     void endPreFragment()    { t << "\\end{alltt}\\normalsize " << endl; }
     void startCodeLine() { col=0; }
-    void endCodeLine() { t << endl; }
+    void endCodeLine() { codify("\n"); }
     void writeBoldString(const char *text) 
                          { t << "{\\bf "; docify(text); t << "}"; }
     void startEmphasis() { t << "{\\em ";  }
diff --git a/src/logos.cpp b/src/logos.cpp
index 92bc08e..43d7b46 100644
--- a/src/logos.cpp
+++ b/src/logos.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/logos.h b/src/logos.h
index d8f84a5..71019f8 100644
--- a/src/logos.h
+++ b/src/logos.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/mangen.cpp b/src/mangen.cpp
index 852a0f4..1a61011 100644
--- a/src/mangen.cpp
+++ b/src/mangen.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/mangen.h b/src/mangen.h
index 39d9f2d..f342069 100644
--- a/src/mangen.h
+++ b/src/mangen.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -109,7 +109,7 @@ class ManGenerator : public OutputGenerator
     void startPreFragment() { startCodeFragment(); }
     void endPreFragment() { endCodeFragment(); }
     void startCodeLine() {}
-    void endCodeLine() { t << endl; col=0; }
+    void endCodeLine() { codify("\n"); col=0; }
     void writeBoldString(const char *text) 
                          { t << "\\fB"; docify(text); t << "\\fR"; firstCol=FALSE; }
     void startEmphasis() { t << "\\fI"; firstCol=FALSE; }
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index c6c5354..0d87093 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -658,6 +658,10 @@ void MemberDef::writeDeclaration(OutputList &ol,
     {
       writeTemplatePrefix(ol,tArgList,FALSE);
     }
+    else if (membTAL)
+    {
+      writeTemplatePrefix(ol,membTAL,FALSE);
+    }
     
     if (i!=-1) // member has an anonymous type
     {
@@ -818,7 +822,14 @@ void MemberDef::writeDeclaration(OutputList &ol,
         ol.disableAllBut(OutputGenerator::Html);
         ol.endEmphasis();
         ol.docify(" ");
-        ol.startTextLink(0,anchor());
+        if (group!=0 && gd==0) // forward link to the group
+        {
+          ol.startTextLink(group->getOutputFileBase(),anchor());
+        }
+        else
+        {
+          ol.startTextLink(0,anchor());
+        }
         parseText(ol,theTranslator->trMore());
         ol.endTextLink();
         ol.startEmphasis();
@@ -1396,7 +1407,7 @@ bool MemberDef::isLinkable()
 bool MemberDef::detailsAreVisible() const          
 { 
   return !documentation().isEmpty() || // has detailed docs
-         (Config::sourceBrowseFlag && startBodyLine!=-1 && bodyDef) ||  // has reference to sources 
+         //(Config::sourceBrowseFlag && startBodyLine!=-1 && bodyDef) ||  // has reference to sources 
          (mtype==Enumeration && docEnumValues) ||  // has enum values
          (mtype==EnumValue && !briefDescription().isEmpty()) || // is doc enum value
          (!briefDescription().isEmpty() && 
diff --git a/src/memberdef.h b/src/memberdef.h
index 7f211f1..36b3c45 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index f1bf6bb..f96dc06 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/membergroup.h b/src/membergroup.h
index 01312b2..8ddcb66 100644
--- a/src/membergroup.h
+++ b/src/membergroup.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index 964607f..142e2f2 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/memberlist.h b/src/memberlist.h
index 66efdb3..417abfd 100644
--- a/src/memberlist.h
+++ b/src/memberlist.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/membername.cpp b/src/membername.cpp
index 3c3a3d0..87b4c79 100644
--- a/src/membername.cpp
+++ b/src/membername.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/membername.h b/src/membername.h
index fb81a55..21282df 100644
--- a/src/membername.h
+++ b/src/membername.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/message.cpp b/src/message.cpp
index 112d5af..57aba79 100644
--- a/src/message.cpp
+++ b/src/message.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/message.h b/src/message.h
index df2bc94..ed47fa2 100644
--- a/src/message.h
+++ b/src/message.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index b92d2e5..9fe1a01 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/namespacedef.h b/src/namespacedef.h
index 884107e..d3c163d 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/outputgen.cpp b/src/outputgen.cpp
index 95ef0b0..490a80e 100644
--- a/src/outputgen.cpp
+++ b/src/outputgen.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/outputgen.h b/src/outputgen.h
index f890a30..49bd734 100644
--- a/src/outputgen.h
+++ b/src/outputgen.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/outputlist.cpp b/src/outputlist.cpp
index 01f0fc6..b41a97e 100644
--- a/src/outputlist.cpp
+++ b/src/outputlist.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/outputlist.h b/src/outputlist.h
index b964483..2d57034 100644
--- a/src/outputlist.h
+++ b/src/outputlist.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/packagedef.cpp b/src/packagedef.cpp
new file mode 100644
index 0000000..308f1f1
--- /dev/null
+++ b/src/packagedef.cpp
@@ -0,0 +1,122 @@
+/******************************************************************************
+ *
+ * 
+ *
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <ctype.h>
+#include "packagedef.h"
+#include "qtbc.h"
+#include "classdef.h"
+#include "classlist.h"
+#include "outputlist.h"
+#include "util.h"
+#include "config.h"
+#include "doc.h"
+#include "language.h"
+#include "doxygen.h"
+
+PackageDef::PackageDef(const char *df,int dl,const char *na) : 
+   Definition(df,dl,na)
+{
+  classList       = new ClassList;
+  packageFileName = "package_"+convertFileName(na);
+}
+
+PackageDef::~PackageDef()
+{
+  delete classList;
+}
+
+void PackageDef::addClass(const ClassDef *def)
+{
+  if (Config::sortMembersFlag)
+    classList->inSort(def);
+  else
+    classList->append(def);
+}
+
+void PackageDef::writeDocumentation(OutputList &ol)
+{
+  QCString title = theTranslator->trPackage(name());
+  ol.pushGeneratorState();
+  ol.disable(OutputGenerator::Man);
+  startFile(ol,getOutputFileBase(),title);
+  startTitle(ol,getOutputFileBase());
+  ol.docify(title);
+  endTitle(ol,getOutputFileBase(),title);
+
+  OutputList briefOutput(&ol);
+  if (!briefDescription().isEmpty())
+  {
+    parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
+    ol+=briefOutput;
+    ol.writeString(" \n");
+    ol.pushGeneratorState();
+    ol.disable(OutputGenerator::Latex);
+    ol.disable(OutputGenerator::RTF);
+    ol.startTextLink(0,"_details");
+    parseText(ol,theTranslator->trMore());
+    ol.endTextLink();
+    ol.popGeneratorState();
+  }
+
+  if (!Config::genTagFile.isEmpty())
+  {
+    tagFile << "  <compound kind=\"package\">" << endl;
+  }
+  
+  ol.startMemberSections();
+  ClassDef::CompoundType ct;
+  ct=ClassDef::Interface;
+  classList->writeDeclaration(ol,&ct,theTranslator->trInterfaces());
+  ct=ClassDef::Class;
+  classList->writeDeclaration(ol,&ct,theTranslator->trClasses());
+  ol.endMemberSections();
+
+  if (!Config::genTagFile.isEmpty())
+  {
+    tagFile << "  </compound>" << endl;
+  }
+  
+  if (!briefDescription().isEmpty() || !documentation().isEmpty())
+  {
+    ol.writeRuler();
+    ol.pushGeneratorState();
+    ol.disable(OutputGenerator::Latex);
+    ol.disable(OutputGenerator::RTF);
+    ol.writeAnchor(0,"_details");
+    ol.popGeneratorState();
+    ol.startGroupHeader();
+    parseText(ol,theTranslator->trDetailedDescription());
+    ol.endGroupHeader();
+
+    // repeat brief description
+    if (!briefDescription().isEmpty() && Config::repeatBriefFlag)
+    {
+      ol+=briefOutput;
+      ol.newParagraph();
+    }
+
+    // write documentation
+    if (!documentation().isEmpty())
+    {
+      parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
+    }
+  }
+
+  endFile(ol); 
+  ol.popGeneratorState();
+}
+
diff --git a/src/packagedef.h b/src/packagedef.h
new file mode 100644
index 0000000..7d5224a
--- /dev/null
+++ b/src/packagedef.h
@@ -0,0 +1,62 @@
+/******************************************************************************
+ *
+ * 
+ *
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef PACKAGEDEF_H
+#define PACKAGEDEF_H
+
+#include "qtbc.h"
+#include <qlist.h>
+#include <qdict.h>
+#include "definition.h"
+#include "sortdict.h"
+
+class ClassList;
+class ClassDef;
+class PackageList;
+class OutputList;
+
+class PackageDef : public Definition
+{
+  public:
+    PackageDef(const char *fName,int line, const char *name);
+   ~PackageDef();
+    DefType definitionType() { return TypePackage; }
+    QCString getOutputFileBase() const { return packageFileName; }
+    void addClass(const ClassDef *def);
+    void writeDocumentation(OutputList &ol);
+    bool isLinkableInProject()
+    {
+      return hasDocumentation() && !isReference();
+    }
+    bool isLinkable()
+    {
+      return isLinkableInProject() || isReference();
+    }
+
+  private: 
+    QCString packageFileName;           // base name of the generated file
+    ClassList *classList;               // list of classes in the package
+};
+
+class PackageSDict : public SDict<PackageDef>
+{
+  public:
+    PackageSDict(int size) : SDict<PackageDef>(size) {}
+};
+
+#endif
+
diff --git a/src/page.h b/src/page.h
index cbcf33c..dac8d19 100644
--- a/src/page.h
+++ b/src/page.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/pre.h b/src/pre.h
index 8d10236..f545c2f 100644
--- a/src/pre.h
+++ b/src/pre.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/pre.l b/src/pre.l
index 570bdc0..3b29529 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -43,6 +43,7 @@
 #include "util.h"
 #include "defargs.h"
 #include "debug.h"
+#include "bufstr.h"
 
 #if defined(_MSC_VER) || defined(__BORLANDC__)
 #define popen _popen
@@ -51,7 +52,6 @@
 
 #define YY_NEVER_INTERACTIVE 1
   
-#define SHOW_INCLUDES 0 // set this to one to list all parsed include files
 
 struct FileState
 {
@@ -317,7 +317,6 @@ static void processConcatOperators(QCString &expr)
 static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int &len,const Define *def,QCString &result)
 {
   //printf("replaceFunctionMacro(expr=%s,rest=%s,pos=%d,def=%s) level=%d\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),g_level);
-  //bool replaced=FALSE;
   uint j=pos;
   len=0;
   result.resize(0);
@@ -334,9 +333,6 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int
   }
   getNextChar(expr,rest,j); // eat the `(' character
 
-  //while (j<expr.length() && expr.at(j)!='(') j++; 
-  //j++; // skip opening paren
-
   QDict<QCString> argTable;  // list of arguments
   argTable.setAutoDelete(TRUE);
   QCString arg;
@@ -417,26 +413,34 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int
       else if (c=='\"') // append literal strings
       {
 	arg+=c; 
-	char pc=c;
 	bool found=FALSE;
 	while (!found && (cc=getNextChar(expr,rest,j))!=EOF)
 	{
-	  found = pc!='\\' && cc=='"';
+	  found = cc=='"';
+	  if (cc=='\\')
+	  {
+	    c=(char)cc;	  
+	    arg+=c;
+	    if ((cc=getNextChar(expr,rest,j))==EOF) break;
+	  }
 	  c=(char)cc;	  
-	  pc=c;
 	  arg+=c;
 	}
       }
       else if (c=='\'') // append literal characters
       {
 	arg+=c;
-	char pc=c;
 	bool found=FALSE;
 	while (!found && (cc=getNextChar(expr,rest,j))!=EOF)
 	{
-	  found = pc!='\\' && cc=='\'';
+	  found = cc=='\'';
+	  if (cc=='\\')
+	  {
+	    c=(char)cc;	  
+	    arg+=c;
+	    if ((cc=getNextChar(expr,rest,j))==EOF) break;
+	  }
 	  c=(char)cc;
-	  pc=c;
 	  arg+=c;
 	}
       }	    
@@ -876,10 +880,11 @@ static void readIncludeFile(const QCString &inc)
     //printf("Searching for `%s'\n",incFileName.data());
     if ((f=findFile(incFileName))) // see if the include file can be found
     {
-#if SHOW_INCLUDES
-      for (i=0;i<g_includeStack.count();i++) msg("  ");
-      msg("#include %s: parsing...\n",incFileName.data());
-#endif
+      if (Debug::isFlagSet(Debug::Preprocessor))
+      {
+        for (i=0;i<g_includeStack.count();i++) msg("  ");
+        msg("#include %s: parsing...\n",incFileName.data());
+      }
       if (oldFileDef) 
       {
 	// add include dependency to the file in which the #include was found
@@ -916,10 +921,11 @@ static void readIncludeFile(const QCString &inc)
   	  fd->addIncludedByDependency(oldFileDef,oldFileDef->name(),localInclude);
         }
       }
-#if SHOW_INCLUDES
-      msg("#include %s: not found! skipping...\n",incFileName.data());
-      //printf("Error: include file %s not found\n",yytext);
-#endif
+      if (Debug::isFlagSet(Debug::Preprocessor))
+      {
+        msg("#include %s: not found! skipping...\n",incFileName.data());
+        //printf("Error: include file %s not found\n",yytext);
+      }
     }
   }
 }
@@ -957,7 +963,7 @@ BN	[ \t\r\n]
 %x	DefinedExpr2
 %x	SkipDoubleQuote
 %x	SkipSingleQuote
-%x	Ung_defName
+%x	UndefName
 %x	IgnoreLine
 %x	FindDefineArgs
 %x	ReadString
@@ -1094,8 +1100,8 @@ BN	[ \t\r\n]
 					  g_roundCount--;
 					  if (g_roundCount==0)
 					  {
-					    //printf("g_defArgsStr=`%s'\n",g_defArgsStr.data());
 					    QCString result=expandMacro(g_defArgsStr);
+					    //printf("g_defArgsStr=`%s'->`%s'\n",g_defArgsStr.data(),result.data());
 					    if (g_findDefArgContext==CopyLine)
 					    {
 					      outputArray(result,result.length());
@@ -1114,7 +1120,7 @@ BN	[ \t\r\n]
   					  g_defArgsStr+=yytext;
   					}
   */
-<FindDefineArgs>"\""			{
+<FindDefineArgs>\"			{
   					  g_defArgsStr+=*yytext;
   					  BEGIN(ReadString);
   					}
@@ -1128,9 +1134,6 @@ BN	[ \t\r\n]
 <FindDefineArgs>.			{
   					  g_defArgsStr+=*yytext;
   					}
-<ReadString>"\\\""			{
-  					  g_defArgsStr+=yytext;
-  					}
 <ReadString>"\""			{
   					  g_defArgsStr+=*yytext;
 					  BEGIN(FindDefineArgs);
@@ -1138,6 +1141,9 @@ BN	[ \t\r\n]
 <ReadString>"//"|"/*"			{
   					  g_defArgsStr+=yytext;
   					}
+<ReadString>\\.				{
+  					  g_defArgsStr+=yytext;
+  					}
 <ReadString>.				{
   					  g_defArgsStr+=*yytext;
   					}
@@ -1207,7 +1213,7 @@ BN	[ \t\r\n]
 					  } 
   					}
 <Command>"undef"{B}+			{
-  					  BEGIN(Ung_defName);
+  					  BEGIN(UndefName);
   					}
 <Command>("elif"|"else"{B}*"if")/[ \t(]	{
   					  if (!otherCaseDone())
@@ -1228,9 +1234,13 @@ BN	[ \t\r\n]
 <Command>{ID}				{ // unknown directive
 					  BEGIN(IgnoreLine);
 					}
+<IgnoreLine>\\[\r]?\n			{
+  					  outputChar('\n');
+					  g_yyLineNr++;
+					}
 <IgnoreLine>.
 <Command>.
-<Ung_defName>{ID}				{
+<UndefName>{ID}			{
   					  Define *def;
   					  if ((def=isDefined(yytext)))
 					  {
diff --git a/src/qtbc.h b/src/qtbc.h
index 0091717..51f62dd 100644
--- a/src/qtbc.h
+++ b/src/qtbc.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/reflist.cpp b/src/reflist.cpp
index 8bef347..b67628e 100644
--- a/src/reflist.cpp
+++ b/src/reflist.cpp
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/reflist.h b/src/reflist.h
index f0d9958..1aa189e 100644
--- a/src/reflist.h
+++ b/src/reflist.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index 8a1dae2..b8d48ad 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Parker Waechter & Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Parker Waechter & Dimitri van Heesch.
  *
  * Style sheet additions by Alexander Bartolich
  *
@@ -778,6 +778,10 @@ void RTFGenerator::startIndexSection(IndexSections is)
       //Introduction
       beginRTFChapter();
       break;
+    case isPackageIndex:
+      //Package Index
+      beginRTFChapter();
+      break;
     case isModuleIndex:
       //Module Index
       beginRTFChapter();
@@ -803,6 +807,21 @@ void RTFGenerator::startIndexSection(IndexSections is)
       //Related Page Index
       beginRTFChapter();
       break;
+    case isPackageDocumentation:
+      {
+        //Package Documentation
+        PackageSDict::Iterator pdi(packageDict);
+        PackageDef *pd=pdi.toFirst();
+        bool found=FALSE;
+        while (pd && !found)
+        {
+          beginRTFChapter();
+          found=TRUE;
+          ++pdi;
+          pd=pdi.current();
+        }
+      }
+      break;
     case isModuleDocumentation:
       {
         //Module Documentation
@@ -932,6 +951,11 @@ void RTFGenerator::endIndexSection(IndexSections is)
       t << "{\\tc \\v " << theTranslator->trMainPage() << "}"<< endl;
       t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"index.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
       break;
+    case isPackageIndex:
+      t << "\\par " << Rtf_Style_Reset << endl;
+      t << "{\\tc \\v " << theTranslator->trPackageList() << "}"<< endl;
+      t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"packages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+      break;
     case isModuleIndex:
       t << "\\par " << Rtf_Style_Reset << endl;
       t << "{\\tc \\v " << theTranslator->trModuleIndex() << "}"<< endl;
@@ -962,6 +986,22 @@ void RTFGenerator::endIndexSection(IndexSections is)
       t << "{\\tc \\v " << theTranslator->trPageIndex() << "}"<< endl;
       t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
       break;
+    case isPackageDocumentation:
+      {
+        PackageSDict::Iterator pdi(packageDict);
+        PackageDef *pd=pdi.toFirst();
+        t << "{\\tc \\v " << theTranslator->trPackageDocumentation() << "}"<< endl;
+        while (pd)
+        {
+          t << "\\par " << Rtf_Style_Reset << endl;
+          t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+          t << pd->getOutputFileBase();
+          t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+          ++pdi;
+          pd=pdi.current();
+        }
+      }
+      break;
     case isModuleDocumentation:
       {
         GroupDef *gd=groupList.first();
diff --git a/src/rtfgen.h b/src/rtfgen.h
index 2631dc0..491b483 100644
--- a/src/rtfgen.h
+++ b/src/rtfgen.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Parker Waechter & Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Parker Waechter & Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/scanner.h b/src/scanner.h
index 0763e33..007dc5b 100644
--- a/src/scanner.h
+++ b/src/scanner.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/scanner.l b/src/scanner.l
index 6bf33ed..c831a9c 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -124,6 +124,7 @@ static QCString         baseName;
 static QCString*        specName;
 static QCString         formulaText;
 static bool             insideIDL = FALSE;
+static bool             insideJava = FALSE;
 static bool             insideCppQuote = FALSE;
 
 static int              argRoundCount;
@@ -374,6 +375,10 @@ A         [aA]
 BR	  [bB][rR]
 PRE       [pP][rR][eE]
 TABLE	  [tT][aA][bB][lL][eE]
+P	  [pP]
+UL        [uU][lL]
+OL	  [oO][lL]
+DL	  [dD][lL]
 TITLE     [tT][iI][tT][lL][eE]
 
 %option noyywrap
@@ -493,6 +498,7 @@ TITLE     [tT][iI][tT][lL][eE]
 %x	IDLUnionCase
 %x	NSAliasName
 %x	NSAliasArg
+%x	PackageName
 
 %%
 
@@ -507,7 +513,8 @@ TITLE     [tT][iI][tT][lL][eE]
 					  for( i = 0 ; yytext[i+1] != 6 ; i++ )
 					    yyFileName[i] = yytext[i+1] ;
 					  yyFileName[i] = 0 ;
-					  insideIDL = i>4 && strcmp(&yyFileName[i-4],".idl")==0;
+					  insideIDL  = i>4 && strcmp(&yyFileName[i-4],".idl")==0;
+					  insideJava = i>5 && strcmp(&yyFileName[i-5],".java")==0;
 					  msg("Parsing file %s...\n",yyFileName);
 					  current_root  = global_root ;
 					  initParser();
@@ -653,6 +660,22 @@ TITLE     [tT][iI][tT][lL][eE]
 <FindMembers>{BN}+			{
   					  lineCount();
   					}
+<FindMembers>{B}*"package"{BN}+ 	{ // Java package
+  					  lineCount();
+					  BEGIN(PackageName);
+  					}
+<PackageName>{ID}("."{ID})*		{
+  					  current->name = yytext;
+                                          current->fileName = yyFileName; 
+                                          current->startLine = yyLineNr; 
+  					  current->section=Entry::PACKAGE_SEC;
+					  current_root->addSubEntry(current);
+					  current = new Entry ;
+					  initEntry();
+  					}
+<PackageName>";"			{
+  					  BEGIN(FindMembers);
+  					}
 <FindMembers>{B}*"static"{BN}+     	{ //current->type += " static ";
   					  current->stat = TRUE;
 					  lineCount();
@@ -666,6 +689,10 @@ TITLE     [tT][iI][tT][lL][eE]
 					  current->virt = Virtual;
 					  lineCount();
 					}
+<FindMembers>{B}*"abstract"{BN}+    	{ current->type += " abstract ";
+					  current->virt = Pure;
+					  lineCount();
+					}
 <FindMembers>{B}*"inline"{BN}+		{ current->memSpec|=Entry::Inline;
                                           lineCount(); 
                                         }
@@ -903,7 +930,7 @@ TITLE     [tT][iI][tT][lL][eE]
 					  addType( current );
 					  current->name=n.left(n.length()-2);
 					}
-<FindMembers>{SCOPENAME}{BN}*/"<"	{
+<FindMembers>{SCOPENAME}{BN}*/"<"	{ // Note: this could be a return type!
   					  sharpCount=0;
 					  lineCount();
 					  addType( current );
@@ -982,6 +1009,13 @@ TITLE     [tT][iI][tT][lL][eE]
   					  *currentTemplateSpec+=*yytext; 
 					}
 <FindMembers,FindMemberName>{SCOPENAME}	{ 
+  					  // correct for misinterpreting return type as scope name: example: A<T> func()
+  					  if (YY_START==FindMembers && current->tArgList && current->mtArgList==0)
+					  {
+					    current->mtArgList=current->tArgList;
+					    current->tArgList=0;
+					    current->scopeSpec.resize(0);
+					  }
 					  lineCount();
                                           if (insideIDL && yyleng==9 && strcmp(yytext,"cpp_quote")==0)
 					  {
@@ -991,16 +1025,30 @@ TITLE     [tT][iI][tT][lL][eE]
 					  {
 					    BEGIN(IDLUnionCase);
 					  }
-					  else
+					  else 
 					  {
 					    if (YY_START==FindMembers)
 					    {
 					      addType( current ) ;
-					      current->name  = yytext;
+					    }
+					    if (insideJava && strcmp(yytext,"public")==0)
+					    {
+					      current->protection = Public;
+					    }
+					    else if (insideJava && strcmp(yytext,"protected")==0)
+					    {
+					      current->protection = Protected;
+					    }
+					    else if (insideJava && strcmp(yytext,"private")==0)
+					    {
+					      current->protection = Private;
 					    }
 					    else
 					    {
-					      current->name += yytext;
+					      if (YY_START==FindMembers)
+					        current->name  = yytext;
+					      else
+						current->name += yytext;
 					    }
 					    QCString tmp=yytext;
 					    if (nameIsOperator(tmp)) 
@@ -1337,6 +1385,8 @@ TITLE     [tT][iI][tT][lL][eE]
 					  {
 					    current = new Entry(*current);
 					    current->name.resize(0);
+					    current->args.resize(0);
+					    current->initializer.resize(0);
 					    int i=oldType.length(); 
 					    while (i>0 && (oldType[i-1]=='*' || oldType[i-1]=='&' || oldType[i-1]==' ')) i--;
 					    current->type = oldType.left(i);
@@ -1486,9 +1536,10 @@ TITLE     [tT][iI][tT][lL][eE]
 					      current_root->addSubEntry( current ) ;
 					      current = new Entry(*current);
 					      if (current->section==Entry::NAMESPACE_SEC || 
-						  current->section==Entry::INTERFACE_SEC
+						  current->section==Entry::INTERFACE_SEC ||
+						  insideJava
 						 )
-					      { // namespaces and interfaces ends with a closing bracket without semicolon
+					      { // namespaces and interfaces and java classes ends with a closing bracket without semicolon
 						current->reset();
 						initEntry();
 						BEGIN( FindMembers ) ;
@@ -2219,6 +2270,14 @@ TITLE     [tT][iI][tT][lL][eE]
 					    roundCount=0;
 					    BEGIN(SkipUnionSwitch);
 					  }
+					  else if (insideJava && (strcmp(yytext,"implements")==0 || strcmp(yytext,"extends")==0))
+					  {
+  					    current->type.resize(0);
+					    baseProt=Public;
+                                            baseVirt=Normal;
+					    baseName.resize(0);
+					    BEGIN( BasesProt ) ;
+					  }
 					  else
 					  {
 					    if (isTypedef)
@@ -2274,20 +2333,30 @@ TITLE     [tT][iI][tT][lL][eE]
 <BasesProt>{BN}				{ lineCount(); }
 <BasesProt>.				{ unput(*yytext); BEGIN(Bases); }
 <Bases>("::")?{BN}*({ID}{BN}*"::"{BN}*)*{ID}	{ 
-  					  //current->extends->append(
-					  //  new BaseInfo(yytext,baseProt,baseVirt)
-					  //) ;
-  					  bool globalScope = *yytext==':' && baseName.isEmpty();
+  					  QCString bName = yytext;
+					  bName = bName.stripWhiteSpace();
+  					  bool globalScope = bName.at(0)==':' && baseName.isEmpty();
   					  if (!globalScope)
-  					    baseName += yytext;
+  					    baseName += bName;
 					  else
-					    baseName += (yytext+2);
+					    baseName += (bName.data()+2);
 					  current->args += ' ';
 					  if (!globalScope)
-					    current->args += yytext;
+					    current->args += bName;
 					  else
-					    current->args += (yytext+2);
+					    current->args += (bName.data()+2);
 					}
+<Bases>{BN}*{ID}("."{ID})*		{ // Java style class
+    					  QCString name = yytext;
+					  int i=name.findRev('.');
+					  if (i!=-1) // strip part before dots
+					  {
+					    name=name.right(name.length()-i-1);
+					  }
+					  baseName += name;
+					  current->args += ' ';
+					  current->args += name;
+    					}
 <ClassVar>"<"   	                { current->name += *yytext;
   					  sharpCount=1; 
 					  lastSkipSharpContext = YY_START;
@@ -2322,13 +2391,14 @@ TITLE     [tT][iI][tT][lL][eE]
 <SkipRound>")"				{ if (--roundCount<=0)
 					    BEGIN ( lastSkipRoundContext );
 					}
-<Bases>","				{ current->args += ',' ; 
+<Bases>","|({BN}+"implements"{BN}*)	{ lineCount();
+                                          current->args += ',' ; 
 					  current->name = removeRedundantWhiteSpace(current->name);
   					  if (!baseName.isEmpty())
   					    current->extends->append(
 					      new BaseInfo(baseName,baseProt,baseVirt)
 					    );
-					  if (current->section == Entry::INTERFACE_SEC)
+					  if (current->section == Entry::INTERFACE_SEC || insideJava)
 					    baseProt=Public;
 					  else
 					    baseProt=Private;
@@ -2484,7 +2554,7 @@ TITLE     [tT][iI][tT][lL][eE]
   					  current->doc+=yytext;
 					  BEGIN( tmpDocType );
   					}
-<JavaDoc>"<"{TABLE}{ATTR}">"		{ 
+<JavaDoc>"<"({TABLE}|{UL}|{OL}|{DL}){ATTR}|{P}">"	{  // end brief upon encountering any of these
   					  //current->doc+=yytext;
 					  int i;
 					  for (i=yyleng-1;i>=0;i--)
@@ -2986,7 +3056,7 @@ TITLE     [tT][iI][tT][lL][eE]
   					  if (!removeSlashes)
 					    *pSkipDoc+=yytext;
   					}
-<SkipCode>^{B}*"*"+		
+<SkipCode>^{B}*"*"+/{B}+		
 <SkipCode>"//"				{
   					  *pSkipDoc+=yytext;
   					}
diff --git a/src/searchindex.cpp b/src/searchindex.cpp
index a482928..5567f4e 100644
--- a/src/searchindex.cpp
+++ b/src/searchindex.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/searchindex.h b/src/searchindex.h
index 4fb2ba2..214de6e 100644
--- a/src/searchindex.h
+++ b/src/searchindex.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/section.h b/src/section.h
index 30bf268..206237c 100644
--- a/src/section.h
+++ b/src/section.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/sortdict.h b/src/sortdict.h
index 9c46e9b..199c34d 100644
--- a/src/sortdict.h
+++ b/src/sortdict.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/suffixtree.cpp b/src/suffixtree.cpp
index 5439fc6..242fa9c 100644
--- a/src/suffixtree.cpp
+++ b/src/suffixtree.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/suffixtree.h b/src/suffixtree.h
index a0b7434..7aa8dc9 100644
--- a/src/suffixtree.h
+++ b/src/suffixtree.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
index 3e74d77..cfe7bb0 100644
--- a/src/tagreader.cpp
+++ b/src/tagreader.cpp
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -124,7 +124,8 @@ class TagFileParser : public QXmlDefaultHandler
                  InNamespace,
                  InGroup,
                  InPage,
-                 InMember
+                 InMember,
+                 InPackage
                };
     class StartElementHandler
     {
@@ -204,6 +205,10 @@ class TagFileParser : public QXmlDefaultHandler
         m_curPage = new TagPageInfo;
         m_state = InPage;
       }
+      else if (kind=="package")
+      {
+        m_state = InPackage;
+      }
       else
       {
         err("Error: Unknown compound attribute `%s' found!\n",kind.data());
@@ -746,7 +751,7 @@ void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members)
     }
     else if (tmi->kind=="typedef")
     {
-      me->section = Entry::TYPEDEF_SEC;
+      me->section = Entry::VARIABLE_SEC; //Entry::TYPEDEF_SEC;
       me->mtype = Method;
     }
     else if (tmi->kind=="enumeration")
diff --git a/src/tagreader.h b/src/tagreader.h
index 1508009..a9c7afd 100644
--- a/src/tagreader.h
+++ b/src/tagreader.h
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator.h b/src/translator.h
index 4849c95..0c203fa 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -1102,6 +1102,46 @@ class Translator
     {
       return "Property Documentation";
     }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used for Java interfaces in the summary section of Java packages */
+    virtual QCString trInterfaces()
+    {
+      return "Interfaces";
+    }
+    /*! Used for Java classes in the summary section of Java packages */
+    virtual QCString trClasses()
+    {
+      return "Classes";
+    }
+    /*! Used as the title of a Java package */
+    virtual QCString trPackage(const char *name)
+    {
+      return (QCString)"Package "+name;
+    }
+    /*! Title of the package index page */
+    virtual QCString trPackageList()
+    {
+      return "Package List";
+    }
+    /*! The description of the package index page */
+    virtual QCString trPackageListDescription()
+    {
+      return "Here are the packages with brief descriptions (if available):";
+    }
+    /*! The link name in the Quick links header for each page */
+    virtual QCString trPackages()
+    {
+      return "Packages";
+    }
+    /*! Used as a chapter title for Latex & RTF output */
+    virtual QCString trPackageDocumentation()
+    {
+      return "Package Documentation";
+    }
 };
 
 #endif
diff --git a/src/translator_cn.h b/src/translator_cn.h
index dfe5a78..e68234c 100644
--- a/src/translator_cn.h
+++ b/src/translator_cn.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_cz.h b/src/translator_cz.h
index bad2bf2..6f41444 100644
--- a/src/translator_cz.h
+++ b/src/translator_cz.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_de.h b/src/translator_de.h
index dd32ec8..5a5ee53 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_es.h b/src/translator_es.h
index 1af7658..29822e5 100644
--- a/src/translator_es.h
+++ b/src/translator_es.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_fi.h b/src/translator_fi.h
index 504008f..5f44a24 100644
--- a/src/translator_fi.h
+++ b/src/translator_fi.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_fr.h b/src/translator_fr.h
index 2bf7aa4..e7809b5 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_hr.h b/src/translator_hr.h
index b857fb2..20ed696 100644
--- a/src/translator_hr.h
+++ b/src/translator_hr.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_hu.h b/src/translator_hu.h
index 7140242..b23047a 100644
--- a/src/translator_hu.h
+++ b/src/translator_hu.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_it.h b/src/translator_it.h
index 11ac002..c0429cf 100644
--- a/src/translator_it.h
+++ b/src/translator_it.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Initial Italian Translation by Ahmed Aldo Faisal
  * Revised and completed by Alessandro Falappa  (June 1999)
diff --git a/src/translator_jp.h b/src/translator_jp.h
index 4946379..80b1e97 100644
--- a/src/translator_jp.h
+++ b/src/translator_jp.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_kr.h b/src/translator_kr.h
index 6703fe0..c1c5fea 100644
--- a/src/translator_kr.h
+++ b/src/translator_kr.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_nl.h b/src/translator_nl.h
index 80a5030..3ac1887 100644
--- a/src/translator_nl.h
+++ b/src/translator_nl.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_no.h b/src/translator_no.h
index f215c8c..063495c 100644
--- a/src/translator_no.h
+++ b/src/translator_no.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_pl.h b/src/translator_pl.h
index ce9b532..71ff0b3 100644
--- a/src/translator_pl.h
+++ b/src/translator_pl.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_pt.h b/src/translator_pt.h
index 8b6e3af..2f80e6e 100644
--- a/src/translator_pt.h
+++ b/src/translator_pt.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_ro.h b/src/translator_ro.h
index ec76d39..f5d6c3b 100644
--- a/src/translator_ro.h
+++ b/src/translator_ro.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -32,7 +32,6 @@
 #ifndef TRANSLATOR_RO_H
 #define TRANSLATOR_RO_H
 
-#include "qtbc.h"
 #include "classdef.h"
 #include "util.h"
 
diff --git a/src/translator_se.h b/src/translator_se.h
index 92f2461..f8d6aed 100644
--- a/src/translator_se.h
+++ b/src/translator_se.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/translator_si.h b/src/translator_si.h
index 64ea923..a2ee2bb 100644
--- a/src/translator_si.h
+++ b/src/translator_si.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/util.cpp b/src/util.cpp
index 43e9b2c..56820e7 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -484,11 +484,19 @@ QCString removeRedundantWhiteSpace(const QCString &s)
     {
       result+=" >"; // insert extra space for layouting (nested) templates
     }
+    else if (i>0 && isId(s.at(i)) && s.at(i-1)==')')
+    {
+      result+=' ';
+      result+=s.at(i);
+    }
     else if (c!=' ' ||
-	(i!=0 && i!=l-1 && isId(s.at(i-1)) && isId(s.at(i+1)))
-       )
+	      ( i!=0 && i!=l-1 && 
+                (isId(s.at(i-1)) || s.at(i-1)==')' || s.at(i-1)==',') && 
+                isId(s.at(i+1))
+              ) 
+            )
     {
-      if ((c=='*' || c=='&' || c=='@'))
+      if (c=='*' || c=='&' || c=='@')
       {  
         uint rl=result.length();
 	if (rl>0 && (isId(result.at(rl-1)) || result.at(rl-1)=='>')) result+=' ';
@@ -797,6 +805,13 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext)
   parseText(ol,theTranslator->trMainPage());
   ol.endQuickIndexItem();
 
+  if (documentedPackages>0)
+  {
+    if (!compact) ol.writeListItem();
+    ol.startQuickIndexItem(extLink,"packages.html");
+    parseText(ol,theTranslator->trPackages());
+    ol.endQuickIndexItem();
+  }
   if (documentedGroups>0)
   {
     if (!compact) ol.writeListItem();
@@ -1974,7 +1989,12 @@ bool getDefs(const QCString &scName,const QCString &memberName,
           }
         }
         //printf("  >Succes=%d\n",mdist<maxInheritanceDepth);
-        if (mdist<maxInheritanceDepth) return TRUE; /* found match */
+        if (mdist<maxInheritanceDepth) 
+        {
+          gd=md->getGroupDef();
+          if (gd) cd=0;
+          return TRUE; /* found match */
+        }
       } 
       /* goto the parent scope */
       
@@ -1996,7 +2016,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
   //              scopeName.data(),mScope.data(),mName.data());
   if ((mn=functionNameDict[mName])) // name is known
   {
-    //printf("  >member name found\n");
+    //printf("  >function name found\n");
     NamespaceDef *fnd=0;
     int scopeOffset=scopeName.length();
     do
diff --git a/src/util.h b/src/util.h
index 0b5e846..9f2df2a 100644
--- a/src/util.h
+++ b/src/util.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/version.h b/src/version.h
index 1e8a2f0..fef5707 100644
--- a/src/version.h
+++ b/src/version.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/xml.cpp b/src/xml.cpp
index 1171a2e..4fba201 100644
--- a/src/xml.cpp
+++ b/src/xml.cpp
@@ -3,7 +3,7 @@
  * 
  *
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/src/xml.h b/src/xml.h
index 313e935..b56efa4 100644
--- a/src/xml.h
+++ b/src/xml.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-2000 by Dimitri van Heesch.
+ * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
diff --git a/wintools/make.pl b/wintools/make.pl
index 737f1ee..ace6944 100755
--- a/wintools/make.pl
+++ b/wintools/make.pl
@@ -11,8 +11,12 @@ use Cwd;
 
 # get current working directory
 $pwd=cwd();
-# work-around slashes problems for badly ported perl interpreters
-$pwd=~s{/}{\\}g;
+
+# work-around slashes problems for nmake
+if ($target eq "msvc") 
+{
+  $pwd=~s{/}{\\}g;
+}
 
 # create config file
 open(FILE,">makeconfig") || die "Cannot create file makeconfig!";
-- 
cgit v0.12

