From ce5e0dcf2d3d55df510b76519ef43642bc331d96 Mon Sep 17 00:00:00 2001
From: Dimitri van Heesch <dimitri@stack.nl>
Date: Sun, 11 Mar 2001 19:23:58 +0000
Subject: Release-1.2.6

---
 Doxyfile                  |  42 +++---
 INSTALL                   |   4 +-
 Makefile.in               |  10 +-
 README                    |   4 +-
 VERSION                   |   2 +-
 addon/xmlgen/xml.cpp      |   4 +-
 packages/rpm/doxygen.spec |   2 +-
 qtools/Doxyfile           | 166 ++++++++++++++++++++
 src/classdef.cpp          |  26 ++--
 src/classdef.h            | 160 ++++++++++++++------
 src/diagram.cpp           |   4 +-
 src/doc.l                 |  33 ++--
 src/dot.cpp               |  12 +-
 src/doxygen.cpp           |  26 ++--
 src/doxysearch.cpp        |   8 +-
 src/doxytag.l             |   5 +-
 src/htmlgen.cpp           |  10 +-
 src/htmlgen.h             |   4 +-
 src/index.cpp             |  18 +--
 src/latexgen.cpp          | 374 +++++++++++++++++++++++++---------------------
 src/latexgen.h            |  13 +-
 src/mangen.cpp            |   7 +-
 src/mangen.h              |   5 +-
 src/outputgen.h           |  14 +-
 src/outputlist.h          |   8 +-
 src/packagedef.cpp        |   3 +-
 src/packagedef.h          |   2 +-
 src/rtfgen.cpp            |  31 ++--
 src/rtfgen.h              |   4 +-
 src/scanner.l             |  24 ++-
 src/tagreader.cpp         |  53 ++++++-
 src/translator.h          |  26 ++--
 src/translator_de.h       |   8 +-
 src/translator_fr.h       |   6 +
 34 files changed, 763 insertions(+), 355 deletions(-)
 create mode 100644 qtools/Doxyfile

diff --git a/Doxyfile b/Doxyfile
index 9293e90..9cfba1c 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -1,4 +1,4 @@
-# Doxyfile 1.2.3-20001126
+# Doxyfile 1.2.5-20010304
 
 #---------------------------------------------------------------------------
 # General configuration options
@@ -35,7 +35,11 @@ TAB_SIZE               = 8
 ENABLED_SECTIONS       = 
 GENERATE_TODOLIST      = YES
 GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
 ALIASES                = 
+MAX_INITIALIZER_LINES  = 30
+OPTIMIZE_OUTPUT_FOR_C  = NO
+SHOW_USED_FILES        = YES
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
@@ -47,22 +51,9 @@ WARN_LOGFILE           =
 #---------------------------------------------------------------------------
 # configuration options related to the input files
 #---------------------------------------------------------------------------
-INPUT                  = src \
-                         qtools \
-                         $(QTDIR)/src/doc/qarray.doc \
-                         $(QTDIR)/src/doc/qdict.doc \
-                         $(QTDIR)/src/doc/qintdict.doc \
-                         $(QTDIR)/src/doc/qlist.doc \
-                         $(QTDIR)/src/doc/qptrdict.doc \
-                         $(QTDIR)/src/doc/qsortedlist.doc \
-                         $(QTDIR)/src/doc/qstack.doc \
-                         $(QTDIR)/src/doc/qstrlist.doc \
-                         $(QTDIR)/src/doc/qvector.doc \
-                         $(QTDIR)/src/doc/qvaluelist.doc \
-                         $(QTDIR)/src/doc/qtl.doc
+INPUT                  = src 
 FILE_PATTERNS          = *.h \
                          *.cpp \
-                         q*.doc
 RECURSIVE              = NO
 EXCLUDE                = src/code.cpp \
                          src/config.cpp \
@@ -75,7 +66,12 @@ EXCLUDE                = src/code.cpp \
                          src/scanner.cpp \
                          src/tag.cpp \
                          src/doc.cpp \
-                         src/logos.cpp
+                         src/logos.cpp \
+                         src/doxysearch.cpp \
+                         src/suffixtree.cpp \
+                         src/suffixtree.h \
+                         src/searchindex.cpp \
+                         src/searchindex.h
 EXCLUDE_PATTERNS       = 
 EXAMPLE_PATH           = 
 EXAMPLE_PATTERNS       = 
@@ -98,6 +94,9 @@ HTML_FOOTER            =
 HTML_STYLESHEET        = 
 HTML_ALIGN_MEMBERS     = YES
 GENERATE_HTMLHELP      = NO
+GENERATE_CHI           = NO
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
 DISABLE_INDEX          = NO
 ENUM_VALUES_PER_LINE   = 4
 GENERATE_TREEVIEW      = NO
@@ -129,10 +128,6 @@ GENERATE_MAN           = NO
 MAN_OUTPUT             = 
 MAN_EXTENSION          = .3
 #---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-GENERATE_XML           = NO
-#---------------------------------------------------------------------------
 # Configuration options related to the preprocessor   
 #---------------------------------------------------------------------------
 ENABLE_PREPROCESSING   = YES
@@ -146,7 +141,7 @@ EXPAND_AS_DEFINED      =
 #---------------------------------------------------------------------------
 # Configuration::addtions related to external references   
 #---------------------------------------------------------------------------
-TAGFILES               = 
+TAGFILES               = qtools_docs/qtools.tag=../../qtools_docs/html
 GENERATE_TAGFILE       = 
 ALLEXTERNALS           = NO
 PERL_PATH              = /usr/bin/perl
@@ -160,9 +155,10 @@ INCLUDE_GRAPH          = YES
 INCLUDED_BY_GRAPH      = NO
 GRAPHICAL_HIERARCHY    = YES
 DOT_PATH               = 
-MAX_DOT_GRAPH_WIDTH    = 2048
-MAX_DOT_GRAPH_HEIGHT   = 2048
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1024
 GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
 #---------------------------------------------------------------------------
 # Configuration::addtions related to the search engine   
 #---------------------------------------------------------------------------
diff --git a/INSTALL b/INSTALL
index 693d8bc..7cb772e 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,6 +1,6 @@
-DOXYGEN Version 1.2.5-20010304
+DOXYGEN Version 1.2.6
 
 Please read the installation section of the manual for instructions.
 
 --------
-Dimitri van Heesch (04 March 2001)
+Dimitri van Heesch (11 March 2001)
diff --git a/Makefile.in b/Makefile.in
index c5cc66e..2b38472 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -55,16 +55,16 @@ install: doxywizard_install
 	$(INSTTOOL) -m 755 bin/doxysearch $(INSTALL)/bin
 	cp -r doc $(DOCDIR)
 	cp -r examples $(DOCDIR)
-	echo "DOXYGEN  = $(INSTALL)" > $(DOCDIR)/doc/Makefile
-	echo "DOXYDOCS = .." >> $(DOCDIR)/doc/Makefile
+	echo "DOXYGEN  = $(INSTALL)" >  $(DOCDIR)/doc/Makefile
+	echo "DOXYDOCS = .."         >> $(DOCDIR)/doc/Makefile
 	echo "VERSION  = $(VERSION)" >> $(DOCDIR)/doc/Makefile
-	cat doc/Makefile.in >> $(DOCDIR)/doc/Makefile
+	cat doc/Makefile.in          >> $(DOCDIR)/doc/Makefile
 	cd $(DOCDIR)/examples ; $(MAKE)
 	cd $(DOCDIR)/doc ; $(MAKE)
 	rm -rf $(DOCDIR)/doc
 	cd $(DOCDIR)/latex ; $(MAKE)
-	cp $(DOCDIR)/latex/doxygen_manual.pdf $(INSTALL)/doc/doxygen
-	cp $(DOCDIR)/latex/doxygen_manual.ps $(INSTALL)/doc/doxygen
+	cp $(DOCDIR)/latex/doxygen_manual.pdf $(DOCDIR)
+	cp $(DOCDIR)/latex/doxygen_manual.ps  $(DOCDIR)
 	rm -rf $(DOCDIR)/latex
 
 docs: FORCE
diff --git a/README b/README
index f73e3d2..3d9ec16 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.2.5-20010304
+DOXYGEN Version 1.2.6
 
 Please read INSTALL for compilation instructions.
 
@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
 
 Enjoy,
 
-Dimitri van Heesch (04 March 2001)
+Dimitri van Heesch (11 March 2001)
diff --git a/VERSION b/VERSION
index 597f916..3c43790 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.2.5-20010304
+1.2.6
diff --git a/addon/xmlgen/xml.cpp b/addon/xmlgen/xml.cpp
index 93c1250..ecb3fce 100644
--- a/addon/xmlgen/xml.cpp
+++ b/addon/xmlgen/xml.cpp
@@ -329,10 +329,10 @@ void generateXMLForClass(ClassDef *cd,QTextStream &t)
     }
     t << "      </basecompoundlist>" << endl;
   }
-  if (cd->superClasses()->count()>0)
+  if (cd->subClasses()->count()>0)
   {
     t << "      <derivedcompoundlist>" << endl;
-    BaseClassListIterator bcli(*cd->superClasses());
+    BaseClassListIterator bcli(*cd->subClasses());
     BaseClassDef *bcd;
     for (bcli.toFirst();(bcd=bcli.current());++bcli)
     {
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
index c71bdd7..516a4d6 100644
--- a/packages/rpm/doxygen.spec
+++ b/packages/rpm/doxygen.spec
@@ -1,5 +1,5 @@
 Name: doxygen
-Version: 1.2.5-20010304
+Version: 1.2.6
 Summary: documentation system for C, C++ and IDL
 Release: 1
 Source0: doxygen-%{version}.src.tar.gz
diff --git a/qtools/Doxyfile b/qtools/Doxyfile
new file mode 100644
index 0000000..8a54cc9
--- /dev/null
+++ b/qtools/Doxyfile
@@ -0,0 +1,166 @@
+# Doxyfile 1.2.5-20010304
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = Doxygen
+PROJECT_NUMBER         = 
+OUTPUT_DIRECTORY       = ../qtools_docs
+OUTPUT_LANGUAGE        = English
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ALWAYS_DETAILED_SEC    = NO
+FULL_PATH_NAMES        = YES
+STRIP_FROM_PATH        = $(PWD)/
+INTERNAL_DOCS          = NO
+CLASS_DIAGRAMS         = YES
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+CASE_SENSE_NAMES       = NO
+HIDE_SCOPE_NAMES       = NO
+VERBATIM_HEADERS       = YES
+SHOW_INCLUDE_FILES     = YES
+JAVADOC_AUTOBRIEF      = YES
+INHERIT_DOCS           = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+DISTRIBUTE_GROUP_DOC   = NO
+TAB_SIZE               = 8
+ENABLED_SECTIONS       = 
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+ALIASES                = 
+MAX_INITIALIZER_LINES  = 30
+OPTIMIZE_OUTPUT_FOR_C  = NO
+SHOW_USED_FILES        = YES
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = . \
+                         $(QTDIR)/src/doc/qarray.doc \
+                         $(QTDIR)/src/doc/qdict.doc \
+                         $(QTDIR)/src/doc/qintdict.doc \
+                         $(QTDIR)/src/doc/qlist.doc \
+                         $(QTDIR)/src/doc/qptrdict.doc \
+                         $(QTDIR)/src/doc/qsortedlist.doc \
+                         $(QTDIR)/src/doc/qstack.doc \
+                         $(QTDIR)/src/doc/qstrlist.doc \
+                         $(QTDIR)/src/doc/qvector.doc \
+                         $(QTDIR)/src/doc/qvaluelist.doc \
+                         $(QTDIR)/src/doc/qtl.doc
+FILE_PATTERNS          = *.h \
+                         *.cpp \
+                         q*.doc
+RECURSIVE              = NO
+EXCLUDE_PATTERNS       = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = YES
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = 
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+GENERATE_CHI           = NO
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = 
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = 
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = 
+MAN_EXTENSION          = .3
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = ../qtools_docs/qtools.tag
+ALLEXTERNALS           = NO
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = NO
+GRAPHICAL_HIERARCHY    = YES
+DOT_PATH               = 
+MAX_DOT_GRAPH_WIDTH    = 2048
+MAX_DOT_GRAPH_HEIGHT   = 2048
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
+CGI_NAME               = search.cgi
+CGI_URL                = 
+DOC_URL                = 
+DOC_ABSPATH            = 
+BIN_ABSPATH            = /usr/local/bin/
+EXT_DOC_PATHS          = 
diff --git a/src/classdef.cpp b/src/classdef.cpp
index a84d03f..b335af7 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -138,11 +138,11 @@ void ClassDef::insertBaseClass(ClassDef *cd,const char *n,Protection p,
   inherits->append(new BaseClassDef(cd,n,p,s,t));
 }
 
-// inserts a super class in the inherited list
-void ClassDef::insertSuperClass(ClassDef *cd,Protection p,
+// inserts a sub class in the inherited list
+void ClassDef::insertSubClass(ClassDef *cd,Protection p,
                                 Specifier s,const char *t)
 {
-  //printf("*** insert super class %s into %s\n",cd->name().data(),name().data());
+  //printf("*** insert sub class %s into %s\n",cd->name().data(),name().data());
   inheritedBy->inSort(new BaseClassDef(cd,0,p,s,t));
 }
 
@@ -732,7 +732,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
   if (Config::classDiagramFlag) ol.disableAllBut(OutputGenerator::Man);
 
   
-  // write superclasses
+  // write subclasses
   int count;
   if ((count=inherits->count())>0)
   {
@@ -856,7 +856,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
         ol.pushGeneratorState();
         ol.disableAllBut(OutputGenerator::Html);
         ol.writeString("<center><font size=\"2\">[");
-        ol.writeHtmlLink("graph_legend.html",theTranslator->trLegend());
+        ol.startHtmlLink("graph_legend.html");
+        ol.docify(theTranslator->trLegend());
+        ol.endHtmlLink();
         ol.writeString("]</font></center>");
         ol.popGeneratorState();
       }
@@ -889,7 +891,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
         ol.pushGeneratorState();
         ol.disableAllBut(OutputGenerator::Html);
         ol.writeString("<center><font size=\"2\">[");
-        ol.writeHtmlLink("graph_legend.html",theTranslator->trLegend());
+        ol.startHtmlLink("graph_legend.html");
+        ol.docify(theTranslator->trLegend());
+        ol.endHtmlLink();
         ol.writeString("]</font></center>");
         ol.popGeneratorState();
       }
@@ -1465,7 +1469,7 @@ bool ClassDef::isLinkableInProject()
 
 /*! the class is visible in a class diagram, or class hierarchy */
 bool ClassDef::isVisibleInHierarchy() 
-{ return // show all classes or a superclass is visible
+{ return // show all classes or a subclass is visible
   (Config::allExtFlag || hasNonReferenceSuperClass()) &&
     // and not an annonymous compound
     name().find('@')==-1 &&
@@ -1501,7 +1505,7 @@ bool ClassDef::isBaseClass(ClassDef *bcd)
 /*! 
  * recusively merges the `all members' lists of a class base 
  * with that of this class. Must only be called for classes without
- * superclasses!
+ * subclasses!
  */
 
 void ClassDef::mergeMembers()
@@ -1527,7 +1531,7 @@ void ClassDef::mergeMembers()
       MemberNameInfo *dstMni;
       if ((dstMni=dstMnd->find(srcMni->memberName())))
         // a member with that name is already in the class.
-        // the member may hide or reimplement the one in the super class
+        // the member may hide or reimplement the one in the sub class
         // or there may be another path to the base class that is already 
         // visited via another branch in the class hierarchy.
       {
@@ -1643,13 +1647,13 @@ void ClassDef::mergeMembers()
           }
         }
       }
-      else // base class has a member that is not in the super class => copy
+      else // base class has a member that is not in the sub class => copy
       {
         // create a deep copy of the list (only the MemberInfo's will be 
         // copied, not the actual MemberDef's)
         MemberNameInfo *newMni = new MemberNameInfo(srcMni->memberName()); 
         
-        // copy the member(s) from the base to the super class
+        // copy the member(s) from the base to the sub class
         MemberNameInfoIterator mnii(*srcMni);
         MemberInfo *mi;
         for (;(mi=mnii.current());++mnii)
diff --git a/src/classdef.h b/src/classdef.h
index 12cf575..c02fd89 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -48,92 +48,118 @@ struct IncludeInfo;
 
 /*! \brief This class contains all information about a compound.
  *
- *  A compound can be a class, struct, union, interface, or exception 
+ *  A compound can be a class, struct, union, interface, or exception.
+ *  \note This class should be renamed to CompoundDef
  */
 class ClassDef : public Definition
 {
   public:
+    /*! \name Public API
+     *  \{
+     */
+
+    /*! The various compound types */
     enum CompoundType { Class=Entry::CLASS_SEC, 
                         Struct=Entry::STRUCT_SEC, 
                         Union=Entry::UNION_SEC,
                         Interface=Entry::INTERFACE_SEC,
                         Exception=Entry::EXCEPTION_SEC
                       };
-    ClassDef(const char *fileName,int startLine,
-             const char *name,CompoundType ct,
-             const char *ref=0,const char *fName=0);
-   ~ClassDef();
     DefType definitionType() { return TypeClass; }
     QCString getOutputFileBase() const { return fileName; }
+
+    /*! Returns the name as it is appears in the documentation */
     QCString displayName() const;
+
+    /*! Returns the type of compound this is */
     CompoundType compoundType() const { return compType; } 
+
+    /*! Returns the type of compound as a string */
     QCString compoundTypeString() const;
-    void insertBaseClass(ClassDef *,const char *name,Protection p,Specifier s,const char *t=0);
+
+    /*! Returns the list of base classes from which this class directly
+     *  inherits.
+     */
     BaseClassList *baseClasses() { return inherits; }
-    void insertSuperClass(ClassDef *,Protection p,Specifier s,const char *t=0);
-    BaseClassList *superClasses() { return inheritedBy; }
-    void setIncludeFile(FileDef *fd,const char *incName,bool local); 
+    
+    /*! Returns the list of sub classes that directly inherit from this class
+     */
+    BaseClassList *subClasses() { return inheritedBy; }
+
+    /*! Returns a list of all members. This includes any inherited members.
+     *  Members are sorted alphabetically.
+     */ 
     MemberNameInfoList *memberNameInfoList() { return allMemberNameInfoList; }
+
+    /*! Returns a dictionary of all members. This includes any inherited 
+     *  members. Members are sorted alphabetically.
+     */ 
     MemberNameInfoDict *memberNameInfoDict() { return allMemberNameInfoDict; }
-    void insertMember(MemberDef *);
-    void insertUsedFile(const char *);
-    void computeAnchors();
-    void computeMemberGroups();
-    void setAnchor(MemberDef *);
-    void dumpMembers();
+
     void writeDocumentation(OutputList &ol);
     void writeMemberList(OutputList &ol);
     void writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup);
-    bool addExample(const char *anchor,const char *name, const char *file);
-    bool hasExamples();
-    void setProtection(Protection p) { prot=p; }
+
+    /*! Return the protection level (Public,Protected,Private) in which 
+     *  this compound was found.
+     */
     Protection protection() const { return prot; }
+
+    /*! returns TRUE iff a link is possible to an item within this project.
+     */
     bool isLinkableInProject();
-    /*! a link to this class is possible (either within this project,
-     *  or as a cross-reference to another project
+
+    /*! return TRUE iff a link to this class is possible (either within 
+     *  this project, or as a cross-reference to another project).
      */
     bool isLinkable()
     {
       return isLinkableInProject() || isReference();
     }
-    bool hasNonReferenceSuperClass();
+
     /*! the class is visible in a class diagram, or class hierarchy */
     bool isVisibleInHierarchy();
     
-    // template argument functions
+    /*! Returns the template arguments of this class 
+     *  Will return 0 if not applicable.
+     */
     ArgumentList *templateArguments() const { return tempArgs; }
+
+    /*! Returns the template arguments that this nested class "inherits" 
+     *  from its outer class (doxygen assumes there is only one!). 
+     *  Will return 0 if not applicable.
+     */
     ArgumentList *outerTemplateArguments() const;
-    void setTemplateArguments(ArgumentList *al);
-    //QCString getTemplateNameString();
     
+    /*! Returns the namespace this compound is in, or 0 if it has a global
+     *  scope.
+     */
     NamespaceDef *getNamespaceDef() { return nspace; }
-    FileDef *getFileDef() const { return fileDef; }
+
+    /*! Returns the file in which this compound's definition can be found.
+     *  Should not return 0 (but it might be a good idea to check anyway).
+     */
+    FileDef      *getFileDef() const { return fileDef; }
+
+    /*! Returns the Java package this class is in or 0 if not applicable. 
+     */ 
+    PackageDef   *packageDef() const;
     
-    void setNamespace(NamespaceDef *nd) { nspace = nd; }
-    void setFileDef(FileDef *fd) { fileDef=fd; }
-    void mergeMembers();
+    /*! Returns TRUE iff \a bcd is a direct or indirect base class of this
+     *  class. This function will recusively traverse all branches of the
+     *  inheritance tree.
+     */
     bool isBaseClass(ClassDef *bcd);
-    void determineImplUsageRelation();
-    void determineIntfUsageRelation();
+
     UsesClassDict *usedImplementationClasses() const 
     { 
       return usesImplClassDict; 
     }
+
     UsesClassDict *usedInterfaceClasses() const
     {
       return usesIntfClassDict;
     }
-    void setSubGrouping(bool enabled) { subGrouping = enabled; }
-    
-    bool visited;
-
-    void addMembersToMemberGroup();
-    void distributeMemberGroupDocumentation();
-
-    //void generateXML(QTextStream &t);
-    //void generateXMLSection(QTextStream &t,MemberList *ml,const char *type);
-
-    PackageDef *packageDef() const;
    
     /* member lists by protection */
     MemberList pubMembers;
@@ -170,9 +196,60 @@ class ClassDef : public Definition
     MemberList variableMembers;
     MemberList propertyMembers;
 
+    /*! \} */
+
+    /*! \name Doxygen internal API
+     *  \{
+     */
+    void insertBaseClass(ClassDef *,const char *name,Protection p,Specifier s,const char *t=0);
+    void insertSubClass(ClassDef *,Protection p,Specifier s,const char *t=0);
+    void setIncludeFile(FileDef *fd,const char *incName,bool local); 
+    void insertMember(MemberDef *);
+    void insertUsedFile(const char *);
+    void computeAnchors();
+    void computeMemberGroups();
+    void setAnchor(MemberDef *);
+    void dumpMembers();
+    bool addExample(const char *anchor,const char *name, const char *file);
+    void addMembersToMemberGroup();
+    void distributeMemberGroupDocumentation();
+    void setNamespace(NamespaceDef *nd) { nspace = nd; }
+    void setTemplateArguments(ArgumentList *al);
+    void mergeMembers();
+    void setFileDef(FileDef *fd) { fileDef=fd; }
+    void determineImplUsageRelation();
+    void determineIntfUsageRelation();
+    void setSubGrouping(bool enabled) { subGrouping = enabled; }
+    void setProtection(Protection p) { prot=p; }
+
+    /*! Creates a new compound definition.
+     *  \param fileName  full path and file name in which this compound was
+     *                   found.
+     *  \param startLine line number where the definition of this compound
+     *                   starts.
+     *  \param name      the name of this compound (including scope)
+     *  \param ct        the kind of Compound
+     *  \param ref       the tag file from which this compound is extracted
+     *                   or 0 if the compound doesn't come from a tag file
+     *  \param fName     the file name as found in the tag file. 
+     *                   This overwrites the file that doxygen normally 
+     *                   generates based on the compound type & name.
+     */
+    ClassDef(const char *fileName,int startLine,
+             const char *name,CompoundType ct,
+             const char *ref=0,const char *fName=0);
+    /*! Destroys a compound definition. */
+   ~ClassDef();
+    
+    bool visited;
+
   protected:
     void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
     void addMemberListToGroup(MemberList *);
+    bool hasExamples();
+    bool hasNonReferenceSuperClass();
+
+    /*! \} */
 
   private: 
     QCString fileName;                   // HTML containing the class docs
@@ -184,7 +261,6 @@ class ClassDef : public Definition
     BaseClassList *inheritedBy;
     NamespaceDef  *nspace;              // the namespace this class is in
 
-
     /* user defined member groups */
     MemberGroupList    *memberGroupList;
     MemberGroupDict    *memberGroupDict;
diff --git a/src/diagram.cpp b/src/diagram.cpp
index a499097..681fc89 100644
--- a/src/diagram.cpp
+++ b/src/diagram.cpp
@@ -249,8 +249,8 @@ void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
   if (parent) parent->addChild(di);
   di->move(count()*gridWidth,level*gridHeight);
   append(di);
-  BaseClassList *bcl=doBases ? cd->baseClasses() : cd->superClasses();
-  /* there are base/super classes */
+  BaseClassList *bcl=doBases ? cd->baseClasses() : cd->subClasses();
+  /* there are base/sub classes */
   int count=0;
   BaseClassDef *bcd=bcl->first();
   while (bcd)
diff --git a/src/doc.l b/src/doc.l
index f5afe59..2c0dab5 100644
--- a/src/doc.l
+++ b/src/doc.l
@@ -88,6 +88,7 @@ static bool             inWarningBlock;
 static bool             inRemarkBlock;
 static bool             inAttentionBlock;
 static bool             inParBlock;
+static bool             insideHtmlLink;
 static QCString         sectionRef;
 static bool             insideVerbatim = FALSE;
 static bool             insidePre = FALSE;
@@ -134,6 +135,7 @@ static void initParser()
   inRemarkBlock = FALSE;
   inAttentionBlock = FALSE;
   inParBlock = FALSE;
+  insideHtmlLink = FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -840,8 +842,7 @@ OPMASK    ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
 %x      DocDontInclude
 %x      DocHtmlLink
 %x      DocHtmlAnchor
-%x      DocHtmlHref1
-%x      DocHtmlHref2
+%x      DocHtmlHref
 %x	DocSkiplineKey
 %x	DocSkipKey
 %x	DocLineKey
@@ -889,6 +890,7 @@ OPMASK    ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
 <DocScan,Text>"&"[AEIOUaeiou]"circ;"	{ outDoc->writeCirc(yytext[1]);   }
 <DocScan,Text>"&"[ANOano]"tilde;"	{ outDoc->writeTilde(yytext[1]);  }
 <DocScan,Text>"&szlig;"			{ outDoc->writeSharpS();          }
+<DocScan,Text>"&"[cC]"cedil;"		{ outDoc->writeCCedil(yytext[1]); }
 <DocScan,Text>"&[aA]ring;"		{ outDoc->writeRing(yytext[1]);   }
 <DocScan,DocHtmlScan,DocLatexScan>"$("[a-z_A-Z]+")"	{ 
   					  QCString envvar=&yytext[2];
@@ -1784,7 +1786,10 @@ OPMASK    ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
 					              removeRedundantWhiteSpace(oName),inSeeBlock);
 					  BEGIN(DocScan);
 					}
-<DocScan>("http:"|"https:"|"ftp:"|"file:"){URLMASK}	{ outDoc->writeHtmlLink(yytext,yytext); }
+<DocScan>("http:"|"https:"|"ftp:"|"file:"){URLMASK}	{ outDoc->startHtmlLink(yytext); 
+                                                          outDoc->docify(yytext); 
+							  outDoc->endHtmlLink(); 
+                                                        }
 <DocScan>[a-zA-Z_0-9\.\-]+"@"[0-9a-z_A-Z\.\-]+	{ outDoc->writeMailLink(yytext); }
 <DocScan>{FILESCHAR}*{FILEECHAR}+/".\\n" { // special exception that is otherwise matches by FILEMASK
   					  generateRef(*outDoc,className,yytext,inSeeBlock);
@@ -2036,7 +2041,12 @@ OPMASK    ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
 <DocScan>"<"{BR}{ATTR}">"		{ outDoc->lineBreak(); }
 <DocScan>"<"{I}{ATTR}">"		{ outDoc->startEmphasis(); }
 <DocScan>"</"{I}{ATTR}">"		{ outDoc->endEmphasis(); }
-<DocScan>"</"{A}{ATTR}">"			
+<DocScan>"</"{A}{ATTR}">"		{ if (insideHtmlLink) 
+                                          {
+                                            outDoc->endHtmlLink(); 
+                                            insideHtmlLink=FALSE;
+                                          }
+                                        }
 <DocScan>"<"{A}				{ BEGIN(DocHtmlLink); }
 <DocScan>"<"{BOLD}{ATTR}">"		{ outDoc->startBold(); }
 <DocScan>"</"{BOLD}{ATTR}">"		{ outDoc->endBold(); }
@@ -2055,16 +2065,15 @@ OPMASK    ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
 <DocHtmlLink>{HREF}{BN}*"="{BN}*("\""?)	{ 
   					  htmlUrl.resize(0);
 					  htmlText.resize(0);
-  					  BEGIN(DocHtmlHref1); }
-<DocHtmlHref1>{URLMASK}			{ 
+  					  BEGIN(DocHtmlHref); 
+				        }
+<DocHtmlHref>{URLMASK}			{ 
   					  htmlUrl=yytext; 
 					}
-<DocHtmlHref1>">"			{ BEGIN(DocHtmlHref2); }
-<DocHtmlHref2>[^<]*			{ htmlText+=yytext; }
-<DocHtmlHref2>"<"			{ 
-  					  outDoc->writeHtmlLink(htmlUrl,htmlText);
-  					  unput(*yytext); 
-					  BEGIN(DocScan); 
+<DocHtmlHref>">"			{ 
+  					  outDoc->startHtmlLink(htmlUrl);
+                                          insideHtmlLink=TRUE;
+  					  BEGIN(DocScan); 
 					}
 <DocHtmlLink,DocHtmlAnchor>">"		{ BEGIN(DocScan); }
 <DocScan>{CMD}("\\"|"@"|"<"|">"|"&"|"$"|"#"|"%") {
diff --git a/src/dot.cpp b/src/dot.cpp
index 7b3309c..f060f88 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -154,7 +154,7 @@ static bool readBoundingBoxEPS(const char *fileName,int *width,int *height)
  */
 static bool isLeaf(ClassDef *cd)
 {
-  BaseClassList *bcl = cd->superClasses();
+  BaseClassList *bcl = cd->subClasses();
   if (bcl->count()>0) // class has children, check their visibility
   {
     BaseClassListIterator bcli(*bcl);
@@ -613,7 +613,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
 void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
 {
   //printf("addHierarchy `%s' baseClasses=%d\n",cd->name().data(),cd->baseClasses()->count());
-  BaseClassListIterator bcli(*cd->superClasses());
+  BaseClassListIterator bcli(*cd->subClasses());
   BaseClassDef *bcd;
   for ( ; (bcd=bcli.current()) ; ++bcli )
   {
@@ -673,7 +673,7 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
         bn->addParent(n);
         m_usedNodes->insert(bClass->name(),bn); // add node to the used list
       }
-      if (!bClass->visited && !hideSuper && bClass->superClasses()->count()>0)
+      if (!bClass->visited && !hideSuper && bClass->subClasses()->count()>0)
       {
         bool wasVisited=bClass->visited;
         bClass->visited=TRUE;
@@ -698,7 +698,7 @@ DotGfxHierarchyTable::DotGfxHierarchyTable()
   ClassDef *cd;
   for (cli.toLast();(cd=cli.current());--cli)
   {
-    //printf("Trying %s superClasses=%d\n",cd->name().data(),cd->superClasses()->count());
+    //printf("Trying %s subClasses=%d\n",cd->name().data(),cd->subClasses()->count());
     if (!hasVisibleRoot(cd->baseClasses()))
     {
       if (cd->isVisibleInHierarchy()) // root class in the graph
@@ -715,7 +715,7 @@ DotGfxHierarchyTable::DotGfxHierarchyTable()
         //m_usedNodes->clear();
         m_usedNodes->insert(cd->name(),n);
         m_rootNodes->insert(0,n);   
-        if (!cd->visited && cd->superClasses()->count()>0)
+        if (!cd->visited && cd->subClasses()->count()>0)
         {
           addHierarchy(n,cd,cd->visited);
           cd->visited=TRUE;
@@ -846,7 +846,7 @@ void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot,
 
 void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base)
 {
-  BaseClassListIterator bcli(base ? *cd->baseClasses() : *cd->superClasses());
+  BaseClassListIterator bcli(base ? *cd->baseClasses() : *cd->subClasses());
   BaseClassDef *bcd;
   for ( ; (bcd=bcli.current()) ; ++bcli )
   {
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index dc95b83..3098a0a 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -732,6 +732,7 @@ static void buildClassList(Entry *root)
         cd->setTemplateArguments(root->tArgList);
         cd->setProtection(root->protection);
         cd->addSectionsToDefinition(root->anchors);
+
         // file definition containing the class cd
         cd->setBodySegment(root->bodyLine,root->endBodyLine);
         cd->setBodyDef(fd);
@@ -1541,8 +1542,8 @@ void buildVarList(Entry *root)
         {
           if (!pScope.isEmpty() && (pcd=getClass(pScope)))
           {
-            Protection p = (Protection)QMAX((int)root->protection,(int)cd->protection());
-            md=addVariableToClass(root,pcd,mtype,pScope,name,TRUE,indentDepth,0,p);
+            //Protection p = (Protection)QMAX((int)root->protection,(int)cd->protection());
+            md=addVariableToClass(root,pcd,mtype,pScope,name,TRUE,indentDepth,0,root->protection);
           }
           else // annonymous scope inside namespace or file => put variable in the global scope
           {
@@ -2379,7 +2380,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
           if (baseClassIsTypeDef) usedName=bi->name;
           cd->insertBaseClass(baseClass,usedName,bi->prot,bi->virt,templSpec);
           // add this class as super class to the base class
-          baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec);
+          baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
           return TRUE;
         }
         else if (scopeOffset==0 && insertUndocumented)
@@ -2393,7 +2394,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
           // add base class to this class
           cd->insertBaseClass(baseClass,bi->name,bi->prot,bi->virt,templSpec);
           // add this class as super class to the base class
-          baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec);
+          baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
           // the undocumented base was found in this file
           baseClass->insertUsedFile(root->fileName);
           // add class to the list
@@ -2586,8 +2587,8 @@ static void addTodoTestBugReferences()
       Definition *d=md->getClassDef();
       QCString scopeName;
       if (d) scopeName=d->name();
-      if (d==0) d=md->getFileDef();
       if (d==0) d=md->getGroupDef();
+      if (d==0) d=md->getFileDef();
       // TODO: i18n this
       QCString memLabel="member";
       if (Config::optimizeForCFlag) memLabel="field";
@@ -2607,8 +2608,8 @@ static void addTodoTestBugReferences()
       Definition *d=md->getNamespaceDef();
       QCString scopeName;
       if (d) scopeName=d->name();
-      if (d==0) d=md->getBodyDef();
       if (d==0) d=md->getGroupDef();
+      if (d==0) d=md->getFileDef();
       // TODO: i18n this
       QCString memLabel="member";
       if (Config::optimizeForCFlag) memLabel="global";
@@ -3348,7 +3349,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
            "  related=`%s'\n" 
            "  exceptions=`%s'\n"
            "  isRelated=%d\n"
-           "  isFiend=%d\n"
+           "  isFriend=%d\n"
            "  isFunc=%d\n\n",
            namespaceName.data(),className.data(),classTempList.data(),
            funcType.data(),funcName.data(),funcArgs.data(),funcTempList.data(),
@@ -4298,7 +4299,7 @@ static void buildCompleteMemberLists()
   for (cli.toFirst();(cd=cli.current());++cli)
   {
     if (!cd->isReference() && // not an external class
-         cd->superClasses()->count()==0 && // is a root of the hierarchy
+         cd->subClasses()->count()==0 && // is a root of the hierarchy
          cd->baseClasses()->count()>0) // and has at least one base class
     {
       cd->mergeMembers();
@@ -4792,7 +4793,12 @@ static void buildPackageList(Entry *root)
     PackageDef *pd=0;
     if (!root->name.isEmpty() && (pd=Doxygen::packageDict.find(root->name))==0)
     {
-      pd = new PackageDef(root->fileName,root->startLine,root->name);
+      QCString tagName;
+      if (root->tagInfo)
+      {
+        tagName=root->tagInfo->tagName;
+      }
+      pd = new PackageDef(root->fileName,root->startLine,root->name,tagName);
       Doxygen::packageDict.inSort(root->name,pd);
     } 
     if (pd)
@@ -6207,7 +6213,9 @@ void generateOutput()
    *            Check/create output directorties                            *
    **************************************************************************/
   if (Config::outputDir.isEmpty()) 
+  {
     Config::outputDir=QDir::currentDirPath();
+  }
   else
   {
     QDir dir(Config::outputDir);
diff --git a/src/doxysearch.cpp b/src/doxysearch.cpp
index ddbdedd..c4e69b3 100644
--- a/src/doxysearch.cpp
+++ b/src/doxysearch.cpp
@@ -509,7 +509,7 @@ void generateResults(SearchResults *sr)
            "</center></td></tr>\n",page+1,numPages);
     printf("  <tr bgcolor=#ffffff>\n"
            "    <td colspan=2>\n"
-           "      <dl compact>\n");
+           "      <table border=\"0\" cellspacing=\"2\" cellpadding=\"2\">\n");
     int i;
     for (i=0 ; i < resultCount && pageEntries > 0; i++)
     {
@@ -526,8 +526,8 @@ void generateResults(SearchResults *sr)
         readString(f,htmlName,MAXSTRLEN);
         int rank=(int)(d->rank*100+0.5);
         if (rank==0) rank++;
-        printf("        <dt><b><font color=#%2x00%2x>%d</font></b>"
-               "<dd><a href=\"%s/%s\">%s</a>\n",
+        printf("        <tr><td align=\"right\"><b><font color=#%2x00%2x>%d</font></b>"
+               "</td><td><a href=\"%s/%s\">%s</a></td></tr>\n",
                rank*2+55, 255-rank*2, rank, 
                d->fileInfo->url, htmlName, linkName);
         pageEntries--;
@@ -537,7 +537,7 @@ void generateResults(SearchResults *sr)
         skipEntries--;
       }
     }
-    printf("      </dl>\n"
+    printf("      </table>\n"
            "    </td>\n"
            "  </tr>\n"
            "  <tr><td colspan=2 bgcolor=\"#4040c0\"><center>&nbsp;");
diff --git a/src/doxytag.l b/src/doxytag.l
index e2f3a55..95e7cbe 100644
--- a/src/doxytag.l
+++ b/src/doxytag.l
@@ -287,7 +287,10 @@ QCString unhtmlify(const char *str)
 <SearchRefName>"\" doxytag=\""	   {
   				     BEGIN( ReadRefName ); 
   				   }
-<SearchRefName>"\"></a>"	   {
+<SearchRefName>"\"></a><a"	   { // HACK: avoid finding links in code fragments
+  				     BEGIN( Start );
+  				   }
+<SearchRefName>"\"></a>"	   { // HACK: deal with Qt code
   				     if (nameBug)
 				       BEGIN( Start );
 				     else
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index a0a46d7..7955af7 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -171,8 +171,7 @@ void HtmlGenerator::startFile(const char *name,const char *title,bool external)
   {
     t << substituteKeywords(g_header,lastTitle);
   }
-  t << "<!-- Generated by Doxygen " << versionString << " on " 
-    << dateToString(TRUE) << " -->" << endl;
+  t << "<!-- Generated by Doxygen " << versionString << " -->" << endl;
 }
 
 void HtmlGenerator::startQuickIndexItem(const char *s,const char *l)
@@ -436,14 +435,17 @@ void HtmlGenerator::endTextLink()
   t << "</a>";
 }
 
-void HtmlGenerator::writeHtmlLink(const char *url,const char *text)
+void HtmlGenerator::startHtmlLink(const char *url)
 {
   t << "<a ";
   if (Config::ftvHelpFlag) t << "target=\"top\" ";
   t << "href=\"";
   if (url) t << url;
   t << "\">"; 
-  docify(text);
+}
+
+void HtmlGenerator::endHtmlLink()
+{
   t << "</a>";
 }
 
diff --git a/src/htmlgen.h b/src/htmlgen.h
index baa73a3..14e427b 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -81,7 +81,8 @@ class HtmlGenerator : public OutputGenerator
                        const char *anchor,const char *name);
     void startTextLink(const char *file,const char *anchor);
     void endTextLink();
-    void writeHtmlLink(const char *url,const char *text);
+    void startHtmlLink(const char *url);
+    void endHtmlLink();
     void writeMailLink(const char *url);
     void startTypewriter() { t << "<code>"; }
     void endTypewriter()   { t << "</code>"; }
@@ -172,6 +173,7 @@ class HtmlGenerator : public OutputGenerator
     void writeTilde(char c)   { t << "&" << c << "tilde;"; } 
     void writeRing(char c)    { t << "&" << c << "ring;"; }
     void writeSharpS()        { t << "&szlig;"; }
+    void writeCCedil(char c)  { t << "&" << c << "cedil;"; }
     void startDescList()      { t << "<dl compact><dt>" << endl; }
     void endDescList()        { t << "</dl>"; }
     void startParamList()     { startDescList(); }
diff --git a/src/index.cpp b/src/index.cpp
index 723ec79..f11fb3f 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -359,7 +359,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
         started=TRUE;
       }
       //printf("Passed...\n");
-      bool hasChildren = !cd->visited && !hideSuper && cd->superClasses()->count()>0;
+      bool hasChildren = !cd->visited && !hideSuper && cd->subClasses()->count()>0;
       if (cd->isLinkable())
       {
         ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->displayName());
@@ -395,7 +395,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
         //printf("Class %s at %p visited=%d\n",cd->name().data(),cd,cd->visited);
         bool wasVisited=cd->visited;
         cd->visited=TRUE;
-        writeClassTree(ol,cd->superClasses(),wasVisited);
+        writeClassTree(ol,cd->subClasses(),wasVisited);
       }
     }
   }
@@ -438,7 +438,7 @@ void writeClassTree(BaseClassList *cl)
         if (hasFtvHelp)  ftvHelp->incContentsDepth();
         started=TRUE;
       }
-      bool hasChildren = cd->superClasses()->count()>0;
+      bool hasChildren = cd->subClasses()->count()>0;
       if (cd->isLinkable())
       {
         if (hasHtmlHelp)
@@ -452,7 +452,7 @@ void writeClassTree(BaseClassList *cl)
       }
       if (hasChildren)
       {
-        writeClassTree(cd->superClasses());
+        writeClassTree(cd->subClasses());
       }
       cd->visited=TRUE;
     }
@@ -492,7 +492,7 @@ void writeClassTree(ClassList *cl)
       {
         started=TRUE;
       }
-      bool hasChildren = cd->superClasses()->count()>0;
+      bool hasChildren = cd->subClasses()->count()>0;
       if (cd->isLinkable())
       {
         if (hasHtmlHelp)
@@ -506,7 +506,7 @@ void writeClassTree(ClassList *cl)
       }
       if (hasChildren)
       {
-        writeClassTree(cd->superClasses());
+        writeClassTree(cd->subClasses());
       }
       cd->visited=TRUE;
     }
@@ -553,7 +553,7 @@ void writeClassHierarchy(OutputList &ol)
           if (hasFtvHelp)  ftvHelp->incContentsDepth();
           started=TRUE;
         }
-        bool hasChildren = !cd->visited && cd->superClasses()->count()>0; 
+        bool hasChildren = !cd->visited && cd->subClasses()->count()>0; 
         if (cd->isLinkable())
         {
           ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->displayName());
@@ -586,7 +586,7 @@ void writeClassHierarchy(OutputList &ol)
         }
         if (hasChildren) 
         {
-          writeClassTree(ol,cd->superClasses(),cd->visited);
+          writeClassTree(ol,cd->subClasses(),cd->visited);
           cd->visited=TRUE;
         }
       }
@@ -610,7 +610,7 @@ int countClassHierarchy()
   ClassListIterator cli(Doxygen::classList);
   for ( ; cli.current(); ++cli)
   {
-    if (cli.current()->superClasses()->count()>0) count++;
+    if (cli.current()->subClasses()->count()>0) count++;
   }
   return count;
 }
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 7e8cf22..cd07ac8 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -30,24 +30,24 @@
 #include "dot.h"
 #include "page.h"
 
-static QCString filterTitle(const char *s)
-{
-  QCString tmp=s,result;
-  uint i;for (i=0;i<tmp.length();i++)
-  {
-    char c=tmp.at(i);
-    switch(c)
-    {
-      case '#': result+="\\#";  break;
-      case '"': result+="\\\""; break;
-      case '%': result+="\\%";  break;
-      case '[': result+="{";    break;
-      case ']': result+="}";    break;
-      default:  result+=c;      break;
-    }
-  }
-  return result;  
-}
+//static QCString filterTitle(const char *s)
+//{
+//  QCString tmp=s,result;
+//  uint i;for (i=0;i<tmp.length();i++)
+//  {
+//    char c=tmp.at(i);
+//    switch(c)
+//    {
+//      case '#': result+="\\#";  break;
+//      case '"': result+="\\\""; break;
+//      case '%': result+="\\%";  break;
+//      case '[': result+="{";    break;
+//      case ']': result+="}";    break;
+//      default:  result+=c;      break;
+//    }
+//  }
+//  return result;  
+//}
 
 static QCString escapeLabelName(const char *s)
 {
@@ -98,6 +98,7 @@ LatexGenerator::LatexGenerator() : OutputGenerator()
   //printf("LatexGenerator::LatexGenerator() insideTabbing=FALSE\n");
   insideTabbing=FALSE;
   firstDescItem=TRUE;
+  insidePre=FALSE;
 }
 
 LatexGenerator::~LatexGenerator()
@@ -116,6 +117,7 @@ void LatexGenerator::append(const OutputGenerator *g)
   col+=((LatexGenerator *)g)->col;
   insideTabbing=insideTabbing || ((LatexGenerator *)g)->insideTabbing;
   firstDescItem = ((LatexGenerator *)g)->firstDescItem;
+  insidePre = insidePre || ((LatexGenerator *)g)->insidePre;
   //printf("LatexGenerator::append(%s) insideTabbing=%s\n", g->getContents().data(),
   //    insideTabbing ? "TRUE" : "FALSE" );
 }
@@ -124,6 +126,7 @@ OutputGenerator *LatexGenerator::copy()
 {
   LatexGenerator *result = new LatexGenerator;
   result->insideTabbing=insideTabbing;
+  result->insidePre=insidePre;
   return result;
 }
 
@@ -864,7 +867,7 @@ void LatexGenerator::writeIndexItem(const char *ref,const char *fn,
 //}
 
 
-void LatexGenerator::writeHtmlLink(const char *url,const char *text)
+void LatexGenerator::startHtmlLink(const char *url)
 {
   if (Config::pdfHyperFlag)
   {
@@ -873,7 +876,10 @@ void LatexGenerator::writeHtmlLink(const char *url,const char *text)
     t << "}";
   }
   t << "{\\tt ";
-  docify(text);
+}
+
+void LatexGenerator::endHtmlLink()
+{
   t << "}";
 }
 
@@ -1026,7 +1032,7 @@ void LatexGenerator::endMemberHeader()
 void LatexGenerator::startMemberDoc(const char *clname,
                                     const char *memname,
                                     const char *,
-                                    const char *title)
+                                    const char *)
 { 
   if (memname && memname[0]!='@')
   {
@@ -1053,7 +1059,13 @@ void LatexGenerator::startMemberDoc(const char *clname,
     t << "}" << endl;
   }
   if (Config::compactLatexFlag) t << "\\paragraph"; else t << "\\subsubsection";
-  if (Config::pdfHyperFlag && title) t << "[" << filterTitle(title) << "]";
+  if (Config::pdfHyperFlag && memname) 
+  {
+    t << "["; 
+    escapeMakeIndexChars(this,t,memname);
+    //filterTitle(title) 
+    t << "]";
+  }
   t << "{\\setlength{\\rightskip}{0pt plus 5cm}";
 }
 
@@ -1127,7 +1139,14 @@ void LatexGenerator::startSection(const char *lab,const char *,bool sub)
     t << "\\hypertarget{" << lab << "}{}";
   }
   t << "\\";
-  if (sub) t << "subsection{"; else t << "section{";
+  if (Config::compactLatexFlag)
+  {
+    if (sub) t << "subsubsection{"; else t << "subsection{";
+  }
+  else
+  {
+    if (sub) t << "subsection{"; else t << "section{";
+  }
 }
 
 void LatexGenerator::endSection(const char *lab,bool)
@@ -1200,7 +1219,6 @@ void LatexGenerator::docify(const char *str)
   static bool isJapanese = theTranslator->idLanguage()=="japanese";
   static bool isKorean   = theTranslator->idLanguage()=="korean";
   static bool isRussian  = theTranslator->idLanguage()=="russian";
-  static bool isGerman   = theTranslator->idLanguage()=="german";
   if (str)
   {
     const unsigned char *p=(const unsigned char *)str;
@@ -1209,159 +1227,169 @@ void LatexGenerator::docify(const char *str)
     while (*p)
     {
       c=*p++;
-      switch(c)
+      if (insidePre)
       {
-        case '#':  t << "\\#";           break;
-        case '$':  t << "\\$";           break;
-        case '%':  t << "\\%";           break;
-        case '^':  t << "$^\\wedge$";    break;
-        case '&':  t << "\\&";           break;
-        case '*':  t << "$\\ast$";       break;
-        case '_':  t << "\\_"; 
-                   if (!insideTabbing) t << "\\-";  
-                   break;
-        case '{':  t << "\\{";           break;
-        case '}':  t << "\\}";           break;
-        case '<':  t << "$<$";           break;
-        case '>':  t << "$>$";           break;
-        case '|':  t << "$|$";           break;
-        case '~':  t << "$\\sim$";       break;
-        case '[':  if (Config::pdfHyperFlag) 
-                     t << "\\mbox{[}"; 
-                   else 
-                     t << "[";
-                   break;
-        case ']':  if (pc=='[') t << "$\\,$";
-                   if (Config::pdfHyperFlag)
-                     t << "\\mbox{]}";
-                   else
-                     t << "]";             
-                   break;
-        case '-':  if (*p=='>') 
-                     { t << " $\\rightarrow$ "; p++; }
-                   else
+        switch(c)
+        {
+          case '\\': t << "\\(\\backslash\\)"; break;
+          case '{':  t << "\\{"; break;
+          case '}':  t << "\\}"; break;
+          default: t << (char)c; break;
+        }
+      }
+      else
+      {
+        switch(c)
+        {
+          case '#':  t << "\\#";           break;
+          case '$':  t << "\\$";           break;
+          case '%':  t << "\\%";           break;
+          case '^':  t << "$^\\wedge$";    break;
+          case '&':  t << "\\&";           break;
+          case '*':  t << "$\\ast$";       break;
+          case '_':  t << "\\_"; 
+                     if (!insideTabbing) t << "\\-";  
+                     break;
+          case '{':  t << "\\{";           break;
+          case '}':  t << "\\}";           break;
+          case '<':  t << "$<$";           break;
+          case '>':  t << "$>$";           break;
+          case '|':  t << "$|$";           break;
+          case '~':  t << "$\\sim$";       break;
+          case '[':  if (Config::pdfHyperFlag) 
+                       t << "\\mbox{[}"; 
+                     else 
+                       t << "[";
+                     break;
+          case ']':  if (pc=='[') t << "$\\,$";
+                       if (Config::pdfHyperFlag)
+                         t << "\\mbox{]}";
+                       else
+                         t << "]";             
+                     break;
+          case '-':  if (*p=='>') 
+                       { t << " $\\rightarrow$ "; p++; }
+                     else
                      { t << (char)c; }
-                   break;
-        case '\\': if (*p=='<') 
-                     { t << "$<$"; p++; }
-                   else if (*p=='>')
+                     break;
+          case '\\': if (*p=='<') 
+                       { t << "$<$"; p++; }
+                     else if (*p=='>')
                      { t << "$>$"; p++; } 
-                   else  
+                     else  
                      { t << "$\\backslash$"; }
-                   break;           
-        case '"':  if (isGerman) // " has a special meaning if German
-                                 // - Thomas Vesper
-                     { t << "\\char`\\\"{}"; }
-                   else
-                     { t << (char)c; }
-                   break;
-        
-        default:   
-          if (isJapanese || isKorean)
-          { // Japanese language uses wide characters
-            if (c>=128) 
-            {
-              t << (char)c;
-              if (*p)  
-              {
-                c = *p++;
-                t << (char)c;
-              }
-            }
-            else // ascii char => see if we can insert a hypenation hint
-            {
-              if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
-              t << (char)c;    
-            } 
-          }
-          else if (isCzech || isRussian)
-          {
-            if (c>=128)
-            {
-              t << (char)c;
-            }
-            else // ascii char => see if we can insert a hypenation hint
-            {
-              if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
-              t << (char)c;
-            }
-          }
-          else // language is other than Czech, Russian or Japanese
-          {
-            switch(c)
-            {
-              // the Latin-1 characters
-              case 161: t << "!`";            break;
-              case 181: t << "$\\mu$";        break;
-              case 191: t << "?`";            break;
-              case 192: t << "\\`{A}";        break;
-              case 193: t << "\\'{A}";        break;
-              case 194: t << "\\^{A}";        break;
-              case 195: t << "\\~{A}";        break;
-              case 196: t << "\\\"{A}";       break;
-              case 197: t << "\\AA{}";         break;
-              case 198: t << "\\AE{}";         break;
-              case 199: t << "\\c{C}";        break;
-              case 200: t << "\\`{E}";        break;
-              case 201: t << "\\'{E}";        break;
-              case 202: t << "\\^{E}";        break;
-              case 203: t << "\\\"{E}";       break;
-              case 204: t << "\\`{I}";        break;
-              case 205: t << "\\'{I}";        break;
-              case 206: t << "\\^{I}";        break;
-              case 207: t << "\\\"{I}";       break;
-              case 208: t << "D ";            break; // anyone know the real code?
-              case 209: t << "\\~{N}";        break;
-              case 210: t << "\\`{O}";        break;
-              case 211: t << "\\'{O}";        break;
-              case 212: t << "\\^{O}";        break;
-              case 213: t << "\\~{O}";        break;
-              case 214: t << "\\\"{O}";       break;
-              case 215: t << "$\\times$";     break;
-              case 216: t << "\\O";           break;
-              case 217: t << "\\`{U}";        break;
-              case 218: t << "\\'{U}";        break;
-              case 219: t << "\\^{U}";        break;
-              case 220: t << "\\\"{U}";       break;
-              case 221: t << "\\'{Y}";        break;
-              case 223: t << "\\ss{}";         break; 
-              case 224: t << "\\`{a}";        break;
-              case 225: t << "\\'{a}";        break;
-              case 226: t << "\\^{a}";        break;
-              case 227: t << "\\~{a}";        break;
-              case 228: t << "\\\"{a}";       break;
-              case 229: t << "\\aa{}";         break;
-              case 230: t << "\\ae{}";         break;
-              case 231: t << "\\c{c}";        break;
-              case 232: t << "\\`{e}";        break;
-              case 233: t << "\\'{e}";        break;
-              case 234: t << "\\^{e}";        break;
-              case 235: t << "\\\"{e}";       break;
-              case 236: t << "\\`{\\i}";      break;
-              case 237: t << "\\'{\\i}";      break;
-              case 238: t << "\\^{\\i}";      break;
-              case 239: t << "\\\"{\\i}";     break;
-              case 241: t << "\\~{n}";        break;
-              case 242: t << "\\`{o}";        break;
-              case 243: t << "\\'{o}";        break;
-              case 244: t << "\\^{o}";        break;
-              case 245: t << "\\~{o}";        break;
-              case 246: t << "\\\"{o}";       break;
-              case 248: t << "\\o{}";          break;
-              case 249: t << "\\`{u}";        break;
-              case 250: t << "\\'{u}";        break;
-              case 251: t << "\\^{u}";        break;
-              case 252: t << "\\\"{u}";       break;
-              case 253: t << "\\'{y}";        break;
-              case 255: t << "\\\"{y}";       break;           
-              default: // normal ascii char 
-              { 
-                // see if we can insert an hyphenation hint
-                if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
-                t << (char)c;    
-              }
-            }
-          }
+                     break;           
+          case '"':  { t << "\\char`\\\"{}"; }
+                     break;
+
+          default:   
+
+             if (isJapanese || isKorean)
+             { // Japanese language uses wide characters
+               if (c>=128) 
+               {
+                 t << (char)c;
+                 if (*p)  
+                 {
+                   c = *p++;
+                   t << (char)c;
+                 }
+               }
+               else // ascii char => see if we can insert a hypenation hint
+               {
+                 if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
+                 t << (char)c;    
+               } 
+             }
+             else if (isCzech || isRussian)
+             {
+               if (c>=128)
+               {
+                 t << (char)c;
+               }
+               else // ascii char => see if we can insert a hypenation hint
+               {
+                 if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
+                 t << (char)c;
+               }
+             }
+             else // language is other than Czech, Russian or Japanese
+             {
+               switch(c)
+               {
+                 // the Latin-1 characters
+                 case 161: t << "!`";            break;
+                 case 181: t << "$\\mu$";        break;
+                 case 191: t << "?`";            break;
+                 case 192: t << "\\`{A}";        break;
+                 case 193: t << "\\'{A}";        break;
+                 case 194: t << "\\^{A}";        break;
+                 case 195: t << "\\~{A}";        break;
+                 case 196: t << "\\\"{A}";       break;
+                 case 197: t << "\\AA{}";         break;
+                 case 198: t << "\\AE{}";         break;
+                 case 199: t << "\\c{C}";        break;
+                 case 200: t << "\\`{E}";        break;
+                 case 201: t << "\\'{E}";        break;
+                 case 202: t << "\\^{E}";        break;
+                 case 203: t << "\\\"{E}";       break;
+                 case 204: t << "\\`{I}";        break;
+                 case 205: t << "\\'{I}";        break;
+                 case 206: t << "\\^{I}";        break;
+                 case 207: t << "\\\"{I}";       break;
+                 case 208: t << "D ";            break; // anyone know the real code?
+                 case 209: t << "\\~{N}";        break;
+                 case 210: t << "\\`{O}";        break;
+                 case 211: t << "\\'{O}";        break;
+                 case 212: t << "\\^{O}";        break;
+                 case 213: t << "\\~{O}";        break;
+                 case 214: t << "\\\"{O}";       break;
+                 case 215: t << "$\\times$";     break;
+                 case 216: t << "\\O";           break;
+                 case 217: t << "\\`{U}";        break;
+                 case 218: t << "\\'{U}";        break;
+                 case 219: t << "\\^{U}";        break;
+                 case 220: t << "\\\"{U}";       break;
+                 case 221: t << "\\'{Y}";        break;
+                 case 223: t << "\\ss{}";         break; 
+                 case 224: t << "\\`{a}";        break;
+                 case 225: t << "\\'{a}";        break;
+                 case 226: t << "\\^{a}";        break;
+                 case 227: t << "\\~{a}";        break;
+                 case 228: t << "\\\"{a}";       break;
+                 case 229: t << "\\aa{}";         break;
+                 case 230: t << "\\ae{}";         break;
+                 case 231: t << "\\c{c}";        break;
+                 case 232: t << "\\`{e}";        break;
+                 case 233: t << "\\'{e}";        break;
+                 case 234: t << "\\^{e}";        break;
+                 case 235: t << "\\\"{e}";       break;
+                 case 236: t << "\\`{\\i}";      break;
+                 case 237: t << "\\'{\\i}";      break;
+                 case 238: t << "\\^{\\i}";      break;
+                 case 239: t << "\\\"{\\i}";     break;
+                 case 241: t << "\\~{n}";        break;
+                 case 242: t << "\\`{o}";        break;
+                 case 243: t << "\\'{o}";        break;
+                 case 244: t << "\\^{o}";        break;
+                 case 245: t << "\\~{o}";        break;
+                 case 246: t << "\\\"{o}";       break;
+                 case 248: t << "\\o{}";          break;
+                 case 249: t << "\\`{u}";        break;
+                 case 250: t << "\\'{u}";        break;
+                 case 251: t << "\\^{u}";        break;
+                 case 252: t << "\\\"{u}";       break;
+                 case 253: t << "\\'{y}";        break;
+                 case 255: t << "\\\"{y}";       break;           
+                 default: // normal ascii char 
+                           { 
+                             // see if we can insert an hyphenation hint
+                             if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
+                             t << (char)c;    
+                           }
+               }
+             }
+        }
       }
       pc = c;
     }
diff --git a/src/latexgen.h b/src/latexgen.h
index b000c27..0c6ed8e 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -78,7 +78,8 @@ class LatexGenerator : public OutputGenerator
                        const char *anchor,const char *text);
     void startTextLink(const char *,const char *);
     void endTextLink();
-    void writeHtmlLink(const char *,const char *);
+    void startHtmlLink(const char *);
+    void endHtmlLink();
     void writeMailLink(const char *);
     void startTypewriter() { t << "{\\tt "; }
     void endTypewriter()   { t << "}";      }
@@ -110,8 +111,12 @@ class LatexGenerator : public OutputGenerator
     void writeAnchor(const char *fileName,const char *name);
     void startCodeFragment() { t << "\\footnotesize\\begin{verbatim}"; }
     void endCodeFragment()   { t << "\\end{verbatim}\\normalsize " << endl; }
-    void startPreFragment()  { t << "\\small\\begin{alltt}"; }
-    void endPreFragment()    { t << "\\end{alltt}\\normalsize " << endl; }
+    void startPreFragment()  { t << "\\small\\begin{alltt}"; 
+                               insidePre=TRUE; 
+                             }
+    void endPreFragment()    { t << "\\end{alltt}\\normalsize " << endl; 
+                               insidePre=FALSE; 
+                             }
     void startCodeLine() { col=0; }
     void endCodeLine() { codify("\n"); }
     //void writeBoldString(const char *text) 
@@ -174,6 +179,7 @@ class LatexGenerator : public OutputGenerator
     void writeTilde(char c)  { t << "\\~{"  << c << "}"; }
     void writeRing(char c)   { t << "\\" << c << c; }
     void writeSharpS()       { t << "\"s"; }
+    void writeCCedil(char c) { t << "\\c{" << c << "}"; }
     void startMemberDescription() { t << "\\begin{CompactList}\\small\\item\\em "; }
     void endMemberDescription() { t << "\\item\\end{CompactList}"; }
     void startDescList()     { t << "\\begin{Desc}\n\\item["; }
@@ -244,6 +250,7 @@ class LatexGenerator : public OutputGenerator
     int col;
     bool insideTabbing;
     bool firstDescItem;
+    bool insidePre;
 };
 
 #endif
diff --git a/src/mangen.cpp b/src/mangen.cpp
index 63cbed0..36e2334 100644
--- a/src/mangen.cpp
+++ b/src/mangen.cpp
@@ -171,9 +171,12 @@ void ManGenerator::writeCodeLink(const char *,const char *,
   docify(name);
 }
 
-void ManGenerator::writeHtmlLink(const char *,const char *text)
+void ManGenerator::startHtmlLink(const char *)
+{
+}
+
+void ManGenerator::endHtmlLink()
 {
-  docify(text);
 }
 
 void ManGenerator::writeMailLink(const char *url)
diff --git a/src/mangen.h b/src/mangen.h
index 785cd75..920f1cb 100644
--- a/src/mangen.h
+++ b/src/mangen.h
@@ -76,7 +76,8 @@ class ManGenerator : public OutputGenerator
                        const char *anchor,const char *name);
     void startTextLink(const char *,const char *) {}
     void endTextLink() {}
-    void writeHtmlLink(const char *url,const char *text);
+    void startHtmlLink(const char *url);
+    void endHtmlLink();
     void writeMailLink(const char *url);
     void startTypewriter() { t << "\\fC"; firstCol=FALSE; }
     void endTypewriter()   { t << "\\fR"; firstCol=FALSE; }
@@ -164,6 +165,8 @@ class ManGenerator : public OutputGenerator
     void writeSharpS()        { t << "s\\*:";     /* just a wild guess,
                                                      need to check! */
                                                   firstCol=FALSE; }
+    void writeCCedil(char c)  { t << c;           /* TODO: fix this */
+                                firstCol=FALSE; }
     void startMemberDescription() { t << "\n.RI \"\\fI"; firstCol=FALSE; }
     void endMemberDescription()   { t << "\\fR\""; firstCol=FALSE; }
     void startDescList();
diff --git a/src/outputgen.h b/src/outputgen.h
index 436ebcb..06ae375 100644
--- a/src/outputgen.h
+++ b/src/outputgen.h
@@ -103,14 +103,17 @@ class BaseOutputDocInterface
     virtual void writeCodeLink(const char *ref,const char *file,
                                const char *anchor,const char *text) = 0;
 
-    /*! Writes a (link to an) URL found in the documentation.
-     *  \param url    To URL to link to.
-     *  \param text   The text to display as a placeholder for the link.
+    /*! Starts a (link to an) URL found in the documentation.
+     *  \param url    The URL to link to.
+     */
+    virtual void startHtmlLink(const char *url) = 0;
+
+    /*! Ends a link started by startHtmlLink().
      */
-    virtual void writeHtmlLink(const char *url,const char *text) = 0;
+    virtual void endHtmlLink() = 0;
 
     /*! Writes a (link to an) email address found in the documentation.
-     *  \param url    To email address, this is also used for the link text.
+     *  \param url    The email address, this is also used for the link text.
      */
     virtual void writeMailLink(const char *url) = 0;
     
@@ -202,6 +205,7 @@ class BaseOutputDocInterface
     virtual void writeTilde(char) = 0;
     virtual void writeRing(char) = 0;
     virtual void writeSharpS() = 0;
+    virtual void writeCCedil(char) = 0;
     virtual void startDescList() = 0;
     virtual void endDescList() = 0;
     virtual void startParamList() = 0;
diff --git a/src/outputlist.h b/src/outputlist.h
index 7ae1973..3a6898d 100644
--- a/src/outputlist.h
+++ b/src/outputlist.h
@@ -134,8 +134,10 @@ class OutputList : public OutputDocInterface
     { forall(&OutputGenerator::startTextLink,file,anchor); }
     void endTextLink()
     { forall(&OutputGenerator::endTextLink); }
-    void writeHtmlLink(const char *url,const char *text)
-    { forall(&OutputGenerator::writeHtmlLink,url,text); }
+    void startHtmlLink(const char *url)
+    { forall(&OutputGenerator::startHtmlLink,url); }
+    void endHtmlLink()
+    { forall(&OutputGenerator::endHtmlLink); }
     void writeMailLink(const char *url)
     { forall(&OutputGenerator::writeMailLink,url); } 
     void writeStartAnnoItem(const char *type,const char *file, 
@@ -296,6 +298,8 @@ class OutputList : public OutputDocInterface
     { forall(&OutputGenerator::writeRing,c); }
     void writeSharpS()
     { forall(&OutputGenerator::writeSharpS); }
+    void writeCCedil(char c)
+    { forall(&OutputGenerator::writeCCedil,c); }
     void startMemberDescription() 
     { forall(&OutputGenerator::startMemberDescription); }
     void endMemberDescription() 
diff --git a/src/packagedef.cpp b/src/packagedef.cpp
index 4bdedbb..4f2ae02 100644
--- a/src/packagedef.cpp
+++ b/src/packagedef.cpp
@@ -27,11 +27,12 @@
 #include "language.h"
 #include "doxygen.h"
 
-PackageDef::PackageDef(const char *df,int dl,const char *na) : 
+PackageDef::PackageDef(const char *df,int dl,const char *na,const char *ref) : 
    Definition(df,dl,na)
 {
   classList       = new ClassList;
   packageFileName = "package_"+convertFileName(na);
+  setReference(ref);
 }
 
 PackageDef::~PackageDef()
diff --git a/src/packagedef.h b/src/packagedef.h
index 7d5224a..00c88f4 100644
--- a/src/packagedef.h
+++ b/src/packagedef.h
@@ -32,7 +32,7 @@ class OutputList;
 class PackageDef : public Definition
 {
   public:
-    PackageDef(const char *fName,int line, const char *name);
+    PackageDef(const char *fName,int line, const char *name,const char *ref=0);
    ~PackageDef();
     DefType definitionType() { return TypePackage; }
     QCString getOutputFileBase() const { return packageFileName; }
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index 181f1a8..efae422 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -1317,27 +1317,30 @@ void RTFGenerator::writeIndexItem(const char *ref,const char *fn,
 //  t << "}{\\pageref{" << text << "}}" << endl;
 //}
 
-void RTFGenerator::writeHtmlLink(const char *url,const char *text)
+void RTFGenerator::startHtmlLink(const char *url)
 {
 
-  if (url && Config::rtfHyperFlag)
+  if (Config::rtfHyperFlag)
   {
     t << "{\\field {\\*\\fldinst { HYPERLINK  \\\\l \"";
     t << url;
     t << "\" }{}";
     t << "}{\\fldrslt {\\cs37\\ul\\cf2 "; 
+  }
+  else
+  {
+    startTypewriter();
+  }
+}
 
-    if (text)
-      docify(text);
-    else
-      docify(url);
-
+void RTFGenerator::endHtmlLink()
+{
+  if (Config::rtfHyperFlag)
+  {
     t << "}}}" << endl;
   }
   else
   {
-    startTypewriter();
-    docify(text);
     endTypewriter();
   }
 }
@@ -2264,6 +2267,16 @@ void RTFGenerator::writeRing(char c)
   }
 }
 
+void RTFGenerator::writeCCedil(char c)
+{
+  switch(c)
+  {
+    case 'C' : t << '\307'; break;
+    case 'c' : t << '\347'; break;
+    default: t << '?'; break;
+  }
+}
+
 /**
  * VERY brittle routine inline RTF's included by other RTF's.
  * it is recursive and ugly.
diff --git a/src/rtfgen.h b/src/rtfgen.h
index 2f1355a..a40986d 100644
--- a/src/rtfgen.h
+++ b/src/rtfgen.h
@@ -78,7 +78,8 @@ class RTFGenerator : public OutputGenerator
                        const char *anchor,const char *text);
     void startTextLink(const char *f,const char *anchor);
     void endTextLink();
-    void writeHtmlLink(const char *,const char *);
+    void startHtmlLink(const char *);
+    void endHtmlLink();
     void writeMailLink(const char *url);
     void startTypewriter() { t << "{\\f2 "; }
     void endTypewriter()   { t << "}";      }
@@ -159,6 +160,7 @@ class RTFGenerator : public OutputGenerator
     void writeTilde(char c);
     void writeRing(char c);
     void writeSharpS()       { t << "\337"; }
+    void writeCCedil(char c);
 
     void startMemberDescription();
     void endMemberDescription();
diff --git a/src/scanner.l b/src/scanner.l
index 5bd5c0b..ab714c5 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -146,6 +146,7 @@ static QStack<QCString> autoGroupNameStack;
 static QCString         lastDefGroup;
 
 static bool             insideFormula;
+static bool  	        insideTryBlock=FALSE;
 
 //-----------------------------------------------------------------------------
 
@@ -168,6 +169,7 @@ static void initParser()
   baseVirt = Normal;
   isTypedef = FALSE;
   autoGroupNameStack.clear();
+  insideTryBlock = FALSE;
 }
 
 static void initEntry()
@@ -426,6 +428,7 @@ TITLE     [tT][iI][tT][lL][eE]
 %x	SkipRound
 %x	SkipSquare
 %x	TypedefName
+%x	TryFunctionBlock
 %x	Comment
 %x      Doc
 %x	JavaDoc
@@ -1028,7 +1031,12 @@ TITLE     [tT][iI][tT][lL][eE]
 					  {
 					    BEGIN(IDLUnionCase);
 					  }
-					  else 
+					  else if (insideTryBlock && strcmp(yytext,"catch")==0)
+					  {
+					    insideTryBlock=FALSE;
+					    BEGIN(TryFunctionBlock);
+					  }
+					  else
 					  {
 					    if (YY_START==FindMembers)
 					    {
@@ -1071,6 +1079,13 @@ TITLE     [tT][iI][tT][lL][eE]
 <IDLUnionCase>":"			{ BEGIN(FindMembers); }
 <IDLUnionCase>\n			{ yyLineNr++; }
 <IDLUnionCase>.
+<TryFunctionBlock>\n
+<TryFunctionBlock>"{"			{ 
+					  curlyCount=0;
+					  lastCurlyContext = FindMembers ;
+  					  BEGIN( SkipCurly );
+					}
+<TryFunctionBlock>.
 <EndCppQuote>")"			{
   					  insideCppQuote=FALSE;
 					  BEGIN(FindMembers);
@@ -1551,7 +1566,9 @@ TITLE     [tT][iI][tT][lL][eE]
 						BEGIN( FindMembers ) ;
 					      }
 					      else
+					      {
 						BEGIN( MemberSpec ) ;
+					      }
 					    }
 					  }
 					}
@@ -1985,6 +2002,9 @@ TITLE     [tT][iI][tT][lL][eE]
 					  current->args += ' ' ; 
 					}
 <FuncQual,FuncRound,FuncFunc>.		{ current->args += *yytext; }
+<FuncQual>{BN}*"try"{BN}+		{ /* try-function-block */ 
+					  insideTryBlock=TRUE;
+					}
 <FuncQual>{BN}*"throw"{BN}*"("		{ 
   					  current->exception = " throw (" ;
 					  roundCount=0;
@@ -2045,7 +2065,7 @@ TITLE     [tT][iI][tT][lL][eE]
 					  //}
 					  current->fileName = yyFileName;
 					  current->startLine = yyLineNr;
-					  if (*yytext!=';' || (current_root->section&Entry::SCOPE_MASK) )
+					  if (*yytext!=';' || (current_root->section&Entry::COMPOUND_MASK) )
 					  {
 					    int tempArg=current->name.find('<');
 					    QCString tempName;
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
index bb9e76d..ed684c9 100644
--- a/src/tagreader.cpp
+++ b/src/tagreader.cpp
@@ -76,6 +76,18 @@ class TagNamespaceInfo
     QStringList classList;
 };
 
+/*! Container for package specific info that can be read from a tagfile */
+class TagPackageInfo
+{
+  public:
+    TagPackageInfo() { members.setAutoDelete(TRUE); }
+    QString name;
+    QString filename;
+    QStrList docAnchors;
+    QList<TagMemberInfo> members;
+    QStringList classList;
+};
+
 /*! Container for file specific info that can be read from a tagfile */
 class TagFileInfo
 {
@@ -214,6 +226,7 @@ class TagFileParser : public QXmlDefaultHandler
       }
       else if (kind=="package")
       {
+        m_curPackage = new TagPackageInfo;
         m_state = InPackage;
       }
       else
@@ -235,6 +248,8 @@ class TagFileParser : public QXmlDefaultHandler
                           m_curGroup=0; break; 
         case InPage:      m_tagFilePages.append(m_curPage); 
                           m_curPage=0; break; 
+        case InPackage:   m_tagFilePackages.append(m_curPackage); 
+                          m_curPackage=0; break; 
         default:
                           err("Error: tag `compound' was not expected!\n");
       }
@@ -278,6 +293,7 @@ class TagFileParser : public QXmlDefaultHandler
         case InFile:      m_curFile->members.append(m_curMember); break;
         case InNamespace: m_curNamespace->members.append(m_curMember); break;
         case InGroup:     m_curGroup->members.append(m_curMember); break;
+        case InPackage:   m_curPackage->members.append(m_curMember); break;
         default:   err("Error: Unexpected tag `member' found\n"); break; 
       }
     }
@@ -291,6 +307,7 @@ class TagFileParser : public QXmlDefaultHandler
         case InGroup:     m_curGroup->docAnchors.append(m_curString); break;
         case InPage:      m_curPage->docAnchors.append(m_curString); break;
         case InMember:    m_curMember->docAnchors.append(m_curString); break;
+        case InPackage:   m_curPackage->docAnchors.append(m_curString); break;
         default:   err("Error: Unexpected tag `member' found\n"); break; 
       }
     }
@@ -301,6 +318,7 @@ class TagFileParser : public QXmlDefaultHandler
         case InFile:      m_curFile->classList.append(m_curString); break;
         case InNamespace: m_curNamespace->classList.append(m_curString); break;
         case InGroup:     m_curGroup->classList.append(m_curString); break;
+        case InPackage:   m_curPackage->classList.append(m_curString); break;
         default:   err("Error: Unexpected tag `class' found\n"); break; 
       }
     }
@@ -343,6 +361,7 @@ class TagFileParser : public QXmlDefaultHandler
         case InGroup:     m_curGroup->name     = m_curString; break;
         case InPage:      m_curPage->name      = m_curString; break;
         case InMember:    m_curMember->name    = m_curString; break;
+        case InPackage:   m_curPackage->name   = m_curString; break;
         default: err("Error: Unexpected tag `name' found\n"); break; 
       }
     }
@@ -395,6 +414,7 @@ class TagFileParser : public QXmlDefaultHandler
         case InFile:      m_curFile->filename      = m_curString;    break;
         case InGroup:     m_curGroup->filename     = m_curString;    break;
         case InPage:      m_curPage->filename      = m_curString;    break;
+        case InPackage:   m_curPackage->filename   = m_curString;    break;
         default: err("Error: Unexpected tag `filename' found\n"); break; 
       }
     }
@@ -457,18 +477,23 @@ class TagFileParser : public QXmlDefaultHandler
 
     bool startDocument()
     {
+      m_state = Invalid;
+
       m_curClass=0;
       m_curNamespace=0;
       m_curFile=0;
       m_curGroup=0;
       m_curPage=0;
-      m_state = Invalid;
+      m_curPackage=0;
+
       m_stateStack.setAutoDelete(TRUE);
       m_tagFileClasses.setAutoDelete(TRUE);
       m_tagFileFiles.setAutoDelete(TRUE);
       m_tagFileNamespaces.setAutoDelete(TRUE);
       m_tagFileGroups.setAutoDelete(TRUE);
       m_tagFilePages.setAutoDelete(TRUE);
+      m_tagFilePackages.setAutoDelete(TRUE);
+
       m_startElementHandlers.insert("compound",  new StartElementHandler(this,&TagFileParser::startCompound));
       m_startElementHandlers.insert("member",    new StartElementHandler(this,&TagFileParser::startMember));
       m_startElementHandlers.insert("name",      new StartElementHandler(this,&TagFileParser::startStringValue));
@@ -485,6 +510,7 @@ class TagFileParser : public QXmlDefaultHandler
       m_startElementHandlers.insert("page",      new StartElementHandler(this,&TagFileParser::startStringValue));
       m_startElementHandlers.insert("docanchor", new StartElementHandler(this,&TagFileParser::startStringValue));
       m_startElementHandlers.insert("tagfile",   new StartElementHandler(this,&TagFileParser::startIgnoreElement));
+
       m_endElementHandlers.insert("compound",    new EndElementHandler(this,&TagFileParser::endCompound));
       m_endElementHandlers.insert("member",      new EndElementHandler(this,&TagFileParser::endMember));
       m_endElementHandlers.insert("name",        new EndElementHandler(this,&TagFileParser::endName));
@@ -501,6 +527,7 @@ class TagFileParser : public QXmlDefaultHandler
       m_endElementHandlers.insert("page",        new EndElementHandler(this,&TagFileParser::endPage));
       m_endElementHandlers.insert("docanchor",   new EndElementHandler(this,&TagFileParser::endDocAnchor));
       m_endElementHandlers.insert("tagfile",     new EndElementHandler(this,&TagFileParser::endIgnoreElement));
+
       return TRUE;
     }
     bool startElement( const QString&, const QString&, 
@@ -548,11 +575,13 @@ class TagFileParser : public QXmlDefaultHandler
     QList<TagNamespaceInfo>    m_tagFileNamespaces;
     QList<TagGroupInfo>        m_tagFileGroups;
     QList<TagPageInfo>         m_tagFilePages;
+    QList<TagPackageInfo>      m_tagFilePackages;
     QDict<StartElementHandler> m_startElementHandlers;
     QDict<EndElementHandler>   m_endElementHandlers;
     TagClassInfo              *m_curClass;
     TagFileInfo               *m_curFile;
     TagNamespaceInfo          *m_curNamespace;
+    TagPackageInfo            *m_curPackage;
     TagGroupInfo              *m_curGroup;
     TagPageInfo               *m_curPage;
     TagMemberInfo             *m_curMember;
@@ -870,6 +899,10 @@ static QString stripPath(const QString &s)
   }
 }
 
+/*! Injects the info gathered by the XML parser into the Entry tree.
+ *  This tree contains the information extracted from the input in a 
+ *  "unrelated" form.
+ */
 void TagFileParser::buildLists(Entry *root)
 {
   // build class list
@@ -953,6 +986,24 @@ void TagFileParser::buildLists(Entry *root)
     tni = m_tagFileNamespaces.next();
   }
 
+  // build package list
+  TagPackageInfo *tpgi = m_tagFilePackages.first();
+  while (tpgi)
+  {
+    Entry *pe    = new Entry;
+    pe->section  = Entry::PACKAGE_SEC;
+    pe->name     = tpgi->name;
+    addDocAnchors(pe,tpgi->docAnchors);
+    TagInfo *ti  = new TagInfo;
+    ti->tagName  = m_tagName;
+    ti->fileName = tpgi->filename;
+    pe->tagInfo  = ti;
+
+    buildMemberList(pe,tpgi->members);
+    root->addSubEntry(pe);
+    tpgi = m_tagFilePackages.next();
+  }
+
   // build group list
   TagGroupInfo *tgi = m_tagFileGroups.first();
   while (tgi)
diff --git a/src/translator.h b/src/translator.h
index a8c1de7..59aad27 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -230,7 +230,7 @@ class Translator
     // quick reference sections
 
     /*! This is put above each page as a link to the list of all groups of 
-     *  compounds or files (see the \group command).
+     *  compounds or files (see the \\group command).
      */
     virtual QCString trModules()
     { return "Modules"; }
@@ -591,47 +591,47 @@ class Translator
       return (QCString)"Inheritance diagram for "+clName+":";
     }
     
-    /*! this text is generated when the \internal command is used. */
+    /*! this text is generated when the \\internal command is used. */
     virtual QCString trForInternalUseOnly()
     { return "For internal use only."; }
 
-    /*! this text is generated when the \reimp command is used. */
+    /*! this text is generated when the \\reimp command is used. */
     virtual QCString trReimplementedForInternalReasons()
     { return "Reimplemented for internal reasons; the API is not affected."; }
 
-    /*! this text is generated when the \warning command is used. */
+    /*! this text is generated when the \\warning command is used. */
     virtual QCString trWarning()
     { return "Warning"; }
 
-    /*! this text is generated when the \bug command is used. */
+    /*! this text is generated when the \\bug command is used. */
     virtual QCString trBugsAndLimitations()
     { return "Bugs and limitations"; }
 
-    /*! this text is generated when the \version command is used. */
+    /*! this text is generated when the \\version command is used. */
     virtual QCString trVersion()
     { return "Version"; }
 
-    /*! this text is generated when the \date command is used. */
+    /*! this text is generated when the \\date command is used. */
     virtual QCString trDate()
     { return "Date"; }
 
-    /*! this text is generated when the \author command is used. */
+    /*! this text is generated when the \\author command is used. */
     virtual QCString trAuthors()
     { return "Author(s)"; }
 
-    /*! this text is generated when the \return command is used. */
+    /*! this text is generated when the \\return command is used. */
     virtual QCString trReturns()
     { return "Returns"; }
 
-    /*! this text is generated when the \sa command is used. */
+    /*! this text is generated when the \\sa command is used. */
     virtual QCString trSeeAlso()
     { return "See also"; }
 
-    /*! this text is generated when the \param command is used. */
+    /*! this text is generated when the \\param command is used. */
     virtual QCString trParameters()
     { return "Parameters"; }
 
-    /*! this text is generated when the \exception command is used. */
+    /*! this text is generated when the \\exception command is used. */
     virtual QCString trExceptions()
     { return "Exceptions"; }
     
@@ -1239,7 +1239,7 @@ class Translator
 // new since 1.2.5
 //////////////////////////////////////////////////////////////////////////
     
-    /*! Used as a marker that is put before a \bug item */
+    /*! Used as a marker that is put before a \\bug item */
     virtual QCString trBug()
     {
       return "Bug";
diff --git a/src/translator_de.h b/src/translator_de.h
index dca9345..1fdf217 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -638,7 +638,7 @@ class TranslatorGerman : public Translator
     /*! this text is put before an include dependency graph */
     virtual QCString trInclDepGraph(const char *fName)
     {
-      return (QCString)"Include-Abh&auml;ngikeitsdiagramm f&uuml;r "+fName+":";
+      return (QCString)"Include-Abh&auml;ngigkeitsdiagramm f&uuml;r "+fName+":";
     }
     /*! header that is put before the list of constructor/destructors. */
     virtual QCString trConstructorDocumentation()
@@ -834,7 +834,7 @@ class TranslatorGerman : public Translator
         "Die Rechtecke in obigem Graphen bedeuten:\n"
         "<ul>\n"
         "<li>Ein schwarz gef&uuml;lltes Rechteck stellt die Struktur oder "
-        "Klasse dar, f&uuml;die der Graph erzeug wurde.\n"
+        "Klasse dar, f&uuml;r die der Graph erzeug wurde.\n"
         "<li>Ein Rechteck mit schwarzem Rahmen kennzeichnet eine dokumentierte "
         " Struktur oder Klasse.\n"
         "<li>Ein Rechteck mit grauem Rahmen kennzeichnet eine undokumentierte "
@@ -850,10 +850,10 @@ class TranslatorGerman : public Translator
         "zwischen zwei Klassen dar.\n"
         "<li>Ein dunkelgr&uuml;ner Pfeil stellt gesch&uuml;tzte Vererbung dar.\n"
         "<li>Ein dunkelroter Pfeil stellt private Vererbung dar.\n"
-        "<li>Ein gestrichelter violetter Pfeil beutet, dass eine Klasse in einer "
+        "<li>Ein gestrichelter violetter Pfeil bedeutet, dass eine Klasse in einer "
         "anderen enthalten ist oder von einer anderen benutzt wird. Am Pfeil "
         "stehen die Variable(n), mit deren Hilfe auf die Struktur oder Klasse "
-        "an der Pfeilspize zugegriffen werden kann. \n"
+        "an der Pfeilspitze zugegriffen werden kann. \n"
         "</ul>\n";
     }
     /*! text for the link to the legend page */
diff --git a/src/translator_fr.h b/src/translator_fr.h
index e7809b5..ce356ce 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -31,6 +31,12 @@ class TranslatorFrench : public Translator
     QCString latexBabelPackage()
     { return "french"; }
 
+    /*! return the language charset. This will be used for the HTML output */
+    virtual QCString idLanguageCharset()
+    {
+        return "iso-8859-1";
+    }
+
     /*! used in the compound documentation before a list of related functions. */
     QCString trRelatedFunctions()
     { return "Fonctions associ�es"; }
-- 
cgit v0.12